@rathnasgala/theme 0.0.20 → 2.0.1
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/package.json +1 -1
- package/payload/.gala/managed-files.json +22 -19
- package/payload/eleventy.config.js +15 -1
- package/payload/lib/site-config.js +13 -5
- package/payload/package-lock.json +487 -2
- package/payload/package.json +7 -6
- package/payload/scripts/build-reader.js +24 -0
- package/payload/scripts/lint.js +21 -0
- package/payload/src/_includes/components/ui.njk +26 -17
- package/payload/src/_includes/layouts/base.njk +10 -11
- package/payload/src/_includes/layouts/post.njk +5 -6
- package/payload/src/accent.11ty.js +10 -0
- package/payload/src/assets/engagement-comments.js +115 -234
- package/payload/src/assets/engagement-transport.js +10 -4
- package/payload/src/assets/interactions.js +51 -1
- package/payload/src/assets/reader.js +2 -0
- package/payload/src/assets/theme.css +1 -676
- package/payload/src/client/reader.js +5 -0
- package/payload/src/styles/theme.css +811 -0
- package/payload/src/assets/vendor/hooks.js +0 -2
- package/payload/src/assets/vendor/htm.js +0 -2
- package/payload/src/assets/vendor/preact.js +0 -2
- package/payload/src/assets/vendor/signals-core.js +0 -2
- package/payload/src/assets/vendor/signals.js +0 -2
|
@@ -0,0 +1,811 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* A publication should read like a well-set page, not like a product.
|
|
3
|
+
*
|
|
4
|
+
* The chrome is quiet, the type carries the hierarchy, and depth comes from surface and space
|
|
5
|
+
* rather than from an outline around everything. Every value here is a token so that the ten
|
|
6
|
+
* `design:` choices in site.config.yml can move the whole page by moving a handful of variables,
|
|
7
|
+
* instead of each component inventing its own spacing and its own grey.
|
|
8
|
+
*/
|
|
9
|
+
:root {
|
|
10
|
+
color-scheme: light dark;
|
|
11
|
+
|
|
12
|
+
/* Neutrals carry a slight warmth. A pure grey reads as unconsidered; these were picked. */
|
|
13
|
+
--gala-color-background: light-dark(#fdfcfb, #131211);
|
|
14
|
+
--gala-color-surface: light-dark(#f6f4f1, #1c1a18);
|
|
15
|
+
--gala-color-raised: light-dark(#fffffe, #24211f);
|
|
16
|
+
--gala-color-text: light-dark(#1a1817, #f2efec);
|
|
17
|
+
--gala-color-muted: light-dark(#6b645e, #a8a099);
|
|
18
|
+
--gala-color-border: light-dark(#968e86, #6b645e);
|
|
19
|
+
--gala-color-hairline: light-dark(#e8e3dd, #2a2724);
|
|
20
|
+
--gala-color-border-strong: light-dark(#c9c2ba, #46413d);
|
|
21
|
+
--gala-color-accent: light-dark(
|
|
22
|
+
var(--gala-accent-light, #8a4b2a),
|
|
23
|
+
var(--gala-accent-dark, #e8a87c));
|
|
24
|
+
|
|
25
|
+
/* Type. One scale, used everywhere, fluid between a phone and a desk. */
|
|
26
|
+
--gala-font-body: ui-sans-serif, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
|
|
27
|
+
--gala-font-display: var(--gala-font-body);
|
|
28
|
+
--gala-font-mono: ui-monospace, "SF Mono", "Cascadia Mono", Menlo, monospace;
|
|
29
|
+
--gala-text-xs: 0.78rem;
|
|
30
|
+
--gala-text-sm: 0.875rem;
|
|
31
|
+
--gala-text-base: clamp(1rem, 0.97rem + 0.15vw, 1.0625rem);
|
|
32
|
+
--gala-text-lg: clamp(1.15rem, 1.09rem + 0.3vw, 1.3rem);
|
|
33
|
+
--gala-text-xl: clamp(1.4rem, 1.28rem + 0.6vw, 1.75rem);
|
|
34
|
+
--gala-text-2xl: clamp(1.75rem, 1.5rem + 1.2vw, 2.4rem);
|
|
35
|
+
--gala-text-3xl: clamp(2.2rem, 1.7rem + 2.4vw, 3.4rem);
|
|
36
|
+
--gala-leading-tight: 1.15;
|
|
37
|
+
--gala-leading-body: 1.65;
|
|
38
|
+
--gala-tracking-tight: -0.018em;
|
|
39
|
+
--gala-tracking-wide: 0.08em;
|
|
40
|
+
--gala-weight-display: 640;
|
|
41
|
+
|
|
42
|
+
/* Space, radius, depth, motion. */
|
|
43
|
+
--gala-step: 1rem;
|
|
44
|
+
--gala-space-2xs: calc(var(--gala-step) * 0.25);
|
|
45
|
+
--gala-space-xs: calc(var(--gala-step) * 0.5);
|
|
46
|
+
--gala-space-sm: calc(var(--gala-step) * 0.75);
|
|
47
|
+
--gala-space-md: var(--gala-step);
|
|
48
|
+
--gala-space-lg: calc(var(--gala-step) * 1.75);
|
|
49
|
+
--gala-space-xl: calc(var(--gala-step) * 3);
|
|
50
|
+
--gala-space-page: clamp(1.25rem, 5vw, 4.5rem);
|
|
51
|
+
--gala-radius-control: 0.625rem;
|
|
52
|
+
--gala-radius-surface: 1rem;
|
|
53
|
+
--gala-shadow-high:
|
|
54
|
+
0 1px 2px light-dark(rgb(26 24 23 / 5%), rgb(0 0 0 / 35%)),
|
|
55
|
+
0 12px 28px -12px light-dark(rgb(26 24 23 / 18%), rgb(0 0 0 / 60%));
|
|
56
|
+
--gala-motion-fast: 120ms;
|
|
57
|
+
--gala-motion-base: 220ms;
|
|
58
|
+
--gala-ease: cubic-bezier(0.2, 0, 0, 1);
|
|
59
|
+
|
|
60
|
+
--gala-content-width: 72rem;
|
|
61
|
+
--gala-measure: 68ch;
|
|
62
|
+
--gala-widget-min-block-size: 8rem;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/* An explicit choice must beat the operating system in both directions, so every colour is
|
|
66
|
+
restated rather than left to `light-dark()`. */
|
|
67
|
+
:root[data-mode='light'] {
|
|
68
|
+
color-scheme: light;
|
|
69
|
+
--gala-color-background: #fdfcfb;
|
|
70
|
+
--gala-color-surface: #f6f4f1;
|
|
71
|
+
--gala-color-raised: #fffffe;
|
|
72
|
+
--gala-color-text: #1a1817;
|
|
73
|
+
--gala-color-muted: #6b645e;
|
|
74
|
+
--gala-color-border: #968e86;
|
|
75
|
+
--gala-color-hairline: #e8e3dd;
|
|
76
|
+
--gala-color-border-strong: #c9c2ba;
|
|
77
|
+
--gala-color-accent: var(--gala-accent-light, #8a4b2a);
|
|
78
|
+
}
|
|
79
|
+
:root[data-mode='dark'] {
|
|
80
|
+
color-scheme: dark;
|
|
81
|
+
--gala-color-background: #131211;
|
|
82
|
+
--gala-color-surface: #1c1a18;
|
|
83
|
+
--gala-color-raised: #24211f;
|
|
84
|
+
--gala-color-text: #f2efec;
|
|
85
|
+
--gala-color-muted: #a8a099;
|
|
86
|
+
--gala-color-border: #6b645e;
|
|
87
|
+
--gala-color-hairline: #2a2724;
|
|
88
|
+
--gala-color-border-strong: #46413d;
|
|
89
|
+
--gala-color-accent: var(--gala-accent-dark, #e8a87c);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* ---------------------------------------------------------------- palettes */
|
|
93
|
+
:root[data-palette='ocean'] {
|
|
94
|
+
--gala-color-background: light-dark(#f8fbfd, #0b1a24);
|
|
95
|
+
--gala-color-surface: light-dark(#eef4f9, #12252f);
|
|
96
|
+
--gala-color-raised: light-dark(#ffffff, #172d39);
|
|
97
|
+
--gala-color-text: light-dark(#12242f, #eaf3f8);
|
|
98
|
+
--gala-color-muted: light-dark(#5a6f7d, #98aebb);
|
|
99
|
+
--gala-color-border: light-dark(#7d8d99, #5f7d8c);
|
|
100
|
+
--gala-color-hairline: light-dark(#dde7ee, #1d3644);
|
|
101
|
+
--gala-color-border-strong: light-dark(#bdccd7, #33505f);
|
|
102
|
+
--gala-color-accent: light-dark(#0f5f7a, #7fd0e8);
|
|
103
|
+
}
|
|
104
|
+
:root[data-palette='ocean'][data-mode='light'] {
|
|
105
|
+
color-scheme: light;
|
|
106
|
+
--gala-color-background: #f8fbfd;
|
|
107
|
+
--gala-color-surface: #eef4f9;
|
|
108
|
+
--gala-color-raised: #ffffff;
|
|
109
|
+
--gala-color-text: #12242f;
|
|
110
|
+
--gala-color-muted: #5a6f7d;
|
|
111
|
+
--gala-color-border: #7d8d99;
|
|
112
|
+
--gala-color-hairline: #dde7ee;
|
|
113
|
+
--gala-color-border-strong: #bdccd7;
|
|
114
|
+
--gala-color-accent: var(--gala-accent-light, #0f5f7a);
|
|
115
|
+
}
|
|
116
|
+
:root[data-palette='ocean'][data-mode='dark'] {
|
|
117
|
+
color-scheme: dark;
|
|
118
|
+
--gala-color-background: #0b1a24;
|
|
119
|
+
--gala-color-surface: #12252f;
|
|
120
|
+
--gala-color-raised: #172d39;
|
|
121
|
+
--gala-color-text: #eaf3f8;
|
|
122
|
+
--gala-color-muted: #98aebb;
|
|
123
|
+
--gala-color-border: #5f7d8c;
|
|
124
|
+
--gala-color-hairline: #1d3644;
|
|
125
|
+
--gala-color-border-strong: #33505f;
|
|
126
|
+
--gala-color-accent: var(--gala-accent-dark, #7fd0e8);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
/* Two more, because colour is the choice a writer actually wants to make — and the one that is
|
|
131
|
+
safe to offer, since a palette only swaps values every rule already reads and each is checked
|
|
132
|
+
for contrast in both modes. */
|
|
133
|
+
:root[data-palette='forest'] {
|
|
134
|
+
--gala-color-background: light-dark(#fbfcfa, #101410);
|
|
135
|
+
--gala-color-surface: light-dark(#f0f4ee, #182018);
|
|
136
|
+
--gala-color-raised: light-dark(#ffffff, #1f271f);
|
|
137
|
+
--gala-color-text: light-dark(#18201a, #eef3ec);
|
|
138
|
+
--gala-color-muted: light-dark(#5b665d, #9aa89b);
|
|
139
|
+
--gala-color-border: light-dark(#849084, #5e685f);
|
|
140
|
+
--gala-color-hairline: light-dark(#e2e9df, #232b23);
|
|
141
|
+
--gala-color-border-strong: light-dark(#5b665d, #7d897e);
|
|
142
|
+
--gala-color-accent: light-dark(#2f6b3f, #8fd3a1);
|
|
143
|
+
}
|
|
144
|
+
:root[data-palette='forest'][data-mode='light'] {
|
|
145
|
+
color-scheme: light;
|
|
146
|
+
--gala-color-background: #fbfcfa;
|
|
147
|
+
--gala-color-surface: #f0f4ee;
|
|
148
|
+
--gala-color-raised: #ffffff;
|
|
149
|
+
--gala-color-text: #18201a;
|
|
150
|
+
--gala-color-muted: #5b665d;
|
|
151
|
+
--gala-color-border: #849084;
|
|
152
|
+
--gala-color-hairline: #e2e9df;
|
|
153
|
+
--gala-color-border-strong: #5b665d;
|
|
154
|
+
--gala-color-accent: var(--gala-accent-light, #2f6b3f);
|
|
155
|
+
}
|
|
156
|
+
:root[data-palette='forest'][data-mode='dark'] {
|
|
157
|
+
color-scheme: dark;
|
|
158
|
+
--gala-color-background: #101410;
|
|
159
|
+
--gala-color-surface: #182018;
|
|
160
|
+
--gala-color-raised: #1f271f;
|
|
161
|
+
--gala-color-text: #eef3ec;
|
|
162
|
+
--gala-color-muted: #9aa89b;
|
|
163
|
+
--gala-color-border: #5e685f;
|
|
164
|
+
--gala-color-hairline: #232b23;
|
|
165
|
+
--gala-color-border-strong: #7d897e;
|
|
166
|
+
--gala-color-accent: var(--gala-accent-dark, #8fd3a1);
|
|
167
|
+
}
|
|
168
|
+
:root[data-palette='plum'] {
|
|
169
|
+
--gala-color-background: light-dark(#fdfbfd, #141016);
|
|
170
|
+
--gala-color-surface: light-dark(#f5eff5, #1d1720);
|
|
171
|
+
--gala-color-raised: light-dark(#ffffff, #241d28);
|
|
172
|
+
--gala-color-text: light-dark(#1f1820, #f2ecf3);
|
|
173
|
+
--gala-color-muted: light-dark(#665c69, #a99dac);
|
|
174
|
+
--gala-color-border: light-dark(#948a95, #6b606d);
|
|
175
|
+
--gala-color-hairline: light-dark(#ebe2ec, #281f2b);
|
|
176
|
+
--gala-color-border-strong: light-dark(#665c69, #8b7f8d);
|
|
177
|
+
--gala-color-accent: light-dark(#7a3d76, #dda6d8);
|
|
178
|
+
}
|
|
179
|
+
:root[data-palette='plum'][data-mode='light'] {
|
|
180
|
+
color-scheme: light;
|
|
181
|
+
--gala-color-background: #fdfbfd;
|
|
182
|
+
--gala-color-surface: #f5eff5;
|
|
183
|
+
--gala-color-raised: #ffffff;
|
|
184
|
+
--gala-color-text: #1f1820;
|
|
185
|
+
--gala-color-muted: #665c69;
|
|
186
|
+
--gala-color-border: #948a95;
|
|
187
|
+
--gala-color-hairline: #ebe2ec;
|
|
188
|
+
--gala-color-border-strong: #665c69;
|
|
189
|
+
--gala-color-accent: var(--gala-accent-light, #7a3d76);
|
|
190
|
+
}
|
|
191
|
+
:root[data-palette='plum'][data-mode='dark'] {
|
|
192
|
+
color-scheme: dark;
|
|
193
|
+
--gala-color-background: #141016;
|
|
194
|
+
--gala-color-surface: #1d1720;
|
|
195
|
+
--gala-color-raised: #241d28;
|
|
196
|
+
--gala-color-text: #f2ecf3;
|
|
197
|
+
--gala-color-muted: #a99dac;
|
|
198
|
+
--gala-color-border: #6b606d;
|
|
199
|
+
--gala-color-hairline: #281f2b;
|
|
200
|
+
--gala-color-border-strong: #8b7f8d;
|
|
201
|
+
--gala-color-accent: var(--gala-accent-dark, #dda6d8);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/* ---------------------------------------------------------------- the looks
|
|
205
|
+
*
|
|
206
|
+
* Three, each designed whole.
|
|
207
|
+
*
|
|
208
|
+
* This replaced nine independent knobs — typeface, spacing, density, radius, motion, surfaces,
|
|
209
|
+
* palette — which a writer set one at a time, blind, and only saw combined after a deploy. Nine
|
|
210
|
+
* knobs is several hundred looks, and nobody had seen most of them: `mono` + `round` + `spacious`
|
|
211
|
+
* + `raised` produced monospace headings inside page-wide pills, and it was reachable in four
|
|
212
|
+
* clicks. A look is a set of decisions that agree with each other, so it is chosen as a set.
|
|
213
|
+
*/
|
|
214
|
+
|
|
215
|
+
/* Calm, serif, generous. For essays and long reading. */
|
|
216
|
+
:root[data-theme='editorial'] {
|
|
217
|
+
--gala-font-body: ui-serif, "Iowan Old Style", Charter, "Source Serif 4", Georgia, serif;
|
|
218
|
+
--gala-font-display: var(--gala-font-body);
|
|
219
|
+
--gala-weight-display: 600;
|
|
220
|
+
--gala-step: 1.1rem;
|
|
221
|
+
--gala-leading-body: 1.7;
|
|
222
|
+
--gala-radius-control: 0.5rem;
|
|
223
|
+
--gala-radius-surface: 0.75rem;
|
|
224
|
+
--gala-measure: 66ch;
|
|
225
|
+
--gala-surface-border: var(--gala-color-hairline);
|
|
226
|
+
--gala-surface-shadow: none;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/* Crisp, sans, a little tighter. The default, and the safe one. */
|
|
230
|
+
:root[data-theme='modern'] {
|
|
231
|
+
--gala-font-body: ui-sans-serif, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
|
|
232
|
+
--gala-font-display: var(--gala-font-body);
|
|
233
|
+
--gala-weight-display: 640;
|
|
234
|
+
--gala-step: 1rem;
|
|
235
|
+
--gala-leading-body: 1.65;
|
|
236
|
+
--gala-radius-control: 0.625rem;
|
|
237
|
+
--gala-radius-surface: 1rem;
|
|
238
|
+
--gala-measure: 70ch;
|
|
239
|
+
--gala-surface-border: transparent;
|
|
240
|
+
--gala-surface-shadow: var(--gala-shadow-high);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/* For writing about code: mono for the furniture, never for the prose or the headings. */
|
|
244
|
+
:root[data-theme='technical'] {
|
|
245
|
+
--gala-font-body: ui-sans-serif, -apple-system, "Segoe UI", Roboto, sans-serif;
|
|
246
|
+
--gala-font-display: var(--gala-font-body);
|
|
247
|
+
--gala-weight-display: 660;
|
|
248
|
+
--gala-tracking-tight: -0.022em;
|
|
249
|
+
--gala-step: 0.9rem;
|
|
250
|
+
--gala-leading-body: 1.6;
|
|
251
|
+
--gala-radius-control: 0.375rem;
|
|
252
|
+
--gala-radius-surface: 0.5rem;
|
|
253
|
+
--gala-measure: 74ch;
|
|
254
|
+
--gala-surface-border: var(--gala-color-border-strong);
|
|
255
|
+
--gala-surface-shadow: none;
|
|
256
|
+
}
|
|
257
|
+
/* Mono is an accent here — labels, counts, metadata — not a face to set a page in. */
|
|
258
|
+
:root[data-theme='technical'] .gala-eyebrow,
|
|
259
|
+
:root[data-theme='technical'] .gala-engagement dt,
|
|
260
|
+
:root[data-theme='technical'] .gala-comment__meta time {
|
|
261
|
+
font-family: var(--gala-font-mono);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/* Motion is not a choice a writer has to make; it is a property of a considered page. */
|
|
265
|
+
@media (prefers-reduced-motion: reduce) {
|
|
266
|
+
:root { --gala-motion-fast: 0ms; --gala-motion-base: 0ms; }
|
|
267
|
+
*, *::before, *::after { animation-duration: 1ms !important; transition-duration: 1ms !important; }
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
:root[data-layout='portfolio'] { --gala-content-width: 82rem; }
|
|
271
|
+
|
|
272
|
+
body {
|
|
273
|
+
margin: 0;
|
|
274
|
+
padding: var(--gala-space-page);
|
|
275
|
+
color: var(--gala-color-text);
|
|
276
|
+
background: var(--gala-color-background);
|
|
277
|
+
font-family: var(--gala-font-body);
|
|
278
|
+
font-size: var(--gala-text-base);
|
|
279
|
+
line-height: var(--gala-leading-body);
|
|
280
|
+
-webkit-font-smoothing: antialiased;
|
|
281
|
+
text-rendering: optimizeLegibility;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
.gala-skip-link {
|
|
285
|
+
position: fixed;
|
|
286
|
+
inset-block-start: 1rem;
|
|
287
|
+
inset-inline-start: 1rem;
|
|
288
|
+
z-index: 100;
|
|
289
|
+
padding: .75rem 1rem;
|
|
290
|
+
color: white;
|
|
291
|
+
background: var(--gala-color-accent);
|
|
292
|
+
border-radius: 999px;
|
|
293
|
+
transform: translateY(-200%);
|
|
294
|
+
}
|
|
295
|
+
.gala-skip-link:focus { transform: translateY(0); }
|
|
296
|
+
|
|
297
|
+
.gala-site-name {
|
|
298
|
+
color: var(--gala-color-text);
|
|
299
|
+
font-family: var(--gala-font-display);
|
|
300
|
+
font-size: var(--gala-text-lg);
|
|
301
|
+
font-weight: var(--gala-weight-display);
|
|
302
|
+
letter-spacing: var(--gala-tracking-tight);
|
|
303
|
+
text-decoration: none;
|
|
304
|
+
}
|
|
305
|
+
.gala-header-link { color: var(--gala-color-text); font-size: var(--gala-text-sm); text-decoration: none; }
|
|
306
|
+
.gala-account-control {
|
|
307
|
+
display: inline-flex;
|
|
308
|
+
align-items: center;
|
|
309
|
+
gap: .5rem;
|
|
310
|
+
min-block-size: 2.75rem;
|
|
311
|
+
padding-inline: .9rem;
|
|
312
|
+
border-radius: 999px;
|
|
313
|
+
}
|
|
314
|
+
.gala-account-control svg { inline-size: 1rem; block-size: 1rem; }
|
|
315
|
+
|
|
316
|
+
.gala-article { max-inline-size: 76rem; margin-inline: auto; }
|
|
317
|
+
.gala-article-header { padding-block: clamp(3rem, 9vw, 8rem); }
|
|
318
|
+
.gala-article-header h1 {
|
|
319
|
+
max-inline-size: 12ch;
|
|
320
|
+
font-size: clamp(3.25rem, 9vw, 7.5rem);
|
|
321
|
+
line-height: .92;
|
|
322
|
+
letter-spacing: -.055em;
|
|
323
|
+
}
|
|
324
|
+
.gala-byline { color: var(--gala-color-muted); font-size: var(--gala-text-sm); }
|
|
325
|
+
.gala-markdown { max-inline-size: 42rem; margin-inline: auto; font-size: clamp(1.1rem, 1rem + .35vw, 1.3rem); }
|
|
326
|
+
.gala-markdown :where(h2) { margin-block-start: clamp(3rem, 7vw, 5rem); font-size: clamp(2.2rem, 5vw, 3.8rem); }
|
|
327
|
+
.gala-markdown :where(img, video) { max-inline-size: 100%; block-size: auto; }
|
|
328
|
+
|
|
329
|
+
@media (max-width: 47.99rem) {
|
|
330
|
+
.gala-header-link { display: none; }
|
|
331
|
+
.gala-site-header__actions { gap: .25rem; }
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/* Headings carry the hierarchy, so they get the display face, a tighter measure and tighter
|
|
335
|
+
tracking — large type set at body tracking is the single clearest sign of an unconsidered page. */
|
|
336
|
+
:where(h1, h2, h3, h4) {
|
|
337
|
+
font-family: var(--gala-font-display);
|
|
338
|
+
font-weight: var(--gala-weight-display);
|
|
339
|
+
line-height: var(--gala-leading-tight);
|
|
340
|
+
letter-spacing: var(--gala-tracking-tight);
|
|
341
|
+
text-wrap: balance;
|
|
342
|
+
margin-block: 0 var(--gala-space-sm);
|
|
343
|
+
}
|
|
344
|
+
:where(h1) { font-size: var(--gala-text-3xl); }
|
|
345
|
+
:where(h2) { font-size: var(--gala-text-2xl); }
|
|
346
|
+
:where(h3) { font-size: var(--gala-text-xl); }
|
|
347
|
+
:where(h4) { font-size: var(--gala-text-lg); }
|
|
348
|
+
:where(p, ul, ol, blockquote) { margin-block: 0 var(--gala-space-md); }
|
|
349
|
+
:where(p) { text-wrap: pretty; }
|
|
350
|
+
|
|
351
|
+
blockquote {
|
|
352
|
+
margin-inline: 0;
|
|
353
|
+
padding-inline-start: var(--gala-space-md);
|
|
354
|
+
border-inline-start: 2px solid var(--gala-color-accent);
|
|
355
|
+
color: var(--gala-color-muted);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
:where(code, kbd, samp) { font-family: var(--gala-font-mono); font-size: 0.9em; }
|
|
359
|
+
:where(pre) {
|
|
360
|
+
padding: var(--gala-space-md);
|
|
361
|
+
overflow-x: auto;
|
|
362
|
+
background: var(--gala-color-surface);
|
|
363
|
+
border-radius: var(--gala-radius-control);
|
|
364
|
+
}
|
|
365
|
+
:where(hr) { border: 0; border-block-start: 1px solid var(--gala-color-hairline); margin-block: var(--gala-space-xl); }
|
|
366
|
+
:where(table) { border-collapse: collapse; inline-size: 100%; }
|
|
367
|
+
:where(th, td) { padding: var(--gala-space-xs) var(--gala-space-sm); border-block-end: 1px solid var(--gala-color-hairline); text-align: start; }
|
|
368
|
+
|
|
369
|
+
/* An uppercase label needs air between the letters or it sets as a solid block. */
|
|
370
|
+
.gala-eyebrow, .gala-comment__meta time, .gala-comment__edited {
|
|
371
|
+
font-size: var(--gala-text-xs);
|
|
372
|
+
letter-spacing: var(--gala-tracking-wide);
|
|
373
|
+
text-transform: uppercase;
|
|
374
|
+
color: var(--gala-color-muted);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/*
|
|
378
|
+
* Stays with the reader. It used to scroll away, so on a long post the only way back to the site
|
|
379
|
+
* — or to sign in — was to scroll to the top. The negative inline margin lets the bar's background
|
|
380
|
+
* reach the edge of the viewport while its contents stay on the page's own measure.
|
|
381
|
+
*/
|
|
382
|
+
.gala-site-header {
|
|
383
|
+
position: sticky;
|
|
384
|
+
inset-block-start: 0;
|
|
385
|
+
z-index: 10;
|
|
386
|
+
display: flex;
|
|
387
|
+
align-items: center;
|
|
388
|
+
justify-content: space-between;
|
|
389
|
+
gap: var(--gala-space-md);
|
|
390
|
+
max-inline-size: var(--gala-content-width);
|
|
391
|
+
margin-inline: auto;
|
|
392
|
+
margin-block-end: var(--gala-space-xl);
|
|
393
|
+
padding-block: var(--gala-space-xs);
|
|
394
|
+
background: color-mix(in srgb, var(--gala-color-background) 88%, transparent);
|
|
395
|
+
backdrop-filter: blur(8px);
|
|
396
|
+
border-block-end: 1px solid var(--gala-color-hairline);
|
|
397
|
+
}
|
|
398
|
+
@supports not (backdrop-filter: blur(8px)) {
|
|
399
|
+
.gala-site-header { background: var(--gala-color-background); }
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
.gala-site-header__actions { display: flex; gap: 0.5rem; }
|
|
403
|
+
.gala-icon-control {
|
|
404
|
+
display: inline-grid;
|
|
405
|
+
inline-size: 2.75rem;
|
|
406
|
+
block-size: 2.75rem;
|
|
407
|
+
box-sizing: border-box;
|
|
408
|
+
padding: 0.6rem;
|
|
409
|
+
place-items: center;
|
|
410
|
+
color: inherit;
|
|
411
|
+
border: 0.125rem solid transparent;
|
|
412
|
+
border-radius: 50%;
|
|
413
|
+
}
|
|
414
|
+
.gala-icon-control {
|
|
415
|
+
transition: background var(--gala-motion-fast) var(--gala-ease),
|
|
416
|
+
color var(--gala-motion-fast) var(--gala-ease);
|
|
417
|
+
color: var(--gala-color-muted);
|
|
418
|
+
}
|
|
419
|
+
.gala-icon-control:hover { background: var(--gala-color-surface); color: var(--gala-color-text); }
|
|
420
|
+
.gala-icon-control:focus-visible { outline: 0.1875rem solid currentcolor; outline-offset: 0.1875rem; }
|
|
421
|
+
/* Stroked, not filled: the icons are drawn on one 24px grid at a single weight, so they read as
|
|
422
|
+
a set rather than as six unrelated silhouettes. */
|
|
423
|
+
.gala-icon-control svg { inline-size: 100%; block-size: 100%; fill: none; stroke: currentcolor; }
|
|
424
|
+
|
|
425
|
+
.gala-dialog {
|
|
426
|
+
inline-size: min(42rem, calc(100% - 2rem));
|
|
427
|
+
max-block-size: calc(100% - 2rem);
|
|
428
|
+
box-sizing: border-box;
|
|
429
|
+
padding: 1.5rem;
|
|
430
|
+
color: var(--gala-color-text);
|
|
431
|
+
background: var(--gala-color-background);
|
|
432
|
+
border: 1px solid var(--gala-surface-border);
|
|
433
|
+
border-radius: var(--gala-radius-surface);
|
|
434
|
+
box-shadow: var(--gala-shadow-high);
|
|
435
|
+
}
|
|
436
|
+
.gala-dialog::backdrop { background: rgb(0 0 0 / 65%); }
|
|
437
|
+
/* Sized to what it holds. 22rem was a box for a name and one button, and it showed. */
|
|
438
|
+
.gala-account-dialog { inline-size: min(26rem, calc(100% - 2rem)); }
|
|
439
|
+
.gala-account-dialog iframe {
|
|
440
|
+
display: block;
|
|
441
|
+
inline-size: 100%;
|
|
442
|
+
/* Height is set from the frame's own report; this is only what it shows before that arrives. */
|
|
443
|
+
block-size: 7rem;
|
|
444
|
+
border: 0;
|
|
445
|
+
/* The frame owns its layout and reports its size, so it never needs to scroll inside the box. */
|
|
446
|
+
overflow: hidden;
|
|
447
|
+
}
|
|
448
|
+
/* The close control belongs on the same line as the title, not floated above it. */
|
|
449
|
+
.gala-dialog { display: grid; gap: var(--gala-space-sm); }
|
|
450
|
+
.gala-dialog__close { justify-self: end; margin: 0; }
|
|
451
|
+
.gala-dialog > h2 { margin-block: 0; }
|
|
452
|
+
|
|
453
|
+
main,
|
|
454
|
+
.gala-page-footer {
|
|
455
|
+
max-inline-size: var(--gala-content-width);
|
|
456
|
+
margin-inline: auto;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
a { color: var(--gala-color-accent); }
|
|
460
|
+
|
|
461
|
+
button {
|
|
462
|
+
min-block-size: 2.75rem;
|
|
463
|
+
padding-inline: var(--gala-space-md);
|
|
464
|
+
color: inherit;
|
|
465
|
+
background: var(--gala-color-surface);
|
|
466
|
+
border: 1px solid var(--gala-color-border);
|
|
467
|
+
border-radius: var(--gala-radius-control);
|
|
468
|
+
font: inherit;
|
|
469
|
+
font-size: var(--gala-text-sm);
|
|
470
|
+
cursor: pointer;
|
|
471
|
+
transition: background var(--gala-motion-fast) var(--gala-ease),
|
|
472
|
+
border-color var(--gala-motion-fast) var(--gala-ease);
|
|
473
|
+
}
|
|
474
|
+
button:hover { border-color: var(--gala-color-border-strong); background: var(--gala-color-raised); }
|
|
475
|
+
button[disabled] { opacity: 0.55; cursor: not-allowed; }
|
|
476
|
+
|
|
477
|
+
button:focus-visible {
|
|
478
|
+
outline: 0.1875rem solid currentcolor;
|
|
479
|
+
outline-offset: 0.1875rem;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
.gala-button,
|
|
483
|
+
.gala-badge,
|
|
484
|
+
.gala-tag-chip {
|
|
485
|
+
display: inline-flex;
|
|
486
|
+
align-items: center;
|
|
487
|
+
min-block-size: 2.75rem;
|
|
488
|
+
border: 1px solid var(--gala-color-border);
|
|
489
|
+
border-radius: var(--gala-radius-control);
|
|
490
|
+
font-size: var(--gala-text-sm);
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
.gala-badge,
|
|
494
|
+
.gala-tag-chip { padding-inline: 0.75rem; }
|
|
495
|
+
.gala-tag-chip { text-decoration: none; }
|
|
496
|
+
.gala-section-heading { margin-block: 3rem 1rem; }
|
|
497
|
+
.gala-section-heading > :where(h2, p) { margin-block: 0 0.5rem; }
|
|
498
|
+
.gala-hero { display: grid; gap: 1.5rem; align-items: center; }
|
|
499
|
+
.gala-hero__image { inline-size: 100%; block-size: auto; border-radius: var(--gala-radius-control); }
|
|
500
|
+
.gala-page-content { max-inline-size: var(--gala-measure); }
|
|
501
|
+
.gala-page-content :where(img, video) { max-inline-size: 100%; block-size: auto; }
|
|
502
|
+
.gala-author-profile { display: flex; gap: 1rem; padding: 1rem; background: var(--gala-color-surface); border-radius: var(--gala-radius-control); }
|
|
503
|
+
.gala-author-profile img { border-radius: 50%; object-fit: cover; }
|
|
504
|
+
.gala-social-links,
|
|
505
|
+
.gala-page-footer ul,
|
|
506
|
+
.gala-share ul { display: flex; flex-wrap: wrap; gap: 1rem; padding: 0; list-style: none; }
|
|
507
|
+
.gala-card-index { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 18rem), 1fr)); gap: 1rem; padding: 0; list-style: none; }
|
|
508
|
+
[data-layout='portfolio'] .gala-card-index { grid-template-columns: repeat(auto-fit, minmax(min(100%, 22rem), 1fr)); gap: 1.5rem; }
|
|
509
|
+
[data-layout='portfolio'] .gala-card { padding: clamp(1.25rem, 3vw, 2rem); }
|
|
510
|
+
/* The surfaces are where `componentStyle` becomes visible: quiet sits on the page, outlined draws
|
|
511
|
+
its edge, raised lifts. One variable decides, so cards and dialogs cannot drift apart. */
|
|
512
|
+
.gala-card {
|
|
513
|
+
block-size: 100%;
|
|
514
|
+
box-sizing: border-box;
|
|
515
|
+
padding: var(--gala-space-lg);
|
|
516
|
+
background: var(--gala-color-surface);
|
|
517
|
+
border: 1px solid var(--gala-surface-border);
|
|
518
|
+
border-radius: var(--gala-radius-surface);
|
|
519
|
+
box-shadow: var(--gala-surface-shadow);
|
|
520
|
+
}
|
|
521
|
+
/* The one place the page moves of its own accord, and so the one place `motion` is legible:
|
|
522
|
+
`subtle` is a short settle, `expressive` a longer one, `none` no movement at all. */
|
|
523
|
+
.gala-card { transition: transform var(--gala-motion-base) var(--gala-ease),
|
|
524
|
+
box-shadow var(--gala-motion-base) var(--gala-ease); }
|
|
525
|
+
.gala-card-index li:hover .gala-card { transform: translateY(-2px); box-shadow: var(--gala-shadow-high); }
|
|
526
|
+
.gala-stats-graph { min-block-size: var(--gala-widget-min-block-size); margin-inline: 0; }
|
|
527
|
+
.gala-stats-graph svg { inline-size: 100%; block-size: 8rem; }
|
|
528
|
+
.gala-stats-graph polyline { fill: none; stroke: var(--gala-color-accent); stroke-width: 2; }
|
|
529
|
+
.gala-loading { display: grid; min-block-size: var(--gala-widget-min-block-size); place-items: center; }
|
|
530
|
+
.gala-loading__indicator { inline-size: 2rem; block-size: 2rem; border: 0.25rem solid var(--gala-color-border); border-block-start-color: var(--gala-color-accent); border-radius: 50%; animation: gala-spin 0.8s linear infinite; }
|
|
531
|
+
.gala-pagination { display: flex; justify-content: space-between; gap: 1rem; }
|
|
532
|
+
.gala-search { display: grid; grid-template-columns: 1fr auto; gap: 0.5rem; }
|
|
533
|
+
.gala-search label { grid-column: 1 / -1; }
|
|
534
|
+
.gala-search input { min-block-size: 2.75rem; font: inherit; }
|
|
535
|
+
.gala-search-results { display: grid; gap: 1rem; padding: 0; list-style: none; }
|
|
536
|
+
.gala-search-results article { padding: 1rem; background: var(--gala-color-surface); border-radius: var(--gala-radius-control); }
|
|
537
|
+
.gala-search-results h2 { margin-block-start: 0; }
|
|
538
|
+
.gala-toc { padding: 1rem; background: var(--gala-color-surface); }
|
|
539
|
+
.gala-share__fallback { inline-size: min(100%, 36rem); }
|
|
540
|
+
.gala-engagement__placeholder { display: grid; min-block-size: var(--gala-widget-min-block-size); align-content: center; margin: 0; }
|
|
541
|
+
.gala-engagement-profile > * { margin-block: 0 0.5rem; }
|
|
542
|
+
.gala-engagement-actions { display: grid; gap: 1rem; margin-block-start: 1.5rem; }
|
|
543
|
+
.gala-engagement-actions[hidden] { display: none; }
|
|
544
|
+
/* Shown only when signing in interrupted something the reader had already decided to do, so it
|
|
545
|
+
reassures rather than sells. Hidden for anyone who opened the account dialog deliberately. */
|
|
546
|
+
.gala-account-dialog__invite { margin-block: 0 1rem; max-inline-size: 34rem; }
|
|
547
|
+
.gala-account-dialog__invite[hidden] { display: none; }
|
|
548
|
+
.gala-engagement-actions form,
|
|
549
|
+
[data-comment-editor] { display: grid; gap: 0.5rem; max-inline-size: 42rem; }
|
|
550
|
+
.gala-engagement-actions label { display: grid; gap: 0.5rem; }
|
|
551
|
+
.gala-engagement-actions textarea,
|
|
552
|
+
[data-comment-editor] textarea { min-block-size: 7rem; padding: 0.75rem; font: inherit; }
|
|
553
|
+
.gala-page-footer { margin-block-start: 4rem; padding-block-start: 1rem; border-block-start: 0.125rem solid var(--gala-color-border); }
|
|
554
|
+
.gala-error-page { min-block-size: 60vh; display: grid; align-content: center; justify-items: start; }
|
|
555
|
+
.gala-code-block { position: relative; }
|
|
556
|
+
.gala-code-block > button { position: absolute; inset-block-start: 0.5rem; inset-inline-end: 0.5rem; background: var(--gala-color-background); }
|
|
557
|
+
.gala-code-block pre { overflow: auto; padding: 3.5rem 1rem 1rem; background: var(--gala-color-surface); border-radius: var(--gala-radius-control); }
|
|
558
|
+
.gala-embed {
|
|
559
|
+
display: grid;
|
|
560
|
+
place-items: center;
|
|
561
|
+
gap: 0.75rem;
|
|
562
|
+
box-sizing: border-box;
|
|
563
|
+
inline-size: 100%;
|
|
564
|
+
margin-inline: 0;
|
|
565
|
+
padding: 1rem;
|
|
566
|
+
overflow: hidden;
|
|
567
|
+
background: var(--gala-color-surface);
|
|
568
|
+
border: 0.125rem solid var(--gala-color-border);
|
|
569
|
+
border-radius: var(--gala-radius-control);
|
|
570
|
+
}
|
|
571
|
+
.gala-embed--youtube { aspect-ratio: 16 / 9; }
|
|
572
|
+
.gala-embed--codepen { min-block-size: 25rem; }
|
|
573
|
+
.gala-embed--gist,
|
|
574
|
+
.gala-embed--x { min-block-size: 8rem; }
|
|
575
|
+
.gala-embed iframe { inline-size: 100%; block-size: 100%; border: 0; }
|
|
576
|
+
.gala-embed__icon {
|
|
577
|
+
inline-size: 2rem;
|
|
578
|
+
block-size: 2rem;
|
|
579
|
+
background: center / contain no-repeat;
|
|
580
|
+
}
|
|
581
|
+
.gala-embed--youtube .gala-embed__icon { background-image: url('../assets/embed-youtube.svg'); }
|
|
582
|
+
.gala-embed--codepen .gala-embed__icon { background-image: url('../assets/embed-codepen.svg'); }
|
|
583
|
+
.gala-embed--gist .gala-embed__icon { background-image: url('../assets/embed-gist.svg'); }
|
|
584
|
+
.gala-embed--x .gala-embed__icon { background-image: url('../assets/embed-x.svg'); }
|
|
585
|
+
.shiki,
|
|
586
|
+
.shiki span { color: var(--shiki-light); background-color: var(--shiki-light-bg); }
|
|
587
|
+
:root[data-mode='dark'] .shiki,
|
|
588
|
+
:root[data-mode='dark'] .shiki span { color: var(--shiki-dark); background-color: var(--shiki-dark-bg); }
|
|
589
|
+
@media (prefers-color-scheme: dark) {
|
|
590
|
+
:root[data-mode='system'] .shiki,
|
|
591
|
+
:root[data-mode='system'] .shiki span { color: var(--shiki-dark); background-color: var(--shiki-dark-bg); }
|
|
592
|
+
}
|
|
593
|
+
.gala-visually-hidden { position: absolute; inline-size: 1px; block-size: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
|
|
594
|
+
.gala-contact form { display: grid; gap: 1rem; max-inline-size: 42rem; }
|
|
595
|
+
.gala-contact label { display: grid; gap: .35rem; }
|
|
596
|
+
.gala-contact input,
|
|
597
|
+
.gala-contact textarea { font: inherit; padding: .65rem; }
|
|
598
|
+
.gala-contact textarea { min-block-size: 12rem; resize: vertical; }
|
|
599
|
+
|
|
600
|
+
@keyframes gala-spin { to { transform: rotate(1turn); } }
|
|
601
|
+
|
|
602
|
+
@media (min-width: 48rem) {
|
|
603
|
+
.gala-hero { grid-template-columns: minmax(0, 1fr) minmax(18rem, 1fr); }
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
607
|
+
@view-transition { navigation: auto; }
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
/* ---------------------------------------------------------------- the conversation
|
|
611
|
+
A thread is a hierarchy, and the indent is the only thing that says so. It is drawn with a
|
|
612
|
+
rule rather than padding alone, so five levels deep still reads as five levels and not as an
|
|
613
|
+
accident of margin. */
|
|
614
|
+
.gala-comments-island { margin-block-start: var(--gala-space-xl); }
|
|
615
|
+
.gala-comments__heading {
|
|
616
|
+
font-size: var(--gala-text-lg);
|
|
617
|
+
margin-block-end: var(--gala-space-md);
|
|
618
|
+
}
|
|
619
|
+
.gala-comments, .gala-comment-replies { list-style: none; margin: 0; padding: 0; }
|
|
620
|
+
.gala-comment-replies {
|
|
621
|
+
margin-block-start: var(--gala-space-sm);
|
|
622
|
+
margin-inline-start: var(--gala-space-xs);
|
|
623
|
+
padding-inline-start: var(--gala-space-md);
|
|
624
|
+
border-inline-start: 1px solid var(--gala-color-hairline);
|
|
625
|
+
}
|
|
626
|
+
.gala-comment { padding-block: var(--gala-space-sm); }
|
|
627
|
+
.gala-comment + .gala-comment { border-block-start: 1px solid var(--gala-color-hairline); }
|
|
628
|
+
.gala-comment-replies .gala-comment + .gala-comment { border-block-start: 0; }
|
|
629
|
+
.gala-comment__meta {
|
|
630
|
+
display: flex;
|
|
631
|
+
align-items: baseline;
|
|
632
|
+
gap: var(--gala-space-xs);
|
|
633
|
+
margin-block-end: var(--gala-space-2xs);
|
|
634
|
+
font-size: var(--gala-text-sm);
|
|
635
|
+
}
|
|
636
|
+
.gala-comment__meta strong { font-weight: 600; }
|
|
637
|
+
.gala-comment__pending { font-size: var(--gala-text-xs); color: var(--gala-color-muted); }
|
|
638
|
+
.gala-comment__body { margin-block: 0; overflow-wrap: anywhere; }
|
|
639
|
+
|
|
640
|
+
/* The controls stay out of the way until the comment is worth acting on. */
|
|
641
|
+
.gala-comment-actions {
|
|
642
|
+
display: flex;
|
|
643
|
+
gap: var(--gala-space-2xs);
|
|
644
|
+
margin-block-start: var(--gala-space-2xs);
|
|
645
|
+
opacity: 0.72;
|
|
646
|
+
transition: opacity var(--gala-motion-fast) var(--gala-ease);
|
|
647
|
+
}
|
|
648
|
+
.gala-comment:hover > .gala-comment-actions,
|
|
649
|
+
.gala-comment:focus-within > .gala-comment-actions { opacity: 1; }
|
|
650
|
+
.gala-comment-actions button {
|
|
651
|
+
min-block-size: 2rem;
|
|
652
|
+
padding-inline: var(--gala-space-xs);
|
|
653
|
+
font-size: var(--gala-text-xs);
|
|
654
|
+
background: transparent;
|
|
655
|
+
border-color: transparent;
|
|
656
|
+
color: var(--gala-color-muted);
|
|
657
|
+
}
|
|
658
|
+
.gala-comment-actions button:hover { color: var(--gala-color-text); background: var(--gala-color-surface); }
|
|
659
|
+
|
|
660
|
+
.gala-comment__form { display: grid; gap: var(--gala-space-xs); margin-block: var(--gala-space-sm); }
|
|
661
|
+
.gala-comment__form textarea {
|
|
662
|
+
inline-size: 100%;
|
|
663
|
+
box-sizing: border-box;
|
|
664
|
+
padding: var(--gala-space-sm);
|
|
665
|
+
color: inherit;
|
|
666
|
+
background: var(--gala-color-raised);
|
|
667
|
+
border: 1px solid var(--gala-color-border);
|
|
668
|
+
border-radius: var(--gala-radius-control);
|
|
669
|
+
font: inherit;
|
|
670
|
+
font-size: var(--gala-text-sm);
|
|
671
|
+
line-height: var(--gala-leading-body);
|
|
672
|
+
resize: vertical;
|
|
673
|
+
}
|
|
674
|
+
.gala-comment__form textarea:focus-visible { outline: 2px solid var(--gala-color-accent); outline-offset: 1px; }
|
|
675
|
+
.gala-comment__controls { display: flex; gap: var(--gala-space-xs); }
|
|
676
|
+
.gala-comments__status, .gala-comments__empty, .gala-comments__prompt {
|
|
677
|
+
color: var(--gala-color-muted);
|
|
678
|
+
font-size: var(--gala-text-sm);
|
|
679
|
+
}
|
|
680
|
+
.gala-comments__more { margin-block-start: var(--gala-space-md); }
|
|
681
|
+
|
|
682
|
+
/* ---------------------------------------------------------------- where the article ends
|
|
683
|
+
The writing and the conversation about it are different things, and the page has to say so.
|
|
684
|
+
A footnote used to run straight into the author card with nothing between them. */
|
|
685
|
+
.gala-engagement {
|
|
686
|
+
/* Space is reserved before the counts arrive, so the page does not jump under the reader. */
|
|
687
|
+
min-block-size: var(--gala-widget-min-block-size);
|
|
688
|
+
max-inline-size: var(--gala-content-width);
|
|
689
|
+
margin-block-start: var(--gala-space-xl);
|
|
690
|
+
padding-block-start: var(--gala-space-lg);
|
|
691
|
+
border-block-start: 1px solid var(--gala-color-border);
|
|
692
|
+
}
|
|
693
|
+
.gala-engagement-profile {
|
|
694
|
+
display: flex;
|
|
695
|
+
align-items: baseline;
|
|
696
|
+
gap: var(--gala-space-sm);
|
|
697
|
+
padding: 0;
|
|
698
|
+
background: none;
|
|
699
|
+
}
|
|
700
|
+
.gala-engagement-profile h2 { font-size: var(--gala-text-lg); margin: 0; }
|
|
701
|
+
.gala-engagement-profile p { margin: 0; color: var(--gala-color-muted); font-size: var(--gala-text-sm); }
|
|
702
|
+
|
|
703
|
+
/* Counts read as data, not as three stacked paragraphs. */
|
|
704
|
+
.gala-engagement dl {
|
|
705
|
+
display: flex;
|
|
706
|
+
flex-wrap: wrap;
|
|
707
|
+
gap: var(--gala-space-lg);
|
|
708
|
+
margin-block: var(--gala-space-md);
|
|
709
|
+
}
|
|
710
|
+
.gala-engagement dl > div { display: flex; flex-direction: column-reverse; gap: 0.1rem; }
|
|
711
|
+
.gala-engagement dt {
|
|
712
|
+
font-size: var(--gala-text-xs);
|
|
713
|
+
letter-spacing: var(--gala-tracking-wide);
|
|
714
|
+
text-transform: uppercase;
|
|
715
|
+
color: var(--gala-color-muted);
|
|
716
|
+
}
|
|
717
|
+
.gala-engagement dd {
|
|
718
|
+
margin: 0;
|
|
719
|
+
font-size: var(--gala-text-lg);
|
|
720
|
+
font-variant-numeric: tabular-nums;
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
.gala-reaction-actions { display: flex; flex-wrap: wrap; gap: var(--gala-space-2xs); }
|
|
724
|
+
.gala-engagement-actions { display: grid; gap: var(--gala-space-sm); justify-items: start; }
|
|
725
|
+
.gala-engagement-actions > [data-follow-article] { inline-size: auto; }
|
|
726
|
+
.gala-share { margin-block-start: var(--gala-space-lg); }
|
|
727
|
+
|
|
728
|
+
/* v2 keeps every reader action in one stable DOM region. The rail is pure CSS: no scroll
|
|
729
|
+
observer toggles competing copies, so reaching the conversation cannot cause flicker. */
|
|
730
|
+
.gala-engagement { position: relative; margin-block-start: clamp(4rem, 9vw, 8rem); }
|
|
731
|
+
.gala-conversation {
|
|
732
|
+
max-width: var(--gala-measure);
|
|
733
|
+
margin-inline: auto;
|
|
734
|
+
padding-block: clamp(3rem, 7vw, 6rem);
|
|
735
|
+
}
|
|
736
|
+
.gala-conversation__header { margin-block-end: var(--gala-space-xl); }
|
|
737
|
+
.gala-conversation__header h2 {
|
|
738
|
+
margin: 0;
|
|
739
|
+
font: var(--gala-weight-display) var(--gala-text-2xl)/var(--gala-leading-tight) var(--gala-font-display);
|
|
740
|
+
letter-spacing: var(--gala-tracking-tight);
|
|
741
|
+
}
|
|
742
|
+
.gala-action-rail {
|
|
743
|
+
position: sticky;
|
|
744
|
+
z-index: 4;
|
|
745
|
+
inset-block-start: 6rem;
|
|
746
|
+
float: left;
|
|
747
|
+
width: 3.25rem;
|
|
748
|
+
margin-inline-start: max(-5rem, calc((var(--gala-measure) - 100%) / 2 - 4rem));
|
|
749
|
+
display: grid;
|
|
750
|
+
gap: .5rem;
|
|
751
|
+
padding: .5rem;
|
|
752
|
+
border: 1px solid var(--gala-color-hairline);
|
|
753
|
+
border-radius: 999px;
|
|
754
|
+
background: color-mix(in srgb, var(--gala-color-background) 88%, transparent);
|
|
755
|
+
box-shadow: var(--gala-shadow-high);
|
|
756
|
+
backdrop-filter: blur(16px);
|
|
757
|
+
}
|
|
758
|
+
.gala-action-rail button,
|
|
759
|
+
.gala-action-rail a {
|
|
760
|
+
inline-size: 2.25rem;
|
|
761
|
+
min-block-size: 2.25rem;
|
|
762
|
+
display: grid;
|
|
763
|
+
place-items: center;
|
|
764
|
+
padding: 0;
|
|
765
|
+
border: 0;
|
|
766
|
+
border-radius: 50%;
|
|
767
|
+
color: var(--gala-color-muted);
|
|
768
|
+
background: transparent;
|
|
769
|
+
font: 600 var(--gala-text-xs)/1 var(--gala-font-body);
|
|
770
|
+
text-decoration: none;
|
|
771
|
+
cursor: pointer;
|
|
772
|
+
}
|
|
773
|
+
.gala-action-rail button:hover,
|
|
774
|
+
.gala-action-rail a:hover,
|
|
775
|
+
.gala-action-rail button[aria-pressed='true'] {
|
|
776
|
+
color: var(--gala-color-background);
|
|
777
|
+
background: var(--gala-color-accent);
|
|
778
|
+
}
|
|
779
|
+
.gala-action-rail .gala-reaction-actions,
|
|
780
|
+
.gala-action-rail .gala-share { display: contents; }
|
|
781
|
+
.gala-action-rail .gala-share__fallback {
|
|
782
|
+
position: fixed;
|
|
783
|
+
inline-size: 1px;
|
|
784
|
+
block-size: 1px;
|
|
785
|
+
overflow: hidden;
|
|
786
|
+
clip-path: inset(50%);
|
|
787
|
+
}
|
|
788
|
+
.gala-action-rail .gala-share__fallback--visible {
|
|
789
|
+
z-index: 10;
|
|
790
|
+
inset: auto 1rem 1rem;
|
|
791
|
+
inline-size: min(32rem, calc(100vw - 2rem));
|
|
792
|
+
block-size: auto;
|
|
793
|
+
padding: .75rem;
|
|
794
|
+
overflow: visible;
|
|
795
|
+
clip-path: none;
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
@media (max-width: 54rem) {
|
|
799
|
+
.gala-action-rail {
|
|
800
|
+
inset-block-start: auto;
|
|
801
|
+
inset-block-end: 1rem;
|
|
802
|
+
float: none;
|
|
803
|
+
box-sizing: border-box;
|
|
804
|
+
width: calc(100% - 2rem);
|
|
805
|
+
max-width: calc(100% - 2rem);
|
|
806
|
+
margin: 0 auto;
|
|
807
|
+
grid-auto-flow: column;
|
|
808
|
+
overflow-x: auto;
|
|
809
|
+
}
|
|
810
|
+
.gala-conversation { padding-block-start: var(--gala-space-xl); }
|
|
811
|
+
}
|