applyDirect handles op:'move': one group() = transform keys at t0 and t0+dur
from the op's from/to, fov param keys at BOTH times (the only thing a zoom
moves, and an unkeyed fov gets dragged by its neighbours), ease on the leading
key of each pair. Repeating a move over the same span REPLACES the window
rather than interleaving, and reports how many keys it displaced. No automatic
cut - a move usually continues a shot - but the toast discloses when no cut
selects the moved camera, and cut:true is honoured if asked.
Snap config moved onto the model so a model-level op lands on the beat exactly
like a mouse drag: with a grid and snap=bar, t0 AND t0+dur land on downbeats.
Double-clicking the Cameras row now cuts to the camera you are looking through.
Verified live on music-video: playhead off-grid at 4.2s -> keys at 3.2907 and
8.9146, both exact bar lines, fov keyed at both, cuts unchanged, mid-move pose
interpolating, one undo deep-equal. 5 suites green.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>