gp-dimm-city 1.1.0 → 1.1.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.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,247 @@ cut a version that has no `## [X.Y.Z]` heading below.
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.1.2] - 2026-10-08
11
+
12
+ **Notes for books upgrading from 1.1.1:**
13
+
14
+ - Build on gutterpress 0.11.15 or later and drop `@page .dc-printer-page`
15
+ and your own `print.signature`: the `dtrpg` preset now does both.
16
+ - Field Guide classes that moved into the package: `.fg-snug` becomes
17
+ `.dc-snug`, and the book-wide two-column skill cards become
18
+ `.dc-cards-two-col` on the specialty markers.
19
+ - Section panels, padding and splitting are tokens now. A book that
20
+ restyled `.section` chrome by overriding properties should set the
21
+ tokens instead (see the palette reference's Section table).
22
+
23
+ ### Added
24
+
25
+ - **`.dc-cards-two-col`**: on any ancestor (`@specialty`, `@chapter`,
26
+ `@page`, `@section`), every skill card inside gets a two-column body.
27
+ This is the Field Guide's book-wide form as an opt-in. A card's own
28
+ `.dc-two-col`, or `.dc-allow-split`, keeps its own form.
29
+ - **`.dc-snug`**: tighter paragraph and list-item spacing on a section or
30
+ page, for one that would otherwise overflow by a line or two (from the
31
+ Field Guide's `.fg-snug`).
32
+ - **Split skill cards keep their lead-ins with what follows.**
33
+ `.dc-specialty .dc-skill-card.dc-allow-split` keeps its tab, first
34
+ blocks and lead-in paragraphs with the next block (from the Field
35
+ Guide's own sheet).
36
+ - **Section tokens.** A section's panel, shadow and padding now come from
37
+ tokens (`--dc-section-surface`, `--dc-section-shadow`,
38
+ `--dc-section-pad-*`), as does whether a box may split
39
+ (`--dc-section-break-inside`, `--dc-alert-break-inside`). Variants and
40
+ page templates set tokens instead of cancelling properties.
41
+ - **`test/integrity.test.js`**, which checks that:
42
+ - every class the books use is styled;
43
+ - every token that is read, or that the palette reference documents,
44
+ is declared;
45
+ - each stylesheet keeps its stated contract.
46
+
47
+ ### Changed
48
+
49
+ - **Tested against gutterpress 0.11.15** (stable; was 0.11.15-alpha.1).
50
+ - **CSS quick wins from an architecture review.**
51
+ - New tokens: `--shadow-ink` (the opaque wall-shadow colour, written
52
+ out five times before) and four exact-value `--tint-*` mix sources
53
+ for the literal `rgb()` colours inside `color-mix()`.
54
+ - `--dc-section-tab-overlap` and `--dc-section-tab-indent` are now
55
+ public `:root` tokens.
56
+ - The TOC/credits masthead `h1` is now one rule instead of two.
57
+ - Dead declarations are gone: the `--shadow-poster` layer a specialty
58
+ card's own `clip-path` clipped away, `page-break-inside`, an empty
59
+ rule, a no-op height reset, three `opacity: 1`, and the
60
+ `break-before: always` Chromium ignores on learning paths.
61
+ - `dc-native.css` loses its tombstones and is renumbered §1–8.
62
+ - Pixel-identical in both books, except the even specialty cards,
63
+ whose left border is now `1.5pt` like the rest (was `1.5px`).
64
+
65
+ - **Section styling is opt-in per variant, not cancelled by a central list.**
66
+ - `.dc-plain`, `.dc-tabbed`, `.dc-column-panel` and `.dc-card-grid` set
67
+ the section tokens.
68
+ - The header bar's negative margins are derived from the padding.
69
+ - The shared page templates (intro, credits, chapter opener) own their
70
+ styling in `page-templates.css`; the chapter opener moves there from
71
+ `section.css`.
72
+ - Pixel-identical in both books.
73
+ - **The credits colophon shows its 4px front-matter rail again.** A rule in
74
+ `dc-native.css` had overridden it. This is the one visible change, on
75
+ each book's credits page.
76
+ - **Box splitting is decided in one place.**
77
+ - Multi-column runs and `.dc-allow-split` set the break-inside tokens.
78
+ - This replaces an avoid → auto → avoid override chain.
79
+
80
+ ### Removed
81
+
82
+ - **`.dc-printer-page` and its `@page printer-blank`** (deprecated in
83
+ 1.1.1). gutterpress 0.11.15's `dtrpg` preset pads the interior to the
84
+ 4-page signature and reserves the blank last page itself, so a book
85
+ needs neither the marker nor its own `print.signature`. The Field
86
+ Guide, built on 0.11.15 without either, keeps its 232 pages
87
+ pixel-identical and still ends on four blank pages.
88
+ - `--shadow-tint`, and `.dc-roll-the-die`'s `box-shadow: var(--shadow-tint)`:
89
+ a bare colour is not a valid shadow, so it never rendered.
90
+ - `.dc-suppress-footer` and its `@page clean` (and the design guide's
91
+ mirror of it): no book used footer suppression.
92
+ - The design guide's dual specialist and generalist skill-tree specimens
93
+ (Variant Gallery; The Specialty System's "One source" section, now
94
+ "eight shapes"). Those two specialties take their skills from the other
95
+ eight and have no trees of their own, so the specimens printed a
96
+ generic `PATH1` sticker for something that cannot exist.
97
+
98
+ ### Fixed
99
+
100
+ - The catalog's glossary entries: a glossary item is a plain paragraph
101
+ inside `@glossary`, and no doc or gallery page writes `.dc-terms-item`
102
+ any more, so `glossary-item-authored` is retired.
103
+
104
+ ## [1.1.1] - 2026-10-08
105
+
106
+ **Notes for books upgrading from 1.1.0:**
107
+
108
+ - A learning-path banner is now an `h3` (was `h2`), and a skill's title an
109
+ `h4` (was a `span`). A book stylesheet that targets `h2.dc-spray` or
110
+ `span.dc-tab-title` needs the new tag.
111
+ - Unused components were removed; check `docs/cleanup-backlog.md` and the
112
+ Removed list below before relying on any of them.
113
+ - Tested against gutterpress 0.11.15-alpha.1, whose `dtrpg` preset now
114
+ does the DriveThruRPG blank last page and K-only black text.
115
+
116
+ ### Added
117
+
118
+ - **Heading look classes `.dc-h3`–`.dc-h6`.** A heading keeps its outline
119
+ level and takes another level's look (`## Useful Items {.dc-h3}`), so a
120
+ book can stop skipping levels to get a smaller label: gutterpress flags
121
+ every skip. The section header bar and the in-section accent rule follow
122
+ the class, not the tag. On a paragraph, the class sets a line in
123
+ heading type outside the outline. The Field Guide's 13 skipped levels
124
+ are fixed this way and render pixel-identical. Documented in the
125
+ design guide's Typography chapter (Level and look).
126
+
127
+ ### Changed
128
+
129
+ - **Tested against gutterpress 0.11.15-alpha.1** (devDependency, was
130
+ 0.11.13), the release that upstreams this package's two DriveThruRPG
131
+ workarounds: `preset: dtrpg` now pads to a 4-page signature and always
132
+ ends on a blank reserved page (`print.reserveLastPage`,
133
+ dimm-city/gutterpress#332), and prints near-black text on the black plate
134
+ only in PDF/X builds (`pdfx.blackText: k-only`, dimm-city/gutterpress#331).
135
+ Verified on the Field Guide with the alpha: its 228 content pages render
136
+ pixel-identical to 0.11.13, and without any workaround the book ends on
137
+ 4 pure-white pages (232). The design guide's Publishing chapter documents
138
+ both settings.
139
+ - **Specialty chapters nest in the outline.** A learning path's title was
140
+ emitted as an `h2`, the same level as the specialty name, and a skill's
141
+ title as a plain `span`, so the app's contents panel and the PDF
142
+ bookmarks listed every skill tree beside its specialty and no skills at
143
+ all. The plugin now emits the heading levels the markdown is written
144
+ at: specialty (`##`) > learning path (`h3.dc-spray`) > skill
145
+ (`h4.dc-tab-title`). The CSS follows, and both books render
146
+ pixel-identical. A stylesheet that targeted `h2.dc-spray` or
147
+ `span.dc-tab-title` needs the new tag. A real space
148
+ (`span.dc-path-sep`, carrying the 10px gap the sticker's margin used to
149
+ give) separates a banner's tree code from its title, so the outline
150
+ reads "PRX1 Refuse Finality", not "PRX1Refuse Finality".
151
+
152
+ ### Fixed
153
+
154
+ - **DriveThruRPG PDF/X builds keep live text.** The brick wall was an RGBA
155
+ tile blended with `background-blend-mode: multiply`, so every walled page
156
+ carried transparency, which PDF/X-1a cannot represent: Ghostscript
157
+ flattened each one to a raster image — no live text or embedded fonts
158
+ (a one-page book failed validation outright), and black text left
159
+ four-colour, because `pdfx.blackText: k-only` only reaches vector text.
160
+ The wall is now `images/brick-wall.png`, the same tile multiplied into
161
+ `--bg` and flattened to an opaque image, painted with no blend mode:
162
+ it renders the same (design guide wall pages differ by 0.15/255 on
163
+ average), and with gutterpress 0.11.15-alpha.1 a DriveThruRPG build's
164
+ body text now prints on the black plate only (separations: C = M = Y = 0
165
+ under every glyph). A book that retints `--bg` no longer tints the
166
+ brick; see the note in `dc-native.css` for baking a tile.
167
+ - **Nothing in the package paints transparent.** The 25 other uses of
168
+ transparency — semi-transparent shadows, tinted fills, `opacity` on
169
+ stickers, rules, the tape dashes and the pull-quote mark — each flattened
170
+ their page in PDF/X-1a just as the wall did. Each is now pre-composited
171
+ with `color-mix()` onto the surface it sits on, so it prints the same
172
+ colour, opaque. Shadows on the wall mix against the new `--wall-tone`
173
+ (`#c1beb8`, the tile's measured mean). Measured on both books: layout and
174
+ page counts unchanged, and no page changes more than 0.7% of its pixels.
175
+ The AP chip loses its soft 6px blurred shadow, which has no opaque form,
176
+ and keeps its hard one. Every change, with where to look, is in
177
+ `docs/print-transparency-inventory.md`. A new convention test fails on
178
+ any transparency in the stylesheets, with no exemptions (the one
179
+ translucent holdout, the unused cover-page composite, was removed).
180
+
181
+ - **No stray ink line across the folio row.** A skill card, learning-path
182
+ banner or specialty intro that opened a page printed the top 2–4px of its
183
+ outline at the foot of the PREVIOUS page: a full-width black (or accent)
184
+ line between the folio and chapter chips. The outlines reached above
185
+ their component's box (`top: -4px`, `translateY(-2px)`), and Chromium
186
+ fragments that part onto the page before. Each outline now sits inside
187
+ its own box: the card starts 4px higher and pads its tab 4px down
188
+ (`padding-top: 4px; margin-top: -4px`), the banner 2px likewise, and
189
+ the intro pads its content 2px. Mid-page nothing moves; a component that
190
+ opens a page sits 2–4px lower. Measured: the line is gone from all 17 Field Guide pages and
191
+ the 1 design guide page that had it; page counts are unchanged (232, 132) and
192
+ no text changes page. (It became visible with 1.1.0's DriveThruRPG
193
+ margins, which moved the page breaks; the cause dates from 1.0.0.)
194
+
195
+ - **Accent rails print as vectors in PDF/X.** The 3–5px coloured rail down
196
+ the left of sections, ledes, path banners, the Panel and Shard blocks,
197
+ and the front-matter and intro panels was a hard-stop
198
+ `linear-gradient`. The PDF/X conversion turned each gradient into a
199
+ 45 ppi bitmap, so the rail's edge printed soft, and
200
+ `gutterpress preflight` flagged the pages as low-resolution. Each rail
201
+ is now an inset `box-shadow` over a flat fill: it looks the same and
202
+ prints as a vector.
203
+ - **Design guide: preflight checks the right page size.** Its manifest
204
+ declared 612 × 792 pt (the bare Letter trim), so `gutterpress preflight`
205
+ failed every build on page size. It now declares the sheet the CSS
206
+ prints: 621 × 810 pt, the trim plus DriveThruRPG's bleed.
207
+
208
+ - **`.gp-columns-flow` works.** Core declares it in its own layer, which
209
+ this package's `column-fill: balance` on every `.gp-columns-2/-3`
210
+ outranked, so a run marked to flow stayed balanced. The balance rule now
211
+ skips runs marked `.gp-columns-flow`.
212
+
213
+ - **Catalog statuses.** `plain`, `img-float`, `full-page` and
214
+ `printer-page` were marked `unused` although a book uses each: the
215
+ design guide renders the first two, SysOps uses `full-page`, and the
216
+ Field Guide still ends on `@page .dc-printer-page` until it builds on a
217
+ stable gutterpress 0.11.15. They are `live` now.
218
+ ### Removed
219
+
220
+ - `images/brick-bg-01.png`, the RGBA wall tile, is no longer published
221
+ (it now lives in the repository's `source-art/`). Neither Dimm City book
222
+ referenced it; a book that did should use `images/brick-wall.png`.
223
+ - **Dead styling, from an orphan audit of the package, the design guide and
224
+ the Field Guide.** Each item was used by no book (Field Guide, Design
225
+ Guide, SysOps), and both books render pixel-identical without it:
226
+ - components: the cover-page composite (`.dc-cover-*`, with
227
+ `--dc-cover-meta-border`), the contents-page rows (`.dc-toc-row/-no/
228
+ -title/-page`), `.dc-portrait` (with `--dc-portrait-*`), the roll badges
229
+ `.dc-roll-lucid/-surreal` (with their colour tokens), `.dc-path-subtitle`,
230
+ the glossary item `.dc-terms .dc-item` (with `--card-border-color`),
231
+ `.dc-dashed-rule`, `.dc-tape.dc-margin-sm`, `.dc-sidebar-box-divider`,
232
+ `.dc-outcome-table` and `.dc-callout`. Their catalog entries are now
233
+ `retired`.
234
+ - rules for markup the plugin no longer produces: `.dc-sticker.active`,
235
+ the `ol`/`li` rules under `.dc-ability` (abilities are no longer
236
+ lists), and `h5` and `ol > li` inside a two-column skill card (both
237
+ are converted before they get there).
238
+ - stale comments naming deleted files or classes (`dc-tokens-print.css`,
239
+ `components.css`, `tokens.css`, the `.pmd-*` utilities, `.dc-accent-X`,
240
+ old design-guide chapter names, undeclared tokens).
241
+ Styling the audit found unused but still reachable is listed in
242
+ `docs/cleanup-backlog.md` for review.
243
+
244
+ ### Deprecated
245
+
246
+ - **`@page .dc-printer-page`.** gutterpress 0.11.15+ reserves the blank
247
+ last page in core. The class still works — a book that keeps it gets one
248
+ printer page plus padding, still ending blank — and goes in the next
249
+ major.
250
+
10
251
  ## [1.1.0] - 2026-10-07
11
252
 
12
253
  **Layout note for books upgrading from 1.0.x:** the page margins now follow
package/components.yaml CHANGED
@@ -147,7 +147,7 @@ components:
147
147
  css: styles/components/data.css
148
148
  tokens: [--dc-definition-block-surface, --dc-definition-block-accent, --dc-definition-block-accent-width]
149
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."
150
+ notes: "The design guide (06-panels-and-cards) points a plain term list at a markdown definition list instead; both books still use the macro."
151
151
 
152
152
  - name: procedure
153
153
  status: live
@@ -234,11 +234,11 @@ components:
234
234
  - name: glossary
235
235
  status: live
236
236
  origin: plugin
237
- recipe: "@glossary … @end-glossary (the macro is used by neither book; the raw <div class=\"dc-terms\"> wrapper is)"
237
+ recipe: "@glossary … @end-glossary (items are plain `**term** — gloss` paragraphs)"
238
238
  emits: div.dc-terms
239
239
  css: styles/components/images.css
240
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)."
241
+ notes: "Used by the design guide (06-panels-and-cards). Items take no class of their own; the old item classes are retired (glossary-item, glossary-item-authored)."
242
242
 
243
243
  - name: outcome
244
244
  status: live
@@ -333,7 +333,7 @@ components:
333
333
  origin: plugin
334
334
  recipe: "@learning-path / ### Title / > subtitle / - Skill A / - Skill B … @end-learning-path"
335
335
  emits:
336
- - div.dc-learning-path.dc-path-block > div.dc-path-shell > h2.dc-spray > span.dc-path-sticker
336
+ - div.dc-learning-path.dc-path-block > div.dc-path-shell > h3.dc-spray > span.dc-path-sticker + span.dc-path-sep
337
337
  - div.dc-path-shell > div.dc-intro
338
338
  - div.dc-stickers > span.dc-sticker > span.dc-sticker-ref
339
339
  - span.dc-arrow (between stickers)
@@ -345,14 +345,14 @@ components:
345
345
  - --dc-path-shell-padding-top
346
346
  - --dc-path-shell-padding-bottom
347
347
  - --dc-arrow-color
348
- breaks: "break-before/after: auto on the block; the h2 stays with what follows"
348
+ breaks: "break-before/after: auto on the block; the h3 stays with what follows"
349
349
 
350
350
  - name: skill
351
351
  status: live
352
352
  origin: plugin
353
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
354
  emits:
355
- - div.dc-skill-card[name][data-break-inside=avoid] > div.dc-card-tab > span.dc-tab-title + span.dc-tab-tier
355
+ - div.dc-skill-card[name][data-break-inside=avoid] > div.dc-card-tab > h4.dc-tab-title + span.dc-tab-tier
356
356
  - div.dc-card-body > div.dc-card-inner > p.dc-flavor + div.dc-sub-header
357
357
  - div.dc-ability > span.dc-ap + p.dc-ability-text
358
358
  css: [styles/components/cards.css, styles/components/data.css, styles/components/specialty-identity.css, styles/dc-native.css]
@@ -471,7 +471,7 @@ components:
471
471
  recipe: "@section .dc-citizen-walkthrough [.gp-columns-2]"
472
472
  emits: div.section.dc-citizen-walkthrough
473
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."
474
+ notes: "Themed through the section chassis tokens --dc-section-accent / --dc-section-bg (see section), which the design guide documents."
475
475
 
476
476
  - name: citizen-file-page
477
477
  status: live
@@ -544,7 +544,7 @@ components:
544
544
  status: live
545
545
  origin: author
546
546
  recipe: "## Title {.dc-spray} (also emitted by @learning-path for its title)"
547
- emits: h2.dc-spray
547
+ emits: ["h2.dc-spray (authored)", "h3.dc-spray (a @learning-path title)"]
548
548
  css: [styles/components/chrome.css, styles/components/data.css]
549
549
  tokens: [--dc-spray-bg, --dc-spray-color]
550
550
  breaks: "as a path-shell title: break-before avoid on the element after it"
@@ -602,8 +602,8 @@ components:
602
602
  origin: author
603
603
  recipe: "@skill {.dc-allow-split} or @section .dc-allow-split"
604
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"
605
+ css: [styles/components/section.css, styles/components/cards.css]
606
+ breaks: "break-inside: auto — opts a section or skill card out of the default avoid. A split specialty card also keeps its first two blocks, and any lead-in (ability row, bold-only line, paragraph before a list or table), with what follows (break-after: avoid)"
607
607
  notes: "The plugin reads this class (to drop data-break-inside=avoid) but never adds it."
608
608
 
609
609
  - name: two-col
@@ -614,6 +614,47 @@ components:
614
614
  css: styles/components/cards.css
615
615
  breaks: "list items and paragraphs break-inside: avoid within the columns"
616
616
 
617
+ - name: cards-two-col
618
+ status: live
619
+ origin: author
620
+ recipe: "@specialty .augmerc .dc-cards-two-col (or on @chapter / @page / @section)"
621
+ emits: .dc-cards-two-col (on the ancestor it is written on; styles the .dc-skill-card inside it)
622
+ css: styles/components/cards.css
623
+ breaks: "list items break-inside: avoid; a paragraph may break between columns. Flavor line, ability rows, tables, sub-heads and rules span both columns. A card with .dc-allow-split stays single-column; a card with its own .dc-two-col keeps the per-card form"
624
+
625
+ - name: snug
626
+ status: live
627
+ origin: author
628
+ recipe: "@section .dc-snug / @page .dc-snug"
629
+ emits: .dc-snug (on the section or page it is written on)
630
+ css: styles/page-templates.css
631
+ notes: "Paragraph and list-item margin-bottom drops to 0.04in so a section or page that overflows by a line or two fits. Type size and leading are untouched."
632
+
633
+ - name: plain
634
+ status: live
635
+ origin: author
636
+ recipe: "@section .dc-plain"
637
+ emits: div.section.dc-plain
638
+ css: styles/components/section.css
639
+ notes: "The section-chrome escape hatch (dc#39). The design guide renders it (11-variants)."
640
+
641
+ - name: full-page
642
+ status: live
643
+ origin: author
644
+ recipe: "@page .dc-full-page"
645
+ emits: div.page.dc-full-page
646
+ css: [styles/page-templates.css, styles/page-rules.css, styles/dc-native.css]
647
+ breaks: "break-before: page; page: full"
648
+ notes: "Used by SysOps (chapter-00); the design guide documents it in a fenced example (08-page-templates)."
649
+
650
+ - name: img-float
651
+ status: live
652
+ origin: author
653
+ recipe: "![alt](src){.dc-img-float-left|.dc-img-float-right}"
654
+ emits: img.dc-img-float-left|.dc-img-float-right
655
+ css: styles/components/images.css
656
+ notes: "Documented and rendered in the design guide (04-layout, 11-variants); no Field Guide use."
657
+
617
658
  # ── Core-owned structure whose public tokens this library declares ─────
618
659
  - name: section
619
660
  status: live
@@ -621,9 +662,9 @@ components:
621
662
  recipe: "@section (bare; core markers.js emits the wrapper)"
622
663
  emits: div.section
623
664
  css: styles/components/section.css
624
- tokens: [--dc-section-bg, --dc-section-accent]
665
+ tokens: [--dc-section-bg, --dc-section-accent, --dc-section-surface, --dc-section-shadow, --dc-section-pad-top, --dc-section-pad-right, --dc-section-pad-bottom, --dc-section-pad-left]
625
666
  breaks: "break-inside: avoid (core MARKER_CSS)"
626
- notes: "The panel chrome is opt-out; .dc-plain is the escape."
667
+ notes: "Panel chrome is token-driven: variants and templates set --dc-section-surface/-shadow/-pad-* on their own rule; .dc-plain turns both layers off."
627
668
 
628
669
  - name: chapter-opener
629
670
  status: live
@@ -641,139 +682,100 @@ components:
641
682
  - --dc-chapter-opener-pad-right
642
683
  notes: "There is no @chapter-opener macro."
643
684
 
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
685
+ # ── Retired: no CSS, no emission, no use (tombstone comments only) ─────
686
+ - name: printer-page
687
+ status: retired
655
688
  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."
689
+ recipe: "@page .dc-printer-page (the last marker of a book's last chapter)"
690
+ emits: div.page.dc-printer-page
691
+ notes: "Removed in 1.1.2 with its @page printer-blank: gutterpress 0.11.15's dtrpg preset pads to the 4-page signature and reserves the blank last page itself (print.reserveLastPage)."
661
692
 
662
693
  - name: suppress-footer
663
- status: unused
694
+ status: retired
664
695
  origin: author
665
696
  recipe: "@page .dc-suppress-footer"
666
697
  emits: div.page.dc-suppress-footer
667
- css: styles/page-rules.css
668
- breaks: "page: clean"
669
-
670
- - name: printer-page
671
- status: live
672
- origin: author
673
- recipe: "@page .dc-printer-page (the last marker of a book's last chapter)"
674
- emits: div.page.dc-printer-page
675
- css: [styles/page-rules.css, styles/dc-native.css]
676
- breaks: "page: printer-blank; break-before: page"
677
- notes: "A completely blank final page — no wall, no footer — for DriveThruRPG's reserved printer page. With `print: signature: 4` in the manifest, gutterpress pads to the next multiple of 4, so the book always ends blank. Used by the Field Guide."
698
+ notes: "Removed 2026-10-08 with its `@page clean` (page-rules.css, and the design guide's mirror): no book used it."
678
699
 
679
700
  - name: cover-page
680
- status: unused
701
+ status: retired
681
702
  origin: author
682
703
  recipe: "raw <div class=\"dc-cover-page dc-cover-layout\"> composite"
683
704
  emits:
684
705
  - div.dc-cover-page.dc-cover-layout > div.dc-cover-bg + div.dc-cover-num + h1.dc-cover-bigword + p.dc-cover-strap
685
706
  - div.dc-cover-body + div.dc-cover-meta-row
686
- css: styles/components/data.css
687
- tokens: [--dc-cover-meta-border]
688
- notes: "Documented in 05-page-templates.md inside a fenced example only."
707
+ notes: "Removed 2026-10-08 (data.css): no book used it, and its translucent gradients were the PDF/X transparency test's only exemption."
689
708
 
690
709
  - name: toc-rows
691
- status: unused
710
+ status: retired
692
711
  origin: author
693
712
  recipe: "raw <div class=\"dc-toc-row\"> > .dc-toc-no + .dc-toc-title + .dc-toc-page inside .dc-toc"
694
713
  emits: div.dc-toc-row > span.dc-toc-no + span.dc-toc-title + span.dc-toc-page
695
- css: styles/components/data.css
696
- notes: "Both books' contents pages use a plain list inside .dc-toc."
697
-
698
- - name: img-float
699
- status: unused
700
- origin: author
701
- recipe: "![alt](src){.dc-img-float-left|.dc-img-float-right}"
702
- emits: img.dc-img-float-left|.dc-img-float-right
703
- css: styles/components/images.css
704
- notes: "Documented in 06-layout.md and 07-markdown-reference.md; no live use."
714
+ notes: "Removed 2026-10-08 (data.css): both books' contents pages use a plain list inside .dc-toc."
705
715
 
706
716
  - name: portrait
707
- status: unused
717
+ status: retired
708
718
  origin: author
709
719
  recipe: "raw <div class=\"dc-portrait\"><img></div>"
710
720
  emits: div.dc-portrait > img
711
- css: styles/components/chrome.css
712
- tokens: [--dc-portrait-border, --dc-portrait-surface]
721
+ notes: "Removed 2026-10-08 (chrome.css) with its --dc-portrait-* tokens: never used."
713
722
 
714
723
  - name: dashed-rule
715
- status: unused
724
+ status: retired
716
725
  origin: author
717
726
  recipe: "raw <hr class=\"dc-dashed-rule\">"
718
727
  emits: hr.dc-dashed-rule
719
- css: styles/components/chrome.css
728
+ notes: "Removed 2026-10-08: plain `hr` keeps the dashed rule (chrome.css)."
720
729
 
721
730
  - name: margin-sm
722
- status: unused
731
+ status: retired
723
732
  origin: author
724
733
  recipe: ".dc-margin-sm modifier (e.g. on .dc-tape)"
725
734
  emits: .dc-margin-sm
726
- css: styles/components/chrome.css
735
+ notes: "Removed 2026-10-08 (chrome.css): never used."
727
736
 
728
737
  - name: path-subtitle
729
- status: unused
738
+ status: retired
730
739
  origin: author
731
740
  recipe: "raw <div class=\"dc-path-subtitle\">"
732
741
  emits: div.dc-path-subtitle
733
- css: styles/components/chrome.css
734
- notes: "@learning-path emits .dc-intro for its subtitle, not this."
742
+ notes: "Removed 2026-10-08 (chrome.css): @learning-path emits .dc-intro for its subtitle."
735
743
 
736
744
  - name: outcome-table
737
- status: unused
745
+ status: retired
738
746
  origin: author
739
747
  recipe: "(none — no macro or markdown path emits it)"
740
748
  emits: .dc-outcome-table
741
- css: styles/components/cards.css
742
- notes: "A column-span rule inside .dc-two-col; the plugin emits .dc-outcomes."
749
+ notes: "Removed 2026-10-08 (cards.css): nothing emitted it; the plugin emits .dc-outcomes."
743
750
 
744
751
  - name: roll-badges
745
- status: unused
752
+ status: retired
746
753
  origin: author
747
754
  recipe: "(none — no current authoring path)"
748
755
  emits: [span.dc-roll-lucid, span.dc-roll-surreal]
749
- css: styles/components/data.css
750
- tokens: [--dc-roll-lucid-color, --dc-roll-surreal-color]
756
+ notes: "Removed 2026-10-08 (data.css) with --dc-roll-lucid-color/--dc-roll-surreal-color: no authoring path."
751
757
 
752
758
  - name: sidebar-box-divider
753
- status: unused
759
+ status: retired
754
760
  origin: author
755
761
  recipe: "raw <hr class=\"dc-sidebar-box-divider\"> inside a sidebar-box"
756
762
  emits: hr.dc-sidebar-box-divider
757
- css: styles/components/data.css
763
+ notes: "Removed 2026-10-08: a plain `hr` inside a sidebar box is the divider (data.css)."
758
764
 
759
765
  - name: glossary-item
760
- status: unused
766
+ status: retired
761
767
  origin: author
762
768
  recipe: "raw <div class=\"dc-item\"> inside .dc-terms"
763
769
  emits: div.dc-item
764
- css: styles/components/images.css
765
- breaks: "break-inside: avoid"
766
- notes: "The class the CSS styles; the docs and gallery author .dc-terms-item instead (see glossary-item-authored)."
770
+ notes: "Removed 2026-10-08 (images.css, with --card-border-color): never used; see glossary-item-authored for the open naming question."
767
771
 
768
772
  - name: callout-generic
769
- status: unused
773
+ status: retired
770
774
  origin: author
771
775
  recipe: "(none — no macro or markdown path emits it)"
772
776
  emits: .dc-callout
773
- css: styles/dc-native.css
774
- 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)."
777
+ notes: "Removed 2026-10-08 (dc-native.css): nothing emits .dc-callout; the alert family is .dc-alert."
775
778
 
776
- # ── Retired: no CSS, no emission, no use (tombstone comments only) ─────
777
779
  - name: roll-table
778
780
  status: retired
779
781
  origin: plugin
@@ -823,19 +825,19 @@ components:
823
825
  emits: [.dc-gear-entry, div.section.dc-gear-list]
824
826
  notes: "Removed 2026-08-21 (data.css GEAR ENTRY tombstone); neither could ever match what @gear emits."
825
827
 
828
+ - name: glossary-item-authored
829
+ status: retired
830
+ origin: author
831
+ recipe: "raw <div class=\"dc-terms-item\"> inside .dc-terms"
832
+ emits: div.dc-terms-item
833
+ notes: "Never styled, and no doc or gallery page writes it any more (2026-10-08): a glossary item is a plain paragraph inside @glossary."
834
+
826
835
  # ── Unimplemented: documented or authored, never built ────────────────
827
836
  - name: skill-card-continuation-marker
828
837
  status: unimplemented
829
838
  origin: plugin
830
- recipe: "(described in 04-components.md, 09-component-gallery.md and docs/components-and-palette-reference.md as automatic ▸ / ◂ markers on split skill cards)"
839
+ recipe: "(described in docs/components-and-palette-reference.md as automatic ▸ / ◂ markers on split skill cards)"
831
840
  emits: [.dc-card-cont-marker, .dc-card-fwd-marker]
832
841
  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."
833
842
 
834
- - name: glossary-item-authored
835
- status: unimplemented
836
- origin: author
837
- recipe: "raw <div class=\"dc-terms-item\"> inside .dc-terms (as the docs and gallery write it)"
838
- emits: div.dc-terms-item
839
- 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."
840
-
841
843
  # Classes a book uses that are not components.
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gp-dimm-city",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "description": "Dimm City design system for Gutterpress: the markdown-it macros (@skill, @specialty, @learning-path, @callout, …), print stylesheets, design tokens, fonts and page templates the Dimm City TTRPG books are set in.",
5
5
  "type": "module",
6
6
  "main": "plugin.js",
@@ -68,7 +68,7 @@
68
68
  "pack:check": "npm pack --dry-run"
69
69
  },
70
70
  "devDependencies": {
71
- "gutterpress": "0.11.13",
71
+ "gutterpress": "0.11.15",
72
72
  "markdown-it": "^14.1.0"
73
73
  },
74
74
  "peerDependencies": {
package/plugin.js CHANGED
@@ -1565,10 +1565,9 @@ export default function dimmCityPlugin(md, options = {}) {
1565
1565
  }
1566
1566
 
1567
1567
  // Removed 2026-05-17: @two-column / @three-column / @no-break.
1568
- // Use @section .gp-columns-2 / @section .gp-columns-3 / @section .pmd-no-break
1569
- // instead — markers.js emits identical layout semantics, with the
1570
- // added `.section` class that picks up `break-inside: avoid` from MARKER_CSS.
1571
- // See docs/migrations/2026-05-removing-container-syntax.md for the rationale.
1568
+ // Use @section .gp-columns-2 / @section .gp-columns-3 instead — markers.js
1569
+ // emits identical layout semantics, with the added `.section` class that
1570
+ // picks up `break-inside: avoid` from MARKER_CSS.
1572
1571
 
1573
1572
  // --- @gear / @end-gear ---
1574
1573
  // Shorthand for @card .dc-gear — emits a bare `.dc-card.dc-gear`.
@@ -1753,12 +1752,17 @@ export default function dimmCityPlugin(md, options = {}) {
1753
1752
 
1754
1753
  // Inside @learning-path section
1755
1754
  if (inLearningPath && !inSkillMode) {
1756
- // H3 = Learning path title (banner)
1755
+ // H3 = Learning path title (banner). Emitted as an h3, the level it
1756
+ // was written at: the outline (the app's contents panel, PDF
1757
+ // bookmarks) nests specialty (##) > learning path (###) > skill (####).
1758
+ // .dc-path-sep is a real space between the sticker and the title, so
1759
+ // the heading's text reads "PRX1 Refuse Finality" (outline, bookmarks,
1760
+ // copy, search, screen readers); chrome.css gives it the printed gap.
1757
1761
  if (tok.type === 'heading_open' && tok.tag === 'h3') {
1758
1762
  const inlineTok = tokens[i + 1];
1759
1763
  const titleText = inlineTok && inlineTok.content ? inlineTok.content : '';
1760
1764
  currentLearningPathName = titleText;
1761
- newTokens.push(makeToken('html_block', '<h2 class="dc-spray"><span class="dc-path-sticker">' + esc(currentLearningPathRef) + '</span>' + esc(titleText) + '</h2>\n'));
1765
+ newTokens.push(makeToken('html_block', '<h3 class="dc-spray"><span class="dc-path-sticker">' + esc(currentLearningPathRef) + '</span><span class="dc-path-sep"> </span>' + esc(titleText) + '</h3>\n'));
1762
1766
  learningPathHasTitle = true;
1763
1767
  i += 2; // Skip heading_open, inline, heading_close
1764
1768
  continue;
@@ -1896,7 +1900,7 @@ export default function dimmCityPlugin(md, options = {}) {
1896
1900
 
1897
1901
  // Mark image-only paragraphs so layout rules can target them without
1898
1902
  // relying on p:has(img). The base CSS rule
1899
- // (p.dc-img-wrapper { padding:0; margin:0 }) lives in components.css.
1903
+ // (p.dc-img-wrapper { padding:0; margin:0 }) lives in components/data.css.
1900
1904
  // Per-page rules can further refine position via .page.my-class p.dc-img-wrapper.
1901
1905
  if (tok.type === 'paragraph_open') {
1902
1906
  const inlineTok = tokens[i + 1];
@@ -1967,7 +1971,10 @@ export default function dimmCityPlugin(md, options = {}) {
1967
1971
  const tabBaseClass = 'dc-card-tab' + (parsed.highlight ? ' dc-highlight' : '');
1968
1972
  cardHtml += ' <div class="' + tabBaseClass + '">\n';
1969
1973
  const autoTier = currentLearningPathRef ? currentLearningPathRef + '.' + currentSkillIndex : '';
1970
- cardHtml += ' <span class="dc-tab-title">' + esc(parsed.name) + '</span>\n';
1974
+ // The skill's name is its `####` heading, kept a heading so the
1975
+ // outline lists it under its learning path. (A continuation card's
1976
+ // repeated title stays a span: it is not a new entry.)
1977
+ cardHtml += ' <h4 class="dc-tab-title">' + esc(parsed.name) + '</h4>\n';
1971
1978
  cardHtml += ' <span class="dc-tab-tier">' + esc(parsed.tier || autoTier) + '</span>\n';
1972
1979
  cardHtml += ' </div>\n';
1973
1980