@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.
Files changed (782) hide show
  1. package/bin/server.js +325 -0
  2. package/data/columns.json +230 -0
  3. package/engine/.claude/skills/weilanx-creator-blackgold-video/SKILL.md +116 -0
  4. 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
  5. 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
  6. 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
  7. 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
  8. package/engine/.claude/skills/weilanx-creator-blackgold-video/scripts/qa.mjs +98 -0
  9. package/engine/.claude/skills/weilanx-creator-blackgold-video/scripts/subtitles.mjs +53 -0
  10. package/engine/.claude/skills/weilanx-creator-desk-video/SKILL.md +124 -0
  11. package/engine/.claude/skills/weilanx-creator-desk-video/references//345/267/245/347/250/213/346/250/241/346/235/277.md +278 -0
  12. package/engine/.claude/skills/weilanx-creator-desk-video/references//347/224/273/351/235/242/351/205/215/346/226/271.md +94 -0
  13. package/engine/.claude/skills/weilanx-creator-distill-video/SKILL.md +98 -0
  14. package/engine/.claude/skills/weilanx-creator-distill-video/references//346/213/206/350/247/243/346/226/271/346/263/225.md +42 -0
  15. 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
  16. package/engine/.claude/skills/weilanx-creator-distill-video/scripts/analyze.py +211 -0
  17. package/engine/.claude/skills/weilanx-creator-distill-video/scripts/strip.py +52 -0
  18. package/engine/.claude/skills/weilanx-creator-fps-video/SKILL.md +155 -0
  19. 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
  20. 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
  21. package/engine/.claude/skills/weilanx-creator-fps-video/references//346/225/260/346/215/256/345/244/215/347/233/230.md +36 -0
  22. 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
  23. 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
  24. package/engine/.claude/skills/weilanx-creator-fps-video/scripts/qa.mjs +94 -0
  25. package/engine/.claude/skills/weilanx-creator-fps-video/scripts/stats.py +57 -0
  26. package/engine/.claude/skills/weilanx-creator-fps-video/scripts/subtitle-doc.mjs +37 -0
  27. package/engine/.claude/skills/weilanx-creator-gilded-video/SKILL.md +102 -0
  28. 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
  29. 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
  30. 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
  31. package/engine/.claude/skills/weilanx-creator-gilded-video/scripts/beats.py +99 -0
  32. package/engine/.claude/skills/weilanx-creator-lamplight-video/SKILL.md +124 -0
  33. 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
  34. 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
  35. 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
  36. 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
  37. package/engine/.claude/skills/weilanx-creator-lamplight-video/scripts/beat_accents.py +45 -0
  38. package/engine/.claude/skills/weilanx-creator-lamplight-video/scripts/shot_frames.py +17 -0
  39. package/engine/.claude/skills/weilanx-creator-lamplight-video/scripts/subtitle_doc.py +29 -0
  40. package/engine/.claude/skills/weilanx-creator-lamplight-video/scripts/timeline_lib.py +57 -0
  41. package/engine/.claude/skills/weilanx-creator-pixel-video/SKILL.md +132 -0
  42. package/engine/.claude/skills/weilanx-creator-vox-video/SKILL.md +124 -0
  43. package/engine/.claude/skills/weilanx-creator-vox-video/references//347/224/273/351/235/242.md +63 -0
  44. package/engine/.claude/skills/weilanx-creator-vox-video/references//347/264/240/346/235/220.md +35 -0
  45. 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
  46. package/engine/.claude/skills/weilanx-creator-vox-video/references//351/205/215/344/271/220.md +37 -0
  47. package/engine/.claude/skills/weilanx-creator-vox-video/scripts/commons.py +67 -0
  48. package/engine/.claude/skills/weilanx-creator-vox-video/scripts/tts_expressive.py +71 -0
  49. package/engine/.claude/skills/weilanx-creator-vox-video/scripts/voice_stats.py +54 -0
  50. package/engine/AGENTS.md +118 -0
  51. package/engine/CLAUDE.md +1 -0
  52. package/engine/LICENSE +21 -0
  53. package/engine/README.md +282 -0
  54. package/engine/README.zh-CN.md +282 -0
  55. package/engine/audio/bgm.mjs +191 -0
  56. package/engine/audio/episodes/ep00-demo.mjs +10 -0
  57. package/engine/audio/episodes/ep01-agent.mjs +22 -0
  58. package/engine/audio/episodes/ep02-llm.mjs +20 -0
  59. package/engine/audio/episodes/ep03-cc.mjs +19 -0
  60. package/engine/audio/episodes/ep04-opus55.mjs +15 -0
  61. package/engine/audio/episodes/ep05-token.mjs +18 -0
  62. package/engine/audio/episodes/ep06-context.mjs +16 -0
  63. package/engine/audio/episodes/ep07-agent.mjs +16 -0
  64. package/engine/audio/episodes/ep08-hallucination.mjs +15 -0
  65. package/engine/audio/episodes/ep09-prompt.mjs +16 -0
  66. package/engine/audio/episodes/ep10-multimodal.mjs +16 -0
  67. package/engine/audio/episodes/ep11-mcp.mjs +17 -0
  68. package/engine/audio/episodes/ep12-skill.mjs +16 -0
  69. package/engine/audio/episodes/ep13-subagent.mjs +17 -0
  70. package/engine/audio/episodes/ep14-agent-permission.mjs +16 -0
  71. package/engine/audio/episodes/ep15-prompt-injection.mjs +17 -0
  72. package/engine/audio/episodes/ep16-agent-done.mjs +16 -0
  73. package/engine/audio/episodes/ep17-sycophancy.mjs +16 -0
  74. package/engine/audio/episodes/ep18-ai-history.mjs +323 -0
  75. package/engine/audio/episodes/ep19-apple-history.mjs +311 -0
  76. package/engine/audio/episodes/ep20-nvidia-history.mjs +276 -0
  77. package/engine/audio/episodes/ep21-nobel-physics.mjs +151 -0
  78. package/engine/audio/episodes/ep22-nobel-chemistry.mjs +143 -0
  79. package/engine/audio/episodes/ep23-wheat-chessboard.mjs +23 -0
  80. package/engine/audio/episodes/ep24-birthday-paradox.mjs +25 -0
  81. package/engine/audio/episodes/ep25-behind-cover.mjs +11 -0
  82. package/engine/audio/episodes/ep26-opus-video.mjs +14 -0
  83. package/engine/audio/episodes/ep27-opus-video-full.mjs +17 -0
  84. package/engine/audio/episodes/ep28-express-relay.mjs +16 -0
  85. package/engine/audio/episodes/ep29-footsteps.mjs +14 -0
  86. package/engine/audio/episodes/ep30-tang-divorce.mjs +16 -0
  87. package/engine/audio/episodes/ep31-rigged.mjs +11 -0
  88. package/engine/audio/episodes/ep32-love-lasts.mjs +36 -0
  89. package/engine/audio/episodes/ep33-teammates.mjs +11 -0
  90. package/engine/audio/episodes/ep34-song-takeout.mjs +16 -0
  91. package/engine/audio/episodes/ep35-choke.mjs +11 -0
  92. package/engine/audio/episodes/ep36-boxed-pigs.mjs +43 -0
  93. package/engine/audio/episodes/ep37-bhop.mjs +11 -0
  94. package/engine/audio/episodes/ep38-butterfly.mjs +43 -0
  95. package/engine/audio/episodes/ep39-latency.mjs +11 -0
  96. package/engine/audio/episodes/ep40-counter-strafe.mjs +11 -0
  97. package/engine/audio/episodes/ep41-flying-money.mjs +16 -0
  98. package/engine/audio/episodes/ep42-tap-fire.mjs +11 -0
  99. package/engine/audio/episodes/ep43-one-more-game.mjs +11 -0
  100. package/engine/audio/episodes/ep45-callouts.mjs +11 -0
  101. package/engine/audio/episodes/ep46-song-ice.mjs +16 -0
  102. package/engine/audio/episodes/ep47-spotlight.mjs +11 -0
  103. package/engine/audio/episodes/ep48-jiggle-peek.mjs +11 -0
  104. package/engine/audio/episodes/ep49-ad-strafe.mjs +11 -0
  105. package/engine/audio/episodes/ep50-late-night.mjs +11 -0
  106. package/engine/audio/episodes/ep51-practice.mjs +11 -0
  107. package/engine/audio/episodes/library-halftone.mjs +32 -0
  108. package/engine/audio/music.mjs +45 -0
  109. package/engine/audio/score.mjs +209 -0
  110. package/engine/audio/sfx-lamplight.mjs +54 -0
  111. package/engine/audio/sfx-tactical.mjs +76 -0
  112. package/engine/audio/synth.mjs +510 -0
  113. package/engine/package-lock.json +5177 -0
  114. package/engine/package.json +26 -0
  115. package/engine/public/fonts/LICENSES.md +12 -0
  116. package/engine/public/fonts/ZCOOLKuaiLe-Regular.ttf +0 -0
  117. package/engine/public/fonts/vox/Anton-400.woff +0 -0
  118. package/engine/public/fonts/vox/Caveat-600.woff +0 -0
  119. package/engine/public/fonts/vox/EBGaramond-400.woff +0 -0
  120. package/engine/public/fonts/vox/EBGaramond-600.woff +0 -0
  121. package/engine/public/fonts/vox/LICENSES.md +10 -0
  122. package/engine/public/fonts/vox/NotoSansSC-900.woff +0 -0
  123. package/engine/public/fonts/vox/OFL.txt +94 -0
  124. package/engine/public/fonts/vox/PlayfairDisplay-700.woff +0 -0
  125. package/engine/public/fonts/vox/PlayfairDisplay-700i.woff +0 -0
  126. package/engine/public/music/README.md +16 -0
  127. package/engine/remotion.config.ts +5 -0
  128. package/engine/scripts/ep-dir.sh +49 -0
  129. package/engine/scripts/export.sh +28 -0
  130. package/engine/scripts/mix-stems.sh +17 -0
  131. package/engine/scripts/srt2json.mjs +29 -0
  132. package/engine/src/Root.tsx +244 -0
  133. package/engine/src/episodes/ep00-demo/Ep00Demo.tsx +97 -0
  134. package/engine/src/episodes/ep00-demo/components/AdjustPanel.tsx +68 -0
  135. package/engine/src/episodes/ep00-demo/components/Buddy.tsx +58 -0
  136. package/engine/src/episodes/ep00-demo/components/EditorUI.tsx +39 -0
  137. package/engine/src/episodes/ep00-demo/components/Icons.tsx +50 -0
  138. package/engine/src/episodes/ep00-demo/components/MediaPanel.tsx +129 -0
  139. package/engine/src/episodes/ep00-demo/components/Outro.tsx +123 -0
  140. package/engine/src/episodes/ep00-demo/components/Phone.tsx +88 -0
  141. package/engine/src/episodes/ep00-demo/components/SceneArt.tsx +196 -0
  142. package/engine/src/episodes/ep00-demo/components/Timeline.tsx +206 -0
  143. package/engine/src/episodes/ep00-demo/lib/buddy.ts +147 -0
  144. package/engine/src/episodes/ep00-demo/lib/camera.ts +55 -0
  145. package/engine/src/episodes/ep00-demo/lib/state.ts +231 -0
  146. package/engine/src/episodes/ep00-demo/lib/timeline.ts +98 -0
  147. package/engine/src/episodes/ep01-agent/Ep01Agent.tsx +16 -0
  148. package/engine/src/episodes/ep01-agent/cues.json +530 -0
  149. package/engine/src/episodes/ep01-agent/cues.ts +8 -0
  150. package/engine/src/episodes/ep01-agent/scenes/finale.tsx +174 -0
  151. package/engine/src/episodes/ep01-agent/scenes/index.ts +28 -0
  152. package/engine/src/episodes/ep01-agent/scenes/intro.tsx +235 -0
  153. package/engine/src/episodes/ep01-agent/scenes/loop.tsx +284 -0
  154. package/engine/src/episodes/ep01-agent/scenes/safety.tsx +249 -0
  155. package/engine/src/episodes/ep01-agent/scenes/setup.tsx +250 -0
  156. package/engine/src/episodes/ep02-llm/Ep02Llm.tsx +17 -0
  157. package/engine/src/episodes/ep02-llm/cues.json +254 -0
  158. package/engine/src/episodes/ep02-llm/cues.ts +5 -0
  159. package/engine/src/episodes/ep02-llm/scenes/index.ts +21 -0
  160. package/engine/src/episodes/ep02-llm/scenes/part1.tsx +444 -0
  161. package/engine/src/episodes/ep02-llm/scenes/part2.tsx +303 -0
  162. package/engine/src/episodes/ep03-cc/Ep03Cc.tsx +30 -0
  163. package/engine/src/episodes/ep03-cc/cues.json +692 -0
  164. package/engine/src/episodes/ep03-cc/cues.ts +5 -0
  165. package/engine/src/episodes/ep03-cc/scenes/aroll.tsx +265 -0
  166. package/engine/src/episodes/ep03-cc/scenes/broll1.tsx +343 -0
  167. package/engine/src/episodes/ep03-cc/scenes/broll2.tsx +571 -0
  168. package/engine/src/episodes/ep03-cc/scenes/index.ts +30 -0
  169. package/engine/src/episodes/ep04-opus55/Ep04Opus55.tsx +30 -0
  170. package/engine/src/episodes/ep04-opus55/cues.json +368 -0
  171. package/engine/src/episodes/ep04-opus55/cues.ts +5 -0
  172. package/engine/src/episodes/ep04-opus55/scenes/index.ts +25 -0
  173. package/engine/src/episodes/ep04-opus55/scenes/part1.tsx +487 -0
  174. package/engine/src/episodes/ep04-opus55/scenes/part2.tsx +282 -0
  175. package/engine/src/episodes/ep05-token/Ep05Token.tsx +32 -0
  176. package/engine/src/episodes/ep05-token/cues.json +314 -0
  177. package/engine/src/episodes/ep05-token/cues.ts +5 -0
  178. package/engine/src/episodes/ep05-token/scenes/index.ts +22 -0
  179. package/engine/src/episodes/ep05-token/scenes/part1.tsx +355 -0
  180. package/engine/src/episodes/ep05-token/scenes/part2.tsx +385 -0
  181. package/engine/src/episodes/ep06-context/Ep06Context.tsx +32 -0
  182. package/engine/src/episodes/ep06-context/Ep06ContextTall.tsx +35 -0
  183. package/engine/src/episodes/ep06-context/cues.json +332 -0
  184. package/engine/src/episodes/ep06-context/cues.ts +5 -0
  185. package/engine/src/episodes/ep06-context/scenes/index.ts +20 -0
  186. package/engine/src/episodes/ep06-context/scenes/part1.tsx +360 -0
  187. package/engine/src/episodes/ep06-context/scenes/part2.tsx +256 -0
  188. package/engine/src/episodes/ep06-context/tall/Cover.tsx +69 -0
  189. package/engine/src/episodes/ep06-context/tall/index.ts +20 -0
  190. package/engine/src/episodes/ep06-context/tall/part1.tsx +374 -0
  191. package/engine/src/episodes/ep06-context/tall/part2.tsx +272 -0
  192. package/engine/src/episodes/ep07-agent/Ep07Agent.tsx +32 -0
  193. package/engine/src/episodes/ep07-agent/Ep07AgentTall.tsx +35 -0
  194. package/engine/src/episodes/ep07-agent/cues.json +302 -0
  195. package/engine/src/episodes/ep07-agent/cues.ts +5 -0
  196. package/engine/src/episodes/ep07-agent/scenes/index.ts +18 -0
  197. package/engine/src/episodes/ep07-agent/scenes/part1.tsx +307 -0
  198. package/engine/src/episodes/ep07-agent/scenes/part2.tsx +188 -0
  199. package/engine/src/episodes/ep07-agent/tall/Cover.tsx +59 -0
  200. package/engine/src/episodes/ep07-agent/tall/index.ts +18 -0
  201. package/engine/src/episodes/ep07-agent/tall/part1.tsx +306 -0
  202. package/engine/src/episodes/ep07-agent/tall/part2.tsx +187 -0
  203. package/engine/src/episodes/ep08-hallucination/Ep08Hallucination.tsx +32 -0
  204. package/engine/src/episodes/ep08-hallucination/Ep08HallucinationTall.tsx +35 -0
  205. package/engine/src/episodes/ep08-hallucination/cues.json +314 -0
  206. package/engine/src/episodes/ep08-hallucination/cues.ts +5 -0
  207. package/engine/src/episodes/ep08-hallucination/scenes/index.ts +19 -0
  208. package/engine/src/episodes/ep08-hallucination/scenes/part1.tsx +282 -0
  209. package/engine/src/episodes/ep08-hallucination/scenes/part2.tsx +246 -0
  210. package/engine/src/episodes/ep08-hallucination/tall/Cover.tsx +63 -0
  211. package/engine/src/episodes/ep08-hallucination/tall/index.ts +19 -0
  212. package/engine/src/episodes/ep08-hallucination/tall/part1.tsx +273 -0
  213. package/engine/src/episodes/ep08-hallucination/tall/part2.tsx +247 -0
  214. package/engine/src/episodes/ep09-prompt/Ep09Prompt.tsx +35 -0
  215. package/engine/src/episodes/ep09-prompt/cues.json +308 -0
  216. package/engine/src/episodes/ep09-prompt/cues.ts +5 -0
  217. package/engine/src/episodes/ep09-prompt/scenes/Cover.tsx +65 -0
  218. package/engine/src/episodes/ep09-prompt/scenes/index.ts +21 -0
  219. package/engine/src/episodes/ep09-prompt/scenes/part1.tsx +315 -0
  220. package/engine/src/episodes/ep09-prompt/scenes/part2.tsx +320 -0
  221. package/engine/src/episodes/ep10-multimodal/Ep10Multimodal.tsx +35 -0
  222. package/engine/src/episodes/ep10-multimodal/cues.json +308 -0
  223. package/engine/src/episodes/ep10-multimodal/cues.ts +5 -0
  224. package/engine/src/episodes/ep10-multimodal/scenes/Cover.tsx +53 -0
  225. package/engine/src/episodes/ep10-multimodal/scenes/index.ts +21 -0
  226. package/engine/src/episodes/ep10-multimodal/scenes/part1.tsx +343 -0
  227. package/engine/src/episodes/ep10-multimodal/scenes/part2.tsx +437 -0
  228. package/engine/src/episodes/ep11-mcp/Ep11Mcp.tsx +35 -0
  229. package/engine/src/episodes/ep11-mcp/cues.json +332 -0
  230. package/engine/src/episodes/ep11-mcp/cues.ts +5 -0
  231. package/engine/src/episodes/ep11-mcp/scenes/Cover.tsx +67 -0
  232. package/engine/src/episodes/ep11-mcp/scenes/index.ts +21 -0
  233. package/engine/src/episodes/ep11-mcp/scenes/part1.tsx +336 -0
  234. package/engine/src/episodes/ep11-mcp/scenes/part2.tsx +327 -0
  235. package/engine/src/episodes/ep12-skill/Ep12Skill.tsx +35 -0
  236. package/engine/src/episodes/ep12-skill/cues.json +332 -0
  237. package/engine/src/episodes/ep12-skill/cues.ts +5 -0
  238. package/engine/src/episodes/ep12-skill/scenes/Cover.tsx +55 -0
  239. package/engine/src/episodes/ep12-skill/scenes/index.ts +21 -0
  240. package/engine/src/episodes/ep12-skill/scenes/part1.tsx +368 -0
  241. package/engine/src/episodes/ep12-skill/scenes/part2.tsx +274 -0
  242. package/engine/src/episodes/ep13-subagent/Ep13Subagent.tsx +35 -0
  243. package/engine/src/episodes/ep13-subagent/cues.json +344 -0
  244. package/engine/src/episodes/ep13-subagent/cues.ts +5 -0
  245. package/engine/src/episodes/ep13-subagent/scenes/Cover.tsx +61 -0
  246. package/engine/src/episodes/ep13-subagent/scenes/index.ts +21 -0
  247. package/engine/src/episodes/ep13-subagent/scenes/part1.tsx +383 -0
  248. package/engine/src/episodes/ep13-subagent/scenes/part2.tsx +317 -0
  249. package/engine/src/episodes/ep14-agent-permission/Ep14AgentPermission.tsx +35 -0
  250. package/engine/src/episodes/ep14-agent-permission/cues.json +326 -0
  251. package/engine/src/episodes/ep14-agent-permission/cues.ts +5 -0
  252. package/engine/src/episodes/ep14-agent-permission/scenes/Cover.tsx +62 -0
  253. package/engine/src/episodes/ep14-agent-permission/scenes/index.ts +20 -0
  254. package/engine/src/episodes/ep14-agent-permission/scenes/part1.tsx +302 -0
  255. package/engine/src/episodes/ep14-agent-permission/scenes/part2.tsx +309 -0
  256. package/engine/src/episodes/ep15-prompt-injection/Ep15PromptInjection.tsx +35 -0
  257. package/engine/src/episodes/ep15-prompt-injection/cues.json +302 -0
  258. package/engine/src/episodes/ep15-prompt-injection/cues.ts +5 -0
  259. package/engine/src/episodes/ep15-prompt-injection/scenes/Cover.tsx +60 -0
  260. package/engine/src/episodes/ep15-prompt-injection/scenes/index.ts +20 -0
  261. package/engine/src/episodes/ep15-prompt-injection/scenes/part1.tsx +307 -0
  262. package/engine/src/episodes/ep15-prompt-injection/scenes/part2.tsx +253 -0
  263. package/engine/src/episodes/ep16-agent-done/Ep16AgentDone.tsx +35 -0
  264. package/engine/src/episodes/ep16-agent-done/cues.json +320 -0
  265. package/engine/src/episodes/ep16-agent-done/cues.ts +5 -0
  266. package/engine/src/episodes/ep16-agent-done/scenes/Cover.tsx +66 -0
  267. package/engine/src/episodes/ep16-agent-done/scenes/index.ts +19 -0
  268. package/engine/src/episodes/ep16-agent-done/scenes/part1.tsx +271 -0
  269. package/engine/src/episodes/ep16-agent-done/scenes/part2.tsx +253 -0
  270. package/engine/src/episodes/ep17-sycophancy/Ep17Sycophancy.tsx +35 -0
  271. package/engine/src/episodes/ep17-sycophancy/cues.json +320 -0
  272. package/engine/src/episodes/ep17-sycophancy/cues.ts +5 -0
  273. package/engine/src/episodes/ep17-sycophancy/scenes/Cover.tsx +60 -0
  274. package/engine/src/episodes/ep17-sycophancy/scenes/index.ts +19 -0
  275. package/engine/src/episodes/ep17-sycophancy/scenes/part1.tsx +236 -0
  276. package/engine/src/episodes/ep17-sycophancy/scenes/part2.tsx +250 -0
  277. package/engine/src/episodes/ep18-ai-history/Cover.tsx +60 -0
  278. package/engine/src/episodes/ep18-ai-history/CoverTall.tsx +29 -0
  279. package/engine/src/episodes/ep18-ai-history/Ep18AiHistory.tsx +27 -0
  280. package/engine/src/episodes/ep18-ai-history/art.tsx +141 -0
  281. package/engine/src/episodes/ep18-ai-history/cues.json +626 -0
  282. package/engine/src/episodes/ep18-ai-history/cues.ts +5 -0
  283. package/engine/src/episodes/ep18-ai-history/film.tsx +910 -0
  284. package/engine/src/episodes/ep18-ai-history/scrapbook.tsx +762 -0
  285. package/engine/src/episodes/ep18-ai-history/timeline.ts +63 -0
  286. package/engine/src/episodes/ep19-apple-history/Cover.tsx +45 -0
  287. package/engine/src/episodes/ep19-apple-history/CoverTall.tsx +29 -0
  288. package/engine/src/episodes/ep19-apple-history/Ep19AppleHistory.tsx +27 -0
  289. package/engine/src/episodes/ep19-apple-history/art.tsx +302 -0
  290. package/engine/src/episodes/ep19-apple-history/cues.json +470 -0
  291. package/engine/src/episodes/ep19-apple-history/cues.ts +5 -0
  292. package/engine/src/episodes/ep19-apple-history/film.tsx +1245 -0
  293. package/engine/src/episodes/ep19-apple-history/timeline.ts +82 -0
  294. package/engine/src/episodes/ep20-nvidia-history/Cover.tsx +46 -0
  295. package/engine/src/episodes/ep20-nvidia-history/CoverTall.tsx +30 -0
  296. package/engine/src/episodes/ep20-nvidia-history/Ep20NvidiaHistory.tsx +27 -0
  297. package/engine/src/episodes/ep20-nvidia-history/art.tsx +244 -0
  298. package/engine/src/episodes/ep20-nvidia-history/cues.json +482 -0
  299. package/engine/src/episodes/ep20-nvidia-history/cues.ts +5 -0
  300. package/engine/src/episodes/ep20-nvidia-history/film.tsx +1088 -0
  301. package/engine/src/episodes/ep20-nvidia-history/timeline.ts +78 -0
  302. package/engine/src/episodes/ep21-nobel-physics/Cover.tsx +75 -0
  303. package/engine/src/episodes/ep21-nobel-physics/Ep21NobelPhysics.tsx +27 -0
  304. package/engine/src/episodes/ep21-nobel-physics/cues.json +218 -0
  305. package/engine/src/episodes/ep21-nobel-physics/cues.ts +5 -0
  306. package/engine/src/episodes/ep21-nobel-physics/film.tsx +627 -0
  307. package/engine/src/episodes/ep22-nobel-chemistry/Cover.tsx +64 -0
  308. package/engine/src/episodes/ep22-nobel-chemistry/Ep22NobelChemistry.tsx +27 -0
  309. package/engine/src/episodes/ep22-nobel-chemistry/cues.json +212 -0
  310. package/engine/src/episodes/ep22-nobel-chemistry/cues.ts +5 -0
  311. package/engine/src/episodes/ep22-nobel-chemistry/film.tsx +563 -0
  312. package/engine/src/episodes/ep23-wheat-chessboard/Ep23Wheat.tsx +322 -0
  313. package/engine/src/episodes/ep23-wheat-chessboard/timeline.ts +89 -0
  314. package/engine/src/episodes/ep24-birthday-paradox/Cover.tsx +53 -0
  315. package/engine/src/episodes/ep24-birthday-paradox/Ep24Birthday.tsx +233 -0
  316. package/engine/src/episodes/ep24-birthday-paradox/ring.tsx +164 -0
  317. package/engine/src/episodes/ep24-birthday-paradox/scenes.tsx +460 -0
  318. package/engine/src/episodes/ep24-birthday-paradox/timeline.ts +216 -0
  319. package/engine/src/episodes/ep25-behind-cover/Ep25Cover.tsx +306 -0
  320. package/engine/src/episodes/ep25-behind-cover/scenes.tsx +416 -0
  321. package/engine/src/episodes/ep25-behind-cover/timeline.ts +209 -0
  322. package/engine/src/episodes/ep26-opus-video/Cover.tsx +18 -0
  323. package/engine/src/episodes/ep26-opus-video/Ep26OpusVideo.tsx +53 -0
  324. package/engine/src/episodes/ep26-opus-video/cues.json +140 -0
  325. package/engine/src/episodes/ep26-opus-video/cues.ts +6 -0
  326. package/engine/src/episodes/ep26-opus-video/scenes.tsx +301 -0
  327. package/engine/src/episodes/ep27-opus-video-full/Cover.tsx +18 -0
  328. package/engine/src/episodes/ep27-opus-video-full/Ep27OpusVideoFull.tsx +65 -0
  329. package/engine/src/episodes/ep27-opus-video-full/assets.ts +36 -0
  330. package/engine/src/episodes/ep27-opus-video-full/cues.json +860 -0
  331. package/engine/src/episodes/ep27-opus-video-full/cues.ts +6 -0
  332. package/engine/src/episodes/ep27-opus-video-full/scenes/index.tsx +730 -0
  333. package/engine/src/episodes/ep27-opus-video-full/scenes/kit.tsx +334 -0
  334. package/engine/src/episodes/ep28-express-relay/CoverTall.tsx +98 -0
  335. package/engine/src/episodes/ep28-express-relay/Ep28Relay.tsx +453 -0
  336. package/engine/src/episodes/ep28-express-relay/scenes.tsx +2 -0
  337. package/engine/src/episodes/ep28-express-relay/timeline.ts +261 -0
  338. package/engine/src/episodes/ep29-footsteps/Ep29Footsteps.tsx +328 -0
  339. package/engine/src/episodes/ep29-footsteps/scenes.tsx +418 -0
  340. package/engine/src/episodes/ep29-footsteps/timeline.ts +250 -0
  341. package/engine/src/episodes/ep30-tang-divorce/CoverTall.tsx +85 -0
  342. package/engine/src/episodes/ep30-tang-divorce/Ep30Divorce.tsx +453 -0
  343. package/engine/src/episodes/ep30-tang-divorce/timeline.ts +235 -0
  344. package/engine/src/episodes/ep31-rigged/Ep31Rigged.tsx +334 -0
  345. package/engine/src/episodes/ep31-rigged/scenes.tsx +175 -0
  346. package/engine/src/episodes/ep31-rigged/timeline.ts +273 -0
  347. package/engine/src/episodes/ep32-love-lasts/Ep32Love.tsx +228 -0
  348. package/engine/src/episodes/ep32-love-lasts/scenes.tsx +219 -0
  349. package/engine/src/episodes/ep32-love-lasts/timeline.ts +165 -0
  350. package/engine/src/episodes/ep33-teammates/Ep33Teammates.tsx +304 -0
  351. package/engine/src/episodes/ep33-teammates/scenes.tsx +395 -0
  352. package/engine/src/episodes/ep33-teammates/timeline.ts +239 -0
  353. package/engine/src/episodes/ep34-song-takeout/CoverTall.tsx +70 -0
  354. package/engine/src/episodes/ep34-song-takeout/Ep34Takeout.tsx +362 -0
  355. package/engine/src/episodes/ep34-song-takeout/timeline.ts +219 -0
  356. package/engine/src/episodes/ep35-choke/Ep35Choke.tsx +318 -0
  357. package/engine/src/episodes/ep35-choke/scenes.tsx +252 -0
  358. package/engine/src/episodes/ep35-choke/timeline.ts +230 -0
  359. package/engine/src/episodes/ep36-boxed-pigs/CoverTall.tsx +65 -0
  360. package/engine/src/episodes/ep36-boxed-pigs/Ep36Pigs.tsx +519 -0
  361. package/engine/src/episodes/ep36-boxed-pigs/scenes.tsx +18 -0
  362. package/engine/src/episodes/ep36-boxed-pigs/timeline.ts +192 -0
  363. package/engine/src/episodes/ep37-bhop/Ep37Bhop.tsx +379 -0
  364. package/engine/src/episodes/ep37-bhop/scenes.tsx +166 -0
  365. package/engine/src/episodes/ep37-bhop/timeline.ts +232 -0
  366. package/engine/src/episodes/ep38-butterfly/CoverTall.tsx +55 -0
  367. package/engine/src/episodes/ep38-butterfly/Ep38Butterfly.tsx +434 -0
  368. package/engine/src/episodes/ep38-butterfly/timeline.ts +218 -0
  369. package/engine/src/episodes/ep39-latency/Ep39Latency.tsx +461 -0
  370. package/engine/src/episodes/ep39-latency/scenes.tsx +194 -0
  371. package/engine/src/episodes/ep39-latency/timeline.ts +248 -0
  372. package/engine/src/episodes/ep40-counter-strafe/Ep40CounterStrafe.tsx +410 -0
  373. package/engine/src/episodes/ep40-counter-strafe/scenes.tsx +124 -0
  374. package/engine/src/episodes/ep40-counter-strafe/timeline.ts +277 -0
  375. package/engine/src/episodes/ep41-flying-money/CoverTall.tsx +50 -0
  376. package/engine/src/episodes/ep41-flying-money/Ep41FlyingMoney.tsx +447 -0
  377. package/engine/src/episodes/ep41-flying-money/timeline.ts +239 -0
  378. package/engine/src/episodes/ep42-tap-fire/Ep42TapFire.tsx +376 -0
  379. package/engine/src/episodes/ep42-tap-fire/scenes.tsx +174 -0
  380. package/engine/src/episodes/ep42-tap-fire/timeline.ts +262 -0
  381. package/engine/src/episodes/ep43-one-more-game/Ep43OneMoreGame.tsx +376 -0
  382. package/engine/src/episodes/ep43-one-more-game/scenes.tsx +202 -0
  383. package/engine/src/episodes/ep43-one-more-game/timeline.ts +241 -0
  384. package/engine/src/episodes/ep45-callouts/Ep45Callouts.tsx +435 -0
  385. package/engine/src/episodes/ep45-callouts/scenes.tsx +170 -0
  386. package/engine/src/episodes/ep45-callouts/timeline.ts +260 -0
  387. package/engine/src/episodes/ep46-song-ice/CoverTall.tsx +51 -0
  388. package/engine/src/episodes/ep46-song-ice/Ep46SongIce.tsx +414 -0
  389. package/engine/src/episodes/ep46-song-ice/scenes.tsx +172 -0
  390. package/engine/src/episodes/ep46-song-ice/timeline.ts +257 -0
  391. package/engine/src/episodes/ep47-spotlight/Ep47Spotlight.tsx +416 -0
  392. package/engine/src/episodes/ep47-spotlight/scenes.tsx +146 -0
  393. package/engine/src/episodes/ep47-spotlight/timeline.ts +272 -0
  394. package/engine/src/episodes/ep48-jiggle-peek/Ep48JigglePeek.tsx +468 -0
  395. package/engine/src/episodes/ep48-jiggle-peek/scenes.tsx +86 -0
  396. package/engine/src/episodes/ep48-jiggle-peek/timeline.ts +264 -0
  397. package/engine/src/episodes/ep49-ad-strafe/Ep49AdStrafe.tsx +392 -0
  398. package/engine/src/episodes/ep49-ad-strafe/scenes.tsx +89 -0
  399. package/engine/src/episodes/ep49-ad-strafe/timeline.ts +266 -0
  400. package/engine/src/episodes/ep50-late-night/Ep50LateNight.tsx +380 -0
  401. package/engine/src/episodes/ep50-late-night/scenes.tsx +161 -0
  402. package/engine/src/episodes/ep50-late-night/timeline.ts +253 -0
  403. package/engine/src/episodes/ep51-practice/Ep51Practice.tsx +402 -0
  404. package/engine/src/episodes/ep51-practice/scenes.tsx +122 -0
  405. package/engine/src/episodes/ep51-practice/timeline.ts +241 -0
  406. package/engine/src/index.ts +4 -0
  407. package/engine/src/library/README.md +205 -0
  408. package/engine/src/library/Show.tsx +107 -0
  409. package/engine/src/library/Subtitles.tsx +105 -0
  410. package/engine/src/library/anim.ts +49 -0
  411. package/engine/src/library/blackgold/chaos.tsx +203 -0
  412. package/engine/src/library/blackgold/charts.tsx +578 -0
  413. package/engine/src/library/blackgold/pen.tsx +331 -0
  414. package/engine/src/library/blackgold/props.tsx +176 -0
  415. package/engine/src/library/blackgold/stage.tsx +262 -0
  416. package/engine/src/library/blackgold/theme.ts +62 -0
  417. package/engine/src/library/character/Accessories.tsx +172 -0
  418. package/engine/src/library/character/Arm.tsx +16 -0
  419. package/engine/src/library/character/BuddyFigure.tsx +127 -0
  420. package/engine/src/library/character/Char.tsx +71 -0
  421. package/engine/src/library/character/PixelBuddy.tsx +150 -0
  422. package/engine/src/library/character/types.ts +2 -0
  423. package/engine/src/library/cues.ts +49 -0
  424. package/engine/src/library/editor-room/canvas.tsx +264 -0
  425. package/engine/src/library/editor-room/mascots.tsx +92 -0
  426. package/engine/src/library/editor-room/stage.tsx +400 -0
  427. package/engine/src/library/editor-room/theme.ts +66 -0
  428. package/engine/src/library/fonts.ts +24 -0
  429. package/engine/src/library/fx.tsx +233 -0
  430. package/engine/src/library/gilded/charts.tsx +283 -0
  431. package/engine/src/library/gilded/props.tsx +245 -0
  432. package/engine/src/library/gilded/stage.tsx +312 -0
  433. package/engine/src/library/gilded/theme.ts +62 -0
  434. package/engine/src/library/halftone/props.tsx +332 -0
  435. package/engine/src/library/halftone/stage.tsx +435 -0
  436. package/engine/src/library/halftone/suspect.tsx +86 -0
  437. package/engine/src/library/halftone/theme.ts +71 -0
  438. package/engine/src/library/icons.tsx +318 -0
  439. package/engine/src/library/items/apps.tsx +161 -0
  440. package/engine/src/library/items/media.tsx +80 -0
  441. package/engine/src/library/items/objects.tsx +252 -0
  442. package/engine/src/library/lamplight/charts.tsx +530 -0
  443. package/engine/src/library/lamplight/ice.tsx +401 -0
  444. package/engine/src/library/lamplight/props.tsx +1072 -0
  445. package/engine/src/library/lamplight/scenes.tsx +187 -0
  446. package/engine/src/library/lamplight/stage.tsx +451 -0
  447. package/engine/src/library/lamplight/theme.ts +81 -0
  448. package/engine/src/library/previews/BlackGoldDemo.tsx +195 -0
  449. package/engine/src/library/previews/EditorRoomDemo.tsx +190 -0
  450. package/engine/src/library/previews/GildedDemo.tsx +185 -0
  451. package/engine/src/library/previews/HalftoneDemo.tsx +426 -0
  452. package/engine/src/library/previews/LamplightDemo.tsx +202 -0
  453. package/engine/src/library/previews/PixelWardrobe.tsx +39 -0
  454. package/engine/src/library/previews/TacticalDemo.tsx +280 -0
  455. package/engine/src/library/previews/Wardrobe.tsx +49 -0
  456. package/engine/src/library/previews/WarmDeskDemo.tsx +291 -0
  457. package/engine/src/library/previews/WarmDeskShowDemo.tsx +79 -0
  458. package/engine/src/library/sets/Studio.tsx +164 -0
  459. package/engine/src/library/tactical/attention.tsx +340 -0
  460. package/engine/src/library/tactical/charts.tsx +373 -0
  461. package/engine/src/library/tactical/hearing.tsx +189 -0
  462. package/engine/src/library/tactical/movement.tsx +163 -0
  463. package/engine/src/library/tactical/pipeline.tsx +236 -0
  464. package/engine/src/library/tactical/practice.tsx +84 -0
  465. package/engine/src/library/tactical/range.tsx +338 -0
  466. package/engine/src/library/tactical/ranked.tsx +267 -0
  467. package/engine/src/library/tactical/reward.tsx +204 -0
  468. package/engine/src/library/tactical/sleep.tsx +90 -0
  469. package/engine/src/library/tactical/spread.tsx +200 -0
  470. package/engine/src/library/tactical/stage.tsx +379 -0
  471. package/engine/src/library/tactical/theme.ts +48 -0
  472. package/engine/src/library/tactical/tracking.tsx +146 -0
  473. package/engine/src/library/tactical/vectors.tsx +161 -0
  474. package/engine/src/library/tactical/window.tsx +93 -0
  475. package/engine/src/library/theme.ts +55 -0
  476. package/engine/src/library/types.ts +11 -0
  477. package/engine/src/library/ui.tsx +137 -0
  478. package/engine/src/library/vox/CoverTall.tsx +92 -0
  479. package/engine/src/library/vox/VoxShow.tsx +136 -0
  480. package/engine/src/library/vox/desk.tsx +31 -0
  481. package/engine/src/library/vox/footage.tsx +74 -0
  482. package/engine/src/library/vox/hud.tsx +51 -0
  483. package/engine/src/library/vox/portrait.tsx +80 -0
  484. package/engine/src/library/vox/props.tsx +256 -0
  485. package/engine/src/library/vox/shots.tsx +66 -0
  486. package/engine/src/library/vox/stickers.tsx +132 -0
  487. package/engine/src/library/vox/theme.ts +77 -0
  488. package/engine/src/library/warm-desk/CoverTall.tsx +111 -0
  489. package/engine/src/library/warm-desk/DeskShow.tsx +127 -0
  490. package/engine/src/library/warm-desk/HostCam.tsx +30 -0
  491. package/engine/src/library/warm-desk/Slot.tsx +67 -0
  492. package/engine/src/library/warm-desk/immersive.tsx +105 -0
  493. package/engine/src/library/warm-desk/mascot.tsx +48 -0
  494. package/engine/src/library/warm-desk/motifs.tsx +277 -0
  495. package/engine/src/library/warm-desk/props.tsx +318 -0
  496. package/engine/src/library/warm-desk/stage.tsx +268 -0
  497. package/engine/src/library/warm-desk/theme.ts +83 -0
  498. package/engine/styles/LICENSE-huashu-art-motion +21 -0
  499. package/engine/styles/README.md +143 -0
  500. 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
  501. 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
  502. 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
  503. 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
  504. 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
  505. 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
  506. 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
  507. 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
  508. 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
  509. 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
  510. 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
  511. 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
  512. 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
  513. 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
  514. 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
  515. 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
  516. 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
  517. 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
  518. 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
  519. 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
  520. 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
  521. 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
  522. 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
  523. 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
  524. 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
  525. 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
  526. 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
  527. 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
  528. 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
  529. 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
  530. 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
  531. 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
  532. 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
  533. 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
  534. 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
  535. 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
  536. 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
  537. 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
  538. 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
  539. 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
  540. 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
  541. 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
  542. 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
  543. 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
  544. 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
  545. 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
  546. 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
  547. 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
  548. 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
  549. 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
  550. 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
  551. 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
  552. 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
  553. 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
  554. 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
  555. 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
  556. 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
  557. 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
  558. 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
  559. 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
  560. 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
  561. 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
  562. 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
  563. 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
  564. 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
  565. 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
  566. 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
  567. 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
  568. 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
  569. 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
  570. 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
  571. 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
  572. 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
  573. 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
  574. 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
  575. 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
  576. 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
  577. 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
  578. 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
  579. 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
  580. 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
  581. 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
  582. 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
  583. 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
  584. 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
  585. 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
  586. 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
  587. 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
  588. 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
  589. 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
  590. 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
  591. 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
  592. 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
  593. 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
  594. 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
  595. 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
  596. 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
  597. 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
  598. 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
  599. 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
  600. 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
  601. 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
  602. 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
  603. 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
  604. 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
  605. 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
  606. 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
  607. 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
  608. 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
  609. 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
  610. 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
  611. 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
  612. 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
  613. 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
  614. 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
  615. 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
  616. 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
  617. 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
  618. 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
  619. 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
  620. 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
  621. 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
  622. 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
  623. 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
  624. 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
  625. 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
  626. 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
  627. 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
  628. 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
  629. 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
  630. 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
  631. 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
  632. 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
  633. 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
  634. 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
  635. 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
  636. 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
  637. 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
  638. 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
  639. 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
  640. 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
  641. 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
  642. 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
  643. 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
  644. 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
  645. 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
  646. 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
  647. 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
  648. 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
  649. 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
  650. 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
  651. 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
  652. 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
  653. 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
  654. 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
  655. 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
  656. 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
  657. 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
  658. 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
  659. 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
  660. 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
  661. 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
  662. 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
  663. 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
  664. 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
  665. 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
  666. 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
  667. 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
  668. 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
  669. 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
  670. 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
  671. 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
  672. 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
  673. 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
  674. 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
  675. 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
  676. 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
  677. 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
  678. 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
  679. 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
  680. 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
  681. 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
  682. 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
  683. 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
  684. 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
  685. 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
  686. 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
  687. 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
  688. 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
  689. 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
  690. 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
  691. 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
  692. 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
  693. 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
  694. 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
  695. package/engine/tests/episodes/ep00-demo.test.ts +69 -0
  696. package/engine/tests/episodes/ep01-agent-cues.test.ts +25 -0
  697. package/engine/tests/episodes/ep01-agent-scenes.test.ts +25 -0
  698. package/engine/tests/episodes/ep02-llm.test.ts +31 -0
  699. package/engine/tests/episodes/ep03-cc.test.ts +24 -0
  700. package/engine/tests/episodes/ep04-opus55.test.ts +24 -0
  701. package/engine/tests/episodes/ep05-token.test.ts +24 -0
  702. package/engine/tests/episodes/ep06-context.test.ts +24 -0
  703. package/engine/tests/episodes/ep07-agent.test.ts +24 -0
  704. package/engine/tests/episodes/ep08-hallucination.test.ts +24 -0
  705. package/engine/tests/episodes/ep09-prompt.test.ts +24 -0
  706. package/engine/tests/episodes/ep10-multimodal.test.ts +24 -0
  707. package/engine/tests/episodes/ep11-mcp.test.ts +24 -0
  708. package/engine/tests/episodes/ep12-skill.test.ts +24 -0
  709. package/engine/tests/episodes/ep13-subagent.test.ts +24 -0
  710. package/engine/tests/episodes/ep14-agent-permission.test.ts +24 -0
  711. package/engine/tests/episodes/ep15-prompt-injection.test.ts +24 -0
  712. package/engine/tests/episodes/ep16-agent-done.test.ts +24 -0
  713. package/engine/tests/episodes/ep17-sycophancy.test.ts +24 -0
  714. package/engine/tests/episodes/ep18-ai-history.test.ts +19 -0
  715. package/engine/tests/episodes/ep19-apple-history.test.ts +19 -0
  716. package/engine/tests/episodes/ep20-nvidia-history.test.ts +19 -0
  717. package/engine/tests/episodes/ep21-nobel-physics.test.ts +19 -0
  718. package/engine/tests/episodes/ep22-nobel-chemistry.test.ts +19 -0
  719. package/engine/tests/episodes/ep23-wheat-chessboard.test.ts +55 -0
  720. package/engine/tests/episodes/ep24-birthday-paradox.test.ts +140 -0
  721. package/engine/tests/episodes/ep25-behind-cover.test.ts +83 -0
  722. package/engine/tests/episodes/ep26-opus-video.test.ts +39 -0
  723. package/engine/tests/episodes/ep27-opus-video-full.test.ts +51 -0
  724. package/engine/tests/episodes/ep28-express-relay.test.ts +107 -0
  725. package/engine/tests/episodes/ep29-footsteps.test.ts +101 -0
  726. package/engine/tests/episodes/ep30-tang-divorce.test.ts +101 -0
  727. package/engine/tests/episodes/ep31-rigged.test.ts +108 -0
  728. package/engine/tests/episodes/ep32-love-lasts.test.ts +104 -0
  729. package/engine/tests/episodes/ep33-teammates.test.ts +113 -0
  730. package/engine/tests/episodes/ep34-song-takeout.test.ts +98 -0
  731. package/engine/tests/episodes/ep35-choke.test.ts +109 -0
  732. package/engine/tests/episodes/ep36-boxed-pigs.test.ts +98 -0
  733. package/engine/tests/episodes/ep37-bhop.test.ts +114 -0
  734. package/engine/tests/episodes/ep38-butterfly.test.ts +118 -0
  735. package/engine/tests/episodes/ep39-latency.test.ts +150 -0
  736. package/engine/tests/episodes/ep40-counter-strafe.test.ts +145 -0
  737. package/engine/tests/episodes/ep41-flying-money.test.ts +97 -0
  738. package/engine/tests/episodes/ep42-tap-fire.test.ts +137 -0
  739. package/engine/tests/episodes/ep43-one-more-game.test.ts +129 -0
  740. package/engine/tests/episodes/ep45-callouts.test.ts +150 -0
  741. package/engine/tests/episodes/ep46-song-ice.test.ts +117 -0
  742. package/engine/tests/episodes/ep47-spotlight.test.ts +159 -0
  743. package/engine/tests/episodes/ep48-jiggle-peek.test.ts +154 -0
  744. package/engine/tests/episodes/ep49-ad-strafe.test.ts +139 -0
  745. package/engine/tests/episodes/ep50-late-night.test.ts +156 -0
  746. package/engine/tests/episodes/ep51-practice.test.ts +117 -0
  747. package/engine/tests/library/anim.test.ts +37 -0
  748. package/engine/tests/library/bgm.test.ts +29 -0
  749. package/engine/tests/library/blackgold.test.ts +37 -0
  750. package/engine/tests/library/halftone.test.ts +40 -0
  751. package/engine/tests/library/lamplight.test.ts +60 -0
  752. package/engine/tests/library/srt.test.ts +13 -0
  753. package/engine/tests/library/subtitles.test.ts +12 -0
  754. package/engine/tests/library/synth.test.ts +29 -0
  755. package/engine/tests/library/tactical.test.ts +37 -0
  756. package/engine/tests/library/warm-desk.test.ts +25 -0
  757. package/engine/tsconfig.json +15 -0
  758. package/engine/vitest.config.ts +3 -0
  759. package/lib/host.mjs +654 -0
  760. package/manifest.json +51 -0
  761. package/package.json +8 -4
  762. package/skills/biuvibe/SKILL.md +28 -0
  763. package/studio/app.js +258 -0
  764. package/studio/assert-panel-permit.mjs +67 -0
  765. package/studio/composer.css +438 -0
  766. package/studio/composer.js +307 -0
  767. package/studio/index.html +82 -0
  768. package/studio/select-menu.js +433 -0
  769. package/studio/styles.css +2 -0
  770. package/studio/thumbs/blackgold.jpg +0 -0
  771. package/studio/thumbs/desk.jpg +0 -0
  772. package/studio/thumbs/editor.jpg +0 -0
  773. package/studio/thumbs/fps.jpg +0 -0
  774. package/studio/thumbs/gilded.jpg +0 -0
  775. package/studio/thumbs/halftone.jpg +0 -0
  776. package/studio/thumbs/lamplight.jpg +0 -0
  777. package/studio/thumbs/pixel-hand.jpg +0 -0
  778. package/studio/thumbs/pixel-sticker.jpg +0 -0
  779. package/studio/thumbs/vector.jpg +0 -0
  780. package/studio/thumbs/vox-cut.jpg +0 -0
  781. package/studio/thumbs/vox-timeline.jpg +0 -0
  782. 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
+ }