@biunow/agent-biuvibe 0.0.0-stage → 1.0.0
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 +325 -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 +654 -0
- package/manifest.json +51 -0
- package/package.json +8 -4
- package/skills/biuvibe/SKILL.md +28 -0
- package/studio/app.js +258 -0
- package/studio/assert-panel-permit.mjs +67 -0
- package/studio/composer.css +438 -0
- package/studio/composer.js +307 -0
- package/studio/index.html +82 -0
- package/studio/select-menu.js +433 -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/README.md +0 -3
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
// 片段 · 发布会式界面(t2),做教程、功能、参数最顺手:深色光斑底,一屏一件事;字从模糊里浮出,卡片是毛玻璃、轻回弹落位。
|
|
2
|
+
// data: { eyebrow?(标题上方小字), title?, subtitle?, accent?:'#3d6bff' }
|
|
3
|
+
// cues:title(at 这一帧标题开始从模糊里浮出;text/sub 覆盖 data)
|
|
4
|
+
// card | step | image(一张卡:text 卡标题,sub 说明,image 截图路径;at 这一帧卡片开始弹入;步骤号按出现顺序 01、02…,data.step 可指定)
|
|
5
|
+
// · 有 image:一屏一张,截图等比放进卡里(contain,不裁)。横图横卡;竖图(手机截图)在横屏里是「左字右图」,图撑满高度
|
|
6
|
+
// · 没有 image:功能卡。连着的几张(最多 3 张)并排站在一屏里,新卡进来时旧卡让位(像示范片的三卡并列);
|
|
7
|
+
// 卡上有图标(data.icon:wave memory agent clock phone layers chart code check play bolt lock,不写就画步骤号)、
|
|
8
|
+
// 大标题、说明,可选一个大数字(data.value / prefix / suffix / decimals + data.label,卡片落定后计数)
|
|
9
|
+
// highlight(框出当前截图卡里的一块:data.rect = [x, y, w, h],相对截图的 0..1;text 可选标签)
|
|
10
|
+
// number(大数字单独一屏:data {value, prefix, suffix, decimals, label?(数字上方小字)};at = 数字落定时刻,提前 0.9s 开始计数,
|
|
11
|
+
// 上一屏这时开始退场,不叠在卡片上;说明写 text 或 sub 都认)
|
|
12
|
+
// 竖屏:第一张卡进来时标题缩成页眉留在顶上(不让上下大片空着);卡片按剩余高度放大。safe:版面只排在 top..H−bottom 之间。
|
|
13
|
+
// alpha:不画光斑底;卡片垫一层深色、字带投影,压在亮画面上也看得清。
|
|
14
|
+
CLIPS.t2_keynote_ui = (() => {
|
|
15
|
+
const { clamp, lerp } = U;
|
|
16
|
+
const SANS = '"Inter", "PuHui-Medium"', SANSB = '"Inter", "PuHui-Bold"', ZH = '"PuHui-Medium"', ZHB = '"PuHui-Bold"';
|
|
17
|
+
let BL, slides, scr = {}, G;
|
|
18
|
+
const track = (c, size, em = -0.02) => { c.letterSpacing = (size * em).toFixed(2) + 'px'; };
|
|
19
|
+
// 本语法自带的几个线性图标(UI.icon 只有 wave/memory/agent):单位框 ±0.5,圆头等线宽
|
|
20
|
+
const ICON = {
|
|
21
|
+
clock: c => { c.beginPath(); c.arc(0, 0, 0.42, 0, 7); c.stroke(); c.beginPath(); c.moveTo(0, -0.24); c.lineTo(0, 0); c.lineTo(0.18, 0.1); c.stroke(); },
|
|
22
|
+
phone: c => { c.beginPath(); c.roundRect(-0.25, -0.45, 0.5, 0.9, 0.1); c.stroke(); c.beginPath(); c.moveTo(-0.08, 0.32); c.lineTo(0.08, 0.32); c.stroke(); },
|
|
23
|
+
layers: c => { for (let k = 0; k < 3; k++) { const y = -0.22 + k * 0.22; c.globalAlpha = k ? 0.6 : 1; c.beginPath(); c.moveTo(-0.45, y); c.lineTo(0, y - 0.18); c.lineTo(0.45, y); c.lineTo(0, y + 0.18); c.closePath(); c.stroke(); } c.globalAlpha = 1; },
|
|
24
|
+
chart: c => { c.beginPath(); c.moveTo(-0.42, -0.42); c.lineTo(-0.42, 0.4); c.lineTo(0.44, 0.4); c.stroke(); c.beginPath(); c.moveTo(-0.28, 0.18); c.lineTo(-0.06, -0.04); c.lineTo(0.1, 0.06); c.lineTo(0.36, -0.26); c.stroke(); },
|
|
25
|
+
code: c => { c.beginPath(); c.moveTo(-0.18, -0.28); c.lineTo(-0.42, 0); c.lineTo(-0.18, 0.28); c.moveTo(0.18, -0.28); c.lineTo(0.42, 0); c.lineTo(0.18, 0.28); c.moveTo(0.08, -0.38); c.lineTo(-0.08, 0.38); c.stroke(); },
|
|
26
|
+
check: c => { c.beginPath(); c.arc(0, 0, 0.42, 0, 7); c.stroke(); c.beginPath(); c.moveTo(-0.2, 0); c.lineTo(-0.05, 0.16); c.lineTo(0.22, -0.16); c.stroke(); },
|
|
27
|
+
play: c => { c.beginPath(); c.moveTo(-0.22, -0.34); c.lineTo(0.34, 0); c.lineTo(-0.22, 0.34); c.closePath(); c.fill(); },
|
|
28
|
+
bolt: c => { c.beginPath(); c.moveTo(0.08, -0.46); c.lineTo(-0.28, 0.06); c.lineTo(0, 0.06); c.lineTo(-0.08, 0.46); c.lineTo(0.28, -0.06); c.lineTo(0, -0.06); c.closePath(); c.fill(); },
|
|
29
|
+
lock: c => { c.beginPath(); c.roundRect(-0.32, -0.04, 0.64, 0.46, 0.08); c.stroke(); c.beginPath(); c.arc(0, -0.04, 0.2, Math.PI, 0); c.stroke(); },
|
|
30
|
+
};
|
|
31
|
+
const icon = (g, kind, x, y, s, col, t) => {
|
|
32
|
+
if (['wave', 'memory', 'agent'].includes(kind)) return UI.icon(g, kind, x, y, s, col, t);
|
|
33
|
+
const f = ICON[kind]; if (!f) return false;
|
|
34
|
+
g.save(); g.translate(x, y); g.scale(s, s); g.strokeStyle = col; g.fillStyle = col; g.lineWidth = 0.075; g.lineCap = 'round'; g.lineJoin = 'round'; f(g); g.restore();
|
|
35
|
+
};
|
|
36
|
+
// 放得下才算:TY.fit 量每行宽度,多行折成等长(说明文字不留一个字挂在下一行)
|
|
37
|
+
const fitB = (g, text, maxW, size, fam, o = {}) => TY.fit(g, text, maxW, size, fam, { ...o, balance: true });
|
|
38
|
+
const fmtNum = (d, k) => (d.prefix || '') + TY.fmt((+d.value || 0) * k, d.decimals ?? 0) + (d.suffix || '');
|
|
39
|
+
return {
|
|
40
|
+
fonts: ['PuHui-Medium', 'PuHui-Bold'],
|
|
41
|
+
safe: true,
|
|
42
|
+
init(ctx) {
|
|
43
|
+
const { W, H, u, safe } = ctx;
|
|
44
|
+
BL = [{ x: .22 * W, y: .28 * H, r: .4 * Math.max(W, H), col: [150, 90, 238], a: .75, ax: .11 * W, ay: .11 * H, period: 11, ph: 0 },
|
|
45
|
+
{ x: .79 * W, y: .24 * H, r: .37 * Math.max(W, H), col: [56, 104, 255], a: .7, ax: .1 * W, ay: .15 * H, period: 13, ph: 2.1 },
|
|
46
|
+
{ x: .69 * W, y: .86 * H, r: .3 * Math.max(W, H), col: [120, 214, 255], a: .5, ax: .13 * W, ay: .09 * H, period: 9.5, ph: 4 },
|
|
47
|
+
{ x: .27 * W, y: .89 * H, r: .27 * Math.max(W, H), col: [255, 96, 84], a: .42, ax: .09 * W, ay: .08 * H, period: 12, ph: 1.3 }];
|
|
48
|
+
const hasTitle = ctx.of('title').length > 0, hdr = ctx.portrait && hasTitle;
|
|
49
|
+
G = { y0: safe.top + (hdr ? 250 * u : 40 * u), y1: H - safe.bottom - 40 * u, hdrY: safe.top + 150 * u, hdr };
|
|
50
|
+
G.cy = (G.y0 + G.y1) / 2; G.bh = G.y1 - G.y0;
|
|
51
|
+
// 分屏:截图卡一张一屏;连着的无图卡最多 3 张一屏;number 单独一屏
|
|
52
|
+
slides = []; let k = 0;
|
|
53
|
+
for (const q of ctx.cues) {
|
|
54
|
+
if (['card', 'step', 'image'].includes(q.kind)) {
|
|
55
|
+
const n = q.data && q.data.step != null ? q.data.step : ++k, im = q.image && ctx.IMG[q.image], cd = { q, n, im };
|
|
56
|
+
const last = slides[slides.length - 1];
|
|
57
|
+
if (!im && last && last.type === 'cards' && last.cards.length < 3) last.cards.push(cd);
|
|
58
|
+
else slides.push({ type: im ? 'img' : 'cards', cards: [cd], start: q.at });
|
|
59
|
+
} else if (q.kind === 'number') slides.push({ type: 'num', q, start: q.at - 0.9 });
|
|
60
|
+
}
|
|
61
|
+
slides.forEach((s, i) => { s.next = slides[i + 1] ? slides[i + 1].start : 1e9; });
|
|
62
|
+
// 截图卡的版式:标题行 + 截图区;截图区按截图比例定。竖图在横屏里改成「左字右图」
|
|
63
|
+
const maxW = W * (ctx.portrait ? 0.9 : 0.8), maxH = G.bh * (ctx.portrait ? 0.92 : 0.86), head = (ctx.portrait ? 230 : 130) * u, pad = 36 * u;
|
|
64
|
+
for (const s of slides) if (s.type === 'img') {
|
|
65
|
+
const cd = s.cards[0], ar = cd.im.width / cd.im.height;
|
|
66
|
+
if (!ctx.portrait && ar < 0.9) { // 横屏放竖图:左字右图,图撑满卡高
|
|
67
|
+
const ih = maxH - 2 * pad, iw = ih * ar, tw = 560 * u;
|
|
68
|
+
cd.box = { w: tw + iw + 3 * pad, h: maxH, img: { x: tw + 2 * pad, y: pad, w: iw, h: ih }, side: tw };
|
|
69
|
+
} else {
|
|
70
|
+
let iw = maxW - 2 * pad, ih = iw / ar; if (ih > maxH - head - 2 * pad) { ih = maxH - head - 2 * pad; iw = ih * ar; }
|
|
71
|
+
const cw = Math.max(iw + 2 * pad, Math.min(maxW, 760 * u)), ch = ih + head + 2 * pad;
|
|
72
|
+
cd.box = { w: cw, h: ch, img: { x: (cw - iw) / 2, y: head + pad, w: iw, h: ih } };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
draw(c, t, ctx) {
|
|
77
|
+
const { W, H, u, data: d } = ctx, acc = d.accent || '#3d6bff';
|
|
78
|
+
// ---- 底:光斑(只依赖片段时间,连续) ----
|
|
79
|
+
let bd = null;
|
|
80
|
+
if (!ctx.alpha) {
|
|
81
|
+
const bgc = UI.scratch('clip_t2bg', W, H), g = bgc.getContext('2d'); g.clearRect(0, 0, W, H); // 先清空:不清的话上一帧的残留会透过半透明边缘,同一时刻先后渲出来差 1 个色阶(qa 确定性 ✗)
|
|
82
|
+
UI.mesh(g, t, { base: '#050508', blobs: BL, blur: 90, scale: 0.25, grain: 0.035, key: 'clip_t2mesh' });
|
|
83
|
+
const vg = g.createRadialGradient(W / 2, H / 2, 100 * u, W / 2, H / 2, Math.max(W, H) * 0.55); vg.addColorStop(0, 'rgba(0,0,0,0.38)'); vg.addColorStop(1, 'rgba(0,0,0,0.1)');
|
|
84
|
+
g.fillStyle = vg; g.fillRect(0, 0, W, H); c.drawImage(bgc, 0, 0); bd = UI.backdrop(bgc, { blur: 40, key: 'clip_t2bd' });
|
|
85
|
+
}
|
|
86
|
+
const shadowText = g => { if (ctx.alpha) { g.shadowColor = 'rgba(0,0,0,0.75)'; g.shadowBlur = 18 * u; g.shadowOffsetY = 3 * u; } };
|
|
87
|
+
// ---- 标题:眉题 → 主标题(模糊→清晰+上移)→ 副标题;第一屏进来时:横屏退到后面,竖屏缩成页眉留在顶上 ----
|
|
88
|
+
const qt = ctx.of('title')[0], first = slides[0] ? slides[0].start : 1e9;
|
|
89
|
+
if (qt) {
|
|
90
|
+
const out = MO.appleOut(MO.seg(t, first - 0.15, first + 0.5));
|
|
91
|
+
const keep = G.hdr, title = qt.text ?? d.title ?? '', eb = (qt.data && qt.data.eyebrow) ?? d.eyebrow, sub = qt.sub ?? d.subtitle;
|
|
92
|
+
if (out < 1 || keep) {
|
|
93
|
+
c.save(); c.textAlign = 'center'; c.textBaseline = 'alphabetic'; shadowText(c);
|
|
94
|
+
let sz = TY.fit(c, title, W * 0.86, (ctx.portrait ? 150 : 190) * u, 'Inter', { maxLines: 1, min: 0.55, weight: '600 ', soft: true }); // 先缩字号放一行,放不下再折两行
|
|
95
|
+
if (!sz.ok) sz = fitB(c, title, W * 0.86, (ctx.portrait ? 150 : 190) * u, 'Inter', { maxLines: 2, weight: '600 ' });
|
|
96
|
+
const cy = G.cy - (sz.lines.length - 1) * sz.size * 0.55;
|
|
97
|
+
// 竖屏:整块缩到页眉(主标题 → 约 64px),眉题和副标题淡出
|
|
98
|
+
const hs = keep ? Math.min(1, 68 * u / sz.size) : 1, sc = keep ? lerp(1, hs, out) : lerp(1, 0.92, out), ty = keep ? lerp(0, G.hdrY - cy, out) : 0;
|
|
99
|
+
c.translate(W / 2, cy + ty); c.scale(sc, sc); c.translate(-W / 2, -cy);
|
|
100
|
+
const aSide = 1 - out;
|
|
101
|
+
if (!keep) { c.globalAlpha = 1 - out; if (out > 0) c.filter = `blur(${(20 * out * u).toFixed(1)}px)`; }
|
|
102
|
+
if (eb && aSide > 0) { c.save(); c.globalAlpha *= keep ? aSide : 1; c.font = `500 ${34 * u}px ${ZH}`; c.fillStyle = '#a7a7b4'; c.letterSpacing = `${6 * u}px`; TY.blurIn(c, eb, W / 2, cy - sz.size * 0.95, MO.appleOut(ctx.p(t, qt.at, 0.7)), { blur: 10 * u, dy: 16 * u }); c.restore(); }
|
|
103
|
+
c.font = `600 ${sz.size}px ${SANSB}`; track(c, sz.size); c.fillStyle = '#f5f3ff';
|
|
104
|
+
sz.lines.forEach((ln, i) => TY.blurIn(c, ln, W / 2, cy + i * sz.size * 1.1, MO.appleOut(ctx.p(t, qt.at + 0.15 + i * 0.12, 1.0)), { blur: 26 * u, dy: 40 * u }));
|
|
105
|
+
if (sub && aSide > 0) { c.save(); c.globalAlpha *= keep ? aSide : 1; c.letterSpacing = '0px'; c.font = `400 ${46 * u}px ${ZH}`; c.fillStyle = '#c9c9d4';
|
|
106
|
+
TY.wrap(c, sub, W * 0.84).forEach((ln, i) => TY.blurIn(c, ln, W / 2, cy + (sz.lines.length - 1) * sz.size * 1.1 + 110 * u + i * 62 * u, MO.appleOut(ctx.p(t, qt.at + 0.5, 0.9)), { blur: 12 * u, dy: 22 * u })); c.restore(); }
|
|
107
|
+
c.restore();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// ---- 每一屏:下一屏开始时往左后方退走(0.65s),不和下一屏的内容叠着 ----
|
|
111
|
+
slides.forEach((s, si) => {
|
|
112
|
+
if (t < s.start - 1e-6) return;
|
|
113
|
+
const nx = slides[si + 1], leave = MO.appleOut(MO.seg(t, s.next - 0.15, s.next + (nx && nx.type === 'num' ? 0.3 : 0.5))); if (leave >= 1) return;
|
|
114
|
+
if (s.type === 'num') return drawNumber(c, s, t, leave, ctx, shadowText);
|
|
115
|
+
if (s.type === 'img') return drawCard(c, s.cards[0], 0, t, leave, ctx, bd, cardGeoImg(s.cards[0], ctx), 'i' + si);
|
|
116
|
+
// 无图卡并排:n 张时的位置;新卡进来时旧卡按弹簧挪到新位置
|
|
117
|
+
const vis = s.cards.filter(cd => t >= cd.q.at - 1e-6), n = vis.length, last = vis[n - 1]; ctx._stat = s.cards.some(cd => cd.q.data && cd.q.data.value != null);
|
|
118
|
+
const rf = n > 1 ? MO.spring(t - last.q.at, { duration: 0.7, bounce: 0.12 }) : 1;
|
|
119
|
+
vis.forEach((cd, j) => { const A = rowGeo(j, n, ctx, s.cards.length), Bp = j < n - 1 ? rowGeo(j, n - 1, ctx, s.cards.length) : A;
|
|
120
|
+
const geo = { cx: lerp(Bp.cx, A.cx, rf), cy: lerp(Bp.cy, A.cy, rf), w: lerp(Bp.w, A.w, rf), h: lerp(Bp.h, A.h, rf), focus: j === n - 1 ? 1 : 1 - 0.25 * rf };
|
|
121
|
+
drawCard(c, cd, j, t, leave, ctx, bd, geo, 'c' + si + '_' + j); });
|
|
122
|
+
});
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
// 截图卡的屏幕几何
|
|
126
|
+
function cardGeoImg(cd, ctx) { return { cx: ctx.W / 2, cy: G.cy, w: cd.box.w, h: cd.box.h, focus: 1 }; }
|
|
127
|
+
// 无图卡:横屏排一行(1 张时宽一点),竖屏叠成一列;total = 这一屏最终有几张(排版按当前张数,但尺寸上限按最终张数,挪位时不忽大忽小)
|
|
128
|
+
function rowGeo(j, n, ctx, total) {
|
|
129
|
+
const { W, u } = ctx, gap = 44 * u;
|
|
130
|
+
if (ctx.portrait) { const w = W * 0.86, h = Math.min(400 * u, (G.bh - (total - 1) * gap) / total), y0 = G.cy - (n * h + (n - 1) * gap) / 2; return { cx: W / 2, cy: y0 + j * (h + gap) + h / 2, w, h }; }
|
|
131
|
+
const w = total === 1 ? 760 * u : Math.min(540 * u, (W * 0.9 - (total - 1) * gap) / total), h = Math.min((ctx._stat ? 660 : 540) * u, G.bh * 0.9), x0 = W / 2 - (n * w + (n - 1) * gap) / 2;
|
|
132
|
+
return { cx: x0 + j * (w + gap) + w / 2, cy: G.cy, w, h };
|
|
133
|
+
}
|
|
134
|
+
// 一张卡:弹簧从下方升起+绕 Y 轴转正;内容画进离屏纹理(毛玻璃按卡片的屏幕位置取样),再伪 3D 贴回
|
|
135
|
+
function drawCard(c, cd, i, t, leave, ctx, bd, geo, key) {
|
|
136
|
+
const { u, data: d } = ctx, q = cd.q, lt = ctx.lt(t, q.at); if (lt <= 0) return;
|
|
137
|
+
const sp = MO.spring(lt, { duration: 0.7, bounce: 0.15 }), acc = d.accent || '#3d6bff';
|
|
138
|
+
const Bw = geo.w, Bh = geo.h, cx = geo.cx - leave * ctx.W * 0.35, cy = geo.cy + (1 - sp) * 170 * u + MO.float(t, 5 * u, 3.6, i);
|
|
139
|
+
const sc = (0.9 + 0.1 * sp) * (1 - 0.12 * leave) * lerp(0.97, 1, geo.focus), ry = (1 - sp) * -0.45 + 0.03 * Math.sin(t * 0.9 + i) - 0.35 * leave, a = clamp(lt / 0.2) * (1 - leave) * lerp(0.6, 1, geo.focus);
|
|
140
|
+
const pad = 60, tex = scr[key] || (scr[key] = document.createElement('canvas')); tex.width = Math.ceil(Bw + 2 * pad); tex.height = Math.ceil(Bh + 2 * pad);
|
|
141
|
+
const g = tex.getContext('2d'); g.reset();
|
|
142
|
+
const sw = Bw * sc, sh = Bh * sc;
|
|
143
|
+
if (ctx.alpha) { g.fillStyle = 'rgba(12,12,22,0.62)'; g.beginPath(); g.roundRect(pad, pad, Bw, Bh, 34 * u); g.fill(); }
|
|
144
|
+
UI.glass(g, { x: pad, y: pad, w: Bw, h: Bh, r: 34 * u, bd, sample: { x: cx - sw / 2, y: cy - sh / 2, w: sw, h: sh }, tint: ctx.alpha ? 0.08 : 0.075, stroke: 0.22, light: 0.14, shadow: false });
|
|
145
|
+
g.save(); g.translate(pad, pad);
|
|
146
|
+
if (cd.im) imgContent(g, cd, Bw, Bh, t, ctx, acc); else featContent(g, cd, Bw, Bh, lt, t, ctx, acc);
|
|
147
|
+
UI.sheen(g, UI.rrPath(0, 0, Bw, Bh, 34 * u), MO.seg(lt, 0.4, 1.2), { x0: 0, x1: Bw, width: 120 * u, angle: -0.35, alpha: 0.16 }); // 光扫过整张卡(入场后 0.4s)
|
|
148
|
+
g.restore();
|
|
149
|
+
c.save(); c.globalAlpha = a;
|
|
150
|
+
UI.shadow(c, cx - sw / 2 + 10 * u, cy - sh / 2 + 20 * u, sw - 20 * u, sh - 20 * u, 34 * u, { blur: 80 * u, oy: 40 * u, alpha: 0.55 });
|
|
151
|
+
UI.persp(c, tex, { cx, cy, w: tex.width * sc, h: tex.height * sc, ry, persp: 1800 * u, strip: 3, shade: 0.35 });
|
|
152
|
+
c.restore();
|
|
153
|
+
}
|
|
154
|
+
// 步骤号徽章
|
|
155
|
+
function badge(g, x, y, s, n, acc, u) { g.fillStyle = acc; g.beginPath(); g.roundRect(x, y, s, s, s * 0.28); g.fill();
|
|
156
|
+
g.fillStyle = '#fff'; g.font = `700 ${s * 0.5}px ${SANSB}`; g.textAlign = 'center'; g.textBaseline = 'middle'; g.fillText(String(n).padStart(2, '0'), x + s / 2, y + s / 2 + 2 * u); g.textAlign = 'left'; g.textBaseline = 'alphabetic'; }
|
|
157
|
+
// 截图卡的内容:步骤号+标题+说明,截图 contain;highlight 框出一块
|
|
158
|
+
function imgContent(g, cd, Bw, Bh, t, ctx, acc) {
|
|
159
|
+
const { u } = ctx, q = cd.q, B = cd.box, I = B.img, hp = 40 * u, bs = 70 * u;
|
|
160
|
+
badge(g, hp, hp, bs, cd.n, acc, u);
|
|
161
|
+
if (B.side) { // 左字右图:标题、说明在左栏往下排
|
|
162
|
+
const tw = B.side - hp, tl = fitB(g, q.text || '', tw, 58 * u, 'PuHui-Bold', { maxLines: 3, weight: '600 ' });
|
|
163
|
+
g.font = `600 ${tl.size}px ${ZHB}`; g.fillStyle = '#f5f5f7'; tl.lines.forEach((ln, k) => g.fillText(ln, hp, hp + bs + 70 * u + k * tl.size * 1.25));
|
|
164
|
+
if (q.sub) { const sl = fitB(g, q.sub, tw, 34 * u, 'PuHui-Medium', { maxLines: 5 }); g.font = `400 ${sl.size}px ${ZH}`; g.fillStyle = 'rgba(235,235,245,0.66)';
|
|
165
|
+
sl.lines.forEach((ln, k) => g.fillText(ln, hp, hp + bs + 70 * u + tl.lines.length * tl.size * 1.25 + 30 * u + k * sl.size * 1.4)); }
|
|
166
|
+
} else {
|
|
167
|
+
const tx = hp + bs + 26 * u, tw = Bw - tx - hp;
|
|
168
|
+
if (ctx.portrait) { // 竖屏:卡头高一些,标题、说明字大一号
|
|
169
|
+
const tl = fitB(g, q.text || '', tw, 56 * u, 'PuHui-Bold', { maxLines: 2, weight: '600 ', min: 0.7 }); g.font = `600 ${tl.size}px ${ZHB}`; g.fillStyle = '#f5f5f7';
|
|
170
|
+
tl.lines.forEach((ln, k) => g.fillText(ln, tx, hp + tl.size * 0.85 + k * tl.size * 1.2));
|
|
171
|
+
// 标题占两行时说明只留一行,卡头放得下
|
|
172
|
+
if (q.sub) { const sl = fitB(g, q.sub, tw, 34 * u, 'PuHui-Medium', { maxLines: tl.lines.length > 1 ? 1 : 2, min: 0.75 }); g.font = `400 ${sl.size}px ${ZH}`; g.fillStyle = 'rgba(235,235,245,0.66)';
|
|
173
|
+
sl.lines.forEach((ln, k) => g.fillText(ln, tx, hp + tl.size * 0.85 + (tl.lines.length - 1) * tl.size * 1.2 + 24 * u + sl.size + k * sl.size * 1.35)); }
|
|
174
|
+
} else {
|
|
175
|
+
const tl = TY.fit(g, q.text || '', tw, 46 * u, 'PuHui-Bold', { maxLines: 1, weight: '600 ' });
|
|
176
|
+
g.font = `600 ${tl.size}px ${ZHB}`; g.fillStyle = '#f5f5f7'; g.fillText(tl.lines[0] || '', tx, hp + (q.sub ? 32 * u : 48 * u));
|
|
177
|
+
if (q.sub) { const sl = TY.fit(g, q.sub, tw, 28 * u, 'PuHui-Medium', { maxLines: 1 }); g.font = `400 ${sl.size}px ${ZH}`; g.fillStyle = 'rgba(235,235,245,0.62)'; g.fillText(sl.lines[0] || '', tx, hp + 74 * u); }
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
const f = CLIP.fit(cd.im.width, cd.im.height, I.x, I.y, I.w, I.h);
|
|
181
|
+
g.save(); g.shadowColor = 'rgba(0,0,0,.45)'; g.shadowBlur = 30 * u; g.shadowOffsetY = 12 * u; g.fillStyle = '#000'; g.beginPath(); g.roundRect(f.x, f.y, f.w, f.h, 10 * u); g.fill(); g.restore();
|
|
182
|
+
g.save(); g.beginPath(); g.roundRect(f.x, f.y, f.w, f.h, 10 * u); g.clip(); g.drawImage(cd.im, f.x, f.y, f.w, f.h); g.restore();
|
|
183
|
+
g.strokeStyle = 'rgba(255,255,255,0.22)'; g.lineWidth = 1.5; g.beginPath(); g.roundRect(f.x + .75, f.y + .75, f.w - 1.5, f.h - 1.5, 10 * u); g.stroke();
|
|
184
|
+
// 框出重点:at 这一帧框开始弹出,之后呼吸;一道光扫过框内(只认落在这张卡在屏期间的 highlight)
|
|
185
|
+
const nxAt = (() => { const i = ctx.cues.indexOf(q); const n = ctx.cues.slice(i + 1).find(z => ['card', 'step', 'image', 'number'].includes(z.kind)); return n ? (n.kind === 'number' ? n.at - 0.9 : n.at) : 1e9; })();
|
|
186
|
+
for (const qh of ctx.of('highlight')) {
|
|
187
|
+
if (qh.at < q.at || qh.at >= nxAt || !qh.data || !qh.data.rect) continue;
|
|
188
|
+
const hl = ctx.lt(t, qh.at); if (hl <= 0) continue;
|
|
189
|
+
const R = CLIP.sub(qh.data.rect, f), s = MO.spring(hl, { duration: 0.45, bounce: 0.25 }), e = 8 * u * (1 - s);
|
|
190
|
+
g.save(); g.fillStyle = 'rgba(0,0,0,0.38)'; g.beginPath(); g.rect(f.x, f.y, f.w, f.h); g.roundRect(R.x - e, R.y - e, R.w + 2 * e, R.h + 2 * e, 10 * u); g.globalAlpha = clamp(hl / 0.3); g.fill('evenodd'); g.restore();
|
|
191
|
+
g.save(); g.strokeStyle = acc; g.lineWidth = 5 * u; g.shadowColor = acc; g.shadowBlur = 18 * u * (0.7 + 0.3 * Math.sin(hl * 5)); g.globalAlpha = clamp(hl / 0.15);
|
|
192
|
+
g.beginPath(); g.roundRect(R.x - e, R.y - e, R.w + 2 * e, R.h + 2 * e, 10 * u); g.stroke(); g.restore();
|
|
193
|
+
UI.sheen(g, UI.rrPath(R.x, R.y, R.w, R.h, 10 * u), MO.seg(hl, 0.25, 1.0), { x0: R.x, x1: R.x + R.w, width: Math.max(60 * u, R.w * 0.2), alpha: 0.35 });
|
|
194
|
+
if (qh.text) { g.font = `600 ${30 * u}px ${ZHB}`; const lw = g.measureText(qh.text).width + 36 * u, ly = R.y + R.h + 16 * u + 48 * u > f.y + f.h ? R.y - 64 * u : R.y + R.h + 16 * u;
|
|
195
|
+
g.save(); g.globalAlpha = clamp((hl - 0.15) / 0.25); g.fillStyle = acc; g.beginPath(); g.roundRect(clamp(R.x, f.x, f.x + f.w - lw), ly, lw, 48 * u, 24 * u); g.fill(); g.fillStyle = '#fff'; g.textBaseline = 'middle'; g.fillText(qh.text, clamp(R.x, f.x, f.x + f.w - lw) + 18 * u, ly + 25 * u); g.restore(); }
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// 无图功能卡的内容:图标(或步骤号)→ 大标题 → 说明 →(可选)大数字计数。横屏竖卡上下排,竖屏横卡左右排
|
|
199
|
+
function featContent(g, cd, Bw, Bh, lt, t, ctx, acc) {
|
|
200
|
+
const { u } = ctx, q = cd.q, dd = q.data || {}, hasNum = dd.value != null, pad = 48 * u, tile = (ctx.portrait ? 110 : 120) * u;
|
|
201
|
+
const drawTile = (x, y) => { g.fillStyle = 'rgba(255,255,255,0.10)'; g.beginPath(); g.roundRect(x, y, tile, tile, 26 * u); g.fill();
|
|
202
|
+
if (!dd.icon || icon(g, dd.icon, x + tile / 2, y + tile / 2, tile * 0.6, '#f2f2f7', t) === false) {
|
|
203
|
+
g.fillStyle = acc; g.beginPath(); g.roundRect(x, y, tile, tile, 26 * u); g.fill(); g.fillStyle = '#fff'; g.font = `700 ${tile * 0.46}px ${SANSB}`; g.textAlign = 'center'; g.textBaseline = 'middle';
|
|
204
|
+
g.fillText(String(cd.n).padStart(2, '0'), x + tile / 2, y + tile / 2 + 3 * u); g.textAlign = 'left'; g.textBaseline = 'alphabetic'; } };
|
|
205
|
+
const num = (x, y, size, align) => { const v = MO.expoOut(clamp((lt - 0.35) / 0.9)); g.save(); g.font = `600 ${size}px ${SANSB}`; track(g, size, -0.03); g.fillStyle = '#fff';
|
|
206
|
+
TY.tabular(g, fmtNum(dd, v), x, y, { align }); g.restore(); if (dd.label) { g.font = `400 ${28 * u}px ${ZH}`; g.fillStyle = 'rgba(235,235,245,0.6)'; g.textAlign = align; g.fillText(dd.label, x, y + 46 * u); g.textAlign = 'left'; } };
|
|
207
|
+
g.textAlign = 'left'; g.textBaseline = 'alphabetic';
|
|
208
|
+
if (!ctx.portrait) {
|
|
209
|
+
drawTile(pad, pad);
|
|
210
|
+
const tl = fitB(g, q.text || '', Bw - 2 * pad, 64 * u, 'PuHui-Bold', { maxLines: 2, weight: '600 ', min: 0.6 });
|
|
211
|
+
let y = pad + tile + 40 * u + tl.size; g.font = `600 ${tl.size}px ${ZHB}`; g.fillStyle = '#f5f5f7'; tl.lines.forEach((ln, k) => g.fillText(ln, pad, y + k * tl.size * 1.2)); y += (tl.lines.length - 1) * tl.size * 1.2;
|
|
212
|
+
if (q.sub) { const sl = fitB(g, q.sub, Bw - 2 * pad, (hasNum ? 32 : 38) * u, 'PuHui-Medium', { maxLines: hasNum ? 2 : 4, min: 0.75 }); g.font = `400 ${sl.size}px ${ZH}`; g.fillStyle = 'rgba(235,235,245,0.66)';
|
|
213
|
+
sl.lines.forEach((ln, k) => g.fillText(ln, pad, y + 26 * u + sl.size + k * sl.size * 1.45)); }
|
|
214
|
+
if (hasNum) { g.fillStyle = 'rgba(255,255,255,0.12)'; g.fillRect(pad, Bh - pad - 200 * u, Bw - 2 * pad, 1.5); num(pad, Bh - pad - 66 * u, Math.min(128 * u, (Bw - 2 * pad) / Math.max(3, fmtNum(dd, 1).length) * 1.6), 'left'); }
|
|
215
|
+
} else {
|
|
216
|
+
drawTile(pad, (Bh - tile) / 2);
|
|
217
|
+
const tx = pad + tile + 34 * u, nw = hasNum ? Math.min(340 * u, Bw * 0.36) : 0, tw = Bw - tx - pad - nw;
|
|
218
|
+
const tl = fitB(g, q.text || '', tw, 62 * u, 'PuHui-Bold', { maxLines: 2, weight: '600 ', min: 0.6 }); // 标题放不下就折两行,不再截掉后半句
|
|
219
|
+
const sl = q.sub ? fitB(g, q.sub, tw, 38 * u, 'PuHui-Medium', { maxLines: tl.lines.length > 1 ? 1 : 2, min: 0.75 }) : { lines: [], size: 0 };
|
|
220
|
+
const tH = tl.size + (tl.lines.length - 1) * tl.size * 1.15, blk = tH + (sl.lines.length ? 22 * u + sl.lines.length * sl.size * 1.4 : 0), y0 = (Bh - blk) / 2 + tl.size * 0.85;
|
|
221
|
+
g.font = `600 ${tl.size}px ${ZHB}`; g.fillStyle = '#f5f5f7'; tl.lines.forEach((ln, k) => g.fillText(ln, tx, y0 + k * tl.size * 1.15));
|
|
222
|
+
const ys = y0 + (tl.lines.length - 1) * tl.size * 1.15;
|
|
223
|
+
g.font = `400 ${sl.size}px ${ZH}`; g.fillStyle = 'rgba(235,235,245,0.66)'; sl.lines.forEach((ln, k) => g.fillText(ln, tx, ys + 22 * u + sl.size + k * sl.size * 1.4));
|
|
224
|
+
if (hasNum) num(Bw - pad, Bh / 2 + 20 * u, Math.min(96 * u, nw / Math.max(3, fmtNum(dd, 1).length) * 1.7), 'right');
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// 大数字一屏:at 落定(提前 0.9s 开始滚);数字上方可有小字 label,下方说明(text 或 sub)
|
|
228
|
+
function drawNumber(c, s, t, leave, ctx, shadowText) {
|
|
229
|
+
const { W, u } = ctx, q = s.q, nd = q.data || {}, k = MO.expoOut(clamp((t - s.start) / 0.9)), a = MO.appleOut(clamp((t - s.start - 0.12) / 0.3)) * (1 - leave);
|
|
230
|
+
const cap = q.text ?? q.sub;
|
|
231
|
+
c.save(); c.globalAlpha = a; shadowText(c); c.textAlign = 'center'; c.textBaseline = 'alphabetic';
|
|
232
|
+
if (leave > 0) { c.filter = `blur(${(16 * leave * u).toFixed(1)}px)`; }
|
|
233
|
+
const str = fmtNum(nd, k), full = fmtNum(nd, 1);
|
|
234
|
+
c.font = `600 ${220 * u}px ${SANSB}`; track(c, 220 * u, -0.03); let size = 220 * u; const fw = c.measureText(full).width; if (fw > W * 0.88) size *= W * 0.88 / fw;
|
|
235
|
+
c.font = `600 ${size}px ${SANSB}`; track(c, size, -0.03); c.fillStyle = '#fff';
|
|
236
|
+
const y = G.cy + size * 0.32 - (cap ? 30 * u : 0);
|
|
237
|
+
TY.tabular(c, str, W / 2, y, { align: 'center' });
|
|
238
|
+
c.letterSpacing = '0px';
|
|
239
|
+
if (nd.label) { c.font = `500 ${34 * u}px ${ZH}`; c.fillStyle = '#a7a7b4'; c.fillText(nd.label, W / 2, y - size * 0.85); }
|
|
240
|
+
if (cap) { c.font = `400 ${(ctx.portrait ? 46 : 44) * u}px ${ZH}`; c.fillStyle = 'rgba(235,235,245,0.78)'; TY.wrap(c, cap, W * 0.84).forEach((ln, i) => c.fillText(ln, W / 2, y + 100 * u + i * 60 * u)); }
|
|
241
|
+
c.restore();
|
|
242
|
+
}
|
|
243
|
+
})();
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// 示范 · 发布会式(Apple keynote / 产品发布 UI)「Plover 2 的三个功能」(8 秒三镜,产品与数字虚构)。语法卡:references/动画语法/t2_keynote_ui.md
|
|
2
|
+
// 预览 index.html?film=demos/t2_keynote_ui 渲染 render.py --film demos/t2_keynote_ui --out t2.mp4
|
|
3
|
+
// 光斑底只依赖全片时间 t,三个镜头之间无缝;卡片 → 全屏是共享元素展开(rect = 中间卡在镜头 2 末帧的屏幕矩形)。
|
|
4
|
+
window.PUNCH = 0;
|
|
5
|
+
window.SCENE_DIR = 'demos/t2_keynote_ui';
|
|
6
|
+
window.ERAS = [
|
|
7
|
+
{ id: 't2_s1', dur: 2.6 },
|
|
8
|
+
{ id: 't2_s2', dur: 3.0, transition: { type: 'blurPush', dur: 0.55 } },
|
|
9
|
+
{ id: 't2_s3', dur: 2.4, transition: { type: 'expandRect', dur: 0.6, rect: { x: 705.6, y: 252.6, w: 508.8, h: 614.8 }, r: 38 } },
|
|
10
|
+
];
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// t2 · 发布会式:「一个 AI 产品发布:三个功能卡片」
|
|
2
|
+
// 镜头 1(2.6s):深色底上柔和光斑缓慢漂移;眉题 → 产品名(模糊→清晰+上移,渐变字,光扫过)→ 一句话副标题。相机极慢推近。
|
|
3
|
+
// 本文件同时放 t2 共用的东西(window.T2):光斑底、字体、颜色。
|
|
4
|
+
(() => {
|
|
5
|
+
const { clamp, lerp } = U;
|
|
6
|
+
const W = 1920, H = 1080;
|
|
7
|
+
const BASE = '#050508';
|
|
8
|
+
const BLOBS = [ // 色相取 Stripe 渐变一系(紫/蓝/青)+ 一点暖色;周期避开 5s(HIG:避免 ~0.2Hz 持续摆动)
|
|
9
|
+
{ x: 430, y: 300, r: 760, col: [150, 90, 238], a: 0.75, ax: 220, ay: 120, period: 11, ph: 0 },
|
|
10
|
+
{ x: 1520, y: 260, r: 700, col: [56, 104, 255], a: 0.7, ax: 200, ay: 160, period: 13, ph: 2.1 },
|
|
11
|
+
{ x: 1320, y: 930, r: 560, col: [120, 214, 255], a: 0.5, ax: 260, ay: 100, period: 9.5, ph: 4 },
|
|
12
|
+
{ x: 520, y: 960, r: 520, col: [255, 96, 84], a: 0.42, ax: 180, ay: 90, period: 12, ph: 1.3 },
|
|
13
|
+
];
|
|
14
|
+
const SANS = '"Inter", "NotoSansSC"', ZH = '"NotoSansSC"';
|
|
15
|
+
// 光斑底:只依赖全片时间 t,三个镜头之间无缝(换镜头时背景不跳)
|
|
16
|
+
const bg = (c, t, { dim = 0.38 } = {}) => {
|
|
17
|
+
UI.mesh(c, t, { base: BASE, blobs: BLOBS, blur: 90, scale: 0.25, grain: 0.035, key: 't2mesh' });
|
|
18
|
+
// 中心压暗一点,给白字留对比
|
|
19
|
+
const g = c.createRadialGradient(W / 2, H / 2, 100, W / 2, H / 2, 1000); g.addColorStop(0, `rgba(0,0,0,${dim})`); g.addColorStop(1, 'rgba(0,0,0,0.1)');
|
|
20
|
+
c.fillStyle = g; c.fillRect(0, 0, W, H);
|
|
21
|
+
};
|
|
22
|
+
// 大字:字距收紧 −0.02em(苹果/Linear 官网 64px 以上 −0.015~−0.03em)
|
|
23
|
+
const track = (c, size, em = -0.02) => { c.letterSpacing = (size * em).toFixed(2) + 'px'; };
|
|
24
|
+
// 光斑漂移、卡片漂浮、图标律动都读全片时间 t。PHASE:沿用实验时这支片排在 8–16s 的相位,保持定稿画面的构图(换题目时删掉或随便改)
|
|
25
|
+
const PHASE = 8;
|
|
26
|
+
window.T2 = { bg, SANS, ZH, track, BASE, PHASE };
|
|
27
|
+
|
|
28
|
+
const DUR = 2.6;
|
|
29
|
+
SCENES['t2_s1'] = {
|
|
30
|
+
draw(c, lt, t) {
|
|
31
|
+
t += T2.PHASE;
|
|
32
|
+
bg(c, t);
|
|
33
|
+
// 相机匀速慢推:1.0 → 1.045(整镜线性,发布会片的慢推不减速,减速到停会让画面「死」掉)
|
|
34
|
+
const s = lerp(1, 1.045, lt / (DUR + 0.55));
|
|
35
|
+
c.save(); c.translate(W / 2, H / 2); c.scale(s, s); c.translate(-W / 2, -H / 2);
|
|
36
|
+
c.textAlign = 'center'; c.textBaseline = 'alphabetic';
|
|
37
|
+
// 眉题
|
|
38
|
+
c.font = `500 34px ${ZH}`; c.fillStyle = '#a7a7b4'; c.letterSpacing = '6px';
|
|
39
|
+
TY.blurIn(c, '全 新 发 布', W / 2, 372, MO.appleOut(MO.seg(lt, 0.1, 0.8)), { blur: 10, dy: 16 });
|
|
40
|
+
// 产品名:渐变字画进离屏 → 光扫过(source-atop 只亮在字上)→ 模糊→清晰贴回
|
|
41
|
+
const p = MO.appleOut(MO.seg(lt, 0.3, 1.3));
|
|
42
|
+
if (p > 0) {
|
|
43
|
+
const tx = UI.scratch('t2title', W, 420), g = tx.getContext('2d'); g.reset();
|
|
44
|
+
g.font = `600 220px ${SANS}`; track(g, 220); g.textAlign = 'center'; g.textBaseline = 'alphabetic';
|
|
45
|
+
const gr = g.createLinearGradient(600, 0, 1320, 0); gr.addColorStop(0, '#ffffff'); gr.addColorStop(0.55, '#ddd2ff'); gr.addColorStop(1, '#a8dcff');
|
|
46
|
+
g.fillStyle = gr; g.fillText('Plover 2', W / 2, 300);
|
|
47
|
+
UI.sheen(g, null, MO.seg(lt, 1.25, 2.15), { x0: 560, x1: 1360, width: 140, angle: -0.38, alpha: 0.85, comp: 'source-atop' });
|
|
48
|
+
c.save(); c.globalAlpha = clamp(p * 1.5); const b = (1 - p) * 26; if (b > 0.3) c.filter = `blur(${b.toFixed(1)}px)`;
|
|
49
|
+
c.drawImage(tx, 0, 620 - 300 + (1 - p) * 40); c.restore(); // 纹理基线 y=300 → 屏幕 y=620
|
|
50
|
+
}
|
|
51
|
+
// 副标题
|
|
52
|
+
c.font = `400 50px ${ZH}`; c.fillStyle = '#c9c9d4'; c.letterSpacing = '1px';
|
|
53
|
+
TY.blurIn(c, '会思考、会记忆、会动手的 AI 助手', W / 2, 740, MO.appleOut(MO.seg(lt, 0.7, 1.6)), { blur: 12, dy: 22 });
|
|
54
|
+
c.restore();
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
})();
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// t2 · 镜头 2(3.0s):三张毛玻璃功能卡片在 3D 空间入场(弹簧,bounce 0.15,错开 0.1s),绕 Y 轴转正;
|
|
2
|
+
// 卡上数字计数;整组持续漂浮;光扫过三张卡;最后中间卡「被选中」(放大,其余后退变暗),接共享元素展开。
|
|
3
|
+
(() => {
|
|
4
|
+
const { clamp, lerp } = U;
|
|
5
|
+
const W = 1920, H = 1080;
|
|
6
|
+
const CW = 480, CH_ = 580, GAP = 52, CY = 560, R = 36;
|
|
7
|
+
const CARDS = [
|
|
8
|
+
{ icon: 'wave', title: '实时语音', desc: '像打电话一样自然地打断和追问', num: 320, dec: 0, unit: 'ms', label: '端到端延迟' },
|
|
9
|
+
{ icon: 'memory', title: '长期记忆', desc: '记得你说过的每一个偏好', num: 100, dec: 0, unit: '万', label: 'tokens 上下文' },
|
|
10
|
+
{ icon: 'agent', title: '自主执行', desc: '拆解任务、调用工具、交付结果', num: 87, dec: 0, unit: '%', label: '任务一次完成率' },
|
|
11
|
+
];
|
|
12
|
+
const DUR = 3.0, FOCUS = 2.15; // 2.15s 起中间卡被选中
|
|
13
|
+
// 每张卡在 lt 时刻的状态(屏幕中心、旋转、缩放、透明),转场也要用中间卡的最终矩形
|
|
14
|
+
const state = (i, lt, t) => {
|
|
15
|
+
const t0 = 0.05 + i * 0.1; // 错开 0.1s
|
|
16
|
+
const sp = MO.spring(lt - t0, { duration: 0.75, bounce: 0.15 });
|
|
17
|
+
const f = MO.smooth(MO.seg(lt, FOCUS, FOCUS + 0.6));
|
|
18
|
+
const floatAmp = lerp(1, i === 1 ? 0 : 0.6, f); // 被选中的卡停止漂浮,好让转场从一个稳定的矩形展开
|
|
19
|
+
const cx = 960 + (i - 1) * (CW + GAP) + (i - 1) * 40 * f;
|
|
20
|
+
const cy = CY + (1 - sp) * 170 + MO.float(t, 7, 3.4 + i * 0.45, i * 2) * floatAmp;
|
|
21
|
+
const ry = (1 - sp) * (i - 1 || 0.001) * -0.55 + 0.06 * Math.sin(t * 0.9 + i) * floatAmp + (i - 1) * 0.12 * f;
|
|
22
|
+
const sc = (0.9 + 0.1 * sp) * (i === 1 ? lerp(1, 1.06, f) : lerp(1, 0.94, f));
|
|
23
|
+
const a = clamp((lt - t0) / 0.25) * (i === 1 ? 1 : lerp(1, 0.45, f));
|
|
24
|
+
return { cx, cy, ry, sc, a, t0 };
|
|
25
|
+
};
|
|
26
|
+
const cardRectAt = (lt, t) => { const s = state(1, lt, t); return { x: s.cx - CW * s.sc / 2, y: s.cy - CH_ * s.sc / 2, w: CW * s.sc, h: CH_ * s.sc }; };
|
|
27
|
+
|
|
28
|
+
SCENES['t2_s2'] = {
|
|
29
|
+
cardRectAt, CW, CH: CH_,
|
|
30
|
+
draw(c, lt, t) {
|
|
31
|
+
t += T2.PHASE;
|
|
32
|
+
const bgc = UI.scratch('t2bg', W, H), bgx = bgc.getContext('2d');
|
|
33
|
+
T2.bg(bgx, t); c.drawImage(bgc, 0, 0);
|
|
34
|
+
const bd = UI.backdrop(bgc, { blur: 40, key: 't2bd' });
|
|
35
|
+
// 先画两侧再画中间(中间卡在最上层)
|
|
36
|
+
[0, 2, 1].forEach(i => {
|
|
37
|
+
const S = state(i, lt, t); if (S.a <= 0) return;
|
|
38
|
+
const d = CARDS[i], cw = CW * S.sc, ch = CH_ * S.sc;
|
|
39
|
+
// 卡片纹理:毛玻璃(按卡片的屏幕位置取样背景)+内容
|
|
40
|
+
const tex = UI.scratch('t2card' + i, CW + 120, CH_ + 120), g = tex.getContext('2d'); g.reset();
|
|
41
|
+
const ox = 60, oy = 60;
|
|
42
|
+
UI.glass(g, { x: ox, y: oy, w: CW, h: CH_, r: R, bd, sample: { x: S.cx - cw / 2, y: S.cy - ch / 2, w: cw, h: ch }, tint: 0.075, stroke: 0.2, light: 0.14, shadow: false });
|
|
43
|
+
g.save(); g.translate(ox, oy);
|
|
44
|
+
// 图标底:同心圆角(子圆角 = 父圆角 − 内边距)
|
|
45
|
+
const pad = 44; g.fillStyle = 'rgba(255,255,255,0.09)'; g.beginPath(); g.roundRect(pad, pad, 96, 96, R - 14); g.fill();
|
|
46
|
+
UI.icon(g, d.icon, pad + 48, pad + 48, 60, '#f2f2f7', t);
|
|
47
|
+
g.textBaseline = 'alphabetic'; g.textAlign = 'left';
|
|
48
|
+
g.font = `600 50px ${T2.ZH}`; g.fillStyle = '#f5f5f7'; g.fillText(d.title, pad, 230);
|
|
49
|
+
g.font = `400 28px ${T2.ZH}`; g.fillStyle = 'rgba(235,235,245,0.62)'; g.fillText(d.desc, pad, 278);
|
|
50
|
+
// 分隔线
|
|
51
|
+
g.fillStyle = 'rgba(255,255,255,0.12)'; g.fillRect(pad, 330, CW - pad * 2, 1.5);
|
|
52
|
+
// 大数字:卡片落定后 0.25s 起计数 0.9s(easeOutExpo,最后一位慢慢落定),等宽排布不抖
|
|
53
|
+
const v = TY.count(lt, S.t0 + 0.35, 0.9, 0, d.num);
|
|
54
|
+
g.font = `600 132px ${T2.SANS}`; T2.track(g, 132, -0.03); g.fillStyle = '#ffffff';
|
|
55
|
+
const nw = TY.tabular(g, TY.fmt(v, d.dec), pad, 488);
|
|
56
|
+
g.letterSpacing = '0px'; g.font = `500 52px ${T2.SANS}`; g.fillStyle = 'rgba(235,235,245,0.7)'; g.fillText(d.unit, pad + nw + 10, 488);
|
|
57
|
+
g.font = `400 28px ${T2.ZH}`; g.fillStyle = 'rgba(235,235,245,0.55)'; g.fillText(d.label, pad, 535);
|
|
58
|
+
g.restore();
|
|
59
|
+
// 光扫过:1.2–2.0s 从左到右扫过整组(每张卡按自己的屏幕位置算进度,看起来是同一道光)
|
|
60
|
+
const sp = MO.seg(lt, 1.15, 2.05), gx = lerp(-200, W + 200, sp), lx = (gx - (S.cx - cw / 2)) / cw;
|
|
61
|
+
if (sp > 0 && sp < 1) UI.sheen(g, UI.rrPath(ox, oy, CW, CH_, R), clamp((lx + 0.35) / 1.7), { x0: ox, x1: ox + CW, width: 110, angle: -0.35, alpha: 0.22 });
|
|
62
|
+
// 阴影(按屏幕投影后的尺寸)+透视贴图
|
|
63
|
+
c.save(); c.globalAlpha = S.a;
|
|
64
|
+
UI.shadow(c, S.cx - cw / 2 + 10, S.cy - ch / 2 + 20, cw - 20, ch - 20, R, { blur: 80, oy: 40, alpha: 0.55 });
|
|
65
|
+
UI.persp(c, tex, { cx: S.cx, cy: S.cy, w: (CW + 120) * S.sc, h: (CH_ + 120) * S.sc, ry: S.ry, persp: 1800, strip: 3, shade: 0.4 });
|
|
66
|
+
c.restore();
|
|
67
|
+
});
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
})();
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// t2 · 镜头 3(2.4s,前 0.6s 是中间卡「展开成全屏」的共享元素转场):
|
|
2
|
+
// 我们「进到了长期记忆这张卡里」——底是同一块毛玻璃;超大数字(与卡片同口径,不重数);下方一块向后倾斜的对话面板,气泡依次弹起;最后产品落版。
|
|
3
|
+
(() => {
|
|
4
|
+
const { clamp, lerp } = U;
|
|
5
|
+
const W = 1920, H = 1080;
|
|
6
|
+
const PW = 1180, PH = 360;
|
|
7
|
+
SCENES['t2_s3'] = {
|
|
8
|
+
draw(c, lt, t) {
|
|
9
|
+
t += T2.PHASE;
|
|
10
|
+
const bgc = UI.scratch('t2bg3', W, H), bgx = bgc.getContext('2d');
|
|
11
|
+
T2.bg(bgx, t, { dim: 0.25 });
|
|
12
|
+
const bd = UI.backdrop(bgc, { blur: 40, key: 't2bd3' });
|
|
13
|
+
// 全屏毛玻璃 = 卡片的质地放大到全屏(与转场里展开的卡片同一种材料)
|
|
14
|
+
c.drawImage(bd, 0, 0, W, H); c.fillStyle = 'rgba(255,255,255,0.075)'; c.fillRect(0, 0, W, H);
|
|
15
|
+
const tg = c.createLinearGradient(0, 0, 0, H * 0.5); tg.addColorStop(0, 'rgba(255,255,255,0.10)'); tg.addColorStop(1, 'rgba(255,255,255,0)'); c.fillStyle = tg; c.fillRect(0, 0, W, H * 0.5);
|
|
16
|
+
// 卡片抬头留在左上(展开前它就在卡片的这个位置,观众知道自己在哪)
|
|
17
|
+
c.fillStyle = 'rgba(255,255,255,0.09)'; c.beginPath(); c.roundRect(120, 96, 84, 84, 20); c.fill();
|
|
18
|
+
UI.icon(c, 'memory', 162, 138, 52, '#f2f2f7', t);
|
|
19
|
+
c.font = `600 44px ${T2.ZH}`; c.fillStyle = '#f5f5f7'; c.textBaseline = 'alphabetic'; c.textAlign = 'left'; c.fillText('长期记忆', 232, 154);
|
|
20
|
+
// 超大数字:和卡片上同一个口径「100万」,不重新计数(卡片刚数过一遍,展开后再从 0 数会让叙事打嗝)——卡片里的数字放大成主角
|
|
21
|
+
const pin = MO.appleOut(MO.seg(lt, 0.0, 0.5));
|
|
22
|
+
c.save(); c.textBaseline = 'alphabetic'; c.textAlign = 'left';
|
|
23
|
+
c.font = `600 230px ${T2.SANS}`; T2.track(c, 230, -0.03); const w1 = c.measureText('100').width;
|
|
24
|
+
c.letterSpacing = '0px'; c.font = `600 150px ${T2.ZH}`; const w2 = c.measureText('万').width;
|
|
25
|
+
c.font = `500 56px ${T2.SANS}`; const w3 = c.measureText('tokens').width;
|
|
26
|
+
const x0 = W / 2 - (w1 + w2 + w3 + 34) / 2, by = 400 - (1 - pin) * 20;
|
|
27
|
+
c.font = `600 230px ${T2.SANS}`; T2.track(c, 230, -0.03); c.fillStyle = '#ffffff'; c.fillText('100', x0, by);
|
|
28
|
+
c.letterSpacing = '0px'; c.font = `600 150px ${T2.ZH}`; c.fillText('万', x0 + w1 + 6, by);
|
|
29
|
+
c.font = `500 56px ${T2.SANS}`; c.fillStyle = 'rgba(235,235,245,0.7)'; c.fillText('tokens', x0 + w1 + w2 + 34, by);
|
|
30
|
+
c.restore();
|
|
31
|
+
c.font = `400 34px ${T2.ZH}`; c.fillStyle = 'rgba(235,235,245,0.6)'; c.textAlign = 'center';
|
|
32
|
+
TY.blurIn(c, '上下文窗口 —— 一年的对话,它都记得', W / 2, 478, MO.appleOut(MO.seg(lt, 0.35, 0.95)), { blur: 8, dy: 14 });
|
|
33
|
+
// 对话面板(纹理 → 绕 X 轴后倾),气泡按 spring 依次弹起;面板整体缓慢上浮
|
|
34
|
+
const tex = UI.scratch('t2panel', PW, PH), g = tex.getContext('2d'); g.reset();
|
|
35
|
+
g.fillStyle = 'rgba(12,12,20,0.55)'; g.beginPath(); g.roundRect(0, 0, PW, PH, 30); g.fill();
|
|
36
|
+
g.strokeStyle = 'rgba(255,255,255,0.16)'; g.lineWidth = 2; g.stroke();
|
|
37
|
+
const bubble = (k, text, right, y, t0) => {
|
|
38
|
+
const s = MO.spring(lt - t0, { duration: 0.5, bounce: 0.15 }); if (lt <= t0) return;
|
|
39
|
+
g.save(); g.globalAlpha = clamp((lt - t0) / 0.2); g.font = `400 34px ${T2.ZH}`;
|
|
40
|
+
const tw = g.measureText(text).width, bw = tw + 64, bh = 74, bx = right ? PW - 48 - bw : 48, by = y + (1 - s) * 40;
|
|
41
|
+
g.translate(bx + (right ? bw : 0), by + bh); g.scale(lerp(0.85, 1, s), lerp(0.85, 1, s)); g.translate(-(bx + (right ? bw : 0)), -(by + bh));
|
|
42
|
+
g.fillStyle = right ? '#3d6bff' : 'rgba(255,255,255,0.14)'; g.beginPath(); g.roundRect(bx, by, bw, bh, 37); g.fill();
|
|
43
|
+
g.fillStyle = '#fff'; g.textBaseline = 'middle'; g.fillText(text, bx + 32, by + bh / 2 + 2); g.restore();
|
|
44
|
+
void k;
|
|
45
|
+
};
|
|
46
|
+
bubble(0, '还记得我上个月说的旅行计划吗?', true, 36, 0.45);
|
|
47
|
+
bubble(1, '记得:五月去京都,预算两万,不坐红眼航班。', false, 134, 0.8);
|
|
48
|
+
bubble(2, '那帮我订吧。', true, 232, 1.15);
|
|
49
|
+
// 输入中光标闪(持续小动作)
|
|
50
|
+
if (lt > 1.35) { g.fillStyle = `rgba(255,255,255,${0.35 + 0.35 * Math.sin(lt * 9)})`; for (let k = 0; k < 3; k++) { g.beginPath(); g.arc(90 + k * 26, 330, 7, 0, Math.PI * 2); g.fill(); } }
|
|
51
|
+
const pp = MO.spring(lt - 0.3, { duration: 0.8, bounce: 0 });
|
|
52
|
+
c.save(); c.globalAlpha = clamp((lt - 0.3) / 0.3);
|
|
53
|
+
UI.persp(c, tex, { cx: W / 2, cy: 725 + (1 - pp) * 120 - 8 * MO.smooth(clamp(lt / 2.4)), w: PW, h: PH, rx: lerp(0.55, 0.32, pp), persp: 1500, strip: 2 });
|
|
54
|
+
c.restore();
|
|
55
|
+
// 落版:品牌名 + 上线信息
|
|
56
|
+
c.textAlign = 'center'; c.font = `600 40px ${T2.SANS}`; T2.track(c, 40, -0.01); c.fillStyle = '#ffffff';
|
|
57
|
+
TY.blurIn(c, 'Plover 2 · 今天起可用', W / 2, 972, MO.appleOut(MO.seg(lt, 1.2, 1.8)), { blur: 10, dy: 12 }); // 1.8s 落定,停 0.6s;y=972 在字幕安全区内
|
|
58
|
+
c.letterSpacing = '0px';
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
})();
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# t2_keynote_ui · 发布会式界面与渐变动效
|
|
2
|
+
|
|
3
|
+
> 一句话语法:**深色底上缓慢漂移的彩色光斑,一屏一件事;字收紧、从模糊里浮出来;界面做成玻璃卡片在 3D 里用无回弹/轻回弹弹簧落位,数字计数、光扫过,转场靠「同一块玻璃」展开。**
|
|
4
|
+
>
|
|
5
|
+
> 示范片:`scripts/engine/demos/t2_keynote_ui/`(渲染 `render.py --film demos/t2_keynote_ui`)(8s,3 镜头)· 总览 `assets/动画语法/t2_keynote_ui_总览.jpg` · 代码 `scripts/engine/demos/t2_keynote_ui/`
|
|
6
|
+
|
|
7
|
+
## ① 适用场景
|
|
8
|
+
|
|
9
|
+
- **用**:产品/功能发布、版本更新、「三个新功能」、价格与参数公布、开场品牌片、视频里的「这个产品是什么」段落。口播是**名词+数字**(「Plover 2」「延迟 320 毫秒」「100 万 tokens」)时最合适:一句一屏,名词出现时字浮出,数字说到时落定。
|
|
10
|
+
- **用**:需要把「界面截图」讲得高级——把 UI 放进玻璃卡、放到 3D 里转正。
|
|
11
|
+
- **别用**:讲机制原理(玻璃和光斑不承载逻辑,用 t1);讲数据走势(用 t3);严肃事故/财报坏消息(这套语言自带「好消息」的情绪);内容本身没有一个能放大的「主角」时(只剩空镜光斑)。
|
|
12
|
+
|
|
13
|
+
## ② 画面构成
|
|
14
|
+
|
|
15
|
+
| 项 | 取值 | 依据 |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| 底色 | 近黑:本片 `#050508`;Apple `#000/#161617/#1d1d1f`;Linear `#08090a`(上一级 `#0f1011/#141516`,正文 `#f7f8f8`,描边 `#ffffff14`) | 两家官网 CSS 实测 |
|
|
18
|
+
| 光斑 | 4 团径向渐变 screen 叠加 → 1/4 尺寸上模糊 90px → 放大铺满 → 叠 3.5% 静态颗粒防色带。色相走 Stripe 一系:紫 `(150,90,238)`、蓝 `(56,104,255)`、青 `(120,214,255)`、一点暖红 `(255,96,84)`;中心再压一层 38% 黑径向渐变给白字让对比 | Stripe 2021 渐变 `#a960ee #ff333d #90e0ff #ffcb57` |
|
|
19
|
+
| 光斑运动 | 每团漂移振幅 90–260px、周期 9.5–13s,**避开 5s 周期**(HIG:避免 ~0.2Hz 持续摆动) | Apple HIG Motion |
|
|
20
|
+
| 玻璃卡 | 背景取样模糊 40px(Apple 导航 `saturate(180%) blur(20px)`,NN/g 说越大越好)+白 7.5% 填充+顶部 14% 白渐变受光带+1.5px 渐变描边(左上亮、右下暗)+大阴影(blur 70–80,y+30–40,α0.5) | apple.com globalheader.css;NN/g Glassmorphism |
|
|
21
|
+
| 圆角 | 卡片 36px;**同心圆角**:内部图标底圆角 = 36 − 内边距 14 = 22 | WWDC25「子圆角 = 父圆角 − padding」 |
|
|
22
|
+
| 字体 | Inter(SF Pro 最接近的开源字,Linear 用 Inter);中文思源黑。标题 600 字重、**大字号字距收紧 −0.02 ~ −0.03em**(`T2.track`) | Apple 96px −0.015em、Linear 64px −0.022em、OpenAI 64px −0.03em |
|
|
23
|
+
| 文字层级 | 白 `#f5f5f7` 主、`rgba(235,235,245,.6)` 次、`#a7a7b4` 眉题(字距 +6px);产品名用白→淡紫→淡青横向渐变 | Apple 官网层级惯例 |
|
|
24
|
+
| 构图 | 一屏一个焦点,居中对称;三卡等宽 480、间距 52;大数字占画面宽 55% 以上 | — |
|
|
25
|
+
| 形状语言 | 圆角矩形、胶囊、细线图标(圆头等线宽,SF Symbols 气质,`UI.icon`) | — |
|
|
26
|
+
|
|
27
|
+
## ③ 运动轨迹
|
|
28
|
+
|
|
29
|
+
- **弹簧(主力)**:SwiftUI duration+bounce 参数化,`MO.spring(t,{duration,bounce})`:mass=1、stiffness=(2π/d)²、damping=4π(1−bounce)/d → 阻尼比 ζ=1−bounce。**默认 bounce 0**(最通用);0.15 利落几乎不弹(本片卡片入场 d=0.75、气泡 d=0.5);0.3 明显弹;>0.4 对 UI 夸张。`.smooth/.snappy/.bouncy` 都是 d=0.5。
|
|
30
|
+
- **曲线(非弹簧)**:apple.com 导航 `.32s cubic-bezier(.4,0,.6,1)`;本片字的浮现用 CSS `ease`=`(.25,.1,.25,1)`(`MO.appleOut`);Linear 主力 ease-out-quad `(.25,.46,.45,.94)` .16s;Stripe 建议 <500ms、`(.2,1,.2,1)`。`MO.bezier(x1,y1,x2,y2)` 通吃。
|
|
31
|
+
- **字的入场**:模糊 18–26px → 0、上移 16–40px → 0、透明 → 1,0.7–1.0s(`TY.blurIn`)。眉题 → 产品名 → 副标题依次错开 0.2–0.4s。
|
|
32
|
+
- **卡片入场**:从下方 170px、绕 Y 轴 ±0.55rad(≈31°,两侧卡朝外)、缩放 0.9 → 弹簧落位;三张错开 0.1s。3D 用 `UI.persp`(竖条切片透视,persp 1800px;Stripe 用 600、Linear 用 1000)。
|
|
33
|
+
- **持续微动**:卡片漂浮 7px、周期 3.4/3.85/4.3s(两频叠加,`MO.float`)+ry 轻摆 ±0.06rad;光斑漂移;相机匀速慢推 1→1.045(**线性**,减速到停会让画面「死」)。
|
|
34
|
+
- **计数**:卡片落定后 0.25s 起 0.9s(同一个数只数一次——展开成全屏后沿用「100万」,不再从 0 重数);`easeOutExpo`(CountUp.js 默认缓动)——最后一位慢慢落定;数字**等宽排布**(`TY.tabular`,Canvas 不能开 tnum,不排会抖)。
|
|
35
|
+
- **光扫过**:斜 −20°、宽 110–140px 的亮带 0.8–0.9s 扫过;在文字离屏上用 `source-atop`(只亮在字上),在卡片上用 `lighter`;三张卡按各自屏幕位置算进度 = 同一道光。
|
|
36
|
+
|
|
37
|
+
## ④ 转场(常用 5 种)
|
|
38
|
+
|
|
39
|
+
1. **模糊推进(blurPush)**:旧画面缩到 0.92+模糊 24px+淡出,新画面从 1.06 带模糊落到 1.0 清晰,0.55s,`ease`。**底下先垫一层放大 1.08 的重模糊旧画面**,缩小的画面四周才不露黑边。本片镜头 1→2。
|
|
40
|
+
2. **共享元素展开(expandRect)**:(新画面第一帧就**不透明**装进卡片——卡片是半透明的,任何溶接都会看到新旧两层字叠在一起)被选中的卡片(先放大到 1.06、两侧卡后退变暗到 45%)从自己的屏幕矩形展开成全屏,圆角 38→0,弹簧 d=0.55 bounce 0;新画面一开始就按卡片大小缩放装在卡里。**选中卡在展开前停止漂浮**,转场才从一个稳定矩形起跳。本片镜头 2→3。
|
|
41
|
+
3. **匹配剪辑**:前后两镜同一物体同一位置(产品名 → 卡片标题位置)。
|
|
42
|
+
4. **遮罩擦除/光扫切**:一道光扫过时在光带后面换画面。
|
|
43
|
+
5. **折射代替淡入淡出**(Liquid Glass):元素出场时逐渐改变折射/模糊强度,而不是直接降透明度(本片字的模糊浮现即此思路)。
|
|
44
|
+
|
|
45
|
+
## ⑤ 节奏与文字
|
|
46
|
+
|
|
47
|
+
- **镜头时长**:发布会演讲一屏常 5–8s(Jobs 2007 iPhone 70 秒 9 屏≈7.8s/屏);产品片快剪 1.5–3s。本片 2.6/3.0/2.4s。
|
|
48
|
+
- **一屏一件事**:一个名词、一个数字、一张卡。密集段落后放一屏空的给观众喘气(Presentation Zen 说的 counterweight)。
|
|
49
|
+
- **与口播对位**:名词说出前 0.2–0.3s 字开始浮现(浮现本身要 0.7s,说到时正好清晰);数字在口播说出数值时**落定**——计数起点 = 说数字时刻 − 计数时长;三卡依次入场对应「第一、第二、第三」。
|
|
50
|
+
- **文字**:标题 ≤6 个字或一个产品名;副标题一句话 ≤16 字;卡片:标题 4 字+一行说明+一个大数字+单位(小一号、灰一级)。
|
|
51
|
+
|
|
52
|
+
## ⑥ 代码实现要点
|
|
53
|
+
|
|
54
|
+
> 收进 skill 后(2026-10-04 v0.4):本卡「新写」里的通用函数已统一进 `scripts/engine/lib/`(名字已换成统一后的 MO / CAM / DG / TY / CH / UI / CL / TOON),示范片自己的代码在 `scripts/engine/demos/t2_keynote_ui/`。库速查和「怎么为一段口播选语法」见 `references/09-视频动画语法.md`。
|
|
55
|
+
|
|
56
|
+
- 复用 skill:`engine.js`、`render.py`、`PAINT.cached/hex`、`U.rng`。
|
|
57
|
+
- 新写、现已统一进库 `lib/ui.js`(`window.UI`):`mesh`(光斑底)、`grainTex`、`backdrop`(模糊副本,毛玻璃取样)、`shadow`(只画影子)、`glass`(毛玻璃卡)、`sheen`(光扫过,`comp` 可选)、`persp`(绕 Y/X 轴伪 3D)、`icon`、`rr/rrPath`、`scratch`。
|
|
58
|
+
- `lib/motion.js`:`spring/smoothSpring/snappy/bouncy`、`bezier/appleOut/emphasized`、`float`;数字与文字在 `lib/typo.js`:`TY.count/tabular`、`TY.blurIn`(实验时叫 MO.textIn)。
|
|
59
|
+
- 转场(实验时在 `transitions_info.js`,现已进 `transitions.js`):`blurPush`、`expandRect`。
|
|
60
|
+
- 性能:每帧画一次光斑(1/4 尺寸)+一次背景模糊副本,均 40–60ms/帧(qa 带 GPU flush);8 秒 60fps 渲完约 1 分钟。
|
|
61
|
+
- 坑(已修进库里):①**blur 会从画布外拉进透明像素**,画进不清空的离屏会逐帧累积,qa 报确定性 ✗——先垫一层不模糊原图;②透视切片相邻重叠 0.75px 在半透明纹理上出一条条纹——切片边界取整像素首尾相接,并先画进离屏再整体按 alpha 贴回;③`UI.sheen` 内部设了合成模式,会盖掉外面设的 `source-atop`,所以做成参数。
|
|
62
|
+
|
|
63
|
+
## ⑦ 代表作品与一手参考
|
|
64
|
+
|
|
65
|
+
- 代表作:Apple iPhone/Apple Intelligence 发布片与 apple.com 产品页;OpenAI GPT-4o / o 系列发布视频;Linear 官网与 Linear Release 视频;Stripe 2020–21 官网渐变。
|
|
66
|
+
- https://developer.apple.com/videos/play/wwdc2023/10158/ (Animate with springs:duration/bounce)
|
|
67
|
+
- https://developer.apple.com/videos/play/wwdc2018/803/ (Designing Fluid Interfaces:从 100% 阻尼起步)
|
|
68
|
+
- https://developer.apple.com/videos/play/wwdc2025/219/ (Meet Liquid Glass)
|
|
69
|
+
- https://developer.apple.com/design/human-interface-guidelines/materials 、/motion 、/typography
|
|
70
|
+
- https://www.nngroup.com/articles/glassmorphism/
|
|
71
|
+
- https://web.archive.org/web/20211015000000/https://stripe.com/ (渐变色值)
|
|
72
|
+
- https://stripe.com/blog/connect-front-end-experience (<500ms、曲线)
|
|
73
|
+
- https://linear.app/now/how-we-redesigned-the-linear-ui (LCH 色彩、Inter)
|
|
74
|
+
|
|
75
|
+
## ⑧ 最容易做错的 3 件事
|
|
76
|
+
|
|
77
|
+
1. **玻璃后面没东西。** 毛玻璃只模糊它后面的内容;深色纯底上的「玻璃」就是一块灰矩形。先画有色彩、有起伏的光斑,再按卡片屏幕位置取样模糊。
|
|
78
|
+
2. **弹簧太弹、动作太多。** bounce 默认 0,入场最多 0.15–0.3;>0.4 立刻廉价。一次只动一组东西。
|
|
79
|
+
3. **大字没收紧字距、光斑颜色发脏。** 64px 以上 −0.015~−0.03em;光斑每团颜色各占一块(screen 叠加+大模糊),别把多色线性平均成灰紫泥。
|
|
80
|
+
|
|
81
|
+
## qa 数字(skill `scripts/qa.py`,2026-10-04,审片前)
|
|
82
|
+
|
|
83
|
+
| 镜头 | 运动% | 静止帧对% | 跳变 | 均/峰 ms | 确定性 |
|
|
84
|
+
|---|---|---|---|---|---|
|
|
85
|
+
| t2_s1 | 0.58 | 35.4 | 0 | 39.8/51.4 | ✓ |
|
|
86
|
+
| t2_s2 | 2.62 | 8.5 | 0 | 60.2/65.0 | ✓ |
|
|
87
|
+
| t2_s3 | 1.84 | 9.6 | 0 | 44.3/51.0 | ✓ |
|
|
88
|
+
|
|
89
|
+
说明:t2_s1 的「静止帧对 35%」不是卡——光斑漂移和 4.5% 的慢推每帧变化低于 qa 的像素阈值(>12 级),隔 1 秒取两帧(成片 1.6s vs 2.6s)有 26.8% 的像素变化超过 12 级、78% 超过 4 级;这类「慢呼吸」画面要另用间隔帧差判断。
|
|
90
|
+
|
|
91
|
+
## 修订(独立审片 → 改一轮,2026-10-04)
|
|
92
|
+
|
|
93
|
+
| 审片意见 | 改法 |
|
|
94
|
+
|---|---|
|
|
95
|
+
| 🔴 2.55–2.75s、5.6–5.85s 转场四周露黑边 | blurPush / expandRect 底下垫一层放大 1.08、模糊 30px 的旧画面 |
|
|
96
|
+
| 🔴 卡片展开时「长期记忆」「100万」两层叠影;展开后又从 0 重数 | 新画面第一帧不透明装进卡片;全屏页沿用「100万 tokens」同一口径,不重数 |
|
|
97
|
+
| 🔴 6.95s 计数一帧从 999,023 跳到 1,000,000,「tokens」被挤 | 随上条删掉重复计数;单位按三段实测宽度排版,不再贴字 |
|
|
98
|
+
| 🟡 落版只出现 0.4s、y≈1020 出安全区 | 落版 1.2–1.8s 浮现、停 0.6s,y=972;对话面板整体上移 65px |
|
|
99
|
+
| ⚪ 卡片「100万」与全屏「1,000,000」口径不一 | 统一为「100万」 |
|
|
100
|
+
|
|
101
|
+
修订后 qa:
|
|
102
|
+
|
|
103
|
+
| 镜头 | 运动% | 静止帧对% | 跳变 | 均/峰 ms | 确定性 |
|
|
104
|
+
|---|---|---|---|---|---|
|
|
105
|
+
| t2_s1 | 0.58 | 35.4 | 0 | 39.5/51.6 | ✓ |
|
|
106
|
+
| t2_s2 | 2.62 | 8.5 | 0 | 57.2/59.9 | ✓ |
|
|
107
|
+
| t2_s3 | 0.97 | 15.4 | 0 | 43.0/48.7 | ✓ |
|
|
108
|
+
|
|
109
|
+
(转场冒烟:blurPush 最慢约 137ms/帧,含两次全屏模糊。)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"grammar": "t3_finance_chart",
|
|
3
|
+
"duration": 7,
|
|
4
|
+
"fps": 30,
|
|
5
|
+
"width": 1920,
|
|
6
|
+
"height": 1080,
|
|
7
|
+
"data": {
|
|
8
|
+
"title": "英伟达:五个财年营收涨到原来的 7.8 倍",
|
|
9
|
+
"unit": "年营收,十亿美元",
|
|
10
|
+
"source": "来源:英伟达 2021–2025 财年 10-K 年报(财年截至次年 1 月)",
|
|
11
|
+
"chart": "bar",
|
|
12
|
+
"decimals": 1,
|
|
13
|
+
"series": [
|
|
14
|
+
{ "label": "FY2021", "value": 16.68 },
|
|
15
|
+
{ "label": "FY2022", "value": 26.91 },
|
|
16
|
+
{ "label": "FY2023", "value": 26.97 },
|
|
17
|
+
{ "label": "FY2024", "value": 60.92 },
|
|
18
|
+
{ "label": "FY2025", "value": 130.50 }
|
|
19
|
+
],
|
|
20
|
+
"highlight": { "index": 4, "text": "7.8 倍", "sub": "130.5 ÷ 16.7" }
|
|
21
|
+
},
|
|
22
|
+
"cues": [
|
|
23
|
+
{ "at": 0.0, "kind": "title" },
|
|
24
|
+
{ "at": 1.2, "kind": "bar" },
|
|
25
|
+
{ "at": 4.4, "kind": "highlight" }
|
|
26
|
+
]
|
|
27
|
+
}
|