@strategicnerds/slide-nerds 0.1.0
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/dist/cli/commands/analytics.d.ts +6 -0
- package/dist/cli/commands/analytics.d.ts.map +1 -0
- package/dist/cli/commands/analytics.js +44 -0
- package/dist/cli/commands/analytics.js.map +1 -0
- package/dist/cli/commands/create.d.ts +4 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +87 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/export.d.ts +6 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +109 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +12 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/template-path.d.ts +4 -0
- package/dist/cli/template-path.d.ts.map +1 -0
- package/dist/cli/template-path.js +13 -0
- package/dist/cli/template-path.js.map +1 -0
- package/dist/runtime/export-api.d.ts +15 -0
- package/dist/runtime/export-api.d.ts.map +1 -0
- package/dist/runtime/export-api.js +21 -0
- package/dist/runtime/export-api.js.map +1 -0
- package/dist/runtime/index.d.ts +12 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +8 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/light-table.d.ts +8 -0
- package/dist/runtime/light-table.d.ts.map +1 -0
- package/dist/runtime/light-table.js +104 -0
- package/dist/runtime/light-table.js.map +1 -0
- package/dist/runtime/presenter-view.d.ts +7 -0
- package/dist/runtime/presenter-view.d.ts.map +1 -0
- package/dist/runtime/presenter-view.js +62 -0
- package/dist/runtime/presenter-view.js.map +1 -0
- package/dist/runtime/slide-context.d.ts +16 -0
- package/dist/runtime/slide-context.d.ts.map +1 -0
- package/dist/runtime/slide-context.js +18 -0
- package/dist/runtime/slide-context.js.map +1 -0
- package/dist/runtime/slide-controls.d.ts +3 -0
- package/dist/runtime/slide-controls.d.ts.map +1 -0
- package/dist/runtime/slide-controls.js +177 -0
- package/dist/runtime/slide-controls.js.map +1 -0
- package/dist/runtime/slide-dom.d.ts +17 -0
- package/dist/runtime/slide-dom.d.ts.map +1 -0
- package/dist/runtime/slide-dom.js +89 -0
- package/dist/runtime/slide-dom.js.map +1 -0
- package/dist/runtime/slide-runtime.d.ts +7 -0
- package/dist/runtime/slide-runtime.d.ts.map +1 -0
- package/dist/runtime/slide-runtime.js +125 -0
- package/dist/runtime/slide-runtime.js.map +1 -0
- package/dist/runtime/slide-shape.d.ts +21 -0
- package/dist/runtime/slide-shape.d.ts.map +1 -0
- package/dist/runtime/slide-shape.js +115 -0
- package/dist/runtime/slide-shape.js.map +1 -0
- package/dist/runtime/types.d.ts +150 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +38 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/runtime/use-presenter-mode.d.ts +14 -0
- package/dist/runtime/use-presenter-mode.d.ts.map +1 -0
- package/dist/runtime/use-presenter-mode.js +52 -0
- package/dist/runtime/use-presenter-mode.js.map +1 -0
- package/dist/runtime/use-slide-navigation.d.ts +13 -0
- package/dist/runtime/use-slide-navigation.d.ts.map +1 -0
- package/dist/runtime/use-slide-navigation.js +230 -0
- package/dist/runtime/use-slide-navigation.js.map +1 -0
- package/package.json +64 -0
- package/skills/accessibility/SKILL.md +236 -0
- package/skills/advanced-layouts/SKILL.md +429 -0
- package/skills/analytics/SKILL.md +97 -0
- package/skills/animation/SKILL.md +364 -0
- package/skills/brand/SKILL.md +200 -0
- package/skills/data-visualization/SKILL.md +533 -0
- package/skills/deck-templates/SKILL.md +93 -0
- package/skills/diagrams/SKILL.md +395 -0
- package/skills/export/SKILL.md +119 -0
- package/skills/interactive/SKILL.md +292 -0
- package/skills/layout/SKILL.md +178 -0
- package/skills/narrative-frameworks/SKILL.md +250 -0
- package/skills/react-component-embeds/SKILL.md +73 -0
- package/skills/slide-types/SKILL.md +384 -0
- package/skills/slidenerds-runtime/SKILL.md +163 -0
- package/skills/speaker-notes/SKILL.md +128 -0
- package/skills/strategic-frameworks/SKILL.md +392 -0
- package/skills/visual-design/SKILL.md +373 -0
- package/templates/analytics/custom.tsx.tmpl +20 -0
- package/templates/analytics/ga4.tsx.tmpl +15 -0
- package/templates/analytics/gtm.tsx.tmpl +9 -0
- package/templates/analytics/plausible.tsx.tmpl +10 -0
- package/templates/analytics/posthog.tsx.tmpl +14 -0
- package/templates/next-app/CLAUDE.md.tmpl +574 -0
- package/templates/next-app/README.md.tmpl +35 -0
- package/templates/next-app/app/globals.css.tmpl +274 -0
- package/templates/next-app/app/layout.tsx.tmpl +31 -0
- package/templates/next-app/app/page.tsx.tmpl +38 -0
- package/templates/next-app/brand.config.ts.tmpl +32 -0
- package/templates/next-app/package.json.tmpl +25 -0
- package/templates/next-app/postcss.config.mjs.tmpl +8 -0
- package/templates/next-app/tsconfig.json.tmpl +21 -0
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: slide-types
|
|
3
|
+
description: Individual slide type patterns with Tailwind structure and data attributes for slidenerds decks
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Slide types skill
|
|
7
|
+
|
|
8
|
+
Reusable slide patterns. Use these instead of inventing layout from scratch.
|
|
9
|
+
|
|
10
|
+
## Title slide
|
|
11
|
+
|
|
12
|
+
The opening slide. Large heading, optional subtitle.
|
|
13
|
+
|
|
14
|
+
```tsx
|
|
15
|
+
<section data-slide="">
|
|
16
|
+
<div
|
|
17
|
+
className="flex flex-col items-center justify-center min-h-screen text-center"
|
|
18
|
+
style={{ padding: 'var(--slide-padding)' }}
|
|
19
|
+
>
|
|
20
|
+
<h1 className="text-6xl font-bold" style={{ color: 'var(--color-text)' }}>
|
|
21
|
+
Presentation title
|
|
22
|
+
</h1>
|
|
23
|
+
<p className="mt-4 text-xl opacity-70">Subtitle or date</p>
|
|
24
|
+
<p className="mt-8 text-lg opacity-50">Author name</p>
|
|
25
|
+
</div>
|
|
26
|
+
</section>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Section divider
|
|
30
|
+
|
|
31
|
+
Separates major sections. Minimal content, strong visual break.
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
<section data-slide="">
|
|
35
|
+
<div
|
|
36
|
+
className="flex items-center justify-center min-h-screen"
|
|
37
|
+
style={{ background: 'var(--color-primary)', padding: 'var(--slide-padding)' }}
|
|
38
|
+
>
|
|
39
|
+
<h2 className="text-5xl font-bold" style={{ color: 'var(--color-accent)' }}>
|
|
40
|
+
Section title
|
|
41
|
+
</h2>
|
|
42
|
+
</div>
|
|
43
|
+
</section>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Big stat
|
|
47
|
+
|
|
48
|
+
Single number with label and context. High visual impact.
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
<section data-slide="">
|
|
52
|
+
<div
|
|
53
|
+
className="flex flex-col items-center justify-center min-h-screen text-center"
|
|
54
|
+
style={{ padding: 'var(--slide-padding)' }}
|
|
55
|
+
>
|
|
56
|
+
<p className="text-8xl font-bold" style={{ color: 'var(--color-accent)' }}>
|
|
57
|
+
$4.2M
|
|
58
|
+
</p>
|
|
59
|
+
<p className="mt-4 text-2xl font-semibold">Annual recurring revenue</p>
|
|
60
|
+
<p className="mt-2 text-lg opacity-60">Up 142% from last year</p>
|
|
61
|
+
</div>
|
|
62
|
+
</section>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Pull quote
|
|
66
|
+
|
|
67
|
+
A quote with attribution. Centered, large text.
|
|
68
|
+
|
|
69
|
+
```tsx
|
|
70
|
+
<section data-slide="">
|
|
71
|
+
<div
|
|
72
|
+
className="flex flex-col items-center justify-center min-h-screen text-center"
|
|
73
|
+
style={{ padding: 'var(--slide-padding)', maxWidth: '800px', margin: '0 auto' }}
|
|
74
|
+
>
|
|
75
|
+
<blockquote className="text-3xl italic leading-relaxed" style={{ color: 'var(--color-text)' }}>
|
|
76
|
+
"The best way to predict the future is to invent it."
|
|
77
|
+
</blockquote>
|
|
78
|
+
<cite className="mt-6 text-lg opacity-60 not-italic">Alan Kay</cite>
|
|
79
|
+
</div>
|
|
80
|
+
</section>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Code walkthrough
|
|
84
|
+
|
|
85
|
+
Syntax highlighted code with optional step-through. Use a `<pre><code>` block with language class for syntax highlighting.
|
|
86
|
+
|
|
87
|
+
```tsx
|
|
88
|
+
<section data-slide="">
|
|
89
|
+
<div style={{ padding: 'var(--slide-padding)' }}>
|
|
90
|
+
<h2 className="text-2xl font-semibold mb-6">Implementation</h2>
|
|
91
|
+
<pre
|
|
92
|
+
className="rounded-lg p-6 text-sm overflow-x-auto"
|
|
93
|
+
style={{ background: 'var(--color-surface)' }}
|
|
94
|
+
>
|
|
95
|
+
<code data-step="" className="block">
|
|
96
|
+
{'const runtime = new SlideRuntime()'}
|
|
97
|
+
</code>
|
|
98
|
+
<code data-step="" className="block mt-2">
|
|
99
|
+
{'runtime.registerSlides(document)'}
|
|
100
|
+
</code>
|
|
101
|
+
<code data-step="" className="block mt-2">
|
|
102
|
+
{'runtime.start()'}
|
|
103
|
+
</code>
|
|
104
|
+
</pre>
|
|
105
|
+
</div>
|
|
106
|
+
</section>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Comparison table
|
|
110
|
+
|
|
111
|
+
Side-by-side comparison of options, features, or approaches.
|
|
112
|
+
|
|
113
|
+
```tsx
|
|
114
|
+
<section data-slide="">
|
|
115
|
+
<div style={{ padding: 'var(--slide-padding)' }}>
|
|
116
|
+
<h2 className="text-3xl font-semibold mb-8">Feature comparison</h2>
|
|
117
|
+
<table className="w-full text-left text-lg">
|
|
118
|
+
<thead>
|
|
119
|
+
<tr className="border-b" style={{ borderColor: 'var(--color-surface)' }}>
|
|
120
|
+
<th className="py-3">Feature</th>
|
|
121
|
+
<th className="py-3">Us</th>
|
|
122
|
+
<th className="py-3">Them</th>
|
|
123
|
+
</tr>
|
|
124
|
+
</thead>
|
|
125
|
+
<tbody>
|
|
126
|
+
<tr data-step="" className="border-b" style={{ borderColor: 'var(--color-surface)' }}>
|
|
127
|
+
<td className="py-3">Speed</td>
|
|
128
|
+
<td className="py-3" style={{ color: 'var(--color-accent)' }}>
|
|
129
|
+
Fast
|
|
130
|
+
</td>
|
|
131
|
+
<td className="py-3 opacity-50">Slow</td>
|
|
132
|
+
</tr>
|
|
133
|
+
<tr data-step="" className="border-b" style={{ borderColor: 'var(--color-surface)' }}>
|
|
134
|
+
<td className="py-3">Price</td>
|
|
135
|
+
<td className="py-3" style={{ color: 'var(--color-accent)' }}>
|
|
136
|
+
$4/mo
|
|
137
|
+
</td>
|
|
138
|
+
<td className="py-3 opacity-50">$20/mo</td>
|
|
139
|
+
</tr>
|
|
140
|
+
</tbody>
|
|
141
|
+
</table>
|
|
142
|
+
</div>
|
|
143
|
+
</section>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Team slide
|
|
147
|
+
|
|
148
|
+
Grid of team members with photos and roles.
|
|
149
|
+
|
|
150
|
+
```tsx
|
|
151
|
+
<section data-slide="">
|
|
152
|
+
<div style={{ padding: 'var(--slide-padding)' }}>
|
|
153
|
+
<h2 className="text-3xl font-semibold mb-8">Our team</h2>
|
|
154
|
+
<div className="grid grid-cols-3 gap-8">
|
|
155
|
+
<div data-step="" className="text-center">
|
|
156
|
+
<div
|
|
157
|
+
className="w-24 h-24 rounded-full mx-auto mb-4"
|
|
158
|
+
style={{ background: 'var(--color-surface)' }}
|
|
159
|
+
/>
|
|
160
|
+
<p className="font-semibold">Jane Smith</p>
|
|
161
|
+
<p className="text-sm opacity-60">CEO</p>
|
|
162
|
+
</div>
|
|
163
|
+
{/* More team members */}
|
|
164
|
+
</div>
|
|
165
|
+
</div>
|
|
166
|
+
</section>
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Timeline
|
|
170
|
+
|
|
171
|
+
Horizontal or vertical timeline of events.
|
|
172
|
+
|
|
173
|
+
```tsx
|
|
174
|
+
<section data-slide="">
|
|
175
|
+
<div style={{ padding: 'var(--slide-padding)' }}>
|
|
176
|
+
<h2 className="text-3xl font-semibold mb-8">Roadmap</h2>
|
|
177
|
+
<div className="flex justify-between items-start">
|
|
178
|
+
<div data-step="" className="text-center flex-1">
|
|
179
|
+
<div
|
|
180
|
+
className="w-4 h-4 rounded-full mx-auto"
|
|
181
|
+
style={{ background: 'var(--color-accent)' }}
|
|
182
|
+
/>
|
|
183
|
+
<p className="mt-2 font-semibold">Q1 2025</p>
|
|
184
|
+
<p className="text-sm opacity-60 mt-1">Launch beta</p>
|
|
185
|
+
</div>
|
|
186
|
+
<div data-step="" className="text-center flex-1">
|
|
187
|
+
<div
|
|
188
|
+
className="w-4 h-4 rounded-full mx-auto"
|
|
189
|
+
style={{ background: 'var(--color-accent)' }}
|
|
190
|
+
/>
|
|
191
|
+
<p className="mt-2 font-semibold">Q2 2025</p>
|
|
192
|
+
<p className="text-sm opacity-60 mt-1">GA release</p>
|
|
193
|
+
</div>
|
|
194
|
+
<div data-step="" className="text-center flex-1">
|
|
195
|
+
<div
|
|
196
|
+
className="w-4 h-4 rounded-full mx-auto"
|
|
197
|
+
style={{ background: 'var(--color-accent)' }}
|
|
198
|
+
/>
|
|
199
|
+
<p className="mt-2 font-semibold">Q3 2025</p>
|
|
200
|
+
<p className="text-sm opacity-60 mt-1">Enterprise tier</p>
|
|
201
|
+
</div>
|
|
202
|
+
</div>
|
|
203
|
+
</div>
|
|
204
|
+
</section>
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Full-bleed image with overlay text
|
|
208
|
+
|
|
209
|
+
```tsx
|
|
210
|
+
<section data-slide="">
|
|
211
|
+
<div className="relative min-h-screen">
|
|
212
|
+
<img src="/hero.jpg" alt="" className="absolute inset-0 w-full h-full object-cover" />
|
|
213
|
+
<div className="absolute inset-0 bg-black/50" />
|
|
214
|
+
<div
|
|
215
|
+
className="relative z-10 flex items-end min-h-screen"
|
|
216
|
+
style={{ padding: 'var(--slide-padding)' }}
|
|
217
|
+
>
|
|
218
|
+
<div>
|
|
219
|
+
<h2 className="text-4xl font-bold text-white">Image slide title</h2>
|
|
220
|
+
<p className="mt-2 text-xl text-white/70">Caption or context</p>
|
|
221
|
+
</div>
|
|
222
|
+
</div>
|
|
223
|
+
</div>
|
|
224
|
+
</section>
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## Two-up (side by side)
|
|
228
|
+
|
|
229
|
+
```tsx
|
|
230
|
+
<section data-slide="">
|
|
231
|
+
<div
|
|
232
|
+
className="grid grid-cols-2 gap-8 items-center min-h-screen"
|
|
233
|
+
style={{ padding: 'var(--slide-padding)' }}
|
|
234
|
+
>
|
|
235
|
+
<div>
|
|
236
|
+
<h2 className="text-3xl font-semibold">Left side</h2>
|
|
237
|
+
<p className="mt-4 text-lg">Explanation or context</p>
|
|
238
|
+
</div>
|
|
239
|
+
<div className="rounded-lg overflow-hidden">
|
|
240
|
+
<img src="/screenshot.png" alt="Screenshot" className="w-full" />
|
|
241
|
+
</div>
|
|
242
|
+
</div>
|
|
243
|
+
</section>
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## Chart slide (Recharts)
|
|
247
|
+
|
|
248
|
+
Charts are mandatory in most board decks. Use one core chart per slide and narrate insights in steps.
|
|
249
|
+
|
|
250
|
+
```tsx
|
|
251
|
+
import { BarChart, Bar, XAxis, YAxis, ResponsiveContainer } from 'recharts'
|
|
252
|
+
|
|
253
|
+
const data = [
|
|
254
|
+
{ name: 'Q1', value: 400 },
|
|
255
|
+
{ name: 'Q2', value: 600 },
|
|
256
|
+
{ name: 'Q3', value: 900 },
|
|
257
|
+
{ name: 'Q4', value: 1200 },
|
|
258
|
+
]
|
|
259
|
+
|
|
260
|
+
<section data-slide="">
|
|
261
|
+
<div style={{ padding: 'var(--slide-padding)' }}>
|
|
262
|
+
<h2 className="text-3xl font-semibold mb-8">Quarterly revenue</h2>
|
|
263
|
+
<div data-step="" className="step-fade">
|
|
264
|
+
<ResponsiveContainer width="100%" height={400}>
|
|
265
|
+
<BarChart data={data}>
|
|
266
|
+
<XAxis dataKey="name" stroke="var(--color-text)" />
|
|
267
|
+
<YAxis stroke="var(--color-text)" />
|
|
268
|
+
<Bar dataKey="value" fill="var(--color-accent)" animationDuration={700} />
|
|
269
|
+
</BarChart>
|
|
270
|
+
</ResponsiveContainer>
|
|
271
|
+
</div>
|
|
272
|
+
<p data-step="" className="mt-4 text-lg">Revenue acceleration starts in Q3 after sales-led rollout.</p>
|
|
273
|
+
</div>
|
|
274
|
+
</section>
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## Diagram slide (Mermaid)
|
|
278
|
+
|
|
279
|
+
```tsx
|
|
280
|
+
<section data-slide="">
|
|
281
|
+
<div
|
|
282
|
+
className="flex items-center justify-center min-h-screen"
|
|
283
|
+
style={{ padding: 'var(--slide-padding)' }}
|
|
284
|
+
>
|
|
285
|
+
<MermaidDiagram
|
|
286
|
+
chart={`
|
|
287
|
+
graph TD
|
|
288
|
+
A[User request] --> B{Auth check}
|
|
289
|
+
B -->|Valid| C[Process]
|
|
290
|
+
B -->|Invalid| D[Reject]
|
|
291
|
+
C --> E[Response]
|
|
292
|
+
`}
|
|
293
|
+
/>
|
|
294
|
+
</div>
|
|
295
|
+
</section>
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
See the `animation` skill for the `MermaidDiagram` component implementation.
|
|
299
|
+
|
|
300
|
+
## Case study grid
|
|
301
|
+
|
|
302
|
+
A 3x2 or 3x3 grid of customer proof cards. Each card shows a company logo, a key metric, a label, and a one-line description. Top row slides down, bottom row slides up.
|
|
303
|
+
|
|
304
|
+
```tsx
|
|
305
|
+
<section data-slide="">
|
|
306
|
+
<div className="bg-mesh-cool flex flex-col w-full relative"
|
|
307
|
+
style={{ padding: '4rem 6rem' }}>
|
|
308
|
+
<p className="section-label mb-3">Proof</p>
|
|
309
|
+
<h2 className="text-[2.5rem] font-bold mb-8">Results from companies like yours</h2>
|
|
310
|
+
<div className="flex-1 flex items-center">
|
|
311
|
+
<div className="grid grid-cols-3 gap-4 w-full">
|
|
312
|
+
{[
|
|
313
|
+
{ company: 'Acme', logo: '/logos/light/acme.png', stat: '87%', label: 'cost reduction', desc: 'Migrated from legacy stack in 3 months', row: 0 },
|
|
314
|
+
{ company: 'Globex', logo: '/logos/light/globex.png', stat: '5x', label: 'faster deploys', desc: 'From hours to minutes with zero downtime', row: 0 },
|
|
315
|
+
{ company: 'Initech', logo: '/logos/light/initech.png', stat: '300K', label: 'users at launch', desc: 'Scaled from zero without infrastructure changes', row: 0 },
|
|
316
|
+
{ company: 'Umbrella', logo: '/logos/light/umbrella.png', stat: '<1 week', label: 'SOC 2 compliance', desc: 'Enterprise-ready from day one', row: 1 },
|
|
317
|
+
{ company: 'Wonka', logo: '/logos/light/wonka.png', stat: '4x', label: 'cost savings', desc: 'Replaced three separate vendors', row: 1 },
|
|
318
|
+
{ company: 'Stark', logo: '/logos/light/stark.png', stat: '50+', label: 'tools evaluated', desc: 'Chose us after comprehensive evaluation', row: 1 },
|
|
319
|
+
].map((item) => (
|
|
320
|
+
<div key={item.company}
|
|
321
|
+
className={`${item.row === 0 ? 'auto-slide-down' : 'auto-slide-up'} card-surface p-5 flex flex-col`}
|
|
322
|
+
style={{ animationDelay: item.row === 0 ? '300ms' : '500ms' }}>
|
|
323
|
+
<img src={item.logo} alt={item.company}
|
|
324
|
+
style={{ height: '1.25rem', objectFit: 'contain', objectPosition: 'left', marginBottom: '1rem', opacity: 0.6 }} />
|
|
325
|
+
<p className="text-2xl font-bold" style={{ color: 'var(--color-accent)' }}>{item.stat}</p>
|
|
326
|
+
<p className="text-sm font-semibold mt-1">{item.label}</p>
|
|
327
|
+
<p className="text-xs mt-2" style={{ color: 'var(--color-text-tertiary)' }}>{item.desc}</p>
|
|
328
|
+
</div>
|
|
329
|
+
))}
|
|
330
|
+
</div>
|
|
331
|
+
</div>
|
|
332
|
+
<div data-notes="">Walk through the most relevant case study for this prospect.</div>
|
|
333
|
+
</div>
|
|
334
|
+
</section>
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
Customer logos must be light (white-on-transparent) variants for dark-themed decks. Store originals in `public/logos/` and light variants in `public/logos/light/`.
|
|
338
|
+
|
|
339
|
+
## Image and logo preparation workflow
|
|
340
|
+
|
|
341
|
+
Use this pipeline when a deck includes photos, partner logos, or brand marks.
|
|
342
|
+
|
|
343
|
+
### Preferred asset hierarchy
|
|
344
|
+
|
|
345
|
+
1. Official SVG from brand guidelines page
|
|
346
|
+
2. Official PNG with transparency
|
|
347
|
+
3. High-resolution PNG or JPG as fallback
|
|
348
|
+
|
|
349
|
+
### Background removal
|
|
350
|
+
|
|
351
|
+
If you only have JPG or opaque PNG:
|
|
352
|
+
|
|
353
|
+
- Remove background with a segmentation tool.
|
|
354
|
+
- Export transparent PNG at 2x expected display size.
|
|
355
|
+
- Verify clean edges on dark and light slide backgrounds.
|
|
356
|
+
|
|
357
|
+
### Monochrome logo treatment
|
|
358
|
+
|
|
359
|
+
For dark slides, convert logo to white. For light slides, convert to near-black.
|
|
360
|
+
|
|
361
|
+
```css
|
|
362
|
+
.logo-on-dark {
|
|
363
|
+
filter: brightness(0) invert(1);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
.logo-on-light {
|
|
367
|
+
filter: brightness(0) saturate(0%);
|
|
368
|
+
}
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
Use filters only for temporary mockups. For production quality decks, generate true SVG variants.
|
|
372
|
+
|
|
373
|
+
### JPG to SVG conversion discipline
|
|
374
|
+
|
|
375
|
+
- Do not auto-trace complex logos and assume brand-safe output.
|
|
376
|
+
- Use vectorization only for simple, high-contrast marks.
|
|
377
|
+
- Manually inspect path quality before presenting.
|
|
378
|
+
- Keep original aspect ratio and clear-space rules.
|
|
379
|
+
|
|
380
|
+
### Accessibility checks for image slides
|
|
381
|
+
|
|
382
|
+
- Maintain text contrast ratio at or above 4.5:1 on overlays
|
|
383
|
+
- Add meaningful alt text for all non-decorative images
|
|
384
|
+
- Avoid text over high-frequency image regions
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: slidenerds-runtime
|
|
3
|
+
description: Core runtime conventions for building slidenerds presentation decks in Next.js
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Slidenerds runtime conventions
|
|
7
|
+
|
|
8
|
+
This skill covers the foundational data conventions, file structure, and runtime behavior that every other slidenerds skill depends on. Install this skill first.
|
|
9
|
+
|
|
10
|
+
## Data attributes
|
|
11
|
+
|
|
12
|
+
The runtime recognizes three HTML attributes on any element:
|
|
13
|
+
|
|
14
|
+
### `data-slide`
|
|
15
|
+
|
|
16
|
+
Marks an element as a slide. The runtime tracks all `[data-slide]` elements in DOM order for navigation, the light table, and the slide counter.
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
<section data-slide="">
|
|
20
|
+
<h1>My slide title</h1>
|
|
21
|
+
</section>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Each `data-slide` element should represent one full-viewport slide. Use `<section>` as the wrapper element by convention.
|
|
25
|
+
|
|
26
|
+
### `data-step`
|
|
27
|
+
|
|
28
|
+
Marks an element for progressive reveal. Elements with `data-step` start hidden (`visibility: hidden; opacity: 0`) and become visible one at a time on each advance action (click, space, right arrow).
|
|
29
|
+
|
|
30
|
+
```tsx
|
|
31
|
+
<section data-slide="">
|
|
32
|
+
<h2>Three reasons</h2>
|
|
33
|
+
<p data-step="">First reason</p>
|
|
34
|
+
<p data-step="">Second reason</p>
|
|
35
|
+
<p data-step="">Third reason</p>
|
|
36
|
+
</section>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Steps are revealed in DOM order within their parent slide. When all steps on a slide are revealed, the next advance action moves to the next slide.
|
|
40
|
+
|
|
41
|
+
### `data-notes`
|
|
42
|
+
|
|
43
|
+
Speaker notes. These elements are hidden during presentation mode and rendered in the presenter window (opened with `P`).
|
|
44
|
+
|
|
45
|
+
```tsx
|
|
46
|
+
<section data-slide="">
|
|
47
|
+
<h2>Revenue growth</h2>
|
|
48
|
+
<p>$4.2M ARR</p>
|
|
49
|
+
<div data-notes="">
|
|
50
|
+
Mention the Q3 acceleration. Pause for questions after the number.
|
|
51
|
+
</div>
|
|
52
|
+
</section>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Place `data-notes` elements inside their parent slide. You can have multiple `data-notes` elements per slide.
|
|
56
|
+
|
|
57
|
+
## File structure
|
|
58
|
+
|
|
59
|
+
A slidenerds deck is a standard Next.js App Router project:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
my-deck/
|
|
63
|
+
app/
|
|
64
|
+
layout.tsx # Root layout with <SlideRuntime> wrapper
|
|
65
|
+
page.tsx # Main slide deck
|
|
66
|
+
globals.css # Global styles with CSS custom properties
|
|
67
|
+
brand.config.ts # Brand colors, fonts, spacing
|
|
68
|
+
CLAUDE.md # LLM instructions for this deck
|
|
69
|
+
package.json
|
|
70
|
+
tsconfig.json
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Root layout
|
|
74
|
+
|
|
75
|
+
The root layout wraps everything in `<SlideRuntime>`:
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
import { SlideRuntime } from '@slidenerds/runtime'
|
|
79
|
+
|
|
80
|
+
export default function RootLayout({ children }) {
|
|
81
|
+
return (
|
|
82
|
+
<html lang="en">
|
|
83
|
+
<body>
|
|
84
|
+
<SlideRuntime>{children}</SlideRuntime>
|
|
85
|
+
</body>
|
|
86
|
+
</html>
|
|
87
|
+
)
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Slide structure
|
|
92
|
+
|
|
93
|
+
Slides live in `app/page.tsx` (or split across route segments). Each slide is a `<section data-slide="">` element:
|
|
94
|
+
|
|
95
|
+
```tsx
|
|
96
|
+
export default function Home() {
|
|
97
|
+
return (
|
|
98
|
+
<main>
|
|
99
|
+
<section data-slide="">
|
|
100
|
+
{/* Slide 1 content */}
|
|
101
|
+
</section>
|
|
102
|
+
<section data-slide="">
|
|
103
|
+
{/* Slide 2 content */}
|
|
104
|
+
</section>
|
|
105
|
+
</main>
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Keyboard controls
|
|
111
|
+
|
|
112
|
+
| Key | Action |
|
|
113
|
+
|-----|--------|
|
|
114
|
+
| Space / Right arrow | Advance (next step or next slide) |
|
|
115
|
+
| Left arrow / Backspace | Go back (previous step or previous slide) |
|
|
116
|
+
| Double-click | Previous slide |
|
|
117
|
+
| P | Open presenter mode |
|
|
118
|
+
| L | Open light table |
|
|
119
|
+
| F | Toggle fullscreen |
|
|
120
|
+
| Escape | Exit fullscreen |
|
|
121
|
+
|
|
122
|
+
## URL sync
|
|
123
|
+
|
|
124
|
+
The current slide is reflected in the URL as `?slide=N` (1-indexed). Sharing a URL with `?slide=5` opens directly to slide 5. Browser back/forward navigates between slides.
|
|
125
|
+
|
|
126
|
+
## Brand config
|
|
127
|
+
|
|
128
|
+
Every deck ships with `brand.config.ts`. Read this file before generating any layout or color. See the `brand` skill for full details.
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
import type { BrandConfig } from '@slidenerds/runtime'
|
|
132
|
+
|
|
133
|
+
export default {
|
|
134
|
+
colors: { primary: '#1a1a2e', accent: '#e94560', background: '#0f3460', surface: '#16213e', text: '#eaeaea' },
|
|
135
|
+
fonts: { heading: 'Inter', body: 'Inter', mono: 'JetBrains Mono' },
|
|
136
|
+
spacing: { slide: '4rem', section: '2rem', element: '1rem' },
|
|
137
|
+
} satisfies BrandConfig
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## CSS conventions
|
|
141
|
+
|
|
142
|
+
Global styles define CSS custom properties from the brand config:
|
|
143
|
+
|
|
144
|
+
```css
|
|
145
|
+
[data-slide] {
|
|
146
|
+
min-height: 100vh;
|
|
147
|
+
display: flex;
|
|
148
|
+
align-items: center;
|
|
149
|
+
justify-content: center;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
[data-notes] {
|
|
153
|
+
display: none;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
[data-step] {
|
|
157
|
+
visibility: hidden;
|
|
158
|
+
opacity: 0;
|
|
159
|
+
transition: opacity 0.3s ease, visibility 0.3s ease;
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
The runtime manages `data-step` visibility programmatically. The CSS provides the initial hidden state and transition.
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: speaker-notes
|
|
3
|
+
description: Conventions for writing and placing speaker notes in slidenerds decks
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Speaker notes skill
|
|
7
|
+
|
|
8
|
+
How to write and structure speaker notes that help the presenter deliver the talk.
|
|
9
|
+
|
|
10
|
+
## Where notes go
|
|
11
|
+
|
|
12
|
+
Place `data-notes` elements inside their parent slide. They are hidden during presentation and rendered in the presenter window (press `P`).
|
|
13
|
+
|
|
14
|
+
```tsx
|
|
15
|
+
<section data-slide="">
|
|
16
|
+
<h2>Revenue growth</h2>
|
|
17
|
+
<p>$4.2M ARR, up 142%</p>
|
|
18
|
+
<div data-notes="">
|
|
19
|
+
Lead with the number. Let it land for 3 seconds before explaining.
|
|
20
|
+
Mention Q3 was the inflection point when enterprise deals closed.
|
|
21
|
+
If asked about margins, pivot to the next slide.
|
|
22
|
+
</div>
|
|
23
|
+
</section>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
You can have multiple `data-notes` elements per slide:
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
<section data-slide="">
|
|
30
|
+
<h2>Three key metrics</h2>
|
|
31
|
+
<div data-step="">
|
|
32
|
+
<p>Revenue: $4.2M</p>
|
|
33
|
+
<div data-notes="">Emphasize the growth rate, not the absolute number.</div>
|
|
34
|
+
</div>
|
|
35
|
+
<div data-step="">
|
|
36
|
+
<p>Retention: 98%</p>
|
|
37
|
+
<div data-notes="">Compare to industry average of 85%.</div>
|
|
38
|
+
</div>
|
|
39
|
+
</section>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Note length
|
|
43
|
+
|
|
44
|
+
Target 75 words per note block. That's roughly 30 seconds of speaking.
|
|
45
|
+
|
|
46
|
+
### Too short (unhelpful)
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
Talk about revenue.
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Too long (unreadable during delivery)
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
Revenue grew 142% year over year, driven primarily by enterprise deals
|
|
56
|
+
in Q3 that we secured through the new sales team we hired in Q1. The
|
|
57
|
+
sales team consists of four AEs and one SDR, each focused on a different
|
|
58
|
+
vertical. The enterprise vertical specifically saw 3x growth because we
|
|
59
|
+
launched the SOC 2 compliance feature in June which removed the biggest
|
|
60
|
+
blocker for procurement teams. We should mention that our CAC payback
|
|
61
|
+
period dropped from 18 months to 11 months as a result...
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Right length
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
Revenue grew 142%. Lead with the number, pause, then explain.
|
|
68
|
+
The inflection was Q3 enterprise deals -- SOC 2 compliance unlocked procurement.
|
|
69
|
+
If asked about CAC: payback dropped from 18 to 11 months.
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Timing cues
|
|
73
|
+
|
|
74
|
+
Use short directives in brackets for delivery timing:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
[pause] -- Stop for 2-3 seconds. Let the audience absorb.
|
|
78
|
+
[ask the room] -- Pose a question, wait for hands or responses.
|
|
79
|
+
[wait for laughs] -- You just said something funny. Don't step on it.
|
|
80
|
+
[click] -- Reminder to advance to the next step.
|
|
81
|
+
[transition] -- Signal that you're moving to a new topic.
|
|
82
|
+
[demo] -- Switch to live demo. Have the window ready.
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Example:
|
|
86
|
+
|
|
87
|
+
```tsx
|
|
88
|
+
<div data-notes="">
|
|
89
|
+
$4.2M ARR [pause]. That's 142% growth in twelve months.
|
|
90
|
+
[ask the room] How many of you have seen growth like that sustained past Series A?
|
|
91
|
+
Most don't. Here's what made the difference for us. [click]
|
|
92
|
+
</div>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Notes for talks you haven't memorized
|
|
96
|
+
|
|
97
|
+
Write complete sentences. Include the actual words you want to say, not just topics.
|
|
98
|
+
|
|
99
|
+
```tsx
|
|
100
|
+
<div data-notes="">
|
|
101
|
+
"The problem isn't that developers can't build presentations.
|
|
102
|
+
The problem is that every presentation tool optimizes for the wrong thing.
|
|
103
|
+
They optimize for dragging boxes. We optimize for thinking."
|
|
104
|
+
[pause] Let that land before moving on.
|
|
105
|
+
</div>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Notes for talks you have memorized
|
|
109
|
+
|
|
110
|
+
Write prompts and reminders, not scripts. Trust yourself.
|
|
111
|
+
|
|
112
|
+
```tsx
|
|
113
|
+
<div data-notes="">
|
|
114
|
+
Revenue slide. Lead with number. Mention Q3 inflection.
|
|
115
|
+
Skip margin detail unless asked.
|
|
116
|
+
</div>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## How notes render in presenter mode
|
|
120
|
+
|
|
121
|
+
The presenter window shows:
|
|
122
|
+
- Current slide (live)
|
|
123
|
+
- Next slide preview
|
|
124
|
+
- All `data-notes` content for the current slide, concatenated in DOM order
|
|
125
|
+
- Running timer (MM:SS since start)
|
|
126
|
+
- Slide counter (current / total)
|
|
127
|
+
|
|
128
|
+
Notes are rendered as plain text. HTML formatting in notes is stripped. Keep notes as simple text.
|