@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,395 @@
1
+ ---
2
+ name: diagrams
3
+ description: Diagram patterns for slidenerds slides using Mermaid, custom SVG, and HTML/CSS
4
+ ---
5
+
6
+ # Diagrams skill
7
+
8
+ Use this skill when a slide needs a diagram, flowchart, org chart, journey map, or any structural visualization. Every pattern here produces a slide-ready result using Mermaid syntax or HTML/CSS.
9
+
10
+ ## Rendering Mermaid diagrams
11
+
12
+ Mermaid diagrams render client-side. Wrap the chart string in a component that calls `mermaid.render()`. Install `mermaid` as a dependency. Use a ref-based approach with safe DOM manipulation rather than raw HTML insertion. Sanitize Mermaid SVG output with DOMPurify before inserting into the DOM.
13
+
14
+ ```tsx
15
+ 'use client'
16
+
17
+ import { useEffect, useRef, useId } from 'react'
18
+ import mermaid from 'mermaid'
19
+ import DOMPurify from 'dompurify'
20
+
21
+ type MermaidDiagramProps = {
22
+ chart: string
23
+ className?: string
24
+ }
25
+
26
+ mermaid.initialize({
27
+ startOnLoad: false,
28
+ theme: 'dark',
29
+ themeVariables: {
30
+ primaryColor: 'var(--color-surface)',
31
+ primaryTextColor: 'var(--color-text)',
32
+ primaryBorderColor: 'var(--color-accent)',
33
+ lineColor: 'var(--color-accent)',
34
+ secondaryColor: 'var(--color-surface-elevated)',
35
+ tertiaryColor: 'var(--color-primary)',
36
+ },
37
+ })
38
+
39
+ export const MermaidDiagram: React.FC<MermaidDiagramProps> = ({ chart, className }) => {
40
+ const containerRef = useRef<HTMLDivElement>(null)
41
+ const id = useId().replace(/:/g, '_')
42
+
43
+ useEffect(() => {
44
+ const render = async () => {
45
+ if (!containerRef.current) return
46
+ const { svg } = await mermaid.render(`mermaid-${id}`, chart)
47
+ const sanitized = DOMPurify.sanitize(svg, { USE_PROFILES: { svg: true } })
48
+ containerRef.current.replaceChildren()
49
+ const template = document.createElement('template')
50
+ template.innerHTML = sanitized
51
+ if (template.content.firstChild) {
52
+ containerRef.current.appendChild(template.content.firstChild)
53
+ }
54
+ }
55
+ render()
56
+ }, [chart, id])
57
+
58
+ return <div ref={containerRef} className={className} />
59
+ }
60
+ ```
61
+
62
+ ## Flowchart (process flow)
63
+
64
+ Use for: approval workflows, decision logic, system processes, user flows.
65
+
66
+ ### Linear process (left to right)
67
+
68
+ ```
69
+ graph LR
70
+ A[Request submitted] --> B[Manager review]
71
+ B --> C{Approved?}
72
+ C -->|Yes| D[Process payment]
73
+ C -->|No| E[Return to requester]
74
+ D --> F[Complete]
75
+ ```
76
+
77
+ ```tsx
78
+ <section data-slide="">
79
+ <div className="flex flex-col justify-center w-full min-h-screen"
80
+ style={{ padding: '4rem 6rem' }}>
81
+ <p className="section-label mb-3">Process</p>
82
+ <h2 className="text-[2.5rem] font-bold mb-12">Approval workflow</h2>
83
+ <div data-step="" className="step-fade">
84
+ <MermaidDiagram chart={`graph LR
85
+ A[Request] --> B[Review]
86
+ B --> C{Approved?}
87
+ C -->|Yes| D[Process]
88
+ C -->|No| E[Return]
89
+ D --> F[Complete]
90
+ `} />
91
+ </div>
92
+ </div>
93
+ </section>
94
+ ```
95
+
96
+ ### Vertical decision tree
97
+
98
+ ```
99
+ graph TD
100
+ A[Start] --> B{Condition 1}
101
+ B -->|Yes| C[Action A]
102
+ B -->|No| D{Condition 2}
103
+ D -->|Yes| E[Action B]
104
+ D -->|No| F[Action C]
105
+ ```
106
+
107
+ ### Flowchart styling rules for slides
108
+
109
+ - Max 8-10 nodes per diagram. More than that and the text becomes unreadable at projection distance.
110
+ - Use `graph LR` for processes with 4-6 sequential steps.
111
+ - Use `graph TD` for decision trees with branching logic.
112
+ - Decision nodes use `{}` diamond shape. Process nodes use `[]` rectangles.
113
+ - Keep node labels under 3 words.
114
+
115
+ ## Org chart
116
+
117
+ Use for: company structure, reporting lines, team hierarchy.
118
+
119
+ Mermaid does not have a native org chart type. Use a top-down graph with specific styling.
120
+
121
+ ```
122
+ graph TD
123
+ CEO[CEO<br/>Alex Rivera] --> CTO[CTO<br/>Jordan Park]
124
+ CEO --> CRO[CRO<br/>Sam Chen]
125
+ CEO --> CFO[CFO<br/>Dana Lee]
126
+ CTO --> ENG1[Engineering<br/>Team A]
127
+ CTO --> ENG2[Engineering<br/>Team B]
128
+ CRO --> SALES[Sales]
129
+ CRO --> CS[Customer Success]
130
+ ```
131
+
132
+ ### HTML/CSS org chart (when Mermaid styling is insufficient)
133
+
134
+ For polished org charts, build with HTML/CSS:
135
+
136
+ ```tsx
137
+ <section data-slide="">
138
+ <div className="flex flex-col items-center justify-center w-full min-h-screen"
139
+ style={{ padding: '4rem 6rem' }}>
140
+ <h2 className="text-[2.5rem] font-bold mb-12">Organization</h2>
141
+ <div className="flex flex-col items-center gap-8">
142
+ {/* Level 1 */}
143
+ <div className="card-surface px-6 py-3 text-center">
144
+ <p className="font-semibold">Alex Rivera</p>
145
+ <p className="text-xs" style={{ color: 'var(--color-text-tertiary)' }}>CEO</p>
146
+ </div>
147
+ {/* Connector */}
148
+ <div className="w-px h-6" style={{ background: 'var(--color-border)' }} />
149
+ {/* Level 2 */}
150
+ <div className="flex gap-16">
151
+ <div className="flex flex-col items-center gap-2">
152
+ <div className="card-surface px-5 py-2.5 text-center">
153
+ <p className="font-semibold text-sm">Jordan Park</p>
154
+ <p className="text-xs" style={{ color: 'var(--color-text-tertiary)' }}>CTO</p>
155
+ </div>
156
+ </div>
157
+ <div className="flex flex-col items-center gap-2">
158
+ <div className="card-surface px-5 py-2.5 text-center">
159
+ <p className="font-semibold text-sm">Sam Chen</p>
160
+ <p className="text-xs" style={{ color: 'var(--color-text-tertiary)' }}>CRO</p>
161
+ </div>
162
+ </div>
163
+ <div className="flex flex-col items-center gap-2">
164
+ <div className="card-surface px-5 py-2.5 text-center">
165
+ <p className="font-semibold text-sm">Dana Lee</p>
166
+ <p className="text-xs" style={{ color: 'var(--color-text-tertiary)' }}>CFO</p>
167
+ </div>
168
+ </div>
169
+ </div>
170
+ </div>
171
+ </div>
172
+ </section>
173
+ ```
174
+
175
+ ## Sequence diagram
176
+
177
+ Use for: API flows, system interactions, user-service communication, authentication flows.
178
+
179
+ ```
180
+ sequenceDiagram
181
+ participant U as User
182
+ participant A as API Gateway
183
+ participant S as Auth Service
184
+ participant D as Database
185
+
186
+ U->>A: POST /login
187
+ A->>S: Validate credentials
188
+ S->>D: Query user
189
+ D-->>S: User record
190
+ S-->>A: JWT token
191
+ A-->>U: 200 OK + token
192
+ ```
193
+
194
+ ### Sequence diagram rules for slides
195
+
196
+ - Max 4-5 participants (columns). More creates unreadable horizontal sprawl.
197
+ - Max 8-10 messages (rows). More becomes a spec document, not a slide.
198
+ - Use abbreviations for participant names.
199
+ - Group related messages with `rect` blocks for visual clarity.
200
+
201
+ ## Journey map
202
+
203
+ Use for: customer experience, user onboarding, support workflow.
204
+
205
+ ```
206
+ journey
207
+ title Customer onboarding journey
208
+ section Sign up
209
+ Visit website: 5: Customer
210
+ Create account: 4: Customer
211
+ Verify email: 3: Customer
212
+ section First use
213
+ Complete tutorial: 4: Customer
214
+ Import data: 2: Customer
215
+ Invite team: 3: Customer
216
+ section Activation
217
+ First dashboard: 5: Customer
218
+ Share report: 4: Customer
219
+ ```
220
+
221
+ The numbers (1-5) represent satisfaction/sentiment. Higher is better.
222
+
223
+ ### Journey map rules
224
+
225
+ - 3-4 sections maximum.
226
+ - 3-4 steps per section.
227
+ - The sentiment score drives the visual. Low scores (1-2) should be called out as pain points.
228
+
229
+ ## State diagram
230
+
231
+ Use for: workflow states, order lifecycle, subscription status, feature flags.
232
+
233
+ ```
234
+ stateDiagram-v2
235
+ [*] --> Draft
236
+ Draft --> Review : Submit
237
+ Review --> Approved : Approve
238
+ Review --> Draft : Reject
239
+ Approved --> Published : Publish
240
+ Published --> Archived : Archive
241
+ Archived --> [*]
242
+ ```
243
+
244
+ ## Mind map
245
+
246
+ Use for: brainstorming output, feature mapping, topic exploration.
247
+
248
+ ```
249
+ mindmap
250
+ root((Product Strategy))
251
+ Growth
252
+ PLG funnel
253
+ Sales-led
254
+ Partnerships
255
+ Retention
256
+ Onboarding
257
+ Feature adoption
258
+ Support quality
259
+ Expansion
260
+ Upsell
261
+ Cross-sell
262
+ Enterprise tier
263
+ ```
264
+
265
+ ### Mind map rules
266
+
267
+ - One root node.
268
+ - 3-4 primary branches.
269
+ - 2-4 leaves per branch.
270
+ - More than 20 total nodes makes the diagram unreadable on a slide.
271
+
272
+ ## Architecture diagram (C4 model)
273
+
274
+ Use for: system context, container view, component view.
275
+
276
+ Mermaid supports C4 diagrams:
277
+
278
+ ```
279
+ C4Context
280
+ title System Context Diagram
281
+
282
+ Person(user, "User", "A customer of the system")
283
+ System(app, "Acme Platform", "The main application")
284
+ System_Ext(payment, "Stripe", "Payment processing")
285
+ System_Ext(email, "SendGrid", "Email delivery")
286
+
287
+ Rel(user, app, "Uses", "HTTPS")
288
+ Rel(app, payment, "Processes payments", "API")
289
+ Rel(app, email, "Sends emails", "API")
290
+ ```
291
+
292
+ ### Architecture diagram rules
293
+
294
+ - Context level: max 5-7 boxes. Show the system boundary clearly.
295
+ - Container level: max 8-10 boxes. Show databases, APIs, frontends.
296
+ - Component level: rarely appropriate for slides. Use for technical deep-dives only.
297
+
298
+ ## Cycle / circular diagram
299
+
300
+ Use for: recurring processes, feedback loops, product lifecycle, flywheel.
301
+
302
+ Mermaid does not support circular layouts. Build with CSS:
303
+
304
+ ```tsx
305
+ <section data-slide="">
306
+ <div className="flex items-center justify-center w-full min-h-screen"
307
+ style={{ padding: '4rem 6rem' }}>
308
+ <div className="relative" style={{ width: 400, height: 400 }}>
309
+ {['Acquire', 'Activate', 'Retain', 'Expand'].map((label, i) => {
310
+ const angle = (Math.PI * 2 * i) / 4 - Math.PI / 2
311
+ const x = 200 + 150 * Math.cos(angle) - 50
312
+ const y = 200 + 150 * Math.sin(angle) - 25
313
+ return (
314
+ <div key={label} data-step="" className="step-scale-in absolute"
315
+ style={{ left: x, top: y, width: 100 }}>
316
+ <SlideShape shape="circle" size={80}
317
+ fill="var(--color-surface)" stroke="var(--color-accent)" strokeWidth={2}>
318
+ <p className="text-xs font-semibold">{label}</p>
319
+ </SlideShape>
320
+ </div>
321
+ )
322
+ })}
323
+ </div>
324
+ </div>
325
+ </section>
326
+ ```
327
+
328
+ ## Venn diagram
329
+
330
+ Use for: overlap analysis, market positioning, skill intersection.
331
+
332
+ Build with custom SVG (overlapping circles with blend mode):
333
+
334
+ ```tsx
335
+ <svg width={500} height={350} viewBox="0 0 500 350">
336
+ <circle cx={190} cy={175} r={130} fill="var(--color-accent)" opacity={0.2}
337
+ stroke="var(--color-accent)" strokeWidth={1.5} />
338
+ <circle cx={310} cy={175} r={130} fill="var(--color-surface)" opacity={0.3}
339
+ stroke="var(--color-border)" strokeWidth={1.5} />
340
+ <text x={140} y={175} fill="var(--color-text)" fontSize={14}
341
+ textAnchor="middle" dominantBaseline="middle">Engineering</text>
342
+ <text x={360} y={175} fill="var(--color-text)" fontSize={14}
343
+ textAnchor="middle" dominantBaseline="middle">Design</text>
344
+ <text x={250} y={175} fill="var(--color-accent)" fontSize={12}
345
+ textAnchor="middle" dominantBaseline="middle" fontWeight={600}>Product</text>
346
+ </svg>
347
+ ```
348
+
349
+ ## Swim lane diagram
350
+
351
+ Use for: cross-functional processes, showing ownership per team.
352
+
353
+ Build with CSS grid. Each row represents a team/department. Steps flow left to right within each lane.
354
+
355
+ ```tsx
356
+ <div className="grid grid-cols-[120px_1fr] gap-0 card-surface overflow-hidden">
357
+ <div className="p-3 font-semibold text-xs text-center"
358
+ style={{ background: 'var(--color-surface-elevated)',
359
+ borderBottom: '1px solid var(--color-border)' }}>
360
+ Customer
361
+ </div>
362
+ <div className="p-3 flex gap-4 items-center"
363
+ style={{ borderBottom: '1px solid var(--color-border)' }}>
364
+ <SlideShape shape="rounded-square" width={100} height={40}
365
+ fill="var(--color-accent-dim)" stroke="var(--color-accent)" strokeWidth={1}>
366
+ <p className="text-[10px]">Submit request</p>
367
+ </SlideShape>
368
+ </div>
369
+ {/* Additional lanes for Support, Engineering, etc. */}
370
+ </div>
371
+ ```
372
+
373
+ ## Diagram selection guide
374
+
375
+ | Need | Diagram type | Tool |
376
+ |---|---|---|
377
+ | Sequential process | Flowchart (LR) | Mermaid |
378
+ | Decision logic | Flowchart (TD) with diamonds | Mermaid |
379
+ | Company structure | Org chart | HTML/CSS or Mermaid graph TD |
380
+ | API / system interaction | Sequence diagram | Mermaid |
381
+ | User experience over time | Journey map | Mermaid |
382
+ | Lifecycle states | State diagram | Mermaid |
383
+ | Brainstorming / topic tree | Mind map | Mermaid |
384
+ | System architecture | C4 context/container | Mermaid |
385
+ | Recurring process | Cycle diagram | Custom SVG/CSS |
386
+ | Overlap / intersection | Venn diagram | Custom SVG |
387
+ | Cross-team process | Swim lane | CSS grid |
388
+
389
+ ## Diagram quality rules
390
+
391
+ - Maximum complexity per slide: 10 nodes or 10 messages. Beyond that, split into multiple slides.
392
+ - Every node label must be readable at 18pt equivalent.
393
+ - Use the accent color for the primary flow path. Use muted colors for secondary paths.
394
+ - Reveal complex diagrams in steps using `data-step` to build understanding progressively.
395
+ - Always title the diagram slide with an action title that states the insight, not just the topic. "Data flows through three services before reaching the user" not "System architecture."
@@ -0,0 +1,119 @@
1
+ ---
2
+ name: export
3
+ description: How to export slidenerds decks to PDF, PPTX, and Google Slides
4
+ ---
5
+
6
+ # Export skill
7
+
8
+ How to run exports and what to expect from each format.
9
+
10
+ ## Running exports
11
+
12
+ ```bash
13
+ # PDF (best fidelity)
14
+ npx slidenerds export --pdf
15
+
16
+ # PowerPoint
17
+ npx slidenerds export --pptx
18
+
19
+ # Google Slides
20
+ npx slidenerds export --gslides
21
+
22
+ # Custom dev server URL
23
+ npx slidenerds export --pdf --url http://localhost:3001
24
+ ```
25
+
26
+ Export runs locally. The dev server must be running (`npm run dev`). The CLI loads the page in a headless browser and captures each slide.
27
+
28
+ ## PDF export
29
+
30
+ PDF produces the highest-fidelity output. What works and what doesn't:
31
+
32
+ ### Works well
33
+
34
+ - All Tailwind CSS (flexbox, grid, colors, typography, spacing)
35
+ - SVG graphics
36
+ - Recharts charts (they render as SVG)
37
+ - Images (JPEG, PNG, WebP)
38
+ - CSS gradients
39
+ - Border radius, box shadows
40
+ - Custom fonts (if loaded before the snapshot)
41
+
42
+ ### Breaks or degrades
43
+
44
+ - `backdrop-filter` (blur, brightness) -- not supported in print rendering
45
+ - Complex `mix-blend-mode` -- inconsistent across PDF renderers
46
+ - CSS `animation` with `infinite` -- creates a moving target; the snapshot captures a random frame
47
+ - `position: fixed` elements -- they may repeat on every page or disappear
48
+ - Video embeds -- captured as a blank rectangle
49
+ - `overflow: scroll` -- the scrollable area is captured at its current scroll position only
50
+
51
+ ### Design for clean PDF export
52
+
53
+ - Use solid backgrounds instead of backdrop-filter blur
54
+ - Avoid infinite animations; use transitions that settle to a final state
55
+ - Test with `npx slidenerds export --pdf` early, not just before the deadline
56
+
57
+ ## PowerPoint export
58
+
59
+ PPTX conversion is more lossy than PDF. Expectations:
60
+
61
+ ### What survives
62
+
63
+ - Text content and basic formatting (bold, italic, font size)
64
+ - Simple layouts (centered, left-aligned)
65
+ - Images
66
+ - Basic colors
67
+
68
+ ### What doesn't survive
69
+
70
+ - Complex CSS layouts (grid, flexbox alignment may shift)
71
+ - CSS transitions and animations (static snapshot only)
72
+ - Custom fonts (PowerPoint substitutes with system fonts unless embedded)
73
+ - SVG graphics (rasterized, may lose quality)
74
+ - Tailwind utility classes (converted to inline styles, some may be lost)
75
+
76
+ ### Tips for PPTX-friendly slides
77
+
78
+ - Prefer simple, centered layouts
79
+ - Use standard fonts that exist on most systems
80
+ - Avoid complex grid arrangements
81
+ - Test with PPTX export if the audience needs to edit in PowerPoint
82
+
83
+ ## Google Slides export
84
+
85
+ The most lossy of the three. Google Slides has the most limited rendering engine.
86
+
87
+ ### Expectations
88
+
89
+ - Text and basic formatting transfer
90
+ - Images transfer
91
+ - Complex layouts are flattened or rearranged
92
+ - Custom fonts replaced with Google Fonts alternatives
93
+ - No animation of any kind
94
+ - Tables may lose formatting
95
+
96
+ ### When to use Google Slides export
97
+
98
+ - When the audience needs to collaborate on the deck in Google Workspace
99
+ - When the deck will be edited by non-technical team members
100
+ - Accept that the exported deck is a starting point, not a final product
101
+
102
+ ## The runtime export API
103
+
104
+ The runtime exposes `window.slidenerds.export()` for programmatic export:
105
+
106
+ ```ts
107
+ window.slidenerds.export({ format: 'pdf' })
108
+ window.slidenerds.export({ format: 'pptx' })
109
+ window.slidenerds.export({ format: 'gslides' })
110
+ ```
111
+
112
+ The CLI calls this API under the hood via Puppeteer. You don't need to call it directly unless building custom export tooling.
113
+
114
+ ## General export advice
115
+
116
+ 1. **Design for the most restrictive format you need.** If you need Google Slides output, keep layouts simple from the start.
117
+ 2. **Test exports early.** Don't wait until the day of the presentation to discover that your fancy backdrop-filter doesn't render in PDF.
118
+ 3. **PDF is almost always good enough.** Most presentation scenarios accept PDF. Only export to PPTX or Google Slides when the audience specifically needs to edit the deck.
119
+ 4. **Progressive reveals become static.** All `data-step` elements are visible in exported formats. Design slides that still make sense when all content is visible at once.