@hiai-gg/hiai-opencode 0.2.1 → 0.2.2

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 (477) hide show
  1. package/.env.example +4 -0
  2. package/AGENTS.md +34 -38
  3. package/ARCHITECTURE.md +4 -3
  4. package/LICENSE.md +14 -0
  5. package/README.md +52 -21
  6. package/config/hiai-opencode.schema.json +11 -13
  7. package/dist/agents/{bob.d.ts → bob/claude.d.ts} +6 -2
  8. package/dist/agents/bob/core.d.ts +6 -0
  9. package/dist/agents/bob/gpt.d.ts +11 -0
  10. package/dist/agents/bob/index.d.ts +3 -0
  11. package/dist/agents/coder/core.d.ts +4 -0
  12. package/dist/agents/coder/gpt.d.ts +1 -4
  13. package/dist/agents/coder/index.d.ts +1 -0
  14. package/dist/agents/manager/agent.d.ts +1 -1
  15. package/dist/agents/manager/default-prompt-sections.d.ts +3 -3
  16. package/dist/agents/manager/guard-integration.d.ts +1 -0
  17. package/dist/agents/prompt-library/index.d.ts +0 -1
  18. package/dist/agents/prompt-library/shared-execution.d.ts +9 -0
  19. package/dist/agents/strategist/behavioral-summary.d.ts +1 -1
  20. package/dist/agents/strategist/identity-constraints.d.ts +1 -1
  21. package/dist/agents/strategist/plan-generation.d.ts +1 -1
  22. package/dist/agents/types.d.ts +2 -1
  23. package/dist/config/defaults.d.ts +1 -0
  24. package/dist/config/platform-schema.d.ts +26 -26
  25. package/dist/config/schema/agent-names.d.ts +6 -6
  26. package/dist/config/schema/agent-overrides.d.ts +0 -128
  27. package/dist/config/schema/hiai-opencode-config.d.ts +0 -128
  28. package/dist/config/types.d.ts +2 -2
  29. package/dist/features/background-agent/manager-notifier.d.ts +46 -0
  30. package/dist/features/background-agent/manager-types.d.ts +40 -0
  31. package/dist/features/background-agent/manager.d.ts +3 -19
  32. package/dist/features/background-agent/polling-manager.d.ts +51 -0
  33. package/dist/features/boulder-state/storage.d.ts +1 -0
  34. package/dist/features/builtin-commands/templates/loop.d.ts +2 -0
  35. package/dist/features/builtin-commands/templates/start-work.d.ts +1 -1
  36. package/dist/features/builtin-skills/skills/interview-me.d.ts +2 -0
  37. package/dist/features/builtin-skills/skills/planning-and-task-breakdown.d.ts +2 -0
  38. package/dist/hooks/reasoning-content-cache/hook.d.ts +11 -0
  39. package/dist/hooks/reasoning-content-cache/index.d.ts +1 -0
  40. package/dist/hooks/session-recovery/checkpoint.d.ts +48 -0
  41. package/dist/hooks/session-recovery/enhanced-hook.d.ts +30 -0
  42. package/dist/hooks/session-recovery/state-backup.d.ts +76 -0
  43. package/dist/hooks/shared/compaction-in-progress.d.ts +4 -0
  44. package/dist/hooks/start-work/git-operations.d.ts +47 -0
  45. package/dist/hooks/token-budget.d.ts +30 -0
  46. package/dist/index.js +1185 -1078
  47. package/dist/mcp/rate-limiter.d.ts +68 -0
  48. package/dist/plugin/chat-message.d.ts +8 -0
  49. package/dist/plugin/command-execute-before.d.ts +1 -1
  50. package/dist/plugin/event-handlers/message-updated.d.ts +2 -0
  51. package/dist/plugin/event-handlers/session-error.d.ts +2 -0
  52. package/dist/plugin/event-handlers/session-status.d.ts +2 -0
  53. package/dist/plugin/event-handlers/types.d.ts +62 -0
  54. package/dist/plugin/event-handlers/utils.d.ts +11 -0
  55. package/dist/plugin/event.d.ts +1 -1
  56. package/dist/shared/data-path.d.ts +1 -1
  57. package/dist/shared/errors.d.ts +70 -0
  58. package/dist/shared/extract-session-id.d.ts +8 -0
  59. package/dist/shared/git-worktree/get-git-state-summary.d.ts +14 -0
  60. package/dist/shared/index.d.ts +67 -68
  61. package/dist/shared/internal-initiator-marker.d.ts +1 -1
  62. package/dist/shared/logger.d.ts +5 -1
  63. package/dist/shared/reasoning-content-cache.d.ts +68 -0
  64. package/dist/shared/safe-create-hook.d.ts +4 -4
  65. package/dist/tools/call-hiai-agent/constants.d.ts +2 -2
  66. package/dist/tools/delegate-task/sub-agent.d.ts +1 -1
  67. package/dist/tools/look-at/constants.d.ts +1 -1
  68. package/docs/architecture/bob-manager-architecture.md +244 -0
  69. package/docs/hiai-opencode/adr/ADR-001-agent-identity-section-injection.md +66 -0
  70. package/docs/hiai-opencode/adr/ADR-002-anti-loop-guard-priority.md +63 -0
  71. package/docs/hiai-opencode/adr/ADR-003-compaction-mechanism.md +71 -0
  72. package/docs/hiai-opencode/adr/ADR-004-session-recovery.md +76 -0
  73. package/docs/hiai-opencode/api.md +305 -0
  74. package/docs/hiai-opencode/hooks-architecture.md +225 -0
  75. package/docs/hiai-opencode/migration.md +209 -0
  76. package/docs/skill-discovery.md +288 -0
  77. package/package.json +1 -1
  78. package/skills/agent-browser/SKILL.md +193 -0
  79. package/skills/apple-hig/SKILL.md +43 -0
  80. package/skills/article-magazine/SKILL.md +46 -0
  81. package/skills/article-magazine/example.html +81 -0
  82. package/skills/article-magazine/example.md +38 -0
  83. package/skills/canvas-design/SKILL.md +45 -0
  84. package/skills/design-templates/audio-jingle/SKILL.md +132 -0
  85. package/skills/design-templates/audio-jingle/example.html +128 -0
  86. package/skills/design-templates/blog-post/SKILL.md +80 -0
  87. package/skills/design-templates/blog-post/example.html +80 -0
  88. package/skills/design-templates/clinical-case-report/SKILL.md +209 -0
  89. package/skills/design-templates/clinical-case-report/example.html +698 -0
  90. package/skills/design-templates/clinical-case-report/examples/example-stemi.html +698 -0
  91. package/skills/design-templates/clinical-case-report/references/case-formats.md +94 -0
  92. package/skills/design-templates/clinical-case-report/references/checklist.md +41 -0
  93. package/skills/design-templates/critique/SKILL.md +258 -0
  94. package/skills/design-templates/critique/example.html +671 -0
  95. package/skills/design-templates/dashboard/SKILL.md +76 -0
  96. package/skills/design-templates/dashboard/example.html +118 -0
  97. package/skills/design-templates/dating-web/SKILL.md +92 -0
  98. package/skills/design-templates/dating-web/example.html +265 -0
  99. package/skills/design-templates/dcf-valuation/SKILL.md +140 -0
  100. package/skills/design-templates/dcf-valuation/references/sector-wacc.md +42 -0
  101. package/skills/design-templates/digital-eguide/SKILL.md +94 -0
  102. package/skills/design-templates/digital-eguide/example.html +204 -0
  103. package/skills/design-templates/docs-page/SKILL.md +80 -0
  104. package/skills/design-templates/docs-page/example.html +122 -0
  105. package/skills/design-templates/email-marketing/SKILL.md +84 -0
  106. package/skills/design-templates/email-marketing/example.html +159 -0
  107. package/skills/design-templates/eng-runbook/SKILL.md +51 -0
  108. package/skills/design-templates/eng-runbook/example.html +250 -0
  109. package/skills/design-templates/finance-report/SKILL.md +61 -0
  110. package/skills/design-templates/finance-report/example.html +242 -0
  111. package/skills/design-templates/flowai-live-dashboard-template/SKILL.md +87 -0
  112. package/skills/design-templates/flowai-live-dashboard-template/assets/template.html +387 -0
  113. package/skills/design-templates/flowai-live-dashboard-template/example.html +13 -0
  114. package/skills/design-templates/flowai-live-dashboard-template/references/checklist.md +35 -0
  115. package/skills/design-templates/gamified-app/SKILL.md +108 -0
  116. package/skills/design-templates/gamified-app/example.html +292 -0
  117. package/skills/design-templates/github-dashboard/SKILL.md +130 -0
  118. package/skills/design-templates/github-dashboard/example.html +473 -0
  119. package/skills/design-templates/github-dashboard/references/README.md +10 -0
  120. package/skills/design-templates/github-dashboard/references/artifact-example.json +15 -0
  121. package/skills/design-templates/github-dashboard/references/example-data.json +138 -0
  122. package/skills/design-templates/github-dashboard/references/provenance-example.json +92 -0
  123. package/skills/design-templates/github-dashboard/references/template.html +473 -0
  124. package/skills/design-templates/guizang-ppt/LICENSE +21 -0
  125. package/skills/design-templates/guizang-ppt/README.en.md +119 -0
  126. package/skills/design-templates/guizang-ppt/README.md +120 -0
  127. package/skills/design-templates/guizang-ppt/README.pt-BR.md +121 -0
  128. package/skills/design-templates/guizang-ppt/SKILL.md +313 -0
  129. package/skills/design-templates/guizang-ppt/assets/example-slides.html +318 -0
  130. package/skills/design-templates/guizang-ppt/assets/template.html +647 -0
  131. package/skills/design-templates/guizang-ppt/references/checklist.md +265 -0
  132. package/skills/design-templates/guizang-ppt/references/components.md +363 -0
  133. package/skills/design-templates/guizang-ppt/references/layouts.md +630 -0
  134. package/skills/design-templates/guizang-ppt/references/styles.md +195 -0
  135. package/skills/design-templates/guizang-ppt/references/themes.md +122 -0
  136. package/skills/design-templates/hr-onboarding/SKILL.md +52 -0
  137. package/skills/design-templates/hr-onboarding/example.html +219 -0
  138. package/skills/design-templates/html-ppt/.clawscan-allow +12 -0
  139. package/skills/design-templates/html-ppt/LICENSE +21 -0
  140. package/skills/design-templates/html-ppt/README.md +234 -0
  141. package/skills/design-templates/html-ppt/README.pt-BR.md +239 -0
  142. package/skills/design-templates/html-ppt/README.zh-CN.md +238 -0
  143. package/skills/design-templates/html-ppt/SKILL.md +250 -0
  144. package/skills/design-templates/html-ppt/assets/animations/animations.css +138 -0
  145. package/skills/design-templates/html-ppt/assets/animations/fx/_util.js +63 -0
  146. package/skills/design-templates/html-ppt/assets/animations/fx/chain-react.js +41 -0
  147. package/skills/design-templates/html-ppt/assets/animations/fx/confetti-cannon.js +49 -0
  148. package/skills/design-templates/html-ppt/assets/animations/fx/constellation.js +44 -0
  149. package/skills/design-templates/html-ppt/assets/animations/fx/counter-explosion.js +58 -0
  150. package/skills/design-templates/html-ppt/assets/animations/fx/data-stream.js +45 -0
  151. package/skills/design-templates/html-ppt/assets/animations/fx/firework.js +51 -0
  152. package/skills/design-templates/html-ppt/assets/animations/fx/galaxy-swirl.js +33 -0
  153. package/skills/design-templates/html-ppt/assets/animations/fx/gradient-blob.js +39 -0
  154. package/skills/design-templates/html-ppt/assets/animations/fx/knowledge-graph.js +69 -0
  155. package/skills/design-templates/html-ppt/assets/animations/fx/letter-explode.js +50 -0
  156. package/skills/design-templates/html-ppt/assets/animations/fx/magnetic-field.js +40 -0
  157. package/skills/design-templates/html-ppt/assets/animations/fx/matrix-rain.js +33 -0
  158. package/skills/design-templates/html-ppt/assets/animations/fx/neural-net.js +75 -0
  159. package/skills/design-templates/html-ppt/assets/animations/fx/orbit-ring.js +38 -0
  160. package/skills/design-templates/html-ppt/assets/animations/fx/particle-burst.js +42 -0
  161. package/skills/design-templates/html-ppt/assets/animations/fx/shockwave.js +39 -0
  162. package/skills/design-templates/html-ppt/assets/animations/fx/sparkle-trail.js +62 -0
  163. package/skills/design-templates/html-ppt/assets/animations/fx/starfield.js +30 -0
  164. package/skills/design-templates/html-ppt/assets/animations/fx/typewriter-multi.js +51 -0
  165. package/skills/design-templates/html-ppt/assets/animations/fx/word-cascade.js +47 -0
  166. package/skills/design-templates/html-ppt/assets/animations/fx-runtime.js +99 -0
  167. package/skills/design-templates/html-ppt/assets/base.css +150 -0
  168. package/skills/design-templates/html-ppt/assets/fonts.css +9 -0
  169. package/skills/design-templates/html-ppt/assets/runtime.js +960 -0
  170. package/skills/design-templates/html-ppt/assets/themes/academic-paper.css +23 -0
  171. package/skills/design-templates/html-ppt/assets/themes/arctic-cool.css +14 -0
  172. package/skills/design-templates/html-ppt/assets/themes/aurora.css +20 -0
  173. package/skills/design-templates/html-ppt/assets/themes/bauhaus.css +16 -0
  174. package/skills/design-templates/html-ppt/assets/themes/blueprint.css +19 -0
  175. package/skills/design-templates/html-ppt/assets/themes/catppuccin-latte.css +14 -0
  176. package/skills/design-templates/html-ppt/assets/themes/catppuccin-mocha.css +14 -0
  177. package/skills/design-templates/html-ppt/assets/themes/corporate-clean.css +19 -0
  178. package/skills/design-templates/html-ppt/assets/themes/cyberpunk-neon.css +23 -0
  179. package/skills/design-templates/html-ppt/assets/themes/dracula.css +14 -0
  180. package/skills/design-templates/html-ppt/assets/themes/editorial-serif.css +18 -0
  181. package/skills/design-templates/html-ppt/assets/themes/engineering-whiteprint.css +26 -0
  182. package/skills/design-templates/html-ppt/assets/themes/glassmorphism.css +21 -0
  183. package/skills/design-templates/html-ppt/assets/themes/gruvbox-dark.css +14 -0
  184. package/skills/design-templates/html-ppt/assets/themes/japanese-minimal.css +21 -0
  185. package/skills/design-templates/html-ppt/assets/themes/magazine-bold.css +21 -0
  186. package/skills/design-templates/html-ppt/assets/themes/memphis-pop.css +20 -0
  187. package/skills/design-templates/html-ppt/assets/themes/midcentury.css +19 -0
  188. package/skills/design-templates/html-ppt/assets/themes/minimal-white.css +16 -0
  189. package/skills/design-templates/html-ppt/assets/themes/neo-brutalism.css +17 -0
  190. package/skills/design-templates/html-ppt/assets/themes/news-broadcast.css +20 -0
  191. package/skills/design-templates/html-ppt/assets/themes/nord.css +14 -0
  192. package/skills/design-templates/html-ppt/assets/themes/pitch-deck-vc.css +21 -0
  193. package/skills/design-templates/html-ppt/assets/themes/rainbow-gradient.css +16 -0
  194. package/skills/design-templates/html-ppt/assets/themes/retro-tv.css +22 -0
  195. package/skills/design-templates/html-ppt/assets/themes/rose-pine.css +14 -0
  196. package/skills/design-templates/html-ppt/assets/themes/sharp-mono.css +17 -0
  197. package/skills/design-templates/html-ppt/assets/themes/soft-pastel.css +14 -0
  198. package/skills/design-templates/html-ppt/assets/themes/solarized-light.css +14 -0
  199. package/skills/design-templates/html-ppt/assets/themes/sunset-warm.css +14 -0
  200. package/skills/design-templates/html-ppt/assets/themes/swiss-grid.css +17 -0
  201. package/skills/design-templates/html-ppt/assets/themes/terminal-green.css +18 -0
  202. package/skills/design-templates/html-ppt/assets/themes/tokyo-night.css +14 -0
  203. package/skills/design-templates/html-ppt/assets/themes/vaporwave.css +21 -0
  204. package/skills/design-templates/html-ppt/assets/themes/xiaohongshu-white.css +16 -0
  205. package/skills/design-templates/html-ppt/assets/themes/y2k-chrome.css +20 -0
  206. package/skills/design-templates/html-ppt/docs/readme/_theme-cell.html +56 -0
  207. package/skills/design-templates/html-ppt/docs/readme/animations.png +0 -0
  208. package/skills/design-templates/html-ppt/docs/readme/hero.gif +0 -0
  209. package/skills/design-templates/html-ppt/docs/readme/layouts-live.gif +0 -0
  210. package/skills/design-templates/html-ppt/docs/readme/layouts.png +0 -0
  211. package/skills/design-templates/html-ppt/docs/readme/montage-animations.html +61 -0
  212. package/skills/design-templates/html-ppt/docs/readme/montage-layouts.html +72 -0
  213. package/skills/design-templates/html-ppt/docs/readme/montage-templates.html +72 -0
  214. package/skills/design-templates/html-ppt/docs/readme/montage-themes.html +38 -0
  215. package/skills/design-templates/html-ppt/docs/readme/presenter-mode.png +0 -0
  216. package/skills/design-templates/html-ppt/docs/readme/templates.png +0 -0
  217. package/skills/design-templates/html-ppt/docs/readme/themes.png +0 -0
  218. package/skills/design-templates/html-ppt/examples/demo-deck/index.html +161 -0
  219. package/skills/design-templates/html-ppt/references/animations.md +147 -0
  220. package/skills/design-templates/html-ppt/references/authoring-guide.md +141 -0
  221. package/skills/design-templates/html-ppt/references/full-decks.md +98 -0
  222. package/skills/design-templates/html-ppt/references/layouts.md +103 -0
  223. package/skills/design-templates/html-ppt/references/presenter-mode.md +240 -0
  224. package/skills/design-templates/html-ppt/references/themes.md +107 -0
  225. package/skills/design-templates/html-ppt/scripts/new-deck.sh +46 -0
  226. package/skills/design-templates/html-ppt/scripts/render.sh +71 -0
  227. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_01.png +0 -0
  228. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_02.png +0 -0
  229. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_03.png +0 -0
  230. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_04.png +0 -0
  231. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_05.png +0 -0
  232. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_06.png +0 -0
  233. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_07.png +0 -0
  234. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_08.png +0 -0
  235. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_09.png +0 -0
  236. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_10.png +0 -0
  237. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_11.png +0 -0
  238. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_12.png +0 -0
  239. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_13.png +0 -0
  240. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_14.png +0 -0
  241. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_15.png +0 -0
  242. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_16.png +0 -0
  243. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_17.png +0 -0
  244. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_18.png +0 -0
  245. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_19.png +0 -0
  246. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_20.png +0 -0
  247. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_01.png +0 -0
  248. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_02.png +0 -0
  249. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_03.png +0 -0
  250. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_04.png +0 -0
  251. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_05.png +0 -0
  252. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_06.png +0 -0
  253. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_07.png +0 -0
  254. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_08.png +0 -0
  255. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_09.png +0 -0
  256. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_10.png +0 -0
  257. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_11.png +0 -0
  258. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_12.png +0 -0
  259. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_13.png +0 -0
  260. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_14.png +0 -0
  261. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_15.png +0 -0
  262. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_16.png +0 -0
  263. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_17.png +0 -0
  264. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_18.png +0 -0
  265. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_19.png +0 -0
  266. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_20.png +0 -0
  267. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_21.png +0 -0
  268. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_22.png +0 -0
  269. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_23.png +0 -0
  270. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_24.png +0 -0
  271. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_25.png +0 -0
  272. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_26.png +0 -0
  273. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_27.png +0 -0
  274. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_28.png +0 -0
  275. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_29.png +0 -0
  276. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_30.png +0 -0
  277. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_31.png +0 -0
  278. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_32.png +0 -0
  279. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_33.png +0 -0
  280. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_34.png +0 -0
  281. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_35.png +0 -0
  282. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_36.png +0 -0
  283. package/skills/design-templates/html-ppt/templates/animation-showcase.html +172 -0
  284. package/skills/design-templates/html-ppt/templates/deck.html +69 -0
  285. package/skills/design-templates/html-ppt/templates/full-decks/course-module/README.md +8 -0
  286. package/skills/design-templates/html-ppt/templates/full-decks/course-module/index.html +189 -0
  287. package/skills/design-templates/html-ppt/templates/full-decks/course-module/style.css +46 -0
  288. package/skills/design-templates/html-ppt/templates/full-decks/dir-key-nav-minimal/README.md +11 -0
  289. package/skills/design-templates/html-ppt/templates/full-decks/dir-key-nav-minimal/index.html +138 -0
  290. package/skills/design-templates/html-ppt/templates/full-decks/dir-key-nav-minimal/style.css +60 -0
  291. package/skills/design-templates/html-ppt/templates/full-decks/graphify-dark-graph/README.md +11 -0
  292. package/skills/design-templates/html-ppt/templates/full-decks/graphify-dark-graph/index.html +180 -0
  293. package/skills/design-templates/html-ppt/templates/full-decks/graphify-dark-graph/style.css +54 -0
  294. package/skills/design-templates/html-ppt/templates/full-decks/hermes-cyber-terminal/README.md +11 -0
  295. package/skills/design-templates/html-ppt/templates/full-decks/hermes-cyber-terminal/index.html +199 -0
  296. package/skills/design-templates/html-ppt/templates/full-decks/hermes-cyber-terminal/style.css +55 -0
  297. package/skills/design-templates/html-ppt/templates/full-decks/knowledge-arch-blueprint/README.md +11 -0
  298. package/skills/design-templates/html-ppt/templates/full-decks/knowledge-arch-blueprint/index.html +190 -0
  299. package/skills/design-templates/html-ppt/templates/full-decks/knowledge-arch-blueprint/style.css +49 -0
  300. package/skills/design-templates/html-ppt/templates/full-decks/obsidian-claude-gradient/README.md +11 -0
  301. package/skills/design-templates/html-ppt/templates/full-decks/obsidian-claude-gradient/index.html +144 -0
  302. package/skills/design-templates/html-ppt/templates/full-decks/obsidian-claude-gradient/style.css +59 -0
  303. package/skills/design-templates/html-ppt/templates/full-decks/pitch-deck/README.md +9 -0
  304. package/skills/design-templates/html-ppt/templates/full-decks/pitch-deck/index.html +148 -0
  305. package/skills/design-templates/html-ppt/templates/full-decks/pitch-deck/style.css +40 -0
  306. package/skills/design-templates/html-ppt/templates/full-decks/presenter-mode-reveal/README.md +102 -0
  307. package/skills/design-templates/html-ppt/templates/full-decks/presenter-mode-reveal/index.html +187 -0
  308. package/skills/design-templates/html-ppt/templates/full-decks/presenter-mode-reveal/style.css +216 -0
  309. package/skills/design-templates/html-ppt/templates/full-decks/product-launch/README.md +8 -0
  310. package/skills/design-templates/html-ppt/templates/full-decks/product-launch/index.html +121 -0
  311. package/skills/design-templates/html-ppt/templates/full-decks/product-launch/style.css +39 -0
  312. package/skills/design-templates/html-ppt/templates/full-decks/tech-sharing/README.md +8 -0
  313. package/skills/design-templates/html-ppt/templates/full-decks/tech-sharing/index.html +156 -0
  314. package/skills/design-templates/html-ppt/templates/full-decks/tech-sharing/style.css +49 -0
  315. package/skills/design-templates/html-ppt/templates/full-decks/testing-safety-alert/README.md +11 -0
  316. package/skills/design-templates/html-ppt/templates/full-decks/testing-safety-alert/index.html +183 -0
  317. package/skills/design-templates/html-ppt/templates/full-decks/testing-safety-alert/style.css +62 -0
  318. package/skills/design-templates/html-ppt/templates/full-decks/weekly-report/README.md +8 -0
  319. package/skills/design-templates/html-ppt/templates/full-decks/weekly-report/index.html +127 -0
  320. package/skills/design-templates/html-ppt/templates/full-decks/weekly-report/style.css +55 -0
  321. package/skills/design-templates/html-ppt/templates/full-decks/xhs-pastel-card/README.md +11 -0
  322. package/skills/design-templates/html-ppt/templates/full-decks/xhs-pastel-card/index.html +147 -0
  323. package/skills/design-templates/html-ppt/templates/full-decks/xhs-pastel-card/style.css +66 -0
  324. package/skills/design-templates/html-ppt/templates/full-decks/xhs-post/README.md +9 -0
  325. package/skills/design-templates/html-ppt/templates/full-decks/xhs-post/index.html +133 -0
  326. package/skills/design-templates/html-ppt/templates/full-decks/xhs-post/style.css +47 -0
  327. package/skills/design-templates/html-ppt/templates/full-decks/xhs-white-editorial/README.md +11 -0
  328. package/skills/design-templates/html-ppt/templates/full-decks/xhs-white-editorial/index.html +187 -0
  329. package/skills/design-templates/html-ppt/templates/full-decks/xhs-white-editorial/style.css +63 -0
  330. package/skills/design-templates/html-ppt/templates/full-decks-index.html +82 -0
  331. package/skills/design-templates/html-ppt/templates/layout-showcase.html +47 -0
  332. package/skills/design-templates/html-ppt/templates/single-page/arch-diagram.html +46 -0
  333. package/skills/design-templates/html-ppt/templates/single-page/big-quote.html +18 -0
  334. package/skills/design-templates/html-ppt/templates/single-page/bullets.html +19 -0
  335. package/skills/design-templates/html-ppt/templates/single-page/chart-bar.html +30 -0
  336. package/skills/design-templates/html-ppt/templates/single-page/chart-line.html +35 -0
  337. package/skills/design-templates/html-ppt/templates/single-page/chart-pie.html +36 -0
  338. package/skills/design-templates/html-ppt/templates/single-page/chart-radar.html +31 -0
  339. package/skills/design-templates/html-ppt/templates/single-page/code.html +33 -0
  340. package/skills/design-templates/html-ppt/templates/single-page/comparison.html +47 -0
  341. package/skills/design-templates/html-ppt/templates/single-page/cover.html +32 -0
  342. package/skills/design-templates/html-ppt/templates/single-page/cta.html +27 -0
  343. package/skills/design-templates/html-ppt/templates/single-page/diff.html +35 -0
  344. package/skills/design-templates/html-ppt/templates/single-page/flow-diagram.html +33 -0
  345. package/skills/design-templates/html-ppt/templates/single-page/gantt.html +29 -0
  346. package/skills/design-templates/html-ppt/templates/single-page/image-grid.html +34 -0
  347. package/skills/design-templates/html-ppt/templates/single-page/image-hero.html +33 -0
  348. package/skills/design-templates/html-ppt/templates/single-page/kpi-grid.html +19 -0
  349. package/skills/design-templates/html-ppt/templates/single-page/mindmap.html +38 -0
  350. package/skills/design-templates/html-ppt/templates/single-page/process-steps.html +27 -0
  351. package/skills/design-templates/html-ppt/templates/single-page/pros-cons.html +31 -0
  352. package/skills/design-templates/html-ppt/templates/single-page/roadmap.html +46 -0
  353. package/skills/design-templates/html-ppt/templates/single-page/section-divider.html +17 -0
  354. package/skills/design-templates/html-ppt/templates/single-page/stat-highlight.html +17 -0
  355. package/skills/design-templates/html-ppt/templates/single-page/table.html +33 -0
  356. package/skills/design-templates/html-ppt/templates/single-page/terminal.html +35 -0
  357. package/skills/design-templates/html-ppt/templates/single-page/thanks.html +21 -0
  358. package/skills/design-templates/html-ppt/templates/single-page/three-column.html +18 -0
  359. package/skills/design-templates/html-ppt/templates/single-page/timeline.html +32 -0
  360. package/skills/design-templates/html-ppt/templates/single-page/toc.html +26 -0
  361. package/skills/design-templates/html-ppt/templates/single-page/todo-checklist.html +33 -0
  362. package/skills/design-templates/html-ppt/templates/single-page/two-column.html +39 -0
  363. package/skills/design-templates/html-ppt/templates/theme-showcase.html +151 -0
  364. package/skills/design-templates/html-ppt-course-module/SKILL.md +78 -0
  365. package/skills/design-templates/html-ppt-course-module/example.html +542 -0
  366. package/skills/design-templates/html-ppt-dir-key-nav-minimal/SKILL.md +77 -0
  367. package/skills/design-templates/html-ppt-dir-key-nav-minimal/example.html +366 -0
  368. package/skills/design-templates/html-ppt-graphify-dark-graph/SKILL.md +77 -0
  369. package/skills/design-templates/html-ppt-graphify-dark-graph/example.html +402 -0
  370. package/skills/design-templates/html-ppt-hermes-cyber-terminal/SKILL.md +77 -0
  371. package/skills/design-templates/html-ppt-hermes-cyber-terminal/example.html +422 -0
  372. package/skills/design-templates/html-ppt-knowledge-arch-blueprint/SKILL.md +77 -0
  373. package/skills/design-templates/html-ppt-knowledge-arch-blueprint/example.html +407 -0
  374. package/skills/design-templates/html-ppt-obsidian-claude-gradient/SKILL.md +77 -0
  375. package/skills/design-templates/html-ppt-obsidian-claude-gradient/example.html +371 -0
  376. package/skills/design-templates/html-ppt-pitch-deck/SKILL.md +78 -0
  377. package/skills/design-templates/html-ppt-pitch-deck/example.html +495 -0
  378. package/skills/design-templates/html-ppt-presenter-mode-reveal/SKILL.md +78 -0
  379. package/skills/design-templates/html-ppt-presenter-mode-reveal/example.html +725 -0
  380. package/skills/design-templates/html-ppt-product-launch/SKILL.md +77 -0
  381. package/skills/design-templates/html-ppt-product-launch/example.html +467 -0
  382. package/skills/design-templates/html-ppt-taste-brutalist/SKILL.md +70 -0
  383. package/skills/design-templates/html-ppt-taste-brutalist/example.html +774 -0
  384. package/skills/design-templates/html-ppt-taste-editorial/SKILL.md +62 -0
  385. package/skills/design-templates/html-ppt-taste-editorial/example.html +689 -0
  386. package/skills/design-templates/html-ppt-tech-sharing/SKILL.md +77 -0
  387. package/skills/design-templates/html-ppt-tech-sharing/example.html +512 -0
  388. package/skills/design-templates/html-ppt-testing-safety-alert/SKILL.md +78 -0
  389. package/skills/design-templates/html-ppt-testing-safety-alert/example.html +413 -0
  390. package/skills/design-templates/html-ppt-weekly-report/SKILL.md +77 -0
  391. package/skills/design-templates/html-ppt-weekly-report/example.html +489 -0
  392. package/skills/design-templates/html-ppt-xhs-pastel-card/SKILL.md +78 -0
  393. package/skills/design-templates/html-ppt-xhs-pastel-card/example.html +381 -0
  394. package/skills/design-templates/html-ppt-xhs-post/SKILL.md +78 -0
  395. package/skills/design-templates/html-ppt-xhs-post/example.html +487 -0
  396. package/skills/design-templates/html-ppt-xhs-white-editorial/SKILL.md +77 -0
  397. package/skills/design-templates/html-ppt-xhs-white-editorial/example.html +418 -0
  398. package/skills/design-templates/html-ppt-zhangzara-8-bit-orbit/LICENSE +21 -0
  399. package/skills/design-templates/html-ppt-zhangzara-8-bit-orbit/SKILL.md +93 -0
  400. package/skills/design-templates/html-ppt-zhangzara-8-bit-orbit/example.html +1640 -0
  401. package/skills/design-templates/html-ppt-zhangzara-8-bit-orbit/template.json +48 -0
  402. package/skills/design-templates/html-ppt-zhangzara-biennale-yellow/LICENSE +21 -0
  403. package/skills/design-templates/html-ppt-zhangzara-biennale-yellow/SKILL.md +93 -0
  404. package/skills/design-templates/html-ppt-zhangzara-biennale-yellow/example.html +833 -0
  405. package/skills/design-templates/html-ppt-zhangzara-biennale-yellow/template.json +49 -0
  406. package/skills/design-templates/html-ppt-zhangzara-block-frame/LICENSE +21 -0
  407. package/skills/design-templates/html-ppt-zhangzara-block-frame/SKILL.md +93 -0
  408. package/skills/design-templates/html-ppt-zhangzara-block-frame/example.html +1453 -0
  409. package/skills/design-templates/html-ppt-zhangzara-block-frame/template.json +47 -0
  410. package/skills/design-templates/html-ppt-zhangzara-blue-professional/LICENSE +21 -0
  411. package/skills/design-templates/html-ppt-zhangzara-blue-professional/SKILL.md +93 -0
  412. package/skills/design-templates/html-ppt-zhangzara-blue-professional/example.html +1423 -0
  413. package/skills/design-templates/html-ppt-zhangzara-blue-professional/template.json +44 -0
  414. package/skills/design-templates/html-ppt-zhangzara-bold-poster/LICENSE +21 -0
  415. package/skills/design-templates/html-ppt-zhangzara-bold-poster/SKILL.md +93 -0
  416. package/skills/design-templates/html-ppt-zhangzara-bold-poster/example.html +876 -0
  417. package/skills/design-templates/html-ppt-zhangzara-bold-poster/template.json +45 -0
  418. package/skills/design-templates/html-ppt-zhangzara-broadside/LICENSE +21 -0
  419. package/skills/design-templates/html-ppt-zhangzara-broadside/SKILL.md +92 -0
  420. package/skills/design-templates/html-ppt-zhangzara-broadside/example.html +2144 -0
  421. package/skills/design-templates/html-ppt-zhangzara-broadside/template.json +49 -0
  422. package/skills/design-templates/html-ppt-zhangzara-capsule/LICENSE +21 -0
  423. package/skills/design-templates/html-ppt-zhangzara-capsule/SKILL.md +92 -0
  424. package/skills/design-templates/html-ppt-zhangzara-capsule/example.html +1413 -0
  425. package/skills/design-templates/html-ppt-zhangzara-capsule/template.json +51 -0
  426. package/skills/design-templates/html-ppt-zhangzara-cartesian/LICENSE +21 -0
  427. package/skills/design-templates/html-ppt-zhangzara-cartesian/SKILL.md +92 -0
  428. package/skills/design-templates/html-ppt-zhangzara-cartesian/example.html +1136 -0
  429. package/skills/design-templates/html-ppt-zhangzara-cartesian/template.json +47 -0
  430. package/skills/design-templates/html-ppt-zhangzara-cobalt-grid/LICENSE +21 -0
  431. package/skills/design-templates/html-ppt-zhangzara-cobalt-grid/SKILL.md +93 -0
  432. package/skills/design-templates/html-ppt-zhangzara-cobalt-grid/example.html +1205 -0
  433. package/skills/design-templates/html-ppt-zhangzara-cobalt-grid/template.json +49 -0
  434. package/skills/design-templates/html-ppt-zhangzara-coral/LICENSE +21 -0
  435. package/skills/design-templates/html-ppt-zhangzara-coral/SKILL.md +92 -0
  436. package/skills/design-templates/html-ppt-zhangzara-coral/example.html +1487 -0
  437. package/skills/design-templates/html-ppt-zhangzara-coral/template.json +45 -0
  438. package/skills/design-templates/html-ppt-zhangzara-creative-mode/LICENSE +21 -0
  439. package/skills/design-templates/html-ppt-zhangzara-creative-mode/SKILL.md +99 -0
  440. package/skills/design-templates/html-ppt-zhangzara-creative-mode/assets/deck-stage.js +619 -0
  441. package/skills/design-templates/html-ppt-zhangzara-creative-mode/example.html +636 -0
  442. package/skills/design-templates/html-ppt-zhangzara-creative-mode/template.json +47 -0
  443. package/skills/design-templates/html-ppt-zhangzara-daisy-days/LICENSE +21 -0
  444. package/skills/design-templates/html-ppt-zhangzara-daisy-days/SKILL.md +93 -0
  445. package/skills/design-templates/html-ppt-zhangzara-daisy-days/example.html +469 -0
  446. package/skills/design-templates/html-ppt-zhangzara-daisy-days/template.json +54 -0
  447. package/skills/design-templates/html-ppt-zhangzara-editorial-tri-tone/LICENSE +21 -0
  448. package/skills/design-templates/html-ppt-zhangzara-editorial-tri-tone/SKILL.md +98 -0
  449. package/skills/design-templates/html-ppt-zhangzara-editorial-tri-tone/assets/deck-stage.js +619 -0
  450. package/skills/design-templates/html-ppt-zhangzara-editorial-tri-tone/example.html +737 -0
  451. package/skills/design-templates/html-ppt-zhangzara-editorial-tri-tone/template.json +44 -0
  452. package/skills/design-templates/html-ppt-zhangzara-grove/LICENSE +21 -0
  453. package/skills/design-templates/html-ppt-zhangzara-grove/SKILL.md +92 -0
  454. package/skills/design-templates/html-ppt-zhangzara-grove/example.html +1676 -0
  455. package/skills/design-templates/html-ppt-zhangzara-grove/template.json +51 -0
  456. package/skills/figma-code-connect-components/SKILL.md +42 -0
  457. package/skills/figma-create-design-system-rules/SKILL.md +42 -0
  458. package/skills/figma-create-new-file/SKILL.md +41 -0
  459. package/skills/figma-generate-design/SKILL.md +42 -0
  460. package/skills/figma-generate-library/SKILL.md +42 -0
  461. package/skills/figma-implement-design/SKILL.md +42 -0
  462. package/skills/figma-use/SKILL.md +42 -0
  463. package/skills/full-page-screenshot/SKILL.md +42 -0
  464. package/skills/interview-me/SKILL.md +64 -0
  465. package/skills/planning-and-task-breakdown/SKILL.md +52 -0
  466. package/skills/sora/SKILL.md +43 -0
  467. package/skills/theme-factory/SKILL.md +43 -0
  468. package/skills/web-design-guidelines/SKILL.md +42 -0
  469. package/dist/agents/prompt-library/orchestration.d.ts +0 -4
  470. package/skills/brainstorming/SKILL.md +0 -164
  471. package/skills/brainstorming/scripts/frame-template.html +0 -214
  472. package/skills/brainstorming/scripts/helper.js +0 -88
  473. package/skills/brainstorming/scripts/server.cjs +0 -354
  474. package/skills/brainstorming/scripts/start-server.sh +0 -148
  475. package/skills/brainstorming/scripts/stop-server.sh +0 -56
  476. package/skills/brainstorming/spec-document-reviewer-prompt.md +0 -49
  477. package/skills/brainstorming/visual-companion.md +0 -287
@@ -0,0 +1,63 @@
1
+ /* html-ppt fx :: shared helpers */
2
+ (function(){
3
+ window.HPX = window.HPX || {};
4
+ const U = window.HPX._u = {};
5
+
6
+ U.css = (el, name, fb) => {
7
+ const v = getComputedStyle(el).getPropertyValue(name).trim();
8
+ return v || fb;
9
+ };
10
+
11
+ U.accent = (el, fb) => U.css(el, '--accent', fb || '#7c5cff');
12
+ U.accent2 = (el, fb) => U.css(el, '--accent-2', fb || '#22d3ee');
13
+ U.text = (el, fb) => U.css(el, '--text-1', fb || '#eaeaf2');
14
+
15
+ U.palette = (el) => [
16
+ U.accent(el, '#7c5cff'),
17
+ U.accent2(el, '#22d3ee'),
18
+ U.css(el, '--ok', '#22c55e'),
19
+ U.css(el, '--warn', '#f59e0b'),
20
+ U.css(el, '--danger', '#ef4444'),
21
+ ];
22
+
23
+ U.canvas = (el) => {
24
+ if (getComputedStyle(el).position === 'static') el.style.position = 'relative';
25
+ const c = document.createElement('canvas');
26
+ c.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;pointer-events:none;display:block;';
27
+ el.appendChild(c);
28
+ const ctx = c.getContext('2d');
29
+ let w = 0, h = 0, dpr = Math.max(1, Math.min(2, window.devicePixelRatio||1));
30
+ const fit = () => {
31
+ const r = el.getBoundingClientRect();
32
+ w = Math.max(1, r.width|0);
33
+ h = Math.max(1, r.height|0);
34
+ c.width = (w*dpr)|0;
35
+ c.height = (h*dpr)|0;
36
+ ctx.setTransform(dpr,0,0,dpr,0,0);
37
+ };
38
+ fit();
39
+ const ro = new ResizeObserver(fit);
40
+ ro.observe(el);
41
+ return {
42
+ c, ctx,
43
+ get w(){return w;}, get h(){return h;}, get dpr(){return dpr;},
44
+ destroy(){
45
+ try{ro.disconnect();}catch(e){}
46
+ if (c.parentNode) c.parentNode.removeChild(c);
47
+ }
48
+ };
49
+ };
50
+
51
+ U.loop = (fn) => {
52
+ let raf = 0, stopped = false, t0 = performance.now();
53
+ const tick = (t) => {
54
+ if (stopped) return;
55
+ fn((t - t0)/1000);
56
+ raf = requestAnimationFrame(tick);
57
+ };
58
+ raf = requestAnimationFrame(tick);
59
+ return () => { stopped = true; cancelAnimationFrame(raf); };
60
+ };
61
+
62
+ U.rand = (a,b) => a + Math.random()*(b-a);
63
+ })();
@@ -0,0 +1,41 @@
1
+ (function(){
2
+ window.HPX = window.HPX || {};
3
+ window.HPX['chain-react'] = function(el){
4
+ const U = window.HPX._u;
5
+ const k = U.canvas(el), ctx = k.ctx;
6
+ const ac = U.accent(el,'#7c5cff'), ac2 = U.accent2(el,'#22d3ee');
7
+ const N = 8;
8
+ const stop = U.loop((t) => {
9
+ ctx.clearRect(0,0,k.w,k.h);
10
+ const cy = k.h/2;
11
+ const pad = 60;
12
+ const dx = (k.w - pad*2)/(N-1);
13
+ const period = 2.4;
14
+ const phase = (t % period) / period; // 0..1
15
+ for (let i=0;i<N;i++){
16
+ const x = pad + i*dx;
17
+ const my = i/(N-1);
18
+ const d = Math.abs(phase - my);
19
+ const pulse = Math.max(0, 1 - d*6);
20
+ const r = 18 + pulse*18;
21
+ // glow
22
+ const g = ctx.createRadialGradient(x,cy,0,x,cy,r*2);
23
+ g.addColorStop(0, `rgba(124,92,255,${0.4*pulse})`);
24
+ g.addColorStop(1, 'rgba(0,0,0,0)');
25
+ ctx.fillStyle = g;
26
+ ctx.fillRect(x-r*2, cy-r*2, r*4, r*4);
27
+ // circle
28
+ ctx.fillStyle = pulse>0.1 ? ac2 : ac;
29
+ ctx.beginPath(); ctx.arc(x,cy,r,0,Math.PI*2); ctx.fill();
30
+ ctx.strokeStyle='rgba(255,255,255,0.4)'; ctx.lineWidth=2;
31
+ ctx.stroke();
32
+ // connectors
33
+ if (i<N-1){
34
+ ctx.strokeStyle='rgba(200,200,230,0.3)'; ctx.lineWidth=2;
35
+ ctx.beginPath(); ctx.moveTo(x+r,cy); ctx.lineTo(x+dx-r,cy); ctx.stroke();
36
+ }
37
+ }
38
+ });
39
+ return { stop(){ stop(); k.destroy(); } };
40
+ };
41
+ })();
@@ -0,0 +1,49 @@
1
+ (function(){
2
+ window.HPX = window.HPX || {};
3
+ window.HPX['confetti-cannon'] = function(el){
4
+ const U = window.HPX._u;
5
+ const k = U.canvas(el), ctx = k.ctx;
6
+ const pal = U.palette(el);
7
+ let parts = [];
8
+ const fire = () => {
9
+ for (let side=0; side<2; side++){
10
+ const x0 = side===0 ? 20 : k.w-20;
11
+ const y0 = k.h - 20;
12
+ for (let i=0;i<40;i++){
13
+ const a = side===0 ? U.rand(-Math.PI*0.7, -Math.PI*0.4) : U.rand(-Math.PI*0.6, -Math.PI*0.3) - Math.PI/2 - Math.PI/6;
14
+ const spd = U.rand(300, 520);
15
+ parts.push({
16
+ x: x0, y: y0,
17
+ vx: Math.cos(a)*spd, vy: Math.sin(a)*spd,
18
+ w: U.rand(6,12), h: U.rand(3,7),
19
+ rot: Math.random()*Math.PI, vr: U.rand(-6,6),
20
+ c: pal[(Math.random()*pal.length)|0],
21
+ life: 1
22
+ });
23
+ }
24
+ }
25
+ };
26
+ fire();
27
+ let last = 0;
28
+ const stop = U.loop((t) => {
29
+ ctx.clearRect(0,0,k.w,k.h);
30
+ if (t - last > 3) { fire(); last = t; }
31
+ const dt = 1/60;
32
+ parts = parts.filter(p => p.life > 0 && p.y < k.h+40);
33
+ for (const p of parts){
34
+ p.vy += 520*dt;
35
+ p.x += p.vx*dt; p.y += p.vy*dt;
36
+ p.rot += p.vr*dt;
37
+ p.life -= 0.006;
38
+ ctx.save();
39
+ ctx.translate(p.x, p.y); ctx.rotate(p.rot);
40
+ ctx.globalAlpha = Math.max(0, p.life);
41
+ ctx.fillStyle = p.c;
42
+ ctx.fillRect(-p.w/2, -p.h/2, p.w, p.h);
43
+ ctx.restore();
44
+ }
45
+ ctx.globalAlpha = 1;
46
+ });
47
+ return { stop(){ stop(); k.destroy(); } };
48
+ };
49
+ })();
@@ -0,0 +1,44 @@
1
+ (function(){
2
+ window.HPX = window.HPX || {};
3
+ window.HPX['constellation'] = function(el){
4
+ const U = window.HPX._u;
5
+ const k = U.canvas(el), ctx = k.ctx;
6
+ const ac = U.accent(el,'#9fb4ff');
7
+ const N = 70;
8
+ let pts = [];
9
+ const seed = () => {
10
+ pts = Array.from({length:N}, () => ({
11
+ x: Math.random()*k.w, y: Math.random()*k.h,
12
+ vx: U.rand(-0.3,0.3), vy: U.rand(-0.3,0.3)
13
+ }));
14
+ };
15
+ seed();
16
+ let lw=k.w, lh=k.h;
17
+ const stop = U.loop(() => {
18
+ if (k.w!==lw||k.h!==lh){ seed(); lw=k.w; lh=k.h; }
19
+ ctx.clearRect(0,0,k.w,k.h);
20
+ for (const p of pts){
21
+ p.x += p.vx; p.y += p.vy;
22
+ if (p.x<0||p.x>k.w) p.vx*=-1;
23
+ if (p.y<0||p.y>k.h) p.vy*=-1;
24
+ }
25
+ for (let i=0;i<N;i++){
26
+ for (let j=i+1;j<N;j++){
27
+ const a=pts[i], b=pts[j];
28
+ const d = Math.hypot(a.x-b.x, a.y-b.y);
29
+ if (d < 150){
30
+ ctx.globalAlpha = 1 - d/150;
31
+ ctx.strokeStyle = ac; ctx.lineWidth=1;
32
+ ctx.beginPath(); ctx.moveTo(a.x,a.y); ctx.lineTo(b.x,b.y); ctx.stroke();
33
+ }
34
+ }
35
+ }
36
+ ctx.globalAlpha = 1;
37
+ ctx.fillStyle = ac;
38
+ for (const p of pts){
39
+ ctx.beginPath(); ctx.arc(p.x,p.y,1.8,0,Math.PI*2); ctx.fill();
40
+ }
41
+ });
42
+ return { stop(){ stop(); k.destroy(); } };
43
+ };
44
+ })();
@@ -0,0 +1,58 @@
1
+ (function(){
2
+ window.HPX = window.HPX || {};
3
+ window.HPX['counter-explosion'] = function(el){
4
+ const U = window.HPX._u;
5
+ if (getComputedStyle(el).position === 'static') el.style.position = 'relative';
6
+ const target = parseInt(el.getAttribute('data-fx-to') || '2400', 10);
7
+ const k = U.canvas(el), ctx = k.ctx;
8
+ const pal = U.palette(el);
9
+ // number overlay
10
+ const num = document.createElement('div');
11
+ num.style.cssText = 'position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font:900 120px system-ui,sans-serif;color:var(--text-1,#fff);pointer-events:none;text-shadow:0 4px 40px rgba(124,92,255,0.5);';
12
+ num.textContent = '0';
13
+ el.appendChild(num);
14
+ let parts = [];
15
+ let state = 'count'; // count | burst | hold
16
+ let stateT = 0;
17
+ let value = 0;
18
+ let cycle = 0;
19
+ const burst = () => {
20
+ const cx = k.w/2, cy = k.h/2;
21
+ for (let i=0;i<120;i++){
22
+ const a = Math.random()*Math.PI*2;
23
+ const s = U.rand(120, 400);
24
+ parts.push({x:cx,y:cy,vx:Math.cos(a)*s,vy:Math.sin(a)*s,life:1,r:U.rand(2,5),c:pal[(Math.random()*pal.length)|0]});
25
+ }
26
+ };
27
+ const stop = U.loop(() => {
28
+ ctx.clearRect(0,0,k.w,k.h);
29
+ const dt = 1/60;
30
+ stateT += dt;
31
+ if (state === 'count'){
32
+ const dur = 2.2;
33
+ const p = Math.min(1, stateT/dur);
34
+ const eased = 1 - Math.pow(1-p,3);
35
+ value = Math.round(target*eased);
36
+ num.textContent = value.toLocaleString();
37
+ if (p >= 1){ state='burst'; stateT=0; burst(); }
38
+ } else if (state === 'burst'){
39
+ if (stateT > 0.05 && stateT < 0.3 && parts.length < 200) {}
40
+ if (stateT > 2.5){ state='hold'; stateT=0; }
41
+ } else if (state === 'hold'){
42
+ if (stateT > 1.5){
43
+ state='count'; stateT=0; value=0; num.textContent='0'; cycle++;
44
+ }
45
+ }
46
+ parts = parts.filter(p => p.life > 0);
47
+ for (const p of parts){
48
+ p.vy += 260*dt; p.vx *= 0.985; p.vy *= 0.985;
49
+ p.x += p.vx*dt; p.y += p.vy*dt; p.life -= 0.01;
50
+ ctx.globalAlpha = Math.max(0,p.life);
51
+ ctx.fillStyle = p.c;
52
+ ctx.beginPath(); ctx.arc(p.x,p.y,p.r,0,Math.PI*2); ctx.fill();
53
+ }
54
+ ctx.globalAlpha = 1;
55
+ });
56
+ return { stop(){ stop(); k.destroy(); if (num.parentNode) num.parentNode.removeChild(num); } };
57
+ };
58
+ })();
@@ -0,0 +1,45 @@
1
+ (function(){
2
+ window.HPX = window.HPX || {};
3
+ window.HPX['data-stream'] = function(el){
4
+ const U = window.HPX._u;
5
+ const k = U.canvas(el), ctx = k.ctx;
6
+ const ac = U.accent(el,'#22d3ee'), ac2 = U.accent2(el,'#7c5cff');
7
+ const rows = [];
8
+ const rh = 22;
9
+ const genRow = (y) => ({
10
+ y, dir: Math.random()<0.5?-1:1,
11
+ speed: U.rand(30, 90),
12
+ offset: Math.random()*2000,
13
+ text: Array.from({length:120}, () => {
14
+ const r = Math.random();
15
+ if (r<0.3) return Math.random()<0.5?'0':'1';
16
+ if (r<0.6) return '0x' + Math.floor(Math.random()*256).toString(16).padStart(2,'0');
17
+ return Math.random().toString(16).slice(2,6);
18
+ }).join(' ')
19
+ });
20
+ const init = () => {
21
+ rows.length = 0;
22
+ const n = Math.ceil(k.h/rh);
23
+ for (let i=0;i<n;i++) rows.push(genRow(i*rh + rh*0.7));
24
+ };
25
+ init();
26
+ let lh = k.h;
27
+ const stop = U.loop((t) => {
28
+ if (k.h!==lh){ init(); lh=k.h; }
29
+ ctx.fillStyle = 'rgba(5,8,14,0.35)';
30
+ ctx.fillRect(0,0,k.w,k.h);
31
+ ctx.font = '13px ui-monospace,Menlo,monospace';
32
+ for (let i=0;i<rows.length;i++){
33
+ const r = rows[i];
34
+ const x = r.dir>0
35
+ ? ((t*r.speed + r.offset) % (k.w+400)) - 400
36
+ : k.w - (((t*r.speed + r.offset) % (k.w+400)) - 400);
37
+ ctx.fillStyle = (i%3===0)?ac:ac2;
38
+ ctx.globalAlpha = 0.65 + (i%2)*0.3;
39
+ ctx.fillText(r.text, x, r.y);
40
+ }
41
+ ctx.globalAlpha = 1;
42
+ });
43
+ return { stop(){ stop(); k.destroy(); } };
44
+ };
45
+ })();
@@ -0,0 +1,51 @@
1
+ (function(){
2
+ window.HPX = window.HPX || {};
3
+ window.HPX['firework'] = function(el){
4
+ const U = window.HPX._u;
5
+ const k = U.canvas(el), ctx = k.ctx;
6
+ const pal = U.palette(el);
7
+ let rockets = [], sparks = [];
8
+ const launch = () => {
9
+ rockets.push({
10
+ x: U.rand(k.w*0.2, k.w*0.8), y: k.h+10,
11
+ vx: U.rand(-30,30), vy: U.rand(-520,-380),
12
+ tgtY: U.rand(k.h*0.15, k.h*0.45),
13
+ c: pal[(Math.random()*pal.length)|0]
14
+ });
15
+ };
16
+ const burst = (x, y, c) => {
17
+ const n = 70;
18
+ for (let i=0;i<n;i++){
19
+ const a = Math.random()*Math.PI*2;
20
+ const s = U.rand(60, 240);
21
+ sparks.push({x,y,vx:Math.cos(a)*s,vy:Math.sin(a)*s,life:1,c});
22
+ }
23
+ };
24
+ let last = -1;
25
+ const stop = U.loop((t) => {
26
+ ctx.fillStyle = 'rgba(0,0,0,0.18)';
27
+ ctx.fillRect(0,0,k.w,k.h);
28
+ if (t - last > 0.7) { launch(); last = t; }
29
+ const dt = 1/60;
30
+ rockets = rockets.filter(r => {
31
+ r.x += r.vx*dt; r.y += r.vy*dt; r.vy += 260*dt;
32
+ ctx.fillStyle = r.c;
33
+ ctx.beginPath(); ctx.arc(r.x, r.y, 2.5, 0, Math.PI*2); ctx.fill();
34
+ if (r.y <= r.tgtY || r.vy >= 0) { burst(r.x, r.y, r.c); return false; }
35
+ return true;
36
+ });
37
+ sparks = sparks.filter(p => p.life > 0);
38
+ for (const p of sparks){
39
+ p.vy += 90*dt;
40
+ p.vx *= 0.98; p.vy *= 0.98;
41
+ p.x += p.vx*dt; p.y += p.vy*dt;
42
+ p.life -= 0.012;
43
+ ctx.globalAlpha = Math.max(0, p.life);
44
+ ctx.fillStyle = p.c;
45
+ ctx.beginPath(); ctx.arc(p.x, p.y, 2, 0, Math.PI*2); ctx.fill();
46
+ }
47
+ ctx.globalAlpha = 1;
48
+ });
49
+ return { stop(){ stop(); k.destroy(); } };
50
+ };
51
+ })();
@@ -0,0 +1,33 @@
1
+ (function(){
2
+ window.HPX = window.HPX || {};
3
+ window.HPX['galaxy-swirl'] = function(el){
4
+ const U = window.HPX._u;
5
+ const k = U.canvas(el), ctx = k.ctx;
6
+ const pal = U.palette(el);
7
+ const N = 800;
8
+ const parts = Array.from({length:N}, (_,i) => {
9
+ const arm = i%3;
10
+ const t = Math.random();
11
+ const r = t*180 + 8;
12
+ const base = (arm/3)*Math.PI*2;
13
+ return { r, a: base + Math.log(r+1)*1.6 + U.rand(-0.2,0.2),
14
+ c: pal[arm%pal.length],
15
+ s: U.rand(0.8, 2.2) };
16
+ });
17
+ const stop = U.loop((t) => {
18
+ ctx.fillStyle = 'rgba(0,0,0,0.15)';
19
+ ctx.fillRect(0,0,k.w,k.h);
20
+ const cx=k.w/2, cy=k.h/2;
21
+ for (const p of parts){
22
+ const a = p.a + t*0.15;
23
+ const x = cx + Math.cos(a)*p.r;
24
+ const y = cy + Math.sin(a)*p.r*0.7;
25
+ ctx.fillStyle = p.c;
26
+ ctx.globalAlpha = 0.7;
27
+ ctx.beginPath(); ctx.arc(x,y,p.s,0,Math.PI*2); ctx.fill();
28
+ }
29
+ ctx.globalAlpha = 1;
30
+ });
31
+ return { stop(){ stop(); k.destroy(); } };
32
+ };
33
+ })();
@@ -0,0 +1,39 @@
1
+ (function(){
2
+ window.HPX = window.HPX || {};
3
+ window.HPX['gradient-blob'] = function(el){
4
+ const U = window.HPX._u;
5
+ const k = U.canvas(el), ctx = k.ctx;
6
+ const pal = U.palette(el);
7
+ const blobs = Array.from({length:4}, (_,i) => ({
8
+ x: U.rand(0,1), y: U.rand(0,1),
9
+ vx: U.rand(-0.08,0.08), vy: U.rand(-0.08,0.08),
10
+ r: U.rand(180,320),
11
+ c: pal[i%pal.length]
12
+ }));
13
+ const hex2rgb = (h) => {
14
+ const m = h.replace('#','').match(/.{2}/g);
15
+ if (!m) return [124,92,255];
16
+ return m.map(x=>parseInt(x,16));
17
+ };
18
+ const stop = U.loop((t) => {
19
+ ctx.fillStyle = 'rgba(10,12,22,0.2)';
20
+ ctx.fillRect(0,0,k.w,k.h);
21
+ ctx.globalCompositeOperation = 'lighter';
22
+ for (const b of blobs){
23
+ b.x += b.vx*0.01; b.y += b.vy*0.01;
24
+ if (b.x<0||b.x>1) b.vx*=-1;
25
+ if (b.y<0||b.y>1) b.vy*=-1;
26
+ const px = b.x*k.w, py = b.y*k.h;
27
+ const r = b.r + Math.sin(t*0.8 + b.x*6)*30;
28
+ const [R,G,B] = hex2rgb(b.c);
29
+ const grad = ctx.createRadialGradient(px,py,0,px,py,r);
30
+ grad.addColorStop(0, `rgba(${R},${G},${B},0.55)`);
31
+ grad.addColorStop(1, `rgba(${R},${G},${B},0)`);
32
+ ctx.fillStyle = grad;
33
+ ctx.beginPath(); ctx.arc(px,py,r,0,Math.PI*2); ctx.fill();
34
+ }
35
+ ctx.globalCompositeOperation = 'source-over';
36
+ });
37
+ return { stop(){ stop(); k.destroy(); } };
38
+ };
39
+ })();
@@ -0,0 +1,69 @@
1
+ (function(){
2
+ window.HPX = window.HPX || {};
3
+ window.HPX['knowledge-graph'] = function(el){
4
+ const U = window.HPX._u;
5
+ const k = U.canvas(el), ctx = k.ctx;
6
+ const pal = U.palette(el);
7
+ const tx = U.text(el, '#e7e7ef');
8
+ const labels = ['AI','ML','LLM','Graph','Node','Edge','Claude','GPT','RAG','Vector',
9
+ 'Embed','Neural','Agent','Tool','Memory','Logic','Data','Train','Infer','Token',
10
+ 'Prompt','Chain','Plan','Skill','Cloud','Edge','GPU','Code','Task','Flow'];
11
+ const N = 28;
12
+ const nodes = Array.from({length:N}, (_,i) => ({
13
+ x: U.rand(40, 300), y: U.rand(40, 200),
14
+ vx: 0, vy: 0, label: labels[i%labels.length],
15
+ c: pal[i%pal.length]
16
+ }));
17
+ const edges = [];
18
+ const made = new Set();
19
+ while (edges.length < 50){
20
+ const a = (Math.random()*N)|0, b = (Math.random()*N)|0;
21
+ if (a===b) continue;
22
+ const key = a<b ? a+'-'+b : b+'-'+a;
23
+ if (made.has(key)) continue;
24
+ made.add(key); edges.push([a,b]);
25
+ }
26
+ const stop = U.loop(() => {
27
+ // physics
28
+ for (let i=0;i<N;i++){
29
+ for (let j=i+1;j<N;j++){
30
+ const a=nodes[i], b=nodes[j];
31
+ const dx=b.x-a.x, dy=b.y-a.y;
32
+ let d2=dx*dx+dy*dy; if (d2<1) d2=1;
33
+ const d=Math.sqrt(d2);
34
+ const f=1600/d2;
35
+ const fx=(dx/d)*f, fy=(dy/d)*f;
36
+ a.vx-=fx; a.vy-=fy; b.vx+=fx; b.vy+=fy;
37
+ }
38
+ }
39
+ for (const [i,j] of edges){
40
+ const a=nodes[i], b=nodes[j];
41
+ const dx=b.x-a.x, dy=b.y-a.y, d=Math.hypot(dx,dy)||1;
42
+ const f=(d-90)*0.008;
43
+ const fx=(dx/d)*f, fy=(dy/d)*f;
44
+ a.vx+=fx; a.vy+=fy; b.vx-=fx; b.vy-=fy;
45
+ }
46
+ const cx=k.w/2, cy=k.h/2;
47
+ for (const n of nodes){
48
+ n.vx += (cx-n.x)*0.002;
49
+ n.vy += (cy-n.y)*0.002;
50
+ n.vx *= 0.85; n.vy *= 0.85;
51
+ n.x += n.vx; n.y += n.vy;
52
+ }
53
+ ctx.clearRect(0,0,k.w,k.h);
54
+ ctx.strokeStyle = 'rgba(180,180,220,0.25)'; ctx.lineWidth=1;
55
+ for (const [i,j] of edges){
56
+ const a=nodes[i], b=nodes[j];
57
+ ctx.beginPath(); ctx.moveTo(a.x,a.y); ctx.lineTo(b.x,b.y); ctx.stroke();
58
+ }
59
+ ctx.font='11px system-ui,sans-serif'; ctx.textAlign='center'; ctx.textBaseline='middle';
60
+ for (const n of nodes){
61
+ ctx.fillStyle = n.c;
62
+ ctx.beginPath(); ctx.arc(n.x,n.y,7,0,Math.PI*2); ctx.fill();
63
+ ctx.fillStyle = tx;
64
+ ctx.fillText(n.label, n.x, n.y-14);
65
+ }
66
+ });
67
+ return { stop(){ stop(); k.destroy(); } };
68
+ };
69
+ })();
@@ -0,0 +1,50 @@
1
+ (function(){
2
+ window.HPX = window.HPX || {};
3
+ window.HPX['letter-explode'] = function(el){
4
+ const U = window.HPX._u;
5
+ if (getComputedStyle(el).position === 'static') el.style.position = 'relative';
6
+ const src = el.querySelector('[data-fx-text]') || el;
7
+ const text = (el.getAttribute('data-fx-text-value') || src.textContent || 'EXPLODE').trim();
8
+ // Build a container, hide source text
9
+ const wrap = document.createElement('div');
10
+ wrap.style.cssText = 'position:absolute;inset:0;display:flex;align-items:center;justify-content:center;pointer-events:none;';
11
+ const inner = document.createElement('div');
12
+ inner.style.cssText = 'font-size:64px;font-weight:900;letter-spacing:0.02em;color:var(--text-1,#fff);white-space:nowrap;';
13
+ wrap.appendChild(inner);
14
+ el.appendChild(wrap);
15
+ const spans = [];
16
+ for (const ch of text){
17
+ const s = document.createElement('span');
18
+ s.textContent = ch === ' ' ? '\u00A0' : ch;
19
+ s.style.display='inline-block';
20
+ s.style.transform='translate(0,0)';
21
+ s.style.transition='transform 900ms cubic-bezier(.2,.9,.3,1), opacity 900ms';
22
+ s.style.opacity='0';
23
+ inner.appendChild(s);
24
+ spans.push(s);
25
+ }
26
+ let stopped = false;
27
+ const run = () => {
28
+ if (stopped) return;
29
+ spans.forEach((s,i) => {
30
+ const dx = U.rand(-400, 400), dy = U.rand(-300, 300);
31
+ s.style.transition='none';
32
+ s.style.transform=`translate(${dx}px,${dy}px) rotate(${U.rand(-180,180)}deg)`;
33
+ s.style.opacity='0';
34
+ });
35
+ // force reflow
36
+ void inner.offsetWidth;
37
+ spans.forEach((s,i) => {
38
+ setTimeout(() => {
39
+ if (stopped) return;
40
+ s.style.transition='transform 900ms cubic-bezier(.2,.9,.3,1), opacity 900ms';
41
+ s.style.transform='translate(0,0) rotate(0deg)';
42
+ s.style.opacity='1';
43
+ }, i*35);
44
+ });
45
+ };
46
+ run();
47
+ const iv = setInterval(run, 4500);
48
+ return { stop(){ stopped=true; clearInterval(iv); if (wrap.parentNode) wrap.parentNode.removeChild(wrap); } };
49
+ };
50
+ })();
@@ -0,0 +1,40 @@
1
+ (function(){
2
+ window.HPX = window.HPX || {};
3
+ window.HPX['magnetic-field'] = function(el){
4
+ const U = window.HPX._u;
5
+ const k = U.canvas(el), ctx = k.ctx;
6
+ const pal = U.palette(el);
7
+ const N = 60;
8
+ const parts = Array.from({length:N}, (_,i) => ({
9
+ phase: Math.random()*Math.PI*2,
10
+ freq: U.rand(0.4, 1.2),
11
+ amp: U.rand(30, 90),
12
+ y0: U.rand(0.15, 0.85),
13
+ c: pal[i%pal.length],
14
+ trail: []
15
+ }));
16
+ const stop = U.loop((t) => {
17
+ ctx.fillStyle = 'rgba(0,0,0,0.08)';
18
+ ctx.fillRect(0,0,k.w,k.h);
19
+ for (const p of parts){
20
+ const x = ((t*80 + p.phase*50) % (k.w+100)) - 50;
21
+ const y = k.h*p.y0 + Math.sin(x*0.02 + p.phase + t*p.freq)*p.amp;
22
+ p.trail.push([x,y]);
23
+ if (p.trail.length > 18) p.trail.shift();
24
+ ctx.strokeStyle = p.c;
25
+ ctx.lineWidth = 2;
26
+ ctx.beginPath();
27
+ for (let i=0;i<p.trail.length;i++){
28
+ const [tx,ty] = p.trail[i];
29
+ if (i===0) ctx.moveTo(tx,ty); else ctx.lineTo(tx,ty);
30
+ }
31
+ ctx.globalAlpha = 0.7;
32
+ ctx.stroke();
33
+ ctx.globalAlpha = 1;
34
+ ctx.fillStyle = p.c;
35
+ ctx.beginPath(); ctx.arc(x,y,2.5,0,Math.PI*2); ctx.fill();
36
+ }
37
+ });
38
+ return { stop(){ stop(); k.destroy(); } };
39
+ };
40
+ })();
@@ -0,0 +1,33 @@
1
+ (function(){
2
+ window.HPX = window.HPX || {};
3
+ window.HPX['matrix-rain'] = function(el){
4
+ const U = window.HPX._u;
5
+ const k = U.canvas(el), ctx = k.ctx;
6
+ const glyphs = 'アイウエオカキクケコサシスセソタチツテトナニヌネノ0123456789ABCDEF'.split('');
7
+ const fs = 16;
8
+ let cols = 0, drops = [];
9
+ const init = () => {
10
+ cols = Math.ceil(k.w/fs);
11
+ drops = Array.from({length:cols}, () => U.rand(-20, 0));
12
+ };
13
+ init();
14
+ let lw = k.w, lh = k.h;
15
+ const stop = U.loop(() => {
16
+ if (k.w!==lw || k.h!==lh){ init(); lw=k.w; lh=k.h; }
17
+ ctx.fillStyle = 'rgba(0,0,0,0.08)';
18
+ ctx.fillRect(0,0,k.w,k.h);
19
+ ctx.font = fs+'px monospace';
20
+ for (let i=0;i<cols;i++){
21
+ const ch = glyphs[(Math.random()*glyphs.length)|0];
22
+ const x = i*fs, y = drops[i]*fs;
23
+ ctx.fillStyle = '#9fffc9';
24
+ ctx.fillText(ch, x, y);
25
+ ctx.fillStyle = '#00ff6a';
26
+ ctx.fillText(ch, x, y - fs);
27
+ drops[i] += 1;
28
+ if (y > k.h && Math.random() > 0.975) drops[i] = 0;
29
+ }
30
+ });
31
+ return { stop(){ stop(); k.destroy(); } };
32
+ };
33
+ })();