diff --git a/apps/web/src/components/editor/timeline-element.tsx b/apps/web/src/components/editor/timeline-element.tsx index 8cccd0e4..bb414a9c 100644 --- a/apps/web/src/components/editor/timeline-element.tsx +++ b/apps/web/src/components/editor/timeline-element.tsx @@ -57,6 +57,7 @@ export function TimelineElement({ updateElementTrim, updateElementDuration, removeElementFromTrack, + removeElementFromTrackWithRipple, dragState, splitElement, splitAndKeepLeft, @@ -64,6 +65,7 @@ export function TimelineElement({ separateAudio, addElementToTrack, replaceElementMedia, + rippleEditingEnabled, } = useTimelineStore(); const { currentTime } = usePlaybackStore(); @@ -213,7 +215,11 @@ export function TimelineElement({ }; const handleElementDeleteContext = () => { - removeElementFromTrack(track.id, element.id); + if (rippleEditingEnabled) { + removeElementFromTrackWithRipple(track.id, element.id); + } else { + removeElementFromTrack(track.id, element.id); + } }; const handleReplaceClip = () => { diff --git a/apps/web/src/components/editor/timeline-track.tsx b/apps/web/src/components/editor/timeline-track.tsx index 91b3ffa3..58ca411e 100644 --- a/apps/web/src/components/editor/timeline-track.tsx +++ b/apps/web/src/components/editor/timeline-track.tsx @@ -39,6 +39,7 @@ export function TimelineTrackContent({ addTrack, moveElementToTrack, updateElementStartTime, + updateElementStartTimeWithRipple, addElementToTrack, selectedElements, selectElement, @@ -49,6 +50,7 @@ export function TimelineTrackContent({ clearSelectedElements, insertTrackAt, snappingEnabled, + rippleEditingEnabled, } = useTimelineStore(); const { currentTime } = usePlaybackStore(); @@ -272,7 +274,20 @@ export function TimelineTrackContent({ if (!hasOverlap) { if (dragState.trackId === track.id) { - updateElementStartTime(track.id, dragState.elementId, finalTime); + // Use ripple editing if enabled, otherwise regular update + if (rippleEditingEnabled) { + updateElementStartTimeWithRipple( + track.id, + dragState.elementId, + finalTime + ); + } else { + updateElementStartTime( + track.id, + dragState.elementId, + finalTime + ); + } } else { moveElementToTrack( dragState.trackId, @@ -280,11 +295,20 @@ export function TimelineTrackContent({ dragState.elementId ); requestAnimationFrame(() => { - updateElementStartTime( - track.id, - dragState.elementId!, - finalTime - ); + // Use ripple editing if enabled, otherwise regular update + if (rippleEditingEnabled) { + updateElementStartTimeWithRipple( + track.id, + dragState.elementId!, + finalTime + ); + } else { + updateElementStartTime( + track.id, + dragState.elementId!, + finalTime + ); + } }); } } @@ -318,7 +342,16 @@ export function TimelineTrackContent({ }); if (!hasOverlap) { - updateElementStartTime(track.id, dragState.elementId, finalTime); + // Use ripple editing if enabled, otherwise regular update + if (rippleEditingEnabled) { + updateElementStartTimeWithRipple( + track.id, + dragState.elementId, + finalTime + ); + } else { + updateElementStartTime(track.id, dragState.elementId, finalTime); + } } } } diff --git a/apps/web/src/components/editor/timeline.tsx b/apps/web/src/components/editor/timeline.tsx index bfb663c6..8eb00875 100644 --- a/apps/web/src/components/editor/timeline.tsx +++ b/apps/web/src/components/editor/timeline.tsx @@ -19,6 +19,7 @@ import { ZoomIn, ZoomOut, LockOpen, + Link, } from "lucide-react"; import { Tooltip, @@ -71,6 +72,7 @@ export function Timeline() { addTrack, addElementToTrack, removeElementFromTrack, + removeElementFromTrackWithRipple, getTotalDuration, selectedElements, clearSelectedElements, @@ -84,6 +86,8 @@ export function Timeline() { redo, snappingEnabled, toggleSnapping, + rippleEditingEnabled, + toggleRippleEditing, dragState, } = useTimelineStore(); const { mediaItems, addMediaItem } = useMediaStore(); @@ -496,7 +500,11 @@ export function Timeline() { return; } selectedElements.forEach(({ trackId, elementId }) => { - removeElementFromTrack(trackId, elementId); + if (rippleEditingEnabled) { + removeElementFromTrackWithRipple(trackId, elementId); + } else { + removeElementFromTrack(trackId, elementId); + } }); clearSelectedElements(); }; @@ -770,6 +778,24 @@ export function Timeline() { Auto snapping + + + + + + {rippleEditingEnabled + ? "Disable Ripple Editing" + : "Enable Ripple Editing"} + +