diff --git a/apps/web/src/components/editor/timeline-playhead.tsx b/apps/web/src/components/editor/timeline-playhead.tsx index 4deb679..ce4ed1f 100644 --- a/apps/web/src/components/editor/timeline-playhead.tsx +++ b/apps/web/src/components/editor/timeline-playhead.tsx @@ -1,5 +1,6 @@ "use client"; +import { useRef } from "react"; import { TimelineTrack } from "@/types/timeline"; import { TIMELINE_CONSTANTS, @@ -18,6 +19,7 @@ interface TimelinePlayheadProps { tracksScrollRef: React.RefObject; trackLabelsRef?: React.RefObject; timelineRef: React.RefObject; + playheadRef?: React.RefObject; } export function TimelinePlayhead({ @@ -31,7 +33,10 @@ export function TimelinePlayhead({ tracksScrollRef, trackLabelsRef, timelineRef, + playheadRef: externalPlayheadRef, }: TimelinePlayheadProps) { + const internalPlayheadRef = useRef(null); + const playheadRef = externalPlayheadRef || internalPlayheadRef; const { playheadPosition, handlePlayheadMouseDown } = useTimelinePlayhead({ currentTime, duration, @@ -40,6 +45,7 @@ export function TimelinePlayhead({ rulerRef, rulerScrollRef, tracksScrollRef, + playheadRef, }); // Use timeline container height minus a few pixels for breathing room @@ -57,7 +63,8 @@ export function TimelinePlayhead({ return (
) { const { handleRulerMouseDown, isDraggingRuler } = useTimelinePlayhead({ currentTime, @@ -93,6 +101,7 @@ export function useTimelinePlayheadRuler({ rulerRef, rulerScrollRef, tracksScrollRef, + playheadRef, }); return { handleRulerMouseDown, isDraggingRuler }; diff --git a/apps/web/src/components/editor/timeline.tsx b/apps/web/src/components/editor/timeline.tsx index fb4723d..53a7aac 100644 --- a/apps/web/src/components/editor/timeline.tsx +++ b/apps/web/src/components/editor/timeline.tsx @@ -124,6 +124,7 @@ export function Timeline() { const rulerScrollRef = useRef(null); const tracksScrollRef = useRef(null); const trackLabelsRef = useRef(null); + const playheadRef = useRef(null); const isUpdatingRef = useRef(false); const lastRulerSync = useRef(0); const lastTracksSync = useRef(0); @@ -137,6 +138,7 @@ export function Timeline() { rulerRef, rulerScrollRef, tracksScrollRef, + playheadRef, }); // Timeline content click to seek handler @@ -148,7 +150,7 @@ export function Timeline() { } // Don't seek if clicking on playhead - if ((e.target as HTMLElement).closest(".playhead")) { + if (playheadRef.current?.contains(e.target as Node)) { return; } @@ -880,6 +882,7 @@ export function Timeline() { tracksScrollRef={tracksScrollRef} trackLabelsRef={trackLabelsRef} timelineRef={timelineRef} + playheadRef={playheadRef} /> {/* Timeline Header with Ruler */}
diff --git a/apps/web/src/hooks/use-timeline-playhead.ts b/apps/web/src/hooks/use-timeline-playhead.ts index 67f0d20..61adaf9 100644 --- a/apps/web/src/hooks/use-timeline-playhead.ts +++ b/apps/web/src/hooks/use-timeline-playhead.ts @@ -8,6 +8,7 @@ interface UseTimelinePlayheadProps { rulerRef: React.RefObject; rulerScrollRef: React.RefObject; tracksScrollRef: React.RefObject; + playheadRef?: React.RefObject; } export function useTimelinePlayhead({ @@ -18,6 +19,7 @@ export function useTimelinePlayhead({ rulerRef, rulerScrollRef, tracksScrollRef, + playheadRef, }: UseTimelinePlayheadProps) { // Playhead scrubbing state const [isScrubbing, setIsScrubbing] = useState(false); @@ -48,7 +50,7 @@ export function useTimelinePlayhead({ if (e.button !== 0) return; // Don't interfere if clicking on the playhead itself - if ((e.target as HTMLElement).closest(".playhead")) return; + if (playheadRef?.current?.contains(e.target as Node)) return; e.preventDefault(); setIsDraggingRuler(true);