- export.py: image inputs in a transition were capped at 1 frame of loop
duration (dur_sec=0), starving the trim below - use the actual duration
each side's trim needs instead. Verified with a green-image -> blue-video
fade export: pixel values step smoothly (0,126,0) -> (0,62,127) ->
(0,10,231) across the 12-frame window, matching a linear crossfade.
- app.js existingTransitionPair(): stopped reordering [a,b] by start time,
which discarded which clip actually carries transition_type - could make
Remove Transition clear the untagged clip and leave the real tag dangling.
- app.js addTransitionSelected(): reuse an existing group_id instead of
always minting a new one, so linking A+B doesn't silently detach either
from an unrelated pre-existing group; refuse to link if they already
belong to two different groups.
- app.js removeTransitionSelected(): only clear a clip's group_id if no
other clip still shares it (preserves a larger group B was merged into);
search other lanes to restore B's position if its original spot is
occupied, and say so in the status message instead of claiming success
when it couldn't move B back.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>