@hiai-gg/hiai-opencode 0.2.0 → 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 (490) hide show
  1. package/.env.example +4 -0
  2. package/AGENTS.md +40 -44
  3. package/ARCHITECTURE.md +4 -3
  4. package/LICENSE.md +14 -0
  5. package/README.md +61 -30
  6. package/assets/cli/hiai-opencode.mjs +4 -4
  7. package/config/hiai-opencode.schema.json +11 -13
  8. package/dist/agents/{bob.d.ts → bob/claude.d.ts} +6 -2
  9. package/dist/agents/bob/core.d.ts +6 -0
  10. package/dist/agents/bob/gpt.d.ts +11 -0
  11. package/dist/agents/bob/index.d.ts +3 -0
  12. package/dist/agents/coder/core.d.ts +4 -0
  13. package/dist/agents/coder/gpt.d.ts +1 -4
  14. package/dist/agents/coder/index.d.ts +1 -0
  15. package/dist/agents/manager/agent.d.ts +1 -1
  16. package/dist/agents/manager/default-prompt-sections.d.ts +4 -4
  17. package/dist/agents/manager/guard-integration.d.ts +1 -0
  18. package/dist/agents/prompt-library/index.d.ts +0 -1
  19. package/dist/agents/prompt-library/shared-execution.d.ts +9 -0
  20. package/dist/agents/strategist/behavioral-summary.d.ts +1 -1
  21. package/dist/agents/strategist/identity-constraints.d.ts +1 -1
  22. package/dist/agents/strategist/plan-generation.d.ts +1 -1
  23. package/dist/agents/types.d.ts +2 -1
  24. package/dist/config/defaults.d.ts +1 -0
  25. package/dist/config/platform-schema.d.ts +26 -26
  26. package/dist/config/schema/agent-names.d.ts +6 -6
  27. package/dist/config/schema/agent-overrides.d.ts +0 -128
  28. package/dist/config/schema/hiai-opencode-config.d.ts +0 -128
  29. package/dist/config/types.d.ts +2 -2
  30. package/dist/features/background-agent/error-classifier.d.ts +1 -0
  31. package/dist/features/background-agent/manager-notifier.d.ts +46 -0
  32. package/dist/features/background-agent/manager-types.d.ts +40 -0
  33. package/dist/features/background-agent/manager.d.ts +3 -19
  34. package/dist/features/background-agent/polling-manager.d.ts +51 -0
  35. package/dist/features/boulder-state/constants.d.ts +3 -0
  36. package/dist/features/boulder-state/storage.d.ts +95 -0
  37. package/dist/features/boulder-state/types.d.ts +17 -0
  38. package/dist/features/builtin-commands/templates/doctor.d.ts +1 -1
  39. package/dist/features/builtin-commands/templates/loop.d.ts +2 -0
  40. package/dist/features/builtin-commands/templates/start-work.d.ts +1 -1
  41. package/dist/features/builtin-skills/skills/interview-me.d.ts +2 -0
  42. package/dist/features/builtin-skills/skills/planning-and-task-breakdown.d.ts +2 -0
  43. package/dist/hooks/manager/resolve-active-boulder-session.d.ts +5 -0
  44. package/dist/hooks/manager/system-reminder-templates.d.ts +2 -2
  45. package/dist/hooks/reasoning-content-cache/hook.d.ts +11 -0
  46. package/dist/hooks/reasoning-content-cache/index.d.ts +1 -0
  47. package/dist/hooks/session-recovery/checkpoint.d.ts +48 -0
  48. package/dist/hooks/session-recovery/enhanced-hook.d.ts +30 -0
  49. package/dist/hooks/session-recovery/state-backup.d.ts +76 -0
  50. package/dist/hooks/shared/compaction-in-progress.d.ts +4 -0
  51. package/dist/hooks/start-work/context-info-builder.d.ts +2 -0
  52. package/dist/hooks/start-work/git-operations.d.ts +47 -0
  53. package/dist/hooks/start-work/worktree-block.d.ts +2 -1
  54. package/dist/hooks/start-work/worktree-detector.d.ts +45 -0
  55. package/dist/hooks/strategist-md-only/agent-resolution.d.ts +1 -1
  56. package/dist/hooks/strategist-md-only/constants.d.ts +6 -0
  57. package/dist/hooks/token-budget.d.ts +30 -0
  58. package/dist/index.js +1275 -1132
  59. package/dist/mcp/rate-limiter.d.ts +68 -0
  60. package/dist/plugin/chat-message.d.ts +8 -0
  61. package/dist/plugin/command-execute-before.d.ts +1 -1
  62. package/dist/plugin/event-handlers/message-updated.d.ts +2 -0
  63. package/dist/plugin/event-handlers/session-error.d.ts +2 -0
  64. package/dist/plugin/event-handlers/session-status.d.ts +2 -0
  65. package/dist/plugin/event-handlers/types.d.ts +62 -0
  66. package/dist/plugin/event-handlers/utils.d.ts +11 -0
  67. package/dist/plugin/event.d.ts +1 -1
  68. package/dist/shared/data-path.d.ts +1 -1
  69. package/dist/shared/errors.d.ts +70 -0
  70. package/dist/shared/extract-session-id.d.ts +8 -0
  71. package/dist/shared/git-worktree/get-git-state-summary.d.ts +14 -0
  72. package/dist/shared/index.d.ts +67 -68
  73. package/dist/shared/internal-initiator-marker.d.ts +1 -1
  74. package/dist/shared/logger.d.ts +5 -1
  75. package/dist/shared/reasoning-content-cache.d.ts +68 -0
  76. package/dist/shared/safe-create-hook.d.ts +4 -4
  77. package/dist/tools/call-hiai-agent/constants.d.ts +2 -2
  78. package/dist/tools/delegate-task/sub-agent.d.ts +1 -1
  79. package/dist/tools/look-at/constants.d.ts +1 -1
  80. package/docs/architecture/bob-manager-architecture.md +244 -0
  81. package/docs/hiai-opencode/adr/ADR-001-agent-identity-section-injection.md +66 -0
  82. package/docs/hiai-opencode/adr/ADR-002-anti-loop-guard-priority.md +63 -0
  83. package/docs/hiai-opencode/adr/ADR-003-compaction-mechanism.md +71 -0
  84. package/docs/hiai-opencode/adr/ADR-004-session-recovery.md +76 -0
  85. package/docs/hiai-opencode/api.md +305 -0
  86. package/docs/hiai-opencode/hooks-architecture.md +225 -0
  87. package/docs/hiai-opencode/migration.md +209 -0
  88. package/docs/quickstart.md +1 -1
  89. package/docs/skill-discovery.md +288 -0
  90. package/package.json +2 -2
  91. package/skills/agent-browser/SKILL.md +193 -0
  92. package/skills/apple-hig/SKILL.md +43 -0
  93. package/skills/article-magazine/SKILL.md +46 -0
  94. package/skills/article-magazine/example.html +81 -0
  95. package/skills/article-magazine/example.md +38 -0
  96. package/skills/canvas-design/SKILL.md +45 -0
  97. package/skills/design-templates/audio-jingle/SKILL.md +132 -0
  98. package/skills/design-templates/audio-jingle/example.html +128 -0
  99. package/skills/design-templates/blog-post/SKILL.md +80 -0
  100. package/skills/design-templates/blog-post/example.html +80 -0
  101. package/skills/design-templates/clinical-case-report/SKILL.md +209 -0
  102. package/skills/design-templates/clinical-case-report/example.html +698 -0
  103. package/skills/design-templates/clinical-case-report/examples/example-stemi.html +698 -0
  104. package/skills/design-templates/clinical-case-report/references/case-formats.md +94 -0
  105. package/skills/design-templates/clinical-case-report/references/checklist.md +41 -0
  106. package/skills/design-templates/critique/SKILL.md +258 -0
  107. package/skills/design-templates/critique/example.html +671 -0
  108. package/skills/design-templates/dashboard/SKILL.md +76 -0
  109. package/skills/design-templates/dashboard/example.html +118 -0
  110. package/skills/design-templates/dating-web/SKILL.md +92 -0
  111. package/skills/design-templates/dating-web/example.html +265 -0
  112. package/skills/design-templates/dcf-valuation/SKILL.md +140 -0
  113. package/skills/design-templates/dcf-valuation/references/sector-wacc.md +42 -0
  114. package/skills/design-templates/digital-eguide/SKILL.md +94 -0
  115. package/skills/design-templates/digital-eguide/example.html +204 -0
  116. package/skills/design-templates/docs-page/SKILL.md +80 -0
  117. package/skills/design-templates/docs-page/example.html +122 -0
  118. package/skills/design-templates/email-marketing/SKILL.md +84 -0
  119. package/skills/design-templates/email-marketing/example.html +159 -0
  120. package/skills/design-templates/eng-runbook/SKILL.md +51 -0
  121. package/skills/design-templates/eng-runbook/example.html +250 -0
  122. package/skills/design-templates/finance-report/SKILL.md +61 -0
  123. package/skills/design-templates/finance-report/example.html +242 -0
  124. package/skills/design-templates/flowai-live-dashboard-template/SKILL.md +87 -0
  125. package/skills/design-templates/flowai-live-dashboard-template/assets/template.html +387 -0
  126. package/skills/design-templates/flowai-live-dashboard-template/example.html +13 -0
  127. package/skills/design-templates/flowai-live-dashboard-template/references/checklist.md +35 -0
  128. package/skills/design-templates/gamified-app/SKILL.md +108 -0
  129. package/skills/design-templates/gamified-app/example.html +292 -0
  130. package/skills/design-templates/github-dashboard/SKILL.md +130 -0
  131. package/skills/design-templates/github-dashboard/example.html +473 -0
  132. package/skills/design-templates/github-dashboard/references/README.md +10 -0
  133. package/skills/design-templates/github-dashboard/references/artifact-example.json +15 -0
  134. package/skills/design-templates/github-dashboard/references/example-data.json +138 -0
  135. package/skills/design-templates/github-dashboard/references/provenance-example.json +92 -0
  136. package/skills/design-templates/github-dashboard/references/template.html +473 -0
  137. package/skills/design-templates/guizang-ppt/LICENSE +21 -0
  138. package/skills/design-templates/guizang-ppt/README.en.md +119 -0
  139. package/skills/design-templates/guizang-ppt/README.md +120 -0
  140. package/skills/design-templates/guizang-ppt/README.pt-BR.md +121 -0
  141. package/skills/design-templates/guizang-ppt/SKILL.md +313 -0
  142. package/skills/design-templates/guizang-ppt/assets/example-slides.html +318 -0
  143. package/skills/design-templates/guizang-ppt/assets/template.html +647 -0
  144. package/skills/design-templates/guizang-ppt/references/checklist.md +265 -0
  145. package/skills/design-templates/guizang-ppt/references/components.md +363 -0
  146. package/skills/design-templates/guizang-ppt/references/layouts.md +630 -0
  147. package/skills/design-templates/guizang-ppt/references/styles.md +195 -0
  148. package/skills/design-templates/guizang-ppt/references/themes.md +122 -0
  149. package/skills/design-templates/hr-onboarding/SKILL.md +52 -0
  150. package/skills/design-templates/hr-onboarding/example.html +219 -0
  151. package/skills/design-templates/html-ppt/.clawscan-allow +12 -0
  152. package/skills/design-templates/html-ppt/LICENSE +21 -0
  153. package/skills/design-templates/html-ppt/README.md +234 -0
  154. package/skills/design-templates/html-ppt/README.pt-BR.md +239 -0
  155. package/skills/design-templates/html-ppt/README.zh-CN.md +238 -0
  156. package/skills/design-templates/html-ppt/SKILL.md +250 -0
  157. package/skills/design-templates/html-ppt/assets/animations/animations.css +138 -0
  158. package/skills/design-templates/html-ppt/assets/animations/fx/_util.js +63 -0
  159. package/skills/design-templates/html-ppt/assets/animations/fx/chain-react.js +41 -0
  160. package/skills/design-templates/html-ppt/assets/animations/fx/confetti-cannon.js +49 -0
  161. package/skills/design-templates/html-ppt/assets/animations/fx/constellation.js +44 -0
  162. package/skills/design-templates/html-ppt/assets/animations/fx/counter-explosion.js +58 -0
  163. package/skills/design-templates/html-ppt/assets/animations/fx/data-stream.js +45 -0
  164. package/skills/design-templates/html-ppt/assets/animations/fx/firework.js +51 -0
  165. package/skills/design-templates/html-ppt/assets/animations/fx/galaxy-swirl.js +33 -0
  166. package/skills/design-templates/html-ppt/assets/animations/fx/gradient-blob.js +39 -0
  167. package/skills/design-templates/html-ppt/assets/animations/fx/knowledge-graph.js +69 -0
  168. package/skills/design-templates/html-ppt/assets/animations/fx/letter-explode.js +50 -0
  169. package/skills/design-templates/html-ppt/assets/animations/fx/magnetic-field.js +40 -0
  170. package/skills/design-templates/html-ppt/assets/animations/fx/matrix-rain.js +33 -0
  171. package/skills/design-templates/html-ppt/assets/animations/fx/neural-net.js +75 -0
  172. package/skills/design-templates/html-ppt/assets/animations/fx/orbit-ring.js +38 -0
  173. package/skills/design-templates/html-ppt/assets/animations/fx/particle-burst.js +42 -0
  174. package/skills/design-templates/html-ppt/assets/animations/fx/shockwave.js +39 -0
  175. package/skills/design-templates/html-ppt/assets/animations/fx/sparkle-trail.js +62 -0
  176. package/skills/design-templates/html-ppt/assets/animations/fx/starfield.js +30 -0
  177. package/skills/design-templates/html-ppt/assets/animations/fx/typewriter-multi.js +51 -0
  178. package/skills/design-templates/html-ppt/assets/animations/fx/word-cascade.js +47 -0
  179. package/skills/design-templates/html-ppt/assets/animations/fx-runtime.js +99 -0
  180. package/skills/design-templates/html-ppt/assets/base.css +150 -0
  181. package/skills/design-templates/html-ppt/assets/fonts.css +9 -0
  182. package/skills/design-templates/html-ppt/assets/runtime.js +960 -0
  183. package/skills/design-templates/html-ppt/assets/themes/academic-paper.css +23 -0
  184. package/skills/design-templates/html-ppt/assets/themes/arctic-cool.css +14 -0
  185. package/skills/design-templates/html-ppt/assets/themes/aurora.css +20 -0
  186. package/skills/design-templates/html-ppt/assets/themes/bauhaus.css +16 -0
  187. package/skills/design-templates/html-ppt/assets/themes/blueprint.css +19 -0
  188. package/skills/design-templates/html-ppt/assets/themes/catppuccin-latte.css +14 -0
  189. package/skills/design-templates/html-ppt/assets/themes/catppuccin-mocha.css +14 -0
  190. package/skills/design-templates/html-ppt/assets/themes/corporate-clean.css +19 -0
  191. package/skills/design-templates/html-ppt/assets/themes/cyberpunk-neon.css +23 -0
  192. package/skills/design-templates/html-ppt/assets/themes/dracula.css +14 -0
  193. package/skills/design-templates/html-ppt/assets/themes/editorial-serif.css +18 -0
  194. package/skills/design-templates/html-ppt/assets/themes/engineering-whiteprint.css +26 -0
  195. package/skills/design-templates/html-ppt/assets/themes/glassmorphism.css +21 -0
  196. package/skills/design-templates/html-ppt/assets/themes/gruvbox-dark.css +14 -0
  197. package/skills/design-templates/html-ppt/assets/themes/japanese-minimal.css +21 -0
  198. package/skills/design-templates/html-ppt/assets/themes/magazine-bold.css +21 -0
  199. package/skills/design-templates/html-ppt/assets/themes/memphis-pop.css +20 -0
  200. package/skills/design-templates/html-ppt/assets/themes/midcentury.css +19 -0
  201. package/skills/design-templates/html-ppt/assets/themes/minimal-white.css +16 -0
  202. package/skills/design-templates/html-ppt/assets/themes/neo-brutalism.css +17 -0
  203. package/skills/design-templates/html-ppt/assets/themes/news-broadcast.css +20 -0
  204. package/skills/design-templates/html-ppt/assets/themes/nord.css +14 -0
  205. package/skills/design-templates/html-ppt/assets/themes/pitch-deck-vc.css +21 -0
  206. package/skills/design-templates/html-ppt/assets/themes/rainbow-gradient.css +16 -0
  207. package/skills/design-templates/html-ppt/assets/themes/retro-tv.css +22 -0
  208. package/skills/design-templates/html-ppt/assets/themes/rose-pine.css +14 -0
  209. package/skills/design-templates/html-ppt/assets/themes/sharp-mono.css +17 -0
  210. package/skills/design-templates/html-ppt/assets/themes/soft-pastel.css +14 -0
  211. package/skills/design-templates/html-ppt/assets/themes/solarized-light.css +14 -0
  212. package/skills/design-templates/html-ppt/assets/themes/sunset-warm.css +14 -0
  213. package/skills/design-templates/html-ppt/assets/themes/swiss-grid.css +17 -0
  214. package/skills/design-templates/html-ppt/assets/themes/terminal-green.css +18 -0
  215. package/skills/design-templates/html-ppt/assets/themes/tokyo-night.css +14 -0
  216. package/skills/design-templates/html-ppt/assets/themes/vaporwave.css +21 -0
  217. package/skills/design-templates/html-ppt/assets/themes/xiaohongshu-white.css +16 -0
  218. package/skills/design-templates/html-ppt/assets/themes/y2k-chrome.css +20 -0
  219. package/skills/design-templates/html-ppt/docs/readme/_theme-cell.html +56 -0
  220. package/skills/design-templates/html-ppt/docs/readme/animations.png +0 -0
  221. package/skills/design-templates/html-ppt/docs/readme/hero.gif +0 -0
  222. package/skills/design-templates/html-ppt/docs/readme/layouts-live.gif +0 -0
  223. package/skills/design-templates/html-ppt/docs/readme/layouts.png +0 -0
  224. package/skills/design-templates/html-ppt/docs/readme/montage-animations.html +61 -0
  225. package/skills/design-templates/html-ppt/docs/readme/montage-layouts.html +72 -0
  226. package/skills/design-templates/html-ppt/docs/readme/montage-templates.html +72 -0
  227. package/skills/design-templates/html-ppt/docs/readme/montage-themes.html +38 -0
  228. package/skills/design-templates/html-ppt/docs/readme/presenter-mode.png +0 -0
  229. package/skills/design-templates/html-ppt/docs/readme/templates.png +0 -0
  230. package/skills/design-templates/html-ppt/docs/readme/themes.png +0 -0
  231. package/skills/design-templates/html-ppt/examples/demo-deck/index.html +161 -0
  232. package/skills/design-templates/html-ppt/references/animations.md +147 -0
  233. package/skills/design-templates/html-ppt/references/authoring-guide.md +141 -0
  234. package/skills/design-templates/html-ppt/references/full-decks.md +98 -0
  235. package/skills/design-templates/html-ppt/references/layouts.md +103 -0
  236. package/skills/design-templates/html-ppt/references/presenter-mode.md +240 -0
  237. package/skills/design-templates/html-ppt/references/themes.md +107 -0
  238. package/skills/design-templates/html-ppt/scripts/new-deck.sh +46 -0
  239. package/skills/design-templates/html-ppt/scripts/render.sh +71 -0
  240. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_01.png +0 -0
  241. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_02.png +0 -0
  242. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_03.png +0 -0
  243. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_04.png +0 -0
  244. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_05.png +0 -0
  245. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_06.png +0 -0
  246. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_07.png +0 -0
  247. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_08.png +0 -0
  248. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_09.png +0 -0
  249. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_10.png +0 -0
  250. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_11.png +0 -0
  251. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_12.png +0 -0
  252. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_13.png +0 -0
  253. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_14.png +0 -0
  254. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_15.png +0 -0
  255. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_16.png +0 -0
  256. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_17.png +0 -0
  257. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_18.png +0 -0
  258. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_19.png +0 -0
  259. package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_20.png +0 -0
  260. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_01.png +0 -0
  261. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_02.png +0 -0
  262. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_03.png +0 -0
  263. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_04.png +0 -0
  264. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_05.png +0 -0
  265. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_06.png +0 -0
  266. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_07.png +0 -0
  267. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_08.png +0 -0
  268. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_09.png +0 -0
  269. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_10.png +0 -0
  270. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_11.png +0 -0
  271. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_12.png +0 -0
  272. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_13.png +0 -0
  273. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_14.png +0 -0
  274. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_15.png +0 -0
  275. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_16.png +0 -0
  276. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_17.png +0 -0
  277. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_18.png +0 -0
  278. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_19.png +0 -0
  279. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_20.png +0 -0
  280. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_21.png +0 -0
  281. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_22.png +0 -0
  282. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_23.png +0 -0
  283. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_24.png +0 -0
  284. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_25.png +0 -0
  285. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_26.png +0 -0
  286. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_27.png +0 -0
  287. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_28.png +0 -0
  288. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_29.png +0 -0
  289. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_30.png +0 -0
  290. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_31.png +0 -0
  291. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_32.png +0 -0
  292. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_33.png +0 -0
  293. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_34.png +0 -0
  294. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_35.png +0 -0
  295. package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_36.png +0 -0
  296. package/skills/design-templates/html-ppt/templates/animation-showcase.html +172 -0
  297. package/skills/design-templates/html-ppt/templates/deck.html +69 -0
  298. package/skills/design-templates/html-ppt/templates/full-decks/course-module/README.md +8 -0
  299. package/skills/design-templates/html-ppt/templates/full-decks/course-module/index.html +189 -0
  300. package/skills/design-templates/html-ppt/templates/full-decks/course-module/style.css +46 -0
  301. package/skills/design-templates/html-ppt/templates/full-decks/dir-key-nav-minimal/README.md +11 -0
  302. package/skills/design-templates/html-ppt/templates/full-decks/dir-key-nav-minimal/index.html +138 -0
  303. package/skills/design-templates/html-ppt/templates/full-decks/dir-key-nav-minimal/style.css +60 -0
  304. package/skills/design-templates/html-ppt/templates/full-decks/graphify-dark-graph/README.md +11 -0
  305. package/skills/design-templates/html-ppt/templates/full-decks/graphify-dark-graph/index.html +180 -0
  306. package/skills/design-templates/html-ppt/templates/full-decks/graphify-dark-graph/style.css +54 -0
  307. package/skills/design-templates/html-ppt/templates/full-decks/hermes-cyber-terminal/README.md +11 -0
  308. package/skills/design-templates/html-ppt/templates/full-decks/hermes-cyber-terminal/index.html +199 -0
  309. package/skills/design-templates/html-ppt/templates/full-decks/hermes-cyber-terminal/style.css +55 -0
  310. package/skills/design-templates/html-ppt/templates/full-decks/knowledge-arch-blueprint/README.md +11 -0
  311. package/skills/design-templates/html-ppt/templates/full-decks/knowledge-arch-blueprint/index.html +190 -0
  312. package/skills/design-templates/html-ppt/templates/full-decks/knowledge-arch-blueprint/style.css +49 -0
  313. package/skills/design-templates/html-ppt/templates/full-decks/obsidian-claude-gradient/README.md +11 -0
  314. package/skills/design-templates/html-ppt/templates/full-decks/obsidian-claude-gradient/index.html +144 -0
  315. package/skills/design-templates/html-ppt/templates/full-decks/obsidian-claude-gradient/style.css +59 -0
  316. package/skills/design-templates/html-ppt/templates/full-decks/pitch-deck/README.md +9 -0
  317. package/skills/design-templates/html-ppt/templates/full-decks/pitch-deck/index.html +148 -0
  318. package/skills/design-templates/html-ppt/templates/full-decks/pitch-deck/style.css +40 -0
  319. package/skills/design-templates/html-ppt/templates/full-decks/presenter-mode-reveal/README.md +102 -0
  320. package/skills/design-templates/html-ppt/templates/full-decks/presenter-mode-reveal/index.html +187 -0
  321. package/skills/design-templates/html-ppt/templates/full-decks/presenter-mode-reveal/style.css +216 -0
  322. package/skills/design-templates/html-ppt/templates/full-decks/product-launch/README.md +8 -0
  323. package/skills/design-templates/html-ppt/templates/full-decks/product-launch/index.html +121 -0
  324. package/skills/design-templates/html-ppt/templates/full-decks/product-launch/style.css +39 -0
  325. package/skills/design-templates/html-ppt/templates/full-decks/tech-sharing/README.md +8 -0
  326. package/skills/design-templates/html-ppt/templates/full-decks/tech-sharing/index.html +156 -0
  327. package/skills/design-templates/html-ppt/templates/full-decks/tech-sharing/style.css +49 -0
  328. package/skills/design-templates/html-ppt/templates/full-decks/testing-safety-alert/README.md +11 -0
  329. package/skills/design-templates/html-ppt/templates/full-decks/testing-safety-alert/index.html +183 -0
  330. package/skills/design-templates/html-ppt/templates/full-decks/testing-safety-alert/style.css +62 -0
  331. package/skills/design-templates/html-ppt/templates/full-decks/weekly-report/README.md +8 -0
  332. package/skills/design-templates/html-ppt/templates/full-decks/weekly-report/index.html +127 -0
  333. package/skills/design-templates/html-ppt/templates/full-decks/weekly-report/style.css +55 -0
  334. package/skills/design-templates/html-ppt/templates/full-decks/xhs-pastel-card/README.md +11 -0
  335. package/skills/design-templates/html-ppt/templates/full-decks/xhs-pastel-card/index.html +147 -0
  336. package/skills/design-templates/html-ppt/templates/full-decks/xhs-pastel-card/style.css +66 -0
  337. package/skills/design-templates/html-ppt/templates/full-decks/xhs-post/README.md +9 -0
  338. package/skills/design-templates/html-ppt/templates/full-decks/xhs-post/index.html +133 -0
  339. package/skills/design-templates/html-ppt/templates/full-decks/xhs-post/style.css +47 -0
  340. package/skills/design-templates/html-ppt/templates/full-decks/xhs-white-editorial/README.md +11 -0
  341. package/skills/design-templates/html-ppt/templates/full-decks/xhs-white-editorial/index.html +187 -0
  342. package/skills/design-templates/html-ppt/templates/full-decks/xhs-white-editorial/style.css +63 -0
  343. package/skills/design-templates/html-ppt/templates/full-decks-index.html +82 -0
  344. package/skills/design-templates/html-ppt/templates/layout-showcase.html +47 -0
  345. package/skills/design-templates/html-ppt/templates/single-page/arch-diagram.html +46 -0
  346. package/skills/design-templates/html-ppt/templates/single-page/big-quote.html +18 -0
  347. package/skills/design-templates/html-ppt/templates/single-page/bullets.html +19 -0
  348. package/skills/design-templates/html-ppt/templates/single-page/chart-bar.html +30 -0
  349. package/skills/design-templates/html-ppt/templates/single-page/chart-line.html +35 -0
  350. package/skills/design-templates/html-ppt/templates/single-page/chart-pie.html +36 -0
  351. package/skills/design-templates/html-ppt/templates/single-page/chart-radar.html +31 -0
  352. package/skills/design-templates/html-ppt/templates/single-page/code.html +33 -0
  353. package/skills/design-templates/html-ppt/templates/single-page/comparison.html +47 -0
  354. package/skills/design-templates/html-ppt/templates/single-page/cover.html +32 -0
  355. package/skills/design-templates/html-ppt/templates/single-page/cta.html +27 -0
  356. package/skills/design-templates/html-ppt/templates/single-page/diff.html +35 -0
  357. package/skills/design-templates/html-ppt/templates/single-page/flow-diagram.html +33 -0
  358. package/skills/design-templates/html-ppt/templates/single-page/gantt.html +29 -0
  359. package/skills/design-templates/html-ppt/templates/single-page/image-grid.html +34 -0
  360. package/skills/design-templates/html-ppt/templates/single-page/image-hero.html +33 -0
  361. package/skills/design-templates/html-ppt/templates/single-page/kpi-grid.html +19 -0
  362. package/skills/design-templates/html-ppt/templates/single-page/mindmap.html +38 -0
  363. package/skills/design-templates/html-ppt/templates/single-page/process-steps.html +27 -0
  364. package/skills/design-templates/html-ppt/templates/single-page/pros-cons.html +31 -0
  365. package/skills/design-templates/html-ppt/templates/single-page/roadmap.html +46 -0
  366. package/skills/design-templates/html-ppt/templates/single-page/section-divider.html +17 -0
  367. package/skills/design-templates/html-ppt/templates/single-page/stat-highlight.html +17 -0
  368. package/skills/design-templates/html-ppt/templates/single-page/table.html +33 -0
  369. package/skills/design-templates/html-ppt/templates/single-page/terminal.html +35 -0
  370. package/skills/design-templates/html-ppt/templates/single-page/thanks.html +21 -0
  371. package/skills/design-templates/html-ppt/templates/single-page/three-column.html +18 -0
  372. package/skills/design-templates/html-ppt/templates/single-page/timeline.html +32 -0
  373. package/skills/design-templates/html-ppt/templates/single-page/toc.html +26 -0
  374. package/skills/design-templates/html-ppt/templates/single-page/todo-checklist.html +33 -0
  375. package/skills/design-templates/html-ppt/templates/single-page/two-column.html +39 -0
  376. package/skills/design-templates/html-ppt/templates/theme-showcase.html +151 -0
  377. package/skills/design-templates/html-ppt-course-module/SKILL.md +78 -0
  378. package/skills/design-templates/html-ppt-course-module/example.html +542 -0
  379. package/skills/design-templates/html-ppt-dir-key-nav-minimal/SKILL.md +77 -0
  380. package/skills/design-templates/html-ppt-dir-key-nav-minimal/example.html +366 -0
  381. package/skills/design-templates/html-ppt-graphify-dark-graph/SKILL.md +77 -0
  382. package/skills/design-templates/html-ppt-graphify-dark-graph/example.html +402 -0
  383. package/skills/design-templates/html-ppt-hermes-cyber-terminal/SKILL.md +77 -0
  384. package/skills/design-templates/html-ppt-hermes-cyber-terminal/example.html +422 -0
  385. package/skills/design-templates/html-ppt-knowledge-arch-blueprint/SKILL.md +77 -0
  386. package/skills/design-templates/html-ppt-knowledge-arch-blueprint/example.html +407 -0
  387. package/skills/design-templates/html-ppt-obsidian-claude-gradient/SKILL.md +77 -0
  388. package/skills/design-templates/html-ppt-obsidian-claude-gradient/example.html +371 -0
  389. package/skills/design-templates/html-ppt-pitch-deck/SKILL.md +78 -0
  390. package/skills/design-templates/html-ppt-pitch-deck/example.html +495 -0
  391. package/skills/design-templates/html-ppt-presenter-mode-reveal/SKILL.md +78 -0
  392. package/skills/design-templates/html-ppt-presenter-mode-reveal/example.html +725 -0
  393. package/skills/design-templates/html-ppt-product-launch/SKILL.md +77 -0
  394. package/skills/design-templates/html-ppt-product-launch/example.html +467 -0
  395. package/skills/design-templates/html-ppt-taste-brutalist/SKILL.md +70 -0
  396. package/skills/design-templates/html-ppt-taste-brutalist/example.html +774 -0
  397. package/skills/design-templates/html-ppt-taste-editorial/SKILL.md +62 -0
  398. package/skills/design-templates/html-ppt-taste-editorial/example.html +689 -0
  399. package/skills/design-templates/html-ppt-tech-sharing/SKILL.md +77 -0
  400. package/skills/design-templates/html-ppt-tech-sharing/example.html +512 -0
  401. package/skills/design-templates/html-ppt-testing-safety-alert/SKILL.md +78 -0
  402. package/skills/design-templates/html-ppt-testing-safety-alert/example.html +413 -0
  403. package/skills/design-templates/html-ppt-weekly-report/SKILL.md +77 -0
  404. package/skills/design-templates/html-ppt-weekly-report/example.html +489 -0
  405. package/skills/design-templates/html-ppt-xhs-pastel-card/SKILL.md +78 -0
  406. package/skills/design-templates/html-ppt-xhs-pastel-card/example.html +381 -0
  407. package/skills/design-templates/html-ppt-xhs-post/SKILL.md +78 -0
  408. package/skills/design-templates/html-ppt-xhs-post/example.html +487 -0
  409. package/skills/design-templates/html-ppt-xhs-white-editorial/SKILL.md +77 -0
  410. package/skills/design-templates/html-ppt-xhs-white-editorial/example.html +418 -0
  411. package/skills/design-templates/html-ppt-zhangzara-8-bit-orbit/LICENSE +21 -0
  412. package/skills/design-templates/html-ppt-zhangzara-8-bit-orbit/SKILL.md +93 -0
  413. package/skills/design-templates/html-ppt-zhangzara-8-bit-orbit/example.html +1640 -0
  414. package/skills/design-templates/html-ppt-zhangzara-8-bit-orbit/template.json +48 -0
  415. package/skills/design-templates/html-ppt-zhangzara-biennale-yellow/LICENSE +21 -0
  416. package/skills/design-templates/html-ppt-zhangzara-biennale-yellow/SKILL.md +93 -0
  417. package/skills/design-templates/html-ppt-zhangzara-biennale-yellow/example.html +833 -0
  418. package/skills/design-templates/html-ppt-zhangzara-biennale-yellow/template.json +49 -0
  419. package/skills/design-templates/html-ppt-zhangzara-block-frame/LICENSE +21 -0
  420. package/skills/design-templates/html-ppt-zhangzara-block-frame/SKILL.md +93 -0
  421. package/skills/design-templates/html-ppt-zhangzara-block-frame/example.html +1453 -0
  422. package/skills/design-templates/html-ppt-zhangzara-block-frame/template.json +47 -0
  423. package/skills/design-templates/html-ppt-zhangzara-blue-professional/LICENSE +21 -0
  424. package/skills/design-templates/html-ppt-zhangzara-blue-professional/SKILL.md +93 -0
  425. package/skills/design-templates/html-ppt-zhangzara-blue-professional/example.html +1423 -0
  426. package/skills/design-templates/html-ppt-zhangzara-blue-professional/template.json +44 -0
  427. package/skills/design-templates/html-ppt-zhangzara-bold-poster/LICENSE +21 -0
  428. package/skills/design-templates/html-ppt-zhangzara-bold-poster/SKILL.md +93 -0
  429. package/skills/design-templates/html-ppt-zhangzara-bold-poster/example.html +876 -0
  430. package/skills/design-templates/html-ppt-zhangzara-bold-poster/template.json +45 -0
  431. package/skills/design-templates/html-ppt-zhangzara-broadside/LICENSE +21 -0
  432. package/skills/design-templates/html-ppt-zhangzara-broadside/SKILL.md +92 -0
  433. package/skills/design-templates/html-ppt-zhangzara-broadside/example.html +2144 -0
  434. package/skills/design-templates/html-ppt-zhangzara-broadside/template.json +49 -0
  435. package/skills/design-templates/html-ppt-zhangzara-capsule/LICENSE +21 -0
  436. package/skills/design-templates/html-ppt-zhangzara-capsule/SKILL.md +92 -0
  437. package/skills/design-templates/html-ppt-zhangzara-capsule/example.html +1413 -0
  438. package/skills/design-templates/html-ppt-zhangzara-capsule/template.json +51 -0
  439. package/skills/design-templates/html-ppt-zhangzara-cartesian/LICENSE +21 -0
  440. package/skills/design-templates/html-ppt-zhangzara-cartesian/SKILL.md +92 -0
  441. package/skills/design-templates/html-ppt-zhangzara-cartesian/example.html +1136 -0
  442. package/skills/design-templates/html-ppt-zhangzara-cartesian/template.json +47 -0
  443. package/skills/design-templates/html-ppt-zhangzara-cobalt-grid/LICENSE +21 -0
  444. package/skills/design-templates/html-ppt-zhangzara-cobalt-grid/SKILL.md +93 -0
  445. package/skills/design-templates/html-ppt-zhangzara-cobalt-grid/example.html +1205 -0
  446. package/skills/design-templates/html-ppt-zhangzara-cobalt-grid/template.json +49 -0
  447. package/skills/design-templates/html-ppt-zhangzara-coral/LICENSE +21 -0
  448. package/skills/design-templates/html-ppt-zhangzara-coral/SKILL.md +92 -0
  449. package/skills/design-templates/html-ppt-zhangzara-coral/example.html +1487 -0
  450. package/skills/design-templates/html-ppt-zhangzara-coral/template.json +45 -0
  451. package/skills/design-templates/html-ppt-zhangzara-creative-mode/LICENSE +21 -0
  452. package/skills/design-templates/html-ppt-zhangzara-creative-mode/SKILL.md +99 -0
  453. package/skills/design-templates/html-ppt-zhangzara-creative-mode/assets/deck-stage.js +619 -0
  454. package/skills/design-templates/html-ppt-zhangzara-creative-mode/example.html +636 -0
  455. package/skills/design-templates/html-ppt-zhangzara-creative-mode/template.json +47 -0
  456. package/skills/design-templates/html-ppt-zhangzara-daisy-days/LICENSE +21 -0
  457. package/skills/design-templates/html-ppt-zhangzara-daisy-days/SKILL.md +93 -0
  458. package/skills/design-templates/html-ppt-zhangzara-daisy-days/example.html +469 -0
  459. package/skills/design-templates/html-ppt-zhangzara-daisy-days/template.json +54 -0
  460. package/skills/design-templates/html-ppt-zhangzara-editorial-tri-tone/LICENSE +21 -0
  461. package/skills/design-templates/html-ppt-zhangzara-editorial-tri-tone/SKILL.md +98 -0
  462. package/skills/design-templates/html-ppt-zhangzara-editorial-tri-tone/assets/deck-stage.js +619 -0
  463. package/skills/design-templates/html-ppt-zhangzara-editorial-tri-tone/example.html +737 -0
  464. package/skills/design-templates/html-ppt-zhangzara-editorial-tri-tone/template.json +44 -0
  465. package/skills/design-templates/html-ppt-zhangzara-grove/LICENSE +21 -0
  466. package/skills/design-templates/html-ppt-zhangzara-grove/SKILL.md +92 -0
  467. package/skills/design-templates/html-ppt-zhangzara-grove/example.html +1676 -0
  468. package/skills/design-templates/html-ppt-zhangzara-grove/template.json +51 -0
  469. package/skills/figma-code-connect-components/SKILL.md +42 -0
  470. package/skills/figma-create-design-system-rules/SKILL.md +42 -0
  471. package/skills/figma-create-new-file/SKILL.md +41 -0
  472. package/skills/figma-generate-design/SKILL.md +42 -0
  473. package/skills/figma-generate-library/SKILL.md +42 -0
  474. package/skills/figma-implement-design/SKILL.md +42 -0
  475. package/skills/figma-use/SKILL.md +42 -0
  476. package/skills/full-page-screenshot/SKILL.md +42 -0
  477. package/skills/interview-me/SKILL.md +64 -0
  478. package/skills/planning-and-task-breakdown/SKILL.md +52 -0
  479. package/skills/sora/SKILL.md +43 -0
  480. package/skills/theme-factory/SKILL.md +43 -0
  481. package/skills/web-design-guidelines/SKILL.md +42 -0
  482. package/dist/agents/prompt-library/orchestration.d.ts +0 -4
  483. package/skills/brainstorming/SKILL.md +0 -164
  484. package/skills/brainstorming/scripts/frame-template.html +0 -214
  485. package/skills/brainstorming/scripts/helper.js +0 -88
  486. package/skills/brainstorming/scripts/server.cjs +0 -354
  487. package/skills/brainstorming/scripts/start-server.sh +0 -148
  488. package/skills/brainstorming/scripts/stop-server.sh +0 -56
  489. package/skills/brainstorming/spec-document-reviewer-prompt.md +0 -49
  490. package/skills/brainstorming/visual-companion.md +0 -287
@@ -0,0 +1,619 @@
1
+ /**
2
+ * <deck-stage> — reusable web component for HTML decks.
3
+ *
4
+ * Handles:
5
+ * (a) speaker notes — reads <script type="application/json" id="speaker-notes">
6
+ * and posts {slideIndexChanged: N} to the parent window on nav.
7
+ * (b) keyboard navigation — ←/→, PgUp/PgDn, Space, Home/End, number keys.
8
+ * (c) press R to reset to slide 0 (with a tasteful keyboard hint).
9
+ * (d) bottom-center overlay showing slide count + hints, fades out on idle.
10
+ * (e) auto-scaling — inner canvas is a fixed design size (default 1920×1080)
11
+ * scaled with `transform: scale()` to fit the viewport, letterboxed.
12
+ * Set the `noscale` attribute to render at authored size (1:1) — the
13
+ * PPTX exporter sets this so its DOM capture sees unscaled geometry.
14
+ * (f) print — `@media print` lays every slide out as its own page at the
15
+ * design size, so the browser's Print → Save as PDF produces a clean
16
+ * one-page-per-slide PDF with no extra setup.
17
+ *
18
+ * Slides are HIDDEN, not unmounted. Non-active slides stay in the DOM with
19
+ * `visibility: hidden` + `opacity: 0`, so their state (videos, iframes,
20
+ * form inputs, React trees) is preserved across navigation.
21
+ *
22
+ * Lifecycle event — the component dispatches a `slidechange` CustomEvent on
23
+ * itself whenever the active slide changes (including the initial mount).
24
+ * The event bubbles and composes out of shadow DOM, so you can listen on
25
+ * the <deck-stage> element or on document:
26
+ *
27
+ * document.querySelector('deck-stage').addEventListener('slidechange', (e) => {
28
+ * e.detail.index // new 0-based index
29
+ * e.detail.previousIndex // previous index, or -1 on init
30
+ * e.detail.total // total slide count
31
+ * e.detail.slide // the new active slide element
32
+ * e.detail.previousSlide // the prior slide element, or null on init
33
+ * e.detail.reason // 'init' | 'keyboard' | 'click' | 'tap' | 'api'
34
+ * });
35
+ *
36
+ * Persistence: none at the deck level. The host app keeps the current slide
37
+ * in its own URL (?slide=) and re-delivers it via location.hash on load, so a
38
+ * bare load with no hash always starts at slide 1.
39
+ *
40
+ * Usage:
41
+ * <deck-stage width="1920" height="1080">
42
+ * <section data-label="Title">...</section>
43
+ * <section data-label="Agenda">...</section>
44
+ * </deck-stage>
45
+ *
46
+ * Slides are the direct element children of <deck-stage>. Each slide is
47
+ * automatically tagged with:
48
+ * - data-screen-label="NN Label" (1-indexed, for comment flow)
49
+ * - data-om-validate="no_overflowing_text,no_overlapping_text,slide_sized_text"
50
+ */
51
+
52
+ (() => {
53
+ const DESIGN_W_DEFAULT = 1920;
54
+ const DESIGN_H_DEFAULT = 1080;
55
+ const OVERLAY_HIDE_MS = 1800;
56
+ const VALIDATE_ATTR = 'no_overflowing_text,no_overlapping_text,slide_sized_text';
57
+
58
+ const pad2 = (n) => String(n).padStart(2, '0');
59
+
60
+ const stylesheet = `
61
+ :host {
62
+ position: fixed;
63
+ inset: 0;
64
+ display: block;
65
+ background: #000;
66
+ color: #fff;
67
+ font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, Arial, sans-serif;
68
+ overflow: hidden;
69
+ }
70
+
71
+ .stage {
72
+ position: absolute;
73
+ inset: 0;
74
+ display: flex;
75
+ align-items: center;
76
+ justify-content: center;
77
+ }
78
+
79
+ .canvas {
80
+ position: relative;
81
+ transform-origin: center center;
82
+ flex-shrink: 0;
83
+ background: #fff;
84
+ will-change: transform;
85
+ }
86
+
87
+ /* Slides live in light DOM (via <slot>) so authored CSS still applies.
88
+ We absolutely position each slotted child to stack them. */
89
+ ::slotted(*) {
90
+ position: absolute !important;
91
+ inset: 0 !important;
92
+ width: 100% !important;
93
+ height: 100% !important;
94
+ box-sizing: border-box !important;
95
+ overflow: hidden;
96
+ opacity: 0;
97
+ pointer-events: none;
98
+ visibility: hidden;
99
+ }
100
+ ::slotted([data-deck-active]) {
101
+ opacity: 1;
102
+ pointer-events: auto;
103
+ visibility: visible;
104
+ }
105
+
106
+ /* Tap zones for mobile — back/forward thirds like Stories.
107
+ Transparent, no visible UI, don't block the overlay. */
108
+ .tapzones {
109
+ position: fixed;
110
+ inset: 0;
111
+ display: flex;
112
+ z-index: 2147482000;
113
+ pointer-events: none;
114
+ }
115
+ .tapzone {
116
+ flex: 1;
117
+ pointer-events: auto;
118
+ -webkit-tap-highlight-color: transparent;
119
+ }
120
+ /* Only activate tap zones on coarse pointers (touch devices). */
121
+ @media (hover: hover) and (pointer: fine) {
122
+ .tapzones { display: none; }
123
+ }
124
+
125
+ .overlay {
126
+ position: fixed;
127
+ left: 50%;
128
+ bottom: 22px;
129
+ transform: translate(-50%, 6px) scale(0.92);
130
+ filter: blur(6px);
131
+ display: flex;
132
+ align-items: center;
133
+ gap: 4px;
134
+ padding: 4px;
135
+ background: #000;
136
+ color: #fff;
137
+ border-radius: 999px;
138
+ font-size: 12px;
139
+ font-feature-settings: "tnum" 1;
140
+ letter-spacing: 0.01em;
141
+ opacity: 0;
142
+ pointer-events: none;
143
+ transition: opacity 260ms ease, transform 260ms cubic-bezier(.2,.8,.2,1), filter 260ms ease;
144
+ transform-origin: center bottom;
145
+ z-index: 2147483000;
146
+ user-select: none;
147
+ }
148
+ .overlay[data-visible] {
149
+ opacity: 1;
150
+ pointer-events: auto;
151
+ transform: translate(-50%, 0) scale(1);
152
+ filter: blur(0);
153
+ }
154
+
155
+ .btn {
156
+ appearance: none;
157
+ -webkit-appearance: none;
158
+ background: transparent;
159
+ border: 0;
160
+ margin: 0;
161
+ padding: 0;
162
+ color: inherit;
163
+ font: inherit;
164
+ cursor: default;
165
+ display: inline-flex;
166
+ align-items: center;
167
+ justify-content: center;
168
+ height: 28px;
169
+ min-width: 28px;
170
+ border-radius: 999px;
171
+ color: rgba(255,255,255,0.72);
172
+ transition: background 140ms ease, color 140ms ease;
173
+ -webkit-tap-highlight-color: transparent;
174
+ }
175
+ .btn:hover { background: rgba(255,255,255,0.12); color: #fff; }
176
+ .btn:active { background: rgba(255,255,255,0.18); }
177
+ .btn:focus { outline: none; }
178
+ .btn:focus-visible { outline: none; }
179
+ .btn::-moz-focus-inner { border: 0; }
180
+ .btn svg { width: 14px; height: 14px; display: block; }
181
+ .btn.reset {
182
+ font-size: 11px;
183
+ font-weight: 500;
184
+ letter-spacing: 0.02em;
185
+ padding: 0 10px 0 12px;
186
+ gap: 6px;
187
+ color: rgba(255,255,255,0.72);
188
+ }
189
+ .btn.reset .kbd {
190
+ display: inline-flex;
191
+ align-items: center;
192
+ justify-content: center;
193
+ min-width: 16px;
194
+ height: 16px;
195
+ padding: 0 4px;
196
+ font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
197
+ font-size: 10px;
198
+ line-height: 1;
199
+ color: rgba(255,255,255,0.88);
200
+ background: rgba(255,255,255,0.12);
201
+ border-radius: 4px;
202
+ }
203
+
204
+ .count {
205
+ font-variant-numeric: tabular-nums;
206
+ color: #fff;
207
+ font-weight: 500;
208
+ padding: 0 8px;
209
+ min-width: 42px;
210
+ text-align: center;
211
+ font-size: 12px;
212
+ }
213
+ .count .sep { color: rgba(255,255,255,0.45); margin: 0 3px; font-weight: 400; }
214
+ .count .total { color: rgba(255,255,255,0.55); }
215
+
216
+ .divider {
217
+ width: 1px;
218
+ height: 14px;
219
+ background: rgba(255,255,255,0.18);
220
+ margin: 0 2px;
221
+ }
222
+
223
+ /* ── Print: one page per slide, no chrome ────────────────────────────
224
+ The screen layout stacks every slide at inset:0 inside a scaled
225
+ canvas; for print we want them in document flow at the authored
226
+ design size so the browser paginates one slide per sheet. The
227
+ @page size is set from the width/height attributes via the inline
228
+ <style id="deck-stage-print-page"> that connectedCallback injects
229
+ into <head> (the @page at-rule has no effect inside shadow DOM). */
230
+ @media print {
231
+ :host {
232
+ position: static;
233
+ inset: auto;
234
+ background: none;
235
+ overflow: visible;
236
+ color: inherit;
237
+ }
238
+ .stage { position: static; display: block; }
239
+ .canvas {
240
+ transform: none !important;
241
+ width: auto !important;
242
+ height: auto !important;
243
+ background: none;
244
+ will-change: auto;
245
+ }
246
+ ::slotted(*) {
247
+ position: relative !important;
248
+ inset: auto !important;
249
+ width: var(--deck-design-w) !important;
250
+ height: var(--deck-design-h) !important;
251
+ box-sizing: border-box !important;
252
+ opacity: 1 !important;
253
+ visibility: visible !important;
254
+ pointer-events: auto;
255
+ break-after: page;
256
+ page-break-after: always;
257
+ break-inside: avoid;
258
+ overflow: hidden;
259
+ }
260
+ ::slotted(*:last-child) {
261
+ break-after: auto;
262
+ page-break-after: auto;
263
+ }
264
+ .overlay, .tapzones { display: none !important; }
265
+ }
266
+ `;
267
+
268
+ class DeckStage extends HTMLElement {
269
+ static get observedAttributes() { return ['width', 'height', 'noscale']; }
270
+
271
+ constructor() {
272
+ super();
273
+ this._root = this.attachShadow({ mode: 'open' });
274
+ this._index = 0;
275
+ this._slides = [];
276
+ this._notes = [];
277
+ this._hideTimer = null;
278
+ this._mouseIdleTimer = null;
279
+
280
+ this._onKey = this._onKey.bind(this);
281
+ this._onResize = this._onResize.bind(this);
282
+ this._onSlotChange = this._onSlotChange.bind(this);
283
+ this._onMouseMove = this._onMouseMove.bind(this);
284
+ this._onTapBack = this._onTapBack.bind(this);
285
+ this._onTapForward = this._onTapForward.bind(this);
286
+ }
287
+
288
+ get designWidth() {
289
+ return parseInt(this.getAttribute('width'), 10) || DESIGN_W_DEFAULT;
290
+ }
291
+ get designHeight() {
292
+ return parseInt(this.getAttribute('height'), 10) || DESIGN_H_DEFAULT;
293
+ }
294
+
295
+ connectedCallback() {
296
+ this._render();
297
+ this._loadNotes();
298
+ this._syncPrintPageRule();
299
+ window.addEventListener('keydown', this._onKey);
300
+ window.addEventListener('resize', this._onResize);
301
+ window.addEventListener('mousemove', this._onMouseMove, { passive: true });
302
+ // Initial collection + layout happens via slotchange, which fires on mount.
303
+ }
304
+
305
+ disconnectedCallback() {
306
+ window.removeEventListener('keydown', this._onKey);
307
+ window.removeEventListener('resize', this._onResize);
308
+ window.removeEventListener('mousemove', this._onMouseMove);
309
+ if (this._hideTimer) clearTimeout(this._hideTimer);
310
+ if (this._mouseIdleTimer) clearTimeout(this._mouseIdleTimer);
311
+ }
312
+
313
+ attributeChangedCallback() {
314
+ if (this._canvas) {
315
+ this._canvas.style.width = this.designWidth + 'px';
316
+ this._canvas.style.height = this.designHeight + 'px';
317
+ this._canvas.style.setProperty('--deck-design-w', this.designWidth + 'px');
318
+ this._canvas.style.setProperty('--deck-design-h', this.designHeight + 'px');
319
+ this._fit();
320
+ this._syncPrintPageRule();
321
+ }
322
+ }
323
+
324
+ _render() {
325
+ const style = document.createElement('style');
326
+ style.textContent = stylesheet;
327
+
328
+ const stage = document.createElement('div');
329
+ stage.className = 'stage';
330
+
331
+ const canvas = document.createElement('div');
332
+ canvas.className = 'canvas';
333
+ canvas.style.width = this.designWidth + 'px';
334
+ canvas.style.height = this.designHeight + 'px';
335
+ canvas.style.setProperty('--deck-design-w', this.designWidth + 'px');
336
+ canvas.style.setProperty('--deck-design-h', this.designHeight + 'px');
337
+
338
+ const slot = document.createElement('slot');
339
+ slot.addEventListener('slotchange', this._onSlotChange);
340
+ canvas.appendChild(slot);
341
+ stage.appendChild(canvas);
342
+
343
+ // Tap zones (mobile): left third = back, right third = forward.
344
+ const tapzones = document.createElement('div');
345
+ tapzones.className = 'tapzones export-hidden';
346
+ tapzones.setAttribute('aria-hidden', 'true');
347
+ tapzones.setAttribute('data-noncommentable', '');
348
+ const tzBack = document.createElement('div');
349
+ tzBack.className = 'tapzone tapzone--back';
350
+ const tzMid = document.createElement('div');
351
+ tzMid.className = 'tapzone tapzone--mid';
352
+ tzMid.style.pointerEvents = 'none';
353
+ const tzFwd = document.createElement('div');
354
+ tzFwd.className = 'tapzone tapzone--fwd';
355
+ tzBack.addEventListener('click', this._onTapBack);
356
+ tzFwd.addEventListener('click', this._onTapForward);
357
+ tapzones.append(tzBack, tzMid, tzFwd);
358
+
359
+ // Overlay: compact, solid black, with clickable controls.
360
+ const overlay = document.createElement('div');
361
+ overlay.className = 'overlay export-hidden';
362
+ overlay.setAttribute('role', 'toolbar');
363
+ overlay.setAttribute('aria-label', 'Deck controls');
364
+ overlay.setAttribute('data-noncommentable', '');
365
+ overlay.innerHTML = `
366
+ <button class="btn prev" type="button" aria-label="Previous slide" title="Previous (←)">
367
+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 3L5 8l5 5"/></svg>
368
+ </button>
369
+ <span class="count" aria-live="polite"><span class="current">1</span><span class="sep">/</span><span class="total">1</span></span>
370
+ <button class="btn next" type="button" aria-label="Next slide" title="Next (→)">
371
+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 3l5 5-5 5"/></svg>
372
+ </button>
373
+ <span class="divider"></span>
374
+ <button class="btn reset" type="button" aria-label="Reset to first slide" title="Reset (R)">Reset<span class="kbd">R</span></button>
375
+ `;
376
+
377
+ overlay.querySelector('.prev').addEventListener('click', () => this._go(this._index - 1, 'click'));
378
+ overlay.querySelector('.next').addEventListener('click', () => this._go(this._index + 1, 'click'));
379
+ overlay.querySelector('.reset').addEventListener('click', () => this._go(0, 'click'));
380
+
381
+ this._root.append(style, stage, tapzones, overlay);
382
+ this._canvas = canvas;
383
+ this._slot = slot;
384
+ this._overlay = overlay;
385
+ this._countEl = overlay.querySelector('.current');
386
+ this._totalEl = overlay.querySelector('.total');
387
+ }
388
+
389
+ /** @page must live in the document stylesheet — it's a no-op inside
390
+ * shadow DOM. Inject/update a single <head> style tag so the print
391
+ * sheet matches the design size and Save-as-PDF yields one slide per
392
+ * page with no margins. */
393
+ _syncPrintPageRule() {
394
+ const id = 'deck-stage-print-page';
395
+ let tag = document.getElementById(id);
396
+ if (!tag) {
397
+ tag = document.createElement('style');
398
+ tag.id = id;
399
+ document.head.appendChild(tag);
400
+ }
401
+ tag.textContent =
402
+ '@page { size: ' + this.designWidth + 'px ' + this.designHeight + 'px; margin: 0; } ' +
403
+ '@media print { html, body { margin: 0 !important; padding: 0 !important; background: none !important; overflow: visible !important; height: auto !important; } ' +
404
+ '* { -webkit-print-color-adjust: exact; print-color-adjust: exact; } }';
405
+ }
406
+
407
+ _onSlotChange() {
408
+ this._collectSlides();
409
+ this._restoreIndex();
410
+ this._applyIndex({ showOverlay: false, broadcast: true, reason: 'init' });
411
+ this._fit();
412
+ }
413
+
414
+ _collectSlides() {
415
+ const assigned = this._slot.assignedElements({ flatten: true });
416
+ this._slides = assigned.filter((el) => {
417
+ // Skip template/style/script nodes even if someone slots them.
418
+ const tag = el.tagName;
419
+ return tag !== 'TEMPLATE' && tag !== 'SCRIPT' && tag !== 'STYLE';
420
+ });
421
+
422
+ this._slides.forEach((slide, i) => {
423
+ const n = i + 1;
424
+ // Determine a label for comment flow: prefer explicit data-label,
425
+ // then an existing data-screen-label, then first heading, else "Slide".
426
+ let label = slide.getAttribute('data-label');
427
+ if (!label) {
428
+ const existing = slide.getAttribute('data-screen-label');
429
+ if (existing) {
430
+ // Strip any leading number the author may have included.
431
+ label = existing.replace(/^\s*\d+\s*/, '').trim() || existing;
432
+ }
433
+ }
434
+ if (!label) {
435
+ const h = slide.querySelector('h1, h2, h3, [data-title]');
436
+ if (h) label = (h.textContent || '').trim().slice(0, 40);
437
+ }
438
+ if (!label) label = 'Slide';
439
+ slide.setAttribute('data-screen-label', `${pad2(n)} ${label}`);
440
+
441
+ // Validation attribute for comment flow / auto-checks.
442
+ if (!slide.hasAttribute('data-om-validate')) {
443
+ slide.setAttribute('data-om-validate', VALIDATE_ATTR);
444
+ }
445
+
446
+ slide.setAttribute('data-deck-slide', String(i));
447
+ });
448
+
449
+ if (this._totalEl) this._totalEl.textContent = String(this._slides.length || 1);
450
+ if (this._index >= this._slides.length) this._index = Math.max(0, this._slides.length - 1);
451
+ }
452
+
453
+ _loadNotes() {
454
+ const tag = document.getElementById('speaker-notes');
455
+ if (!tag) { this._notes = []; return; }
456
+ try {
457
+ const parsed = JSON.parse(tag.textContent || '[]');
458
+ if (Array.isArray(parsed)) this._notes = parsed;
459
+ } catch (e) {
460
+ console.warn('[deck-stage] Failed to parse #speaker-notes JSON:', e);
461
+ this._notes = [];
462
+ }
463
+ }
464
+
465
+ _restoreIndex() {
466
+ // The host's ?slide= param is delivered as a #<int> hash (1-indexed) on
467
+ // the iframe src. No hash → slide 1; the deck itself keeps no position
468
+ // state across loads.
469
+ const h = (location.hash || '').match(/^#(\d+)$/);
470
+ if (h) {
471
+ const n = parseInt(h[1], 10) - 1;
472
+ if (n >= 0 && n < this._slides.length) this._index = n;
473
+ }
474
+ }
475
+
476
+ _applyIndex({ showOverlay = true, broadcast = true, reason = 'init' } = {}) {
477
+ if (!this._slides.length) return;
478
+ const prev = this._prevIndex == null ? -1 : this._prevIndex;
479
+ const curr = this._index;
480
+ // Keep the iframe's own hash in sync so an in-iframe location.reload()
481
+ // (reload banner path in viewer-handle.ts) lands on the current slide,
482
+ // not the stale deep-link hash from initial load.
483
+ try { history.replaceState(null, '', '#' + (curr + 1)); } catch (e) {}
484
+ this._slides.forEach((s, i) => {
485
+ if (i === curr) s.setAttribute('data-deck-active', '');
486
+ else s.removeAttribute('data-deck-active');
487
+ });
488
+ if (this._countEl) this._countEl.textContent = String(curr + 1);
489
+
490
+ if (broadcast) {
491
+ // (1) Legacy: host-window postMessage for speaker-notes renderers.
492
+ try { window.postMessage({ slideIndexChanged: curr }, '*'); } catch (e) {}
493
+
494
+ // (2) In-page CustomEvent on the <deck-stage> element itself.
495
+ // Bubbles and composes out of shadow DOM so slide code can listen:
496
+ // document.querySelector('deck-stage').addEventListener('slidechange', e => {
497
+ // e.detail.index, e.detail.previousIndex, e.detail.total, e.detail.slide, e.detail.reason
498
+ // });
499
+ const detail = {
500
+ index: curr,
501
+ previousIndex: prev,
502
+ total: this._slides.length,
503
+ slide: this._slides[curr] || null,
504
+ previousSlide: prev >= 0 ? (this._slides[prev] || null) : null,
505
+ reason: reason, // 'init' | 'keyboard' | 'click' | 'tap' | 'api'
506
+ };
507
+ this.dispatchEvent(new CustomEvent('slidechange', {
508
+ detail,
509
+ bubbles: true,
510
+ composed: true,
511
+ }));
512
+ }
513
+
514
+ this._prevIndex = curr;
515
+ if (showOverlay) this._flashOverlay();
516
+ }
517
+
518
+ _flashOverlay() {
519
+ if (!this._overlay) return;
520
+ this._overlay.setAttribute('data-visible', '');
521
+ if (this._hideTimer) clearTimeout(this._hideTimer);
522
+ this._hideTimer = setTimeout(() => {
523
+ this._overlay.removeAttribute('data-visible');
524
+ }, OVERLAY_HIDE_MS);
525
+ }
526
+
527
+ _fit() {
528
+ if (!this._canvas) return;
529
+ // PPTX export sets noscale so the DOM capture sees authored-size
530
+ // geometry — the scaled canvas is in shadow DOM, so the exporter's
531
+ // resetTransformSelector can't reach .canvas.style.transform directly.
532
+ if (this.hasAttribute('noscale')) {
533
+ this._canvas.style.transform = 'none';
534
+ return;
535
+ }
536
+ const vw = window.innerWidth;
537
+ const vh = window.innerHeight;
538
+ const s = Math.min(vw / this.designWidth, vh / this.designHeight);
539
+ this._canvas.style.transform = `scale(${s})`;
540
+ }
541
+
542
+ _onResize() { this._fit(); }
543
+
544
+ _onMouseMove() {
545
+ // Keep overlay visible while mouse moves; hide after idle.
546
+ this._flashOverlay();
547
+ }
548
+
549
+ _onTapBack(e) {
550
+ e.preventDefault();
551
+ this._go(this._index - 1, 'tap');
552
+ }
553
+
554
+ _onTapForward(e) {
555
+ e.preventDefault();
556
+ this._go(this._index + 1, 'tap');
557
+ }
558
+
559
+ _onKey(e) {
560
+ // Ignore when the user is typing.
561
+ const t = e.target;
562
+ if (t && (t.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName))) return;
563
+ if (e.metaKey || e.ctrlKey || e.altKey) return;
564
+
565
+ const key = e.key;
566
+ let handled = true;
567
+
568
+ if (key === 'ArrowRight' || key === 'PageDown' || key === ' ' || key === 'Spacebar') {
569
+ this._go(this._index + 1, 'keyboard');
570
+ } else if (key === 'ArrowLeft' || key === 'PageUp') {
571
+ this._go(this._index - 1, 'keyboard');
572
+ } else if (key === 'Home') {
573
+ this._go(0, 'keyboard');
574
+ } else if (key === 'End') {
575
+ this._go(this._slides.length - 1, 'keyboard');
576
+ } else if (key === 'r' || key === 'R') {
577
+ this._go(0, 'keyboard');
578
+ } else if (/^[0-9]$/.test(key)) {
579
+ // 1..9 jump to that slide; 0 jumps to 10.
580
+ const n = key === '0' ? 9 : parseInt(key, 10) - 1;
581
+ if (n < this._slides.length) this._go(n, 'keyboard');
582
+ } else {
583
+ handled = false;
584
+ }
585
+
586
+ if (handled) {
587
+ e.preventDefault();
588
+ this._flashOverlay();
589
+ }
590
+ }
591
+
592
+ _go(i, reason = 'api') {
593
+ if (!this._slides.length) return;
594
+ const clamped = Math.max(0, Math.min(this._slides.length - 1, i));
595
+ if (clamped === this._index) {
596
+ this._flashOverlay();
597
+ return;
598
+ }
599
+ this._index = clamped;
600
+ this._applyIndex({ showOverlay: true, broadcast: true, reason });
601
+ }
602
+
603
+ // Public API ------------------------------------------------------------
604
+
605
+ /** Current slide index (0-based). */
606
+ get index() { return this._index; }
607
+ /** Total slide count. */
608
+ get length() { return this._slides.length; }
609
+ /** Programmatically navigate. */
610
+ goTo(i) { this._go(i, 'api'); }
611
+ next() { this._go(this._index + 1, 'api'); }
612
+ prev() { this._go(this._index - 1, 'api'); }
613
+ reset() { this._go(0, 'api'); }
614
+ }
615
+
616
+ if (!customElements.get('deck-stage')) {
617
+ customElements.define('deck-stage', DeckStage);
618
+ }
619
+ })();