@marver-design/marver 0.19.2 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/README.md +8 -10
  3. package/dist/{bake-kaf5kGZ7.mjs → bake-BID6mo-N.mjs} +1 -1
  4. package/dist/{boards-BmxcT3Lc.mjs → boards-BwiDAmPf.mjs} +95 -48
  5. package/dist/{boards-PuVzw5Wp.mjs → boards-DnLewfj8.mjs} +20 -11
  6. package/dist/{build-7ed5H2vT.mjs → build-C7MqQ7hq.mjs} +18 -8
  7. package/dist/cli.mjs +19 -13
  8. package/dist/{daemon-DbHvLQUL.mjs → daemon-CRZFpl6K.mjs} +1 -1
  9. package/dist/{dev-D3mP2x27.mjs → dev-BNZF4Mup.mjs} +5 -5
  10. package/dist/{init-BQYCS3EU.mjs → init-C34BY3R4.mjs} +34 -33
  11. package/dist/{manifest-B01PSyDc.mjs → manifest-mMfUhPtL.mjs} +8 -5
  12. package/dist/{plugin-DI-7NAnx.mjs → plugin-omHLCn91.mjs} +34 -26
  13. package/dist/{poster-DNh6N27C.mjs → poster-BvxiAzy1.mjs} +1 -1
  14. package/dist/{publish-bakes-Dp-ZFk3d.mjs → publish-bakes-BqzAAa3w.mjs} +8 -2
  15. package/dist/{shot-DMDvDbeP.mjs → shot-DswS4iRK.mjs} +7 -7
  16. package/docs/live-jam.md +1 -1
  17. package/docs/slides.md +89 -89
  18. package/docs/sticky-notes.md +9 -0
  19. package/package.json +1 -1
  20. package/src/client/const.ts +27 -9
  21. package/src/client/content/chart.tsx +8 -8
  22. package/src/client/content/index.tsx +5 -4
  23. package/src/client/content/slide.tsx +26 -201
  24. package/src/client/frame-host/main.tsx +10 -0
  25. package/src/client/shell/BoardList.tsx +111 -52
  26. package/src/client/shell/Comments.tsx +12 -4
  27. package/src/client/shell/Play.tsx +26 -14
  28. package/src/client/shell/Toolbar.tsx +7 -5
  29. package/src/client/shell/canvas/FrameNode.tsx +16 -2
  30. package/src/client/shell/store.ts +8 -8
  31. package/src/client/shell/styles.css +10 -9
  32. package/src/client/stage/main.tsx +56 -7
  33. package/src/shared/board-tree.ts +271 -140
  34. package/templates/AGENTS-embedded.md +3 -3
  35. package/templates/AGENTS-studio.md +3 -3
  36. package/templates/instructions/boards.md +47 -22
  37. package/templates/instructions/reference/deck-layouts.md +153 -199
  38. package/templates/instructions/reference/deck-story.md +6 -6
  39. package/templates/instructions/slides.md +275 -383
@@ -62,23 +62,33 @@ viewport and lays it out:
62
62
 
63
63
  ## Folders - organising the sidebar
64
64
 
65
- Boards can sit in folders, one level deep (folders hold boards, never folders).
66
- Files are the truth, and two files carry it:
65
+ Boards can sit in folders, two levels deep: a folder holds boards and folders, a folder
66
+ inside a folder (a **sub-folder**) holds boards only. A board can sit at the root, in a
67
+ folder, or in a sub-folder. Files are the truth, and two files carry it:
67
68
 
68
69
  - **Membership lives on the board**: `"folder": "research"` in the board file, next
69
- to `order`. `order` then ranks the board among its folder siblings (root boards and
70
- folders share the root sequence). Same grammar as board names
70
+ to `order` - always the ONE folder it sits in directly, at either level (a board in a
71
+ sub-folder names the sub-folder, never a path). `order` then ranks it among its
72
+ siblings: at every level, the boards and folders there share one sequence (the root's
73
+ boards and top-level folders; a folder's boards and sub-folders; a sub-folder's boards). Same grammar as board names
71
74
  (`^[a-z0-9][a-z0-9-]*$`); an invalid value means top level. `all-scenes` never
72
75
  lives in a folder.
73
76
  - **Folders live in `design/boards/_folders.json`** - the underscore marks it as
74
77
  infrastructure, never a board:
75
78
 
76
79
  ```json
77
- { "version": 1, "folders": [
80
+ { "version": 2, "folders": [
78
81
  { "name": "research", "order": 1, "title": "R&D", "description": "The thinking behind the live boards - specs, flows, references" },
82
+ { "name": "flows", "parent": "research", "order": 2, "description": "One board per user flow" },
79
83
  { "name": "archive", "order": 3, "description": "Retired directions and scene versions, oldest first" } ] }
80
84
  ```
81
85
 
86
+ **Nesting lives here only**: a sub-folder's entry carries `"parent": "<folder>"`, and the
87
+ file says `"version": 2` while any entry has a parent (`"version": 1` when none does - an
88
+ older Marver can read that, and refuses a version-2 file rather than lose its nesting).
89
+ A parent must itself be a registered top-level folder; a sub-folder never holds a
90
+ folder. Folder names are unique across both levels.
91
+
82
92
  A folder's `name` is its slug - the identity its boards point at with `folder`; its
83
93
  `title` (optional, free text) is what humans see, exactly as on a board; its
84
94
  `description` says what belongs in it - the next session files boards right without
@@ -87,7 +97,8 @@ Files are the truth, and two files carry it:
87
97
  It exists so an EMPTY folder can exist and so a folder has a rank at the root.
88
98
  A folder a board names but the registry lacks is still real (it sorts after the
89
99
  ranked items, by name) - two boards with `"folder": "research"` make a Research
90
- folder on their own. A malformed registry is an error the canvas shows, not an
100
+ folder on their own. Such an implied folder is always top-level: to nest it, register
101
+ it with its `parent`. A malformed registry is an error the canvas shows, not an
91
102
  empty one - fix it, never delete it.
92
103
 
93
104
  **Look before you organise: `npx marver boards`** prints the sidebar as the files say
@@ -99,39 +110,53 @@ have rearranged things since you last looked, and their arrangement stands.
99
110
  The moves, each a file edit, so the files always agree:
100
111
  - **Create** a folder: add `{ "name": "<slug>", "order": <n>, "description": "…" }`
101
112
  to the registry's `folders` (create the file if absent) - or just point a board at it.
102
- - **Move a board in**: write `"folder": "<slug>"` on the board and give it an `order`
103
- among that folder's boards. **Move it out**: delete the `folder` field and give it
104
- an `order` among the top-level items.
113
+ **Create a sub-folder**: the same entry with `"parent": "<top-level folder>"`, its
114
+ `order` among that folder's boards and sub-folders, and `"version": 2` on the file.
115
+ - **Move a folder in or out**: set its `parent` (only a folder with no sub-folders of its
116
+ own can move into another - never three levels) or delete it; re-rank the siblings you
117
+ touch, and set `"version"` to 2 while any parent remains, 1 when none does.
118
+ - **Move a board in**: write `"folder": "<slug>"` on the board - any folder, at either
119
+ level - and give it an `order` among that folder's boards and sub-folders. **Move it
120
+ out**: delete the `folder` field and give it an `order` among the top-level items.
105
121
  - **Rank** folders and boards: `order` on the board (among its siblings) and on the
106
122
  registry entry (among the top-level items). Renumber the siblings you touch.
107
123
  - **Retitle** a folder (or a board): set `title` on the registry entry (on the board
108
124
  file). **Rename a slug** - a folder's `name`, a board's file name - only when asked,
109
- and as one refactor: a folder slug is on every member's `folder` field (rewrite them
110
- all, AND the registry entry - a registry rename alone leaves the members in the old,
111
- implied folder); a board file name is in `publish.json`, in its comment threads and in
125
+ and as one refactor: a folder slug is on every member's `folder` field and on
126
+ every sub-folder's `parent` (rewrite them all, AND the registry entry - a registry rename
127
+ alone leaves the members in the old, implied folder and the sub-folders pointing at a
128
+ parent that no longer exists); a board file name is in `publish.json`, in its comment threads and in
112
129
  every path anyone copied. A title does what a rename usually wanted.
113
- - **Delete** a folder: remove `folder` from every member, then its registry entry.
114
- Folders organise, never own: deleting one never deletes a board.
115
- - The **landing board** is the first board in sidebar order, folders included -
116
- rank a folder first and its first board opens the canvas.
130
+ - **Delete** a folder: what it holds moves up one level, into its place - a top-level
131
+ folder's boards lose `folder` and its sub-folders lose `parent` (they become top-level
132
+ folders, keeping their boards); a sub-folder's boards take its parent as their `folder`.
133
+ Then remove its registry entry and re-rank the level it emptied into. Folders organise,
134
+ never own: deleting one never deletes a board.
135
+ - The **landing board** is the first board in sidebar order, reading down through
136
+ folders and sub-folders - rank a folder first and its first board opens the canvas.
117
137
 
118
138
  Use folders proactively, the way a tidy studio would: a canvas past six or eight
119
139
  boards wants grouping - the live feature boards at the top level, `research` /
120
140
  `specs` for the thinking, `decks` for slides, `archive` for history and versions
121
- last. Propose the grouping in one sentence and do it; keep folder names short and
141
+ last. Reach for a sub-folder when a folder itself grows past six or eight boards and
142
+ splits naturally (features by surface, archive by year) - not before; one level reads
143
+ faster than two. Propose the grouping in one sentence and do it; keep folder names short and
122
144
  plain.
123
145
 
124
146
  The human does all of this too - from the sidebar: New folder (right-click the Boards
125
- header, or its `+`), Rename (the title - slugs never move from the sidebar), Delete
126
- folder, "Move to …" on a board, and DRAG: boards into and out of folders, folders among
127
- boards. Each drag rewrites `order` (and
147
+ header, or its `+`), New folder inside (a top-level folder's menu), Rename (the title -
148
+ slugs never move from the sidebar), Delete folder, Move to top level (a board in a folder,
149
+ a sub-folder), Move to new folder (a board), and DRAG: boards into and out of folders at
150
+ either level, folders among boards and - when they hold no sub-folders - into a top-level
151
+ folder. Each drag rewrites `order` (and
128
152
  `folder`) on the boards it touches and the registry - the shell owns those fields
129
153
  while the canvas is open, exactly as it owns `order`; write membership and new
130
154
  folders freely, and never rewrite an arrangement the human just made. The shell
131
155
  refuses a write that would overwrite an edit it has not seen (your file write and
132
156
  the human's drag can never silently erase each other), so read a board file before
133
- you rewrite it. Published canvases show the folders of the published boards only; a
134
- folder with nothing published never reaches the bundle.
157
+ you rewrite it. Published canvases show the folders of the published boards only - a
158
+ sub-folder's parent included; a folder with nothing published at any depth never reaches
159
+ the bundle.
135
160
 
136
161
  ## The default composition: one horizontal band
137
162
 
@@ -1,186 +1,143 @@
1
- # Deck layouts - the atlas, the grid, the budgets
2
-
3
- Required reading at step 4 of every deck. The doctrine's recipe list is the core;
4
- this is the full atlas grouped by the JOB a slide does, the shared stage and the
5
- optional banded grid recipes draw from, and the content budgets that keep type at design size. The atlas
6
- is a vocabulary, not a fence: when nothing fits the concept you wrote for the
7
- slide, compose it from divs.
8
-
9
- Words used below: **kicker** = the small-caps `sl-caption` label above a title;
10
- **hero** = a card's one-line headline in `sl-support`; **ghost numeral** = a large,
11
- low-contrast number behind or beside a card that carries order; **display** =
12
- `sl-display`, the one oversize role; **stat** = `sl-stat`, the row-of-figures size.
13
-
14
- ## The stage and the banded grid (content box 1104×632px)
15
-
16
- Stage margins are asymmetric: 88px at the sides, 44px top and bottom, in px
17
- at every viewport. Every silhouette shares those margins and nothing else.
18
- The BANDED grid below is the shell for grid and split recipes that carry a
19
- title band; statements, heroes, fields, and bookends build their own
20
- geometry inside the same margins. (The doctrine's 85% rule and spacing scale
21
- govern every silhouette.)
22
-
23
- - **Title band** - the top ~113px: kicker (18px, one line) over the assertion
24
- (56px, one line), a hairline under. Within a visual group it sits in the
25
- same place on each slide, so a travelling title lands where it left.
26
- - **Body band** - full width, ~438px, starting 48px below the title block.
27
- Content fills at most ~372px of it. This band is the slide.
28
- - **Foot** - the source line (25px), 48px under the body. A takeaway bar sits
29
- between them: 56px tall, 40px clear above it.
30
- - **Split** - text left at 43% of the width, visual right at 48%, a 9% gutter.
31
- Argument reads first, proof confirms it. A `sl-assertion` in a 43% column
32
- holds ~20 characters a line - write to it.
33
- - **Columns** - three equal at a 32px gap (~347px each); five narrow (~192px)
34
- for spectrums; a 2×2 when the four cells are peers. Card padding 32px.
35
- - **Dominance before containers.** Decide what is biggest on the slide before
36
- choosing what holds the rest. Whitespace that makes the dominant object read
37
- as dominant needs no defence; a companion panel added to "fill the other
38
- half" does - if it is not evidence, leave the half empty.
39
-
40
- The banded skeleton, in the project's own Tailwind - for the grid and split
41
- slides that carry a title band, and only those:
42
-
43
- ```tsx
44
- <Slide>
45
- {/* one child at flex:1 claims the box, so the bands land in the same
46
- place across a visual group; gap 48 is the title-to-body / body-to-foot step */}
47
- <div className="flex-1 min-h-0 flex flex-col gap-12">
48
- <header className="shrink-0">
49
- <p className="sl-caption uppercase tracking-[.14em]">Retention</p>
50
- <h1 className="sl-assertion mt-2">Churn halved after onboarding v2</h1>
51
- <hr className="mt-5 border-0 h-px bg-black/10" />
52
- </header>
53
- <div className="flex-1 min-h-0 grid grid-cols-[43fr_9fr_48fr] items-center gap-8">
54
- <div className="sl-body space-y-6">…argument…</div>
55
- <div />
56
- <Chart option={…} />
57
- </div>
58
- <footer className="sl-caption shrink-0">Source: product analytics, Aug 2026</footer>
59
- </div>
60
- </Slide>
61
- ```
62
-
63
- ## The atlas (when · skeleton · budget · anchor)
64
-
65
- A recipe without a named anchor does not morph - hard cut. Anchors are named
66
- only inside a declared visual group or build; never a deck-wide fallback.
67
- Budgets are heuristics: the rendered 1280×720 frame and the Slide's overflow
68
- outline are the authority - when they disagree with a number here, the frame
69
- wins. And a slide that merely FITS is not done: the 85% rule is the bar.
1
+ # Deck layouts - an idea bank
2
+
3
+ Compositions to borrow when a slide needs a shape and none comes. Nothing
4
+ here is required and nothing has a size: the stage, the brand and the
5
+ message decide. When no idea fits what the slide has to say, compose your
6
+ own - that is what code is for.
7
+
8
+ ## Seeing a deck as silhouettes
9
+
10
+ A silhouette is the largest geometry the eye sees when the words blur. It is
11
+ the quickest way to check a deck has range:
12
+
13
+ - **statement** - one sentence owns the stage.
14
+ - **hero** - one number, quote, image or object owns most of it; the
15
+ headline frames it.
16
+ - **split** - two unequal fields: one argues, one proves.
17
+ - **grid** - a few true peers side by side.
18
+ - **stream** - a path across the stage: time, sequence, cause, hand-off.
19
+ - **field** - one chart, table, diagram or document fills the slide.
20
+ - **bookend** - cover, section turn, closing: a door, not a page.
21
+
22
+ A deck that reads as one silhouette with different words underneath looks
23
+ templated. Vary by what each message needs, not by a quota.
24
+
25
+ ## Patterns from a strong consulting deck
26
+
27
+ Thirteen slides for a finance pitch: a regular-weight sans at large sizes,
28
+ paper / ink / one blue as whole-slide tones, the client's own photography,
29
+ and a line-drawing system on a dotted grid. A shared master (the firm's
30
+ mark, "prepared for … · confidential · date") sits on every content slide.
31
+ The compositions, generically:
32
+
33
+ 1. **Paired cover** - ink ground, no master. Left half: the firm's mark ×
34
+ the client's mark, centred. Right half: one black-and-white photograph to
35
+ the edges.
36
+ 2. **Statement on ink** - the master, then one sentence at display size,
37
+ left-aligned, low on the stage. Nothing else. The opening answer.
38
+ 3. **Problem split** - left: a three-line headline, one muted paragraph, and
39
+ a wide line drawing under it. Right: three numbered failure modes, each a
40
+ hairline, a small number, a short title and one muted line.
41
+ 4. **Process with its loop** - four numbered stages along a ruled line with
42
+ small arrowheads; under them an SVG route drawn back from a later stage to
43
+ an earlier one, in the deck's one "problem" colour, captioned in the loop.
44
+ 5. **Half-bleed opportunity** - copy on the left (headline, a line, two
45
+ ruled benefits); a photograph bleeding off the right edge behind the
46
+ master, under a uniform dark scrim.
47
+ 6. **Illustrated mechanism** - headline and intro, then three columns: a
48
+ drawing on the shared grid, a hairline, a numbered step title, one line.
49
+ The accent appears in only one drawing - the step that matters most.
50
+ 7. **Principles on ink** - headline on the left; four ruled rows on the
51
+ right, each a small square drawing, a title and one line.
52
+ 8. **Two lanes** - a small badge naming the case, the headline, then a
53
+ "context" row and a "solution" row, each copy on the left and a three-step
54
+ drawn flow on the right.
55
+ 9. **Evidence on the accent ground** - the headline states the result; three
56
+ figures at display size with a short title and a line each; the source's
57
+ limits in small type at the foot.
58
+ 10. **Stage columns** - three numbered columns (analyse / build / operate),
59
+ each a title, a question and its measures, separated by hairlines.
60
+ 11. **Invitation** - a large headline and one drawing on the left; a muted
61
+ kicker and three ruled sections (who to invite, what to share, what you
62
+ get) on the right.
63
+ 12. **Photo end card** - a full-bleed photograph under a scrim, the mark
64
+ top left, the contact bottom left. No ask - that was the slide before.
65
+
66
+ What makes them work together: one master, one type voice, hairlines
67
+ instead of boxes, an accent that appears once per slide, imagery that could
68
+ only belong to this client - and each composition chosen for its message.
69
+
70
+ ## The atlas, by job
71
+
72
+ A wider vocabulary. Each is a starting point - change it until it fits.
70
73
 
71
74
  **Parallel points**
72
- - **cards** - 2-6 equal cards (kicker · hero · body), ghost numerals for order,
73
- at most ONE accented card for the emphasised option. Budget: 2-3 cards carry a
74
- body (≤120 chars, 3 lines); 4-6 cards are kicker + hero only. Anchor: the row.
75
- - **spectrum** - 3-7 narrow cards for a progression or maturity model, low to
76
- high left to right. Budget: kicker ≤8 chars, hero ≤15, body ≤40 (≤5 cards) or
77
- none (6-7).
78
- - **columns** - N headers + descriptions + an optional metric strip beneath:
79
- product lines, tracks, team areas. Budget: ≤4 columns with bodies, ≤6 without.
80
- - **stacked list** - 4-6 items in the right field, argument on the left; the
81
- numbered variant carries ghost numerals for ordered reasons. Budget: item ≤2
82
- lines at 24px. Anchor: the list.
83
- - **split** - argument left (1-3 short paragraphs, optional `sl-support`
84
- sub-head), ONE visual right (metric, card, image, chart). The workhorse of
85
- analytical slides. Anchor: the visual.
86
- - **insight + evidence** - one large insight left (≤30 words, `sl-support`),
87
- 3-4 evidence items right (one-line title + one line). Anchor: the insight.
75
+ - **cards** - a few equal items (label · title · line); one may be accented
76
+ as the recommended option.
77
+ - **spectrum** - narrow items low to high, left to right: maturity, a scale.
78
+ - **columns** - parallel headers with descriptions, an optional strip of
79
+ figures beneath.
80
+ - **stacked list** - the argument on the left, an ordered list on the right,
81
+ large ghost numerals for order.
82
+ - **insight + evidence** - one large insight on the left, three or four
83
+ short proofs on the right.
88
84
 
89
85
  **Proof**
90
- - **metric** - one hero number (`sl-display`) with label + sub-line, enclosed
91
- only when the boundary means something;
92
- pair with a split or a stat row. Budget: value ≤8 chars, label ≤20, sub ≤30.
93
- - **stat row** - 3-4 figures across in `sl-stat` with a label under each.
94
- Budget: value ≤7 chars at 3 across, ≤5 at 4; label ≤4 words. Anchor: the row.
95
- - **trajectory** - stacked from → to pairs with a label ("$100k → $480k MRR").
96
- Budget: 3-4 pairs. Anchor: the arrows.
97
- - **table** - header row with a rule under it, zebra rows, numbers right-aligned,
98
- units in the header. Budget at 24px: ≤5 columns × ≤6 rows, header ≤15 chars,
99
- cell ≤14; more than that is two slides or a chart.
100
- - **mini grid** - N×M small value + label cells with hairline dividers, for a
101
- dashboard glance. Budget: ≤12 cells (4×3).
102
- - **takeaway bar** (modifier) - a full-width dark bar at the foot with the
103
- so-what, centred, no trailing full stop, ≤12 words. Never a paraphrase of the
104
- assertion - a different angle or nothing.
86
+ - **metric** - one figure at display size, a label, a line of context.
87
+ - **stat row** - three or four figures across, a label under each.
88
+ - **trajectory** - from → to pairs ("$100k → $480k MRR").
89
+ - **table** - a header rule, quiet rows, numbers right-aligned, units in the
90
+ header. Past a handful of rows it wants to be a chart or two slides.
91
+ - **takeaway bar** - a full-width band at the foot carrying the so-what -
92
+ a different angle from the headline, never a paraphrase.
105
93
 
106
94
  **Contrast**
107
- - **before / after** - the doctrine's two-up, the "after" side accented.
108
- - **scenarios** - bear / base / bull columns over a metric list, the recommended
109
- column highlighted. Budget: 3 scenarios × ≤5 metrics.
110
-
111
- **Process** (the subject, never the provenance)
112
- - **flow** - step cards with forward arrows; ≤5 steps keep bodies, 6+ drop to
113
- labels only. Budget: label ≤15 chars, body ≤40.
114
- - **cycle** - 3-6 auto-numbered nodes around a centre; four nodes sit square at
115
- the corners, others on a circle. Budget: label ≤15, body ≤40. Anchor: the ring.
116
- - **chain** - primary chevrons for the value chain with support bars beneath (the
117
- enabling activities). Budget: ≤6 chevrons, ≤3 bars.
118
- - **swim lanes** - lanes (rows) × stages (columns) with mini-cards at the
119
- intersections: hand-offs, RACI, cross-functional flow. Budget: ≤4 lanes × ≤5
120
- columns, card ≤8 words.
121
- - **funnel** - 3-8 narrowing tiers, the drop-off stated. Budget: label + one
122
- line ≤5 tiers; labels only at 6-8.
95
+ - **before / after** - two sides, the "after" accented.
96
+ - **scenarios** - bear / base / bull columns over the same metrics, the
97
+ recommended one highlighted.
98
+
99
+ **Process** (the subject of the slide, never how the deck was made)
100
+ - **flow** - steps with forward arrows.
101
+ - **cycle** - nodes around a centre.
102
+ - **loop** - a flow with the failure path drawn back across it.
103
+ - **chain** - primary chevrons with the enabling activities as bars beneath.
104
+ - **swim lanes** - lanes × stages, small cards at the intersections.
105
+ - **funnel** - narrowing tiers with the drop-off stated.
123
106
 
124
107
  **Time**
125
- - **schedule** - sections × time columns, task bars, milestone diamonds. Budget:
126
- ≤7 rows, ≤8 columns. Anchor: the time header.
127
- - **timeline**, **roadmap phases** - the doctrine's; alternate event labels
128
- above and below the spine when they crowd.
108
+ - **timeline** - a horizontal spine with dated beats above and below.
109
+ - **roadmap phases** - phases with their contents.
110
+ - **schedule** - sections × time, task bars, milestone diamonds.
129
111
 
130
112
  **Structure and position**
131
- - **layers** - full-width stacked layers with tag pills; the foundation layer
132
- dark. Budget: ≤5 layers, ≤4 tags each.
133
- - **org** - boxes + connectors, two levels max; deeper goes to an appendix.
134
- - **venn** - 2-3 circles with 2-3 items each and a named overlap.
135
- - **concentric** - TAM / SAM / SOM rings, labels inside the rings, legend right.
136
- - **pyramid** - 3-6 trapezoid tiers, widest at the top, each tier a label + 1-3
137
- items. For priority, never for volume (that is the funnel).
138
- - **number line** - ticks with labels, one highlighted range: pricing tiers, a
139
- valuation range, benchmarks. Budget: ≤6 ticks.
140
- - **capability matrix** - competitors × capabilities with empty / half / full
141
- circles (CSS), us in the first column. Budget: ≤6 × ≤7.
113
+ - **layers** - stacked horizontal layers, the foundation darkest.
114
+ - **org** - boxes and connectors, two levels.
115
+ - **venn** - two or three circles with a named overlap.
116
+ - **concentric** - TAM / SAM / SOM rings.
117
+ - **pyramid** - tiers for priority (volume is a funnel).
118
+ - **matrix** - a 2×2 positioning with plotted items.
119
+ - **number line** - ticks with one highlighted range.
120
+ - **capability matrix** - competitors × capabilities, empty / half / full marks.
142
121
 
143
122
  **Status**
144
- - **scorecard** - rows with a red / amber / green dot + a one-line note. ≤7 rows.
145
- - **heat map** - rows × columns of RAG cells, a legend, no numbers inside cells.
146
- Budget: ≤6 × ≤6.
147
- - **tracker** - initiative · owner · phase · next milestone; or decision · owner ·
148
- date · status. Budget: ≤6 rows, owners as initials badges.
123
+ - **scorecard** - rows with a red / amber / green mark and a one-line note.
124
+ - **heat map** - rows × columns of status cells, with a legend.
125
+ - **tracker** - initiative · owner · phase · next milestone.
149
126
 
150
127
  **People and voice**
151
- - **testimonials** - 1-6 quote cards with an initials avatar, name, company -
152
- attributed voices (the doctrine's quote-wall is unattributed fragments, ≤15
153
- words). Budget: ≤25 words a quote at ≤4 cards, ≤15 at 5-6. Anchor: the avatars.
154
- - **team** - 1-8 people: initials, name (≤15 chars), role (≤22). Budget: ≤4
155
- people carry a bio (≤30 words); 5-8 are name + role.
156
- - **manifesto** - a single large claim in `sl-support` or `sl-display`, one
157
- accent-coloured phrase, an attribution line. Budget: ≤20 words. Anchor: the
158
- accent phrase.
128
+ - **quote** - the words and the person, nothing else.
129
+ - **testimonials** - a few attributed quotes with initials and company.
130
+ - **team** - people with name, role, a short bio when there are few.
131
+ - **manifesto** - one large claim with one accented phrase.
132
+ - **wall** - logos or faces in a grid, no captions.
159
133
 
160
134
  **Images**
161
- - **framed source** - a screenshot, a chart from a PDF, a product shot: the real
162
- image on the right, framing text on the left saying what it shows. The bitmap
163
- is at least 2× the CSS box it renders in. Never redraw a source chart as a
164
- fake: rebuild it as a `Chart` when the underlying data is available, embed the
165
- render when it is not.
166
-
167
- ## Budgets that keep type at design size
168
-
169
- | Element | Cap |
170
- |---|---|
171
- | card kicker · hero · body | 20 · 30 · 120 chars (bodies only at ≤3 cards) |
172
- | narrow (spectrum) card | 8 · 15 · 40 chars |
173
- | metric value · label · sub | 8 · 20 · 30 chars |
174
- | table header · cell | 15 · 14 chars, ≤5 × ≤6 |
175
- | flow / cycle label · body | 15 · 40 chars |
176
- | timeline date · title · body | 8 · 20 · 20 chars |
177
- | quote | 30 words; testimonial 25 (≤4) / 15 (5-6); quote-wall 15 |
178
- | bio | 30 words at ≤4 people; name 15 chars, role 22 |
179
- | takeaway bar | 12 words, one line |
180
- | body paragraphs | 3-5 short paragraphs, ~600 chars total |
181
-
182
- A breach is a different recipe or a split. Type never shrinks to fit - the review
183
- gate reads shrunk type as the tell it is.
135
+ - **full-bleed** - the image to every edge, a scrim, a short headline.
136
+ - **half-bleed** - copy on one side, the image bleeding off the other.
137
+ - **framed source** - a real screenshot, report page or product shot on one
138
+ side, the text saying what it shows on the other. Never redraw a source
139
+ chart as a fake: rebuild it as a `Chart` from its data, or show the real
140
+ render.
184
141
 
185
142
  ## Rebuilding an existing deck
186
143
 
@@ -188,43 +145,40 @@ When the human hands you a finished deck to rebuild on the canvas, ask which
188
145
  mode - and default to faithful:
189
146
 
190
147
  - **Faithful** - their order, their words, exactly. You may normalise
191
- punctuation (em dashes → commas or periods) and number formats; you may not
192
- change a word. Label titles stay labels. Suggested rewrites go in a comment on
193
- the frame, never on the slide.
194
- - **Editorial** (opt-in) - order kept, copy passed through the doctrine's words
195
- rules: jargon, hedges, filler out; numbers, names, dates verbatim; titles
196
- turned into assertions where the source supports the claim.
197
-
198
- Then map shapes - a companion visual ONLY where the source supplies it; a
199
- paragraph with no metric, image, or chart behind it is a text-led composition,
200
- and that whitespace is honest:
201
-
202
- | Source shape | Layout |
148
+ punctuation and number formats; you may not change a word. Suggested
149
+ rewrites go in a comment on the frame, never on the slide.
150
+ - **Editorial** (opt-in) - order kept, copy passed through the slides
151
+ guide's words: jargon, hedges and filler out; numbers, names and dates
152
+ verbatim; titles turned into claims where the source supports them.
153
+
154
+ Then map shapes - a companion visual only where the source supplies one; a
155
+ paragraph with no metric, image or chart behind it is a text-led
156
+ composition, and that whitespace is honest:
157
+
158
+ | Source shape | Composition |
203
159
  |---|---|
204
160
  | a paragraph | split when the source has a companion (metric, image, chart); else text-led |
205
- | 3 bullets | cards |
161
+ | 3 bullets | cards or columns |
206
162
  | 4-6 bullets | stacked list (numbered if ordered) |
207
- | up to 4 numbers | metric grid or stat row |
163
+ | up to 4 numbers | stat row or metric grid |
208
164
  | a quote | quote |
209
- | a table | table (or two slides past the budget) |
165
+ | a table | table, or two slides when it is long |
210
166
  | a chart with its data | `Chart` from the data |
211
- | an image, chart, schedule, diagram you cannot rebuild losslessly | framed source |
167
+ | an image, chart, schedule or diagram you cannot rebuild losslessly | framed source |
212
168
 
213
169
  ## Charts and diagrams - the extra mile
214
170
 
215
- - **Decision flows**: boil choices to yes / no, quantify the branches (%, volumes)
216
- so the eye follows the path that matters, hang customer quotes on the node
217
- they support.
218
- - **Waterfalls** beat tables for build-ups and breakdowns: left to right in the
219
- logical order, the one or two bars that matter highlighted, a few callouts that
220
- pre-empt the room's questions.
221
- - **When a slide must be complex**: large visual cues (boxes, highlights) on the
222
- point, grouping and colour that steer interpretation, and the voiceover ON the
223
- page - the slide must make sense with no presenter.
224
- - **Aggregate.** The chart is not the model. Single series is fine. Overlay
225
- detail (lines, shading) on the base chart instead of adding a second chart.
226
- - **Formatting**: label bars directly and drop the value axis when the chart is
227
- simple (keep the axis for dense or grouped series); growth rates visible; one
228
- label size across the deck; series in logical order (base first, growth
229
- next); same hue = same thing on every slide; charts aligned to the grid and to
230
- each other across slides.
171
+ - **Decision flows**: boil choices to yes / no, quantify the branches (%,
172
+ volumes) so the eye follows the path that matters, hang customer quotes on
173
+ the node they support.
174
+ - **Waterfalls** beat tables for build-ups and breakdowns: left to right in
175
+ the logical order, the one or two bars that matter highlighted, a few
176
+ callouts that pre-empt the room's questions.
177
+ - **When a slide must be complex**: large visual cues on the point, grouping
178
+ and colour that steer the reading, and the voiceover ON the page - the
179
+ slide must make sense with no presenter.
180
+ - **Aggregate.** The chart is not the model. A single series is fine.
181
+ Overlay detail on the base chart instead of adding a second chart.
182
+ - **Formatting**: label bars directly and drop the value axis when the chart
183
+ is simple; growth rates visible; one label size across the deck; series in
184
+ logical order; the same hue means the same thing on every slide.
@@ -1,7 +1,7 @@
1
1
  # Deck story - the argument before the slides
2
2
 
3
- The slides doctrine (instructions/slides.md) gives the pipeline. This file is the
4
- depth behind steps 1-3: how to find the answer, shape the argument, calibrate it to
3
+ The slides guide (instructions/slides.md) gives the method. This file is the
4
+ depth behind its first steps: how to find the answer, shape the argument, calibrate it to
5
5
  the room, and write words that carry it. Pull it when the material is thin or
6
6
  rich, the audience is senior, or the first slide list reads like a table of
7
7
  contents.
@@ -91,9 +91,9 @@ proposed in the frame's comment - that is writing, not invention.
91
91
  ("Decide fast", "See everything"), and use it identically everywhere it applies.
92
92
  - **Mine the material for specifics** and keep them verbatim: "19 of 25 operators"
93
93
  beats "most operators"; "$100k to $480k MRR" (from X to Y) beats "grew strongly".
94
- - **Assertions fit their box.** ~40 characters full-width, ~20 inside a split,
95
- two lines the ceiling - compress the phrasing, keep the claim, never shrink
96
- the type, and check the render.
94
+ - **Headlines fit their composition.** A headline that runs to three or four
95
+ lines usually holds two ideas - compress the phrasing, keep the claim, and
96
+ check the render: where the line breaks is part of the design.
97
97
  - **Paragraphs over bullets for narrative.** 15-30 words, one to three per block.
98
98
  Bullets are for parallel lists and action items; a bullet with "and" is two.
99
99
  - **Tone follows the energy.** Urgent: "Double down now or miss the target."
@@ -102,7 +102,7 @@ proposed in the frame's comment - that is writing, not invention.
102
102
  - **Voice follows the deck type.** Strategy commits to positions. A pitch is warm
103
103
  and aspirational. A case study attributes results to named actions. A status
104
104
  update is crisp - state, delta, next.
105
- - **Kill list, extended.** Beyond the doctrine's: "utilize", "unlock", "harness",
105
+ - **Kill list, extended.** Beyond the guide's: "utilize", "unlock", "harness",
106
106
  "empower", "seamless", "delve", "unleash", "synergize", "operationalize",
107
107
  "cutting-edge", "best-in-class", "at the end of the day", "in terms of".
108
108
  - **The ask closes.** Decision, owner, date: "Approve $200k for Q3 retention by