gp-dimm-city 1.0.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 (58) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/LICENSE +32 -0
  3. package/README.md +165 -0
  4. package/components.yaml +832 -0
  5. package/fonts/lixdu/LICENSE.txt +34 -0
  6. package/fonts/lixdu/lixdu.woff +0 -0
  7. package/fonts/titillium-web/OFL.txt +93 -0
  8. package/fonts/titillium-web/titillium-web-400-italic.ttf +0 -0
  9. package/fonts/titillium-web/titillium-web-400.ttf +0 -0
  10. package/fonts/titillium-web/titillium-web-600-italic.ttf +0 -0
  11. package/fonts/titillium-web/titillium-web-600.ttf +0 -0
  12. package/fonts/titillium-web/titillium-web-700-italic.ttf +0 -0
  13. package/fonts/titillium-web/titillium-web-700.ttf +0 -0
  14. package/fonts/tomorrow/OFL.txt +93 -0
  15. package/fonts/tomorrow/tomorrow-400-italic.ttf +0 -0
  16. package/fonts/tomorrow/tomorrow-400.ttf +0 -0
  17. package/fonts/tomorrow/tomorrow-500-italic.ttf +0 -0
  18. package/fonts/tomorrow/tomorrow-500.ttf +0 -0
  19. package/fonts/tomorrow/tomorrow-700-italic.ttf +0 -0
  20. package/fonts/tomorrow/tomorrow-700.ttf +0 -0
  21. package/images/brick-bg-01.png +0 -0
  22. package/package.json +78 -0
  23. package/plugin.js +2131 -0
  24. package/snippets/alert.md +2 -0
  25. package/snippets/block.md +5 -0
  26. package/snippets/callout.md +5 -0
  27. package/snippets/card.md +11 -0
  28. package/snippets/chapter-start-page.md +11 -0
  29. package/snippets/credits-page.md +13 -0
  30. package/snippets/definition.md +7 -0
  31. package/snippets/dm-note.md +5 -0
  32. package/snippets/gear.md +9 -0
  33. package/snippets/learning-path.md +10 -0
  34. package/snippets/lede.md +5 -0
  35. package/snippets/outcome.md +8 -0
  36. package/snippets/procedure.md +7 -0
  37. package/snippets/sidebar.md +7 -0
  38. package/snippets/skill.md +9 -0
  39. package/snippets/specialty-art.md +5 -0
  40. package/snippets/specialty-card.md +5 -0
  41. package/snippets/specialty.md +11 -0
  42. package/snippets/toc-page.md +15 -0
  43. package/styles/components/callouts.css +227 -0
  44. package/styles/components/cards.css +487 -0
  45. package/styles/components/chrome.css +483 -0
  46. package/styles/components/data.css +1026 -0
  47. package/styles/components/images.css +215 -0
  48. package/styles/components/section.css +1074 -0
  49. package/styles/components/specialty-identity.css +315 -0
  50. package/styles/components/specialty.css +273 -0
  51. package/styles/dc-component-defaults.css +214 -0
  52. package/styles/dc-core.css +268 -0
  53. package/styles/dc-fonts.css +107 -0
  54. package/styles/dc-identity.css +66 -0
  55. package/styles/dc-native.css +330 -0
  56. package/styles/dc-palette.css +198 -0
  57. package/styles/page-rules.css +207 -0
  58. package/styles/page-templates.css +636 -0
@@ -0,0 +1,832 @@
1
+ # Dimm City component catalog — the machine-readable ground truth for the
2
+ # component library that gp-dimm-city ships.
3
+ #
4
+ # WHAT THIS IS
5
+ # One entry per component: what an author writes, what lands in the HTML,
6
+ # which custom properties are public, how it fragments, and which stylesheet
7
+ # owns it. The Dimm City Design Guide (a book in the dc-op-manual repo)
8
+ # explains and demonstrates the components; this file is the catalog of
9
+ # record. It is the file package.json declares as `gutterpress.components` —
10
+ # Gutterpress only checks that the file exists, so the schema below is this
11
+ # package's own. Paths are relative to the package root.
12
+ #
13
+ # FIELDS
14
+ # name (kebab, unique) · status · origin (plugin | author | core — who puts
15
+ # the class in the DOM) · recipe · emits (DOM strings, one or a list) · css
16
+ # (package-relative paths; required for live/unused, and at least one must
17
+ # style one of the entry's classes) · tokens (must be declared under
18
+ # styles/) · breaks (documentation; omitted where the component has no
19
+ # fragmentation rule of its own — variants inherit their parent's) · usage
20
+ # (literal strings that mark a use of a component with no marker or class:
21
+ # `ROLL THE DIE!`, `| highlight`, `variant=panel`, …) · unstyled (emitted
22
+ # classes acknowledged to have no CSS) · notes.
23
+ #
24
+ # Status meanings (measured against the Dimm City books that consume this
25
+ # package — the Field Guide, the Design Guide, SysOps):
26
+ # live at least one class styled; used at least once in a book;
27
+ # plugin-origin entries must actually be emitted/parsed
28
+ # unused styled or emitted, but used by no book
29
+ # retired no class styled, none emitted, none used (a retired marker
30
+ # may still be parsed as a no-op stripper)
31
+ # unimplemented no class styled, none emitted — documented or authored,
32
+ # never built.
33
+ #
34
+ # THE RULE
35
+ # Give every component an honest status, and every new macro or `.dc-*`
36
+ # class an entry. Nothing checks this file automatically beyond its `css:`
37
+ # paths existing (test/package.test.js), so keep it accurate by hand.
38
+ #
39
+ # Order: plugin macros, plugin-emitted internals, author classes, unused,
40
+ # retired, unimplemented.
41
+
42
+ components:
43
+ # ── Plugin macros and alerts ───────────────────────────────────────────
44
+ - name: alert
45
+ status: live
46
+ origin: plugin
47
+ recipe: "> [!NOTE] | > [!WARNING] | > [!DM] | > [!VIBE] | > [!ORIGIN] | > [!VISIT] | > [!GEAR] (GFM-style blockquote; the label is added automatically)"
48
+ emits:
49
+ - div.dc-alert.dc-note > span.dc-alert-label
50
+ - div.dc-alert.dc-note.warning > span.dc-alert-label
51
+ - div.dc-alert.dc-dm-note > span.dc-alert-label
52
+ - div.dc-alert.dc-vibe-callout > span.dc-alert-label
53
+ - div.dc-alert.dc-origin-callout > span.dc-alert-label
54
+ - div.dc-alert.dc-visit-callout > span.dc-alert-label
55
+ - div.dc-alert.dc-gear-callout > span.dc-alert-label
56
+ css: [styles/components/callouts.css, styles/dc-native.css]
57
+ tokens:
58
+ - --dc-alert-bg
59
+ - --dc-alert-border
60
+ - --dc-alert-fg
61
+ - --dc-alert-label-color
62
+ - --dc-alert-border-width
63
+ - --dc-alert-label-size
64
+ - --dc-alert-body-size
65
+ - --dc-alert-label-weight
66
+ - --dc-alert-label-spacing
67
+ - --dc-alert-label-margin
68
+ - --dc-alert-margin-top
69
+ breaks: "break-inside: avoid, relaxed to auto inside .gp-columns-2/-3 (dc-native.css)"
70
+ notes: "`warning` is an unprefixed modifier on .dc-note. The blockquote form is single-block; use @callout for multi-paragraph bodies."
71
+
72
+ - name: callout
73
+ status: live
74
+ origin: plugin
75
+ recipe: "@callout variant=note|warning|dm|vibe|origin|visit|gear label=\"…\" … @end-callout"
76
+ emits:
77
+ - div.dc-alert.dc-note > span.dc-alert-label
78
+ - div.dc-alert.dc-note.warning
79
+ - div.dc-alert.dc-dm-note
80
+ - div.dc-alert.dc-vibe-callout
81
+ - div.dc-alert.dc-origin-callout
82
+ - div.dc-alert.dc-visit-callout
83
+ - div.dc-alert.dc-gear-callout
84
+ css: styles/components/callouts.css
85
+ breaks: "as alert"
86
+ notes: "Same DOM and tokens as alert; the macro form allows multiple paragraphs and a custom label."
87
+
88
+ - name: dm-note
89
+ status: live
90
+ origin: plugin
91
+ recipe: "@dm-note label=\"…\" … @end-dm-note"
92
+ emits: div.dc-alert.dc-dm-note > span.dc-alert-label
93
+ css: [styles/components/callouts.css, styles/dc-native.css]
94
+ breaks: "as alert; first child glued to the box start (dc-native.css)"
95
+ notes: "Sugar for @callout variant=dm. Used by the design guide only."
96
+
97
+ - name: flavor
98
+ status: live
99
+ origin: plugin
100
+ recipe: "> [!FLAVOR]"
101
+ emits: [div.dc-flavor, "p.dc-flavor (the > blockquote inside a @skill card)"]
102
+ css: styles/components/chrome.css
103
+ tokens: [--dc-flavor-accent, --dc-flavor-accent-width, --dc-flavor-color]
104
+ breaks: none
105
+
106
+ - name: pullquote
107
+ status: live
108
+ origin: plugin
109
+ recipe: "> [!PULLQUOTE]"
110
+ emits: div.dc-pullquote.dc-flush
111
+ css: styles/components/data.css
112
+ tokens: [--dc-pullquote-accent, --dc-pullquote-accent-soft, --dc-pullquote-bg]
113
+ breaks: "break-inside: avoid"
114
+
115
+ - name: sidebar
116
+ status: live
117
+ origin: plugin
118
+ recipe: "@sidebar [.inset] … @end-sidebar (also authored as raw <div class=\"dc-sidebar\"> around an NPC human-callout)"
119
+ emits: div.dc-sidebar
120
+ css: [styles/components/images.css, styles/page-templates.css]
121
+ tokens:
122
+ - --dc-sidebar-surface
123
+ - --dc-sidebar-border
124
+ - --dc-sidebar-accent
125
+ - --dc-sidebar-inset-column
126
+ - --dc-sidebar-inset-gutter
127
+ - --dc-sidebar-callout-accent
128
+ - --dc-sidebar-callout-bg
129
+ breaks: "break-inside: avoid"
130
+ notes: "`.inset` is an unprefixed modifier read by .page.page-sidebar > .dc-sidebar.inset (page-templates.css). Design guide only."
131
+
132
+ - name: sidebar-box
133
+ status: live
134
+ origin: plugin
135
+ recipe: "@sidebar-box … @end-sidebar-box"
136
+ emits: div.dc-prose-panel.dc-sidebar-box
137
+ css: styles/components/data.css
138
+ tokens: [--dc-sidebar-box-surface, --dc-sidebar-box-border, --dc-sidebar-box-accent, --dc-sidebar-box-rail]
139
+ breaks: "break-inside: avoid (via .dc-prose-panel)"
140
+ notes: "Design guide only."
141
+
142
+ - name: definition
143
+ status: live
144
+ origin: plugin
145
+ recipe: "@definition … @end-definition"
146
+ emits: div.dc-prose-panel.dc-definition-block
147
+ css: styles/components/data.css
148
+ tokens: [--dc-definition-block-surface, --dc-definition-block-accent, --dc-definition-block-accent-width]
149
+ breaks: "break-inside: avoid (via .dc-prose-panel)"
150
+ notes: "04-components.md marks the macro as superseded by markdown definition lists; both books still use it."
151
+
152
+ - name: procedure
153
+ status: live
154
+ origin: plugin
155
+ recipe: "@procedure … 1. step … @end-procedure"
156
+ emits: ol.dc-steps > li > span.dc-step-no
157
+ css: styles/components/data.css
158
+ breaks: "break-inside: avoid"
159
+
160
+ - name: block
161
+ status: live
162
+ origin: plugin
163
+ recipe: "@block .dc-panel|.dc-slate|.dc-shard|.dc-codex label=\"Title\" … @end-block"
164
+ emits: div.dc-block > div.dc-block-title
165
+ css: styles/components/section.css
166
+ tokens: [--dc-block-bg, --dc-block-fg, --dc-block-accent, --dc-block-title-bg, --dc-block-title-fg]
167
+ breaks: "break-inside: avoid"
168
+ notes: "The variant class is author-supplied (see block-variants; also accepted as variant=panel). Design guide only."
169
+
170
+ - name: block-variants
171
+ status: live
172
+ origin: author
173
+ recipe: "@block .dc-panel | .dc-slate | .dc-shard | .dc-codex"
174
+ emits: div.dc-block.dc-panel|.dc-slate|.dc-shard|.dc-codex
175
+ css: styles/components/section.css
176
+ usage: [variant=panel, variant=slate, variant=shard, variant=codex]
177
+ notes: "Four clip-path/surface treatments on .dc-block; the class is passed through from the marker, or built by the plugin from variant=x (a concatenation the check's plugin scan cannot see — hence origin: author and the usage literals)."
178
+
179
+ - name: card
180
+ status: live
181
+ origin: plugin
182
+ recipe: "@card [.dc-flaws|.dc-ideals|.dc-dreams] / #### Heading / > pull quote / body / > footer … @end-card"
183
+ emits:
184
+ - div.dc-card > div.dc-card-heading + div.dc-card-pull + div.dc-card-body
185
+ - div.dc-card-body > blockquote.dc-card-footer (the last body blockquote, dc#44)
186
+ css: styles/components/section.css
187
+ breaks: "break-inside: avoid"
188
+
189
+ - name: card-variants
190
+ status: live
191
+ origin: author
192
+ recipe: "@card .dc-flaws | .dc-ideals | .dc-dreams"
193
+ emits: div.dc-card.dc-flaws|.dc-ideals|.dc-dreams
194
+ css: styles/components/section.css
195
+ notes: "Citizen-file card accents; the class is passed through from the marker."
196
+
197
+ - name: gear
198
+ status: live
199
+ origin: plugin
200
+ recipe: "@gear … @end-gear"
201
+ emits: div.dc-card.dc-gear
202
+ css: styles/components/section.css
203
+ unstyled: [dc-gear]
204
+ breaks: "break-inside: avoid (via .dc-card)"
205
+ notes: "Renders as a plain .dc-card: nothing has ever styled .dc-gear (the only rules are inside the GEAR ENTRY tombstone comment in data.css). Reviving the treatment is a design decision — see that comment. Design guide only."
206
+
207
+ - name: lede
208
+ status: live
209
+ origin: plugin
210
+ recipe: "@lede … @end-lede"
211
+ emits: div.dc-intro
212
+ css: [styles/components/chrome.css, styles/components/section.css, styles/page-templates.css]
213
+ tokens: [--dc-intro-bg, --dc-intro-accent]
214
+ breaks: "break-after: avoid inside .dc-card-grid"
215
+ notes: "The same .dc-intro is emitted for a learning path's subtitle and authored raw on the contents page."
216
+
217
+ - name: tape
218
+ status: live
219
+ origin: plugin
220
+ recipe: "@tape label=\"…\" (also authored as raw <div class=\"dc-tape dc-flush\">…</div>)"
221
+ emits: div.dc-tape
222
+ css: styles/components/chrome.css
223
+ tokens: [--dc-tape-bg, --dc-tape-border, --dc-tape-color]
224
+ breaks: "break-inside: avoid"
225
+
226
+ - name: toc
227
+ status: live
228
+ origin: plugin
229
+ recipe: "@toc … @end-toc (also authored as raw <div class=\"dc-toc\">)"
230
+ emits: div.dc-toc
231
+ css: [styles/components/data.css, styles/page-templates.css]
232
+ breaks: "list items break-inside: avoid"
233
+
234
+ - name: glossary
235
+ status: live
236
+ origin: plugin
237
+ recipe: "@glossary … @end-glossary (the macro is used by neither book; the raw <div class=\"dc-terms\"> wrapper is)"
238
+ emits: div.dc-terms
239
+ css: styles/components/images.css
240
+ breaks: "break-inside: avoid"
241
+ notes: "CSS styles the children as .dc-terms .dc-item (see glossary-item); the docs and gallery author .dc-terms-item instead (see glossary-item-authored)."
242
+
243
+ - name: outcome
244
+ status: live
245
+ origin: plugin
246
+ recipe: "@outcome [flush] / 20 | Crit | text … @end-outcome, or a | Roll | Outcome | table inside a skill card"
247
+ emits:
248
+ - div.dc-outcomes[.dc-flush] > div.dc-outcomes-label
249
+ - div.dc-outcome-row.crit|hit|mixed|miss|fail > span.dc-outcome-key.tier-* > span.dc-outcome-name + span.dc-outcome-roll
250
+ - span.dc-outcome-text
251
+ css: styles/components/data.css
252
+ tokens:
253
+ - --dc-outcomes-surface
254
+ - --dc-outcomes-border
255
+ - --dc-outcomes-inner-border
256
+ - --dc-outcomes-divider
257
+ - --dc-outcomes-label-bg
258
+ - --dc-outcomes-label-color
259
+ - --dc-outcome-key-color
260
+ - --dc-outcome-name-color
261
+ - --dc-outcome-name-opacity
262
+ usage: ["| Roll | Outcome"]
263
+ breaks: "break-inside: avoid; the skill-table form adds data-break-inside=avoid only when the parent card allows splitting"
264
+
265
+ - name: specialty
266
+ status: live
267
+ origin: plugin
268
+ recipe: "@specialty .augmerc|.proxy|.streetwarden|.gutterdruid|.cybersurgeon|.wirephreak|.technosorcerer|.etherlock|.dualist|.generalist … @end-specialty"
269
+ emits: div.dc-specialty.<name>
270
+ css:
271
+ - styles/components/specialty-identity.css
272
+ - styles/components/specialty.css
273
+ - styles/components/cards.css
274
+ - styles/components/data.css
275
+ - styles/components/section.css
276
+ - styles/page-templates.css
277
+ tokens:
278
+ - --spec-accent
279
+ - --spec-mid
280
+ - --spec-dark
281
+ - --dc-skill-tab-shape
282
+ - --dc-skill-body-shape
283
+ - --dc-path-title-shape
284
+ - --dc-path-shell-clip
285
+ - --dc-specialty-card-shell-shape
286
+ - --dc-specialty-intro-title-shape
287
+ - --dc-specialty-intro-clip
288
+ breaks: "none on the wrapper; children carry their own"
289
+ notes: "Parent-selector model: every card, path and intro inside inherits shape and colour from .dc-specialty.<name>. Auto-closes any open path or skill."
290
+
291
+ - name: specialty-intro
292
+ status: live
293
+ origin: plugin
294
+ recipe: "@specialty-intro … @end-specialty-intro"
295
+ emits: div.dc-specialty-intro
296
+ css: [styles/components/specialty.css, styles/components/specialty-identity.css]
297
+ tokens: [--dc-specialty-intro-bg, --dc-specialty-intro-title-bg, --dc-specialty-intro-title-color]
298
+ breaks: "break-inside: avoid; first h2 break-after: avoid"
299
+
300
+ - name: specialty-art
301
+ status: live
302
+ origin: plugin
303
+ recipe: "@specialty-art … @end-specialty-art"
304
+ emits: div.dc-specialty-art
305
+ css: [styles/components/chrome.css, styles/page-rules.css]
306
+ breaks: "break-before: page; page: full"
307
+
308
+ - name: specialty-card
309
+ status: live
310
+ origin: plugin
311
+ recipe: "@specialty-card … @end-specialty-card (data-position=odd|even alternates per card)"
312
+ emits: div.dc-specialty-card
313
+ css:
314
+ - styles/components/specialty.css
315
+ - styles/components/specialty-identity.css
316
+ - styles/components/section.css
317
+ - styles/page-templates.css
318
+ tokens:
319
+ - --dc-specialty-card-bg
320
+ - --dc-specialty-card-border
321
+ - --dc-specialty-card-accent
322
+ - --dc-specialty-card-fg
323
+ - --dc-specialty-card-media-height
324
+ - --dc-specialty-card-media-width
325
+ - --dc-specialty-card-title-align
326
+ - --dc-specialty-card-band-height
327
+ - --dc-specialty-card-shadow
328
+ - --dc-specialty-card-title-color
329
+ breaks: "break-inside: avoid"
330
+
331
+ - name: learning-path
332
+ status: live
333
+ origin: plugin
334
+ recipe: "@learning-path / ### Title / > subtitle / - Skill A / - Skill B … @end-learning-path"
335
+ emits:
336
+ - div.dc-learning-path.dc-path-block > div.dc-path-shell > h2.dc-spray > span.dc-path-sticker
337
+ - div.dc-path-shell > div.dc-intro
338
+ - div.dc-stickers > span.dc-sticker > span.dc-sticker-ref
339
+ - span.dc-arrow (between stickers)
340
+ css: [styles/components/data.css, styles/components/chrome.css, styles/components/specialty-identity.css]
341
+ tokens:
342
+ - --dc-path-title-bg
343
+ - --dc-path-title-color
344
+ - --dc-path-accent
345
+ - --dc-path-shell-padding-top
346
+ - --dc-path-shell-padding-bottom
347
+ - --dc-arrow-color
348
+ breaks: "break-before/after: auto on the block; the h2 stays with what follows"
349
+
350
+ - name: skill
351
+ status: live
352
+ origin: plugin
353
+ recipe: "@skill [id=…] [{.dc-allow-split}] [{.dc-two-col}] / #### Name | Tier / > flavor / 1. **N AP** *Ability:* text / ##### Sub-header … @end-skill (alias @end-skills)"
354
+ emits:
355
+ - div.dc-skill-card[name][data-break-inside=avoid] > div.dc-card-tab > span.dc-tab-title + span.dc-tab-tier
356
+ - div.dc-card-body > div.dc-card-inner > p.dc-flavor + div.dc-sub-header
357
+ - div.dc-ability > span.dc-ap + p.dc-ability-text
358
+ css: [styles/components/cards.css, styles/components/data.css, styles/components/specialty-identity.css, styles/dc-native.css]
359
+ tokens:
360
+ - --dc-card-accent
361
+ - --dc-card-surface
362
+ - --dc-card-tab-bg
363
+ - --dc-card-tab-title-color
364
+ - --dc-card-body-mark
365
+ - --dc-card-gap
366
+ - --dc-card-tab-shadow
367
+ breaks: "data-break-inside=avoid by default; {.dc-allow-split} opts into splitting (see allow-split); tab break-after: avoid; last two abilities glued"
368
+ notes: "A ##### Outcomes sub-header is swallowed (the outcomes block carries its own label)."
369
+
370
+ - name: skill-highlight
371
+ status: live
372
+ origin: plugin
373
+ recipe: "#### Name | Tier | highlight (inside @skill)"
374
+ emits: [div.dc-card-tab.dc-highlight, div.dc-card-body.dc-highlight-body]
375
+ css: styles/components/cards.css
376
+ usage: ["| highlight"]
377
+ breaks: "as skill"
378
+ notes: "Also reachable as @skill {.dc-highlight}, which puts the class on the card root instead of the tab."
379
+
380
+ - name: skill-card-continuation
381
+ status: live
382
+ origin: plugin
383
+ recipe: "@continue (inside an open @skill card; closes it and opens a '{name} ▸' continuation card)"
384
+ emits: div.dc-skill-card.dc-skill-card-cont > div.dc-card-tab.dc-card-tab-cont
385
+ css: styles/components/cards.css
386
+ breaks: "as skill; honours the parent card's .dc-allow-split"
387
+ notes: "A bare @continue outside a skill is core's section continuation; the usage count includes both."
388
+
389
+ - name: ap-chip
390
+ status: live
391
+ origin: plugin
392
+ recipe: "1. **N AP** *Ability:* text (inside @skill; 0 AP → .free, ranges/X → .variable; also authored as raw <span class=\"dc-ap\">)"
393
+ emits: span.dc-ap[.free|.variable]
394
+ css: [styles/components/cards.css, styles/components/specialty-identity.css]
395
+ tokens: [--dc-ap-bg, --dc-ap-fg, --dc-ap-border]
396
+ usage: [" AP**"]
397
+ breaks: none
398
+ notes: "Modifier drift outside the check's dc- scope: the plugin emits `variable` but the CSS styles `.dc-ap.var`; `.standard/.reduced/.increased/.special` (specialty-identity.css) are never emitted, only authored raw in the gallery."
399
+
400
+ - name: distance-tags
401
+ status: unused
402
+ origin: plugin
403
+ recipe: "| Distance | AP | table inside a skill card"
404
+ emits: div.dc-sub-header + div.dc-distance-tags > span.dc-dist-tag > span.dc-dist-ap + span.dc-dist-name
405
+ css: styles/components/data.css
406
+ tokens: [--dc-dist-tag-surface, --dc-dist-tag-border, --dc-dist-ap-color, --dc-dist-name-color]
407
+ usage: ["| Distance | AP |"]
408
+ breaks: none
409
+ notes: "Emission path exists and is styled; no skill in either book writes a
410
+ Distance/AP table. The usage literal carries the AP column deliberately: the
411
+ plugin only transforms a Distance table that sits inside a skill card, and
412
+ field-guide chapter-05's Schraphose damage table is a four-column Distance
413
+ table in body prose. A bare '| Distance |' literal counted that as a use."
414
+
415
+ - name: roll-the-die
416
+ status: live
417
+ origin: plugin
418
+ recipe: "ROLL THE DIE! (automatic on the canonical text in markdown prose; code spans and raw HTML are left alone)"
419
+ emits: span.dc-roll-the-die
420
+ css: styles/components/cards.css
421
+ tokens: [--dc-roll-the-die-color, --dc-roll-the-die-border]
422
+ usage: ["ROLL THE DIE!"]
423
+ breaks: none
424
+
425
+ - name: img-wrapper
426
+ status: live
427
+ origin: plugin
428
+ recipe: "![alt](src) (automatic on any image-only paragraph)"
429
+ emits: p.dc-img-wrapper
430
+ css: [styles/components/data.css, styles/dc-native.css]
431
+ usage: ["!["]
432
+ breaks: "break-inside: avoid"
433
+
434
+ - name: flush
435
+ status: live
436
+ origin: plugin
437
+ recipe: "@outcome flush, > [!PULLQUOTE], or .dc-flush on raw .dc-tape / .dc-stat / .dc-stickers"
438
+ emits: .dc-flush (edge-to-edge modifier)
439
+ css: [styles/components/chrome.css, styles/components/data.css]
440
+ breaks: none
441
+
442
+ # ── Author classes on core markers, attrs and raw HTML ────────────────
443
+ - name: column-panel
444
+ status: live
445
+ origin: author
446
+ recipe: "@section .gp-columns-2 .dc-column-panel"
447
+ emits: div.section.dc-column-panel
448
+ css: styles/components/section.css
449
+ breaks: "first heading glued to its first paragraph"
450
+
451
+ - name: tabbed
452
+ status: live
453
+ origin: author
454
+ recipe: "@section .dc-tabbed"
455
+ emits: div.section.dc-tabbed
456
+ css: styles/components/section.css
457
+ tokens: [--dc-section-tab-indent, --dc-section-tab-overlap]
458
+ breaks: "first heading break-after: avoid"
459
+
460
+ - name: card-grid
461
+ status: live
462
+ origin: author
463
+ recipe: "@section .dc-card-grid"
464
+ emits: div.section.dc-card-grid
465
+ css: [styles/components/section.css, styles/page-templates.css]
466
+ breaks: "break-inside: auto on the grid; each specialty card avoid"
467
+
468
+ - name: citizen-walkthrough
469
+ status: live
470
+ origin: author
471
+ recipe: "@section .dc-citizen-walkthrough [.gp-columns-2]"
472
+ emits: div.section.dc-citizen-walkthrough
473
+ css: [styles/components/section.css, styles/dc-native.css]
474
+ notes: "KNOWN DRIFT (2026-09-01 audit, T2): 04-components.md tells authors to override --section-accent / --section-bg at the chapter id; no CSS declares either name. The chassis reads --dc-section-accent / --dc-section-bg (see section). Unprefixed names are outside the check's token scan, so this stays a note until the chapter is corrected."
475
+
476
+ - name: citizen-file-page
477
+ status: live
478
+ origin: author
479
+ recipe: "@page .dc-citizen-file-page"
480
+ emits: div.page.dc-citizen-file-page
481
+ css: styles/page-rules.css
482
+ breaks: "page: citizen-file"
483
+
484
+ - name: fiction-excerpt
485
+ status: live
486
+ origin: author
487
+ recipe: "@section .dc-fiction-excerpt"
488
+ emits: div.section.dc-fiction-excerpt
489
+ css: [styles/components/section.css]
490
+ tokens:
491
+ - --dc-fiction-bg
492
+ - --dc-fiction-line-height
493
+ - --dc-fiction-art-float
494
+ - --dc-fiction-art-width
495
+ - --dc-fiction-art-outline
496
+ - --dc-fiction-art-shadow
497
+ breaks: "orphans/widows 3 on paragraphs"
498
+
499
+ - name: npc-stat
500
+ status: live
501
+ origin: author
502
+ recipe: "@section .dc-npc-stat"
503
+ emits: div.section.dc-npc-stat
504
+ css: [styles/components/section.css]
505
+ tokens:
506
+ - --dc-npc-stat-primary
507
+ - --dc-npc-stat-secondary
508
+ - --dc-npc-stat-label-color
509
+ - --dc-npc-stat-rule
510
+ - --dc-npc-stat-rule-width
511
+
512
+ - name: chapter-start
513
+ status: live
514
+ origin: author
515
+ recipe: "@page .page-chapter-start .dc-chapter-start"
516
+ emits: div.page.dc-chapter-start
517
+ css: [styles/page-rules.css, styles/page-templates.css]
518
+ breaks: "page: chapter-start"
519
+
520
+ - name: credits
521
+ status: live
522
+ origin: author
523
+ recipe: "@page .page-credits .dc-credits"
524
+ emits: div.page.dc-credits
525
+ css: [styles/page-templates.css, styles/dc-native.css]
526
+ notes: "Styled in page-templates.css and dc-native.css — carried in from the books in 1.0.0."
527
+
528
+ - name: colophon-grid
529
+ status: live
530
+ origin: author
531
+ recipe: "raw <div class=\"dc-colophon-grid\"> on the credits page"
532
+ emits: div.dc-colophon-grid
533
+ css: styles/page-templates.css
534
+
535
+ - name: chevron
536
+ status: live
537
+ origin: author
538
+ recipe: "# Title {.dc-chevron} (the chapter-opener h1 gets the same treatment structurally)"
539
+ emits: h1.dc-chevron
540
+ css: [styles/components/chrome.css, styles/dc-native.css, styles/page-templates.css]
541
+ tokens: [--dc-chevron-bg, --dc-chevron-color, --dc-chevron-font-size]
542
+
543
+ - name: spray
544
+ status: live
545
+ origin: author
546
+ recipe: "## Title {.dc-spray} (also emitted by @learning-path for its title)"
547
+ emits: h2.dc-spray
548
+ css: [styles/components/chrome.css, styles/components/data.css]
549
+ tokens: [--dc-spray-bg, --dc-spray-color]
550
+ breaks: "as a path-shell title: break-before avoid on the element after it"
551
+
552
+ - name: spec-tweak
553
+ status: live
554
+ origin: author
555
+ recipe: "### Title {.dc-spec-tweak [.dc-no-top]}"
556
+ emits: h3.dc-spec-tweak[.dc-no-top]
557
+ css: styles/components/chrome.css
558
+
559
+ - name: classtag
560
+ status: live
561
+ origin: author
562
+ recipe: "raw <span class=\"dc-classtag <specialty>\">"
563
+ emits: span.dc-classtag.<specialty>
564
+ css: styles/components/chrome.css
565
+ tokens: [--dc-classtag-color]
566
+
567
+ - name: tag
568
+ status: live
569
+ origin: author
570
+ recipe: "raw <span class=\"dc-tag\">"
571
+ emits: span.dc-tag
572
+ css: styles/components/chrome.css
573
+
574
+ - name: human-callout
575
+ status: live
576
+ origin: author
577
+ recipe: "raw <div class=\"dc-sidebar\"><div class=\"dc-human-callout\">… (NPC sidebar)"
578
+ emits: div.dc-human-callout
579
+ css: styles/components/images.css
580
+ breaks: "break-inside: avoid"
581
+
582
+ - name: at-a-glance-cards
583
+ status: live
584
+ origin: author
585
+ recipe: "raw <div class=\"dc-at-a-glance-cards\"> > <div class=\"dc-at-a-glance-card\">"
586
+ emits: div.dc-at-a-glance-cards > div.dc-at-a-glance-card
587
+ css: styles/components/data.css
588
+
589
+ - name: stat-block
590
+ status: live
591
+ origin: author
592
+ recipe: "raw <div class=\"dc-stat [dc-flush]\"> with .dc-stat-head, .dc-stat-grid cells and .dc-stat-line"
593
+ emits:
594
+ - div.dc-stat > div.dc-stat-head > span.dc-stat-name + span.dc-stat-class
595
+ - div.dc-stat-grid > div.dc-stat-cell > span.dc-stat-cell-key + span.dc-stat-cell-val
596
+ - div.dc-stat-line
597
+ css: styles/components/data.css
598
+ breaks: "break-inside: avoid"
599
+
600
+ - name: allow-split
601
+ status: live
602
+ origin: author
603
+ recipe: "@skill {.dc-allow-split} or @section .dc-allow-split"
604
+ emits: .dc-allow-split (on the skill card or section it is written on)
605
+ css: styles/components/section.css
606
+ breaks: "break-inside: auto — opts a section or skill card out of the default avoid"
607
+ notes: "The plugin reads this class (to drop data-break-inside=avoid) but never adds it."
608
+
609
+ - name: two-col
610
+ status: live
611
+ origin: author
612
+ recipe: "@skill {.dc-two-col}"
613
+ emits: div.dc-skill-card.dc-two-col
614
+ css: styles/components/cards.css
615
+ breaks: "list items and paragraphs break-inside: avoid within the columns"
616
+
617
+ # ── Core-owned structure whose public tokens this library declares ─────
618
+ - name: section
619
+ status: live
620
+ origin: core
621
+ recipe: "@section (bare; core markers.js emits the wrapper)"
622
+ emits: div.section
623
+ css: styles/components/section.css
624
+ tokens: [--dc-section-bg, --dc-section-accent]
625
+ breaks: "break-inside: avoid (core MARKER_CSS)"
626
+ notes: "The panel chrome is opt-out; .dc-plain is the escape."
627
+
628
+ - name: chapter-opener
629
+ status: live
630
+ origin: core
631
+ recipe: "@chapter C.01 / @page intro / @section / # Title (markup-driven; core injects .chapter-opener)"
632
+ emits: div.page[data-page=intro][data-chapter-label] > div.section > h1
633
+ css: [styles/components/chrome.css, styles/dc-palette.css]
634
+ tokens:
635
+ - --dc-chapter-opener-bg
636
+ - --dc-chapter-opener-accent
637
+ - --dc-chapter-opener-shadow
638
+ - --dc-chapter-opener-clip-tail
639
+ - --dc-chapter-opener-pad-top
640
+ - --dc-chapter-opener-pad-side
641
+ - --dc-chapter-opener-pad-right
642
+ notes: "There is no @chapter-opener macro."
643
+
644
+ # ── Author classes currently unused by the books ──────────────────────────────
645
+ - name: plain
646
+ status: unused
647
+ origin: author
648
+ recipe: "@section .dc-plain"
649
+ emits: div.section.dc-plain
650
+ css: styles/components/section.css
651
+ notes: "The section-chrome escape hatch (dc#39)."
652
+
653
+ - name: full-page
654
+ status: unused
655
+ origin: author
656
+ recipe: "@page .dc-full-page"
657
+ emits: div.page.dc-full-page
658
+ css: [styles/page-templates.css, styles/page-rules.css, styles/dc-native.css]
659
+ breaks: "break-before: page; page: full"
660
+ notes: "Documented in 05-page-templates.md; every occurrence in the guide is inside a fenced example."
661
+
662
+ - name: suppress-footer
663
+ status: unused
664
+ origin: author
665
+ recipe: "@page .dc-suppress-footer"
666
+ emits: div.page.dc-suppress-footer
667
+ css: styles/page-rules.css
668
+ breaks: "page: clean"
669
+
670
+ - name: cover-page
671
+ status: unused
672
+ origin: author
673
+ recipe: "raw <div class=\"dc-cover-page dc-cover-layout\"> composite"
674
+ emits:
675
+ - div.dc-cover-page.dc-cover-layout > div.dc-cover-bg + div.dc-cover-num + h1.dc-cover-bigword + p.dc-cover-strap
676
+ - div.dc-cover-body + div.dc-cover-meta-row
677
+ css: styles/components/data.css
678
+ tokens: [--dc-cover-meta-border]
679
+ notes: "Documented in 05-page-templates.md inside a fenced example only."
680
+
681
+ - name: toc-rows
682
+ status: unused
683
+ origin: author
684
+ recipe: "raw <div class=\"dc-toc-row\"> > .dc-toc-no + .dc-toc-title + .dc-toc-page inside .dc-toc"
685
+ emits: div.dc-toc-row > span.dc-toc-no + span.dc-toc-title + span.dc-toc-page
686
+ css: styles/components/data.css
687
+ notes: "Both books' contents pages use a plain list inside .dc-toc."
688
+
689
+ - name: img-float
690
+ status: unused
691
+ origin: author
692
+ recipe: "![alt](src){.dc-img-float-left|.dc-img-float-right}"
693
+ emits: img.dc-img-float-left|.dc-img-float-right
694
+ css: styles/components/images.css
695
+ notes: "Documented in 06-layout.md and 07-markdown-reference.md; no live use."
696
+
697
+ - name: portrait
698
+ status: unused
699
+ origin: author
700
+ recipe: "raw <div class=\"dc-portrait\"><img></div>"
701
+ emits: div.dc-portrait > img
702
+ css: styles/components/chrome.css
703
+ tokens: [--dc-portrait-border, --dc-portrait-surface]
704
+
705
+ - name: dashed-rule
706
+ status: unused
707
+ origin: author
708
+ recipe: "raw <hr class=\"dc-dashed-rule\">"
709
+ emits: hr.dc-dashed-rule
710
+ css: styles/components/chrome.css
711
+
712
+ - name: margin-sm
713
+ status: unused
714
+ origin: author
715
+ recipe: ".dc-margin-sm modifier (e.g. on .dc-tape)"
716
+ emits: .dc-margin-sm
717
+ css: styles/components/chrome.css
718
+
719
+ - name: path-subtitle
720
+ status: unused
721
+ origin: author
722
+ recipe: "raw <div class=\"dc-path-subtitle\">"
723
+ emits: div.dc-path-subtitle
724
+ css: styles/components/chrome.css
725
+ notes: "@learning-path emits .dc-intro for its subtitle, not this."
726
+
727
+ - name: outcome-table
728
+ status: unused
729
+ origin: author
730
+ recipe: "(none — no macro or markdown path emits it)"
731
+ emits: .dc-outcome-table
732
+ css: styles/components/cards.css
733
+ notes: "A column-span rule inside .dc-two-col; the plugin emits .dc-outcomes."
734
+
735
+ - name: roll-badges
736
+ status: unused
737
+ origin: author
738
+ recipe: "(none — no current authoring path)"
739
+ emits: [span.dc-roll-lucid, span.dc-roll-surreal]
740
+ css: styles/components/data.css
741
+ tokens: [--dc-roll-lucid-color, --dc-roll-surreal-color]
742
+
743
+ - name: sidebar-box-divider
744
+ status: unused
745
+ origin: author
746
+ recipe: "raw <hr class=\"dc-sidebar-box-divider\"> inside a sidebar-box"
747
+ emits: hr.dc-sidebar-box-divider
748
+ css: styles/components/data.css
749
+
750
+ - name: glossary-item
751
+ status: unused
752
+ origin: author
753
+ recipe: "raw <div class=\"dc-item\"> inside .dc-terms"
754
+ emits: div.dc-item
755
+ css: styles/components/images.css
756
+ breaks: "break-inside: avoid"
757
+ notes: "The class the CSS styles; the docs and gallery author .dc-terms-item instead (see glossary-item-authored)."
758
+
759
+ - name: callout-generic
760
+ status: unused
761
+ origin: author
762
+ recipe: "(none — no macro or markdown path emits it)"
763
+ emits: .dc-callout
764
+ css: styles/dc-native.css
765
+ notes: "One stale first-child glue rule in the engine sheet; the alert family emits .dc-alert. Adjacency rules for it were removed 2026-06-21 (chrome.css)."
766
+
767
+ # ── Retired: no CSS, no emission, no use (tombstone comments only) ─────
768
+ - name: roll-table
769
+ status: retired
770
+ origin: plugin
771
+ recipe: "@roll-table … @end-roll-table / @options-table … @end-options-table"
772
+ emits: []
773
+ notes: "Removed in plugin 17.3.0; the markers are still parsed and stripped as no-ops. Use @outcome or a plain table."
774
+
775
+ - name: rules-definition
776
+ status: retired
777
+ origin: author
778
+ recipe: "@section .dc-rules-definition"
779
+ emits: div.section.dc-rules-definition
780
+ notes: "Deleted 2026-09-02 (section.css, cards.css tombstones): 0 uses, 0 emissions."
781
+
782
+ - name: stamp
783
+ status: retired
784
+ origin: author
785
+ recipe: "raw .dc-stamp / .dc-classified"
786
+ emits: [.dc-stamp, .dc-classified]
787
+ notes: "Removed 2026-05-24 (chrome.css tombstone). Revive as @section .dc-stamp, not raw HTML."
788
+
789
+ - name: chapter-opener-no
790
+ status: retired
791
+ origin: plugin
792
+ recipe: "@chapter-opener"
793
+ emits: .dc-chapter-opener-no
794
+ notes: "The @chapter-opener macro and its badge class were retired when the composite became markup-driven (chrome.css tombstone)."
795
+
796
+ - name: art-placement
797
+ status: retired
798
+ origin: author
799
+ recipe: "@page .dc-art-top / .dc-art-bottom"
800
+ emits: [.dc-art-top, .dc-art-bottom]
801
+ notes: "Deleted 2026-09-02 (page-templates.css, images.css tombstones)."
802
+
803
+ - name: class-entry
804
+ status: retired
805
+ origin: plugin
806
+ recipe: "@class-entry … @end-class-entry"
807
+ emits: div.section.dc-class-entry > .dc-content-col + .dc-tag-row
808
+ notes: "Retired 2026-05-24 (images.css tombstone); the marker is no longer recognised and passes through as text."
809
+
810
+ - name: gear-entry
811
+ status: retired
812
+ origin: author
813
+ recipe: "raw .dc-gear-entry markup / @section .dc-gear-list"
814
+ emits: [.dc-gear-entry, div.section.dc-gear-list]
815
+ notes: "Removed 2026-08-21 (data.css GEAR ENTRY tombstone); neither could ever match what @gear emits."
816
+
817
+ # ── Unimplemented: documented or authored, never built ────────────────
818
+ - name: skill-card-continuation-marker
819
+ status: unimplemented
820
+ origin: plugin
821
+ recipe: "(described in 04-components.md, 09-component-gallery.md and docs/components-and-palette-reference.md as automatic ▸ / ◂ markers on split skill cards)"
822
+ emits: [.dc-card-cont-marker, .dc-card-fwd-marker]
823
+ notes: "Nothing ever emitted these; they needed a runtime script hook gutterpress does not have (cards.css comment, removed 2026-07-25). The docs describing them are stale."
824
+
825
+ - name: glossary-item-authored
826
+ status: unimplemented
827
+ origin: author
828
+ recipe: "raw <div class=\"dc-terms-item\"> inside .dc-terms (as the docs and gallery write it)"
829
+ emits: div.dc-terms-item
830
+ notes: "No CSS has ever styled .dc-terms-item — images.css styles .dc-terms .dc-item. The gallery specimen renders unstyled. Resolve by renaming one side; a separate decision."
831
+
832
+ # Classes a book uses that are not components.