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/editor/timeline.tsx | 173 ++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 apps/web/src/components/editor/timeline.tsx (limited to 'apps/web/src/components/editor/timeline.tsx') diff --git a/apps/web/src/components/editor/timeline.tsx b/apps/web/src/components/editor/timeline.tsx new file mode 100644 index 00000000..da44022e --- /dev/null +++ b/apps/web/src/components/editor/timeline.tsx @@ -0,0 +1,173 @@ +"use client"; + +import { ScrollArea } from "../ui/scroll-area"; +import { Button } from "../ui/button"; +import { + Scissors, + ArrowLeftToLine, + ArrowRightToLine, + Trash2, + Snowflake, + Copy, + SplitSquareHorizontal, +} from "lucide-react"; +import { + Tooltip, + TooltipContent, + TooltipTrigger, + TooltipProvider, +} from "../ui/tooltip"; +import { useTimelineStore, type TimelineTrack } from "@/stores/timeline-store"; + +export function Timeline() { + const { tracks, addTrack } = useTimelineStore(); + + return ( +
+ {/* Toolbar */} +
+ + + + + + Split clip (S) + + + + + + + Split and keep left (A) + + + + + + + Split and keep right (D) + + + + + + + Separate audio (E) + + + + + + + Duplicate clip (Ctrl+D) + + + + + + + Freeze frame (F) + + + + + + + Delete clip (Delete) + + +
+ + {/* Tracks Area */} + +
+ {/* Time Markers */} +
+ {Array.from({ length: 16 }).map((_, i) => ( +
+ {i}s +
+ ))} +
+ + {/* Timeline Tracks */} + {tracks.length === 0 ? ( +
+
+ +
+

+ No tracks in timeline +

+

+ Add a video or audio track to get started +

+
+ ) : ( +
+ {tracks.map((track) => ( + + ))} +
+ )} +
+
+
+ ); +} + +function TimelineTrackComponent({ track }: { track: TimelineTrack }) { + const getTrackColor = (type: string) => { + switch (type) { + case "video": + return "bg-blue-500/20 border-blue-500/30"; + case "audio": + return "bg-green-500/20 border-green-500/30"; + case "effects": + return "bg-purple-500/20 border-purple-500/30"; + default: + return "bg-gray-500/20 border-gray-500/30"; + } + }; + + return ( +
+
+ {track.name} +
+ +
+ {track.clips.length === 0 ? ( +
+ Drop media here +
+ ) : ( +
+ + {track.clips.length} clip{track.clips.length !== 1 ? "s" : ""} + +
+ )} +
+
+ ); +} -- cgit v1.3.1