{# A HyperFrames composition: one self-contained document at a fixed 1280x720. The CSS is inlined rather than linked to the interface stylesheet. The renderer loads this file in headless Chrome with no server, so an external stylesheet is a request that may or may not resolve, and a video that silently renders unstyled is worse than one that fails. The palette tokens are duplicated deliberately; the layout of a fixed-size video frame has nothing in common with a reflowable page. Scene visibility is driven by `data-scene-start` and `data-scene-end` so the timeline is declared in the markup and readable in a diff, rather than computed by script at render time. A scene with more claims than one frame holds is split into pages, each with its own `data-page-start` and `data-page-end` inside the scene's span; the split is decided in walkthrough.py, so it is in the markup too. `data-fps` sits on the root because that is where HyperFrames reads the frame rate. The manifest alone is not enough: without the attribute a render falls back to 30 fps and the manifest's frame count stops describing the video. #}