@aexol/spectral 0.9.230 → 0.9.234

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 (265) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/agent/index.d.ts.map +1 -1
  3. package/dist/agent/index.js +89 -14
  4. package/dist/backend/generated-images.d.ts +1 -1
  5. package/dist/backend/generated-images.d.ts.map +1 -1
  6. package/dist/commands/serve.d.ts.map +1 -1
  7. package/dist/commands/serve.js +12 -1
  8. package/dist/designer/data/skills/blog-post.d.ts +3 -0
  9. package/dist/designer/data/skills/blog-post.d.ts.map +1 -0
  10. package/dist/designer/data/skills/blog-post.js +84 -0
  11. package/dist/designer/data/skills/blog-post.ts +87 -0
  12. package/dist/designer/data/skills/critique.d.ts +3 -0
  13. package/dist/designer/data/skills/critique.d.ts.map +1 -0
  14. package/dist/designer/data/skills/critique.js +109 -0
  15. package/dist/designer/data/skills/critique.ts +112 -0
  16. package/dist/designer/data/skills/dashboard.d.ts +3 -0
  17. package/dist/designer/data/skills/dashboard.d.ts.map +1 -0
  18. package/dist/designer/data/skills/dashboard.js +165 -0
  19. package/dist/designer/data/skills/dashboard.ts +168 -0
  20. package/dist/designer/data/skills/design-brief.d.ts +3 -0
  21. package/dist/designer/data/skills/design-brief.d.ts.map +1 -0
  22. package/dist/designer/data/skills/design-brief.js +141 -0
  23. package/dist/designer/data/skills/design-brief.ts +144 -0
  24. package/dist/designer/data/skills/design-skill.d.ts +10 -0
  25. package/dist/designer/data/skills/design-skill.d.ts.map +1 -0
  26. package/dist/designer/data/skills/design-skill.js +1 -0
  27. package/dist/designer/data/skills/design-skill.ts +9 -0
  28. package/dist/designer/data/skills/docs-page.d.ts +3 -0
  29. package/dist/designer/data/skills/docs-page.d.ts.map +1 -0
  30. package/dist/designer/data/skills/docs-page.js +68 -0
  31. package/dist/designer/data/skills/docs-page.ts +71 -0
  32. package/dist/designer/data/skills/index.d.ts +3 -0
  33. package/dist/designer/data/skills/index.d.ts.map +1 -0
  34. package/dist/designer/data/skills/index.js +28 -0
  35. package/dist/designer/data/skills/index.ts +30 -0
  36. package/dist/designer/data/skills/magazine-poster.d.ts +3 -0
  37. package/dist/designer/data/skills/magazine-poster.d.ts.map +1 -0
  38. package/dist/designer/data/skills/magazine-poster.js +70 -0
  39. package/dist/designer/data/skills/magazine-poster.ts +73 -0
  40. package/dist/designer/data/skills/mobile-app.d.ts +3 -0
  41. package/dist/designer/data/skills/mobile-app.d.ts.map +1 -0
  42. package/dist/designer/data/skills/mobile-app.js +229 -0
  43. package/dist/designer/data/skills/mobile-app.ts +232 -0
  44. package/dist/designer/data/skills/motion-frames.d.ts +3 -0
  45. package/dist/designer/data/skills/motion-frames.d.ts.map +1 -0
  46. package/dist/designer/data/skills/motion-frames.js +121 -0
  47. package/dist/designer/data/skills/motion-frames.ts +124 -0
  48. package/dist/designer/data/skills/pricing-page.d.ts +3 -0
  49. package/dist/designer/data/skills/pricing-page.d.ts.map +1 -0
  50. package/dist/designer/data/skills/pricing-page.js +76 -0
  51. package/dist/designer/data/skills/pricing-page.ts +79 -0
  52. package/dist/designer/data/skills/saas-landing.d.ts +3 -0
  53. package/dist/designer/data/skills/saas-landing.d.ts.map +1 -0
  54. package/dist/designer/data/skills/saas-landing.js +71 -0
  55. package/dist/designer/data/skills/saas-landing.ts +74 -0
  56. package/dist/designer/data/skills/slide-deck.d.ts +3 -0
  57. package/dist/designer/data/skills/slide-deck.d.ts.map +1 -0
  58. package/dist/designer/data/skills/slide-deck.js +213 -0
  59. package/dist/designer/data/skills/slide-deck.ts +216 -0
  60. package/dist/designer/data/skills/social-carousel.d.ts +3 -0
  61. package/dist/designer/data/skills/social-carousel.d.ts.map +1 -0
  62. package/dist/designer/data/skills/social-carousel.js +135 -0
  63. package/dist/designer/data/skills/social-carousel.ts +138 -0
  64. package/dist/designer/data/skills/web-prototype.d.ts +3 -0
  65. package/dist/designer/data/skills/web-prototype.d.ts.map +1 -0
  66. package/dist/designer/data/skills/web-prototype.js +159 -0
  67. package/dist/designer/data/skills/web-prototype.ts +162 -0
  68. package/dist/designer/skills.d.ts +4 -10
  69. package/dist/designer/skills.d.ts.map +1 -1
  70. package/dist/designer/skills.js +2 -1643
  71. package/dist/extensions/logic-trace.d.ts +1 -1
  72. package/dist/extensions/logic-trace.d.ts.map +1 -1
  73. package/dist/extensions/logic-trace.js +199 -70
  74. package/dist/extensions/video-generation/index.d.ts +3 -0
  75. package/dist/extensions/video-generation/index.d.ts.map +1 -0
  76. package/dist/extensions/video-generation/index.js +299 -0
  77. package/dist/extensions/wizard/index.js +9 -1
  78. package/dist/generated/parser/ast/nodes.d.ts +115 -0
  79. package/dist/generated/parser/ast/nodes.d.ts.map +1 -0
  80. package/dist/generated/parser/ast/nodes.js +8 -0
  81. package/dist/generated/parser/lexer/lexer.d.ts +28 -0
  82. package/dist/generated/parser/lexer/lexer.d.ts.map +1 -0
  83. package/dist/generated/parser/{lexer.js → lexer/lexer.js} +1 -180
  84. package/dist/generated/parser/{lexer.d.ts → lexer/tokens.d.ts} +5 -24
  85. package/dist/generated/parser/lexer/tokens.d.ts.map +1 -0
  86. package/dist/generated/parser/lexer/tokens.js +187 -0
  87. package/dist/generated/parser/mod.d.ts +5 -7
  88. package/dist/generated/parser/mod.d.ts.map +1 -1
  89. package/dist/generated/parser/mod.js +2 -1
  90. package/dist/generated/parser/parser/cursor.d.ts +47 -0
  91. package/dist/generated/parser/parser/cursor.d.ts.map +1 -0
  92. package/dist/generated/parser/parser/cursor.js +12 -0
  93. package/dist/generated/parser/parser/definitions.d.ts +16 -0
  94. package/dist/generated/parser/parser/definitions.d.ts.map +1 -0
  95. package/dist/generated/parser/parser/definitions.js +353 -0
  96. package/dist/generated/parser/parser/expressions.d.ts +17 -0
  97. package/dist/generated/parser/parser/expressions.d.ts.map +1 -0
  98. package/dist/generated/parser/parser/expressions.js +165 -0
  99. package/dist/generated/parser/parser.d.ts +18 -133
  100. package/dist/generated/parser/parser.d.ts.map +1 -1
  101. package/dist/generated/parser/parser.js +9 -505
  102. package/dist/generated/parser/tokenizer.d.ts +1 -2
  103. package/dist/generated/parser/tokenizer.d.ts.map +1 -1
  104. package/dist/generated/parser/tokenizer.js +2 -1
  105. package/dist/generated/parser/validator.d.ts +1 -1
  106. package/dist/generated/parser/validator.d.ts.map +1 -1
  107. package/dist/generated/zeus/const.d.ts.map +1 -1
  108. package/dist/generated/zeus/const.js +30 -0
  109. package/dist/generated/zeus/index.d.ts +140 -0
  110. package/dist/generated/zeus/index.d.ts.map +1 -1
  111. package/dist/generated/zeus/index.js +5 -0
  112. package/dist/mcp/glimpse-ui.js +9 -1
  113. package/dist/relay/dispatcher.d.ts +23 -104
  114. package/dist/relay/dispatcher.d.ts.map +1 -1
  115. package/dist/relay/dispatcher.js +21 -1130
  116. package/dist/relay/rest.d.ts +31 -0
  117. package/dist/relay/rest.d.ts.map +1 -0
  118. package/dist/relay/rest.js +85 -0
  119. package/dist/relay/routing.d.ts +109 -0
  120. package/dist/relay/routing.d.ts.map +1 -0
  121. package/dist/relay/routing.js +669 -0
  122. package/dist/relay/wizard-login.d.ts +17 -0
  123. package/dist/relay/wizard-login.d.ts.map +1 -0
  124. package/dist/relay/wizard-login.js +419 -0
  125. package/dist/sdk/agent-core/agent-loop.d.ts +2 -9
  126. package/dist/sdk/agent-core/agent-loop.d.ts.map +1 -1
  127. package/dist/sdk/agent-core/agent-loop.js +17 -291
  128. package/dist/sdk/agent-core/agent.d.ts +11 -4
  129. package/dist/sdk/agent-core/agent.d.ts.map +1 -1
  130. package/dist/sdk/agent-core/agent.js +16 -4
  131. package/dist/sdk/agent-core/tool-call-registry.d.ts +75 -0
  132. package/dist/sdk/agent-core/tool-call-registry.d.ts.map +1 -0
  133. package/dist/sdk/agent-core/tool-call-registry.js +131 -0
  134. package/dist/sdk/agent-core/tool-execution.d.ts +33 -0
  135. package/dist/sdk/agent-core/tool-execution.d.ts.map +1 -0
  136. package/dist/sdk/agent-core/tool-execution.js +399 -0
  137. package/dist/sdk/agent-core/types.d.ts +15 -4
  138. package/dist/sdk/agent-core/types.d.ts.map +1 -1
  139. package/dist/sdk/ai/env-api-keys.js +9 -1
  140. package/dist/sdk/ai/index.d.ts +3 -0
  141. package/dist/sdk/ai/index.d.ts.map +1 -1
  142. package/dist/sdk/ai/index.js +3 -0
  143. package/dist/sdk/ai/providers/faux.d.ts.map +1 -1
  144. package/dist/sdk/ai/providers/faux.js +3 -0
  145. package/dist/sdk/ai/providers/leaked-tool-call-parser.d.ts +39 -6
  146. package/dist/sdk/ai/providers/leaked-tool-call-parser.d.ts.map +1 -1
  147. package/dist/sdk/ai/providers/leaked-tool-call-parser.js +159 -18
  148. package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts +48 -0
  149. package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts.map +1 -0
  150. package/dist/sdk/ai/providers/openai/reasoning-replay.js +209 -0
  151. package/dist/sdk/ai/providers/openai-completions.d.ts.map +1 -1
  152. package/dist/sdk/ai/providers/openai-completions.js +23 -211
  153. package/dist/sdk/ai/providers/openrouter-videos.d.ts +3 -0
  154. package/dist/sdk/ai/providers/openrouter-videos.d.ts.map +1 -0
  155. package/dist/sdk/ai/providers/openrouter-videos.js +412 -0
  156. package/dist/sdk/ai/providers/register-builtins.d.ts.map +1 -1
  157. package/dist/sdk/ai/providers/register-builtins.js +6 -0
  158. package/dist/sdk/ai/providers/simple-options.d.ts +1 -6
  159. package/dist/sdk/ai/providers/simple-options.d.ts.map +1 -1
  160. package/dist/sdk/ai/providers/simple-options.js +0 -22
  161. package/dist/sdk/ai/providers/transform-messages.d.ts.map +1 -1
  162. package/dist/sdk/ai/providers/transform-messages.js +52 -1
  163. package/dist/sdk/ai/types.d.ts +91 -10
  164. package/dist/sdk/ai/types.d.ts.map +1 -1
  165. package/dist/sdk/ai/video-models.d.ts +10 -0
  166. package/dist/sdk/ai/video-models.d.ts.map +1 -0
  167. package/dist/sdk/ai/video-models.generated.d.ts +440 -0
  168. package/dist/sdk/ai/video-models.generated.d.ts.map +1 -0
  169. package/dist/sdk/ai/video-models.generated.js +441 -0
  170. package/dist/sdk/ai/video-models.js +22 -0
  171. package/dist/sdk/ai/videos-api-registry.d.ts +14 -0
  172. package/dist/sdk/ai/videos-api-registry.d.ts.map +1 -0
  173. package/dist/sdk/ai/videos-api-registry.js +21 -0
  174. package/dist/sdk/ai/videos.d.ts +4 -0
  175. package/dist/sdk/ai/videos.d.ts.map +1 -0
  176. package/dist/sdk/ai/videos.js +13 -0
  177. package/dist/sdk/coding-agent/core/agent-session.d.ts +8 -0
  178. package/dist/sdk/coding-agent/core/agent-session.d.ts.map +1 -1
  179. package/dist/sdk/coding-agent/core/agent-session.js +11 -0
  180. package/dist/sdk/coding-agent/core/compaction/compaction.d.ts +6 -118
  181. package/dist/sdk/coding-agent/core/compaction/compaction.d.ts.map +1 -1
  182. package/dist/sdk/coding-agent/core/compaction/compaction.js +11 -733
  183. package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts +58 -0
  184. package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts.map +1 -0
  185. package/dist/sdk/coding-agent/core/compaction/cut-points.js +191 -0
  186. package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts +28 -0
  187. package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts.map +1 -0
  188. package/dist/sdk/coding-agent/core/compaction/dedupe.js +156 -0
  189. package/dist/sdk/coding-agent/core/compaction/summarize.d.ts +21 -0
  190. package/dist/sdk/coding-agent/core/compaction/summarize.d.ts.map +1 -0
  191. package/dist/sdk/coding-agent/core/compaction/summarize.js +181 -0
  192. package/dist/sdk/coding-agent/core/compaction/tokens.d.ts +47 -0
  193. package/dist/sdk/coding-agent/core/compaction/tokens.d.ts.map +1 -0
  194. package/dist/sdk/coding-agent/core/compaction/tokens.js +224 -0
  195. package/dist/sdk/coding-agent/core/extensions/loader.d.ts.map +1 -1
  196. package/dist/sdk/coding-agent/core/extensions/loader.js +14 -0
  197. package/dist/sdk/coding-agent/core/extensions/native-extensions.d.ts +26 -0
  198. package/dist/sdk/coding-agent/core/extensions/native-extensions.d.ts.map +1 -1
  199. package/dist/sdk/coding-agent/core/extensions/native-extensions.js +23 -0
  200. package/dist/sdk/coding-agent/core/extensions/session-events.d.ts +157 -0
  201. package/dist/sdk/coding-agent/core/extensions/session-events.d.ts.map +1 -0
  202. package/dist/sdk/coding-agent/core/extensions/session-events.js +13 -0
  203. package/dist/sdk/coding-agent/core/extensions/types.d.ts +10 -367
  204. package/dist/sdk/coding-agent/core/extensions/types.d.ts.map +1 -1
  205. package/dist/sdk/coding-agent/core/extensions/types.js +2 -10
  206. package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts +219 -0
  207. package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts.map +1 -0
  208. package/dist/sdk/coding-agent/core/extensions/ui-types.js +4 -0
  209. package/dist/sdk/coding-agent/core/messages.d.ts.map +1 -1
  210. package/dist/sdk/coding-agent/core/messages.js +42 -2
  211. package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts +115 -0
  212. package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts.map +1 -0
  213. package/dist/sdk/coding-agent/core/package/default-package-manager.js +1184 -0
  214. package/dist/sdk/coding-agent/core/package/discovery.d.ts +20 -0
  215. package/dist/sdk/coding-agent/core/package/discovery.d.ts.map +1 -0
  216. package/dist/sdk/coding-agent/core/package/discovery.js +283 -0
  217. package/dist/sdk/coding-agent/core/package/ignore.d.ts +29 -0
  218. package/dist/sdk/coding-agent/core/package/ignore.d.ts.map +1 -0
  219. package/dist/sdk/coding-agent/core/package/ignore.js +235 -0
  220. package/dist/sdk/coding-agent/core/package/types.d.ts +128 -0
  221. package/dist/sdk/coding-agent/core/package/types.d.ts.map +1 -0
  222. package/dist/sdk/coding-agent/core/package/types.js +18 -0
  223. package/dist/sdk/coding-agent/core/package/update-check.d.ts +43 -0
  224. package/dist/sdk/coding-agent/core/package/update-check.d.ts.map +1 -0
  225. package/dist/sdk/coding-agent/core/package/update-check.js +253 -0
  226. package/dist/sdk/coding-agent/core/package-manager.d.ts +2 -188
  227. package/dist/sdk/coding-agent/core/package-manager.d.ts.map +1 -1
  228. package/dist/sdk/coding-agent/core/package-manager.js +1 -1940
  229. package/dist/sdk/coding-agent/core/resource-loader.d.ts +11 -0
  230. package/dist/sdk/coding-agent/core/resource-loader.d.ts.map +1 -1
  231. package/dist/sdk/coding-agent/core/resource-loader.js +23 -6
  232. package/dist/sdk/coding-agent/core/sdk.d.ts +24 -2
  233. package/dist/sdk/coding-agent/core/sdk.d.ts.map +1 -1
  234. package/dist/sdk/coding-agent/core/sdk.js +15 -3
  235. package/dist/sdk/coding-agent/core/session/migrate.d.ts +18 -0
  236. package/dist/sdk/coding-agent/core/session/migrate.d.ts.map +1 -0
  237. package/dist/sdk/coding-agent/core/session/migrate.js +78 -0
  238. package/dist/sdk/coding-agent/core/session/types.d.ts +165 -0
  239. package/dist/sdk/coding-agent/core/session/types.d.ts.map +1 -0
  240. package/dist/sdk/coding-agent/core/session/types.js +4 -0
  241. package/dist/sdk/coding-agent/core/session-manager.d.ts +3 -161
  242. package/dist/sdk/coding-agent/core/session-manager.d.ts.map +1 -1
  243. package/dist/sdk/coding-agent/core/session-manager.js +4 -72
  244. package/dist/sdk/coding-agent/core/settings-manager.d.ts +0 -8
  245. package/dist/sdk/coding-agent/core/settings-manager.d.ts.map +1 -1
  246. package/dist/sdk/coding-agent/core/settings-manager.js +3 -3
  247. package/dist/sdk/coding-agent/index.d.ts +2 -2
  248. package/dist/sdk/coding-agent/index.d.ts.map +1 -1
  249. package/dist/sdk/coding-agent/index.js +1 -1
  250. package/dist/sdk-public.d.ts +96 -0
  251. package/dist/sdk-public.d.ts.map +1 -0
  252. package/dist/sdk-public.js +109 -0
  253. package/dist/server/agent-bridge/rehydrate.d.ts +2 -2
  254. package/dist/server/agent-bridge/rehydrate.d.ts.map +1 -1
  255. package/dist/server/agent-bridge/rehydrate.js +14 -0
  256. package/dist/server/agent-bridge.d.ts +8 -2
  257. package/dist/server/agent-bridge.d.ts.map +1 -1
  258. package/dist/server/agent-bridge.js +25 -2
  259. package/dist/server/session-stream.d.ts +19 -0
  260. package/dist/server/session-stream.d.ts.map +1 -1
  261. package/dist/server/session-stream.js +35 -0
  262. package/dist/server/wire.d.ts +13 -0
  263. package/dist/server/wire.d.ts.map +1 -1
  264. package/package.json +8 -2
  265. package/dist/generated/parser/lexer.d.ts.map +0 -1
@@ -0,0 +1,124 @@
1
+ import type { DesignSkill } from "./design-skill.js";
2
+
3
+ export const motionFrames: DesignSkill = {
4
+ name: "motion-frames",
5
+ scenario: "creative",
6
+ description:
7
+ "CSS animation and motion design frames. Keyframe-driven animations, scroll-triggered reveals, staggered lists, loading states, and page transitions — all CSS-only where possible.",
8
+ outputKind: "html",
9
+ workflow: `# Motion Frames Skill
10
+
11
+ Produce a motion design showcase as a single HTML file. CSS keyframe animations, scroll-triggered effects, and subtle micro-interactions — no JavaScript libraries.
12
+
13
+ ## Phase 1 — Animation Vocabulary
14
+
15
+ ### Entrance Animations
16
+ \`\`\`css
17
+ /* Fade up */
18
+ @keyframes fadeUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }
19
+
20
+ /* Scale in */
21
+ @keyframes scaleIn { from { opacity: 0; transform: scale(0.9); } to { opacity: 1; transform: scale(1); } }
22
+
23
+ /* Slide from left */
24
+ @keyframes slideLeft { from { opacity: 0; transform: translateX(-30px); } to { opacity: 1; transform: translateX(0); } }
25
+
26
+ /* Reveal by clip-path */
27
+ @keyframes clipReveal { from { clip-path: inset(0 100% 0 0); } to { clip-path: inset(0 0 0 0); } }
28
+ \`\`\`
29
+
30
+ ### Scroll-Triggered Reveals
31
+ \`\`\`css
32
+ /* Use scroll-driven animations (modern browsers) */
33
+ .reveal {
34
+ animation: fadeUp 0.6s ease-out;
35
+ animation-timeline: view();
36
+ animation-range: entry 20% cover 40%;
37
+ }
38
+
39
+ /* Fallback: use Intersection Observer pattern in a small script */
40
+ .reveal-on-scroll { opacity: 0; transform: translateY(24px); transition: opacity 0.6s ease-out, transform 0.6s ease-out; }
41
+ .reveal-on-scroll.visible { opacity: 1; transform: translateY(0); }
42
+ \`\`\`
43
+
44
+ ### Staggered Lists
45
+ \`\`\`css
46
+ .stagger-list > * { opacity: 0; animation: fadeUp 0.4s ease-out forwards; }
47
+ .stagger-list > *:nth-child(1) { animation-delay: 0ms; }
48
+ .stagger-list > *:nth-child(2) { animation-delay: 80ms; }
49
+ .stagger-list > *:nth-child(3) { animation-delay: 160ms; }
50
+ .stagger-list > *:nth-child(4) { animation-delay: 240ms; }
51
+ .stagger-list > *:nth-child(5) { animation-delay: 320ms; }
52
+ .stagger-list > *:nth-child(6) { animation-delay: 400ms; }
53
+ /* Continue pattern: delay = (n-1) * 80ms up to n=20 */
54
+ \`\`\`
55
+
56
+ ### Loading States
57
+ \`\`\`css
58
+ /* Spinner */
59
+ @keyframes spin { to { transform: rotate(360deg); } }
60
+ .spinner { width: 24px; height: 24px; border: 3px solid var(--border); border-top-color: var(--accent); border-radius: 50%; animation: spin 0.6s linear infinite; }
61
+
62
+ /* Skeleton pulse */
63
+ @keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } }
64
+ .skeleton { background: linear-gradient(90deg, var(--surface) 25%, color-mix(in oklab, var(--surface) 50%, var(--bg)) 50%, var(--surface) 75%); background-size: 200% 100%; animation: shimmer 1.5s ease-in-out infinite; border-radius: 4px; }
65
+
66
+ /* Progress bar */
67
+ @keyframes progress { from { width: 0%; } to { width: 100%; } }
68
+ .progress-bar { height: 4px; background: var(--surface); border-radius: 2px; overflow: hidden; }
69
+ .progress-bar-fill { height: 100%; background: var(--accent); border-radius: 2px; animation: progress 2s ease-out forwards; }
70
+ \`\`\`
71
+
72
+ ### Hover Micro-Interactions
73
+ \`\`\`css
74
+ /* Subtle card lift */
75
+ .card-hover { transition: transform 0.2s ease, box-shadow 0.2s ease; }
76
+ .card-hover:hover { transform: translateY(-2px); box-shadow: 0 8px 24px rgba(0,0,0,0.1); }
77
+
78
+ /* Button press */
79
+ .btn-press { transition: transform 0.1s ease; }
80
+ .btn-press:active { transform: scale(0.97); }
81
+
82
+ /* Link underline slide */
83
+ .link-slide { position: relative; text-decoration: none; }
84
+ .link-slide::after { content: ""; position: absolute; bottom: -1px; left: 0; width: 0; height: 1.5px; background: var(--accent); transition: width 0.3s ease; }
85
+ .link-slide:hover::after { width: 100%; }
86
+
87
+ /* Image zoom */
88
+ .img-zoom { overflow: hidden; border-radius: 8px; }
89
+ .img-zoom img { transition: transform 0.3s ease; }
90
+ .img-zoom:hover img { transform: scale(1.05); }
91
+ \`\`\`
92
+
93
+ ### Page Transitions (View Transitions API)
94
+ \`\`\`css
95
+ /* Add to :root for cross-fade transitions */
96
+ ::view-transition-old(root),
97
+ ::view-transition-new(root) {
98
+ animation-duration: 0.4s;
99
+ }
100
+
101
+ /* Named transitions for specific elements */
102
+ .hero-title { view-transition-name: hero-title; }
103
+ .hero-image { view-transition-name: hero-image; }
104
+ \`\`\`
105
+
106
+ ## Phase 2 — Showcase Layout
107
+
108
+ Build a single HTML page demonstrating each animation category:
109
+ 1. **Entrance section** — cards/stats that animate in on load
110
+ 2. **Scroll reveal section** — content that appears as you scroll
111
+ 3. **Staggered list** — feature list with cascading reveal
112
+ 4. **Loading section** — skeleton screens next to real content
113
+ 5. **Hover gallery** — cards with different hover treatments
114
+ 6. **Interactive section** — buttons and links with micro-interactions
115
+
116
+ ## Phase 3 — Motion Design Rules
117
+ - **Duration**: 150-400ms for micro-interactions; 400-800ms for entrances; DON'T use values above 1s
118
+ - **Easing**: ease-out for entrances (fast start, settle gracefully); ease-in-out for continuous animations
119
+ - **Stagger**: 60-100ms between children; maximum 20 items in a stagger
120
+ - **Performance**: animate transform and opacity only (no width/height/margin animations)
121
+ - **Respect reduced motion**: wrap animations in @media (prefers-reduced-motion: no-preference)
122
+ - **No animation on every element** — pick 2-3 key moments per page
123
+ - **Animation should communicate** — loading state, new content arriving, affordance — not just decoration`,
124
+ };
@@ -0,0 +1,3 @@
1
+ import type { DesignSkill } from "./design-skill.js";
2
+ export declare const pricingPage: DesignSkill;
3
+ //# sourceMappingURL=pricing-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing-page.d.ts","sourceRoot":"","sources":["../../../../src/designer/data/skills/pricing-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,eAAO,MAAM,WAAW,EAAE,WA4EvB,CAAC"}
@@ -0,0 +1,76 @@
1
+ export const pricingPage = {
2
+ name: "pricing-page",
3
+ scenario: "marketing",
4
+ description: "Standalone pricing page — header, plan tier cards, feature comparison table, and FAQ. Uses CSS Grid for plan rows and comparison table. 2-4 tiers with recommended tier accent.",
5
+ outputKind: "html",
6
+ workflow: `# Pricing Page Skill
7
+
8
+ Produce a single-screen pricing page that respects the active design system.
9
+
10
+ ## Phase 1 — Classify the product
11
+
12
+ Pick a tier shape based on the brief:
13
+ - **3-tier** (most common): Free / Pro / Team or Starter / Growth / Enterprise
14
+ - **4-tier** when the brief says "scale" or "enterprise plus"
15
+ - **2-tier** when it says "individual / business" or "personal / pro"
16
+
17
+ ## Phase 2 — Sections (in order)
18
+
19
+ 1. **Hero** — page title (e.g. "Pricing"), one-line subhead, optional monthly/annual toggle.
20
+ \`\`\`css
21
+ .pricing-hero { text-align: center; padding: 80px 0 48px; }
22
+ .toggle { display: inline-flex; border-radius: 999px; background: var(--surface); padding: 4px; margin-top: 24px; }
23
+ .toggle button { padding: 8px 20px; border-radius: 999px; border: none; cursor: pointer; font-size: 14px; font-weight: 500; }
24
+ .toggle button.active { background: var(--fg); color: var(--bg); }
25
+ \`\`\`
26
+
27
+ 2. **Plan cards** — one card per tier. Each card: tier name, price (display font + larger scale for the number), 1-line positioning, 4-6 bullet features, primary CTA.
28
+ \`\`\`css
29
+ .plan-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 24px; max-width: 1100px; margin: 0 auto; padding: 0 24px; }
30
+ .plan-card { background: var(--surface, var(--bg)); border: 1px solid var(--border); border-radius: 12px; padding: 40px 32px; display: flex; flex-direction: column; }
31
+ .plan-card.recommended { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent); position: relative; }
32
+ .plan-card.recommended::before { content: "Popular"; position: absolute; top: -12px; left: 50%; transform: translateX(-50%); background: var(--accent); color: var(--accent-on, white); padding: 4px 16px; border-radius: 999px; font-size: 12px; font-weight: 600; }
33
+ .plan-name { font-size: 20px; font-weight: 600; }
34
+ .plan-price { font-size: 48px; font-weight: 800; line-height: 1; margin: 16px 0 4px; font-family: var(--font-display, var(--font-body)); }
35
+ .plan-price span { font-size: 16px; font-weight: 400; color: var(--muted); }
36
+ .plan-features { list-style: none; padding: 0; margin: 24px 0; flex: 1; }
37
+ .plan-features li { padding: 8px 0; font-size: 14px; border-bottom: 1px solid var(--border-soft, var(--border)); }
38
+ \`\`\`
39
+
40
+ 3. **Comparison table** — feature rows × tier columns, ✓ / — / value cells. Group features into 2-3 logical sections (Core, Collaboration, Support, Security). Sticky header.
41
+ \`\`\`css
42
+ .comparison { max-width: 1100px; margin: 64px auto; padding: 0 24px; }
43
+ .comparison h2 { text-align: center; margin-bottom: 32px; }
44
+ .comparison-table { width: 100%; border-collapse: collapse; font-size: 14px; }
45
+ .comparison-table th { text-align: left; padding: 12px 16px; font-weight: 600; border-bottom: 2px solid var(--border); }
46
+ .comparison-table th:not(:first-child) { text-align: center; }
47
+ .comparison-table td { padding: 12px 16px; border-bottom: 1px solid var(--border-soft, var(--border)); }
48
+ .comparison-table td:not(:first-child) { text-align: center; }
49
+ .section-header td { font-weight: 600; background: var(--surface); font-size: 13px; text-transform: uppercase; letter-spacing: 0.05em; }
50
+ \`\`\`
51
+
52
+ 4. **FAQ** — 4-6 collapsible Q&A items using \`<details><summary>\` (no JS needed).
53
+ \`\`\`css
54
+ .faq { max-width: 720px; margin: 64px auto; padding: 0 24px; }
55
+ .faq h2 { text-align: center; margin-bottom: 32px; }
56
+ .faq details { border-bottom: 1px solid var(--border-soft, var(--border)); padding: 20px 0; }
57
+ .faq summary { font-weight: 600; cursor: pointer; font-size: 16px; list-style: none; display: flex; justify-content: space-between; align-items: center; }
58
+ .faq summary::after { content: "+"; font-size: 20px; }
59
+ .faq details[open] summary::after { content: "−"; }
60
+ .faq p { margin-top: 12px; font-size: 15px; color: var(--muted); line-height: 1.6; }
61
+ \`\`\`
62
+
63
+ 5. **Footer CTA** — single line + button.
64
+
65
+ ## Phase 3 — Content Rules
66
+ - Prices are plausible for the product (not "$X / month")
67
+ - Accent appears on the recommended tier and one CTA only
68
+ - No fake feature names — every row reads as something a real product would offer
69
+ - Comparison table renders cleanly at 1024px and stacks readably below 768px (scroll-x or stacked)
70
+
71
+ ## Phase 4 — Anti-Slop Check
72
+ - [ ] Prices use specific numbers ($29, $79, $199)
73
+ - [ ] Recommended tier is visually distinct
74
+ - [ ] FAQ answers are concrete, not generic
75
+ - [ ] No price-related emoji (💸, 💰, 🤑)`,
76
+ };
@@ -0,0 +1,79 @@
1
+ import type { DesignSkill } from "./design-skill.js";
2
+
3
+ export const pricingPage: DesignSkill = {
4
+ name: "pricing-page",
5
+ scenario: "marketing",
6
+ description:
7
+ "Standalone pricing page — header, plan tier cards, feature comparison table, and FAQ. Uses CSS Grid for plan rows and comparison table. 2-4 tiers with recommended tier accent.",
8
+ outputKind: "html",
9
+ workflow: `# Pricing Page Skill
10
+
11
+ Produce a single-screen pricing page that respects the active design system.
12
+
13
+ ## Phase 1 — Classify the product
14
+
15
+ Pick a tier shape based on the brief:
16
+ - **3-tier** (most common): Free / Pro / Team or Starter / Growth / Enterprise
17
+ - **4-tier** when the brief says "scale" or "enterprise plus"
18
+ - **2-tier** when it says "individual / business" or "personal / pro"
19
+
20
+ ## Phase 2 — Sections (in order)
21
+
22
+ 1. **Hero** — page title (e.g. "Pricing"), one-line subhead, optional monthly/annual toggle.
23
+ \`\`\`css
24
+ .pricing-hero { text-align: center; padding: 80px 0 48px; }
25
+ .toggle { display: inline-flex; border-radius: 999px; background: var(--surface); padding: 4px; margin-top: 24px; }
26
+ .toggle button { padding: 8px 20px; border-radius: 999px; border: none; cursor: pointer; font-size: 14px; font-weight: 500; }
27
+ .toggle button.active { background: var(--fg); color: var(--bg); }
28
+ \`\`\`
29
+
30
+ 2. **Plan cards** — one card per tier. Each card: tier name, price (display font + larger scale for the number), 1-line positioning, 4-6 bullet features, primary CTA.
31
+ \`\`\`css
32
+ .plan-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 24px; max-width: 1100px; margin: 0 auto; padding: 0 24px; }
33
+ .plan-card { background: var(--surface, var(--bg)); border: 1px solid var(--border); border-radius: 12px; padding: 40px 32px; display: flex; flex-direction: column; }
34
+ .plan-card.recommended { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent); position: relative; }
35
+ .plan-card.recommended::before { content: "Popular"; position: absolute; top: -12px; left: 50%; transform: translateX(-50%); background: var(--accent); color: var(--accent-on, white); padding: 4px 16px; border-radius: 999px; font-size: 12px; font-weight: 600; }
36
+ .plan-name { font-size: 20px; font-weight: 600; }
37
+ .plan-price { font-size: 48px; font-weight: 800; line-height: 1; margin: 16px 0 4px; font-family: var(--font-display, var(--font-body)); }
38
+ .plan-price span { font-size: 16px; font-weight: 400; color: var(--muted); }
39
+ .plan-features { list-style: none; padding: 0; margin: 24px 0; flex: 1; }
40
+ .plan-features li { padding: 8px 0; font-size: 14px; border-bottom: 1px solid var(--border-soft, var(--border)); }
41
+ \`\`\`
42
+
43
+ 3. **Comparison table** — feature rows × tier columns, ✓ / — / value cells. Group features into 2-3 logical sections (Core, Collaboration, Support, Security). Sticky header.
44
+ \`\`\`css
45
+ .comparison { max-width: 1100px; margin: 64px auto; padding: 0 24px; }
46
+ .comparison h2 { text-align: center; margin-bottom: 32px; }
47
+ .comparison-table { width: 100%; border-collapse: collapse; font-size: 14px; }
48
+ .comparison-table th { text-align: left; padding: 12px 16px; font-weight: 600; border-bottom: 2px solid var(--border); }
49
+ .comparison-table th:not(:first-child) { text-align: center; }
50
+ .comparison-table td { padding: 12px 16px; border-bottom: 1px solid var(--border-soft, var(--border)); }
51
+ .comparison-table td:not(:first-child) { text-align: center; }
52
+ .section-header td { font-weight: 600; background: var(--surface); font-size: 13px; text-transform: uppercase; letter-spacing: 0.05em; }
53
+ \`\`\`
54
+
55
+ 4. **FAQ** — 4-6 collapsible Q&A items using \`<details><summary>\` (no JS needed).
56
+ \`\`\`css
57
+ .faq { max-width: 720px; margin: 64px auto; padding: 0 24px; }
58
+ .faq h2 { text-align: center; margin-bottom: 32px; }
59
+ .faq details { border-bottom: 1px solid var(--border-soft, var(--border)); padding: 20px 0; }
60
+ .faq summary { font-weight: 600; cursor: pointer; font-size: 16px; list-style: none; display: flex; justify-content: space-between; align-items: center; }
61
+ .faq summary::after { content: "+"; font-size: 20px; }
62
+ .faq details[open] summary::after { content: "−"; }
63
+ .faq p { margin-top: 12px; font-size: 15px; color: var(--muted); line-height: 1.6; }
64
+ \`\`\`
65
+
66
+ 5. **Footer CTA** — single line + button.
67
+
68
+ ## Phase 3 — Content Rules
69
+ - Prices are plausible for the product (not "$X / month")
70
+ - Accent appears on the recommended tier and one CTA only
71
+ - No fake feature names — every row reads as something a real product would offer
72
+ - Comparison table renders cleanly at 1024px and stacks readably below 768px (scroll-x or stacked)
73
+
74
+ ## Phase 4 — Anti-Slop Check
75
+ - [ ] Prices use specific numbers ($29, $79, $199)
76
+ - [ ] Recommended tier is visually distinct
77
+ - [ ] FAQ answers are concrete, not generic
78
+ - [ ] No price-related emoji (💸, 💰, 🤑)`,
79
+ };
@@ -0,0 +1,3 @@
1
+ import type { DesignSkill } from "./design-skill.js";
2
+ export declare const saasLanding: DesignSkill;
3
+ //# sourceMappingURL=saas-landing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saas-landing.d.ts","sourceRoot":"","sources":["../../../../src/designer/data/skills/saas-landing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,eAAO,MAAM,WAAW,EAAE,WAuEvB,CAAC"}
@@ -0,0 +1,71 @@
1
+ export const saasLanding = {
2
+ name: "saas-landing",
3
+ scenario: "marketing",
4
+ description: "Single-page SaaS landing with hero, features, social proof, pricing, and CTA. Production-ready marketing page structure.",
5
+ outputKind: "html",
6
+ workflow: `# SaaS Landing Skill
7
+
8
+ Produce a single-page SaaS landing page. This is your workflow — follow it exactly.
9
+
10
+ ## Phase 0 — Pre-flight
11
+
12
+ 1. Read the design system. Map all color tokens.
13
+ 2. Determine: product name, tagline, audience, has pricing? how many social proof items?
14
+ 3. Vocalize: "I'll build a SaaS landing for [product] using the [system] design system. Sections: hero, features (6), social proof (3 logos + quote), pricing (3 tiers), CTA."
15
+
16
+ ## Phase 1 — Shell
17
+
18
+ Create \`index.html\` with the same skeleton as web-prototype, but use this section order:
19
+
20
+ 1. **Navigation** — Sticky top, 64px height. Logo left, nav links right (Features, Pricing, Docs), "Sign In" + "Get Started" CTA.
21
+ 2. **Hero** — Two-column: left = headline + subtext + CTA + "no credit card" badge, right = product screenshot or illustration.
22
+ 3. **Trust Strip** — 5-6 company logos, grayscale, 80px height each.
23
+ 4. **Features** — 3×2 grid. Each card: icon, title, description. Focus on benefits, not specs.
24
+ 5. **How It Works** — 3-step horizontal flow. Number + title + short description.
25
+ 6. **Social Proof** — Quote block + person attribution.
26
+ 7. **Pricing** — 3-tier cards. Highlight the middle tier with a "Popular" badge.
27
+ 8. **FAQ** — Accordion or simple Q&A list, 4-6 items.
28
+ 9. **CTA Footer** — Full-width, centered, strong headline.
29
+ 10. **Footer** — Logo, copyright, link columns.
30
+
31
+ ## Phase 2 — Key Component Styles
32
+
33
+ ### Navigation
34
+ \`\`\`css
35
+ .nav { position: sticky; top: 0; z-index: 100; height: 64px; background: var(--color-bg-primary); border-bottom: 1px solid var(--color-border); display: flex; align-items: center; backdrop-filter: blur(12px); }
36
+ .nav-inner { display: flex; justify-content: space-between; align-items: center; width: 100%; }
37
+ .nav-links { display: flex; gap: 32px; align-items: center; }
38
+ \`\`\`
39
+
40
+ ### Hero
41
+ \`\`\`css
42
+ .hero { padding: 120px 0 80px; }
43
+ .hero-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: center; }
44
+ .hero h1 { font-size: 56px; font-weight: 800; line-height: 1.1; letter-spacing: -0.03em; }
45
+ .hero p { font-size: 20px; color: var(--color-text-secondary); margin: 24px 0 32px; max-width: 480px; }
46
+ \`\`\`
47
+
48
+ ### Pricing Cards
49
+ \`\`\`css
50
+ .pricing-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }
51
+ .pricing-card { padding: 40px 32px; border-radius: var(--radius); border: 1px solid var(--color-border); background: var(--color-bg-surface); }
52
+ .pricing-card.featured { border-color: var(--color-accent); box-shadow: 0 0 0 1px var(--color-accent); transform: scale(1.03); }
53
+ .price { font-size: 48px; font-weight: 800; margin: 16px 0; }
54
+ .price span { font-size: 16px; font-weight: 400; color: var(--color-text-secondary); }
55
+ \`\`\`
56
+
57
+ ## Phase 3 — Content Rules
58
+
59
+ - Every headline sells a benefit, not describes a feature
60
+ - Pricing: use specific numbers ($29, $79, $199) not "Free / Pro / Enterprise" placeholders
61
+ - Social proof: realistic company names, real-sounding quote
62
+ - CTA button text: action-oriented — "Start Building", "Get Early Access", "See Plans"
63
+ - No lorem ipsum, no placeholder images that look like placeholders — use gradient shapes
64
+
65
+ ## Phase 4 — Anti-Slop Check
66
+
67
+ Same checklist as web-prototype, plus:
68
+ - [ ] Pricing cards don't all look identical — featured tier is visually distinct
69
+ - [ ] Hero doesn't use a gradient background (use solid, pattern, or image)
70
+ - [ ] Trust logos are monochrome, same height, evenly spaced`,
71
+ };
@@ -0,0 +1,74 @@
1
+ import type { DesignSkill } from "./design-skill.js";
2
+
3
+ export const saasLanding: DesignSkill = {
4
+ name: "saas-landing",
5
+ scenario: "marketing",
6
+ description:
7
+ "Single-page SaaS landing with hero, features, social proof, pricing, and CTA. Production-ready marketing page structure.",
8
+ outputKind: "html",
9
+ workflow: `# SaaS Landing Skill
10
+
11
+ Produce a single-page SaaS landing page. This is your workflow — follow it exactly.
12
+
13
+ ## Phase 0 — Pre-flight
14
+
15
+ 1. Read the design system. Map all color tokens.
16
+ 2. Determine: product name, tagline, audience, has pricing? how many social proof items?
17
+ 3. Vocalize: "I'll build a SaaS landing for [product] using the [system] design system. Sections: hero, features (6), social proof (3 logos + quote), pricing (3 tiers), CTA."
18
+
19
+ ## Phase 1 — Shell
20
+
21
+ Create \`index.html\` with the same skeleton as web-prototype, but use this section order:
22
+
23
+ 1. **Navigation** — Sticky top, 64px height. Logo left, nav links right (Features, Pricing, Docs), "Sign In" + "Get Started" CTA.
24
+ 2. **Hero** — Two-column: left = headline + subtext + CTA + "no credit card" badge, right = product screenshot or illustration.
25
+ 3. **Trust Strip** — 5-6 company logos, grayscale, 80px height each.
26
+ 4. **Features** — 3×2 grid. Each card: icon, title, description. Focus on benefits, not specs.
27
+ 5. **How It Works** — 3-step horizontal flow. Number + title + short description.
28
+ 6. **Social Proof** — Quote block + person attribution.
29
+ 7. **Pricing** — 3-tier cards. Highlight the middle tier with a "Popular" badge.
30
+ 8. **FAQ** — Accordion or simple Q&A list, 4-6 items.
31
+ 9. **CTA Footer** — Full-width, centered, strong headline.
32
+ 10. **Footer** — Logo, copyright, link columns.
33
+
34
+ ## Phase 2 — Key Component Styles
35
+
36
+ ### Navigation
37
+ \`\`\`css
38
+ .nav { position: sticky; top: 0; z-index: 100; height: 64px; background: var(--color-bg-primary); border-bottom: 1px solid var(--color-border); display: flex; align-items: center; backdrop-filter: blur(12px); }
39
+ .nav-inner { display: flex; justify-content: space-between; align-items: center; width: 100%; }
40
+ .nav-links { display: flex; gap: 32px; align-items: center; }
41
+ \`\`\`
42
+
43
+ ### Hero
44
+ \`\`\`css
45
+ .hero { padding: 120px 0 80px; }
46
+ .hero-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: center; }
47
+ .hero h1 { font-size: 56px; font-weight: 800; line-height: 1.1; letter-spacing: -0.03em; }
48
+ .hero p { font-size: 20px; color: var(--color-text-secondary); margin: 24px 0 32px; max-width: 480px; }
49
+ \`\`\`
50
+
51
+ ### Pricing Cards
52
+ \`\`\`css
53
+ .pricing-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }
54
+ .pricing-card { padding: 40px 32px; border-radius: var(--radius); border: 1px solid var(--color-border); background: var(--color-bg-surface); }
55
+ .pricing-card.featured { border-color: var(--color-accent); box-shadow: 0 0 0 1px var(--color-accent); transform: scale(1.03); }
56
+ .price { font-size: 48px; font-weight: 800; margin: 16px 0; }
57
+ .price span { font-size: 16px; font-weight: 400; color: var(--color-text-secondary); }
58
+ \`\`\`
59
+
60
+ ## Phase 3 — Content Rules
61
+
62
+ - Every headline sells a benefit, not describes a feature
63
+ - Pricing: use specific numbers ($29, $79, $199) not "Free / Pro / Enterprise" placeholders
64
+ - Social proof: realistic company names, real-sounding quote
65
+ - CTA button text: action-oriented — "Start Building", "Get Early Access", "See Plans"
66
+ - No lorem ipsum, no placeholder images that look like placeholders — use gradient shapes
67
+
68
+ ## Phase 4 — Anti-Slop Check
69
+
70
+ Same checklist as web-prototype, plus:
71
+ - [ ] Pricing cards don't all look identical — featured tier is visually distinct
72
+ - [ ] Hero doesn't use a gradient background (use solid, pattern, or image)
73
+ - [ ] Trust logos are monochrome, same height, evenly spaced`,
74
+ };
@@ -0,0 +1,3 @@
1
+ import type { DesignSkill } from "./design-skill.js";
2
+ export declare const slideDeck: DesignSkill;
3
+ //# sourceMappingURL=slide-deck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slide-deck.d.ts","sourceRoot":"","sources":["../../../../src/designer/data/skills/slide-deck.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,eAAO,MAAM,SAAS,EAAE,WAqNrB,CAAC"}
@@ -0,0 +1,213 @@
1
+ export const slideDeck = {
2
+ name: "slide-deck",
3
+ scenario: "marketing",
4
+ description: "Presentation slide deck as a single HTML file. Fixed 16:9 canvas with keyboard navigation, slide counter, and print-to-PDF support.",
5
+ outputKind: "slides",
6
+ workflow: `# Slide Deck Skill
7
+
8
+ Produce a presentation deck as a single HTML file. 16:9 ratio (1920×1080), keyboard navigation, slide counter.
9
+
10
+ ## Phase 0 — Pre-flight
11
+
12
+ 1. Read the design system for color tokens.
13
+ 2. Determine: deck title, audience, number of slides, tone (pitch, educational, report).
14
+ 3. Vocalize the plan: "I'll create a [N]-slide deck: [slide titles in order]."
15
+
16
+ ## Phase 1 — Framework Skeleton
17
+
18
+ Create \`deck.html\` with this exact framework. The scaling/navigation JS is load-bearing — copy it verbatim.
19
+
20
+ \`\`\`html
21
+ <!doctype html>
22
+ <html lang="en">
23
+ <head>
24
+ <meta charset="utf-8">
25
+ <meta name="viewport" content="width=device-width, initial-scale=1">
26
+ <title>Deck Title</title>
27
+ <style>
28
+ *, *::before, *::after { box-sizing: border-box; margin: 0; }
29
+
30
+ :root {
31
+ --slide-w: 1920px;
32
+ --slide-h: 1080px;
33
+ /* Design system tokens here */
34
+ }
35
+
36
+ html, body { width: 100%; height: 100%; overflow: hidden; background: #000; font-family: var(--font-sans); }
37
+
38
+ #scaler {
39
+ position: absolute;
40
+ top: 50%; left: 50%;
41
+ transform-origin: 0 0;
42
+ }
43
+
44
+ .slide {
45
+ position: absolute;
46
+ top: 0; left: 0;
47
+ width: var(--slide-w);
48
+ height: var(--slide-h);
49
+ display: none;
50
+ overflow: hidden;
51
+ }
52
+ .slide.active { display: flex; }
53
+
54
+ #counter {
55
+ position: fixed; bottom: 16px; right: 16px; z-index: 100;
56
+ background: rgba(0,0,0,0.6); color: #fff; padding: 4px 12px;
57
+ border-radius: 4px; font-size: 14px; font-family: monospace;
58
+ }
59
+
60
+ @media print {
61
+ html, body { width: auto; height: auto; overflow: visible; background: #fff; }
62
+ #scaler { position: static; transform: none; }
63
+ .slide { position: relative; display: block !important; break-after: page; }
64
+ #counter { display: none; }
65
+ }
66
+ </style>
67
+ </head>
68
+ <body>
69
+ <div id="scaler">
70
+ <div class="slide active" data-slide="1"><!-- content --></div>
71
+ <div class="slide" data-slide="2"><!-- content --></div>
72
+ <!-- ... -->
73
+ </div>
74
+ <div id="counter">1 / N</div>
75
+ <script>
76
+ const slides = document.querySelectorAll('.slide');
77
+ let current = 0;
78
+ function show(i) {
79
+ slides[current].classList.remove('active');
80
+ current = (i + slides.length) % slides.length;
81
+ slides[current].classList.add('active');
82
+ document.getElementById('counter').textContent = (current + 1) + ' / ' + slides.length;
83
+ }
84
+ function scale() {
85
+ const scaler = document.getElementById('scaler');
86
+ const sw = window.innerWidth, sh = window.innerHeight;
87
+ const ratio = Math.min(sw / 1920, sh / 1080);
88
+ scaler.style.transform = 'translate(' + (sw/2) + 'px,' + (sh/2) + 'px) scale(' + ratio + ')';
89
+ }
90
+ document.addEventListener('keydown', e => {
91
+ if (e.key === 'ArrowRight' || e.key === 'ArrowDown' || e.key === ' ') { e.preventDefault(); show(current + 1); }
92
+ if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') { e.preventDefault(); show(current - 1); }
93
+ if (e.key === 'Home') { e.preventDefault(); show(0); }
94
+ if (e.key === 'End') { e.preventDefault(); show(slides.length - 1); }
95
+ });
96
+ window.addEventListener('resize', scale);
97
+ scale();
98
+ localStorage.setItem('deck-slide', current);
99
+ </script>
100
+ </body>
101
+ </html>
102
+ \`\`\`
103
+
104
+ ## Phase 2 — Slide Layouts
105
+
106
+ Each slide is a \`.slide\` div with \`.active\` on the first. Tag slides with \`data-slide="N"\`.
107
+
108
+ ### Title Slide
109
+ \`\`\`html
110
+ <div class="slide active" data-slide="1">
111
+ <div class="slide-content title-slide">
112
+ <p class="slide-label">Company · Date</p>
113
+ <h1>Deck Title</h1>
114
+ <p class="slide-subtitle">One-line subtitle</p>
115
+ </div>
116
+ </div>
117
+ \`\`\`
118
+ Style: centered content, 80px headline, dark background with design-system colors.
119
+
120
+ ### Text-Only Slide
121
+ \`\`\`html
122
+ <div class="slide" data-slide="2">
123
+ <div class="slide-content text-slide">
124
+ <h2>Section Title</h2>
125
+ <ul>
126
+ <li>Bullet point one — keep it short, 8-12 words</li>
127
+ <li>Bullet point two</li>
128
+ <li>Bullet point three</li>
129
+ </ul>
130
+ </div>
131
+ </div>
132
+ \`\`\`
133
+
134
+ ### Two-Column Slide
135
+ \`\`\`html
136
+ <div class="slide" data-slide="3">
137
+ <div class="slide-content two-col">
138
+ <div class="col">
139
+ <h2>Left Heading</h2>
140
+ <p>Descriptive text. 20-40 words.</p>
141
+ </div>
142
+ <div class="col">
143
+ <div class="chart-placeholder">[chart, image, or code block]</div>
144
+ </div>
145
+ </div>
146
+ </div>
147
+ \`\`\`
148
+
149
+ ### Metrics Slide
150
+ \`\`\`html
151
+ <div class="slide" data-slide="4">
152
+ <div class="slide-content metrics-slide">
153
+ <h2>Key Results</h2>
154
+ <div class="metrics-grid">
155
+ <div class="metric">
156
+ <span class="metric-value">85%</span>
157
+ <span class="metric-label">Metric name</span>
158
+ </div>
159
+ <!-- 3-4 metrics -->
160
+ </div>
161
+ </div>
162
+ </div>
163
+ \`\`\`
164
+
165
+ ### Closing Slide
166
+ \`\`\`html
167
+ <div class="slide" data-slide="N">
168
+ <div class="slide-content title-slide closing">
169
+ <h1>Thank You</h1>
170
+ <p class="slide-subtitle">contact@company.com</p>
171
+ </div>
172
+ </div>
173
+ \`\`\`
174
+
175
+ ## Phase 3 — Slide Styles
176
+
177
+ \`\`\`css
178
+ .slide-content { width: 100%; height: 100%; padding: 80px 120px; display: flex; flex-direction: column; justify-content: center; }
179
+
180
+ .title-slide { align-items: center; text-align: center; background: var(--color-bg-primary); }
181
+ .title-slide h1 { font-size: 80px; font-weight: 800; line-height: 1.1; letter-spacing: -0.03em; }
182
+ .slide-label { font-size: 20px; color: var(--color-text-secondary); margin-bottom: 24px; }
183
+ .slide-subtitle { font-size: 28px; color: var(--color-text-secondary); margin-top: 16px; }
184
+
185
+ .text-slide h2 { font-size: 48px; font-weight: 700; margin-bottom: 40px; }
186
+ .text-slide ul { font-size: 28px; line-height: 1.8; }
187
+ .text-slide li { margin-bottom: 12px; color: var(--color-text-secondary); }
188
+ .text-slide li::marker { color: var(--color-accent); }
189
+
190
+ .two-col { flex-direction: row; gap: 80px; }
191
+ .two-col .col { flex: 1; display: flex; flex-direction: column; justify-content: center; }
192
+ .two-col h2 { font-size: 48px; margin-bottom: 24px; }
193
+ .two-col p { font-size: 24px; line-height: 1.6; color: var(--color-text-secondary); }
194
+
195
+ .metrics-slide { align-items: center; justify-content: center; text-align: center; }
196
+ .metrics-grid { display: flex; gap: 80px; margin-top: 48px; }
197
+ .metric-value { font-size: 72px; font-weight: 800; color: var(--color-accent); display: block; }
198
+ .metric-label { font-size: 20px; color: var(--color-text-secondary); margin-top: 8px; display: block; }
199
+
200
+ .closing { background: var(--color-bg-primary); }
201
+ \`\`\`
202
+
203
+ ## Phase 4 — Content Rules for Slides
204
+
205
+ - Slide text is never smaller than 24px — this is a 16:9 canvas, not a web page
206
+ - Headlines: 48-80px, one line preferred
207
+ - Body text: 24-28px
208
+ - Bullet points: 28px, max 5 per slide, each 6-12 words
209
+ - Every slide gets a \`data-slide="N"\` attribute
210
+ - Slides are 1-indexed
211
+ - Max 12 slides unless the user asks for more
212
+ - The closing slide always says "Thank You" with contact info`,
213
+ };