@aexol/spectral 0.9.230 → 0.9.231

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 (172) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/designer/data/skills/blog-post.d.ts +3 -0
  3. package/dist/designer/data/skills/blog-post.d.ts.map +1 -0
  4. package/dist/designer/data/skills/blog-post.js +84 -0
  5. package/dist/designer/data/skills/blog-post.ts +87 -0
  6. package/dist/designer/data/skills/critique.d.ts +3 -0
  7. package/dist/designer/data/skills/critique.d.ts.map +1 -0
  8. package/dist/designer/data/skills/critique.js +109 -0
  9. package/dist/designer/data/skills/critique.ts +112 -0
  10. package/dist/designer/data/skills/dashboard.d.ts +3 -0
  11. package/dist/designer/data/skills/dashboard.d.ts.map +1 -0
  12. package/dist/designer/data/skills/dashboard.js +165 -0
  13. package/dist/designer/data/skills/dashboard.ts +168 -0
  14. package/dist/designer/data/skills/design-brief.d.ts +3 -0
  15. package/dist/designer/data/skills/design-brief.d.ts.map +1 -0
  16. package/dist/designer/data/skills/design-brief.js +141 -0
  17. package/dist/designer/data/skills/design-brief.ts +144 -0
  18. package/dist/designer/data/skills/design-skill.d.ts +10 -0
  19. package/dist/designer/data/skills/design-skill.d.ts.map +1 -0
  20. package/dist/designer/data/skills/design-skill.js +1 -0
  21. package/dist/designer/data/skills/design-skill.ts +9 -0
  22. package/dist/designer/data/skills/docs-page.d.ts +3 -0
  23. package/dist/designer/data/skills/docs-page.d.ts.map +1 -0
  24. package/dist/designer/data/skills/docs-page.js +68 -0
  25. package/dist/designer/data/skills/docs-page.ts +71 -0
  26. package/dist/designer/data/skills/index.d.ts +3 -0
  27. package/dist/designer/data/skills/index.d.ts.map +1 -0
  28. package/dist/designer/data/skills/index.js +28 -0
  29. package/dist/designer/data/skills/index.ts +30 -0
  30. package/dist/designer/data/skills/magazine-poster.d.ts +3 -0
  31. package/dist/designer/data/skills/magazine-poster.d.ts.map +1 -0
  32. package/dist/designer/data/skills/magazine-poster.js +70 -0
  33. package/dist/designer/data/skills/magazine-poster.ts +73 -0
  34. package/dist/designer/data/skills/mobile-app.d.ts +3 -0
  35. package/dist/designer/data/skills/mobile-app.d.ts.map +1 -0
  36. package/dist/designer/data/skills/mobile-app.js +229 -0
  37. package/dist/designer/data/skills/mobile-app.ts +232 -0
  38. package/dist/designer/data/skills/motion-frames.d.ts +3 -0
  39. package/dist/designer/data/skills/motion-frames.d.ts.map +1 -0
  40. package/dist/designer/data/skills/motion-frames.js +121 -0
  41. package/dist/designer/data/skills/motion-frames.ts +124 -0
  42. package/dist/designer/data/skills/pricing-page.d.ts +3 -0
  43. package/dist/designer/data/skills/pricing-page.d.ts.map +1 -0
  44. package/dist/designer/data/skills/pricing-page.js +76 -0
  45. package/dist/designer/data/skills/pricing-page.ts +79 -0
  46. package/dist/designer/data/skills/saas-landing.d.ts +3 -0
  47. package/dist/designer/data/skills/saas-landing.d.ts.map +1 -0
  48. package/dist/designer/data/skills/saas-landing.js +71 -0
  49. package/dist/designer/data/skills/saas-landing.ts +74 -0
  50. package/dist/designer/data/skills/slide-deck.d.ts +3 -0
  51. package/dist/designer/data/skills/slide-deck.d.ts.map +1 -0
  52. package/dist/designer/data/skills/slide-deck.js +213 -0
  53. package/dist/designer/data/skills/slide-deck.ts +216 -0
  54. package/dist/designer/data/skills/social-carousel.d.ts +3 -0
  55. package/dist/designer/data/skills/social-carousel.d.ts.map +1 -0
  56. package/dist/designer/data/skills/social-carousel.js +135 -0
  57. package/dist/designer/data/skills/social-carousel.ts +138 -0
  58. package/dist/designer/data/skills/web-prototype.d.ts +3 -0
  59. package/dist/designer/data/skills/web-prototype.d.ts.map +1 -0
  60. package/dist/designer/data/skills/web-prototype.js +159 -0
  61. package/dist/designer/data/skills/web-prototype.ts +162 -0
  62. package/dist/designer/skills.d.ts +4 -10
  63. package/dist/designer/skills.d.ts.map +1 -1
  64. package/dist/designer/skills.js +2 -1643
  65. package/dist/extensions/wizard/index.js +9 -1
  66. package/dist/generated/parser/ast/nodes.d.ts +115 -0
  67. package/dist/generated/parser/ast/nodes.d.ts.map +1 -0
  68. package/dist/generated/parser/ast/nodes.js +8 -0
  69. package/dist/generated/parser/lexer/lexer.d.ts +28 -0
  70. package/dist/generated/parser/lexer/lexer.d.ts.map +1 -0
  71. package/dist/generated/parser/{lexer.js → lexer/lexer.js} +1 -180
  72. package/dist/generated/parser/{lexer.d.ts → lexer/tokens.d.ts} +5 -24
  73. package/dist/generated/parser/lexer/tokens.d.ts.map +1 -0
  74. package/dist/generated/parser/lexer/tokens.js +187 -0
  75. package/dist/generated/parser/mod.d.ts +5 -7
  76. package/dist/generated/parser/mod.d.ts.map +1 -1
  77. package/dist/generated/parser/mod.js +2 -1
  78. package/dist/generated/parser/parser/cursor.d.ts +47 -0
  79. package/dist/generated/parser/parser/cursor.d.ts.map +1 -0
  80. package/dist/generated/parser/parser/cursor.js +12 -0
  81. package/dist/generated/parser/parser/definitions.d.ts +16 -0
  82. package/dist/generated/parser/parser/definitions.d.ts.map +1 -0
  83. package/dist/generated/parser/parser/definitions.js +353 -0
  84. package/dist/generated/parser/parser/expressions.d.ts +17 -0
  85. package/dist/generated/parser/parser/expressions.d.ts.map +1 -0
  86. package/dist/generated/parser/parser/expressions.js +165 -0
  87. package/dist/generated/parser/parser.d.ts +18 -133
  88. package/dist/generated/parser/parser.d.ts.map +1 -1
  89. package/dist/generated/parser/parser.js +9 -505
  90. package/dist/generated/parser/tokenizer.d.ts +1 -2
  91. package/dist/generated/parser/tokenizer.d.ts.map +1 -1
  92. package/dist/generated/parser/tokenizer.js +2 -1
  93. package/dist/generated/parser/validator.d.ts +1 -1
  94. package/dist/generated/parser/validator.d.ts.map +1 -1
  95. package/dist/mcp/glimpse-ui.js +9 -1
  96. package/dist/relay/dispatcher.d.ts +11 -104
  97. package/dist/relay/dispatcher.d.ts.map +1 -1
  98. package/dist/relay/dispatcher.js +10 -1130
  99. package/dist/relay/rest.d.ts +31 -0
  100. package/dist/relay/rest.d.ts.map +1 -0
  101. package/dist/relay/rest.js +85 -0
  102. package/dist/relay/routing.d.ts +109 -0
  103. package/dist/relay/routing.d.ts.map +1 -0
  104. package/dist/relay/routing.js +669 -0
  105. package/dist/relay/wizard-login.d.ts +17 -0
  106. package/dist/relay/wizard-login.d.ts.map +1 -0
  107. package/dist/relay/wizard-login.js +419 -0
  108. package/dist/sdk/agent-core/agent-loop.d.ts +2 -9
  109. package/dist/sdk/agent-core/agent-loop.d.ts.map +1 -1
  110. package/dist/sdk/agent-core/agent-loop.js +4 -288
  111. package/dist/sdk/agent-core/tool-execution.d.ts +33 -0
  112. package/dist/sdk/agent-core/tool-execution.d.ts.map +1 -0
  113. package/dist/sdk/agent-core/tool-execution.js +300 -0
  114. package/dist/sdk/ai/env-api-keys.js +9 -1
  115. package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts +48 -0
  116. package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts.map +1 -0
  117. package/dist/sdk/ai/providers/openai/reasoning-replay.js +209 -0
  118. package/dist/sdk/ai/providers/openai-completions.d.ts.map +1 -1
  119. package/dist/sdk/ai/providers/openai-completions.js +1 -203
  120. package/dist/sdk/coding-agent/core/compaction/compaction.d.ts +6 -118
  121. package/dist/sdk/coding-agent/core/compaction/compaction.d.ts.map +1 -1
  122. package/dist/sdk/coding-agent/core/compaction/compaction.js +11 -733
  123. package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts +58 -0
  124. package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts.map +1 -0
  125. package/dist/sdk/coding-agent/core/compaction/cut-points.js +191 -0
  126. package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts +28 -0
  127. package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts.map +1 -0
  128. package/dist/sdk/coding-agent/core/compaction/dedupe.js +156 -0
  129. package/dist/sdk/coding-agent/core/compaction/summarize.d.ts +21 -0
  130. package/dist/sdk/coding-agent/core/compaction/summarize.d.ts.map +1 -0
  131. package/dist/sdk/coding-agent/core/compaction/summarize.js +181 -0
  132. package/dist/sdk/coding-agent/core/compaction/tokens.d.ts +47 -0
  133. package/dist/sdk/coding-agent/core/compaction/tokens.d.ts.map +1 -0
  134. package/dist/sdk/coding-agent/core/compaction/tokens.js +224 -0
  135. package/dist/sdk/coding-agent/core/extensions/session-events.d.ts +157 -0
  136. package/dist/sdk/coding-agent/core/extensions/session-events.d.ts.map +1 -0
  137. package/dist/sdk/coding-agent/core/extensions/session-events.js +13 -0
  138. package/dist/sdk/coding-agent/core/extensions/types.d.ts +6 -365
  139. package/dist/sdk/coding-agent/core/extensions/types.d.ts.map +1 -1
  140. package/dist/sdk/coding-agent/core/extensions/types.js +2 -10
  141. package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts +219 -0
  142. package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts.map +1 -0
  143. package/dist/sdk/coding-agent/core/extensions/ui-types.js +4 -0
  144. package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts +115 -0
  145. package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts.map +1 -0
  146. package/dist/sdk/coding-agent/core/package/default-package-manager.js +1184 -0
  147. package/dist/sdk/coding-agent/core/package/discovery.d.ts +20 -0
  148. package/dist/sdk/coding-agent/core/package/discovery.d.ts.map +1 -0
  149. package/dist/sdk/coding-agent/core/package/discovery.js +283 -0
  150. package/dist/sdk/coding-agent/core/package/ignore.d.ts +29 -0
  151. package/dist/sdk/coding-agent/core/package/ignore.d.ts.map +1 -0
  152. package/dist/sdk/coding-agent/core/package/ignore.js +235 -0
  153. package/dist/sdk/coding-agent/core/package/types.d.ts +128 -0
  154. package/dist/sdk/coding-agent/core/package/types.d.ts.map +1 -0
  155. package/dist/sdk/coding-agent/core/package/types.js +18 -0
  156. package/dist/sdk/coding-agent/core/package/update-check.d.ts +43 -0
  157. package/dist/sdk/coding-agent/core/package/update-check.d.ts.map +1 -0
  158. package/dist/sdk/coding-agent/core/package/update-check.js +253 -0
  159. package/dist/sdk/coding-agent/core/package-manager.d.ts +2 -188
  160. package/dist/sdk/coding-agent/core/package-manager.d.ts.map +1 -1
  161. package/dist/sdk/coding-agent/core/package-manager.js +1 -1940
  162. package/dist/sdk/coding-agent/core/session/migrate.d.ts +18 -0
  163. package/dist/sdk/coding-agent/core/session/migrate.d.ts.map +1 -0
  164. package/dist/sdk/coding-agent/core/session/migrate.js +78 -0
  165. package/dist/sdk/coding-agent/core/session/types.d.ts +165 -0
  166. package/dist/sdk/coding-agent/core/session/types.d.ts.map +1 -0
  167. package/dist/sdk/coding-agent/core/session/types.js +4 -0
  168. package/dist/sdk/coding-agent/core/session-manager.d.ts +3 -161
  169. package/dist/sdk/coding-agent/core/session-manager.d.ts.map +1 -1
  170. package/dist/sdk/coding-agent/core/session-manager.js +4 -72
  171. package/package.json +2 -2
  172. package/dist/generated/parser/lexer.d.ts.map +0 -1
@@ -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
+ };
@@ -0,0 +1,216 @@
1
+ import type { DesignSkill } from "./design-skill.js";
2
+
3
+ export const slideDeck: DesignSkill = {
4
+ name: "slide-deck",
5
+ scenario: "marketing",
6
+ description:
7
+ "Presentation slide deck as a single HTML file. Fixed 16:9 canvas with keyboard navigation, slide counter, and print-to-PDF support.",
8
+ outputKind: "slides",
9
+ workflow: `# Slide Deck Skill
10
+
11
+ Produce a presentation deck as a single HTML file. 16:9 ratio (1920×1080), keyboard navigation, slide counter.
12
+
13
+ ## Phase 0 — Pre-flight
14
+
15
+ 1. Read the design system for color tokens.
16
+ 2. Determine: deck title, audience, number of slides, tone (pitch, educational, report).
17
+ 3. Vocalize the plan: "I'll create a [N]-slide deck: [slide titles in order]."
18
+
19
+ ## Phase 1 — Framework Skeleton
20
+
21
+ Create \`deck.html\` with this exact framework. The scaling/navigation JS is load-bearing — copy it verbatim.
22
+
23
+ \`\`\`html
24
+ <!doctype html>
25
+ <html lang="en">
26
+ <head>
27
+ <meta charset="utf-8">
28
+ <meta name="viewport" content="width=device-width, initial-scale=1">
29
+ <title>Deck Title</title>
30
+ <style>
31
+ *, *::before, *::after { box-sizing: border-box; margin: 0; }
32
+
33
+ :root {
34
+ --slide-w: 1920px;
35
+ --slide-h: 1080px;
36
+ /* Design system tokens here */
37
+ }
38
+
39
+ html, body { width: 100%; height: 100%; overflow: hidden; background: #000; font-family: var(--font-sans); }
40
+
41
+ #scaler {
42
+ position: absolute;
43
+ top: 50%; left: 50%;
44
+ transform-origin: 0 0;
45
+ }
46
+
47
+ .slide {
48
+ position: absolute;
49
+ top: 0; left: 0;
50
+ width: var(--slide-w);
51
+ height: var(--slide-h);
52
+ display: none;
53
+ overflow: hidden;
54
+ }
55
+ .slide.active { display: flex; }
56
+
57
+ #counter {
58
+ position: fixed; bottom: 16px; right: 16px; z-index: 100;
59
+ background: rgba(0,0,0,0.6); color: #fff; padding: 4px 12px;
60
+ border-radius: 4px; font-size: 14px; font-family: monospace;
61
+ }
62
+
63
+ @media print {
64
+ html, body { width: auto; height: auto; overflow: visible; background: #fff; }
65
+ #scaler { position: static; transform: none; }
66
+ .slide { position: relative; display: block !important; break-after: page; }
67
+ #counter { display: none; }
68
+ }
69
+ </style>
70
+ </head>
71
+ <body>
72
+ <div id="scaler">
73
+ <div class="slide active" data-slide="1"><!-- content --></div>
74
+ <div class="slide" data-slide="2"><!-- content --></div>
75
+ <!-- ... -->
76
+ </div>
77
+ <div id="counter">1 / N</div>
78
+ <script>
79
+ const slides = document.querySelectorAll('.slide');
80
+ let current = 0;
81
+ function show(i) {
82
+ slides[current].classList.remove('active');
83
+ current = (i + slides.length) % slides.length;
84
+ slides[current].classList.add('active');
85
+ document.getElementById('counter').textContent = (current + 1) + ' / ' + slides.length;
86
+ }
87
+ function scale() {
88
+ const scaler = document.getElementById('scaler');
89
+ const sw = window.innerWidth, sh = window.innerHeight;
90
+ const ratio = Math.min(sw / 1920, sh / 1080);
91
+ scaler.style.transform = 'translate(' + (sw/2) + 'px,' + (sh/2) + 'px) scale(' + ratio + ')';
92
+ }
93
+ document.addEventListener('keydown', e => {
94
+ if (e.key === 'ArrowRight' || e.key === 'ArrowDown' || e.key === ' ') { e.preventDefault(); show(current + 1); }
95
+ if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') { e.preventDefault(); show(current - 1); }
96
+ if (e.key === 'Home') { e.preventDefault(); show(0); }
97
+ if (e.key === 'End') { e.preventDefault(); show(slides.length - 1); }
98
+ });
99
+ window.addEventListener('resize', scale);
100
+ scale();
101
+ localStorage.setItem('deck-slide', current);
102
+ </script>
103
+ </body>
104
+ </html>
105
+ \`\`\`
106
+
107
+ ## Phase 2 — Slide Layouts
108
+
109
+ Each slide is a \`.slide\` div with \`.active\` on the first. Tag slides with \`data-slide="N"\`.
110
+
111
+ ### Title Slide
112
+ \`\`\`html
113
+ <div class="slide active" data-slide="1">
114
+ <div class="slide-content title-slide">
115
+ <p class="slide-label">Company · Date</p>
116
+ <h1>Deck Title</h1>
117
+ <p class="slide-subtitle">One-line subtitle</p>
118
+ </div>
119
+ </div>
120
+ \`\`\`
121
+ Style: centered content, 80px headline, dark background with design-system colors.
122
+
123
+ ### Text-Only Slide
124
+ \`\`\`html
125
+ <div class="slide" data-slide="2">
126
+ <div class="slide-content text-slide">
127
+ <h2>Section Title</h2>
128
+ <ul>
129
+ <li>Bullet point one — keep it short, 8-12 words</li>
130
+ <li>Bullet point two</li>
131
+ <li>Bullet point three</li>
132
+ </ul>
133
+ </div>
134
+ </div>
135
+ \`\`\`
136
+
137
+ ### Two-Column Slide
138
+ \`\`\`html
139
+ <div class="slide" data-slide="3">
140
+ <div class="slide-content two-col">
141
+ <div class="col">
142
+ <h2>Left Heading</h2>
143
+ <p>Descriptive text. 20-40 words.</p>
144
+ </div>
145
+ <div class="col">
146
+ <div class="chart-placeholder">[chart, image, or code block]</div>
147
+ </div>
148
+ </div>
149
+ </div>
150
+ \`\`\`
151
+
152
+ ### Metrics Slide
153
+ \`\`\`html
154
+ <div class="slide" data-slide="4">
155
+ <div class="slide-content metrics-slide">
156
+ <h2>Key Results</h2>
157
+ <div class="metrics-grid">
158
+ <div class="metric">
159
+ <span class="metric-value">85%</span>
160
+ <span class="metric-label">Metric name</span>
161
+ </div>
162
+ <!-- 3-4 metrics -->
163
+ </div>
164
+ </div>
165
+ </div>
166
+ \`\`\`
167
+
168
+ ### Closing Slide
169
+ \`\`\`html
170
+ <div class="slide" data-slide="N">
171
+ <div class="slide-content title-slide closing">
172
+ <h1>Thank You</h1>
173
+ <p class="slide-subtitle">contact@company.com</p>
174
+ </div>
175
+ </div>
176
+ \`\`\`
177
+
178
+ ## Phase 3 — Slide Styles
179
+
180
+ \`\`\`css
181
+ .slide-content { width: 100%; height: 100%; padding: 80px 120px; display: flex; flex-direction: column; justify-content: center; }
182
+
183
+ .title-slide { align-items: center; text-align: center; background: var(--color-bg-primary); }
184
+ .title-slide h1 { font-size: 80px; font-weight: 800; line-height: 1.1; letter-spacing: -0.03em; }
185
+ .slide-label { font-size: 20px; color: var(--color-text-secondary); margin-bottom: 24px; }
186
+ .slide-subtitle { font-size: 28px; color: var(--color-text-secondary); margin-top: 16px; }
187
+
188
+ .text-slide h2 { font-size: 48px; font-weight: 700; margin-bottom: 40px; }
189
+ .text-slide ul { font-size: 28px; line-height: 1.8; }
190
+ .text-slide li { margin-bottom: 12px; color: var(--color-text-secondary); }
191
+ .text-slide li::marker { color: var(--color-accent); }
192
+
193
+ .two-col { flex-direction: row; gap: 80px; }
194
+ .two-col .col { flex: 1; display: flex; flex-direction: column; justify-content: center; }
195
+ .two-col h2 { font-size: 48px; margin-bottom: 24px; }
196
+ .two-col p { font-size: 24px; line-height: 1.6; color: var(--color-text-secondary); }
197
+
198
+ .metrics-slide { align-items: center; justify-content: center; text-align: center; }
199
+ .metrics-grid { display: flex; gap: 80px; margin-top: 48px; }
200
+ .metric-value { font-size: 72px; font-weight: 800; color: var(--color-accent); display: block; }
201
+ .metric-label { font-size: 20px; color: var(--color-text-secondary); margin-top: 8px; display: block; }
202
+
203
+ .closing { background: var(--color-bg-primary); }
204
+ \`\`\`
205
+
206
+ ## Phase 4 — Content Rules for Slides
207
+
208
+ - Slide text is never smaller than 24px — this is a 16:9 canvas, not a web page
209
+ - Headlines: 48-80px, one line preferred
210
+ - Body text: 24-28px
211
+ - Bullet points: 28px, max 5 per slide, each 6-12 words
212
+ - Every slide gets a \`data-slide="N"\` attribute
213
+ - Slides are 1-indexed
214
+ - Max 12 slides unless the user asks for more
215
+ - The closing slide always says "Thank You" with contact info`,
216
+ };
@@ -0,0 +1,3 @@
1
+ import type { DesignSkill } from "./design-skill.js";
2
+ export declare const socialCarousel: DesignSkill;
3
+ //# sourceMappingURL=social-carousel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"social-carousel.d.ts","sourceRoot":"","sources":["../../../../src/designer/data/skills/social-carousel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,eAAO,MAAM,cAAc,EAAE,WAuI1B,CAAC"}
@@ -0,0 +1,135 @@
1
+ export const socialCarousel = {
2
+ name: "social-carousel",
3
+ scenario: "marketing",
4
+ description: "Social media carousel. Multiple slides in a single HTML file with horizontal scroll, designed for Instagram/LinkedIn/Twitter export.",
5
+ outputKind: "html",
6
+ workflow: `# Social Carousel Skill
7
+
8
+ Produce a social media carousel as a single HTML file. 1080×1080 (Instagram) or 1200×628 (LinkedIn/Twitter), horizontal scroll, export-friendly.
9
+
10
+ ## Phase 0 — Pre-flight
11
+
12
+ 1. Read the design system.
13
+ 2. Determine: platform (instagram=1080×1080, linkedin=1200×627), number of cards (3-10), topic.
14
+ 3. Vocalize: "I'll create a [N]-card carousel for [platform] about [topic]."
15
+
16
+ ## Phase 1 — Shell
17
+
18
+ Create \`carousel.html\`:
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>Carousel</title>
27
+ <style>
28
+ *, *::before, *::after { box-sizing: border-box; margin: 0; }
29
+
30
+ :root {
31
+ --card-w: 1080px;
32
+ --card-h: 1080px;
33
+ /* Design system tokens */
34
+ }
35
+
36
+ body {
37
+ background: #f0f0f0;
38
+ display: flex;
39
+ justify-content: center;
40
+ align-items: center;
41
+ min-height: 100vh;
42
+ font-family: var(--font-sans);
43
+ }
44
+
45
+ .carousel-container {
46
+ width: min(var(--card-w), 95vw);
47
+ overflow-x: auto;
48
+ scroll-snap-type: x mandatory;
49
+ display: flex;
50
+ gap: 16px;
51
+ padding: 40px 0;
52
+ -webkit-overflow-scrolling: touch;
53
+ }
54
+
55
+ .card {
56
+ flex-shrink: 0;
57
+ width: min(var(--card-w), 90vw);
58
+ aspect-ratio: 1;
59
+ scroll-snap-align: center;
60
+ border-radius: 12px;
61
+ overflow: hidden;
62
+ background: var(--color-bg-primary);
63
+ display: flex;
64
+ flex-direction: column;
65
+ box-shadow: 0 4px 24px rgba(0,0,0,0.08);
66
+ }
67
+
68
+ @media (max-width: 1100px) {
69
+ .card { width: 85vw; }
70
+ }
71
+ </style>
72
+ </head>
73
+ <body>
74
+ <div class="carousel-container">
75
+ <div class="card">
76
+ <!-- Card 1 content -->
77
+ </div>
78
+ <!-- More cards -->
79
+ </div>
80
+ </body>
81
+ </html>
82
+ \`\`\`
83
+
84
+ ## Phase 2 — Card Layouts
85
+
86
+ ### Title Card (first)
87
+ A bold, eye-catching title. Centered, large typography, accent color background or dark solid.
88
+ \`\`\`css
89
+ .card-title { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 80px; text-align: center; background: var(--color-accent); color: #fff; }
90
+ .card-title .number { font-size: 14px; opacity: 0.7; letter-spacing: 0.1em; text-transform: uppercase; margin-top: auto; }
91
+ .card-title h1 { font-size: 64px; font-weight: 800; line-height: 1.1; }
92
+ .card-title p { font-size: 24px; opacity: 0.9; margin-top: 16px; max-width: 600px; }
93
+ \`\`\`
94
+
95
+ ### Content Card
96
+ \`\`\`css
97
+ .card-content { flex: 1; display: flex; flex-direction: column; padding: 64px; }
98
+ .card-content h2 { font-size: 42px; font-weight: 700; margin-bottom: 24px; }
99
+ .card-content p { font-size: 24px; line-height: 1.6; color: var(--color-text-secondary); }
100
+ .card-content .number { font-size: 14px; color: var(--color-text-secondary); margin-top: auto; }
101
+ \`\`\`
102
+
103
+ ### Stat Card
104
+ \`\`\`css
105
+ .card-stat { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 80px; text-align: center; }
106
+ .card-stat .stat-value { font-size: 120px; font-weight: 800; color: var(--color-accent); line-height: 1; }
107
+ .card-stat .stat-label { font-size: 24px; color: var(--color-text-secondary); margin-top: 16px; }
108
+ \`\`\`
109
+
110
+ ### Quote Card
111
+ \`\`\`css
112
+ .card-quote { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 80px; text-align: center; }
113
+ .card-quote blockquote { font-size: 36px; font-style: italic; line-height: 1.4; max-width: 700px; }
114
+ .card-quote cite { font-size: 20px; color: var(--color-text-secondary); margin-top: 24px; font-style: normal; }
115
+ \`\`\`
116
+
117
+ ### CTA Card (last)
118
+ \`\`\`css
119
+ .card-cta { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 80px; text-align: center; background: var(--color-bg-primary); }
120
+ .card-cta h2 { font-size: 48px; font-weight: 700; margin-bottom: 16px; }
121
+ .card-cta p { font-size: 24px; color: var(--color-text-secondary); margin-bottom: 32px; }
122
+ .card-cta .cta-text { font-size: 28px; font-weight: 600; color: var(--color-accent); }
123
+ \`\`\`
124
+
125
+ ## Phase 3 — Content Rules
126
+
127
+ - Each card has a clear visual hierarchy: big number/headline → supporting text → card number
128
+ - Card number shows position (e.g., "1/8") in bottom corner
129
+ - Title card grabs attention — use solid accent or dark bg
130
+ - Content cards: 30-60 words max
131
+ - Stat cards: one big number, one-line label
132
+ - Last card: always a CTA or summary with contact/handle
133
+ - Consistent padding within cards (64-80px)
134
+ - Each card works as a standalone image when screenshot`,
135
+ };