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,483 @@
1
+ @layer dc.components {
2
+
3
+ /* ═══ SIMPLE COMPONENTS ═══ */
4
+
5
+ /* ── Tag ──────────────────────────────────────────────────────────────── */
6
+ .dc-tag {
7
+ font-family: var(--font-mono);
8
+ font-size: 0.62rem;
9
+ text-transform: uppercase;
10
+ letter-spacing: var(--ls-cap-sm);
11
+ color: var(--ink-dust);
12
+ font-weight: 600;
13
+ }
14
+
15
+ /* ── Chevron banner ───────────────────────────────────────────────────── */
16
+ /* Chapter-title chevron banner. Token contract:
17
+ --dc-chevron-bg → banner background (default --brand-magenta-deep)
18
+ --dc-chevron-color → text color (default --paper-cream)
19
+ Per-chapter override e.g.:
20
+ #ch-example-gear-tech .dc-chevron { --dc-chevron-bg: var(--hud-blue-dark); }
21
+
22
+ WHY brand-magenta-deep default (and not rust): per the creaturepunk-
23
+ design-guide brand spec, magenta is the "banner / chapter punch /
24
+ spray treatment" role color. Rust/orange is reserved for "warnings,
25
+ AP tags, arrows, mechanical emphasis" — putting it on chapter banners
26
+ miscommunicates the semantic (CONTENTS shouldn't read as a warning).
27
+ Rubric: D9 (brand identity per chapter — chroma anchor must match
28
+ the banner's semantic role). */
29
+ /* Chevron banner. Applies to elements explicitly marked `.dc-chevron`
30
+ AND to the h1 that's the first child of a chapter-opener intro section
31
+ — so authors don't have to write `{.dc-chevron}` on every chapter h1.
32
+ The structural-selector branch is the same selector used by the
33
+ chapter-opener composite rules above. */
34
+ .dc-chevron,
35
+ .chapter[data-chapter-label] > .page[data-page="intro"] > .section > h1:first-of-type {
36
+ font-family: var(--font-display);
37
+ font-size: var(--dc-chevron-font-size);
38
+ letter-spacing: 0.06em;
39
+ color: var(--dc-chevron-color);
40
+ text-transform: uppercase;
41
+ background: var(--dc-chevron-bg);
42
+ padding: 10px 28px 10px 14px;
43
+ display: block;
44
+ box-sizing: border-box;
45
+ clip-path: var(--clip-banner);
46
+ margin: 0;
47
+ line-height: 1.2;
48
+ word-break: break-word;
49
+ }
50
+
51
+
52
+ /* HEADING-SECTION ADJACENCY (D11, ≤ 0px gap)
53
+ See the single-direction margin convention applied to .section, .dc-intro,
54
+ .dc-toc etc. below in their base definitions: each component
55
+ has `margin-top: 0` and spaces itself via bottom margin only. Consecutive
56
+ siblings collapse naturally (top:0 + bottom:Npt = Npt gap). The first
57
+ sibling after a chevron has no top gap → flush attachment "for free",
58
+ no adjacency rule required.
59
+
60
+ Why not adjacent-sibling selectors? Single-direction margins side-step
61
+ the cascade tiebreak entirely — a later `.B { margin: ... }` shorthand
62
+ cannot silently beat an `A + B` gap rule if there is no gap rule.
63
+ Iter-8 (2026-05-25). */
64
+
65
+ /* When a .dc-intro lede is followed by an alert/callout (the common
66
+ "lede + supporting note" pattern from How Abilities Work), tighten the
67
+ gap so they read as a connected pair. (@callout emits .dc-alert — the
68
+ former .dc-callout adjacency rule was dead and was removed 2026-06-21.) */
69
+ .dc-intro + .dc-alert {
70
+ margin-top: 6pt;
71
+ }
72
+
73
+ /* Adjacent callouts/alerts (e.g. Cybersuck followed by SysFAIL after
74
+ the Ego Points table) read as a CONNECTED PAIR rather than two
75
+ independent floating boxes. Per user feedback: "design elements just
76
+ scattered on pages after Ego Points." (@callout only ever emits
77
+ .dc-alert; the three .dc-callout adjacency permutations never fired and
78
+ were removed 2026-06-21.) */
79
+ .dc-alert + .dc-alert {
80
+ margin-top: 6pt;
81
+ }
82
+
83
+ /* H1.dc-chevron — chapter-title banner sized to fit long chapter names on
84
+ one or two lines. The base .dc-chevron font-size is too large for typical
85
+ H1 chapter titles ("What Do You Dream of Doing?", etc.). Front-matter pages
86
+ (TOC / Credits / Introduction) override this back up to a commanding display
87
+ size — see the page-scoped rule below. D4 type scale (banner-to-body ratio
88
+ must be ≥ 2× at print scale for chapter-punch role). */
89
+ h1.dc-chevron {
90
+ font-size: 1.4rem;
91
+ line-height: 1.2;
92
+ }
93
+
94
+ /* Chapter-opener heading runs at a smaller size than other h1.dc-chevron
95
+ instances so the section body weight stays the focal anchor below the
96
+ composite badge + banner. User-approved 2026-05-25. */
97
+ .chapter[data-chapter-label] > .page[data-page="intro"] > .section > h1:first-of-type {
98
+ font-size: 1.1rem;
99
+ line-height: 1.2;
100
+ }
101
+
102
+ /* Front-matter chevron font-size overrides moved to the book's own sheet (`@layer book`) per A1
103
+ layer-ownership (page-context rules belong in the guide-specific override
104
+ file, not the portable component library). Three-judge gate iteration 3. */
105
+
106
+
107
+ /* ── Spray banner (h2 path header) ───────────────────────────────────────
108
+ Token contract:
109
+ --dc-spray-bg → banner background (default --hud-magenta)
110
+ --dc-spray-color → text color (default --paper-cream)
111
+ Section-level override e.g.:
112
+ .section.dc-augmerc .dc-spray { --dc-spray-bg: var(--augmerc-dark); } */
113
+ .dc-spray {
114
+ font-family: var(--font-display);
115
+ font-size: 22px;
116
+ color: var(--dc-spray-color);
117
+ text-transform: uppercase;
118
+ line-height: 1.5;
119
+ background: var(--dc-spray-bg);
120
+ display: inline-block;
121
+ box-sizing: border-box;
122
+ padding: 16px 22px 18px;
123
+ position: relative;
124
+ /* clip-path does double duty here: besides the chipped corner it makes this
125
+ banner a stacking context, which is what keeps the ::before skew tab
126
+ (z-index: -1) behind THIS element instead of escaping to an ancestor. The
127
+ banner used to get that context from a `.dc-path-shell > * { z-index: 1 }`
128
+ lift, now deleted; MEASURED pixel-identical (0 differing pixels at 2x over
129
+ the whole .dc-path-shell) with the lift, with an explicit
130
+ `isolation: isolate`, and with neither. */
131
+ clip-path: polygon(0 0, 100% 0, 100% 100%, 25px 100%, 0 calc(100% - 15px));
132
+ margin: 0;
133
+ word-break: break-word;
134
+ overflow: visible;
135
+ }
136
+
137
+ .dc-spray::before {
138
+ content: '';
139
+ position: absolute;
140
+ top: -3px;
141
+ right: -8px;
142
+ bottom: -3px;
143
+ width: 14px;
144
+ background: var(--dc-spray-bg);
145
+ transform: skewX(-8deg);
146
+ z-index: -1;
147
+ }
148
+
149
+ .dc-spray::after {
150
+ content: '';
151
+ position: absolute;
152
+ bottom: -6px;
153
+ left: 8%;
154
+ width: 45%;
155
+ height: 5px;
156
+ background: var(--dc-spray-bg);
157
+ opacity: 0.08;
158
+ }
159
+
160
+
161
+ /* ── Path subtitle ────────────────────────────────────────────────────── */
162
+ .dc-path-subtitle {
163
+ font-family: var(--font-mono);
164
+ font-size: 9px;
165
+ text-transform: uppercase;
166
+ letter-spacing: 3px;
167
+ color: var(--hud-blue-dark);
168
+ font-weight: 600;
169
+ margin: 8px 0 4px;
170
+ }
171
+
172
+
173
+ /* ── Stickers / Arrow ─────────────────────────────────────────────────── */
174
+ .dc-stickers {
175
+ display: flex;
176
+ gap: 8px;
177
+ flex-wrap: wrap;
178
+ align-items: center;
179
+ margin: 4px 0 22px;
180
+ }
181
+
182
+ .dc-sticker {
183
+ font-family: var(--font-mono);
184
+ font-size: 11px;
185
+ font-weight: 700;
186
+ padding: 4px 10px;
187
+ background: var(--ink-dark);
188
+ color: var(--paper-cream);
189
+ border: 1px solid var(--hud-blue-dark);
190
+ transform: rotate(-0.5deg);
191
+ text-transform: uppercase;
192
+ letter-spacing: 1px;
193
+ box-shadow: 2px 2px 0 rgba(0, 0, 0, 0.35);
194
+ }
195
+
196
+ .dc-sticker:nth-child(4n+3) {
197
+ transform: rotate(0.7deg);
198
+ }
199
+
200
+ .dc-sticker:nth-child(4n+5) {
201
+ transform: rotate(-0.9deg);
202
+ }
203
+
204
+ .dc-sticker.active {
205
+ /* cream on --crimson = 4.03:1 (fails AA at 11px). I tested --ink on
206
+ --crimson per the pressure-test expert; measured 3.83:1 — also fails.
207
+ Neither text-color choice passes on the bright crimson fill at sticker
208
+ size. Switching the bg to --blood: cream-on-blood = 7.73:1, comfortably
209
+ passes AA. The "active/hot" semantic is preserved (still warm red),
210
+ just deeper. */
211
+ background: var(--blood);
212
+ color: var(--paper-cream);
213
+ border-color: var(--blood);
214
+ transform: rotate(-1.5deg);
215
+ box-shadow: 2px 2px 0 rgba(0, 0, 0, 0.28);
216
+ }
217
+
218
+ /* Inline ↑↓→ marker. Token: --dc-arrow-color (default --blood).
219
+ --orange #d4500a = 2.46:1 on wall — fails AA. --rust #b23a12 measured
220
+ 3.48:1 on wall — still fails. --blood #901a12 = 5.21:1 on wall, passes
221
+ AA small text. Arrows can render outside a paper substrate, so default
222
+ needs to read against the worst case. */
223
+ .dc-arrow {
224
+ font-family: var(--font-mono);
225
+ color: var(--dc-arrow-color);
226
+ font-size: 14px;
227
+ font-weight: 700;
228
+ }
229
+
230
+
231
+ /* ── Path sticker / Sticker tier ref ──────────────────────────────────── */
232
+ .dc-path-sticker {
233
+ display: inline-block;
234
+ font-family: var(--font-mono);
235
+ font-size: 8px;
236
+ font-weight: 700;
237
+ letter-spacing: 0.10em;
238
+ text-transform: uppercase;
239
+ background: var(--paper-cream);
240
+ color: var(--hud-blue);
241
+ padding: 2px 5px 1px;
242
+ transform: rotate(-2.5deg);
243
+ vertical-align: middle;
244
+ position: relative;
245
+ top: -1px;
246
+ margin-right: 10px;
247
+ box-shadow: 1px 2px 0 rgba(0, 0, 0, 0.30);
248
+ }
249
+
250
+ /* ───────── STICKER TIER REF ───────── */
251
+ .dc-sticker-ref {
252
+ font-family: var(--font-mono);
253
+ font-size: 9px;
254
+ font-weight: 700;
255
+ color: inherit;
256
+ opacity: 0.55;
257
+ margin-right: 5px;
258
+ letter-spacing: 0.5px;
259
+ }
260
+
261
+ /* ── Flavor (italic flavor text) ──────────────────────────────────────────
262
+ Token contract:
263
+ --dc-flavor-color → text color (default --ink-smoke)
264
+ --dc-flavor-accent → left-rail color (default --orange)
265
+ --dc-flavor-accent-width → left-rail weight (default 3px)
266
+ */
267
+ .dc-flavor {
268
+ font-family: var(--font-body);
269
+ font-style: italic;
270
+ color: var(--dc-flavor-color);
271
+ font-size: var(--fs-body-sm);
272
+ padding-bottom: 4px;
273
+ margin-bottom: 6px;
274
+ position: relative;
275
+ border-left: var(--dc-flavor-accent-width) solid var(--dc-flavor-accent);
276
+ padding-left: 8px;
277
+ }
278
+
279
+ /* ── Sub-header ───────────────────────────────────────────────────────── */
280
+ .dc-sub-header {
281
+ font-family: var(--font-mono);
282
+ font-size: 10px;
283
+ text-transform: uppercase;
284
+ letter-spacing: 3px;
285
+ color: var(--hud-blue);
286
+ margin: 6px 0 3px;
287
+ padding-top: 4px;
288
+ border-top: 1px solid var(--hud-blue-dim);
289
+ }
290
+
291
+
292
+ /* ── Portrait panel ───────────────────────────────────────────────────── */
293
+ /* Token contract:
294
+ --dc-portrait-surface → frame fill (default --paper-cream)
295
+ --dc-portrait-border → frame border color (default --paper-aged)
296
+ */
297
+ .dc-portrait {
298
+ background: var(--dc-portrait-surface);
299
+ border: 1px solid var(--dc-portrait-border);
300
+ padding: 14px;
301
+ position: relative;
302
+ overflow: hidden;
303
+ height: fit-content;
304
+ }
305
+
306
+ .dc-portrait img {
307
+ width: 100%;
308
+ height: auto;
309
+ display: block;
310
+ }
311
+
312
+
313
+ /* ── Intro / Lede line ──────────────────────────────────────────────────
314
+ Single-direction margin: top: 0, bottom: standard gap. This gives the
315
+ lede flush attachment to a chevron heading above (D11 = 0) and natural
316
+ spacing to whatever comes below. When a lede follows body text (rare),
317
+ the paragraph's bottom margin provides the gap above the lede.
318
+
319
+ Token contract:
320
+ --dc-intro-accent → 4px left-strip color (default --orange)
321
+ --dc-intro-bg → substrate color right of the strip (default --paper-stain) */
322
+ .dc-intro {
323
+ font-family: var(--font-body);
324
+ font-size: var(--fs-body);
325
+ font-style: italic;
326
+ color: var(--ink-smoke);
327
+ background: linear-gradient(to right, var(--dc-intro-accent) 4px, var(--dc-intro-bg) 4px);
328
+ line-height: 1.5;
329
+ padding: 0 14px 10px 18px;
330
+ margin: 0 0 calc(0.1in + 3pt) 0;
331
+ box-shadow: var(--shadow-poster);
332
+ }
333
+
334
+ /* ── Spec tweak section header ────────────────────────────────────────── */
335
+ .dc-spec-tweak {
336
+ font-size: 22px;
337
+ /* User feedback (2026-05-24): "Spec Tweak text color is kind of off."
338
+ Was --blood (red) which reads as "warning/wound" — too strong a
339
+ semantic for a structural section label. Switched to --ink-dark
340
+ (neutral dark) for text + bottom-rule, with --brand-magenta as the
341
+ left-rail accent so the chapter's brand color anchors the element
342
+ without taking the text color hostage. */
343
+ color: var(--ink-dark);
344
+ border-bottom: 2px solid var(--ink-dark);
345
+ border-left: 4px solid var(--brand-magenta);
346
+ padding-bottom: 6px;
347
+ padding-left: 10px;
348
+ margin: 20px 0 14px;
349
+ }
350
+
351
+ /* ── Dashed rule divider (hr) ─────────────────────────────────────────── */
352
+ hr,
353
+ .dc-dashed-rule {
354
+ border: none;
355
+ border-top: 1.5px dashed var(--hud-magenta);
356
+ opacity: 0.5;
357
+ margin: var(--space-xl) 0;
358
+ }
359
+
360
+
361
+ /* ── Class tag pill + specialty color variants ────────────────────────── */
362
+ .dc-classtag {
363
+ display: inline-flex;
364
+ align-items: center;
365
+ gap: 8px;
366
+ font-family: var(--font-mono);
367
+ font-size: 10px;
368
+ letter-spacing: 3px;
369
+ text-transform: uppercase;
370
+ background: var(--paper-light);
371
+ color: var(--ink);
372
+ border: 2px solid var(--ink);
373
+ padding: 4px 10px 4px 6px;
374
+ font-weight: 600;
375
+ }
376
+
377
+ /* Token contract:
378
+ --dc-classtag-color → dot fill color (default --orange)
379
+ Set by each .dc-classtag.X variant to its specialty's accent.
380
+ The dot is now a ::before pseudo on .dc-classtag itself — no inner
381
+ .dc-classtag-dot element is required. Authors / plugin emit only the
382
+ outer .dc-classtag span. */
383
+ .dc-classtag::before {
384
+ content: '';
385
+ width: 10px;
386
+ height: 10px;
387
+ background: var(--dc-classtag-color);
388
+ display: inline-block;
389
+ flex-shrink: 0;
390
+ }
391
+
392
+ /* Classtag dots — each specialty's own --*-accent for consistent identity */
393
+ .dc-classtag.augmerc { --dc-classtag-color: var(--augmerc-accent); }
394
+ .dc-classtag.proxy { --dc-classtag-color: var(--proxy-accent); }
395
+ .dc-classtag.streetwarden { --dc-classtag-color: var(--streetwarden-accent); }
396
+ .dc-classtag.gutterdruid { --dc-classtag-color: var(--gutterdruid-accent); }
397
+ .dc-classtag.cybersurgeon { --dc-classtag-color: var(--cybersurgeon-accent); }
398
+ .dc-classtag.wirephreak { --dc-classtag-color: var(--wirephreak-accent); }
399
+ .dc-classtag.technosorcerer { --dc-classtag-color: var(--technosorcerer-accent); }
400
+ .dc-classtag.etherlock { --dc-classtag-color: var(--etherlock-accent); }
401
+ .dc-classtag.dualist { --dc-classtag-color: var(--dualist-accent); }
402
+ .dc-classtag.generalist { --dc-classtag-color: var(--generalist-accent); }
403
+
404
+
405
+ /* .dc-stamp / .dc-classified were removed 2026-05-24 (zero live usage; the
406
+ only authoring path was raw HTML, which the cascade principle forbids).
407
+ They were parked in an unloaded css/deprecated.css, which has since been
408
+ deleted — the dc-op-manual repo's history (`dc-design-guide/css/deprecated.css`) has the rules if
409
+ the design is ever revived. Revive as `@section .dc-stamp`, not raw HTML. */
410
+
411
+ /* ── Tape (torn-tape divider) ─────────────────────────────────────────── */
412
+ .dc-tape {
413
+ display: flex;
414
+ align-items: center;
415
+ gap: 12px;
416
+ margin: 28px 0 22px;
417
+ font-family: var(--font-mono);
418
+ font-size: 11px;
419
+ letter-spacing: 4px;
420
+ text-transform: uppercase;
421
+ color: var(--dc-tape-color);
422
+ background: var(--dc-tape-bg);
423
+ padding: 14px 14px;
424
+ border: 2px solid var(--dc-tape-border);
425
+ box-shadow: 1px 1px 0 rgba(0, 0, 0, 0.15);
426
+ break-inside: avoid;
427
+ }
428
+
429
+ .dc-tape::before,
430
+ .dc-tape::after {
431
+ content: '';
432
+ flex: 1;
433
+ height: 4px;
434
+ background: repeating-linear-gradient(90deg, var(--crimson) 0 6px, transparent 6px 10px);
435
+ opacity: 0.85;
436
+ }
437
+
438
+ /* Chapter-opener badge + H1 banner — see the chapter-opener composite
439
+ block further down (.page[data-page="intro"][data-chapter-label]).
440
+ The legacy .dc-chapter-opener-no rules previously here were removed
441
+ when the legacy @chapter-opener macro was retired. */
442
+
443
+ /* ── Specialty art full-page plate ─────────────────────────────────────────── */
444
+ .dc-specialty-art {
445
+ width: var(--page-width);
446
+ height: var(--page-height);
447
+ break-before: page;
448
+ margin: 0;
449
+ overflow: hidden;
450
+ background: var(--ink-dark); /* dark fallback so a missing image reads as intentional art plate */
451
+ }
452
+
453
+ .dc-specialty-art img {
454
+ display: block;
455
+ width: 100%;
456
+ height: 100%;
457
+ object-fit: cover;
458
+ }
459
+
460
+
461
+ /* ── Modifier variants — .dc-flush removes margin ─────────────────────────── */
462
+ .dc-stickers.dc-flush,
463
+ .dc-path-subtitle.dc-flush,
464
+ .dc-intro.dc-flush,
465
+ .dc-tape.dc-flush {
466
+ margin: 0;
467
+ }
468
+
469
+ .dc-sub-header.dc-flush {
470
+ margin: 0;
471
+ padding-top: 0;
472
+ border-top: 0;
473
+ }
474
+
475
+ .dc-spec-tweak.dc-no-top {
476
+ margin-top: 0;
477
+ }
478
+
479
+ .dc-tape.dc-margin-sm {
480
+ margin: 14px 0 8px;
481
+ }
482
+
483
+ }