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 +241 -0
- package/components.yaml +91 -89
- package/images/brick-wall.png +0 -0
- package/package.json +2 -2
- package/plugin.js +15 -8
- package/styles/components/callouts.css +2 -3
- package/styles/components/cards.css +90 -33
- package/styles/components/chrome.css +25 -68
- package/styles/components/data.css +32 -239
- package/styles/components/images.css +1 -22
- package/styles/components/section.css +67 -199
- package/styles/components/specialty-identity.css +1 -1
- package/styles/components/specialty.css +20 -24
- package/styles/dc-component-defaults.css +28 -16
- package/styles/dc-core.css +24 -7
- package/styles/dc-native.css +52 -63
- package/styles/dc-palette.css +13 -4
- package/styles/page-rules.css +1 -37
- package/styles/page-templates.css +123 -74
- package/images/brick-bg-01.png +0 -0
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: "
|
|
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 (
|
|
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: "
|
|
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 >
|
|
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
|
|
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 >
|
|
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: "
|
|
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: "{.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: "
|
|
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
|
-
# ──
|
|
645
|
-
- name:
|
|
646
|
-
status:
|
|
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-
|
|
657
|
-
emits: div.page.dc-
|
|
658
|
-
|
|
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:
|
|
694
|
+
status: retired
|
|
664
695
|
origin: author
|
|
665
696
|
recipe: "@page .dc-suppress-footer"
|
|
666
697
|
emits: div.page.dc-suppress-footer
|
|
667
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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: "{.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:
|
|
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
|
-
|
|
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:
|
|
724
|
+
status: retired
|
|
716
725
|
origin: author
|
|
717
726
|
recipe: "raw <hr class=\"dc-dashed-rule\">"
|
|
718
727
|
emits: hr.dc-dashed-rule
|
|
719
|
-
|
|
728
|
+
notes: "Removed 2026-10-08: plain `hr` keeps the dashed rule (chrome.css)."
|
|
720
729
|
|
|
721
730
|
- name: margin-sm
|
|
722
|
-
status:
|
|
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
|
-
|
|
735
|
+
notes: "Removed 2026-10-08 (chrome.css): never used."
|
|
727
736
|
|
|
728
737
|
- name: path-subtitle
|
|
729
|
-
status:
|
|
738
|
+
status: retired
|
|
730
739
|
origin: author
|
|
731
740
|
recipe: "raw <div class=\"dc-path-subtitle\">"
|
|
732
741
|
emits: div.dc-path-subtitle
|
|
733
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
773
|
+
status: retired
|
|
770
774
|
origin: author
|
|
771
775
|
recipe: "(none — no macro or markdown path emits it)"
|
|
772
776
|
emits: .dc-callout
|
|
773
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
1569
|
-
//
|
|
1570
|
-
//
|
|
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', '<
|
|
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
|
-
|
|
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
|
|