From 3a241d91120c61fd671073d99d6099f026f7bdec Mon Sep 17 00:00:00 2001 From: Maze Winther Date: Fri, 11 Jul 2025 00:25:07 +0200 Subject: feat: improve playhead --- .../src/components/editor/timeline-playhead.tsx | 80 ++++++++-------------- 1 file changed, 28 insertions(+), 52 deletions(-) (limited to 'apps/web/src/components/editor/timeline-playhead.tsx') diff --git a/apps/web/src/components/editor/timeline-playhead.tsx b/apps/web/src/components/editor/timeline-playhead.tsx index 51dab0f3..4f0e20c2 100644 --- a/apps/web/src/components/editor/timeline-playhead.tsx +++ b/apps/web/src/components/editor/timeline-playhead.tsx @@ -16,6 +16,8 @@ interface TimelinePlayheadProps { rulerRef: React.RefObject; rulerScrollRef: React.RefObject; tracksScrollRef: React.RefObject; + trackLabelsRef?: React.RefObject; + timelineRef: React.RefObject; } export function TimelinePlayhead({ @@ -27,6 +29,8 @@ export function TimelinePlayhead({ rulerRef, rulerScrollRef, tracksScrollRef, + trackLabelsRef, + timelineRef, }: TimelinePlayheadProps) { const { playheadPosition, handlePlayheadMouseDown } = useTimelinePlayhead({ currentTime, @@ -38,64 +42,36 @@ export function TimelinePlayhead({ tracksScrollRef, }); - return ( - <> - {/* Playhead in ruler (scrubbable) */} -
-
-
- - ); -} - -interface TimelinePlayheadTracksProps { - currentTime: number; - duration: number; - zoomLevel: number; - tracks: TimelineTrack[]; - seek: (time: number) => void; - rulerRef: React.RefObject; - rulerScrollRef: React.RefObject; - tracksScrollRef: React.RefObject; -} - -export function TimelinePlayheadTracks({ - currentTime, - duration, - zoomLevel, - tracks, - seek, - rulerRef, - rulerScrollRef, - tracksScrollRef, -}: TimelinePlayheadTracksProps) { - const { playheadPosition, handlePlayheadMouseDown } = useTimelinePlayhead({ - currentTime, - duration, - zoomLevel, - seek, - rulerRef, - rulerScrollRef, - tracksScrollRef, - }); + // Use timeline container height minus a few pixels for breathing room + const timelineContainerHeight = timelineRef.current?.offsetHeight || 400; + const totalHeight = timelineContainerHeight - 8; // 8px padding from edges - if (tracks.length === 0) return null; + // Get dynamic track labels width, fallback to 0 if no tracks or no ref + const trackLabelsWidth = + tracks.length > 0 && trackLabelsRef?.current + ? trackLabelsRef.current.offsetWidth + : 0; + const leftPosition = + trackLabelsWidth + + playheadPosition * TIMELINE_CONSTANTS.PIXELS_PER_SECOND * zoomLevel; return (
+ > + {/* The red line spanning full height */} +
+ + {/* Red dot indicator at the top (in ruler area) */} +
+
); } @@ -108,7 +84,7 @@ export function useTimelinePlayheadRuler({ rulerRef, rulerScrollRef, tracksScrollRef, -}: Omit) { +}: Omit) { const { handleRulerMouseDown, isDraggingRuler } = useTimelinePlayhead({ currentTime, duration, -- cgit v1.3.1