@rathnasgala2/template 2.2.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,52 +1,41 @@
1
1
  /**
2
- * The template-owned `gala-base` cascade layer (TPL-H3/TPL-M7): a
3
- * stylesheet this renderer itself writes on every build, independent of
4
- * whether a theme is selected, carrying sane defaults for every
5
- * contract-mandated chrome element (`internal/skeleton.js`'s skip link,
6
- * headings, code/table overflow, image sizing, responsive spacing) plus the
7
- * one rule that makes the closed token catalog's
8
- * `color-focus`/`focus-width` tokens actually paint a ring (THD-H1): a real
9
- * `outline-style: solid` under `:focus-visible`.
2
+ * The template-owned `gala-base` cascade layer: the stylesheet this renderer
3
+ * itself writes on every build, independent of whether a theme is selected.
4
+ * Since contract 3.0.0 it owns the whole layout and every component rule of
5
+ * the site (header, cards, article, prose, code, search dialog, footer,
6
+ * responsive breakpoints, scroll-driven and view-transition motion). A theme
7
+ * supplies only design values (the closed token catalog, `--gala-<token-key>`
8
+ * custom properties declared in the `gala-tokens` layer) plus optional skin
9
+ * CSS; no component rule below contains a literal colour, font family or
10
+ * radius, so restyling the site is a token change.
10
11
  *
11
- * This file is not admitted through, or generated from, the theme package
12
- * pipeline in `internal/theme-assets.js` — it is not subject to
13
- * `check-css-hooks.mjs`'s closed selector-admission grammar and may use any
14
- * selector, property or pseudo-class, including `:focus-visible`,
15
- * `html`/`body` and functional colors, because it is authored by the
16
- * template, not by a theme. Its bytes are a pure function of this module's
17
- * own literal source, not of any per-publication or per-theme input, so a
18
- * fixed, non-content-addressed output path carries no collision risk
19
- * (mirrors `internal/appearance/bootstrap-script.js`'s own reasoning for its
20
- * fixed path).
12
+ * Two parts, both inside one `@layer gala-base { ... }` block:
21
13
  *
22
- * Every custom property this file reads (`--gala-*`) is read through a
23
- * fallback value, since a theme is optional (`internal/theme-assets.js`'s
24
- * `defaultThemeStylesheetLinksHtml` fallback path never defines any
25
- * `--gala-*` property at all) — this layer must still produce a sane,
26
- * legible default with no theme selected whatsoever.
14
+ * 1. {@link GALA_BASE_DEFAULT_TOKEN_CSS}: a compact default value for every
15
+ * token, light and dark, so a publication with no theme selected is still
16
+ * legible. Being in the lowest layer, any theme token declaration wins
17
+ * regardless of selector specificity.
18
+ * 2. {@link GALA_BASE_COMPONENT_CSS}: the component rules, which read tokens
19
+ * only (`test/base-layer-tokens.test.js` enforces that every `var()` names
20
+ * a catalog token and that no component rule carries a colour literal).
27
21
  *
28
- * Cascade-layer precedence (TPL-M7): this layer's own declarations always
29
- * lose to a theme's `gala-tokens`/`gala-components`/`gala-utilities` layer
30
- * declarations for the same property on the same element, because this
31
- * stylesheet's own first line is the fixed `@layer gala-base, gala-tokens,
32
- * gala-components, gala-utilities, gala-print;` order statement — layer
33
- * order is declared once, explicitly, independent of `<link>` emission
34
- * order, and independent of which optional stylesheets a theme ships (a
35
- * theme that omits `utilities.css` never populates `gala-utilities`, which
36
- * is harmless: an empty layer in a declared order does nothing). A bare
37
- * `@layer name, name, ...;` statement is not itself a style rule, so it
38
- * needs no `'unsafe-inline'`/nonce/hash exemption from the
39
- * `style-src 'self'` CSP baseline the way an inline `<style>` element would
40
- * (TPL-H4): it ships as the first bytes of this external, same-origin
41
- * stylesheet, and `internal/eleventy-render.js` always emits this
42
- * stylesheet's own `<link>` before every theme stylesheet `<link>`.
22
+ * The layer-order statement (`@layer gala-base, gala-tokens, ...;`) is the
23
+ * stylesheet's first line, so layer order is independent of `<link>` order
24
+ * and needs no inline `<style>` (CSP `style-src 'self'`). A top-level
25
+ * `@view-transition { navigation: auto; }` (inside
26
+ * `prefers-reduced-motion: no-preference`) opts every page into
27
+ * cross-document view transitions; the optional site script names the cover
28
+ * image so it morphs between a card and its article.
29
+ *
30
+ * Its bytes are a pure function of this module's own source, never of any
31
+ * per-publication or per-theme input, so a fixed output path carries no
32
+ * collision risk.
43
33
  */
44
34
 
45
35
  import { ORDERED_LAYERS } from './styling-contract.js';
46
36
 
47
37
  /** @type {string} the candidate-output-directory-relative path this
48
- * stylesheet is always written to (never content-addressed; see module
49
- * documentation). */
38
+ * stylesheet is always written to (never content-addressed). */
50
39
  export const GALA_BASE_STYLESHEET_PATH = 'assets/gala-base-v1.css';
51
40
 
52
41
  /** @type {string} the `manifestAsset`/`manifestRoute` `mediaType` for this
@@ -54,127 +43,712 @@ export const GALA_BASE_STYLESHEET_PATH = 'assets/gala-base-v1.css';
54
43
  export const GALA_BASE_STYLESHEET_MEDIA_TYPE = 'text/css; charset=utf-8';
55
44
 
56
45
  /**
57
- * The exact `gala-base` layer source, byte-for-byte deterministic across
58
- * builds (no interpolated per-build value of any kind). Its first line is
59
- * the fixed layer-order statement every published page relies on (see
60
- * module documentation).
46
+ * Default value of every token as `[light, dark]` (a bare string is the same
47
+ * in both palettes), mirroring the reference "Default" theme. The key order
48
+ * is the catalog's own byte order.
49
+ *
50
+ * @type {Readonly<Record<string, string | string[]>>}
51
+ */
52
+ const DEFAULT_TOKENS = Object.freeze({
53
+ 'border-button': 'none',
54
+ 'border-card': ['1px solid #e2e6ec', '1px solid #232a34'],
55
+ 'border-chip': 'none',
56
+ 'border-code': ['none', '1px solid #232a34'],
57
+ 'border-media-divider': 'none',
58
+ 'border-quote': ['4px solid #2b59ff', '4px solid #7b97ff'],
59
+ 'border-row-divider': 'none',
60
+ 'border-section-rule': 'none',
61
+ 'border-width': '1px',
62
+ 'card-inset': '0.5rem',
63
+ 'card-pad': '0.75rem 0.9rem 1.1rem',
64
+ 'card-title-size': '1.25rem',
65
+ 'chip-pad': '0.28rem 0.65rem',
66
+ 'color-accent': ['#2b59ff', '#7b97ff'],
67
+ 'color-accent-2': ['#00a3a3', '#3fd0c9'],
68
+ 'color-border': ['#e2e6ec', '#232a34'],
69
+ 'color-btn-panel': '#ffffff',
70
+ 'color-btn-panel-text': ['#2b59ff', '#18245c'],
71
+ 'color-btn-text': ['#ffffff', '#0b1020'],
72
+ 'color-canvas': ['#f7f8fa', '#0b0d11'],
73
+ 'color-chip-text': ['#1d3fc4', '#b5c6ff'],
74
+ 'color-code-canvas': ['#0f1520', '#0f1319'],
75
+ 'color-code-text': '#e6edf6',
76
+ 'color-danger': ['#c92a2a', '#ff8787'],
77
+ 'color-focus': ['#2b59ff', '#9db2ff'],
78
+ 'color-footer': ['#ffffff', '#12161c'],
79
+ 'color-header': ['#f7f8facc', '#0b0d11b8'],
80
+ 'color-icon-accent': ['#2b59ff', '#7b97ff'],
81
+ 'color-input': '#ffffff1a',
82
+ 'color-input-border': '#ffffff4d',
83
+ 'color-link': ['#2148e0', '#9db2ff'],
84
+ 'color-link-underline': ['#2148e059', '#9db2ff59'],
85
+ 'color-link-underline-hover': ['#2148e0', '#9db2ff'],
86
+ 'color-link-visited': ['#5b3fc4', '#b79dff'],
87
+ 'color-on-accent': ['#ffffff', '#0b1020'],
88
+ 'color-overlay': ['#0a0e1473', '#00000099'],
89
+ 'color-panel-muted': '#ffffffc7',
90
+ 'color-panel-text': '#ffffff',
91
+ 'color-selection': ['#cfdbff', '#2a3a7a'],
92
+ 'color-success': ['#1f8a4c', '#5fd18b'],
93
+ 'color-surface': ['#ffffff', '#12161c'],
94
+ 'color-surface-raised': ['#eef1f5', '#1a1f27'],
95
+ 'color-syntax-comment': '#7d8aa0',
96
+ 'color-syntax-function': '#7cc7ff',
97
+ 'color-syntax-keyword': '#c4a7ff',
98
+ 'color-syntax-number': '#ffc27a',
99
+ 'color-syntax-string': '#9be3a5',
100
+ 'color-text': ['#0f1419', '#e8ecf2'],
101
+ 'color-text-faint': ['#8a94a3', '#6b7686'],
102
+ 'color-text-muted': ['#556070', '#9aa5b5'],
103
+ 'color-toc-active': '#00000000',
104
+ 'color-toc-active-text': ['#0f1419', '#e8ecf2'],
105
+ 'color-warning': ['#b26a00', '#ffb454'],
106
+ 'content-measure': '42rem',
107
+ 'decor-size': '100% 46rem',
108
+ 'display-max': '4rem',
109
+ 'display-style': 'normal',
110
+ 'duration-base': '320ms',
111
+ 'duration-fast': '160ms',
112
+ 'duration-slow': '700ms',
113
+ 'ease-spring': 'cubic-bezier(0.34, 1.4, 0.64, 1)',
114
+ 'ease-standard': 'cubic-bezier(0.2, 0.8, 0.2, 1)',
115
+ 'focus-width': '3px',
116
+ 'font-body':
117
+ 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',
118
+ 'font-display':
119
+ 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',
120
+ 'font-label':
121
+ 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',
122
+ 'font-mono': 'ui-monospace, "SF Mono", Menlo, Consolas, monospace',
123
+ 'font-ui':
124
+ 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',
125
+ 'label-transform': 'uppercase',
126
+ 'lift-x': '0',
127
+ 'lift-y': '-4px',
128
+ 'link-offset': '0.22em',
129
+ 'link-offset-hover': '0.3em',
130
+ 'link-skip-ink': 'auto',
131
+ 'link-thickness': '0.08em',
132
+ 'media-filter': 'none',
133
+ 'media-filter-hover': 'none',
134
+ 'media-zoom': '1.045',
135
+ 'paint-button': ['#2b59ff', '#7b97ff'],
136
+ 'paint-chip': ['#e8eeff', '#1a2346'],
137
+ 'paint-page-decor': [
138
+ 'radial-gradient(60rem 28rem at 88% -8%, #dfe7ff 0%, transparent 62%)',
139
+ 'radial-gradient(60rem 28rem at 88% -8%, #17204a 0%, transparent 62%)',
140
+ ],
141
+ 'paint-panel': [
142
+ 'linear-gradient(135deg, #1d3fc4, #2b59ff 55%, #00a3a3)',
143
+ 'linear-gradient(135deg, #18245c, #2a3f9e 55%, #0f6f6c)',
144
+ ],
145
+ 'prose-leading': '1.75',
146
+ 'prose-size': '1.125rem',
147
+ 'quote-align': 'start',
148
+ 'quote-mark': 'none',
149
+ 'quote-pad': '0.25em 0 0.25em 1.25em',
150
+ 'quote-style': 'normal',
151
+ 'quote-transform': 'none',
152
+ 'radius-avatar': '50%',
153
+ 'radius-large': '22px',
154
+ 'radius-media': '10px',
155
+ 'radius-medium': '14px',
156
+ 'radius-pill': '999px',
157
+ 'radius-small': '8px',
158
+ 'row-pad': '0',
159
+ 'shadow-avatar-ring': [
160
+ '0 0 0 2px #f7f8fa, 0 0 0 3px #e2e6ec',
161
+ '0 0 0 2px #0b0d11, 0 0 0 3px #232a34',
162
+ ],
163
+ 'shadow-button': [
164
+ '0 1px 2px #1018281f, 0 6px 16px -8px #2b59ff8c',
165
+ '0 6px 18px -8px #7b97ff99',
166
+ ],
167
+ 'shadow-card': [
168
+ '0 1px 2px #1018280d, 0 10px 24px -14px #1018282e',
169
+ 'inset 0 1px 0 #ffffff08, 0 12px 28px -16px #000000b3',
170
+ ],
171
+ 'shadow-card-hover': [
172
+ '0 2px 4px #1018280f, 0 28px 48px -22px #10182852',
173
+ 'inset 0 1px 0 #ffffff0d, 0 30px 50px -24px #000000d9',
174
+ ],
175
+ 'shadow-dialog': [
176
+ '0 40px 80px -20px #0a0e1473',
177
+ '0 40px 80px -20px #000000cc',
178
+ ],
179
+ 'space-1': '0.25rem',
180
+ 'space-2': '0.5rem',
181
+ 'space-3': '0.75rem',
182
+ 'space-4': '1rem',
183
+ 'space-6': '1.5rem',
184
+ 'space-8': '2rem',
185
+ 'title-transform': 'none',
186
+ 'tracking-display': '-0.035em',
187
+ 'tracking-label': '0.08em',
188
+ 'tracking-title': '-0.015em',
189
+ 'weight-display': '800',
190
+ 'weight-normal': '400',
191
+ 'weight-strong': '700',
192
+ 'weight-title': '700',
193
+ 'weight-ui': '600',
194
+ });
195
+
196
+ /** @type {readonly string[]} every token key this layer defaults, sorted. */
197
+ export const GALA_BASE_DEFAULT_TOKEN_KEYS = Object.freeze(
198
+ Object.keys(DEFAULT_TOKENS),
199
+ );
200
+
201
+ /**
202
+ * @param {number} index 0 for light, 1 for dark
203
+ * @returns {string} the declaration list for one palette
204
+ */
205
+ function defaultDeclarations(index) {
206
+ return Object.entries(DEFAULT_TOKENS)
207
+ .map(([key, value]) => {
208
+ const resolved = typeof value === 'string' ? value : (value[index] ?? '');
209
+ return `--gala-${key}:${resolved};`;
210
+ })
211
+ .join('');
212
+ }
213
+
214
+ /**
215
+ * Default token values, light then dark, in the template's own layer.
61
216
  *
62
217
  * @type {string}
63
218
  */
64
- export const GALA_BASE_STYLESHEET_SOURCE = `@layer ${ORDERED_LAYERS.join(', ')};
219
+ export const GALA_BASE_DEFAULT_TOKEN_CSS =
220
+ `[data-gala-publication-root]{color-scheme:light;${defaultDeclarations(0)}}\n` +
221
+ `[data-gala-publication-root][data-gala-resolved-color-mode="dark"]{color-scheme:dark;${defaultDeclarations(1)}}\n`;
65
222
 
66
- @layer gala-base {
223
+ /**
224
+ * The component rules: tokens only, no colour literal.
225
+ *
226
+ * @type {string}
227
+ */
228
+ export const GALA_BASE_COMPONENT_CSS = `
229
+ /* ---------- root ---------- */
67
230
  [data-gala-publication-root] {
68
- box-sizing: border-box;
69
- }
70
- [data-gala-publication-root] *,
71
- [data-gala-publication-root] *::before,
72
- [data-gala-publication-root] *::after {
73
- box-sizing: inherit;
74
- }
75
-
76
- /* Skip link: the first focusable element on every page, visually hidden
77
- until it receives keyboard focus, so it is announced and reachable by
78
- assistive technology and keyboard users without being the first visible
79
- line of every published page. */
80
- [data-gala-publication-root] a[href="#main-content"] {
81
- position: absolute;
82
- top: -9999px;
83
- left: 0;
84
- z-index: 9999;
85
- padding: var(--gala-space-2, 0.5rem) var(--gala-space-4, 1rem);
86
- background-color: var(--gala-color-surface, Canvas);
87
- color: var(--gala-color-text, CanvasText);
88
- }
89
- [data-gala-publication-root] a[href="#main-content"]:focus-visible {
90
- top: 0;
91
- }
92
-
93
- /* The one rule that makes the closed token catalog's color-focus/
94
- focus-width tokens actually paint a ring: outline-style is never set by
95
- the token catalog alone (outline-color/outline-width longhands paint
96
- nothing without it), and this layer's own low cascade precedence means
97
- any theme-declared outline-color/outline-width in gala-components still
98
- wins for the same element. */
231
+ min-height: 100vh;
232
+ scroll-padding-top: 6rem;
233
+ background: var(--gala-paint-page-decor) no-repeat, var(--gala-color-canvas);
234
+ background-size: var(--gala-decor-size), auto;
235
+ color: var(--gala-color-text);
236
+ font-family: var(--gala-font-body);
237
+ font-weight: var(--gala-weight-normal);
238
+ font-size: 1rem;
239
+ line-height: 1.55;
240
+ -webkit-font-smoothing: antialiased;
241
+ text-rendering: optimizeLegibility;
242
+ -webkit-text-size-adjust: 100%;
243
+ text-size-adjust: 100%;
244
+ }
245
+ [data-gala-publication-root] body {
246
+ margin: 0;
247
+ transition: background-color var(--gala-duration-base) var(--gala-ease-standard), color var(--gala-duration-base) var(--gala-ease-standard);
248
+ }
249
+ [data-gala-publication-root] *, [data-gala-publication-root] *::before, [data-gala-publication-root] *::after { box-sizing: border-box; }
250
+ [data-gala-publication-root] [hidden] { display: none !important; }
251
+ [data-gala-publication-root] ::selection { background: var(--gala-color-selection); color: var(--gala-color-text); }
252
+ /* The one rule that makes the focus tokens paint a ring: outline-style is
253
+ never set by a token, and this layer's low precedence lets a theme's
254
+ outline-color/outline-width still win. */
99
255
  [data-gala-publication-root] :focus-visible {
100
256
  outline-style: solid;
101
- outline-width: var(--gala-focus-width, 2px);
102
- outline-color: var(--gala-color-focus, Highlight);
103
- outline-offset: 2px;
257
+ outline-width: var(--gala-focus-width);
258
+ outline-color: var(--gala-color-focus);
259
+ outline-offset: 3px;
104
260
  }
261
+ [data-gala-publication-root] img { display: block; max-width: 100%; height: auto; }
262
+ [data-gala-publication-root] a { color: inherit; text-decoration: none; }
263
+ [data-gala-publication-root] h1, [data-gala-publication-root] h2, [data-gala-publication-root] h3, [data-gala-publication-root] p { margin: 0; }
264
+ [data-gala-publication-root] button { font: inherit; color: inherit; }
265
+ [data-gala-publication-root] ul, [data-gala-publication-root] ol { margin: 0; padding: 0; list-style: none; }
266
+
267
+ .g-wrap { width: 100%; max-width: 76rem; margin-inline: auto; padding-inline: clamp(16px, 4vw, 40px); }
268
+ .g-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
269
+ .g-main { outline: none; }
270
+ .g-icon { width: 1.1em; height: 1.1em; flex: none; fill: none; stroke: currentColor; stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round; }
271
+ .g-dot { display: inline-block; width: 3px; height: 3px; border-radius: 50%; background: currentColor; opacity: .55; margin-inline: .55em; vertical-align: middle; }
272
+ .g-skip { position: absolute; left: var(--gala-space-4); top: -4rem; z-index: 50; padding: var(--gala-space-3) var(--gala-space-4); background: var(--gala-paint-button); color: var(--gala-color-btn-text); border-radius: var(--gala-radius-small); font-family: var(--gala-font-ui); }
273
+ .g-skip:focus { top: var(--gala-space-4); }
105
274
 
106
- /* Type scale, expressed with clamp() so it scales between a phone and a
107
- desktop viewport without a discrete breakpoint; no theme sets this. */
108
- [data-gala-publication-root] h1 {
109
- font-size: clamp(1.75rem, 1.4rem + 1.5vw, 2.5rem);
110
- line-height: 1.2;
275
+ /* ---------- type primitives ---------- */
276
+ .g-label {
277
+ display: inline-flex; align-items: center; gap: .45em;
278
+ font-family: var(--gala-font-label); font-size: .75rem; font-weight: var(--gala-weight-ui);
279
+ text-transform: var(--gala-label-transform); letter-spacing: var(--gala-tracking-label); color: var(--gala-color-text-muted);
111
280
  }
112
- [data-gala-publication-root] h2 {
113
- font-size: clamp(1.375rem, 1.2rem + 0.8vw, 1.875rem);
114
- line-height: 1.25;
281
+ .g-hero h2, .g-article-head h1, .g-topic-hero h1 {
282
+ font-family: var(--gala-font-display); font-weight: var(--gala-weight-display); font-style: var(--gala-display-style);
283
+ font-size: clamp(2.25rem, 1.2rem + 3.6vw, var(--gala-display-max)); line-height: 1.02;
284
+ letter-spacing: var(--gala-tracking-display); text-transform: var(--gala-title-transform); text-wrap: balance;
115
285
  }
116
- [data-gala-publication-root] h3 {
117
- font-size: clamp(1.125rem, 1.05rem + 0.4vw, 1.375rem);
118
- line-height: 1.3;
286
+ .g-topic-hero h1 { font-size: clamp(2rem, 1.2rem + 2.8vw, calc(var(--gala-display-max) * .8)); }
287
+ .g-hero h2 a { background: linear-gradient(currentColor, currentColor) 0 100% / 0 .06em no-repeat; transition: background-size var(--gala-duration-slow) var(--gala-ease-standard); }
288
+ .g-hero h2 a:hover { background-size: 100% .06em; }
289
+ .g-dek { font-size: clamp(1.075rem, 1rem + .35vw, 1.3rem); line-height: 1.5; color: var(--gala-color-text-muted); text-wrap: pretty; max-width: 40rem; }
290
+ .g-section-head h2, .g-series-card h2, .g-panel h2 {
291
+ font-family: var(--gala-font-display); font-weight: var(--gala-weight-title); font-size: clamp(1.45rem, 1.2rem + .9vw, 2rem);
292
+ letter-spacing: var(--gala-tracking-title); text-transform: var(--gala-title-transform); line-height: 1.15;
119
293
  }
120
- [data-gala-publication-root] h4,
121
- [data-gala-publication-root] h5,
122
- [data-gala-publication-root] h6 {
123
- font-size: clamp(1rem, 0.96rem + 0.2vw, 1.125rem);
124
- line-height: 1.35;
294
+ .g-meta { display: inline-flex; align-items: center; flex-wrap: wrap; font-family: var(--gala-font-ui); font-size: .8125rem; color: var(--gala-color-text-muted); font-variant-numeric: tabular-nums; }
295
+ .g-meta > span:last-child { display: inline-flex; align-items: center; gap: .3em; }
296
+ .g-meta .g-icon { width: .95em; height: .95em; }
297
+ .g-kbd { font-family: var(--gala-font-mono); font-size: .7rem; padding: .1rem .4rem; border-radius: var(--gala-radius-small); border: var(--gala-border-width) solid var(--gala-color-border); color: var(--gala-color-text-muted); background: var(--gala-color-surface); }
298
+
299
+ /* ---------- controls ---------- */
300
+ .g-btn {
301
+ display: inline-flex; align-items: center; justify-content: center; gap: .55em;
302
+ min-height: 2.75rem; padding: .7rem 1.2rem; border-radius: var(--gala-radius-pill);
303
+ background: var(--gala-paint-button); color: var(--gala-color-btn-text); border: var(--gala-border-button); box-shadow: var(--gala-shadow-button);
304
+ font-family: var(--gala-font-ui); font-weight: var(--gala-weight-ui); font-size: .9375rem; letter-spacing: -0.005em;
305
+ cursor: pointer; white-space: nowrap;
306
+ transition: transform var(--gala-duration-fast) var(--gala-ease-standard), box-shadow var(--gala-duration-base) var(--gala-ease-standard), filter var(--gala-duration-base) var(--gala-ease-standard);
125
307
  }
126
- [data-gala-publication-root] p,
127
- [data-gala-publication-root] li {
128
- font-size: 1rem;
129
- line-height: 1.6;
308
+ .g-btn .g-icon { transition: transform var(--gala-duration-base) var(--gala-ease-spring); }
309
+ .g-btn:hover { filter: brightness(1.07) saturate(1.05); transform: translateY(-2px); }
310
+ .g-btn:hover .g-icon { transform: translateX(3px); }
311
+ .g-btn:active { transform: scale(.97); }
312
+
313
+ .g-icon-btn {
314
+ display: inline-grid; place-items: center; width: 2.5rem; height: 2.5rem; flex: none; padding: 0;
315
+ border-radius: var(--gala-radius-pill); border: var(--gala-border-width) solid transparent; background: transparent; color: var(--gala-color-text-muted); cursor: pointer;
316
+ transition: background-color var(--gala-duration-fast) var(--gala-ease-standard), color var(--gala-duration-fast) var(--gala-ease-standard), transform var(--gala-duration-fast) var(--gala-ease-standard);
130
317
  }
131
- [data-gala-publication-root] code,
132
- [data-gala-publication-root] pre {
133
- /* Corrects the monospace optical-size mismatch against surrounding
134
- proportional text at the same nominal font-size. */
135
- font-size: 0.9em;
318
+ .g-icon-btn .g-icon { width: 1.2rem; height: 1.2rem; }
319
+ .g-icon-btn:hover { background: var(--gala-color-surface-raised); color: var(--gala-color-text); }
320
+ .g-icon-btn:active { transform: scale(.92); }
321
+ .g-icon-btn[aria-pressed="true"] { color: var(--gala-color-accent); }
322
+ .g-icon-btn[aria-pressed="true"] .g-icon { fill: currentColor; }
323
+ .g-mode-icon { display: none; animation: g-spin-in var(--gala-duration-slow) var(--gala-ease-spring); }
324
+ .g-mode-system { display: inline-grid; }
325
+ [data-gala-color-mode-selection="light"] .g-mode-system, [data-gala-color-mode-selection="dark"] .g-mode-system { display: none; }
326
+ [data-gala-color-mode-selection="light"] .g-mode-light, [data-gala-color-mode-selection="dark"] .g-mode-dark { display: inline-grid; }
327
+ @keyframes g-spin-in { from { transform: rotate(-90deg) scale(.6); opacity: 0; } }
328
+
329
+ .g-chip {
330
+ display: inline-flex; align-items: center; gap: .35em; position: relative; z-index: 2;
331
+ padding: var(--gala-chip-pad); border-radius: var(--gala-radius-pill); border: var(--gala-border-chip);
332
+ background: var(--gala-paint-chip); color: var(--gala-color-chip-text);
333
+ font-family: var(--gala-font-label); font-size: .72rem; font-weight: var(--gala-weight-ui);
334
+ text-transform: var(--gala-label-transform); letter-spacing: var(--gala-tracking-label); line-height: 1.3;
335
+ transition: filter var(--gala-duration-fast) var(--gala-ease-standard), transform var(--gala-duration-fast) var(--gala-ease-standard);
136
336
  }
337
+ .g-chip:hover { filter: brightness(.96) saturate(1.2); }
338
+ .g-badge { display: inline-flex; align-items: center; gap: .35em; font-family: var(--gala-font-label); font-size: .72rem; font-weight: var(--gala-weight-ui); text-transform: var(--gala-label-transform); letter-spacing: var(--gala-tracking-label); color: var(--gala-color-icon-accent); }
339
+ .g-series-tag { display: inline-flex; align-items: center; gap: .35em; font-family: var(--gala-font-ui); font-size: .78rem; color: var(--gala-color-text-muted); }
340
+ .g-avatar { display: inline-grid; place-items: center; width: 2.5rem; height: 2.5rem; aspect-ratio: 1 / 1; border-radius: var(--gala-radius-avatar); object-fit: cover; flex: none; box-shadow: var(--gala-shadow-avatar-ring); background: var(--gala-paint-button); color: var(--gala-color-btn-text); font-family: var(--gala-font-display); font-weight: var(--gala-weight-display); font-size: .9rem; overflow: hidden; }
341
+ .g-byline { display: flex; align-items: center; gap: var(--gala-space-3); min-width: 0; }
342
+ .g-byline-text { display: grid; gap: .1rem; min-width: 0; font-family: var(--gala-font-ui); font-weight: var(--gala-weight-ui); font-size: .9375rem; }
343
+ .g-byline-text a:hover { text-decoration: underline; }
344
+ .g-byline-text .g-meta { font-weight: var(--gala-weight-normal); }
137
345
 
138
- /* Overflow/wrap containment: constrains a fenced code block or an
139
- unbroken long token in prose to the viewport, never the whole page. */
140
- [data-gala-publication-root] pre {
141
- overflow-x: auto;
346
+ /* ---------- header ---------- */
347
+ .g-progress {
348
+ position: fixed; inset: env(safe-area-inset-top, 0px) 0 auto 0; height: 3px; z-index: 40;
349
+ background: linear-gradient(90deg, var(--gala-color-accent), var(--gala-color-accent-2)); transform-origin: 0 50%; transform: scaleX(0);
350
+ }
351
+ .g-header {
352
+ position: sticky; top: env(safe-area-inset-top, 0px); z-index: 30;
353
+ background: var(--gala-color-header); border-bottom: var(--gala-border-width) solid var(--gala-color-border);
354
+ -webkit-backdrop-filter: blur(16px) saturate(1.5); backdrop-filter: blur(16px) saturate(1.5);
355
+ }
356
+ .g-header-row { display: flex; align-items: center; gap: var(--gala-space-6); min-height: 4.25rem; }
357
+ .g-brand { display: inline-flex; align-items: center; gap: .7rem; min-width: 0; }
358
+ .g-mark {
359
+ display: inline-grid; place-items: center; width: 2.25rem; height: 2.25rem; flex: none; overflow: hidden;
360
+ border-radius: var(--gala-radius-medium); background: var(--gala-paint-button); color: var(--gala-color-btn-text); border: var(--gala-border-button);
361
+ font-family: var(--gala-font-display); font-weight: var(--gala-weight-display); font-size: .9rem; letter-spacing: -0.04em;
362
+ transition: transform var(--gala-duration-base) var(--gala-ease-spring);
142
363
  }
143
- [data-gala-publication-root] article {
144
- overflow-wrap: anywhere;
364
+ .g-mark img { width: 100%; height: 100%; object-fit: cover; }
365
+ .g-brand:hover .g-mark { transform: rotate(-8deg) scale(1.06); }
366
+ .g-brand-text { display: grid; line-height: 1.15; min-width: 0; }
367
+ .g-brand-name { font-family: var(--gala-font-display); font-weight: var(--gala-weight-title); font-size: 1.125rem; letter-spacing: var(--gala-tracking-title); text-transform: var(--gala-title-transform); white-space: nowrap; }
368
+ .g-brand-tag { font-family: var(--gala-font-ui); font-size: .75rem; color: var(--gala-color-text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
369
+ .g-nav { margin-inline: auto; }
370
+ .g-nav > ul { display: flex; gap: .25rem; }
371
+ .g-nav li { position: relative; }
372
+ .g-nav a {
373
+ position: relative; display: block; padding: .5rem .8rem; border-radius: var(--gala-radius-pill);
374
+ font-family: var(--gala-font-ui); font-size: .9rem; font-weight: var(--gala-weight-ui); color: var(--gala-color-text-muted);
375
+ transition: color var(--gala-duration-fast) var(--gala-ease-standard), background-color var(--gala-duration-fast) var(--gala-ease-standard);
145
376
  }
146
- [data-gala-publication-root] img {
147
- max-width: 100%;
148
- height: auto;
377
+ .g-nav a:hover { color: var(--gala-color-text); background: var(--gala-color-surface-raised); }
378
+ .g-nav a[aria-current="page"] { color: var(--gala-color-text); }
379
+ .g-nav a[aria-current="page"]::after { content: ""; position: absolute; left: .8rem; right: .8rem; bottom: .15rem; height: 2px; border-radius: 2px; background: var(--gala-color-accent); }
380
+ .g-nav li > ul {
381
+ display: none; position: absolute; left: 0; top: 100%; z-index: 5; min-width: 12rem; padding: var(--gala-space-2);
382
+ background: var(--gala-color-surface); border: var(--gala-border-card); border-radius: var(--gala-radius-medium); box-shadow: var(--gala-shadow-card-hover);
149
383
  }
384
+ .g-nav li:hover > ul, .g-nav li:focus-within > ul { display: grid; }
385
+ .g-actions { display: flex; align-items: center; gap: .35rem; margin-left: auto; }
386
+ .g-nav + .g-actions { margin-left: 0; }
387
+ .g-actions > [data-gala-slot] { display: contents; }
388
+ .g-search-btn {
389
+ display: inline-flex; align-items: center; gap: .5rem; height: 2.5rem; padding: 0 .55rem 0 .8rem; min-width: 11rem;
390
+ border-radius: var(--gala-radius-pill); border: var(--gala-border-width) solid var(--gala-color-border); background: var(--gala-color-surface); color: var(--gala-color-text-muted);
391
+ font-family: var(--gala-font-ui); font-size: .875rem; cursor: pointer; transition: border-color var(--gala-duration-fast) var(--gala-ease-standard), color var(--gala-duration-fast) var(--gala-ease-standard);
392
+ }
393
+ .g-search-btn:hover { color: var(--gala-color-text); border-color: var(--gala-color-text-muted); }
394
+ .g-search-btn > span:not(.g-kbd) { margin-right: auto; }
395
+ .g-menu { display: none; }
396
+ .g-menu summary { display: grid; place-items: center; width: 2.5rem; height: 2.5rem; border-radius: var(--gala-radius-pill); color: var(--gala-color-text-muted); cursor: pointer; list-style: none; }
397
+ .g-menu summary::-webkit-details-marker { display: none; }
398
+ .g-menu summary:hover, .g-menu[open] summary { background: var(--gala-color-surface-raised); color: var(--gala-color-text); }
399
+ .g-menu summary .g-icon { width: 1.3rem; height: 1.3rem; }
400
+ .g-menu > ul {
401
+ position: absolute; left: 0; right: 0; top: 100%; display: grid; max-height: calc(100vh - 5rem); overflow-y: auto;
402
+ padding: var(--gala-space-2) clamp(16px, 4vw, 40px) var(--gala-space-6); background: var(--gala-color-surface); border-bottom: var(--gala-border-width) solid var(--gala-color-border);
403
+ box-shadow: var(--gala-shadow-card-hover); animation: g-drop var(--gala-duration-base) var(--gala-ease-standard);
404
+ }
405
+ .g-menu li > a { display: flex; align-items: center; padding: .85rem .25rem; border-bottom: var(--gala-border-width) solid var(--gala-color-border); font-family: var(--gala-font-display); font-weight: var(--gala-weight-title); font-size: 1.15rem; }
406
+ .g-menu li > a[aria-current="page"] { color: var(--gala-color-link); }
407
+ .g-menu li ul { padding-left: var(--gala-space-4); }
408
+ @keyframes g-drop { from { opacity: 0; transform: translateY(-8px); } }
150
409
 
151
- /* Responsive spacing: a small step at a tablet-and-up viewport width, so
152
- header/main padding is not identical at 320px and 2560px. */
153
- [data-gala-publication-root] header,
154
- [data-gala-publication-root] footer {
155
- padding: var(--gala-space-4, 1rem) var(--gala-space-4, 1rem);
410
+ /* ---------- home: hero ---------- */
411
+ .g-hero { display: grid; grid-template-columns: minmax(0, 7fr) minmax(0, 5fr); gap: clamp(1.5rem, 4vw, 3.5rem); align-items: center; padding-block: clamp(2rem, 5vw, 4rem) clamp(1.5rem, 3vw, 2.5rem); }
412
+ .g-hero-media { display: block; aspect-ratio: 4 / 3; border-radius: var(--gala-radius-large); overflow: hidden; background: var(--gala-color-surface-raised); border: var(--gala-border-card); box-shadow: var(--gala-shadow-card); max-width: 100%; }
413
+ .g-hero-media img { width: 100%; height: 100%; object-fit: cover; filter: var(--gala-media-filter); transition: transform 1.2s var(--gala-ease-standard), filter var(--gala-duration-slow) var(--gala-ease-standard); }
414
+ .g-hero-media:hover img { transform: scale(var(--gala-media-zoom)); filter: var(--gala-media-filter-hover); }
415
+ .g-hero-body { display: grid; gap: 1.25rem; justify-items: start; min-width: 0; }
416
+ .g-eyebrow { display: flex; align-items: center; gap: var(--gala-space-3); flex-wrap: wrap; }
417
+ .g-hero-body > * { animation: g-rise-in .8s var(--gala-ease-standard) both; }
418
+ .g-hero-body > :nth-child(2) { animation-delay: 60ms; }
419
+ .g-hero-body > :nth-child(3) { animation-delay: 120ms; }
420
+ .g-hero-body > :nth-child(4) { animation-delay: 180ms; }
421
+ .g-hero-body > :nth-child(5) { animation-delay: 240ms; }
422
+ @keyframes g-rise-in { from { opacity: 0; transform: translateY(14px); } }
423
+
424
+ /* topic pills */
425
+ .g-topic-strip { padding-block: var(--gala-space-2) var(--gala-space-4); }
426
+ .g-pills { display: flex; gap: var(--gala-space-2); overflow-x: auto; scrollbar-width: none; padding-block: var(--gala-space-1); }
427
+ .g-pills::-webkit-scrollbar { display: none; }
428
+ .g-pill {
429
+ display: inline-flex; align-items: center; gap: var(--gala-space-2); padding: .55rem .9rem; white-space: nowrap;
430
+ border-radius: var(--gala-radius-pill); border: var(--gala-border-width) solid var(--gala-color-border); background: var(--gala-color-surface);
431
+ font-family: var(--gala-font-ui); font-size: .875rem; font-weight: var(--gala-weight-ui);
432
+ transition: border-color var(--gala-duration-fast) var(--gala-ease-standard), transform var(--gala-duration-fast) var(--gala-ease-standard), background-color var(--gala-duration-fast) var(--gala-ease-standard);
156
433
  }
157
- [data-gala-publication-root] main {
158
- padding: var(--gala-space-4, 1rem);
434
+ .g-pill .g-icon { color: var(--gala-color-icon-accent); }
435
+ .g-pill:hover { border-color: var(--gala-color-text); transform: translateY(-1px); }
436
+ .g-pill[aria-current="page"] { background: var(--gala-paint-button); color: var(--gala-color-btn-text); border: var(--gala-border-button); }
437
+ .g-pill[aria-current="page"] .g-icon { color: inherit; }
438
+ .g-pill-count { font-size: .75rem; color: var(--gala-color-text-faint); font-variant-numeric: tabular-nums; padding-left: var(--gala-space-2); border-left: var(--gala-border-width) solid var(--gala-color-border); }
439
+
440
+ /* ---------- sections ---------- */
441
+ .g-section { padding-block: clamp(2rem, 5vw, 3.5rem); }
442
+ .g-section-head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--gala-space-4); padding-top: .9rem; margin-bottom: var(--gala-space-6); border-top: var(--gala-border-section-rule); }
443
+ .g-more { display: inline-flex; align-items: center; gap: .35rem; font-family: var(--gala-font-ui); font-size: .875rem; font-weight: var(--gala-weight-ui); color: var(--gala-color-link); white-space: nowrap; }
444
+ .g-more .g-icon { transition: transform var(--gala-duration-base) var(--gala-ease-spring); }
445
+ .g-more:hover .g-icon { transform: translateX(4px); }
446
+
447
+ /* ---------- cards ---------- */
448
+ .g-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: clamp(1rem, 2.5vw, 1.75rem); }
449
+ .g-card {
450
+ position: relative; display: flex; flex-direction: column; min-width: 0;
451
+ background: var(--gala-color-surface); border: var(--gala-border-card); border-radius: var(--gala-radius-large); padding: var(--gala-card-inset);
452
+ box-shadow: var(--gala-shadow-card);
453
+ transition: transform var(--gala-duration-base) var(--gala-ease-standard), box-shadow var(--gala-duration-base) var(--gala-ease-standard), border-color var(--gala-duration-base) var(--gala-ease-standard);
454
+ }
455
+ /* The title link stretches over the whole card through ::after, so the
456
+ card stays one click target while the link has a real accessible name. */
457
+ .g-card-link::after { content: ""; position: absolute; inset: 0; z-index: 1; border-radius: var(--gala-radius-large); }
458
+ .g-card:hover { transform: translate(var(--gala-lift-x), var(--gala-lift-y)); box-shadow: var(--gala-shadow-card-hover); }
459
+ .g-card-media { margin: 0; aspect-ratio: 16 / 10; overflow: hidden; border-radius: var(--gala-radius-media); background: var(--gala-color-surface-raised); border-bottom: var(--gala-border-media-divider); max-width: 100%; }
460
+ .g-card-media img { width: 100%; height: 100%; object-fit: cover; filter: var(--gala-media-filter); transition: transform 1s var(--gala-ease-standard), filter var(--gala-duration-slow) var(--gala-ease-standard); }
461
+ .g-card:hover .g-card-media img { transform: scale(var(--gala-media-zoom)); filter: var(--gala-media-filter-hover); }
462
+ .g-card-placeholder { display: grid; place-items: center; aspect-ratio: 16 / 10; width: 100%; overflow: hidden; border-radius: var(--gala-radius-media); background: var(--gala-paint-panel); color: var(--gala-color-panel-text); }
463
+ .g-card-placeholder .g-icon { width: 2.25rem; height: 2.25rem; opacity: .85; }
464
+ .g-hero-media .g-card-placeholder { height: 100%; aspect-ratio: auto; border-radius: 0; }
465
+ .g-card-body { display: flex; flex-direction: column; gap: .6rem; padding: var(--gala-card-pad); flex: 1; min-width: 0; }
466
+ .g-card-top { display: flex; align-items: center; justify-content: space-between; gap: var(--gala-space-2); min-height: 1.6rem; }
467
+ .g-card h2, .g-card h3 {
468
+ font-family: var(--gala-font-display); font-weight: var(--gala-weight-title); font-size: var(--gala-card-title-size); line-height: 1.22;
469
+ letter-spacing: var(--gala-tracking-title); text-transform: var(--gala-title-transform); text-wrap: balance;
470
+ transition: color var(--gala-duration-fast) var(--gala-ease-standard);
159
471
  }
160
- @media (min-width: 48rem) {
161
- [data-gala-publication-root] header,
162
- [data-gala-publication-root] footer {
163
- padding: var(--gala-space-4, 1rem) var(--gala-space-6, 1.5rem);
472
+ .g-card:hover h2, .g-card:hover h3 { color: var(--gala-color-link); }
473
+ .g-card-excerpt { color: var(--gala-color-text-muted); font-size: .9375rem; line-height: 1.55; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
474
+ .g-card-foot { display: flex; align-items: center; justify-content: space-between; margin-top: auto; padding-top: .35rem; }
475
+ .g-card-foot > span[aria-hidden] { display: inline-grid; place-items: center; width: 2rem; height: 2rem; border-radius: var(--gala-radius-pill); color: var(--gala-color-icon-accent); opacity: 0; transform: translateX(-8px); transition: opacity var(--gala-duration-base) var(--gala-ease-standard), transform var(--gala-duration-base) var(--gala-ease-spring); }
476
+ .g-card:hover .g-card-foot > span[aria-hidden], .g-card:focus-within .g-card-foot > span[aria-hidden] { opacity: 1; transform: none; }
477
+ .g-card:focus-within { box-shadow: var(--gala-shadow-card-hover); }
478
+ .g-card-link:focus-visible { outline-offset: 2px; }
479
+
480
+ /* row variant (listings) */
481
+ .g-list { display: grid; gap: clamp(1rem, 2.5vw, 1.5rem); }
482
+ .g-card-row { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 3fr); align-items: center; padding-bottom: var(--gala-row-pad); border-bottom: var(--gala-border-row-divider); }
483
+ .g-card-row .g-card-media, .g-card-row .g-card-placeholder { aspect-ratio: 16 / 9; height: 100%; border-bottom: 0; border-right: var(--gala-border-media-divider); }
484
+ .g-card-row .g-card-body { padding: clamp(1rem, 2.5vw, 1.75rem); }
485
+ .g-card-row h2, .g-card-row h3 { font-size: clamp(1.3rem, 1rem + 1vw, 1.75rem); }
486
+
487
+ /* ---------- series ---------- */
488
+ .g-series-card {
489
+ position: relative; display: grid; gap: var(--gala-space-4); padding: clamp(1.25rem, 3vw, 1.75rem); overflow: hidden;
490
+ border-radius: var(--gala-radius-large); background: var(--gala-color-surface); border: var(--gala-border-card); box-shadow: var(--gala-shadow-card);
491
+ }
492
+ .g-series-card::before { content: ""; position: absolute; inset: 0 0 auto 0; height: 4px; background: linear-gradient(90deg, var(--gala-color-accent), var(--gala-color-accent-2)); }
493
+ .g-series-card h2 { font-size: 1.6rem; }
494
+ .g-series-list { display: grid; gap: var(--gala-space-1); }
495
+ .g-series-list a { display: flex; align-items: center; gap: var(--gala-space-3); padding: .55rem .5rem; border-radius: var(--gala-radius-small); font-family: var(--gala-font-ui); font-size: .9rem; transition: background-color var(--gala-duration-fast) var(--gala-ease-standard); }
496
+ .g-series-list a:hover { background: var(--gala-color-surface-raised); }
497
+ .g-series-n { display: inline-grid; place-items: center; width: 1.75rem; height: 1.75rem; flex: none; border-radius: var(--gala-radius-avatar); border: var(--gala-border-width) solid var(--gala-color-border); font-size: .78rem; font-weight: var(--gala-weight-ui); font-variant-numeric: tabular-nums; }
498
+ .g-series-list [aria-current="true"] .g-series-n { background: var(--gala-paint-button); color: var(--gala-color-btn-text); border: var(--gala-border-button); }
499
+ .g-series-here { margin-left: auto; font-size: .72rem; color: var(--gala-color-text-muted); white-space: nowrap; }
500
+ .g-series-card .g-btn { justify-self: start; }
501
+
502
+ /* ---------- newsletter panel ---------- */
503
+ .g-newsletter { padding-block: clamp(1rem, 3vw, 2rem) clamp(3rem, 6vw, 5rem); }
504
+ .g-panel {
505
+ position: relative; display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: clamp(1.25rem, 4vw, 3rem); align-items: center;
506
+ padding: clamp(1.5rem, 5vw, 3.25rem); border-radius: var(--gala-radius-large); overflow: hidden;
507
+ background: var(--gala-paint-panel); color: var(--gala-color-panel-text); border: var(--gala-border-card); box-shadow: var(--gala-shadow-card);
508
+ }
509
+ .g-panel::after { content: ""; position: absolute; width: 22rem; height: 22rem; right: -6rem; top: -10rem; border-radius: 50%; background: radial-gradient(closest-side, var(--gala-color-panel-text), transparent); opacity: .12; pointer-events: none; }
510
+ .g-panel-copy { display: grid; gap: var(--gala-space-3); min-width: 0; }
511
+ .g-panel .g-label, .g-panel-copy p:not(.g-label) { color: var(--gala-color-panel-muted); }
512
+ .g-panel h2 { font-weight: var(--gala-weight-display); font-size: clamp(1.6rem, 1.2rem + 1.6vw, 2.5rem); line-height: 1.08; letter-spacing: var(--gala-tracking-display); text-wrap: balance; }
513
+ .g-panel-copy p:not(.g-label) { max-width: 30rem; }
514
+ .g-panel .g-btn { position: relative; z-index: 1; min-height: 3rem; background: var(--gala-color-btn-panel); color: var(--gala-color-btn-panel-text); border: var(--gala-border-button); box-shadow: none; }
515
+
516
+ /* ---------- article ---------- */
517
+ .g-article-head { display: grid; gap: 1.1rem; justify-items: start; max-width: 54rem; padding-block: clamp(1.5rem, 4vw, 3rem) clamp(1.5rem, 3vw, 2.25rem); }
518
+ .g-crumbs { font-family: var(--gala-font-ui); font-size: .8125rem; color: var(--gala-color-text-muted); }
519
+ .g-crumbs ol { display: flex; align-items: center; flex-wrap: wrap; gap: .35rem; }
520
+ .g-crumbs li + li::before { content: "/"; margin-right: .35rem; color: var(--gala-color-text-faint); }
521
+ .g-crumbs a:hover { color: var(--gala-color-text); }
522
+ .g-crumbs [aria-current] { color: var(--gala-color-text); }
523
+ .g-article-labels { display: flex; align-items: center; flex-wrap: wrap; gap: .5rem 1rem; }
524
+ .g-article-head h1 { font-size: clamp(2.25rem, 1.2rem + 3.8vw, var(--gala-display-max)); }
525
+ .g-article-meta { display: flex; align-items: center; justify-content: space-between; gap: var(--gala-space-4); width: 100%; padding-top: 1.1rem; border-top: var(--gala-border-width) solid var(--gala-color-border); flex-wrap: wrap; }
526
+ .g-share { display: flex; gap: var(--gala-space-1); }
527
+ .g-article-cover { margin-block: 0; }
528
+ .g-article-cover img { width: 100%; height: auto; aspect-ratio: 21 / 9; object-fit: cover; border-radius: var(--gala-radius-large); border: var(--gala-border-card); box-shadow: var(--gala-shadow-card); filter: var(--gala-media-filter); }
529
+ .g-article-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, var(--gala-content-measure)) minmax(0, 1fr); gap: clamp(1.5rem, 4vw, 3.5rem); padding-block: clamp(2rem, 5vw, 3.5rem) var(--gala-space-4); }
530
+ .g-article-grid > .g-prose { grid-column: 2; }
531
+ .g-toc { position: sticky; top: 6rem; align-self: start; justify-self: end; width: min(100%, 15rem); display: grid; gap: var(--gala-space-3); }
532
+ .g-toc-list { display: grid; border-left: var(--gala-border-width) solid var(--gala-color-border); }
533
+ .g-toc-list a { display: block; margin-left: -1px; padding: .4rem .9rem; border-left: var(--gala-border-width) solid transparent; font-family: var(--gala-font-ui); font-size: .85rem; line-height: 1.35; color: var(--gala-color-text-muted); transition: color var(--gala-duration-fast) var(--gala-ease-standard), border-color var(--gala-duration-fast) var(--gala-ease-standard); }
534
+ .g-toc-list a:hover { color: var(--gala-color-text); }
535
+ .g-toc-list a[aria-current="true"] { color: var(--gala-color-toc-active-text); background: var(--gala-color-toc-active); border-left-color: var(--gala-color-accent); font-weight: var(--gala-weight-ui); }
536
+ .g-toc-mobile { display: none; margin-bottom: var(--gala-space-6); border: var(--gala-border-width) solid var(--gala-color-border); border-radius: var(--gala-radius-medium); background: var(--gala-color-surface); }
537
+ .g-toc-mobile summary { display: flex; align-items: center; gap: var(--gala-space-2); padding: .8rem 1rem; cursor: pointer; font-family: var(--gala-font-ui); font-weight: var(--gala-weight-ui); font-size: .9rem; list-style: none; }
538
+ .g-toc-mobile summary::-webkit-details-marker { display: none; }
539
+ .g-toc-mobile .g-toc-list { margin: 0 1rem 1rem; }
540
+
541
+ /* prose */
542
+ .g-prose { font-family: var(--gala-font-body); font-size: var(--gala-prose-size); line-height: var(--gala-prose-leading); min-width: 0; overflow-wrap: anywhere; }
543
+ .g-prose > * + * { margin-top: 1.35em; }
544
+ .g-prose p { text-wrap: pretty; }
545
+ .g-prose h2, .g-prose h3, .g-prose h4 { font-family: var(--gala-font-display); font-weight: var(--gala-weight-title); line-height: 1.2; letter-spacing: var(--gala-tracking-title); text-transform: var(--gala-title-transform); text-wrap: balance; scroll-margin-top: 6rem; }
546
+ .g-prose h2 { margin-top: 2.2em; font-size: clamp(1.5rem, 1.25rem + .9vw, 1.95rem); }
547
+ .g-prose h3 { margin-top: 1.8em; margin-bottom: 0; font-size: clamp(1.25rem, 1.1rem + .6vw, 1.5rem); }
548
+ .g-prose h4 { margin-top: 1.6em; font-size: 1.125rem; }
549
+ .g-prose strong, .g-prose b { font-weight: var(--gala-weight-strong); }
550
+ .g-prose a:not(.g-tag, [data-toc]) { color: var(--gala-color-link); text-decoration: underline; text-decoration-color: var(--gala-color-link-underline); text-decoration-thickness: var(--gala-link-thickness); text-underline-offset: var(--gala-link-offset); text-decoration-skip-ink: var(--gala-link-skip-ink); transition: text-decoration-color var(--gala-duration-fast) var(--gala-ease-standard), text-underline-offset var(--gala-duration-fast) var(--gala-ease-standard); }
551
+ .g-prose a:not(.g-tag, [data-toc]):visited { color: var(--gala-color-link-visited); }
552
+ .g-prose a:not(.g-tag, [data-toc]):hover { text-decoration-color: var(--gala-color-link-underline-hover); text-underline-offset: var(--gala-link-offset-hover); }
553
+ .g-prose ul:not(.g-tags), .g-prose ol:not(.g-toc-list) { padding-left: 1.4em; }
554
+ .g-prose ul:not(.g-tags) { list-style: disc; }
555
+ .g-prose ol:not(.g-toc-list) { list-style: decimal; }
556
+ .g-prose li + li { margin-top: .5em; }
557
+ .g-toc-list li + li { margin-top: 0; }
558
+ .g-prose li::marker { color: var(--gala-color-icon-accent); font-weight: var(--gala-weight-ui); }
559
+ .g-prose :not(pre) > code { font-family: var(--gala-font-mono); font-size: .86em; padding: .12em .4em; border-radius: var(--gala-radius-small); background: var(--gala-color-surface-raised); border: var(--gala-border-width) solid var(--gala-color-border); overflow-wrap: anywhere; }
560
+ .g-prose blockquote {
561
+ margin-inline: 0; margin-block: 2em; padding: var(--gala-quote-pad); border-left: var(--gala-border-quote); text-align: var(--gala-quote-align);
562
+ font-family: var(--gala-font-display); font-weight: var(--gala-weight-title); font-style: var(--gala-quote-style); text-transform: var(--gala-quote-transform);
563
+ font-size: clamp(1.4rem, 1.15rem + 1vw, 1.85rem); line-height: 1.3; letter-spacing: var(--gala-tracking-title); text-wrap: balance;
564
+ }
565
+ .g-prose blockquote::before { content: var(--gala-quote-mark); display: block; font-size: 3em; line-height: .6; color: var(--gala-color-accent); }
566
+ .g-prose blockquote > * + * { margin-top: .6em; }
567
+ .g-prose img { width: 100%; border-radius: var(--gala-radius-medium); border: var(--gala-border-card); filter: var(--gala-media-filter); }
568
+ .g-prose figure { margin-inline: 0; }
569
+ .g-prose figcaption { margin-top: .6rem; font-family: var(--gala-font-ui); font-size: .8125rem; color: var(--gala-color-text-muted); }
570
+ .g-prose hr { border: 0; border-top: var(--gala-border-width) solid var(--gala-color-border); margin-block: 2.5em; }
571
+ .g-prose table { display: block; max-width: 100%; overflow-x: auto; border-collapse: collapse; font-size: .92em; }
572
+ .g-prose th, .g-prose td { padding: .5em .8em; border: var(--gala-border-width) solid var(--gala-color-border); text-align: start; }
573
+ .g-prose th { background: var(--gala-color-surface-raised); font-weight: var(--gala-weight-strong); }
574
+
575
+ /* code blocks: the bare <pre> is already a finished block; the optional
576
+ script wraps it in .g-codeblock with a language label and copy button. */
577
+ .g-prose pre, .g-codeblock { margin-inline: 0; border-radius: var(--gala-radius-medium); overflow: hidden; background: var(--gala-color-code-canvas); color: var(--gala-color-code-text); border: var(--gala-border-code); box-shadow: var(--gala-shadow-card); }
578
+ .g-prose pre { padding: 1rem 1.15rem 1.2rem; overflow-x: auto; font-family: var(--gala-font-mono); font-size: .85rem; line-height: 1.65; tab-size: 2; overflow-wrap: normal; }
579
+ .g-prose pre code { font-family: inherit; }
580
+ .g-prose .g-codeblock > pre { margin: 0; border: 0; border-radius: 0; box-shadow: none; background: transparent; }
581
+ .g-codebar { display: flex; align-items: center; gap: var(--gala-space-3); padding: .55rem .6rem .55rem 1rem; border-bottom: var(--gala-border-width) solid var(--gala-color-input-border); font-family: var(--gala-font-ui); font-size: .78rem; }
582
+ .g-codebar-lang { font-family: var(--gala-font-mono); text-transform: uppercase; letter-spacing: .06em; font-size: .7rem; padding: .15rem .45rem; border-radius: var(--gala-radius-small); background: var(--gala-color-input); }
583
+ .g-copy { margin-left: auto; display: inline-flex; align-items: center; gap: .35rem; padding: .35rem .6rem; border-radius: var(--gala-radius-small); border: 0; background: transparent; color: inherit; cursor: pointer; opacity: .75; font-size: .75rem; transition: opacity var(--gala-duration-fast) var(--gala-ease-standard), background-color var(--gala-duration-fast) var(--gala-ease-standard); }
584
+ .g-copy:hover { opacity: 1; background: var(--gala-color-input); }
585
+ .g-copy .g-icon { width: .95rem; height: .95rem; }
586
+ .g-copy-done { display: none; }
587
+ .g-copy[data-copied] .g-copy-idle { display: none; }
588
+ .g-copy[data-copied] .g-copy-done { display: inline-flex; align-items: center; gap: .35rem; color: var(--gala-color-success); animation: g-spin-in var(--gala-duration-base) var(--gala-ease-spring); }
589
+ .token.keyword, .token.atrule, .token.selector, .token.tag, .token.important, .token.operator.keyword { color: var(--gala-color-syntax-keyword); }
590
+ .token.string, .token.char, .token.attr-value, .token.template-string, .token.regex, .token.inserted { color: var(--gala-color-syntax-string); }
591
+ .token.comment, .token.prolog, .token.doctype, .token.cdata { color: var(--gala-color-syntax-comment); font-style: italic; }
592
+ .token.number, .token.boolean, .token.constant, .token.symbol, .token.null { color: var(--gala-color-syntax-number); }
593
+ .token.function, .token.class-name, .token.builtin, .token.function-variable { color: var(--gala-color-syntax-function); }
594
+ .token.deleted { color: var(--gala-color-danger); }
595
+ .token.bold { font-weight: var(--gala-weight-strong); }
596
+ .token.italic { font-style: italic; }
597
+
598
+ .g-tags { display: flex; flex-wrap: wrap; gap: var(--gala-space-2); margin-top: 2.5em; font-size: 1rem; line-height: 1.5; }
599
+ .g-prose .g-tags > li { margin-top: 0; }
600
+ .g-tag { display: inline-flex; align-items: center; gap: var(--gala-space-1); padding: .3rem .7rem; border-radius: var(--gala-radius-pill); border: var(--gala-border-width) solid var(--gala-color-border); font-family: var(--gala-font-ui); font-size: .8rem; color: var(--gala-color-text-muted); transition: color var(--gala-duration-fast) var(--gala-ease-standard), border-color var(--gala-duration-fast) var(--gala-ease-standard); }
601
+ .g-tag:hover { color: var(--gala-color-text); border-color: var(--gala-color-text); }
602
+ .g-tag .g-icon { width: .85em; height: .85em; }
603
+
604
+ /* article footer */
605
+ .g-article-foot { display: grid; gap: var(--gala-space-6); max-width: calc(var(--gala-content-measure) + 2 * clamp(16px, 4vw, 40px)); padding-block: var(--gala-space-4) var(--gala-space-8); }
606
+ .g-author-card { display: flex; gap: 1.25rem; align-items: flex-start; padding: var(--gala-space-6); border-radius: var(--gala-radius-large); background: var(--gala-color-surface); border: var(--gala-border-card); }
607
+ .g-author-card .g-avatar { width: 4.5rem; height: 4.5rem; font-size: 1.4rem; }
608
+ .g-author-name { font-family: var(--gala-font-display); font-weight: var(--gala-weight-title); font-size: 1.25rem; margin: .2rem 0 .35rem !important; }
609
+ .g-author-name a:hover { color: var(--gala-color-link); }
610
+ .g-author-bio { color: var(--gala-color-text-muted); font-size: .9375rem; }
611
+ .g-series-box { display: grid; gap: var(--gala-space-3); padding: 1.25rem; border-radius: var(--gala-radius-large); border: var(--gala-border-width) dashed var(--gala-color-border); }
612
+ .g-pager { display: grid; grid-template-columns: 1fr 1fr; gap: var(--gala-space-4); }
613
+ .g-pager-link { display: grid; align-content: start; gap: .4rem; padding: 1.1rem 1.25rem; border-radius: var(--gala-radius-medium); border: var(--gala-border-width) solid var(--gala-color-border); background: var(--gala-color-surface); transition: transform var(--gala-duration-base) var(--gala-ease-standard), border-color var(--gala-duration-base) var(--gala-ease-standard), box-shadow var(--gala-duration-base) var(--gala-ease-standard); }
614
+ .g-pager-link:hover { border-color: var(--gala-color-text); transform: translate(var(--gala-lift-x), var(--gala-lift-y)); box-shadow: var(--gala-shadow-card-hover); }
615
+ .g-pager-link > span:last-child { font-family: var(--gala-font-display); font-weight: var(--gala-weight-title); line-height: 1.3; text-wrap: balance; }
616
+ .g-pager-next { grid-column: 2; text-align: right; justify-items: end; }
617
+ .g-pager-next .g-label { flex-direction: row; }
618
+
619
+ /* ---------- listing pages ---------- */
620
+ .g-topic-hero { display: grid; gap: 1.25rem; justify-items: start; padding-block: clamp(1.5rem, 4vw, 3rem) var(--gala-space-2); }
621
+ .g-topic-hero > .g-pills { max-width: 100%; }
622
+ .g-topic-head { display: flex; align-items: center; gap: 1.25rem; }
623
+ .g-topic-icon { display: inline-grid; place-items: center; width: clamp(3.5rem, 8vw, 5rem); aspect-ratio: 1; flex: none; overflow: hidden; border-radius: var(--gala-radius-large); background: var(--gala-paint-button); color: var(--gala-color-btn-text); border: var(--gala-border-button); box-shadow: var(--gala-shadow-button); }
624
+ .g-topic-icon .g-icon { width: 45%; height: 45%; }
625
+ .g-topic-icon .g-avatar { width: 100%; height: 100%; border-radius: 0; box-shadow: none; }
626
+
627
+ /* pagination */
628
+ .g-pagination { padding-block: var(--gala-space-8) var(--gala-space-2); font-family: var(--gala-font-ui); font-size: .9rem; }
629
+ .g-pagination ul { display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: var(--gala-space-3); }
630
+ .g-pagination a, .g-pagination li > span { display: inline-flex; align-items: center; min-height: 2.5rem; padding: 0 1.1rem; border-radius: var(--gala-radius-pill); border: var(--gala-border-width) solid var(--gala-color-border); background: var(--gala-color-surface); font-weight: var(--gala-weight-ui); }
631
+ .g-pagination a:hover { border-color: var(--gala-color-text); }
632
+ .g-pagination li > span { color: var(--gala-color-text-faint); background: transparent; }
633
+ .g-pagination li[aria-current="page"] { color: var(--gala-color-text-muted); }
634
+
635
+ /* ---------- search dialog (built by the optional script) ---------- */
636
+ .g-search {
637
+ width: min(40rem, calc(100% - 32px)); max-height: min(34rem, 80vh); margin: 12vh auto auto; padding: 0;
638
+ border: var(--gala-border-card); border-radius: var(--gala-radius-large); background: var(--gala-color-surface); color: var(--gala-color-text); box-shadow: var(--gala-shadow-dialog);
639
+ overflow: hidden;
640
+ }
641
+ .g-search[open] { animation: g-pop var(--gala-duration-base) var(--gala-ease-spring); }
642
+ .g-search::backdrop { background: var(--gala-color-overlay); -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px); }
643
+ @keyframes g-pop { from { opacity: 0; transform: translateY(-10px) scale(.97); } }
644
+ .g-search-box { display: flex; align-items: center; gap: var(--gala-space-3); padding: .9rem 1.1rem; border-bottom: var(--gala-border-width) solid var(--gala-color-border); color: var(--gala-color-text-muted); }
645
+ .g-search-input { flex: 1; min-width: 0; border: 0; background: transparent; color: var(--gala-color-text); font: inherit; font-family: var(--gala-font-ui); font-size: 1.05rem; outline: none; }
646
+ .g-search-input::-webkit-search-cancel-button { display: none; }
647
+ .g-search-results { margin: 0; padding: var(--gala-space-2); overflow-y: auto; max-height: 26rem; }
648
+ .g-search-hit { display: flex; align-items: center; gap: .9rem; padding: .6rem .7rem; border-radius: var(--gala-radius-medium); }
649
+ .g-search-hit > .g-icon { margin-left: auto; color: var(--gala-color-text-faint); opacity: 0; transition: opacity var(--gala-duration-fast) var(--gala-ease-standard); }
650
+ .g-search-hit-text { display: grid; gap: .1rem; min-width: 0; }
651
+ .g-search-hit-title { font-family: var(--gala-font-ui); font-weight: var(--gala-weight-ui); }
652
+ .g-search-hit-meta { font-family: var(--gala-font-ui); font-size: .8125rem; color: var(--gala-color-text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
653
+ [aria-selected="true"] > .g-search-hit, .g-search-hit:hover { background: var(--gala-color-surface-raised); }
654
+ [aria-selected="true"] > .g-search-hit > .g-icon { opacity: 1; color: var(--gala-color-accent); }
655
+ .g-search-empty { padding: var(--gala-space-6) var(--gala-space-4); color: var(--gala-color-text-muted); font-family: var(--gala-font-ui); text-align: center; }
656
+
657
+ /* toast */
658
+ .g-toast {
659
+ position: fixed; left: 50%; bottom: var(--gala-space-6); z-index: 60; max-width: calc(100% - 2rem); padding: .7rem 1.1rem;
660
+ border-radius: var(--gala-radius-pill); background: var(--gala-color-accent); color: var(--gala-color-on-accent); box-shadow: var(--gala-shadow-dialog);
661
+ font-family: var(--gala-font-ui); font-size: .875rem; text-align: center; opacity: 0; visibility: hidden; transform: translate(-50%, 1rem);
662
+ transition: opacity var(--gala-duration-base) var(--gala-ease-standard), transform var(--gala-duration-base) var(--gala-ease-standard), visibility var(--gala-duration-base);
663
+ }
664
+ .g-toast[data-show] { opacity: 1; visibility: visible; transform: translate(-50%, 0); }
665
+ .g-toast[data-tone="success"] { border-left: .35rem solid var(--gala-color-success); }
666
+ .g-toast[data-tone="warning"] { border-left: .35rem solid var(--gala-color-warning); }
667
+ .g-toast[data-tone="danger"] { border-left: .35rem solid var(--gala-color-danger); }
668
+
669
+ /* ---------- footer ---------- */
670
+ .g-footer { border-top: var(--gala-border-width) solid var(--gala-color-border); background: var(--gala-color-footer); margin-top: var(--gala-space-8); }
671
+ .g-footer-grid { display: grid; grid-template-columns: minmax(0, 2fr) repeat(3, minmax(0, 1fr)); gap: var(--gala-space-8); padding-block: clamp(2.5rem, 5vw, 4rem) var(--gala-space-8); }
672
+ .g-footer-brand { display: grid; gap: var(--gala-space-4); justify-items: start; align-content: start; }
673
+ .g-footer-about { color: var(--gala-color-text-muted); font-size: .9375rem; max-width: 26rem; }
674
+ .g-social { display: flex; gap: var(--gala-space-1); margin-left: -.5rem; }
675
+ .g-footer-col { display: grid; align-content: start; gap: .65rem; font-family: var(--gala-font-ui); font-size: .9rem; min-width: 0; }
676
+ .g-footer-col ul { display: grid; gap: .65rem; }
677
+ .g-footer-col a { color: var(--gala-color-text-muted); width: fit-content; transition: color var(--gala-duration-fast) var(--gala-ease-standard); }
678
+ .g-footer-col a:hover { color: var(--gala-color-text); }
679
+ .g-footer-col .g-label { margin-bottom: var(--gala-space-1); }
680
+ .g-footer-base { display: flex; justify-content: space-between; gap: var(--gala-space-4); flex-wrap: wrap; padding-block: 1.25rem var(--gala-space-8); border-top: var(--gala-border-width) solid var(--gala-color-border); font-family: var(--gala-font-ui); font-size: .8125rem; color: var(--gala-color-text-muted); }
681
+
682
+ /* ---------- responsive ---------- */
683
+ @media (max-width: 1100px) {
684
+ .g-article-grid { grid-template-columns: minmax(0, 1fr); justify-items: center; }
685
+ .g-article-grid > .g-prose { grid-column: 1; width: 100%; max-width: var(--gala-content-measure); }
686
+ .g-toc { display: none; }
687
+ .g-toc-mobile { display: block; }
688
+ }
689
+ @media (max-width: 960px) {
690
+ .g-nav { display: none; }
691
+ .g-actions { margin-left: auto; }
692
+ .g-menu { display: block; }
693
+ .g-search-btn { min-width: 0; padding: 0; width: 2.5rem; justify-content: center; border-color: transparent; background: transparent; }
694
+ .g-search-btn > span { display: none; }
695
+ .g-hero { grid-template-columns: minmax(0, 1fr); }
696
+ .g-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
697
+ .g-panel { grid-template-columns: minmax(0, 1fr); }
698
+ .g-panel .g-btn { justify-self: start; }
699
+ .g-footer-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
700
+ .g-footer-brand { grid-column: 1 / -1; }
701
+ }
702
+ @media (max-width: 640px) {
703
+ .g-brand-tag { display: none; }
704
+ .g-grid { grid-template-columns: minmax(0, 1fr); }
705
+ .g-card-row { grid-template-columns: minmax(0, 1fr); }
706
+ .g-card-row .g-card-media, .g-card-row .g-card-placeholder { border-right: 0; border-bottom: var(--gala-border-media-divider); height: auto; }
707
+ .g-pager { grid-template-columns: minmax(0, 1fr); }
708
+ .g-pager-next { grid-column: 1; }
709
+ .g-article-cover img { aspect-ratio: 16 / 10; }
710
+ .g-footer-grid { grid-template-columns: minmax(0, 1fr); }
711
+ .g-author-card { flex-direction: column; }
712
+ .g-topic-head { align-items: flex-start; }
713
+ }
714
+
715
+ /* ---------- motion: scroll-driven and view transitions ---------- */
716
+ @media (prefers-reduced-motion: no-preference) {
717
+ [data-gala-publication-root] { scroll-behavior: smooth; }
718
+ @supports (animation-timeline: scroll()) {
719
+ .g-header { animation: g-header-settle linear both; animation-timeline: scroll(root); animation-range: 0 96px; }
720
+ @keyframes g-header-settle { from { background: transparent; border-bottom-color: transparent; -webkit-backdrop-filter: none; backdrop-filter: none; } }
721
+ .g-progress { animation: g-read linear both; animation-timeline: scroll(root); }
722
+ @keyframes g-read { from { transform: scaleX(0); } to { transform: scaleX(1); } }
164
723
  }
165
- [data-gala-publication-root] main {
166
- padding: var(--gala-space-6, 1.5rem);
724
+ @supports (animation-timeline: view()) {
725
+ .g-grid > .g-card, .g-list > .g-card, .g-panel, .g-series-card, .g-author-card, .g-series-box, .g-prose > pre, .g-codeblock, .g-prose > figure, .g-prose > blockquote {
726
+ animation: g-reveal linear both; animation-timeline: view(); animation-range: entry 0% entry 55%;
727
+ }
728
+ @keyframes g-reveal { from { opacity: .15; transform: translateY(28px) scale(.985); } }
167
729
  }
730
+ ::view-transition-old(root), ::view-transition-new(root) { animation-duration: 280ms; animation-timing-function: var(--gala-ease-standard); }
731
+ ::view-transition-group(gala-cover) { animation-duration: 560ms; animation-timing-function: var(--gala-ease-standard); }
732
+ ::view-transition-image-pair(gala-cover) { isolation: auto; }
733
+ ::view-transition-old(gala-cover), ::view-transition-new(gala-cover) { height: 100%; object-fit: cover; overflow: clip; animation: none; mix-blend-mode: normal; }
168
734
  }
169
-
735
+ html.g-vt-reveal::view-transition-old(root), html.g-vt-reveal::view-transition-new(root) { animation: none; mix-blend-mode: normal; }
170
736
  @media (prefers-reduced-motion: reduce) {
171
- [data-gala-publication-root] *,
172
- [data-gala-publication-root] *::before,
173
- [data-gala-publication-root] *::after {
174
- animation-duration: 0.001ms !important;
175
- animation-iteration-count: 1 !important;
176
- transition-duration: 0.001ms !important;
177
- }
737
+ [data-gala-publication-root] *, [data-gala-publication-root] *::before, [data-gala-publication-root] *::after { animation: none !important; transition-duration: 1ms !important; scroll-behavior: auto !important; }
178
738
  }
179
- }
180
- `;
739
+ `
740
+ .replace(/\/\*[\s\S]*?\*\//g, '')
741
+ .replace(/^[ \t]+/gm, '')
742
+ .replace(/\n{2,}/g, '\n');
743
+
744
+ /**
745
+ * The exact `gala-base` stylesheet, byte-for-byte deterministic across
746
+ * builds. Its first line is the fixed layer-order statement every published
747
+ * page relies on.
748
+ *
749
+ * @type {string}
750
+ */
751
+ export const GALA_BASE_STYLESHEET_SOURCE =
752
+ `@layer ${ORDERED_LAYERS.join(', ')};\n` +
753
+ `@layer gala-base {\n${GALA_BASE_DEFAULT_TOKEN_CSS}${GALA_BASE_COMPONENT_CSS}}\n` +
754
+ `@media (prefers-reduced-motion: no-preference) {\n@view-transition { navigation: auto; }\n}\n`;