@heroiclands/package-build 22.23.0 → 22.24.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 +14 -0
- package/README.md +1 -0
- package/docs/authoring/assets.md +15 -0
- package/docs/commands.md +18 -19
- package/docs/configuration.md +2 -6
- package/docs/guides/module-project.md +2 -2
- package/docs/guides/site.md +41 -0
- package/docs/project-setup.md +4 -4
- package/docs/reference/theme-pages.md +496 -0
- package/engine/art-slots.mjs +2 -1
- package/engine/foreign-catalog.mjs +2 -1
- package/engine/helpers.mjs +5 -3
- package/engine/site-config.mjs +19 -24
- package/hugo-theme/data/banners.yaml +69 -0
- package/hugo-theme/layouts/404.html +85 -0
- package/hugo-theme/layouts/_default/baseof.html +64 -0
- package/hugo-theme/layouts/_default/list.html +139 -0
- package/hugo-theme/layouts/_default/single.html +4 -0
- package/hugo-theme/layouts/blog/list.html +54 -0
- package/hugo-theme/layouts/blog-post/single.html +36 -0
- package/hugo-theme/layouts/index.html +75 -0
- package/hugo-theme/layouts/partials/banner-url.html +117 -0
- package/hugo-theme/layouts/partials/cdn-url.html +36 -0
- package/hugo-theme/layouts/partials/draft-notice.html +41 -0
- package/hugo-theme/layouts/partials/draft-state.html +26 -0
- package/hugo-theme/layouts/partials/footer.html +29 -0
- package/hugo-theme/layouts/partials/header.html +35 -0
- package/hugo-theme/layouts/partials/hero-banner.html +86 -0
- package/hugo-theme/layouts/partials/holdings/entry.html +21 -0
- package/hugo-theme/layouts/partials/holdings/kind-groups.html +71 -0
- package/hugo-theme/layouts/partials/holdings.html +61 -0
- package/hugo-theme/layouts/partials/infobox/entry.html +15 -0
- package/hugo-theme/layouts/partials/infobox/items.html +26 -0
- package/hugo-theme/layouts/partials/infobox/section.html +56 -0
- package/hugo-theme/layouts/partials/infobox/value.html +43 -0
- package/hugo-theme/layouts/partials/infobox.html +57 -0
- package/hugo-theme/layouts/partials/page-body.html +154 -0
- package/hugo-theme/layouts/partials/place-map.html +9 -0
- package/hugo-theme/layouts/partials/related.html +121 -0
- package/hugo-theme/layouts/partials/search.html +84 -0
- package/hugo-theme/layouts/partials/site-url.html +32 -0
- package/hugo-theme/layouts/partials/tags.html +30 -0
- package/hugo-theme/layouts/partials/toc.html +28 -0
- package/hugo-theme/layouts/partials/warn-missing-banner.html +3 -0
- package/hugo-theme/layouts/shortcodes/cartouche.html +64 -0
- package/hugo-theme/layouts/shortcodes/exturl.html +12 -0
- package/hugo-theme/layouts/shortcodes/glyph.html +43 -0
- package/hugo-theme/layouts/shortcodes/pagelist.html +63 -0
- package/hugo-theme/static/css/sohl-icons.css +57 -0
- package/hugo-theme/static/css/style.css +2953 -0
- package/hugo-theme/static/fonts/game-icons-kb.woff2 +0 -0
- package/hugo-theme/static/img/banners/takheperu-hieroglyphs.svg +1 -0
- package/hugo-theme/static/img/cartouches/takheperu.svg +1 -0
- package/hugo-theme/theme.toml +11 -0
- package/package.json +2 -1
- package/types/engine/art-slots.d.mts +2 -1
- package/types/engine/helpers.d.mts +5 -3
- package/types/engine/site-config.d.mts +9 -9
|
@@ -0,0 +1,2953 @@
|
|
|
1
|
+
/* ============================================
|
|
2
|
+
Heroic Lands — Style
|
|
3
|
+
Dark fantasy / manuscript aesthetic
|
|
4
|
+
============================================ */
|
|
5
|
+
|
|
6
|
+
:root {
|
|
7
|
+
--bg: #0f1923;
|
|
8
|
+
--bg-deeper: #0a1219;
|
|
9
|
+
--bg-card: #15202d;
|
|
10
|
+
--bg-card-hover: #1a2836;
|
|
11
|
+
--surface: #1c2b3a;
|
|
12
|
+
--border: #2a3d52;
|
|
13
|
+
--border-light: #354d66;
|
|
14
|
+
|
|
15
|
+
--text: #c8d6e0;
|
|
16
|
+
--text-muted: #7e96aa;
|
|
17
|
+
--text-dim: #4a6478;
|
|
18
|
+
|
|
19
|
+
--accent: #3b8eea;
|
|
20
|
+
--accent-hover: #5aa3f0;
|
|
21
|
+
--accent-dim: #2a6bb8;
|
|
22
|
+
--gold: #c9a84c;
|
|
23
|
+
--gold-dim: #a08338;
|
|
24
|
+
|
|
25
|
+
/* A link whose target no package publishes. Contrast-checked against the
|
|
26
|
+
three surfaces it can sit on: 7.8:1 on --bg, 7.2:1 on --bg-card, 6.3:1 on
|
|
27
|
+
--surface. A consuming site may override it, but must re-check: the light
|
|
28
|
+
red the Foundry system uses reaches only ~2.5:1 here. */
|
|
29
|
+
--unresolved-link: #ff8a80;
|
|
30
|
+
|
|
31
|
+
/* A link whose target exists but is not written yet. Contrast-checked
|
|
32
|
+
against the same three surfaces: 10.0:1 on --bg, 9.3:1 on --bg-card,
|
|
33
|
+
8.1:1 on --surface. Deliberately a different hue and a different
|
|
34
|
+
underline from --unresolved-link: the two say different things, and a
|
|
35
|
+
reader has to be able to tell them apart. */
|
|
36
|
+
--draft-link: #f2b950;
|
|
37
|
+
|
|
38
|
+
/* A note's `info`, `warn` and `secret` named blocks. Each exposes its own
|
|
39
|
+
property so a consuming site can retint one kind without restating the
|
|
40
|
+
block's layout. Contrast-checked against the three surfaces a block's
|
|
41
|
+
heading can sit on: info 7.95:1 on --bg, 7.37:1 on --bg-card, 6.46:1 on
|
|
42
|
+
--surface; warn 7.81:1 / 7.24:1 / 6.35:1; secret 8.48:1 / 7.86:1 / 6.89:1.
|
|
43
|
+
Three distinct hues — blue, amber, violet — so the kinds read apart by
|
|
44
|
+
hue alone as well as by position. */
|
|
45
|
+
--block-info: #6fb3f2;
|
|
46
|
+
--block-warn: #e0a030;
|
|
47
|
+
--block-secret: #c3a6f0;
|
|
48
|
+
|
|
49
|
+
/* A footnote's marker and its back-reference. The brighter accent rather
|
|
50
|
+
than --accent, because a marker is small type: --accent reaches only
|
|
51
|
+
4.29:1 on --surface, while this holds 6.70:1 on --bg, 6.21:1 on --bg-card
|
|
52
|
+
and 5.45:1 on --surface. All three are surfaces a marker can sit on, since
|
|
53
|
+
a footnote may be called from inside a blockquote or a named block. */
|
|
54
|
+
--footnote-marker: var(--accent-hover);
|
|
55
|
+
|
|
56
|
+
--font-display: 'Cinzel', 'Georgia', serif;
|
|
57
|
+
--font-body: 'Lora', 'Georgia', serif;
|
|
58
|
+
--font-mono: 'JetBrains Mono', monospace;
|
|
59
|
+
|
|
60
|
+
--content-width: 100%;
|
|
61
|
+
--content-narrow: 100%;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* ---- Reset ---- */
|
|
65
|
+
|
|
66
|
+
*, *::before, *::after {
|
|
67
|
+
box-sizing: border-box;
|
|
68
|
+
margin: 0;
|
|
69
|
+
padding: 0;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
html {
|
|
73
|
+
font-size: 17px;
|
|
74
|
+
scroll-behavior: smooth;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
body {
|
|
78
|
+
font-family: var(--font-body);
|
|
79
|
+
font-weight: 400;
|
|
80
|
+
line-height: 1.7;
|
|
81
|
+
color: var(--text);
|
|
82
|
+
background: var(--bg);
|
|
83
|
+
min-height: 100vh;
|
|
84
|
+
display: flex;
|
|
85
|
+
flex-direction: column;
|
|
86
|
+
-webkit-font-smoothing: antialiased;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
a {
|
|
90
|
+
color: var(--accent);
|
|
91
|
+
text-decoration: none;
|
|
92
|
+
transition: color 0.2s ease, border-color 0.2s ease;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
a:hover {
|
|
96
|
+
color: var(--accent-hover);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* Inline body links get a subtle underline on hover so they feel
|
|
100
|
+
tactile without competing with headings or navigation. Links
|
|
101
|
+
inside utility contexts (cards, nav, TOC) opt out via more
|
|
102
|
+
specific rules elsewhere. */
|
|
103
|
+
.single-body a {
|
|
104
|
+
border-bottom: 1px solid transparent;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.single-body a:hover {
|
|
108
|
+
border-bottom-color: var(--accent-dim);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
img {
|
|
112
|
+
max-width: 100%;
|
|
113
|
+
height: auto;
|
|
114
|
+
display: block;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* ---- Header ---- */
|
|
118
|
+
|
|
119
|
+
.site-header {
|
|
120
|
+
border-bottom: 1px solid var(--border);
|
|
121
|
+
background: var(--bg-deeper);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.header-inner {
|
|
125
|
+
max-width: var(--content-width);
|
|
126
|
+
margin: 0 auto;
|
|
127
|
+
padding: 1.25rem 2rem;
|
|
128
|
+
display: flex;
|
|
129
|
+
align-items: center;
|
|
130
|
+
justify-content: space-between;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.site-title {
|
|
134
|
+
display: flex;
|
|
135
|
+
align-items: center;
|
|
136
|
+
text-decoration: none;
|
|
137
|
+
gap: 0.75rem;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.site-logo {
|
|
141
|
+
width: 48px;
|
|
142
|
+
height: 48px;
|
|
143
|
+
border-radius: 50%;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.title-main {
|
|
147
|
+
font-family: var(--font-display);
|
|
148
|
+
font-size: 1.6rem;
|
|
149
|
+
font-weight: 700;
|
|
150
|
+
color: var(--text);
|
|
151
|
+
letter-spacing: 0.02em;
|
|
152
|
+
line-height: 1.2;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.title-sub {
|
|
156
|
+
font-family: var(--font-body);
|
|
157
|
+
font-size: 0.85rem;
|
|
158
|
+
font-weight: 400;
|
|
159
|
+
font-style: italic;
|
|
160
|
+
color: var(--text-muted);
|
|
161
|
+
letter-spacing: 0.03em;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.header-actions {
|
|
165
|
+
display: flex;
|
|
166
|
+
align-items: center;
|
|
167
|
+
gap: 1.5rem;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.site-nav {
|
|
171
|
+
display: flex;
|
|
172
|
+
gap: 2rem;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.nav-link {
|
|
176
|
+
font-family: var(--font-display);
|
|
177
|
+
font-size: 1.05rem;
|
|
178
|
+
font-weight: 600;
|
|
179
|
+
color: var(--text-muted);
|
|
180
|
+
letter-spacing: 0.02em;
|
|
181
|
+
padding: 0.25rem 0;
|
|
182
|
+
border-bottom: 2px solid transparent;
|
|
183
|
+
transition: color 0.2s, border-color 0.2s;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.nav-link:hover,
|
|
187
|
+
.nav-link.active {
|
|
188
|
+
color: var(--text);
|
|
189
|
+
border-bottom-color: var(--accent);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* Dropdown navigation */
|
|
193
|
+
.nav-dropdown {
|
|
194
|
+
position: relative;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.dropdown-arrow {
|
|
198
|
+
margin-left: 0.3rem;
|
|
199
|
+
transition: transform 0.2s;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.nav-dropdown:hover .dropdown-arrow {
|
|
203
|
+
transform: rotate(180deg);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.dropdown-menu {
|
|
207
|
+
display: none;
|
|
208
|
+
position: absolute;
|
|
209
|
+
top: 100%;
|
|
210
|
+
left: 0;
|
|
211
|
+
min-width: 220px;
|
|
212
|
+
background: var(--bg-deeper);
|
|
213
|
+
border: 1px solid var(--border);
|
|
214
|
+
border-radius: 4px;
|
|
215
|
+
padding: 0.5rem 0;
|
|
216
|
+
margin-top: 0.5rem;
|
|
217
|
+
z-index: 100;
|
|
218
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.nav-dropdown:hover .dropdown-menu {
|
|
222
|
+
display: block;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/* Bridge the margin-top gap between the trigger and the menu so the pointer
|
|
226
|
+
stays within .nav-dropdown while travelling to it (otherwise :hover drops in
|
|
227
|
+
the gap and the menu closes before an item can be clicked). */
|
|
228
|
+
.dropdown-menu::before {
|
|
229
|
+
content: "";
|
|
230
|
+
position: absolute;
|
|
231
|
+
bottom: 100%;
|
|
232
|
+
left: 0;
|
|
233
|
+
right: 0;
|
|
234
|
+
height: 0.5rem;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.dropdown-item {
|
|
238
|
+
display: block;
|
|
239
|
+
padding: 0.5rem 1.25rem;
|
|
240
|
+
font-family: var(--font-display);
|
|
241
|
+
font-size: 0.95rem;
|
|
242
|
+
color: var(--text-muted);
|
|
243
|
+
transition: color 0.2s, background 0.2s;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.dropdown-item:hover {
|
|
247
|
+
color: var(--text);
|
|
248
|
+
background: var(--surface);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/* Mobile nav toggle */
|
|
252
|
+
.nav-toggle {
|
|
253
|
+
display: none;
|
|
254
|
+
background: none;
|
|
255
|
+
border: none;
|
|
256
|
+
cursor: pointer;
|
|
257
|
+
padding: 0.5rem;
|
|
258
|
+
flex-direction: column;
|
|
259
|
+
gap: 5px;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.nav-toggle span {
|
|
263
|
+
display: block;
|
|
264
|
+
width: 24px;
|
|
265
|
+
height: 2px;
|
|
266
|
+
background: var(--text-muted);
|
|
267
|
+
transition: transform 0.3s, opacity 0.3s;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
.nav-toggle.open span:nth-child(1) {
|
|
271
|
+
transform: translateY(7px) rotate(45deg);
|
|
272
|
+
}
|
|
273
|
+
.nav-toggle.open span:nth-child(2) {
|
|
274
|
+
opacity: 0;
|
|
275
|
+
}
|
|
276
|
+
.nav-toggle.open span:nth-child(3) {
|
|
277
|
+
transform: translateY(-7px) rotate(-45deg);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/* ---- Search ---- */
|
|
281
|
+
|
|
282
|
+
.site-search {
|
|
283
|
+
position: relative;
|
|
284
|
+
display: flex;
|
|
285
|
+
align-items: center;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.search-toggle {
|
|
289
|
+
background: none;
|
|
290
|
+
border: none;
|
|
291
|
+
cursor: pointer;
|
|
292
|
+
padding: 0.5rem;
|
|
293
|
+
font-size: 1.1rem;
|
|
294
|
+
line-height: 1;
|
|
295
|
+
color: var(--text-muted);
|
|
296
|
+
transition: color 0.2s;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
.search-toggle:hover,
|
|
300
|
+
.search-toggle[aria-expanded="true"] {
|
|
301
|
+
color: var(--text);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
.search-panel {
|
|
305
|
+
position: absolute;
|
|
306
|
+
top: 100%;
|
|
307
|
+
right: 0;
|
|
308
|
+
margin-top: 0.75rem;
|
|
309
|
+
width: min(28rem, 90vw);
|
|
310
|
+
max-height: 70vh;
|
|
311
|
+
overflow-y: auto;
|
|
312
|
+
background: var(--bg-deeper);
|
|
313
|
+
border: 1px solid var(--border);
|
|
314
|
+
border-radius: 4px;
|
|
315
|
+
padding: 1rem;
|
|
316
|
+
z-index: 200;
|
|
317
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/* Pagefind's own UI renders inside .search-panel-inner. These custom
|
|
321
|
+
properties are Pagefind's own theming hooks (pagefind_ui/default), carried
|
|
322
|
+
onto this theme's palette so results read like the rest of the chrome
|
|
323
|
+
rather than Pagefind's light default. */
|
|
324
|
+
.search-panel-inner {
|
|
325
|
+
--pagefind-ui-primary: var(--accent);
|
|
326
|
+
--pagefind-ui-text: var(--text);
|
|
327
|
+
--pagefind-ui-background: var(--bg-card);
|
|
328
|
+
--pagefind-ui-border: var(--border);
|
|
329
|
+
--pagefind-ui-tag: var(--surface);
|
|
330
|
+
--pagefind-ui-border-radius: 4px;
|
|
331
|
+
--pagefind-ui-image-border-radius: 4px;
|
|
332
|
+
--pagefind-ui-font: var(--font-body);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
.search-panel-inner mark {
|
|
336
|
+
color: var(--gold);
|
|
337
|
+
background: none;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/* ---- Hero ---- */
|
|
341
|
+
|
|
342
|
+
.hero {
|
|
343
|
+
background:
|
|
344
|
+
linear-gradient(to bottom, rgba(15, 25, 35, 0.4), var(--bg)),
|
|
345
|
+
var(--bg-deeper);
|
|
346
|
+
border-bottom: 1px solid var(--border);
|
|
347
|
+
padding: 5rem 2rem 4rem;
|
|
348
|
+
text-align: center;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
.hero-inner {
|
|
352
|
+
max-width: var(--content-narrow);
|
|
353
|
+
margin: 0 auto;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
.hero h1 {
|
|
357
|
+
font-family: var(--font-display);
|
|
358
|
+
font-size: 3.2rem;
|
|
359
|
+
font-weight: 700;
|
|
360
|
+
color: var(--text);
|
|
361
|
+
letter-spacing: 0.02em;
|
|
362
|
+
margin-bottom: 1rem;
|
|
363
|
+
line-height: 1.15;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
.hero-tagline {
|
|
367
|
+
font-family: var(--font-body);
|
|
368
|
+
font-size: 1.2rem;
|
|
369
|
+
font-style: italic;
|
|
370
|
+
color: var(--text-muted);
|
|
371
|
+
line-height: 1.6;
|
|
372
|
+
max-width: 36rem;
|
|
373
|
+
margin: 0 auto;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/* If you add a hero background image, use this class on .hero */
|
|
377
|
+
.hero-with-image {
|
|
378
|
+
background-size: cover;
|
|
379
|
+
background-position: center;
|
|
380
|
+
position: relative;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
.hero-with-image::before {
|
|
384
|
+
content: '';
|
|
385
|
+
position: absolute;
|
|
386
|
+
inset: 0;
|
|
387
|
+
background: linear-gradient(
|
|
388
|
+
to bottom,
|
|
389
|
+
rgba(15, 25, 35, 0.6),
|
|
390
|
+
var(--bg)
|
|
391
|
+
);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
.hero-with-image .hero-inner {
|
|
395
|
+
position: relative;
|
|
396
|
+
z-index: 1;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/* ---- Home Cards ---- */
|
|
400
|
+
|
|
401
|
+
.home-sections {
|
|
402
|
+
max-width: var(--content-width);
|
|
403
|
+
margin: 0 auto;
|
|
404
|
+
padding: 3rem 2rem 4rem;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
.home-grid {
|
|
408
|
+
display: grid;
|
|
409
|
+
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
|
410
|
+
gap: 2rem;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/* Featured home layout: SoHL heading spans its two cards, with the
|
|
414
|
+
Thalorna card sitting to the right (spanning both rows). */
|
|
415
|
+
.home-featured {
|
|
416
|
+
display: grid;
|
|
417
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
418
|
+
grid-template-rows: auto auto;
|
|
419
|
+
column-gap: 2rem;
|
|
420
|
+
row-gap: 0;
|
|
421
|
+
align-items: start;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
.home-section-title {
|
|
425
|
+
grid-column: 1 / 3;
|
|
426
|
+
grid-row: 1;
|
|
427
|
+
font-family: var(--font-display);
|
|
428
|
+
font-size: 2.6rem;
|
|
429
|
+
font-weight: 700;
|
|
430
|
+
color: var(--text);
|
|
431
|
+
text-align: center;
|
|
432
|
+
margin: 0 0 0.5rem;
|
|
433
|
+
padding-bottom: 0.5rem;
|
|
434
|
+
border-bottom: 1px solid var(--border);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/* Settings header sits in the top row above the Thalorna card. */
|
|
438
|
+
.home-section-title--settings {
|
|
439
|
+
grid-column: 3;
|
|
440
|
+
grid-row: 1;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
.home-card--kb { grid-column: 1; grid-row: 2; }
|
|
444
|
+
.home-card--api { grid-column: 2; grid-row: 2; }
|
|
445
|
+
|
|
446
|
+
.home-card--thalorna { grid-column: 3; grid-row: 2; }
|
|
447
|
+
|
|
448
|
+
/* Below ~900px the three fixed columns cramp the card images; stack them. */
|
|
449
|
+
@media (max-width: 900px) {
|
|
450
|
+
.home-featured {
|
|
451
|
+
grid-template-columns: 1fr;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
.home-featured .home-section-title,
|
|
455
|
+
.home-card--kb,
|
|
456
|
+
.home-card--api,
|
|
457
|
+
.home-card--thalorna {
|
|
458
|
+
grid-column: auto;
|
|
459
|
+
grid-row: auto;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
.home-card {
|
|
464
|
+
background: transparent;
|
|
465
|
+
border: none;
|
|
466
|
+
border-radius: 6px;
|
|
467
|
+
padding: 2rem;
|
|
468
|
+
display: flex;
|
|
469
|
+
flex-direction: column;
|
|
470
|
+
align-items: center;
|
|
471
|
+
text-align: center;
|
|
472
|
+
transition: border-color 0.2s, background 0.2s;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
.home-card:hover {
|
|
476
|
+
/* Subtle hover — no background since cards are transparent */
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
.home-card h2 {
|
|
480
|
+
font-family: var(--font-display);
|
|
481
|
+
font-size: 1.5rem;
|
|
482
|
+
font-weight: 700;
|
|
483
|
+
margin-bottom: 0.75rem;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
.home-card h2 a {
|
|
487
|
+
color: var(--text);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
.home-card h2 a:hover {
|
|
491
|
+
color: var(--accent);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
.home-card > p {
|
|
495
|
+
color: var(--text-muted);
|
|
496
|
+
font-size: 0.92rem;
|
|
497
|
+
margin-bottom: 1.25rem;
|
|
498
|
+
line-height: 1.65;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
.home-card .card-image {
|
|
502
|
+
width: 240px;
|
|
503
|
+
height: 240px;
|
|
504
|
+
/* cover (not contain) so wide banner images crop to a square instead of
|
|
505
|
+
letterboxing; the square Thalorna image renders identically either way. */
|
|
506
|
+
object-fit: cover;
|
|
507
|
+
border-radius: 4px;
|
|
508
|
+
margin-bottom: 1.5rem;
|
|
509
|
+
border: none;
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
.card-link {
|
|
513
|
+
display: block;
|
|
514
|
+
font-size: 0.9rem;
|
|
515
|
+
padding: 0.3rem 0;
|
|
516
|
+
color: var(--accent);
|
|
517
|
+
border-top: 1px solid var(--border);
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
.card-link:first-of-type {
|
|
521
|
+
margin-top: auto;
|
|
522
|
+
padding-top: 0.75rem;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
.card-link:hover {
|
|
526
|
+
color: var(--accent-hover);
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
.card-button {
|
|
530
|
+
display: inline-block;
|
|
531
|
+
margin-top: auto;
|
|
532
|
+
padding: 0.65rem 2rem;
|
|
533
|
+
background: var(--accent);
|
|
534
|
+
color: #fff;
|
|
535
|
+
border-radius: 50px;
|
|
536
|
+
font-family: var(--font-body);
|
|
537
|
+
font-size: 0.9rem;
|
|
538
|
+
font-weight: 500;
|
|
539
|
+
letter-spacing: 0.01em;
|
|
540
|
+
transition: background 0.2s;
|
|
541
|
+
text-align: center;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
.card-button:hover {
|
|
545
|
+
background: var(--accent-hover);
|
|
546
|
+
color: #fff;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
/* ---- Package landing ----
|
|
550
|
+
|
|
551
|
+
The home layout's landing shape (layouts/partials/landing.html): a lead,
|
|
552
|
+
an install block, a grid of cards, standing notices and a closing line.
|
|
553
|
+
|
|
554
|
+
These classes were a per-page <style> block in one package repository,
|
|
555
|
+
which meant the other five could only get the same look by copying it
|
|
556
|
+
(issue #33). Here they are shared, and every colour, face and measure is a
|
|
557
|
+
token, so a consumer that redefines the palette on :root — or a light
|
|
558
|
+
scheme added to this file later — re-colours the landing along with the
|
|
559
|
+
rest of the site. No literal colour appears below.
|
|
560
|
+
---- */
|
|
561
|
+
|
|
562
|
+
/* Lead and closing paragraphs, and the page body when a package writes one.
|
|
563
|
+
Held to a measure a reader can track across, and centred in the band. */
|
|
564
|
+
.lead,
|
|
565
|
+
.landing-body {
|
|
566
|
+
max-width: 780px;
|
|
567
|
+
margin: 0 auto 2rem;
|
|
568
|
+
line-height: 1.75;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
.lead-centred {
|
|
572
|
+
text-align: center;
|
|
573
|
+
margin-top: 2rem;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
.section-heading {
|
|
577
|
+
text-align: center;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/* Install block: the manifest URL is the payload, so it is set to be read and
|
|
581
|
+
copied rather than decorated. */
|
|
582
|
+
.install {
|
|
583
|
+
max-width: 780px;
|
|
584
|
+
margin: 0 auto;
|
|
585
|
+
border: 1px solid var(--border-light);
|
|
586
|
+
border-radius: 8px;
|
|
587
|
+
background: var(--bg-card);
|
|
588
|
+
padding: 1.5rem 1.75rem;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
.install h2 {
|
|
592
|
+
font-family: var(--font-display);
|
|
593
|
+
font-size: 1.4rem;
|
|
594
|
+
margin-bottom: 0.75rem;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
.install p {
|
|
598
|
+
line-height: 1.7;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
.install-url {
|
|
602
|
+
display: block;
|
|
603
|
+
padding: 0.75rem 1rem;
|
|
604
|
+
background: var(--bg-deeper);
|
|
605
|
+
border: 1px solid var(--border);
|
|
606
|
+
border-radius: 4px;
|
|
607
|
+
font-family: var(--font-mono);
|
|
608
|
+
font-size: 0.9rem;
|
|
609
|
+
color: var(--text);
|
|
610
|
+
word-break: break-all;
|
|
611
|
+
margin: 0.75rem 0;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
.install-note {
|
|
615
|
+
color: var(--text-muted);
|
|
616
|
+
font-size: 0.92rem;
|
|
617
|
+
margin: 0;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
/* The cards: each a heading, a line of orientation, and the few links that
|
|
621
|
+
actually answer it. A fixed card width rather than a fitted grid, so a
|
|
622
|
+
package with three cards and one with twenty both read as the same object
|
|
623
|
+
at the same size. */
|
|
624
|
+
.doors {
|
|
625
|
+
display: flex;
|
|
626
|
+
flex-wrap: wrap;
|
|
627
|
+
gap: 1.5rem;
|
|
628
|
+
justify-content: center;
|
|
629
|
+
margin-top: 1.5rem;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
.door {
|
|
633
|
+
width: 340px;
|
|
634
|
+
border: 1px solid var(--border-light);
|
|
635
|
+
border-radius: 8px;
|
|
636
|
+
background: var(--bg-card);
|
|
637
|
+
padding: 1.5rem;
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/* A card inside a group carries an h4 rather than an h3, so that the group's
|
|
641
|
+
own heading sits above it in the outline. It is the same card title either
|
|
642
|
+
way, so it is the same rule. */
|
|
643
|
+
.door h3,
|
|
644
|
+
.door h4 {
|
|
645
|
+
font-family: var(--font-display);
|
|
646
|
+
font-size: 1.25rem;
|
|
647
|
+
color: var(--gold);
|
|
648
|
+
margin-bottom: 0.5rem;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
.door h3 a,
|
|
652
|
+
.door h4 a {
|
|
653
|
+
color: var(--gold);
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
.door h3 a:hover,
|
|
657
|
+
.door h4 a:hover {
|
|
658
|
+
color: var(--accent-hover);
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
.door > p {
|
|
662
|
+
color: var(--text-muted);
|
|
663
|
+
font-size: 0.92rem;
|
|
664
|
+
line-height: 1.6;
|
|
665
|
+
margin-bottom: 0.9rem;
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
.door ul {
|
|
669
|
+
list-style: none;
|
|
670
|
+
margin: 0;
|
|
671
|
+
padding: 0;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
.door li {
|
|
675
|
+
margin-bottom: 0.5rem;
|
|
676
|
+
line-height: 1.5;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
.door li a {
|
|
680
|
+
font-weight: 600;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
/* A card image — the section's own hero banner, at the banner aspect so a
|
|
684
|
+
grid of them lines up whatever each drawing's intrinsic size is. The card's
|
|
685
|
+
padding moves to an inner body so the image sits edge to edge; a text card
|
|
686
|
+
is untouched. */
|
|
687
|
+
.door-with-image {
|
|
688
|
+
padding: 0;
|
|
689
|
+
overflow: hidden;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
.door-image {
|
|
693
|
+
display: block;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
.door-image img,
|
|
697
|
+
img.door-image {
|
|
698
|
+
display: block;
|
|
699
|
+
width: 100%;
|
|
700
|
+
aspect-ratio: 1792 / 768;
|
|
701
|
+
object-fit: cover;
|
|
702
|
+
background: var(--bg-deeper);
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
.door-body {
|
|
706
|
+
padding: 1.5rem;
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
/* Derived cards gathered under an editorial heading — "Actors", "Gear". The
|
|
710
|
+
group is a box around its own grid so the fence is visible at a glance,
|
|
711
|
+
which is the whole point of saying these cards belong together. Groups sit
|
|
712
|
+
beside each other and wrap, so a group of one and a group of five read as
|
|
713
|
+
two boxes rather than two full-width bands. */
|
|
714
|
+
.doors-groups {
|
|
715
|
+
display: flex;
|
|
716
|
+
flex-wrap: wrap;
|
|
717
|
+
gap: 1.75rem;
|
|
718
|
+
justify-content: center;
|
|
719
|
+
margin: 1.5rem auto 0;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
.doors-group {
|
|
723
|
+
margin: 0;
|
|
724
|
+
border: 1px solid var(--border-light);
|
|
725
|
+
border-radius: 8px;
|
|
726
|
+
background: var(--bg-card);
|
|
727
|
+
padding: 0.25rem 1.5rem 1.5rem;
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
.doors-group-heading {
|
|
731
|
+
font-family: var(--font-display);
|
|
732
|
+
font-size: 1.15rem;
|
|
733
|
+
font-weight: 600;
|
|
734
|
+
color: var(--gold);
|
|
735
|
+
letter-spacing: 0.02em;
|
|
736
|
+
text-align: center;
|
|
737
|
+
margin-top: 1.25rem;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
/* A card already carries its own frame, so inside a group it drops back to the
|
|
741
|
+
surface tone and lets the group's box be the boundary. */
|
|
742
|
+
.doors-group .door {
|
|
743
|
+
background: var(--surface);
|
|
744
|
+
border-color: var(--border);
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
/* A standing notice — a licence carve-out, an attribution. Full width of the
|
|
748
|
+
measure rather than a card, because it is addressed to every reader rather
|
|
749
|
+
than being one route among several. */
|
|
750
|
+
.landing-notice {
|
|
751
|
+
max-width: 780px;
|
|
752
|
+
margin: 0 auto 1.5rem;
|
|
753
|
+
border: 1px solid var(--border);
|
|
754
|
+
border-left: 3px solid var(--gold-dim);
|
|
755
|
+
border-radius: 4px;
|
|
756
|
+
background: var(--bg-card);
|
|
757
|
+
padding: 1.25rem 1.5rem;
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
.landing-notice h2 {
|
|
761
|
+
font-family: var(--font-display);
|
|
762
|
+
font-size: 1.15rem;
|
|
763
|
+
color: var(--gold);
|
|
764
|
+
margin-bottom: 0.5rem;
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
.landing-notice p {
|
|
768
|
+
color: var(--text-muted);
|
|
769
|
+
font-size: 0.94rem;
|
|
770
|
+
line-height: 1.65;
|
|
771
|
+
margin: 0;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
/* One card per row once two no longer fit beside each other; the fixed width
|
|
775
|
+
would otherwise overflow a narrow viewport. */
|
|
776
|
+
@media (max-width: 400px) {
|
|
777
|
+
.door {
|
|
778
|
+
width: 100%;
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
/* ---- Section List Pages ---- */
|
|
783
|
+
|
|
784
|
+
.section-header {
|
|
785
|
+
max-width: var(--content-narrow);
|
|
786
|
+
margin: 0 auto;
|
|
787
|
+
padding: 3rem 2rem 1.5rem;
|
|
788
|
+
border-bottom: 1px solid var(--border);
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
.section-header h1 {
|
|
792
|
+
font-family: var(--font-display);
|
|
793
|
+
font-size: 2.4rem;
|
|
794
|
+
font-weight: 700;
|
|
795
|
+
letter-spacing: 0.01em;
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
.section-description {
|
|
799
|
+
color: var(--text-muted);
|
|
800
|
+
margin-top: 0.75rem;
|
|
801
|
+
font-size: 0.95rem;
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
.content-list {
|
|
805
|
+
max-width: var(--content-narrow);
|
|
806
|
+
margin: 0 auto;
|
|
807
|
+
padding: 1rem 2rem 4rem;
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
.list-item {
|
|
811
|
+
padding: 1.25rem 0;
|
|
812
|
+
border-bottom: 1px solid var(--border);
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
.list-item h2 {
|
|
816
|
+
font-family: var(--font-display);
|
|
817
|
+
font-size: 1.35rem;
|
|
818
|
+
font-weight: 600;
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
.list-item h2 a {
|
|
822
|
+
color: var(--text);
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
.list-item h2 a:hover {
|
|
826
|
+
color: var(--accent);
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
.item-description {
|
|
830
|
+
color: var(--text-muted);
|
|
831
|
+
font-size: 0.9rem;
|
|
832
|
+
margin-top: 0.35rem;
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
.item-tags {
|
|
836
|
+
margin-top: 0.5rem;
|
|
837
|
+
display: flex;
|
|
838
|
+
flex-wrap: wrap;
|
|
839
|
+
gap: 0.4rem;
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
.tag {
|
|
843
|
+
display: inline-block;
|
|
844
|
+
font-size: 0.75rem;
|
|
845
|
+
padding: 0.15rem 0.6rem;
|
|
846
|
+
background: var(--surface);
|
|
847
|
+
color: var(--text-muted);
|
|
848
|
+
border: 1px solid var(--border);
|
|
849
|
+
border-radius: 3px;
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
a.tag:hover {
|
|
853
|
+
border-color: var(--accent-dim);
|
|
854
|
+
color: var(--accent);
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
/* ---- Single Page ---- */
|
|
858
|
+
|
|
859
|
+
.single {
|
|
860
|
+
max-width: var(--content-narrow);
|
|
861
|
+
margin: 0 auto;
|
|
862
|
+
padding: 0 2rem;
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
.single-header {
|
|
866
|
+
padding: 3rem 0 1.5rem;
|
|
867
|
+
border-bottom: 1px solid var(--border);
|
|
868
|
+
margin-bottom: 2rem;
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
.single-header h1 {
|
|
872
|
+
font-family: var(--font-display);
|
|
873
|
+
font-size: 2.6rem;
|
|
874
|
+
font-weight: 600;
|
|
875
|
+
line-height: 1.15;
|
|
876
|
+
letter-spacing: 0.02em;
|
|
877
|
+
color: var(--accent);
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
.single-description {
|
|
881
|
+
font-family: var(--font-body);
|
|
882
|
+
font-style: italic;
|
|
883
|
+
color: var(--text-muted);
|
|
884
|
+
font-size: 1.1rem;
|
|
885
|
+
margin-top: 0.5rem;
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
.single-date {
|
|
889
|
+
display: block;
|
|
890
|
+
color: var(--text-dim);
|
|
891
|
+
font-size: 0.85rem;
|
|
892
|
+
margin-top: 0.75rem;
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
.single-tags {
|
|
896
|
+
margin-top: 0.75rem;
|
|
897
|
+
display: flex;
|
|
898
|
+
flex-wrap: wrap;
|
|
899
|
+
gap: 0.4rem;
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
/* ---- Blog meta ---- */
|
|
903
|
+
|
|
904
|
+
.blog-meta {
|
|
905
|
+
margin-bottom: 1.5rem;
|
|
906
|
+
padding-bottom: 1rem;
|
|
907
|
+
border-bottom: 1px solid var(--border);
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
.blog-series {
|
|
911
|
+
display: inline-flex;
|
|
912
|
+
align-items: baseline;
|
|
913
|
+
gap: 0.5rem;
|
|
914
|
+
padding: 0.25rem 0.6rem;
|
|
915
|
+
border: 1px solid var(--accent-dim);
|
|
916
|
+
border-radius: 2px;
|
|
917
|
+
background: var(--bg-card);
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
.blog-series-label {
|
|
921
|
+
font-family: var(--font-display);
|
|
922
|
+
font-size: 0.7rem;
|
|
923
|
+
font-weight: 600;
|
|
924
|
+
letter-spacing: 0.12em;
|
|
925
|
+
text-transform: uppercase;
|
|
926
|
+
color: var(--accent);
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
.blog-series-name {
|
|
930
|
+
font-family: var(--font-body);
|
|
931
|
+
font-style: italic;
|
|
932
|
+
font-size: 0.9rem;
|
|
933
|
+
color: var(--text-muted);
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
.blog-meta .single-date {
|
|
937
|
+
margin-top: 0.5rem;
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
/* ---- Blog list (section index) ----
|
|
941
|
+
|
|
942
|
+
Selectors use `.single-content .blog-list` (two classes) so they
|
|
943
|
+
outrank the generic `.single-content ul` rule further down, which
|
|
944
|
+
would otherwise re-impose default bullets and a 1.5rem left margin. */
|
|
945
|
+
|
|
946
|
+
.single-content .blog-list {
|
|
947
|
+
list-style: none;
|
|
948
|
+
padding: 0;
|
|
949
|
+
margin: 1rem 0 0;
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
.single-content .blog-list-item {
|
|
953
|
+
padding: 1.5rem 0;
|
|
954
|
+
margin: 0;
|
|
955
|
+
border-bottom: 1px solid var(--border);
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
.single-content .blog-list-item:first-child {
|
|
959
|
+
padding-top: 0.5rem;
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
.single-content .blog-list-item:last-child {
|
|
963
|
+
border-bottom: none;
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
.single-content .blog-list-date {
|
|
967
|
+
display: block;
|
|
968
|
+
color: var(--text-dim);
|
|
969
|
+
font-size: 0.85rem;
|
|
970
|
+
margin-bottom: 0.25rem;
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
.single-content .blog-list-title {
|
|
974
|
+
font-family: var(--font-display);
|
|
975
|
+
font-size: 1.4rem;
|
|
976
|
+
font-weight: 600;
|
|
977
|
+
letter-spacing: 0.02em;
|
|
978
|
+
color: var(--text);
|
|
979
|
+
display: inline-block;
|
|
980
|
+
border-bottom: 1px solid transparent;
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
.single-content .blog-list-title:hover {
|
|
984
|
+
color: var(--accent);
|
|
985
|
+
border-bottom-color: var(--accent-dim);
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
.single-content .blog-list-desc {
|
|
989
|
+
color: var(--text-muted);
|
|
990
|
+
font-style: italic;
|
|
991
|
+
margin: 0.5rem 0 0;
|
|
992
|
+
font-size: 0.95rem;
|
|
993
|
+
line-height: 1.6;
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
/* ---- Article Content ---- */
|
|
997
|
+
|
|
998
|
+
.single-content {
|
|
999
|
+
padding-bottom: 3rem;
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
.single-content h1 {
|
|
1003
|
+
font-family: var(--font-display);
|
|
1004
|
+
font-size: 2.2rem;
|
|
1005
|
+
font-weight: 600;
|
|
1006
|
+
line-height: 1.2;
|
|
1007
|
+
letter-spacing: 0.02em;
|
|
1008
|
+
margin: 2.5rem 0 1rem;
|
|
1009
|
+
color: var(--accent);
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
.single-content h2 {
|
|
1013
|
+
font-family: var(--font-display);
|
|
1014
|
+
font-size: 1.7rem;
|
|
1015
|
+
font-weight: 600;
|
|
1016
|
+
letter-spacing: 0.04em;
|
|
1017
|
+
text-transform: uppercase;
|
|
1018
|
+
margin: 2.5rem 0 0.75rem;
|
|
1019
|
+
padding-bottom: 0.4rem;
|
|
1020
|
+
border-bottom: 1px solid var(--accent-dim);
|
|
1021
|
+
color: var(--text);
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
.single-content h3 {
|
|
1025
|
+
font-family: var(--font-display);
|
|
1026
|
+
font-size: 1.3rem;
|
|
1027
|
+
font-weight: 500;
|
|
1028
|
+
letter-spacing: 0.06em;
|
|
1029
|
+
text-transform: uppercase;
|
|
1030
|
+
margin: 2rem 0 0.6rem;
|
|
1031
|
+
color: var(--accent);
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
.single-content h4 {
|
|
1035
|
+
font-family: var(--font-display);
|
|
1036
|
+
font-size: 1.05rem;
|
|
1037
|
+
font-weight: 600;
|
|
1038
|
+
letter-spacing: 0.08em;
|
|
1039
|
+
text-transform: uppercase;
|
|
1040
|
+
margin: 1.5rem 0 0.5rem;
|
|
1041
|
+
color: var(--text-muted);
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
.single-content p {
|
|
1045
|
+
margin-bottom: 1.25rem;
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
.single-content ul,
|
|
1049
|
+
.single-content ol {
|
|
1050
|
+
margin: 0 0 1.25rem 1.5rem;
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
.single-content li {
|
|
1054
|
+
margin-bottom: 0.35rem;
|
|
1055
|
+
}
|
|
1056
|
+
|
|
1057
|
+
.single-content blockquote {
|
|
1058
|
+
border-left: 3px solid var(--gold-dim);
|
|
1059
|
+
margin: 1.5rem 0;
|
|
1060
|
+
padding: 0.75rem 1.25rem;
|
|
1061
|
+
background: var(--bg-card);
|
|
1062
|
+
color: var(--text-muted);
|
|
1063
|
+
font-style: italic;
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
/* ---- Named blocks (info, warn, secret) ----
|
|
1067
|
+
|
|
1068
|
+
A note's `:::info`, `:::warn` and `:::secret` blocks reach the page as a
|
|
1069
|
+
<details> carrying the kind as its first class, with the <summary>
|
|
1070
|
+
repeating it alone. An author may add further classes and attributes
|
|
1071
|
+
beside the kind, so every selector here matches on the kind class rather
|
|
1072
|
+
than assuming the attribute is one word.
|
|
1073
|
+
|
|
1074
|
+
Each kind sets --block-accent from its own custom property, so the shared
|
|
1075
|
+
rule below carries the layout once and a consuming site can retint one
|
|
1076
|
+
kind by redeclaring --block-info / --block-warn / --block-secret alone.
|
|
1077
|
+
|
|
1078
|
+
Single-mode dark, deliberately, as the markers above: this theme sets no
|
|
1079
|
+
color-scheme, so a light-dark() value would resolve to its light half and
|
|
1080
|
+
the toolchain's old fixed light fills are exactly what this replaces. */
|
|
1081
|
+
|
|
1082
|
+
.single-content details.info,
|
|
1083
|
+
.single-content details.warn,
|
|
1084
|
+
.single-content details.secret {
|
|
1085
|
+
margin: 1.5rem 0;
|
|
1086
|
+
padding: 0.85rem 1.1rem;
|
|
1087
|
+
border: 1px solid var(--border);
|
|
1088
|
+
border-left: 3px solid var(--block-accent);
|
|
1089
|
+
border-radius: 4px;
|
|
1090
|
+
background: var(--bg-card);
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
.single-content details.info {
|
|
1094
|
+
--block-accent: var(--block-info);
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
.single-content details.warn {
|
|
1098
|
+
--block-accent: var(--block-warn);
|
|
1099
|
+
}
|
|
1100
|
+
|
|
1101
|
+
.single-content details.secret {
|
|
1102
|
+
--block-accent: var(--block-secret);
|
|
1103
|
+
}
|
|
1104
|
+
|
|
1105
|
+
.single-content details.info > summary.info,
|
|
1106
|
+
.single-content details.warn > summary.warn,
|
|
1107
|
+
.single-content details.secret > summary.secret {
|
|
1108
|
+
display: flex;
|
|
1109
|
+
align-items: center;
|
|
1110
|
+
gap: 0.6rem;
|
|
1111
|
+
cursor: pointer;
|
|
1112
|
+
list-style: none;
|
|
1113
|
+
font-family: var(--font-display);
|
|
1114
|
+
font-weight: 700;
|
|
1115
|
+
letter-spacing: 0.04em;
|
|
1116
|
+
color: var(--block-accent);
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
.single-content details.info > summary.info::-webkit-details-marker,
|
|
1120
|
+
.single-content details.warn > summary.warn::-webkit-details-marker,
|
|
1121
|
+
.single-content details.secret > summary.secret::-webkit-details-marker {
|
|
1122
|
+
display: none;
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
/* The chevron replaces the browser's own marker, matching the disclosure
|
|
1126
|
+
affordance .info-sidebar-title uses, so a reader meets one convention for
|
|
1127
|
+
"this opens" across the theme rather than two. */
|
|
1128
|
+
.single-content details.info > summary.info::after,
|
|
1129
|
+
.single-content details.warn > summary.warn::after,
|
|
1130
|
+
.single-content details.secret > summary.secret::after {
|
|
1131
|
+
content: "";
|
|
1132
|
+
width: 0.45rem;
|
|
1133
|
+
height: 0.45rem;
|
|
1134
|
+
margin-left: auto;
|
|
1135
|
+
border-right: 2px solid currentcolor;
|
|
1136
|
+
border-bottom: 2px solid currentcolor;
|
|
1137
|
+
transform: translateY(-0.15em) rotate(45deg);
|
|
1138
|
+
transition: transform 0.15s ease;
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
.single-content details.info[open] > summary.info::after,
|
|
1142
|
+
.single-content details.warn[open] > summary.warn::after,
|
|
1143
|
+
.single-content details.secret[open] > summary.secret::after {
|
|
1144
|
+
transform: translateY(0.1em) rotate(-135deg);
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
.single-content details.info[open] > summary.info,
|
|
1148
|
+
.single-content details.warn[open] > summary.warn,
|
|
1149
|
+
.single-content details.secret[open] > summary.secret {
|
|
1150
|
+
margin-bottom: 0.75rem;
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
.single-content details.info > :last-child,
|
|
1154
|
+
.single-content details.warn > :last-child,
|
|
1155
|
+
.single-content details.secret > :last-child {
|
|
1156
|
+
margin-bottom: 0;
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
.single-content code {
|
|
1160
|
+
font-family: var(--font-mono);
|
|
1161
|
+
font-size: 0.85em;
|
|
1162
|
+
background: var(--surface);
|
|
1163
|
+
padding: 0.15em 0.4em;
|
|
1164
|
+
border-radius: 3px;
|
|
1165
|
+
border: 1px solid var(--border);
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
.single-content pre {
|
|
1169
|
+
background: var(--bg-deeper);
|
|
1170
|
+
border: 1px solid var(--border);
|
|
1171
|
+
border-radius: 4px;
|
|
1172
|
+
padding: 1.25rem;
|
|
1173
|
+
overflow-x: auto;
|
|
1174
|
+
margin: 1.5rem 0;
|
|
1175
|
+
}
|
|
1176
|
+
|
|
1177
|
+
.single-content pre code {
|
|
1178
|
+
background: none;
|
|
1179
|
+
border: none;
|
|
1180
|
+
padding: 0;
|
|
1181
|
+
font-size: 0.85rem;
|
|
1182
|
+
line-height: 1.6;
|
|
1183
|
+
}
|
|
1184
|
+
|
|
1185
|
+
.single-content table {
|
|
1186
|
+
width: 100%;
|
|
1187
|
+
border-collapse: collapse;
|
|
1188
|
+
margin: 1.5rem 0;
|
|
1189
|
+
font-size: 0.9rem;
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
.single-content th,
|
|
1193
|
+
.single-content td {
|
|
1194
|
+
text-align: left;
|
|
1195
|
+
padding: 0.6rem 1rem;
|
|
1196
|
+
border-bottom: 1px solid var(--border);
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
.single-content th {
|
|
1200
|
+
font-family: var(--font-display);
|
|
1201
|
+
font-weight: 600;
|
|
1202
|
+
color: var(--text);
|
|
1203
|
+
border-bottom: 2px solid var(--border-light);
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1206
|
+
.single-content img {
|
|
1207
|
+
border-radius: 4px;
|
|
1208
|
+
border: 1px solid var(--border);
|
|
1209
|
+
margin: 1.5rem 0;
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
/* An authored image uses its file width unless a named size sets a measure
|
|
1213
|
+
or its role states a slot. */
|
|
1214
|
+
.single-content figure.note-image {
|
|
1215
|
+
display: table;
|
|
1216
|
+
width: max-content;
|
|
1217
|
+
max-width: min(100%, var(--note-image-slot, 100%));
|
|
1218
|
+
margin: 1.5rem 0;
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1221
|
+
.single-content figure.note-image img {
|
|
1222
|
+
display: block;
|
|
1223
|
+
width: auto;
|
|
1224
|
+
max-width: 100%;
|
|
1225
|
+
height: auto;
|
|
1226
|
+
margin: 0;
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1229
|
+
/* What a role draws at on this surface. Each slot is a maximum, never a
|
|
1230
|
+
target: the drawn width is the smaller of the slot and the picture's own
|
|
1231
|
+
pixels, which the emitted `width`/`height` attributes supply as the figure's
|
|
1232
|
+
intrinsic measure. A named `size=` or a stated width overrides a slot
|
|
1233
|
+
outright, which is what clearing the property below it does. */
|
|
1234
|
+
.single-content figure.note-image-role-portrait,
|
|
1235
|
+
.single-content figure.note-image-role-emblem {
|
|
1236
|
+
--note-image-slot: 50%;
|
|
1237
|
+
}
|
|
1238
|
+
|
|
1239
|
+
.single-content figure.note-image-role-banner,
|
|
1240
|
+
.single-content figure.note-image-role-plate,
|
|
1241
|
+
.single-content figure.note-image-role-map {
|
|
1242
|
+
--note-image-slot: 100%;
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
/* A vector carries no pixel count, so nothing narrows its role's slot and it
|
|
1246
|
+
draws at the slot rather than at an intrinsic measure it does not hold. A
|
|
1247
|
+
blank `width` attribute is what tells one from a raster. */
|
|
1248
|
+
.single-content figure[class*="note-image-role-"]:has(img[width=""]) {
|
|
1249
|
+
width: min(100%, var(--note-image-width, var(--note-image-slot, 100%)));
|
|
1250
|
+
}
|
|
1251
|
+
|
|
1252
|
+
.single-content figure[class*="note-image-role-"] img[width=""] {
|
|
1253
|
+
width: 100%;
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1256
|
+
.single-content figure.note-image-size-small { --note-image-width: 64px; }
|
|
1257
|
+
.single-content figure.note-image-size-medium { --note-image-width: 128px; }
|
|
1258
|
+
.single-content figure.note-image-size-large { --note-image-width: 256px; }
|
|
1259
|
+
.single-content figure.note-image-size-xlarge { --note-image-width: 512px; }
|
|
1260
|
+
|
|
1261
|
+
.single-content figure.note-image-size-small,
|
|
1262
|
+
.single-content figure.note-image-size-medium,
|
|
1263
|
+
.single-content figure.note-image-size-large,
|
|
1264
|
+
.single-content figure.note-image-size-xlarge {
|
|
1265
|
+
--note-image-slot: 100%;
|
|
1266
|
+
width: min(100%, var(--note-image-width));
|
|
1267
|
+
}
|
|
1268
|
+
|
|
1269
|
+
.single-content figure.note-image-size-small img,
|
|
1270
|
+
.single-content figure.note-image-size-medium img,
|
|
1271
|
+
.single-content figure.note-image-size-large img,
|
|
1272
|
+
.single-content figure.note-image-size-xlarge img {
|
|
1273
|
+
width: 100%;
|
|
1274
|
+
}
|
|
1275
|
+
|
|
1276
|
+
.single-content figure.note-image-full-width,
|
|
1277
|
+
.single-content figure.note-image-size-full-width {
|
|
1278
|
+
--note-image-slot: 100%;
|
|
1279
|
+
display: block;
|
|
1280
|
+
width: 100%;
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
.single-content figure.note-image-full-width img,
|
|
1284
|
+
.single-content figure.note-image-size-full-width img {
|
|
1285
|
+
width: var(--note-image-width, 100%);
|
|
1286
|
+
}
|
|
1287
|
+
|
|
1288
|
+
.single-content figure.note-image-float-top-left,
|
|
1289
|
+
.single-content figure.note-image-float-bottom-left {
|
|
1290
|
+
float: left;
|
|
1291
|
+
max-width: min(50%, var(--note-image-slot, 100%));
|
|
1292
|
+
margin: 0.25rem 1.25rem 0.75rem 0;
|
|
1293
|
+
}
|
|
1294
|
+
|
|
1295
|
+
.single-content figure.note-image-float-top-right,
|
|
1296
|
+
.single-content figure.note-image-float-bottom-right {
|
|
1297
|
+
float: right;
|
|
1298
|
+
max-width: min(50%, var(--note-image-slot, 100%));
|
|
1299
|
+
margin: 0.25rem 0 0.75rem 1.25rem;
|
|
1300
|
+
}
|
|
1301
|
+
|
|
1302
|
+
.single-content figure.note-image-full-width,
|
|
1303
|
+
.single-content figure.note-image-size-full-width {
|
|
1304
|
+
max-width: 100%;
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1307
|
+
.single-content figure.note-image-float-center {
|
|
1308
|
+
float: none;
|
|
1309
|
+
margin: 1.5rem auto;
|
|
1310
|
+
}
|
|
1311
|
+
|
|
1312
|
+
@media (max-width: 720px) {
|
|
1313
|
+
/* Half a phone's column is a thumbnail, so a role's slot opens to the whole
|
|
1314
|
+
of it. The picture's own pixels still cap what it draws at. */
|
|
1315
|
+
.single-content figure.note-image {
|
|
1316
|
+
--note-image-slot: 100%;
|
|
1317
|
+
}
|
|
1318
|
+
|
|
1319
|
+
.single-content figure.note-image-float-top-left,
|
|
1320
|
+
.single-content figure.note-image-float-bottom-left,
|
|
1321
|
+
.single-content figure.note-image-float-top-right,
|
|
1322
|
+
.single-content figure.note-image-float-bottom-right {
|
|
1323
|
+
float: none;
|
|
1324
|
+
display: block;
|
|
1325
|
+
width: 100%;
|
|
1326
|
+
max-width: 100%;
|
|
1327
|
+
margin: 1.5rem auto;
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1330
|
+
.single-content figure.note-image-float-top-left img,
|
|
1331
|
+
.single-content figure.note-image-float-bottom-left img,
|
|
1332
|
+
.single-content figure.note-image-float-top-right img,
|
|
1333
|
+
.single-content figure.note-image-float-bottom-right img {
|
|
1334
|
+
width: var(--note-image-width, auto);
|
|
1335
|
+
}
|
|
1336
|
+
}
|
|
1337
|
+
|
|
1338
|
+
/* A `:::figure` fence: a numbered, referable block carrying its label beneath
|
|
1339
|
+
whatever it holds — a picture, a table, a listing, a map, or prose. The
|
|
1340
|
+
contents decide the counter and the label's word, and every kind draws
|
|
1341
|
+
alike, so a kind added to the vocabulary arrives styled. A fence is a
|
|
1342
|
+
cross-reference target, and takes the scroll offset a heading does. */
|
|
1343
|
+
.single-content .content-figure {
|
|
1344
|
+
margin: 1.5rem 0;
|
|
1345
|
+
scroll-margin-top: 2rem;
|
|
1346
|
+
}
|
|
1347
|
+
|
|
1348
|
+
/* The fence owns the space around what it wraps, so its contents add none of
|
|
1349
|
+
their own at the edges. */
|
|
1350
|
+
.single-content .content-figure > :first-child {
|
|
1351
|
+
margin-top: 0;
|
|
1352
|
+
}
|
|
1353
|
+
|
|
1354
|
+
.single-content .content-figure > figure.note-image {
|
|
1355
|
+
margin: 0;
|
|
1356
|
+
}
|
|
1357
|
+
|
|
1358
|
+
/* The label carries the number a cross-reference points at, so it reads as a
|
|
1359
|
+
caption rather than as another paragraph of the body. */
|
|
1360
|
+
.single-content .content-figure-label {
|
|
1361
|
+
margin: 0.5rem 0 0;
|
|
1362
|
+
color: var(--text-muted);
|
|
1363
|
+
font-size: 0.8rem;
|
|
1364
|
+
line-height: 1.4;
|
|
1365
|
+
}
|
|
1366
|
+
|
|
1367
|
+
/* `.border` is the one class an author may write on a fence, and it draws the
|
|
1368
|
+
block as a boxed aside. */
|
|
1369
|
+
.single-content .content-figure.border {
|
|
1370
|
+
padding: 1rem 1.25rem;
|
|
1371
|
+
border: 1px solid var(--border);
|
|
1372
|
+
border-radius: 4px;
|
|
1373
|
+
background: var(--bg-card);
|
|
1374
|
+
}
|
|
1375
|
+
|
|
1376
|
+
/* Ornamental horizontal rule: thin line flanking a centered gold
|
|
1377
|
+
diamond. Uses gradients on ::before/::after to keep the markup
|
|
1378
|
+
clean (authors just write `---` in markdown). */
|
|
1379
|
+
.single-content hr,
|
|
1380
|
+
.single-body hr {
|
|
1381
|
+
position: relative;
|
|
1382
|
+
border: none;
|
|
1383
|
+
height: 1px;
|
|
1384
|
+
margin: 3rem 0;
|
|
1385
|
+
background: linear-gradient(
|
|
1386
|
+
to right,
|
|
1387
|
+
transparent 0%,
|
|
1388
|
+
var(--border) 20%,
|
|
1389
|
+
var(--border-light) 50%,
|
|
1390
|
+
var(--border) 80%,
|
|
1391
|
+
transparent 100%
|
|
1392
|
+
);
|
|
1393
|
+
overflow: visible;
|
|
1394
|
+
}
|
|
1395
|
+
|
|
1396
|
+
.single-content hr::after,
|
|
1397
|
+
.single-body hr::after {
|
|
1398
|
+
content: "";
|
|
1399
|
+
position: absolute;
|
|
1400
|
+
top: 50%;
|
|
1401
|
+
left: 50%;
|
|
1402
|
+
width: 10px;
|
|
1403
|
+
height: 10px;
|
|
1404
|
+
background: var(--gold-dim);
|
|
1405
|
+
transform: translate(-50%, -50%) rotate(45deg);
|
|
1406
|
+
box-shadow: 0 0 0 3px var(--bg);
|
|
1407
|
+
}
|
|
1408
|
+
|
|
1409
|
+
|
|
1410
|
+
/* ---- Footnotes ----
|
|
1411
|
+
|
|
1412
|
+
Goldmark renders a footnote marker as a <sup> wrapping an `a.footnote-ref`,
|
|
1413
|
+
and the notes themselves as a `div.footnotes` holding an <hr>, an <ol> of
|
|
1414
|
+
notes, and an `a.footnote-backref` glyph closing each one. Those classes
|
|
1415
|
+
arrive inside the rendered body, so they are scoped under the article
|
|
1416
|
+
wrapper like the rest of its typography.
|
|
1417
|
+
|
|
1418
|
+
The marker takes its size in rem rather than em: <sup> already shrinks its
|
|
1419
|
+
contents, so an em value compounds and the marker lands at whatever the
|
|
1420
|
+
surrounding type happens to be. It stays an inline box as well — vertical
|
|
1421
|
+
padding on an inline element enlarges the hit area without touching the line
|
|
1422
|
+
box, so a marker is comfortable to hit and the leading of the paragraph
|
|
1423
|
+
carrying it matches every other paragraph.
|
|
1424
|
+
|
|
1425
|
+
The notes section carries no heading of its own, and one cannot be added to
|
|
1426
|
+
the rendered body, so the label is a ::before on the container. Goldmark's
|
|
1427
|
+
<hr> goes with it: the theme gives `---` an ornamental rule meaning "a break
|
|
1428
|
+
in the article", and opening the notes with that same mark says the article
|
|
1429
|
+
continues. A rule above the section separates it instead, and the label says
|
|
1430
|
+
what it is — which is what the Foundry surface shows and what the authoring
|
|
1431
|
+
document describes.
|
|
1432
|
+
|
|
1433
|
+
Following a marker or a back-reference has to land somewhere visible, so
|
|
1434
|
+
both ends of the jump highlight: the note under `li:target`, and the marker
|
|
1435
|
+
under the <sup> that carries the id. Each keeps its padding at rest, so the
|
|
1436
|
+
highlight appears without shifting the text around it.
|
|
1437
|
+
|
|
1438
|
+
Single-mode dark, deliberately, as the markers and named blocks above. */
|
|
1439
|
+
|
|
1440
|
+
.single-content .footnote-ref {
|
|
1441
|
+
font-size: 0.78rem;
|
|
1442
|
+
font-weight: 700;
|
|
1443
|
+
font-variant-numeric: tabular-nums;
|
|
1444
|
+
color: var(--footnote-marker);
|
|
1445
|
+
margin: 0 0.15em;
|
|
1446
|
+
padding: 0.4em 0.25em;
|
|
1447
|
+
border-radius: 3px;
|
|
1448
|
+
border-bottom: none;
|
|
1449
|
+
}
|
|
1450
|
+
|
|
1451
|
+
.single-content .footnote-ref:hover {
|
|
1452
|
+
color: var(--footnote-marker);
|
|
1453
|
+
background: var(--surface);
|
|
1454
|
+
}
|
|
1455
|
+
|
|
1456
|
+
/* The id sits on the <sup>, so a jump to #fnref:N targets the wrapper and the
|
|
1457
|
+
link inside it is styled through that. Only a footnote marker carries an id
|
|
1458
|
+
on a <sup> in rendered output. */
|
|
1459
|
+
.single-content sup:target {
|
|
1460
|
+
scroll-margin-top: 2rem;
|
|
1461
|
+
}
|
|
1462
|
+
|
|
1463
|
+
.single-content sup:target .footnote-ref {
|
|
1464
|
+
background: var(--surface);
|
|
1465
|
+
box-shadow: 0 0 0 2px var(--footnote-marker);
|
|
1466
|
+
}
|
|
1467
|
+
|
|
1468
|
+
.single-content .footnotes {
|
|
1469
|
+
margin-top: 3rem;
|
|
1470
|
+
padding-top: 1.5rem;
|
|
1471
|
+
border-top: 1px solid var(--border);
|
|
1472
|
+
font-size: 0.85rem;
|
|
1473
|
+
color: var(--text-muted);
|
|
1474
|
+
}
|
|
1475
|
+
|
|
1476
|
+
.single-content .footnotes::before {
|
|
1477
|
+
content: "Footnotes";
|
|
1478
|
+
display: block;
|
|
1479
|
+
font-family: var(--font-display);
|
|
1480
|
+
font-size: 1.05rem;
|
|
1481
|
+
font-weight: 600;
|
|
1482
|
+
letter-spacing: 0.08em;
|
|
1483
|
+
text-transform: uppercase;
|
|
1484
|
+
color: var(--text);
|
|
1485
|
+
margin-bottom: 0.75rem;
|
|
1486
|
+
}
|
|
1487
|
+
|
|
1488
|
+
.single-content .footnotes hr {
|
|
1489
|
+
display: none;
|
|
1490
|
+
}
|
|
1491
|
+
|
|
1492
|
+
.single-content .footnotes ol {
|
|
1493
|
+
margin: 0 0 0 1.5rem;
|
|
1494
|
+
}
|
|
1495
|
+
|
|
1496
|
+
.single-content .footnotes li {
|
|
1497
|
+
margin-bottom: 0.5rem;
|
|
1498
|
+
padding: 0.2rem 0.5rem;
|
|
1499
|
+
border-radius: 3px;
|
|
1500
|
+
scroll-margin-top: 2rem;
|
|
1501
|
+
}
|
|
1502
|
+
|
|
1503
|
+
.single-content .footnotes ol > li::marker {
|
|
1504
|
+
color: var(--footnote-marker);
|
|
1505
|
+
font-weight: 700;
|
|
1506
|
+
}
|
|
1507
|
+
|
|
1508
|
+
.single-content .footnotes li:target {
|
|
1509
|
+
background: var(--surface);
|
|
1510
|
+
outline: 1px solid var(--border-light);
|
|
1511
|
+
}
|
|
1512
|
+
|
|
1513
|
+
.single-content .footnotes li p {
|
|
1514
|
+
margin-bottom: 0.4rem;
|
|
1515
|
+
}
|
|
1516
|
+
|
|
1517
|
+
.single-content .footnotes li > :last-child {
|
|
1518
|
+
margin-bottom: 0;
|
|
1519
|
+
}
|
|
1520
|
+
|
|
1521
|
+
.single-content .footnote-backref {
|
|
1522
|
+
color: var(--footnote-marker);
|
|
1523
|
+
padding: 0.25em 0.35em;
|
|
1524
|
+
border-radius: 3px;
|
|
1525
|
+
border-bottom: none;
|
|
1526
|
+
}
|
|
1527
|
+
|
|
1528
|
+
.single-content .footnote-backref:hover {
|
|
1529
|
+
color: var(--footnote-marker);
|
|
1530
|
+
background: var(--surface);
|
|
1531
|
+
}
|
|
1532
|
+
|
|
1533
|
+
/* The theme styles no other focus ring, so these carry their own: both links
|
|
1534
|
+
are small, and the ring is the only thing marking where the keyboard is. */
|
|
1535
|
+
.single-content .footnote-ref:focus-visible,
|
|
1536
|
+
.single-content .footnote-backref:focus-visible {
|
|
1537
|
+
outline: 2px solid var(--footnote-marker);
|
|
1538
|
+
outline-offset: 2px;
|
|
1539
|
+
background: var(--surface);
|
|
1540
|
+
}
|
|
1541
|
+
|
|
1542
|
+
|
|
1543
|
+
/* ---- External URL shortcode ---- */
|
|
1544
|
+
|
|
1545
|
+
.exturl {
|
|
1546
|
+
display: inline-flex;
|
|
1547
|
+
align-items: center;
|
|
1548
|
+
gap: 0.4rem;
|
|
1549
|
+
}
|
|
1550
|
+
|
|
1551
|
+
.exturl-text {
|
|
1552
|
+
font-family: var(--font-mono);
|
|
1553
|
+
font-size: 0.85em;
|
|
1554
|
+
background: var(--surface);
|
|
1555
|
+
padding: 0.15em 0.5em;
|
|
1556
|
+
border-radius: 3px;
|
|
1557
|
+
border: 1px solid var(--border);
|
|
1558
|
+
color: var(--text-muted);
|
|
1559
|
+
word-break: break-all;
|
|
1560
|
+
}
|
|
1561
|
+
|
|
1562
|
+
.exturl-copy {
|
|
1563
|
+
display: inline-flex;
|
|
1564
|
+
align-items: center;
|
|
1565
|
+
justify-content: center;
|
|
1566
|
+
background: none;
|
|
1567
|
+
border: 1px solid var(--border);
|
|
1568
|
+
border-radius: 3px;
|
|
1569
|
+
padding: 0.3em;
|
|
1570
|
+
cursor: pointer;
|
|
1571
|
+
color: var(--text-muted);
|
|
1572
|
+
transition: color 0.2s, border-color 0.2s;
|
|
1573
|
+
flex-shrink: 0;
|
|
1574
|
+
}
|
|
1575
|
+
|
|
1576
|
+
.exturl-copy:hover {
|
|
1577
|
+
color: var(--accent);
|
|
1578
|
+
border-color: var(--accent-dim);
|
|
1579
|
+
}
|
|
1580
|
+
|
|
1581
|
+
.exturl-copy .exturl-check {
|
|
1582
|
+
display: none;
|
|
1583
|
+
}
|
|
1584
|
+
|
|
1585
|
+
.exturl-copy.copied .exturl-icon {
|
|
1586
|
+
display: none;
|
|
1587
|
+
}
|
|
1588
|
+
|
|
1589
|
+
.exturl-copy.copied .exturl-check {
|
|
1590
|
+
display: block;
|
|
1591
|
+
color: #4caf50;
|
|
1592
|
+
}
|
|
1593
|
+
|
|
1594
|
+
/* ---- Unresolved link ----
|
|
1595
|
+
|
|
1596
|
+
A wikilink whose target no package publishes. The content builds keep the
|
|
1597
|
+
author's text — dropping it would rewrite the sentence — and wrap it in this
|
|
1598
|
+
class so a reader can tell something was meant to be a link and an author can
|
|
1599
|
+
find it. Without a rule here the span arrives styled as body text, so the
|
|
1600
|
+
marking exists in the HTML and communicates nothing.
|
|
1601
|
+
|
|
1602
|
+
Not signalled by hue alone: the dotted underline carries it for a reader who
|
|
1603
|
+
cannot separate the colour from surrounding text, and `cursor: help` hints at
|
|
1604
|
+
the title, which names the address that failed to resolve.
|
|
1605
|
+
|
|
1606
|
+
Single-mode dark, deliberately. The Foundry system's copy of this rule uses
|
|
1607
|
+
light-dark(), which is right there because Foundry drives its themes through
|
|
1608
|
+
color-scheme; this theme sets none, so light-dark() would resolve to the light
|
|
1609
|
+
value and render the marker at about 2.5:1 — a marker nobody can see. */
|
|
1610
|
+
|
|
1611
|
+
.sohl-unresolved-link {
|
|
1612
|
+
font-weight: 700;
|
|
1613
|
+
color: var(--unresolved-link);
|
|
1614
|
+
text-decoration: underline dotted currentcolor;
|
|
1615
|
+
text-underline-offset: 0.15em;
|
|
1616
|
+
cursor: help;
|
|
1617
|
+
}
|
|
1618
|
+
|
|
1619
|
+
/* ---- Draft link ----
|
|
1620
|
+
|
|
1621
|
+
A wikilink whose target exists but is not written yet. The content builds
|
|
1622
|
+
wrap the resolved link in this class and leave the link itself alone, so it
|
|
1623
|
+
still goes where it says; without a rule here it arrives styled as body text
|
|
1624
|
+
and the marking communicates nothing.
|
|
1625
|
+
|
|
1626
|
+
Deliberately not the unresolved marking. An unresolved link's target does
|
|
1627
|
+
not exist; a draft link's does and is simply unwritten, so the two must be
|
|
1628
|
+
tellable apart. This keeps the link's normal weight — it is a real link —
|
|
1629
|
+
and marks it in amber with a dashed underline, against the unresolved
|
|
1630
|
+
marker's bold red and dotted one. Not signalled by hue alone, for the same
|
|
1631
|
+
reason, and `cursor: help` hints at the title.
|
|
1632
|
+
|
|
1633
|
+
Single-mode dark, deliberately, as above: this theme sets no color-scheme,
|
|
1634
|
+
so a light-dark() value would resolve to its light half. */
|
|
1635
|
+
|
|
1636
|
+
.sohl-draft-link {
|
|
1637
|
+
color: var(--draft-link);
|
|
1638
|
+
text-decoration: underline dashed currentcolor;
|
|
1639
|
+
text-underline-offset: 0.15em;
|
|
1640
|
+
cursor: help;
|
|
1641
|
+
}
|
|
1642
|
+
|
|
1643
|
+
/* ---- The draft notice ----
|
|
1644
|
+
|
|
1645
|
+
A page's statement that its own content is not settled, at the head of the
|
|
1646
|
+
article. It is a statement about the document rather than a fact about the
|
|
1647
|
+
subject, which is why it sits above the infobox instead of inside it, and
|
|
1648
|
+
why it reads as apparatus rather than as prose.
|
|
1649
|
+
|
|
1650
|
+
Amber rather than grey. This theme is a single dark scheme — it sets no
|
|
1651
|
+
`color-scheme`, so a `light-dark()` value would resolve to its light half —
|
|
1652
|
+
and the grey tokens reach about 2.6:1 on `--bg-card`, which is not a mark
|
|
1653
|
+
anyone sees. `--draft-link` is already what draft means here, on links into
|
|
1654
|
+
a draft note, and the palette records it at 9.3:1 on this ground. The
|
|
1655
|
+
sentence itself sets in `--text`, so it reads as a statement rather than as
|
|
1656
|
+
decoration, and the whole thing is calm enough to carry on a page in every
|
|
1657
|
+
few without becoming wallpaper.
|
|
1658
|
+
|
|
1659
|
+
The mark is a notice, not a hazard, and it is the one part that can be
|
|
1660
|
+
absent: Font Awesome is a third-party stylesheet, and the sentence is
|
|
1661
|
+
written to stand without it. */
|
|
1662
|
+
|
|
1663
|
+
.draft-notice {
|
|
1664
|
+
display: flex;
|
|
1665
|
+
align-items: center;
|
|
1666
|
+
gap: 0.7rem;
|
|
1667
|
+
margin-bottom: 2rem;
|
|
1668
|
+
padding: 0.85rem 1.1rem;
|
|
1669
|
+
border: 1px solid var(--border);
|
|
1670
|
+
border-left: 3px solid var(--draft-link);
|
|
1671
|
+
border-radius: 4px;
|
|
1672
|
+
background: var(--bg-card);
|
|
1673
|
+
}
|
|
1674
|
+
|
|
1675
|
+
.draft-notice-icon {
|
|
1676
|
+
color: var(--draft-link);
|
|
1677
|
+
font-size: 1.4rem;
|
|
1678
|
+
flex: none;
|
|
1679
|
+
}
|
|
1680
|
+
|
|
1681
|
+
.draft-notice-text {
|
|
1682
|
+
color: var(--text);
|
|
1683
|
+
font-size: 0.94rem;
|
|
1684
|
+
line-height: 1.6;
|
|
1685
|
+
margin: 0;
|
|
1686
|
+
}
|
|
1687
|
+
|
|
1688
|
+
.draft-notice-label {
|
|
1689
|
+
color: var(--draft-link);
|
|
1690
|
+
font-family: var(--font-display);
|
|
1691
|
+
letter-spacing: 0.02em;
|
|
1692
|
+
}
|
|
1693
|
+
|
|
1694
|
+
/* The notice spans both columns of a two-column article, because it is about
|
|
1695
|
+
the whole page rather than about either column. A page carrying one moves
|
|
1696
|
+
its content and its rail to the second row; a page without one keeps the
|
|
1697
|
+
single row it has, so no page pays an empty track for a notice it does not
|
|
1698
|
+
carry. */
|
|
1699
|
+
.single.single-with-sidebar > .draft-notice,
|
|
1700
|
+
.single.single-with-toc > .draft-notice {
|
|
1701
|
+
grid-column: 1 / -1;
|
|
1702
|
+
grid-row: 1;
|
|
1703
|
+
}
|
|
1704
|
+
|
|
1705
|
+
.single.single-with-notice.single-with-sidebar > .single-content,
|
|
1706
|
+
.single.single-with-notice.single-with-sidebar > .info-rail {
|
|
1707
|
+
grid-row: 2;
|
|
1708
|
+
}
|
|
1709
|
+
|
|
1710
|
+
@media (max-width: 960px) {
|
|
1711
|
+
/* One column, so document order governs here as it does for the rail, and
|
|
1712
|
+
the notice is written first. */
|
|
1713
|
+
.single.single-with-sidebar > .draft-notice,
|
|
1714
|
+
.single.single-with-toc > .draft-notice,
|
|
1715
|
+
.single.single-with-notice.single-with-sidebar > .single-content,
|
|
1716
|
+
.single.single-with-notice.single-with-sidebar > .info-rail {
|
|
1717
|
+
grid-column: 1;
|
|
1718
|
+
grid-row: auto;
|
|
1719
|
+
}
|
|
1720
|
+
}
|
|
1721
|
+
|
|
1722
|
+
/* ---- Banners ---- */
|
|
1723
|
+
|
|
1724
|
+
.banner {
|
|
1725
|
+
font-family: var(--font-display);
|
|
1726
|
+
font-size: 1.6rem;
|
|
1727
|
+
font-weight: 700;
|
|
1728
|
+
letter-spacing: 0.08em;
|
|
1729
|
+
text-transform: uppercase;
|
|
1730
|
+
text-align: center;
|
|
1731
|
+
padding: 1rem 2rem;
|
|
1732
|
+
border-radius: 4px;
|
|
1733
|
+
margin-bottom: 2rem;
|
|
1734
|
+
}
|
|
1735
|
+
|
|
1736
|
+
.banner-coming-soon {
|
|
1737
|
+
background: linear-gradient(135deg, #1a2a3a, #2a3d52);
|
|
1738
|
+
border: 2px solid var(--gold-dim);
|
|
1739
|
+
color: var(--gold);
|
|
1740
|
+
}
|
|
1741
|
+
|
|
1742
|
+
/* ---- Prev/Next Navigation ---- */
|
|
1743
|
+
|
|
1744
|
+
.single-nav {
|
|
1745
|
+
display: flex;
|
|
1746
|
+
justify-content: space-between;
|
|
1747
|
+
padding: 1.5rem 0 3rem;
|
|
1748
|
+
border-top: 1px solid var(--border);
|
|
1749
|
+
font-size: 0.9rem;
|
|
1750
|
+
}
|
|
1751
|
+
|
|
1752
|
+
.nav-prev,
|
|
1753
|
+
.nav-next {
|
|
1754
|
+
color: var(--text-muted);
|
|
1755
|
+
}
|
|
1756
|
+
|
|
1757
|
+
.nav-prev:hover,
|
|
1758
|
+
.nav-next:hover {
|
|
1759
|
+
color: var(--accent);
|
|
1760
|
+
}
|
|
1761
|
+
|
|
1762
|
+
/* ---- Footer ---- */
|
|
1763
|
+
|
|
1764
|
+
.site-footer {
|
|
1765
|
+
margin-top: auto;
|
|
1766
|
+
border-top: 1px solid var(--border-light);
|
|
1767
|
+
background: var(--bg-deeper);
|
|
1768
|
+
}
|
|
1769
|
+
|
|
1770
|
+
.footer-inner {
|
|
1771
|
+
max-width: var(--content-width);
|
|
1772
|
+
margin: 0 auto;
|
|
1773
|
+
padding: 2rem 2rem;
|
|
1774
|
+
display: flex;
|
|
1775
|
+
align-items: center;
|
|
1776
|
+
justify-content: space-between;
|
|
1777
|
+
flex-wrap: wrap;
|
|
1778
|
+
gap: 1.25rem;
|
|
1779
|
+
}
|
|
1780
|
+
|
|
1781
|
+
.footer-text {
|
|
1782
|
+
color: var(--text-muted);
|
|
1783
|
+
font-size: 0.92rem;
|
|
1784
|
+
line-height: 1.5;
|
|
1785
|
+
}
|
|
1786
|
+
|
|
1787
|
+
.footer-text a {
|
|
1788
|
+
color: var(--text);
|
|
1789
|
+
}
|
|
1790
|
+
|
|
1791
|
+
.footer-text a:hover {
|
|
1792
|
+
color: var(--accent);
|
|
1793
|
+
}
|
|
1794
|
+
|
|
1795
|
+
.footer-links {
|
|
1796
|
+
display: flex;
|
|
1797
|
+
gap: 1.5rem;
|
|
1798
|
+
align-items: center;
|
|
1799
|
+
}
|
|
1800
|
+
|
|
1801
|
+
.footer-links a {
|
|
1802
|
+
color: var(--text-muted);
|
|
1803
|
+
font-size: 0.95rem;
|
|
1804
|
+
display: flex;
|
|
1805
|
+
align-items: center;
|
|
1806
|
+
gap: 0.5rem;
|
|
1807
|
+
}
|
|
1808
|
+
|
|
1809
|
+
.footer-links a:hover {
|
|
1810
|
+
color: var(--accent);
|
|
1811
|
+
}
|
|
1812
|
+
|
|
1813
|
+
.cc-badge {
|
|
1814
|
+
height: 1.75rem;
|
|
1815
|
+
display: inline-block;
|
|
1816
|
+
vertical-align: middle;
|
|
1817
|
+
}
|
|
1818
|
+
|
|
1819
|
+
/* ---- Responsive ---- */
|
|
1820
|
+
|
|
1821
|
+
@media (max-width: 768px) {
|
|
1822
|
+
html {
|
|
1823
|
+
font-size: 16px;
|
|
1824
|
+
}
|
|
1825
|
+
|
|
1826
|
+
.nav-toggle {
|
|
1827
|
+
display: flex;
|
|
1828
|
+
}
|
|
1829
|
+
|
|
1830
|
+
.site-nav {
|
|
1831
|
+
display: none;
|
|
1832
|
+
position: absolute;
|
|
1833
|
+
top: 100%;
|
|
1834
|
+
left: 0;
|
|
1835
|
+
right: 0;
|
|
1836
|
+
background: var(--bg-deeper);
|
|
1837
|
+
border-bottom: 1px solid var(--border);
|
|
1838
|
+
flex-direction: column;
|
|
1839
|
+
padding: 1rem 2rem;
|
|
1840
|
+
gap: 0.5rem;
|
|
1841
|
+
}
|
|
1842
|
+
|
|
1843
|
+
.site-nav.open {
|
|
1844
|
+
display: flex;
|
|
1845
|
+
}
|
|
1846
|
+
|
|
1847
|
+
.dropdown-menu {
|
|
1848
|
+
position: static;
|
|
1849
|
+
border: none;
|
|
1850
|
+
box-shadow: none;
|
|
1851
|
+
padding-left: 1rem;
|
|
1852
|
+
margin-top: 0;
|
|
1853
|
+
}
|
|
1854
|
+
|
|
1855
|
+
.nav-dropdown:hover .dropdown-menu {
|
|
1856
|
+
display: none;
|
|
1857
|
+
}
|
|
1858
|
+
|
|
1859
|
+
.site-nav.open .nav-dropdown .dropdown-menu {
|
|
1860
|
+
display: block;
|
|
1861
|
+
}
|
|
1862
|
+
|
|
1863
|
+
.header-inner {
|
|
1864
|
+
position: relative;
|
|
1865
|
+
}
|
|
1866
|
+
|
|
1867
|
+
.hero h1 {
|
|
1868
|
+
font-size: 2.2rem;
|
|
1869
|
+
}
|
|
1870
|
+
|
|
1871
|
+
.hero {
|
|
1872
|
+
padding: 3rem 1.5rem 2.5rem;
|
|
1873
|
+
}
|
|
1874
|
+
|
|
1875
|
+
.home-sections {
|
|
1876
|
+
padding: 2rem 1.5rem 3rem;
|
|
1877
|
+
}
|
|
1878
|
+
|
|
1879
|
+
.home-grid {
|
|
1880
|
+
grid-template-columns: 1fr;
|
|
1881
|
+
}
|
|
1882
|
+
|
|
1883
|
+
.home-featured {
|
|
1884
|
+
grid-template-columns: 1fr;
|
|
1885
|
+
}
|
|
1886
|
+
|
|
1887
|
+
.home-section-title {
|
|
1888
|
+
grid-column: auto;
|
|
1889
|
+
grid-row: auto;
|
|
1890
|
+
}
|
|
1891
|
+
|
|
1892
|
+
.home-card--kb,
|
|
1893
|
+
.home-card--api,
|
|
1894
|
+
.home-card--thalorna {
|
|
1895
|
+
grid-column: auto;
|
|
1896
|
+
grid-row: auto;
|
|
1897
|
+
}
|
|
1898
|
+
|
|
1899
|
+
.single-header h1 {
|
|
1900
|
+
font-size: 1.8rem;
|
|
1901
|
+
}
|
|
1902
|
+
|
|
1903
|
+
.footer-inner {
|
|
1904
|
+
flex-direction: column;
|
|
1905
|
+
text-align: center;
|
|
1906
|
+
}
|
|
1907
|
+
}
|
|
1908
|
+
|
|
1909
|
+
/* ---- Single Meta (date + tags) ---- */
|
|
1910
|
+
|
|
1911
|
+
.single-meta {
|
|
1912
|
+
padding: 1rem 0 1.5rem;
|
|
1913
|
+
border-bottom: 1px solid var(--border);
|
|
1914
|
+
margin-bottom: 2rem;
|
|
1915
|
+
}
|
|
1916
|
+
|
|
1917
|
+
.single-meta .single-date {
|
|
1918
|
+
margin-top: 0;
|
|
1919
|
+
}
|
|
1920
|
+
|
|
1921
|
+
.single-subtype {
|
|
1922
|
+
display: inline-block;
|
|
1923
|
+
margin-right: 0.75rem;
|
|
1924
|
+
color: var(--text-muted);
|
|
1925
|
+
font-size: 0.75rem;
|
|
1926
|
+
}
|
|
1927
|
+
|
|
1928
|
+
.single-meta .single-tags {
|
|
1929
|
+
margin-top: 0.5rem;
|
|
1930
|
+
}
|
|
1931
|
+
|
|
1932
|
+
/* ---- Single Page with Sidebar (two-column layout) ---- */
|
|
1933
|
+
|
|
1934
|
+
.single.single-with-sidebar {
|
|
1935
|
+
display: grid;
|
|
1936
|
+
/* Sidebar capped at 1/3 of the viewport so prose stays readable on wide
|
|
1937
|
+
screens, but never narrower than 330px or wider than 470px. */
|
|
1938
|
+
grid-template-columns: minmax(0, 1fr) clamp(330px, 33vw, 470px);
|
|
1939
|
+
gap: 3rem;
|
|
1940
|
+
align-items: start;
|
|
1941
|
+
padding-top: 2rem;
|
|
1942
|
+
}
|
|
1943
|
+
|
|
1944
|
+
.single.single-with-sidebar .single-content {
|
|
1945
|
+
min-width: 0;
|
|
1946
|
+
}
|
|
1947
|
+
|
|
1948
|
+
/* The rail is written first in the markup, because the infobox is content
|
|
1949
|
+
prepended before the prose. Placing both children explicitly puts it on the
|
|
1950
|
+
right of a wide screen without moving it in the document. */
|
|
1951
|
+
.single.single-with-sidebar > .single-content {
|
|
1952
|
+
grid-column: 1;
|
|
1953
|
+
grid-row: 1;
|
|
1954
|
+
}
|
|
1955
|
+
|
|
1956
|
+
.single.single-with-sidebar > .info-rail {
|
|
1957
|
+
grid-column: 2;
|
|
1958
|
+
grid-row: 1;
|
|
1959
|
+
}
|
|
1960
|
+
|
|
1961
|
+
@media (max-width: 960px) {
|
|
1962
|
+
.single.single-with-sidebar {
|
|
1963
|
+
grid-template-columns: 1fr;
|
|
1964
|
+
gap: 2rem;
|
|
1965
|
+
}
|
|
1966
|
+
|
|
1967
|
+
/* One column, so document order governs and the boxes sit above the prose
|
|
1968
|
+
they summarise. */
|
|
1969
|
+
.single.single-with-sidebar > .single-content,
|
|
1970
|
+
.single.single-with-sidebar > .info-rail {
|
|
1971
|
+
grid-column: 1;
|
|
1972
|
+
grid-row: auto;
|
|
1973
|
+
}
|
|
1974
|
+
}
|
|
1975
|
+
|
|
1976
|
+
/* ---- The infobox rail ----
|
|
1977
|
+
|
|
1978
|
+
Holds a page's boxes, and its contents list beneath them where it has one.
|
|
1979
|
+
The rail is what sticks; the panels inside it stack and scroll with it,
|
|
1980
|
+
which is what lets several boxes share one column without each of them
|
|
1981
|
+
fighting for the same sticky offset. */
|
|
1982
|
+
|
|
1983
|
+
.info-rail {
|
|
1984
|
+
display: flex;
|
|
1985
|
+
flex-direction: column;
|
|
1986
|
+
gap: 1.25rem;
|
|
1987
|
+
min-width: 0;
|
|
1988
|
+
align-self: start;
|
|
1989
|
+
position: sticky;
|
|
1990
|
+
top: 2rem;
|
|
1991
|
+
}
|
|
1992
|
+
|
|
1993
|
+
/* A panel in the rail fills the column and leaves the sticking to the rail.
|
|
1994
|
+
`align-self` is the rail's cross axis here, so a box that keeps the
|
|
1995
|
+
grid-item value collapses to the width of its own title when closed. */
|
|
1996
|
+
.info-rail > .info-sidebar,
|
|
1997
|
+
.info-rail > .toc {
|
|
1998
|
+
position: static;
|
|
1999
|
+
top: auto;
|
|
2000
|
+
align-self: stretch;
|
|
2001
|
+
}
|
|
2002
|
+
|
|
2003
|
+
@media (max-width: 960px) {
|
|
2004
|
+
.info-rail {
|
|
2005
|
+
position: static;
|
|
2006
|
+
}
|
|
2007
|
+
}
|
|
2008
|
+
|
|
2009
|
+
/* ---- Info Sidebar ---- */
|
|
2010
|
+
|
|
2011
|
+
.info-sidebar {
|
|
2012
|
+
background: var(--bg-card);
|
|
2013
|
+
border: 1px solid var(--border);
|
|
2014
|
+
border-radius: 0.5rem;
|
|
2015
|
+
padding: 1.5rem 1.5rem 1.75rem;
|
|
2016
|
+
align-self: start;
|
|
2017
|
+
position: sticky;
|
|
2018
|
+
top: 2rem;
|
|
2019
|
+
font-family: var(--font-body);
|
|
2020
|
+
font-size: 1rem;
|
|
2021
|
+
}
|
|
2022
|
+
|
|
2023
|
+
/* The box's header band, and the control that opens and closes it. A box is a
|
|
2024
|
+
native `<details>` disclosure, so the affordance costs no JavaScript; the
|
|
2025
|
+
chevron replaces the browser's own marker, which a centred title cannot
|
|
2026
|
+
accommodate. */
|
|
2027
|
+
.info-sidebar-title {
|
|
2028
|
+
margin: 0 0 1rem;
|
|
2029
|
+
padding: 0.5rem 0;
|
|
2030
|
+
text-align: center;
|
|
2031
|
+
border-bottom: 1px solid var(--border);
|
|
2032
|
+
}
|
|
2033
|
+
|
|
2034
|
+
summary.info-sidebar-title {
|
|
2035
|
+
display: flex;
|
|
2036
|
+
align-items: center;
|
|
2037
|
+
justify-content: center;
|
|
2038
|
+
gap: 0.6rem;
|
|
2039
|
+
cursor: pointer;
|
|
2040
|
+
list-style: none;
|
|
2041
|
+
}
|
|
2042
|
+
|
|
2043
|
+
summary.info-sidebar-title::-webkit-details-marker {
|
|
2044
|
+
display: none;
|
|
2045
|
+
}
|
|
2046
|
+
|
|
2047
|
+
summary.info-sidebar-title::after {
|
|
2048
|
+
content: "";
|
|
2049
|
+
width: 0.45rem;
|
|
2050
|
+
height: 0.45rem;
|
|
2051
|
+
border-right: 2px solid var(--text-muted);
|
|
2052
|
+
border-bottom: 2px solid var(--text-muted);
|
|
2053
|
+
transform: translateY(-0.15em) rotate(45deg);
|
|
2054
|
+
transition: transform 0.15s ease;
|
|
2055
|
+
}
|
|
2056
|
+
|
|
2057
|
+
.info-sidebar[open] > summary.info-sidebar-title::after {
|
|
2058
|
+
transform: translateY(0.1em) rotate(-135deg);
|
|
2059
|
+
}
|
|
2060
|
+
|
|
2061
|
+
/* Closed, a box is one line: no rule under the title and nothing below it, so
|
|
2062
|
+
a note box and one box per system stack as three headings. */
|
|
2063
|
+
.info-sidebar:not([open]) > summary.info-sidebar-title {
|
|
2064
|
+
margin-bottom: 0;
|
|
2065
|
+
border-bottom: 0;
|
|
2066
|
+
}
|
|
2067
|
+
|
|
2068
|
+
.info-sidebar-title h2 {
|
|
2069
|
+
font-family: var(--font-display);
|
|
2070
|
+
font-size: 1.25rem;
|
|
2071
|
+
font-weight: 700;
|
|
2072
|
+
color: var(--text);
|
|
2073
|
+
margin: 0;
|
|
2074
|
+
letter-spacing: 0.04em;
|
|
2075
|
+
}
|
|
2076
|
+
|
|
2077
|
+
/* What a box says in place of its sections when it has nothing to show. It is
|
|
2078
|
+
a statement about the note, not a missing field, so it is drawn rather than
|
|
2079
|
+
dropped. */
|
|
2080
|
+
.info-statement {
|
|
2081
|
+
margin: 0;
|
|
2082
|
+
color: var(--text-muted);
|
|
2083
|
+
font-style: italic;
|
|
2084
|
+
}
|
|
2085
|
+
|
|
2086
|
+
/* Compact label/value list at the top of the profile */
|
|
2087
|
+
.info-profile-grid {
|
|
2088
|
+
display: grid;
|
|
2089
|
+
grid-template-columns: max-content 1fr;
|
|
2090
|
+
gap: 0.35rem 0.75rem;
|
|
2091
|
+
margin: 0 0 1rem;
|
|
2092
|
+
align-items: baseline;
|
|
2093
|
+
}
|
|
2094
|
+
|
|
2095
|
+
.info-profile-grid dt {
|
|
2096
|
+
color: var(--text-muted);
|
|
2097
|
+
font-weight: 600;
|
|
2098
|
+
font-size: 0.78rem;
|
|
2099
|
+
text-transform: uppercase;
|
|
2100
|
+
letter-spacing: 0.06em;
|
|
2101
|
+
padding-top: 0.1rem;
|
|
2102
|
+
}
|
|
2103
|
+
|
|
2104
|
+
.info-profile-grid dd {
|
|
2105
|
+
color: var(--text);
|
|
2106
|
+
margin: 0;
|
|
2107
|
+
line-height: 1.35;
|
|
2108
|
+
min-width: 0;
|
|
2109
|
+
}
|
|
2110
|
+
|
|
2111
|
+
/* The grid carries its own trailing space when it stands alone; inside a
|
|
2112
|
+
section the spacing between sections owns it. */
|
|
2113
|
+
.info-section > .info-profile-grid:last-child {
|
|
2114
|
+
margin-bottom: 0;
|
|
2115
|
+
}
|
|
2116
|
+
|
|
2117
|
+
.info-profile-grid .info-sub {
|
|
2118
|
+
color: var(--text-muted);
|
|
2119
|
+
font-size: 0.85em;
|
|
2120
|
+
font-style: italic;
|
|
2121
|
+
}
|
|
2122
|
+
|
|
2123
|
+
/* Composed appearance sentence */
|
|
2124
|
+
.info-appearance {
|
|
2125
|
+
margin: 0 0 1.25rem;
|
|
2126
|
+
padding-bottom: 1.25rem;
|
|
2127
|
+
border-bottom: 1px solid var(--border);
|
|
2128
|
+
color: var(--text);
|
|
2129
|
+
line-height: 1.45;
|
|
2130
|
+
font-size: 0.88rem;
|
|
2131
|
+
}
|
|
2132
|
+
|
|
2133
|
+
.info-label {
|
|
2134
|
+
color: var(--text-muted);
|
|
2135
|
+
font-weight: 600;
|
|
2136
|
+
font-size: 0.78rem;
|
|
2137
|
+
text-transform: uppercase;
|
|
2138
|
+
letter-spacing: 0.06em;
|
|
2139
|
+
margin-right: 0.3rem;
|
|
2140
|
+
}
|
|
2141
|
+
|
|
2142
|
+
/* ---- Sections (Attributes, Skills) ---- */
|
|
2143
|
+
|
|
2144
|
+
.info-section + .info-section {
|
|
2145
|
+
margin-top: 1.25rem;
|
|
2146
|
+
}
|
|
2147
|
+
|
|
2148
|
+
.info-section-title {
|
|
2149
|
+
font-family: var(--font-display);
|
|
2150
|
+
font-size: 1rem;
|
|
2151
|
+
font-weight: 700;
|
|
2152
|
+
color: var(--text);
|
|
2153
|
+
margin: 0 0 0.65rem;
|
|
2154
|
+
letter-spacing: 0.06em;
|
|
2155
|
+
text-transform: uppercase;
|
|
2156
|
+
border-bottom: 1px solid var(--border);
|
|
2157
|
+
padding-bottom: 0.3rem;
|
|
2158
|
+
}
|
|
2159
|
+
|
|
2160
|
+
/* Attributes — auto-fit grid of inline label/value pairs */
|
|
2161
|
+
.info-attrs-grid {
|
|
2162
|
+
display: grid;
|
|
2163
|
+
grid-template-columns: repeat(auto-fit, minmax(76px, 1fr));
|
|
2164
|
+
gap: 0.35rem 0.85rem;
|
|
2165
|
+
}
|
|
2166
|
+
|
|
2167
|
+
.info-attr {
|
|
2168
|
+
display: flex;
|
|
2169
|
+
justify-content: space-between;
|
|
2170
|
+
align-items: baseline;
|
|
2171
|
+
gap: 0.35rem;
|
|
2172
|
+
}
|
|
2173
|
+
|
|
2174
|
+
.attr-label {
|
|
2175
|
+
font-weight: 700;
|
|
2176
|
+
font-size: 0.76rem;
|
|
2177
|
+
letter-spacing: 0.06em;
|
|
2178
|
+
color: var(--text);
|
|
2179
|
+
}
|
|
2180
|
+
|
|
2181
|
+
.attr-value {
|
|
2182
|
+
font-variant-numeric: tabular-nums;
|
|
2183
|
+
font-weight: 500;
|
|
2184
|
+
color: var(--text);
|
|
2185
|
+
}
|
|
2186
|
+
|
|
2187
|
+
.info-missing {
|
|
2188
|
+
color: var(--text-muted);
|
|
2189
|
+
}
|
|
2190
|
+
|
|
2191
|
+
/* Skills — one paragraph per category, small-caps inline list */
|
|
2192
|
+
.info-skill-line {
|
|
2193
|
+
margin: 0 0 0.5rem;
|
|
2194
|
+
font-size: 0.85rem;
|
|
2195
|
+
line-height: 1.5;
|
|
2196
|
+
color: var(--text);
|
|
2197
|
+
}
|
|
2198
|
+
|
|
2199
|
+
.info-skill-line:last-child {
|
|
2200
|
+
margin-bottom: 0;
|
|
2201
|
+
}
|
|
2202
|
+
|
|
2203
|
+
.skill-cat {
|
|
2204
|
+
font-weight: 700;
|
|
2205
|
+
color: var(--text);
|
|
2206
|
+
margin-right: 0.25rem;
|
|
2207
|
+
}
|
|
2208
|
+
|
|
2209
|
+
.skill-entries {
|
|
2210
|
+
font-variant: small-caps;
|
|
2211
|
+
letter-spacing: 0.02em;
|
|
2212
|
+
color: var(--text-muted);
|
|
2213
|
+
}
|
|
2214
|
+
|
|
2215
|
+
.skill-entry em {
|
|
2216
|
+
font-style: normal;
|
|
2217
|
+
font-weight: 600;
|
|
2218
|
+
font-variant: normal;
|
|
2219
|
+
font-variant-numeric: tabular-nums;
|
|
2220
|
+
color: var(--text);
|
|
2221
|
+
}
|
|
2222
|
+
|
|
2223
|
+
/* Spells / Arcane Talents — stacked list, one ability per line */
|
|
2224
|
+
.info-mystical-list {
|
|
2225
|
+
list-style: none;
|
|
2226
|
+
padding: 0;
|
|
2227
|
+
margin: 0;
|
|
2228
|
+
}
|
|
2229
|
+
|
|
2230
|
+
.info-mystical-item {
|
|
2231
|
+
font-size: 0.85rem;
|
|
2232
|
+
line-height: 1.45;
|
|
2233
|
+
color: var(--text);
|
|
2234
|
+
margin: 0 0 0.3rem;
|
|
2235
|
+
}
|
|
2236
|
+
|
|
2237
|
+
.info-mystical-item:last-child {
|
|
2238
|
+
margin-bottom: 0;
|
|
2239
|
+
}
|
|
2240
|
+
|
|
2241
|
+
.mystical-domain {
|
|
2242
|
+
color: var(--text-muted);
|
|
2243
|
+
font-style: italic;
|
|
2244
|
+
}
|
|
2245
|
+
|
|
2246
|
+
.mystical-sep {
|
|
2247
|
+
color: var(--text-muted);
|
|
2248
|
+
}
|
|
2249
|
+
|
|
2250
|
+
.mystical-name {
|
|
2251
|
+
font-weight: 600;
|
|
2252
|
+
color: var(--text);
|
|
2253
|
+
}
|
|
2254
|
+
|
|
2255
|
+
.info-mystical-item a {
|
|
2256
|
+
color: inherit;
|
|
2257
|
+
text-decoration: none;
|
|
2258
|
+
border-bottom: 1px dotted var(--text-muted);
|
|
2259
|
+
}
|
|
2260
|
+
|
|
2261
|
+
.info-mystical-item a:hover {
|
|
2262
|
+
color: var(--accent, var(--text));
|
|
2263
|
+
border-bottom-style: solid;
|
|
2264
|
+
}
|
|
2265
|
+
|
|
2266
|
+
/* Equipment — one paragraph per subgroup (Weapons, Armor, …), mirrors Skills */
|
|
2267
|
+
.info-gear-line {
|
|
2268
|
+
margin: 0 0 0.5rem;
|
|
2269
|
+
font-size: 0.85rem;
|
|
2270
|
+
line-height: 1.5;
|
|
2271
|
+
color: var(--text);
|
|
2272
|
+
}
|
|
2273
|
+
|
|
2274
|
+
.info-gear-line:last-child {
|
|
2275
|
+
margin-bottom: 0;
|
|
2276
|
+
}
|
|
2277
|
+
|
|
2278
|
+
.gear-cat {
|
|
2279
|
+
font-weight: 700;
|
|
2280
|
+
color: var(--text);
|
|
2281
|
+
margin-right: 0.25rem;
|
|
2282
|
+
}
|
|
2283
|
+
|
|
2284
|
+
.gear-entries {
|
|
2285
|
+
color: var(--text-muted);
|
|
2286
|
+
}
|
|
2287
|
+
|
|
2288
|
+
.gear-entry {
|
|
2289
|
+
color: var(--text);
|
|
2290
|
+
}
|
|
2291
|
+
|
|
2292
|
+
.info-gear-line a.gear-entry {
|
|
2293
|
+
color: inherit;
|
|
2294
|
+
text-decoration: none;
|
|
2295
|
+
border-bottom: 1px dotted var(--text-muted);
|
|
2296
|
+
}
|
|
2297
|
+
|
|
2298
|
+
.info-gear-line a.gear-entry:hover {
|
|
2299
|
+
color: var(--accent, var(--text));
|
|
2300
|
+
border-bottom-style: solid;
|
|
2301
|
+
}
|
|
2302
|
+
|
|
2303
|
+
/* ---- Gear sidebar: armor protection B/E/P/F tiles, locations, traits,
|
|
2304
|
+
weapon strike-mode blocks ---- */
|
|
2305
|
+
|
|
2306
|
+
.info-protection-grid {
|
|
2307
|
+
display: grid;
|
|
2308
|
+
grid-template-columns: repeat(auto-fit, minmax(3.5rem, 1fr));
|
|
2309
|
+
gap: 0.4rem;
|
|
2310
|
+
}
|
|
2311
|
+
|
|
2312
|
+
.info-prot {
|
|
2313
|
+
display: flex;
|
|
2314
|
+
flex-direction: column;
|
|
2315
|
+
align-items: center;
|
|
2316
|
+
justify-content: center;
|
|
2317
|
+
padding: 0.35rem 0.25rem;
|
|
2318
|
+
border: 1px solid var(--border, rgba(0, 0, 0, 0.1));
|
|
2319
|
+
border-radius: 0.25rem;
|
|
2320
|
+
background: var(--bg-subtle, rgba(0, 0, 0, 0.02));
|
|
2321
|
+
}
|
|
2322
|
+
|
|
2323
|
+
.prot-label {
|
|
2324
|
+
font-size: 0.7rem;
|
|
2325
|
+
font-weight: 700;
|
|
2326
|
+
color: var(--text-muted);
|
|
2327
|
+
letter-spacing: 0.05em;
|
|
2328
|
+
line-height: 1;
|
|
2329
|
+
}
|
|
2330
|
+
|
|
2331
|
+
.prot-value {
|
|
2332
|
+
font-size: 1.05rem;
|
|
2333
|
+
font-weight: 600;
|
|
2334
|
+
font-variant-numeric: tabular-nums;
|
|
2335
|
+
color: var(--text);
|
|
2336
|
+
line-height: 1.2;
|
|
2337
|
+
margin-top: 0.15rem;
|
|
2338
|
+
}
|
|
2339
|
+
|
|
2340
|
+
.info-loc-list,
|
|
2341
|
+
.info-trait-list,
|
|
2342
|
+
.info-impact {
|
|
2343
|
+
margin: 0;
|
|
2344
|
+
font-size: 0.85rem;
|
|
2345
|
+
line-height: 1.5;
|
|
2346
|
+
color: var(--text);
|
|
2347
|
+
}
|
|
2348
|
+
|
|
2349
|
+
.info-trait-list {
|
|
2350
|
+
font-variant: small-caps;
|
|
2351
|
+
letter-spacing: 0.02em;
|
|
2352
|
+
color: var(--text-muted);
|
|
2353
|
+
}
|
|
2354
|
+
|
|
2355
|
+
.info-impact {
|
|
2356
|
+
font-variant-numeric: tabular-nums;
|
|
2357
|
+
font-weight: 600;
|
|
2358
|
+
}
|
|
2359
|
+
|
|
2360
|
+
.strike-mode-table {
|
|
2361
|
+
width: 100%;
|
|
2362
|
+
border-collapse: collapse;
|
|
2363
|
+
font-size: 0.9rem;
|
|
2364
|
+
line-height: 1.4;
|
|
2365
|
+
font-variant-numeric: tabular-nums;
|
|
2366
|
+
margin-top: 0.25rem;
|
|
2367
|
+
}
|
|
2368
|
+
|
|
2369
|
+
.strike-mode-table th,
|
|
2370
|
+
.strike-mode-table td {
|
|
2371
|
+
padding: 0.4rem 0.6rem;
|
|
2372
|
+
text-align: left;
|
|
2373
|
+
vertical-align: baseline;
|
|
2374
|
+
border-bottom: 1px solid var(--border, rgba(0, 0, 0, 0.08));
|
|
2375
|
+
white-space: nowrap;
|
|
2376
|
+
}
|
|
2377
|
+
|
|
2378
|
+
.strike-mode-table th:first-child,
|
|
2379
|
+
.strike-mode-table td:first-child {
|
|
2380
|
+
padding-left: 0;
|
|
2381
|
+
}
|
|
2382
|
+
|
|
2383
|
+
.strike-mode-table th:last-child,
|
|
2384
|
+
.strike-mode-table td:last-child {
|
|
2385
|
+
padding-right: 0;
|
|
2386
|
+
}
|
|
2387
|
+
|
|
2388
|
+
.strike-mode-table th {
|
|
2389
|
+
font-size: 0.78rem;
|
|
2390
|
+
font-weight: 700;
|
|
2391
|
+
color: var(--text-muted);
|
|
2392
|
+
letter-spacing: 0.05em;
|
|
2393
|
+
border-bottom: 1px solid var(--border, rgba(0, 0, 0, 0.2));
|
|
2394
|
+
}
|
|
2395
|
+
|
|
2396
|
+
.strike-mode-table tbody tr:last-child td {
|
|
2397
|
+
border-bottom: 0;
|
|
2398
|
+
}
|
|
2399
|
+
|
|
2400
|
+
.strike-mode-table td:first-child {
|
|
2401
|
+
font-weight: 600;
|
|
2402
|
+
}
|
|
2403
|
+
|
|
2404
|
+
@media (max-width: 960px) {
|
|
2405
|
+
.info-sidebar {
|
|
2406
|
+
position: static;
|
|
2407
|
+
}
|
|
2408
|
+
}
|
|
2409
|
+
|
|
2410
|
+
/* ---- Auto-listing (taxonomy, term, and auto-section index pages) ---- */
|
|
2411
|
+
|
|
2412
|
+
.page-list {
|
|
2413
|
+
list-style: none;
|
|
2414
|
+
margin: 1.5rem 0 0;
|
|
2415
|
+
padding: 0;
|
|
2416
|
+
display: flex;
|
|
2417
|
+
flex-direction: column;
|
|
2418
|
+
gap: 0.6rem;
|
|
2419
|
+
}
|
|
2420
|
+
|
|
2421
|
+
.page-list-item {
|
|
2422
|
+
display: flex;
|
|
2423
|
+
align-items: baseline;
|
|
2424
|
+
gap: 0.75rem;
|
|
2425
|
+
padding: 0.65rem 0.9rem;
|
|
2426
|
+
background: var(--bg-card);
|
|
2427
|
+
border: 1px solid var(--border);
|
|
2428
|
+
border-radius: 0.4rem;
|
|
2429
|
+
transition: border-color 0.15s ease, background 0.15s ease;
|
|
2430
|
+
}
|
|
2431
|
+
|
|
2432
|
+
.page-list-item:hover {
|
|
2433
|
+
border-color: var(--accent);
|
|
2434
|
+
background: var(--bg-card-hover, var(--bg-card));
|
|
2435
|
+
}
|
|
2436
|
+
|
|
2437
|
+
.page-list-title {
|
|
2438
|
+
font-family: var(--font-display);
|
|
2439
|
+
font-size: 1.05rem;
|
|
2440
|
+
font-weight: 600;
|
|
2441
|
+
color: var(--text);
|
|
2442
|
+
text-decoration: none;
|
|
2443
|
+
flex: 0 0 auto;
|
|
2444
|
+
}
|
|
2445
|
+
|
|
2446
|
+
.page-list-title:hover {
|
|
2447
|
+
color: var(--accent-hover);
|
|
2448
|
+
}
|
|
2449
|
+
|
|
2450
|
+
.page-list-desc {
|
|
2451
|
+
color: var(--text-muted);
|
|
2452
|
+
font-size: 0.9rem;
|
|
2453
|
+
font-style: italic;
|
|
2454
|
+
flex: 1 1 auto;
|
|
2455
|
+
}
|
|
2456
|
+
|
|
2457
|
+
.page-list-count {
|
|
2458
|
+
margin-left: auto;
|
|
2459
|
+
color: var(--text-muted);
|
|
2460
|
+
font-size: 0.82rem;
|
|
2461
|
+
font-variant-numeric: tabular-nums;
|
|
2462
|
+
background: var(--bg);
|
|
2463
|
+
border: 1px solid var(--border);
|
|
2464
|
+
padding: 0.05rem 0.5rem;
|
|
2465
|
+
border-radius: 999px;
|
|
2466
|
+
}
|
|
2467
|
+
|
|
2468
|
+
.page-list-empty {
|
|
2469
|
+
color: var(--text-muted);
|
|
2470
|
+
font-style: italic;
|
|
2471
|
+
margin: 1.5rem 0 0;
|
|
2472
|
+
}
|
|
2473
|
+
|
|
2474
|
+
/* ---- Table of contents (right rail) ---- */
|
|
2475
|
+
|
|
2476
|
+
/* Applied by single.html when a page has more than 3 H2s and no infobox
|
|
2477
|
+
rail — a page with both puts its contents list at the foot of that rail.
|
|
2478
|
+
Mirrors `.single-with-sidebar` with a narrower column. */
|
|
2479
|
+
.single.single-with-toc {
|
|
2480
|
+
display: grid;
|
|
2481
|
+
grid-template-columns: minmax(0, 1fr) clamp(200px, 22vw, 260px);
|
|
2482
|
+
gap: 3rem;
|
|
2483
|
+
align-items: start;
|
|
2484
|
+
padding-top: 2rem;
|
|
2485
|
+
}
|
|
2486
|
+
|
|
2487
|
+
.single.single-with-toc .single-content {
|
|
2488
|
+
min-width: 0;
|
|
2489
|
+
}
|
|
2490
|
+
|
|
2491
|
+
@media (max-width: 960px) {
|
|
2492
|
+
.single.single-with-toc {
|
|
2493
|
+
grid-template-columns: 1fr;
|
|
2494
|
+
gap: 2rem;
|
|
2495
|
+
}
|
|
2496
|
+
}
|
|
2497
|
+
|
|
2498
|
+
.toc {
|
|
2499
|
+
align-self: start;
|
|
2500
|
+
position: sticky;
|
|
2501
|
+
top: 2rem;
|
|
2502
|
+
font-family: var(--font-body);
|
|
2503
|
+
font-size: 0.88rem;
|
|
2504
|
+
/* Cap height to the viewport so long TOCs scroll independently. */
|
|
2505
|
+
max-height: calc(100vh - 4rem);
|
|
2506
|
+
overflow-y: auto;
|
|
2507
|
+
}
|
|
2508
|
+
|
|
2509
|
+
.toc-inner {
|
|
2510
|
+
border-left: 1px solid var(--border);
|
|
2511
|
+
padding: 0.25rem 0 0.25rem 1rem;
|
|
2512
|
+
}
|
|
2513
|
+
|
|
2514
|
+
.toc-label {
|
|
2515
|
+
font-family: var(--font-display);
|
|
2516
|
+
font-size: 0.78rem;
|
|
2517
|
+
font-weight: 700;
|
|
2518
|
+
text-transform: uppercase;
|
|
2519
|
+
letter-spacing: 0.08em;
|
|
2520
|
+
color: var(--text-muted);
|
|
2521
|
+
margin: 0 0 0.6rem;
|
|
2522
|
+
}
|
|
2523
|
+
|
|
2524
|
+
.toc ul,
|
|
2525
|
+
.toc ol {
|
|
2526
|
+
list-style: none;
|
|
2527
|
+
margin: 0;
|
|
2528
|
+
padding: 0;
|
|
2529
|
+
}
|
|
2530
|
+
|
|
2531
|
+
.toc li {
|
|
2532
|
+
margin: 0.25rem 0;
|
|
2533
|
+
line-height: 1.35;
|
|
2534
|
+
}
|
|
2535
|
+
|
|
2536
|
+
.toc a {
|
|
2537
|
+
color: var(--text-muted);
|
|
2538
|
+
border-bottom: none;
|
|
2539
|
+
display: block;
|
|
2540
|
+
padding: 0.1rem 0;
|
|
2541
|
+
}
|
|
2542
|
+
|
|
2543
|
+
.toc a:hover {
|
|
2544
|
+
color: var(--accent);
|
|
2545
|
+
}
|
|
2546
|
+
|
|
2547
|
+
/* Nested items (h3 under h2) indent and shrink. */
|
|
2548
|
+
.toc ul ul,
|
|
2549
|
+
.toc ol ol {
|
|
2550
|
+
margin-left: 0.75rem;
|
|
2551
|
+
margin-top: 0.15rem;
|
|
2552
|
+
border-left: 1px solid var(--border);
|
|
2553
|
+
padding-left: 0.6rem;
|
|
2554
|
+
}
|
|
2555
|
+
|
|
2556
|
+
.toc ul ul a,
|
|
2557
|
+
.toc ol ol a {
|
|
2558
|
+
font-size: 0.82rem;
|
|
2559
|
+
color: var(--text-dim);
|
|
2560
|
+
}
|
|
2561
|
+
|
|
2562
|
+
@media (max-width: 960px) {
|
|
2563
|
+
.toc {
|
|
2564
|
+
position: static;
|
|
2565
|
+
max-height: none;
|
|
2566
|
+
margin-top: 2rem;
|
|
2567
|
+
}
|
|
2568
|
+
|
|
2569
|
+
.toc-inner {
|
|
2570
|
+
border-left: none;
|
|
2571
|
+
border-top: 1px solid var(--border);
|
|
2572
|
+
padding: 1rem 0 0;
|
|
2573
|
+
}
|
|
2574
|
+
}
|
|
2575
|
+
|
|
2576
|
+
/* ---- Floated infoboxes (in-flow) ----
|
|
2577
|
+
|
|
2578
|
+
A box carrying .geo-infobox is floated to the left of the content column
|
|
2579
|
+
instead of sitting in the rail: prose wraps around it and it scrolls away
|
|
2580
|
+
with the page. It inherits the visual style of .info-sidebar so the card
|
|
2581
|
+
matches every other box, then undoes the rail's sticky positioning and
|
|
2582
|
+
size. The per-type hook classes (.polity-infobox and the rest) carry no
|
|
2583
|
+
rules of their own and are here for a consumer to hang one on. */
|
|
2584
|
+
|
|
2585
|
+
.geo-infobox,
|
|
2586
|
+
.polity-infobox,
|
|
2587
|
+
.region-infobox,
|
|
2588
|
+
.continent-infobox,
|
|
2589
|
+
.settlement-infobox {
|
|
2590
|
+
float: left;
|
|
2591
|
+
width: 19rem;
|
|
2592
|
+
max-width: 100%;
|
|
2593
|
+
box-sizing: border-box;
|
|
2594
|
+
margin: 0 1.75rem 1rem 0;
|
|
2595
|
+
/* Undo the sticky/grid behavior inherited from .info-sidebar. */
|
|
2596
|
+
position: static;
|
|
2597
|
+
top: auto;
|
|
2598
|
+
align-self: auto;
|
|
2599
|
+
font-size: 0.95rem;
|
|
2600
|
+
}
|
|
2601
|
+
|
|
2602
|
+
/* Tighten the profile grid a touch inside the floated card — the
|
|
2603
|
+
right-rail version has more room to breathe than a 19rem float. */
|
|
2604
|
+
.geo-infobox .info-profile-grid {
|
|
2605
|
+
grid-template-columns: max-content 1fr;
|
|
2606
|
+
gap: 0.3rem 0.6rem;
|
|
2607
|
+
margin-bottom: 0;
|
|
2608
|
+
}
|
|
2609
|
+
|
|
2610
|
+
.geo-infobox .info-profile-grid dd {
|
|
2611
|
+
word-break: normal;
|
|
2612
|
+
overflow-wrap: anywhere;
|
|
2613
|
+
}
|
|
2614
|
+
|
|
2615
|
+
.geo-infobox .info-sub {
|
|
2616
|
+
display: block;
|
|
2617
|
+
font-size: 0.82rem;
|
|
2618
|
+
color: var(--text-muted);
|
|
2619
|
+
margin-top: 0.1rem;
|
|
2620
|
+
line-height: 1.35;
|
|
2621
|
+
}
|
|
2622
|
+
|
|
2623
|
+
/* Stack the infobox above the prose on narrow viewports. */
|
|
2624
|
+
@media (max-width: 720px) {
|
|
2625
|
+
.geo-infobox,
|
|
2626
|
+
.polity-infobox,
|
|
2627
|
+
.region-infobox,
|
|
2628
|
+
.continent-infobox {
|
|
2629
|
+
float: none;
|
|
2630
|
+
width: 100%;
|
|
2631
|
+
margin: 0 0 1.25rem 0;
|
|
2632
|
+
}
|
|
2633
|
+
}
|
|
2634
|
+
|
|
2635
|
+
/* ---- Cartouches ----
|
|
2636
|
+
|
|
2637
|
+
Named-entity SVGs rendered as ornamental accents on culture-flavored
|
|
2638
|
+
pages (Ta'Kheperu, Kemetian gods, the Per-Aá). The default mode is a
|
|
2639
|
+
centered block figure. Modifiers:
|
|
2640
|
+
.cartouche-left / .cartouche-right — float so prose wraps around.
|
|
2641
|
+
.cartouche-inline — shrink and flow with text,
|
|
2642
|
+
useful when the cartouche IS
|
|
2643
|
+
the name being referenced. */
|
|
2644
|
+
|
|
2645
|
+
/* Jsesh-exported cartouches in vertical orientation are tall ovals
|
|
2646
|
+
(~1:2 wide:tall). Size them by HEIGHT — width derives from the
|
|
2647
|
+
SVG's aspect ratio. Per-call override comes from the shortcode's
|
|
2648
|
+
`height` parameter, which sets an inline style on the <img>. */
|
|
2649
|
+
|
|
2650
|
+
.cartouche {
|
|
2651
|
+
--cartouche-h: 10rem;
|
|
2652
|
+
display: block;
|
|
2653
|
+
margin: 1.5rem auto;
|
|
2654
|
+
text-align: center;
|
|
2655
|
+
line-height: 0; /* avoid extra strut under the <img> */
|
|
2656
|
+
/* Limestone-panel treatment: a warm radial gradient backdrop with
|
|
2657
|
+
an inset shadow suggests a plastered stone surface; the subtle
|
|
2658
|
+
outer shadow lifts the panel off the page like a framed relief.
|
|
2659
|
+
This is the single biggest visual shift from "SVG on white" to
|
|
2660
|
+
"cartouche carved into a wall." */
|
|
2661
|
+
background:
|
|
2662
|
+
radial-gradient(ellipse at 28% 22%, #f2e4c2 0%, #d9c29a 55%, #bda77c 100%);
|
|
2663
|
+
padding: 0.5em 1em;
|
|
2664
|
+
border-radius: 0.25rem;
|
|
2665
|
+
box-shadow:
|
|
2666
|
+
inset 0 0 0.35rem rgba(101, 64, 27, 0.4),
|
|
2667
|
+
0 1px 2px rgba(0, 0, 0, 0.15);
|
|
2668
|
+
}
|
|
2669
|
+
|
|
2670
|
+
.cartouche img {
|
|
2671
|
+
display: inline-block;
|
|
2672
|
+
height: var(--cartouche-h);
|
|
2673
|
+
width: auto;
|
|
2674
|
+
max-width: 100%; /* stay inside a narrow column */
|
|
2675
|
+
/* Override the .single-content img frame — cartouches are already a
|
|
2676
|
+
self-contained shape and don't need an additional border or the
|
|
2677
|
+
1.5rem vertical margin that body photos get. */
|
|
2678
|
+
border: none;
|
|
2679
|
+
border-radius: 0;
|
|
2680
|
+
margin: 0;
|
|
2681
|
+
/* Shift the Jsesh pure-black ink toward a warm aged-charcoal brown
|
|
2682
|
+
so it reads as oxidized paint rather than printer toner, and
|
|
2683
|
+
apply a tiny blur + contrast bump to soften sharp rectangular
|
|
2684
|
+
edges (plural strokes) without visibly degrading the more
|
|
2685
|
+
complex glyphs (the L1 scarab hides behind its own detail). */
|
|
2686
|
+
filter:
|
|
2687
|
+
sepia(0.7) hue-rotate(-12deg) saturate(1.25) brightness(0.55)
|
|
2688
|
+
blur(0.3px) contrast(1.15);
|
|
2689
|
+
}
|
|
2690
|
+
|
|
2691
|
+
.cartouche figcaption {
|
|
2692
|
+
margin-top: 0.4rem;
|
|
2693
|
+
font-family: var(--font-display);
|
|
2694
|
+
font-size: 0.78rem;
|
|
2695
|
+
font-weight: 600;
|
|
2696
|
+
text-transform: uppercase;
|
|
2697
|
+
letter-spacing: 0.08em;
|
|
2698
|
+
color: var(--text-muted);
|
|
2699
|
+
line-height: 1.3;
|
|
2700
|
+
}
|
|
2701
|
+
|
|
2702
|
+
.cartouche-left {
|
|
2703
|
+
--cartouche-h: 7rem;
|
|
2704
|
+
float: left;
|
|
2705
|
+
margin: 0.25rem 1.5rem 0.5rem 0;
|
|
2706
|
+
}
|
|
2707
|
+
|
|
2708
|
+
.cartouche-right {
|
|
2709
|
+
--cartouche-h: 7rem;
|
|
2710
|
+
float: right;
|
|
2711
|
+
margin: 0.25rem 0 0.5rem 1.5rem;
|
|
2712
|
+
}
|
|
2713
|
+
|
|
2714
|
+
/* Inline variant: scales to line-height so the cartouche sits on the
|
|
2715
|
+
baseline next to adjacent text. Height is driven by em units so it
|
|
2716
|
+
tracks the font size of the surrounding prose. */
|
|
2717
|
+
.cartouche-inline {
|
|
2718
|
+
display: inline-block;
|
|
2719
|
+
vertical-align: -0.55em;
|
|
2720
|
+
margin: 0 0.18em;
|
|
2721
|
+
line-height: 1;
|
|
2722
|
+
}
|
|
2723
|
+
|
|
2724
|
+
.cartouche-inline img {
|
|
2725
|
+
display: inline-block;
|
|
2726
|
+
width: auto;
|
|
2727
|
+
height: 2.6em;
|
|
2728
|
+
vertical-align: -1em;
|
|
2729
|
+
}
|
|
2730
|
+
|
|
2731
|
+
@media (max-width: 720px) {
|
|
2732
|
+
.cartouche {
|
|
2733
|
+
--cartouche-h: 8rem;
|
|
2734
|
+
}
|
|
2735
|
+
.cartouche-left,
|
|
2736
|
+
.cartouche-right {
|
|
2737
|
+
--cartouche-h: 6rem;
|
|
2738
|
+
float: none;
|
|
2739
|
+
margin: 1rem auto;
|
|
2740
|
+
}
|
|
2741
|
+
}
|
|
2742
|
+
|
|
2743
|
+
/* ---- Glyphs ----
|
|
2744
|
+
|
|
2745
|
+
Small hieroglyphic clusters (Kemetían deity names, etc.) fetched
|
|
2746
|
+
from icons/<slug>.svg on the site's asset host via the glyph
|
|
2747
|
+
shortcode. Smaller and lighter than cartouches — these represent
|
|
2748
|
+
words, not royal seals, so they live inline with text or inside a
|
|
2749
|
+
compact stone tablet for catalog use. The .glyph family shares
|
|
2750
|
+
the warm-ink filter with cartouches so both read as members of
|
|
2751
|
+
the same writing system. */
|
|
2752
|
+
|
|
2753
|
+
.glyph {
|
|
2754
|
+
display: inline-block;
|
|
2755
|
+
vertical-align: -0.35em;
|
|
2756
|
+
line-height: 0;
|
|
2757
|
+
}
|
|
2758
|
+
|
|
2759
|
+
.glyph img {
|
|
2760
|
+
display: inline-block;
|
|
2761
|
+
height: 1.8em; /* scales with surrounding text by default */
|
|
2762
|
+
width: auto;
|
|
2763
|
+
max-width: 100%;
|
|
2764
|
+
/* Override the .single-content img body-photo frame — glyphs are
|
|
2765
|
+
graphic marks, not photos, and don't need the border/margin. */
|
|
2766
|
+
border: none;
|
|
2767
|
+
border-radius: 0;
|
|
2768
|
+
margin: 0;
|
|
2769
|
+
/* Warm-aged-charcoal ink tone + bolder strokes. The four stacked
|
|
2770
|
+
0.5px drop-shadows in cardinal directions effectively thicken
|
|
2771
|
+
every dark pixel in the glyph by ~1px, simulating a heavier
|
|
2772
|
+
chisel cut without touching the source SVGs. Brightness and
|
|
2773
|
+
contrast are pushed harder than on cartouches since glyphs
|
|
2774
|
+
display small and need to stay legible. */
|
|
2775
|
+
filter:
|
|
2776
|
+
sepia(0.8) hue-rotate(-12deg) saturate(1.3)
|
|
2777
|
+
brightness(0.35) contrast(1.5)
|
|
2778
|
+
drop-shadow(0.5px 0 0 #3d2818)
|
|
2779
|
+
drop-shadow(-0.5px 0 0 #3d2818)
|
|
2780
|
+
drop-shadow(0 0.5px 0 #3d2818)
|
|
2781
|
+
drop-shadow(0 -0.5px 0 #3d2818);
|
|
2782
|
+
}
|
|
2783
|
+
|
|
2784
|
+
/* Size variants */
|
|
2785
|
+
.glyph-inline img { height: 1.4em; }
|
|
2786
|
+
|
|
2787
|
+
.glyph-block {
|
|
2788
|
+
display: block;
|
|
2789
|
+
text-align: center;
|
|
2790
|
+
margin: 1rem auto;
|
|
2791
|
+
vertical-align: baseline;
|
|
2792
|
+
}
|
|
2793
|
+
.glyph-block img { height: 3rem; }
|
|
2794
|
+
|
|
2795
|
+
/* Stone-tablet frame — for catalog layouts (pantheon table, lists of
|
|
2796
|
+
deities) where visual parallelism across a column matters more than
|
|
2797
|
+
showing each glyph at its intrinsic width. Tablet dimensions
|
|
2798
|
+
accommodate up to ~7 signs horizontally; longer glyphs scale down,
|
|
2799
|
+
shorter ones scale up to the tablet's interior bounds via
|
|
2800
|
+
object-fit: contain. */
|
|
2801
|
+
.glyph-tablet {
|
|
2802
|
+
display: inline-flex;
|
|
2803
|
+
align-items: center;
|
|
2804
|
+
justify-content: center;
|
|
2805
|
+
width: 10rem;
|
|
2806
|
+
height: 4rem;
|
|
2807
|
+
padding: 3px 5px; /* tight but keeps glyph off the rounded
|
|
2808
|
+
corners — 3px top/bottom, 5px left/right */
|
|
2809
|
+
vertical-align: middle;
|
|
2810
|
+
background:
|
|
2811
|
+
radial-gradient(ellipse at 28% 22%, #f2e4c2 0%, #d9c29a 55%, #bda77c 100%);
|
|
2812
|
+
border-radius: 0.2rem;
|
|
2813
|
+
box-shadow:
|
|
2814
|
+
inset 0 0 0.25rem rgba(101, 64, 27, 0.4),
|
|
2815
|
+
0 1px 2px rgba(0, 0, 0, 0.15);
|
|
2816
|
+
line-height: 0;
|
|
2817
|
+
box-sizing: border-box;
|
|
2818
|
+
}
|
|
2819
|
+
|
|
2820
|
+
/* object-fit: contain scales the glyph up to the largest size that
|
|
2821
|
+
preserves aspect ratio within the tablet's interior — the key
|
|
2822
|
+
difference from max-width/max-height, which cap but don't grow. */
|
|
2823
|
+
.glyph-tablet img {
|
|
2824
|
+
width: 100%;
|
|
2825
|
+
height: 100%;
|
|
2826
|
+
object-fit: contain;
|
|
2827
|
+
}
|
|
2828
|
+
|
|
2829
|
+
@media (max-width: 720px) {
|
|
2830
|
+
.glyph-tablet {
|
|
2831
|
+
width: 8rem;
|
|
2832
|
+
height: 3.25rem;
|
|
2833
|
+
}
|
|
2834
|
+
}
|
|
2835
|
+
|
|
2836
|
+
/* ---- Related and Holdings cards (bottom of article) ----
|
|
2837
|
+
|
|
2838
|
+
Both are bordered, tinted cards holding one or more labelled groups, each
|
|
2839
|
+
group's entries laid out as a CSS grid that reflows its own column count
|
|
2840
|
+
from the available width — two or three columns on a desktop, one on a
|
|
2841
|
+
phone — with no breakpoint needed. Related groups by the connected page's
|
|
2842
|
+
`type`; Holdings groups `contains` and `holdings` by place `subType`
|
|
2843
|
+
(`.holdings-kind-group`, one level deeper, for the region/settlement/site
|
|
2844
|
+
hierarchy) and leaves `held_by` a flat grid with the kind printed beside
|
|
2845
|
+
each name. */
|
|
2846
|
+
|
|
2847
|
+
.related,
|
|
2848
|
+
.holdings,
|
|
2849
|
+
.place-map {
|
|
2850
|
+
margin: 3rem 0 1rem;
|
|
2851
|
+
padding: 1.5rem 1.75rem;
|
|
2852
|
+
background: var(--bg-card);
|
|
2853
|
+
border: 1px solid var(--border);
|
|
2854
|
+
border-radius: 0.5rem;
|
|
2855
|
+
}
|
|
2856
|
+
|
|
2857
|
+
.related-heading,
|
|
2858
|
+
.place-map-heading {
|
|
2859
|
+
font-family: var(--font-display);
|
|
2860
|
+
font-size: 1.4rem;
|
|
2861
|
+
font-weight: 700;
|
|
2862
|
+
color: var(--text);
|
|
2863
|
+
letter-spacing: 0.02em;
|
|
2864
|
+
margin: 0 0 1rem;
|
|
2865
|
+
padding-bottom: 0.6rem;
|
|
2866
|
+
border-bottom: 1px solid var(--border);
|
|
2867
|
+
}
|
|
2868
|
+
|
|
2869
|
+
.related-group + .related-group,
|
|
2870
|
+
.holdings-table + .holdings-table {
|
|
2871
|
+
margin-top: 1.25rem;
|
|
2872
|
+
}
|
|
2873
|
+
|
|
2874
|
+
.related-group-label,
|
|
2875
|
+
.holdings-table-label {
|
|
2876
|
+
font-family: var(--font-display);
|
|
2877
|
+
font-size: 0.94rem;
|
|
2878
|
+
font-weight: 700;
|
|
2879
|
+
color: var(--text-muted);
|
|
2880
|
+
letter-spacing: 0.03em;
|
|
2881
|
+
margin: 0 0 0.5rem;
|
|
2882
|
+
}
|
|
2883
|
+
|
|
2884
|
+
.related-group-grid,
|
|
2885
|
+
.holdings-table-grid {
|
|
2886
|
+
display: grid;
|
|
2887
|
+
grid-template-columns: repeat(auto-fill, minmax(14em, 1fr));
|
|
2888
|
+
gap: 0.4rem 1rem;
|
|
2889
|
+
margin: 0;
|
|
2890
|
+
padding: 0;
|
|
2891
|
+
list-style: none;
|
|
2892
|
+
}
|
|
2893
|
+
|
|
2894
|
+
.related-group-grid li,
|
|
2895
|
+
.holdings-table-grid li {
|
|
2896
|
+
color: var(--text);
|
|
2897
|
+
font-size: 0.94rem;
|
|
2898
|
+
line-height: 1.5;
|
|
2899
|
+
overflow-wrap: break-word;
|
|
2900
|
+
}
|
|
2901
|
+
|
|
2902
|
+
.related-group-grid a,
|
|
2903
|
+
.holdings-table-grid a {
|
|
2904
|
+
color: var(--accent);
|
|
2905
|
+
border-bottom: 1px solid transparent;
|
|
2906
|
+
}
|
|
2907
|
+
|
|
2908
|
+
.related-group-grid a:hover,
|
|
2909
|
+
.holdings-table-grid a:hover {
|
|
2910
|
+
color: var(--accent-hover);
|
|
2911
|
+
border-bottom-color: var(--accent-dim);
|
|
2912
|
+
}
|
|
2913
|
+
|
|
2914
|
+
.holdings-kind-group + .holdings-kind-group {
|
|
2915
|
+
margin-top: 0.75rem;
|
|
2916
|
+
}
|
|
2917
|
+
|
|
2918
|
+
.holdings-kind-label {
|
|
2919
|
+
font-weight: 700;
|
|
2920
|
+
font-size: 0.76rem;
|
|
2921
|
+
letter-spacing: 0.06em;
|
|
2922
|
+
text-transform: uppercase;
|
|
2923
|
+
color: var(--text-muted);
|
|
2924
|
+
margin: 0 0 0.35rem;
|
|
2925
|
+
}
|
|
2926
|
+
|
|
2927
|
+
.holdings-entry-kind {
|
|
2928
|
+
color: var(--text-muted);
|
|
2929
|
+
}
|
|
2930
|
+
|
|
2931
|
+
.place-map-drawing {
|
|
2932
|
+
max-width: 100%;
|
|
2933
|
+
overflow-x: auto;
|
|
2934
|
+
}
|
|
2935
|
+
|
|
2936
|
+
.place-map-drawing svg {
|
|
2937
|
+
display: block;
|
|
2938
|
+
width: 100%;
|
|
2939
|
+
max-width: 100%;
|
|
2940
|
+
height: auto;
|
|
2941
|
+
}
|
|
2942
|
+
|
|
2943
|
+
@media (max-width: 640px) {
|
|
2944
|
+
.place-map-drawing svg {
|
|
2945
|
+
min-width: 32rem;
|
|
2946
|
+
}
|
|
2947
|
+
|
|
2948
|
+
.related,
|
|
2949
|
+
.holdings,
|
|
2950
|
+
.place-map {
|
|
2951
|
+
padding: 1.25rem 1.25rem;
|
|
2952
|
+
}
|
|
2953
|
+
}
|