Files
mobai 1e9b08aed8 docs: intro animation for 晚晚 (22s, pure canvas, zero assets)
Single-file HTML, Canvas 2D, no libraries, no images, no fonts to load.

The one idea worth explaining: the accent colour IS the valence.
moodColor(v) maps v in [-1,1] across cold blue -> neutral grey -> warm amber,
and every mark in the frame reads from it. So when she drops, the whole
picture goes cold -- no caption has to tell you she is sad. Same data,
three places: the trace colour, the memory hue, the retrieval highlight.

Timeline is a pure function render(t), no RAF accumulation. Every frame
renders in isolation, which means frames are reproducible, any resolution
can be re-exported, and the preview can be captured frame-by-frame instead
of screen-recorded.

Four acts:
  0-6s   membrane   matter bounces off it, information passes through
  6-12s  heartbeat  beats with no input; positive recovers fast, negative slow
  12-17s memory     points sink by salience; one gets pulled back up
                    by a mood-matching cue; floor at 0.03 so nothing vanishes
  17-22s title

Also: ?t=12.5 freezes on that frame (for cover shots), and a REC button
uses canvas.captureStream + MediaRecorder to export webm directly.

Preview: 200 ANMF frames, 22000ms total, verified by parsing the RIFF/ANMF
chunks (Pillow does not expose per-frame WebP duration).

tools/render_preview.py renders frames via headless Chrome and assembles.
On this Windows box Python cannot spawn Chrome (0x80000003, same family as
the 0xC0000142 shell failure), so the render loop was driven from PowerShell
and the script only assembled. Both paths are documented in the script.
2026-10-19 20:33:13 +08:00
..