@opendirectory.dev/skills 0.1.53 → 0.1.55
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/package.json +1 -1
- package/registry.json +10 -0
- package/skills/brand-alchemy/README.md +1 -1
- package/skills/graphic-slide-deck/README.md +129 -0
- package/skills/graphic-slide-deck/SKILL.md +364 -0
- package/skills/graphic-slide-deck/evals/evals.json +35 -0
- package/skills/graphic-slide-deck/references/animation-guide.md +100 -0
- package/skills/graphic-slide-deck/references/design-system.md +165 -0
- package/skills/graphic-slide-deck/references/layout-library.md +446 -0
- package/skills/graphic-slide-deck/references/style-presets.md +314 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Slide Deck Design System
|
|
2
|
+
|
|
3
|
+
Premium slide design. Every deck should look considered and editorial -- not template output.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Design Philosophy
|
|
8
|
+
|
|
9
|
+
Slides are seen at 1920×1080 on a projector or 1080×1080 on a phone screen. The design must work at both extremes. Everything scales via `clamp()` -- no fixed sizes that break at non-standard viewports.
|
|
10
|
+
|
|
11
|
+
One rule above all others: **one loud slide per deck.** Every other slide is composed and quiet. The unmissable slide breaks that rhythm -- that contrast is what makes it work.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Typography Tokens
|
|
16
|
+
|
|
17
|
+
All values use `clamp()`. Never fixed px/rem on any element that scales.
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
Display (title-hero headline): clamp(2.5rem, 8vw, 6rem) | letter-spacing: -0.04em
|
|
21
|
+
Section heading (h2): clamp(1.75rem, 4vw, 3.5rem) | letter-spacing: -0.02em
|
|
22
|
+
Body text: clamp(0.875rem, 1.5vw, 1.125rem)
|
|
23
|
+
Stat number (stat-highlight): clamp(3.5rem, 12vw, 9rem) | font-weight: 700 or 900
|
|
24
|
+
Stat label (below number): clamp(0.7rem, 1.2vw, 1rem) | letter-spacing: 0.12em | uppercase
|
|
25
|
+
Quote text (quote-callout): clamp(1.25rem, 3vw, 2.25rem) | italic | display font
|
|
26
|
+
Caption / badge text: clamp(0.65rem, 1vw, 0.875rem) | letter-spacing: 0.12em | uppercase
|
|
27
|
+
Timeline label: clamp(0.75rem, 1.2vw, 1rem)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Weight contrast rule:**
|
|
31
|
+
Display font at 700-900 + body at 400 = correct pairing.
|
|
32
|
+
Body font on dark bg: use `#CCCCCC` or `#AAAAAA` -- never `#888888` (too low contrast on dark).
|
|
33
|
+
|
|
34
|
+
**Letter-spacing rules:**
|
|
35
|
+
- Very large display (6rem+): `-0.04em` (tighter = more authoritative)
|
|
36
|
+
- Section headings (3-3.5rem): `-0.02em`
|
|
37
|
+
- Stats and labels (uppercase small): `0.12em` minimum
|
|
38
|
+
- Body: `0` -- never add tracking to body text
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Spacing Rhythm
|
|
43
|
+
|
|
44
|
+
**Valid spacing values (slide scale):** 8 / 16 / 24 / 32 / 48 / 64 / 80 / 96px
|
|
45
|
+
|
|
46
|
+
Never use arbitrary values like 18px, 30px, 45px. They break visual rhythm.
|
|
47
|
+
|
|
48
|
+
Implemented via `clamp()`:
|
|
49
|
+
```
|
|
50
|
+
Slide padding: clamp(2rem, 5vw, 5rem) -- outer slide padding
|
|
51
|
+
Content gap: clamp(1rem, 2.5vw, 2.5rem) -- between major content blocks
|
|
52
|
+
Element gap: clamp(0.5rem, 1.5vw, 1.5rem) -- between list items, small elements
|
|
53
|
+
Column gap: clamp(1.5rem, 3vw, 4rem) -- between grid columns
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## The One Loud Slide Rule
|
|
59
|
+
|
|
60
|
+
Every deck must have exactly ONE slide with maximum visual intensity:
|
|
61
|
+
- Largest typography on that slide
|
|
62
|
+
- The style preset's signature element at full intensity
|
|
63
|
+
- The strongest animation (counter effect, staggered reveal, etc.)
|
|
64
|
+
- Maximum contrast with the surrounding slides
|
|
65
|
+
|
|
66
|
+
All other slides must be compositionally quieter -- structured, composed, predictable. The contrast is what makes the loud slide work. A deck where every slide is loud has no loud slides.
|
|
67
|
+
|
|
68
|
+
**What qualifies as the unmissable slide:**
|
|
69
|
+
- stat-highlight with metrics that fill the slide (numbers at `clamp(3.5rem, 12vw, 9rem)`)
|
|
70
|
+
- quote-callout with a devastating one-liner in Instrument Serif italic
|
|
71
|
+
- title-hero if the headline IS the entire story in 5 words
|
|
72
|
+
|
|
73
|
+
**What doesn't qualify:** A text-full slide with an extra bold heading.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Background as Atmosphere
|
|
78
|
+
|
|
79
|
+
Slide decks can use CSS-generated backgrounds. Email cannot -- slides can. These are first-class design choices:
|
|
80
|
+
|
|
81
|
+
- **Gradient mesh:** layered `radial-gradient()` blobs, different colors, overlapping
|
|
82
|
+
- **Grid pattern:** `linear-gradient()` + `background-size` creating grid lines (common in brutalist, product-minimal styles)
|
|
83
|
+
- **Noise texture:** inline SVG `<feTurbulence>` filter applied to a pseudo-element
|
|
84
|
+
- **Geometric accent:** large CSS shapes (circles, rectangles) at low opacity as background elements
|
|
85
|
+
|
|
86
|
+
Reference `frontend-slides/animation-patterns.md` for exact CSS snippets for each effect.
|
|
87
|
+
|
|
88
|
+
Reserve atmospheric backgrounds for section-divider slides and the unmissable slide. Body content slides should have clean backgrounds to maintain readability.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Density Contrast as Craft Signal
|
|
93
|
+
|
|
94
|
+
Rhythm: Open → Dense → Open → Dense → Open (CTA)
|
|
95
|
+
|
|
96
|
+
- title-hero: maximum open space (large padding, few elements, generous line-height)
|
|
97
|
+
- section-divider: maximum open space (single bold label, no body)
|
|
98
|
+
- text-full / comparison-table: dense (tight content, purpose is information delivery)
|
|
99
|
+
- stat-highlight: maximum open space (numbers need breathing room to read large)
|
|
100
|
+
- closing-cta: maximum open space (one action, nothing competing)
|
|
101
|
+
|
|
102
|
+
Open slides feel intentional. Dense slides feel earned because they're surrounded by open space.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Layout Alternation for Visual Rhythm
|
|
107
|
+
|
|
108
|
+
Avoid repeating the same layout back-to-back unless content demands it:
|
|
109
|
+
- text-full → text-full: acceptable if different visual treatment (bullets vs. paragraphs, different bg)
|
|
110
|
+
- stat-highlight → stat-highlight: avoid -- collapses the "loud" moment
|
|
111
|
+
- two text-left-image-right in a row: break with a section-divider between them
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Slide Slop Patterns to Avoid
|
|
116
|
+
|
|
117
|
+
These produce generic AI-looking output:
|
|
118
|
+
|
|
119
|
+
| Pattern | What it signals | Fix |
|
|
120
|
+
|---|---|---|
|
|
121
|
+
| Every slide: headline + 5 bullets, centered | No layout thinking, template dump | Vary layout types per content need |
|
|
122
|
+
| All slides same background color | No visual rhythm | Use section-dividers, alternate bg per style |
|
|
123
|
+
| Stat numbers at body text size | Doesn't understand visual hierarchy | Stats must be 3× minimum body size |
|
|
124
|
+
| Animation on every element, every slide | Desperate filler | Reserve animation for the ONE unmissable slide |
|
|
125
|
+
| Image placeholder boxes visible in final output | Unfinished | Replace with CSS-generated visuals or remove |
|
|
126
|
+
| Closing slide: just "Thank You" | Missed the point of a closing slide | CTA + email + URL minimum |
|
|
127
|
+
| Inter as display font | Zero typographic character | Use the preset's display font |
|
|
128
|
+
| Purple gradient on white bg | Generic AI aesthetic | If soft-cloud/product-minimal needed: use preset tokens, not defaults |
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## CSS Technical Rules
|
|
133
|
+
|
|
134
|
+
These rules come from `frontend-slides/viewport-base.css` -- they are non-negotiable:
|
|
135
|
+
|
|
136
|
+
```css
|
|
137
|
+
/* Every slide */
|
|
138
|
+
.slide {
|
|
139
|
+
height: 100vh;
|
|
140
|
+
height: 100dvh;
|
|
141
|
+
overflow: hidden;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/* All font sizes and spacing must use clamp() */
|
|
145
|
+
font-size: clamp(min, preferred, max);
|
|
146
|
+
padding: clamp(min, preferred, max);
|
|
147
|
+
gap: clamp(min, preferred, max);
|
|
148
|
+
|
|
149
|
+
/* Images */
|
|
150
|
+
img {
|
|
151
|
+
max-height: min(50vh, 400px);
|
|
152
|
+
object-fit: cover;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/* NEVER use negated clamp/min/max directly */
|
|
156
|
+
/* Wrong: margin-top: -clamp(1rem, 2vw, 2rem); */
|
|
157
|
+
/* Right: margin-top: calc(-1 * clamp(1rem, 2vw, 2rem)); */
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**What NOT to use in slide CSS:**
|
|
161
|
+
- `display:flex` / `display:grid` -- OK in slide content (not in outer shell)
|
|
162
|
+
- `position:fixed` -- no fixed elements inside slides
|
|
163
|
+
- `min-height` / `max-height` on `.slide` -- height:100vh is the constraint; these fight it
|
|
164
|
+
- CSS custom properties (`--var`) for font-size values inside `clamp()` -- some browsers handle poorly
|
|
165
|
+
- `vh` units inside `calc()` mixed with `rem` without explicit conversion
|
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
# Layout Library
|
|
2
|
+
|
|
3
|
+
13 named slide layout patterns. For each: HTML structure, CSS approach, density limits, and when to use.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. title-hero
|
|
8
|
+
|
|
9
|
+
**Use for:** Opening slide. The first thing the audience sees.
|
|
10
|
+
**Do not use for:** Any slide other than the first (or first slide of a major section).
|
|
11
|
+
|
|
12
|
+
**Content limits:**
|
|
13
|
+
- Headline: 6 words max
|
|
14
|
+
- Subtitle: 1 sentence
|
|
15
|
+
- Optional: pill badge (4 words max), background image or CSS gradient
|
|
16
|
+
|
|
17
|
+
**HTML structure:**
|
|
18
|
+
```html
|
|
19
|
+
<section class="slide slide--title-hero">
|
|
20
|
+
<div class="slide-content">
|
|
21
|
+
<span class="badge">OPTIONAL BADGE TEXT</span>
|
|
22
|
+
<h1>Headline Here</h1>
|
|
23
|
+
<p class="subtitle">One sentence subtitle that expands on the headline.</p>
|
|
24
|
+
</div>
|
|
25
|
+
</section>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**CSS approach:**
|
|
29
|
+
- Flexbox column: `align-items: flex-start; justify-content: center` (left-aligned, vertically centered)
|
|
30
|
+
- Lower-third variant: `justify-content: flex-end; padding-bottom: clamp(3rem, 6vw, 6rem)`
|
|
31
|
+
- Background: full-bleed CSS gradient or `background-image: url(data:...)` with `background-size: cover`
|
|
32
|
+
- Badge pill: `border-radius: 100px; padding: 0.3em 1em; font-size: clamp(0.65rem, 1vw, 0.875rem); letter-spacing: 0.14em; text-transform: uppercase`
|
|
33
|
+
- Headline: `font-size: clamp(2.5rem, 8vw, 6rem); letter-spacing: -0.04em; line-height: 1`
|
|
34
|
+
- Subtitle: `font-size: clamp(0.875rem, 1.5vw, 1.25rem); max-width: 55%; opacity: 0.8`
|
|
35
|
+
|
|
36
|
+
**Signature element:** Oversized headline with extremely tight tracking (`-0.04em`). The headline is a poster.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 2. section-divider
|
|
41
|
+
|
|
42
|
+
**Use for:** Marking the start of a new section or chapter in the deck.
|
|
43
|
+
**Do not use for:** Slides that have any body content.
|
|
44
|
+
|
|
45
|
+
**Content limits:**
|
|
46
|
+
- Section label: 2-4 words max
|
|
47
|
+
- Optional: section number, sub-label (1 line)
|
|
48
|
+
|
|
49
|
+
**HTML structure:**
|
|
50
|
+
```html
|
|
51
|
+
<section class="slide slide--section-divider">
|
|
52
|
+
<div class="slide-content">
|
|
53
|
+
<span class="section-number">01</span>
|
|
54
|
+
<h2>Section Label</h2>
|
|
55
|
+
<p class="sub-label">Optional one-line description</p>
|
|
56
|
+
</div>
|
|
57
|
+
</section>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**CSS approach:**
|
|
61
|
+
- Background: style's accent color, or strongly contrasting bg (dark on light deck, light on dark)
|
|
62
|
+
- Flexbox column, centered horizontally
|
|
63
|
+
- Section number: `font-size: clamp(4rem, 10vw, 8rem); opacity: 0.1; position: absolute; top: clamp(1rem, 3vw, 3rem); left: clamp(1rem, 3vw, 3rem)`
|
|
64
|
+
- Label: `font-size: clamp(2rem, 6vw, 5rem); letter-spacing: -0.03em`
|
|
65
|
+
- Decorative element: thin horizontal rule (2px, 40-60px wide, accent color) above the label
|
|
66
|
+
|
|
67
|
+
**Key rule:** No body copy on this layout. Label + optional section number only.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 3. text-full
|
|
72
|
+
|
|
73
|
+
**Use for:** Text-heavy content -- explanations, bullet lists, value propositions, team bios.
|
|
74
|
+
**Do not use for:** Any slide where a visual would communicate better.
|
|
75
|
+
|
|
76
|
+
**Content limits:**
|
|
77
|
+
- Heading: 5 words max
|
|
78
|
+
- Content: 4-6 bullets OR 2 paragraphs (never both)
|
|
79
|
+
- 6 bullets → auto-wrap to 2×3 grid
|
|
80
|
+
|
|
81
|
+
**HTML structure (bullets):**
|
|
82
|
+
```html
|
|
83
|
+
<section class="slide slide--text-full">
|
|
84
|
+
<div class="slide-content">
|
|
85
|
+
<h2>Slide Heading</h2>
|
|
86
|
+
<ul class="slide-bullets">
|
|
87
|
+
<li>Bullet point one</li>
|
|
88
|
+
<li>Bullet point two</li>
|
|
89
|
+
<li>Bullet point three</li>
|
|
90
|
+
</ul>
|
|
91
|
+
</div>
|
|
92
|
+
</section>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**CSS approach:**
|
|
96
|
+
- `.slide-bullets`: `list-style: none; padding: 0; display: flex; flex-direction: column; gap: clamp(0.5rem, 1.5vw, 1.5rem)`
|
|
97
|
+
- Bullets styled via `::before`: dash or geometric accent mark, NOT browser defaults
|
|
98
|
+
- 6 bullet variant: `display: grid; grid-template-columns: 1fr 1fr; column-gap: clamp(1.5rem, 3vw, 3rem)`
|
|
99
|
+
- Heading: `font-size: clamp(1.75rem, 4vw, 3.5rem); margin-bottom: clamp(1rem, 2.5vw, 2.5rem)`
|
|
100
|
+
- Body text: `font-size: clamp(0.875rem, 1.5vw, 1.125rem); line-height: 1.55`
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 4. text-left-image-right
|
|
105
|
+
|
|
106
|
+
**Use for:** Pairing explanatory text with a supporting visual. Solution slides, feature explanations.
|
|
107
|
+
**Do not use for:** When the image is the story (use image-full instead).
|
|
108
|
+
|
|
109
|
+
**Content limits:**
|
|
110
|
+
- Heading: 5 words max
|
|
111
|
+
- Bullets: 3-4 (not more -- image column needs space)
|
|
112
|
+
- Image: `[IMAGE: description]` placeholder or CSS-generated visual
|
|
113
|
+
|
|
114
|
+
**HTML structure:**
|
|
115
|
+
```html
|
|
116
|
+
<section class="slide slide--text-left-image-right">
|
|
117
|
+
<div class="slide-content">
|
|
118
|
+
<div class="text-col">
|
|
119
|
+
<h2>Heading</h2>
|
|
120
|
+
<ul class="slide-bullets">
|
|
121
|
+
<li>Point one</li>
|
|
122
|
+
<li>Point two</li>
|
|
123
|
+
<li>Point three</li>
|
|
124
|
+
</ul>
|
|
125
|
+
</div>
|
|
126
|
+
<div class="image-col">
|
|
127
|
+
<img src="..." alt="Description" />
|
|
128
|
+
<!-- or CSS-generated visual placeholder -->
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
</section>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**CSS approach:**
|
|
135
|
+
- `.slide-content`: `display: grid; grid-template-columns: 55fr 45fr; gap: clamp(1.5rem, 3vw, 4rem); align-items: center`
|
|
136
|
+
- Image: `max-height: min(50vh, 400px); width: 100%; object-fit: cover; border-radius: 8px` (border-radius varies by style)
|
|
137
|
+
- Responsive: `@media (max-width: 600px) { grid-template-columns: 1fr; }` -- image stacks below text
|
|
138
|
+
- CSS-generated visual placeholder: styled `<div>` with gradient background, represents the missing image
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 5. image-left-text-right
|
|
143
|
+
|
|
144
|
+
**Use for:** When the image should lead visually -- product-first slides, social proof with screenshot.
|
|
145
|
+
**Content limits / CSS:** Same as text-left-image-right, columns reversed: `grid-template-columns: 45fr 55fr`.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 6. two-column-text
|
|
150
|
+
|
|
151
|
+
**Use for:** Comparisons, pros/cons, before/after, two parallel processes.
|
|
152
|
+
**Do not use for:** Content that isn't genuinely parallel.
|
|
153
|
+
|
|
154
|
+
**Content limits:**
|
|
155
|
+
- 2 column headings (3 words max each)
|
|
156
|
+
- Max 3 bullets per column (6 total)
|
|
157
|
+
|
|
158
|
+
**HTML structure:**
|
|
159
|
+
```html
|
|
160
|
+
<section class="slide slide--two-column-text">
|
|
161
|
+
<div class="slide-content">
|
|
162
|
+
<h2 class="slide-headline">Main Slide Heading</h2>
|
|
163
|
+
<div class="two-col-grid">
|
|
164
|
+
<div class="col">
|
|
165
|
+
<h3>Column A</h3>
|
|
166
|
+
<ul class="slide-bullets"><li>Point</li></ul>
|
|
167
|
+
</div>
|
|
168
|
+
<div class="col">
|
|
169
|
+
<h3>Column B</h3>
|
|
170
|
+
<ul class="slide-bullets"><li>Point</li></ul>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
</div>
|
|
174
|
+
</section>
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**CSS approach:**
|
|
178
|
+
- `.two-col-grid`: `display: grid; grid-template-columns: 1fr 1fr; gap: clamp(1.5rem, 3vw, 4rem)`
|
|
179
|
+
- Column heading `h3`: `font-size: clamp(1.1rem, 2vw, 1.75rem); border-bottom: 2px solid [accent]; padding-bottom: 0.5em; margin-bottom: 0.75em`
|
|
180
|
+
- Optional: subtle divider line between columns (`border-right: 1px solid rgba(color, 0.2)` on left column)
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 7. image-full
|
|
185
|
+
|
|
186
|
+
**Use for:** Full-bleed product screenshots, impact moments, visual stories.
|
|
187
|
+
**Do not use for:** Images that need more than a short caption to make sense.
|
|
188
|
+
|
|
189
|
+
**Content limits:**
|
|
190
|
+
- Image fills the entire slide
|
|
191
|
+
- Optional caption: 10 words max, in overlay zone
|
|
192
|
+
|
|
193
|
+
**HTML structure:**
|
|
194
|
+
```html
|
|
195
|
+
<section class="slide slide--image-full">
|
|
196
|
+
<img src="..." alt="Description" class="full-bleed-img" />
|
|
197
|
+
<div class="caption-overlay">Optional short caption here</div>
|
|
198
|
+
</section>
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**CSS approach:**
|
|
202
|
+
- `.full-bleed-img`: `position: absolute; top: 0; left: 0; width: 100%; height: 100%; object-fit: cover`
|
|
203
|
+
- `.caption-overlay`: `position: absolute; bottom: 0; left: 0; right: 0; padding: clamp(1rem, 2vw, 2rem); background: linear-gradient(transparent, rgba(0,0,0,0.75)); color: #FFFFFF`
|
|
204
|
+
- Caption: `font-size: clamp(0.75rem, 1.2vw, 1rem)`, white text, MUST pass 4.5:1 contrast ratio
|
|
205
|
+
- `.slide--image-full`: `position: relative; overflow: hidden`
|
|
206
|
+
|
|
207
|
+
**CSS-generated alternative (no image):** Full-bleed CSS gradient mesh from `animation-patterns.md` + centered text label describing what the image would show.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## 8. image-grid
|
|
212
|
+
|
|
213
|
+
**Use for:** Product gallery, feature showcase, team photos, screenshot collection.
|
|
214
|
+
**Do not use for:** More than 6 images (too dense, content bleeds).
|
|
215
|
+
|
|
216
|
+
**Content limits:**
|
|
217
|
+
- 2×2 grid (4 images) or 3×2 grid (6 images)
|
|
218
|
+
- Optional caption below each image (6 words max)
|
|
219
|
+
|
|
220
|
+
**HTML structure:**
|
|
221
|
+
```html
|
|
222
|
+
<section class="slide slide--image-grid">
|
|
223
|
+
<div class="slide-content">
|
|
224
|
+
<h2>Grid Heading</h2>
|
|
225
|
+
<div class="image-grid-container">
|
|
226
|
+
<figure><img src="..." alt="..." /><figcaption>Caption</figcaption></figure>
|
|
227
|
+
<figure><img src="..." alt="..." /><figcaption>Caption</figcaption></figure>
|
|
228
|
+
<!-- repeat -->
|
|
229
|
+
</div>
|
|
230
|
+
</div>
|
|
231
|
+
</section>
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**CSS approach:**
|
|
235
|
+
- `.image-grid-container`: `display: grid; grid-template-columns: repeat(auto-fit, minmax(min(200px, 100%), 1fr)); gap: clamp(0.5rem, 1.5vw, 1.5rem)`
|
|
236
|
+
- Images: `width: 100%; height: clamp(100px, 20vh, 200px); object-fit: cover; border-radius: 6px`
|
|
237
|
+
- `figcaption`: `font-size: clamp(0.65rem, 1vw, 0.8rem); text-align: center; margin-top: 0.4em; opacity: 0.7`
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## 9. stat-highlight
|
|
242
|
+
|
|
243
|
+
**Use for:** The unmissable slide. Traction, ROI metrics, market size, key results.
|
|
244
|
+
**Do not use for:** Any slide where a number isn't the main story.
|
|
245
|
+
|
|
246
|
+
**Content limits:**
|
|
247
|
+
- 2-4 metrics (number + label pairs)
|
|
248
|
+
- ZERO body copy competing with the numbers
|
|
249
|
+
- ONE context line below all metrics is permitted (max 12 words)
|
|
250
|
+
|
|
251
|
+
**HTML structure:**
|
|
252
|
+
```html
|
|
253
|
+
<section class="slide slide--stat-highlight">
|
|
254
|
+
<div class="slide-content">
|
|
255
|
+
<div class="stats-container">
|
|
256
|
+
<div class="stat">
|
|
257
|
+
<span class="stat-number">3×</span>
|
|
258
|
+
<span class="stat-label">Faster Close</span>
|
|
259
|
+
</div>
|
|
260
|
+
<div class="stat">
|
|
261
|
+
<span class="stat-number">140%</span>
|
|
262
|
+
<span class="stat-label">YoY Growth</span>
|
|
263
|
+
</div>
|
|
264
|
+
<div class="stat">
|
|
265
|
+
<span class="stat-number">$2M</span>
|
|
266
|
+
<span class="stat-label">ARR</span>
|
|
267
|
+
</div>
|
|
268
|
+
</div>
|
|
269
|
+
<p class="stat-context">As of Q4 2025 — DataPulse customer average</p>
|
|
270
|
+
</div>
|
|
271
|
+
</section>
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**CSS approach:**
|
|
275
|
+
- `.stats-container`: `display: flex; justify-content: center; gap: clamp(2rem, 5vw, 6rem); align-items: center`
|
|
276
|
+
- `.stat`: `display: flex; flex-direction: column; align-items: center; text-align: center`
|
|
277
|
+
- `.stat-number`: `font-size: clamp(3.5rem, 12vw, 9rem); font-weight: 700 or 900; line-height: 1; color: accent`
|
|
278
|
+
- `.stat-label`: `font-size: clamp(0.7rem, 1.2vw, 1rem); letter-spacing: 0.12em; text-transform: uppercase; margin-top: 0.4em; opacity: 0.7`
|
|
279
|
+
- `.stat-context`: `font-size: clamp(0.65rem, 1vw, 0.875rem); opacity: 0.5; margin-top: clamp(1.5rem, 3vw, 3rem); text-align: center`
|
|
280
|
+
- For 2 metrics: larger gap, even bigger numbers
|
|
281
|
+
- For 4 metrics: tighter gap, slightly reduced number size: `clamp(2.5rem, 8vw, 6rem)`
|
|
282
|
+
|
|
283
|
+
**This is the unmissable slide for most decks.** Numbers fill a significant portion of the slide. Everything else is quiet in comparison.
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## 10. quote-callout
|
|
288
|
+
|
|
289
|
+
**Use for:** Customer quotes, compelling statistics stated as prose, key principles.
|
|
290
|
+
**Do not use for:** Quotes that need more than 30 words to land.
|
|
291
|
+
|
|
292
|
+
**Content limits:**
|
|
293
|
+
- Quote: 30 words max
|
|
294
|
+
- Attribution: name + title (both required)
|
|
295
|
+
|
|
296
|
+
**HTML structure:**
|
|
297
|
+
```html
|
|
298
|
+
<section class="slide slide--quote-callout">
|
|
299
|
+
<div class="slide-content">
|
|
300
|
+
<div class="quote-mark" aria-hidden="true">"</div>
|
|
301
|
+
<blockquote>
|
|
302
|
+
<p class="quote-text">The quote goes here. It should be punchy and short.</p>
|
|
303
|
+
<footer class="quote-attribution">
|
|
304
|
+
<span class="attribution-name">Jane Smith</span>
|
|
305
|
+
<span class="attribution-title">VP Sales, Acme Corp</span>
|
|
306
|
+
</footer>
|
|
307
|
+
</blockquote>
|
|
308
|
+
</div>
|
|
309
|
+
</section>
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
**CSS approach:**
|
|
313
|
+
- `.quote-mark`: `font-size: clamp(4rem, 10vw, 8rem); opacity: 0.15; position: absolute; top: clamp(1rem, 3vw, 3rem); left: clamp(1rem, 3vw, 3rem); line-height: 1; font-family: [display-font]; color: currentColor`
|
|
314
|
+
- `.quote-text`: `font-size: clamp(1.25rem, 3vw, 2.25rem); font-style: italic; font-family: [display-font]; line-height: 1.35; max-width: 70%`
|
|
315
|
+
- `.attribution-name`: `font-size: clamp(0.75rem, 1.2vw, 1rem); font-weight: 600; display: block; margin-top: 1.5em`
|
|
316
|
+
- `.attribution-title`: `font-size: clamp(0.65rem, 1vw, 0.875rem); opacity: 0.6; display: block`
|
|
317
|
+
- `.slide-content`: `position: relative; display: flex; flex-direction: column; justify-content: center`
|
|
318
|
+
|
|
319
|
+
**No competing elements.** No bullet points, no secondary content, no badges. The quote + attribution is the entire slide.
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
## 11. comparison-table
|
|
324
|
+
|
|
325
|
+
**Use for:** Side-by-side feature comparison, competitive positioning, option evaluation.
|
|
326
|
+
**Do not use for:** More than 3 options or more than 6 comparison points.
|
|
327
|
+
|
|
328
|
+
**Content limits:**
|
|
329
|
+
- Max 3 columns (yours + 2 alternatives, or 3 options)
|
|
330
|
+
- Max 6 rows
|
|
331
|
+
- Cell content: 1-3 words, or Unicode checkmarks `✓` `✗`
|
|
332
|
+
|
|
333
|
+
**HTML structure:**
|
|
334
|
+
```html
|
|
335
|
+
<section class="slide slide--comparison-table">
|
|
336
|
+
<div class="slide-content">
|
|
337
|
+
<h2>How We Compare</h2>
|
|
338
|
+
<table class="comparison">
|
|
339
|
+
<thead>
|
|
340
|
+
<tr>
|
|
341
|
+
<th>Feature</th>
|
|
342
|
+
<th class="highlight-col">Our Product</th>
|
|
343
|
+
<th>Alternative A</th>
|
|
344
|
+
<th>Alternative B</th>
|
|
345
|
+
</tr>
|
|
346
|
+
</thead>
|
|
347
|
+
<tbody>
|
|
348
|
+
<tr>
|
|
349
|
+
<td>Real-time sync</td>
|
|
350
|
+
<td class="highlight-col">✓</td>
|
|
351
|
+
<td>✗</td>
|
|
352
|
+
<td>✓</td>
|
|
353
|
+
</tr>
|
|
354
|
+
<!-- more rows -->
|
|
355
|
+
</tbody>
|
|
356
|
+
</table>
|
|
357
|
+
</div>
|
|
358
|
+
</section>
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
**CSS approach:**
|
|
362
|
+
- `table.comparison`: `width: 100%; border-collapse: collapse`
|
|
363
|
+
- `th, td`: `padding: clamp(0.5rem, 1vw, 1rem) clamp(0.75rem, 1.5vw, 1.5rem); text-align: center; border-bottom: 1px solid rgba(color, 0.15)`
|
|
364
|
+
- `th`: `font-size: clamp(0.75rem, 1.2vw, 1rem); font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase`
|
|
365
|
+
- `td`: `font-size: clamp(0.8rem, 1.3vw, 1rem)`
|
|
366
|
+
- `.highlight-col` (your product column): `background: rgba(accent-color, 0.08); color: accent-color; font-weight: 600`
|
|
367
|
+
- First and last cells in highlight column: `border-radius: 8px 8px 0 0` and `0 0 8px 8px`
|
|
368
|
+
- Row alternation: `tr:nth-child(even) td { background: rgba(color, 0.03) }`
|
|
369
|
+
- First column (row labels): `text-align: left; font-weight: 500`
|
|
370
|
+
|
|
371
|
+
---
|
|
372
|
+
|
|
373
|
+
## 12. timeline
|
|
374
|
+
|
|
375
|
+
**Use for:** Product roadmaps, company milestones, process steps, historical progression.
|
|
376
|
+
**Do not use for:** More than 6 milestones (too dense to read on a slide).
|
|
377
|
+
|
|
378
|
+
**Content limits:**
|
|
379
|
+
- 3-6 milestones
|
|
380
|
+
- Each: label (date or phase) + short description (1 line, 8 words max)
|
|
381
|
+
- Horizontal layout for ≤4 milestones; vertical layout for 5-6
|
|
382
|
+
|
|
383
|
+
**HTML structure (horizontal):**
|
|
384
|
+
```html
|
|
385
|
+
<section class="slide slide--timeline">
|
|
386
|
+
<div class="slide-content">
|
|
387
|
+
<h2>Roadmap</h2>
|
|
388
|
+
<div class="timeline-container timeline--horizontal">
|
|
389
|
+
<div class="timeline-track"></div>
|
|
390
|
+
<div class="milestone">
|
|
391
|
+
<div class="milestone-dot"></div>
|
|
392
|
+
<span class="milestone-label">Q1 2025</span>
|
|
393
|
+
<p class="milestone-desc">Launched v1.0</p>
|
|
394
|
+
</div>
|
|
395
|
+
<!-- more milestones -->
|
|
396
|
+
</div>
|
|
397
|
+
</div>
|
|
398
|
+
</section>
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
**CSS approach (horizontal):**
|
|
402
|
+
- `.timeline-container`: `position: relative; display: flex; justify-content: space-between; align-items: flex-start; padding-top: 2rem`
|
|
403
|
+
- `.timeline-track`: `position: absolute; top: 0.75rem; left: 0; right: 0; height: 2px; background: rgba(accent, 0.3)`
|
|
404
|
+
- `.milestone`: `display: flex; flex-direction: column; align-items: center; text-align: center; flex: 1; position: relative`
|
|
405
|
+
- `.milestone-dot`: `width: clamp(10px, 1.5vw, 16px); height: clamp(10px, 1.5vw, 16px); border-radius: 50%; background: accent; margin-bottom: 0.75rem`
|
|
406
|
+
- `.milestone-label`: `font-size: clamp(0.65rem, 1vw, 0.875rem); font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: accent`
|
|
407
|
+
- `.milestone-desc`: `font-size: clamp(0.65rem, 1vw, 0.8rem); opacity: 0.7; margin-top: 0.3em; max-width: 10ch`
|
|
408
|
+
|
|
409
|
+
**Vertical variant (5-6 milestones):** Left-aligned dot line, milestone text alternates left/right of the track.
|
|
410
|
+
|
|
411
|
+
---
|
|
412
|
+
|
|
413
|
+
## 13. closing-cta
|
|
414
|
+
|
|
415
|
+
**Use for:** The final slide of every deck. No exceptions.
|
|
416
|
+
**Do not use for:** Any slide that isn't the last one.
|
|
417
|
+
|
|
418
|
+
**Content limits:**
|
|
419
|
+
- Headline: 5 words max
|
|
420
|
+
- CTA action text: 3-5 words (the button or the action)
|
|
421
|
+
- Contact: email + URL (both required)
|
|
422
|
+
- QR code: `[QR: url]` placeholder -- note in Step 8 checklist to replace
|
|
423
|
+
|
|
424
|
+
**HTML structure:**
|
|
425
|
+
```html
|
|
426
|
+
<section class="slide slide--closing-cta">
|
|
427
|
+
<div class="slide-content">
|
|
428
|
+
<h2>Let's Build Together</h2>
|
|
429
|
+
<p class="cta-action">Schedule a 30-minute call</p>
|
|
430
|
+
<div class="contact-info">
|
|
431
|
+
<span>hello@yourcompany.com</span>
|
|
432
|
+
<span>yourcompany.com</span>
|
|
433
|
+
</div>
|
|
434
|
+
<div class="qr-placeholder">[QR: https://cal.com/yourlink]</div>
|
|
435
|
+
</div>
|
|
436
|
+
</section>
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
**CSS approach:**
|
|
440
|
+
- Background: full accent color OR strongly contrasting bg from style preset -- this slide should stand out
|
|
441
|
+
- `.slide-content`: `display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; gap: clamp(1rem, 2.5vw, 2.5rem)`
|
|
442
|
+
- Headline: `font-size: clamp(2rem, 5vw, 4.5rem); letter-spacing: -0.03em`
|
|
443
|
+
- CTA action: `font-size: clamp(1rem, 2vw, 1.75rem); opacity: 0.8; border-bottom: 2px solid currentColor; padding-bottom: 0.2em`
|
|
444
|
+
- Contact info: `display: flex; gap: 2rem; font-size: clamp(0.75rem, 1.2vw, 1rem); opacity: 0.65`
|
|
445
|
+
- QR placeholder: styled `<div>` with dashed border, 80-100px square, "QR" label inside -- replace with actual QR image before presenting
|
|
446
|
+
- **No bullets, no body copy, no competing elements.** CTA + contact only.
|