festifun/frontend
type-two ddb8dea6d8 M12: cinematic export — camPath ride -> festival4d-cut.webm
frontend/src/exportVideo.js fills the foundation2 stub: the ⏺ button
records the scene3d canvas captureStream(30) muxed with the live WebAudio
mix via the transport.captureAudioStream() hook (spatial included, silent
tap when no track — degrade, don't block), MediaRecorder vp9/opus webm
(vp8/webm fallbacks), spanning first -> last camPath keyframe. Playback is
driven through the existing #btn-path flow at forced rate 1 (file duration
must equal the path span), stops at the last keyframe (or early on a
second click / anything that halts the ride), downloads
festival4d-cut.webm, then restores ALL prior transport/UI state (playhead,
rate, play state, path state, followed camera) and releases the audio tap
+ canvas tracks. Button disabled under 2 keyframes by chaining main.js's
camPath.onChange (frozen files untouched).

Requires live-browser verification (focused tab — captureStream delivers
no frames hidden): see plan/status/lane-E.md. Frontend build clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 17:53:34 +10:00
..
src M12: cinematic export — camPath ride -> festival4d-cut.webm 2026-07-17 17:53:34 +10:00
index.html foundation2 (phase 5a): contracts, stubs, hooks & UI wiring for lanes E/F/G 2026-07-17 17:31:08 +10:00
package-lock.json Splat upgrade (ideas.md #1) + MODELBEAST crossover 2026-07-16 22:32:01 +10:00
package.json Splat upgrade (ideas.md #1) + MODELBEAST crossover 2026-07-16 22:32:01 +10:00
vite.config.js Deploy-ready: path-prefix hosting (digalot.fyi/festifun) + deploy artifacts 2026-07-16 13:20:36 +10:00