@ztffn/presentation-generator-plugin 1.0.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/.claude-plugin/plugin.json +10 -0
- package/.github/workflows/publish.yml +59 -0
- package/README.md +161 -0
- package/agents/presentation-content.md +34 -0
- package/agents/presentation-design.md +56 -0
- package/agents/presentation-narrative.md +62 -0
- package/bin/index.js +229 -0
- package/package.json +27 -0
- package/skills/presentation-generator/SKILL.md +190 -0
- package/skills/presentation-generator/examples/pitch-reference.json +155 -0
- package/skills/presentation-generator/examples/presentation-guide.md +314 -0
- package/skills/presentation-generator/narrative/content-signals.md +178 -0
- package/skills/presentation-generator/narrative/frameworks.md +234 -0
- package/skills/presentation-generator/narrative/graph-topology.md +185 -0
- package/skills/presentation-generator/narrative/slide-content.md +193 -0
- package/skills/presentation-generator/system/edge-conventions.md +92 -0
- package/skills/presentation-generator/system/layout-templates.md +310 -0
- package/skills/presentation-generator/system/node-schema.md +130 -0
- package/skills/presentation-generator/system/positioning.md +84 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# Slide Content Quality Guide
|
|
2
|
+
|
|
3
|
+
How to write individual slide content at a high quality level.
|
|
4
|
+
No layout, design, or slide-type references — narrative quality only.
|
|
5
|
+
|
|
6
|
+
## Density Rules
|
|
7
|
+
|
|
8
|
+
**One key message per slide.** Supporting points add depth to that message, not new messages.
|
|
9
|
+
|
|
10
|
+
- If a slide has two competing claims, split it into two slides
|
|
11
|
+
- If removing a bullet doesn't weaken the key message, remove it
|
|
12
|
+
- If the audience can't state what the slide was about in one sentence, it's too dense
|
|
13
|
+
|
|
14
|
+
## The One Thing
|
|
15
|
+
|
|
16
|
+
Before writing any slide content, name the one thing the audience should remember from this slide. Every bullet, every data point, every quote must support that one thing — or it gets cut. If you can't state it in a single sentence, the slide has two messages and needs to be two slides.
|
|
17
|
+
|
|
18
|
+
## Assertion-Evidence Structure
|
|
19
|
+
|
|
20
|
+
The strongest slides pair an assertion (the headline) with evidence that proves it — not more assertions in bullet form. Evidence is visual: a chart, a comparison, a quote, a number with context. It does not repeat the headline in text.
|
|
21
|
+
|
|
22
|
+
**Weak — assertion + more assertions:**
|
|
23
|
+
Title: "Our platform is faster and cheaper"
|
|
24
|
+
- Response time improved significantly
|
|
25
|
+
- Infrastructure costs decreased
|
|
26
|
+
- Customer satisfaction increased
|
|
27
|
+
|
|
28
|
+
**Strong — assertion + evidence:**
|
|
29
|
+
Headline: "Response time dropped 60% — infrastructure cost followed"
|
|
30
|
+
[Chart: response time and monthly cost, both declining over 6 months]
|
|
31
|
+
|
|
32
|
+
When evidence is visual, your spoken narration explains what it means instead of reading bullets aloud.
|
|
33
|
+
|
|
34
|
+
## Spoken vs. Shown
|
|
35
|
+
|
|
36
|
+
| Show on Slide | Speak Aloud |
|
|
37
|
+
|---|---|
|
|
38
|
+
| Headline claim | Why it matters to this specific audience |
|
|
39
|
+
| Visual evidence | Interpretation — what the data means |
|
|
40
|
+
| Specific numbers | The story behind the number |
|
|
41
|
+
| Call to action | The stakes of not acting |
|
|
42
|
+
| Navigation cue (notes) | Anticipated objections and how to handle them |
|
|
43
|
+
|
|
44
|
+
The most common failure: slides containing everything the presenter plans to say. If the audience can read it, they will — and they'll tune out while the presenter catches up. Slides are visual anchors for a spoken argument, not scripts.
|
|
45
|
+
|
|
46
|
+
## Titles vs. Headlines
|
|
47
|
+
|
|
48
|
+
**Titles are labels.** They name the topic.
|
|
49
|
+
**Headlines make claims.** They tell the audience what to think.
|
|
50
|
+
|
|
51
|
+
| Title (weak) | Headline (strong) |
|
|
52
|
+
|---|---|
|
|
53
|
+
| "Market Overview" | "The market has shifted to outcome-based pricing" |
|
|
54
|
+
| "Our Technology" | "One integration replaces three legacy systems" |
|
|
55
|
+
| "Q3 Results" | "Q3 revenue exceeded forecast by 18%" |
|
|
56
|
+
| "Team" | "12 engineers with 200+ years of combined industrial experience" |
|
|
57
|
+
|
|
58
|
+
Use headlines on the spine (main flow). Titles are acceptable on drill-down detail slides where the parent headline provides context.
|
|
59
|
+
|
|
60
|
+
## Speaker Notes
|
|
61
|
+
|
|
62
|
+
Notes should add context the presenter says aloud, not repeat what's on screen.
|
|
63
|
+
|
|
64
|
+
**Bad notes (repetition):**
|
|
65
|
+
> "This slide shows our Q3 results. Revenue was $8.2M."
|
|
66
|
+
|
|
67
|
+
**Good notes (context):**
|
|
68
|
+
> "Pause here if the audience asks about regional breakdown — the drill-down below has that data. Key talking point: the Oslo pilot drove 40% of Q3 growth."
|
|
69
|
+
|
|
70
|
+
Notes should include:
|
|
71
|
+
- Talking points not on the slide
|
|
72
|
+
- Audience-specific framing ("For technical audiences, emphasize...")
|
|
73
|
+
- Anticipated questions and how to handle them
|
|
74
|
+
- Transition language to the next slide
|
|
75
|
+
- Time guidance ("Spend max 2 minutes here")
|
|
76
|
+
|
|
77
|
+
## When to Use Comparison
|
|
78
|
+
|
|
79
|
+
Use comparison (two sides of the same question) when:
|
|
80
|
+
- There is a clear before/after contrast
|
|
81
|
+
- Two approaches are being weighed
|
|
82
|
+
- The audience needs to see a trade-off
|
|
83
|
+
- A competitive positioning argument needs visual clarity
|
|
84
|
+
|
|
85
|
+
Do not force comparison when there is no natural duality.
|
|
86
|
+
|
|
87
|
+
## When Content Warrants a Drill-Down
|
|
88
|
+
|
|
89
|
+
Content belongs on a drill-down (vertical branch) when:
|
|
90
|
+
- It supports the spine message but isn't essential to the main story arc
|
|
91
|
+
- It answers "how?" or "why?" in more detail than the spine needs
|
|
92
|
+
- It is evidence or data that a skeptical audience may want to inspect
|
|
93
|
+
- It addresses a specific objection or concern
|
|
94
|
+
- It is technical detail for a technical sub-audience
|
|
95
|
+
|
|
96
|
+
Content stays on the spine when:
|
|
97
|
+
- Removing it would break the narrative logic
|
|
98
|
+
- The audience needs to see it to understand the next spine node
|
|
99
|
+
- It is the key message itself, not supporting evidence
|
|
100
|
+
|
|
101
|
+
## Framing Data as Story
|
|
102
|
+
|
|
103
|
+
Data on a slide must be framed — the audience should know what the number means, not just what the number is.
|
|
104
|
+
|
|
105
|
+
**Number without frame:**
|
|
106
|
+
> "40% reduction"
|
|
107
|
+
|
|
108
|
+
**Number with frame:**
|
|
109
|
+
> "40% reduction — enough to pay back the installation cost in 14 months"
|
|
110
|
+
|
|
111
|
+
**Framing pattern:** State the metric, then immediately state what it means for the audience. Use "enough to...", "which means...", "equivalent to...", or "compared to..." as connectors.
|
|
112
|
+
|
|
113
|
+
## Content Ordering Within a Slide
|
|
114
|
+
|
|
115
|
+
1. **Headline** — the claim this slide makes
|
|
116
|
+
2. **Context** — one sentence of setup if the headline isn't self-evident
|
|
117
|
+
3. **Evidence** — bullets, data, or quotes that support the headline
|
|
118
|
+
4. **Implication** — what this means for the audience (optional — sometimes the headline is the implication)
|
|
119
|
+
|
|
120
|
+
## Transition Thinking
|
|
121
|
+
|
|
122
|
+
Each slide should have an implicit connection to the next. The narrative agent should include a brief transition note in the outline indicating how each slide leads to the next.
|
|
123
|
+
|
|
124
|
+
- "This problem creates an opportunity for..."
|
|
125
|
+
- "Having seen the evidence, the question becomes..."
|
|
126
|
+
- "With this foundation in place, we can now show..."
|
|
127
|
+
|
|
128
|
+
## What Is vs. What Could Be
|
|
129
|
+
|
|
130
|
+
The most persuasive presentations alternate between the current reality and the possible future, repeatedly widening the gap between them. Each cycle deepens the audience's investment before the solution arrives.
|
|
131
|
+
|
|
132
|
+
1. **What is:** The current state — the friction, cost, or missed opportunity the audience recognizes
|
|
133
|
+
2. **What could be:** What changes if the problem is solved — specific, concrete, desirable
|
|
134
|
+
3. **Repeat:** Each spine node can echo this cycle before the solution appears
|
|
135
|
+
4. **Close with new bliss:** The final slides show the world after adoption — not just the product
|
|
136
|
+
|
|
137
|
+
The audience should feel the gap before they hear the answer. A problem slide without a vivid "what could be" creates intellectual understanding but not urgency. The tension between the two states is what motivates action.
|
|
138
|
+
|
|
139
|
+
## Principles from Expert Practice
|
|
140
|
+
|
|
141
|
+
These complement the quality rules above. Apply them when writing any slide content.
|
|
142
|
+
|
|
143
|
+
**Lead with a named shift, not a pain.** The strongest problem slides don't just describe a pain — they name a change in the world that makes the old approach obsolete. "Managing inventory is difficult" is a pain. "Same-day delivery expectations have made batch inventory management structurally incompatible with customer demands" is a named shift. The shift creates urgency the pain does not.
|
|
144
|
+
|
|
145
|
+
**The audience is the hero.** Slides should speak to "your situation," "your team," "your outcome" — not "our product" — until evidence has been established. Position the presenter as a guide providing tools, not as the protagonist of the story. (Mike Maples Jr: "Your job is to be Obi-Wan, not Luke.")
|
|
146
|
+
|
|
147
|
+
**Establish stakes in the first substantive slide.** The audience must know what's at risk within 60 seconds of the opening. If the cost of inaction isn't clear on the problem slide, the rest of the presentation is solving a problem they don't yet believe they have. (Matthew Dicks: "We have to be worried about something.")
|
|
148
|
+
|
|
149
|
+
**Answer "why now?"** Whatever problem you lead with, state why it is acute *at this moment* — a technology shift, a cost inflection, a regulatory change, a market move. Without it, the audience files the problem as "interesting" rather than "urgent." One sentence is enough.
|
|
150
|
+
|
|
151
|
+
**Make the key message citable.** Every headline should be repeatable in a hallway conversation after the meeting. If an executive can't paraphrase it in one sentence without looking at the slide, the claim isn't sharp enough. (Yuhki Yamashata: "You know you've done your job when an exec cites your insight in a meeting without prompting.")
|
|
152
|
+
|
|
153
|
+
## Before/After: Worked Rewrite
|
|
154
|
+
|
|
155
|
+
Same content, different quality. Study what changed and why.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
**BEFORE (weak)**
|
|
160
|
+
|
|
161
|
+
*Title:* The Problem
|
|
162
|
+
|
|
163
|
+
*Content:*
|
|
164
|
+
- Companies struggle with managing data across multiple systems
|
|
165
|
+
- Current tools are inefficient and time-consuming
|
|
166
|
+
- Teams waste hours on manual processes
|
|
167
|
+
|
|
168
|
+
*Speaker notes:* "This slide explains the problem we're solving."
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
**AFTER (strong)**
|
|
173
|
+
|
|
174
|
+
*Headline:* Mid-market finance teams lose 11 hours a week reconciling what three systems can't agree on
|
|
175
|
+
|
|
176
|
+
*Content:*
|
|
177
|
+
- Finance: 3 hours/week merging exports from ERP, CRM, and billing into one spreadsheet
|
|
178
|
+
- Operations: 4 hours/week chasing approval chains across email and Slack
|
|
179
|
+
- Leadership: 4 hours/week rebuilding reports that were accurate yesterday but not today
|
|
180
|
+
→ Every one of these hours disappears when systems share a single live record
|
|
181
|
+
|
|
182
|
+
*Speaker notes:* "Pause after the headline. Let the number land — if anyone nods, they're your champion in the room. The '11 hours' anchors the cost before anything about the product has been shown. If someone pushes back ('we solved this with Salesforce'), the drill-down below has the integration story. Spend no more than 2 minutes here; the goal is recognition, not proof."
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
**What changed:**
|
|
187
|
+
|
|
188
|
+
| Element | Before | After |
|
|
189
|
+
|---|---|---|
|
|
190
|
+
| Title | Topic label ("The Problem") | Specific, quantified claim |
|
|
191
|
+
| Bullets | Generic descriptions | Named roles with concrete hour counts |
|
|
192
|
+
| Implication | Absent | Explicit (→ connector) |
|
|
193
|
+
| Speaker notes | Repetition of screen content | Anticipation, objection routing, time guidance |
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Edge Conventions
|
|
2
|
+
|
|
3
|
+
Authoritative reference for wiring navigation edges in the presentation graph.
|
|
4
|
+
Edges define valid navigation paths — without correct edges, arrow keys won't work.
|
|
5
|
+
|
|
6
|
+
## Handle IDs
|
|
7
|
+
|
|
8
|
+
Eight handle IDs exist, four source and four target:
|
|
9
|
+
|
|
10
|
+
| Handle ID | Type | Position | Navigation |
|
|
11
|
+
|---|---|---|---|
|
|
12
|
+
| `s-right` | source | Right side | Pressing **right arrow** follows this edge |
|
|
13
|
+
| `s-left` | source | Left side | Pressing **left arrow** follows this edge |
|
|
14
|
+
| `s-bottom` | source | Bottom | Pressing **down arrow** follows this edge |
|
|
15
|
+
| `s-top` | source | Top | Pressing **up arrow** follows this edge |
|
|
16
|
+
| `t-right` | target | Right side | Arrived via **left arrow** from source |
|
|
17
|
+
| `t-left` | target | Left side | Arrived via **right arrow** from source |
|
|
18
|
+
| `t-bottom` | target | Bottom | Arrived via **up arrow** from source |
|
|
19
|
+
| `t-top` | target | Top | Arrived via **down arrow** from source |
|
|
20
|
+
|
|
21
|
+
## Bidirectional Pair Rule
|
|
22
|
+
|
|
23
|
+
**Every navigation edge must have a return edge** with swapped source/target and swapped handles.
|
|
24
|
+
|
|
25
|
+
If the user can press right to go from A to B, they must be able to press left to go from B back to A.
|
|
26
|
+
|
|
27
|
+
## Standard Edge Pairs
|
|
28
|
+
|
|
29
|
+
### Horizontal Forward/Back (Spine Navigation)
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{ "id": "e-a-b", "source": "a", "target": "b", "sourceHandle": "s-right", "targetHandle": "t-left" }
|
|
33
|
+
{ "id": "e-b-a", "source": "b", "target": "a", "sourceHandle": "s-left", "targetHandle": "t-right" }
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
A → (right) → B and B → (left) → A
|
|
37
|
+
|
|
38
|
+
### Drill-Down / Return-to-Parent
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
{ "id": "e-parent-child", "source": "parent", "target": "child", "sourceHandle": "s-bottom", "targetHandle": "t-top" }
|
|
42
|
+
{ "id": "e-child-parent", "source": "child", "target": "parent", "sourceHandle": "s-top", "targetHandle": "t-bottom" }
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Parent → (down) → Child and Child → (up) → Parent
|
|
46
|
+
|
|
47
|
+
### Horizontal Within a Drill-Down Branch
|
|
48
|
+
|
|
49
|
+
Siblings within a drill-down branch use the same horizontal pattern:
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{ "id": "e-child1-child2", "source": "child1", "target": "child2", "sourceHandle": "s-right", "targetHandle": "t-left" }
|
|
53
|
+
{ "id": "e-child2-child1", "source": "child2", "target": "child1", "sourceHandle": "s-left", "targetHandle": "t-right" }
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Edge ID Convention
|
|
57
|
+
|
|
58
|
+
Use descriptive hyphenated strings:
|
|
59
|
+
|
|
60
|
+
- `e-cover-problem` — cover to problem
|
|
61
|
+
- `e-problem-cover` — problem back to cover
|
|
62
|
+
- `e-problem-detail` — problem drill-down to detail
|
|
63
|
+
- `e-detail-problem` — detail return to problem
|
|
64
|
+
|
|
65
|
+
Pattern: `e-{source}-{target}` using the node IDs or abbreviated forms.
|
|
66
|
+
|
|
67
|
+
## Validation Checklist
|
|
68
|
+
|
|
69
|
+
Run this checklist before writing the final JSON:
|
|
70
|
+
|
|
71
|
+
1. **Every node has at least one outgoing edge** — no dead ends
|
|
72
|
+
2. **Every forward edge has a paired return edge** — source/target swapped, handles swapped
|
|
73
|
+
3. **All handle IDs are from the valid set** — only the 8 IDs listed above
|
|
74
|
+
4. **Source handles start with `s-`** and target handles start with `t-`
|
|
75
|
+
5. **The first spine node has no incoming `s-right` edge** — it's the leftmost entry point
|
|
76
|
+
6. **The last spine node has no outgoing `s-right` edge** (or loops back to cover)
|
|
77
|
+
7. **Drill-down children always have `s-top`/`t-bottom` return edge to parent**
|
|
78
|
+
8. **No duplicate edge IDs**
|
|
79
|
+
|
|
80
|
+
## Edge Object Structure
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"id": "e-cover-problem",
|
|
85
|
+
"source": "cover",
|
|
86
|
+
"target": "problem",
|
|
87
|
+
"sourceHandle": "s-right",
|
|
88
|
+
"targetHandle": "t-left"
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
All four fields (`source`, `target`, `sourceHandle`, `targetHandle`) are required. Edges without explicit handles will have direction inferred from node positions, but this is a fallback — always set handles explicitly.
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
# Layout Templates & Design Decisions
|
|
2
|
+
|
|
3
|
+
Decision guide for the design agent. Maps content signals from the slide outline
|
|
4
|
+
to the correct visual treatment in the graph JSON.
|
|
5
|
+
|
|
6
|
+
## Slide Type Selection
|
|
7
|
+
|
|
8
|
+
| Content Signal | `type` | Key Fields |
|
|
9
|
+
|---|---|---|
|
|
10
|
+
| Standard text, bullets, headings | `"content"` (default) | `content`, `layout` |
|
|
11
|
+
| Full-viewport data visualization | `"chart"` | `chart` (ChartConfig) |
|
|
12
|
+
| Interactive 3D scene | `"r3f"` | `scene` (R3FSceneConfig) |
|
|
13
|
+
|
|
14
|
+
Most slides are `"content"`. Use `"chart"` or `"r3f"` only when the content is primarily a visualization.
|
|
15
|
+
|
|
16
|
+
## Layout Decisions
|
|
17
|
+
|
|
18
|
+
### When to Use `two-column`
|
|
19
|
+
|
|
20
|
+
Set `layout: "two-column"` and split content on `---` when:
|
|
21
|
+
|
|
22
|
+
- **Comparison:** before/after, old/new, us/them
|
|
23
|
+
- **Pros/cons:** advantages on left, considerations on right
|
|
24
|
+
- **Text + chart:** explanation on left, `[chart:name]` on right
|
|
25
|
+
- **Text + media:** bullets on left, `` on right
|
|
26
|
+
- **Dual evidence:** two independent supporting points side by side
|
|
27
|
+
|
|
28
|
+
Do not force two-column when content is naturally sequential.
|
|
29
|
+
|
|
30
|
+
### When to Center
|
|
31
|
+
|
|
32
|
+
Set `centered: true` for:
|
|
33
|
+
|
|
34
|
+
- **Cover slides:** Title + subtitle, branded
|
|
35
|
+
- **Call-to-action slides:** Single message, end of presentation
|
|
36
|
+
- **Single-message impact slides:** One powerful statement or quote
|
|
37
|
+
- **Transition slides:** Brief pause between major sections
|
|
38
|
+
|
|
39
|
+
Set `centered: false` for:
|
|
40
|
+
|
|
41
|
+
- **Content-heavy slides:** Bullets, tables, code, multiple paragraphs
|
|
42
|
+
- **Data slides:** Charts with explanatory text
|
|
43
|
+
- **Comparison slides:** Two-column layouts
|
|
44
|
+
|
|
45
|
+
### When to Use Brand Font
|
|
46
|
+
|
|
47
|
+
Set `brandFont: true` for:
|
|
48
|
+
|
|
49
|
+
- Cover slide (first slide)
|
|
50
|
+
- Closing/CTA slide (last slide)
|
|
51
|
+
- High-impact single-message slides
|
|
52
|
+
|
|
53
|
+
Do not use on content-heavy or data slides — brand fonts are display fonts, not body fonts.
|
|
54
|
+
|
|
55
|
+
### When to Show Branding
|
|
56
|
+
|
|
57
|
+
Set `showBranding: true` and `brandingText: "huma.energy"` (or client name) for:
|
|
58
|
+
|
|
59
|
+
- Cover slide
|
|
60
|
+
- Closing slide
|
|
61
|
+
- Any slide where the audience might screenshot or reference later
|
|
62
|
+
|
|
63
|
+
Default is `true`, so only set `showBranding: false` for immersive slides (R3F, full-bleed video) where the overlay is distracting.
|
|
64
|
+
|
|
65
|
+
## Background Treatment
|
|
66
|
+
|
|
67
|
+
### Background Image
|
|
68
|
+
|
|
69
|
+
Use `backgroundImage` when the outline indicates:
|
|
70
|
+
- A mood or atmosphere for a section opener
|
|
71
|
+
- Visual evidence (photo of a product, facility, or result)
|
|
72
|
+
- Impact slide where imagery reinforces the message
|
|
73
|
+
|
|
74
|
+
Set `backgroundImageOverlay: true` and `lightText: true` when text appears over the image.
|
|
75
|
+
|
|
76
|
+
**Image sourcing:** Use external URLs directly. Unsplash with query params works well:
|
|
77
|
+
```
|
|
78
|
+
https://images.unsplash.com/photo-XXXXX?w=1920&q=80
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Background Video
|
|
82
|
+
|
|
83
|
+
Use `backgroundVideo` for cinematic section openers or demo context.
|
|
84
|
+
|
|
85
|
+
**Video sourcing is deferred.** For any slide requiring background video:
|
|
86
|
+
1. Set `backgroundVideo` to a placeholder: `"PLACEHOLDER: [description of needed video]"`
|
|
87
|
+
2. Set `backgroundVideoFit: "cover"` and `backgroundVideoLoop: true`
|
|
88
|
+
3. Add the slide title to the delivery summary for manual upload
|
|
89
|
+
|
|
90
|
+
### Inline Video
|
|
91
|
+
|
|
92
|
+
For videos embedded in slide content (via `` in markdown):
|
|
93
|
+
1. Set the URL to a placeholder: `"PLACEHOLDER: [description]"`
|
|
94
|
+
2. Configure `inlineVideoControls`, `inlineVideoAutoplay`, `inlineVideoLoop` as appropriate
|
|
95
|
+
3. Add to delivery summary
|
|
96
|
+
|
|
97
|
+
### Text Contrast
|
|
98
|
+
|
|
99
|
+
Set `lightText: true` whenever the background is dark:
|
|
100
|
+
- Dark `style.backgroundColor`
|
|
101
|
+
- `backgroundImage` with `backgroundImageOverlay: true`
|
|
102
|
+
- `backgroundVideo` slides
|
|
103
|
+
- `type: "r3f"` with dark scene background
|
|
104
|
+
|
|
105
|
+
## Chart Decisions
|
|
106
|
+
|
|
107
|
+
### Full-Viewport Chart (`type: "chart"`)
|
|
108
|
+
|
|
109
|
+
Use when the data IS the slide — the chart is the primary message, not supporting evidence.
|
|
110
|
+
|
|
111
|
+
```json
|
|
112
|
+
{
|
|
113
|
+
"type": "chart",
|
|
114
|
+
"chart": {
|
|
115
|
+
"chartType": "bar",
|
|
116
|
+
"data": [...],
|
|
117
|
+
"config": { "xKey": "quarter", "yKeys": ["revenue", "cost"], "showGrid": true, "showLegend": true }
|
|
118
|
+
},
|
|
119
|
+
"content": "Optional caption below the chart"
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Inline Chart (`[chart:name]` in content)
|
|
124
|
+
|
|
125
|
+
Use when data supports a text argument — the chart is evidence, not the headline.
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{
|
|
129
|
+
"content": "## Why this approach wins\n\n[chart:comparison]\n\nAdapt to the audience. Deliver with confidence.",
|
|
130
|
+
"charts": {
|
|
131
|
+
"comparison": {
|
|
132
|
+
"chartType": "radar",
|
|
133
|
+
"data": [...],
|
|
134
|
+
"config": { "xKey": "axis", "yKeys": ["ours", "theirs"], "showLegend": true }
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Chart Title Rule
|
|
141
|
+
|
|
142
|
+
A chart's `label` field states the insight, not the data category. The audience should understand your point before reading the chart.
|
|
143
|
+
|
|
144
|
+
| Weak (category label) | Strong (insight claim) |
|
|
145
|
+
|---|---|
|
|
146
|
+
| "Revenue Data" | "Revenue grew 40% QoQ after the pricing change" |
|
|
147
|
+
| "Response Time" | "Response time dropped 60% after caching rollout" |
|
|
148
|
+
| "User Growth" | "1M users in 6 months — 2× ahead of plan" |
|
|
149
|
+
|
|
150
|
+
The label is your assertion. The chart is your evidence.
|
|
151
|
+
|
|
152
|
+
### Chart Type Selection
|
|
153
|
+
|
|
154
|
+
| Data Pattern | Chart Type |
|
|
155
|
+
|---|---|
|
|
156
|
+
| Trend over time | `"line"` or `"area"` |
|
|
157
|
+
| Category comparison | `"bar"` |
|
|
158
|
+
| Multi-axis comparison | `"radar"` |
|
|
159
|
+
| Part-of-whole | `"pie"` |
|
|
160
|
+
| Volume trend | `"area"` |
|
|
161
|
+
|
|
162
|
+
## R3F Scene Decisions
|
|
163
|
+
|
|
164
|
+
Use `type: "r3f"` when the outline calls for a 3D demo or visual impact.
|
|
165
|
+
|
|
166
|
+
Available scenes:
|
|
167
|
+
- `"rotating-cube"` — interactive cube, good for tech demos. Set `scene.controls: true`.
|
|
168
|
+
- `"particle-field"` — atmospheric particle cloud. Set `scene.controls: false`.
|
|
169
|
+
|
|
170
|
+
Always set `lightText: true` for R3F slides (dark backgrounds). Content renders as an overlay on top of the 3D scene.
|
|
171
|
+
|
|
172
|
+
## Topic Badge Conventions
|
|
173
|
+
|
|
174
|
+
Use `topic` to group slides by section. Format: `"NN / Section Name"` for numbered sections:
|
|
175
|
+
|
|
176
|
+
- `"01 / Problem"`
|
|
177
|
+
- `"02 / Solution"`
|
|
178
|
+
- `"03 / Value"`
|
|
179
|
+
- `"04 / Evidence"`
|
|
180
|
+
|
|
181
|
+
Or plain text for non-numbered groupings: `"Huma Showcase"`, `"Technical Deep Dive"`.
|
|
182
|
+
|
|
183
|
+
## Slide Recipes
|
|
184
|
+
|
|
185
|
+
Complete `data` field patterns for common pitch slide types. Combine with `node-schema.md` for the full field reference.
|
|
186
|
+
|
|
187
|
+
### Cover / Call to Action
|
|
188
|
+
|
|
189
|
+
Cover = first spine node. CTA = last. Both: centered, branded, no bullets. The only difference is the label and content.
|
|
190
|
+
|
|
191
|
+
```json
|
|
192
|
+
{
|
|
193
|
+
"label": "[Title or Ask]",
|
|
194
|
+
"topic": "[Company or Meeting Context]",
|
|
195
|
+
"content": "One sentence: what this is and for whom. (Cover) — or — what happens next and when. (CTA)",
|
|
196
|
+
"centered": true,
|
|
197
|
+
"brandFont": true,
|
|
198
|
+
"showBranding": true,
|
|
199
|
+
"brandingText": "[company.domain]"
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Standard Bullets — Workhorse
|
|
204
|
+
|
|
205
|
+
Default for problem, solution, evidence, and detail nodes.
|
|
206
|
+
|
|
207
|
+
```json
|
|
208
|
+
{
|
|
209
|
+
"label": "Headline claim that makes the point",
|
|
210
|
+
"topic": "01 / Problem",
|
|
211
|
+
"content": "## Headline claim in one sentence\n\n- Specific point with a number or named entity\n- Second point — consequence or contrast\n- Third point — the implication\n\nClosing sentence bridging to the next slide.",
|
|
212
|
+
"notes": "Talking point not on screen. Objection signal: 'If they ask X, navigate to [node-id].' Time: 2 minutes max.",
|
|
213
|
+
"centered": false
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Impact Statement
|
|
218
|
+
|
|
219
|
+
Single message, no bullets. Use for named shifts, "why now" openers, or bold claims that stand alone.
|
|
220
|
+
|
|
221
|
+
```json
|
|
222
|
+
{
|
|
223
|
+
"label": "The Shift",
|
|
224
|
+
"topic": "01 / Problem",
|
|
225
|
+
"content": "The market has permanently changed.\n\n**Batch scheduling is structurally incompatible with same-day delivery expectations.**",
|
|
226
|
+
"notes": "Pause. Do not advance immediately. If the room agrees, the rest is inevitable.",
|
|
227
|
+
"centered": true
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Two-Column Comparison
|
|
232
|
+
|
|
233
|
+
Before/after, us/them, or two parallel arguments. Content splits on `---`; left column renders first.
|
|
234
|
+
|
|
235
|
+
```json
|
|
236
|
+
{
|
|
237
|
+
"label": "Old Way vs. New Way",
|
|
238
|
+
"topic": "02 / Solution",
|
|
239
|
+
"content": "## Today\n- 3 systems, no shared state\n- 11 hours/week reconciling exports\n- Reports are always one day stale\n\n---\n\n## With [Product]\n- Single live record across all systems\n- Reports update in real time\n- Finance, ops, and leadership see the same data",
|
|
240
|
+
"layout": "two-column",
|
|
241
|
+
"centered": false
|
|
242
|
+
}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Text + Inline Chart
|
|
246
|
+
|
|
247
|
+
Text on left makes the claim; chart on right is the evidence. Chart is supporting, not the headline.
|
|
248
|
+
|
|
249
|
+
```json
|
|
250
|
+
{
|
|
251
|
+
"label": "The Data Confirms It",
|
|
252
|
+
"topic": "03 / Evidence",
|
|
253
|
+
"content": "## Continuous monitoring outperforms batch on every metric\n\nThree field studies. Same result each time.\n\n---\n\n[chart:comparison]",
|
|
254
|
+
"charts": {
|
|
255
|
+
"comparison": {
|
|
256
|
+
"chartType": "bar",
|
|
257
|
+
"data": [{ "metric": "Uptime %", "ours": 98.2, "baseline": 91.5 }],
|
|
258
|
+
"config": { "xKey": "metric", "yKeys": ["ours", "baseline"], "showGrid": true, "showLegend": true }
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
"layout": "two-column",
|
|
262
|
+
"centered": false
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### Proof Point — Customer Quote
|
|
267
|
+
|
|
268
|
+
Named case study or customer quote. Blockquote (`>`) renders as a styled pull quote — lead with it before the numbers.
|
|
269
|
+
|
|
270
|
+
```json
|
|
271
|
+
{
|
|
272
|
+
"label": "Summit Health: Year One",
|
|
273
|
+
"topic": "04 / Proof",
|
|
274
|
+
"content": "## 2.3 hours of admin time eliminated per nurse per shift\n\n> \"The conflicts surfaced automatically — we'd been creating them for years without knowing it.\"\n> — VP Operations, Summit Health (42 facilities)\n\n- 38% reduction in shift coverage failures\n- Full rollout across 6 units in 11 weeks",
|
|
275
|
+
"notes": "If they ask about rollout timeline, the drill-down below has the full breakdown.",
|
|
276
|
+
"centered": false
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Section Opener — Background Image
|
|
281
|
+
|
|
282
|
+
Spine node opening a new chapter. Sets atmosphere. Max 3 bullet points on an image slide.
|
|
283
|
+
|
|
284
|
+
```json
|
|
285
|
+
{
|
|
286
|
+
"label": "The Opportunity",
|
|
287
|
+
"topic": "03 / Opportunity",
|
|
288
|
+
"content": "## A $40B market with no dominant platform\n\nEvery competitor is solving scheduling.\nNobody is solving the coordination layer.",
|
|
289
|
+
"backgroundImage": "https://images.unsplash.com/photo-XXXXX?w=1920&q=80",
|
|
290
|
+
"backgroundImageFit": "cover",
|
|
291
|
+
"backgroundImageOverlay": true,
|
|
292
|
+
"lightText": true,
|
|
293
|
+
"centered": false
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
## Media Delivery Summary
|
|
298
|
+
|
|
299
|
+
After generating the JSON, list any slides with placeholder media:
|
|
300
|
+
|
|
301
|
+
```
|
|
302
|
+
Slides requiring manual media upload:
|
|
303
|
+
- "Cover" — background video: [description]
|
|
304
|
+
- "Demo" — inline video: [description]
|
|
305
|
+
|
|
306
|
+
Upload via POST /api/slide-images/upload (multipart/form-data, field: "file")
|
|
307
|
+
Returns { ok: true, key, url } — replace placeholder with returned url
|
|
308
|
+
Accepted: all image/*, video/mp4, video/webm, video/quicktime
|
|
309
|
+
Max size: 50MB
|
|
310
|
+
```
|