octocode-cli 1.3.0 → 1.5.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/README.md +129 -28
- package/out/chunks/chunk-7476PETK.js +309 -0
- package/out/chunks/chunk-CVNNNSMQ.js +26 -0
- package/out/chunks/chunk-OQBJTZWK.js +60 -0
- package/out/chunks/chunk-UCZCF3BQ.js +9 -0
- package/out/chunks/command-help-specs-JZXVSLZ5.js +8 -0
- package/out/chunks/commands-XBFPLHSQ.js +8 -0
- package/out/chunks/help-P7TCOYAJ.js +10 -0
- package/out/chunks/main-help-ULF5PAQY.js +10 -0
- package/out/chunks/prompts-5E6VKRX5.js +8 -0
- package/out/chunks/spinner-URV2OX6O.js +8 -0
- package/out/chunks/tool-command-M6VA7P2F.js +8 -0
- package/out/octocode-cli.js +1 -1
- package/package.json +5 -3
- package/skills/README.md +60 -58
- package/skills/agentic-flow-best-practices/SKILL.md +280 -0
- package/skills/agentic-flow-best-practices/references/agent-collaboration-patterns.md +75 -0
- package/skills/agentic-flow-best-practices/references/pr-review-agent-example.md +47 -0
- package/skills/agentic-flow-best-practices/references/resources.md +112 -0
- package/skills/octocode-brainstorming/.env.example +11 -0
- package/skills/octocode-brainstorming/SKILL.md +262 -0
- package/skills/octocode-brainstorming/scripts/tavily-search.mjs +138 -0
- package/skills/octocode-chrome-devtools/README.md +541 -0
- package/skills/octocode-chrome-devtools/SKILL.md +197 -0
- package/skills/octocode-chrome-devtools/agents/openai.yaml +7 -0
- package/skills/octocode-chrome-devtools/references/CDP_AGENT_REFERENCE.md +401 -0
- package/skills/octocode-chrome-devtools/references/CHROME_FLAGS.md +234 -0
- package/skills/octocode-chrome-devtools/references/INTENTS.md +108 -0
- package/skills/octocode-chrome-devtools/references/INTENTS_AUTH.md +179 -0
- package/skills/octocode-chrome-devtools/references/INTENTS_AUTOMATION.md +214 -0
- package/skills/octocode-chrome-devtools/references/INTENTS_DEBUG.md +329 -0
- package/skills/octocode-chrome-devtools/references/INTENTS_ENVIRONMENT.md +237 -0
- package/skills/octocode-chrome-devtools/references/INTENTS_INSPECT.md +263 -0
- package/skills/octocode-chrome-devtools/references/INTENTS_STORAGE_CONSENT.md +214 -0
- package/skills/octocode-chrome-devtools/references/RECOVERY.md +39 -0
- package/skills/octocode-chrome-devtools/references/SCRIPT_PATTERNS.md +43 -0
- package/skills/octocode-chrome-devtools/references/SCRIPT_PATTERNS_ASYNC_WORKERS.md +345 -0
- package/skills/octocode-chrome-devtools/references/SCRIPT_PATTERNS_BROWSER.md +403 -0
- package/skills/octocode-chrome-devtools/references/SCRIPT_PATTERNS_OBSERVE.md +275 -0
- package/skills/octocode-chrome-devtools/references/SCRIPT_PATTERNS_SPECIAL.md +18 -0
- package/skills/octocode-chrome-devtools/scripts/cdp-runner.mjs +503 -0
- package/skills/octocode-chrome-devtools/scripts/cdp-sandbox.mjs +123 -0
- package/skills/octocode-chrome-devtools/scripts/cdp-template.mjs +81 -0
- package/skills/octocode-chrome-devtools/scripts/octocode-chrome-devtools.vpn.example.json +8 -0
- package/skills/octocode-chrome-devtools/scripts/open-browser.mjs +362 -0
- package/skills/octocode-chrome-devtools/scripts/sourcemap-resolver.mjs +193 -0
- package/skills/octocode-chrome-devtools/scripts/undercover.mjs +226 -0
- package/skills/octocode-design/README.md +2 -2
- package/skills/octocode-documentation-writer/README.md +1 -1
- package/skills/octocode-engineer/README.md +1 -1
- package/skills/octocode-engineer/SKILL.md +137 -306
- package/skills/octocode-engineer/references/cli-reference.md +13 -0
- package/skills/octocode-engineer/references/output-files.md +3 -3
- package/skills/octocode-engineer/scripts/run.js +146 -146
- package/skills/octocode-engineer/src/pipeline/main.ts +1 -17
- package/skills/octocode-engineer/src/pipeline/progress.ts +4 -0
- package/skills/octocode-engineer/src/reporting/summary-md.test.ts +48 -0
- package/skills/octocode-engineer/src/reporting/summary-md.ts +43 -2
- package/skills/octocode-install/SKILL.md +1 -1
- package/skills/octocode-pull-request-reviewer/README.md +5 -5
- package/skills/octocode-pull-request-reviewer/SKILL.md +1 -1
- package/skills/octocode-research/AGENTS.md +1 -1
- package/skills/octocode-research/README.md +2 -2
- package/skills/octocode-research/docs/ARCHITECTURE.md +1 -1
- package/skills/octocode-research/scripts/server.js +184 -239
- package/skills/octocode-research/src/routes/github.ts +4 -21
- package/skills/octocode-research/src/routes/local.ts +4 -21
- package/skills/octocode-research/src/utils/fileContentTransform.ts +44 -0
- package/skills/octocode-search-skill/SKILL.md +337 -0
- package/skills/octocode-search-skill/references/agent-skills-guide.md +177 -0
- package/skills/octocode-search-skill/references/discovery-surfaces.md +162 -0
- package/skills/octocode-search-skill/references/fetch-and-create-locally.md +57 -0
- package/skills/octocode-search-skill/references/install-reference.md +130 -0
- package/skills/octocode-search-skill/references/references-template.md +27 -0
- package/skills/octocode-search-skill/references/references.md +62 -0
- package/skills/octocode-slides/README.md +307 -0
- package/skills/octocode-slides/SKILL.md +410 -0
- package/skills/octocode-slides/references/01-brief.md +156 -0
- package/skills/octocode-slides/references/02-research.md +149 -0
- package/skills/octocode-slides/references/03-outline.md +172 -0
- package/skills/octocode-slides/references/04-design.md +301 -0
- package/skills/octocode-slides/references/05-implementation.md +213 -0
- package/skills/octocode-slides/references/06-review.md +258 -0
- package/skills/octocode-slides/references/animation.md +281 -0
- package/skills/octocode-slides/references/design-system.md +316 -0
- package/skills/octocode-slides/references/html-templates.md +673 -0
- package/skills/octocode-slides/references/image-generation.md +448 -0
- package/skills/octocode-slides/references/resources.md +840 -0
- package/skills/octocode-slides/references/slide-rules.md +541 -0
- package/skills/octocode-slides/references/wireframes.md +727 -0
- package/skills/octocode-slides/scripts/animation.js +182 -0
- package/skills/octocode-slides/scripts/base.css +353 -0
- package/skills/octocode-slides/scripts/base.html +655 -0
- package/skills/octocode-slides/scripts/generate_image.py +221 -0
- package/skills/octocode-slides/scripts/navbridge.js +79 -0
- package/skills/octocode-slides/scripts/presenter.js +316 -0
- package/skills/octocode-slides/scripts/slide.html +248 -0
- package/skills/octocode-stats/SKILL.md +73 -0
- package/skills/octocode-stats/assets/template.html +1332 -0
- package/skills/octocode-stats/scripts/build_dashboard.mjs +407 -0
- package/out/chunks/chunk-LH4AZJPA.js +0 -389
- package/out/chunks/command-help-specs-CQ3RBLP6.js +0 -8
- package/out/chunks/commands-M3QTWKWE.js +0 -51
- package/out/chunks/help-XPXP46ZT.js +0 -10
- package/out/chunks/main-help-HXFAFHPG.js +0 -10
- package/out/chunks/tool-command-VHFLPIHY.js +0 -8
|
@@ -0,0 +1,727 @@
|
|
|
1
|
+
# Slide Wireframes
|
|
2
|
+
|
|
3
|
+
Pick the layout **from the content**, not from aesthetics. Each wireframe below ties three things together:
|
|
4
|
+
|
|
5
|
+
1. **Content signals** — what the slide actually contains.
|
|
6
|
+
2. **Wireframe** — slide regions, proportions, and focal point.
|
|
7
|
+
3. **DOM + CSS** — the existing flex/grid primitives in `base.css` that produce the layout.
|
|
8
|
+
|
|
9
|
+
All wireframes assume the standard shell from `references/html-templates.md`:
|
|
10
|
+
|
|
11
|
+
```html
|
|
12
|
+
<div class="slide slide--{{type}}">
|
|
13
|
+
<!-- regions go here -->
|
|
14
|
+
</div>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Inside that root, `.slide` is already `display: flex; flex-direction: column`. Layouts below differ only in:
|
|
18
|
+
- `.slide--{{type}}` modifier (centering, padding, color treatment)
|
|
19
|
+
- which children fill which region
|
|
20
|
+
- which inner container is `flex` row, `grid`, or full-bleed `absolute`
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Where Things Live
|
|
25
|
+
|
|
26
|
+
| File | Owns |
|
|
27
|
+
|---|---|
|
|
28
|
+
| `references/wireframes.md` (this) | Pick a layout from content. Region structure, flex/grid, DOM tree per slide type. |
|
|
29
|
+
| `references/html-templates.md` | Full HTML templates per slide type and the canonical 4-region skeleton. |
|
|
30
|
+
| `scripts/base.css` | Canonical CSS — copied verbatim to `css/base.css`. Layout primitives, slide-type rules, components, animations, print. |
|
|
31
|
+
| `references/design-system.md` | Tokens, typography scale, palettes, slide density limits, title contract, anti-slop, methodology, external sources. |
|
|
32
|
+
|
|
33
|
+
If a number, color, font, or density rule shows up here, it is a hint — `design-system.md` is canonical.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Canonical Slide Skeleton (reference)
|
|
38
|
+
|
|
39
|
+
Each wireframe below renders into the same four regions defined in `html-templates.md`:
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
.slide
|
|
43
|
+
├── .slide-logo optional · brand mark, top-right (absolute)
|
|
44
|
+
├── .slide-header optional · .title + .description
|
|
45
|
+
├── .slide-content REQUIRED · smart flex body
|
|
46
|
+
└── .slide-footer optional · source / page / link
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Only `.slide-content` is required.** The wireframes show the body — the smart-flex contents of `.slide-content`. Add `.slide-header` when the slide has a heading; add `.slide-logo` / `.slide-footer` when the deck's posture calls for them. Omit any region the slide doesn't need.
|
|
50
|
+
|
|
51
|
+
The DOM blocks below sometimes show only the regions a wireframe leans on, to keep examples readable. The full per-type templates in `html-templates.md` are the canonical markup.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Agent Decision Flow
|
|
56
|
+
|
|
57
|
+
Look at the slide's content first. Walk the table top-down — the first row that matches wins. The wireframes are starting points: if a slide needs a hybrid (e.g., W4 with a small chart, or W3 with a marginal image), build it. The goal is **the layout that serves this slide**, not a perfect match to a labelled pattern.
|
|
58
|
+
|
|
59
|
+
| Content signal | Pick wireframe | Slide type |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| One sentence, no body needed | W2 Big Message | `title`, `section`, `closing` |
|
|
62
|
+
| Deck opener with author/date | W1 Title / Hero | `title` |
|
|
63
|
+
| Deck section break | W2 Big Message | `section` |
|
|
64
|
+
| 2–4 short bullets explaining one claim | W3 Action Title + Bullets | `content` |
|
|
65
|
+
| 1–3 KPIs / metrics | W4 Big Number / Stats Grid | `stats` |
|
|
66
|
+
| One chart is the proof | W5 Full-Slide Chart | `chart` |
|
|
67
|
+
| Image is the proof or the mood | W6 Image-Led (full-bleed) | `image` |
|
|
68
|
+
| Text + screenshot/diagram together | W7 Text + Visual Split | `content` (custom) |
|
|
69
|
+
| Two parallel options/states | W8 Side-by-Side | `two-col` or `comparison` |
|
|
70
|
+
| One quote | W9 Quote | `quote` |
|
|
71
|
+
| Ordered steps over time | W10 Timeline | `timeline` |
|
|
72
|
+
| Code is the evidence | W11 Code | `code` |
|
|
73
|
+
| Audience needs a roadmap | W12 Agenda | `agenda` |
|
|
74
|
+
| Recap + next step | W13 Closing | `closing` |
|
|
75
|
+
|
|
76
|
+
If two rows match, pick the one with the stronger focal point (number > chart > image > text).
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Layout Primitives
|
|
81
|
+
|
|
82
|
+
The wireframes below combine four primitives. They map directly to CSS in `base.css`:
|
|
83
|
+
|
|
84
|
+
| Primitive | CSS / class | Use when |
|
|
85
|
+
|---|---|---|
|
|
86
|
+
| **Stacked column** | `.slide-content` default (flex column, `gap: var(--sp-3)`) | Header above, body of one or more blocks stacked |
|
|
87
|
+
| **Centered single block** | `.slide-content--center` (or centered slide types) | One number, one sentence, one quote, one image |
|
|
88
|
+
| **Two-up grid / N-up grid** | `.slide-content--grid-2`, `.slide-content--grid-3`, or component classes (`.two-col`, `.comparison`, `.stat-grid`) | Two or three parallel content blocks |
|
|
89
|
+
| **Side-by-side row** | `.slide-content--row` | Text + visual, label + value, two unequal columns |
|
|
90
|
+
| **Full-bleed layer** | `position: absolute; inset: 0` on `.slide--image img`, `.image-ph-bleed`, `.image-overlay` | Image / video / color fills the slide; content overlays it |
|
|
91
|
+
|
|
92
|
+
`flex: 1` on the body region is what makes charts, columns, and timelines fill the remaining height under `.slide-header`. The modifier classes live on `.slide-content` itself — you can also drop straight to inline `style="grid-template-columns: 2fr 3fr"` when the layout is unique to one slide.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## W1 · Title / Hero
|
|
97
|
+
|
|
98
|
+
**Content signals:** event/eyebrow + main title + subtitle + author/date. No bullets, no chart.
|
|
99
|
+
|
|
100
|
+
**Wireframe (16:9):**
|
|
101
|
+
|
|
102
|
+
```text
|
|
103
|
+
┌──────────────────────────────────────────────────────────┐
|
|
104
|
+
│ │
|
|
105
|
+
│ │
|
|
106
|
+
│ EYEBROW · UPPERCASE │ ← .eyebrow (small, accent)
|
|
107
|
+
│ │
|
|
108
|
+
│ MAIN TITLE — display size │ ← .display (largest)
|
|
109
|
+
│ one or two lines, leading-tight │
|
|
110
|
+
│ │
|
|
111
|
+
│ Subtitle that narrows the topic │ ← .subtitle
|
|
112
|
+
│ │
|
|
113
|
+
│ Author · Date │ ← .meta (small, muted)
|
|
114
|
+
│ │
|
|
115
|
+
│ │
|
|
116
|
+
└──────────────────────────────────────────────────────────┘
|
|
117
|
+
↑ vertically + horizontally centered
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**DOM:**
|
|
121
|
+
|
|
122
|
+
```html
|
|
123
|
+
<div class="slide slide--title">
|
|
124
|
+
<p class="eyebrow fade-in">{{Event}}</p>
|
|
125
|
+
<h1 class="display slide-up">{{Main title}}</h1>
|
|
126
|
+
<p class="subtitle slide-up delay-1">{{Subtitle}}</p>
|
|
127
|
+
<p class="meta fade-in delay-2">{{Author}} · {{Date}}</p>
|
|
128
|
+
</div>
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**CSS that does the work:**
|
|
132
|
+
- `.slide--title { justify-content: center; text-align: center; }` — centers the column.
|
|
133
|
+
- `.slide` is already `flex-direction: column`, so the four children stack with default gap.
|
|
134
|
+
|
|
135
|
+
**Agent rule:** if the first slide is a title and an image is *not* explicitly provided, do **not** invent one — keep this text-only hero. Only switch to W6 if the brief specifies a hero image.
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## W2 · Big Message / Section
|
|
140
|
+
|
|
141
|
+
**Content signals:** one sentence (≤ 12 words) that opens, transitions, or closes a section. Optional eyebrow/section-number.
|
|
142
|
+
|
|
143
|
+
**Wireframe:**
|
|
144
|
+
|
|
145
|
+
```text
|
|
146
|
+
┌──────────────────────────────────────────────────────────┐
|
|
147
|
+
│ │
|
|
148
|
+
│ │
|
|
149
|
+
│ 01 │ ← .section-num (small, accent)
|
|
150
|
+
│ │
|
|
151
|
+
│ ONE BIG SENTENCE, LEFT-ALIGNED OR CENTERED. │ ← .display
|
|
152
|
+
│ │
|
|
153
|
+
│ Optional supporting line, muted. │ ← .subtitle
|
|
154
|
+
│ │
|
|
155
|
+
│ │
|
|
156
|
+
└──────────────────────────────────────────────────────────┘
|
|
157
|
+
↑ vertically centered, text-align varies
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**DOM:**
|
|
161
|
+
|
|
162
|
+
```html
|
|
163
|
+
<div class="slide slide--section">
|
|
164
|
+
<p class="section-num fade-in">{{01}}</p>
|
|
165
|
+
<h2 class="display slide-up">{{Big sentence}}</h2>
|
|
166
|
+
<p class="subtitle slide-up delay-1">{{Supporting line}}</p>
|
|
167
|
+
</div>
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**CSS:**
|
|
171
|
+
- `.slide--section { justify-content: center; }` — vertical centering only; text aligns left by default.
|
|
172
|
+
|
|
173
|
+
**Agent rule:** if you find yourself adding bullets to "fill" this slide, stop — split the bullets onto the next slide.
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## W3 · Action Title + Bullets (Content)
|
|
178
|
+
|
|
179
|
+
**Content signals:** one heading that states the takeaway + 2–4 supporting bullets, each ≤ 12 words.
|
|
180
|
+
|
|
181
|
+
**Wireframe:**
|
|
182
|
+
|
|
183
|
+
```text
|
|
184
|
+
┌──────────────────────────────────────────────────────────┐
|
|
185
|
+
│ Action title — a complete thought │ ← .slide-header (flex-shrink: 0)
|
|
186
|
+
│ ────────────────────────────────────────────────────── │
|
|
187
|
+
│ │
|
|
188
|
+
│ → Point one — short, evidence-shaped │
|
|
189
|
+
│ → Point two │ ← .bullets (flex: 1, gap)
|
|
190
|
+
│ → Point three │
|
|
191
|
+
│ → Point four (max) │
|
|
192
|
+
│ │
|
|
193
|
+
└──────────────────────────────────────────────────────────┘
|
|
194
|
+
Header zone above, body zone fills the rest
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**DOM:**
|
|
198
|
+
|
|
199
|
+
```html
|
|
200
|
+
<div class="slide slide--content">
|
|
201
|
+
<div class="slide-header">
|
|
202
|
+
<h2 class="title fade-in">{{Action title}}</h2>
|
|
203
|
+
</div>
|
|
204
|
+
<ul class="bullets">
|
|
205
|
+
<li class="slide-up delay-1">{{Point one}}</li>
|
|
206
|
+
<li class="slide-up delay-2">{{Point two}}</li>
|
|
207
|
+
<li class="slide-up delay-3">{{Point three}}</li>
|
|
208
|
+
</ul>
|
|
209
|
+
</div>
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
**CSS:**
|
|
213
|
+
- `.slide` flex column → `.slide-header` is `flex-shrink: 0`, `.bullets` (or any child after) takes the remaining height.
|
|
214
|
+
- `.bullets` is itself `display: flex; flex-direction: column; gap: var(--sp-3)`.
|
|
215
|
+
|
|
216
|
+
**Agent rule:** if there are 5+ items, drop the weakest one or split the slide. If there are 0–1 items, switch to W2 Big Message.
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## W4 · Big Number / Stats Grid
|
|
221
|
+
|
|
222
|
+
**Content signals:** 1–3 metrics. Each metric has a value + a label. Optional source line.
|
|
223
|
+
|
|
224
|
+
**Wireframe (1 KPI):**
|
|
225
|
+
|
|
226
|
+
```text
|
|
227
|
+
┌──────────────────────────────────────────────────────────┐
|
|
228
|
+
│ Action title — why this number matters │ ← .slide-header
|
|
229
|
+
│ │
|
|
230
|
+
│ │
|
|
231
|
+
│ 73% │ ← .stat-value (display size)
|
|
232
|
+
│ of weekly active users │ ← .stat-label
|
|
233
|
+
│ │
|
|
234
|
+
│ │
|
|
235
|
+
│ Based on Q1 2025 telemetry · n = 1,240 │ ← .stat-caption
|
|
236
|
+
└──────────────────────────────────────────────────────────┘
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
**Wireframe (3 KPIs):**
|
|
240
|
+
|
|
241
|
+
```text
|
|
242
|
+
┌──────────────────────────────────────────────────────────┐
|
|
243
|
+
│ Action title │
|
|
244
|
+
│ │
|
|
245
|
+
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
|
|
246
|
+
│ │ 73% │ │ 2.4× │ │ 12 ms │ │ ← .stat-grid (grid auto-fit)
|
|
247
|
+
│ │ active │ │ faster │ │ p95 lat. │ │
|
|
248
|
+
│ └────────────┘ └────────────┘ └────────────┘ │
|
|
249
|
+
│ │
|
|
250
|
+
│ Source / context line │
|
|
251
|
+
└──────────────────────────────────────────────────────────┘
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
**DOM:**
|
|
255
|
+
|
|
256
|
+
```html
|
|
257
|
+
<div class="slide slide--stats">
|
|
258
|
+
<div class="slide-header">
|
|
259
|
+
<h2 class="title fade-in">{{Action title}}</h2>
|
|
260
|
+
</div>
|
|
261
|
+
<div class="stat-grid">
|
|
262
|
+
<div class="stat-item pop-in delay-1">
|
|
263
|
+
<span class="stat-value">73%</span>
|
|
264
|
+
<span class="stat-label">{{Label}}</span>
|
|
265
|
+
</div>
|
|
266
|
+
<!-- repeat 1–3 times -->
|
|
267
|
+
</div>
|
|
268
|
+
<p class="stat-caption fade-in delay-4">{{Source}}</p>
|
|
269
|
+
</div>
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**CSS:**
|
|
273
|
+
- `.stat-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: var(--sp-6); flex: 1; align-items: center; }` — auto fits 1, 2, or 3 KPIs without changing markup.
|
|
274
|
+
- `.stat-item` is itself `flex-direction: column; align-items: center` so value sits over label.
|
|
275
|
+
|
|
276
|
+
**Agent rule:** never put a 4th KPI here — if the deck has 4+ metrics, pick the most important one for W4 and move the rest to a W5 chart.
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## W5 · Full-Slide Chart
|
|
281
|
+
|
|
282
|
+
**Content signals:** trend, comparison across categories, distribution, or any data where shape matters more than a single value.
|
|
283
|
+
|
|
284
|
+
**Wireframe:**
|
|
285
|
+
|
|
286
|
+
```text
|
|
287
|
+
┌──────────────────────────────────────────────────────────┐
|
|
288
|
+
│ Action title — the insight, not the topic │ ← .slide-header
|
|
289
|
+
│ │
|
|
290
|
+
│ ┌────────────────────────────────────────────────────┐ │
|
|
291
|
+
│ │ │ │
|
|
292
|
+
│ │ │ │
|
|
293
|
+
│ │ CHART AREA │ │ ← .bar-chart / canvas
|
|
294
|
+
│ │ (≥ 70% of body height) │ ← flex: 1
|
|
295
|
+
│ │ │ │
|
|
296
|
+
│ │ │ │
|
|
297
|
+
│ └────────────────────────────────────────────────────┘ │
|
|
298
|
+
│ │
|
|
299
|
+
│ Source / one-line takeaway │ ← .chart-insight
|
|
300
|
+
└──────────────────────────────────────────────────────────┘
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
**DOM (CSS bar chart, no JS):**
|
|
304
|
+
|
|
305
|
+
```html
|
|
306
|
+
<div class="slide slide--chart">
|
|
307
|
+
<div class="slide-header">
|
|
308
|
+
<h2 class="title fade-in">{{Action title}}</h2>
|
|
309
|
+
</div>
|
|
310
|
+
<div class="bar-chart" role="img" aria-label="{{description}}">
|
|
311
|
+
<div class="bar-row">
|
|
312
|
+
<span class="bar-label">{{A}}</span>
|
|
313
|
+
<div class="bar" style="--pct:80%"><span>{{value}}</span></div>
|
|
314
|
+
</div>
|
|
315
|
+
<!-- repeat -->
|
|
316
|
+
</div>
|
|
317
|
+
<p class="chart-insight fade-in delay-3">{{Takeaway}}</p>
|
|
318
|
+
</div>
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
**DOM (canvas chart, e.g. Chart.js):** swap `.bar-chart` for `<canvas id="..." style="flex:1; width:100%;"></canvas>` and load the lib in `<head>`.
|
|
322
|
+
|
|
323
|
+
**CSS:**
|
|
324
|
+
- `.bar-chart { display: flex; flex-direction: column; gap: var(--sp-3); flex: 1; }` — chart takes all leftover height.
|
|
325
|
+
- `.bar-row { display: flex; align-items: center; gap: var(--sp-3); }` — label + bar share a row.
|
|
326
|
+
- `.bar { flex: 1; }` plus `--pct` custom property drives the fill via `::after`.
|
|
327
|
+
|
|
328
|
+
**Agent rule:** never put two charts on one slide. If two are needed, use W8 with one chart per column.
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
## W6 · Image-Led (Full-Bleed)
|
|
333
|
+
|
|
334
|
+
**Content signals:** image is the proof or the mood. Caption is optional and short.
|
|
335
|
+
|
|
336
|
+
**Wireframe:**
|
|
337
|
+
|
|
338
|
+
```text
|
|
339
|
+
┌──────────────────────────────────────────────────────────┐
|
|
340
|
+
│ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
|
|
341
|
+
│ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
|
|
342
|
+
│ ░░░░░░ IMAGE / VIDEO / PLACEHOLDER (absolute) ░░░░░░░░░ │ ← position: absolute; inset: 0
|
|
343
|
+
│ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
|
|
344
|
+
│ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
|
|
345
|
+
│ ░░░░ gradient overlay (transparent → black) ░░░░░░░░░░░ │ ← .image-overlay
|
|
346
|
+
│ Big caption on top of overlay │ ← .image-caption (absolute, bottom)
|
|
347
|
+
│ Supporting line │
|
|
348
|
+
└──────────────────────────────────────────────────────────┘
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
**DOM (image ready):**
|
|
352
|
+
|
|
353
|
+
```html
|
|
354
|
+
<div class="slide slide--image">
|
|
355
|
+
<img src="../assets/{{file}}" alt="{{alt}}">
|
|
356
|
+
<div class="image-overlay" aria-hidden="true"></div>
|
|
357
|
+
<div class="image-caption slide-up delay-1">
|
|
358
|
+
<p class="display">{{Headline}}</p>
|
|
359
|
+
<p class="subtitle">{{Supporting line}}</p>
|
|
360
|
+
</div>
|
|
361
|
+
</div>
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
**DOM (image missing):** swap `<img>` for the placeholder block:
|
|
365
|
+
|
|
366
|
+
```html
|
|
367
|
+
<div class="image-ph-bleed" aria-label="Image placeholder: {{description}}">
|
|
368
|
+
[ PLACEHOLDER: {{description}} ]
|
|
369
|
+
</div>
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
**CSS:**
|
|
373
|
+
- `.slide--image { padding: 0; overflow: hidden; }` — kills inner padding so the image truly bleeds.
|
|
374
|
+
- `.slide--image img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }` — image fills regardless of aspect ratio.
|
|
375
|
+
- `.image-overlay { position: absolute; inset: 0; background: linear-gradient(...); }` — keeps caption legible.
|
|
376
|
+
- `.image-caption { position: absolute; bottom: var(--sp-8); left/right: var(--sp-8); }` — caption pinned to bottom.
|
|
377
|
+
|
|
378
|
+
**Agent rule:** if there's no image and no overlay caption, this becomes an empty grey rectangle — switch to W1 or W2 instead.
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## W7 · Text + Visual Split (40/60)
|
|
383
|
+
|
|
384
|
+
**Content signals:** short text claim + one visual that proves it (screenshot, diagram, image, mini-chart).
|
|
385
|
+
|
|
386
|
+
**Wireframe:**
|
|
387
|
+
|
|
388
|
+
```text
|
|
389
|
+
┌──────────────────────────────────────────────────────────┐
|
|
390
|
+
│ Action title │ ← .slide-header
|
|
391
|
+
│ │
|
|
392
|
+
│ ┌──────────────┐ ┌──────────────────────────────────┐ │
|
|
393
|
+
│ │ │ │ │ │
|
|
394
|
+
│ │ Short claim │ │ │ │
|
|
395
|
+
│ │ │ │ IMAGE / DIAGRAM / │ │ ← grid 2fr / 3fr
|
|
396
|
+
│ │ → detail │ │ PLACEHOLDER │ │
|
|
397
|
+
│ │ → detail │ │ │ │
|
|
398
|
+
│ │ → detail │ │ │ │
|
|
399
|
+
│ │ │ │ │ │
|
|
400
|
+
│ └──────────────┘ └──────────────────────────────────┘ │
|
|
401
|
+
│ .col text-side .col visual-side (larger) │
|
|
402
|
+
└──────────────────────────────────────────────────────────┘
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
**DOM:**
|
|
406
|
+
|
|
407
|
+
```html
|
|
408
|
+
<div class="slide slide--content">
|
|
409
|
+
<div class="slide-header">
|
|
410
|
+
<h2 class="title fade-in">{{Action title}}</h2>
|
|
411
|
+
</div>
|
|
412
|
+
<div class="two-col" style="grid-template-columns: 2fr 3fr;">
|
|
413
|
+
<div class="col slide-up delay-1">
|
|
414
|
+
<p>{{Short claim}}</p>
|
|
415
|
+
<ul>
|
|
416
|
+
<li>{{detail}}</li>
|
|
417
|
+
<li>{{detail}}</li>
|
|
418
|
+
</ul>
|
|
419
|
+
</div>
|
|
420
|
+
<div class="col slide-up delay-2">
|
|
421
|
+
<!-- image ready: -->
|
|
422
|
+
<img src="../assets/{{file}}" alt="{{alt}}" style="width:100%; border-radius: var(--r-md);">
|
|
423
|
+
<!-- OR image missing: -->
|
|
424
|
+
<div class="image-ph" data-expected="{{description}}">
|
|
425
|
+
<div class="image-ph-inner">
|
|
426
|
+
<p class="image-ph-label">PLACEHOLDER: {{description}}</p>
|
|
427
|
+
</div>
|
|
428
|
+
</div>
|
|
429
|
+
</div>
|
|
430
|
+
</div>
|
|
431
|
+
</div>
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
**CSS:**
|
|
435
|
+
- Reuses `.two-col { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-6); flex: 1; }`.
|
|
436
|
+
- Override `grid-template-columns` inline (`2fr 3fr`) when the visual deserves more weight.
|
|
437
|
+
- `.col` and `.image-ph` already use `flex: 1` so the visual fills its column.
|
|
438
|
+
|
|
439
|
+
**Agent rule:** the visual side always carries the weight. If the visual is decorative (not proof of the claim), drop it and use W3 instead.
|
|
440
|
+
|
|
441
|
+
---
|
|
442
|
+
|
|
443
|
+
## W8 · Side-by-Side Comparison
|
|
444
|
+
|
|
445
|
+
**Content signals:** two parallel things to compare — before/after, current/proposed, option A/B, human/agent.
|
|
446
|
+
|
|
447
|
+
**Wireframe (with divider):**
|
|
448
|
+
|
|
449
|
+
```text
|
|
450
|
+
┌──────────────────────────────────────────────────────────┐
|
|
451
|
+
│ Action title — the conclusion of the comparison │
|
|
452
|
+
│ │
|
|
453
|
+
│ ┌─────────────────┐ │ ┌─────────────────┐ │
|
|
454
|
+
│ │ BEFORE │ │ │ AFTER │ │ ← grid 1fr auto 1fr
|
|
455
|
+
│ │ (muted color) │ │ │ (accent color) │ │
|
|
456
|
+
│ │ • point │ │ │ • point │ │
|
|
457
|
+
│ │ • point │ │ │ • point │ │
|
|
458
|
+
│ │ • point │ │ │ • point │ │
|
|
459
|
+
│ └─────────────────┘ │ └─────────────────┘ │
|
|
460
|
+
│ ↑ │
|
|
461
|
+
│ .cmp-divider │
|
|
462
|
+
│ │
|
|
463
|
+
│ Synthesis: what changed, what wins │
|
|
464
|
+
└──────────────────────────────────────────────────────────┘
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
**DOM (full comparison with divider):**
|
|
468
|
+
|
|
469
|
+
```html
|
|
470
|
+
<div class="slide slide--comparison">
|
|
471
|
+
<div class="slide-header">
|
|
472
|
+
<h2 class="title fade-in">{{Action title}}</h2>
|
|
473
|
+
</div>
|
|
474
|
+
<div class="comparison">
|
|
475
|
+
<div class="cmp-col cmp-before slide-up delay-1">
|
|
476
|
+
<h3>{{Before}}</h3>
|
|
477
|
+
<ul><li>{{point}}</li><li>{{point}}</li></ul>
|
|
478
|
+
</div>
|
|
479
|
+
<div class="cmp-divider fade-in delay-2"></div>
|
|
480
|
+
<div class="cmp-col cmp-after slide-up delay-3">
|
|
481
|
+
<h3>{{After}}</h3>
|
|
482
|
+
<ul><li>{{point}}</li><li>{{point}}</li></ul>
|
|
483
|
+
</div>
|
|
484
|
+
</div>
|
|
485
|
+
</div>
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
**DOM (lighter two-col, no divider):** use the `slide--two-col` template from `html-templates.md` — same grid, no `.cmp-*` color treatment.
|
|
489
|
+
|
|
490
|
+
**CSS:**
|
|
491
|
+
- `.comparison { display: grid; grid-template-columns: 1fr auto 1fr; gap: var(--sp-4); flex: 1; }` — the `auto` middle column is the divider.
|
|
492
|
+
- `.cmp-before h3 { color: var(--muted); }` and `.cmp-after h3 { color: var(--accent); }` create the "before is dim, after is bright" pattern automatically.
|
|
493
|
+
|
|
494
|
+
**Agent rule:** keep the two columns balanced — same number of bullets, same label structure. If one side has 5 bullets and the other has 1, the visual lies.
|
|
495
|
+
|
|
496
|
+
---
|
|
497
|
+
|
|
498
|
+
## W9 · Quote
|
|
499
|
+
|
|
500
|
+
**Content signals:** a direct quote (≤ 30 words) + attribution.
|
|
501
|
+
|
|
502
|
+
**Wireframe:**
|
|
503
|
+
|
|
504
|
+
```text
|
|
505
|
+
┌──────────────────────────────────────────────────────────┐
|
|
506
|
+
│ │
|
|
507
|
+
│ " │ ← .quote-mark (huge, 25% opacity)
|
|
508
|
+
│ │
|
|
509
|
+
│ Short, memorable quote in italic │ ← .quote-text (subtitle size)
|
|
510
|
+
│ that fits on two lines. │
|
|
511
|
+
│ │
|
|
512
|
+
│ — Speaker name, Title │ ← .quote-attr (small, muted)
|
|
513
|
+
│ │
|
|
514
|
+
│ │
|
|
515
|
+
└──────────────────────────────────────────────────────────┘
|
|
516
|
+
↑ vertically centered, generous padding
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
**DOM:**
|
|
520
|
+
|
|
521
|
+
```html
|
|
522
|
+
<div class="slide slide--quote">
|
|
523
|
+
<p class="quote-mark fade-in" aria-hidden="true">"</p>
|
|
524
|
+
<blockquote class="quote-text slide-up">{{Quote}}</blockquote>
|
|
525
|
+
<cite class="quote-attr fade-in delay-2">— {{Name, Title}}</cite>
|
|
526
|
+
</div>
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
**CSS:**
|
|
530
|
+
- `.slide--quote { justify-content: center; padding: var(--sp-8) calc(var(--sp-8) * 1.5); }` — extra horizontal padding gives breathing room.
|
|
531
|
+
|
|
532
|
+
**Agent rule:** if the quote does not fit in two lines comfortably, paraphrase and use W3 instead — long quotes never read well from the back of the room.
|
|
533
|
+
|
|
534
|
+
---
|
|
535
|
+
|
|
536
|
+
## W10 · Timeline / Process
|
|
537
|
+
|
|
538
|
+
**Content signals:** 3–5 ordered steps, each with a label (date, phase, name) and one short note.
|
|
539
|
+
|
|
540
|
+
**Wireframe (vertical):**
|
|
541
|
+
|
|
542
|
+
```text
|
|
543
|
+
┌──────────────────────────────────────────────────────────┐
|
|
544
|
+
│ Action title │
|
|
545
|
+
│ │
|
|
546
|
+
│ ● 2022 Q1 Started internal prototype │
|
|
547
|
+
│ │ │ ← .timeline (vertical line via ::before)
|
|
548
|
+
│ ● 2023 Q4 First customer pilot │ ← .tl-item (flex row: dot + text)
|
|
549
|
+
│ │ │
|
|
550
|
+
│ ● 2024 Q2 GA launch, 12 customers │
|
|
551
|
+
│ │ │
|
|
552
|
+
│ ● 2025 Q1 500+ customers, $4M ARR │
|
|
553
|
+
│ │
|
|
554
|
+
└──────────────────────────────────────────────────────────┘
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
**DOM:**
|
|
558
|
+
|
|
559
|
+
```html
|
|
560
|
+
<div class="slide slide--timeline">
|
|
561
|
+
<div class="slide-header">
|
|
562
|
+
<h2 class="title fade-in">{{Action title}}</h2>
|
|
563
|
+
</div>
|
|
564
|
+
<ol class="timeline">
|
|
565
|
+
<li class="tl-item slide-up delay-1">
|
|
566
|
+
<span class="tl-dot"></span>
|
|
567
|
+
<div><strong class="tl-label">{{2022 Q1}}</strong> {{Description}}</div>
|
|
568
|
+
</li>
|
|
569
|
+
<!-- repeat 3–5 times -->
|
|
570
|
+
</ol>
|
|
571
|
+
</div>
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
**CSS:**
|
|
575
|
+
- `.timeline { position: relative; }` + `.timeline::before { position: absolute; left: 0.55rem; top: 0; bottom: 0; width: 2px; }` — the vertical line.
|
|
576
|
+
- `.tl-item { display: flex; gap: var(--sp-3); }` — each row is dot + text, side by side.
|
|
577
|
+
|
|
578
|
+
**Agent rule:** order matters here. If the steps could be re-ordered without changing meaning, use W3 bullets instead.
|
|
579
|
+
|
|
580
|
+
---
|
|
581
|
+
|
|
582
|
+
## W11 · Code
|
|
583
|
+
|
|
584
|
+
**Content signals:** the implementation detail is the proof. Code block ≤ 20 lines, with a one-line takeaway.
|
|
585
|
+
|
|
586
|
+
**Wireframe:**
|
|
587
|
+
|
|
588
|
+
```text
|
|
589
|
+
┌──────────────────────────────────────────────────────────┐
|
|
590
|
+
│ Action title — what this code proves │
|
|
591
|
+
│ │
|
|
592
|
+
│ ┌────────────────────────────────────────────────────┐ │
|
|
593
|
+
│ │ │ │
|
|
594
|
+
│ │ // syntax-highlighted code │ │
|
|
595
|
+
│ │ function example() { ... } │ │ ← .code-block
|
|
596
|
+
│ │ │ ← flex: 1
|
|
597
|
+
│ │ // ≤ 20 lines, no horizontal scroll │ │
|
|
598
|
+
│ │ │ │
|
|
599
|
+
│ └────────────────────────────────────────────────────┘ │
|
|
600
|
+
│ │
|
|
601
|
+
│ Plain-English takeaway │ ← .code-caption
|
|
602
|
+
└──────────────────────────────────────────────────────────┘
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
**DOM:** see the `code` template in `html-templates.md`. Key bits:
|
|
606
|
+
|
|
607
|
+
```html
|
|
608
|
+
<pre class="code-block slide-up delay-1"><code class="language-ts">
|
|
609
|
+
{{ ≤ 20 lines }}
|
|
610
|
+
</code></pre>
|
|
611
|
+
<p class="code-caption fade-in delay-2">{{Takeaway}}</p>
|
|
612
|
+
<script>hljs.highlightAll();</script>
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
**CSS:**
|
|
616
|
+
- `.code-block { flex: 1; overflow: hidden; }` — block fills remaining height and **never scrolls** (split into multiple slides if it overflows).
|
|
617
|
+
|
|
618
|
+
**Agent rule:** if the code needs to scroll to be read, split it across two slides. If the code is decorative, switch to W3 with a one-line description.
|
|
619
|
+
|
|
620
|
+
---
|
|
621
|
+
|
|
622
|
+
## W12 · Agenda
|
|
623
|
+
|
|
624
|
+
**Content signals:** 3–5 sections in order. Each section has a name + one-line promise.
|
|
625
|
+
|
|
626
|
+
**Wireframe:**
|
|
627
|
+
|
|
628
|
+
```text
|
|
629
|
+
┌──────────────────────────────────────────────────────────┐
|
|
630
|
+
│ Agenda │
|
|
631
|
+
│ │
|
|
632
|
+
│ 01 What this is │
|
|
633
|
+
│ 02 Why now │ ← .agenda-list (flex column)
|
|
634
|
+
│ 03 How it works │ ← .agenda-list li (flex row)
|
|
635
|
+
│ 04 What's next │
|
|
636
|
+
│ │
|
|
637
|
+
└──────────────────────────────────────────────────────────┘
|
|
638
|
+
↑ numbers are accent-colored, fixed-width
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
**DOM:** see the `agenda` template in `html-templates.md`.
|
|
642
|
+
|
|
643
|
+
**CSS:**
|
|
644
|
+
- `.agenda-list { display: flex; flex-direction: column; gap: var(--sp-3); }`
|
|
645
|
+
- `.agenda-list li { display: flex; align-items: center; gap: var(--sp-3); }` — number sits left of label.
|
|
646
|
+
- `.num { min-width: 2.5rem; }` — keeps the numbers vertically aligned even with different label lengths.
|
|
647
|
+
|
|
648
|
+
**Agent rule:** if there are too many sections to fit, group them. Density limits live in `design-system.md`.
|
|
649
|
+
|
|
650
|
+
---
|
|
651
|
+
|
|
652
|
+
## W13 · Closing
|
|
653
|
+
|
|
654
|
+
**Content signals:** final statement + 1–3 takeaways or one CTA + optional links.
|
|
655
|
+
|
|
656
|
+
**Wireframe:**
|
|
657
|
+
|
|
658
|
+
```text
|
|
659
|
+
┌──────────────────────────────────────────────────────────┐
|
|
660
|
+
│ │
|
|
661
|
+
│ │
|
|
662
|
+
│ Final statement (display) │ ← .display
|
|
663
|
+
│ │
|
|
664
|
+
│ Call to action / next step │ ← .subtitle
|
|
665
|
+
│ │
|
|
666
|
+
│ [link] [link] [link] │ ← .closing-links (flex row)
|
|
667
|
+
│ │
|
|
668
|
+
│ │
|
|
669
|
+
└──────────────────────────────────────────────────────────┘
|
|
670
|
+
↑ vertically + horizontally centered
|
|
671
|
+
```
|
|
672
|
+
|
|
673
|
+
**DOM:**
|
|
674
|
+
|
|
675
|
+
```html
|
|
676
|
+
<div class="slide slide--closing">
|
|
677
|
+
<h2 class="display slide-up">{{Final statement}}</h2>
|
|
678
|
+
<p class="subtitle fade-in delay-1">{{Call to action}}</p>
|
|
679
|
+
<div class="closing-links fade-in delay-2">
|
|
680
|
+
<a href="{{URL}}">{{Link}}</a>
|
|
681
|
+
</div>
|
|
682
|
+
</div>
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
**CSS:**
|
|
686
|
+
- `.slide--closing { justify-content: center; text-align: center; }`
|
|
687
|
+
- `.closing-links { display: flex; gap: var(--sp-4); justify-content: center; }`
|
|
688
|
+
|
|
689
|
+
**Agent rule:** do not introduce new evidence on the closing slide. If a "thank you" is the only message, prefer a W2 with one strong sentence.
|
|
690
|
+
|
|
691
|
+
---
|
|
692
|
+
|
|
693
|
+
## Content → Wireframe Worked Examples
|
|
694
|
+
|
|
695
|
+
Three short examples showing how the agent should reason from a slide's notes to a wireframe choice.
|
|
696
|
+
|
|
697
|
+
### Example A
|
|
698
|
+
> *Notes:* "Octocode reduces time-to-first-answer from 14m to 3m on the auth-service repo, based on internal benchmark."
|
|
699
|
+
|
|
700
|
+
- One metric is the proof (`14m → 3m`).
|
|
701
|
+
- Pick **W4 Big Number** with one stat. Title states the claim. Caption holds the source.
|
|
702
|
+
|
|
703
|
+
### Example B
|
|
704
|
+
> *Notes:* "Show before/after of the dashboard. Before: cluttered, 6 panels, no hierarchy. After: 3 panels, one focal KPI."
|
|
705
|
+
|
|
706
|
+
- Two parallel states + visual difference matters.
|
|
707
|
+
- Pick **W8 Side-by-Side** with screenshots in each column. Mark both screenshots as `PLACEHOLDER` if the user has not provided files.
|
|
708
|
+
|
|
709
|
+
### Example C
|
|
710
|
+
> *Notes:* "Walk through how the agent calls the MCP tools — search, fetch, summarize, cite."
|
|
711
|
+
|
|
712
|
+
- 4 ordered steps.
|
|
713
|
+
- Pick **W10 Timeline**. Each step gets a label (`search`, `fetch`, `summarize`, `cite`) + one note about what the agent does.
|
|
714
|
+
|
|
715
|
+
---
|
|
716
|
+
|
|
717
|
+
## Layout Anti-Patterns
|
|
718
|
+
|
|
719
|
+
These are *layout* failures. Title-writing, density, and visual-aesthetic anti-patterns are in `design-system.md` (Slide Title Contract, Slide Density, Anti-Slop Guide) — do not duplicate them here.
|
|
720
|
+
|
|
721
|
+
| Anti-pattern | Symptom | Fix |
|
|
722
|
+
|---|---|---|
|
|
723
|
+
| Filler bullets | Bullets exist to make the slide look balanced | Remove them; switch to W2 or W4 |
|
|
724
|
+
| Visual underweight | Chart or image is < 50% of the body | Switch to W5 / W6; move commentary to caption |
|
|
725
|
+
| Decorative image | Image does not prove or set mood | Drop the image; switch to W1 / W2 / W3 |
|
|
726
|
+
| Lopsided comparison | One column is full, the other half-empty | Drop the comparison; use W3 |
|
|
727
|
+
| Region collision | Header and body overlap, or body has no `flex: 1` | Restore `.slide-header` + body region; let body fill |
|