@afokapu/atdd-bun 0.10.10 → 0.10.11

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 CHANGED
@@ -217,6 +217,21 @@ The journey view `atdd-bun docs journeys` generates is exempt from the size caps
217
217
  alone can exceed them, and never from the `docs` profile, which refuses a copy that is not exactly
218
218
  what the plan generates.
219
219
 
220
+ ## Docs-site theme
221
+
222
+ A repository that publishes its AsciiDoc docs as a site does not need its own theme.
223
+ `templates/docs/site.css` styles Asciidoctor's default HTML5 output (`toc: left`), light and
224
+ dark, and is clean under the `design` profile. Use it from the package rather than copying it,
225
+ so it stays out of your scans and updates with the toolkit. Asciidoctor embeds it into each page;
226
+ write the site to `dist/`, which no profile scans:
227
+
228
+ ```sh
229
+ asciidoctor -a stylesheet="$PWD/node_modules/@afokapu/atdd-bun/templates/docs/site.css" -D dist docs/index.adoc
230
+ ```
231
+
232
+ To re-theme it, override its custom properties (`--paper`, `--ink`, `--accent`, `--sans`, …) on
233
+ `:root` in a stylesheet of your own, using your design tokens.
234
+
220
235
  ## Agents and integrity
221
236
 
222
237
  The skill gives every coding agent the lifecycle PLAN → RED → GREEN → SMOKE → REFACTOR → TRACE and
package/integrity.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
- "version": "0.10.10",
2
+ "version": "0.10.11",
3
3
  "files": {
4
4
  "HOOK_AUDIT.md": "5329d840db37671b1918f688ead26865473b87db73dbc75f7c8b2a8bbe8d6d43",
5
5
  "PLANNER_PORT.md": "fb5935bac8b7ac18994de21e43ace3a5ef8cd55f85b0e3349fca261280054f11",
6
- "README.md": "54f6959a5fe0a83ff7ba07856f5385eff0bff0607bfe7b2287897b2d8378825e",
6
+ "README.md": "3200613045942da247f24bd54c01e6b651a0878f9b6244944e384a6731cef32e",
7
7
  "bunfig.toml": "b9fc65eca9014c5179380259d70e76385a6a80788fa9a2df5fb3eaa5554fd2fe",
8
8
  "conventions/atdd-bun.planner/atdd-bun.planner.acceptance-identity.convention.yaml": "81c5c773d5ee15e8d99a2c237aa9846b110b2533df45ebf407d0e3ec6ed3dd03",
9
9
  "conventions/atdd-bun.planner/atdd-bun.planner.identity-required.convention.yaml": "e96d7c1455d0c221072d82e7f2b55da1c4f9ceb17718eb6ed96affdeef37675b",
@@ -1215,6 +1215,7 @@
1215
1215
  "templates/agents/atdd-bun.integrity.test.ts": "dec6f6e5f65a08d9512fc703b367c163f8c9da1f6aa7fd466835c1ec30348a41",
1216
1216
  "templates/agents/atdd/SKILL.md": "8f36d7d571aa17beb03df5e620ff837be73eb21a4e73dabd2c12188d2b378022",
1217
1217
  "templates/agents/delivery/SKILL.md": "0c4fa25303ada52db9c6b67d51a4011c15039e92c4f2947994ec9cba4d0c5efa",
1218
+ "templates/docs/site.css": "482b3427e3a3cb02a85dc85cfbeac80592dfd53abf42fc92d6ea7071f22afc95",
1218
1219
  "templates/github/atdd-bun-release.yml": "d9547e9e6ef3ae010d53d55314f6a54567f88bd900f7e50d994cd308601d2684",
1219
1220
  "templates/github/atdd-bun.yml": "bb42414f72f4b9a2fb1eb69530695e193f105a984542f4ca124c898a5f1489be"
1220
1221
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@afokapu/atdd-bun",
3
- "version": "0.10.10",
3
+ "version": "0.10.11",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/afokapu/atdd-bun.git"
@@ -0,0 +1,369 @@
1
+ /* ============================================================================
2
+ atdd-bun docs-site theme. Shipped with @afokapu/atdd-bun; link it from
3
+ node_modules/@afokapu/atdd-bun/templates/docs/site.css instead of copying it.
4
+ Targets Asciidoctor's default HTML5 structure (toc: left), light + dark.
5
+ Re-theme by overriding the custom properties on :root in your own stylesheet.
6
+ Adapted from Decision OS's docs theme.
7
+ ========================================================================= */
8
+
9
+ :root {
10
+ --sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
11
+ --mono: ui-monospace, "SF Mono", "JetBrains Mono", "Cascadia Code", Menlo, Consolas, monospace;
12
+ --r: 10px;
13
+
14
+ /* motion tokens - animation is part of the vocabulary, not ad-hoc */
15
+ --dur-fast: .14s; --dur: .45s; --dur-slow: .7s;
16
+ --ease: cubic-bezier(.22, .61, .36, 1); /* gentle ease-out */
17
+
18
+ /* light - near-white ground, cards a step darker, high ink contrast */
19
+ --paper: #ffffff; --surface: #f1f5f7; --raised: #ffffff;
20
+ --ink: #131a1f; --ink-2: #47555e; --ink-3: #6e7d87;
21
+ --line: #dbe2e6; --line-2: #edf1f3;
22
+ --accent: #0b6b74; --accent-hi: #084f57; --accent-wash: #e3f0f1;
23
+ }
24
+ @media (prefers-color-scheme: dark) {
25
+ :root {
26
+ --paper: #0c1114; --surface: #121a1e; --raised: #172126;
27
+ --ink: #e7edee; --ink-2: #9aa8b0; --ink-3: #74848d;
28
+ --line: #263238; --line-2: #1e2a30;
29
+ --accent: #2ba6af; --accent-hi: #4fc2ca; --accent-wash: #103336;
30
+ }
31
+ }
32
+ :root[data-theme="light"] {
33
+ --paper: #ffffff; --surface: #f1f5f7; --raised: #ffffff;
34
+ --ink: #131a1f; --ink-2: #47555e; --ink-3: #6e7d87; --line: #dbe2e6; --line-2: #edf1f3;
35
+ --accent: #0b6b74; --accent-hi: #084f57; --accent-wash: #e3f0f1;
36
+ }
37
+ :root[data-theme="dark"] {
38
+ --paper: #0c1114; --surface: #121a1e; --raised: #172126;
39
+ --ink: #e7edee; --ink-2: #9aa8b0; --ink-3: #74848d; --line: #263238; --line-2: #1e2a30;
40
+ --accent: #2ba6af; --accent-hi: #4fc2ca; --accent-wash: #103336;
41
+ }
42
+
43
+ /* ---- base -------------------------------------------------------------- */
44
+ * { box-sizing: border-box; }
45
+ html { -webkit-text-size-adjust: 100%; }
46
+ body.article {
47
+ margin: 0; padding: 0; max-width: none;
48
+ background: var(--paper); color: var(--ink);
49
+ font-family: var(--sans); font-size: 16px; line-height: 1.6;
50
+ -webkit-font-smoothing: antialiased;
51
+ }
52
+ a { color: var(--accent); text-decoration: none; }
53
+ a:hover { text-decoration: underline; }
54
+ strong { color: var(--ink); font-weight: 640; }
55
+ em { color: var(--ink-2); }
56
+ code, .monospaced { font-family: var(--mono); font-size: .9em; }
57
+ :not(pre) > code {
58
+ background: var(--surface); border: 1px solid var(--line);
59
+ border-radius: 5px; padding: .08em .38em; color: var(--ink-2);
60
+ }
61
+
62
+ /* ---- header + left TOC sidebar ---------------------------------------- */
63
+ /* The page title used to be pinned to the top-left corner, which made a piece of fixed
64
+ chrome change on every page, and put the document's name where the site's name
65
+ belongs. It now sits at the top of the content column as an eyebrow above the
66
+ headline, and the corner holds the brand, which is the same everywhere. */
67
+ #header { margin: 0 260px 0 300px; padding: 46px 0 0; }
68
+ #header > h1 {
69
+ position: static; width: auto; z-index: auto;
70
+ margin: 0 0 4px; padding: 0; background: none; border: 0;
71
+ font-family: var(--mono); font-size: 11px; font-weight: 600;
72
+ letter-spacing: .16em; text-transform: uppercase; color: var(--ink-3);
73
+ }
74
+ #header > h1::after { content: ""; }
75
+
76
+ /* The page's OWN contents. It used to be the left rail; it is now the right one, so
77
+ that navigating BETWEEN documents and navigating WITHIN one stop sharing a column. */
78
+ #toc.toc2 {
79
+ position: fixed; top: 0; right: 0; bottom: 0; left: auto; width: 244px; z-index: 4;
80
+ overflow-y: auto; box-sizing: border-box;
81
+ /* top padding clears the theme toggle, which is fixed to this corner */
82
+ padding: 62px 16px 40px; margin: 0;
83
+ background: var(--paper); border-left: 1px solid var(--line); border-right: 0;
84
+ scrollbar-width: thin;
85
+ }
86
+ #toc.toc2 #toctitle {
87
+ display: block; font-family: var(--mono); font-size: 10.5px; font-weight: 600;
88
+ letter-spacing: .14em; text-transform: uppercase; color: var(--ink-3);
89
+ margin: 4px 8px 8px; opacity: .8;
90
+ }
91
+ #toc.toc2 ul { list-style: none; margin: 0; padding: 0; }
92
+ #toc.toc2 li { margin: 1px 0; }
93
+ #toc.toc2 a {
94
+ display: block; padding: 5px 10px; border-radius: 7px;
95
+ color: var(--ink-2); font-size: 13px; line-height: 1.4; text-decoration: none;
96
+ border-left: 2px solid transparent; transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease);
97
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
98
+ }
99
+ /* level hierarchy: section > subsection > sub-subsection */
100
+ #toc.toc2 .sectlevel1 > li > a { font-weight: 600; color: var(--ink); }
101
+ #toc.toc2 .sectlevel2 { margin: 2px 0 4px 9px; padding-left: 8px; border-left: 1px solid var(--line-2); }
102
+ #toc.toc2 .sectlevel2 > li > a { font-size: 12px; color: var(--ink-2); }
103
+ #toc.toc2 .sectlevel3 { margin-left: 8px; }
104
+ #toc.toc2 .sectlevel3 > li > a { font-size: 11.5px; color: var(--ink-3); padding-top: 3px; padding-bottom: 3px; }
105
+ #toc.toc2 a:hover { color: var(--ink); background: var(--surface); border-left-color: var(--line); }
106
+ /* scroll-spy: current heading, and its ancestor section, stay highlighted */
107
+ #toc.toc2 a.active {
108
+ color: var(--accent); border-left-color: var(--accent);
109
+ background: var(--accent-wash); font-weight: 600;
110
+ }
111
+ #toc.toc2 a.active-parent { color: var(--accent); border-left-color: var(--accent); }
112
+
113
+ /* ---- floating light/dark toggle --------------------------------------- */
114
+ #theme-toggle {
115
+ position: fixed; top: 16px; right: 18px; z-index: 20;
116
+ width: 38px; height: 38px; border-radius: 50%; cursor: pointer;
117
+ display: inline-flex; align-items: center; justify-content: center; font-size: 16px; line-height: 1;
118
+ background: var(--raised); color: var(--ink-2);
119
+ border: 1px solid var(--line); box-shadow: 0 1px 3px rgba(0,0,0,.12);
120
+ transition: transform .15s ease, color .15s ease, border-color .15s ease;
121
+ }
122
+ #theme-toggle:hover { color: var(--accent); border-color: var(--accent); transform: scale(1.06); }
123
+ #theme-toggle:active { transform: scale(.96); }
124
+ @media (max-width: 768px) { #theme-toggle { top: 10px; right: 10px; } }
125
+
126
+ /* ---- TOC show/hide toggle --------------------------------------------- */
127
+ #toc-toggle {
128
+ position: fixed; top: 15px; left: 14px; z-index: 21;
129
+ width: 30px; height: 30px; border-radius: 8px; cursor: pointer;
130
+ display: inline-flex; align-items: center; justify-content: center; font-size: 15px; line-height: 1;
131
+ background: var(--paper); color: var(--ink-3); border: 1px solid var(--line);
132
+ transition: color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease);
133
+ }
134
+ #toc-toggle:hover { color: var(--accent); border-color: var(--accent); }
135
+ #site-tree, #toc.toc2, #content, #header { transition: transform var(--dur) var(--ease), margin var(--dur) var(--ease); }
136
+ body.toc-hidden #site-tree { transform: translateX(-101%); }
137
+ body.toc-hidden #content, body.toc-hidden #header { margin-left: 0; }
138
+ /* The 900px reading frame belongs to the three-column layout. Once the site tree is hidden,
139
+ keeping that cap strands the released 300px as empty paper instead of giving it to the page. */
140
+ body.toc-hidden #content > .sect1 > .sectionbody { max-width: none; }
141
+ body.toc-hidden #toc-toggle { left: 14px; }
142
+
143
+ /* ---- content column ---------------------------------------------------- */
144
+ #content { margin-left: 300px; margin-right: 260px; padding: 4px 0 0; }
145
+ .sect1 { padding: 48px clamp(24px, 5vw, 72px); border-top: 1px solid var(--line-2); }
146
+ .sect1:first-child { border-top: 0; }
147
+ #content > .sect1 > .sectionbody { max-width: 900px; }
148
+
149
+ /* section heading + the "00 EYEBROW" line authored as a role above it */
150
+ /* section title (the short label + number) reads as a marker; the headline is the display line */
151
+ .sect1 > h2 {
152
+ font-family: var(--mono); font-size: 13px; font-weight: 600; letter-spacing: .1em;
153
+ text-transform: uppercase; color: var(--accent); margin: 0 0 8px;
154
+ }
155
+ .paragraph.headline p {
156
+ font-size: clamp(26px, 3.6vw, 40px); font-weight: 800; letter-spacing: -.02em;
157
+ line-height: 1.1; text-wrap: balance; margin: 2px 0 18px; color: var(--ink);
158
+ }
159
+ .sect2 > h3 { font-size: 19px; font-weight: 680; letter-spacing: -.01em; margin: 30px 0 10px; color: var(--ink); }
160
+ .sect3 > h4 { font-size: 15px; font-weight: 660; margin: 22px 0 8px; color: var(--ink-2); }
161
+
162
+ .eyebrow, p.eyebrow {
163
+ font-family: var(--mono); font-size: 12px; font-weight: 600;
164
+ letter-spacing: .12em; text-transform: uppercase; color: var(--accent); margin: 0;
165
+ }
166
+ .eyebrow .n { color: var(--ink-3); margin-right: 10px; }
167
+
168
+ .paragraph p { margin: 0 0 14px; color: var(--ink-2); }
169
+ .paragraph.prose p, .lead p { color: var(--ink); font-size: 17px; }
170
+
171
+ /* ---- card grid + cards (block roles [.card-grid] / [.card]) ------------ */
172
+ .card-grid > .content,
173
+ .openblock.card-grid > .content {
174
+ display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
175
+ gap: 12px; margin: 8px 0 6px;
176
+ }
177
+ .card {
178
+ background: var(--surface); border: 1px solid var(--line);
179
+ border-radius: var(--r); padding: 17px 19px; line-height: 1.6;
180
+ }
181
+ .card > p { margin: 0; color: var(--ink-2); font-size: 13.5px; line-height: 1.6; }
182
+ .card strong:first-child,
183
+ .card p:first-child strong { color: var(--ink); }
184
+ /* the small mono kicker on a card: first strong via role, or use [.k]#..# */
185
+ .card .k, .k {
186
+ display: inline-block; font-family: var(--mono); font-size: 11px; font-weight: 600;
187
+ letter-spacing: .06em; text-transform: uppercase; color: var(--accent); margin-bottom: 7px;
188
+ }
189
+ /* inline code chips get vertical air so wrapped runs don't collide */
190
+ .card, .dlist dd, #content details .content p, .stack .card { line-height: 1.65; }
191
+ .card code, .dlist code, #content details code { line-height: 1.5; }
192
+ /* accent stripe variants for the control-loop trio */
193
+
194
+ /* ---- tag pills ([.tag-pills] on a bullet list) ------------------------- */
195
+ .tag-pills ul, ul.tag-pills {
196
+ list-style: none; margin: 14px 0; padding: 0;
197
+ display: flex; flex-wrap: wrap; gap: 8px;
198
+ }
199
+ .tag-pills li {
200
+ font-family: var(--mono); font-size: 12px; color: var(--ink-2);
201
+ background: var(--surface); border: 1px solid var(--line);
202
+ border-radius: 999px; padding: 5px 12px;
203
+ }
204
+
205
+ /* node color dots + inline node roles ([.n-actor]#...#, [gdot]#o#) ---------
206
+ Every node class has a hue, including the three that went without one: Resource had none
207
+ from the day it was admitted, and Force and Potential arrived the same way. The table then
208
+ rendered five classes in colour and three in plain text, which is a claim about the
209
+ ontology that the ontology does not make. */
210
+ .gdot, .dot { color: var(--accent); }
211
+ /* highlighted spine line (verbs + nodes colored) */
212
+ .spine-line { font-family: var(--mono); font-size: 13px; line-height: 2.1; white-space: pre-line; color: var(--ink-2); }
213
+ .spine-line .v { color: var(--accent); font-weight: 600; }
214
+ .spine-line .mut { color: var(--ink-3); }
215
+ .spine-line .n-actor, .spine-line .n-outcome, .spine-line .n-capability, .spine-line .n-bet { font-weight: 600; }
216
+
217
+ /* ---- tables + the grid matrix ([.grid-matrix]) --------------------- */
218
+ table.tableblock {
219
+ border-collapse: collapse; width: 100%; margin: 14px 0; font-size: 14px;
220
+ border: 1px solid var(--line);
221
+ }
222
+ table.tableblock th, table.tableblock td {
223
+ border: 1px solid var(--line); padding: 9px 12px; text-align: left;
224
+ vertical-align: top; color: var(--ink-2);
225
+ }
226
+ table.tableblock thead th { background: var(--surface); color: var(--ink); font-weight: 660; }
227
+ table.tableblock td p, table.tableblock th p { margin: 0; }
228
+
229
+ .grid-matrix { table-layout: fixed; }
230
+ .grid-matrix th, .grid-matrix td { text-align: center; font-family: var(--mono); font-size: 12px; }
231
+ .grid-matrix thead th {
232
+ font-size: 10.5px; letter-spacing: .05em; text-transform: uppercase; color: var(--ink-3);
233
+ }
234
+ .grid-matrix td strong { color: var(--ink); }
235
+ .row-header { display: block; font-family: var(--mono); font-weight: 700; letter-spacing: .04em; }
236
+ .row-header.attr { color: var(--ink-2); font-size: 11px; }
237
+ .row-header.finance { color: var(--accent); }
238
+ /* Personal Finance OS rails, the second adaptation's columns, same five slots. */
239
+ .row-header.protect { color: var(--accent); }
240
+
241
+ /* ---- callouts / admonitions / notes ------------------------------------ */
242
+ .admonitionblock, .note-block {
243
+ background: var(--surface); border: 1px solid var(--line);
244
+ border-left: 3px solid var(--accent); border-radius: var(--r);
245
+ padding: 14px 16px; margin: 16px 0;
246
+ }
247
+ .admonitionblock td.content { color: var(--ink-2); font-size: 14px; }
248
+ .admonitionblock .title, .note-label {
249
+ font-family: var(--mono); font-size: 11px; font-weight: 600;
250
+ letter-spacing: .06em; text-transform: uppercase; color: var(--accent);
251
+ }
252
+
253
+ /* ---- listings / literal (ascii diagrams) ------------------------------- */
254
+ .listingblock pre, .literalblock pre {
255
+ background: var(--surface); border: 1px solid var(--line); border-radius: var(--r);
256
+ padding: 14px 16px; overflow-x: auto; font-family: var(--mono);
257
+ font-size: 12.5px; line-height: 1.5; color: var(--ink-2);
258
+ }
259
+
260
+ /* ---- misc lists + rules ------------------------------------------------ */
261
+ .ulist ul, .olist ol { margin: 0 0 14px; padding-left: 20px; color: var(--ink-2); }
262
+ .ulist li, .olist li { margin: 4px 0; }
263
+ hr { border: 0; border-top: 1px solid var(--line); margin: 28px 0; }
264
+
265
+ /* ---- responsive: collapse the sidebar --------------------------------- */
266
+ @media (max-width: 1024px) {
267
+ /* not enough room for two rails: the page contents fold under the content */
268
+ #toc.toc2 {
269
+ position: static; width: auto; height: auto;
270
+ border-left: 0; border-top: 1px solid var(--line);
271
+ padding: 18px 22px 30px;
272
+ }
273
+ #content, #header { margin-right: 0; }
274
+ }
275
+ @media (max-width: 768px) {
276
+ #site-tree { position: static; width: auto; border-right: 0; height: auto; }
277
+ #header { margin: 0; padding: 20px 22px 0; }
278
+ #site-tree { border-bottom: 1px solid var(--line); padding: 12px 16px; }
279
+ #content { margin-left: 0; }
280
+ }
281
+
282
+ /* wide blocks never scroll the page body */
283
+ .tableblock, .listingblock, .literalblock { overflow-x: auto; }
284
+
285
+ /* ============================================================================
286
+ Interactive / animated figures (authored via passthrough ++++ blocks).
287
+ All local + inline - no CDN, so the output stays a single standalone file.
288
+ ========================================================================= */
289
+
290
+ /* Entrance motion that CANNOT hide content.
291
+ The previous version set the class to zero opacity and relied on an `in` class to restore
292
+ it, and nothing anywhere added that class. (Written out rather than quoted, because a rule
293
+ inside a comment is indistinguishable from a real one when you grep for the bug.) Every figure on the site held its full height and showed
294
+ nothing, for as long as that shipped. The replacement animates TRANSFORM only, so opacity is
295
+ never in play: if the animation is disabled, throttled, or never runs at all, the figure is
296
+ still there. It also needs no script, no observer and no class, which is three fewer things
297
+ that can fail between a figure and a reader. */
298
+ .reveal { animation: revealIn .5s var(--ease) both; }
299
+ @keyframes revealIn { from { transform: translateY(12px); } to { transform: none; } }
300
+ @media (prefers-reduced-motion: reduce) { .reveal { animation: none; } }
301
+
302
+
303
+ /* collapsible grammar blocks ([%collapsible]) - the <details> folds */
304
+ #content details { margin: 10px 0 4px; }
305
+ #content details > summary {
306
+ cursor: pointer; font-family: var(--mono); font-size: 12px; font-weight: 600; letter-spacing: .04em;
307
+ color: var(--accent); padding: 8px 12px; background: var(--surface); border: 1px solid var(--line); border-radius: 8px;
308
+ list-style: none;
309
+ }
310
+ #content details > summary::-webkit-details-marker { display: none; }
311
+ #content details > summary::before { content: "\25B8 "; color: var(--ink-3); }
312
+ #content details[open] > summary::before { content: "\25BE "; }
313
+ #content details[open] > summary { border-radius: 8px 8px 0 0; }
314
+ #content details > .content { border: 1px solid var(--line); border-top: 0; border-radius: 0 0 8px 8px;
315
+ padding: 16px 18px; background: var(--surface); }
316
+ #content details > .content > .paragraph { margin: 12px 0; }
317
+ #content details > .content > .paragraph p { line-height: 1.7; }
318
+ #content details > .content > .paragraph:last-child p { margin-bottom: 0; }
319
+ #content details > .content > .paragraph:first-child { margin-top: 2px; }
320
+
321
+ /* one-per-row box stack: for independent boxes that shouldn't be packed in a grid */
322
+ .stack > .content { display: flex; flex-direction: column; gap: 12px; }
323
+ .stack .card { padding: 16px 20px; }
324
+
325
+ /* definition lists (dlist) - the grammar term/def */
326
+ .dlist dl { margin: 8px 0; display: grid; grid-template-columns: minmax(110px, auto) 1fr; gap: 16px 18px; align-items: baseline; }
327
+ .dlist dt { font-family: var(--mono); font-size: 12.5px; font-weight: 600; color: var(--accent); }
328
+ .dlist dd { margin: 0; font-size: 13.5px; color: var(--ink-2); line-height: 1.65; }
329
+ .dlist dd p { margin: 0; }
330
+
331
+
332
+ @media print {
333
+ /* Print is a light medium regardless of the reader's theme, so the tokens are pinned. */
334
+ :root, :root[data-theme="dark"], :root[data-theme="light"] {
335
+ --paper: #ffffff; --surface: #ffffff; --ink: #111111; --ink-2: #333333;
336
+ --ink-3: #555555; --line: #bbbbbb; --accent: #0b6b74; --accent-wash: #f2f7f7;
337
+ }
338
+ html, body { background: #fff !important; color: #111 !important; }
339
+
340
+ /* the boundary: the document, without the site around it */
341
+ #site-tree, #toc, #theme-toggle, #toc-toggle, .page-actions, .screen-only { display: none !important; }
342
+ .export-only { display: revert !important; }
343
+
344
+ /* the rails are gone, so the space reserved for them goes too */
345
+ body, body.toc2, #content, #header, .index-page {
346
+ margin-left: 0 !important; margin-right: 0 !important;
347
+ padding-left: 0 !important; padding-right: 0 !important;
348
+ max-width: none !important; width: auto !important;
349
+ }
350
+
351
+ /* decorative motion prints in the state it settles into, never mid-transition */
352
+ *, *::before, *::after {
353
+ animation: none !important; transition: none !important;
354
+ opacity: 1 !important; transform: none !important;
355
+ scroll-behavior: auto !important;
356
+ }
357
+ .reveal { opacity: 1 !important; transform: none !important; }
358
+
359
+ /* wide figures fit the page instead of being clipped at the right edge */
360
+ svg, img, figure, table, pre, .listingblock, .tableblock { max-width: 100% !important; }
361
+ svg { height: auto !important; }
362
+ .tableblock, .listingblock, .literalblock { overflow: visible !important; }
363
+
364
+ /* no heading stranded at the foot of a page, and nothing split that reads as one unit */
365
+ h1, h2, h3, h4 { break-after: avoid-page; page-break-after: avoid; }
366
+ figure, .admonitionblock, .imageblock, tr, .card { break-inside: avoid-page; page-break-inside: avoid; }
367
+ a { text-decoration: none; color: inherit; }
368
+ @page { margin: 16mm 14mm; }
369
+ }