rikiki-deck 0.6.0 → 0.7.2

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 (174) hide show
  1. package/.claude/skills/rikiki-debug/SKILL.md +17 -7
  2. package/.claude/skills/rikiki-deck/SKILL.md +362 -77
  3. package/.claude/skills/rikiki-theme/SKILL.md +1 -1
  4. package/README.md +69 -50
  5. package/bin/lib/assemble.mjs +154 -0
  6. package/bin/lib/box-geometry.mjs +66 -0
  7. package/bin/lib/browser.mjs +302 -0
  8. package/bin/lib/check-api.d.ts +28 -0
  9. package/bin/lib/check-api.mjs +6 -0
  10. package/bin/lib/check-plugins.mjs +228 -0
  11. package/bin/lib/check.mjs +1347 -0
  12. package/bin/lib/cli-error.mjs +26 -0
  13. package/bin/lib/component-deps.mjs +69 -0
  14. package/bin/lib/diff.mjs +275 -0
  15. package/bin/lib/export-pdf.mjs +65 -0
  16. package/bin/lib/graph-hit.mjs +86 -0
  17. package/bin/lib/inline.mjs +137 -39
  18. package/bin/lib/narrative.mjs +77 -0
  19. package/bin/lib/prune-icons.mjs +104 -0
  20. package/bin/lib/render.mjs +195 -0
  21. package/bin/lib/scan-external.mjs +126 -0
  22. package/bin/lib/starter.mjs +27 -14
  23. package/bin/lib/visual.mjs +120 -0
  24. package/bin/rikiki.mjs +420 -35
  25. package/dist/annotation-marks.d.ts +60 -0
  26. package/dist/annotation-marks.js +1 -0
  27. package/dist/bar-segments.d.ts +28 -0
  28. package/dist/bar-segments.js +1 -0
  29. package/dist/browser-location.d.ts +3 -0
  30. package/dist/browser-location.js +1 -0
  31. package/dist/cards-syntax.d.ts +31 -0
  32. package/dist/cards-syntax.js +6 -0
  33. package/dist/{plugins/click-stages.d.ts → click-stages.d.ts} +1 -1
  34. package/dist/deck-agenda.d.ts +25 -0
  35. package/dist/deck-agenda.js +6 -0
  36. package/dist/deck-annotate.d.ts +108 -0
  37. package/dist/deck-annotate.js +18 -0
  38. package/dist/deck-bar.d.ts +32 -0
  39. package/dist/deck-bar.js +19 -0
  40. package/dist/deck-bento.d.ts +38 -0
  41. package/dist/deck-bento.js +4 -0
  42. package/dist/{molecules/deck-callout.d.ts → deck-callout.d.ts} +2 -0
  43. package/dist/deck-callout.js +1 -1
  44. package/dist/deck-cell.d.ts +19 -0
  45. package/dist/deck-cell.js +1 -0
  46. package/dist/deck-checklist.d.ts +20 -0
  47. package/dist/deck-checklist.js +1 -0
  48. package/dist/{layouts/deck-cover.d.ts → deck-cover.d.ts} +8 -0
  49. package/dist/deck-cover.js +9 -6
  50. package/dist/deck-csv.d.ts +38 -0
  51. package/dist/deck-csv.js +15 -0
  52. package/dist/deck-feature-cards.js +2 -2
  53. package/dist/deck-feature.d.ts +18 -0
  54. package/dist/deck-feature.js +2 -2
  55. package/dist/deck-figure.d.ts +26 -0
  56. package/dist/deck-figure.js +8 -0
  57. package/dist/deck-fit.d.ts +14 -0
  58. package/dist/deck-fit.js +1 -0
  59. package/dist/deck-flow.d.ts +41 -0
  60. package/dist/deck-flow.js +7 -0
  61. package/dist/deck-graph.d.ts +92 -0
  62. package/dist/deck-graph.js +25 -0
  63. package/dist/deck-grid.js +1 -1
  64. package/dist/deck-icon.d.ts +20 -0
  65. package/dist/deck-icon.js +1 -0
  66. package/dist/{atoms/deck-kicker.d.ts → deck-kicker.d.ts} +5 -0
  67. package/dist/deck-kicker.js +1 -1
  68. package/dist/deck-kpi-grid.d.ts +26 -0
  69. package/dist/deck-kpi-grid.js +4 -0
  70. package/dist/deck-link.d.ts +21 -0
  71. package/dist/deck-link.js +1 -0
  72. package/dist/{molecules/deck-md.d.ts → deck-md.d.ts} +3 -0
  73. package/dist/deck-md.js +8 -3
  74. package/dist/deck-mermaid.js +15 -3
  75. package/dist/deck-outline.d.ts +50 -0
  76. package/dist/deck-outline.js +1 -0
  77. package/dist/deck-overview.js +53 -39
  78. package/dist/deck-persona.d.ts +31 -0
  79. package/dist/deck-persona.js +6 -0
  80. package/dist/deck-photo.js +1 -1
  81. package/dist/deck-point.d.ts +22 -0
  82. package/dist/deck-point.js +1 -0
  83. package/dist/deck-presenter.js +120 -48
  84. package/dist/deck-pull.d.ts +13 -0
  85. package/dist/deck-pull.js +1 -0
  86. package/dist/{atoms/deck-punch.d.ts → deck-punch.d.ts} +6 -0
  87. package/dist/deck-punch.js +1 -1
  88. package/dist/deck-quote.d.ts +28 -0
  89. package/dist/deck-quote.js +6 -0
  90. package/dist/{runtime/deck-root.d.ts → deck-root.d.ts} +88 -8
  91. package/dist/deck-root.js +17 -13
  92. package/dist/deck-section.js +2 -2
  93. package/dist/deck-source.d.ts +12 -0
  94. package/dist/deck-source.js +2 -0
  95. package/dist/deck-split.d.ts +30 -0
  96. package/dist/deck-split.js +5 -3
  97. package/dist/{molecules/deck-stat.d.ts → deck-stat.d.ts} +2 -0
  98. package/dist/deck-stat.js +2 -2
  99. package/dist/{molecules/deck-step-list.d.ts → deck-step-list.d.ts} +8 -0
  100. package/dist/deck-step-list.js +4 -2
  101. package/dist/deck-table.d.ts +26 -0
  102. package/dist/deck-table.js +1 -0
  103. package/dist/deck-takeaway.d.ts +18 -0
  104. package/dist/deck-takeaway.js +2 -2
  105. package/dist/deck-timeline.d.ts +37 -0
  106. package/dist/deck-timeline.js +5 -0
  107. package/dist/deck-transition.js +3 -3
  108. package/dist/deck-versus.d.ts +18 -0
  109. package/dist/deck-versus.js +9 -0
  110. package/dist/deep-link.d.ts +29 -0
  111. package/dist/deep-link.js +1 -0
  112. package/dist/escape-html.d.ts +3 -0
  113. package/dist/escape-html.js +1 -0
  114. package/dist/fit-controller.d.ts +27 -0
  115. package/dist/fit-controller.js +1 -0
  116. package/dist/graph-layout.d.ts +35 -0
  117. package/dist/graph-layout.js +1 -0
  118. package/dist/grid-tracks.d.ts +17 -0
  119. package/dist/grid-tracks.js +1 -0
  120. package/dist/icon-set.d.ts +6 -0
  121. package/dist/icon-set.js +1 -0
  122. package/dist/index.d.ts +37 -31
  123. package/dist/index.js +95 -49
  124. package/dist/keymap.d.ts +40 -0
  125. package/dist/keymap.js +1 -0
  126. package/dist/mouse-nav.d.ts +12 -0
  127. package/dist/mouse-nav.js +1 -0
  128. package/dist/navigation.d.ts +25 -0
  129. package/dist/navigation.js +1 -0
  130. package/dist/parse-csv.d.ts +9 -0
  131. package/dist/parse-csv.js +3 -0
  132. package/dist/shared-styles.js +1 -1
  133. package/dist/shiki.d.ts +8 -0
  134. package/dist/signature.d.ts +2 -0
  135. package/dist/signature.js +1 -0
  136. package/dist/slide-fill.d.ts +8 -0
  137. package/dist/slide-fill.js +1 -0
  138. package/dist/standalone.js +301 -169
  139. package/dist/vendor/THIRD-PARTY-NOTICES.txt +4347 -0
  140. package/dist/vendor/inventory.json +3029 -0
  141. package/dist/vendor/lit.js +62 -2
  142. package/dist/vendor/mermaid.min.js +95 -95
  143. package/dist/vendor/shiki.js +1 -57
  144. package/dist/viewport.d.ts +42 -0
  145. package/dist/viewport.js +1 -0
  146. package/docs/llms/rikiki-reference.md +955 -64
  147. package/docs/llms/rikiki-workflow.md +536 -0
  148. package/llms.txt +39 -12
  149. package/package.json +33 -12
  150. package/themes/rikiki.css +173 -47
  151. package/themes/siliceum.css +171 -51
  152. package/dist/layouts/deck-feature.d.ts +0 -11
  153. package/dist/layouts/deck-split.d.ts +0 -18
  154. package/dist/layouts/deck-takeaway.d.ts +0 -11
  155. package/dist/plugins/shiki.d.ts +0 -8
  156. /package/dist/{runtime/color.d.ts → color.d.ts} +0 -0
  157. /package/dist/{atoms/deck-badge.d.ts → deck-badge.d.ts} +0 -0
  158. /package/dist/{molecules/deck-card.d.ts → deck-card.d.ts} +0 -0
  159. /package/dist/{atoms/deck-code-highlighter.d.ts → deck-code-highlighter.d.ts} +0 -0
  160. /package/dist/{atoms/deck-code.d.ts → deck-code.d.ts} +0 -0
  161. /package/dist/{layouts/deck-feature-cards.d.ts → deck-feature-cards.d.ts} +0 -0
  162. /package/dist/{molecules/deck-grid.d.ts → deck-grid.d.ts} +0 -0
  163. /package/dist/{runtime/deck-help.d.ts → deck-help.d.ts} +0 -0
  164. /package/dist/{molecules/deck-mermaid.d.ts → deck-mermaid.d.ts} +0 -0
  165. /package/dist/{molecules/deck-metric.d.ts → deck-metric.d.ts} +0 -0
  166. /package/dist/{runtime/deck-notes.d.ts → deck-notes.d.ts} +0 -0
  167. /package/dist/{runtime/deck-overview.d.ts → deck-overview.d.ts} +0 -0
  168. /package/dist/{layouts/deck-photo.d.ts → deck-photo.d.ts} +0 -0
  169. /package/dist/{runtime/deck-presenter.d.ts → deck-presenter.d.ts} +0 -0
  170. /package/dist/{layouts/deck-section.d.ts → deck-section.d.ts} +0 -0
  171. /package/dist/{molecules/deck-shortcut.d.ts → deck-shortcut.d.ts} +0 -0
  172. /package/dist/{molecules/deck-stack.d.ts → deck-stack.d.ts} +0 -0
  173. /package/dist/{molecules/deck-tier-list.d.ts → deck-tier-list.d.ts} +0 -0
  174. /package/dist/{runtime/deck-transition.d.ts → deck-transition.d.ts} +0 -0
@@ -0,0 +1,536 @@
1
+ # Writing a deck with an agent · the working guide
2
+
3
+ This is the short path from a brief to a file someone can present. It is
4
+ written for an agent driving `rikiki-deck` from an install, and it assumes no
5
+ particular tool beyond a shell and a browser.
6
+
7
+ Read this end to end once. After that, jump to the step you are on.
8
+
9
+ The exhaustive tag, attribute and token tables are in
10
+ [`rikiki-reference.md`](./rikiki-reference.md); this guide says when to reach
11
+ for them. What makes a slide worth projecting is §14 there, and it is the one
12
+ section to read before writing any content.
13
+
14
+ ## Work as a pipeline
15
+
16
+ The reliable unit is a handoff, not a prompt that asks one agent to write and
17
+ judge a complete deck. Use these passes when you can delegate them:
18
+
19
+ | Pass | Produces | Must not do |
20
+ |---|---|---|
21
+ | Planner | contract, fact ledger, slide plan | write HTML or fill unknown facts |
22
+ | Writer | HTML and speaker notes | add claims outside the ledger |
23
+ | Content critic | story and evidence findings | edit the deck |
24
+ | Visual critic | image based findings for every state | approve its own changes |
25
+ | Integrator | corrected deck and final report | hide unresolved findings |
26
+
27
+ Keep the artifacts in a temporary work directory. The slide plan is the
28
+ handoff: one row per slide with `id`, room question, claim, evidence,
29
+ composition, source and note purpose. The fact ledger lists every number,
30
+ quote, date and external asset with its source or `TODO`. If delegation is not
31
+ available, perform the same passes sequentially and save the artifacts before
32
+ moving on. The writer and critics must not be the same pass, even when they are
33
+ the same model.
34
+
35
+ Critics report `blocker`, `fix` or `choice`, each tied to a slide id. The
36
+ integrator resolves blockers first, then fixes, and leaves choices that alter
37
+ the argument or tone for the user. Any structural change starts another
38
+ content and visual review.
39
+
40
+ A small handoff directory is enough:
41
+
42
+ ```text
43
+ deck-work/
44
+ contract.md audience, decision, duration, acceptance
45
+ facts.md allowed claims, values, sources, TODOs, assets
46
+ plan.md one row per slide, in order
47
+ content-review.md findings keyed by slide id
48
+ visual-review.md findings keyed by slide id and render state
49
+ ```
50
+
51
+ Each pass ends with a short status line (`PLAN_READY`, `DECK_WRITTEN`,
52
+ `CONTENT_REVIEWED`, `VISUAL_REVIEWED` or `DELIVERY_READY`) and a list of open
53
+ findings. This gives the next agent a stopping point and makes an incomplete
54
+ run visible instead of turning silence into approval.
55
+
56
+ Use these boundaries in the agent prompts:
57
+
58
+ ```text
59
+ PLANNER: You may inspect the brief and its sources. Produce contract.md,
60
+ facts.md and plan.md. Do not write HTML. Mark unknowns TODO. End PLAN_READY.
61
+
62
+ WRITER: Read only contract.md, facts.md, plan.md and the component reference.
63
+ Write the deck and notes. Do not add facts or change slide ids. End
64
+ DECK_WRITTEN with a list of TODOs and files changed.
65
+
66
+ CONTENT CRITIC: Read contract.md, facts.md, plan.md and the deck. Do not edit.
67
+ Check argument, title sequence, evidence, sources, notes and duration. Return
68
+ findings as [severity, slide id, evidence, proposed action]. End
69
+ CONTENT_REVIEWED.
70
+
71
+ VISUAL CRITIC: Read the rendered images and manifest, including reveal states.
72
+ Do not edit. Check hierarchy, density, alignment, balance, legibility and
73
+ whether the evidence is visible. Return [severity, slide id/state, observation,
74
+ proposed action]. End VISUAL_REVIEWED.
75
+
76
+ INTEGRATOR: Apply blocker and fix findings that do not change the user's
77
+ argument or tone. Leave choices visible. Run check and render for the whole
78
+ deck. End DELIVERY_READY only when no blocker or TODO remains.
79
+ ```
80
+
81
+ The prompt is a boundary, not a substitute for judgment: the critic must cite
82
+ the artifact or rendered state that supports a finding, and the integrator must
83
+ keep an unresolved choice visible rather than silently deciding it.
84
+
85
+ **The seven steps**
86
+
87
+ 1. [Fill the gaps in the brief](#1--fill-the-gaps-in-the-brief)
88
+ 2. [Propose a plan](#2--propose-a-plan)
89
+ 3. [Choose the compositions](#3--choose-the-compositions)
90
+ 4. [Write the slides](#4--write-the-slides)
91
+ 5. [Render and check](#5--render-and-check)
92
+ 6. [Fix](#6--fix)
93
+ 7. [Deliver](#7--deliver)
94
+
95
+ ---
96
+
97
+ ## 1 · Fill the gaps in the brief
98
+
99
+ Before writing a single slide, write down the editorial contract. It is nine
100
+ lines and it decides everything after it.
101
+
102
+ ```markdown
103
+ - Audience: who is in the room, and what they already know
104
+ - Decision: what they should do, decide or understand differently
105
+ - Duration: minutes, which caps the slide count
106
+ - Language: the deck's language, which sets `<html lang>`
107
+ - Context: projected, read alone, or both
108
+ - Theme: rikiki, siliceum, or a constraint from a brand
109
+ - Sources: what you were given, and what is quotable from it
110
+ - Missing: what you had to ask for or assume
111
+ - Acceptance: what must be true for the deck to be useful
112
+ ```
113
+
114
+ Ask for what is missing rather than inventing it. If asking is not possible,
115
+ write the assumption into `Missing:` and carry it into the deck's notes, so the
116
+ person presenting knows what to verify before standing up.
117
+
118
+ **Duration is measured in words, not in slides.** The slide count is a poor
119
+ proxy: nine light slides fill ten minutes, nine dense ones fill thirty. Speech
120
+ runs at 130 to 160 words a minute at a normal pace, and public speaking on
121
+ technical material sits nearer 100 to 120. So a twenty-minute talk is roughly
122
+ 2,400 spoken words, and those words live in `<deck-notes>`, not on the slides.
123
+
124
+ Write the notes as what you would say, and `rikiki check` will compare their
125
+ length to the `duration` on the cover. It reports the gap as an estimate, never
126
+ as a verdict: what a speaker adds around a slide is not in the file.
127
+
128
+ **Never invent a number, a quotation or a source.** Not a rounded figure, not a
129
+ plausible date, not an attribution. If the brief gives you a number, use it
130
+ exactly and keep where it came from in `<deck-notes>`. If a slide needs a figure
131
+ you were not given, mark it in the deck itself:
132
+
133
+ ```html
134
+ <deck-stat num="TODO" tone="orange">
135
+ <h3 slot="claim">conversion rate</h3>
136
+ to confirm with the data team before the talk
137
+ </deck-stat>
138
+ ```
139
+
140
+ A visible gap gets filled before the talk. An invented number gets presented.
141
+
142
+ ## 2 · Propose a plan
143
+
144
+ Give the talk a shape before giving it slides. The one that carries a technical
145
+ argument alternates between what is and what could be: the situation, then the
146
+ gap, then what closes it, tightening until the last slide only has to name the
147
+ action. Each return to "what is" costs the audience nothing and buys the next
148
+ claim.
149
+
150
+ Three columns, before any HTML:
151
+
152
+ ```
153
+ # The question the room is asking here → What this slide answers → With what
154
+ 2 Why should I care? Deploys fail on Friday the CI graph
155
+ 3 What causes it? Nothing gates the tag the pipeline rules
156
+ 4 What would fix it? Before / after two columns
157
+ 5 What do I do Monday? Gate the tag the takeaway
158
+ ```
159
+
160
+ **A slide that answers no open question is cut or moved.** That single check
161
+ removes the "while we're at it" slides a subject list always grows. And a
162
+ question still open at the end needs a slide: if nothing answers "what do I do
163
+ Monday", the deck has no ending.
164
+
165
+ Two shapes cover almost every technical talk. Pick one and keep it.
166
+
167
+ - **Situation, complication, question, answer** · the shared ground, what
168
+ disrupts it, the question that follows, your answer with its support.
169
+ Minto's structure, and the one that carries a recommendation best.
170
+ - **What is, what could be** · alternate present and possible, each return to
171
+ "what is" buying the next claim.
172
+
173
+ **Read the titles in sequence, aloud, before writing any body.** They must form
174
+ a text that stands on its own. A title that names a subject rather than a claim
175
+ breaks the chain; a title you could move without loss means there is no story.
176
+ `rikiki render` writes the titles into its manifest, so the same test runs on a
177
+ deck already written.
178
+
179
+ Before HTML, freeze the plan and fact ledger. A plan row is complete only when
180
+ the evidence earns the claim and the source is known. A component name,
181
+ decorative idea or topic label is not evidence. The writer is allowed to turn
182
+ the plan into markup, shorten wording and choose a documented variant; it is
183
+ not allowed to invent a fact to make a slide feel complete.
184
+
185
+ ## 3 · Choose the compositions
186
+
187
+ Pick per slide, from the intent, not from the tag you remember. The recipes are
188
+ in [§Recipes](#recipes) below. When two fit, take the one with fewer elements.
189
+
190
+ ## 4 · Write the slides
191
+
192
+ Start from a real file:
193
+
194
+ ```sh
195
+ npx rikiki init talk.html --title "…" --theme rikiki
196
+ ```
197
+
198
+ That writes an editable deck and copies the runtime beside it. Then edit the
199
+ HTML directly. Two rules that save a rewrite:
200
+
201
+ - **Give every slide a stable `id`.** `<deck-feature id="ci-gate">`. It is how
202
+ `render` selects it, how `check` reports it, and how you edit one slide later
203
+ without touching the rest.
204
+ - **An attribute a component does not read is dropped in silence.** `deck-stat`
205
+ takes `num` and its words as content; writing `label="…"` on it loses the
206
+ label with no error anywhere. `check` reports these as `UNKNOWN_ATTRIBUTE`,
207
+ and the reference tables say what each element accepts.
208
+ - **Put detail in `<deck-notes>`, not on the slide.** The presenter window (`P`)
209
+ shows them, the projector does not. Sources, figures to verify and the
210
+ sentence you would say belong there.
211
+
212
+ Write one slide at a time from its plan row, then check the row against the
213
+ HTML before moving on. Keep the planned `id`, claim and evidence visible in the
214
+ working notes. This prevents a late slide from becoming a second conclusion or
215
+ from quietly changing the argument because a component was easier to fill.
216
+
217
+ ## 5 · Render and check
218
+
219
+ Never claim a deck works without having looked at it.
220
+
221
+ ```sh
222
+ npx rikiki check talk.html # what is wrong, where, and what to try
223
+ npx rikiki render talk.html # one picture per slide + a gallery
224
+ npx rikiki render talk.html --steps # each revealed state, not just the first
225
+ ```
226
+
227
+ `check` exits 0 when nothing blocks, 1 on defects, 2 when it could not look at
228
+ the deck at all. Read the pictures too: `check` measures, it does not judge. A
229
+ green report on an ugly slide is still an ugly slide.
230
+
231
+ Run a content review before the visual review. The content review reads the
232
+ contract, plan, title sequence and notes and asks whether each slide answers an
233
+ open question, whether each claim has evidence, whether every factual item is
234
+ in the ledger, and whether the notes sound spoken rather than projected.
235
+
236
+ The visual review reads the rendered images, including every `--steps` state.
237
+ Look for one focal point, a readable title, a coherent alignment axis, useful
238
+ occupation of the canvas, and diagrams or images that can be understood at the
239
+ intended distance. Record findings with slide ids and concrete changes; do not
240
+ silently rewrite while reviewing. After integration, run `check` and render the
241
+ whole deck again.
242
+
243
+ Read what the report says it did **not** check. It does not read your wording,
244
+ your figures or your argument. Those are yours.
245
+
246
+ ## 6 · Fix
247
+
248
+ When a slide is too full, try these in order and stop at the first that works.
249
+ The order matters: the early moves keep the deck's shape, the late ones change
250
+ it.
251
+
252
+ 1. **Cut the repetition.** The title already says it; the body does not have to.
253
+ 2. **Shorten.** Sentences to clauses, clauses to words.
254
+ 3. **Move detail into `<deck-notes>`.** It is still said, just not projected.
255
+ 4. **Split the slide.** Two slides with one idea each beat one with two.
256
+ 5. **Change the composition.** A list that will not fit is often a comparison, a
257
+ flow, or a single number.
258
+ 6. **Adjust the type,** last and within the readable floor. Below the floor the
259
+ back row loses the line, which is worse than a split.
260
+
261
+ **Edit narrowly.** A request about one slide changes that slide. Keep the ids
262
+ stable, leave the others byte for byte, and re-run `check` on the whole deck
263
+ afterwards to be sure the edit did not move anything else.
264
+
265
+ ## 7 · Deliver
266
+
267
+ Three shapes, three audiences:
268
+
269
+ ```sh
270
+ npx rikiki bundle talk.html # one HTML file · opens offline, anywhere
271
+ npx rikiki export talk.html # PDF, one page per slide
272
+ # the source folder itself # for whoever will edit it next
273
+ ```
274
+
275
+ The bundle needs `rolldown`, the PDF needs `playwright`; both are optional peers
276
+ and both say so when missing. `bundle` exits non-zero if the result would still
277
+ fetch anything, so a file it accepts really opens on a plane.
278
+
279
+ Before handing over: run `check` one last time, open the PDF, and say what you
280
+ did not verify.
281
+
282
+ ---
283
+
284
+ ## Recipes
285
+
286
+ Nine compositions by intent. Each says what it is for, what to put in it, how
287
+ much fits, what the notes carry, when to split, and one variant. Every HTML
288
+ block below is checked by the repository's test suite, so it is copy-paste
289
+ correct, but the words in it are placeholders: replace them with the brief's.
290
+
291
+ The house style behind all of them: the title states the message in a full
292
+ sentence, the body is the evidence, one loud thing per slide.
293
+
294
+ That is the assertion-evidence structure, and it is here because it was
295
+ measured, not because it reads better. Against the usual topic headline over a
296
+ bullet list, audiences understood and remembered more, with the difference
297
+ statistically significant; a later study on 110 engineering students found the
298
+ same, plus fewer misconceptions, lower perceived cognitive load and stronger
299
+ recall at a delayed test. It is the slide-level form of Mayer's multimedia
300
+ principles: one channel per idea, nothing on the slide that does not serve it,
301
+ words beside the thing they describe.
302
+
303
+ Two consequences worth stating plainly:
304
+
305
+ - **A bullet list read aloud is worse than no slide.** The audience reads and
306
+ listens to the same words at once, which the redundancy principle predicts
307
+ will cost them, and the studies above measured.
308
+ - **Cutting is a design act.** Removing what does not serve the claim improves
309
+ comprehension on its own · that is the coherence principle, and it is the
310
+ cheapest edit available.
311
+
312
+ Reference §14 carries the projection-specific rules that follow from this.
313
+
314
+ ### 1 · Assertion and proof
315
+
316
+ **For:** the default content slide. A claim, and the thing that makes it true.
317
+
318
+ ```html
319
+ <deck-feature id="ci-gate" eyebrow="Delivery">
320
+ <h1 slot="title">A tag that publishes runs fewer checks than a branch push</h1>
321
+ <deck-callout type="warn">
322
+ On a tag pipeline the branch variable is empty, so only the publish job runs.
323
+ </deck-callout>
324
+ <deck-notes>Source: the pipeline definition, job rules. Say the consequence out loud.</deck-notes>
325
+ </deck-feature>
326
+ ```
327
+
328
+ **Fits:** one claim, one block of proof, three lines at most in it.
329
+ **Notes:** the source, and the sentence you would add if asked.
330
+ **Split when:** the proof needs two blocks. Two claims are two slides.
331
+ **Variant:** swap the callout for a `<deck-code>` when the proof is code.
332
+
333
+ ### 2 · Comparison
334
+
335
+ **For:** two options, two states, before and after.
336
+
337
+ ```html
338
+ <deck-split id="before-after" eyebrow="Migration">
339
+ <h1 slot="title">Moving the gate to the tag removes the only unchecked path</h1>
340
+ <deck-card slot="left" color="grey">
341
+ <h3>Before</h3>
342
+ <p>The tag publishes on 61 unit tests.</p>
343
+ </deck-card>
344
+ <deck-card slot="right" color="green">
345
+ <h3>After</h3>
346
+ <p>The tag runs what a branch push runs.</p>
347
+ </deck-card>
348
+ </deck-split>
349
+ ```
350
+
351
+ **Fits:** two columns, one heading and two lines each. Never three columns of
352
+ prose; the eye compares two things, not three.
353
+ **Notes:** what the comparison costs, which never fits on the slide.
354
+ **Split when:** each side needs its own evidence. Then it is two assertion
355
+ slides and a takeaway.
356
+ **Variant:** `<deck-feature-cards>` for three short parallel items where nothing
357
+ is being weighed against anything.
358
+
359
+ ### 3 · One number, and what it means
360
+
361
+ **For:** a figure that carries the slide on its own.
362
+
363
+ ```html
364
+ <deck-feature id="drift" eyebrow="Measured" spread="center">
365
+ <h1 slot="title">Nine tracked files drifted from their sources on a clean build</h1>
366
+ <deck-stat num="9" tone="orange">
367
+ <h3 slot="claim">files rebuilt differently</h3>
368
+ plus one that was never committed at all
369
+ </deck-stat>
370
+ <deck-notes>Measured on a clean tree, 2026-09-08. The tenth file is the deck-point declaration.</deck-notes>
371
+ </deck-feature>
372
+ ```
373
+
374
+ **Fits:** one number. A second number on the same slide halves the first one's
375
+ weight.
376
+ **Notes:** how it was measured, and when. A figure with no method is a rumour.
377
+ **Split when:** you have three numbers. That is a `deck-kpi-grid`, or three
378
+ slides if each deserves a sentence.
379
+ **Variant:** `<deck-punch>` when the point is a phrase rather than a figure.
380
+
381
+ ### 4 · A process
382
+
383
+ **For:** ordered stages, where the shape is half the message.
384
+
385
+ ```html
386
+ <deck-feature id="loop" eyebrow="Workflow" spread="center">
387
+ <h1 slot="title">Every deck goes through the same four gestures</h1>
388
+ <deck-step-list>
389
+ <deck-step n="1">Write the HTML</deck-step>
390
+ <deck-step n="2">Render and check</deck-step>
391
+ <deck-step n="3">Fix what it names</deck-step>
392
+ <deck-step n="4">Bundle or export</deck-step>
393
+ </deck-step-list>
394
+ </deck-feature>
395
+ ```
396
+
397
+ **Fits:** three to five stages, four words each.
398
+ **Notes:** what happens between the stages.
399
+ **Split when:** a stage needs a sentence. Give it its own slide and keep the
400
+ list as the map.
401
+ **Variant:** `<deck-flow>` (opt-in, one script tag) when the stages should
402
+ reveal one at a time under `steps`.
403
+
404
+ ### 5 · Code, explained
405
+
406
+ **For:** the line that matters, not the file it lives in.
407
+
408
+ ```html
409
+ <deck-feature id="peer" eyebrow="Packaging">
410
+ <h1 slot="title">The bundler loads on first use, so an install never pays for it</h1>
411
+ <deck-code lang="ts" hero>
412
+ async function loadRolldown() {
413
+ try {
414
+ return (await import('rolldown')).rolldown;
415
+ } catch {
416
+ throw new ExpectedError('install it next to rikiki-deck: npm i -D rolldown');
417
+ }
418
+ }
419
+ </deck-code>
420
+ <deck-notes>~55 MB of native bindings · optional peer, reported when missing.</deck-notes>
421
+ </deck-feature>
422
+ ```
423
+
424
+ **Fits:** eight to twelve lines. Past that nobody reads it, they wait for you to
425
+ explain it.
426
+ **Notes:** the part you will say instead of reading the code aloud.
427
+ **Split when:** two functions. Show the call site on one slide, the body on the
428
+ next, and use `data-morph` if you want them to connect.
429
+ **Variant:** `step-groups` on `<deck-code>` to walk through the same block line
430
+ group by line group.
431
+
432
+ ### 6 · An architecture
433
+
434
+ **For:** how the parts sit together. Boxes and arrows, never paragraphs.
435
+
436
+ ```html
437
+ <deck-feature id="layers" eyebrow="Architecture" spread="center">
438
+ <h1 slot="title">The commands share one browser layer and own none of it</h1>
439
+ <deck-mermaid>graph LR
440
+ CLI[rikiki CLI] --> B[browser layer]
441
+ B --> R[render]
442
+ B --> C[check]
443
+ B --> E[export]</deck-mermaid>
444
+ <deck-notes>Lazy Playwright, a local server, the settle, and closing both on the way out.</deck-notes>
445
+ </deck-feature>
446
+ ```
447
+
448
+ **Fits:** five to seven boxes. A diagram nobody can read in five seconds is a
449
+ handout, not a slide, and `check` reports in pixels when one stops fitting.
450
+ **Notes:** the boundary the diagram cannot draw.
451
+ **Split when:** the diagram has layers. Show the shape first, then one layer per
452
+ slide.
453
+ **Variant:** a screenshot with `<deck-annotate>` markers when the subject is a
454
+ real interface rather than a structure.
455
+
456
+ `<deck-mermaid>` needs the mermaid runtime: `rikiki init --with-mermaid`, or
457
+ `rikiki bundle --with-mermaid` when folding the deck into one file.
458
+
459
+ ### 7 · Change over time
460
+
461
+ **For:** what moved, and in which direction.
462
+
463
+ ```html
464
+ <deck-feature id="weight" eyebrow="Before / after">
465
+ <h1 slot="title">Naming the published assets cut the site from 400 MB to 14</h1>
466
+ <deck-metric-list>
467
+ <deck-metric value="14.3 MB">Published site, down from 400 MB</deck-metric>
468
+ <deck-metric value="7 entries">What a browser is allowed to fetch</deck-metric>
469
+ </deck-metric-list>
470
+ <deck-notes>The old build copied the sources, the fixtures and 366 MB of dependencies.</deck-notes>
471
+ </deck-feature>
472
+ ```
473
+
474
+ **Fits:** two or three rows. A table of eight belongs in the notes or a handout.
475
+ **Notes:** what the change cost, and what it did not fix.
476
+ **Split when:** the trend needs a curve. That is an image, and it gets a slide.
477
+ **Variant:** `<deck-bar>` (opt-in) when a proportion, rather than a delta, is the
478
+ point.
479
+
480
+ ### 8 · A decision and its trade-off
481
+
482
+ **For:** the choice made, and what was given up for it.
483
+
484
+ ```html
485
+ <deck-split id="decision" eyebrow="Decision">
486
+ <h1 slot="title">We ship the assembler rather than drop it from the reference</h1>
487
+ <deck-card slot="left" color="green">
488
+ <h3>What we gain</h3>
489
+ <p>A documented command a consumer can actually run.</p>
490
+ </deck-card>
491
+ <deck-card slot="right" color="grey">
492
+ <h3>What it costs</h3>
493
+ <p>One more public surface to keep working.</p>
494
+ </deck-card>
495
+ <deck-notes>Alternative considered: delete the section. Rejected, the feature is useful.</deck-notes>
496
+ </deck-split>
497
+ ```
498
+
499
+ **Fits:** one decision, one gain, one cost.
500
+ **Notes:** the alternatives you rejected, and why. That is the question you will
501
+ be asked.
502
+ **Split when:** there are three options. Compare them on one slide, then decide
503
+ on the next.
504
+ **Variant:** `<deck-checklist>` when the decision is a set of criteria rather
505
+ than a trade.
506
+
507
+ ### 9 · The close
508
+
509
+ **For:** the last slide. What you want them to do.
510
+
511
+ ```html
512
+ <deck-takeaway id="close">
513
+ <h1>Gate the tag on the same checks as main, this sprint</h1>
514
+ <p>One pipeline change, no new tooling.</p>
515
+ </deck-takeaway>
516
+ ```
517
+
518
+ **Fits:** one sentence, one qualifier. No summary, no thank-you slide, no
519
+ questions slide.
520
+ **Notes:** the first thing you will say when the talk stops.
521
+ **Split when:** never. If two actions are needed, name the first one.
522
+ **Variant:** `<deck-cover>` again with the contact details when the deck will be
523
+ read alone rather than presented.
524
+
525
+ ---
526
+
527
+ ## Where to look next
528
+
529
+ | Question | Where |
530
+ |---|---|
531
+ | Every tag, attribute, slot and token | `rikiki-reference.md` |
532
+ | What makes a slide worth projecting | reference §14 |
533
+ | Themes and design tokens | reference §11 |
534
+ | Reveals, steps and animation | reference §7 |
535
+ | The three ways a deck runs | reference §16 |
536
+ | Diagnostic codes and the manifest | reference §12b |
package/llms.txt CHANGED
@@ -1,11 +1,11 @@
1
1
  # Rikiki
2
2
 
3
- > Rikiki is a tiny (~12 KB gzip) Lit Web Components framework for technical
3
+ > Rikiki is a tiny (~43 KB gzip) Lit Web Components framework for technical
4
4
  > presentations and product carousels. A deck is plain HTML: load a theme
5
5
  > stylesheet, then the component bundle, then write a `<deck-root>` wrapping
6
6
  > `deck-*` slide elements. No build step to author or run a deck.
7
7
 
8
- This reference documents rikiki v0.6.0.
8
+ This reference documents rikiki v0.7.2.
9
9
 
10
10
  The framework is opinionated:
11
11
 
@@ -17,16 +17,20 @@ The framework is opinionated:
17
17
 
18
18
  ## Reference
19
19
 
20
- - [Full LLM reference](docs/llms/rikiki-reference.md): the single source of truth · every tag, attribute, slot, design token, plugin, and recipe in one file. Read this first.
21
- - [README](README.md): human overview, common patterns, build/theming notes.
22
- - [starter.html](starter.html): the minimal copy-paste deck skeleton.
20
+ - [Working guide](docs/llms/rikiki-workflow.md): the short path from a brief to a
21
+ file someone can present · seven steps, an editorial contract, nine
22
+ compositions by intent with checked HTML, and the order to try fixes in. Start
23
+ here; it says when to open the reference.
24
+ - [Full LLM reference](docs/llms/rikiki-reference.md) (served at `/rikiki/docs/llms/rikiki-reference.md`): the single source of truth · every tag, attribute, slot, design token, plugin, and recipe in one file. Read this first.
25
+ - [README](README.md): human overview, common patterns, theming notes.
26
+ - `npx rikiki init <name>.html`: writes a starter deck plus the runtime it loads, next to it. Nothing to copy by hand.
23
27
 
24
28
  ## Components
25
29
 
26
30
  Authoring tags fall into four buckets (see the reference for the exhaustive attribute/slot tables):
27
31
 
28
- - **Layouts (slide-level, direct children of `<deck-root>`)**: `<deck-cover>` · `<deck-section>` · `<deck-feature>` · `<deck-split>` · `<deck-feature-cards>` · `<deck-photo>` · `<deck-takeaway>`
29
- - **Molecules (composed containers)**: `<deck-callout>` · `<deck-card>` · `<deck-md>` · `<deck-mermaid>` · `<deck-stat>` · `<deck-metric-list>` / `<deck-metric>` · `<deck-tier-list>` / `<deck-tier>` / `<deck-tier-arrow>` · `<deck-step-list>` / `<deck-step>` · `<deck-shortcut-list>` / `<deck-shortcut>` / `<deck-kbd>` · `<deck-stack>` · `<deck-grid>`
32
+ - **Layouts (slide-level, direct children of `<deck-root>`)**: `<deck-cover>` · `<deck-section>` · `<deck-feature>` · `<deck-split>` · `<deck-feature-cards>` · `<deck-photo>` · `<deck-takeaway>` · `<deck-bento>`
33
+ - **Molecules (composed containers)**: `<deck-callout>` · `<deck-card>` · `<deck-md>` · `<deck-mermaid>` · `<deck-stat>` · `<deck-metric-list>` / `<deck-metric>` · `<deck-tier-list>` / `<deck-tier>` / `<deck-tier-arrow>` · `<deck-step-list>` / `<deck-step>` · `<deck-shortcut-list>` / `<deck-shortcut>` / `<deck-kbd>` · `<deck-stack>` · `<deck-grid>` · `<deck-point>` / `<deck-cell>` / `<deck-fit>` / `<deck-csv>` (the bento family · reach for `<deck-point>` when a bento item holds words, and `<deck-cell>` when it holds something measured such as fit-to-cell text, a diagram or an image)
30
34
  - **Atoms (primitives)**: `<deck-badge>` · `<deck-kicker>` · `<deck-punch>` · `<deck-code>`
31
35
  - **Runtime (authoring touchpoints)**: `<deck-root>` (navigation host) · `<deck-notes>` (speaker notes, read by the presenter window)
32
36
 
@@ -34,17 +38,40 @@ Authoring tags fall into four buckets (see the reference for the exhaustive attr
34
38
 
35
39
  - **Transitions**: `transition="slide|slide-up|slide-down|slide-right|fade|zoom|flip"` on `<deck-root>` (per-slide `data-transition`).
36
40
  - **Presenter window**: press `P` · mirrors current + next slide, timer, and `<deck-notes>`. With a second screen it sends the slides fullscreen to the projector and keeps the presenter view on the speaker's screen; previews are 16:9; the projected deck auto-hides its chrome while it's open.
37
- - **Shiki highlighting**: the built-in `deck-code` highlighter only knows js/ts/json/html/xml/svg/css/scss/less; any other `lang` is silently colored as JS (no error). For any other language, install Shiki **after** `dist/index.js`: `import { installShiki } from './dist/shiki.js'` then `await installShiki({ theme, langs })` (list every language the deck uses in `langs`).
41
+ - **Shiki highlighting**: the built-in `deck-code` highlighter knows js/ts/json/html/xml/svg/css/scss/less. The optional offline Shiki runtime provides TextMate highlighting for ts/typescript, js/javascript, html, css and json with the bundled `one-dark-pro` theme: `import { installShiki } from './dist/shiki.js'` then `await installShiki({ theme: 'one-dark-pro', langs })`. List only the supported languages the deck uses.
38
42
  - **Click-stages**: `import { installClickStages } from './dist/click-stages.js'` then `installClickStages()` · per-element `data-click` / `data-anim` / `data-morph` reveals.
39
43
  - **Slide zoom**: Ctrl/⌘+wheel / pinch / `+`/`-`/`0` magnify a slide (fixed canvas, on by default, pan by drag/wheel); `no-zoom` on `<deck-root>` opts out.
40
44
  - **Writing a plugin**: `deckRoot.use(plugin)` with a `DeckPlugin` (`steps` / `applyStep` / `navigate` / `setup` hooks); `setDeckCodeHighlighter(fn)` overrides `<deck-code>` highlighting. Both re-exported from `dist/index.js`. `installShiki` / `installClickStages` are back-compat shims.
41
45
  - **Livereload (authoring only)**: append `?live` to the deck URL.
42
46
 
43
- ## Build & assembly
47
+ ## The CLI · what a consumer runs
44
48
 
45
- - [Multi-deck assembler](docs/llms/rikiki-reference.md): split a talk into `parts/*.html` / `*.md`, list them in `deck.config.js`, run `npm run deck <config>`.
46
- - [Example multi-file deck](decks/example/deck.config.js): a runnable assembly config.
47
- - [Single-file bundler](bundle.mjs): `node bundle.mjs <deck>.html` inlines theme + bundle + Lit into one self-contained HTML file.
49
+ Every command below works from an install, with no clone and no build step.
50
+
51
+ - `npx rikiki init <name>.html` · an editable source deck, plus the runtime
52
+ copied into `./rikiki/` beside it. Serve that folder over HTTP · ES modules do
53
+ not load from `file://`. Needs nothing but Node.
54
+ - `npx rikiki bundle <deck>.html [out.html]` · folds theme, runtime and images
55
+ into one self-contained file, curated to the components the deck uses. Needs
56
+ the optional peer `rolldown`.
57
+ - `npx rikiki render <deck>.html [--out dir] [--slides a,b] [--steps] [--baseline dir]` · one PNG
58
+ per slide, a gallery and a `manifest.json` tying each picture to the slide it
59
+ came from. This is how an agent sees a deck. `--baseline <dir>` compares each
60
+ fresh picture to the same-named one of an earlier render and ranks the slides
61
+ by how much moved. Needs the optional peer `playwright`.
62
+ - `npx rikiki check <deck>.html [--json] [--steps]` · measures the deck in a browser and
63
+ reports what is wrong: a runtime that never loaded, a missing file, a
64
+ misspelled `deck-*` element, content clipped by the slide, text too small for
65
+ a room, content painting outside its box or over a sibling, graph nodes
66
+ overlapping each other. `--json` writes a versioned report to stdout and
67
+ nothing else; `--steps` measures every revealed state of a slide instead of
68
+ its opening one. Exit 0 clean, 1 defects found, 2 could not look. Needs
69
+ `playwright`.
70
+ - `npx rikiki export <deck>.html [--output deck.pdf]` · one PDF page per slide.
71
+ Needs the optional peer `playwright`.
72
+ - `npx rikiki skills` · installs the three agent skills into `.claude/skills/`.
73
+
74
+ A missing optional peer is reported with the command that installs it.
48
75
 
49
76
  ## Optional
50
77