Animation-sync concerns extracted from recording-panel.ts.
Three concerns split out:
getTurntableInfo(speed, fps) — pure formatter for the
"duration, frame count" line shown in the GUI.
getNavigableDimensionOptions() — pure read of the scene
dimensions manager to build the dropdown of non-displayed
dimensions for slider-sync.
SliderSyncCoordinator — owns the slider-sync lifecycle:
register a "complete" listener on the animation manager, kick
off playback after a small delay, and cancel both halves
cleanly on stop / dispose.
The turntable rotation loop stays in the recording-panel because it
shares savedAutoRotate state with the offline capture path, so
splitting it here would just push the coupling around.
Animation-sync concerns extracted from
recording-panel.ts.Three concerns split out:
getTurntableInfo(speed, fps)— pure formatter for the "duration, frame count" line shown in the GUI.getNavigableDimensionOptions()— pure read of the scene dimensions manager to build the dropdown of non-displayed dimensions for slider-sync.SliderSyncCoordinator— owns the slider-sync lifecycle: register a "complete" listener on the animation manager, kick off playback after a small delay, and cancel both halves cleanly on stop / dispose.The turntable rotation loop stays in the recording-panel because it shares
savedAutoRotatestate with the offline capture path, so splitting it here would just push the coupling around.