From be970248686c0af7d8506cba8c64bf507419da3d Mon Sep 17 00:00:00 2001 From: Maze Winther Date: Sun, 22 Jun 2025 13:07:02 +0200 Subject: so much stuff??? --- apps/web/src/components/app-provider.tsx | 42 +++++ apps/web/src/components/editor-header.tsx | 56 +++++++ apps/web/src/components/editor/media-panel.tsx | 133 ++++++++++++++++ apps/web/src/components/editor/preview-panel.tsx | 11 ++ .../web/src/components/editor/properties-panel.tsx | 100 ++++++++++++ apps/web/src/components/editor/timeline.tsx | 173 +++++++++++++++++++++ apps/web/src/components/header-base.tsx | 41 +++++ apps/web/src/components/header.tsx | 37 +++++ apps/web/src/components/landing/hero.tsx | 72 +++++++++ apps/web/src/components/media-panel.tsx | 39 ----- apps/web/src/components/preview-panel.tsx | 11 -- apps/web/src/components/properties-panel.tsx | 100 ------------ apps/web/src/components/timeline.tsx | 141 ----------------- 13 files changed, 665 insertions(+), 291 deletions(-) create mode 100644 apps/web/src/components/app-provider.tsx create mode 100644 apps/web/src/components/editor-header.tsx create mode 100644 apps/web/src/components/editor/media-panel.tsx create mode 100644 apps/web/src/components/editor/preview-panel.tsx create mode 100644 apps/web/src/components/editor/properties-panel.tsx create mode 100644 apps/web/src/components/editor/timeline.tsx create mode 100644 apps/web/src/components/header-base.tsx create mode 100644 apps/web/src/components/header.tsx create mode 100644 apps/web/src/components/landing/hero.tsx delete mode 100644 apps/web/src/components/media-panel.tsx delete mode 100644 apps/web/src/components/preview-panel.tsx delete mode 100644 apps/web/src/components/properties-panel.tsx delete mode 100644 apps/web/src/components/timeline.tsx (limited to 'apps/web/src/components') diff --git a/apps/web/src/components/app-provider.tsx b/apps/web/src/components/app-provider.tsx new file mode 100644 index 00000000..257fc8fa --- /dev/null +++ b/apps/web/src/components/app-provider.tsx @@ -0,0 +1,42 @@ +"use client"; + +import { useEffect } from "react"; +import { Loader2 } from "lucide-react"; +import { useAppStore } from "@/stores/app-store"; +import { usePanelStore } from "@/stores/panel-store"; + +interface AppProviderProps { + children: React.ReactNode; +} + +export function AppProvider({ children }: AppProviderProps) { + const { isInitializing, isPanelsReady, initializeApp } = useAppStore(); + const { setInitialized } = usePanelStore(); + + useEffect(() => { + const initialize = async () => { + // Initialize the app + await initializeApp(); + + // Initialize panel store for future resize events + setInitialized(); + }; + + initialize(); + }, [initializeApp, setInitialized]); + + // Show loading screen while initializing + if (isInitializing || !isPanelsReady) { + return ( +
+
+ +

Loading editor...

+
+
+ ); + } + + // App is ready, render children + return <>{children}; +} diff --git a/apps/web/src/components/editor-header.tsx b/apps/web/src/components/editor-header.tsx new file mode 100644 index 00000000..f59193d0 --- /dev/null +++ b/apps/web/src/components/editor-header.tsx @@ -0,0 +1,56 @@ +"use client"; + +import Link from "next/link"; +import { Button } from "./ui/button"; +import { ChevronLeft, Download } from "lucide-react"; +import { useProjectStore } from "@/stores/project-store"; +import { useMediaStore } from "@/stores/media-store"; +import { useTimelineStore } from "@/stores/timeline-store"; +import { HeaderBase } from "./header-base"; + +export function EditorHeader() { + const { activeProject } = useProjectStore(); + const { mediaItems } = useMediaStore(); + const { tracks } = useTimelineStore(); + + const handleExport = () => { + // TODO: Implement export functionality + console.log("Export project"); + }; + + const leftContent = ( + + + {activeProject?.name || "Loading..."} + + ); + + const centerContent = ( +
+ {mediaItems.length} media + • + {tracks.length} tracks +
+ ); + + const rightContent = ( + + ); + + return ( + + ); +} diff --git a/apps/web/src/components/editor/media-panel.tsx b/apps/web/src/components/editor/media-panel.tsx new file mode 100644 index 00000000..1e5aa465 --- /dev/null +++ b/apps/web/src/components/editor/media-panel.tsx @@ -0,0 +1,133 @@ +"use client"; + +import { Button } from "../ui/button"; +import { AspectRatio } from "../ui/aspect-ratio"; +import { useMediaStore } from "@/stores/media-store"; +import { Plus, Image, Video, Music, Upload } from "lucide-react"; +import { useState, useRef } from "react"; + +export function MediaPanel() { + const { mediaItems, addMediaItem } = useMediaStore(); + const [isDragOver, setIsDragOver] = useState(false); + const dragCounterRef = useRef(0); + + const handleAddSampleMedia = () => { + // Just for testing - add a sample media item + addMediaItem({ + name: `Sample ${mediaItems.length + 1}`, + type: "image", + }); + }; + + const getMediaIcon = (type: string) => { + switch (type) { + case "video": + return