From 2217bfde6c8e70d814b7c7d9ba1712fef354302f Mon Sep 17 00:00:00 2001 From: Abhishekucs Date: Fri, 3 Apr 2026 09:09:06 +0530 Subject: [PATCH 1/8] feat: add Studio page for AI image and video generation Protected creative workspace with prompt bar, image/video mode switching, contextual settings panels, and mock generation flow. Auth-gated with redirect to sign-in for unauthenticated users. Co-Authored-By: Claude Opus 4.6 --- app/studio/page.tsx | 11 + app/studio/studio-page.tsx | 37 + components/conditional-layout.tsx | 5 +- components/studio/frame-upload.tsx | 58 + components/studio/generation-display.tsx | 66 + components/studio/generation-loading.tsx | 40 + components/studio/image-settings.tsx | 90 + components/studio/mode-switcher.tsx | 35 + components/studio/prompt-input.tsx | 56 + components/studio/studio-canvas.tsx | 35 + components/studio/studio-prompt-bar.tsx | 56 + components/studio/video-settings.tsx | 82 + components/ui/select.tsx | 190 +++ components/ui/slider.tsx | 63 + components/ui/textarea.tsx | 18 + components/ui/toggle-group.tsx | 83 + components/ui/toggle.tsx | 47 + package-lock.json | 1912 ++++++++++++++++++++-- package.json | 1 + store/useStudioStore.ts | 132 ++ types/studio.ts | 33 + 21 files changed, 2952 insertions(+), 98 deletions(-) create mode 100644 app/studio/page.tsx create mode 100644 app/studio/studio-page.tsx create mode 100644 components/studio/frame-upload.tsx create mode 100644 components/studio/generation-display.tsx create mode 100644 components/studio/generation-loading.tsx create mode 100644 components/studio/image-settings.tsx create mode 100644 components/studio/mode-switcher.tsx create mode 100644 components/studio/prompt-input.tsx create mode 100644 components/studio/studio-canvas.tsx create mode 100644 components/studio/studio-prompt-bar.tsx create mode 100644 components/studio/video-settings.tsx create mode 100644 components/ui/select.tsx create mode 100644 components/ui/slider.tsx create mode 100644 components/ui/textarea.tsx create mode 100644 components/ui/toggle-group.tsx create mode 100644 components/ui/toggle.tsx create mode 100644 store/useStudioStore.ts create mode 100644 types/studio.ts diff --git a/app/studio/page.tsx b/app/studio/page.tsx new file mode 100644 index 0000000..a0934c5 --- /dev/null +++ b/app/studio/page.tsx @@ -0,0 +1,11 @@ +import type { Metadata } from "next"; +import StudioPage from "./studio-page"; + +export const metadata: Metadata = { + title: "Studio | Invook", + description: "Create AI-generated images and videos with Invook Studio", +}; + +export default function Studio() { + return ; +} diff --git a/app/studio/studio-page.tsx b/app/studio/studio-page.tsx new file mode 100644 index 0000000..d5df571 --- /dev/null +++ b/app/studio/studio-page.tsx @@ -0,0 +1,37 @@ +"use client"; + +import { useEffect } from "react"; +import { useRouter } from "next/navigation"; +import { useAuthStore } from "@/store/useAuthStore"; +import { StudioCanvas } from "@/components/studio/studio-canvas"; +import { StudioPromptBar } from "@/components/studio/studio-prompt-bar"; + +export default function StudioPage() { + const { isAuthenticated, isLoading } = useAuthStore(); + const router = useRouter(); + + useEffect(() => { + if (!isLoading && !isAuthenticated) { + router.push(`/sign-in?redirect=${encodeURIComponent("/studio")}`); + } + }, [isLoading, isAuthenticated, router]); + + if (isLoading) { + return ( +
+
+
+ ); + } + + if (!isAuthenticated) { + return null; + } + + return ( +
+ + +
+ ); +} diff --git a/components/conditional-layout.tsx b/components/conditional-layout.tsx index 39024d4..e93ed65 100644 --- a/components/conditional-layout.tsx +++ b/components/conditional-layout.tsx @@ -13,12 +13,13 @@ export function ConditionalLayout({ const isAuthPage = pathname?.startsWith("/auth") || pathname === "/sign-in" || pathname === "/sign-up"; const isExplorePage = pathname?.startsWith("/explore"); const isSharePage = pathname?.startsWith("/share"); + const isStudioPage = pathname?.startsWith("/studio"); return ( <> - {!isAuthPage && !isExplorePage && !isSharePage && } + {!isAuthPage && !isExplorePage && !isSharePage && !isStudioPage && } {children} - {!isAuthPage && !isSharePage &&