fix: timeline element resizing

This commit is contained in:
Maze Winther 2025-07-17 23:51:12 +02:00
parent 499f06cb52
commit f492ac9aad
2 changed files with 13 additions and 1 deletions

View File

@ -96,6 +96,8 @@ export function TimelineElement({
isBeingDragged && dragState.isDragging
? dragState.currentTime
: element.startTime;
// Element should always be positioned at startTime - trimStart only affects content, not position
const elementLeft = elementStartTime * 50 * zoomLevel;
const handleDeleteElement = () => {

View File

@ -1,6 +1,7 @@
import { useState, useEffect } from "react";
import { ResizeState, TimelineElement, TimelineTrack } from "@/types/timeline";
import { useMediaStore } from "@/stores/media-store";
import { useTimelineStore } from "@/stores/timeline-store";
interface UseTimelineElementResizeProps {
element: TimelineElement;
@ -28,6 +29,7 @@ export function useTimelineElementResize({
}: UseTimelineElementResizeProps) {
const [resizing, setResizing] = useState<ResizeState | null>(null);
const { mediaItems } = useMediaStore();
const { updateElementStartTime } = useTimelineStore();
// Set up document-level mouse listeners during resize (like proper drag behavior)
useEffect(() => {
@ -100,12 +102,20 @@ export function useTimelineElementResize({
const deltaTime = deltaX / (50 * zoomLevel);
if (resizing.side === "left") {
// Left resize - only trim within original duration
// Left resize - trim content AND move element position to the right
const maxAllowed = element.duration - resizing.initialTrimEnd - 0.1;
const calculated = resizing.initialTrimStart + deltaTime;
const newTrimStart = Math.max(0, Math.min(maxAllowed, calculated));
// Calculate how much the trim changed and update startTime accordingly
const trimDelta = newTrimStart - resizing.initialTrimStart;
const newStartTime = element.startTime + trimDelta;
// Update both trim and start time for proper left resize behavior
onUpdateTrim(track.id, element.id, newTrimStart, resizing.initialTrimEnd);
// Update startTime so element moves to the right when trimming from left
updateElementStartTime(track.id, element.id, newStartTime);
} else {
// Right resize - can extend duration for supported element types
const calculated = resizing.initialTrimEnd - deltaTime;