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.
- package/CHANGELOG.md +86 -0
- package/LICENSE +32 -0
- package/README.md +165 -0
- package/components.yaml +832 -0
- package/fonts/lixdu/LICENSE.txt +34 -0
- package/fonts/lixdu/lixdu.woff +0 -0
- package/fonts/titillium-web/OFL.txt +93 -0
- package/fonts/titillium-web/titillium-web-400-italic.ttf +0 -0
- package/fonts/titillium-web/titillium-web-400.ttf +0 -0
- package/fonts/titillium-web/titillium-web-600-italic.ttf +0 -0
- package/fonts/titillium-web/titillium-web-600.ttf +0 -0
- package/fonts/titillium-web/titillium-web-700-italic.ttf +0 -0
- package/fonts/titillium-web/titillium-web-700.ttf +0 -0
- package/fonts/tomorrow/OFL.txt +93 -0
- package/fonts/tomorrow/tomorrow-400-italic.ttf +0 -0
- package/fonts/tomorrow/tomorrow-400.ttf +0 -0
- package/fonts/tomorrow/tomorrow-500-italic.ttf +0 -0
- package/fonts/tomorrow/tomorrow-500.ttf +0 -0
- package/fonts/tomorrow/tomorrow-700-italic.ttf +0 -0
- package/fonts/tomorrow/tomorrow-700.ttf +0 -0
- package/images/brick-bg-01.png +0 -0
- package/package.json +78 -0
- package/plugin.js +2131 -0
- package/snippets/alert.md +2 -0
- package/snippets/block.md +5 -0
- package/snippets/callout.md +5 -0
- package/snippets/card.md +11 -0
- package/snippets/chapter-start-page.md +11 -0
- package/snippets/credits-page.md +13 -0
- package/snippets/definition.md +7 -0
- package/snippets/dm-note.md +5 -0
- package/snippets/gear.md +9 -0
- package/snippets/learning-path.md +10 -0
- package/snippets/lede.md +5 -0
- package/snippets/outcome.md +8 -0
- package/snippets/procedure.md +7 -0
- package/snippets/sidebar.md +7 -0
- package/snippets/skill.md +9 -0
- package/snippets/specialty-art.md +5 -0
- package/snippets/specialty-card.md +5 -0
- package/snippets/specialty.md +11 -0
- package/snippets/toc-page.md +15 -0
- package/styles/components/callouts.css +227 -0
- package/styles/components/cards.css +487 -0
- package/styles/components/chrome.css +483 -0
- package/styles/components/data.css +1026 -0
- package/styles/components/images.css +215 -0
- package/styles/components/section.css +1074 -0
- package/styles/components/specialty-identity.css +315 -0
- package/styles/components/specialty.css +273 -0
- package/styles/dc-component-defaults.css +214 -0
- package/styles/dc-core.css +268 -0
- package/styles/dc-fonts.css +107 -0
- package/styles/dc-identity.css +66 -0
- package/styles/dc-native.css +330 -0
- package/styles/dc-palette.css +198 -0
- package/styles/page-rules.css +207 -0
- package/styles/page-templates.css +636 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
@layer dc.tokens {
|
|
2
|
+
|
|
3
|
+
:root { /* ── Section Component Public Tokens ────────────────────────────────────
|
|
4
|
+
Default theming for .section / @section macros. Chapter-scoped overrides
|
|
5
|
+
live in the book's own sheet (`@layer book`) and win via the parent-context cascade —
|
|
6
|
+
typically by applying a .dc-accent-X utility on @chapter / @section
|
|
7
|
+
(see components/*.css "ACCENT IDENTITY UTILITIES" section). */
|
|
8
|
+
--dc-section-bg: var(--paper-cream);
|
|
9
|
+
--dc-section-accent: var(--brand-magenta); /* brand signal at every section header (was --blood) */
|
|
10
|
+
|
|
11
|
+
/* ─── Component Public Token Defaults ────────────────────────────────────
|
|
12
|
+
Override surface for per-chapter and per-project theming. These are the
|
|
13
|
+
defaults that were previously declared inside each component class rule.
|
|
14
|
+
Moving them to :root makes them visible to the theming system and lets
|
|
15
|
+
the book's own sheet (`@layer book`) override them at chapter-id scope instead of having to
|
|
16
|
+
write a full component selector chain.
|
|
17
|
+
Set them here; override at chapter id scope in the book's own sheet (`@layer book`).
|
|
18
|
+
──────────────────────────────────────────────────────────────────────── */
|
|
19
|
+
|
|
20
|
+
/* .dc-alert public API */
|
|
21
|
+
--dc-alert-bg: var(--hud-blue-dim); /* surface-callout alias — player-facing note panel */
|
|
22
|
+
--dc-alert-border: var(--hud-blue-dark); /* border-callout-dm alias — left rail */
|
|
23
|
+
--dc-alert-fg: var(--ink);
|
|
24
|
+
--dc-alert-label-color: var(--ink-dark); /* ink-dark on hud-blue-dim = 7.05:1 AA pass */
|
|
25
|
+
--dc-alert-body-size: var(--fs-body-sm);
|
|
26
|
+
--dc-alert-border-width: 4px;
|
|
27
|
+
--dc-alert-label-size: 8pt;
|
|
28
|
+
--dc-alert-label-weight: 700;
|
|
29
|
+
--dc-alert-label-spacing: 0.12em;
|
|
30
|
+
--dc-alert-label-margin: 8pt;
|
|
31
|
+
--dc-alert-margin-top: 0;
|
|
32
|
+
|
|
33
|
+
/* .dc-skill-card public API */
|
|
34
|
+
--dc-card-accent: var(--ink); /* default no-specialty: plain ink */
|
|
35
|
+
--dc-card-surface: var(--paper-cream);
|
|
36
|
+
--dc-card-tab-bg: var(--ink-dark); /* overridden by .dc-specialty.<name> context */
|
|
37
|
+
--dc-card-tab-title-color: var(--paper-cream);
|
|
38
|
+
--dc-card-body-mark: var(--crimson);
|
|
39
|
+
|
|
40
|
+
/* .dc-specialty-intro public API */
|
|
41
|
+
--dc-specialty-intro-title-bg: var(--hud-magenta); /* overridden by .dc-specialty.<name> context */
|
|
42
|
+
--dc-specialty-intro-title-color: var(--bg);
|
|
43
|
+
--dc-specialty-intro-bg: var(--hud-panel);
|
|
44
|
+
|
|
45
|
+
/* .dc-path-shell public API */
|
|
46
|
+
--dc-path-title-bg: var(--hud-magenta); /* overridden by .dc-specialty.<name> .dc-path-shell context */
|
|
47
|
+
--dc-path-title-color: var(--paper-cream);
|
|
48
|
+
--dc-path-accent: var(--hud-magenta);
|
|
49
|
+
|
|
50
|
+
/* .dc-specialty-card public API */
|
|
51
|
+
--dc-specialty-card-bg: var(--paper-cream);
|
|
52
|
+
--dc-specialty-card-border: var(--hud-blue);
|
|
53
|
+
--dc-specialty-card-accent: var(--crimson);
|
|
54
|
+
--dc-specialty-card-fg: var(--ink);
|
|
55
|
+
--dc-specialty-card-media-height: 0.85in;
|
|
56
|
+
--dc-specialty-card-media-width: 0.75in;
|
|
57
|
+
--dc-specialty-card-title-align: right;
|
|
58
|
+
--dc-specialty-card-band-height: 16pt;
|
|
59
|
+
|
|
60
|
+
/* .dc-block public API */
|
|
61
|
+
--dc-block-bg: var(--paper-light);
|
|
62
|
+
--dc-block-fg: var(--ink);
|
|
63
|
+
--dc-block-accent: var(--hud-blue-dark);
|
|
64
|
+
--dc-block-title-bg: var(--hud-blue-dark);
|
|
65
|
+
--dc-block-title-fg: var(--paper-cream);
|
|
66
|
+
|
|
67
|
+
/* ─── Component Public Tokens Lifted From Inline Fallbacks ───────────────
|
|
68
|
+
Workstream B (2026-06-21): these tokens were consumed in components/*.css
|
|
69
|
+
ONLY via inline `var(--dc-X, fallback)` and were never declared on :root,
|
|
70
|
+
so they were invisible to the public override surface. Each default below
|
|
71
|
+
equals the component's existing inline fallback, so rendering is unchanged
|
|
72
|
+
— the inline fallbacks are now redundant (and harmless). Override any of
|
|
73
|
+
these at chapter-id / project scope the same way as the blocks above.
|
|
74
|
+
──────────────────────────────────────────────────────────────────────── */
|
|
75
|
+
|
|
76
|
+
/* .dc-ap (action-point tag) public API */
|
|
77
|
+
--dc-arrow-color: var(--blood);
|
|
78
|
+
--dc-ap-bg: var(--hud-blue-dark);
|
|
79
|
+
--dc-ap-fg: var(--paper-cream);
|
|
80
|
+
--dc-ap-border: var(--ink-dark);
|
|
81
|
+
|
|
82
|
+
/* .dc-sidebar (floated inset box) public API */
|
|
83
|
+
--dc-sidebar-surface: var(--paper-light);
|
|
84
|
+
--dc-sidebar-border: var(--hud-blue);
|
|
85
|
+
--dc-sidebar-accent: var(--orange);
|
|
86
|
+
|
|
87
|
+
/* .section.dc-fiction-excerpt public API */
|
|
88
|
+
--dc-fiction-bg: transparent;
|
|
89
|
+
--dc-fiction-art-width: 3in;
|
|
90
|
+
--dc-fiction-art-shadow: 4px 4px 0 var(--hud-blue-dark);
|
|
91
|
+
--dc-fiction-art-outline: 3px solid var(--ink-dark);
|
|
92
|
+
--dc-fiction-line-height: 1.45;
|
|
93
|
+
|
|
94
|
+
/* .dc-chevron (chevron banner) public API */
|
|
95
|
+
--dc-chevron-bg: var(--brand-magenta-deep);
|
|
96
|
+
--dc-chevron-color: var(--paper-cream);
|
|
97
|
+
--dc-chevron-font-size: var(--fs-h1);
|
|
98
|
+
|
|
99
|
+
/* .dc-classtag public API */
|
|
100
|
+
--dc-classtag-color: var(--orange);
|
|
101
|
+
|
|
102
|
+
/* .dc-card-tab (skill-card tab) extra public API */
|
|
103
|
+
--dc-card-tab-shadow: none;
|
|
104
|
+
|
|
105
|
+
/* cover meta public API */
|
|
106
|
+
--dc-cover-meta-border: rgba(201, 214, 226, 0.35);
|
|
107
|
+
|
|
108
|
+
/* .dc-definition-block public API */
|
|
109
|
+
--dc-definition-block-accent: var(--hud-blue-bright);
|
|
110
|
+
--dc-definition-block-accent-width: 4px;
|
|
111
|
+
--dc-definition-block-surface: var(--surface-orange-tint);
|
|
112
|
+
|
|
113
|
+
/* distribution table (.dc-dist-*) public API */
|
|
114
|
+
--dc-dist-ap-color: var(--ink);
|
|
115
|
+
--dc-dist-name-color: var(--hud-blue);
|
|
116
|
+
--dc-dist-tag-border: var(--hud-blue-dim);
|
|
117
|
+
--dc-dist-tag-surface: var(--paper-light);
|
|
118
|
+
|
|
119
|
+
/* .dc-fiction public API */
|
|
120
|
+
--dc-fiction-art-float: left;
|
|
121
|
+
|
|
122
|
+
/* .dc-flavor public API */
|
|
123
|
+
--dc-flavor-accent: var(--orange);
|
|
124
|
+
--dc-flavor-accent-width: 3px;
|
|
125
|
+
--dc-flavor-color: var(--ink-smoke);
|
|
126
|
+
|
|
127
|
+
/* gear entry public API */
|
|
128
|
+
|
|
129
|
+
/* .dc-intro public API */
|
|
130
|
+
--dc-intro-accent: var(--orange);
|
|
131
|
+
--dc-intro-bg: var(--paper-stain);
|
|
132
|
+
|
|
133
|
+
/* NPC stat block (.dc-npc-stat-*) public API */
|
|
134
|
+
--dc-npc-stat-label-color: var(--hud-blue-dark);
|
|
135
|
+
--dc-npc-stat-primary: var(--hud-blue-dark);
|
|
136
|
+
--dc-npc-stat-rule: var(--rust);
|
|
137
|
+
--dc-npc-stat-rule-width: 2pt;
|
|
138
|
+
--dc-npc-stat-secondary: var(--ink-smoke);
|
|
139
|
+
|
|
140
|
+
/* outcomes table (.dc-outcomes / .dc-outcome-*) public API */
|
|
141
|
+
--dc-outcome-key-color: var(--paper-cream);
|
|
142
|
+
--dc-outcome-name-color: var(--paper-cream);
|
|
143
|
+
--dc-outcome-name-opacity: 0.85;
|
|
144
|
+
--dc-outcomes-border: var(--ink);
|
|
145
|
+
--dc-outcomes-inner-border: var(--paper-aged);
|
|
146
|
+
--dc-outcomes-label-bg: var(--ink-dark);
|
|
147
|
+
--dc-outcomes-label-color: var(--paper-cream);
|
|
148
|
+
--dc-outcomes-surface: var(--paper-cream);
|
|
149
|
+
--dc-outcomes-divider: var(--hud-blue-dim);
|
|
150
|
+
|
|
151
|
+
/* .dc-path-shell extra public API (shape geometry) */
|
|
152
|
+
--dc-path-shell-clip: polygon(0 0, 100% 0, 100% calc(100% - 26px), calc(100% - 26px) 100%, 0 100%);
|
|
153
|
+
--dc-path-shell-padding-bottom: 0;
|
|
154
|
+
--dc-path-shell-padding-top: 0;
|
|
155
|
+
--dc-path-title-shape: polygon(0 0, 100% 0, 100% 100%, 25px 100%, 0 calc(100% - 15px));
|
|
156
|
+
|
|
157
|
+
/* portrait public API */
|
|
158
|
+
--dc-portrait-border: var(--paper-aged);
|
|
159
|
+
--dc-portrait-surface: var(--paper-cream);
|
|
160
|
+
|
|
161
|
+
/* .dc-pullquote public API */
|
|
162
|
+
--dc-pullquote-accent: var(--hud-magenta);
|
|
163
|
+
--dc-pullquote-accent-soft: rgba(230, 0, 122, 0.15);
|
|
164
|
+
--dc-pullquote-bg: var(--concrete-pale);
|
|
165
|
+
|
|
166
|
+
/* roll / die callout public API */
|
|
167
|
+
--dc-roll-lucid-color: var(--hud-blue-dark);
|
|
168
|
+
--dc-roll-surreal-color: var(--hud-magenta);
|
|
169
|
+
--dc-roll-the-die-border: var(--hud-magenta);
|
|
170
|
+
--dc-roll-the-die-color: var(--blood);
|
|
171
|
+
|
|
172
|
+
/* .dc-sidebar-box public API */
|
|
173
|
+
--dc-sidebar-box-accent: var(--hud-blue-dark);
|
|
174
|
+
--dc-sidebar-box-border: var(--border-hairline);
|
|
175
|
+
--dc-sidebar-box-rail: 4px;
|
|
176
|
+
--dc-sidebar-box-surface: var(--paper-cream);
|
|
177
|
+
|
|
178
|
+
/* .dc-sidebar-callout public API */
|
|
179
|
+
--dc-sidebar-callout-accent: var(--hud-blue);
|
|
180
|
+
--dc-sidebar-callout-bg: rgba(42, 106, 138, 0.08);
|
|
181
|
+
|
|
182
|
+
/* .dc-skill-card extra public API (shape geometry) */
|
|
183
|
+
--dc-skill-body-shape: polygon(0 0, 100% 0, 100% calc(100% - 28px), calc(100% - 44px) 100%, 0 100%);
|
|
184
|
+
--dc-skill-tab-shape: polygon(0 0, calc(100% - 18px) 0, 100% 100%, 0 100%);
|
|
185
|
+
|
|
186
|
+
/* .dc-specialty-card extra public API (shadow + shape + title) */
|
|
187
|
+
--dc-specialty-card-shadow: none;
|
|
188
|
+
--dc-specialty-card-shell-shape: polygon(0 0, calc(100% - 12px) 0, 100% 12px, 100% calc(100% - 18px), calc(100% - 24px) 100%, 0 100%);
|
|
189
|
+
--dc-specialty-card-title-color: var(--dc-specialty-card-accent);
|
|
190
|
+
|
|
191
|
+
/* .dc-specialty-intro extra public API (shape geometry) */
|
|
192
|
+
--dc-specialty-intro-clip: polygon(0 0, 100% 0, 100% calc(100% - 32px), calc(100% - 56px) 100%, 0 100%);
|
|
193
|
+
--dc-specialty-intro-title-shape: polygon(0 0, 100% 0, 100% 100%, 22px 100%, 0 calc(100% - 14px));
|
|
194
|
+
|
|
195
|
+
/* .dc-spray public API */
|
|
196
|
+
--dc-spray-bg: var(--hud-magenta);
|
|
197
|
+
--dc-spray-color: var(--paper-cream);
|
|
198
|
+
|
|
199
|
+
/* .dc-tape public API */
|
|
200
|
+
--dc-tape-bg: var(--paper-aged);
|
|
201
|
+
--dc-tape-border: rgba(212, 18, 0, 0.60);
|
|
202
|
+
--dc-tape-color: var(--ink-dust);
|
|
203
|
+
|
|
204
|
+
/* NOTE — the "Semantic Surface Roles" bridge layer that used to close this
|
|
205
|
+
file (--surface-callout / -dm / -vibe, --surface-well, --surface-panel,
|
|
206
|
+
--text-on-dark, --text-accent, --text-muted, --border-callout / -dm,
|
|
207
|
+
--border-accent, --elevation-card) was DELETED. It was proposed as a
|
|
208
|
+
layer components would consume, and then nothing ever did: twelve
|
|
209
|
+
aliases, zero `var()` call sites in any of the seven sheets. The
|
|
210
|
+
component public tokens above are the real override surface — a new
|
|
211
|
+
project retheming this library sets THOSE. */
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/* =============================================================================
|
|
2
|
+
DC-CORE.CSS — Global Element Baseline
|
|
3
|
+
=============================================================================
|
|
4
|
+
|
|
5
|
+
── ARCHITECTURAL CONTRACT ────────────────────────────────────────────────
|
|
6
|
+
OWNS:
|
|
7
|
+
- body baseline styles (font, tracking, line-height, hyphens,
|
|
8
|
+
widows/orphans, positioning)
|
|
9
|
+
- Global element resets driven by tokens: h1–h6, p, a, em, code/kbd/samp,
|
|
10
|
+
pre, blockquote, ul/li, table/th/td, dl/dt/dd
|
|
11
|
+
- print-color-adjust
|
|
12
|
+
|
|
13
|
+
MUST NOT CONTAIN:
|
|
14
|
+
- :root token definitions (→ dc-component-defaults.css)
|
|
15
|
+
- .dc-* or .pmd-* component styles (→ components/*.css)
|
|
16
|
+
- columns:N rules (→ page-templates.css)
|
|
17
|
+
- @page declarations or named-page assignments (→ page-rules.css)
|
|
18
|
+
- Component-scoped font-size or line-height overrides — each component
|
|
19
|
+
owns its own typography via its own selector
|
|
20
|
+
- div.chapter scaffolding or guide-specific rules (→ the consuming book's own sheet)
|
|
21
|
+
- @media screen rules (print-only project)
|
|
22
|
+
- Anything Gutterpress's MARKER_CSS already ships. Core injects
|
|
23
|
+
`body { margin: 0 }`, `:where(img, svg, video) { max-width: 100% }`,
|
|
24
|
+
`:where(p > img:only-child, figure > img) { width: fit-content;
|
|
25
|
+
max-width: 100%; height: auto; vertical-align: bottom }` and
|
|
26
|
+
`:where(h1,h2,h3,h4,h5,h6) { break-after: avoid }` before this sheet
|
|
27
|
+
loads. Restating any of those here is duplication — and restating them
|
|
28
|
+
at element specificity ALSO outranks core's zero-specificity
|
|
29
|
+
`:where()` form, so a later core fix would silently not reach this book.
|
|
30
|
+
|
|
31
|
+
AGENT RULE: "Is this a body baseline or a naked element reset
|
|
32
|
+
(no class, no ID, no page context)?" — if NO, use another file.
|
|
33
|
+
──────────────────────────────────────────────────────────────────────── */
|
|
34
|
+
|
|
35
|
+
@layer dc.base {
|
|
36
|
+
|
|
37
|
+
/* ── GLOBAL PRINT ACCURACY ────────────────────────────────────────────────── */
|
|
38
|
+
* {
|
|
39
|
+
print-color-adjust: exact;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
body {
|
|
44
|
+
font-family: var(--font-body);
|
|
45
|
+
font-size: var(--fs-body);
|
|
46
|
+
line-height: var(--lh-normal);
|
|
47
|
+
/* Body text tracking — subtle tightening reads as "industrial print"
|
|
48
|
+
vs the slack default. Not enough to harm readability; enough to
|
|
49
|
+
give the body register its own creaturepunk voice. */
|
|
50
|
+
letter-spacing: 0.005em;
|
|
51
|
+
text-wrap: pretty;
|
|
52
|
+
position: relative;
|
|
53
|
+
hyphens: auto;
|
|
54
|
+
/* Paged Media orphans/widows constraint: cascades to every .page box, so
|
|
55
|
+
no need to repeat at .page p level — that would be pure duplication. */
|
|
56
|
+
widows: 2;
|
|
57
|
+
orphans: 2;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* ── HEADINGS ─────────────────────────────────────────────────────────────── */
|
|
61
|
+
h1, h2, h3, h4, h5, h6 {
|
|
62
|
+
font-family: var(--font-display);
|
|
63
|
+
letter-spacing: var(--ls-display);
|
|
64
|
+
line-height: var(--lh-tight);
|
|
65
|
+
text-transform: uppercase;
|
|
66
|
+
text-wrap: balance;
|
|
67
|
+
margin-top: 0;
|
|
68
|
+
margin-bottom: 0.5em;
|
|
69
|
+
color: var(--ink-dark);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* H1 — magenta neon authority: chapter openers, page-level titles.
|
|
73
|
+
overflow-wrap: the lixdu display face at 26pt overflows a narrow column
|
|
74
|
+
on one-word caps titles (CREATUREPUNK) and on long unbreakable strings
|
|
75
|
+
such as URLs or class names. */
|
|
76
|
+
h1 {
|
|
77
|
+
font-size: var(--fs-h1);
|
|
78
|
+
font-weight: var(--fw-bold);
|
|
79
|
+
letter-spacing: 0.2em;
|
|
80
|
+
margin-bottom: 0.75em;
|
|
81
|
+
color: var(--hud-magenta);
|
|
82
|
+
border-bottom: 2px solid var(--hud-magenta);
|
|
83
|
+
padding-bottom: 0.15em;
|
|
84
|
+
overflow-wrap: break-word;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/* H2 — cold teal: major section breaks */
|
|
88
|
+
h2 {
|
|
89
|
+
font-size: var(--fs-h2);
|
|
90
|
+
color: var(--hud-blue-dark);
|
|
91
|
+
letter-spacing: var(--ls-heading);
|
|
92
|
+
border-bottom: 2.5pt solid var(--hud-blue-dark);
|
|
93
|
+
padding-bottom: 0.1em;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* H3 — deep teal: sub-sections (hud-blue-dark gives 6.4:1 on paper-cream vs hud-blue's 3.8:1) */
|
|
97
|
+
h3 { font-size: var(--fs-h3); margin-top: 0.08in; color: var(--hud-blue-dark); letter-spacing: var(--ls-heading); }
|
|
98
|
+
/* H4–H6 — grim dark ramp: body labels */
|
|
99
|
+
h4 { font-size: var(--fs-h4); margin-top: 0.05in; color: var(--ink-dark); letter-spacing: 0.06em; }
|
|
100
|
+
h5 { font-size: var(--fs-h5); color: var(--ink-smoke); }
|
|
101
|
+
h6 { font-size: var(--fs-h6); color: var(--ink-dust); }
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
/* ── INLINE ELEMENTS ──────────────────────────────────────────────────────── */
|
|
106
|
+
/* Baseline p color = --ink. Prose outside any styled container (a plain <p>
|
|
107
|
+
not inside @section / @callout / etc.) was inheriting nothing and reading
|
|
108
|
+
as cyan in some leaked contexts — measured 1.33:1 on the wall. Explicit
|
|
109
|
+
color: --ink at the base element makes loose paragraphs always legible.
|
|
110
|
+
Components with paper substrates may still override --ink-smoke or warmer
|
|
111
|
+
tones via their own selectors. */
|
|
112
|
+
p { margin-top: 0; margin-bottom: 0.08in; color: var(--ink); }
|
|
113
|
+
em { color: var(--ink-smoke); font-style: italic; }
|
|
114
|
+
/* Links: --crimson #e1261c on paper-cream = 4.03:1 (fails AA normal text).
|
|
115
|
+
--blood #901a12 on paper-cream = 7.73:1 (passes AA + AAA). Per expert
|
|
116
|
+
debate consensus: crimson is reserved for FILLS / decorative rails; text
|
|
117
|
+
color on light backgrounds uses --blood. */
|
|
118
|
+
a { color: var(--blood); text-decoration: none; border-bottom: 1px dotted var(--blood); }
|
|
119
|
+
|
|
120
|
+
code, kbd, samp {
|
|
121
|
+
font-family: var(--font-mono);
|
|
122
|
+
color: var(--ink);
|
|
123
|
+
font-size: 0.92em;
|
|
124
|
+
background: var(--paper-aged);
|
|
125
|
+
padding: 1pt 4pt;
|
|
126
|
+
border-radius: 2pt;
|
|
127
|
+
border: 1px solid var(--paper-aged);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* Code blocks: wrap instead of spilling. An unwrapped long line inside a
|
|
131
|
+
card (measured: one 937px-wide code line in the Gutterdruid skill card)
|
|
132
|
+
escapes every ancestor box, and that overflow is the single largest
|
|
133
|
+
trigger of Chromium's whole-document shrink-to-fit (~27% on this book).
|
|
134
|
+
pre-wrap keeps every character readable; overflow-x: clip is the backstop
|
|
135
|
+
so any residual unbreakable run can never widen the document again. */
|
|
136
|
+
pre {
|
|
137
|
+
white-space: pre-wrap;
|
|
138
|
+
overflow-wrap: break-word;
|
|
139
|
+
overflow-x: clip;
|
|
140
|
+
}
|
|
141
|
+
pre code {
|
|
142
|
+
white-space: inherit;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
blockquote {
|
|
146
|
+
font-family: var(--font-quote);
|
|
147
|
+
font-style: italic;
|
|
148
|
+
color: var(--ink);
|
|
149
|
+
border-left: 7px solid var(--hud-blue-dim);
|
|
150
|
+
border-right: 2px solid rgba(230, 0, 122, 0.18);
|
|
151
|
+
background: var(--paper-stain);
|
|
152
|
+
padding: var(--space-md) var(--space-md) var(--space-md) var(--space-xl);
|
|
153
|
+
margin: 0.75rem 0;
|
|
154
|
+
text-wrap: balance;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/* ── GLOBAL LIST STYLES (kept as-is per plan) ─────────────────────────────── */
|
|
158
|
+
ul { padding-left: 0.25in; }
|
|
159
|
+
ul li { list-style: none; margin-bottom: 0.06in; }
|
|
160
|
+
ul li::before {
|
|
161
|
+
content: "» ";
|
|
162
|
+
/* --orange (#d4500a) on wall = 2.46:1 (fail). --rust (#b23a12) = 3.48:1
|
|
163
|
+
(measured — also fail). --blood (#901a12) = 5.21:1 on wall, passes
|
|
164
|
+
AA small text. Bullet markers appear in every list including those
|
|
165
|
+
outside paper substrates, so they MUST read on the wall background. */
|
|
166
|
+
color: var(--blood);
|
|
167
|
+
font-weight: 700;
|
|
168
|
+
padding-right: 0.1em;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/* ── TABLES — universal default look, no class required ─────────────────────
|
|
172
|
+
Per the design-guide constitution (no per-element class attributes), every
|
|
173
|
+
<table> in markdown gets the full DC data-table appearance by default:
|
|
174
|
+
striped rows, HUD-blue header bar, mono caps headers, sane cell padding.
|
|
175
|
+
Authors write a plain markdown table and it looks right — no decoration. */
|
|
176
|
+
table {
|
|
177
|
+
width: 100%;
|
|
178
|
+
border-collapse: collapse;
|
|
179
|
+
font-size: 9pt;
|
|
180
|
+
margin: 0.1in 0;
|
|
181
|
+
break-inside: avoid;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/* Row tinting: alternating paper-cream and paper-light reads cleaner
|
|
185
|
+
than paper-cream + paper-stain. The previous pair (cream + stain)
|
|
186
|
+
produced too much chroma shift between rows and read as "muddy" per
|
|
187
|
+
user feedback. paper-light is closer to cream so the zebra is subtle
|
|
188
|
+
without being invisible. */
|
|
189
|
+
tr:nth-child(even) td { background: var(--paper-light); }
|
|
190
|
+
tr:nth-child(odd) td { background: var(--paper-cream); }
|
|
191
|
+
|
|
192
|
+
th {
|
|
193
|
+
/* Was --hud-blue-dark — clashed with adjacent section accents in some
|
|
194
|
+
chapters (the Size Modifier heading uses rust/orange tones and the teal
|
|
195
|
+
table header fought it). ink-dark reads as a structural "this is a
|
|
196
|
+
header bar" rule that takes on no chroma identity of its own.
|
|
197
|
+
Deliberately NOT `var(--dc-table-header-bg, var(--ink-dark))`: that
|
|
198
|
+
hook was never declared at :root and no chapter ever set it, so it was
|
|
199
|
+
an override surface invisible to the override surface. A chapter that
|
|
200
|
+
genuinely needs its own header colour should declare the token in
|
|
201
|
+
dc-component-defaults.css alongside the other component public tokens first. */
|
|
202
|
+
background: var(--ink-dark);
|
|
203
|
+
color: var(--paper-cream);
|
|
204
|
+
font-family: var(--font-mono);
|
|
205
|
+
font-size: 8pt;
|
|
206
|
+
letter-spacing: 0.1em;
|
|
207
|
+
text-transform: uppercase;
|
|
208
|
+
padding: 6px 8px;
|
|
209
|
+
text-align: left;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/* Authors often use a table purely as a boxed option list, which markdown
|
|
213
|
+
still requires a header row for — the cells come through genuinely empty.
|
|
214
|
+
Left alone those render as a solid ink bar with no text sitting above the
|
|
215
|
+
list (chapter-01 size/age/origin/dream lists). Collapse empty header cells
|
|
216
|
+
so the bar disappears; cells with real text are unaffected. */
|
|
217
|
+
th:empty {
|
|
218
|
+
background: none;
|
|
219
|
+
padding: 0;
|
|
220
|
+
border: 0;
|
|
221
|
+
line-height: 0;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
td {
|
|
225
|
+
border-bottom: 1pt solid var(--border-hairline);
|
|
226
|
+
padding: 5px 8px;
|
|
227
|
+
vertical-align: top;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/* ── DEFINITION LISTS — standard markdown `Term` / `: definition` ─────────────
|
|
231
|
+
Gutterpress (markdown-it-deflist) parses the standard PHP-Markdown-Extra /
|
|
232
|
+
Pandoc definition-list syntax and emits plain <dl><dt><dd>. Styled here to
|
|
233
|
+
match the definition register (orange-tint substrate + HUD-blue rail) so a
|
|
234
|
+
plain-markdown definition list is a drop-in for the @definition macro and the
|
|
235
|
+
raw-HTML .dc-terms glossary — no class or wrapper required by the author. */
|
|
236
|
+
dl {
|
|
237
|
+
background: var(--surface-orange-tint);
|
|
238
|
+
border-left: 4px solid var(--hud-blue-bright);
|
|
239
|
+
padding: var(--space-md);
|
|
240
|
+
margin: var(--space-md) 0;
|
|
241
|
+
}
|
|
242
|
+
dt {
|
|
243
|
+
font-weight: 700;
|
|
244
|
+
color: var(--hud-blue-dark);
|
|
245
|
+
margin-top: var(--space-sm);
|
|
246
|
+
}
|
|
247
|
+
dl dt:first-child { margin-top: 0; }
|
|
248
|
+
dd {
|
|
249
|
+
margin: 0.02in 0 0 var(--space-md);
|
|
250
|
+
color: var(--ink);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
/* ── Headings: never split a multi-line heading across a page ────────────────
|
|
255
|
+
Keeping a heading WITH the content that follows is core's job — MARKER_CSS
|
|
256
|
+
ships `:where(h1,h2,h3,h4,h5,h6) { break-after: avoid }`, and CSS
|
|
257
|
+
Fragmentation resolves a break opportunity as "avoid" if EITHER adjacent
|
|
258
|
+
box says so, which is why the long `h2 + p, h2 + ul, …` list of
|
|
259
|
+
`break-before: avoid` twins that used to live here was doing nothing the
|
|
260
|
+
heading's own break-after did not already do. What core does not cover is
|
|
261
|
+
a heading that wraps to two lines splitting across the page boundary. */
|
|
262
|
+
h2,
|
|
263
|
+
h3,
|
|
264
|
+
h4 {
|
|
265
|
+
break-inside: avoid;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/* =============================================================================
|
|
2
|
+
DC-FONTS.CSS — @font-face declarations and the cascade-layer order
|
|
3
|
+
=============================================================================
|
|
4
|
+
|
|
5
|
+
── ARCHITECTURAL CONTRACT ────────────────────────────────────────────────
|
|
6
|
+
OWNS:
|
|
7
|
+
- The @layer order statement for the whole Dimm City stack (below)
|
|
8
|
+
- @font-face declarations (the font files live under ../fonts/<family>/,
|
|
9
|
+
each family beside its licence)
|
|
10
|
+
|
|
11
|
+
MUST NOT CONTAIN:
|
|
12
|
+
- Any style rule at all — body baseline and element resets live in
|
|
13
|
+
dc-core.css, which loads immediately after this sheet
|
|
14
|
+
- @page declarations or named-page assignments (→ page-rules.css)
|
|
15
|
+
- .page.* layout or column rules (→ page-templates.css)
|
|
16
|
+
- .dc-* component/utility styles (→ components/*.css / page-templates.css)
|
|
17
|
+
- Design tokens (→ dc-palette.css, dc-identity.css, dc-component-defaults.css)
|
|
18
|
+
- Anything a single book needs (→ that book's own sheet, `@layer book`)
|
|
19
|
+
- @media screen rules (print-only project)
|
|
20
|
+
|
|
21
|
+
AGENT RULE: "Is this a token or a font?" — if NO, use another file.
|
|
22
|
+
|
|
23
|
+
──────────────────────────────────────────────────────────────────────── */
|
|
24
|
+
|
|
25
|
+
/* Layer order for the whole DC stack, declared here because this is the
|
|
26
|
+
first sheet the cascade sees — so layer order stops depending on the
|
|
27
|
+
manifest's file order. `dc-fonts.css` itself is deliberately NOT wrapped
|
|
28
|
+
in a layer: @font-face inside a layer is legal but pointless (font-family
|
|
29
|
+
lookup is not a cascade contest). `dc-native.css`, the last sheet in this
|
|
30
|
+
package, is ALSO deliberately unlayered — not because it is special, but
|
|
31
|
+
because it is LAST, and anything that must beat unlayered author CSS
|
|
32
|
+
cannot be layered (see docs/css-architecture.md).
|
|
33
|
+
|
|
34
|
+
`book` is the layer for a consuming book's own sheets: declared last here,
|
|
35
|
+
it outranks every dc.* layer, so a book wins any cross-layer tie without
|
|
36
|
+
fighting specificity. A book that must beat dc-native.css lists an
|
|
37
|
+
UNLAYERED sheet after it in its manifest instead. Do not invent further
|
|
38
|
+
layers in a book — a layer this statement does not name sorts after
|
|
39
|
+
`book`, silently above your own overrides. */
|
|
40
|
+
@layer dc.tokens, dc.base, dc.components, dc.templates, dc.pages, book;
|
|
41
|
+
|
|
42
|
+
/* ── WEBFONTS (local) ─────────────────────────────────────────────────────── */
|
|
43
|
+
@font-face {
|
|
44
|
+
font-family: 'Titillium Web';
|
|
45
|
+
src: url("../fonts/titillium-web/titillium-web-400.ttf") format('truetype');
|
|
46
|
+
font-weight: 400; font-style: normal; font-display: swap;
|
|
47
|
+
}
|
|
48
|
+
@font-face {
|
|
49
|
+
font-family: 'Titillium Web';
|
|
50
|
+
src: url("../fonts/titillium-web/titillium-web-400-italic.ttf") format('truetype');
|
|
51
|
+
font-weight: 400; font-style: italic; font-display: swap;
|
|
52
|
+
}
|
|
53
|
+
@font-face {
|
|
54
|
+
font-family: 'Titillium Web';
|
|
55
|
+
src: url("../fonts/titillium-web/titillium-web-600.ttf") format('truetype');
|
|
56
|
+
font-weight: 600; font-style: normal; font-display: swap;
|
|
57
|
+
}
|
|
58
|
+
@font-face {
|
|
59
|
+
font-family: 'Titillium Web';
|
|
60
|
+
src: url("../fonts/titillium-web/titillium-web-600-italic.ttf") format('truetype');
|
|
61
|
+
font-weight: 600; font-style: italic; font-display: swap;
|
|
62
|
+
}
|
|
63
|
+
@font-face {
|
|
64
|
+
font-family: 'Titillium Web';
|
|
65
|
+
src: url("../fonts/titillium-web/titillium-web-700.ttf") format('truetype');
|
|
66
|
+
font-weight: 700; font-style: normal; font-display: swap;
|
|
67
|
+
}
|
|
68
|
+
@font-face {
|
|
69
|
+
font-family: 'Titillium Web';
|
|
70
|
+
src: url("../fonts/titillium-web/titillium-web-700-italic.ttf") format('truetype');
|
|
71
|
+
font-weight: 700; font-style: italic; font-display: swap;
|
|
72
|
+
}
|
|
73
|
+
@font-face {
|
|
74
|
+
font-family: 'Tomorrow';
|
|
75
|
+
src: url("../fonts/tomorrow/tomorrow-400.ttf") format('truetype');
|
|
76
|
+
font-weight: 400; font-style: normal; font-display: swap;
|
|
77
|
+
}
|
|
78
|
+
@font-face {
|
|
79
|
+
font-family: 'Tomorrow';
|
|
80
|
+
src: url("../fonts/tomorrow/tomorrow-500.ttf") format('truetype');
|
|
81
|
+
font-weight: 500; font-style: normal; font-display: swap;
|
|
82
|
+
}
|
|
83
|
+
@font-face {
|
|
84
|
+
font-family: 'Tomorrow';
|
|
85
|
+
src: url("../fonts/tomorrow/tomorrow-700.ttf") format('truetype');
|
|
86
|
+
font-weight: 700; font-style: normal; font-display: swap;
|
|
87
|
+
}
|
|
88
|
+
@font-face {
|
|
89
|
+
font-family: 'Tomorrow';
|
|
90
|
+
src: url("../fonts/tomorrow/tomorrow-400-italic.ttf") format('truetype');
|
|
91
|
+
font-weight: 400; font-style: italic; font-display: swap;
|
|
92
|
+
}
|
|
93
|
+
@font-face {
|
|
94
|
+
font-family: 'Tomorrow';
|
|
95
|
+
src: url("../fonts/tomorrow/tomorrow-500-italic.ttf") format('truetype');
|
|
96
|
+
font-weight: 500; font-style: italic; font-display: swap;
|
|
97
|
+
}
|
|
98
|
+
@font-face {
|
|
99
|
+
font-family: 'Tomorrow';
|
|
100
|
+
src: url("../fonts/tomorrow/tomorrow-700-italic.ttf") format('truetype');
|
|
101
|
+
font-weight: 700; font-style: italic; font-display: swap;
|
|
102
|
+
}
|
|
103
|
+
@font-face {
|
|
104
|
+
font-family: 'lixdu';
|
|
105
|
+
src: url("../fonts/lixdu/lixdu.woff") format('woff');
|
|
106
|
+
font-weight: normal; font-style: normal; font-display: swap;
|
|
107
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
@layer dc.tokens {
|
|
2
|
+
|
|
3
|
+
:root { /* ─── Dimm City Specialty Identity Tokens ────────────────────────────────
|
|
4
|
+
Project-specific: these map Dimm City class identities to palette values.
|
|
5
|
+
A different project using this component library would replace this entire
|
|
6
|
+
block with its own identity tokens, keeping the pillar palette above and
|
|
7
|
+
the component defaults below untouched.
|
|
8
|
+
──────────────────────────────────────────────────────────────────────── */
|
|
9
|
+
|
|
10
|
+
/* ── Specialty Accent Colors ──────────────────────────────────────────── */
|
|
11
|
+
/* Scheme A: 4 brand-anchored (augmerc=magenta, wirephreak=cyan, technosorcerer=violet, etherlock=yellow),
|
|
12
|
+
1 fungi-pillar (gutterdruid=bioluminescent rot), 3 bespoke creaturepunk hues
|
|
13
|
+
(proxy=burnt orange, streetwarden=toxic-civic hazard green, cybersurgeon=chrome).
|
|
14
|
+
Streetwarden keeps #4db840 (high-vis civic hazard) — distinct from the quieter
|
|
15
|
+
fungi-mid lichen tone; gutterdruid is the alive-and-glowing spore. */
|
|
16
|
+
--augmerc-accent: var(--brand-magenta); /* cyber-augmentation = brand-signature magenta */
|
|
17
|
+
--proxy-accent: var(--orange); /* burnt-circuit orange */
|
|
18
|
+
--streetwarden-accent: #4db840; /* toxic civic green — hazard, not park bench — ~CMYK 58/0/65/28; TAC ~151% */
|
|
19
|
+
--gutterdruid-accent: var(--fungi-glow); /* bioluminescent spore — alley fungus at full flare */
|
|
20
|
+
--cybersurgeon-accent: #a8b4b8; /* cool blue-gray chrome (was flat silver) */
|
|
21
|
+
--wirephreak-accent: var(--brand-cyan); /* signal interference = brand neon-cyan */
|
|
22
|
+
--technosorcerer-accent: var(--brand-violet); /* ritual + tech = brand cyber-violet */
|
|
23
|
+
--etherlock-accent: var(--brand-yellow); /* spirit channeling = brand radiant gold */
|
|
24
|
+
--dualist-accent: var(--crystal-aqua); /* refractive mineral split — two-path walker */
|
|
25
|
+
--generalist-accent: var(--crystal-amethyst); /* deep mineral refraction — survivor's stone, opposite pole from dualist */
|
|
26
|
+
|
|
27
|
+
/* ── Specialty Dark Colors (path-shell + specialty-card backgrounds) ── */
|
|
28
|
+
--augmerc-dark: #8a1a90; /* deep magenta-violet (TAC ~157% — was #7a1080 at 175%) */
|
|
29
|
+
--augmerc-deep: var(--augmerc-dark); /* alias — chapter-opener accent */
|
|
30
|
+
--proxy-dark: #3d1a00; /* near-black scorch — ~CMYK 0/45/100/76; TAC ~221% — large fills only */
|
|
31
|
+
--cybersurgeon-dark: #303840; /* cold clinical near-black — ~CMYK 18/6/0/78; TAC ~102% — POD-safe */
|
|
32
|
+
--wirephreak-dark: #003a40; /* deep teal-black — drowned circuit — ~CMYK 100/11/0/75; TAC ~186% — large fills only */
|
|
33
|
+
--streetwarden-dark: #1a3d10; /* rot-soaked forest dark — ~CMYK 57/0/73/76; TAC ~206% — large fills only */
|
|
34
|
+
--technosorcerer-dark: #200a38; /* ink-bruise kin — deep ritual dark — ~CMYK 42/73/0/78; TAC ~193% — large fills only */
|
|
35
|
+
--gutterdruid-dark: #2a3408; /* swamp-rot dark — greenish, not brown — ~CMYK 19/0/85/80; TAC ~184% — large fills only */
|
|
36
|
+
--etherlock-dark: #3d3000; /* deep tarnished gold — ~CMYK 0/21/100/76; TAC ~197% — large fills only */
|
|
37
|
+
--dualist-dark: #143a4a; /* sapphire-trench — deep crystal-aqua dark — ~CMYK 73/21/0/71; TAC ~165% */
|
|
38
|
+
--generalist-dark: #1e0e2e; /* deep amethyst-black — opposite crystal pole from dualist — ~CMYK 36/69/0/82; TAC ~187% — large fills only */
|
|
39
|
+
|
|
40
|
+
/* ── Specialty Mid Colors (card-tab bg + card border — uniform contract)
|
|
41
|
+
Each mid sits perceptually midway between its specialty's accent and
|
|
42
|
+
dark, slightly shifted toward the dark hue. Used wherever a specialty
|
|
43
|
+
needs a chrome/structural tone that isn't accent-glare or dark-mass. */
|
|
44
|
+
--augmerc-mid: #9a1896; /* between brand-magenta and augmerc-dark */
|
|
45
|
+
--proxy-mid: #7a3008; /* burnt umber, between scorch-orange and dark */
|
|
46
|
+
--cybersurgeon-mid: #606870; /* cool steel mid (pre-existing token) */
|
|
47
|
+
--streetwarden-mid: #347828; /* civic green mid, not chartreuse */
|
|
48
|
+
--gutterdruid-mid: #4d6020; /* olive-swamp lichen */
|
|
49
|
+
--wirephreak-mid: #006878; /* drowned signal teal */
|
|
50
|
+
--technosorcerer-mid: #4a1878; /* ritual indigo midpoint */
|
|
51
|
+
--etherlock-mid: #8a6a00; /* tarnished antique gold */
|
|
52
|
+
--dualist-mid: #2a6878; /* drowned mineral aqua — between crystal-aqua and sapphire-trench */
|
|
53
|
+
--generalist-mid: #503070; /* mid amethyst — between crystal-amethyst and generalist-dark */
|
|
54
|
+
|
|
55
|
+
/* ── Skill Tier Badge Colors — creaturepunk-decoded ─────────────────────
|
|
56
|
+
Tier identity reframed: not trophy-show metals but salvaged/scarred ones.
|
|
57
|
+
Bronze = rust-on-steel, Gold = pirated brass, Silver = cyan-tinged chrome. */
|
|
58
|
+
--tier-bronze: #8a5c28; /* tier 1 — rust-on-steel salvage */
|
|
59
|
+
--tier-gold: #b8921a; /* tier 2 — pirated brass, tarnished */
|
|
60
|
+
--tier-silver: #a8b4b8; /* tier 3 — cyan-tinged chrome (was flat printer-gray) */
|
|
61
|
+
|
|
62
|
+
/* ─── End Dimm City Specialty Tokens ─────────────────────────────────────── */
|
|
63
|
+
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
}
|