wizz-method 1.0.3 → 1.1.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 (630) hide show
  1. package/package.json +4 -2
  2. package/skills-registry.yaml +318 -0
  3. package/src/bmm-skills/4-implementation/wizz-quick-dev/SKILL.md +7 -0
  4. package/src/core-skills/wizz-editorial-review-prose/SKILL.md +20 -45
  5. package/src/core-skills/wizz-party-mode/customize.toml +894 -0
  6. package/src/core-skills/wizz-party-mode/scripts/__pycache__/resolve_party.cpython-314.pyc +0 -0
  7. package/src/core-skills/wizz-review-adversarial-general/SKILL.md +23 -12
  8. package/src/modules/wizz/agents/wizz-maestro/SKILL.md +47 -23
  9. package/src/skills-lib/ab-test-setup/SKILL.md +266 -0
  10. package/src/skills-lib/ab-test-setup/evals/evals.json +105 -0
  11. package/src/skills-lib/ab-test-setup/references/sample-size-guide.md +263 -0
  12. package/src/skills-lib/ab-test-setup/references/test-templates.md +277 -0
  13. package/src/skills-lib/ad-creative/SKILL.md +362 -0
  14. package/src/skills-lib/ad-creative/evals/evals.json +90 -0
  15. package/src/skills-lib/ad-creative/references/generative-tools.md +637 -0
  16. package/src/skills-lib/ad-creative/references/platform-specs.md +213 -0
  17. package/src/skills-lib/adversarial-reviewer/SKILL.md +122 -0
  18. package/src/skills-lib/agent-browser/SKILL.md +139 -0
  19. package/src/skills-lib/ai-seo/SKILL.md +398 -0
  20. package/src/skills-lib/ai-seo/evals/evals.json +90 -0
  21. package/src/skills-lib/ai-seo/references/content-patterns.md +285 -0
  22. package/src/skills-lib/ai-seo/references/platform-ranking-factors.md +152 -0
  23. package/src/skills-lib/analytics-tracking/SKILL.md +309 -0
  24. package/src/skills-lib/analytics-tracking/evals/evals.json +90 -0
  25. package/src/skills-lib/analytics-tracking/references/event-library.md +260 -0
  26. package/src/skills-lib/analytics-tracking/references/ga4-implementation.md +300 -0
  27. package/src/skills-lib/analytics-tracking/references/gtm-implementation.md +390 -0
  28. package/src/skills-lib/auth-and-secrets/SKILL.md +82 -0
  29. package/src/skills-lib/caching-and-queues/SKILL.md +58 -0
  30. package/src/skills-lib/cerebro/SKILL.md +368 -0
  31. package/src/skills-lib/churn-prevention/SKILL.md +424 -0
  32. package/src/skills-lib/churn-prevention/evals/evals.json +93 -0
  33. package/src/skills-lib/churn-prevention/references/cancel-flow-patterns.md +316 -0
  34. package/src/skills-lib/churn-prevention/references/dunning-playbook.md +408 -0
  35. package/src/skills-lib/cloud-and-infra/SKILL.md +36 -0
  36. package/src/skills-lib/cold-email/SKILL.md +158 -0
  37. package/src/skills-lib/cold-email/evals/evals.json +94 -0
  38. package/src/skills-lib/cold-email/references/benchmarks.md +83 -0
  39. package/src/skills-lib/cold-email/references/follow-up-sequences.md +81 -0
  40. package/src/skills-lib/cold-email/references/frameworks.md +90 -0
  41. package/src/skills-lib/cold-email/references/personalization.md +79 -0
  42. package/src/skills-lib/cold-email/references/subject-lines.md +53 -0
  43. package/src/skills-lib/competitor-alternatives/SKILL.md +256 -0
  44. package/src/skills-lib/competitor-alternatives/evals/evals.json +93 -0
  45. package/src/skills-lib/competitor-alternatives/references/content-architecture.md +271 -0
  46. package/src/skills-lib/competitor-alternatives/references/templates.md +223 -0
  47. package/src/skills-lib/content-strategy/SKILL.md +359 -0
  48. package/src/skills-lib/content-strategy/evals/evals.json +90 -0
  49. package/src/skills-lib/copy-editing/SKILL.md +447 -0
  50. package/src/skills-lib/copy-editing/evals/evals.json +89 -0
  51. package/src/skills-lib/copy-editing/references/plain-english-alternatives.md +394 -0
  52. package/src/skills-lib/copywriting/SKILL.md +252 -0
  53. package/src/skills-lib/copywriting/evals/evals.json +111 -0
  54. package/src/skills-lib/copywriting/references/copy-frameworks.md +344 -0
  55. package/src/skills-lib/copywriting/references/natural-transitions.md +272 -0
  56. package/src/skills-lib/database-and-deps/SKILL.md +80 -0
  57. package/src/skills-lib/database-scaling/SKILL.md +44 -0
  58. package/src/skills-lib/decision-maker/SKILL.md +534 -0
  59. package/src/skills-lib/desktop-security/SKILL.md +43 -0
  60. package/src/skills-lib/email-sequence/SKILL.md +309 -0
  61. package/src/skills-lib/email-sequence/evals/evals.json +93 -0
  62. package/src/skills-lib/email-sequence/references/copy-guidelines.md +113 -0
  63. package/src/skills-lib/email-sequence/references/email-types.md +515 -0
  64. package/src/skills-lib/email-sequence/references/sequence-templates.md +168 -0
  65. package/src/skills-lib/enhance-prompt/README.md +34 -0
  66. package/src/skills-lib/enhance-prompt/SKILL.md +204 -0
  67. package/src/skills-lib/enhance-prompt/references/KEYWORDS.md +114 -0
  68. package/src/skills-lib/find-skills/SKILL.md +181 -0
  69. package/src/skills-lib/form-cro/SKILL.md +429 -0
  70. package/src/skills-lib/form-cro/evals/evals.json +90 -0
  71. package/src/skills-lib/free-tool-strategy/SKILL.md +178 -0
  72. package/src/skills-lib/free-tool-strategy/evals/evals.json +90 -0
  73. package/src/skills-lib/free-tool-strategy/references/tool-types.md +217 -0
  74. package/src/skills-lib/graphify/.graphify_version +1 -0
  75. package/src/skills-lib/graphify/SKILL.md +1217 -0
  76. package/src/skills-lib/huashu-design/LICENSE +21 -0
  77. package/src/skills-lib/huashu-design/README.en.md +309 -0
  78. package/src/skills-lib/huashu-design/README.md +348 -0
  79. package/src/skills-lib/huashu-design/SKILL.md +631 -0
  80. package/src/skills-lib/huashu-design/assets/android_frame.jsx +175 -0
  81. package/src/skills-lib/huashu-design/assets/animations.jsx +348 -0
  82. package/src/skills-lib/huashu-design/assets/banner.svg +198 -0
  83. package/src/skills-lib/huashu-design/assets/bgm-ad.mp3 +0 -0
  84. package/src/skills-lib/huashu-design/assets/bgm-educational-alt.mp3 +0 -0
  85. package/src/skills-lib/huashu-design/assets/bgm-educational.mp3 +0 -0
  86. package/src/skills-lib/huashu-design/assets/bgm-tech.mp3 +0 -0
  87. package/src/skills-lib/huashu-design/assets/bgm-tutorial-alt.mp3 +0 -0
  88. package/src/skills-lib/huashu-design/assets/bgm-tutorial.mp3 +0 -0
  89. package/src/skills-lib/huashu-design/assets/browser_window.jsx +166 -0
  90. package/src/skills-lib/huashu-design/assets/deck_index.html +348 -0
  91. package/src/skills-lib/huashu-design/assets/deck_stage.js +420 -0
  92. package/src/skills-lib/huashu-design/assets/design_canvas.jsx +205 -0
  93. package/src/skills-lib/huashu-design/assets/director-notes-samples/launch-film-30s-sample.md +1713 -0
  94. package/src/skills-lib/huashu-design/assets/ios_frame.jsx +192 -0
  95. package/src/skills-lib/huashu-design/assets/macos_window.jsx +96 -0
  96. package/src/skills-lib/huashu-design/assets/narration_stage.jsx +476 -0
  97. package/src/skills-lib/huashu-design/assets/personal-asset-index.example.json +71 -0
  98. package/src/skills-lib/huashu-design/assets/sfx/container/card-flip.mp3 +0 -0
  99. package/src/skills-lib/huashu-design/assets/sfx/container/card-snap.mp3 +0 -0
  100. package/src/skills-lib/huashu-design/assets/sfx/container/modal-open.mp3 +0 -0
  101. package/src/skills-lib/huashu-design/assets/sfx/container/stack-collapse.mp3 +0 -0
  102. package/src/skills-lib/huashu-design/assets/sfx/feedback/achievement.mp3 +0 -0
  103. package/src/skills-lib/huashu-design/assets/sfx/feedback/error-tone.mp3 +0 -0
  104. package/src/skills-lib/huashu-design/assets/sfx/feedback/notification-pop.mp3 +0 -0
  105. package/src/skills-lib/huashu-design/assets/sfx/feedback/success-chime.mp3 +0 -0
  106. package/src/skills-lib/huashu-design/assets/sfx/impact/brand-stamp.mp3 +0 -0
  107. package/src/skills-lib/huashu-design/assets/sfx/impact/drop-thud.mp3 +0 -0
  108. package/src/skills-lib/huashu-design/assets/sfx/impact/logo-reveal-v2.mp3 +0 -0
  109. package/src/skills-lib/huashu-design/assets/sfx/impact/logo-reveal.mp3 +0 -0
  110. package/src/skills-lib/huashu-design/assets/sfx/keyboard/delete-key.mp3 +0 -0
  111. package/src/skills-lib/huashu-design/assets/sfx/keyboard/enter.mp3 +0 -0
  112. package/src/skills-lib/huashu-design/assets/sfx/keyboard/space-tap.mp3 +0 -0
  113. package/src/skills-lib/huashu-design/assets/sfx/keyboard/type-fast.mp3 +0 -0
  114. package/src/skills-lib/huashu-design/assets/sfx/keyboard/type.mp3 +0 -0
  115. package/src/skills-lib/huashu-design/assets/sfx/magic/ai-process.mp3 +0 -0
  116. package/src/skills-lib/huashu-design/assets/sfx/magic/sparkle.mp3 +0 -0
  117. package/src/skills-lib/huashu-design/assets/sfx/magic/transform.mp3 +0 -0
  118. package/src/skills-lib/huashu-design/assets/sfx/progress/complete-done.mp3 +0 -0
  119. package/src/skills-lib/huashu-design/assets/sfx/progress/generate-start.mp3 +0 -0
  120. package/src/skills-lib/huashu-design/assets/sfx/progress/loading-tick.mp3 +0 -0
  121. package/src/skills-lib/huashu-design/assets/sfx/terminal/command-execute.mp3 +0 -0
  122. package/src/skills-lib/huashu-design/assets/sfx/terminal/cursor-blink.mp3 +0 -0
  123. package/src/skills-lib/huashu-design/assets/sfx/terminal/output-appear.mp3 +0 -0
  124. package/src/skills-lib/huashu-design/assets/sfx/transition/dissolve.mp3 +0 -0
  125. package/src/skills-lib/huashu-design/assets/sfx/transition/slide-in.mp3 +0 -0
  126. package/src/skills-lib/huashu-design/assets/sfx/transition/swipe-horizontal.mp3 +0 -0
  127. package/src/skills-lib/huashu-design/assets/sfx/transition/whoosh-fast.mp3 +0 -0
  128. package/src/skills-lib/huashu-design/assets/sfx/transition/whoosh.mp3 +0 -0
  129. package/src/skills-lib/huashu-design/assets/sfx/ui/click-soft.mp3 +0 -0
  130. package/src/skills-lib/huashu-design/assets/sfx/ui/click.mp3 +0 -0
  131. package/src/skills-lib/huashu-design/assets/sfx/ui/focus.mp3 +0 -0
  132. package/src/skills-lib/huashu-design/assets/sfx/ui/hover-subtle.mp3 +0 -0
  133. package/src/skills-lib/huashu-design/assets/sfx/ui/tap-finger.mp3 +0 -0
  134. package/src/skills-lib/huashu-design/assets/sfx/ui/toggle-on.mp3 +0 -0
  135. package/src/skills-lib/huashu-design/assets/showcases/INDEX.md +115 -0
  136. package/src/skills-lib/huashu-design/assets/showcases/cover/cover-build.html +235 -0
  137. package/src/skills-lib/huashu-design/assets/showcases/cover/cover-build.png +0 -0
  138. package/src/skills-lib/huashu-design/assets/showcases/cover/cover-pentagram.html +229 -0
  139. package/src/skills-lib/huashu-design/assets/showcases/cover/cover-pentagram.png +0 -0
  140. package/src/skills-lib/huashu-design/assets/showcases/cover/cover-takram.html +288 -0
  141. package/src/skills-lib/huashu-design/assets/showcases/cover/cover-takram.png +0 -0
  142. package/src/skills-lib/huashu-design/assets/showcases/infographic/infographic-build.html +503 -0
  143. package/src/skills-lib/huashu-design/assets/showcases/infographic/infographic-build.png +0 -0
  144. package/src/skills-lib/huashu-design/assets/showcases/infographic/infographic-pentagram.html +600 -0
  145. package/src/skills-lib/huashu-design/assets/showcases/infographic/infographic-pentagram.png +0 -0
  146. package/src/skills-lib/huashu-design/assets/showcases/infographic/infographic-takram.html +670 -0
  147. package/src/skills-lib/huashu-design/assets/showcases/infographic/infographic-takram.png +0 -0
  148. package/src/skills-lib/huashu-design/assets/showcases/ppt/ppt-build.html +382 -0
  149. package/src/skills-lib/huashu-design/assets/showcases/ppt/ppt-build.png +0 -0
  150. package/src/skills-lib/huashu-design/assets/showcases/ppt/ppt-pentagram.html +536 -0
  151. package/src/skills-lib/huashu-design/assets/showcases/ppt/ppt-pentagram.png +0 -0
  152. package/src/skills-lib/huashu-design/assets/showcases/ppt/ppt-takram.html +497 -0
  153. package/src/skills-lib/huashu-design/assets/showcases/ppt/ppt-takram.png +0 -0
  154. package/src/skills-lib/huashu-design/assets/showcases/website-ai-nav/ainav-build.html +385 -0
  155. package/src/skills-lib/huashu-design/assets/showcases/website-ai-nav/ainav-build.png +0 -0
  156. package/src/skills-lib/huashu-design/assets/showcases/website-ai-nav/ainav-pentagram.html +422 -0
  157. package/src/skills-lib/huashu-design/assets/showcases/website-ai-nav/ainav-pentagram.png +0 -0
  158. package/src/skills-lib/huashu-design/assets/showcases/website-ai-nav/ainav-takram.html +499 -0
  159. package/src/skills-lib/huashu-design/assets/showcases/website-ai-nav/ainav-takram.png +0 -0
  160. package/src/skills-lib/huashu-design/assets/showcases/website-ai-writing/aiwriting-build.html +562 -0
  161. package/src/skills-lib/huashu-design/assets/showcases/website-ai-writing/aiwriting-build.png +0 -0
  162. package/src/skills-lib/huashu-design/assets/showcases/website-ai-writing/aiwriting-pentagram.html +548 -0
  163. package/src/skills-lib/huashu-design/assets/showcases/website-ai-writing/aiwriting-pentagram.png +0 -0
  164. package/src/skills-lib/huashu-design/assets/showcases/website-ai-writing/aiwriting-takram.html +696 -0
  165. package/src/skills-lib/huashu-design/assets/showcases/website-ai-writing/aiwriting-takram.png +0 -0
  166. package/src/skills-lib/huashu-design/assets/showcases/website-devdocs/devdocs-build.html +372 -0
  167. package/src/skills-lib/huashu-design/assets/showcases/website-devdocs/devdocs-build.png +0 -0
  168. package/src/skills-lib/huashu-design/assets/showcases/website-devdocs/devdocs-pentagram.html +460 -0
  169. package/src/skills-lib/huashu-design/assets/showcases/website-devdocs/devdocs-pentagram.png +0 -0
  170. package/src/skills-lib/huashu-design/assets/showcases/website-devdocs/devdocs-takram.html +494 -0
  171. package/src/skills-lib/huashu-design/assets/showcases/website-devdocs/devdocs-takram.png +0 -0
  172. package/src/skills-lib/huashu-design/assets/showcases/website-homepage/homepage-build.html +367 -0
  173. package/src/skills-lib/huashu-design/assets/showcases/website-homepage/homepage-build.png +0 -0
  174. package/src/skills-lib/huashu-design/assets/showcases/website-homepage/homepage-pentagram.html +368 -0
  175. package/src/skills-lib/huashu-design/assets/showcases/website-homepage/homepage-pentagram.png +0 -0
  176. package/src/skills-lib/huashu-design/assets/showcases/website-homepage/homepage-takram.html +459 -0
  177. package/src/skills-lib/huashu-design/assets/showcases/website-homepage/homepage-takram.png +0 -0
  178. package/src/skills-lib/huashu-design/assets/showcases/website-saas/saas-build.html +493 -0
  179. package/src/skills-lib/huashu-design/assets/showcases/website-saas/saas-build.png +0 -0
  180. package/src/skills-lib/huashu-design/assets/showcases/website-saas/saas-pentagram.html +556 -0
  181. package/src/skills-lib/huashu-design/assets/showcases/website-saas/saas-pentagram.png +0 -0
  182. package/src/skills-lib/huashu-design/assets/showcases/website-saas/saas-takram.html +604 -0
  183. package/src/skills-lib/huashu-design/assets/showcases/website-saas/saas-takram.png +0 -0
  184. package/src/skills-lib/huashu-design/demos/c1-ios-prototype-en.html +1145 -0
  185. package/src/skills-lib/huashu-design/demos/c1-ios-prototype.html +1142 -0
  186. package/src/skills-lib/huashu-design/demos/c2-slides-pptx-en.html +1055 -0
  187. package/src/skills-lib/huashu-design/demos/c2-slides-pptx.html +1055 -0
  188. package/src/skills-lib/huashu-design/demos/c3-motion-design-en.html +1134 -0
  189. package/src/skills-lib/huashu-design/demos/c3-motion-design.html +1134 -0
  190. package/src/skills-lib/huashu-design/demos/c4-tweaks-en.html +989 -0
  191. package/src/skills-lib/huashu-design/demos/c4-tweaks.html +989 -0
  192. package/src/skills-lib/huashu-design/demos/c5-infographic-en.html +816 -0
  193. package/src/skills-lib/huashu-design/demos/c5-infographic.html +813 -0
  194. package/src/skills-lib/huashu-design/demos/c6-expert-review-en.html +885 -0
  195. package/src/skills-lib/huashu-design/demos/c6-expert-review.html +894 -0
  196. package/src/skills-lib/huashu-design/demos/hero-animation-v10-en.html +1498 -0
  197. package/src/skills-lib/huashu-design/demos/md-html-narration/md-html-demo.html +615 -0
  198. package/src/skills-lib/huashu-design/demos/md-html-narration/script.md +69 -0
  199. package/src/skills-lib/huashu-design/demos/voiceover-demo/script.md +17 -0
  200. package/src/skills-lib/huashu-design/demos/voiceover-demo//344/273/200/344/271/210/346/230/257token.html +201 -0
  201. package/src/skills-lib/huashu-design/demos/w1-brand-protocol-en.html +684 -0
  202. package/src/skills-lib/huashu-design/demos/w1-brand-protocol.html +696 -0
  203. package/src/skills-lib/huashu-design/demos/w2-junior-designer-en.html +983 -0
  204. package/src/skills-lib/huashu-design/demos/w2-junior-designer.html +994 -0
  205. package/src/skills-lib/huashu-design/demos/w3-fallback-advisor-en.html +647 -0
  206. package/src/skills-lib/huashu-design/demos/w3-fallback-advisor.html +704 -0
  207. package/src/skills-lib/huashu-design/package-lock.json +846 -0
  208. package/src/skills-lib/huashu-design/package.json +8 -0
  209. package/src/skills-lib/huashu-design/references/animation-best-practices.md +506 -0
  210. package/src/skills-lib/huashu-design/references/animation-pitfalls.md +402 -0
  211. package/src/skills-lib/huashu-design/references/animations.md +249 -0
  212. package/src/skills-lib/huashu-design/references/apple-gallery-showcase.md +338 -0
  213. package/src/skills-lib/huashu-design/references/audio-design-rules.md +260 -0
  214. package/src/skills-lib/huashu-design/references/brand-asset-protocol.md +250 -0
  215. package/src/skills-lib/huashu-design/references/cinematic-patterns.md +264 -0
  216. package/src/skills-lib/huashu-design/references/content-guidelines.md +260 -0
  217. package/src/skills-lib/huashu-design/references/critique-guide.md +199 -0
  218. package/src/skills-lib/huashu-design/references/design-context.md +213 -0
  219. package/src/skills-lib/huashu-design/references/design-styles.md +370 -0
  220. package/src/skills-lib/huashu-design/references/editable-pptx.md +334 -0
  221. package/src/skills-lib/huashu-design/references/hero-animation-case-study.md +250 -0
  222. package/src/skills-lib/huashu-design/references/launch-film-director-notes.md +293 -0
  223. package/src/skills-lib/huashu-design/references/multi-perspective-parallel-case-study.md +267 -0
  224. package/src/skills-lib/huashu-design/references/react-setup.md +276 -0
  225. package/src/skills-lib/huashu-design/references/scene-templates.md +262 -0
  226. package/src/skills-lib/huashu-design/references/sfx-library.md +226 -0
  227. package/src/skills-lib/huashu-design/references/slide-decks.md +745 -0
  228. package/src/skills-lib/huashu-design/references/tweaks-system.md +313 -0
  229. package/src/skills-lib/huashu-design/references/verification.md +183 -0
  230. package/src/skills-lib/huashu-design/references/video-export.md +232 -0
  231. package/src/skills-lib/huashu-design/references/voiceover-pipeline.md +397 -0
  232. package/src/skills-lib/huashu-design/references/workflow.md +216 -0
  233. package/src/skills-lib/huashu-design/scripts/add-music.sh +108 -0
  234. package/src/skills-lib/huashu-design/scripts/convert-formats.sh +83 -0
  235. package/src/skills-lib/huashu-design/scripts/export_deck_pdf.mjs +98 -0
  236. package/src/skills-lib/huashu-design/scripts/export_deck_pptx.mjs +107 -0
  237. package/src/skills-lib/huashu-design/scripts/export_deck_stage_pdf.mjs +130 -0
  238. package/src/skills-lib/huashu-design/scripts/fetch_images.py +94 -0
  239. package/src/skills-lib/huashu-design/scripts/gen_deck_thumbs.mjs +55 -0
  240. package/src/skills-lib/huashu-design/scripts/html2pptx.js +1178 -0
  241. package/src/skills-lib/huashu-design/scripts/mix-voiceover.sh +127 -0
  242. package/src/skills-lib/huashu-design/scripts/narrate-pipeline.mjs +315 -0
  243. package/src/skills-lib/huashu-design/scripts/render-narration.sh +151 -0
  244. package/src/skills-lib/huashu-design/scripts/render-video-seek.js +238 -0
  245. package/src/skills-lib/huashu-design/scripts/render-video.js +289 -0
  246. package/src/skills-lib/huashu-design/scripts/tts-doubao.mjs +184 -0
  247. package/src/skills-lib/huashu-design/scripts/verify.py +154 -0
  248. package/src/skills-lib/huashu-design/test-prompts.json +38 -0
  249. package/src/skills-lib/humanizer/LICENSE +21 -0
  250. package/src/skills-lib/humanizer/README.md +145 -0
  251. package/src/skills-lib/humanizer/SKILL.md +474 -0
  252. package/src/skills-lib/humanizer/WARP.md +53 -0
  253. package/src/skills-lib/impeccable/SKILL.md +186 -0
  254. package/src/skills-lib/implementation-planner/SKILL.md +630 -0
  255. package/src/skills-lib/infrastructure/SKILL.md +34 -0
  256. package/src/skills-lib/inicio-de-projeto/SKILL.md +313 -0
  257. package/src/skills-lib/launch-strategy/SKILL.md +353 -0
  258. package/src/skills-lib/launch-strategy/evals/evals.json +91 -0
  259. package/src/skills-lib/marketing-ideas/SKILL.md +167 -0
  260. package/src/skills-lib/marketing-ideas/evals/evals.json +90 -0
  261. package/src/skills-lib/marketing-ideas/references/ideas-by-category.md +366 -0
  262. package/src/skills-lib/marketing-psychology/SKILL.md +455 -0
  263. package/src/skills-lib/marketing-psychology/evals/evals.json +88 -0
  264. package/src/skills-lib/motion-3d-director/SKILL.md +485 -0
  265. package/src/skills-lib/onboarding-cro/SKILL.md +220 -0
  266. package/src/skills-lib/onboarding-cro/evals/evals.json +92 -0
  267. package/src/skills-lib/onboarding-cro/references/experiments.md +258 -0
  268. package/src/skills-lib/page-cro/SKILL.md +182 -0
  269. package/src/skills-lib/page-cro/evals/evals.json +111 -0
  270. package/src/skills-lib/page-cro/references/experiments.md +248 -0
  271. package/src/skills-lib/paid-ads/SKILL.md +315 -0
  272. package/src/skills-lib/paid-ads/evals/evals.json +90 -0
  273. package/src/skills-lib/paid-ads/references/ad-copy-templates.md +207 -0
  274. package/src/skills-lib/paid-ads/references/audience-targeting.md +243 -0
  275. package/src/skills-lib/paid-ads/references/platform-setup-checklists.md +277 -0
  276. package/src/skills-lib/paywall-upgrade-cro/SKILL.md +227 -0
  277. package/src/skills-lib/paywall-upgrade-cro/evals/evals.json +93 -0
  278. package/src/skills-lib/paywall-upgrade-cro/references/experiments.md +164 -0
  279. package/src/skills-lib/popup-cro/SKILL.md +453 -0
  280. package/src/skills-lib/popup-cro/evals/evals.json +94 -0
  281. package/src/skills-lib/premium-landing-ui-researcher/SKILL.md +2090 -0
  282. package/src/skills-lib/pricing-strategy/SKILL.md +231 -0
  283. package/src/skills-lib/pricing-strategy/evals/evals.json +90 -0
  284. package/src/skills-lib/pricing-strategy/references/research-methods.md +152 -0
  285. package/src/skills-lib/pricing-strategy/references/tier-structure.md +232 -0
  286. package/src/skills-lib/product-marketing-context/SKILL.md +241 -0
  287. package/src/skills-lib/product-marketing-context/evals/evals.json +85 -0
  288. package/src/skills-lib/programmatic-seo/SKILL.md +238 -0
  289. package/src/skills-lib/programmatic-seo/evals/evals.json +94 -0
  290. package/src/skills-lib/programmatic-seo/references/playbooks.md +308 -0
  291. package/src/skills-lib/react-components/README.md +36 -0
  292. package/src/skills-lib/react-components/SKILL.md +51 -0
  293. package/src/skills-lib/react-components/examples/gold-standard-card.tsx +80 -0
  294. package/src/skills-lib/react-components/package-lock.json +231 -0
  295. package/src/skills-lib/react-components/package.json +16 -0
  296. package/src/skills-lib/react-components/resources/architecture-checklist.md +15 -0
  297. package/src/skills-lib/react-components/resources/component-template.tsx +37 -0
  298. package/src/skills-lib/react-components/resources/stitch-api-reference.md +14 -0
  299. package/src/skills-lib/react-components/resources/style-guide.json +27 -0
  300. package/src/skills-lib/react-components/scripts/fetch-stitch.sh +30 -0
  301. package/src/skills-lib/react-components/scripts/validate.js +70 -0
  302. package/src/skills-lib/references/premium-agency-rules.md +79 -0
  303. package/src/skills-lib/referral-program/SKILL.md +255 -0
  304. package/src/skills-lib/referral-program/evals/evals.json +89 -0
  305. package/src/skills-lib/referral-program/references/affiliate-programs.md +164 -0
  306. package/src/skills-lib/referral-program/references/program-examples.md +143 -0
  307. package/src/skills-lib/remotion-best-practices/SKILL.md +61 -0
  308. package/src/skills-lib/remotion-best-practices/rules/3d.md +86 -0
  309. package/src/skills-lib/remotion-best-practices/rules/animations.md +27 -0
  310. package/src/skills-lib/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
  311. package/src/skills-lib/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
  312. package/src/skills-lib/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +103 -0
  313. package/src/skills-lib/remotion-best-practices/rules/assets.md +78 -0
  314. package/src/skills-lib/remotion-best-practices/rules/audio-visualization.md +198 -0
  315. package/src/skills-lib/remotion-best-practices/rules/audio.md +169 -0
  316. package/src/skills-lib/remotion-best-practices/rules/calculate-metadata.md +134 -0
  317. package/src/skills-lib/remotion-best-practices/rules/can-decode.md +75 -0
  318. package/src/skills-lib/remotion-best-practices/rules/charts.md +120 -0
  319. package/src/skills-lib/remotion-best-practices/rules/compositions.md +154 -0
  320. package/src/skills-lib/remotion-best-practices/rules/display-captions.md +184 -0
  321. package/src/skills-lib/remotion-best-practices/rules/extract-frames.md +229 -0
  322. package/src/skills-lib/remotion-best-practices/rules/ffmpeg.md +38 -0
  323. package/src/skills-lib/remotion-best-practices/rules/fonts.md +152 -0
  324. package/src/skills-lib/remotion-best-practices/rules/get-audio-duration.md +58 -0
  325. package/src/skills-lib/remotion-best-practices/rules/get-video-dimensions.md +68 -0
  326. package/src/skills-lib/remotion-best-practices/rules/get-video-duration.md +60 -0
  327. package/src/skills-lib/remotion-best-practices/rules/gifs.md +141 -0
  328. package/src/skills-lib/remotion-best-practices/rules/images.md +134 -0
  329. package/src/skills-lib/remotion-best-practices/rules/import-srt-captions.md +69 -0
  330. package/src/skills-lib/remotion-best-practices/rules/light-leaks.md +73 -0
  331. package/src/skills-lib/remotion-best-practices/rules/lottie.md +70 -0
  332. package/src/skills-lib/remotion-best-practices/rules/maps.md +412 -0
  333. package/src/skills-lib/remotion-best-practices/rules/measuring-dom-nodes.md +34 -0
  334. package/src/skills-lib/remotion-best-practices/rules/measuring-text.md +140 -0
  335. package/src/skills-lib/remotion-best-practices/rules/parameters.md +109 -0
  336. package/src/skills-lib/remotion-best-practices/rules/sequencing.md +118 -0
  337. package/src/skills-lib/remotion-best-practices/rules/sfx.md +26 -0
  338. package/src/skills-lib/remotion-best-practices/rules/subtitles.md +36 -0
  339. package/src/skills-lib/remotion-best-practices/rules/tailwind.md +11 -0
  340. package/src/skills-lib/remotion-best-practices/rules/text-animations.md +20 -0
  341. package/src/skills-lib/remotion-best-practices/rules/timing.md +179 -0
  342. package/src/skills-lib/remotion-best-practices/rules/transcribe-captions.md +70 -0
  343. package/src/skills-lib/remotion-best-practices/rules/transitions.md +197 -0
  344. package/src/skills-lib/remotion-best-practices/rules/transparent-videos.md +106 -0
  345. package/src/skills-lib/remotion-best-practices/rules/trimming.md +51 -0
  346. package/src/skills-lib/remotion-best-practices/rules/videos.md +171 -0
  347. package/src/skills-lib/remotion-best-practices/rules/voiceover.md +99 -0
  348. package/src/skills-lib/revops/SKILL.md +343 -0
  349. package/src/skills-lib/revops/evals/evals.json +91 -0
  350. package/src/skills-lib/revops/references/automation-playbooks.md +290 -0
  351. package/src/skills-lib/revops/references/lifecycle-definitions.md +278 -0
  352. package/src/skills-lib/revops/references/routing-rules.md +203 -0
  353. package/src/skills-lib/revops/references/scoring-models.md +247 -0
  354. package/src/skills-lib/sales-enablement/SKILL.md +349 -0
  355. package/src/skills-lib/sales-enablement/evals/evals.json +91 -0
  356. package/src/skills-lib/sales-enablement/references/deck-frameworks.md +263 -0
  357. package/src/skills-lib/sales-enablement/references/demo-scripts.md +355 -0
  358. package/src/skills-lib/sales-enablement/references/objection-library.md +270 -0
  359. package/src/skills-lib/sales-enablement/references/one-pager-templates.md +208 -0
  360. package/src/skills-lib/schema-markup/SKILL.md +179 -0
  361. package/src/skills-lib/schema-markup/evals/evals.json +87 -0
  362. package/src/skills-lib/schema-markup/references/schema-examples.md +398 -0
  363. package/src/skills-lib/seo-audit/SKILL.md +412 -0
  364. package/src/skills-lib/seo-audit/evals/evals.json +136 -0
  365. package/src/skills-lib/seo-audit/references/ai-writing-detection.md +200 -0
  366. package/src/skills-lib/signup-flow-cro/SKILL.md +359 -0
  367. package/src/skills-lib/signup-flow-cro/evals/evals.json +88 -0
  368. package/src/skills-lib/site-architecture/SKILL.md +357 -0
  369. package/src/skills-lib/site-architecture/evals/evals.json +88 -0
  370. package/src/skills-lib/site-architecture/references/mermaid-templates.md +216 -0
  371. package/src/skills-lib/site-architecture/references/navigation-patterns.md +305 -0
  372. package/src/skills-lib/site-architecture/references/site-type-templates.md +293 -0
  373. package/src/skills-lib/social-content/SKILL.md +278 -0
  374. package/src/skills-lib/social-content/evals/evals.json +92 -0
  375. package/src/skills-lib/social-content/references/platforms.md +170 -0
  376. package/src/skills-lib/social-content/references/post-templates.md +177 -0
  377. package/src/skills-lib/social-content/references/reverse-engineering.md +195 -0
  378. package/src/skills-lib/supabase-postgres-best-practices/AGENTS.md +68 -0
  379. package/src/skills-lib/supabase-postgres-best-practices/CLAUDE.md +68 -0
  380. package/src/skills-lib/supabase-postgres-best-practices/README.md +116 -0
  381. package/src/skills-lib/supabase-postgres-best-practices/SKILL.md +64 -0
  382. package/src/skills-lib/supabase-postgres-best-practices/references/_contributing.md +171 -0
  383. package/src/skills-lib/supabase-postgres-best-practices/references/_sections.md +39 -0
  384. package/src/skills-lib/supabase-postgres-best-practices/references/_template.md +34 -0
  385. package/src/skills-lib/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
  386. package/src/skills-lib/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
  387. package/src/skills-lib/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
  388. package/src/skills-lib/supabase-postgres-best-practices/references/conn-limits.md +44 -0
  389. package/src/skills-lib/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
  390. package/src/skills-lib/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
  391. package/src/skills-lib/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
  392. package/src/skills-lib/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
  393. package/src/skills-lib/supabase-postgres-best-practices/references/data-pagination.md +50 -0
  394. package/src/skills-lib/supabase-postgres-best-practices/references/data-upsert.md +50 -0
  395. package/src/skills-lib/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
  396. package/src/skills-lib/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
  397. package/src/skills-lib/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
  398. package/src/skills-lib/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
  399. package/src/skills-lib/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
  400. package/src/skills-lib/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
  401. package/src/skills-lib/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
  402. package/src/skills-lib/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
  403. package/src/skills-lib/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
  404. package/src/skills-lib/supabase-postgres-best-practices/references/query-index-types.md +48 -0
  405. package/src/skills-lib/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
  406. package/src/skills-lib/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
  407. package/src/skills-lib/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
  408. package/src/skills-lib/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
  409. package/src/skills-lib/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
  410. package/src/skills-lib/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
  411. package/src/skills-lib/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
  412. package/src/skills-lib/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
  413. package/src/skills-lib/supabase-postgres-best-practices/references/security-privileges.md +54 -0
  414. package/src/skills-lib/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
  415. package/src/skills-lib/supabase-postgres-best-practices/references/security-rls-performance.md +57 -0
  416. package/src/skills-lib/taste-redesign/SKILL.md +178 -0
  417. package/src/skills-lib/taste-skill/SKILL.md +1206 -0
  418. package/src/skills-lib/ui-component-curator/SKILL.md +102 -0
  419. package/src/skills-lib/ui-ux-pro-max/SKILL.md +377 -0
  420. package/src/skills-lib/ui-ux-pro-max/data/charts.csv +26 -0
  421. package/src/skills-lib/ui-ux-pro-max/data/colors.csv +97 -0
  422. package/src/skills-lib/ui-ux-pro-max/data/icons.csv +101 -0
  423. package/src/skills-lib/ui-ux-pro-max/data/landing.csv +31 -0
  424. package/src/skills-lib/ui-ux-pro-max/data/products.csv +97 -0
  425. package/src/skills-lib/ui-ux-pro-max/data/react-performance.csv +45 -0
  426. package/src/skills-lib/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  427. package/src/skills-lib/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  428. package/src/skills-lib/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  429. package/src/skills-lib/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  430. package/src/skills-lib/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  431. package/src/skills-lib/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  432. package/src/skills-lib/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  433. package/src/skills-lib/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  434. package/src/skills-lib/ui-ux-pro-max/data/stacks/react.csv +54 -0
  435. package/src/skills-lib/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  436. package/src/skills-lib/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  437. package/src/skills-lib/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  438. package/src/skills-lib/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  439. package/src/skills-lib/ui-ux-pro-max/data/styles.csv +68 -0
  440. package/src/skills-lib/ui-ux-pro-max/data/typography.csv +58 -0
  441. package/src/skills-lib/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  442. package/src/skills-lib/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  443. package/src/skills-lib/ui-ux-pro-max/data/web-interface.csv +31 -0
  444. package/src/skills-lib/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc +0 -0
  445. package/src/skills-lib/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc +0 -0
  446. package/src/skills-lib/ui-ux-pro-max/scripts/__pycache__/search.cpython-314.pyc +0 -0
  447. package/src/skills-lib/ui-ux-pro-max/scripts/core.py +253 -0
  448. package/src/skills-lib/ui-ux-pro-max/scripts/design_system.py +1067 -0
  449. package/src/skills-lib/ui-ux-pro-max/scripts/graphify-out/cache/0964cef300f753b5cee0cc49777ca97035c85d45c212099405d9ee4da36e523f.json +1 -0
  450. package/src/skills-lib/ui-ux-pro-max/scripts/graphify-out/cache/21a40f6810c3a6f17acc3580f106171daf78c7b41bbd066bc80448a821ea0adf.json +1 -0
  451. package/src/skills-lib/ui-ux-pro-max/scripts/graphify-out/cache/69ea15a020ac81b8459e37ef63654398a50c1035fc01c43d8069df217389f7f3.json +1 -0
  452. package/src/skills-lib/ui-ux-pro-max/scripts/search.py +114 -0
  453. package/src/skills-lib/web-security/SKILL.md +147 -0
  454. package/src/skills-lib/wizz-router/SKILL.md +257 -0
  455. package/src/squads/README.md +39 -0
  456. package/src/squads/advisory-board/README.md +34 -0
  457. package/src/squads/advisory-board/agents/board-chair.md +161 -0
  458. package/src/squads/advisory-board/agents/brene-brown.md +296 -0
  459. package/src/squads/advisory-board/agents/charlie-munger.md +590 -0
  460. package/src/squads/advisory-board/agents/derek-sivers.md +268 -0
  461. package/src/squads/advisory-board/agents/naval-ravikant.md +251 -0
  462. package/src/squads/advisory-board/agents/patrick-lencioni.md +394 -0
  463. package/src/squads/advisory-board/agents/peter-thiel.md +269 -0
  464. package/src/squads/advisory-board/agents/ray-dalio.md +587 -0
  465. package/src/squads/advisory-board/agents/reid-hoffman.md +278 -0
  466. package/src/squads/advisory-board/agents/simon-sinek.md +291 -0
  467. package/src/squads/advisory-board/agents/yvon-chouinard.md +275 -0
  468. package/src/squads/advisory-board/squad.yaml +50 -0
  469. package/src/squads/brand-squad/README.md +60 -0
  470. package/src/squads/brand-squad/agents/al-ries.md +175 -0
  471. package/src/squads/brand-squad/agents/alina-wheeler.md +184 -0
  472. package/src/squads/brand-squad/agents/archetype-consultant.md +215 -0
  473. package/src/squads/brand-squad/agents/brand-chief.md +158 -0
  474. package/src/squads/brand-squad/agents/byron-sharp.md +169 -0
  475. package/src/squads/brand-squad/agents/david-aaker.md +166 -0
  476. package/src/squads/brand-squad/agents/denise-yohn.md +172 -0
  477. package/src/squads/brand-squad/agents/domain-scout.md +135 -0
  478. package/src/squads/brand-squad/agents/donald-miller.md +179 -0
  479. package/src/squads/brand-squad/agents/emily-heyward.md +147 -0
  480. package/src/squads/brand-squad/agents/jean-noel-kapferer.md +189 -0
  481. package/src/squads/brand-squad/agents/kevin-keller.md +199 -0
  482. package/src/squads/brand-squad/agents/marty-neumeier.md +170 -0
  483. package/src/squads/brand-squad/agents/miller-sticky-brand.md +180 -0
  484. package/src/squads/brand-squad/agents/naming-strategist.md +171 -0
  485. package/src/squads/brand-squad/squad.yaml +117 -0
  486. package/src/squads/c-level-squad/README.md +29 -0
  487. package/src/squads/c-level-squad/agents/caio-architect.md +235 -0
  488. package/src/squads/c-level-squad/agents/cio-engineer.md +209 -0
  489. package/src/squads/c-level-squad/agents/cmo-architect.md +208 -0
  490. package/src/squads/c-level-squad/agents/coo-orchestrator.md +193 -0
  491. package/src/squads/c-level-squad/agents/cto-architect.md +194 -0
  492. package/src/squads/c-level-squad/agents/vision-chief.md +201 -0
  493. package/src/squads/c-level-squad/squad.yaml +45 -0
  494. package/src/squads/claude-code-mastery/README.md +146 -0
  495. package/src/squads/claude-code-mastery/agents/claude-mastery-chief.md +554 -0
  496. package/src/squads/claude-code-mastery/agents/config-engineer.md +865 -0
  497. package/src/squads/claude-code-mastery/agents/hooks-architect.md +1013 -0
  498. package/src/squads/claude-code-mastery/agents/mcp-integrator.md +791 -0
  499. package/src/squads/claude-code-mastery/agents/project-integrator.md +1196 -0
  500. package/src/squads/claude-code-mastery/agents/roadmap-sentinel.md +931 -0
  501. package/src/squads/claude-code-mastery/agents/skill-craftsman.md +1250 -0
  502. package/src/squads/claude-code-mastery/agents/swarm-orchestrator.md +1008 -0
  503. package/src/squads/copy-squad/README.md +65 -0
  504. package/src/squads/copy-squad/agents/andre-chaperon.md +206 -0
  505. package/src/squads/copy-squad/agents/ben-settle.md +194 -0
  506. package/src/squads/copy-squad/agents/claude-hopkins.md +182 -0
  507. package/src/squads/copy-squad/agents/clayton-makepeace.md +225 -0
  508. package/src/squads/copy-squad/agents/copy-chief.md +166 -0
  509. package/src/squads/copy-squad/agents/dan-kennedy.md +202 -0
  510. package/src/squads/copy-squad/agents/dan-koe.md +223 -0
  511. package/src/squads/copy-squad/agents/david-deutsch.md +197 -0
  512. package/src/squads/copy-squad/agents/david-ogilvy.md +198 -0
  513. package/src/squads/copy-squad/agents/eugene-schwartz.md +238 -0
  514. package/src/squads/copy-squad/agents/frank-kern.md +195 -0
  515. package/src/squads/copy-squad/agents/gary-bencivenga.md +197 -0
  516. package/src/squads/copy-squad/agents/gary-halbert.md +219 -0
  517. package/src/squads/copy-squad/agents/jim-rutz.md +193 -0
  518. package/src/squads/copy-squad/agents/joe-sugarman.md +234 -0
  519. package/src/squads/copy-squad/agents/john-carlton.md +203 -0
  520. package/src/squads/copy-squad/agents/jon-benson.md +196 -0
  521. package/src/squads/copy-squad/agents/parris-lampropoulos.md +188 -0
  522. package/src/squads/copy-squad/agents/robert-collier.md +183 -0
  523. package/src/squads/copy-squad/agents/russell-brunson.md +229 -0
  524. package/src/squads/copy-squad/agents/ry-schwartz.md +185 -0
  525. package/src/squads/copy-squad/agents/stefan-georgi.md +188 -0
  526. package/src/squads/copy-squad/agents/todd-brown.md +171 -0
  527. package/src/squads/copy-squad/squad.yaml +87 -0
  528. package/src/squads/cybersecurity/README.md +38 -0
  529. package/src/squads/cybersecurity/agents/busterer.md +108 -0
  530. package/src/squads/cybersecurity/agents/cartographer.md +114 -0
  531. package/src/squads/cybersecurity/agents/chris-sanders.md +205 -0
  532. package/src/squads/cybersecurity/agents/command-generator.md +121 -0
  533. package/src/squads/cybersecurity/agents/cyber-chief.md +120 -0
  534. package/src/squads/cybersecurity/agents/dirber.md +111 -0
  535. package/src/squads/cybersecurity/agents/fuzzer.md +121 -0
  536. package/src/squads/cybersecurity/agents/georgia-weidman.md +178 -0
  537. package/src/squads/cybersecurity/agents/jim-manico.md +182 -0
  538. package/src/squads/cybersecurity/agents/marcus-carey.md +200 -0
  539. package/src/squads/cybersecurity/agents/omar-santos.md +206 -0
  540. package/src/squads/cybersecurity/agents/peter-kim.md +179 -0
  541. package/src/squads/cybersecurity/agents/ripper.md +121 -0
  542. package/src/squads/cybersecurity/agents/rogue.md +116 -0
  543. package/src/squads/cybersecurity/agents/shannon-runner.md +108 -0
  544. package/src/squads/cybersecurity/squad.yaml +56 -0
  545. package/src/squads/data-squad/README.md +30 -0
  546. package/src/squads/data-squad/agents/avinash-kaushik.md +268 -0
  547. package/src/squads/data-squad/agents/data-chief.md +167 -0
  548. package/src/squads/data-squad/agents/david-spinks.md +277 -0
  549. package/src/squads/data-squad/agents/nick-mehta.md +294 -0
  550. package/src/squads/data-squad/agents/peter-fader.md +246 -0
  551. package/src/squads/data-squad/agents/sean-ellis.md +303 -0
  552. package/src/squads/data-squad/agents/wes-kao.md +268 -0
  553. package/src/squads/data-squad/squad.yaml +46 -0
  554. package/src/squads/design-squad/README.md +31 -0
  555. package/src/squads/design-squad/agents/brad-frost.md +185 -0
  556. package/src/squads/design-squad/agents/dan-mall.md +178 -0
  557. package/src/squads/design-squad/agents/dave-malouf.md +198 -0
  558. package/src/squads/design-squad/agents/design-chief.md +109 -0
  559. package/src/squads/design-squad/agents/design-system-architect.md +109 -0
  560. package/src/squads/design-squad/agents/ui-engineer.md +102 -0
  561. package/src/squads/design-squad/agents/ux-designer.md +105 -0
  562. package/src/squads/design-squad/agents/visual-generator.md +108 -0
  563. package/src/squads/design-squad/squad.yaml +48 -0
  564. package/src/squads/hormozi-squad/README.md +39 -0
  565. package/src/squads/hormozi-squad/agents/hormozi-ads.md +159 -0
  566. package/src/squads/hormozi-squad/agents/hormozi-advisor.md +178 -0
  567. package/src/squads/hormozi-squad/agents/hormozi-audit.md +178 -0
  568. package/src/squads/hormozi-squad/agents/hormozi-chief.md +111 -0
  569. package/src/squads/hormozi-squad/agents/hormozi-closer.md +179 -0
  570. package/src/squads/hormozi-squad/agents/hormozi-content.md +166 -0
  571. package/src/squads/hormozi-squad/agents/hormozi-copy.md +152 -0
  572. package/src/squads/hormozi-squad/agents/hormozi-hooks.md +177 -0
  573. package/src/squads/hormozi-squad/agents/hormozi-launch.md +160 -0
  574. package/src/squads/hormozi-squad/agents/hormozi-leads.md +198 -0
  575. package/src/squads/hormozi-squad/agents/hormozi-models.md +191 -0
  576. package/src/squads/hormozi-squad/agents/hormozi-offers.md +197 -0
  577. package/src/squads/hormozi-squad/agents/hormozi-pricing.md +151 -0
  578. package/src/squads/hormozi-squad/agents/hormozi-retention.md +166 -0
  579. package/src/squads/hormozi-squad/agents/hormozi-scale.md +175 -0
  580. package/src/squads/hormozi-squad/agents/hormozi-workshop.md +160 -0
  581. package/src/squads/hormozi-squad/squad.yaml +60 -0
  582. package/src/squads/movement/README.md +29 -0
  583. package/src/squads/movement/agents/analista-de-impacto.md +350 -0
  584. package/src/squads/movement/agents/estrategista-de-ciclo.md +301 -0
  585. package/src/squads/movement/agents/fenomenologo.md +169 -0
  586. package/src/squads/movement/agents/identitario.md +265 -0
  587. package/src/squads/movement/agents/manifestador.md +279 -0
  588. package/src/squads/movement/agents/movement-architect.md +210 -0
  589. package/src/squads/movement/agents/movement-chief.md +135 -0
  590. package/src/squads/movement/squad.yaml +45 -0
  591. package/src/squads/storytelling/README.md +35 -0
  592. package/src/squads/storytelling/agents/blake-snyder.md +225 -0
  593. package/src/squads/storytelling/agents/dan-harmon.md +167 -0
  594. package/src/squads/storytelling/agents/joseph-campbell.md +184 -0
  595. package/src/squads/storytelling/agents/keith-johnstone.md +157 -0
  596. package/src/squads/storytelling/agents/kindra-hall.md +162 -0
  597. package/src/squads/storytelling/agents/marshall-ganz.md +167 -0
  598. package/src/squads/storytelling/agents/matthew-dicks.md +152 -0
  599. package/src/squads/storytelling/agents/nancy-duarte.md +154 -0
  600. package/src/squads/storytelling/agents/oren-klaff.md +166 -0
  601. package/src/squads/storytelling/agents/park-howell.md +152 -0
  602. package/src/squads/storytelling/agents/shawn-coyne.md +208 -0
  603. package/src/squads/storytelling/agents/story-chief.md +155 -0
  604. package/src/squads/storytelling/squad.yaml +52 -0
  605. package/src/squads/traffic-masters/README.md +39 -0
  606. package/src/squads/traffic-masters/agents/ad-midas.md +149 -0
  607. package/src/squads/traffic-masters/agents/ads-analyst.md +135 -0
  608. package/src/squads/traffic-masters/agents/creative-analyst.md +142 -0
  609. package/src/squads/traffic-masters/agents/depesh-mandalia.md +174 -0
  610. package/src/squads/traffic-masters/agents/fiscal.md +144 -0
  611. package/src/squads/traffic-masters/agents/kasim-aslam.md +158 -0
  612. package/src/squads/traffic-masters/agents/media-buyer.md +159 -0
  613. package/src/squads/traffic-masters/agents/molly-pittman.md +185 -0
  614. package/src/squads/traffic-masters/agents/nicholas-kusmich.md +157 -0
  615. package/src/squads/traffic-masters/agents/pedro-sobral.md +158 -0
  616. package/src/squads/traffic-masters/agents/performance-analyst.md +135 -0
  617. package/src/squads/traffic-masters/agents/pixel-specialist.md +144 -0
  618. package/src/squads/traffic-masters/agents/ralph-burns.md +163 -0
  619. package/src/squads/traffic-masters/agents/scale-optimizer.md +144 -0
  620. package/src/squads/traffic-masters/agents/tom-breeze.md +175 -0
  621. package/src/squads/traffic-masters/agents/traffic-chief.md +97 -0
  622. package/src/squads/traffic-masters/squad.yaml +59 -0
  623. package/tools/installer/commands/install.js +12 -0
  624. package/tools/installer/core/config.js +20 -0
  625. package/tools/installer/core/installer.js +100 -0
  626. package/tools/installer/core/manifest-generator.js +14 -3
  627. package/tools/installer/modules/cli-config.js +145 -0
  628. package/tools/installer/modules/mcp-config.js +137 -0
  629. package/tools/installer/modules/skills-lib.js +135 -0
  630. package/tools/installer/ui.js +210 -0
@@ -0,0 +1,1134 @@
1
+ <!doctype html>
2
+ <html lang="zh-Hans">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <title>huashu-design · c3 motion design(中文版)</title>
6
+ <link rel="preconnect" href="https://fonts.googleapis.com">
7
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
8
+ <link href="https://fonts.googleapis.com/css2?family=Source+Serif+4:ital,opsz,wght@0,8..60,300..700;1,8..60,300..700&family=Noto+Serif+SC:wght@300;400;500;600;700&family=Inter:wght@100;200;300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
9
+ <style>
10
+ :root {
11
+ --bg: #000000;
12
+ --ink: #FFFFFF;
13
+ --ink-80: rgba(255,255,255,0.82);
14
+ --ink-60: rgba(255,255,255,0.58);
15
+ --muted: rgba(255,255,255,0.40);
16
+ --dim: rgba(255,255,255,0.18);
17
+ --hairline: rgba(255,255,255,0.12);
18
+ --hair-strong: rgba(255,255,255,0.22);
19
+ --accent: #D97757;
20
+ --accent-deep: #B85D3D;
21
+ --accent-dim: rgba(217,119,87,0.25);
22
+ --serif-cn: "Noto Serif SC", "Songti SC", "STSong", serif;
23
+ --serif-en: "Source Serif 4", "Tiempos Headline", Georgia, serif;
24
+ --sans: "Inter", -apple-system, "PingFang SC", "HarmonyOS Sans SC", system-ui, sans-serif;
25
+ --mono: "JetBrains Mono", "SF Mono", ui-monospace, monospace;
26
+ }
27
+
28
+ html, body {
29
+ margin: 0; padding: 0;
30
+ background: #000;
31
+ overflow: hidden;
32
+ font-family: var(--sans);
33
+ color: var(--ink);
34
+ -webkit-font-smoothing: antialiased;
35
+ }
36
+ * { box-sizing: border-box; }
37
+
38
+ .stage {
39
+ position: fixed;
40
+ top: 50%; left: 50%;
41
+ width: 1920px; height: 1080px;
42
+ transform-origin: center center;
43
+ background: var(--bg);
44
+ overflow: hidden;
45
+ }
46
+
47
+ /* Subtle film grain overlay, 2% */
48
+ .stage::after {
49
+ content: '';
50
+ position: absolute; inset: 0;
51
+ pointer-events: none;
52
+ opacity: 0.025;
53
+ background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='300' height='300'><filter id='n'><feTurbulence baseFrequency='0.9' numOctaves='2'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");
54
+ mix-blend-mode: overlay;
55
+ z-index: 200;
56
+ }
57
+
58
+ /* Watermark */
59
+ .watermark-tl {
60
+ position: absolute;
61
+ top: 40px; left: 56px;
62
+ font-family: var(--mono);
63
+ font-size: 14px;
64
+ letter-spacing: 0.2em;
65
+ color: rgba(255,255,255,0.16);
66
+ z-index: 50;
67
+ text-transform: none;
68
+ font-weight: 500;
69
+ }
70
+ .watermark-br {
71
+ position: absolute;
72
+ bottom: 32px; right: 48px;
73
+ font-family: var(--mono);
74
+ font-size: 10px;
75
+ letter-spacing: 0.24em;
76
+ color: rgba(255,255,255,0.22);
77
+ z-index: 100;
78
+ text-transform: uppercase;
79
+ opacity: 0;
80
+ transition: opacity 0.6s;
81
+ }
82
+ .watermark-br.visible { opacity: 1; }
83
+
84
+ /* Scene container */
85
+ .scene {
86
+ position: absolute; inset: 0;
87
+ opacity: 0;
88
+ visibility: hidden;
89
+ will-change: opacity;
90
+ }
91
+ .scene.visible { visibility: visible; }
92
+
93
+ /* ============ Split layout ============ */
94
+ .split {
95
+ position: absolute; inset: 0;
96
+ }
97
+ .split-top {
98
+ position: absolute;
99
+ top: 0; left: 0;
100
+ width: 100%; height: 48%;
101
+ display: flex;
102
+ align-items: center;
103
+ justify-content: center;
104
+ }
105
+ .split-bottom {
106
+ position: absolute;
107
+ bottom: 0; left: 0;
108
+ width: 100%; height: 52%;
109
+ }
110
+
111
+ /* Horizontal divider hairline */
112
+ .split-divider {
113
+ position: absolute;
114
+ left: 160px; right: 160px;
115
+ top: 48%;
116
+ height: 1px;
117
+ background: var(--hairline);
118
+ z-index: 5;
119
+ }
120
+
121
+ /* Section label (top-left of each half) */
122
+ .panel-label {
123
+ position: absolute;
124
+ top: 32px;
125
+ left: 160px;
126
+ font-family: var(--mono);
127
+ font-size: 12px;
128
+ letter-spacing: 0.3em;
129
+ color: var(--muted);
130
+ text-transform: uppercase;
131
+ }
132
+ .split-bottom .panel-label { top: 32px; }
133
+ .panel-label .accent { color: var(--accent); font-weight: 500; }
134
+
135
+ /* ============ Top: Timeline ============ */
136
+ .timeline-wrap {
137
+ width: 1600px;
138
+ position: relative;
139
+ margin-top: 40px;
140
+ }
141
+ .timeline-track {
142
+ position: relative;
143
+ height: 2px;
144
+ background: var(--hairline);
145
+ width: 100%;
146
+ }
147
+ .timeline-track .fill {
148
+ position: absolute;
149
+ top: 0; left: 0;
150
+ height: 100%;
151
+ background: linear-gradient(90deg, var(--accent) 0%, rgba(217,119,87,0.4) 100%);
152
+ width: 0%;
153
+ will-change: width;
154
+ }
155
+
156
+ /* Tick marks */
157
+ .tick {
158
+ position: absolute;
159
+ width: 1px;
160
+ height: 10px;
161
+ background: var(--muted);
162
+ top: -4px;
163
+ transform: translateX(-0.5px);
164
+ }
165
+ .tick.major { height: 14px; top: -6px; background: var(--ink-60); }
166
+ .tick-label {
167
+ position: absolute;
168
+ top: 18px;
169
+ font-family: var(--mono);
170
+ font-size: 11px;
171
+ color: var(--muted);
172
+ letter-spacing: 0.1em;
173
+ transform: translateX(-50%);
174
+ }
175
+
176
+ /* Playhead */
177
+ .playhead {
178
+ position: absolute;
179
+ top: -28px;
180
+ left: 0;
181
+ width: 2px;
182
+ height: 58px;
183
+ background: var(--accent);
184
+ transform: translateX(-1px);
185
+ will-change: transform;
186
+ z-index: 10;
187
+ box-shadow: 0 0 20px rgba(217,119,87,0.5);
188
+ }
189
+ .playhead::before {
190
+ content: '';
191
+ position: absolute;
192
+ top: -8px;
193
+ left: 50%;
194
+ transform: translateX(-50%);
195
+ width: 14px; height: 14px;
196
+ background: var(--accent);
197
+ border-radius: 50%;
198
+ box-shadow: 0 0 16px rgba(217,119,87,0.6);
199
+ }
200
+ .playhead::after {
201
+ content: '';
202
+ position: absolute;
203
+ top: -6px;
204
+ left: 50%;
205
+ transform: translateX(-50%);
206
+ width: 6px; height: 6px;
207
+ background: var(--bg);
208
+ border-radius: 50%;
209
+ z-index: 2;
210
+ }
211
+
212
+ /* API capsules on timeline */
213
+ .api-capsule {
214
+ position: absolute;
215
+ top: -92px;
216
+ transform: translateX(-50%);
217
+ padding: 10px 20px;
218
+ border: 1px solid var(--hairline);
219
+ border-radius: 999px;
220
+ background: rgba(0,0,0,0.6);
221
+ backdrop-filter: blur(8px);
222
+ font-family: var(--mono);
223
+ font-size: 18px;
224
+ font-weight: 500;
225
+ color: var(--ink-60);
226
+ letter-spacing: 0.02em;
227
+ transition: none;
228
+ will-change: color, border-color, transform, box-shadow;
229
+ white-space: nowrap;
230
+ }
231
+ .api-capsule.lit {
232
+ color: var(--accent);
233
+ border-color: var(--accent);
234
+ box-shadow: 0 0 30px rgba(217,119,87,0.35);
235
+ }
236
+ .api-capsule .tiny {
237
+ font-size: 10px;
238
+ color: var(--muted);
239
+ letter-spacing: 0.2em;
240
+ margin-right: 10px;
241
+ display: inline-block;
242
+ vertical-align: middle;
243
+ opacity: 0.7;
244
+ }
245
+ .api-capsule.lit .tiny { color: var(--accent); opacity: 0.9; }
246
+
247
+ /* Tick connector (short vertical line from capsule to timeline) */
248
+ .capsule-stem {
249
+ position: absolute;
250
+ top: -48px;
251
+ width: 1px;
252
+ height: 44px;
253
+ background: var(--hairline);
254
+ transform: translateX(-0.5px);
255
+ z-index: 1;
256
+ }
257
+ .capsule-stem.lit { background: var(--accent); }
258
+
259
+ /* ============ Bottom: Driven stage ============ */
260
+ .driven-stage {
261
+ position: absolute;
262
+ top: 0; left: 0;
263
+ width: 100%; height: 100%;
264
+ }
265
+
266
+ .viz {
267
+ position: absolute;
268
+ top: 46%; left: 50%;
269
+ transform: translate(-50%, -50%);
270
+ width: 1000px; height: 400px;
271
+ opacity: 0;
272
+ will-change: opacity;
273
+ display: flex;
274
+ align-items: center;
275
+ justify-content: center;
276
+ }
277
+
278
+ /* viz 1: useTime — clock */
279
+ .viz-clock {
280
+ position: relative;
281
+ width: 280px; height: 280px;
282
+ border: 1.5px solid var(--hair-strong);
283
+ border-radius: 50%;
284
+ display: flex;
285
+ align-items: center;
286
+ justify-content: center;
287
+ }
288
+ .viz-clock .tickmark {
289
+ position: absolute;
290
+ width: 1px;
291
+ height: 8px;
292
+ background: var(--muted);
293
+ top: 10px;
294
+ left: 50%;
295
+ transform-origin: 50% 130px;
296
+ }
297
+ .viz-clock .tickmark.q {
298
+ width: 2px;
299
+ height: 14px;
300
+ background: var(--ink-60);
301
+ }
302
+ .viz-clock .hand-h {
303
+ position: absolute;
304
+ width: 3px; height: 80px;
305
+ background: var(--ink);
306
+ left: 50%;
307
+ bottom: 50%;
308
+ transform-origin: 50% 100%;
309
+ transform: translateX(-50%) rotate(30deg);
310
+ border-radius: 2px;
311
+ will-change: transform;
312
+ }
313
+ .viz-clock .hand-m {
314
+ position: absolute;
315
+ width: 2px; height: 110px;
316
+ background: var(--ink-80);
317
+ left: 50%;
318
+ bottom: 50%;
319
+ transform-origin: 50% 100%;
320
+ transform: translateX(-50%) rotate(120deg);
321
+ border-radius: 2px;
322
+ will-change: transform;
323
+ }
324
+ .viz-clock .hand-s {
325
+ position: absolute;
326
+ width: 1.5px; height: 120px;
327
+ background: var(--accent);
328
+ left: 50%;
329
+ bottom: 50%;
330
+ transform-origin: 50% 100%;
331
+ transform: translateX(-50%) rotate(0deg);
332
+ border-radius: 2px;
333
+ will-change: transform;
334
+ box-shadow: 0 0 10px rgba(217,119,87,0.4);
335
+ }
336
+ .viz-clock .center-dot {
337
+ width: 12px; height: 12px;
338
+ border-radius: 50%;
339
+ background: var(--accent);
340
+ z-index: 5;
341
+ box-shadow: 0 0 10px rgba(217,119,87,0.6);
342
+ }
343
+ .viz-clock-label {
344
+ position: absolute;
345
+ bottom: -48px;
346
+ left: 50%;
347
+ transform: translateX(-50%);
348
+ font-family: var(--mono);
349
+ font-size: 13px;
350
+ color: var(--muted);
351
+ letter-spacing: 0.12em;
352
+ white-space: nowrap;
353
+ }
354
+ .viz-clock-label .val {
355
+ color: var(--accent);
356
+ font-variant-numeric: tabular-nums;
357
+ }
358
+
359
+ /* viz 2: interpolate — morph box */
360
+ .viz-morph {
361
+ display: flex;
362
+ gap: 80px;
363
+ align-items: center;
364
+ justify-content: center;
365
+ width: 100%;
366
+ }
367
+ .morph-box {
368
+ width: 260px; height: 260px;
369
+ position: relative;
370
+ display: flex;
371
+ align-items: center;
372
+ justify-content: center;
373
+ }
374
+ .morph-rect {
375
+ background: var(--accent);
376
+ border-radius: 4px;
377
+ will-change: width, height, background, border-radius, transform;
378
+ box-shadow: 0 0 40px rgba(217,119,87,0.25);
379
+ }
380
+ .morph-label {
381
+ position: absolute;
382
+ bottom: -48px;
383
+ left: 50%;
384
+ transform: translateX(-50%);
385
+ font-family: var(--mono);
386
+ font-size: 12px;
387
+ color: var(--muted);
388
+ letter-spacing: 0.12em;
389
+ white-space: nowrap;
390
+ }
391
+ .morph-label .val { color: var(--accent); font-variant-numeric: tabular-nums; }
392
+ .morph-arrow {
393
+ font-family: var(--mono);
394
+ font-size: 28px;
395
+ color: var(--muted);
396
+ letter-spacing: 0.2em;
397
+ }
398
+
399
+ /* viz 3: Easing — curves */
400
+ .viz-curves {
401
+ position: relative;
402
+ width: 720px; height: 320px;
403
+ display: flex;
404
+ align-items: center;
405
+ justify-content: center;
406
+ }
407
+ .curves-svg {
408
+ width: 100%; height: 100%;
409
+ }
410
+ .curve-label {
411
+ position: absolute;
412
+ font-family: var(--mono);
413
+ font-size: 12px;
414
+ color: var(--muted);
415
+ letter-spacing: 0.08em;
416
+ white-space: nowrap;
417
+ }
418
+ /* viewBox 720x320 → right edge ≈ 680 of 720 → 94%. Vertical:
419
+ y=40 is visual top (output value 1), y=260 is bottom (value 0).
420
+ Labels go at right side, vertically aligned with where each curve
421
+ approaches its asymptote at t≈0.7.
422
+ expoOut at t=0.7 ~ 0.99 (≈ y=42)
423
+ cubicOut at t=0.7 ~ 0.973 (≈ y=46)
424
+ linear at t=0.7 ~ 0.7 (≈ y=106)
425
+ So spatial order top→bottom: expoOut, cubicOut, linear
426
+ */
427
+ .curve-label.l-expo { top: 6%; right: 4%; color: var(--accent); }
428
+ .curve-label.l-cubic { top: 16%; right: 4%; color: rgba(255,255,255,0.78); }
429
+ .curve-label.l-linear { top: 36%; right: 4%; color: rgba(255,255,255,0.42); }
430
+
431
+ .curve-dot {
432
+ position: absolute;
433
+ width: 10px; height: 10px;
434
+ border-radius: 50%;
435
+ background: var(--accent);
436
+ transform: translate(-50%, -50%);
437
+ box-shadow: 0 0 14px rgba(217,119,87,0.6);
438
+ will-change: left, top;
439
+ }
440
+
441
+ /* viz 4: useSprite — choreographed grid */
442
+ .viz-sprites {
443
+ display: grid;
444
+ grid-template-columns: repeat(6, 60px);
445
+ grid-template-rows: repeat(4, 60px);
446
+ gap: 18px;
447
+ justify-content: center;
448
+ align-content: center;
449
+ padding: 40px 0;
450
+ }
451
+ .sprite {
452
+ width: 60px; height: 60px;
453
+ background: var(--hairline);
454
+ border: 1px solid var(--dim);
455
+ will-change: transform, opacity, background;
456
+ opacity: 0;
457
+ border-radius: 2px;
458
+ }
459
+
460
+ .sprite-label {
461
+ position: absolute;
462
+ bottom: -6px;
463
+ left: 50%;
464
+ transform: translateX(-50%);
465
+ font-family: var(--mono);
466
+ font-size: 12px;
467
+ color: var(--muted);
468
+ letter-spacing: 0.12em;
469
+ white-space: nowrap;
470
+ }
471
+ .sprite-label .val { color: var(--accent); font-variant-numeric: tabular-nums; }
472
+
473
+ /* ============ Scene 0: Opening title ============ */
474
+ .scene-intro {
475
+ display: flex;
476
+ flex-direction: column;
477
+ align-items: center;
478
+ justify-content: center;
479
+ }
480
+ .scene-intro .title {
481
+ font-family: var(--serif-cn);
482
+ font-size: 108px;
483
+ font-weight: 300;
484
+ letter-spacing: -0.02em;
485
+ color: var(--ink);
486
+ line-height: 1.05;
487
+ will-change: opacity, transform, font-weight;
488
+ }
489
+ .scene-intro .title .accent { color: var(--accent); }
490
+ .scene-intro .sub {
491
+ margin-top: 28px;
492
+ font-family: var(--mono);
493
+ font-size: 16px;
494
+ color: var(--muted);
495
+ letter-spacing: 0.3em;
496
+ }
497
+
498
+ /* ============ Scene 2: Brand reveal (米色面板标准动作) ============ */
499
+ .scene-brand {
500
+ background: transparent;
501
+ pointer-events: none;
502
+ z-index: 150;
503
+ }
504
+ .brand-panel {
505
+ position: absolute;
506
+ inset: 0;
507
+ background: #F5F4F0;
508
+ transform: translateY(100%);
509
+ will-change: transform;
510
+ }
511
+ .brand-wordmark {
512
+ position: absolute;
513
+ top: 50%;
514
+ left: 50%;
515
+ transform: translate(-50%, calc(-50% + 20px));
516
+ font-family: "Source Serif 4", Georgia, serif;
517
+ font-size: 72px;
518
+ font-weight: 100;
519
+ font-variation-settings: "wght" 100;
520
+ letter-spacing: -0.01em;
521
+ color: #1A1918;
522
+ text-align: center;
523
+ line-height: 1;
524
+ opacity: 0;
525
+ white-space: nowrap;
526
+ will-change: opacity, transform, font-weight, font-variation-settings;
527
+ }
528
+ .brand-wordmark .accent { color: #D97757; font-weight: inherit; }
529
+ .brand-line {
530
+ position: absolute;
531
+ top: calc(50% + 60px);
532
+ left: 50%;
533
+ transform: translateX(-50%);
534
+ height: 2px;
535
+ width: 0px;
536
+ background: #D97757;
537
+ will-change: width;
538
+ }
539
+
540
+ /* ============ Replay button (hidden during record) ============ */
541
+ .replay-btn {
542
+ position: absolute;
543
+ bottom: 40px;
544
+ left: 50%;
545
+ transform: translateX(-50%);
546
+ padding: 12px 32px;
547
+ border: 1px solid var(--hair-strong);
548
+ border-radius: 999px;
549
+ background: transparent;
550
+ color: var(--ink-60);
551
+ font-family: var(--mono);
552
+ font-size: 13px;
553
+ letter-spacing: 0.2em;
554
+ cursor: pointer;
555
+ opacity: 0;
556
+ pointer-events: none;
557
+ transition: opacity 0.4s;
558
+ z-index: 300;
559
+ }
560
+ .replay-btn.visible {
561
+ opacity: 1;
562
+ pointer-events: auto;
563
+ }
564
+ </style>
565
+ </head>
566
+ <body>
567
+
568
+ <div class="stage" id="stage">
569
+
570
+ <!-- Top-left watermark (always on) -->
571
+ <div class="watermark-tl">HUASHU · DESIGN</div>
572
+
573
+ <!-- ============ Scene 0: Intro (0 → 1.6s) ============ -->
574
+ <div class="scene scene-intro" id="scene-intro">
575
+ <div class="title" id="introTitle">时间轴 <span class="accent">=</span> 代码</div>
576
+ <div class="sub" id="introSub">TIMELINE · MOTION · ENGINE</div>
577
+ </div>
578
+
579
+ <!-- ============ Scene 1: Split view (1.6 → 8.2s) ============ -->
580
+ <div class="scene" id="scene-main">
581
+ <div class="split">
582
+
583
+ <!-- TOP: Timeline -->
584
+ <div class="split-top">
585
+ <div class="panel-label">TIMELINE · <span class="accent">PLAYHEAD</span></div>
586
+ <div class="timeline-wrap">
587
+ <div class="timeline-track">
588
+ <div class="fill" id="timelineFill"></div>
589
+
590
+ <!-- Tick marks (10 ticks for 10s) -->
591
+ <div class="tick" style="left: 0%;"></div>
592
+ <div class="tick major" style="left: 0%;"></div>
593
+ <div class="tick" style="left: 10%;"></div>
594
+ <div class="tick major" style="left: 20%;"></div>
595
+ <div class="tick" style="left: 30%;"></div>
596
+ <div class="tick major" style="left: 40%;"></div>
597
+ <div class="tick" style="left: 50%;"></div>
598
+ <div class="tick major" style="left: 60%;"></div>
599
+ <div class="tick" style="left: 70%;"></div>
600
+ <div class="tick major" style="left: 80%;"></div>
601
+ <div class="tick" style="left: 90%;"></div>
602
+ <div class="tick major" style="left: 100%;"></div>
603
+
604
+ <div class="tick-label" style="left: 0%;">0s</div>
605
+ <div class="tick-label" style="left: 20%;">2s</div>
606
+ <div class="tick-label" style="left: 40%;">4s</div>
607
+ <div class="tick-label" style="left: 60%;">6s</div>
608
+ <div class="tick-label" style="left: 80%;">8s</div>
609
+ <div class="tick-label" style="left: 100%;">10s</div>
610
+
611
+ <!-- API capsules anchored at their trigger points -->
612
+ <!-- Scene-main spans 1.6→8.2; timeline maps 0→10s globally for clarity.
613
+ cap positions here mirror when each API is "active" on the lower viz. -->
614
+ <!-- useTime: global t = 1.8 → 3.3 → center ~2.5s → 25% -->
615
+ <div class="capsule-stem" id="stem-time" style="left: 18%;"></div>
616
+ <div class="api-capsule" id="cap-time" style="left: 18%;">
617
+ <span class="tiny">01</span>useTime
618
+ </div>
619
+
620
+ <!-- interpolate: 3.5 → 5s → center 4.2s → 42% -->
621
+ <div class="capsule-stem" id="stem-interp" style="left: 38%;"></div>
622
+ <div class="api-capsule" id="cap-interp" style="left: 38%;">
623
+ <span class="tiny">02</span>interpolate
624
+ </div>
625
+
626
+ <!-- Easing: 5 → 6.5s → center 5.7s → 57% -->
627
+ <div class="capsule-stem" id="stem-easing" style="left: 58%;"></div>
628
+ <div class="api-capsule" id="cap-easing" style="left: 58%;">
629
+ <span class="tiny">03</span>Easing
630
+ </div>
631
+
632
+ <!-- useSprite: 6.5 → 8s → center 7.2s → 72% -->
633
+ <div class="capsule-stem" id="stem-sprite" style="left: 80%;"></div>
634
+ <div class="api-capsule" id="cap-sprite" style="left: 80%;">
635
+ <span class="tiny">04</span>useSprite
636
+ </div>
637
+
638
+ <!-- Playhead -->
639
+ <div class="playhead" id="playhead"></div>
640
+ </div>
641
+ </div>
642
+ </div>
643
+
644
+ <!-- Divider -->
645
+ <div class="split-divider"></div>
646
+
647
+ <!-- BOTTOM: Driven stage -->
648
+ <div class="split-bottom">
649
+ <div class="panel-label">DRIVEN · <span class="accent">STAGE</span></div>
650
+ <div class="driven-stage">
651
+
652
+ <!-- viz 1: useTime — clock -->
653
+ <div class="viz" id="viz-time">
654
+ <div class="viz-clock" id="clockRoot">
655
+ <!-- 12 tick marks -->
656
+ <div class="tickmark q" style="transform: translate(-50%, 0) rotate(0deg);"></div>
657
+ <div class="tickmark" style="transform: translate(-50%, 0) rotate(30deg);"></div>
658
+ <div class="tickmark" style="transform: translate(-50%, 0) rotate(60deg);"></div>
659
+ <div class="tickmark q" style="transform: translate(-50%, 0) rotate(90deg);"></div>
660
+ <div class="tickmark" style="transform: translate(-50%, 0) rotate(120deg);"></div>
661
+ <div class="tickmark" style="transform: translate(-50%, 0) rotate(150deg);"></div>
662
+ <div class="tickmark q" style="transform: translate(-50%, 0) rotate(180deg);"></div>
663
+ <div class="tickmark" style="transform: translate(-50%, 0) rotate(210deg);"></div>
664
+ <div class="tickmark" style="transform: translate(-50%, 0) rotate(240deg);"></div>
665
+ <div class="tickmark q" style="transform: translate(-50%, 0) rotate(270deg);"></div>
666
+ <div class="tickmark" style="transform: translate(-50%, 0) rotate(300deg);"></div>
667
+ <div class="tickmark" style="transform: translate(-50%, 0) rotate(330deg);"></div>
668
+
669
+ <div class="hand-h" id="handH"></div>
670
+ <div class="hand-m" id="handM"></div>
671
+ <div class="hand-s" id="handS"></div>
672
+ <div class="center-dot"></div>
673
+
674
+ <div class="viz-clock-label">
675
+ t = <span class="val" id="timeVal">0.00s</span>
676
+ </div>
677
+ </div>
678
+ </div>
679
+
680
+ <!-- viz 2: interpolate — morph -->
681
+ <div class="viz" id="viz-interp">
682
+ <div class="viz-morph">
683
+ <div class="morph-box">
684
+ <div class="morph-rect" id="morphFrom" style="width: 80px; height: 80px; background: var(--hair-strong); border-radius: 2px;"></div>
685
+ <div class="morph-label">FROM · <span class="val">0 → 100</span></div>
686
+ </div>
687
+ <div class="morph-arrow">──────→</div>
688
+ <div class="morph-box">
689
+ <div class="morph-rect" id="morphTo"></div>
690
+ <div class="morph-label">INTERPOLATE · <span class="val" id="interpVal">0.00</span></div>
691
+ </div>
692
+ </div>
693
+ </div>
694
+
695
+ <!-- viz 3: Easing — 3 curves drawn in parallel -->
696
+ <div class="viz" id="viz-easing">
697
+ <div class="viz-curves">
698
+ <svg class="curves-svg" viewBox="0 0 720 320" preserveAspectRatio="none">
699
+ <!-- Grid -->
700
+ <line x1="60" y1="260" x2="680" y2="260" stroke="rgba(255,255,255,0.18)" stroke-width="1"/>
701
+ <line x1="60" y1="260" x2="60" y2="40" stroke="rgba(255,255,255,0.18)" stroke-width="1"/>
702
+
703
+ <!-- Axis labels -->
704
+ <text x="50" y="266" text-anchor="end" fill="rgba(255,255,255,0.4)" font-family="JetBrains Mono, monospace" font-size="11">0</text>
705
+ <text x="50" y="48" text-anchor="end" fill="rgba(255,255,255,0.4)" font-family="JetBrains Mono, monospace" font-size="11">1</text>
706
+ <text x="680" y="282" text-anchor="end" fill="rgba(255,255,255,0.4)" font-family="JetBrains Mono, monospace" font-size="11">t</text>
707
+
708
+ <!-- Curves -->
709
+ <path id="pathLinear" d="M 60 260 L 60 260" stroke="rgba(255,255,255,0.42)" stroke-width="1.5" fill="none" stroke-linecap="round"/>
710
+ <path id="pathCubic" d="M 60 260 L 60 260" stroke="rgba(255,255,255,0.75)" stroke-width="1.8" fill="none" stroke-linecap="round"/>
711
+ <path id="pathExpo" d="M 60 260 L 60 260" stroke="#D97757" stroke-width="2.2" fill="none" stroke-linecap="round"/>
712
+ </svg>
713
+ <div class="curve-label l-linear">linear</div>
714
+ <div class="curve-label l-cubic">cubicOut</div>
715
+ <div class="curve-label l-expo">expoOut</div>
716
+ </div>
717
+ </div>
718
+
719
+ <!-- viz 4: useSprite — 24 sprites -->
720
+ <div class="viz" id="viz-sprite">
721
+ <div class="viz-sprites" id="spriteGrid">
722
+ <!-- 24 sprites (6x4), filled by JS -->
723
+ </div>
724
+ </div>
725
+ </div>
726
+ </div>
727
+
728
+ </div>
729
+ </div>
730
+
731
+ <!-- ============ Scene 2: Brand reveal (米色面板, 8.0 → 10s) ============ -->
732
+ <div class="scene scene-brand" id="scene-brand">
733
+ <div class="brand-panel" id="brandPanel"></div>
734
+ <div class="brand-wordmark" id="wordmark">huashu<span class="accent">-</span>design</div>
735
+ <div class="brand-line" id="brandLine"></div>
736
+ </div>
737
+
738
+ <!-- Bottom-right watermark -->
739
+ <div class="watermark-br" id="watermarkBR">V2 · 2026</div>
740
+
741
+ <!-- Replay button (hidden during recording) -->
742
+ <button class="replay-btn no-record" id="replayBtn">REPLAY</button>
743
+
744
+ </div>
745
+
746
+ <script>
747
+ (function() {
748
+ // =============== Timing ===============
749
+ const T = {
750
+ DURATION: 10.0,
751
+
752
+ // Scene 0: intro
753
+ intro_in: [0.0, 0.5],
754
+ intro_out: [1.3, 1.6],
755
+
756
+ // Scene 1: main (timeline + driven stage)
757
+ main_in: [1.5, 1.9], // fade in
758
+ // Playhead sweeps from 0% (at t=1.6) to 100% (at t=8.2).
759
+ // API activations use GLOBAL time. Their capsule position is placed so
760
+ // that playhead passes under the capsule right when the API peaks.
761
+ main_t0: 1.6,
762
+ main_t_end: 8.2,
763
+ main_out: [8.0, 8.4],
764
+
765
+ // API activations (GLOBAL time)
766
+ // Each API: [activate_start, peak, deactivate_end]
767
+ // Capsule x% = (peak - 1.6) / (8.2 - 1.6) * 100
768
+ useTime: [2.0, 2.8, 3.6], // capsule @ ~18%
769
+ interpolate: [3.6, 4.1, 4.8], // capsule @ ~38%
770
+ Easing: [4.8, 5.4, 6.2], // capsule @ ~58%
771
+ useSprite: [6.2, 6.9, 7.9], // capsule @ ~80%
772
+
773
+ // Scene 2: Brand reveal (米色面板 standard, last 2s of T=10)
774
+ // [T-2.0 → T-1.7]: main fade 1→0 (already handled by main_out 8.0-8.4)
775
+ // [T-1.7 → T-1.3]: beige panel translateY 100%→0, expoOut
776
+ // [T-1.3 → T-0.7]: wordmark weight 100→500 + y:20→0 + opacity 0→1, expoOut
777
+ // [T-0.7 → T-0.3]: orange line width 0→280px, cubicOut
778
+ // [T-0.3 → T]: hold
779
+ brand_panel: [8.3, 8.7],
780
+ brand_word: [8.7, 9.3],
781
+ brand_line: [9.3, 9.7],
782
+ };
783
+
784
+ // =============== Easings ===============
785
+ const expoOut = t => (t >= 1 ? 1 : 1 - Math.pow(2, -10 * t));
786
+ const expoIn = t => (t <= 0 ? 0 : Math.pow(2, 10 * (t - 1)));
787
+ const cubicOut = t => 1 - Math.pow(1 - t, 3);
788
+ const cubicIn = t => t * t * t;
789
+ const cubicInOut = t => t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;
790
+ const easeInOut = cubicInOut;
791
+ const linear = t => t;
792
+
793
+ // =============== Utils ===============
794
+ const clamp = (v, lo = 0, hi = 1) => Math.max(lo, Math.min(hi, v));
795
+ const clampLerp = (t, t0, t1) => clamp((t - t0) / (t1 - t0));
796
+ function lerp(t, t0, t1, v0, v1, easing = linear) {
797
+ const p = clampLerp(t, t0, t1);
798
+ return v0 + (v1 - v0) * easing(p);
799
+ }
800
+
801
+ // =============== DOM refs ===============
802
+ const scenes = {
803
+ intro: document.getElementById('scene-intro'),
804
+ main: document.getElementById('scene-main'),
805
+ brand: document.getElementById('scene-brand'),
806
+ };
807
+ const introTitle = document.getElementById('introTitle');
808
+ const introSub = document.getElementById('introSub');
809
+
810
+ const timelineFill = document.getElementById('timelineFill');
811
+ const playhead = document.getElementById('playhead');
812
+
813
+ const capTime = document.getElementById('cap-time');
814
+ const capInterp = document.getElementById('cap-interp');
815
+ const capEasing = document.getElementById('cap-easing');
816
+ const capSprite = document.getElementById('cap-sprite');
817
+
818
+ const stemTime = document.getElementById('stem-time');
819
+ const stemInterp = document.getElementById('stem-interp');
820
+ const stemEasing = document.getElementById('stem-easing');
821
+ const stemSprite = document.getElementById('stem-sprite');
822
+
823
+ const vizTime = document.getElementById('viz-time');
824
+ const vizInterp = document.getElementById('viz-interp');
825
+ const vizEasing = document.getElementById('viz-easing');
826
+ const vizSprite = document.getElementById('viz-sprite');
827
+
828
+ const handS = document.getElementById('handS');
829
+ const handM = document.getElementById('handM');
830
+ const handH = document.getElementById('handH');
831
+ const timeVal = document.getElementById('timeVal');
832
+
833
+ const morphTo = document.getElementById('morphTo');
834
+ const interpVal = document.getElementById('interpVal');
835
+
836
+ const pathLinear = document.getElementById('pathLinear');
837
+ const pathCubic = document.getElementById('pathCubic');
838
+ const pathExpo = document.getElementById('pathExpo');
839
+
840
+ const spriteGrid = document.getElementById('spriteGrid');
841
+ const wordmark = document.getElementById('wordmark');
842
+ const brandLine = document.getElementById('brandLine');
843
+ const brandPanel = document.getElementById('brandPanel');
844
+ const watermarkBR = document.getElementById('watermarkBR');
845
+ const replayBtn = document.getElementById('replayBtn');
846
+
847
+ // Build 24 sprites (6x4 grid)
848
+ const SPRITE_COLS = 6, SPRITE_ROWS = 4;
849
+ const spriteEls = [];
850
+ for (let r = 0; r < SPRITE_ROWS; r++) {
851
+ for (let c = 0; c < SPRITE_COLS; c++) {
852
+ const el = document.createElement('div');
853
+ el.className = 'sprite';
854
+ // center distance for ripple
855
+ const dc = c - (SPRITE_COLS - 1) / 2;
856
+ const dr = r - (SPRITE_ROWS - 1) / 2;
857
+ const dist = Math.sqrt(dc * dc + dr * dr);
858
+ const maxDist = Math.sqrt(((SPRITE_COLS - 1) / 2) ** 2 + ((SPRITE_ROWS - 1) / 2) ** 2);
859
+ el.dataset.delay = (dist / maxDist).toFixed(3);
860
+ spriteGrid.appendChild(el);
861
+ spriteEls.push(el);
862
+ }
863
+ }
864
+
865
+ // =============== Scene helpers ===============
866
+ function showScene(el, opacity) {
867
+ if (opacity > 0.001) el.classList.add('visible');
868
+ else el.classList.remove('visible');
869
+ el.style.opacity = opacity;
870
+ }
871
+
872
+ // =============== API activation logic ===============
873
+ function apiState(t_local, api) {
874
+ // Returns { on: bool, strength: 0-1 }
875
+ const [a, peak, b] = T[api];
876
+ if (t_local < a || t_local > b) return { on: false, strength: 0 };
877
+ if (t_local < peak) {
878
+ return { on: true, strength: expoOut(clampLerp(t_local, a, peak)) };
879
+ } else {
880
+ return { on: true, strength: 1 - cubicIn(clampLerp(t_local, peak, b)) };
881
+ }
882
+ }
883
+
884
+ // =============== Draw easing curves progressively ===============
885
+ function easingPath(easingFn, progress) {
886
+ // progress 0-1 draws the curve from left to right
887
+ // x range: 60 → 680, y range: 260 (0) → 40 (1)
888
+ const X0 = 60, X1 = 680, Y0 = 260, Y1 = 40;
889
+ const steps = Math.max(2, Math.floor(progress * 80));
890
+ let d = `M ${X0} ${Y0}`;
891
+ for (let i = 1; i <= steps; i++) {
892
+ const t = (i / 80) * progress;
893
+ const x = X0 + (X1 - X0) * t;
894
+ const y = Y0 + (Y1 - Y0) * easingFn(t);
895
+ d += ` L ${x.toFixed(2)} ${y.toFixed(2)}`;
896
+ }
897
+ return d;
898
+ }
899
+
900
+ // =============== Render ===============
901
+ function render(t) {
902
+ // ============ Scene 0: Intro ============
903
+ if (t < T.main_in[1]) {
904
+ let op = 0;
905
+ if (t < T.intro_in[1]) op = clampLerp(t, T.intro_in[0], T.intro_in[1]);
906
+ else if (t < T.intro_out[0]) op = 1;
907
+ else op = 1 - clampLerp(t, T.intro_out[0], T.intro_out[1]);
908
+ showScene(scenes.intro, op);
909
+
910
+ // weight morph + rise
911
+ const morphP = expoOut(clampLerp(t, T.intro_in[0], T.intro_in[1] + 0.3));
912
+ const w = 150 + (400 - 150) * morphP;
913
+ introTitle.style.fontWeight = Math.round(w);
914
+ const rise = lerp(t, T.intro_in[0], T.intro_in[1], 16, 0, expoOut);
915
+ introTitle.style.transform = `translate3d(0, ${rise}px, 0)`;
916
+ introSub.style.opacity = clampLerp(t, T.intro_in[1], T.intro_in[1] + 0.4);
917
+ } else {
918
+ showScene(scenes.intro, 0);
919
+ }
920
+
921
+ // ============ Scene 1: Main (split view) ============
922
+ if (t >= T.main_in[0] - 0.1 && t < T.main_out[1]) {
923
+ let op;
924
+ if (t < T.main_in[1]) op = clampLerp(t, T.main_in[0], T.main_in[1]);
925
+ else if (t < T.main_out[0]) op = 1;
926
+ else op = 1 - clampLerp(t, T.main_out[0], T.main_out[1]);
927
+ showScene(scenes.main, op);
928
+
929
+ // Playhead sweeps 0% → 100% across the window [main_t0, main_t_end]
930
+ const phP = clampLerp(t, T.main_t0, T.main_t_end);
931
+ const phPct = phP * 100;
932
+ playhead.style.left = phPct + '%';
933
+ // Keep: use t directly for API state
934
+ const t_local_clamped = t;
935
+
936
+ // Timeline fill
937
+ timelineFill.style.width = phPct + '%';
938
+
939
+ // API capsules: lit state driven by apiState
940
+ const stTime = apiState(t_local_clamped, 'useTime');
941
+ const stInterp = apiState(t_local_clamped, 'interpolate');
942
+ const stEasing = apiState(t_local_clamped, 'Easing');
943
+ const stSprite = apiState(t_local_clamped, 'useSprite');
944
+
945
+ setLit(capTime, stemTime, stTime);
946
+ setLit(capInterp, stemInterp, stInterp);
947
+ setLit(capEasing, stemEasing, stEasing);
948
+ setLit(capSprite, stemSprite, stSprite);
949
+
950
+ // Viz opacities — each viz only visible during its API's window
951
+ vizTime.style.opacity = stTime.on ? stTime.strength : 0;
952
+ vizInterp.style.opacity = stInterp.on ? stInterp.strength : 0;
953
+ vizEasing.style.opacity = stEasing.on ? stEasing.strength : 0;
954
+ vizSprite.style.opacity = stSprite.on ? stSprite.strength : 0;
955
+
956
+ // ========= viz 1: clock =========
957
+ // Continuous rotation (not just when active) so transition looks natural
958
+ // But only animate hands when api is near-active, to avoid wasted cpu
959
+ {
960
+ const [a, _peak, b] = T.useTime;
961
+ // Second hand: one revolution over the active window
962
+ const localP = clampLerp(t_local_clamped, a, b);
963
+ // Multi-revolution: 1.5 turns over the window
964
+ const sDeg = localP * 540;
965
+ const mDeg = localP * 180 + 120;
966
+ const hDeg = localP * 60 + 30;
967
+ handS.style.transform = `translateX(-50%) rotate(${sDeg}deg)`;
968
+ handM.style.transform = `translateX(-50%) rotate(${mDeg}deg)`;
969
+ handH.style.transform = `translateX(-50%) rotate(${hDeg}deg)`;
970
+
971
+ // Display value as t in seconds mapping 0→1.50
972
+ const displayVal = (localP * 1.5).toFixed(2);
973
+ timeVal.textContent = displayVal + 's';
974
+ }
975
+
976
+ // ========= viz 2: interpolate =========
977
+ {
978
+ const [a, _peak, b] = T.interpolate;
979
+ const localP = clampLerp(t_local_clamped, a, b);
980
+ const eased = easeInOut(localP);
981
+ // morph from 80×80 black → 220×160 orange, rounded
982
+ const W = 80 + (240 - 80) * eased;
983
+ const H = 80 + (160 - 80) * eased;
984
+ const bright = Math.round(30 + (217 - 30) * eased);
985
+ const brightG = Math.round(30 + (119 - 30) * eased);
986
+ const brightB = Math.round(30 + (87 - 30) * eased);
987
+ const rad = 2 + (20 - 2) * eased;
988
+ morphTo.style.width = W + 'px';
989
+ morphTo.style.height = H + 'px';
990
+ morphTo.style.background = `rgb(${bright}, ${brightG}, ${brightB})`;
991
+ morphTo.style.borderRadius = rad + 'px';
992
+ interpVal.textContent = eased.toFixed(2);
993
+ }
994
+
995
+ // ========= viz 3: easing curves =========
996
+ {
997
+ const [a, _peak, b] = T.Easing;
998
+ const localP = clampLerp(t_local_clamped, a, b);
999
+ pathLinear.setAttribute('d', easingPath(linear, localP));
1000
+ pathCubic.setAttribute('d', easingPath(cubicOut, localP));
1001
+ pathExpo.setAttribute('d', easingPath(expoOut, localP));
1002
+ }
1003
+
1004
+ // ========= viz 4: sprites =========
1005
+ {
1006
+ const [a, _peak, b] = T.useSprite;
1007
+ const localP = clampLerp(t_local_clamped, a, b);
1008
+ for (const el of spriteEls) {
1009
+ const delay = parseFloat(el.dataset.delay);
1010
+ const spriteLocalT = clamp((localP - delay * 0.5) / 0.5, 0, 1);
1011
+ const op = expoOut(spriteLocalT);
1012
+ el.style.opacity = op;
1013
+ const scale = 0.5 + 0.5 * op;
1014
+ const y = (1 - op) * 14;
1015
+ el.style.transform = `translateY(${y}px) scale(${scale})`;
1016
+ el.style.background = op > 0.85 ? 'var(--accent)' : 'var(--hairline)';
1017
+ }
1018
+ }
1019
+ } else {
1020
+ showScene(scenes.main, 0);
1021
+ }
1022
+
1023
+ // ============ Scene 2: Brand reveal (米色面板标准动作) ============
1024
+ if (t >= T.brand_panel[0] - 0.1) {
1025
+ showScene(scenes.brand, 1);
1026
+
1027
+ // [T-1.7 → T-1.3]: beige panel slides up, expoOut
1028
+ const panelP = expoOut(clampLerp(t, T.brand_panel[0], T.brand_panel[1]));
1029
+ brandPanel.style.transform = `translateY(${(1 - panelP) * 100}%)`;
1030
+
1031
+ // [T-1.3 → T-0.7]: wordmark weight 100→500 + y:20→0 + opacity:0→1, expoOut
1032
+ const wordP = expoOut(clampLerp(t, T.brand_word[0], T.brand_word[1]));
1033
+ const w = 100 + (500 - 100) * wordP;
1034
+ wordmark.style.fontVariationSettings = `"wght" ${w.toFixed(0)}`;
1035
+ wordmark.style.fontWeight = Math.round(w);
1036
+ wordmark.style.opacity = wordP;
1037
+ const wRise = (1 - wordP) * 20;
1038
+ wordmark.style.transform = `translate(-50%, calc(-50% + ${wRise}px))`;
1039
+
1040
+ // [T-0.7 → T-0.3]: orange line expands 0→280px, cubicOut
1041
+ const lineP = cubicOut(clampLerp(t, T.brand_line[0], T.brand_line[1]));
1042
+ brandLine.style.width = (lineP * 280) + 'px';
1043
+ } else {
1044
+ showScene(scenes.brand, 0);
1045
+ brandPanel.style.transform = 'translateY(100%)';
1046
+ wordmark.style.opacity = 0;
1047
+ brandLine.style.width = '0px';
1048
+ }
1049
+
1050
+ // Watermark visible from start of main until end
1051
+ if (t >= T.main_in[0] && t < T.DURATION - 0.15) {
1052
+ watermarkBR.classList.add('visible');
1053
+ } else {
1054
+ watermarkBR.classList.remove('visible');
1055
+ }
1056
+ }
1057
+
1058
+ function setLit(capsule, stem, state) {
1059
+ if (state.on && state.strength > 0.15) {
1060
+ capsule.classList.add('lit');
1061
+ stem.classList.add('lit');
1062
+ // Subtle scale pulse centered on peak (simplistic)
1063
+ const scale = 1.0 + state.strength * 0.06;
1064
+ capsule.style.transform = `translateX(-50%) scale(${scale})`;
1065
+ } else {
1066
+ capsule.classList.remove('lit');
1067
+ stem.classList.remove('lit');
1068
+ capsule.style.transform = 'translateX(-50%)';
1069
+ }
1070
+ }
1071
+
1072
+ // =============== Driver ===============
1073
+ let manualT = null;
1074
+ let startMs = null;
1075
+ let hasFinishedOnce = false;
1076
+
1077
+ function tick(now) {
1078
+ if (manualT != null) {
1079
+ render(manualT);
1080
+ } else {
1081
+ if (startMs == null) startMs = now;
1082
+ const elapsed = (now - startMs) / 1000;
1083
+ const recording = window.__recording === true;
1084
+ let t;
1085
+ if (recording) {
1086
+ t = Math.min(elapsed, T.DURATION - 0.001);
1087
+ if (elapsed >= T.DURATION && !hasFinishedOnce) hasFinishedOnce = true;
1088
+ } else {
1089
+ t = elapsed % T.DURATION;
1090
+ // Show replay button when we've played at least once
1091
+ if (elapsed >= T.DURATION) {
1092
+ replayBtn.classList.add('visible');
1093
+ }
1094
+ }
1095
+ render(t);
1096
+ }
1097
+ requestAnimationFrame(tick);
1098
+ }
1099
+
1100
+ // First paint signal for renderer
1101
+ document.fonts.ready.then(() => {
1102
+ render(0);
1103
+ requestAnimationFrame(() => {
1104
+ window.__ready = true;
1105
+ requestAnimationFrame(tick);
1106
+ });
1107
+ });
1108
+
1109
+ // ========= Stage scaling (fit viewport) =========
1110
+ function fitStage() {
1111
+ const stage = document.getElementById('stage');
1112
+ const scaleX = window.innerWidth / 1920;
1113
+ const scaleY = window.innerHeight / 1080;
1114
+ const scale = Math.min(scaleX, scaleY);
1115
+ stage.style.transform = `translate(-50%, -50%) scale(${scale})`;
1116
+ }
1117
+ fitStage();
1118
+ window.addEventListener('resize', fitStage);
1119
+
1120
+ // Replay
1121
+ replayBtn.addEventListener('click', () => {
1122
+ startMs = null;
1123
+ replayBtn.classList.remove('visible');
1124
+ });
1125
+
1126
+ // =============== Expose for frame-accurate rendering ===============
1127
+ window.__setTime = (t) => { manualT = t; render(t); };
1128
+ window.__resume = () => { manualT = null; startMs = null; };
1129
+ window.__duration = T.DURATION;
1130
+ window.__render = render;
1131
+ })();
1132
+ </script>
1133
+ </body>
1134
+ </html>