@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.
- package/CHANGELOG.md +2 -0
- package/dist/designer/data/skills/blog-post.d.ts +3 -0
- package/dist/designer/data/skills/blog-post.d.ts.map +1 -0
- package/dist/designer/data/skills/blog-post.js +84 -0
- package/dist/designer/data/skills/blog-post.ts +87 -0
- package/dist/designer/data/skills/critique.d.ts +3 -0
- package/dist/designer/data/skills/critique.d.ts.map +1 -0
- package/dist/designer/data/skills/critique.js +109 -0
- package/dist/designer/data/skills/critique.ts +112 -0
- package/dist/designer/data/skills/dashboard.d.ts +3 -0
- package/dist/designer/data/skills/dashboard.d.ts.map +1 -0
- package/dist/designer/data/skills/dashboard.js +165 -0
- package/dist/designer/data/skills/dashboard.ts +168 -0
- package/dist/designer/data/skills/design-brief.d.ts +3 -0
- package/dist/designer/data/skills/design-brief.d.ts.map +1 -0
- package/dist/designer/data/skills/design-brief.js +141 -0
- package/dist/designer/data/skills/design-brief.ts +144 -0
- package/dist/designer/data/skills/design-skill.d.ts +10 -0
- package/dist/designer/data/skills/design-skill.d.ts.map +1 -0
- package/dist/designer/data/skills/design-skill.js +1 -0
- package/dist/designer/data/skills/design-skill.ts +9 -0
- package/dist/designer/data/skills/docs-page.d.ts +3 -0
- package/dist/designer/data/skills/docs-page.d.ts.map +1 -0
- package/dist/designer/data/skills/docs-page.js +68 -0
- package/dist/designer/data/skills/docs-page.ts +71 -0
- package/dist/designer/data/skills/index.d.ts +3 -0
- package/dist/designer/data/skills/index.d.ts.map +1 -0
- package/dist/designer/data/skills/index.js +28 -0
- package/dist/designer/data/skills/index.ts +30 -0
- package/dist/designer/data/skills/magazine-poster.d.ts +3 -0
- package/dist/designer/data/skills/magazine-poster.d.ts.map +1 -0
- package/dist/designer/data/skills/magazine-poster.js +70 -0
- package/dist/designer/data/skills/magazine-poster.ts +73 -0
- package/dist/designer/data/skills/mobile-app.d.ts +3 -0
- package/dist/designer/data/skills/mobile-app.d.ts.map +1 -0
- package/dist/designer/data/skills/mobile-app.js +229 -0
- package/dist/designer/data/skills/mobile-app.ts +232 -0
- package/dist/designer/data/skills/motion-frames.d.ts +3 -0
- package/dist/designer/data/skills/motion-frames.d.ts.map +1 -0
- package/dist/designer/data/skills/motion-frames.js +121 -0
- package/dist/designer/data/skills/motion-frames.ts +124 -0
- package/dist/designer/data/skills/pricing-page.d.ts +3 -0
- package/dist/designer/data/skills/pricing-page.d.ts.map +1 -0
- package/dist/designer/data/skills/pricing-page.js +76 -0
- package/dist/designer/data/skills/pricing-page.ts +79 -0
- package/dist/designer/data/skills/saas-landing.d.ts +3 -0
- package/dist/designer/data/skills/saas-landing.d.ts.map +1 -0
- package/dist/designer/data/skills/saas-landing.js +71 -0
- package/dist/designer/data/skills/saas-landing.ts +74 -0
- package/dist/designer/data/skills/slide-deck.d.ts +3 -0
- package/dist/designer/data/skills/slide-deck.d.ts.map +1 -0
- package/dist/designer/data/skills/slide-deck.js +213 -0
- package/dist/designer/data/skills/slide-deck.ts +216 -0
- package/dist/designer/data/skills/social-carousel.d.ts +3 -0
- package/dist/designer/data/skills/social-carousel.d.ts.map +1 -0
- package/dist/designer/data/skills/social-carousel.js +135 -0
- package/dist/designer/data/skills/social-carousel.ts +138 -0
- package/dist/designer/data/skills/web-prototype.d.ts +3 -0
- package/dist/designer/data/skills/web-prototype.d.ts.map +1 -0
- package/dist/designer/data/skills/web-prototype.js +159 -0
- package/dist/designer/data/skills/web-prototype.ts +162 -0
- package/dist/designer/skills.d.ts +4 -10
- package/dist/designer/skills.d.ts.map +1 -1
- package/dist/designer/skills.js +2 -1643
- package/dist/extensions/wizard/index.js +9 -1
- package/dist/generated/parser/ast/nodes.d.ts +115 -0
- package/dist/generated/parser/ast/nodes.d.ts.map +1 -0
- package/dist/generated/parser/ast/nodes.js +8 -0
- package/dist/generated/parser/lexer/lexer.d.ts +28 -0
- package/dist/generated/parser/lexer/lexer.d.ts.map +1 -0
- package/dist/generated/parser/{lexer.js → lexer/lexer.js} +1 -180
- package/dist/generated/parser/{lexer.d.ts → lexer/tokens.d.ts} +5 -24
- package/dist/generated/parser/lexer/tokens.d.ts.map +1 -0
- package/dist/generated/parser/lexer/tokens.js +187 -0
- package/dist/generated/parser/mod.d.ts +5 -7
- package/dist/generated/parser/mod.d.ts.map +1 -1
- package/dist/generated/parser/mod.js +2 -1
- package/dist/generated/parser/parser/cursor.d.ts +47 -0
- package/dist/generated/parser/parser/cursor.d.ts.map +1 -0
- package/dist/generated/parser/parser/cursor.js +12 -0
- package/dist/generated/parser/parser/definitions.d.ts +16 -0
- package/dist/generated/parser/parser/definitions.d.ts.map +1 -0
- package/dist/generated/parser/parser/definitions.js +353 -0
- package/dist/generated/parser/parser/expressions.d.ts +17 -0
- package/dist/generated/parser/parser/expressions.d.ts.map +1 -0
- package/dist/generated/parser/parser/expressions.js +165 -0
- package/dist/generated/parser/parser.d.ts +18 -133
- package/dist/generated/parser/parser.d.ts.map +1 -1
- package/dist/generated/parser/parser.js +9 -505
- package/dist/generated/parser/tokenizer.d.ts +1 -2
- package/dist/generated/parser/tokenizer.d.ts.map +1 -1
- package/dist/generated/parser/tokenizer.js +2 -1
- package/dist/generated/parser/validator.d.ts +1 -1
- package/dist/generated/parser/validator.d.ts.map +1 -1
- package/dist/mcp/glimpse-ui.js +9 -1
- package/dist/relay/dispatcher.d.ts +11 -104
- package/dist/relay/dispatcher.d.ts.map +1 -1
- package/dist/relay/dispatcher.js +10 -1130
- package/dist/relay/rest.d.ts +31 -0
- package/dist/relay/rest.d.ts.map +1 -0
- package/dist/relay/rest.js +85 -0
- package/dist/relay/routing.d.ts +109 -0
- package/dist/relay/routing.d.ts.map +1 -0
- package/dist/relay/routing.js +669 -0
- package/dist/relay/wizard-login.d.ts +17 -0
- package/dist/relay/wizard-login.d.ts.map +1 -0
- package/dist/relay/wizard-login.js +419 -0
- package/dist/sdk/agent-core/agent-loop.d.ts +2 -9
- package/dist/sdk/agent-core/agent-loop.d.ts.map +1 -1
- package/dist/sdk/agent-core/agent-loop.js +4 -288
- package/dist/sdk/agent-core/tool-execution.d.ts +33 -0
- package/dist/sdk/agent-core/tool-execution.d.ts.map +1 -0
- package/dist/sdk/agent-core/tool-execution.js +300 -0
- package/dist/sdk/ai/env-api-keys.js +9 -1
- package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts +48 -0
- package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts.map +1 -0
- package/dist/sdk/ai/providers/openai/reasoning-replay.js +209 -0
- package/dist/sdk/ai/providers/openai-completions.d.ts.map +1 -1
- package/dist/sdk/ai/providers/openai-completions.js +1 -203
- package/dist/sdk/coding-agent/core/compaction/compaction.d.ts +6 -118
- package/dist/sdk/coding-agent/core/compaction/compaction.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/compaction/compaction.js +11 -733
- package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts +58 -0
- package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/compaction/cut-points.js +191 -0
- package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts +28 -0
- package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/compaction/dedupe.js +156 -0
- package/dist/sdk/coding-agent/core/compaction/summarize.d.ts +21 -0
- package/dist/sdk/coding-agent/core/compaction/summarize.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/compaction/summarize.js +181 -0
- package/dist/sdk/coding-agent/core/compaction/tokens.d.ts +47 -0
- package/dist/sdk/coding-agent/core/compaction/tokens.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/compaction/tokens.js +224 -0
- package/dist/sdk/coding-agent/core/extensions/session-events.d.ts +157 -0
- package/dist/sdk/coding-agent/core/extensions/session-events.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/extensions/session-events.js +13 -0
- package/dist/sdk/coding-agent/core/extensions/types.d.ts +6 -365
- package/dist/sdk/coding-agent/core/extensions/types.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/extensions/types.js +2 -10
- package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts +219 -0
- package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/extensions/ui-types.js +4 -0
- package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts +115 -0
- package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/package/default-package-manager.js +1184 -0
- package/dist/sdk/coding-agent/core/package/discovery.d.ts +20 -0
- package/dist/sdk/coding-agent/core/package/discovery.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/package/discovery.js +283 -0
- package/dist/sdk/coding-agent/core/package/ignore.d.ts +29 -0
- package/dist/sdk/coding-agent/core/package/ignore.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/package/ignore.js +235 -0
- package/dist/sdk/coding-agent/core/package/types.d.ts +128 -0
- package/dist/sdk/coding-agent/core/package/types.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/package/types.js +18 -0
- package/dist/sdk/coding-agent/core/package/update-check.d.ts +43 -0
- package/dist/sdk/coding-agent/core/package/update-check.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/package/update-check.js +253 -0
- package/dist/sdk/coding-agent/core/package-manager.d.ts +2 -188
- package/dist/sdk/coding-agent/core/package-manager.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/package-manager.js +1 -1940
- package/dist/sdk/coding-agent/core/session/migrate.d.ts +18 -0
- package/dist/sdk/coding-agent/core/session/migrate.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/session/migrate.js +78 -0
- package/dist/sdk/coding-agent/core/session/types.d.ts +165 -0
- package/dist/sdk/coding-agent/core/session/types.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/session/types.js +4 -0
- package/dist/sdk/coding-agent/core/session-manager.d.ts +3 -161
- package/dist/sdk/coding-agent/core/session-manager.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/session-manager.js +4 -72
- package/package.json +2 -2
- 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 @@
|
|
|
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
|
+
};
|