@biunow/agent-biuvibe 0.0.0-stage → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/server.js +340 -0
- package/data/columns.json +230 -0
- package/engine/.claude/skills/weilanx-creator-blackgold-video/SKILL.md +116 -0
- package/engine/.claude/skills/weilanx-creator-blackgold-video/references//345/215/241/347/202/271/344/270/216/351/237/263/346/225/210.md +56 -0
- package/engine/.claude/skills/weilanx-creator-blackgold-video/references//345/260/201/351/235/242/344/270/216/345/217/221/345/270/203.md +68 -0
- package/engine/.claude/skills/weilanx-creator-blackgold-video/references//347/224/273/351/235/242/344/270/216/351/225/234/345/244/264.md +56 -0
- package/engine/.claude/skills/weilanx-creator-blackgold-video/references//351/200/211/351/242/230/344/270/216/350/204/232/346/234/254.md +59 -0
- package/engine/.claude/skills/weilanx-creator-blackgold-video/scripts/qa.mjs +98 -0
- package/engine/.claude/skills/weilanx-creator-blackgold-video/scripts/subtitles.mjs +53 -0
- package/engine/.claude/skills/weilanx-creator-desk-video/SKILL.md +124 -0
- package/engine/.claude/skills/weilanx-creator-desk-video/references//345/267/245/347/250/213/346/250/241/346/235/277.md +278 -0
- package/engine/.claude/skills/weilanx-creator-desk-video/references//347/224/273/351/235/242/351/205/215/346/226/271.md +94 -0
- package/engine/.claude/skills/weilanx-creator-distill-video/SKILL.md +98 -0
- package/engine/.claude/skills/weilanx-creator-distill-video/references//346/213/206/350/247/243/346/226/271/346/263/225.md +42 -0
- package/engine/.claude/skills/weilanx-creator-distill-video/references//351/205/215/346/226/271/345/215/241/346/250/241/346/235/277.md +66 -0
- package/engine/.claude/skills/weilanx-creator-distill-video/scripts/analyze.py +211 -0
- package/engine/.claude/skills/weilanx-creator-distill-video/scripts/strip.py +52 -0
- package/engine/.claude/skills/weilanx-creator-fps-video/SKILL.md +155 -0
- package/engine/.claude/skills/weilanx-creator-fps-video/references//345/215/241/347/202/271/344/270/216/351/237/263/346/225/210.md +82 -0
- package/engine/.claude/skills/weilanx-creator-fps-video/references//345/260/201/351/235/242/344/270/216/345/217/221/345/270/203.md +89 -0
- package/engine/.claude/skills/weilanx-creator-fps-video/references//346/225/260/346/215/256/345/244/215/347/233/230.md +36 -0
- package/engine/.claude/skills/weilanx-creator-fps-video/references//347/224/273/351/235/242/344/270/216/351/225/234/345/244/264.md +60 -0
- package/engine/.claude/skills/weilanx-creator-fps-video/references//351/200/211/351/242/230/344/270/216/345/217/231/344/272/213.md +61 -0
- package/engine/.claude/skills/weilanx-creator-fps-video/scripts/qa.mjs +94 -0
- package/engine/.claude/skills/weilanx-creator-fps-video/scripts/stats.py +57 -0
- package/engine/.claude/skills/weilanx-creator-fps-video/scripts/subtitle-doc.mjs +37 -0
- package/engine/.claude/skills/weilanx-creator-gilded-video/SKILL.md +102 -0
- package/engine/.claude/skills/weilanx-creator-gilded-video/references//345/217/231/344/272/213/344/270/216/345/255/227/345/271/225.md +64 -0
- package/engine/.claude/skills/weilanx-creator-gilded-video/references//347/224/273/351/235/242/344/270/216/350/275/254/345/234/272.md +80 -0
- package/engine/.claude/skills/weilanx-creator-gilded-video/references//351/205/215/344/271/220/344/270/216/345/215/241/347/202/271.md +56 -0
- package/engine/.claude/skills/weilanx-creator-gilded-video/scripts/beats.py +99 -0
- package/engine/.claude/skills/weilanx-creator-lamplight-video/SKILL.md +124 -0
- package/engine/.claude/skills/weilanx-creator-lamplight-video/references//345/217/231/344/272/213/344/270/216/345/215/241/347/202/271.md +90 -0
- package/engine/.claude/skills/weilanx-creator-lamplight-video/references//345/260/201/351/235/242/344/270/216/345/217/221/345/270/203.md +67 -0
- package/engine/.claude/skills/weilanx-creator-lamplight-video/references//347/224/273/351/235/242/344/270/216/351/225/234/345/244/264.md +57 -0
- package/engine/.claude/skills/weilanx-creator-lamplight-video/references//351/200/211/351/242/230/344/270/216/345/217/262/346/226/231.md +76 -0
- package/engine/.claude/skills/weilanx-creator-lamplight-video/scripts/beat_accents.py +45 -0
- package/engine/.claude/skills/weilanx-creator-lamplight-video/scripts/shot_frames.py +17 -0
- package/engine/.claude/skills/weilanx-creator-lamplight-video/scripts/subtitle_doc.py +29 -0
- package/engine/.claude/skills/weilanx-creator-lamplight-video/scripts/timeline_lib.py +57 -0
- package/engine/.claude/skills/weilanx-creator-pixel-video/SKILL.md +132 -0
- package/engine/.claude/skills/weilanx-creator-vox-video/SKILL.md +124 -0
- package/engine/.claude/skills/weilanx-creator-vox-video/references//347/224/273/351/235/242.md +63 -0
- package/engine/.claude/skills/weilanx-creator-vox-video/references//347/264/240/346/235/220.md +35 -0
- package/engine/.claude/skills/weilanx-creator-vox-video/references//350/257/255/346/260/224/344/270/216/345/206/231/347/250/277.md +43 -0
- package/engine/.claude/skills/weilanx-creator-vox-video/references//351/205/215/344/271/220.md +37 -0
- package/engine/.claude/skills/weilanx-creator-vox-video/scripts/commons.py +67 -0
- package/engine/.claude/skills/weilanx-creator-vox-video/scripts/tts_expressive.py +71 -0
- package/engine/.claude/skills/weilanx-creator-vox-video/scripts/voice_stats.py +54 -0
- package/engine/AGENTS.md +118 -0
- package/engine/CLAUDE.md +1 -0
- package/engine/LICENSE +21 -0
- package/engine/README.md +282 -0
- package/engine/README.zh-CN.md +282 -0
- package/engine/audio/bgm.mjs +191 -0
- package/engine/audio/episodes/ep00-demo.mjs +10 -0
- package/engine/audio/episodes/ep01-agent.mjs +22 -0
- package/engine/audio/episodes/ep02-llm.mjs +20 -0
- package/engine/audio/episodes/ep03-cc.mjs +19 -0
- package/engine/audio/episodes/ep04-opus55.mjs +15 -0
- package/engine/audio/episodes/ep05-token.mjs +18 -0
- package/engine/audio/episodes/ep06-context.mjs +16 -0
- package/engine/audio/episodes/ep07-agent.mjs +16 -0
- package/engine/audio/episodes/ep08-hallucination.mjs +15 -0
- package/engine/audio/episodes/ep09-prompt.mjs +16 -0
- package/engine/audio/episodes/ep10-multimodal.mjs +16 -0
- package/engine/audio/episodes/ep11-mcp.mjs +17 -0
- package/engine/audio/episodes/ep12-skill.mjs +16 -0
- package/engine/audio/episodes/ep13-subagent.mjs +17 -0
- package/engine/audio/episodes/ep14-agent-permission.mjs +16 -0
- package/engine/audio/episodes/ep15-prompt-injection.mjs +17 -0
- package/engine/audio/episodes/ep16-agent-done.mjs +16 -0
- package/engine/audio/episodes/ep17-sycophancy.mjs +16 -0
- package/engine/audio/episodes/ep18-ai-history.mjs +323 -0
- package/engine/audio/episodes/ep19-apple-history.mjs +311 -0
- package/engine/audio/episodes/ep20-nvidia-history.mjs +276 -0
- package/engine/audio/episodes/ep21-nobel-physics.mjs +151 -0
- package/engine/audio/episodes/ep22-nobel-chemistry.mjs +143 -0
- package/engine/audio/episodes/ep23-wheat-chessboard.mjs +23 -0
- package/engine/audio/episodes/ep24-birthday-paradox.mjs +25 -0
- package/engine/audio/episodes/ep25-behind-cover.mjs +11 -0
- package/engine/audio/episodes/ep26-opus-video.mjs +14 -0
- package/engine/audio/episodes/ep27-opus-video-full.mjs +17 -0
- package/engine/audio/episodes/ep28-express-relay.mjs +16 -0
- package/engine/audio/episodes/ep29-footsteps.mjs +14 -0
- package/engine/audio/episodes/ep30-tang-divorce.mjs +16 -0
- package/engine/audio/episodes/ep31-rigged.mjs +11 -0
- package/engine/audio/episodes/ep32-love-lasts.mjs +36 -0
- package/engine/audio/episodes/ep33-teammates.mjs +11 -0
- package/engine/audio/episodes/ep34-song-takeout.mjs +16 -0
- package/engine/audio/episodes/ep35-choke.mjs +11 -0
- package/engine/audio/episodes/ep36-boxed-pigs.mjs +43 -0
- package/engine/audio/episodes/ep37-bhop.mjs +11 -0
- package/engine/audio/episodes/ep38-butterfly.mjs +43 -0
- package/engine/audio/episodes/ep39-latency.mjs +11 -0
- package/engine/audio/episodes/ep40-counter-strafe.mjs +11 -0
- package/engine/audio/episodes/ep41-flying-money.mjs +16 -0
- package/engine/audio/episodes/ep42-tap-fire.mjs +11 -0
- package/engine/audio/episodes/ep43-one-more-game.mjs +11 -0
- package/engine/audio/episodes/ep45-callouts.mjs +11 -0
- package/engine/audio/episodes/ep46-song-ice.mjs +16 -0
- package/engine/audio/episodes/ep47-spotlight.mjs +11 -0
- package/engine/audio/episodes/ep48-jiggle-peek.mjs +11 -0
- package/engine/audio/episodes/ep49-ad-strafe.mjs +11 -0
- package/engine/audio/episodes/ep50-late-night.mjs +11 -0
- package/engine/audio/episodes/ep51-practice.mjs +11 -0
- package/engine/audio/episodes/library-halftone.mjs +32 -0
- package/engine/audio/music.mjs +45 -0
- package/engine/audio/score.mjs +209 -0
- package/engine/audio/sfx-lamplight.mjs +54 -0
- package/engine/audio/sfx-tactical.mjs +76 -0
- package/engine/audio/synth.mjs +510 -0
- package/engine/package-lock.json +5177 -0
- package/engine/package.json +26 -0
- package/engine/public/fonts/LICENSES.md +12 -0
- package/engine/public/fonts/ZCOOLKuaiLe-Regular.ttf +0 -0
- package/engine/public/fonts/vox/Anton-400.woff +0 -0
- package/engine/public/fonts/vox/Caveat-600.woff +0 -0
- package/engine/public/fonts/vox/EBGaramond-400.woff +0 -0
- package/engine/public/fonts/vox/EBGaramond-600.woff +0 -0
- package/engine/public/fonts/vox/LICENSES.md +10 -0
- package/engine/public/fonts/vox/NotoSansSC-900.woff +0 -0
- package/engine/public/fonts/vox/OFL.txt +94 -0
- package/engine/public/fonts/vox/PlayfairDisplay-700.woff +0 -0
- package/engine/public/fonts/vox/PlayfairDisplay-700i.woff +0 -0
- package/engine/public/music/README.md +16 -0
- package/engine/remotion.config.ts +5 -0
- package/engine/scripts/ep-dir.sh +49 -0
- package/engine/scripts/export.sh +28 -0
- package/engine/scripts/mix-stems.sh +17 -0
- package/engine/scripts/srt2json.mjs +29 -0
- package/engine/src/Root.tsx +244 -0
- package/engine/src/episodes/ep00-demo/Ep00Demo.tsx +97 -0
- package/engine/src/episodes/ep00-demo/components/AdjustPanel.tsx +68 -0
- package/engine/src/episodes/ep00-demo/components/Buddy.tsx +58 -0
- package/engine/src/episodes/ep00-demo/components/EditorUI.tsx +39 -0
- package/engine/src/episodes/ep00-demo/components/Icons.tsx +50 -0
- package/engine/src/episodes/ep00-demo/components/MediaPanel.tsx +129 -0
- package/engine/src/episodes/ep00-demo/components/Outro.tsx +123 -0
- package/engine/src/episodes/ep00-demo/components/Phone.tsx +88 -0
- package/engine/src/episodes/ep00-demo/components/SceneArt.tsx +196 -0
- package/engine/src/episodes/ep00-demo/components/Timeline.tsx +206 -0
- package/engine/src/episodes/ep00-demo/lib/buddy.ts +147 -0
- package/engine/src/episodes/ep00-demo/lib/camera.ts +55 -0
- package/engine/src/episodes/ep00-demo/lib/state.ts +231 -0
- package/engine/src/episodes/ep00-demo/lib/timeline.ts +98 -0
- package/engine/src/episodes/ep01-agent/Ep01Agent.tsx +16 -0
- package/engine/src/episodes/ep01-agent/cues.json +530 -0
- package/engine/src/episodes/ep01-agent/cues.ts +8 -0
- package/engine/src/episodes/ep01-agent/scenes/finale.tsx +174 -0
- package/engine/src/episodes/ep01-agent/scenes/index.ts +28 -0
- package/engine/src/episodes/ep01-agent/scenes/intro.tsx +235 -0
- package/engine/src/episodes/ep01-agent/scenes/loop.tsx +284 -0
- package/engine/src/episodes/ep01-agent/scenes/safety.tsx +249 -0
- package/engine/src/episodes/ep01-agent/scenes/setup.tsx +250 -0
- package/engine/src/episodes/ep02-llm/Ep02Llm.tsx +17 -0
- package/engine/src/episodes/ep02-llm/cues.json +254 -0
- package/engine/src/episodes/ep02-llm/cues.ts +5 -0
- package/engine/src/episodes/ep02-llm/scenes/index.ts +21 -0
- package/engine/src/episodes/ep02-llm/scenes/part1.tsx +444 -0
- package/engine/src/episodes/ep02-llm/scenes/part2.tsx +303 -0
- package/engine/src/episodes/ep03-cc/Ep03Cc.tsx +30 -0
- package/engine/src/episodes/ep03-cc/cues.json +692 -0
- package/engine/src/episodes/ep03-cc/cues.ts +5 -0
- package/engine/src/episodes/ep03-cc/scenes/aroll.tsx +265 -0
- package/engine/src/episodes/ep03-cc/scenes/broll1.tsx +343 -0
- package/engine/src/episodes/ep03-cc/scenes/broll2.tsx +571 -0
- package/engine/src/episodes/ep03-cc/scenes/index.ts +30 -0
- package/engine/src/episodes/ep04-opus55/Ep04Opus55.tsx +30 -0
- package/engine/src/episodes/ep04-opus55/cues.json +368 -0
- package/engine/src/episodes/ep04-opus55/cues.ts +5 -0
- package/engine/src/episodes/ep04-opus55/scenes/index.ts +25 -0
- package/engine/src/episodes/ep04-opus55/scenes/part1.tsx +487 -0
- package/engine/src/episodes/ep04-opus55/scenes/part2.tsx +282 -0
- package/engine/src/episodes/ep05-token/Ep05Token.tsx +32 -0
- package/engine/src/episodes/ep05-token/cues.json +314 -0
- package/engine/src/episodes/ep05-token/cues.ts +5 -0
- package/engine/src/episodes/ep05-token/scenes/index.ts +22 -0
- package/engine/src/episodes/ep05-token/scenes/part1.tsx +355 -0
- package/engine/src/episodes/ep05-token/scenes/part2.tsx +385 -0
- package/engine/src/episodes/ep06-context/Ep06Context.tsx +32 -0
- package/engine/src/episodes/ep06-context/Ep06ContextTall.tsx +35 -0
- package/engine/src/episodes/ep06-context/cues.json +332 -0
- package/engine/src/episodes/ep06-context/cues.ts +5 -0
- package/engine/src/episodes/ep06-context/scenes/index.ts +20 -0
- package/engine/src/episodes/ep06-context/scenes/part1.tsx +360 -0
- package/engine/src/episodes/ep06-context/scenes/part2.tsx +256 -0
- package/engine/src/episodes/ep06-context/tall/Cover.tsx +69 -0
- package/engine/src/episodes/ep06-context/tall/index.ts +20 -0
- package/engine/src/episodes/ep06-context/tall/part1.tsx +374 -0
- package/engine/src/episodes/ep06-context/tall/part2.tsx +272 -0
- package/engine/src/episodes/ep07-agent/Ep07Agent.tsx +32 -0
- package/engine/src/episodes/ep07-agent/Ep07AgentTall.tsx +35 -0
- package/engine/src/episodes/ep07-agent/cues.json +302 -0
- package/engine/src/episodes/ep07-agent/cues.ts +5 -0
- package/engine/src/episodes/ep07-agent/scenes/index.ts +18 -0
- package/engine/src/episodes/ep07-agent/scenes/part1.tsx +307 -0
- package/engine/src/episodes/ep07-agent/scenes/part2.tsx +188 -0
- package/engine/src/episodes/ep07-agent/tall/Cover.tsx +59 -0
- package/engine/src/episodes/ep07-agent/tall/index.ts +18 -0
- package/engine/src/episodes/ep07-agent/tall/part1.tsx +306 -0
- package/engine/src/episodes/ep07-agent/tall/part2.tsx +187 -0
- package/engine/src/episodes/ep08-hallucination/Ep08Hallucination.tsx +32 -0
- package/engine/src/episodes/ep08-hallucination/Ep08HallucinationTall.tsx +35 -0
- package/engine/src/episodes/ep08-hallucination/cues.json +314 -0
- package/engine/src/episodes/ep08-hallucination/cues.ts +5 -0
- package/engine/src/episodes/ep08-hallucination/scenes/index.ts +19 -0
- package/engine/src/episodes/ep08-hallucination/scenes/part1.tsx +282 -0
- package/engine/src/episodes/ep08-hallucination/scenes/part2.tsx +246 -0
- package/engine/src/episodes/ep08-hallucination/tall/Cover.tsx +63 -0
- package/engine/src/episodes/ep08-hallucination/tall/index.ts +19 -0
- package/engine/src/episodes/ep08-hallucination/tall/part1.tsx +273 -0
- package/engine/src/episodes/ep08-hallucination/tall/part2.tsx +247 -0
- package/engine/src/episodes/ep09-prompt/Ep09Prompt.tsx +35 -0
- package/engine/src/episodes/ep09-prompt/cues.json +308 -0
- package/engine/src/episodes/ep09-prompt/cues.ts +5 -0
- package/engine/src/episodes/ep09-prompt/scenes/Cover.tsx +65 -0
- package/engine/src/episodes/ep09-prompt/scenes/index.ts +21 -0
- package/engine/src/episodes/ep09-prompt/scenes/part1.tsx +315 -0
- package/engine/src/episodes/ep09-prompt/scenes/part2.tsx +320 -0
- package/engine/src/episodes/ep10-multimodal/Ep10Multimodal.tsx +35 -0
- package/engine/src/episodes/ep10-multimodal/cues.json +308 -0
- package/engine/src/episodes/ep10-multimodal/cues.ts +5 -0
- package/engine/src/episodes/ep10-multimodal/scenes/Cover.tsx +53 -0
- package/engine/src/episodes/ep10-multimodal/scenes/index.ts +21 -0
- package/engine/src/episodes/ep10-multimodal/scenes/part1.tsx +343 -0
- package/engine/src/episodes/ep10-multimodal/scenes/part2.tsx +437 -0
- package/engine/src/episodes/ep11-mcp/Ep11Mcp.tsx +35 -0
- package/engine/src/episodes/ep11-mcp/cues.json +332 -0
- package/engine/src/episodes/ep11-mcp/cues.ts +5 -0
- package/engine/src/episodes/ep11-mcp/scenes/Cover.tsx +67 -0
- package/engine/src/episodes/ep11-mcp/scenes/index.ts +21 -0
- package/engine/src/episodes/ep11-mcp/scenes/part1.tsx +336 -0
- package/engine/src/episodes/ep11-mcp/scenes/part2.tsx +327 -0
- package/engine/src/episodes/ep12-skill/Ep12Skill.tsx +35 -0
- package/engine/src/episodes/ep12-skill/cues.json +332 -0
- package/engine/src/episodes/ep12-skill/cues.ts +5 -0
- package/engine/src/episodes/ep12-skill/scenes/Cover.tsx +55 -0
- package/engine/src/episodes/ep12-skill/scenes/index.ts +21 -0
- package/engine/src/episodes/ep12-skill/scenes/part1.tsx +368 -0
- package/engine/src/episodes/ep12-skill/scenes/part2.tsx +274 -0
- package/engine/src/episodes/ep13-subagent/Ep13Subagent.tsx +35 -0
- package/engine/src/episodes/ep13-subagent/cues.json +344 -0
- package/engine/src/episodes/ep13-subagent/cues.ts +5 -0
- package/engine/src/episodes/ep13-subagent/scenes/Cover.tsx +61 -0
- package/engine/src/episodes/ep13-subagent/scenes/index.ts +21 -0
- package/engine/src/episodes/ep13-subagent/scenes/part1.tsx +383 -0
- package/engine/src/episodes/ep13-subagent/scenes/part2.tsx +317 -0
- package/engine/src/episodes/ep14-agent-permission/Ep14AgentPermission.tsx +35 -0
- package/engine/src/episodes/ep14-agent-permission/cues.json +326 -0
- package/engine/src/episodes/ep14-agent-permission/cues.ts +5 -0
- package/engine/src/episodes/ep14-agent-permission/scenes/Cover.tsx +62 -0
- package/engine/src/episodes/ep14-agent-permission/scenes/index.ts +20 -0
- package/engine/src/episodes/ep14-agent-permission/scenes/part1.tsx +302 -0
- package/engine/src/episodes/ep14-agent-permission/scenes/part2.tsx +309 -0
- package/engine/src/episodes/ep15-prompt-injection/Ep15PromptInjection.tsx +35 -0
- package/engine/src/episodes/ep15-prompt-injection/cues.json +302 -0
- package/engine/src/episodes/ep15-prompt-injection/cues.ts +5 -0
- package/engine/src/episodes/ep15-prompt-injection/scenes/Cover.tsx +60 -0
- package/engine/src/episodes/ep15-prompt-injection/scenes/index.ts +20 -0
- package/engine/src/episodes/ep15-prompt-injection/scenes/part1.tsx +307 -0
- package/engine/src/episodes/ep15-prompt-injection/scenes/part2.tsx +253 -0
- package/engine/src/episodes/ep16-agent-done/Ep16AgentDone.tsx +35 -0
- package/engine/src/episodes/ep16-agent-done/cues.json +320 -0
- package/engine/src/episodes/ep16-agent-done/cues.ts +5 -0
- package/engine/src/episodes/ep16-agent-done/scenes/Cover.tsx +66 -0
- package/engine/src/episodes/ep16-agent-done/scenes/index.ts +19 -0
- package/engine/src/episodes/ep16-agent-done/scenes/part1.tsx +271 -0
- package/engine/src/episodes/ep16-agent-done/scenes/part2.tsx +253 -0
- package/engine/src/episodes/ep17-sycophancy/Ep17Sycophancy.tsx +35 -0
- package/engine/src/episodes/ep17-sycophancy/cues.json +320 -0
- package/engine/src/episodes/ep17-sycophancy/cues.ts +5 -0
- package/engine/src/episodes/ep17-sycophancy/scenes/Cover.tsx +60 -0
- package/engine/src/episodes/ep17-sycophancy/scenes/index.ts +19 -0
- package/engine/src/episodes/ep17-sycophancy/scenes/part1.tsx +236 -0
- package/engine/src/episodes/ep17-sycophancy/scenes/part2.tsx +250 -0
- package/engine/src/episodes/ep18-ai-history/Cover.tsx +60 -0
- package/engine/src/episodes/ep18-ai-history/CoverTall.tsx +29 -0
- package/engine/src/episodes/ep18-ai-history/Ep18AiHistory.tsx +27 -0
- package/engine/src/episodes/ep18-ai-history/art.tsx +141 -0
- package/engine/src/episodes/ep18-ai-history/cues.json +626 -0
- package/engine/src/episodes/ep18-ai-history/cues.ts +5 -0
- package/engine/src/episodes/ep18-ai-history/film.tsx +910 -0
- package/engine/src/episodes/ep18-ai-history/scrapbook.tsx +762 -0
- package/engine/src/episodes/ep18-ai-history/timeline.ts +63 -0
- package/engine/src/episodes/ep19-apple-history/Cover.tsx +45 -0
- package/engine/src/episodes/ep19-apple-history/CoverTall.tsx +29 -0
- package/engine/src/episodes/ep19-apple-history/Ep19AppleHistory.tsx +27 -0
- package/engine/src/episodes/ep19-apple-history/art.tsx +302 -0
- package/engine/src/episodes/ep19-apple-history/cues.json +470 -0
- package/engine/src/episodes/ep19-apple-history/cues.ts +5 -0
- package/engine/src/episodes/ep19-apple-history/film.tsx +1245 -0
- package/engine/src/episodes/ep19-apple-history/timeline.ts +82 -0
- package/engine/src/episodes/ep20-nvidia-history/Cover.tsx +46 -0
- package/engine/src/episodes/ep20-nvidia-history/CoverTall.tsx +30 -0
- package/engine/src/episodes/ep20-nvidia-history/Ep20NvidiaHistory.tsx +27 -0
- package/engine/src/episodes/ep20-nvidia-history/art.tsx +244 -0
- package/engine/src/episodes/ep20-nvidia-history/cues.json +482 -0
- package/engine/src/episodes/ep20-nvidia-history/cues.ts +5 -0
- package/engine/src/episodes/ep20-nvidia-history/film.tsx +1088 -0
- package/engine/src/episodes/ep20-nvidia-history/timeline.ts +78 -0
- package/engine/src/episodes/ep21-nobel-physics/Cover.tsx +75 -0
- package/engine/src/episodes/ep21-nobel-physics/Ep21NobelPhysics.tsx +27 -0
- package/engine/src/episodes/ep21-nobel-physics/cues.json +218 -0
- package/engine/src/episodes/ep21-nobel-physics/cues.ts +5 -0
- package/engine/src/episodes/ep21-nobel-physics/film.tsx +627 -0
- package/engine/src/episodes/ep22-nobel-chemistry/Cover.tsx +64 -0
- package/engine/src/episodes/ep22-nobel-chemistry/Ep22NobelChemistry.tsx +27 -0
- package/engine/src/episodes/ep22-nobel-chemistry/cues.json +212 -0
- package/engine/src/episodes/ep22-nobel-chemistry/cues.ts +5 -0
- package/engine/src/episodes/ep22-nobel-chemistry/film.tsx +563 -0
- package/engine/src/episodes/ep23-wheat-chessboard/Ep23Wheat.tsx +322 -0
- package/engine/src/episodes/ep23-wheat-chessboard/timeline.ts +89 -0
- package/engine/src/episodes/ep24-birthday-paradox/Cover.tsx +53 -0
- package/engine/src/episodes/ep24-birthday-paradox/Ep24Birthday.tsx +233 -0
- package/engine/src/episodes/ep24-birthday-paradox/ring.tsx +164 -0
- package/engine/src/episodes/ep24-birthday-paradox/scenes.tsx +460 -0
- package/engine/src/episodes/ep24-birthday-paradox/timeline.ts +216 -0
- package/engine/src/episodes/ep25-behind-cover/Ep25Cover.tsx +306 -0
- package/engine/src/episodes/ep25-behind-cover/scenes.tsx +416 -0
- package/engine/src/episodes/ep25-behind-cover/timeline.ts +209 -0
- package/engine/src/episodes/ep26-opus-video/Cover.tsx +18 -0
- package/engine/src/episodes/ep26-opus-video/Ep26OpusVideo.tsx +53 -0
- package/engine/src/episodes/ep26-opus-video/cues.json +140 -0
- package/engine/src/episodes/ep26-opus-video/cues.ts +6 -0
- package/engine/src/episodes/ep26-opus-video/scenes.tsx +301 -0
- package/engine/src/episodes/ep27-opus-video-full/Cover.tsx +18 -0
- package/engine/src/episodes/ep27-opus-video-full/Ep27OpusVideoFull.tsx +65 -0
- package/engine/src/episodes/ep27-opus-video-full/assets.ts +36 -0
- package/engine/src/episodes/ep27-opus-video-full/cues.json +860 -0
- package/engine/src/episodes/ep27-opus-video-full/cues.ts +6 -0
- package/engine/src/episodes/ep27-opus-video-full/scenes/index.tsx +730 -0
- package/engine/src/episodes/ep27-opus-video-full/scenes/kit.tsx +334 -0
- package/engine/src/episodes/ep28-express-relay/CoverTall.tsx +98 -0
- package/engine/src/episodes/ep28-express-relay/Ep28Relay.tsx +453 -0
- package/engine/src/episodes/ep28-express-relay/scenes.tsx +2 -0
- package/engine/src/episodes/ep28-express-relay/timeline.ts +261 -0
- package/engine/src/episodes/ep29-footsteps/Ep29Footsteps.tsx +328 -0
- package/engine/src/episodes/ep29-footsteps/scenes.tsx +418 -0
- package/engine/src/episodes/ep29-footsteps/timeline.ts +250 -0
- package/engine/src/episodes/ep30-tang-divorce/CoverTall.tsx +85 -0
- package/engine/src/episodes/ep30-tang-divorce/Ep30Divorce.tsx +453 -0
- package/engine/src/episodes/ep30-tang-divorce/timeline.ts +235 -0
- package/engine/src/episodes/ep31-rigged/Ep31Rigged.tsx +334 -0
- package/engine/src/episodes/ep31-rigged/scenes.tsx +175 -0
- package/engine/src/episodes/ep31-rigged/timeline.ts +273 -0
- package/engine/src/episodes/ep32-love-lasts/Ep32Love.tsx +228 -0
- package/engine/src/episodes/ep32-love-lasts/scenes.tsx +219 -0
- package/engine/src/episodes/ep32-love-lasts/timeline.ts +165 -0
- package/engine/src/episodes/ep33-teammates/Ep33Teammates.tsx +304 -0
- package/engine/src/episodes/ep33-teammates/scenes.tsx +395 -0
- package/engine/src/episodes/ep33-teammates/timeline.ts +239 -0
- package/engine/src/episodes/ep34-song-takeout/CoverTall.tsx +70 -0
- package/engine/src/episodes/ep34-song-takeout/Ep34Takeout.tsx +362 -0
- package/engine/src/episodes/ep34-song-takeout/timeline.ts +219 -0
- package/engine/src/episodes/ep35-choke/Ep35Choke.tsx +318 -0
- package/engine/src/episodes/ep35-choke/scenes.tsx +252 -0
- package/engine/src/episodes/ep35-choke/timeline.ts +230 -0
- package/engine/src/episodes/ep36-boxed-pigs/CoverTall.tsx +65 -0
- package/engine/src/episodes/ep36-boxed-pigs/Ep36Pigs.tsx +519 -0
- package/engine/src/episodes/ep36-boxed-pigs/scenes.tsx +18 -0
- package/engine/src/episodes/ep36-boxed-pigs/timeline.ts +192 -0
- package/engine/src/episodes/ep37-bhop/Ep37Bhop.tsx +379 -0
- package/engine/src/episodes/ep37-bhop/scenes.tsx +166 -0
- package/engine/src/episodes/ep37-bhop/timeline.ts +232 -0
- package/engine/src/episodes/ep38-butterfly/CoverTall.tsx +55 -0
- package/engine/src/episodes/ep38-butterfly/Ep38Butterfly.tsx +434 -0
- package/engine/src/episodes/ep38-butterfly/timeline.ts +218 -0
- package/engine/src/episodes/ep39-latency/Ep39Latency.tsx +461 -0
- package/engine/src/episodes/ep39-latency/scenes.tsx +194 -0
- package/engine/src/episodes/ep39-latency/timeline.ts +248 -0
- package/engine/src/episodes/ep40-counter-strafe/Ep40CounterStrafe.tsx +410 -0
- package/engine/src/episodes/ep40-counter-strafe/scenes.tsx +124 -0
- package/engine/src/episodes/ep40-counter-strafe/timeline.ts +277 -0
- package/engine/src/episodes/ep41-flying-money/CoverTall.tsx +50 -0
- package/engine/src/episodes/ep41-flying-money/Ep41FlyingMoney.tsx +447 -0
- package/engine/src/episodes/ep41-flying-money/timeline.ts +239 -0
- package/engine/src/episodes/ep42-tap-fire/Ep42TapFire.tsx +376 -0
- package/engine/src/episodes/ep42-tap-fire/scenes.tsx +174 -0
- package/engine/src/episodes/ep42-tap-fire/timeline.ts +262 -0
- package/engine/src/episodes/ep43-one-more-game/Ep43OneMoreGame.tsx +376 -0
- package/engine/src/episodes/ep43-one-more-game/scenes.tsx +202 -0
- package/engine/src/episodes/ep43-one-more-game/timeline.ts +241 -0
- package/engine/src/episodes/ep45-callouts/Ep45Callouts.tsx +435 -0
- package/engine/src/episodes/ep45-callouts/scenes.tsx +170 -0
- package/engine/src/episodes/ep45-callouts/timeline.ts +260 -0
- package/engine/src/episodes/ep46-song-ice/CoverTall.tsx +51 -0
- package/engine/src/episodes/ep46-song-ice/Ep46SongIce.tsx +414 -0
- package/engine/src/episodes/ep46-song-ice/scenes.tsx +172 -0
- package/engine/src/episodes/ep46-song-ice/timeline.ts +257 -0
- package/engine/src/episodes/ep47-spotlight/Ep47Spotlight.tsx +416 -0
- package/engine/src/episodes/ep47-spotlight/scenes.tsx +146 -0
- package/engine/src/episodes/ep47-spotlight/timeline.ts +272 -0
- package/engine/src/episodes/ep48-jiggle-peek/Ep48JigglePeek.tsx +468 -0
- package/engine/src/episodes/ep48-jiggle-peek/scenes.tsx +86 -0
- package/engine/src/episodes/ep48-jiggle-peek/timeline.ts +264 -0
- package/engine/src/episodes/ep49-ad-strafe/Ep49AdStrafe.tsx +392 -0
- package/engine/src/episodes/ep49-ad-strafe/scenes.tsx +89 -0
- package/engine/src/episodes/ep49-ad-strafe/timeline.ts +266 -0
- package/engine/src/episodes/ep50-late-night/Ep50LateNight.tsx +380 -0
- package/engine/src/episodes/ep50-late-night/scenes.tsx +161 -0
- package/engine/src/episodes/ep50-late-night/timeline.ts +253 -0
- package/engine/src/episodes/ep51-practice/Ep51Practice.tsx +402 -0
- package/engine/src/episodes/ep51-practice/scenes.tsx +122 -0
- package/engine/src/episodes/ep51-practice/timeline.ts +241 -0
- package/engine/src/index.ts +4 -0
- package/engine/src/library/README.md +205 -0
- package/engine/src/library/Show.tsx +107 -0
- package/engine/src/library/Subtitles.tsx +105 -0
- package/engine/src/library/anim.ts +49 -0
- package/engine/src/library/blackgold/chaos.tsx +203 -0
- package/engine/src/library/blackgold/charts.tsx +578 -0
- package/engine/src/library/blackgold/pen.tsx +331 -0
- package/engine/src/library/blackgold/props.tsx +176 -0
- package/engine/src/library/blackgold/stage.tsx +262 -0
- package/engine/src/library/blackgold/theme.ts +62 -0
- package/engine/src/library/character/Accessories.tsx +172 -0
- package/engine/src/library/character/Arm.tsx +16 -0
- package/engine/src/library/character/BuddyFigure.tsx +127 -0
- package/engine/src/library/character/Char.tsx +71 -0
- package/engine/src/library/character/PixelBuddy.tsx +150 -0
- package/engine/src/library/character/types.ts +2 -0
- package/engine/src/library/cues.ts +49 -0
- package/engine/src/library/editor-room/canvas.tsx +264 -0
- package/engine/src/library/editor-room/mascots.tsx +92 -0
- package/engine/src/library/editor-room/stage.tsx +400 -0
- package/engine/src/library/editor-room/theme.ts +66 -0
- package/engine/src/library/fonts.ts +24 -0
- package/engine/src/library/fx.tsx +233 -0
- package/engine/src/library/gilded/charts.tsx +283 -0
- package/engine/src/library/gilded/props.tsx +245 -0
- package/engine/src/library/gilded/stage.tsx +312 -0
- package/engine/src/library/gilded/theme.ts +62 -0
- package/engine/src/library/halftone/props.tsx +332 -0
- package/engine/src/library/halftone/stage.tsx +435 -0
- package/engine/src/library/halftone/suspect.tsx +86 -0
- package/engine/src/library/halftone/theme.ts +71 -0
- package/engine/src/library/icons.tsx +318 -0
- package/engine/src/library/items/apps.tsx +161 -0
- package/engine/src/library/items/media.tsx +80 -0
- package/engine/src/library/items/objects.tsx +252 -0
- package/engine/src/library/lamplight/charts.tsx +530 -0
- package/engine/src/library/lamplight/ice.tsx +401 -0
- package/engine/src/library/lamplight/props.tsx +1072 -0
- package/engine/src/library/lamplight/scenes.tsx +187 -0
- package/engine/src/library/lamplight/stage.tsx +451 -0
- package/engine/src/library/lamplight/theme.ts +81 -0
- package/engine/src/library/previews/BlackGoldDemo.tsx +195 -0
- package/engine/src/library/previews/EditorRoomDemo.tsx +190 -0
- package/engine/src/library/previews/GildedDemo.tsx +185 -0
- package/engine/src/library/previews/HalftoneDemo.tsx +426 -0
- package/engine/src/library/previews/LamplightDemo.tsx +202 -0
- package/engine/src/library/previews/PixelWardrobe.tsx +39 -0
- package/engine/src/library/previews/TacticalDemo.tsx +280 -0
- package/engine/src/library/previews/Wardrobe.tsx +49 -0
- package/engine/src/library/previews/WarmDeskDemo.tsx +291 -0
- package/engine/src/library/previews/WarmDeskShowDemo.tsx +79 -0
- package/engine/src/library/sets/Studio.tsx +164 -0
- package/engine/src/library/tactical/attention.tsx +340 -0
- package/engine/src/library/tactical/charts.tsx +373 -0
- package/engine/src/library/tactical/hearing.tsx +189 -0
- package/engine/src/library/tactical/movement.tsx +163 -0
- package/engine/src/library/tactical/pipeline.tsx +236 -0
- package/engine/src/library/tactical/practice.tsx +84 -0
- package/engine/src/library/tactical/range.tsx +338 -0
- package/engine/src/library/tactical/ranked.tsx +267 -0
- package/engine/src/library/tactical/reward.tsx +204 -0
- package/engine/src/library/tactical/sleep.tsx +90 -0
- package/engine/src/library/tactical/spread.tsx +200 -0
- package/engine/src/library/tactical/stage.tsx +379 -0
- package/engine/src/library/tactical/theme.ts +48 -0
- package/engine/src/library/tactical/tracking.tsx +146 -0
- package/engine/src/library/tactical/vectors.tsx +161 -0
- package/engine/src/library/tactical/window.tsx +93 -0
- package/engine/src/library/theme.ts +55 -0
- package/engine/src/library/types.ts +11 -0
- package/engine/src/library/ui.tsx +137 -0
- package/engine/src/library/vox/CoverTall.tsx +92 -0
- package/engine/src/library/vox/VoxShow.tsx +136 -0
- package/engine/src/library/vox/desk.tsx +31 -0
- package/engine/src/library/vox/footage.tsx +74 -0
- package/engine/src/library/vox/hud.tsx +51 -0
- package/engine/src/library/vox/portrait.tsx +80 -0
- package/engine/src/library/vox/props.tsx +256 -0
- package/engine/src/library/vox/shots.tsx +66 -0
- package/engine/src/library/vox/stickers.tsx +132 -0
- package/engine/src/library/vox/theme.ts +77 -0
- package/engine/src/library/warm-desk/CoverTall.tsx +111 -0
- package/engine/src/library/warm-desk/DeskShow.tsx +127 -0
- package/engine/src/library/warm-desk/HostCam.tsx +30 -0
- package/engine/src/library/warm-desk/Slot.tsx +67 -0
- package/engine/src/library/warm-desk/immersive.tsx +105 -0
- package/engine/src/library/warm-desk/mascot.tsx +48 -0
- package/engine/src/library/warm-desk/motifs.tsx +277 -0
- package/engine/src/library/warm-desk/props.tsx +318 -0
- package/engine/src/library/warm-desk/stage.tsx +268 -0
- package/engine/src/library/warm-desk/theme.ts +83 -0
- package/engine/styles/LICENSE-huashu-art-motion +21 -0
- package/engine/styles/README.md +143 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//345/203/217/347/264/240/346/211/213/347/273/230/351/243/216/README.md +18 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//345/203/217/347/264/240/346/211/213/347/273/230/351/243/216//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//345/203/217/347/264/240/350/264/264/347/272/270/351/243/216/README.md +37 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//345/203/217/347/264/240/350/264/264/347/272/270/351/243/216//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//345/215/217/344/275/234/345/211/252/350/276/221/345/217/260/351/243/216/README.md +59 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//345/215/217/344/275/234/345/211/252/350/276/221/345/217/260/351/243/216//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//346/210/230/346/234/257/345/261/217/347/247/221/346/231/256/351/243/216/README.md +64 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//346/210/230/346/234/257/345/261/217/347/247/221/346/231/256/351/243/216//347/210/206/346/254/276/350/247/243/346/236/220.md +62 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//346/210/230/346/234/257/345/261/217/347/247/221/346/231/256/351/243/216//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//346/232/226/347/272/270/345/267/245/344/275/234/345/217/260/351/243/216/README.md +54 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//346/232/226/347/272/270/345/267/245/344/275/234/345/217/260/351/243/216//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//346/232/227/351/207/221/346/226/207/347/214/256/351/243/216/README.md +30 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//346/232/227/351/207/221/346/226/207/347/214/256/351/243/216//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//347/201/257/347/201/253/345/217/262/350/257/235/351/243/216/README.md +55 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//347/201/257/347/201/253/345/217/262/350/257/235/351/243/216//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//347/237/242/351/207/217/346/211/213/347/273/230/351/243/216/README.md +19 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//347/237/242/351/207/217/346/211/213/347/273/230/351/243/216//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//347/275/221/347/202/271/346/241/243/346/241/210/351/243/216/README.md +50 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//347/275/221/347/202/271/346/241/243/346/241/210/351/243/216//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//351/273/221/351/207/221/345/205/211/345/275/261/351/243/216/README.md +70 -0
- package/engine/styles//346/210/221/347/232/204/351/243/216/346/240/274//351/273/221/351/207/221/345/205/211/345/275/261/351/243/216//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/01_cave_/346/264/236/347/251/264/345/262/251/347/224/273//345/234/272/346/231/257/344/273/243/347/240/201.js +364 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/01_cave_/346/264/236/347/251/264/345/262/251/347/224/273//351/205/215/346/226/271/345/215/241.md +46 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/01_cave_/346/264/236/347/251/264/345/262/251/347/224/273//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/02_egypt_/345/237/203/345/217/212/345/243/201/347/224/273//345/234/272/346/231/257/344/273/243/347/240/201.js +524 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/02_egypt_/345/237/203/345/217/212/345/243/201/347/224/273//351/205/215/346/226/271/345/215/241.md +64 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/02_egypt_/345/237/203/345/217/212/345/243/201/347/224/273//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/03_greek_/345/217/244/345/270/214/350/205/212/351/273/221/347/273/230//345/234/272/346/231/257/344/273/243/347/240/201.js +448 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/03_greek_/345/217/244/345/270/214/350/205/212/351/273/221/347/273/230//351/205/215/346/226/271/345/215/241.md +50 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/03_greek_/345/217/244/345/270/214/350/205/212/351/273/221/347/273/230//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/04_roman_/347/275/227/351/251/254/351/251/254/350/265/233/345/205/213//345/234/272/346/231/257/344/273/243/347/240/201.js +555 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/04_roman_/347/275/227/351/251/254/351/251/254/350/265/233/345/205/213//351/205/215/346/226/271/345/215/241.md +99 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/04_roman_/347/275/227/351/251/254/351/251/254/350/265/233/345/205/213//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/05_gothic_/345/223/245/347/211/271/346/211/213/346/212/204/346/234/254//345/234/272/346/231/257/344/273/243/347/240/201.js +522 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/05_gothic_/345/223/245/347/211/271/346/211/213/346/212/204/346/234/254//351/205/215/346/226/271/345/215/241.md +32 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/05_gothic_/345/223/245/347/211/271/346/211/213/346/212/204/346/234/254//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/17_ink_/346/260/264/345/242/250/345/206/231/346/204/217//345/234/272/346/231/257/344/273/243/347/240/201.js +273 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/17_ink_/346/260/264/345/242/250/345/206/231/346/204/217//351/205/215/346/226/271/345/215/241.md +50 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/17_ink_/346/260/264/345/242/250/345/206/231/346/204/217//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/20_dunhuang_/346/225/246/347/205/214/345/243/201/347/224/273//345/234/272/346/231/257/344/273/243/347/240/201.js +215 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/20_dunhuang_/346/225/246/347/205/214/345/243/201/347/224/273//351/205/215/346/226/271/345/215/241.md +49 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/20_dunhuang_/346/225/246/347/205/214/345/243/201/347/224/273//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/34_shadowpuppet_/347/232/256/345/275/261//345/234/272/346/231/257/344/273/243/347/240/201.js +195 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/34_shadowpuppet_/347/232/256/345/275/261//351/205/215/346/226/271/345/215/241.md +40 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/01_/345/217/244/344/273/243/344/270/216/344/274/240/347/273/237/34_shadowpuppet_/347/232/256/345/275/261//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/02_/345/217/244/345/205/270/346/262/271/347/224/273/06_renaissance_/346/226/207/350/211/272/345/244/215/345/205/264//345/234/272/346/231/257/344/273/243/347/240/201.js +338 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/02_/345/217/244/345/205/270/346/262/271/347/224/273/06_renaissance_/346/226/207/350/211/272/345/244/215/345/205/264//351/205/215/346/226/271/345/215/241.md +41 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/02_/345/217/244/345/205/270/346/262/271/347/224/273/06_renaissance_/346/226/207/350/211/272/345/244/215/345/205/264//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/02_/345/217/244/345/205/270/346/262/271/347/224/273/32_rembrandt_/344/274/246/345/213/203/346/234/227/346/230/216/346/232/227//345/234/272/346/231/257/344/273/243/347/240/201.js +217 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/02_/345/217/244/345/205/270/346/262/271/347/224/273/32_rembrandt_/344/274/246/345/213/203/346/234/227/346/230/216/346/232/227//351/205/215/346/226/271/345/215/241.md +29 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/02_/345/217/244/345/205/270/346/262/271/347/224/273/32_rembrandt_/344/274/246/345/213/203/346/234/227/346/230/216/346/232/227//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/03_/345/215/260/350/261/241/346/264/276/344/270/216/345/220/216/345/215/260/350/261/241/08_impressionism_/345/215/260/350/261/241/346/264/276//345/234/272/346/231/257/344/273/243/347/240/201.js +206 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/03_/345/215/260/350/261/241/346/264/276/344/270/216/345/220/216/345/215/260/350/261/241/08_impressionism_/345/215/260/350/261/241/346/264/276//351/205/215/346/226/271/345/215/241.md +34 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/03_/345/215/260/350/261/241/346/264/276/344/270/216/345/220/216/345/215/260/350/261/241/08_impressionism_/345/215/260/350/261/241/346/264/276//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/03_/345/215/260/350/261/241/346/264/276/344/270/216/345/220/216/345/215/260/350/261/241/09_postimp_/346/242/265/351/253/230//345/234/272/346/231/257/344/273/243/347/240/201.js +183 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/03_/345/215/260/350/261/241/346/264/276/344/270/216/345/220/216/345/215/260/350/261/241/09_postimp_/346/242/265/351/253/230//351/205/215/346/226/271/345/215/241.md +17 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/03_/345/215/260/350/261/241/346/264/276/344/270/216/345/220/216/345/215/260/350/261/241/09_postimp_/346/242/265/351/253/230//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/03_/345/215/260/350/261/241/346/264/276/344/270/216/345/220/216/345/215/260/350/261/241/28_monet_/350/216/253/345/245/210//345/234/272/346/231/257/344/273/243/347/240/201.js +176 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/03_/345/215/260/350/261/241/346/264/276/344/270/216/345/220/216/345/215/260/350/261/241/28_monet_/350/216/253/345/245/210//351/205/215/346/226/271/345/215/241.md +39 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/03_/345/215/260/350/261/241/346/264/276/344/270/216/345/220/216/345/215/260/350/261/241/28_monet_/350/216/253/345/245/210//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/03_/345/215/260/350/261/241/346/264/276/344/270/216/345/220/216/345/215/260/350/261/241/29_seurat_/344/277/256/346/213/211/347/202/271/345/275/251//345/234/272/346/231/257/344/273/243/347/240/201.js +104 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/03_/345/215/260/350/261/241/346/264/276/344/270/216/345/220/216/345/215/260/350/261/241/29_seurat_/344/277/256/346/213/211/347/202/271/345/275/251//351/205/215/346/226/271/345/215/241.md +31 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/03_/345/215/260/350/261/241/346/264/276/344/270/216/345/220/216/345/215/260/350/261/241/29_seurat_/344/277/256/346/213/211/347/202/271/345/275/251//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/10_nouveau_/346/205/225/345/244/217/346/226/260/350/211/272/346/234/257//345/234/272/346/231/257/344/273/243/347/240/201.js +334 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/10_nouveau_/346/205/225/345/244/217/346/226/260/350/211/272/346/234/257//351/205/215/346/226/271/345/215/241.md +31 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/10_nouveau_/346/205/225/345/244/217/346/226/260/350/211/272/346/234/257//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/11_cubism_/347/253/213/344/275/223/344/270/273/344/271/211//345/234/272/346/231/257/344/273/243/347/240/201.js +265 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/11_cubism_/347/253/213/344/275/223/344/270/273/344/271/211//351/205/215/346/226/271/345/215/241.md +30 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/11_cubism_/347/253/213/344/275/223/344/270/273/344/271/211//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/12_bauhaus_/345/214/205/350/261/252/346/226/257//345/234/272/346/231/257/344/273/243/347/240/201.js +214 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/12_bauhaus_/345/214/205/350/261/252/346/226/257//351/205/215/346/226/271/345/215/241.md +30 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/12_bauhaus_/345/214/205/350/261/252/346/226/257//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/18_klimt_/345/205/213/351/207/214/345/247/206/347/211/271//345/234/272/346/231/257/344/273/243/347/240/201.js +227 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/18_klimt_/345/205/213/351/207/214/345/247/206/347/211/271//351/205/215/346/226/271/345/215/241.md +37 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/18_klimt_/345/205/213/351/207/214/345/247/206/347/211/271//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/19_munch_/350/222/231/345/205/213//345/234/272/346/231/257/344/273/243/347/240/201.js +153 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/19_munch_/350/222/231/345/205/213//351/205/215/346/226/271/345/215/241.md +42 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/19_munch_/350/222/231/345/205/213//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/22_constructivism_/346/236/204/346/210/220/344/270/273/344/271/211//345/234/272/346/231/257/344/273/243/347/240/201.js +205 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/22_constructivism_/346/236/204/346/210/220/344/270/273/344/271/211//351/205/215/346/226/271/345/215/241.md +35 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/22_constructivism_/346/236/204/346/210/220/344/270/273/344/271/211//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/23_dali_/350/276/276/345/210/251/350/266/205/347/216/260/345/256/236//345/234/272/346/231/257/344/273/243/347/240/201.js +221 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/23_dali_/350/276/276/345/210/251/350/266/205/347/216/260/345/256/236//351/205/215/346/226/271/345/215/241.md +29 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/23_dali_/350/276/276/345/210/251/350/266/205/347/216/260/345/256/236//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/24_hopper_/351/234/215/347/217/200//345/234/272/346/231/257/344/273/243/347/240/201.js +150 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/24_hopper_/351/234/215/347/217/200//351/205/215/346/226/271/345/215/241.md +30 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/24_hopper_/351/234/215/347/217/200//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/30_matisse_/351/251/254/350/222/202/346/226/257/345/211/252/347/272/270//345/234/272/346/231/257/344/273/243/347/240/201.js +151 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/30_matisse_/351/251/254/350/222/202/346/226/257/345/211/252/347/272/270//351/205/215/346/226/271/345/215/241.md +26 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/30_matisse_/351/251/254/350/222/202/346/226/257/345/211/252/347/272/270//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/36_picasso_blue_/346/257/225/345/212/240/347/264/242/350/223/235/350/211/262/346/227/266/346/234/237//345/234/272/346/231/257/344/273/243/347/240/201.js +123 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/36_picasso_blue_/346/257/225/345/212/240/347/264/242/350/223/235/350/211/262/346/227/266/346/234/237//351/205/215/346/226/271/345/215/241.md +25 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/04_/347/216/260/344/273/243/344/270/273/344/271/211/36_picasso_blue_/346/257/225/345/212/240/347/264/242/350/223/235/350/211/262/346/227/266/346/234/237//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/05_/346/263/242/346/231/256/344/270/216/350/241/227/345/244/264/13_pop_/346/263/242/346/231/256/350/211/272/346/234/257//345/234/272/346/231/257/344/273/243/347/240/201.js +269 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/05_/346/263/242/346/231/256/344/270/216/350/241/227/345/244/264/13_pop_/346/263/242/346/231/256/350/211/272/346/234/257//351/205/215/346/226/271/345/215/241.md +29 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/05_/346/263/242/346/231/256/344/270/216/350/241/227/345/244/264/13_pop_/346/263/242/346/231/256/350/211/272/346/234/257//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/05_/346/263/242/346/231/256/344/270/216/350/241/227/345/244/264/21_kusama_/350/215/211/351/227/264/345/274/245/347/224/237/346/263/242/347/202/271//345/234/272/346/231/257/344/273/243/347/240/201.js +124 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/05_/346/263/242/346/231/256/344/270/216/350/241/227/345/244/264/21_kusama_/350/215/211/351/227/264/345/274/245/347/224/237/346/263/242/347/202/271//351/205/215/346/226/271/345/215/241.md +32 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/05_/346/263/242/346/231/256/344/270/216/350/241/227/345/244/264/21_kusama_/350/215/211/351/227/264/345/274/245/347/224/237/346/263/242/347/202/271//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/05_/346/263/242/346/231/256/344/270/216/350/241/227/345/244/264/27_kirby_/346/274/253/345/250/201Kirby//345/234/272/346/231/257/344/273/243/347/240/201.js +255 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/05_/346/263/242/346/231/256/344/270/216/350/241/227/345/244/264/27_kirby_/346/274/253/345/250/201Kirby//351/205/215/346/226/271/345/215/241.md +30 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/05_/346/263/242/346/231/256/344/270/216/350/241/227/345/244/264/27_kirby_/346/274/253/345/250/201Kirby//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/05_/346/263/242/346/231/256/344/270/216/350/241/227/345/244/264/31_haring_/345/223/210/346/236/227/346/266/202/351/270/246//345/234/272/346/231/257/344/273/243/347/240/201.js +109 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/05_/346/263/242/346/231/256/344/270/216/350/241/227/345/244/264/31_haring_/345/223/210/346/236/227/346/266/202/351/270/246//351/205/215/346/226/271/345/215/241.md +22 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/05_/346/263/242/346/231/256/344/270/216/350/241/227/345/244/264/31_haring_/345/223/210/346/236/227/346/266/202/351/270/246//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/06_/345/215/241/351/200/232/344/270/216/345/212/250/347/224/273/16_2026_/345/275/223/344/273/243/346/211/201/345/271/263/346/217/222/347/224/273//345/234/272/346/231/257/344/273/243/347/240/201.js +565 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/06_/345/215/241/351/200/232/344/270/216/345/212/250/347/224/273/16_2026_/345/275/223/344/273/243/346/211/201/345/271/263/346/217/222/347/224/273//351/205/215/346/226/271/345/215/241.md +55 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/06_/345/215/241/351/200/232/344/270/216/345/212/250/347/224/273/16_2026_/345/275/223/344/273/243/346/211/201/345/271/263/346/217/222/347/224/273//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/06_/345/215/241/351/200/232/344/270/216/345/212/250/347/224/273/25_ghibli_/345/220/211/345/215/234/345/212/233/346/260/264/345/275/251//345/234/272/346/231/257/344/273/243/347/240/201.js +251 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/06_/345/215/241/351/200/232/344/270/216/345/212/250/347/224/273/25_ghibli_/345/220/211/345/215/234/345/212/233/346/260/264/345/275/251//351/205/215/346/226/271/345/215/241.md +31 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/06_/345/215/241/351/200/232/344/270/216/345/212/250/347/224/273/25_ghibli_/345/220/211/345/215/234/345/212/233/346/260/264/345/275/251//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/06_/345/215/241/351/200/232/344/270/216/345/212/250/347/224/273/33_rubberhose_/346/251/241/347/232/256/347/256/241/345/215/241/351/200/232//345/234/272/346/231/257/344/273/243/347/240/201.js +219 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/06_/345/215/241/351/200/232/344/270/216/345/212/250/347/224/273/33_rubberhose_/346/251/241/347/232/256/347/256/241/345/215/241/351/200/232//351/205/215/346/226/271/345/215/241.md +31 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/06_/345/215/241/351/200/232/344/270/216/345/212/250/347/224/273/33_rubberhose_/346/251/241/347/232/256/347/256/241/345/215/241/351/200/232//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/06_/345/215/241/351/200/232/344/270/216/345/212/250/347/224/273/35_shinkai_/346/226/260/346/265/267/350/257/232/345/205/211/345/275/261//345/234/272/346/231/257/344/273/243/347/240/201.js +197 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/06_/345/215/241/351/200/232/344/270/216/345/212/250/347/224/273/35_shinkai_/346/226/260/346/265/267/350/257/232/345/205/211/345/275/261//351/205/215/346/226/271/345/215/241.md +34 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/06_/345/215/241/351/200/232/344/270/216/345/212/250/347/224/273/35_shinkai_/346/226/260/346/265/267/350/257/232/345/205/211/345/275/261//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/07_/346/225/260/345/255/227/344/270/216/345/203/217/347/264/240/14_8bit_8-bit/345/203/217/347/264/240//345/234/272/346/231/257/344/273/243/347/240/201.js +238 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/07_/346/225/260/345/255/227/344/270/216/345/203/217/347/264/240/14_8bit_8-bit/345/203/217/347/264/240//351/205/215/346/226/271/345/215/241.md +27 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/07_/346/225/260/345/255/227/344/270/216/345/203/217/347/264/240/14_8bit_8-bit/345/203/217/347/264/240//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/07_/346/225/260/345/255/227/344/270/216/345/203/217/347/264/240/15_raytrace_/346/227/251/346/234/237/345/205/211/350/277/275CGI//345/234/272/346/231/257/344/273/243/347/240/201.js +300 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/07_/346/225/260/345/255/227/344/270/216/345/203/217/347/264/240/15_raytrace_/346/227/251/346/234/237/345/205/211/350/277/275CGI//351/205/215/346/226/271/345/215/241.md +32 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/07_/346/225/260/345/255/227/344/270/216/345/203/217/347/264/240/15_raytrace_/346/227/251/346/234/237/345/205/211/350/277/275CGI//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/07_/346/225/260/345/255/227/344/270/216/345/203/217/347/264/240/26_vaporwave_/350/222/270/346/261/275/346/263/242//345/234/272/346/231/257/344/273/243/347/240/201.js +191 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/07_/346/225/260/345/255/227/344/270/216/345/203/217/347/264/240/26_vaporwave_/350/222/270/346/261/275/346/263/242//351/205/215/346/226/271/345/215/241.md +27 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274/07_/346/225/260/345/255/227/344/270/216/345/203/217/347/264/240/26_vaporwave_/350/222/270/346/261/275/346/263/242//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274//345/216/237/347/211/210/346/200/273/347/264/242/345/274/225.md +47 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274//350/275/254/345/234/272_/350/277/201/347/247/273/346/265/213/350/257/225.md +53 -0
- package/engine/styles//350/211/272/346/234/257/351/243/216/346/240/274//351/237/263/350/275/250_/350/211/272/346/234/257/345/217/262/351/200/237/351/200/232.md +135 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/t1_3b1b_3Blue1Brown//345/217/202/346/225/260/347/244/272/344/276/213.json +20 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/t1_3b1b_3Blue1Brown//347/211/207/346/256/265/344/273/243/347/240/201.js +197 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/t1_3b1b_3Blue1Brown//347/244/272/350/214/203/345/267/245/347/250/213/eras.js +11 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/t1_3b1b_3Blue1Brown//347/244/272/350/214/203/345/267/245/347/250/213/t1_s1.js +101 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/t1_3b1b_3Blue1Brown//347/244/272/350/214/203/345/267/245/347/250/213/t1_s2.js +74 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/t1_3b1b_3Blue1Brown//347/244/272/350/214/203/345/267/245/347/250/213/t1_s3.js +65 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/t1_3b1b_3Blue1Brown//350/257/255/346/263/225/345/215/241.md +114 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/t1_3b1b_3Blue1Brown//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/y1_kurzgesagt_Kurzgesagt//345/217/202/346/225/260/347/244/272/344/276/213.json +18 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/y1_kurzgesagt_Kurzgesagt//347/211/207/346/256/265/344/273/243/347/240/201.js +143 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/y1_kurzgesagt_Kurzgesagt//347/244/272/350/214/203/345/267/245/347/250/213/eras.js +10 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/y1_kurzgesagt_Kurzgesagt//347/244/272/350/214/203/345/267/245/347/250/213/kurzgesagt.js +347 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/y1_kurzgesagt_Kurzgesagt//350/257/255/346/263/225/345/215/241.md +183 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/y1_kurzgesagt_Kurzgesagt//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/y3_whiteboard_/347/231/275/346/235/277//345/217/202/346/225/260/347/244/272/344/276/213.json +17 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/y3_whiteboard_/347/231/275/346/235/277//347/211/207/346/256/265/344/273/243/347/240/201.js +206 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/y3_whiteboard_/347/231/275/346/235/277//347/244/272/350/214/203/345/267/245/347/250/213/eras.js +10 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/y3_whiteboard_/347/231/275/346/235/277//347/244/272/350/214/203/345/267/245/347/250/213/whiteboard.js +162 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/y3_whiteboard_/347/231/275/346/235/277//350/257/255/346/263/225/345/215/241.md +182 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/01_/347/247/221/346/231/256/345/233/276/350/247/243/y3_whiteboard_/347/231/275/346/235/277//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/t2_keynote_ui_/345/217/221/345/270/203/344/274/232//345/217/202/346/225/260/347/244/272/344/276/213.json +17 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/t2_keynote_ui_/345/217/221/345/270/203/344/274/232//347/211/207/346/256/265/344/273/243/347/240/201.js +243 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/t2_keynote_ui_/345/217/221/345/270/203/344/274/232//347/244/272/350/214/203/345/267/245/347/250/213/eras.js +10 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/t2_keynote_ui_/345/217/221/345/270/203/344/274/232//347/244/272/350/214/203/345/267/245/347/250/213/t2_s1.js +57 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/t2_keynote_ui_/345/217/221/345/270/203/344/274/232//347/244/272/350/214/203/345/267/245/347/250/213/t2_s2.js +70 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/t2_keynote_ui_/345/217/221/345/270/203/344/274/232//347/244/272/350/214/203/345/267/245/347/250/213/t2_s3.js +61 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/t2_keynote_ui_/345/217/221/345/270/203/344/274/232//350/257/255/346/263/225/345/215/241.md +109 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/t2_keynote_ui_/345/217/221/345/270/203/344/274/232//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/t3_finance_chart_/350/264/242/347/273/217/345/233/276/350/241/250//345/217/202/346/225/260/347/244/272/344/276/213.json +27 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/t3_finance_chart_/350/264/242/347/273/217/345/233/276/350/241/250//347/211/207/346/256/265/344/273/243/347/240/201.js +174 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/t3_finance_chart_/350/264/242/347/273/217/345/233/276/350/241/250//347/244/272/350/214/203/345/267/245/347/250/213/eras.js +11 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/t3_finance_chart_/350/264/242/347/273/217/345/233/276/350/241/250//347/244/272/350/214/203/345/267/245/347/250/213/t3_s1.js +48 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/t3_finance_chart_/350/264/242/347/273/217/345/233/276/350/241/250//347/244/272/350/214/203/345/267/245/347/250/213/t3_s2.js +42 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/t3_finance_chart_/350/264/242/347/273/217/345/233/276/350/241/250//347/244/272/350/214/203/345/267/245/347/250/213/t3_s3.js +51 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/t3_finance_chart_/350/264/242/347/273/217/345/233/276/350/241/250//350/257/255/346/263/225/345/215/241.md +107 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/t3_finance_chart_/350/264/242/347/273/217/345/233/276/350/241/250//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/y2_vox_Vox//345/217/202/346/225/260/347/244/272/344/276/213.json +14 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/y2_vox_Vox//347/211/207/346/256/265/344/273/243/347/240/201.js +141 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/y2_vox_Vox//347/244/272/350/214/203/345/267/245/347/250/213/eras.js +10 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/y2_vox_Vox//347/244/272/350/214/203/345/267/245/347/250/213/vox.js +240 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/y2_vox_Vox//350/257/255/346/263/225/345/215/241.md +185 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/02_/346/226/260/351/227/273/344/270/216/346/225/260/346/215/256/y2_vox_Vox//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y4_storytime_Storytime//345/217/202/346/225/260/347/244/272/344/276/213.json +14 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y4_storytime_Storytime//347/211/207/346/256/265/344/273/243/347/240/201.js +168 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y4_storytime_Storytime//347/244/272/350/214/203/345/267/245/347/250/213/eras.js +14 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y4_storytime_Storytime//347/244/272/350/214/203/345/267/245/347/250/213/s1_desk.js +18 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y4_storytime_Storytime//347/244/272/350/214/203/345/267/245/347/250/213/s2_screen.js +82 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y4_storytime_Storytime//347/244/272/350/214/203/345/267/245/347/250/213/s3_react.js +39 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y4_storytime_Storytime//347/244/272/350/214/203/345/267/245/347/250/213/s4_wide.js +16 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y4_storytime_Storytime//347/244/272/350/214/203/345/267/245/347/250/213/s5_close.js +18 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y4_storytime_Storytime//347/244/272/350/214/203/345/267/245/347/250/213/story.js +25 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y4_storytime_Storytime//347/244/272/350/214/203/345/267/245/347/250/213/vo_env.js +2 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y4_storytime_Storytime//347/244/272/350/214/203/345/267/245/347/250/213/world.js +73 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y4_storytime_Storytime//350/257/255/346/263/225/345/215/241.md +166 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y4_storytime_Storytime//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y5_kinetic_type_/345/212/250/346/200/201/346/226/207/345/255/227//345/217/202/346/225/260/347/244/272/344/276/213.json +14 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y5_kinetic_type_/345/212/250/346/200/201/346/226/207/345/255/227//347/211/207/346/256/265/344/273/243/347/240/201.js +126 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y5_kinetic_type_/345/212/250/346/200/201/346/226/207/345/255/227//347/244/272/350/214/203/345/267/245/347/250/213/eras.js +16 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y5_kinetic_type_/345/212/250/346/200/201/346/226/207/345/255/227//347/244/272/350/214/203/345/267/245/347/250/213/k1_title.js +38 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y5_kinetic_type_/345/212/250/346/200/201/346/226/207/345/255/227//347/244/272/350/214/203/345/267/245/347/250/213/k2_complete.js +55 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y5_kinetic_type_/345/212/250/346/200/201/346/226/207/345/255/227//347/244/272/350/214/203/345/267/245/347/250/213/k3_chat.js +47 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y5_kinetic_type_/345/212/250/346/200/201/346/226/207/345/255/227//347/244/272/350/214/203/345/267/245/347/250/213/k4_agent.js +49 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y5_kinetic_type_/345/212/250/346/200/201/346/226/207/345/255/227//347/244/272/350/214/203/345/267/245/347/250/213/kinetic.js +52 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y5_kinetic_type_/345/212/250/346/200/201/346/226/207/345/255/227//350/257/255/346/263/225/345/215/241.md +150 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y5_kinetic_type_/345/212/250/346/200/201/346/226/207/345/255/227//351/242/204/350/247/210.jpg +0 -0
- package/engine/styles//350/247/243/350/257/264/350/257/255/346/263/225/03_/350/212/202/345/245/217/344/270/216/344/272/272/347/211/251/y6_presenter_explainer_/350/256/262/350/247/243/345/221/230//350/257/255/346/263/225/345/215/241.md +24 -0
- package/engine/tests/episodes/ep00-demo.test.ts +69 -0
- package/engine/tests/episodes/ep01-agent-cues.test.ts +25 -0
- package/engine/tests/episodes/ep01-agent-scenes.test.ts +25 -0
- package/engine/tests/episodes/ep02-llm.test.ts +31 -0
- package/engine/tests/episodes/ep03-cc.test.ts +24 -0
- package/engine/tests/episodes/ep04-opus55.test.ts +24 -0
- package/engine/tests/episodes/ep05-token.test.ts +24 -0
- package/engine/tests/episodes/ep06-context.test.ts +24 -0
- package/engine/tests/episodes/ep07-agent.test.ts +24 -0
- package/engine/tests/episodes/ep08-hallucination.test.ts +24 -0
- package/engine/tests/episodes/ep09-prompt.test.ts +24 -0
- package/engine/tests/episodes/ep10-multimodal.test.ts +24 -0
- package/engine/tests/episodes/ep11-mcp.test.ts +24 -0
- package/engine/tests/episodes/ep12-skill.test.ts +24 -0
- package/engine/tests/episodes/ep13-subagent.test.ts +24 -0
- package/engine/tests/episodes/ep14-agent-permission.test.ts +24 -0
- package/engine/tests/episodes/ep15-prompt-injection.test.ts +24 -0
- package/engine/tests/episodes/ep16-agent-done.test.ts +24 -0
- package/engine/tests/episodes/ep17-sycophancy.test.ts +24 -0
- package/engine/tests/episodes/ep18-ai-history.test.ts +19 -0
- package/engine/tests/episodes/ep19-apple-history.test.ts +19 -0
- package/engine/tests/episodes/ep20-nvidia-history.test.ts +19 -0
- package/engine/tests/episodes/ep21-nobel-physics.test.ts +19 -0
- package/engine/tests/episodes/ep22-nobel-chemistry.test.ts +19 -0
- package/engine/tests/episodes/ep23-wheat-chessboard.test.ts +55 -0
- package/engine/tests/episodes/ep24-birthday-paradox.test.ts +140 -0
- package/engine/tests/episodes/ep25-behind-cover.test.ts +83 -0
- package/engine/tests/episodes/ep26-opus-video.test.ts +39 -0
- package/engine/tests/episodes/ep27-opus-video-full.test.ts +51 -0
- package/engine/tests/episodes/ep28-express-relay.test.ts +107 -0
- package/engine/tests/episodes/ep29-footsteps.test.ts +101 -0
- package/engine/tests/episodes/ep30-tang-divorce.test.ts +101 -0
- package/engine/tests/episodes/ep31-rigged.test.ts +108 -0
- package/engine/tests/episodes/ep32-love-lasts.test.ts +104 -0
- package/engine/tests/episodes/ep33-teammates.test.ts +113 -0
- package/engine/tests/episodes/ep34-song-takeout.test.ts +98 -0
- package/engine/tests/episodes/ep35-choke.test.ts +109 -0
- package/engine/tests/episodes/ep36-boxed-pigs.test.ts +98 -0
- package/engine/tests/episodes/ep37-bhop.test.ts +114 -0
- package/engine/tests/episodes/ep38-butterfly.test.ts +118 -0
- package/engine/tests/episodes/ep39-latency.test.ts +150 -0
- package/engine/tests/episodes/ep40-counter-strafe.test.ts +145 -0
- package/engine/tests/episodes/ep41-flying-money.test.ts +97 -0
- package/engine/tests/episodes/ep42-tap-fire.test.ts +137 -0
- package/engine/tests/episodes/ep43-one-more-game.test.ts +129 -0
- package/engine/tests/episodes/ep45-callouts.test.ts +150 -0
- package/engine/tests/episodes/ep46-song-ice.test.ts +117 -0
- package/engine/tests/episodes/ep47-spotlight.test.ts +159 -0
- package/engine/tests/episodes/ep48-jiggle-peek.test.ts +154 -0
- package/engine/tests/episodes/ep49-ad-strafe.test.ts +139 -0
- package/engine/tests/episodes/ep50-late-night.test.ts +156 -0
- package/engine/tests/episodes/ep51-practice.test.ts +117 -0
- package/engine/tests/library/anim.test.ts +37 -0
- package/engine/tests/library/bgm.test.ts +29 -0
- package/engine/tests/library/blackgold.test.ts +37 -0
- package/engine/tests/library/halftone.test.ts +40 -0
- package/engine/tests/library/lamplight.test.ts +60 -0
- package/engine/tests/library/srt.test.ts +13 -0
- package/engine/tests/library/subtitles.test.ts +12 -0
- package/engine/tests/library/synth.test.ts +29 -0
- package/engine/tests/library/tactical.test.ts +37 -0
- package/engine/tests/library/warm-desk.test.ts +25 -0
- package/engine/tsconfig.json +15 -0
- package/engine/vitest.config.ts +3 -0
- package/lib/host.mjs +736 -0
- package/manifest.json +51 -0
- package/package.json +8 -4
- package/skills/biuvibe/SKILL.md +28 -0
- package/studio/app.js +264 -0
- package/studio/assert-panel-permit.mjs +67 -0
- package/studio/composer.css +445 -0
- package/studio/composer.js +349 -0
- package/studio/index.html +82 -0
- package/studio/recipes.mjs +86 -0
- package/studio/select-menu.js +450 -0
- package/studio/styles.css +2 -0
- package/studio/thumbs/blackgold.jpg +0 -0
- package/studio/thumbs/desk.jpg +0 -0
- package/studio/thumbs/editor.jpg +0 -0
- package/studio/thumbs/fps.jpg +0 -0
- package/studio/thumbs/gilded.jpg +0 -0
- package/studio/thumbs/halftone.jpg +0 -0
- package/studio/thumbs/lamplight.jpg +0 -0
- package/studio/thumbs/pixel-hand.jpg +0 -0
- package/studio/thumbs/pixel-sticker.jpg +0 -0
- package/studio/thumbs/vector.jpg +0 -0
- package/studio/thumbs/vox-cut.jpg +0 -0
- package/studio/thumbs/vox-timeline.jpg +0 -0
- package//351/243/216/346/240/274/346/217/220/347/244/272/350/257/215.md +105 -0
- package/README.md +0 -3
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
// 片段 · 白板手绘(y3,RSA 型):说一句写一句、讲到东西就画出来。一支马克笔在白板上写字、画图标、画箭头、圈重点,相机跟着往下走,最后拉远看全图。
|
|
2
|
+
// cues:title(标题,7.5 字/秒起,赶不上下一个 cue 会自动提速)· point(要点:先画一个小圈当项目符号再写,16 字/秒起)
|
|
3
|
+
// draw(画一个手绘图标:data.icon 见下方 ICONS,text = 图标下的手写说明;和刚写的那条字并排;连续的 draw 用橙箭头连起来,像示范片「一摞图 → 网络」;data.arrow:false 不画箭头)
|
|
4
|
+
// image(截图/草图:笔走之字形把它「揭开」,再描一圈手绘框;等比放,不裁)
|
|
5
|
+
// highlight(橙圈圈住一条:data.index = 第几个要点(只数 point,从 0 起,和 t1/y1 同一口径);
|
|
6
|
+
// data.target = 'title' | 'draw' | 'image' 改圈那一类(配 index 数那一类,默认最新);不写 = 最新写出的那一条;data.style:'underline' 改成划线)
|
|
7
|
+
// 版式:横屏有 draw/image 时左文右图,竖屏有 draw 时图标在右侧窄栏;图标和刚写的那条字并排,连续的图标之间画往下的橙箭头。
|
|
8
|
+
// 横屏纯文字、要点 ≥5 条时分左右两栏。字号随内容多少在 0.72–1.2 倍之间取,尽量一屏放下并撑满;放不下才让相机往下走。
|
|
9
|
+
// 每一笔都在 at 这一帧落下第一点;写字速度=max(基准速度, 字数 / 到下一个 cue 的间隔),说到下一句时这句已写完。
|
|
10
|
+
// 笔:两笔之间空档 <0.6s 沿弧线滑过去;更长就 0.35s 退出右下屏外,下一笔前 0.3s 再进来;最后一笔画完一定退场,不留在字上。
|
|
11
|
+
// safe(spec.safe):内容只排在 top..H−bottom 之间,收尾拉远也只拉进这一带。alpha:墨色外面描一圈白边,叠在深色画面上也看得见。
|
|
12
|
+
CLIPS.y3_whiteboard = (() => {
|
|
13
|
+
const { clamp, lerp } = U;
|
|
14
|
+
const INK = '#0A0503', ORANGE = '#EF7226', WASH = 'rgba(239,114,38,.22)', BOARD = '#FBFBFB';
|
|
15
|
+
const FONT = 'LXGWWenKai-500';
|
|
16
|
+
// ---------- 手绘图标:单位框 [-0.5,0.5]²(y 朝下)里的笔画;o:1 = 橙色强调,seg:1 = 快速直线(网络连线),fill = 铺浅橙 ----------
|
|
17
|
+
const A = (cx, cy, rx, ry, a0, a1, n = 22) => DG.arcPts(cx, cy, rx, ry, a0, a1, n);
|
|
18
|
+
const box = (x0, y0, x1, y1) => [[x0, y0], [x1, y0], [x1, y1], [x0, y1], [x0, y0 + 0.01]];
|
|
19
|
+
const ICONS = {
|
|
20
|
+
person: () => [{ p: A(0, -0.3, 0.13, 0.13, -Math.PI / 2, Math.PI * 1.55) }, { p: [[0, -0.17], [0, 0.14]] }, { p: [[-0.24, -0.04], [0, -0.1], [0.24, -0.04]] }, { p: [[-0.17, 0.44], [0, 0.14], [0.17, 0.44]] }],
|
|
21
|
+
cat: () => { const k = 1 / 380, T = pts => pts.map(([x, y]) => [x * k, y * k + 0.44]);
|
|
22
|
+
return [{ p: T([[-60, -250], [-92, -330], [-30, -300], [30, -300], [92, -330], [60, -250]]) }, { p: T(A(0, -230, 100, 82, -0.55, Math.PI + 0.55, 26).reverse()) },
|
|
23
|
+
{ p: T([[-80, -170], [-120, -60], [-110, 0], [110, 0], [120, -60], [80, -170]]), fill: T([[-80, -170], [-120, -60], [-110, 0], [110, 0], [120, -60], [80, -170], [0, -150]]) },
|
|
24
|
+
{ p: T([[110, -20], [190, -40], [210, -130], [170, -190]]) }, { p: T(A(-38, -240, 12, 16, 0, Math.PI * 2, 14)), w: 0.8 }, { p: T(A(38, -240, 12, 16, 0, Math.PI * 2, 14)), w: 0.8 },
|
|
25
|
+
{ p: T([[-30, -196], [-110, -206]]), w: 0.6 }, { p: T([[30, -196], [110, -206]]), w: 0.6 }]; },
|
|
26
|
+
network: () => { const C = [[-0.38, [-0.28, 0, 0.28]], [0, [-0.33, -0.11, 0.11, 0.33]], [0.38, [-0.14, 0.14]]], r = 0.06, out = [];
|
|
27
|
+
for (const [x, ys] of C) for (const y of ys) out.push({ p: A(x, y, r, r, -Math.PI / 2, Math.PI * 1.55, 14), fast: 1 });
|
|
28
|
+
for (let a = 0; a < 2; a++) for (const y0 of C[a][1]) for (const y1 of C[a + 1][1]) out.push({ seg: [[C[a][0] + r, y0], [C[a + 1][0] - r, y1]] });
|
|
29
|
+
return out; },
|
|
30
|
+
doc: () => [{ p: [[0.14, -0.42], [-0.3, -0.42], [-0.3, 0.42], [0.3, 0.42], [0.3, -0.26], [0.14, -0.42], [0.14, -0.26], [0.3, -0.26]] },
|
|
31
|
+
{ p: [[-0.18, -0.12], [0.18, -0.12]], w: 0.7 }, { p: [[-0.18, 0.04], [0.18, 0.04]], w: 0.7 }, { p: [[-0.18, 0.2], [0.06, 0.2]], w: 0.7 }],
|
|
32
|
+
chat: () => [{ p: [[-0.3, -0.36], [0.3, -0.36], [0.42, -0.24], [0.42, 0.1], [0.3, 0.22], [-0.06, 0.22], [-0.24, 0.4], [-0.2, 0.22], [-0.3, 0.22], [-0.42, 0.1], [-0.42, -0.24], [-0.3, -0.36]] },
|
|
33
|
+
...[-0.18, 0, 0.18].map(x => ({ p: A(x, -0.07, 0.035, 0.035, 0, Math.PI * 2, 10), w: 0.9, fast: 1 }))],
|
|
34
|
+
bulb: () => [{ p: A(0, -0.12, 0.26, 0.26, Math.PI * 0.72, Math.PI * 2.28, 30), fill: A(0, -0.12, 0.26, 0.26, 0, Math.PI * 2, 30) }, { p: [[-0.11, 0.12], [-0.11, 0.27], [0.11, 0.27], [0.11, 0.12]] },
|
|
35
|
+
{ p: [[-0.08, 0.36], [0.08, 0.36]] }, ...[-2.4, -1.57, -0.74].map(a => ({ p: [[Math.cos(a) * 0.34, -0.12 + Math.sin(a) * 0.34], [Math.cos(a) * 0.46, -0.12 + Math.sin(a) * 0.46]], o: 1, fast: 1 }))],
|
|
36
|
+
check: () => [{ p: [[-0.32, 0.0], [-0.08, 0.26], [0.36, -0.32]], o: 1, w: 1.5 }],
|
|
37
|
+
cross: () => [{ p: [[-0.28, -0.28], [0.28, 0.28]], o: 1, w: 1.5 }, { p: [[0.28, -0.28], [-0.28, 0.28]], o: 1, w: 1.5 }],
|
|
38
|
+
screen: () => [{ p: box(-0.44, -0.36, 0.44, 0.2) }, { p: [[0, 0.2], [0, 0.34]] }, { p: [[-0.2, 0.36], [0.2, 0.36]] },
|
|
39
|
+
{ p: [[-0.32, -0.22], [0.06, -0.22]], w: 0.6, fast: 1 }, { p: [[-0.24, -0.1], [0.24, -0.1]], w: 0.6, fast: 1 }, { p: [[-0.24, 0.02], [0.12, 0.02]], w: 0.6, fast: 1 }],
|
|
40
|
+
stack: () => [2, 1, 0].map(i => ({ p: box(-0.4 + i * 0.09, -0.22 - i * 0.09, 0.2 + i * 0.09, 0.3 - i * 0.09), paper: 1 })).concat([{ p: [[-0.3, 0.2], [-0.14, 0.02], [0, 0.14], [0.1, 0.06], [0.2, 0.2]], w: 0.7 }]),
|
|
41
|
+
gear: () => { const pts = []; for (let i = 0; i <= 64; i++) { const a = i / 64 * Math.PI * 2, r = (Math.floor(i / 4) % 2) ? 0.3 : 0.4; pts.push([Math.cos(a) * r, Math.sin(a) * r]); }
|
|
42
|
+
return [{ p: pts }, { p: A(0, 0, 0.12, 0.12, 0, Math.PI * 2.1, 16) }]; },
|
|
43
|
+
target: () => [{ p: A(0, 0.04, 0.4, 0.4, -Math.PI / 2, Math.PI * 1.55, 32) }, { p: A(0, 0.04, 0.25, 0.25, -Math.PI / 2, Math.PI * 1.55, 24) }, { p: A(0, 0.04, 0.09, 0.09, 0, Math.PI * 2, 12), fill: A(0, 0.04, 0.09, 0.09, 0, Math.PI * 2, 12) },
|
|
44
|
+
{ p: [[0.46, -0.42], [0.02, 0.02]], o: 1 }, { p: [[0.3, -0.42], [0.46, -0.42], [0.46, -0.26]], o: 1 }],
|
|
45
|
+
clock: () => [{ p: A(0, 0, 0.4, 0.4, -Math.PI / 2, Math.PI * 1.55, 32) }, { p: [[0, -0.26], [0, 0], [0.18, 0.1]] }],
|
|
46
|
+
chart: () => [{ p: [[-0.42, -0.42], [-0.42, 0.38], [0.44, 0.38]] }, { p: [[-0.32, 0.22], [-0.12, 0.04], [0.06, 0.12], [0.34, -0.26]], o: 1 }, { p: [[0.18, -0.26], [0.34, -0.26], [0.34, -0.1]], o: 1 }],
|
|
47
|
+
};
|
|
48
|
+
let B, keys, items, OFF, lastEnd, band;
|
|
49
|
+
const halo = (c, src, W, H, col, r) => { // 透明底:墨色外描一圈白边(8 个方向各压一次剪影)
|
|
50
|
+
const s2 = UI.scratch('clip_y3halo', W, H), g = s2.getContext('2d'); g.globalCompositeOperation = 'source-over'; g.clearRect(0, 0, W, H);
|
|
51
|
+
g.drawImage(src, 0, 0); g.globalCompositeOperation = 'source-in'; g.fillStyle = col; g.fillRect(0, 0, W, H); g.globalCompositeOperation = 'source-over';
|
|
52
|
+
for (let i = 0; i < 8; i++) { const a = i / 8 * Math.PI * 2; c.drawImage(s2, Math.cos(a) * r, Math.sin(a) * r); }
|
|
53
|
+
c.drawImage(src, 0, 0);
|
|
54
|
+
};
|
|
55
|
+
// 折行但各行等长:先按栏宽折出 n 行,再找「仍是 n 行」的最窄宽度重折(不留一个字孤零零挂在第二行)
|
|
56
|
+
const balance = (g, text, maxW, font) => { const n = TY.wrap(g, text, maxW, font).length; if (n < 2) return [text];
|
|
57
|
+
let lo = maxW * 0.4, hi = maxW; for (let k = 0; k < 14; k++) { const m = (lo + hi) / 2; if (TY.wrap(g, text, m, font).length > n) lo = m; else hi = m; } return TY.wrap(g, text, hi, font); };
|
|
58
|
+
// 手绘矩形:先把四条边各加密成多点,再加抖动,角还是角(直接对 4 个角点做 Catmull-Rom 会画成一个圆团)
|
|
59
|
+
const rectPts = (x, y, w, h) => { const P = [[x, y], [x + w, y], [x + w, y + h], [x, y + h], [x, y + 3]], out = [];
|
|
60
|
+
for (let i = 0; i < 4; i++) for (let k = 0; k < 12; k++) out.push([lerp(P[i][0], P[i + 1][0], k / 12), lerp(P[i][1], P[i + 1][1], k / 12)]); out.push(P[4]); return out; };
|
|
61
|
+
function layout(ctx, f) {
|
|
62
|
+
const { W, H, u, FPS, safe } = ctx, pad = (ctx.portrait ? 80 : 150) * u, lw = 6.5 * u, g = document.createElement('canvas').getContext('2d');
|
|
63
|
+
const cues = ctx.cues, next = q => { const i = cues.indexOf(q); const n = cues.slice(i + 1).find(z => z.at > q.at + 1e-6); return n ? n.at : ctx.dur; };
|
|
64
|
+
const hasDraw = cues.some(q => q.kind === 'draw'), hasImg = cues.some(q => q.kind === 'image' && ctx.IMG[q.image]);
|
|
65
|
+
// 栏:横屏有图就左文右图;竖屏有 draw 时图标排在右侧窄栏、和它说的那条字并排(截图仍整宽)
|
|
66
|
+
const S = (ctx.portrait ? 250 : 210) * u * f, gap = 70 * u * f;
|
|
67
|
+
const two = ctx.portrait ? hasDraw : (hasDraw || hasImg);
|
|
68
|
+
const colP = !two ? null : ctx.portrait ? { x: W - pad - S, w: S } : { x: W * 0.55, w: W * 0.45 - pad };
|
|
69
|
+
const nPt = cues.filter(q => q.kind === 'point').length, split = !ctx.portrait && !two && nPt >= 5 ? Math.ceil(nPt / 2) : 0; // 横屏纯文字、要点 ≥5 条:分左右两栏写
|
|
70
|
+
const colT = { x: pad, w: split ? W / 2 - pad - 40 * u : !two ? W - 2 * pad : ctx.portrait ? colP.x - gap - pad : W * 0.5 - pad };
|
|
71
|
+
let kPt = 0, col0 = null;
|
|
72
|
+
// 同一份清单的要点用同一个字号:取「放进一行」要缩到的最小那个(最小 0.72),还放不下的那条再折行
|
|
73
|
+
const pSize = Math.min(74 * u * f, ...cues.filter(q => q.kind === 'point').map(q => { const r = TY.fit(g, q.text || '', colT.w - 80 * u, 74 * u * f, FONT, { maxLines: 1, min: 0.72, soft: true }); return r.ok ? r.size : 74 * u * f * 0.72; }));
|
|
74
|
+
const B = DG.board({ ink: INK, lw, speed: 2600 * u, font: `"${FONT}"` }), items = [];
|
|
75
|
+
const top = (ctx.portrait ? 240 : 130) * u + safe.top;
|
|
76
|
+
let yT = top, yP = top, lastText = null, lastDraw = null; // 文字流 / 图流的当前 y
|
|
77
|
+
const start = q => B.at(Math.max(0, q.at - 1 / FPS)); // 第一笔在 at 这一帧可见
|
|
78
|
+
const capSz = (ctx.portrait ? 52 : 50) * u * Math.max(0.85, Math.min(1.1, f)), capRight = !ctx.portrait; // 横屏说明写在图标右边,竖屏写在下面
|
|
79
|
+
for (const q of cues) {
|
|
80
|
+
if (q.kind === 'title' || q.kind === 'point') {
|
|
81
|
+
const title = q.kind === 'title', indent = title ? 0 : 80 * u, colW = title ? W - 2 * pad : colT.w;
|
|
82
|
+
const ft = title ? TY.fit(g, q.text || '', colW - indent, 112 * u * f, FONT, { maxLines: 1, min: 0.72, soft: true }) : { size: pSize, lines: TY.wrap(g, q.text || '', colW - indent, `${pSize}px "${FONT}"`) }; // 标题先缩字号放一行,放不下再折行
|
|
83
|
+
const size = ft.size, lines = ft.lines.length > 1 ? balance(g, q.text || '', colW - indent, `${size}px "${FONT}"`) : ft.lines;
|
|
84
|
+
const n = [...(q.text || '')].length, room = Math.max(0.35, next(q) - q.at - 0.15 - (title ? 0 : 0.15)), rate = Math.max(title ? 7.5 : 16, n / room);
|
|
85
|
+
if (title) yT = Math.max(yT, yP);
|
|
86
|
+
else { if (col0 == null) col0 = yT; if (split && kPt === split) { colT.x = W / 2 + 40 * u; yT = col0; } kPt++; }
|
|
87
|
+
let y = yT + size * (title ? 1.1 : 1.0);
|
|
88
|
+
start(q);
|
|
89
|
+
if (!title) B.line(DG.ellipsePts(colT.x + 26 * u, y - size * 0.32, 15 * u, 15 * u, -1.6, 1.05, 18), { w: lw * 0.9, col: ORANGE, speed: 9000 * u, min: 0.08, gap: 0.02 });
|
|
90
|
+
const x = (title ? pad : colT.x) + indent, it = { q, kind: q.kind, x, y0: y - size, lines, size };
|
|
91
|
+
lines.forEach((ln, k) => B.text(ln, x, y + k * size * 1.3, size, { col: INK, rate }));
|
|
92
|
+
g.font = `${size}px "${FONT}"`; it.w = Math.max(...lines.map(l => g.measureText(l).width)); it.y1 = y + (lines.length - 1) * size * 1.3 + size * 0.25;
|
|
93
|
+
yT = it.y1 + (title ? 60 : 44) * u * f; items.push(it);
|
|
94
|
+
if (title) yP = Math.max(yP, yT); else lastText = it;
|
|
95
|
+
} else if (q.kind === 'draw') {
|
|
96
|
+
const icon = (q.data && q.data.icon) || '', mk = ICONS[icon];
|
|
97
|
+
if (!mk && icon) console.warn(`y3 draw:没有图标「${icon}」,可用:${Object.keys(ICONS).join(' ')}(只写说明字)`);
|
|
98
|
+
// 和刚写的那条字并排(那条字还没配图、且在图流下面);否则接在图流下面
|
|
99
|
+
const pair = lastText && !lastText.pic && lastText.y0 >= yP - 1;
|
|
100
|
+
const y0 = two ? (pair ? lastText.y0 + (lastText.y1 - lastText.y0) / 2 - S / 2 : yP) : yT;
|
|
101
|
+
const x0 = two ? colP.x : pad, cx = x0 + S / 2, cy = Math.max(y0, two ? yP : y0) + S / 2;
|
|
102
|
+
if (pair) lastText.pic = true;
|
|
103
|
+
const prev = lastDraw && !(q.data && q.data.arrow === false) ? lastDraw : null;
|
|
104
|
+
start(q);
|
|
105
|
+
const room = Math.max(0.5, next(q) - q.at - 0.15), strokes = mk ? mk() : [];
|
|
106
|
+
const P = pts => pts.map(([x, y]) => [cx + x * S, cy + y * S]);
|
|
107
|
+
const capN = [...(q.text || '')].length, arrowL = prev ? Math.max(0, cy - S / 2 - prev.y1) : 0;
|
|
108
|
+
const len = strokes.reduce((s, k) => s + (k.p ? DG.len(P(k.p)) : 0), 0) + arrowL;
|
|
109
|
+
const budget = clamp(room - (capN ? Math.max(0.3, capN / 16) : 0) - 0.1, 0.4, 1.4), sp = Math.max(2600 * u, len / budget);
|
|
110
|
+
if (prev && arrowL > 30 * u) { const ax = prev.cx, ay0 = prev.y1 + 8 * u, ay1 = cy - S / 2 - 8 * u; // 箭头:上一个图标 → 这一个(往下)
|
|
111
|
+
B.line([[ax, ay0], [ax + 6 * u, lerp(ay0, ay1, 0.5)], [ax, ay1]], { col: ORANGE, w: lw, speed: sp });
|
|
112
|
+
const h = Math.min(20 * u, (ay1 - ay0) * 0.4); B.line([[ax - h, ay1 - h], [ax, ay1], [ax + h, ay1 - h]], { col: ORANGE, w: lw, speed: sp, smooth: false }); }
|
|
113
|
+
for (const k of strokes) {
|
|
114
|
+
if (k.seg) { B.segment(P([k.seg[0]])[0], P([k.seg[1]])[0], { w: 2.5 * u, dur: 0.05, gap: 0.008 }); continue; }
|
|
115
|
+
const pts = P(k.p);
|
|
116
|
+
if (k.paper) B.fill(U.poly(pts), BOARD, 0.01);
|
|
117
|
+
B.line(pts, { col: k.o ? ORANGE : INK, w: lw * (k.w || 1), speed: sp * (k.fast ? 2 : 1), gap: 0.015 });
|
|
118
|
+
if (k.fill) B.fill(U.poly(P(k.fill)), WASH);
|
|
119
|
+
}
|
|
120
|
+
B.at(B.cur + 0.02);
|
|
121
|
+
const capMax = capRight ? W - pad - (x0 + S + 24 * u) : W - 2 * pad, cs = q.text ? TY.fit(g, q.text, capMax, capSz, FONT, { maxLines: 1 }).size : capSz; // 说明字放不下先缩字号
|
|
122
|
+
g.font = `${cs}px "${FONT}"`; const cw = q.text ? g.measureText(q.text).width : 0, crate = Math.max(16, capN / Math.max(0.3, room - (B.cur - q.at)));
|
|
123
|
+
const capX = capRight ? x0 + S + 24 * u : clamp(cx, pad + cw / 2, W - pad - cw / 2), capY = capRight ? cy + cs * 0.35 : cy + S / 2 + cs * 1.05; // 竖屏图标在右侧窄栏:居中的说明字夹回画内
|
|
124
|
+
if (q.text) B.text(q.text, capX, capY, cs, { col: INK, align: capRight ? 'left' : 'center', rate: crate });
|
|
125
|
+
const it = { q, kind: 'draw', x: x0, w: S, cx, y0: cy - S / 2, y1: cy + S / 2 + (capRight ? 0 : cs * 1.3),
|
|
126
|
+
hx: capRight ? x0 : Math.min(x0, capX - cw / 2), hw: capRight ? S + 24 * u + cw : Math.max(x0 + S, capX + cw / 2) - Math.min(x0, capX - cw / 2) };
|
|
127
|
+
items.push(it); lastDraw = it;
|
|
128
|
+
if (two) { yP = it.y1 + gap; if (!ctx.portrait) yT = Math.max(yT, pair ? it.y1 + gap * 0.5 : yT); else yT = Math.max(yT, it.y1 + gap * 0.6); }
|
|
129
|
+
else yT = it.y1 + gap;
|
|
130
|
+
} else if (q.kind === 'image') {
|
|
131
|
+
const im = ctx.IMG[q.image]; if (!im) continue;
|
|
132
|
+
// 右栏的图只用剩下的高度,不让相机为右栏往下走、把左栏的字推出画
|
|
133
|
+
const inCol = two && !ctx.portrait, y = (inCol ? yP : Math.max(yT, yP)) + 30 * u, box = inCol ? colP : { x: pad, w: W - 2 * pad };
|
|
134
|
+
const f2 = CLIP.fit(im.width, im.height, box.x, y, box.w, inCol ? Math.max(H * 0.2, Math.min(H * 0.5 * Math.max(0.8, f), H - safe.bottom - 80 * u - y)) : H * (ctx.portrait ? 0.32 : 0.45) * Math.max(0.8, f)), it = { q, kind: 'image', x: f2.x, y0: f2.y, w: f2.w, y1: f2.y + f2.h };
|
|
135
|
+
const zz = DG.zigzag(f2.x - 20 * u, f2.y - 10 * u, f2.w + 40 * u, f2.h + 20 * u, 7), cum = DG.cum(zz), rowH = (f2.h + 20 * u) / 7;
|
|
136
|
+
start(q);
|
|
137
|
+
const s = B.push({ kind: 'custom', t0: B.cur, t1: B.cur + Math.min(1.0, Math.max(0.4, next(q) - q.at - 0.5)), col: INK,
|
|
138
|
+
draw(gg, p) { gg.save(); if (p < 1) gg.clip(DG.revealMask(zz, cum, cum[cum.length - 1] * p, rowH * 2.6)); gg.drawImage(im, f2.x, f2.y, f2.w, f2.h); gg.restore(); return p < 1 ? DG.pointAt(zz, cum, cum[cum.length - 1] * p) : null; },
|
|
139
|
+
start() { return zz[0]; }, end() { return zz[zz.length - 1]; } });
|
|
140
|
+
B.at(s.t1 + 0.02);
|
|
141
|
+
B.line(rectPts(f2.x - 10 * u, f2.y - 10 * u, f2.w + 20 * u, f2.h + 20 * u), { w: lw * 0.8, speed: 9000 * u, amp: 1.0 * u });
|
|
142
|
+
yP = f2.y + f2.h + 60 * u; if (!inCol) yT = yP; items.push(it); lastDraw = null;
|
|
143
|
+
} else if (q.kind === 'highlight') {
|
|
144
|
+
const d = q.data || {}, written = items.filter(z => z.q.at <= q.at), kind = d.target || (d.index != null ? 'point' : null);
|
|
145
|
+
const pool = kind ? written.filter(z => z.kind === kind) : written, all = kind ? items.filter(z => z.kind === kind) : items;
|
|
146
|
+
const it = d.index != null ? all[d.index] : pool[pool.length - 1];
|
|
147
|
+
if (!it) { console.warn(`y3 highlight at=${q.at}:找不到要圈的条目(index=${d.index} target=${d.target || 'point'})`); continue; }
|
|
148
|
+
start(q);
|
|
149
|
+
const hx = it.hx ?? it.x, hw = it.hw ?? it.w;
|
|
150
|
+
if (d.style === 'underline') B.line([[hx - 10 * u, it.y1 + 12 * u], [hx + hw / 2, it.y1 + 18 * u], [hx + hw + 10 * u, it.y1 + 10 * u]], { col: ORANGE, w: lw * 1.3, speed: 3000 * u });
|
|
151
|
+
else B.line(DG.ellipsePts(hx + hw / 2, (it.y0 + it.y1) / 2, hw * 0.56 + 30 * u, (it.y1 - it.y0) * 0.62 + 24 * u, -2.9, 1.08, 44), { col: ORANGE, w: lw, speed: 3600 * u, amp: 1.6 * u });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const bottom = Math.max(...items.map(z => z.y1), top);
|
|
155
|
+
return { B, items, bottom, top, pad };
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
fonts: [FONT],
|
|
159
|
+
safe: true,
|
|
160
|
+
init(ctx) {
|
|
161
|
+
const { W, H, u, safe } = ctx;
|
|
162
|
+
band = { y0: safe.top, y1: H - safe.bottom }; band.h = band.y1 - band.y0;
|
|
163
|
+
// 字号系数 f 从 1.2 往下试:内容少就放大撑满版面,内容多就缩(最小 0.72),还放不下才让相机往下走
|
|
164
|
+
let L; for (let f = 1.2; f >= 0.7; f -= 0.04) { L = layout(ctx, f); if (L.bottom + 70 * u <= band.y1) break; } // 内容少就放大(最大 1.2)把版面撑满
|
|
165
|
+
({ B, items } = L);
|
|
166
|
+
OFF = [W + 140 * u, H + 280 * u];
|
|
167
|
+
lastEnd = Math.max(0, ...B.S.map(s => s.t1));
|
|
168
|
+
// 相机:内容超出可用带就在下一条开写前平移过去(sineInOut);最后有空就拉远看全图(只拉进 safe 带)
|
|
169
|
+
keys = [{ t: 0, x: W / 2, y: H / 2, z: 1 }]; let cy = H / 2, panned = false;
|
|
170
|
+
for (const it of items) {
|
|
171
|
+
const need = it.y1 + 70 * u - (cy + band.y1 - H / 2); if (need <= 0) continue;
|
|
172
|
+
panned = true; cy += need + band.h * 0.12; const t1 = Math.max(keys[keys.length - 1].t + 0.2, it.q.at), t0 = Math.max(keys[keys.length - 1].t + 0.01, t1 - 0.6);
|
|
173
|
+
keys.push({ t: t0, x: W / 2, y: keys[keys.length - 1].y, z: 1 }); keys.push({ t: t1, x: W / 2, y: cy, z: 1, ease: MO.sineInOut });
|
|
174
|
+
}
|
|
175
|
+
const y0c = Math.min(L.top, ...items.map(z => z.y0)) - 50 * u, y1c = L.bottom + 40 * u, total = y1c - y0c;
|
|
176
|
+
const zEnd = Math.min(0.94, band.h / total * 0.96);
|
|
177
|
+
// 收尾拉远:最后一笔后有 ≥0.6s 才拉;相机走过了的话,就算时间紧也在最后 0.8s 拉(不然末帧标题被切在顶上)
|
|
178
|
+
const tz0 = Math.max(keys[keys.length - 1].t + 0.01, panned ? Math.min(lastEnd + 0.1, ctx.dur - 0.8) : lastEnd + 0.1);
|
|
179
|
+
if (ctx.dur - tz0 >= 0.6) {
|
|
180
|
+
const prev = keys[keys.length - 1]; keys.push({ ...prev, t: tz0, ease: undefined });
|
|
181
|
+
const midW = (y0c + y1c) / 2, ty = midW - ((band.y0 + band.y1) / 2 - H / 2) / zEnd; // 全图中心落在 safe 带中心
|
|
182
|
+
keys.push({ t: Math.min(ctx.dur - 0.15, tz0 + 0.8), x: W / 2, y: ty, z: zEnd, ease: MO.sineInOut });
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
draw(c, t, ctx) {
|
|
186
|
+
const { W, H, u } = ctx, cam = CAM.at(keys, t);
|
|
187
|
+
const g = ctx.alpha ? (() => { const b = UI.scratch('clip_y3buf', W, H), x = b.getContext('2d'); x.setTransform(1, 0, 0, 1, 0, 0); x.clearRect(0, 0, W, H); return x; })() : c;
|
|
188
|
+
if (!ctx.alpha) { c.fillStyle = BOARD; c.fillRect(0, 0, W, H); }
|
|
189
|
+
g.save(); CAM.apply(g, cam); const { tip, col } = B.draw(g, t); g.restore();
|
|
190
|
+
const pen = penAt(t, cam, tip, ctx);
|
|
191
|
+
if (pen) DG.pen(g, pen[0], pen[1], col || B.penColor(t), Math.sin(t * 7) * 0.03);
|
|
192
|
+
if (ctx.alpha) halo(c, g.canvas, W, H, 'rgba(255,255,255,0.92)', 4 * u);
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
// 笔的位置(屏幕):在画 → 笔尖;空档短 → 沿弧线滑;空档长 → 退出右下再进来;画完最后一笔 → 0.35s 退场(返回 null = 不画)
|
|
196
|
+
function penAt(t, cam, tip, ctx) {
|
|
197
|
+
if (tip) return CAM.toScreen(cam, tip[0], tip[1]);
|
|
198
|
+
const hs = B.S.filter(s => s.kind !== 'pop' && s.kind !== 'fill' && (s.kind !== 'custom' || s.handed !== false));
|
|
199
|
+
let prev = null, next = null; for (const s of hs) { if (s.t1 <= t) prev = s; else if (s.t0 > t && !next) next = s; }
|
|
200
|
+
if (prev && next && next.t0 - prev.t1 <= 0.6) return B.penAt(t, cam, null);
|
|
201
|
+
const end = s => B.penAt(s.t1, cam, null); // 上一笔终点(屏幕)
|
|
202
|
+
if (next && next.t0 - t <= 0.3) { const b = CAM.toScreen(cam, ...(next.kind === 'custom' ? next.start() : next.kind === 'line' ? next.pts[0] : [next.x, next.y - next.size * 0.3])), q = MO.cubicOut(1 - (next.t0 - t) / 0.3); return [lerp(OFF[0], b[0], q), lerp(OFF[1], b[1], q)]; }
|
|
203
|
+
if (prev && t - prev.t1 < 0.35) { const a = end(prev), q = MO.cubicIn((t - prev.t1) / 0.35); return [lerp(a[0], OFF[0], q), lerp(a[1], OFF[1], q)]; }
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
})();
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// 示范 · 白板手绘解说(RSA Animate 型)「AI 是怎么学会认猫的」(8 秒三镜)。语法卡:references/动画语法/y3_whiteboard.md
|
|
2
|
+
// 预览 index.html?film=demos/y3_whiteboard 渲染 render.py --film demos/y3_whiteboard --out y3.mp4
|
|
3
|
+
// 一整块大白板=世界,相机在板上移动;三段是同一个画面函数(DG.board 的笔画时间线),段只是为了 qa 分镜。
|
|
4
|
+
window.PUNCH = 0;
|
|
5
|
+
window.SCENE_LIBS = ['demos/_shared/hero.js', 'demos/y3_whiteboard/whiteboard.js'];
|
|
6
|
+
window.ERAS = [
|
|
7
|
+
{ id: 'y3_s1', dur: 2.5 }, // 画猫、写「猫?」、写问题
|
|
8
|
+
{ id: 'y3_s2', dur: 2.25, transition: { type: 'same', dur: 0.8 } }, // 甩镜(0.8s 带运动模糊,笔不离板)
|
|
9
|
+
{ id: 'y3_s3', dur: 3.25, transition: { type: 'same', dur: 0.85 } }, // 板上平滑移动 → 画花叔、「是猫!」→ 拉远看全图
|
|
10
|
+
];
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// Y3 · 白板手绘解说(RSA Animate 型:一整块大白板+相机移动):「AI 是怎么学会认猫的」
|
|
2
|
+
// 依据:语法卡 y3_whiteboard.md(RSA 实测:黑 #0A0503+唯一强调色橙 #EB701F;写字≈16 字/秒、比口播晚 0.5s;
|
|
3
|
+
// 平滑移动 easeInOutSine 中位 1.8s;远跳用 0.8s 带运动模糊的甩镜;手从右下入画、画完出画;结尾拉远看全图)
|
|
4
|
+
// ①画一只猫、写「猫?」、写问题 → 转场 A「甩镜」:笔不离板,相机 0.8s 甩到板上远处,带运动模糊
|
|
5
|
+
// ②画 1000 万张图的一摞(橙色数字直接弹出、不带手)、箭头、神经网络、「自己找规律」
|
|
6
|
+
// → 转场 B「板上平滑移动」:相机 sine 缓入缓出 0.95s 斜移到旁边空白处,手在相机落定前就开始画
|
|
7
|
+
// ③画花叔指着猫、打勾,橙色「是猫!」弹出 → 收尾「拉远看全图」(RSA / VideoScribe 默认的 Zoom at end),整板铺一层灰
|
|
8
|
+
// 用到的库:DG.board(笔画时间线+跟随的笔)、DG.pen、DG.revealMask/zigzag(人物 Reveal)、CAM(关键帧相机、运动模糊)。
|
|
9
|
+
(() => {
|
|
10
|
+
const W = 1920, H = 1080;
|
|
11
|
+
const { clamp, lerp, rng } = U;
|
|
12
|
+
const seg = MO.seg;
|
|
13
|
+
const Y3 = window.Y3 = {};
|
|
14
|
+
const F0 = 0; Y3.F0 = F0;
|
|
15
|
+
Y3.SHOTS = { s1: [0, 2.5], s2: [2.5, 4.75], s3: [4.75, 8.0] };
|
|
16
|
+
const INK = '#0A0503', ORANGE = '#EF7226', WASH = 'rgba(239,114,38,.22)', BOARD = '#FBFBFB';
|
|
17
|
+
const LW = 6.5; // RSA 实测笔画约画高 0.6–0.7%(1080p≈6–7px)
|
|
18
|
+
const R1 = [960, 540], R2 = [3000, 540], R3 = [3700, 1360], K3 = 0.8;
|
|
19
|
+
const L3 = (x, y) => [R3[0] + (x - 960) * K3, R3[1] + (y - 540) * K3];
|
|
20
|
+
const SPEED = 2600; // 线条笔速:世界像素/秒(演示片比 RSA 实拍快约 2 倍,见卡片)
|
|
21
|
+
|
|
22
|
+
// ---------- 笔画时间线:按顺序排,时长 = 长度 / 笔速 ----------
|
|
23
|
+
const B = DG.board({ ink: INK, lw: LW, speed: SPEED, font: '"LXGWWenKai-500"' });
|
|
24
|
+
const tr = DG.xform, arc = DG.arcPts, pathOf = pts => U.poly(pts);
|
|
25
|
+
|
|
26
|
+
// 猫的笔画(本地坐标,原点 = 坐姿底部中心,约 400 高)
|
|
27
|
+
const catStrokes = (ox, oy, s, sp, w, whiskers = true) => {
|
|
28
|
+
const P = (pts) => tr(pts, ox, oy, s);
|
|
29
|
+
B.line(P([[-60, -250], [-92, -330], [-30, -300], [30, -300], [92, -330], [60, -250]]), { w, speed: sp });
|
|
30
|
+
B.line(P(arc(0, -230, 100, 82, -0.55, Math.PI + 0.55, 26).reverse()), { w, speed: sp });
|
|
31
|
+
B.line(P([[-80, -170], [-120, -60], [-110, 0], [110, 0], [120, -60], [80, -170]]), { w, speed: sp });
|
|
32
|
+
B.line(P([[110, -20], [190, -40], [210, -130], [170, -190]]), { w, speed: sp });
|
|
33
|
+
B.line(P(arc(-38, -240, 12, 16, 0, Math.PI * 2, 14)), { w: w * 0.8, speed: sp * 1.6 });
|
|
34
|
+
B.line(P(arc(38, -240, 12, 16, 0, Math.PI * 2, 14)), { w: w * 0.8, speed: sp * 1.6 });
|
|
35
|
+
B.line(P([[-10, -205], [10, -205], [0, -194], [-10, -205]]), { w: w * 0.8, speed: sp * 1.6, smooth: false });
|
|
36
|
+
if (whiskers) for (const k of [-1, 1]) B.line(P([[k * 30, -196], [k * 110, -206]]), { w: w * 0.6, speed: sp * 2 });
|
|
37
|
+
};
|
|
38
|
+
const catBody = (ox, oy, s) => pathOf(tr([[-80, -170], [-120, -60], [-110, 0], [110, 0], [120, -60], [80, -170], [60, -160], [0, -150], [-60, -160]], ox, oy, s));
|
|
39
|
+
|
|
40
|
+
// ===== 第一块 =====
|
|
41
|
+
B.at(0.12);
|
|
42
|
+
catStrokes(760, 820, 1.0, SPEED * 0.75, LW + 1);
|
|
43
|
+
B.fill(catBody(760, 820, 1.0), WASH);
|
|
44
|
+
B.text('猫?', 1060, 560, 150, { col: ORANGE, rate: 7.5 }); // 标题级:7.5 字/秒
|
|
45
|
+
B.line([[1080, 610], [1020, 660], [930, 690]], { col: ORANGE });
|
|
46
|
+
B.line([[960, 668], [928, 690], [966, 704]], { col: ORANGE, smooth: false });
|
|
47
|
+
B.text('AI 怎么认出它?', 960, 960, 84, { align: 'center' }); // 正文:16 字/秒
|
|
48
|
+
B.line([[1290, 590], [1500, 560], [1760, 540]], { col: ORANGE, speed: SPEED * 1.6 }); // 指向下一块的橙箭头:甩镜有了方向
|
|
49
|
+
B.line([[1725, 512], [1764, 540], [1728, 572]], { col: ORANGE, smooth: false });
|
|
50
|
+
const END1 = B.cur;
|
|
51
|
+
// 甩镜时笔不离板:笔尖在屏幕上从第一块的箭头头滑向第二块的起笔点,板在笔下飞过,留下一条橙色连线(笔一直在画,视线一直被它领着)。
|
|
52
|
+
// 轨迹 = 屏幕上的笔位置按当时的相机反算成世界点(第一次画时算好)。
|
|
53
|
+
const trail = { kind: 'custom', from: [1764, 540], to: [2382, 278], t0: B.cur + 0.01, t1: 3.3, col: ORANGE, w: LW, wob: 14,
|
|
54
|
+
draw(g, q) {
|
|
55
|
+
const s = this;
|
|
56
|
+
if (!s.pts) { const N = 72, a = CAM.toScreen(camAt(s.t0), ...s.from), b = CAM.toScreen(camAt(s.t1), ...s.to); s.pts = [];
|
|
57
|
+
for (let i = 0; i <= N; i++) { const u = i / N, cm = camAt(lerp(s.t0, s.t1, u)), e = MO.sineInOut(u), sx = lerp(a[0], b[0], e), sy = lerp(a[1], b[1], e) + Math.sin(u * Math.PI * 3) * s.wob * Math.sin(u * Math.PI);
|
|
58
|
+
s.pts.push(CAM.toWorld(cm, sx, sy)); }
|
|
59
|
+
s.cum = DG.cum(s.pts); }
|
|
60
|
+
const k = q * (s.pts.length - 1), i = Math.floor(k), f = k - i, d = s.cum[i] + (i < s.pts.length - 1 ? (s.cum[i + 1] - s.cum[i]) * f : 0);
|
|
61
|
+
g.strokeStyle = s.col; g.lineWidth = s.w; return DG.drawPartial(g, s.pts, s.cum, d);
|
|
62
|
+
},
|
|
63
|
+
start() { return this.from; }, end() { return this.pts ? this.pts[this.pts.length - 1] : this.to; } };
|
|
64
|
+
B.push(trail);
|
|
65
|
+
|
|
66
|
+
// ===== 第二块(相机 2.5→3.3 甩过来) =====
|
|
67
|
+
B.at(3.31);
|
|
68
|
+
for (let i = 2; i >= 0; i--) { const x = 2330 + i * 26, y = 330 - i * 26; B.fill(pathOf([[x, y], [x + 260, y], [x + 260, y + 190], [x, y + 190]]), BOARD, 0.01); B.line([[x, y], [x + 260, y], [x + 260, y + 190], [x, y + 190], [x, y + 3]], { w: 6, speed: SPEED * 4.5, smooth: false, amp: 0 }); }
|
|
69
|
+
B.line(tr([[-60, -250], [-92, -330], [-30, -300], [30, -300], [92, -330], [60, -250], ...arc(0, -230, 100, 82, -0.55, Math.PI + 0.55, 20).reverse(), [-60, -250]], 2460, 560, 0.4), { w: 5, speed: SPEED * 3, gap: 0 });
|
|
70
|
+
B.line(tr([[-38, -240], [-38, -236], [38, -236], [38, -240]], 2460, 560, 0.4), { w: 6, speed: SPEED, smooth: false, gap: 0.01 });
|
|
71
|
+
B.pop('×1000万张', 2470, 690, 74, { col: ORANGE });
|
|
72
|
+
B.line([[2680, 450], [2800, 452], [2860, 450]]);
|
|
73
|
+
B.line([[2830, 425], [2864, 450], [2830, 476]], { smooth: false });
|
|
74
|
+
const NET = [[2960, [330, 450, 570]], [3090, [300, 450, 600]], [3220, [400, 500]]];
|
|
75
|
+
for (const [x, ys] of NET) for (const y of ys) B.line(arc(x, y, 26, 26, -Math.PI / 2, Math.PI * 1.55, 16), { w: 6, speed: SPEED * 5, amp: 0.8, min: 0.03, gap: 0.01 });
|
|
76
|
+
for (let a = 0; a < 2; a++) for (const y0 of NET[a][1]) for (const y1 of NET[a + 1][1]) B.segment([NET[a][0] + 26, y0], [NET[a + 1][0] - 26, y1], { w: 3 });
|
|
77
|
+
B.at(B.cur + 0.05);
|
|
78
|
+
B.text('自己找规律', 3090, 780, 64, { align: 'center' });
|
|
79
|
+
// 橙色连线:从网络引向下一块(相机开始移动时画,手领着相机走)
|
|
80
|
+
B.at(4.62); B.line([[3250, 470], [3420, 560], [3480, 760], [3420, 900]], { col: ORANGE, speed: SPEED * 1.4 }); B.line([[3392, 868], [3420, 902], [3452, 872]], { col: ORANGE, smooth: false });
|
|
81
|
+
const END2 = B.cur;
|
|
82
|
+
|
|
83
|
+
// ===== 第三块(相机 5.1→6.05 平滑斜移;手在 5.8 就入画开画) =====
|
|
84
|
+
B.at(5.35);
|
|
85
|
+
// VideoScribe 的 Reveal 画法——完整线稿藏在下面,笔尖从上往下走 8 行之字形,笔过之处揭开(笔尖永远在揭开的前沿上)
|
|
86
|
+
const huashu = () => { const [x, y] = L3(500, 1010); return HUASHU.build({ x, y, s: 0.95 * K3, face: 1, pose: HUASHU.pose('point', 0, { ua1: 1.25, mouth: 0.8 }) }); };
|
|
87
|
+
const rigZig = (HSb) => { if (rigZig.c) return rigZig.c; const js = Object.values(HSb.J).filter(v => Array.isArray(v)); const xs = js.map(v => v[0]), ys = js.map(v => v[1]);
|
|
88
|
+
const x0 = Math.min(...xs) - 70, x1 = Math.max(...xs) + 50, y0 = Math.min(...ys) - 20, y1 = Math.max(...ys) + 40, rows = 8;
|
|
89
|
+
rigZig.rowH = (y1 - y0) / rows; const zz = DG.zigzag(x0, y0, x1 - x0, y1 - y0, rows); return (rigZig.c = { zz, cum: DG.cum(zz) }); };
|
|
90
|
+
const RIG3 = { t0: B.cur, t1: B.cur + 0.7 };
|
|
91
|
+
B.push({ kind: 'custom', t0: RIG3.t0, t1: RIG3.t1,
|
|
92
|
+
draw(g, q, ft) {
|
|
93
|
+
const HSb = huashu(), { zz, cum } = rigZig(HSb), d = cum[cum.length - 1] * q;
|
|
94
|
+
g.save(); if (q < 1) g.clip(DG.revealMask(zz, cum, d, rigZig.rowH * 2.2)); g.lineJoin = 'round'; g.lineCap = 'round'; // 揭完就不再裁:之字形拐角处的三角会漏掉
|
|
95
|
+
const [fx, fy] = L3(500, 1010);
|
|
96
|
+
if (!HERO.y3(g, fx, fy, 0.95 * K3 * 740, ft)) {
|
|
97
|
+
for (const p of HSb.parts) { g.fillStyle = p.role === 'hair' ? INK : BOARD; g.fill(p.path); g.strokeStyle = INK; g.lineWidth = LW * 0.9; g.stroke(p.path); }
|
|
98
|
+
HUASHU.details(g, HSb, { line: INK, lw: 4.5, glass: INK, cheek: null, earLine: 'rgba(0,0,0,.5)', shoeHole: INK });
|
|
99
|
+
}
|
|
100
|
+
g.restore();
|
|
101
|
+
return q < 1 ? DG.pointAt(zz, cum, d) : null;
|
|
102
|
+
},
|
|
103
|
+
start() { return rigZig(huashu()).zz[0]; }, end() { const z = rigZig(huashu()).zz; return z[z.length - 1]; } });
|
|
104
|
+
B.at(RIG3.t1 + 0.03);
|
|
105
|
+
catStrokes(...L3(1150, 900), K3 * 0.95, SPEED * 1.6, LW, false);
|
|
106
|
+
B.line([L3(1000, 330), L3(1070, 400), L3(1240, 200)], { col: ORANGE, w: LW + 2, speed: SPEED * 1.5, smooth: false });
|
|
107
|
+
B.pop('是猫!', ...L3(1500, 410), 150 * K3, { col: ORANGE, align: 'left' });
|
|
108
|
+
// 收尾:拉远的同时圈住「是猫!」,全景停住时回到第一块,在问题下面划一道——问题和答案连上,笔停在最后一笔上
|
|
109
|
+
B.at(Math.max(B.cur + 0.02, 6.95));
|
|
110
|
+
B.line(DG.ellipsePts(...L3(1720, 360), 300 * K3, 120 * K3, -2.9, 1.08, 40), { col: ORANGE, w: LW, speed: SPEED * 1.1 });
|
|
111
|
+
B.at(Math.max(B.cur + 0.06, 7.52));
|
|
112
|
+
B.line([[640, 1000], [960, 1006], [1290, 998]], { col: ORANGE, w: LW + 2, speed: SPEED * 0.9 });
|
|
113
|
+
const END3 = B.cur;
|
|
114
|
+
Y3.timeline = { END1, END2, END3, RIG3 };
|
|
115
|
+
Y3.board = B;
|
|
116
|
+
|
|
117
|
+
// ---------- 相机 ----------
|
|
118
|
+
const OVER = { x: 2400, y: 930, z: 0.45 };
|
|
119
|
+
const camAt = ft => CAM.at([
|
|
120
|
+
{ t: 0, x: R1[0], y: R1[1], z: 1.0 },
|
|
121
|
+
{ t: 2.5, x: R1[0] + 12, y: R1[1] + 6, z: 1.02, ease: MO.sineInOut },
|
|
122
|
+
// 甩镜:0.8s(RSA 实测远跳约 0.8s,带运动模糊)
|
|
123
|
+
{ t: 3.3, x: R2[0], y: R2[1], z: 1.0, ease: MO.cubicInOut },
|
|
124
|
+
{ t: 4.7, x: R2[0] + 16, y: R2[1] + 6, z: 1.02, ease: MO.sineInOut },
|
|
125
|
+
// 板上平滑移动:easeInOutSine 0.9s(实测中位 1.8s,演示片压缩)
|
|
126
|
+
{ t: 5.6, x: R3[0], y: R3[1] - 20, z: 1.12, ease: MO.sineInOut },
|
|
127
|
+
{ t: 6.85, x: R3[0] + 10, y: R3[1] - 14, z: 1.14, ease: MO.sineInOut },
|
|
128
|
+
// 拉远看全图,停 0.5s
|
|
129
|
+
{ t: 7.5, ...OVER, ease: MO.sineInOut },
|
|
130
|
+
{ t: 8.0, ...OVER, z: OVER.z * 0.985, ease: MO.sineInOut },
|
|
131
|
+
], ft);
|
|
132
|
+
Y3.camAt = camAt;
|
|
133
|
+
|
|
134
|
+
// ---------- 画 ----------
|
|
135
|
+
const drawBoard = (c, cam, ft) => {
|
|
136
|
+
// 结尾整板铺一层灰(RSA 实测),在拉远时 0.5s 淡入
|
|
137
|
+
const gray = MO.sineInOut(seg(ft, 6.9, 7.4));
|
|
138
|
+
c.fillStyle = gray > 0 ? PAINT.rgb(PAINT.mix(PAINT.hex(BOARD), [238, 238, 236], gray)) : BOARD; c.fillRect(0, 0, W, H);
|
|
139
|
+
// 极淡的擦痕:屏幕空间平铺、跟着相机平移走(不随缩放放大)
|
|
140
|
+
const sm = PAINT.cached('y3smudge', 1024, 1024, g => { const r = rng(5); for (let i = 0; i < 22; i++) { g.fillStyle = `rgba(120,120,130,${0.003 + r() * 0.005})`; g.beginPath(); g.ellipse(r() * 1024, r() * 1024, 80 + r() * 200, 14 + r() * 40, r() * 3, 0, 7); g.fill(); } });
|
|
141
|
+
c.save(); const ox = -(((cam.x * cam.z) % 1024) + 1024) % 1024, oy = -(((cam.y * cam.z) % 1024) + 1024) % 1024; c.translate(ox, oy); c.fillStyle = c.createPattern(sm, 'repeat'); c.fillRect(0, 0, W + 1024, H + 1024); c.restore();
|
|
142
|
+
c.save(); CAM.apply(c, cam);
|
|
143
|
+
const r = B.draw(c, ft);
|
|
144
|
+
c.restore();
|
|
145
|
+
return r;
|
|
146
|
+
};
|
|
147
|
+
const shot = (c, lt, t) => {
|
|
148
|
+
const ft = t - F0, cam = camAt(ft);
|
|
149
|
+
const buf = PAINT.scratch('yt_y3board'), g = buf.getContext('2d'); g.reset();
|
|
150
|
+
const { tip, col } = drawBoard(g, cam, ft);
|
|
151
|
+
const [vx, vy] = CAM.velocity(camAt, ft);
|
|
152
|
+
c.fillStyle = BOARD; c.fillRect(0, 0, W, H);
|
|
153
|
+
const whip = ft > 2.5 && ft < 3.3; // 只有甩镜带模糊;板上平滑移动和结尾拉远都是清楚的(RSA 实测)
|
|
154
|
+
CAM.motionBlur(c, buf, whip ? vx * 0.8 : 0, whip ? vy * 0.8 : 0, 9);
|
|
155
|
+
const [hx, hy] = B.penAt(ft, cam, tip);
|
|
156
|
+
DG.pen(c, hx, hy, col || B.penColor(ft), Math.sin(ft * 7) * 0.03); // 只有一支马克笔,笔尾帽 = 墨色
|
|
157
|
+
};
|
|
158
|
+
Y3.shot1 = shot; Y3.shot2 = shot; Y3.shot3 = shot;
|
|
159
|
+
SCENES['y3_s1'] = { draw: shot };
|
|
160
|
+
SCENES['y3_s2'] = { draw: shot };
|
|
161
|
+
SCENES['y3_s3'] = { draw: shot };
|
|
162
|
+
})();
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# Y3 · 白板手绘解说(RSA Animate 型):视频动画语法卡
|
|
2
|
+
|
|
3
|
+
一句话:讲者说一句,手就在一张大白板上写一句、画一个图;相机跟着论证在板上移动,最后拉远,观众看到整场论证是一张图。
|
|
4
|
+
|
|
5
|
+
示范片:`scripts/engine/demos/y3_whiteboard/`(渲染 `render.py --film demos/y3_whiteboard`)(8s,3 镜,转场 2 种+收尾拉远),总览:`assets/动画语法/y3_whiteboard_总览.jpg`
|
|
6
|
+
依据:本风格的调研(调研原文与逐帧数据留在实验归档、没收进 skill,用到的数字已摘进本卡)。实测了 RSA Animate《Changing Education Paradigms》和 Minute Physics《Why is it Dark at Night?》,还查了 VideoScribe、Doodly 的官方文档和 Andrew Park、Henry Reich 的一手说法。
|
|
7
|
+
|
|
8
|
+
**先选一种语法,不能混**:
|
|
9
|
+
- RSA 型:一整块大白板,相机在板上移动,每分钟 5.3 次。
|
|
10
|
+
- Minute Physics 型:一页一张纸,硬切换纸,每分钟 8.1 次,相机不动。
|
|
11
|
+
- 本卡和示范片走 RSA 型。Minute Physics 型的要点写在 ④ 和 ⑧ 里。
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## ① 适用场景
|
|
16
|
+
|
|
17
|
+
**用它:**
|
|
18
|
+
- 论证型内容:演讲、观点、因果链、历史脉络。概念之间有关系、能画成一张地图的内容最合适。Andrew Park 的原话是「把信息摆在空间里,让人看见事物之间的关系」【一手】。
|
|
19
|
+
- 一条推理链的短科普,走 Minute Physics 型。
|
|
20
|
+
- 口播语速平稳,关键词清楚。RSA 的写字速度大约等于语速,像「字幕被手写出来」【实测】。
|
|
21
|
+
|
|
22
|
+
**别用它:**
|
|
23
|
+
- 需要精确数据图表的内容,手绘误差大。
|
|
24
|
+
- 动作和空间关系复杂的内容,白板没有景深。
|
|
25
|
+
- 需要情绪强度的内容,单色线稿表达弱。
|
|
26
|
+
- 想靠它「提升理解」:Türkay 2016 的实验没发现白板动画比其他形式学得更好。它的价值在吸引注意和陪伴感【二手】。
|
|
27
|
+
|
|
28
|
+
## ② 画面构成
|
|
29
|
+
|
|
30
|
+
- **配色**(RSA 实测):
|
|
31
|
+
- 底:纯白 `#FBFBFB`
|
|
32
|
+
- 线:黑 `#0A0503`
|
|
33
|
+
- 唯一强调色:橙,文字 `#EB701F`,填色 `#F3742D`;斜线排出的浅橙面约 `#E9A67C`
|
|
34
|
+
- 橙色约占全部笔迹像素的 22%,只用在关键词和斜线填色上。
|
|
35
|
+
- Minute Physics 则是偏粉的米白纸 `#E7DBE1`,加彩铅浅黄 `#EDE6A2` 和浅蓝 `#B5CBE8`。
|
|
36
|
+
- **【本片】**:底 `#FBFBFB`,线 `#0A0503`,强调 `#EF7226`。猫身用 22% 透明度的橙色铺一层。
|
|
37
|
+
- **线宽**:RSA 笔画约为画高的 0.6–0.7%,1080p 下约 6–7px;阴影斜线约 0.3%;标题字高约为画高的 5.5%。Minute Physics 的线更粗,约 0.8%【实测】。【本片】线宽 6.5px。
|
|
38
|
+
- **构图**:
|
|
39
|
+
- RSA 是「先规划好最终全图,再倒着画」【一手】。
|
|
40
|
+
- 每块画面里有 3–6 个图文组块,画满再移走。
|
|
41
|
+
- 平滑移动一次只移 0.23 个画宽,所以新旧两块大面积重叠,观众始终看得到上一块的边【实测】。
|
|
42
|
+
- 收尾露出的全图是一条很长的横向长卷。
|
|
43
|
+
- **字**:RSA 是全大写的手写印刷体(漫画对白体)。【本片】中文用霞鹜文楷(LXGW WenKai),子集化成 woff。
|
|
44
|
+
- **手**:
|
|
45
|
+
- 真人右手握黑马克笔,从**右下方**入画,前臂斜向右下,遮住 15–25% 的画面。
|
|
46
|
+
- 不画的时候整只手出画。手在画面里的时间:RSA 49%,Minute Physics 40%【实测】。
|
|
47
|
+
- 【本片】代码画的手:裸前臂带暗面和汗毛,食指压黑马克笔,缩放 0.82,按 7 rad/s 轻轻晃。
|
|
48
|
+
|
|
49
|
+
## ③ 运动轨迹
|
|
50
|
+
|
|
51
|
+
- **写字速度**【实测,9 例】:
|
|
52
|
+
- 正文中位约 16 字符/秒。
|
|
53
|
+
- 片头标题慢一半,约 7.5 字符/秒,用来「立题」。
|
|
54
|
+
- 口播约 13 字符/秒,所以写字速度大致等于语速。
|
|
55
|
+
- 【本片】正文 16 字/秒;「猫?」按标题 7.5 字/秒写。
|
|
56
|
+
- **画图速度**【实测+归纳】:
|
|
57
|
+
- 小图标 0.5–1s,人物头像约 2s。
|
|
58
|
+
- RSA 新增墨迹的面积中位是每秒 0.25% 画面。
|
|
59
|
+
- 复杂插画不当着镜头画:要么预先画好,相机移过去时露出来;要么整张硬切进来,手只补色。
|
|
60
|
+
- **【本片】**:
|
|
61
|
+
- 线条笔速 2600 世界像素/秒,约为 RSA 实拍的 2 倍。8 秒演示片必须压缩,真片请放慢。
|
|
62
|
+
- 笔画时长按长度除以笔速算,每笔至少 0.04s,抬笔间隔 0.02s。
|
|
63
|
+
- 每笔内部用 sineInOut,起笔、收笔慢。
|
|
64
|
+
- 花叔用 0.7s「Reveal」揭开:笔尖在他的关节包围盒里走 8 行之字形,`DG.revealMask` 把走过的地方变成 clip,线稿只在 clip 里露出。
|
|
65
|
+
- 第一版是按部件 `setLineDash` 同时描、笔尖沿关节走,审片判「笔不领线」,所以换了。
|
|
66
|
+
- 汉字没有笔顺数据,每个字用 3 行之字形揭开,笔尖跟着来回,看起来就是在写。
|
|
67
|
+
- **加速倍率**:Henry Reich 每秒拍 1 张照片,画画时每张停 2 帧,等效约 12 倍速。RSA 推断 5–8 倍【一手+推断】。
|
|
68
|
+
- **「不带手」的弹出**:RSA 有一部分橙色关键词是后期整词弹出的,没有手画(ANAESTHETIC、CREATIVITY)【实测】。【本片】「×1000万张」「是猫!」用 0.3s backOut(2.2) 弹出,手不过去。
|
|
69
|
+
- **笔尖路径**:
|
|
70
|
+
- 两笔之间间隔 <0.25s 时,笔尖从上一笔终点沿弧线滑到下一笔起点(sineInOut,抬高 30px)。
|
|
71
|
+
- 间隔更长时,抬手出画:0.35s cubicIn 退到右下屏外。
|
|
72
|
+
- 下一笔开始前 0.3s,从右下 cubicOut 进来。
|
|
73
|
+
- **持续运动**:白板片的「活」来自手一直在画。RSA 的画线活动量和说话词密度之间几乎不相关(|r|<0.07):说话停顿时,手也不停【实测】。
|
|
74
|
+
|
|
75
|
+
## ④ 转场(常用 5 种)
|
|
76
|
+
|
|
77
|
+
1. **板上平滑移动或推拉**(RSA 主力,41 次)。
|
|
78
|
+
- 1.2–2.4s,**easeInOutSine**:实测速度峰值/均值 1.49,理论 sine 是 1.57。
|
|
79
|
+
- 一次平移约 0.23 画宽,与上一块重叠约 75%。
|
|
80
|
+
- 【本片】转场 B:0.9s sineInOut(4.7→5.6s),斜移约 0.5 画宽,同时推到 1.12 倍。移动开始时手正在画一支橙色连线引向新区域,手领着相机走。
|
|
81
|
+
2. **甩镜**:快速摇加运动模糊,约 0.8s,一次移 0.5–1.2 画宽,用来跳到板上很远的区域(RSA 15 次)。
|
|
82
|
+
- 【本片】转场 A:0.8s cubicInOut 横移约一整屏。只在这 0.8s 里沿速度方向叠 9 次做模糊;平滑移动和拉远都保持清楚。
|
|
83
|
+
3. **拉远揭示全图**(收尾)。
|
|
84
|
+
- RSA 片尾:灰色铺满 → 0.6s 快速拉远 → 约 9s 横摇扫过长卷 → 再拉远看全图。
|
|
85
|
+
- VideoScribe 默认就勾着「Zoom at end?」【一手】。
|
|
86
|
+
- 【本片】6.85→7.5s sineInOut 拉到 0.45 倍,停 0.5s,同时整板在 0.5s 里铺一层很浅的灰 `#EEEEEC`。
|
|
87
|
+
4. **云团或爆炸擦除**:卡通烟团铺满再散开,约 1s(RSA 1 次)。
|
|
88
|
+
5. **硬切**:硬切到预先画好的图(RSA 少量);Minute Physics 型的换纸硬切(主力,每分钟 8.1 次);Minute Physics 讲黑夜时整帧反相。
|
|
89
|
+
|
|
90
|
+
**注意**:「推进到画框或泡泡里」「翻页」在样片里都没出现。本片第一版做了「推进思考泡泡」,看过调研后换成甩镜加平滑移动。
|
|
91
|
+
|
|
92
|
+
## ⑤ 节奏与文字
|
|
93
|
+
|
|
94
|
+
- **每块停留**:RSA 两次相机移动之间中位 6.6s(四分位 4.0–13.8s);Minute Physics 每个镜头中位 7.1s【实测】。示范片 8s 放了 3 块,约为真片密度的 2.5 倍。
|
|
95
|
+
- **和口播对齐(核心)**【实测】:
|
|
96
|
+
- 开写比对应短语开说晚 0.2–0.8s,中位 +0.5s。
|
|
97
|
+
- 短语说完后 1s 内写完:边说边写,稍微落后,**不抢先**。
|
|
98
|
+
- 例外是视觉铺垫(药瓶、箭头)会提前几秒画好,等台词说到。
|
|
99
|
+
- Minute Physics 是名词一说出来图就落下,中位 +0.3s。
|
|
100
|
+
- **转场卡话题,不卡停顿**:新的一块板对应一个新论点【实测+归纳】。
|
|
101
|
+
- **音乐**:RSA 在讲话下面**没有音乐**。Minute Physics 全程有音乐垫底,约比人声低 9dB【实测】。
|
|
102
|
+
- **工具默认值**:
|
|
103
|
+
- VideoScribe 画完停留默认 0.5s【一手】,相机移动默认 1s【二手】。
|
|
104
|
+
- Doodly 每个素材默认画 3s【一手】。
|
|
105
|
+
|
|
106
|
+
## ⑥ 代码实现要点
|
|
107
|
+
|
|
108
|
+
> 收进 skill 后(2026-10-04 v0.4):本卡「新写」里的通用函数已统一进 `scripts/engine/lib/`(名字已换成统一后的 MO / CAM / DG / TY / CH / UI / CL / TOON),示范片自己的代码在 `scripts/engine/demos/y3_whiteboard/`。库速查和「怎么为一段口播选语法」见 `references/09-视频动画语法.md`。
|
|
109
|
+
|
|
110
|
+
- 复用 skill:
|
|
111
|
+
- `KIT.densify / KIT.resample`:Catmull-Rom 加密后按弧长等距重采样,`DG.hand` 在这之上加低频噪声
|
|
112
|
+
- `PAINT.noise`、`PAINT.cached`
|
|
113
|
+
- `HUASHU.build/pose/details`:花叔线稿
|
|
114
|
+
- 引擎转场接口
|
|
115
|
+
- 新写、现已统一进库(`lib/diagram.js` / `camera.js`):
|
|
116
|
+
- `DG.cum / DG.pointAt / DG.drawPartial`:折线按长度描出,返回笔尖位置。
|
|
117
|
+
- `CAM.at`:关键帧相机。
|
|
118
|
+
- `CAM.motionBlur`:运动模糊。
|
|
119
|
+
- `DG.revealMask / DG.zigzag`:之字形揭开遮罩(审片后新加)。
|
|
120
|
+
- 示范片自己的(`demos/y3_whiteboard/whiteboard.js`;笔画时间线、笔间滑移、马克笔已进库为 `DG.board` / `B.penAt` / `DG.pen`):
|
|
121
|
+
- **笔画时间线**:`addLine / addText / addPop / addFill` 按顺序排,时长由长度和速度自动算,交付时打印 `Y3.timeline` 核对每块的结束时间。第一版第二块排到了 7.9s,比相机移动晚了 2.5s,靠这个数才发现。
|
|
122
|
+
- `drawStroke`:线、字、弹出、填色、角色五种。字和角色都用之字形遮罩揭开,笔尖坐标直接取遮罩的前沿。
|
|
123
|
+
- `penAt`:笔尖与手的路径,包括笔间滑移、抬手出画、入画。
|
|
124
|
+
- `drawHand`:手和马克笔。
|
|
125
|
+
- 擦痕纹理放在屏幕空间,只跟相机平移、不跟缩放,否则推近 5 倍时会变成大灰斑。
|
|
126
|
+
- **关键架构**:三镜画的是同一块白板、同一台相机,转场全是 `same`。「转场」本身就是相机运动,所以白板上的东西在转场里绝不会跳。
|
|
127
|
+
|
|
128
|
+
## ⑦ 代表作品与一手参考
|
|
129
|
+
|
|
130
|
+
- 样片:
|
|
131
|
+
- RSA ANIMATE: Changing Education Paradigms https://www.youtube.com/watch?v=zDZFcDGpL4U
|
|
132
|
+
- MinutePhysics: Why is it Dark at Night? https://www.youtube.com/watch?v=gxJ4M7tyLRE
|
|
133
|
+
- Andrew Park 访谈(Sketchnote Army 2025)https://sketchnotearmy.com/blog/2025/11/18/andrew-park
|
|
134
|
+
- Cognitive Media「毛手」https://www.hairyhand.co/about
|
|
135
|
+
- VideoScribe 官方文档:
|
|
136
|
+
- 相机与 Zoom at end https://help.videoscribe.co/knowledge/use-zoom-and-set-the-camera
|
|
137
|
+
- Draw 入场 https://help.videoscribe.co/knowledge/draw
|
|
138
|
+
- 入场动画 https://help.videoscribe.co/knowledge/entrance-animations
|
|
139
|
+
- Doodly 默认值 https://support.voomly.com/en/articles/12735753-doodly-how-do-i-customize-video-settings
|
|
140
|
+
- 学习效果研究(转引)https://en.wikipedia.org/wiki/Whiteboard_animation
|
|
141
|
+
|
|
142
|
+
## ⑧ 最容易做错的 3 件事
|
|
143
|
+
|
|
144
|
+
1. **一块画满才说话,或者说完才画**。白板片的魔力是「说一句写一句」:写字速度等于语速,比口播晚约 0.5s。先画后说会让观众等,先说后画会让画变成多余的复述。复杂插画不要现场画,预先画好,相机移过去露出来。
|
|
145
|
+
2. **每次都整屏切到下一块空白**。RSA 的平滑移动只移 0.23 画宽,新旧区域大面积重叠,观众一直知道自己在一张大图的哪里。只在跳到远处时才用 0.8s 甩镜加模糊。收尾一定要拉远看全图,这是这个类型的落点。
|
|
146
|
+
3. **颜色多、线太细或太均匀、手一直挂在画面上**。只用黑加一个强调色,线宽约为画高的 0.65%。手只在画的时候入画,画完就从右下退出;强调词可以不带手直接弹出。另外别把 RSA 和 Minute Physics 混用:要么一张大白板加相机移动,要么一页一张纸加硬切。
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## 审片与修订(独立 agent 只看成片,6/10,三片里最低)
|
|
151
|
+
|
|
152
|
+
审片意见和这一轮的处理:
|
|
153
|
+
- 「笔尖不领着线走,花叔好几笔同时冒出来;字是遮罩擦出来的」:
|
|
154
|
+
- 花叔改成 VideoScribe 的 Reveal 画法:完整线稿藏在下面,笔尖走 8 行之字形,笔过之处揭开,笔尖永远在前沿上。
|
|
155
|
+
- 字改成逐字写:每个字一段时间,笔尖在字框里 3 行之字形来回,遮罩跟着揭开。
|
|
156
|
+
- 新写 `DG.revealMask`(同向绕行的方条并集,nonzero 下重叠不抵消)和 `DG.zigzag`。
|
|
157
|
+
- 「甩镜后 0.4s 死区」:第二块提前到 3.12s 开画,手在甩镜收尾时就入画。
|
|
158
|
+
- 「截图框线穿过猫头」:每个框先填一层白板色再描边,前框盖住后框的线。
|
|
159
|
+
- 「『自己找规律』被上缘切一半」:第三块整体下移 60px。
|
|
160
|
+
- 「拉远后灰底和擦痕像脏墙」:灰底减淡到 `#EEEEEC`,擦痕透明度减半。
|
|
161
|
+
- 「全景只停 0.15s、三组画没连起来」:
|
|
162
|
+
- 第一块结尾加一支橙箭头指向右边,甩镜有了方向。
|
|
163
|
+
- 第二块结尾画一支橙色连线引向第三块,手领着相机走。
|
|
164
|
+
- 拉远提前到 6.85–7.5s,全景停 0.5s。
|
|
165
|
+
- 「手是蓝袖子卡通手」:改成裸前臂,带暗面和汗毛,更接近 RSA 的真人手。仍是代码画的。
|
|
166
|
+
|
|
167
|
+
## QA(skill `scripts/qa.py`,修订后终版)
|
|
168
|
+
|
|
169
|
+
| 镜 | 量的窗口(镜内秒) | 运动面积% 均/峰 | 静止帧对% | 跳变帧 | 每帧耗时 均/峰 ms | 确定性 |
|
|
170
|
+
|---|---|---|---|---|---|---|
|
|
171
|
+
| y3_s1 | 0.35–2.48 | 3.1 / 5.31 | 0.0 | 0 | 6.5 / 6.9 | ✓ 逐像素一致 |
|
|
172
|
+
| y3_s2 | 0.8–2.23 | 4.65 / 9.57 | 0.0 | 0 | 6.5 / 7.3 | ✓ 逐像素一致 |
|
|
173
|
+
| y3_s3 | 0.85–3.23 | 4.45 / 10.94 | 0.0 | 0 | 8.3 / 9.0 | ✓ 逐像素一致 |
|
|
174
|
+
|
|
175
|
+
转场冒烟(每个转场渲一遍,最慢一帧):y3_s2(same)46.9ms;y3_s3(same)14ms
|
|
176
|
+
|
|
177
|
+
读法:
|
|
178
|
+
- 白板片三镜都没有跳变:所有「转场」都是同一块板上的相机运动,板上的东西不会跳。
|
|
179
|
+
- 运动面积 3–4.7% 主要来自手和正在画的线,相机移动时会更高。
|
|
180
|
+
- 每帧不到 10ms,因为全是矢量线条,没有像素级处理。
|
|
181
|
+
|
|
182
|
+
复跑:`uv run scripts/qa.py --project scripts/engine --film demos/y3_whiteboard --out <目录>`(上表是实验时的数字;收进 skill 后的复跑见 09 号的回归表)。
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"grammar": "t2_keynote_ui",
|
|
3
|
+
"duration": 10,
|
|
4
|
+
"fps": 30,
|
|
5
|
+
"width": 1920,
|
|
6
|
+
"height": 1080,
|
|
7
|
+
"data": { "eyebrow": "全 新 发 布", "title": "参数化动画片段", "subtitle": "一份 JSON,出一段时长精确的动画" },
|
|
8
|
+
"cues": [
|
|
9
|
+
{ "at": 0.0, "kind": "title" },
|
|
10
|
+
{ "at": 2.2, "kind": "card", "text": "8 种动画语法", "sub": "从 3Blue1Brown 到动态文字", "data": { "icon": "layers" } },
|
|
11
|
+
{ "at": 3.0, "kind": "card", "text": "时长精确到帧", "sub": "帧数 = 时长 × 帧率", "data": { "icon": "clock", "value": 30, "suffix": " fps", "label": "默认帧率" } },
|
|
12
|
+
{ "at": 3.8, "kind": "card", "text": "横竖屏都能出", "sub": "竖屏自动换一套排版", "data": { "icon": "phone" } },
|
|
13
|
+
{ "at": 6.0, "kind": "number", "text": "英伟达五个财年的营收涨幅", "data": { "value": 7.8, "decimals": 1, "suffix": " 倍" } },
|
|
14
|
+
{ "at": 7.2, "kind": "card", "text": "用 t3 财经图表出的一帧", "sub": "数据:英伟达 2021–2025 财年 10-K 年报", "image": "assets/财经图表_横屏.png" },
|
|
15
|
+
{ "at": 8.4, "kind": "highlight", "data": { "rect": [0.648, 0.245, 0.104, 0.105] } }
|
|
16
|
+
]
|
|
17
|
+
}
|