@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.
Files changed (101) hide show
  1. package/dist/cli/commands/analytics.d.ts +6 -0
  2. package/dist/cli/commands/analytics.d.ts.map +1 -0
  3. package/dist/cli/commands/analytics.js +44 -0
  4. package/dist/cli/commands/analytics.js.map +1 -0
  5. package/dist/cli/commands/create.d.ts +4 -0
  6. package/dist/cli/commands/create.d.ts.map +1 -0
  7. package/dist/cli/commands/create.js +87 -0
  8. package/dist/cli/commands/create.js.map +1 -0
  9. package/dist/cli/commands/export.d.ts +6 -0
  10. package/dist/cli/commands/export.d.ts.map +1 -0
  11. package/dist/cli/commands/export.js +109 -0
  12. package/dist/cli/commands/export.js.map +1 -0
  13. package/dist/cli/index.d.ts +3 -0
  14. package/dist/cli/index.d.ts.map +1 -0
  15. package/dist/cli/index.js +12 -0
  16. package/dist/cli/index.js.map +1 -0
  17. package/dist/cli/template-path.d.ts +4 -0
  18. package/dist/cli/template-path.d.ts.map +1 -0
  19. package/dist/cli/template-path.js +13 -0
  20. package/dist/cli/template-path.js.map +1 -0
  21. package/dist/runtime/export-api.d.ts +15 -0
  22. package/dist/runtime/export-api.d.ts.map +1 -0
  23. package/dist/runtime/export-api.js +21 -0
  24. package/dist/runtime/export-api.js.map +1 -0
  25. package/dist/runtime/index.d.ts +12 -0
  26. package/dist/runtime/index.d.ts.map +1 -0
  27. package/dist/runtime/index.js +8 -0
  28. package/dist/runtime/index.js.map +1 -0
  29. package/dist/runtime/light-table.d.ts +8 -0
  30. package/dist/runtime/light-table.d.ts.map +1 -0
  31. package/dist/runtime/light-table.js +104 -0
  32. package/dist/runtime/light-table.js.map +1 -0
  33. package/dist/runtime/presenter-view.d.ts +7 -0
  34. package/dist/runtime/presenter-view.d.ts.map +1 -0
  35. package/dist/runtime/presenter-view.js +62 -0
  36. package/dist/runtime/presenter-view.js.map +1 -0
  37. package/dist/runtime/slide-context.d.ts +16 -0
  38. package/dist/runtime/slide-context.d.ts.map +1 -0
  39. package/dist/runtime/slide-context.js +18 -0
  40. package/dist/runtime/slide-context.js.map +1 -0
  41. package/dist/runtime/slide-controls.d.ts +3 -0
  42. package/dist/runtime/slide-controls.d.ts.map +1 -0
  43. package/dist/runtime/slide-controls.js +177 -0
  44. package/dist/runtime/slide-controls.js.map +1 -0
  45. package/dist/runtime/slide-dom.d.ts +17 -0
  46. package/dist/runtime/slide-dom.d.ts.map +1 -0
  47. package/dist/runtime/slide-dom.js +89 -0
  48. package/dist/runtime/slide-dom.js.map +1 -0
  49. package/dist/runtime/slide-runtime.d.ts +7 -0
  50. package/dist/runtime/slide-runtime.d.ts.map +1 -0
  51. package/dist/runtime/slide-runtime.js +125 -0
  52. package/dist/runtime/slide-runtime.js.map +1 -0
  53. package/dist/runtime/slide-shape.d.ts +21 -0
  54. package/dist/runtime/slide-shape.d.ts.map +1 -0
  55. package/dist/runtime/slide-shape.js +115 -0
  56. package/dist/runtime/slide-shape.js.map +1 -0
  57. package/dist/runtime/types.d.ts +150 -0
  58. package/dist/runtime/types.d.ts.map +1 -0
  59. package/dist/runtime/types.js +38 -0
  60. package/dist/runtime/types.js.map +1 -0
  61. package/dist/runtime/use-presenter-mode.d.ts +14 -0
  62. package/dist/runtime/use-presenter-mode.d.ts.map +1 -0
  63. package/dist/runtime/use-presenter-mode.js +52 -0
  64. package/dist/runtime/use-presenter-mode.js.map +1 -0
  65. package/dist/runtime/use-slide-navigation.d.ts +13 -0
  66. package/dist/runtime/use-slide-navigation.d.ts.map +1 -0
  67. package/dist/runtime/use-slide-navigation.js +230 -0
  68. package/dist/runtime/use-slide-navigation.js.map +1 -0
  69. package/package.json +64 -0
  70. package/skills/accessibility/SKILL.md +236 -0
  71. package/skills/advanced-layouts/SKILL.md +429 -0
  72. package/skills/analytics/SKILL.md +97 -0
  73. package/skills/animation/SKILL.md +364 -0
  74. package/skills/brand/SKILL.md +200 -0
  75. package/skills/data-visualization/SKILL.md +533 -0
  76. package/skills/deck-templates/SKILL.md +93 -0
  77. package/skills/diagrams/SKILL.md +395 -0
  78. package/skills/export/SKILL.md +119 -0
  79. package/skills/interactive/SKILL.md +292 -0
  80. package/skills/layout/SKILL.md +178 -0
  81. package/skills/narrative-frameworks/SKILL.md +250 -0
  82. package/skills/react-component-embeds/SKILL.md +73 -0
  83. package/skills/slide-types/SKILL.md +384 -0
  84. package/skills/slidenerds-runtime/SKILL.md +163 -0
  85. package/skills/speaker-notes/SKILL.md +128 -0
  86. package/skills/strategic-frameworks/SKILL.md +392 -0
  87. package/skills/visual-design/SKILL.md +373 -0
  88. package/templates/analytics/custom.tsx.tmpl +20 -0
  89. package/templates/analytics/ga4.tsx.tmpl +15 -0
  90. package/templates/analytics/gtm.tsx.tmpl +9 -0
  91. package/templates/analytics/plausible.tsx.tmpl +10 -0
  92. package/templates/analytics/posthog.tsx.tmpl +14 -0
  93. package/templates/next-app/CLAUDE.md.tmpl +574 -0
  94. package/templates/next-app/README.md.tmpl +35 -0
  95. package/templates/next-app/app/globals.css.tmpl +274 -0
  96. package/templates/next-app/app/layout.tsx.tmpl +31 -0
  97. package/templates/next-app/app/page.tsx.tmpl +38 -0
  98. package/templates/next-app/brand.config.ts.tmpl +32 -0
  99. package/templates/next-app/package.json.tmpl +25 -0
  100. package/templates/next-app/postcss.config.mjs.tmpl +8 -0
  101. 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.