From d6724e2552d14140017b194e7020252bda73751a Mon Sep 17 00:00:00 2001 From: leimingsheng Date: Mon, 21 Jul 2025 19:15:52 +0800 Subject: feat: init timeline zoom --- .../components/editor/timeline-zoom-control.tsx | 126 +++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 apps/web/src/components/editor/timeline-zoom-control.tsx (limited to 'apps/web/src/components/editor/timeline-zoom-control.tsx') diff --git a/apps/web/src/components/editor/timeline-zoom-control.tsx b/apps/web/src/components/editor/timeline-zoom-control.tsx new file mode 100644 index 00000000..ab9c57a5 --- /dev/null +++ b/apps/web/src/components/editor/timeline-zoom-control.tsx @@ -0,0 +1,126 @@ +import { useState } from "react"; +import { Button } from "../ui/button"; +import { Slider } from "../ui/slider"; +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from "../ui/tooltip"; +import { ZoomIn, ZoomOut, Maximize2 } from "lucide-react"; + +interface TimelineZoomControlProps { + zoomLevel: number; + onZoomChange: (zoom: number) => void; + onFitToWindow?: () => void; + className?: string; +} + +export function TimelineZoomControl({ + zoomLevel, + onZoomChange, + onFitToWindow, + className, +}: TimelineZoomControlProps) { + // Convert zoom level to percentage for display + const zoomPercentage = Math.round(zoomLevel * 100); + + const handleZoomIn = () => { + onZoomChange(Math.min(10, zoomLevel + 0.2)); + }; + + const handleZoomOut = () => { + onZoomChange(Math.max(0.1, zoomLevel - 0.2)); + }; + + const handleReset = () => { + if (onFitToWindow) { + onFitToWindow(); + } else { + onZoomChange(1); + } + }; + + const handleSliderChange = (value: number[]) => { + onZoomChange(value[0]); + }; + + return ( +
+ {/* Zoom Out Button */} + + + + + +

Zoom out

+

Ctrl + - / Ctrl + Wheel

+
+
+ + {/* Zoom Slider */} +
+ +
+ + {/* Zoom In Button */} + + + + + +

Zoom in

+

Ctrl + + / Ctrl + Wheel

+
+
+ + {/* Fit to Window / Reset Button */} + + + + + +

{onFitToWindow ? "Fit to Window" : "Reset Zoom"}

+

+ {onFitToWindow ? "Show all track content" : "Ctrl + 0"} +

+
+
+
+ ); +} -- cgit v1.3.1