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,2 @@
1
+ > [!{{TYPE}}]
2
+ > {{body}}
@@ -0,0 +1,5 @@
1
+ @block .dc-panel label="{{label}}"
2
+
3
+ {{body}}
4
+
5
+ @end-block
@@ -0,0 +1,5 @@
1
+ @callout variant={{variant}} label="{{label}}"
2
+
3
+ {{body}}
4
+
5
+ @end-callout
@@ -0,0 +1,11 @@
1
+ @card
2
+
3
+ #### {{heading}}
4
+
5
+ > {{pull-quote}}
6
+
7
+ {{body}}
8
+
9
+ > {{footer}}
10
+
11
+ @end-card
@@ -0,0 +1,11 @@
1
+ @chapter #{{id}} ch="{{number}}"
2
+
3
+ @page .page-chapter-start .dc-chapter-start
4
+
5
+ # {{title}}
6
+
7
+ @section .dc-fiction-excerpt
8
+
9
+ {{excerpt}}
10
+
11
+ @end-section
@@ -0,0 +1,13 @@
1
+ @page .page-credits .dc-credits
2
+
3
+ # Credits {.dc-chevron}
4
+
5
+ @section .credits-colophon
6
+
7
+ <div class="dc-colophon-grid">
8
+
9
+ **{{role}}:** {{names}}
10
+
11
+ </div>
12
+
13
+ @end-section
@@ -0,0 +1,7 @@
1
+ @definition
2
+
3
+ ##### {{term}}
4
+
5
+ {{meaning}}
6
+
7
+ @end-definition
@@ -0,0 +1,5 @@
1
+ @dm-note label="{{label}}"
2
+
3
+ {{body}}
4
+
5
+ @end-dm-note
@@ -0,0 +1,9 @@
1
+ @gear
2
+
3
+ ### {{name}}
4
+
5
+ *{{tags}}*
6
+
7
+ {{body}}
8
+
9
+ @end-gear
@@ -0,0 +1,10 @@
1
+ @learning-path
2
+
3
+ ### {{title}}
4
+
5
+ > {{subtitle}}
6
+
7
+ - {{first-skill}}
8
+ - {{second-skill}}
9
+
10
+ @end-learning-path
@@ -0,0 +1,5 @@
1
+ @lede
2
+
3
+ {{lede}}
4
+
5
+ @end-lede
@@ -0,0 +1,8 @@
1
+ @outcome
2
+
3
+ 20 | Crit | {{crit}}
4
+ 15 | Success | {{success}}
5
+ 10 | Partial | {{partial}}
6
+ 1 | Fumble | {{fumble}}
7
+
8
+ @end-outcome
@@ -0,0 +1,7 @@
1
+ @procedure
2
+
3
+ 1. {{step-one}}
4
+ 2. {{step-two}}
5
+ 3. {{step-three}}
6
+
7
+ @end-procedure
@@ -0,0 +1,7 @@
1
+ @sidebar
2
+
3
+ ### {{heading}}
4
+
5
+ {{body}}
6
+
7
+ @end-sidebar
@@ -0,0 +1,9 @@
1
+ @skill
2
+
3
+ #### {{name}} | {{tier}}
4
+
5
+ > {{flavor}}
6
+
7
+ 1. **{{ap}} AP** *{{ability}}:* {{effect}}
8
+
9
+ @end-skill
@@ -0,0 +1,5 @@
1
+ @specialty-art
2
+
3
+ ![{{alt}}]({{image}})
4
+
5
+ @end-specialty-art
@@ -0,0 +1,5 @@
1
+ @specialty-card
2
+
3
+ {{body}}
4
+
5
+ @end-specialty-card
@@ -0,0 +1,11 @@
1
+ @specialty .{{specialty}}
2
+
3
+ @specialty-intro
4
+
5
+ ## {{title}}
6
+
7
+ {{intro}}
8
+
9
+ @end-specialty-intro
10
+
11
+ @end-specialty
@@ -0,0 +1,15 @@
1
+ @page .page-toc
2
+
3
+ # Contents {.dc-chevron}
4
+
5
+ @lede
6
+
7
+ {{lede}}
8
+
9
+ @end-lede
10
+
11
+ @toc
12
+
13
+ 1. [{{chapter}}](#{{id}}) — {{blurb}}
14
+
15
+ @end-toc
@@ -0,0 +1,227 @@
1
+ /* =============================================================================
2
+ DC-COMPONENTS.CSS — Reusable DC Component Library
3
+ =============================================================================
4
+ This file IS the DC component library. Any DC-branded Gutterpress book
5
+ imports this file and gets all components at their correct defaults with
6
+ no override files required. Do not break that portability contract.
7
+
8
+ ── ARCHITECTURAL CONTRACT ────────────────────────────────────────────────
9
+ OWNS:
10
+ - Every .dc-* component class (base + thin variants)
11
+ - Every .pmd-* utility class
12
+ - Specialty parent-scoped overrides:
13
+ .dc-specialty.<name> .dc-skill-card { … }
14
+ .dc-specialty.<name> .dc-path-shell { … }
15
+ .dc-specialty.<name> .dc-specialty-card { … }
16
+ These live HERE adjacent to the component they modify.
17
+ - Break control (break-inside/break-before/break-after) for individual
18
+ components
19
+ - Component-scoped public custom properties (--dc-alert-bg, etc.)
20
+
21
+ MUST NOT CONTAIN:
22
+ - columns:N rules of any kind (→ page-templates.css)
23
+ - @page declarations or named-page assignments (→ page-rules.css)
24
+ - div.chapter scaffolding (→ the consuming book's own sheet)
25
+ - :root token definitions (→ dc-component-defaults.css)
26
+ - @media screen rules (print-only project)
27
+ - Element selectors scoped to page/chapter context classes
28
+ (→ the book's own sheet (`@layer book`))
29
+
30
+ CORE CONSTRAINT — COMPONENT STYLE ISOLATION:
31
+ If a bare .dc-* rule needs different values in the book's own sheet (`@layer book`), the
32
+ components/*.css value is WRONG — fix it here. The override files own
33
+ layout context only. Never split a component's appearance across files.
34
+
35
+ CORE CONSTRAINT — shape-following chrome is a clipped SIBLING layer, never
36
+ a filter:
37
+ An element with clip-path clips everything it paints, its own pseudos
38
+ included, so an outline or shadow that has to reach outside the silhouette
39
+ cannot live on the clipped element. `filter: drop-shadow()` is not the
40
+ answer either: any filter makes Chromium rasterize the whole subtree into
41
+ a 300 DPI bitmap at print — the text inside stops being text, the PDF
42
+ bloats, and the build pays for it (dc#28: 166 skill cards were most of the
43
+ field guide's build time). The pattern is two pseudos on an UNCLIPPED host
44
+ that is a stacking context (isolation: isolate): one carries the surface
45
+ and the clip, the other the same clip on a box 2px larger (outline) or
46
+ offset (shadow), filled with the chrome colour. Canonical examples:
47
+ .section → ::before (surface + clip), ::after (shadow)
48
+ .dc-path-shell → ::before (surface + clip), ::after (outline)
49
+ .dc-skill-card → .dc-card-inner::after (surface + clip),
50
+ .dc-card-body::after (outline), .dc-card-inner::before (shadow)
51
+ Any component needing both a geometric clip AND chrome outside it MUST
52
+ follow this.
53
+
54
+ COMPONENT PATTERN:
55
+ One dc-prefixed base class owns the full default shell (structure, spacing,
56
+ typography, borders, break behavior). Variant classes (including specialty
57
+ parent-container overrides) override ONLY the documented public API:
58
+ --dc-[component]-surface / --dc-[component]-accent /
59
+ --dc-[component]-fg / --dc-[component]-label-color /
60
+ --dc-[component]-title-color
61
+ Do not expose internal layout dimensions as a variable API.
62
+
63
+ TOKEN CONVENTION (dc#34, one rule, no exceptions):
64
+ - Every public component token DEFAULTS at :root in dc-component-defaults.css. A
65
+ component's own base rule NEVER declares its own public token — an
66
+ element that sets a custom property on itself makes that property
67
+ unconditionally win over any ancestor-scope override for as long as
68
+ the element rule exists, regardless of the override's specificity,
69
+ because the winning declaration for an element is chosen among rules
70
+ that match that element BEFORE inheritance is ever considered. Three
71
+ components (.dc-ap, .dc-sidebar, .section.dc-fiction-excerpt) violated
72
+ this until dc#34 and silently ate every `#ch-x { --dc-ap-bg: … }`-shaped
73
+ override; the fix moved their defaults to :root and changed no render.
74
+ - Components consume their tokens as a bare `var(--x)` — no inline
75
+ `var(--x, fallback)`. A token declared at :root needs no fallback, and
76
+ an inline fallback that duplicates the :root value is dead weight that
77
+ invites the two to drift (found and corrected during dc#34).
78
+ - Variants and contexts set tokens on ANCESTORS (the book's own sheet (`@layer book`)
79
+ chapter/page scopes) or on VARIANT CLASSES on the same element
80
+ (`.dc-ap.free`, `.dc-sidebar.inset`, `.dc-specialty.<name> .dc-X`) —
81
+ never by re-declaring the token on the base component selector itself.
82
+
83
+ AGENT RULE: "Is this a .dc-* or .pmd-* component style, or a
84
+ .dc-specialty.<name> scope block for a component?" — if NO, use another file.
85
+ ──────────────────────────────────────────────────────────────────────── */
86
+
87
+ @layer dc.components {
88
+
89
+ /* ═══ ALERTS — base+thin-variant pattern ═══
90
+ .dc-alert base + .dc-alert-label label chrome + thin variant classes.
91
+ GFM: > [!NOTE/WARNING/DM/VIBE/ORIGIN/VISIT/GEAR] or @callout/@dm-note macros. */
92
+
93
+ /* ── Base shell — player-facing: pale cyan HUD panel, blue border ─────────── */
94
+ /* Token defaults for .dc-alert are declared in :root in dc-component-defaults.css.
95
+ Override at chapter-id scope in the book's own sheet (`@layer book`), or in variant rules below. */
96
+ .dc-alert {
97
+ background: var(--dc-alert-bg);
98
+ border-left: var(--dc-alert-border-width) solid var(--dc-alert-border);
99
+ color: var(--dc-alert-fg);
100
+ font-size: var(--dc-alert-body-size);
101
+ line-height: var(--lh-normal);
102
+ padding: var(--space-lg) var(--space-xl);
103
+ margin-top: var(--dc-alert-margin-top);
104
+ break-inside: avoid;
105
+ /* Alerts are full-width callouts that interrupt the reading flow; they
106
+ should NEVER overlap a preceding right-floated image (observed 2026-05-25
107
+ with the portrait in the citizen-file intro). Block elements don't wrap
108
+ floats by default — clear: right ensures any alert after a floated image
109
+ sits decisively below it. Unconditional at the component-base layer: a
110
+ :has() variant would only narrow it, and the clear costs nothing on an
111
+ alert that follows no float. */
112
+ clear: right;
113
+ }
114
+
115
+ .dc-alert p {
116
+ margin: 0;
117
+ font-style: italic;
118
+ }
119
+
120
+ .dc-alert p+p {
121
+ margin-top: 6pt;
122
+ }
123
+
124
+ /* Inline emphasis + paragraphs inside callouts must inherit the alert's
125
+ --dc-alert-fg color. The global p/em/strong rules in dc-core.css set
126
+ dark text colors (color: --ink / --ink-smoke). Inside dark-fill callout
127
+ variants (.dc-dm-note etc.), dark-on-dark measured 1.17:1 — invisible.
128
+ Inherit makes p/em/strong adopt the alert's own foreground. */
129
+ .dc-alert p,
130
+ .dc-alert em,
131
+ .dc-alert strong {
132
+ color: inherit;
133
+ }
134
+
135
+ .dc-alert ul,
136
+ .dc-alert ol {
137
+ margin: 6pt 0 0;
138
+ padding-left: 0.2in;
139
+ }
140
+
141
+ .dc-alert li {
142
+ margin-bottom: 0.04in;
143
+ }
144
+
145
+ .dc-alert li::before {
146
+ color: var(--dc-alert-border);
147
+ }
148
+
149
+ /* ── Label chrome ───────────────────────────────────────────────────────── */
150
+ .dc-alert-label {
151
+ display: block;
152
+ font-family: var(--font-mono);
153
+ font-size: var(--dc-alert-label-size);
154
+ font-weight: var(--dc-alert-label-weight);
155
+ font-style: normal;
156
+ text-transform: uppercase;
157
+ letter-spacing: var(--dc-alert-label-spacing);
158
+ margin-bottom: var(--dc-alert-label-margin);
159
+ color: var(--dc-alert-label-color);
160
+ }
161
+
162
+ /* ── Variant: Note (player-facing, default) ─────────────────────────────── */
163
+ .dc-note {
164
+ --dc-alert-label-size: 9px;
165
+ --dc-alert-label-spacing: 2px;
166
+ --dc-alert-label-margin: var(--space-sm);
167
+ --dc-alert-margin-top: var(--space-lg);
168
+ }
169
+
170
+ /* ── Variant: Warning (note with distinct surface) ──────────────────────── */
171
+ .dc-note.warning {
172
+ --dc-alert-bg: var(--paper-stain);
173
+ --dc-alert-border: var(--orange);
174
+ --dc-alert-label-color: var(--rust);
175
+ }
176
+
177
+ /* ── Variant: DM Note (Dream Master-facing) — dark panel, authoritative ──── */
178
+ .dc-dm-note {
179
+ --dc-alert-bg: var(--ink-dark);
180
+ --dc-alert-fg: var(--paper-cream);
181
+ --dc-alert-border: var(--hud-blue-bright);
182
+ --dc-alert-label-color: var(--hud-blue-bright);
183
+ --dc-alert-body-size: 9pt;
184
+ --dc-alert-border-width: 3px;
185
+ --dc-alert-label-weight: 600;
186
+ --dc-alert-label-spacing: 0.1em;
187
+ --dc-alert-margin-top: 9pt;
188
+ }
189
+
190
+ /* ── Variant: Vibe Callout — flavor fiction, dark panel ──────────────────── */
191
+ .dc-vibe-callout {
192
+ --dc-alert-bg: var(--ink-dark);
193
+ --dc-alert-fg: var(--paper-aged);
194
+ --dc-alert-border: var(--hud-magenta);
195
+ --dc-alert-label-color: var(--hud-magenta);
196
+ }
197
+
198
+ /* ── Variant: Origin Callout ────────────────────────────────────────────── */
199
+ .dc-origin-callout {
200
+ --dc-alert-bg: var(--surface-orange-tint);
201
+ --dc-alert-border: var(--rust); /* warmth without blood's full danger weight */
202
+ --dc-alert-label-color: var(--crimson);
203
+ --dc-alert-border-width: 3px;
204
+ }
205
+
206
+ /* ── Variant: Visit Callout ─────────────────────────────────────────────── */
207
+ .dc-visit-callout {
208
+ --dc-alert-border: var(--hud-blue);
209
+ /* Was --hud-blue-dark on --hud-blue-dim (default alert bg) = 3.95:1
210
+ (fails AA). --ink-dark gives 7.05:1 on the same cyan bg. */
211
+ --dc-alert-label-color: var(--ink-dark);
212
+ --dc-alert-body-size: var(--fs-body);
213
+ margin: 0.12in 0;
214
+ }
215
+
216
+ /* ── Variant: Gear Callout ──────────────────────────────────────────────── */
217
+ .dc-gear-callout {
218
+ --dc-alert-bg: var(--ink-dark);
219
+ --dc-alert-fg: var(--paper-cream);
220
+ --dc-alert-border: var(--brand-yellow); /* brand-yellow = hazmat/tech signal */
221
+ --dc-alert-label-color: var(--brand-yellow);
222
+ margin: 0.12in auto 0.18in;
223
+ border-left-width: 4px;
224
+ width: 90%;
225
+ }
226
+
227
+ }