@guildofgleks/ui 21.9.1 → 21.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/styles/theme.css CHANGED
@@ -1,2357 +1,2396 @@
1
- /*
2
- * @guildofgleks/ui — baseline theme
3
- *
4
- * Every token the components read, with a working default, so the library renders
5
- * correctly from a single import and a consumer can override only what they care about.
6
- *
7
- * ── The three layers ─────────────────────────────────────────────────────────────
8
- * 1. Foundation — palette, type scale, spacing, motion, focus. Restyles everything.
9
- * 2. Component — `--gog-<component>-*`, spelled out as the component's own element
10
- * name. Every colour, font, border, radius, shadow, padding and
11
- * duration each component paints with lives here, so a theme can
12
- * restyle one component without touching its stylesheet.
13
- * 3. Instance — a handful of deliberately UNDECLARED tokens (`--gog-button-bg`,
14
- * `--gog-button-padding`, `--gog-tag-bg`, …) that variant/size classes
15
- * fall back through. Left unset on purpose: a value declared here
16
- * would out-cascade the variant classes and pin every button to one
17
- * look. Set them on an element to override a single instance.
18
- *
19
- * No component stylesheet declares a `--gog-*` default of its own — everything a
20
- * component paints resolves to a token below.
21
- *
22
- * ── Why there are two blocks, and which one to add a token to ────────────────────
23
- * A custom property's `var()` references are substituted on the element that *declares*
24
- * it, not where it is read. So `--gog-button-primary-bg: var(--gog-accent-color)` declared on
25
- * `:root` freezes to the root palette: a `data-theme` scope further down the tree could
26
- * change `--gog-accent-color` and buttons inside it would not follow.
27
- *
28
- * `:root` — literals only (and the light palette default). Values that
29
- * reference nothing, so resolving them once at the root is right.
30
- * `:root, [data-theme]` — every token whose value reads another token. Re-declared on
31
- * each theme scope so it re-derives from that scope's palette
32
- * and metrics. **A new token that contains `var(` goes here.**
33
- *
34
- * ── Adding a theme ───────────────────────────────────────────────────────────────
35
- * Declare a palette against the attribute value; the derived layer re-resolves for you:
36
- *
37
- * :root[data-theme='mine'], [data-theme='mine'] { --gog-accent-color: #ff4edb; }
38
- *
39
- * Listing both selectors makes the theme work at the root *and* on any subtree, so a
40
- * single page can show several themes side by side.
41
- */
42
-
43
- :root {
44
- /* ── Typography ───────────────────────────────────────────────────────────────
45
- Generic stacks on purpose: a UI library should not force a webfont download on
46
- its consumers. Point these at your own families to restyle all text at once.
47
- `styles/fonts.css` is an optional import that wires up the showcase's families. */
48
- --gog-font-heading: system-ui, -apple-system, 'Segoe UI', sans-serif;
49
- --gog-font-body: system-ui, -apple-system, 'Segoe UI', sans-serif;
50
- --gog-font-mono: ui-monospace, SFMono-Regular, 'JetBrains Mono', monospace;
51
-
52
- --gog-text-xs: 0.75rem;
53
- --gog-text-sm: 0.875rem;
54
- --gog-text-md: 1rem;
55
- --gog-text-lg: 1.125rem;
56
- /* 20px, between `lg` and `xl`. Named for the control size it serves rather than continuing the
57
- t-shirt run, because that is what asked for it: `gog-button` and the field controls both
58
- needed a step for their `slg` size and, having none, both wrote `1.25rem` as a literal — the
59
- same value chosen twice, independently, which is a missing rung and not two opinions. The
60
- gap from 1.125 to 1.5 is the widest in the scale, so it was the one likely to be filled by
61
- hand. */
62
- --gog-text-slg: 1.25rem;
63
- --gog-text-xl: 1.5rem;
64
- --gog-text-2xl: 2rem;
65
- --gog-text-3xl: 3rem;
66
-
67
- /* Weight, the third character axis after casing and tracking — and the one 21.7.0's character
68
- layer missed, which is how fifteen component tokens came to hold a bare number. A house style
69
- that wants lighter chrome sets these four and nothing else; before them it meant finding and
70
- re-listing every one. Four steps because four are used: no `normal`, because nothing in the
71
- library paints 400 and an unused token is API nobody asked for. */
72
- --gog-font-weight-medium: 500;
73
- --gog-font-weight-semibold: 600;
74
- --gog-font-weight-bold: 700;
75
- --gog-font-weight-heavy: 900;
76
-
77
- /* Leading, the fourth character axis. Twenty component tokens held a bare number — seven of
78
- them the same 1.4 — so a house style that wanted roomier text had to find every one. Six
79
- steps because six values are painted; `gog-panel`'s heading keeps its own 1.25, which is
80
- off this scale on purpose the way an 11px chip is off the type scale. */
81
- --gog-line-height-none: 1;
82
- --gog-line-height-tight: 1.2;
83
- --gog-line-height-snug: 1.3;
84
- --gog-line-height-normal: 1.4;
85
- --gog-line-height-relaxed: 1.5;
86
- --gog-line-height-loose: 1.6;
87
-
88
- /* The "emphasis" casing character — labels, buttons, section and table headers all shout
89
- the same way by default. Not every uppercase/1px-tracking declaration in this file reads
90
- these two: only the ones that genuinely share this idea do. A few (gog-tabs among them)
91
- stay their own literal on purpose, because normal case or a different tracking reads
92
- better there — see docs/themes.md, iteration 1, for the full audit of what did and did
93
- not qualify. */
94
- --gog-text-transform: uppercase;
95
- --gog-letter-spacing: 1px;
96
-
97
- /* ── Spacing & geometry ───────────────────────────────────────────────────────
98
-
99
- `--gog-density` is the whole spacing system in one number. It multiplies every step
100
- of the scale below, and every component padding and gap derives from that scale, so
101
- a theme makes the entire library compact or roomy without naming a single component:
102
-
103
- [data-theme='compact'] { --gog-density: 0.75; }
104
-
105
- This is the density half of docs/themes.md's character layer — the same idea as
106
- --gog-radius for corners. Before it existed, 177 component paddings and gaps were
107
- literals in two different units, and a theme that wanted tighter controls had to
108
- re-list all of them; check-tokens.mjs rule G now fails a build that adds another.
109
-
110
- The steps are named for their pixel value at density 1, because a t-shirt scale
111
- stops being readable somewhere around the fourth size and this one has fourteen.
112
- The five original t-shirt names are kept as aliases: they are public API, they are
113
- what `theme-starter.css` and every existing consumer theme use, and they cost
114
- nothing to keep.
115
-
116
- Only the multiplier itself lives here — the scale is in the derived block below,
117
- because every step reads this token and so has to re-resolve inside each theme
118
- scope. A step declared here would be computed once against :root's density and a
119
- [data-theme] subtree would inherit that number, not its own. */
120
- --gog-density: 1;
121
-
122
- /* The ground a *raised* surface paints. Equal to the plain surface by default, because on a
123
- light theme elevation reads as a shadow and the surface itself does not change.
124
-
125
- On a dark theme a shadow has nothing to darken — 21.7.1 found `elevated` and `outlined`
126
- cards rendering identically under `data-theme="dark"`, both a thin ring on the same fill.
127
- Dark themes therefore lift this token instead, which is how elevation has to be expressed
128
- when the page is already near-black. Each dark theme sets it; light themes leave it alone. */
129
-
130
- --gog-radius: 8px;
131
- /* Three border-weight tiers, not one: --gog-control-border-width (2px) is form fields,
132
- --gog-panel-border-width (1px) is raised/floating surfaces (card, dialog, dropdown panel,
133
- tooltip — see README.md's note on --gog-panel-*), and this pair is everything smaller and
134
- inline — chip, tag, badge, toggle, table rows, tabs, calendar cells. It happens to share
135
- panel's value today; kept separate anyway; a theme wanting thick floating panels but thin
136
- inline chips (or the reverse) needs the two independently settable. */
137
- --gog-border-width: 1px;
138
- --gog-border-style: solid;
139
- --gog-panel-border-width: 1px;
140
- --gog-panel-border-style: solid;
141
-
142
- /* ── Motion ──────────────────────────────────────────────────────────────────
143
- Every component transition/animation is expressed in these. Set them to 0s to
144
- flatten all motion theme-wide (components also honour prefers-reduced-motion). */
145
- --gog-duration-fast: 0.12s;
146
- --gog-duration-base: 0.15s;
147
- --gog-duration-slow: 0.2s;
148
- --gog-easing: ease;
149
-
150
- /* ── Focus & disabled ───────────────────────────────────────────────────────── */
151
- --gog-focus-ring-width: 3px;
152
- --gog-focus-ring-offset: 2px;
153
- --gog-disabled-opacity: 0.4;
154
-
155
- /* ── Control metrics ─────────────────────────────────────────────────────────
156
- Five-tier scale: xsm/slg bookend the original sm/md/lg (restored below to
157
- their pre-compaction numbers) as new extremes for extra-tight or extra-roomy
158
- layouts. */
159
- /* The clear (×) button's glyph, as a fraction of its box. One number written five times —
160
- `gog-autocomplete`, `gog-datepicker`, `gog-inputfield`, `gog-multiselect` and `gog-select`
161
- all had their own `0.7` for the same part. `gog-textarea` keeps its own `1` deliberately:
162
- its clear button sits in a corner rather than in the field's icon row. */
163
- --gog-control-clear-icon-ratio: 0.7;
164
- --gog-control-border-width: 2px;
165
- --gog-control-border-style: solid;
166
-
167
- --gog-control-checkbox-box-size-xsm: 12px;
168
- --gog-control-checkbox-box-size-sm: 18px;
169
- --gog-control-checkbox-box-size-md: 24px;
170
- --gog-control-checkbox-box-size-lg: 32px;
171
- --gog-control-checkbox-box-size-slg: 40px;
172
- --gog-control-checkbox-label-size-xsm: 0.6875rem;
173
- --gog-control-checkbox-label-size-sm: 0.8125rem;
174
- --gog-control-checkbox-label-size-md: 0.9375rem;
175
- --gog-control-checkbox-label-size-lg: 1.0625rem;
176
- --gog-control-checkbox-label-size-slg: 1.1875rem;
177
- --gog-control-checkbox-icon-size-xsm: 10px;
178
- --gog-control-checkbox-icon-size-sm: 12px;
179
- --gog-control-checkbox-icon-size-md: 14px;
180
- --gog-control-checkbox-icon-size-lg: 18px;
181
- --gog-control-checkbox-icon-size-slg: 22px;
182
-
183
- /* ── Button sizing ─────────────────────────────────────────────────────────── */
184
-
185
- /* ── Field sizing (input / select / multiselect share one scale) ─────────────
186
- The offsets are spacing and follow --gog-density with everything else; the glyph
187
- box does not, because an icon that shrinks with the padding stops being legible
188
- well before the padding stops being usable. Only the offsets move.
189
-
190
- Each inset is the text's start edge: one offset before the glyph, the glyph, one
191
- offset after. It was five hand-measured literals (docs/iteration-8-plan.md tuned
192
- them in a browser) that happened to satisfy that identity, so nothing here moves
193
- at density 1 — but a literal cannot follow the density knob, and at 0.75 the text
194
- used to keep a 36px inset against 7px of padding. Stated as the sum it always was,
195
- it just works. */
196
- --gog-field-icon-glyph-xsm: 12px;
197
- --gog-field-icon-glyph-sm: 14px;
198
- --gog-field-icon-glyph: 16px;
199
-
200
- /* ── Float label geometry (input / textarea / select / multiselect) ─────────
201
- One scale for every field that can float its label. Each control reads these
202
- through its own `--gog-<block>-float-label-*` token in the derived layer below,
203
- so setting a value here retunes all of them at once while a single control can
204
- still be tuned on its own. `reserve` is the headroom added inside the field for
205
- the 'in'/'on' variants; `in-top` is where the label lands once floated for 'in';
206
- `over-gap`/`over-reserve` are the gap above the border and the space permanently
207
- kept clear for the 'over' variant. */
208
- --gog-field-float-label-reserve: 14px;
209
- --gog-field-float-label-in-top: 6px;
210
- --gog-field-float-label-over-reserve: 1.4em;
211
-
212
- /* ── Icon & spinner ───────────────────────────────────────────────────────── */
213
- --gog-icon-size: 1.2em;
214
- --gog-icon-stroke-width: 2;
215
- --gog-spinner-size-xsm: 12px;
216
- --gog-spinner-size-sm: 18px;
217
- --gog-spinner-size-md: 48px;
218
- --gog-spinner-size-lg: 96px;
219
- --gog-spinner-size-slg: 144px;
220
- --gog-spinner-rune-size: 20px;
221
-
222
- /* ── Toast stack ──────────────────────────────────────────────────────────── */
223
- --gog-toast-min-width: 280px;
224
- --gog-toast-max-width: 400px;
225
- --gog-toast-z-index: 9999;
226
- --gog-toast-enter-distance: 110%;
227
- --gog-toast-shadow: 0 4px 24px rgba(0, 0, 0, 0.25);
228
-
229
- /* ── Overlay stacking ───────────────────────────────────────────────────────
230
- Baseline for dropdown panels. gog-dialog re-declares this on its own panel so
231
- dropdowns opened inside a dialog stack above it. */
232
- /* The library's stacking floor. Every layer below is `base + N`, so an app that has to put the
233
- whole library above its own chrome moves this one number and keeps the internal order —
234
- badge 1, toast 100, dropdowns and dialogs 300, tooltip 400, the blocking spinner overlay
235
- 8000. Before this, shifting the stack meant editing five tokens and hoping none was missed. */
236
- --gog-z-base: 0;
237
-
238
- /* ── Light palette (also the no-data-theme default) ───────────────────────── */
239
- color-scheme: light;
240
- /* Backgrounds and surfaces */
241
- --gog-background-color: #f7f3eb; /* Warm parchment page ground */
242
- --gog-surface-color: #ffffff; /* Bleached parchment for cards — lighter than the page on purpose, so the two tiers read apart */
243
- --gog-hover-color: #f0e7d7; /* Hover state — soft wax */
244
- --gog-border-color: #d8c7ad; /* Aged brass rule */
245
-
246
- /* Type — old oak-gall ink */
247
- --gog-text-color: #17120c; /* Deep ink — clears WCAG AAA against both surfaces */
248
- --gog-accent-text-color: #ffffff;
249
- --gog-muted-text-color: #63503c; /* Muted kiln ink */
250
-
251
- /* Brand and accents — guild gold leaf */
252
- --gog-primary-color: #17120c;
253
- /* Deep guild gold. Darkened from #9e6f00 in 21.7.0: white on the old value was 4.44:1,
254
- just under WCAG AA's 4.5, and its hover fill was 2.87:1 — the hover was the worse half.
255
- The hover is now *darker* than the rest state rather than brighter, because gold light
256
- enough to read as "a brighter gleam" cannot carry white text at all. */
257
- --gog-accent-color: #926600;
258
- --gog-accent-bright: #7a5500;
259
- --gog-accent-dim: #735100; /* Dark bronze */
260
- --gog-accent-pale: #f8f1df; /* Pale wash beneath the gold */
261
- --gog-secondary-color: #6b5328;
262
-
263
- /* Semantic colours, kept in the alchemical family */
264
- --gog-success-color: #216e4e; /* Emerald */
265
- --gog-danger-color: #a7232b; /* Ruby */
266
- --gog-warning-color: #c45100; /* Dark amber */
267
- --gog-info-color: #2b5c8f; /* Lapis */
268
-
269
- /* Soft, deep shadow — old leather */
270
- --gog-panel-shadow: 0 4px 20px rgba(23, 18, 12, 0.08), 0 1px 3px rgba(23, 18, 12, 0.04);
271
- --gog-spinner-overlay-bg: rgba(247, 243, 235, 0.85);
272
- }
273
-
274
- :root[data-theme='light'],
275
- [data-theme='light'] {
276
- color-scheme: light;
277
-
278
- /* Backgrounds and surfaces */
279
- --gog-background-color: #f7f3eb; /* Warm parchment page ground */
280
- --gog-surface-color: #ffffff; /* Bleached parchment for cards — lighter than the page on purpose, so the two tiers read apart */
281
- --gog-hover-color: #f0e7d7; /* Hover state — soft wax */
282
- --gog-border-color: #d8c7ad; /* Aged brass rule */
283
-
284
- /* Type — old oak-gall ink */
285
- --gog-text-color: #17120c; /* Deep ink — clears WCAG AAA against both surfaces */
286
- --gog-accent-text-color: #ffffff;
287
- --gog-muted-text-color: #63503c; /* Muted kiln ink */
288
-
289
- /* Brand and accents — guild gold leaf */
290
- --gog-primary-color: #17120c;
291
- /* Deep guild gold. Darkened from #9e6f00 in 21.7.0: white on the old value was 4.44:1,
292
- just under WCAG AA's 4.5, and its hover fill was 2.87:1 — the hover was the worse half.
293
- The hover is now *darker* than the rest state rather than brighter, because gold light
294
- enough to read as "a brighter gleam" cannot carry white text at all. */
295
- --gog-accent-color: #926600;
296
- --gog-accent-bright: #7a5500;
297
- --gog-accent-dim: #735100; /* Dark bronze */
298
- --gog-accent-pale: #f8f1df; /* Pale wash beneath the gold */
299
- --gog-secondary-color: #6b5328;
300
-
301
- /* Semantic colours, kept in the alchemical family */
302
- --gog-success-color: #216e4e; /* Emerald */
303
- --gog-danger-color: #a7232b; /* Ruby */
304
- --gog-warning-color: #c45100; /* Dark amber */
305
- --gog-info-color: #2b5c8f; /* Lapis */
306
-
307
- /* Soft, deep shadow — old leather */
308
- --gog-panel-shadow: 0 4px 20px rgba(23, 18, 12, 0.08), 0 1px 3px rgba(23, 18, 12, 0.04);
309
- --gog-spinner-overlay-bg: rgba(247, 243, 235, 0.85);
310
- }
311
-
312
- :root[data-theme='dark'],
313
- [data-theme='dark'] {
314
- color-scheme: dark;
315
-
316
- /* Backgrounds and surfaces */
317
- --gog-background-color: #0d0b08; /* Deep forge obsidian */
318
- --gog-surface-color: #16120e; /* Dark fired iron — cards */
319
- /* Lifted, not shadowed — see --gog-elevated-surface-color. Deliberately a step above
320
- --gog-hover-color, not equal to it: hover and the header strips are a light lift, elevation
321
- is a bigger one, and the first attempt gave all three the same value. */
322
- --gog-hover-color: #241d17; /* Hover state */
323
- --gog-border-color: #3d3122; /* Aged chased bronze */
324
-
325
- /* Type — glowing ivory */
326
- --gog-text-color: #f3ebd8; /* Soft luminous parchment */
327
- --gog-accent-text-color: #0d0b08;
328
- --gog-muted-text-color: #9e8d76; /* Muted bronze */
329
-
330
- /* Brand and accents — the alchemist's glowing gold */
331
- --gog-primary-color: #f3ebd8;
332
- --gog-accent-color: #fbbf24; /* Plasma amber */
333
- --gog-accent-bright: #fde047; /* Bright gold ray */
334
- --gog-accent-dim: #b48310; /* Muted gold */
335
- --gog-accent-pale: #2b210c; /* Dark gold reflection */
336
- --gog-secondary-color: #d4a373;
337
-
338
- /* Semantics */
339
- --gog-success-color: #34d399; /* Glowing emerald */
340
- --gog-danger-color: #f87171; /* Glowing ruby */
341
- --gog-warning-color: #fbbf24; /* Amber */
342
- --gog-info-color: #38bdf8; /* Sapphire */
343
-
344
- --gog-panel-shadow: 0 10px 30px rgba(0, 0, 0, 0.7), 0 0 0 1px var(--gog-border-color);
345
- /* `elevated` drops the 1px ring `--gog-panel-shadow` carries for real overlays (dialog,
346
- dropdown, tooltip), because that ring is exactly what `outlined` draws — with it, the two
347
- card/panel variants render identically on a dark ground. The blur stays; the ring goes,
348
- so outlined has an edge and elevated does not. Light themes need none of this: their
349
- shadow has no ring and reads on its own. */
350
- /* `elevated` cannot use `--gog-panel-shadow` here. That shadow carries a `0 0 0 1px` ring so
351
- overlays keep an edge against the page, and the ring is exactly what `outlined` draws — with
352
- it the two variants render identically. Dropping the ring and keeping the 30px black blur was
353
- worse: black blurred over a near-black page reads as smudge rather than lift.
354
-
355
- So elevation is stated the way a dark UI actually states it — a hairline of light along the
356
- top edge, where a raised surface would catch it, over a tighter, darker shadow that stays
357
- close to the element instead of hazing the page. */
358
- --gog-card-elevated-shadow:
359
- inset 0 1px 0 rgba(255, 255, 255, 0.07), 0 2px 6px rgba(0, 0, 0, 0.55);
360
- --gog-panel-elevated-shadow:
361
- inset 0 1px 0 rgba(255, 255, 255, 0.07), 0 2px 6px rgba(0, 0, 0, 0.55);
362
- --gog-spinner-overlay-bg: rgba(13, 11, 8, 0.85);
363
- }
364
-
365
- /*
366
- * ── Derived layer ───────────────────────────────────────────────────────────────
367
- * Re-declared on every theme scope so each one re-derives from its own palette and
368
- * metrics. Everything here reads another token; nothing here is a bare literal.
369
- */
370
- :root,
371
- [data-theme] {
372
- /* ── Derived foundation tokens ───────────────────────────────────────────────
373
- Split out of the literal block above because they read other tokens: they have
374
- to re-resolve inside each theme scope. */
375
-
376
- /* ── Text on a status fill ───────────────────────────────────────────────────
377
- `--gog-accent-text-color` means "text on the accent fill" and flips with the theme, which
378
- made it the obvious label for a status fill too — `gogBadge` used it for all four. It is
379
- wrong for some of them, and silently: measured 2026-09-04, `material`'s amber under white
380
- was 1.97:1 and `primeng`'s green 2.28:1, both far under AA, in a pair no check had. The
381
- accent is one colour a theme tunes deliberately; the four statuses are four more, and
382
- nothing says one label reads on all five.
383
-
384
- So each status names its own, defaulting to the accent's answer because that is right in
385
- seven of the eleven themes. A theme states one of these only where its own hue disagrees —
386
- `material` puts near-black on its amber, which is Material 3's own convention, and `primeng`
387
- does the same on all three of Aura's bright hues. Where *neither* label reached AA the hue
388
- itself moved instead; see the preset files. */
389
- --gog-success-text-color: var(--gog-accent-text-color, var(--gog-primary-color));
390
- --gog-danger-text-color: var(--gog-accent-text-color, var(--gog-primary-color));
391
- --gog-warning-text-color: var(--gog-accent-text-color, var(--gog-primary-color));
392
- --gog-info-text-color: var(--gog-accent-text-color, var(--gog-primary-color));
393
-
394
- /* Which way a status fill deepens when it is hovered or held: **away from its own label**, so
395
- the step always makes the label easier to read rather than harder. That is the theme's ink
396
- for a fill wearing the accent's white, which is nine of the eleven themes — and the other way
397
- round for the four fills whose label is the ink itself, `material`'s amber and `primeng`'s
398
- three, which say so in their own files. Mixing toward a fixed colour instead is what a first
399
- pass did, and it cost `primeng`'s info button 6.44:1 down to 4.23:1 on press: deepening
400
- toward the ink walked the fill into the label. */
401
- --gog-success-shade: var(--gog-text-color);
402
- --gog-danger-shade: var(--gog-text-color);
403
- --gog-warning-shade: var(--gog-text-color);
404
- --gog-info-shade: var(--gog-text-color);
405
- /* ── Stacking layers ─────────────────────────────────────────────────────────
406
- All five read `--gog-z-base`, so the whole library moves together. The gaps are
407
- deliberate: an app that needs to slot its own element between two of these has room
408
- without touching the library's numbers. */
409
- --gog-badge-z: calc(var(--gog-z-base) + 1);
410
- --gog-toast-base-z: calc(var(--gog-z-base) + 100);
411
- --gog-dropdown-z: calc(var(--gog-z-base) + 300);
412
- --gog-tooltip-z: calc(var(--gog-z-base) + 400);
413
- /* The blocking overlay outranks everything, including a dialog it may be covering. */
414
- --gog-spinner-overlay-z: calc(var(--gog-z-base) + 8000);
415
-
416
- --gog-space-2: calc(2px * var(--gog-density));
417
- --gog-space-4: calc(4px * var(--gog-density));
418
- --gog-space-6: calc(6px * var(--gog-density));
419
- --gog-space-8: calc(8px * var(--gog-density));
420
- --gog-space-10: calc(10px * var(--gog-density));
421
- --gog-space-12: calc(12px * var(--gog-density));
422
- --gog-space-14: calc(14px * var(--gog-density));
423
- --gog-space-16: calc(16px * var(--gog-density));
424
- --gog-space-18: calc(18px * var(--gog-density));
425
- --gog-space-20: calc(20px * var(--gog-density));
426
- --gog-space-24: calc(24px * var(--gog-density));
427
- --gog-space-28: calc(28px * var(--gog-density));
428
- --gog-space-32: calc(32px * var(--gog-density));
429
- --gog-space-48: calc(48px * var(--gog-density));
430
- --gog-space-xs: var(--gog-space-4);
431
- --gog-space-sm: var(--gog-space-8);
432
- --gog-space-md: var(--gog-space-16);
433
- --gog-space-lg: var(--gog-space-24);
434
- --gog-space-2xl: var(--gog-space-48);
435
- --gog-control-padding-y: var(--gog-space-10);
436
- --gog-control-padding-x: var(--gog-space-14);
437
- --gog-control-checkbox-padding: var(--gog-space-6);
438
- --gog-field-xsm-padding-y: var(--gog-space-4);
439
- --gog-field-xsm-padding-x: var(--gog-space-8);
440
- --gog-field-sm-padding-y: var(--gog-space-6);
441
- --gog-field-sm-padding-x: var(--gog-space-10);
442
- --gog-field-lg-padding-y: var(--gog-space-14);
443
- --gog-field-lg-padding-x: var(--gog-space-18);
444
- --gog-field-slg-padding-y: var(--gog-space-18);
445
- --gog-field-slg-padding-x: var(--gog-space-20);
446
- --gog-field-float-label-over-gap: var(--gog-space-8);
447
- --gog-toast-gap: var(--gog-space-10);
448
- --gog-toast-stack-padding: var(--gog-space-16);
449
- --gog-field-xsm-icon-offset: var(--gog-space-6);
450
- --gog-field-sm-icon-offset: var(--gog-space-8);
451
- --gog-field-lg-icon-offset: var(--gog-space-14);
452
- --gog-field-slg-icon-offset: var(--gog-space-18);
453
- --gog-control-icon-offset: var(--gog-space-10);
454
- --gog-elevated-surface-color: var(--gog-surface-color);
455
- --gog-panel-radius: calc(var(--gog-radius) + 8px);
456
- --gog-field-xsm-font-size: var(--gog-text-xs);
457
- --gog-field-sm-font-size: var(--gog-text-sm);
458
- /* The only field metric that is a type size; the rest of this block is geometry. It lives
459
- here rather than with them because it reads a token, and a derived value declared on the
460
- literals-only `:root` freezes to that scope's scale (rule C). */
461
- --gog-field-slg-font-size: var(--gog-text-slg);
462
-
463
- --gog-field-md-padding-y: var(--gog-control-padding-y);
464
- --gog-field-md-padding-x: var(--gog-control-padding-x);
465
-
466
- /* offset + glyph + offset — see the icon-chrome comment in the literal block above. */
467
- --gog-field-xsm-icon-inset: calc(
468
- var(--gog-field-xsm-icon-offset) * 2 + var(--gog-field-icon-glyph-xsm)
469
- );
470
- --gog-field-sm-icon-inset: calc(
471
- var(--gog-field-sm-icon-offset) * 2 + var(--gog-field-icon-glyph-sm)
472
- );
473
- --gog-field-md-icon-inset: calc(
474
- var(--gog-field-md-icon-offset) * 2 + var(--gog-field-icon-glyph)
475
- );
476
- --gog-field-lg-icon-inset: calc(
477
- var(--gog-field-lg-icon-offset) * 2 + var(--gog-field-icon-glyph)
478
- );
479
- --gog-field-slg-icon-inset: calc(
480
- var(--gog-field-slg-icon-offset) * 2 + var(--gog-field-icon-glyph)
481
- );
482
- --gog-field-md-font-size: var(--gog-text-md);
483
- --gog-field-md-icon-offset: var(--gog-control-icon-offset);
484
- --gog-field-lg-font-size: var(--gog-text-lg);
485
-
486
- /* ══════════════════════════════════════════════════════════════════════════════
487
- COMPONENT TOKENS
488
- Everything below is what an individual component paints with. Override a block
489
- to restyle just that component; the values themselves all derive from the
490
- foundation tokens above, so a palette swap carries through for free.
491
- ══════════════════════════════════════════════════════════════════════════════ */
492
-
493
- /* ── Accordion ─────────────────────────────────────────────────────────────── */
494
- --gog-accordion-font-family: var(--gog-font-heading);
495
- --gog-accordion-body-font-family: var(--gog-font-body);
496
- --gog-accordion-border-color: var(--gog-accent-dim);
497
- --gog-accordion-border-width: var(--gog-control-border-width);
498
- --gog-accordion-border-style: var(--gog-control-border-style);
499
- --gog-accordion-text-color: var(--gog-text-color);
500
- --gog-accordion-accent-color: var(--gog-accent-color);
501
- --gog-accordion-hover-bg: var(--gog-hover-color);
502
- /* The header's label stays body text while hovered or held, and the lift is carried by the
503
- background alone. It turned `--gog-accordion-accent-color` until 21.9.0, which is the accent
504
- — on an accent-tinted strip that measured 3.61:1 in light, 3.79:1 in one-light and 4.09:1 in
505
- ledger, and worse again once the press deepened the tint. Same trade as the ghost button's
506
- hover, and made for the same reason: the accent is not a text colour on a ground that is
507
- itself tinted with the accent. */
508
- --gog-accordion-hover-color: var(--gog-accordion-text-color);
509
- --gog-accordion-press-bg: var(--gog-border-color);
510
- --gog-accordion-hover-ring: var(--gog-accent-dim);
511
- --gog-accordion-focus-ring-width: var(--gog-focus-ring-width);
512
- --gog-accordion-body-color: var(--gog-text-color);
513
- --gog-accordion-body-line-height: var(--gog-line-height-loose);
514
- --gog-accordion-header-text-transform: var(--gog-text-transform);
515
- --gog-accordion-header-gap: var(--gog-space-12);
516
- --gog-accordion-disabled-opacity: var(--gog-disabled-opacity);
517
- --gog-accordion-transition-duration: var(--gog-duration-base);
518
- --gog-accordion-body-transition-duration: var(--gog-duration-slow);
519
- --gog-accordion-chevron-transition-duration: var(--gog-duration-slow);
520
- --gog-accordion-body-lift: -2px;
521
- /* Flat by default — corner rounding is a look, not a given; consumers who want it
522
- opt in per-instance or theme-wide by overriding these two. */
523
- --gog-accordion-radius: 0px;
524
- --gog-accordion-body-radius: 0px;
525
- /* The header carries its own ground and the body does not. Both were `transparent` until
526
- 21.7.1, which made every open item one continuous band: header and content painted the
527
- surrounding surface, and the only thing between two open items was a hairline in the accent
528
- colour. With several open at once nobody could tell where one ended and the next began.
529
-
530
- Only the header changed. The body stays transparent on purpose, so an accordion dropped on
531
- a coloured surface still sits on that colour rather than punching a hole in it. */
532
- --gog-accordion-header-bg: var(--gog-hover-color);
533
- --gog-accordion-body-bg: transparent;
534
- /* Per-size metrics. `lg` is the default size. */
535
- --gog-accordion-xsm-padding-y: var(--gog-space-4);
536
- --gog-accordion-xsm-padding-x: var(--gog-space-8);
537
- --gog-accordion-xsm-font-size: var(--gog-text-xs);
538
- --gog-accordion-xsm-letter-spacing: 0.2px;
539
- --gog-accordion-xsm-content-gap: var(--gog-space-2);
540
- --gog-accordion-xsm-body-font-size: var(--gog-text-xs);
541
- --gog-accordion-xsm-body-line-height: var(--gog-line-height-relaxed);
542
- --gog-accordion-xsm-body-padding-top: var(--gog-space-4);
543
- --gog-accordion-xsm-body-padding-bottom: var(--gog-space-6);
544
- --gog-accordion-xsm-chevron-size: 11px;
545
- --gog-accordion-xsm-chevron-font-size: 10px;
546
-
547
- --gog-accordion-sm-padding-y: var(--gog-space-6);
548
- --gog-accordion-sm-padding-x: var(--gog-space-10);
549
- --gog-accordion-sm-font-size: var(--gog-text-xs);
550
- --gog-accordion-sm-letter-spacing: 0.4px;
551
- --gog-accordion-sm-content-gap: var(--gog-space-2);
552
- --gog-accordion-sm-body-font-size: var(--gog-text-xs);
553
- --gog-accordion-sm-body-line-height: var(--gog-accordion-body-line-height);
554
- --gog-accordion-sm-body-padding-top: var(--gog-space-6);
555
- --gog-accordion-sm-body-padding-bottom: var(--gog-space-8);
556
- --gog-accordion-sm-chevron-size: 13px;
557
- --gog-accordion-sm-chevron-font-size: 12px;
558
-
559
- --gog-accordion-md-padding-y: var(--gog-space-10);
560
- --gog-accordion-md-padding-x: var(--gog-space-14);
561
- --gog-accordion-md-font-size: var(--gog-text-xs);
562
- --gog-accordion-md-letter-spacing: 0.8px;
563
- --gog-accordion-md-content-gap: var(--gog-space-2);
564
- --gog-accordion-md-body-font-size: var(--gog-text-sm);
565
- --gog-accordion-md-body-line-height: var(--gog-accordion-body-line-height);
566
- --gog-accordion-md-body-padding-top: var(--gog-space-8);
567
- --gog-accordion-md-body-padding-bottom: var(--gog-space-12);
568
- --gog-accordion-md-chevron-size: 15px;
569
- --gog-accordion-md-chevron-font-size: 14px;
570
-
571
- --gog-accordion-lg-padding-y: var(--gog-space-14);
572
- --gog-accordion-lg-padding-x: var(--gog-space-16);
573
- --gog-accordion-lg-font-size: var(--gog-text-sm);
574
- --gog-accordion-lg-letter-spacing: 0.8px;
575
- --gog-accordion-lg-content-gap: var(--gog-space-4);
576
- --gog-accordion-lg-body-font-size: var(--gog-text-md);
577
- --gog-accordion-lg-body-line-height: var(--gog-accordion-body-line-height);
578
- --gog-accordion-lg-body-padding-top: var(--gog-space-12);
579
- --gog-accordion-lg-body-padding-bottom: var(--gog-space-16);
580
- --gog-accordion-lg-chevron-size: 18px;
581
- --gog-accordion-lg-chevron-font-size: 16px;
582
-
583
- --gog-accordion-slg-padding-y: var(--gog-space-18);
584
- --gog-accordion-slg-padding-x: var(--gog-space-18);
585
- --gog-accordion-slg-font-size: var(--gog-text-md);
586
- --gog-accordion-slg-letter-spacing: 0.8px;
587
- --gog-accordion-slg-content-gap: var(--gog-space-4);
588
- --gog-accordion-slg-body-font-size: var(--gog-text-lg);
589
- --gog-accordion-slg-body-line-height: var(--gog-accordion-body-line-height);
590
- --gog-accordion-slg-body-padding-top: var(--gog-space-16);
591
- --gog-accordion-slg-body-padding-bottom: var(--gog-space-20);
592
- --gog-accordion-slg-chevron-size: 20px;
593
- --gog-accordion-slg-chevron-font-size: 18px;
594
-
595
- /* ── Collapsible ───────────────────────────────────────────────────────────
596
- No portal, no owned markup — see utilities.css for the actual `.gog-collapsible__*`
597
- rules (they style content this component's consumer projects, which sits outside
598
- `gog-collapsible`'s own view and can't be reached by its scoped stylesheet). */
599
- --gog-collapsible-transition-duration: var(--gog-duration-slow);
600
- /* The panel's natural height, so an open panel never truncates whatever it holds. This was
601
- a fixed `480px` cap, which bought the CSS-only transition an animatable target but paid
602
- for it by silently clipping any taller content — `overflow: hidden` means no scrollbar
603
- and no other sign that the rest of the panel is missing. `max-content` still animates,
604
- via `interpolate-size: allow-keywords` on the content element (see utilities.css); where
605
- that is unsupported the panel snaps open instead of easing, which is the right way round
606
- for the trade — losing an animation is visible and harmless, losing content is neither.
607
- Set a length here to cap a particular panel on purpose; it will clip, as before. */
608
- --gog-collapsible-max-height: max-content;
609
- --gog-collapsible-disabled-opacity: var(--gog-disabled-opacity);
610
-
611
- /* ── Button ────────────────────────────────────────────────────────────────
612
- `--gog-button-bg`, `--gog-button-color`, `--gog-button-border`, `--gog-button-shadow`,
613
- `--gog-button-hover-bg`, `--gog-button-hover-shadow`, `--gog-button-padding` and
614
- `--gog-button-font-size` are intentionally NOT declared — they are the per-instance
615
- escape hatch the variant/size classes fall back through. */
616
- --gog-button-xsm-padding: var(--gog-space-4) var(--gog-space-8);
617
- --gog-button-sm-padding: var(--gog-space-8) var(--gog-space-14);
618
- --gog-button-md-padding: var(--gog-space-12) var(--gog-space-20);
619
- --gog-button-lg-padding: var(--gog-space-16) var(--gog-space-24);
620
- --gog-button-slg-padding: var(--gog-space-20) var(--gog-space-28);
621
- --gog-button-xsm-font-size: var(--gog-text-xs);
622
- --gog-button-sm-font-size: var(--gog-text-sm);
623
- --gog-button-md-font-size: var(--gog-text-md);
624
- --gog-button-lg-font-size: var(--gog-text-lg);
625
- --gog-button-slg-font-size: var(--gog-text-slg);
626
-
627
- --gog-button-font-family: var(--gog-font-heading);
628
- --gog-button-font-weight: var(--gog-font-weight-heavy);
629
- --gog-button-letter-spacing: var(--gog-letter-spacing);
630
- --gog-button-text-transform: var(--gog-text-transform);
631
- --gog-button-line-height: var(--gog-line-height-none);
632
- --gog-button-gap: var(--gog-space-sm);
633
- --gog-button-radius: var(--gog-radius);
634
- --gog-button-border-width: var(--gog-control-border-width);
635
- --gog-button-border-style: var(--gog-control-border-style);
636
- --gog-button-transition-duration: var(--gog-duration-base);
637
- --gog-button-focus-ring-width: var(--gog-focus-ring-width);
638
- /* One pixel further out than the foundation ring: a filled surface needs the extra air for
639
- the ring to read as separate from the fill. Written as the foundation plus that pixel
640
- rather than a flat 3px, so a theme that moves the ring moves this with it. */
641
- --gog-button-focus-ring-offset: calc(var(--gog-focus-ring-offset) + 1px);
642
- /* Shipped since before the press had a colour, and left spelled `active` on purpose: renaming
643
- a token consumers already override needs a deprecation cycle, and this is a patch. The state
644
- it names is the same one `--gog-button-press-*` paints. */
645
- --gog-button-active-scale: 0.97;
646
- --gog-button-disabled-opacity: var(--gog-disabled-opacity);
647
- --gog-button-loading-opacity: 0.7;
648
- --gog-button-spinner-max-size: 70%;
649
-
650
- --gog-button-primary-bg: var(--gog-accent-color);
651
- --gog-button-primary-color: var(--gog-accent-text-color, var(--gog-primary-color));
652
- --gog-button-primary-border: transparent;
653
- --gog-button-primary-shadow: none;
654
- --gog-button-primary-hover-bg: var(--gog-accent-bright);
655
- --gog-button-primary-hover-color: var(--gog-button-primary-color);
656
- --gog-button-primary-hover-shadow: 0 0 16px var(--gog-accent-pale);
657
- /* The label's colour, not the page's. `--gog-text-color` is the colour of text on the page
658
- background, and a filled button is not the page background — on the dark theme that put pale
659
- parchment on bright amber, which read as a washed-out spinner beside a near-black label. */
660
- --gog-button-primary-spinner-color: var(--gog-button-primary-color);
661
-
662
- --gog-button-secondary-bg: var(--gog-secondary-color);
663
- --gog-button-secondary-color: var(--gog-accent-text-color, var(--gog-primary-color));
664
- --gog-button-secondary-border: transparent;
665
- --gog-button-secondary-shadow: none;
666
- --gog-button-secondary-hover-bg: var(--gog-accent-color);
667
- --gog-button-secondary-hover-color: var(--gog-button-secondary-color);
668
- --gog-button-secondary-hover-shadow: none;
669
- /* Same reasoning as primary: the other filled variant, the same mismatch. */
670
- --gog-button-secondary-spinner-color: var(--gog-button-secondary-color);
671
-
672
- --gog-button-outline-bg: transparent;
673
- --gog-button-outline-color: var(--gog-accent-color);
674
- --gog-button-outline-border: var(--gog-accent-color);
675
- --gog-button-outline-shadow: none;
676
- --gog-button-outline-hover-bg: var(--gog-accent-color);
677
- /* The label sits on the accent fill once the button is hovered, so it takes the token that
678
- means "text on an accent fill" — the same one the two filled variants use. It read
679
- `--gog-primary-color` until 21.9.0, which is the colour of text on the *page*, and the
680
- result failed WCAG AA in all 11 shipped themes: 1.11:1 in one-dark, 1.41:1 in dark, 3.65:1
681
- in light at best. It was invisible to `check:contrast` because that script had no pair for
682
- this label, the same way it had none for the hover fill until 2026-08-29. It has both now. */
683
- --gog-button-outline-hover-color: var(--gog-accent-text-color, var(--gog-primary-color));
684
- --gog-button-outline-hover-shadow: none;
685
- --gog-button-outline-spinner-color: var(--gog-accent-color);
686
-
687
- --gog-button-ghost-bg: transparent;
688
- --gog-button-ghost-color: var(--gog-accent-color);
689
- --gog-button-ghost-border: transparent;
690
- --gog-button-ghost-shadow: none;
691
- --gog-button-ghost-hover-bg: var(--gog-hover-color);
692
- /* The label leaves the accent while the ground is tinted, and that is the only thing that
693
- works here. Ghost's resting label *is* `--gog-accent-color`, and its hover tints the ground
694
- with the same accent, so the two walk toward each other: measured across all 11 themes, the
695
- label fell under 4.5:1 in `light` (3.94), `primeng` (4.18) and `one-light` (4.22). No ground
696
- fixes it — a half-strength wash, a neutral `--gog-hover-color`, a text scrim and an
697
- accent-dim wash were all measured, and `light` fails every one of them, because
698
- `--gog-accent-color` as *text* on that theme's own background is 4.60:1 with no headroom to
699
- spend. Moving the label to `--gog-text-color` clears 5.29:1 at worst (one-dark) and leaves
700
- the ground exactly as it was, so the hover stays the subtle wash this variant is documented
701
- to have. The press then goes the other way and fills — see `-press-bg` below. */
702
- --gog-button-ghost-hover-color: var(--gog-text-color);
703
- --gog-button-ghost-hover-shadow: none;
704
- --gog-button-ghost-spinner-color: var(--gog-accent-color);
705
-
706
- /* The held state, and the reason it is a colour rather than only the `--gog-button-active-scale`
707
- it used to be: `prefers-reduced-motion` switches that transform off, which left a button with
708
- no press feedback at all for the readers most likely to need it. A colour change is a state,
709
- not a movement — reduced motion keeps it and only drops the scale, and with transitions off it
710
- lands instantly. See docs/feedback-triage.md's closing section: reduced motion must remove the
711
- animation, not the information.
712
-
713
- Each variant goes one step *deeper* than its own hover, so pressing is distinguishable while
714
- hovering, which is the normal case for a pointer. `--gog-accent-dim` is that step for the
715
- three accent-carrying variants; ghost has no fill of its own to deepen, so it takes a
716
- stronger wash of the same tint its hover uses (see the @supports block at the end of this
717
- file for the mixed value and why the flat one above it is not a fallback but the value). */
718
- /* The *toggle* state — `aria-pressed="true"`, a button that stays on — as an inset ring rather
719
- than a fill. A fill cannot carry it: every other state already owns the background, so a
720
- toggled button that is also hovered or held would lose the one thing saying it is on. A ring
721
- composes with all of them, and it is the same reasoning that made `gog-button-toggle-group`'s
722
- selected option a fill: there, nothing else was competing for the background.
723
-
724
- The ring takes the colour that is guaranteed to read on its own variant — the label colour on
725
- the filled two, the accent on the transparent two — so both are pairs `check:contrast`
726
- already gates. While toggled, this replaces the variant's `box-shadow`, which costs
727
- `primary` its hover glow: the ring is state and the glow is decoration, and a `box-shadow`
728
- list cannot hold `none` as a layer, so keeping both was not on offer. */
729
- --gog-button-toggled-ring-width: 2px;
730
- --gog-button-primary-toggled-shadow: inset 0 0 0 var(--gog-button-toggled-ring-width)
731
- var(--gog-accent-text-color, var(--gog-primary-color));
732
- --gog-button-secondary-toggled-shadow: var(--gog-button-primary-toggled-shadow);
733
- --gog-button-outline-toggled-shadow: inset 0 0 0 var(--gog-button-toggled-ring-width)
734
- var(--gog-accent-color);
735
- --gog-button-ghost-toggled-shadow: var(--gog-button-outline-toggled-shadow);
736
-
737
- --gog-button-primary-press-bg: var(--gog-accent-dim);
738
- --gog-button-primary-press-color: var(--gog-button-primary-color);
739
- --gog-button-secondary-press-bg: var(--gog-accent-dim);
740
- --gog-button-secondary-press-color: var(--gog-button-secondary-color);
741
- --gog-button-outline-press-bg: var(--gog-accent-dim);
742
- --gog-button-outline-press-color: var(--gog-button-outline-hover-color);
743
- /* Ghost presses to the same deep fill as outline, rather than to a wash like every other
744
- surface in this file. Measured across all 11 themes: a wash cannot work here, because this
745
- button's *label* is the accent, so tinting its ground with the accent walks the two together
746
- — a 24% wash put the label under 4.5:1 in seven themes, and `--gog-accent-pale` was either
747
- no better or invisible against the hover. A filled press moves the label to
748
- `--gog-accent-text-color` instead, which is the pair `check:contrast` already gates, so no
749
- future theme can quietly break it. The other eight surfaces keep their washes: their labels
750
- are body text, and their worst case across the 11 is 4.80:1. */
751
- --gog-button-ghost-press-bg: var(--gog-accent-dim);
752
- --gog-button-ghost-press-color: var(--gog-accent-text-color, var(--gog-primary-color));
753
-
754
- /* ── Button severity ─────────────────────────────────────────────────────────
755
- `severity` is orthogonal to `variant`: a destructive action can be a filled button, an
756
- outlined one or a ghost, and it is still destructive. So this is not a fifth variant — it
757
- re-points the *ingredients* the four variants are built from, and the shape rules in
758
- `styles/button.css` apply them per variant. Four severities x six ingredients rather than
759
- four x four variants x eleven properties, which is what a fifth-variant reading would have
760
- cost.
761
-
762
- `-fill` and `-on-fill` are the filled pair, and `-on-fill` is `--gog-<status>-text-color`
763
- rather than `--gog-accent-text-color`: see that block near the top of this file for why one
764
- label does not read on every status.
765
-
766
- `-ink` is the label a *transparent* variant paints, and it is not the raw status colour. As
767
- text on the page, the raw hue clears 4.5:1 in only five of the eleven themes — `primeng`'s
768
- amber manages 2.05:1 — so it is mixed toward the theme's own ink until it does. The 50% is
769
- measured rather than chosen: `material`'s amber is the binding case and needs the hue below
770
- 54%, so 50 clears every theme with a little headroom. It costs saturation on the themes that
771
- never needed it; a theme that wants the colour back overrides `--gog-button-<status>-ink`
772
- directly, which is one token rather than a dial nobody would find. Mixing toward `--gog-text-color` rather than a
773
- fixed black is what makes one number work on light and dark alike — the ink is dark on one
774
- and light on the other, and both directions move *away* from the ground.
775
-
776
- The hover and press fills move the same way, one small step and one larger, so a severity
777
- button's states step the way an accent one's do. Moving toward the ink also moves away from
778
- `-on-fill` in the seven themes where that is the accent's white-or-near-black, so the label
779
- gets easier rather than harder; in the four where `-on-fill` *is* the ink, the rest state
780
- starts at 6.44:1 or better and a 24% step cannot spend that. The flat values here are what a
781
- browser without `color-mix()` renders — no step, the same graceful nothing the ghost button
782
- degrades to — and the mixed ones are in the @supports block at the end of this file. */
783
- --gog-button-success-fill: var(--gog-success-color);
784
- --gog-button-success-on-fill: var(--gog-success-text-color);
785
- --gog-button-success-fill-hover: var(--gog-success-color);
786
- --gog-button-success-fill-press: var(--gog-success-color);
787
- --gog-button-success-ink: var(--gog-success-color);
788
- --gog-button-success-wash: transparent;
789
-
790
- --gog-button-danger-fill: var(--gog-danger-color);
791
- --gog-button-danger-on-fill: var(--gog-danger-text-color);
792
- --gog-button-danger-fill-hover: var(--gog-danger-color);
793
- --gog-button-danger-fill-press: var(--gog-danger-color);
794
- --gog-button-danger-ink: var(--gog-danger-color);
795
- --gog-button-danger-wash: transparent;
796
-
797
- --gog-button-warning-fill: var(--gog-warning-color);
798
- --gog-button-warning-on-fill: var(--gog-warning-text-color);
799
- --gog-button-warning-fill-hover: var(--gog-warning-color);
800
- --gog-button-warning-fill-press: var(--gog-warning-color);
801
- --gog-button-warning-ink: var(--gog-warning-color);
802
- --gog-button-warning-wash: transparent;
803
-
804
- --gog-button-info-fill: var(--gog-info-color);
805
- --gog-button-info-on-fill: var(--gog-info-text-color);
806
- --gog-button-info-fill-hover: var(--gog-info-color);
807
- --gog-button-info-fill-press: var(--gog-info-color);
808
- --gog-button-info-ink: var(--gog-info-color);
809
- --gog-button-info-wash: transparent;
810
-
811
- /* ── Button toggle group ───────────────────────────────────────────────────
812
- `--gog-button-toggle-bg`, `-color`, `-padding` and `-font-size` are intentionally NOT
813
- declared — they are the per-instance escape hatch the size classes fall back through.
814
- Padding/font-size reuse the `--gog-button-<size>-*` scale so a toggle group and a
815
- `<gog-button>` at the same `size` line up in a toolbar. */
816
- --gog-button-toggle-font-family: var(--gog-font-heading);
817
- --gog-button-toggle-font-weight: var(--gog-font-weight-bold);
818
- --gog-button-toggle-letter-spacing: 0.5px;
819
- --gog-button-toggle-text-transform: var(--gog-text-transform);
820
- --gog-button-toggle-line-height: var(--gog-line-height-none);
821
- --gog-button-toggle-gap: var(--gog-space-sm);
822
- --gog-button-toggle-icon-size: 1.1em;
823
- --gog-button-toggle-radius: var(--gog-radius);
824
- --gog-button-toggle-border-width: var(--gog-control-border-width);
825
- --gog-button-toggle-border-style: var(--gog-control-border-style);
826
- --gog-button-toggle-border-color: var(--gog-border-color);
827
- --gog-button-toggle-rest-bg: transparent;
828
- --gog-button-toggle-rest-color: var(--gog-text-color);
829
- --gog-button-toggle-hover-bg: var(--gog-hover-color);
830
- --gog-button-toggle-press-bg: var(--gog-border-color);
831
- --gog-button-toggle-hover-color: var(--gog-text-color);
832
- --gog-button-toggle-selected-bg: var(--gog-accent-color);
833
- --gog-button-toggle-selected-color: var(--gog-accent-text-color, var(--gog-primary-color));
834
- --gog-button-toggle-selected-border-color: var(--gog-accent-color);
835
- /* A selected option is already filled with the accent, so its press deepens the fill the way
836
- the filled button variants do rather than washing over it. */
837
- --gog-button-toggle-selected-press-bg: var(--gog-accent-dim);
838
- --gog-button-toggle-separated-gap: var(--gog-space-sm);
839
- --gog-button-toggle-transition-duration: var(--gog-duration-base);
840
- --gog-button-toggle-disabled-opacity: var(--gog-disabled-opacity);
841
- --gog-button-toggle-focus-ring-width: var(--gog-focus-ring-width);
842
- --gog-button-toggle-focus-ring-offset: var(--gog-focus-ring-offset);
843
- --gog-button-toggle-focus-ring-color: var(--gog-accent-color);
844
-
845
- /* ── Calendar (the month grid inside gog-datepicker, and gog-calendar on its own) ── */
846
- --gog-calendar-font-family: var(--gog-font-body);
847
- --gog-calendar-color: var(--gog-text-color);
848
- /* Caps the host at its month grid instead of letting the header spread to the container.
849
- `100%` restores the pre-21.5.0 full-width behaviour. */
850
- --gog-calendar-max-width: max-content;
851
- --gog-calendar-padding: var(--gog-space-12);
852
- --gog-calendar-header-gap: var(--gog-space-4);
853
- --gog-calendar-header-margin: var(--gog-space-8);
854
- --gog-calendar-months-gap: var(--gog-space-16);
855
- --gog-calendar-title-color: var(--gog-text-color);
856
- --gog-calendar-title-font-weight: var(--gog-font-weight-bold);
857
- --gog-calendar-nav-size: 28px;
858
- --gog-calendar-nav-radius: calc(var(--gog-radius) - 2px);
859
- --gog-calendar-nav-bg: transparent;
860
- --gog-calendar-nav-color: var(--gog-muted-text-color);
861
- --gog-calendar-nav-hover-bg: var(--gog-hover-color);
862
- --gog-calendar-nav-hover-color: var(--gog-text-color);
863
- --gog-calendar-nav-icon-size: 0.8rem;
864
- /* Pulls the two chevrons of a year step together so they read as one control. */
865
- --gog-calendar-nav-icon-overlap: -0.35em;
866
- --gog-calendar-weekday-padding: var(--gog-space-4) 0;
867
- --gog-calendar-weekday-color: var(--gog-muted-text-color);
868
- --gog-calendar-weekday-font-size: var(--gog-text-xs);
869
- --gog-calendar-weekday-font-weight: var(--gog-font-weight-semibold);
870
- --gog-calendar-weekday-text-transform: var(--gog-text-transform);
871
- --gog-calendar-day-radius: calc(var(--gog-radius) - 2px);
872
- --gog-calendar-day-border-width: var(--gog-border-width);
873
- --gog-calendar-day-border-style: var(--gog-border-style);
874
- --gog-calendar-day-rest-bg: transparent;
875
- --gog-calendar-day-rest-color: var(--gog-text-color);
876
- --gog-calendar-day-hover-bg: var(--gog-hover-color);
877
- --gog-calendar-day-outside-color: var(--gog-muted-text-color);
878
- --gog-calendar-today-border-color: var(--gog-accent-color);
879
- --gog-calendar-today-font-weight: var(--gog-font-weight-bold);
880
- --gog-calendar-selected-bg: var(--gog-accent-color);
881
- --gog-calendar-selected-color: var(--gog-accent-text-color, var(--gog-primary-color));
882
- --gog-calendar-selected-font-weight: var(--gog-font-weight-bold);
883
- /* The wash between the two ends of a range: same hue, low enough to read as a band rather
884
- than as a second selection. */
885
- --gog-calendar-range-bg: var(--gog-accent-pale);
886
- --gog-calendar-range-color: var(--gog-text-color);
887
- --gog-calendar-disabled-opacity: var(--gog-disabled-opacity);
888
- --gog-calendar-transition-duration: var(--gog-duration-fast);
889
- --gog-calendar-focus-ring-width: var(--gog-focus-ring-width);
890
- /* Inset rather than outset: the month grid packs its cells edge to edge, so an outward ring
891
- would sit on top of the neighbouring day. Negated from the foundation so a theme still
892
- controls how far it sits from the cell edge. */
893
- --gog-calendar-focus-ring-offset: calc(var(--gog-focus-ring-offset) * -1);
894
- --gog-calendar-focus-ring-color: var(--gog-accent-color);
895
- --gog-calendar-divider-width: 1px;
896
- --gog-calendar-divider-style: solid;
897
- --gog-calendar-divider-color: var(--gog-border-color);
898
- --gog-calendar-time-gap: var(--gog-space-6);
899
- --gog-calendar-time-margin: var(--gog-space-10);
900
- --gog-calendar-time-input-width: 3.5rem;
901
- --gog-calendar-time-input-padding: var(--gog-space-4) var(--gog-space-6);
902
- --gog-calendar-time-input-bg: var(--gog-background-color);
903
- --gog-calendar-action-padding: var(--gog-space-4) var(--gog-space-10);
904
- --gog-calendar-footer-gap: var(--gog-space-8);
905
- --gog-calendar-xsm-font-size: var(--gog-text-xs);
906
- --gog-calendar-xsm-day-size: 24px;
907
- --gog-calendar-sm-font-size: var(--gog-text-sm);
908
- --gog-calendar-sm-day-size: 28px;
909
- --gog-calendar-md-font-size: var(--gog-text-sm);
910
- --gog-calendar-md-day-size: 34px;
911
- --gog-calendar-lg-font-size: var(--gog-text-md);
912
- --gog-calendar-lg-day-size: 40px;
913
- --gog-calendar-slg-font-size: var(--gog-text-lg);
914
- --gog-calendar-slg-day-size: 46px;
915
-
916
- /* ── Card ──────────────────────────────────────────────────────────────────
917
- `--gog-card-bg`, `--gog-card-border-color`, `--gog-card-shadow`, `--gog-card-padding-y`,
918
- `--gog-card-padding-x` and `--gog-card-gap` are intentionally NOT declared — they are the
919
- per-instance escape hatch the variant and size classes fall back through. */
920
- --gog-card-font-family: var(--gog-font-body);
921
- --gog-card-color: var(--gog-text-color);
922
- --gog-card-radius: var(--gog-radius);
923
- --gog-card-border-width: var(--gog-panel-border-width);
924
- --gog-card-border-style: var(--gog-panel-border-style);
925
- --gog-card-transition-duration: var(--gog-duration-base);
926
-
927
- --gog-card-heading-color: var(--gog-text-color);
928
- --gog-card-heading-font-family: var(--gog-font-heading);
929
- --gog-card-heading-font-size: var(--gog-text-lg);
930
- --gog-card-heading-font-weight: var(--gog-font-weight-semibold);
931
- --gog-card-heading-line-height: var(--gog-line-height-snug);
932
-
933
- --gog-card-outlined-bg: var(--gog-surface-color);
934
- --gog-card-outlined-border-color: var(--gog-border-color);
935
- --gog-card-outlined-shadow: none;
936
- --gog-card-elevated-bg: var(--gog-elevated-surface-color);
937
- --gog-card-elevated-border-color: transparent;
938
- /* The shared surface shadow, so a card sits at the same elevation as a dialog or a
939
- dropdown panel instead of inventing a second house style for "raised". */
940
- --gog-card-elevated-shadow: var(--gog-panel-shadow);
941
- --gog-card-filled-bg: var(--gog-accent-pale);
942
- --gog-card-filled-border-color: transparent;
943
- --gog-card-filled-shadow: none;
944
-
945
- /* Hover and focus only ever show on a card that holds a `gogCardLink`. */
946
- --gog-card-hover-border-color: var(--gog-accent-dim);
947
- --gog-card-hover-shadow: var(--gog-panel-shadow);
948
- --gog-card-focus-ring: var(--gog-accent-color);
949
- --gog-card-focus-ring-width: var(--gog-focus-ring-width);
950
- --gog-card-focus-ring-offset: var(--gog-focus-ring-offset);
951
- --gog-card-disabled-opacity: var(--gog-disabled-opacity);
952
-
953
- --gog-card-footer-border-color: var(--gog-border-color);
954
- --gog-card-footer-gap: var(--gog-space-sm);
955
- --gog-card-footer-padding-top: var(--gog-space-sm);
956
-
957
- --gog-card-xsm-padding-y: var(--gog-space-8);
958
- --gog-card-xsm-padding-x: var(--gog-space-10);
959
- --gog-card-xsm-gap: var(--gog-space-6);
960
- --gog-card-sm-padding-y: var(--gog-space-12);
961
- --gog-card-sm-padding-x: var(--gog-space-14);
962
- --gog-card-sm-gap: var(--gog-space-sm);
963
- --gog-card-md-padding-y: var(--gog-space-md);
964
- --gog-card-md-padding-x: var(--gog-space-20);
965
- --gog-card-md-gap: var(--gog-space-12);
966
- --gog-card-lg-padding-y: var(--gog-space-20);
967
- --gog-card-lg-padding-x: var(--gog-space-lg);
968
- --gog-card-lg-gap: var(--gog-space-14);
969
- --gog-card-slg-padding-y: var(--gog-space-28);
970
- --gog-card-slg-padding-x: var(--gog-space-32);
971
- --gog-card-slg-gap: var(--gog-space-md);
972
-
973
- /* ── Checkbox ──────────────────────────────────────────────────────────────
974
- Box/label/icon size and padding come from the `--gog-control-checkbox-*` scale;
975
- checkbox.component.ts maps the `size` input onto the host. */
976
- --gog-checkbox-font-family: var(--gog-font-body);
977
- --gog-checkbox-gap: var(--gog-space-10);
978
- --gog-checkbox-radius: var(--gog-radius);
979
- --gog-checkbox-border-width: var(--gog-control-border-width);
980
- --gog-checkbox-border-style: var(--gog-control-border-style);
981
- --gog-checkbox-border-color: var(--gog-accent-dim);
982
- --gog-checkbox-bg: var(--gog-surface-color);
983
- --gog-checkbox-checked-bg: var(--gog-accent-color);
984
- --gog-checkbox-checked-border: var(--gog-accent-color);
985
- --gog-checkbox-icon-color: var(--gog-accent-text-color, var(--gog-primary-color));
986
- --gog-checkbox-label-color: var(--gog-muted-text-color);
987
- --gog-checkbox-label-line-height: var(--gog-line-height-snug);
988
- --gog-checkbox-focus-ring: var(--gog-accent-pale);
989
- --gog-checkbox-focus-ring-width: var(--gog-focus-ring-width);
990
- --gog-checkbox-focus-ring-offset: var(--gog-focus-ring-offset);
991
- --gog-checkbox-disabled-opacity: var(--gog-disabled-opacity);
992
- --gog-checkbox-transition-duration: var(--gog-duration-base);
993
- --gog-checkbox-dash-width-ratio: 0.45;
994
- --gog-checkbox-dash-height: 2px;
995
- --gog-checkbox-dash-radius: 999px;
996
-
997
- /* ── Radio group ───────────────────────────────────────────────────────────
998
- Box/label size reuse the `--gog-control-checkbox-*` scale (see Checkbox above);
999
- radio-group.component.ts maps the `size` input onto the host the same way. */
1000
- --gog-radio-font-family: var(--gog-font-body);
1001
- --gog-radio-group-gap: var(--gog-space-10);
1002
- --gog-radio-group-label-size: var(--gog-text-sm);
1003
- --gog-radio-group-label-color: var(--gog-muted-text-color);
1004
- --gog-radio-group-option-gap: var(--gog-space-8);
1005
- --gog-radio-group-option-gap-horizontal: var(--gog-space-20);
1006
- --gog-radio-gap: var(--gog-space-10);
1007
- --gog-radio-border-width: var(--gog-control-border-width);
1008
- --gog-radio-border-style: var(--gog-control-border-style);
1009
- --gog-radio-border-color: var(--gog-accent-dim);
1010
- --gog-radio-bg: var(--gog-surface-color);
1011
- --gog-radio-checked-bg: var(--gog-surface-color);
1012
- --gog-radio-checked-border: var(--gog-accent-color);
1013
- --gog-radio-dot-color: var(--gog-accent-color);
1014
- --gog-radio-dot-size-ratio: 0.45;
1015
- --gog-radio-label-color: var(--gog-muted-text-color);
1016
- --gog-radio-label-line-height: var(--gog-line-height-snug);
1017
- --gog-radio-focus-ring: var(--gog-accent-pale);
1018
- --gog-radio-focus-ring-width: var(--gog-focus-ring-width);
1019
- --gog-radio-focus-ring-offset: var(--gog-focus-ring-offset);
1020
- --gog-radio-disabled-opacity: var(--gog-disabled-opacity);
1021
- --gog-radio-transition-duration: var(--gog-duration-base);
1022
- --gog-radio-error-font-size: var(--gog-text-xs);
1023
- --gog-radio-error-color: var(--gog-danger-color);
1024
-
1025
- /* ── Chip ──────────────────────────────────────────────────────────────────
1026
- `--gog-chip-*` size tokens below are the per-size scale; the unsuffixed
1027
- `--gog-chip-font-size`/`-padding-*`/`-gap`/`-avatar-size`/`-icon-size`/
1028
- `-remove-size` are left undeclared as the per-instance escape hatch. */
1029
- --gog-chip-font-family: inherit;
1030
- --gog-chip-bg: var(--gog-surface-color);
1031
- --gog-chip-hover-bg: var(--gog-hover-color);
1032
- --gog-chip-press-bg: var(--gog-border-color);
1033
- --gog-chip-border: var(--gog-border-color);
1034
- --gog-chip-border-width: var(--gog-border-width);
1035
- --gog-chip-border-style: var(--gog-border-style);
1036
- --gog-chip-color: var(--gog-text-color);
1037
- --gog-chip-font-weight: var(--gog-font-weight-medium);
1038
- --gog-chip-line-height: var(--gog-line-height-tight);
1039
- --gog-chip-radius: max(var(--gog-radius), 2px);
1040
- --gog-chip-pill-radius: 9999px;
1041
- --gog-chip-remove-color: var(--gog-muted-text-color);
1042
- --gog-chip-remove-hover-color: var(--gog-text-color);
1043
- --gog-chip-remove-scale: 1.1;
1044
- --gog-chip-avatar-inset-ratio: 0.9;
1045
- --gog-chip-remove-inset-ratio: 0.85;
1046
- --gog-chip-disabled-opacity: var(--gog-disabled-opacity);
1047
- /* A selected filter chip (`[(selected)]`, 21.9.0). An inset ring for the reason
1048
- `--gog-button-primary-toggled-shadow` gives: hover and press own the background, and a
1049
- selected chip has to stay selected while it is also hovered or held. The accent, so it is
1050
- the same pair the focus ring is already gated on — and unlike the button there is only one
1051
- chip variant, so one token covers it. Override this token on the host to restyle a single
1052
- chip. */
1053
- --gog-chip-selected-ring-width: 2px;
1054
- --gog-chip-selected-shadow: inset 0 0 0 var(--gog-chip-selected-ring-width)
1055
- var(--gog-accent-color);
1056
- --gog-chip-focus-ring-width: 2px;
1057
- --gog-chip-focus-ring-offset: var(--gog-focus-ring-offset);
1058
-
1059
- --gog-chip-xsm-font-size: 0.6875rem;
1060
- --gog-chip-xsm-padding-block: var(--gog-space-4);
1061
- --gog-chip-xsm-padding-inline: var(--gog-space-6);
1062
- --gog-chip-xsm-gap: var(--gog-space-4);
1063
- --gog-chip-xsm-avatar-size: 0.875rem;
1064
- --gog-chip-xsm-icon-size: 0.6875rem;
1065
- --gog-chip-xsm-remove-size: 0.75rem;
1066
-
1067
- --gog-chip-sm-font-size: var(--gog-text-xs);
1068
- --gog-chip-sm-padding-block: var(--gog-space-4);
1069
- --gog-chip-sm-padding-inline: var(--gog-space-8);
1070
- --gog-chip-sm-gap: var(--gog-space-6);
1071
- --gog-chip-sm-avatar-size: 1rem;
1072
- --gog-chip-sm-icon-size: 0.75rem;
1073
- --gog-chip-sm-remove-size: 0.875rem;
1074
-
1075
- --gog-chip-md-font-size: var(--gog-text-sm);
1076
- --gog-chip-md-padding-block: var(--gog-space-8);
1077
- --gog-chip-md-padding-inline: var(--gog-space-12);
1078
- --gog-chip-md-gap: var(--gog-space-8);
1079
- --gog-chip-md-avatar-size: 1.25rem;
1080
- --gog-chip-md-icon-size: 0.875rem;
1081
- --gog-chip-md-remove-size: 1rem;
1082
-
1083
- --gog-chip-lg-font-size: var(--gog-text-md);
1084
- --gog-chip-lg-padding-block: var(--gog-space-10);
1085
- --gog-chip-lg-padding-inline: var(--gog-space-14);
1086
- --gog-chip-lg-gap: var(--gog-space-10);
1087
- --gog-chip-lg-avatar-size: 1.5rem;
1088
- --gog-chip-lg-icon-size: 1rem;
1089
- --gog-chip-lg-remove-size: 1.125rem;
1090
-
1091
- --gog-chip-slg-font-size: var(--gog-text-lg);
1092
- --gog-chip-slg-padding-block: var(--gog-space-12);
1093
- --gog-chip-slg-padding-inline: var(--gog-space-16);
1094
- --gog-chip-slg-gap: var(--gog-space-12);
1095
- --gog-chip-slg-avatar-size: 1.75rem;
1096
- --gog-chip-slg-icon-size: 1.125rem;
1097
- --gog-chip-slg-remove-size: 1.25rem;
1098
-
1099
- /* ── Dialog ────────────────────────────────────────────────────────────────── */
1100
- --gog-dialog-font-family: var(--gog-font-heading);
1101
- /* Deliberately a flat value rather than a palette derivation: the scrim has to read
1102
- the same over any page content. Restate it per theme if a lighter wash suits. */
1103
- --gog-dialog-backdrop-bg: rgba(10, 8, 3, 0.72);
1104
- --gog-dialog-backdrop-blur: 2px;
1105
- --gog-dialog-backdrop-padding: var(--gog-space-lg);
1106
- --gog-dialog-backdrop-fade-duration: var(--gog-duration-base);
1107
- --gog-dialog-enter-duration: var(--gog-duration-slow);
1108
- --gog-dialog-enter-distance: -12px;
1109
- --gog-dialog-bg: var(--gog-surface-color);
1110
- --gog-dialog-color: var(--gog-text-color);
1111
- --gog-dialog-border: var(--gog-border-color);
1112
- --gog-dialog-border-width: var(--gog-panel-border-width);
1113
- --gog-dialog-border-style: var(--gog-panel-border-style);
1114
- --gog-dialog-radius: var(--gog-radius);
1115
- --gog-dialog-shadow: 0 24px 48px rgba(0, 0, 0, 0.5);
1116
- --gog-dialog-min-width: 320px;
1117
- --gog-dialog-max-height: 90vh;
1118
- --gog-dialog-header-padding: var(--gog-space-16) var(--gog-space-20) var(--gog-space-14);
1119
- --gog-dialog-header-gap: var(--gog-space-12);
1120
- --gog-dialog-header-border-color: var(--gog-border-color);
1121
- --gog-dialog-body-padding: var(--gog-space-20);
1122
- --gog-dialog-body-max-height: calc(var(--gog-dialog-max-height) - 60px);
1123
- --gog-dialog-close-size: 2rem;
1124
- --gog-dialog-close-font-size: var(--gog-text-sm);
1125
- --gog-dialog-close-color: var(--gog-muted-text-color);
1126
- --gog-dialog-close-hover-color: var(--gog-text-color);
1127
- --gog-dialog-close-hover-bg: var(--gog-hover-color);
1128
- --gog-dialog-close-hover-border: var(--gog-border-color);
1129
- --gog-dialog-close-focus-ring: var(--gog-accent-color);
1130
- --gog-dialog-close-focus-ring-width: var(--gog-focus-ring-width);
1131
- --gog-dialog-close-focus-ring-offset: var(--gog-focus-ring-offset);
1132
-
1133
- /* Confirmation dialog */
1134
- --gog-confirmation-dialog-gap: var(--gog-space-12);
1135
- --gog-confirmation-dialog-min-width: 320px;
1136
- --gog-confirmation-dialog-max-width: 440px;
1137
- --gog-confirmation-dialog-color: var(--gog-text-color);
1138
- --gog-confirmation-dialog-description-color: var(--gog-muted-text-color);
1139
- --gog-confirmation-dialog-actions-gap: var(--gog-space-sm);
1140
- --gog-confirmation-dialog-actions-offset: var(--gog-space-sm);
1141
-
1142
- /* ── Autocomplete ──────────────────────────────────────────────────────────
1143
- A combobox whose trigger is a real text input. Padding/font-size reuse the shared
1144
- `--gog-field-<size>-*` scale, so it lines up with `gog-inputfield` and `gog-select` in a
1145
- form. `--gog-autocomplete-bg`, `-color`, `-font-size`, `-padding-x` and `-padding-y` are
1146
- intentionally NOT declared — they are the per-instance escape hatch the size classes fall
1147
- back through. */
1148
- --gog-autocomplete-font-family: var(--gog-font-body);
1149
- --gog-autocomplete-label-font-family: var(--gog-font-heading);
1150
- --gog-autocomplete-gap: var(--gog-space-4);
1151
- --gog-autocomplete-label-color: var(--gog-accent-color);
1152
- --gog-autocomplete-label-font-size: var(--gog-text-sm);
1153
- --gog-autocomplete-label-font-weight: var(--gog-font-weight-semibold);
1154
- --gog-autocomplete-label-letter-spacing: var(--gog-letter-spacing);
1155
- --gog-autocomplete-label-text-transform: var(--gog-text-transform);
1156
- --gog-autocomplete-field-bg: var(--gog-surface-color);
1157
- --gog-autocomplete-text-color: var(--gog-text-color);
1158
- --gog-autocomplete-placeholder-color: var(--gog-muted-text-color);
1159
- --gog-autocomplete-border-width: var(--gog-control-border-width);
1160
- --gog-autocomplete-border-style: var(--gog-control-border-style);
1161
- --gog-autocomplete-border-color: var(--gog-accent-dim);
1162
- --gog-autocomplete-hover-border-color: var(--gog-accent-color);
1163
- --gog-autocomplete-radius: var(--gog-radius);
1164
- --gog-autocomplete-line-height: var(--gog-line-height-normal);
1165
- --gog-autocomplete-transition-duration: var(--gog-duration-base);
1166
- --gog-autocomplete-disabled-opacity: var(--gog-disabled-opacity);
1167
- --gog-autocomplete-focus-ring-width: var(--gog-focus-ring-width);
1168
- --gog-autocomplete-focus-ring-offset: var(--gog-focus-ring-offset);
1169
- --gog-autocomplete-focus-ring-color: var(--gog-accent-color);
1170
- --gog-autocomplete-error-color: var(--gog-danger-color);
1171
- --gog-autocomplete-error-border-color: var(--gog-danger-color);
1172
- --gog-autocomplete-error-font-family: var(--gog-font-body);
1173
- --gog-autocomplete-error-font-size: var(--gog-text-xs);
1174
- /* Floor for an auto-width field, so [fullWidth]="false" cannot collapse it to its chrome. */
1175
- --gog-autocomplete-min-width: 120px;
1176
- /* Trailing chrome: spinner and clear button, clear outermost — the arrangement the other
1177
- dropdowns settled on, so all of them line up in a form. */
1178
- --gog-autocomplete-actions-inset: var(--gog-control-icon-offset);
1179
- --gog-autocomplete-actions-gap: var(--gog-space-6);
1180
- /* Right padding on the input, reserving room for the actions above. */
1181
- --gog-autocomplete-actions-reserve: 40px;
1182
- --gog-autocomplete-clear-color: var(--gog-autocomplete-placeholder-color);
1183
- --gog-autocomplete-clear-hover-color: var(--gog-autocomplete-label-color);
1184
- --gog-autocomplete-clear-icon-ratio: var(--gog-control-clear-icon-ratio);
1185
- --gog-autocomplete-spinner-size: 0.875rem;
1186
- /* Panel */
1187
- --gog-autocomplete-panel-bg: var(--gog-surface-color);
1188
- --gog-autocomplete-panel-shadow: var(--gog-panel-shadow);
1189
- --gog-autocomplete-panel-border-width: var(--gog-panel-border-width);
1190
- --gog-autocomplete-panel-border-style: var(--gog-panel-border-style);
1191
- --gog-autocomplete-panel-border-color: var(--gog-border-color);
1192
- --gog-autocomplete-panel-radius: var(--gog-radius);
1193
- --gog-autocomplete-panel-gap: var(--gog-space-2);
1194
- --gog-autocomplete-panel-max-height: 260px;
1195
- /* Ceiling for a content-sized panel, so one very long option cannot span the viewport. */
1196
- --gog-autocomplete-panel-max-width: 420px;
1197
- --gog-autocomplete-options-padding: var(--gog-space-4);
1198
- --gog-autocomplete-option-padding: var(--gog-space-8) var(--gog-space-10);
1199
- --gog-autocomplete-option-radius: calc(var(--gog-radius) - 4px);
1200
- --gog-autocomplete-option-gap: var(--gog-space-10);
1201
- --gog-autocomplete-option-color: var(--gog-text-color);
1202
- --gog-autocomplete-option-hover-bg: var(--gog-hover-color);
1203
- --gog-autocomplete-option-press-bg: var(--gog-border-color);
1204
- --gog-autocomplete-option-hover-color: var(--gog-text-color);
1205
- --gog-autocomplete-option-selected-bg: var(--gog-accent-pale);
1206
- /* Body text, not the accent. The selected row is the one option that carries a tint *and* a
1207
- coloured label, and the accent on that tint measured 4.12:1 in light — `--gog-accent-dim` is
1208
- worse again (3.77:1 in one-dark). `gog-select` gets away with an accent label because its
1209
- selected option has no tint behind it. The tint stays as the marker, alongside
1210
- `aria-selected`. */
1211
- --gog-autocomplete-option-selected-color: var(--gog-text-color);
1212
- /* Estimated row height fed into the panel's up/down placement math; not itself a real
1213
- layout property, so it has no effect unless the JS reads it. */
1214
- --gog-autocomplete-option-height: 36px;
1215
- --gog-autocomplete-empty-color: var(--gog-autocomplete-placeholder-color);
1216
- --gog-autocomplete-empty-font-size: var(--gog-text-sm);
1217
- --gog-autocomplete-float-label-reserve: var(--gog-field-float-label-reserve);
1218
- --gog-autocomplete-float-label-in-top: var(--gog-field-float-label-in-top);
1219
- --gog-autocomplete-float-label-over-gap: var(--gog-field-float-label-over-gap);
1220
- --gog-autocomplete-float-label-over-reserve: var(--gog-field-float-label-over-reserve);
1221
-
1222
- /* ── Badge (the `gogBadge` directive; its classes live in utilities.css) ───── */
1223
- --gog-badge-font-family: var(--gog-font-body);
1224
- --gog-badge-font-size: var(--gog-text-xs);
1225
- --gog-badge-font-weight: var(--gog-font-weight-semibold);
1226
- --gog-badge-line-height: var(--gog-line-height-none);
1227
- /* Min-width *and* height: a one-digit badge stays a circle, a three-digit one grows
1228
- sideways only. */
1229
- --gog-badge-size: 1.25rem;
1230
- --gog-badge-dot-size: 0.5rem;
1231
- --gog-badge-padding-inline: var(--gog-space-4);
1232
- --gog-badge-radius: 999px;
1233
- /* How far the badge hangs outside its host's corner. */
1234
- --gog-badge-offset: var(--gog-space-6);
1235
- --gog-badge-border-width: 0;
1236
- --gog-badge-border-style: var(--gog-border-style);
1237
- --gog-badge-border-color: transparent;
1238
- /* Above the host's own chrome but below any overlay panel (--gog-dropdown-z is 300). */
1239
- /* Each label is its status's own "text on this fill" token, which flips with the theme — a red
1240
- badge reads white on light and near-black on dark. It read `--gog-accent-text-color` for all
1241
- four until 21.9.0, on the assumption that one label works on every fill; four themes proved
1242
- otherwise, `material`'s amber under white at 1.97:1 the worst of them. See the
1243
- `--gog-<status>-text-color` block near the top of this file. */
1244
- --gog-badge-success-bg: var(--gog-success-color);
1245
- --gog-badge-success-color: var(--gog-success-text-color);
1246
- --gog-badge-danger-bg: var(--gog-danger-color);
1247
- --gog-badge-danger-color: var(--gog-danger-text-color);
1248
- --gog-badge-warning-bg: var(--gog-warning-color);
1249
- --gog-badge-warning-color: var(--gog-warning-text-color);
1250
- --gog-badge-info-bg: var(--gog-info-color);
1251
- --gog-badge-info-color: var(--gog-info-text-color);
1252
-
1253
- /* ── Datepicker (the field; the grid inside it is themed by --gog-calendar-*) ───
1254
- `--gog-datepicker-bg`, `-color`, `-font-size`, `-padding-x` and `-padding-y` are
1255
- intentionally NOT declared — they are the per-instance escape hatch the size classes fall
1256
- back through. */
1257
- --gog-datepicker-font-family: var(--gog-font-body);
1258
- --gog-datepicker-label-font-family: var(--gog-font-heading);
1259
- --gog-datepicker-gap: var(--gog-space-4);
1260
- --gog-datepicker-label-color: var(--gog-accent-color);
1261
- --gog-datepicker-label-font-size: var(--gog-text-sm);
1262
- --gog-datepicker-label-letter-spacing: var(--gog-letter-spacing);
1263
- --gog-datepicker-label-text-transform: var(--gog-text-transform);
1264
- --gog-datepicker-field-bg: var(--gog-surface-color);
1265
- --gog-datepicker-text-color: var(--gog-text-color);
1266
- --gog-datepicker-placeholder-color: var(--gog-muted-text-color);
1267
- --gog-datepicker-border-width: var(--gog-control-border-width);
1268
- --gog-datepicker-border-style: var(--gog-control-border-style);
1269
- --gog-datepicker-border-color: var(--gog-accent-dim);
1270
- --gog-datepicker-hover-border-color: var(--gog-accent-color);
1271
- --gog-datepicker-radius: var(--gog-radius);
1272
- --gog-datepicker-line-height: var(--gog-line-height-normal);
1273
- --gog-datepicker-transition-duration: var(--gog-duration-base);
1274
- --gog-datepicker-disabled-opacity: var(--gog-disabled-opacity);
1275
- --gog-datepicker-focus-ring-width: var(--gog-focus-ring-width);
1276
- --gog-datepicker-focus-ring-offset: var(--gog-focus-ring-offset);
1277
- --gog-datepicker-focus-ring-color: var(--gog-accent-color);
1278
- --gog-datepicker-error-color: var(--gog-danger-color);
1279
- --gog-datepicker-error-border-color: var(--gog-danger-color);
1280
- --gog-datepicker-error-font-family: var(--gog-font-body);
1281
- --gog-datepicker-error-font-size: var(--gog-text-xs);
1282
- --gog-datepicker-min-width: 150px;
1283
- --gog-datepicker-actions-inset: var(--gog-control-icon-offset);
1284
- --gog-datepicker-actions-gap: var(--gog-space-6);
1285
- /* Right padding on the input, reserving room for the calendar and clear buttons. */
1286
- --gog-datepicker-actions-reserve: 40px;
1287
- --gog-datepicker-icon-color: var(--gog-accent-color);
1288
- --gog-datepicker-icon-hover-color: var(--gog-accent-bright);
1289
- --gog-datepicker-toggle-icon-size: 1rem;
1290
- --gog-datepicker-clear-color: var(--gog-datepicker-placeholder-color);
1291
- --gog-datepicker-clear-icon-ratio: var(--gog-control-clear-icon-ratio);
1292
- --gog-datepicker-panel-bg: var(--gog-surface-color);
1293
- --gog-datepicker-panel-shadow: var(--gog-panel-shadow);
1294
- --gog-datepicker-panel-border-width: var(--gog-panel-border-width);
1295
- --gog-datepicker-panel-border-style: var(--gog-panel-border-style);
1296
- --gog-datepicker-panel-border-color: var(--gog-border-color);
1297
- --gog-datepicker-panel-radius: var(--gog-radius);
1298
- --gog-datepicker-panel-gap: var(--gog-space-2);
1299
- /* The dropdown surface. Inline mode is `gog-calendar` itself, so it sizes from
1300
- `--gog-calendar-max-width` rather than from this. */
1301
- --gog-datepicker-panel-width: max-content;
1302
- --gog-datepicker-float-label-reserve: var(--gog-field-float-label-reserve);
1303
- --gog-datepicker-float-label-in-top: var(--gog-field-float-label-in-top);
1304
- --gog-datepicker-float-label-over-gap: var(--gog-field-float-label-over-gap);
1305
- --gog-datepicker-float-label-over-reserve: var(--gog-field-float-label-over-reserve);
1306
-
1307
- /* ── Divider ───────────────────────────────────────────────────────────────── */
1308
- --gog-divider-line-color: var(--gog-border-color);
1309
- --gog-divider-line-thickness: 1px;
1310
- /* The variant classes map onto these, so a theme can decide what "dashed" looks like
1311
- rather than the value being frozen into the component's stylesheet. */
1312
- --gog-divider-solid-style: solid;
1313
- --gog-divider-dashed-style: dashed;
1314
- --gog-divider-dotted-style: dotted;
1315
- --gog-divider-block-spacing: var(--gog-space-md);
1316
- --gog-divider-inline-spacing: var(--gog-space-md);
1317
- --gog-divider-inset-size: var(--gog-space-lg);
1318
- /* Floor for a vertical divider with nothing to stretch to — e.g. between two inline
1319
- buttons. In a flex/grid row it stretches to the row instead. */
1320
- --gog-divider-vertical-length: 1.5em;
1321
- --gog-divider-label-gap: var(--gog-space-sm);
1322
- --gog-divider-label-color: var(--gog-muted-text-color);
1323
- --gog-divider-label-font-family: var(--gog-font-body);
1324
- --gog-divider-label-font-size: var(--gog-text-sm);
1325
- --gog-divider-label-font-weight: var(--gog-font-weight-medium);
1326
- --gog-divider-label-line-height: var(--gog-line-height-normal);
1327
-
1328
- /* ── Icon ──────────────────────────────────────────────────────────────────── */
1329
- --gog-icon-fallback-size: 1em;
1330
-
1331
- /* ── Input field ───────────────────────────────────────────────────────────── */
1332
- --gog-input-font-family: var(--gog-font-body);
1333
- --gog-input-label-font-family: var(--gog-font-heading);
1334
- --gog-input-gap: var(--gog-space-4);
1335
- --gog-input-label-color: var(--gog-accent-color);
1336
- --gog-input-label-font-size: var(--gog-text-sm);
1337
- --gog-input-label-letter-spacing: var(--gog-letter-spacing);
1338
- --gog-input-label-text-transform: var(--gog-text-transform);
1339
- --gog-input-field-bg: var(--gog-surface-color);
1340
- --gog-input-field-border: var(--gog-accent-dim);
1341
- --gog-input-field-border-width: var(--gog-control-border-width);
1342
- --gog-input-field-border-style: var(--gog-control-border-style);
1343
- --gog-input-radius: var(--gog-radius);
1344
- --gog-input-field-color: var(--gog-text-color);
1345
- --gog-input-placeholder-color: var(--gog-muted-text-color);
1346
- --gog-input-focus-border: var(--gog-accent-color);
1347
- --gog-input-focus-ring: var(--gog-accent-pale);
1348
- --gog-input-focus-glow: 0 0 8px var(--gog-input-focus-ring);
1349
- --gog-input-focus-ring-width: var(--gog-focus-ring-width);
1350
- --gog-input-focus-ring-offset: var(--gog-focus-ring-offset);
1351
- --gog-input-error-color: var(--gog-danger-color);
1352
- --gog-input-error-font-size: var(--gog-text-xs);
1353
- /* Extra space above the error line, *on top of* the host's own `--gog-input-gap`, which
1354
- already separates every child of the field. It shipped as `2px` and put this field's error
1355
- 6px under it while `gog-select`, `gog-autocomplete` and `gog-datepicker` — same gap, no
1356
- offset — sat at 4px; in one form the six did not line up. Zero by default since 21.9.0, so
1357
- one mechanism spaces the error line everywhere. Set it if you want this field's error
1358
- pushed further than the rest. */
1359
- --gog-input-error-offset: 0px;
1360
- --gog-input-icon-color: var(--gog-muted-text-color);
1361
- --gog-input-icon-hover-color: var(--gog-accent-color);
1362
- --gog-input-icon-action-radius: calc(var(--gog-radius) - 4px);
1363
- --gog-input-icon-focus-ring-width: 2px;
1364
- /* Number field's spin buttons — a subtle fill on hover, since they sit flush against the
1365
- field's own border rather than floating with their own padding like the other icons. */
1366
- --gog-input-spin-hover-bg: var(--gog-hover-color);
1367
- --gog-input-disabled-opacity: var(--gog-disabled-opacity);
1368
- --gog-input-transition-duration: var(--gog-duration-base);
1369
- /* Float label — also used by gog-textarea, which shares the --gog-input-* block. */
1370
- /* Clear button — only rendered once the field has text, see `clearable`.
1371
-
1372
- A quarter of the corner radius rather than a flat `2px`, which is what this was until
1373
- 21.9.0: at the default `--gog-radius: 8px` it computes to the same 2px, so nothing moves in
1374
- any shipped theme, but a theme that rounds its corners now rounds this button too. The
1375
- literal was invisible to `check-tokens` rule G by design — that rule flags a literal only
1376
- when its value *equals* a character token's current one, so a pill's `999px` is correctly
1377
- left alone and a small arbitrary number like this one is correctly not detectable. The two
1378
- sibling controls below carry the same fix.
1379
-
1380
- `gog-toast` and `gog-accordion` keep their flat `0px` on purpose: those are a chosen shape,
1381
- not a number that forgot where it came from. */
1382
- --gog-input-clear-radius: calc(var(--gog-radius) / 4);
1383
- --gog-input-clear-icon-ratio: var(--gog-control-clear-icon-ratio);
1384
- /*
1385
- The textarea's clear button gets a full-size glyph. The 0.7 ratio above suits the dense
1386
- single-line trigger of a dropdown; on a large multi-line box it reads as a speck.
1387
- */
1388
- --gog-textarea-clear-icon-ratio: 1;
1389
- /* Custom resize grip — see the `::-webkit-resizer` comment in textarea.component.scss for
1390
- why this replaces rather than restyles the native glyph. Colour follows the field's own
1391
- border by default, not a fixed muted grey, so it reads as part of the field rather than a
1392
- mismatched accent. */
1393
- --gog-textarea-resize-grip-size: 11px;
1394
- --gog-textarea-resize-grip-color: var(--gog-input-field-border);
1395
- --gog-textarea-resize-grip-opacity: 0.8;
1396
- --gog-textarea-resize-grip-stripe-width: 1.5px;
1397
- --gog-textarea-resize-grip-stripe-gap: var(--gog-space-2);
1398
- --gog-textarea-resize-grip-offset: 3px;
1399
- /*
1400
- Both default to 0 and are overwritten per instance, as an inline style on the field, from
1401
- the component's own ResizeObserver — they close the gap that opens once the field has been
1402
- dragged narrower/shorter than its container. Declared here rather than left to a `var()`
1403
- fallback so the grip's resting geometry is discoverable in this file like everything else;
1404
- an inline style outranks this declaration, so the per-instance override still wins.
1405
- */
1406
- --gog-textarea-resize-inset-right: 0px;
1407
- --gog-textarea-resize-inset-bottom: 0px;
1408
- --gog-input-clear-inset: var(--gog-space-8);
1409
- /*
1410
- Width of one stepper button, and so of the whole stepper column. Scales with the field's
1411
- own font size rather than being a fixed px value, so it stays proportional across the five
1412
- sizes. Read in two places — the buttons themselves, and the offset that moves the clear
1413
- button clear of them on a clearable number field — which is why it is a token rather than
1414
- the same `calc()` written twice.
1415
- */
1416
- --gog-input-spin-width: calc(
1417
- var(--gog-input-size-font-size, var(--gog-field-md-font-size)) * 1.35
1418
- );
1419
- --gog-input-float-label-reserve: var(--gog-field-float-label-reserve);
1420
- --gog-input-float-label-in-top: var(--gog-field-float-label-in-top);
1421
- --gog-input-float-label-over-gap: var(--gog-field-float-label-over-gap);
1422
- --gog-input-float-label-over-reserve: var(--gog-field-float-label-over-reserve);
1423
-
1424
- /* ── Multiselect ───────────────────────────────────────────────────────────── */
1425
- --gog-multiselect-font-family: var(--gog-font-body);
1426
- --gog-multiselect-label-font-family: var(--gog-font-heading);
1427
- --gog-multiselect-gap: var(--gog-space-4);
1428
- --gog-multiselect-option-gap: var(--gog-space-4);
1429
- --gog-multiselect-options-padding: var(--gog-space-4);
1430
- --gog-multiselect-label-color: var(--gog-accent-color);
1431
- --gog-multiselect-label-font-size: var(--gog-text-sm);
1432
- --gog-multiselect-label-letter-spacing: var(--gog-letter-spacing);
1433
- --gog-multiselect-label-text-transform: var(--gog-text-transform);
1434
- --gog-multiselect-field-bg: var(--gog-surface-color);
1435
- --gog-multiselect-field-border: var(--gog-accent-dim);
1436
- --gog-multiselect-field-border-width: var(--gog-control-border-width);
1437
- --gog-multiselect-field-border-style: var(--gog-control-border-style);
1438
- --gog-multiselect-radius: var(--gog-radius);
1439
- --gog-multiselect-field-color: var(--gog-text-color);
1440
- --gog-multiselect-value-color: var(--gog-text-color);
1441
- --gog-multiselect-placeholder-color: var(--gog-muted-text-color);
1442
- --gog-multiselect-focus-border: var(--gog-accent-color);
1443
- --gog-multiselect-focus-ring: var(--gog-accent-pale);
1444
- --gog-multiselect-focus-glow: 0 0 8px var(--gog-multiselect-focus-ring);
1445
- --gog-multiselect-focus-ring-width: var(--gog-focus-ring-width);
1446
- --gog-multiselect-focus-ring-offset: var(--gog-focus-ring-offset);
1447
- --gog-multiselect-error-color: var(--gog-danger-color);
1448
- --gog-multiselect-error-font-size: var(--gog-text-xs);
1449
- /* Zero by default since 21.9.0 — see `--gog-input-error-offset` for why. */
1450
- --gog-multiselect-error-offset: 0px;
1451
- --gog-multiselect-border-color: var(--gog-accent-color);
1452
- --gog-multiselect-panel-bg: var(--gog-surface-color);
1453
- --gog-multiselect-panel-border: var(--gog-accent-color);
1454
- --gog-multiselect-panel-shadow: var(--gog-panel-shadow);
1455
- --gog-multiselect-panel-max-height: 260px;
1456
- --gog-multiselect-panel-offset: var(--gog-space-2);
1457
- --gog-multiselect-option-hover-bg: var(--gog-hover-color);
1458
- --gog-multiselect-option-press-bg: var(--gog-border-color);
1459
- --gog-multiselect-option-color: var(--gog-text-color);
1460
- --gog-multiselect-option-gap-inline: var(--gog-space-10);
1461
- /* Estimated row height fed into the panel's up/down placement math; not itself a real
1462
- layout property, so it has no effect unless the JS reads it. */
1463
- --gog-multiselect-option-height: 40px;
1464
- --gog-multiselect-option-radius: calc(var(--gog-radius) - 2px);
1465
- --gog-multiselect-option-disabled-opacity: var(--gog-disabled-opacity);
1466
- --gog-multiselect-option-transition-duration: var(--gog-duration-fast);
1467
- --gog-multiselect-checkbox-border: var(--gog-accent-dim);
1468
- --gog-multiselect-checkbox-bg: var(--gog-background-color);
1469
- --gog-multiselect-checkbox-checked-bg: var(--gog-accent-color);
1470
- --gog-multiselect-checkbox-checked-color: var(--gog-primary-color);
1471
- --gog-multiselect-controls-gap: var(--gog-space-4);
1472
- --gog-multiselect-controls-padding: var(--gog-space-6) var(--gog-space-10);
1473
- --gog-multiselect-actions-gap: var(--gog-space-6);
1474
- --gog-multiselect-filter-padding: var(--gog-space-6);
1475
- --gog-multiselect-filter-input-padding-y: var(--gog-space-6);
1476
- --gog-multiselect-filter-input-padding-x: var(--gog-space-8);
1477
- --gog-multiselect-filter-input-bg: var(--gog-background-color);
1478
- --gog-multiselect-filter-input-color: var(--gog-multiselect-field-color);
1479
- --gog-multiselect-filter-input-border: var(--gog-multiselect-field-border);
1480
- --gog-multiselect-filter-input-radius: var(--gog-radius);
1481
- --gog-multiselect-filter-border-width: var(--gog-panel-border-width);
1482
- --gog-multiselect-filter-border-style: var(--gog-panel-border-style);
1483
- --gog-multiselect-filter-border-color: var(--gog-border-color);
1484
- --gog-multiselect-filter-empty-padding: var(--gog-space-10);
1485
- --gog-multiselect-filter-empty-color: var(--gog-multiselect-placeholder-color);
1486
- /* Matches --gog-select-chevron-inset; see the note there. */
1487
- /* "+N" badge shown when the selection does not fit on one line. */
1488
- --gog-multiselect-overflow-color: var(--gog-multiselect-placeholder-color);
1489
- --gog-multiselect-overflow-font-size: var(--gog-text-sm);
1490
- --gog-multiselect-overflow-gap: var(--gog-space-6);
1491
- --gog-multiselect-min-width: 120px;
1492
- --gog-multiselect-panel-max-width: 420px;
1493
- --gog-multiselect-actions-inset: var(--gog-control-icon-offset);
1494
- /* A quarter of the corner radius — see `--gog-input-clear-radius` for why. */
1495
- --gog-multiselect-clear-radius: calc(var(--gog-radius) / 4);
1496
- --gog-multiselect-disabled-opacity: var(--gog-disabled-opacity);
1497
- --gog-multiselect-transition-duration: var(--gog-duration-base);
1498
- --gog-multiselect-float-label-reserve: var(--gog-field-float-label-reserve);
1499
- --gog-multiselect-float-label-in-top: var(--gog-field-float-label-in-top);
1500
- --gog-multiselect-float-label-over-gap: var(--gog-field-float-label-over-gap);
1501
- --gog-multiselect-float-label-over-reserve: var(--gog-field-float-label-over-reserve);
1502
- --gog-multiselect-arrow-transition-duration: var(--gog-duration-slow);
1503
- /* Icon geometry, expressed as a ratio of the control's font size. */
1504
- --gog-multiselect-clear-icon-ratio: var(--gog-control-clear-icon-ratio);
1505
- --gog-multiselect-arrow-icon-ratio: 0.875;
1506
- --gog-multiselect-mark-size-ratio: 1.2375;
1507
- --gog-multiselect-mark-icon-ratio: 1.125;
1508
-
1509
- /* ── Menu ──────────────────────────────────────────────────────────────────
1510
- The command menu opened by `[gogMenuTrigger]`. Metrics follow the dropdown panel's, so a
1511
- menu and a select opened from the same toolbar read as the same surface. */
1512
- --gog-menu-z: var(--gog-dropdown-z);
1513
- --gog-menu-bg: var(--gog-surface-color);
1514
- --gog-menu-border-color: var(--gog-border-color);
1515
- --gog-menu-border-width: var(--gog-control-border-width);
1516
- --gog-menu-border-style: var(--gog-control-border-style);
1517
- --gog-menu-radius: var(--gog-panel-radius);
1518
- --gog-menu-shadow: var(--gog-dialog-shadow);
1519
- --gog-menu-font-family: var(--gog-font-body);
1520
- --gog-menu-padding: var(--gog-space-4);
1521
- --gog-menu-gap: var(--gog-space-2);
1522
- --gog-menu-offset: var(--gog-space-4);
1523
- --gog-menu-min-width: 180px;
1524
- --gog-menu-max-width: 320px;
1525
- --gog-menu-max-height: 320px;
1526
- --gog-menu-transition-duration: var(--gog-duration-base);
1527
- --gog-menu-focus-ring: var(--gog-accent-color);
1528
- --gog-menu-focus-ring-width: var(--gog-focus-ring-width);
1529
- --gog-menu-item-color: var(--gog-text-color);
1530
- --gog-menu-item-hover-bg: var(--gog-hover-color);
1531
- /* The held state, same idea as the button's: one step past this surface's own hover, as a
1532
- colour rather than a movement, so `prefers-reduced-motion` cannot take it away. The flat
1533
- value here is what a browser without `color-mix()` gets; the tinted one is in the @supports
1534
- block at the end of the file. */
1535
- --gog-menu-item-press-bg: var(--gog-border-color);
1536
- --gog-menu-item-hover-color: var(--gog-text-color);
1537
- --gog-menu-item-font-size: var(--gog-text-sm);
1538
- --gog-menu-item-padding: var(--gog-space-8) var(--gog-space-12);
1539
- --gog-menu-item-radius: var(--gog-radius);
1540
- --gog-menu-item-gap: var(--gog-space-sm);
1541
- --gog-menu-item-disabled-opacity: var(--gog-disabled-opacity);
1542
- --gog-menu-item-disabled-color: var(--gog-muted-text-color);
1543
- --gog-menu-item-line-height: var(--gog-line-height-normal);
1544
- --gog-menu-item-icon-size: 1em;
1545
-
1546
- /* ── Paginator ─────────────────────────────────────────────────────────────── */
1547
- --gog-paginator-gap: var(--gog-space-4);
1548
- --gog-paginator-ellipsis-color: var(--gog-muted-text-color);
1549
- --gog-paginator-ellipsis-font-size: var(--gog-text-sm);
1550
- --gog-paginator-ellipsis-font-family: var(--gog-font-body);
1551
- /* Enough for a three-digit page size plus the chevron, so the row doesn't shift on change. */
1552
- --gog-paginator-page-size-min-width: 5rem;
1553
- --gog-paginator-ellipsis-min-width: 32px;
1554
-
1555
- /* ── Panel ─────────────────────────────────────────────────────────────────
1556
- The `gog-panel` component, which shares its prefix with the foundation surface tier
1557
- above (`--gog-panel-radius`, `--gog-panel-shadow`, `--gog-panel-border-width`,
1558
- `--gog-panel-border-style`) deliberately: a panel is the surface those describe, and a
1559
- theme that sets a house radius for raised surfaces should get it here too.
1560
-
1561
- `--gog-panel-bg`, `--gog-panel-border-color`, `--gog-panel-padding-y`,
1562
- `--gog-panel-padding-x` and `--gog-panel-gap` are intentionally NOT declared — the
1563
- per-instance escape hatch. There is no `--gog-panel-*-shadow` twin of that hatch for the
1564
- elevated variant: it reads `--gog-panel-shadow` from a declaration the component makes on
1565
- its own host, so setting that token on one panel already changes only that panel. */
1566
- --gog-panel-font-family: var(--gog-font-body);
1567
- --gog-panel-color: var(--gog-text-color);
1568
- --gog-panel-transition-duration: var(--gog-duration-base);
1569
-
1570
- --gog-panel-heading-color: var(--gog-text-color);
1571
- --gog-panel-heading-font-family: var(--gog-font-heading);
1572
- --gog-panel-heading-font-size: var(--gog-text-xl);
1573
- --gog-panel-heading-font-weight: var(--gog-font-weight-semibold);
1574
- --gog-panel-heading-line-height: 1.25;
1575
-
1576
- --gog-panel-outlined-bg: var(--gog-surface-color);
1577
- --gog-panel-outlined-border-color: var(--gog-border-color);
1578
- --gog-panel-outlined-shadow: none;
1579
- --gog-panel-elevated-bg: var(--gog-elevated-surface-color);
1580
- --gog-panel-elevated-border-color: transparent;
1581
- --gog-panel-filled-bg: var(--gog-accent-pale);
1582
- --gog-panel-filled-border-color: transparent;
1583
- --gog-panel-filled-shadow: none;
1584
-
1585
- --gog-panel-header-gap: var(--gog-space-sm);
1586
- --gog-panel-toggle-size: 2rem;
1587
- --gog-panel-toggle-radius: var(--gog-radius);
1588
- --gog-panel-toggle-color: var(--gog-muted-text-color);
1589
- --gog-panel-toggle-hover-bg: var(--gog-hover-color);
1590
- --gog-panel-chevron-size: 1rem;
1591
- --gog-panel-focus-ring: var(--gog-accent-color);
1592
- --gog-panel-focus-ring-width: var(--gog-focus-ring-width);
1593
- --gog-panel-focus-ring-offset: var(--gog-focus-ring-offset);
1594
- --gog-panel-disabled-opacity: var(--gog-disabled-opacity);
1595
-
1596
- --gog-panel-footer-border-color: var(--gog-border-color);
1597
- --gog-panel-footer-gap: var(--gog-space-sm);
1598
- --gog-panel-footer-padding-top: var(--gog-space-sm);
1599
-
1600
- --gog-panel-xsm-padding-y: var(--gog-space-10);
1601
- --gog-panel-xsm-padding-x: var(--gog-space-12);
1602
- --gog-panel-xsm-gap: var(--gog-space-sm);
1603
- --gog-panel-sm-padding-y: var(--gog-space-14);
1604
- --gog-panel-sm-padding-x: var(--gog-space-md);
1605
- --gog-panel-sm-gap: var(--gog-space-10);
1606
- --gog-panel-md-padding-y: var(--gog-space-18);
1607
- --gog-panel-md-padding-x: var(--gog-space-20);
1608
- --gog-panel-md-gap: var(--gog-space-12);
1609
- --gog-panel-lg-padding-y: var(--gog-space-lg);
1610
- --gog-panel-lg-padding-x: var(--gog-space-28);
1611
- --gog-panel-lg-gap: var(--gog-space-md);
1612
- --gog-panel-slg-padding-y: var(--gog-space-32);
1613
- --gog-panel-slg-padding-x: var(--gog-space-32);
1614
- --gog-panel-slg-gap: var(--gog-space-20);
1615
-
1616
- /* ── Progressbar ──────────────────────────────────────────────────────────── */
1617
- --gog-progressbar-track-base-bg: var(--gog-border-color);
1618
- --gog-progressbar-radius: 999px;
1619
- --gog-progressbar-transition-duration: var(--gog-duration-slow);
1620
- --gog-progressbar-xsm-height: 2px;
1621
- --gog-progressbar-sm-height: 4px;
1622
- --gog-progressbar-md-height: 6px;
1623
- --gog-progressbar-lg-height: 10px;
1624
- --gog-progressbar-slg-height: 14px;
1625
- --gog-progressbar-value-gap: var(--gog-space-sm);
1626
- --gog-progressbar-value-min-width: 3ch;
1627
- --gog-progressbar-value-color: var(--gog-muted-text-color);
1628
- --gog-progressbar-value-font-family: var(--gog-font-body);
1629
- --gog-progressbar-value-font-size: var(--gog-text-sm);
1630
- --gog-progressbar-indeterminate-duration: 1.6s;
1631
- --gog-progressbar-indeterminate-easing: cubic-bezier(0.65, 0.05, 0.36, 1);
1632
- /* The reduced-motion stand-in for the indeterminate animation. */
1633
- --gog-progressbar-stripe-size: 6px;
1634
- --gog-progressbar-stripe-color: var(--gog-surface-color);
1635
- /* The buffer tier is the same hue at low opacity, so it reads as "ahead of the fill"
1636
- rather than as a second, competing colour. */
1637
- --gog-progressbar-accent-bg: var(--gog-accent-color);
1638
- --gog-progressbar-accent-buffer-bg: var(--gog-accent-pale);
1639
- --gog-progressbar-success-bg: var(--gog-success-color);
1640
- --gog-progressbar-success-buffer-bg: var(--gog-border-color);
1641
- --gog-progressbar-danger-bg: var(--gog-danger-color);
1642
- --gog-progressbar-danger-buffer-bg: var(--gog-border-color);
1643
- --gog-progressbar-warning-bg: var(--gog-warning-color);
1644
- --gog-progressbar-warning-buffer-bg: var(--gog-border-color);
1645
- --gog-progressbar-info-bg: var(--gog-info-color);
1646
- --gog-progressbar-info-buffer-bg: var(--gog-border-color);
1647
-
1648
- /* ── Ripple (the `gogRipple` directive; its classes live in ripple.css) ────
1649
- `currentColor` rather than a fixed colour on purpose: the wash then reads as the host's
1650
- own foreground, so one value works on a filled button and on a ghost one without a
1651
- per-variant tier. The property is inherited, so `--gog-ripple-color` set anywhere above
1652
- the host reaches it — which is the per-instance override, no undeclared tier needed. */
1653
- --gog-ripple-color: currentColor;
1654
- --gog-ripple-opacity: 0.16;
1655
- /* Longer than any other motion in the library, deliberately: a ripple held to the house 0.2s
1656
- is over before the eye has followed it across the surface. Still expressed in the
1657
- foundation scale, so setting the durations to 0s still flattens it theme-wide. */
1658
- --gog-ripple-enter-duration: calc(var(--gog-duration-slow) * 2);
1659
- --gog-ripple-exit-duration: var(--gog-duration-slow);
1660
- --gog-ripple-easing: var(--gog-easing);
1661
-
1662
- /* ── Scroll ────────────────────────────────────────────────────────────────── */
1663
- --gog-scroll-track-bg: transparent;
1664
- --gog-scroll-track-radius: var(--gog-radius);
1665
- --gog-scroll-thumb-bg: var(--gog-accent-dim);
1666
- --gog-scroll-thumb-hover-bg: var(--gog-accent-color);
1667
- --gog-scroll-thumb-active-bg: var(--gog-accent-bright);
1668
- --gog-scroll-thumb-radius: var(--gog-radius);
1669
- --gog-scroll-thumb-inset: 2px;
1670
- --gog-scroll-corner-bg: transparent;
1671
- --gog-scroll-fade-duration: var(--gog-duration-base);
1672
- --gog-scroll-focus-ring: var(--gog-accent-color);
1673
- --gog-scroll-focus-ring-width: var(--gog-focus-ring-width);
1674
- /* Per-size pair for the two-tier `--gog-scroll-track-width`/`-thumb-min-size` chains
1675
- that scroll.component.scss's `.gog-scroll--thin` modifier switches between. `normal`
1676
- is the unmarked default, mirroring --gog-table-lg-*. */
1677
- --gog-scroll-normal-track-width: 10px;
1678
- --gog-scroll-thin-track-width: 6px;
1679
- --gog-scroll-normal-thumb-min-size: 32px;
1680
- --gog-scroll-thin-thumb-min-size: 24px;
1681
- /* Invisible pointer-target padding around the thumb (see .gog-scroll__thumb::before) — the
1682
- `thin` variant gets more of it since its 6px track leaves the least visible thumb to aim
1683
- at; both land the effective hit width in the ~22-24px range generally recommended for a
1684
- comfortable pointer target. */
1685
- --gog-scroll-normal-thumb-hit-padding: var(--gog-space-6);
1686
- --gog-scroll-thin-thumb-hit-padding: var(--gog-space-8);
1687
-
1688
- /* ── Select ────────────────────────────────────────────────────────────────── */
1689
- --gog-select-font-family: var(--gog-font-body);
1690
- --gog-select-label-font-family: var(--gog-font-heading);
1691
- --gog-select-gap: var(--gog-space-4);
1692
- --gog-select-label-color: var(--gog-accent-color);
1693
- --gog-select-label-font-size: var(--gog-text-sm);
1694
- --gog-select-label-letter-spacing: var(--gog-letter-spacing);
1695
- --gog-select-label-text-transform: var(--gog-text-transform);
1696
- --gog-select-field-bg: var(--gog-surface-color);
1697
- --gog-select-field-border: var(--gog-accent-dim);
1698
- --gog-select-field-border-width: var(--gog-control-border-width);
1699
- --gog-select-field-border-style: var(--gog-control-border-style);
1700
- --gog-select-radius: var(--gog-radius);
1701
- --gog-select-field-color: var(--gog-text-color);
1702
- --gog-select-placeholder-color: var(--gog-muted-text-color);
1703
- --gog-select-focus-border: var(--gog-accent-color);
1704
- --gog-select-focus-ring: var(--gog-accent-pale);
1705
- --gog-select-focus-glow: 0 0 8px var(--gog-select-focus-ring);
1706
- --gog-select-focus-ring-width: var(--gog-focus-ring-width);
1707
- --gog-select-focus-ring-offset: var(--gog-focus-ring-offset);
1708
- --gog-select-error-color: var(--gog-danger-color);
1709
- --gog-select-error-font-size: var(--gog-text-xs);
1710
- --gog-select-chevron-color: var(--gog-accent-color);
1711
- /*
1712
- Distance from the trigger's right edge to the trailing chrome, matching the leading icon
1713
- inset on gog-inputfield so a select, a multiselect and an input line up in one form. It is
1714
- applied as the trigger's `padding-right`, and the chevron sits inside that padding — so this
1715
- is the gap itself, not the gap plus the chevron. It used to be 40px, which double-counted
1716
- and put the chevron 42px from the edge.
1717
- */
1718
- --gog-select-chevron-inset: var(--gog-control-icon-offset);
1719
- /* Floor for an auto-width trigger, so [fullWidth]="false" cannot collapse it to the chevron. */
1720
- --gog-select-min-width: 120px;
1721
- /* Ceiling for a content-sized panel, so one very long option cannot span the viewport. */
1722
- --gog-select-panel-max-width: 420px;
1723
- /* Filter box — only rendered when `filter` is on. */
1724
- --gog-select-filter-padding: var(--gog-space-6);
1725
- --gog-select-filter-input-padding-y: var(--gog-space-6);
1726
- --gog-select-filter-input-padding-x: var(--gog-space-8);
1727
- --gog-select-filter-input-bg: var(--gog-background-color);
1728
- --gog-select-filter-input-color: var(--gog-select-field-color);
1729
- --gog-select-filter-input-border: var(--gog-select-field-border);
1730
- --gog-select-filter-input-radius: var(--gog-radius);
1731
- --gog-select-filter-border-width: var(--gog-panel-border-width);
1732
- --gog-select-filter-border-style: var(--gog-panel-border-style);
1733
- --gog-select-filter-border-color: var(--gog-select-option-border-color, var(--gog-border-color));
1734
- --gog-select-filter-empty-padding: var(--gog-space-10);
1735
- --gog-select-filter-empty-color: var(--gog-select-placeholder-color);
1736
- /* Clear button only rendered once a value is selected, see `clearable`. */
1737
- /* A quarter of the corner radius — see `--gog-input-clear-radius` for why. */
1738
- --gog-select-clear-radius: calc(var(--gog-radius) / 4);
1739
- --gog-select-clear-icon-ratio: var(--gog-control-clear-icon-ratio);
1740
- --gog-select-clear-gap: var(--gog-space-6);
1741
- --gog-select-clear-color: var(--gog-select-placeholder-color);
1742
- --gog-select-clear-hover-color: var(--gog-select-label-color);
1743
- --gog-select-control-gap: var(--gog-space-12);
1744
- --gog-select-panel-bg: var(--gog-surface-color);
1745
- --gog-select-panel-shadow: var(--gog-panel-shadow);
1746
- --gog-select-panel-max-height: 260px;
1747
- --gog-select-panel-offset: var(--gog-space-2);
1748
- --gog-select-option-hover-bg: var(--gog-hover-color);
1749
- --gog-select-option-press-bg: var(--gog-border-color);
1750
- --gog-select-option-selected-color: var(--gog-accent-color);
1751
- --gog-select-option-color: var(--gog-text-color);
1752
- --gog-select-option-gap: var(--gog-space-10);
1753
- /* Estimated row height fed into the panel's up/down placement math; not itself a real
1754
- layout property, so it has no effect unless the JS reads it. */
1755
- --gog-select-option-height: 40px;
1756
- --gog-select-option-disabled-opacity: var(--gog-disabled-opacity);
1757
- --gog-select-option-transition-duration: var(--gog-duration-fast);
1758
- /* Icon geometry, expressed as a ratio of the control's font size. */
1759
- --gog-select-chevron-icon-ratio: 0.875;
1760
- --gog-select-mark-size-ratio: 1.125;
1761
- --gog-select-mark-icon-ratio: 0.875;
1762
- --gog-select-disabled-opacity: var(--gog-disabled-opacity);
1763
- --gog-select-transition-duration: var(--gog-duration-base);
1764
- --gog-select-float-label-reserve: var(--gog-field-float-label-reserve);
1765
- --gog-select-float-label-in-top: var(--gog-field-float-label-in-top);
1766
- --gog-select-float-label-over-gap: var(--gog-field-float-label-over-gap);
1767
- --gog-select-float-label-over-reserve: var(--gog-field-float-label-over-reserve);
1768
-
1769
- /* ── Skeleton ─────────────────────────────────────────────────────────────── */
1770
- --gog-skeleton-base: var(--gog-hover-color);
1771
- --gog-skeleton-shine: var(--gog-surface-color);
1772
- --gog-skeleton-radius: var(--gog-radius);
1773
- --gog-skeleton-square-radius: 0px;
1774
- --gog-skeleton-line-radius: calc(var(--gog-skeleton-radius) / 2);
1775
- --gog-skeleton-line-gap: var(--gog-space-sm);
1776
- --gog-skeleton-short-line-width: 60%;
1777
- --gog-skeleton-pulse-duration: 1.6s;
1778
- --gog-skeleton-pulse-min-opacity: 0.5;
1779
- --gog-skeleton-wave-duration: 1.6s;
1780
- --gog-skeleton-line-height-xsm: 8px;
1781
- --gog-skeleton-line-height-sm: 10px;
1782
- --gog-skeleton-line-height-md: 14px;
1783
- --gog-skeleton-line-height-lg: 18px;
1784
- --gog-skeleton-line-height-slg: 24px;
1785
- --gog-skeleton-circle-size-xsm: 24px;
1786
- --gog-skeleton-circle-size-sm: 32px;
1787
- --gog-skeleton-circle-size-md: 48px;
1788
- --gog-skeleton-circle-size-lg: 64px;
1789
- --gog-skeleton-circle-size-slg: 96px;
1790
- --gog-skeleton-rect-height-xsm: 40px;
1791
- --gog-skeleton-rect-height-sm: 64px;
1792
- --gog-skeleton-rect-height-md: 120px;
1793
- --gog-skeleton-rect-height-lg: 200px;
1794
- --gog-skeleton-rect-height-slg: 320px;
1795
-
1796
- /* ── Slider ───────────────────────────────────────────────────────────────── */
1797
- --gog-slider-auto-width: 240px;
1798
- /* Length (height) of a vertical slider's track — the counterpart to
1799
- --gog-slider-auto-width, which only sizes the horizontal case. */
1800
- --gog-slider-vertical-length: 160px;
1801
- --gog-slider-label-font-family: var(--gog-font-heading);
1802
- --gog-slider-value-font-family: var(--gog-font-mono);
1803
- --gog-slider-error-font-family: var(--gog-font-body);
1804
- --gog-slider-gap: var(--gog-space-6);
1805
- --gog-slider-label-color: var(--gog-accent-color);
1806
- --gog-slider-label-font-size: var(--gog-text-sm);
1807
- --gog-slider-label-letter-spacing: var(--gog-letter-spacing);
1808
- --gog-slider-label-text-transform: var(--gog-text-transform);
1809
- --gog-slider-value-color: var(--gog-accent-color);
1810
- --gog-slider-value-font-size: var(--gog-text-sm);
1811
- --gog-slider-value-min-width: 40px;
1812
- --gog-slider-track-height: 4px;
1813
- --gog-slider-track-area-height: 20px;
1814
- --gog-slider-track-radius: 0px;
1815
- /*
1816
- * Deliberately NOT an accent-* token: --gog-accent-dim sits on the same hue ramp as
1817
- * --gog-slider-fill-bg (--gog-accent-color), so at a 4px track height the two used to
1818
- * read as one blob rather than "recessed groove + accent fill" — same problem in both
1819
- * themes, since the whole accent ramp is one hue. Mixing --gog-text-color into
1820
- * --gog-border-color instead gives a desaturated, theme-adaptive groove: it darkens
1821
- * toward black in the light theme (text-color is near-black there) and lightens toward
1822
- * parchment in the dark theme (text-color is near-white there), landing at a neutral
1823
- * warm gray in both — always visibly distinct from the saturated accent fill, and always
1824
- * legible against its own theme's surface.
1825
- */
1826
- --gog-slider-track-bg: var(--gog-border-color);
1827
- --gog-slider-track-border-width: var(--gog-border-width);
1828
- --gog-slider-track-border-style: var(--gog-border-style);
1829
- /* Transparent by default — same opt-in convention as --gog-button-primary-border: the
1830
- width/style are always in the box model, but invisible until a theme sets a color. */
1831
- --gog-slider-track-border-color: transparent;
1832
- /* Bound via `background` (not `background-color`) in slider.component.scss, so this
1833
- also accepts a gradient (e.g. `linear-gradient(...)`) for the fill style, not just a
1834
- solid color. */
1835
- --gog-slider-fill-bg: var(--gog-accent-color);
1836
- --gog-slider-thumb-size: 16px;
1837
- --gog-slider-thumb-bg: var(--gog-accent-color);
1838
- --gog-slider-thumb-border: var(--gog-background-color);
1839
- --gog-slider-thumb-border-width: var(--gog-control-border-width);
1840
- --gog-slider-thumb-radius: 50%;
1841
- --gog-slider-thumb-shadow: var(--gog-accent-pale);
1842
- --gog-slider-thumb-glow-size: 6px;
1843
- --gog-slider-focus-ring: var(--gog-accent-pale);
1844
- --gog-slider-focus-ring-width: var(--gog-focus-ring-width);
1845
- --gog-slider-range-color: var(--gog-muted-text-color);
1846
- --gog-slider-range-font-size: var(--gog-text-xs);
1847
- --gog-slider-error-color: var(--gog-danger-color);
1848
- --gog-slider-error-font-size: var(--gog-text-xs);
1849
- --gog-slider-disabled-opacity: var(--gog-disabled-opacity);
1850
-
1851
- /* ── Spinner ──────────────────────────────────────────────────────────────── */
1852
- --gog-spinner-rune-font-family: var(--gog-font-heading);
1853
- --gog-spinner-track-color: var(--gog-accent-dim);
1854
- --gog-spinner-arc-outer-color: var(--gog-accent-color);
1855
- --gog-spinner-arc-inner-color: var(--gog-accent-bright);
1856
- --gog-spinner-diamond-color: var(--gog-accent-bright);
1857
- --gog-spinner-rune-color: var(--gog-accent-bright);
1858
- --gog-spinner-glow-color: var(--gog-accent-color);
1859
- --gog-spinner-track-opacity: 0.35;
1860
- --gog-spinner-arc-inner-opacity: 0.75;
1861
- --gog-spinner-diamond-opacity: 0.85;
1862
- --gog-spinner-arc-outer-pulse-opacity: 0.8;
1863
- --gog-spinner-arc-inner-pulse-opacity: 0.45;
1864
- --gog-spinner-rune-pulse-opacity: 0.4;
1865
- --gog-spinner-arc-outer-dash: 100 63;
1866
- --gog-spinner-arc-inner-dash: 35 78;
1867
- --gog-spinner-arc-inner-stroke-compact: 1;
1868
- --gog-spinner-spin-duration: 1.4s;
1869
- --gog-spinner-spin-slow-duration: 2s;
1870
- --gog-spinner-ticks-duration: 6s;
1871
- --gog-spinner-pulse-duration: 2.8s;
1872
- --gog-spinner-ring-duration: 1s;
1873
- --gog-spinner-ring-padding: 16%;
1874
- --gog-spinner-arc-outer-glow: 5px;
1875
- --gog-spinner-arc-inner-glow: 4px;
1876
- --gog-spinner-diamond-glow: 3px;
1877
- --gog-spinner-rune-glow: 6px;
1878
- --gog-spinner-ring-glow: 5px;
1879
- --gog-spinner-overlay-blur: 3px;
1880
- --gog-spinner-overlay-fade-duration: var(--gog-duration-slow);
1881
-
1882
- /* ── Table ────────────────────────────────────────────────────────────────── */
1883
- --gog-table-font-family: var(--gog-font-body);
1884
- --gog-table-header-font-family: var(--gog-font-heading);
1885
- --gog-table-numeric-font-family: var(--gog-font-mono);
1886
- --gog-table-gap: var(--gog-space-12);
1887
- --gog-table-border-color: var(--gog-accent-dim);
1888
- --gog-table-border-width: var(--gog-control-border-width);
1889
- --gog-table-border-style: var(--gog-border-style);
1890
- --gog-table-row-border-width: var(--gog-border-width);
1891
- /* The selection column is sized to its checkbox and never grows with content. */
1892
- --gog-table-select-col-width: 44px;
1893
- --gog-table-surface: var(--gog-surface-color);
1894
- /* The header needs its own ground, not the table's. It used to paint `--gog-table-surface`,
1895
- which is the same colour the body paints, so on a scrolling table with a sticky header the
1896
- column names slid over rows of identical background and the only thing separating them was
1897
- the accent colour and the caps — legible on a light theme, not on a dark one. */
1898
- --gog-table-header-bg: var(--gog-hover-color);
1899
- --gog-table-text-color: var(--gog-text-color);
1900
- --gog-table-accent-color: var(--gog-accent-color);
1901
- --gog-table-accent-bright: var(--gog-accent-bright);
1902
- --gog-table-hover-bg: var(--gog-accent-pale);
1903
- /* Selected rows keep this tint through hover, so hovering one never reads as clearing it. */
1904
- --gog-table-selected-bg: var(--gog-accent-pale);
1905
- --gog-table-muted-color: var(--gog-muted-text-color);
1906
- --gog-table-focus-ring: var(--gog-accent-color);
1907
- --gog-table-focus-ring-width: var(--gog-focus-ring-width);
1908
- --gog-table-header-letter-spacing: var(--gog-letter-spacing);
1909
- --gog-table-header-text-transform: var(--gog-text-transform);
1910
- --gog-table-num-col-width: 48px;
1911
- --gog-table-th-inner-gap: var(--gog-space-6);
1912
- --gog-table-sort-icon-size: 0.9em;
1913
- --gog-table-sort-icon-width: 1.1em;
1914
- --gog-table-sort-icon-opacity: 0.6;
1915
- --gog-table-empty-padding: var(--gog-space-24) var(--gog-space-14);
1916
- --gog-table-empty-font-size: var(--gog-text-md);
1917
- --gog-table-loading-padding: var(--gog-space-32) var(--gog-space-14);
1918
- --gog-table-loading-opacity: 0.5;
1919
- --gog-table-row-transition-duration: var(--gog-duration-fast);
1920
- --gog-table-footer-gap: var(--gog-space-sm);
1921
- --gog-table-footer-min-height: 32px;
1922
- --gog-table-total-font-size: var(--gog-text-xs);
1923
- --gog-table-total-letter-spacing: 0.5px;
1924
- --gog-table-total-text-transform: var(--gog-text-transform);
1925
- --gog-table-num-font-size: var(--gog-text-xs);
1926
- --gog-table-padding-h: var(--gog-space-14);
1927
- --gog-table-xsm-padding-v: var(--gog-space-2);
1928
- --gog-table-xsm-th-font-size: var(--gog-text-xs);
1929
- --gog-table-xsm-td-font-size: var(--gog-text-xs);
1930
- --gog-table-sm-padding-v: var(--gog-space-2);
1931
- --gog-table-sm-th-font-size: var(--gog-text-xs);
1932
- --gog-table-sm-td-font-size: var(--gog-text-xs);
1933
- --gog-table-md-padding-v: var(--gog-space-6);
1934
- --gog-table-md-th-font-size: var(--gog-text-xs);
1935
- --gog-table-md-td-font-size: var(--gog-text-sm);
1936
- --gog-table-lg-padding-v: var(--gog-space-10);
1937
- --gog-table-lg-th-font-size: var(--gog-text-sm);
1938
- --gog-table-lg-td-font-size: var(--gog-text-md);
1939
- --gog-table-slg-padding-v: var(--gog-space-14);
1940
- --gog-table-slg-th-font-size: var(--gog-text-md);
1941
- --gog-table-slg-td-font-size: var(--gog-text-lg);
1942
-
1943
- /* ── Tabs ──────────────────────────────────────────────────────────────────
1944
- `--gog-tabs-tab-bg`, `-tab-color`, `-tab-padding` and `-tab-font-size` are intentionally
1945
- NOT declared — they are the per-instance escape hatch the size classes fall back through.
1946
- `--gog-tabs-indicator-offset` / `-length` are written as inline styles from the measured
1947
- header geometry, so they are not declared either. */
1948
- --gog-tabs-font-family: var(--gog-font-heading);
1949
- --gog-tabs-font-weight: var(--gog-font-weight-bold);
1950
- --gog-tabs-letter-spacing: 0.4px;
1951
- --gog-tabs-text-transform: none;
1952
- --gog-tabs-line-height: var(--gog-line-height-tight);
1953
- --gog-tabs-gap: 0px;
1954
- --gog-tabs-tab-gap: var(--gog-space-sm);
1955
- --gog-tabs-icon-size: 1.1em;
1956
- --gog-tabs-rest-bg: transparent;
1957
- --gog-tabs-rest-color: var(--gog-muted-text-color);
1958
- --gog-tabs-hover-color: var(--gog-text-color);
1959
- /* Tabs paint no background at rest and none on hover — the press is the only one they get,
1960
- which is why this token has no hover counterpart to step past. */
1961
- --gog-tabs-press-bg: var(--gog-border-color);
1962
- /* A resting tab's label is deliberately muted, and muted text has no contrast headroom to
1963
- spend on a tinted ground: on the press wash it fell to 3.24:1 in one-dark and under 4.5 in
1964
- six other themes. The press takes the full text colour instead — which is also what pressing
1965
- a tab is about to make it. */
1966
- --gog-tabs-press-color: var(--gog-text-color);
1967
- --gog-tabs-active-color: var(--gog-accent-color);
1968
- --gog-tabs-header-border-width: var(--gog-border-width);
1969
- --gog-tabs-header-border-style: var(--gog-border-style);
1970
- --gog-tabs-header-border-color: var(--gog-border-color);
1971
- --gog-tabs-indicator-color: var(--gog-accent-color);
1972
- --gog-tabs-indicator-thickness: 2px;
1973
- --gog-tabs-indicator-radius: 999px;
1974
- --gog-tabs-transition-duration: var(--gog-duration-base);
1975
- --gog-tabs-disabled-opacity: var(--gog-disabled-opacity);
1976
- --gog-tabs-focus-ring-width: var(--gog-focus-ring-width);
1977
- /* Inset, for the same reason as the calendar cell: tabs sit shoulder to shoulder. */
1978
- --gog-tabs-focus-ring-offset: calc(var(--gog-focus-ring-offset) * -1);
1979
- --gog-tabs-focus-ring-color: var(--gog-accent-color);
1980
- --gog-tabs-panel-padding: var(--gog-space-md);
1981
- --gog-tabs-panel-color: var(--gog-text-color);
1982
- --gog-tabs-xsm-padding: var(--gog-space-6) var(--gog-space-10);
1983
- --gog-tabs-xsm-font-size: var(--gog-text-xs);
1984
- --gog-tabs-sm-padding: var(--gog-space-8) var(--gog-space-14);
1985
- --gog-tabs-sm-font-size: var(--gog-text-sm);
1986
- --gog-tabs-md-padding: var(--gog-space-12) var(--gog-space-18);
1987
- --gog-tabs-md-font-size: var(--gog-text-md);
1988
- --gog-tabs-lg-padding: var(--gog-space-16) var(--gog-space-24);
1989
- --gog-tabs-lg-font-size: var(--gog-text-lg);
1990
- --gog-tabs-slg-padding: var(--gog-space-20) var(--gog-space-28);
1991
- --gog-tabs-slg-font-size: var(--gog-text-xl);
1992
-
1993
- /* ── Tag ──────────────────────────────────────────────────────────────────
1994
- Like the button, the unsuffixed `--gog-tag-bg`/`-border`/`-color`/`-font-size`
1995
- and friends stay undeclared so variant and size classes can fall through them. */
1996
- --gog-tag-font-family: inherit;
1997
- --gog-tag-default-color: var(--gog-info-color, var(--gog-muted-text-color));
1998
- --gog-tag-success-color: var(--gog-success-color);
1999
- --gog-tag-danger-color: var(--gog-danger-color);
2000
- --gog-tag-warning-color: var(--gog-warning-color);
2001
- --gog-tag-info-color: var(--gog-info-color);
2002
- --gog-tag-bg-mix: 10%;
2003
- --gog-tag-color-mix: 82%;
2004
- --gog-tag-bg-base: var(--gog-surface-color);
2005
- --gog-tag-color-base: black;
2006
- --gog-tag-border-width: var(--gog-border-width);
2007
- --gog-tag-border-style: var(--gog-border-style);
2008
- --gog-tag-inner-border-width: var(--gog-border-width);
2009
- --gog-tag-font-weight: var(--gog-font-weight-semibold);
2010
- --gog-tag-line-height: var(--gog-line-height-none);
2011
- --gog-tag-radius: max(var(--gog-radius), 2px);
2012
- --gog-tag-pill-radius: 9999px;
2013
-
2014
- --gog-tag-xsm-font-size: 0.6875rem;
2015
- --gog-tag-xsm-padding-block: var(--gog-space-2);
2016
- --gog-tag-xsm-padding-inline: var(--gog-space-6);
2017
- --gog-tag-xsm-gap: var(--gog-space-2);
2018
- --gog-tag-xsm-icon-size: 0.6875rem;
2019
-
2020
- --gog-tag-sm-font-size: var(--gog-text-xs);
2021
- --gog-tag-sm-padding-block: var(--gog-space-4);
2022
- --gog-tag-sm-padding-inline: var(--gog-space-8);
2023
- --gog-tag-sm-gap: var(--gog-space-4);
2024
- --gog-tag-sm-icon-size: 0.75rem;
2025
-
2026
- --gog-tag-md-font-size: var(--gog-text-sm);
2027
- --gog-tag-md-padding-block: var(--gog-space-6);
2028
- --gog-tag-md-padding-inline: var(--gog-space-12);
2029
- --gog-tag-md-gap: var(--gog-space-6);
2030
- --gog-tag-md-icon-size: 0.875rem;
2031
-
2032
- --gog-tag-lg-font-size: var(--gog-text-md);
2033
- --gog-tag-lg-padding-block: var(--gog-space-8);
2034
- --gog-tag-lg-padding-inline: var(--gog-space-14);
2035
- --gog-tag-lg-gap: var(--gog-space-8);
2036
- --gog-tag-lg-icon-size: 1rem;
2037
-
2038
- --gog-tag-slg-font-size: var(--gog-text-lg);
2039
- --gog-tag-slg-padding-block: var(--gog-space-10);
2040
- --gog-tag-slg-padding-inline: var(--gog-space-16);
2041
- --gog-tag-slg-gap: var(--gog-space-10);
2042
- --gog-tag-slg-icon-size: 1.125rem;
2043
-
2044
- /* ── Toast ────────────────────────────────────────────────────────────────── */
2045
- --gog-toast-font-family: var(--gog-font-body);
2046
- --gog-toast-bg: var(--gog-surface-color);
2047
- --gog-toast-color: var(--gog-text-color);
2048
- --gog-toast-border: var(--gog-accent-color);
2049
- --gog-toast-icon-color: var(--gog-accent-color);
2050
- --gog-toast-success-color: var(--gog-success-color);
2051
- --gog-toast-error-color: var(--gog-danger-color);
2052
- --gog-toast-warning-color: var(--gog-accent-bright);
2053
- --gog-toast-info-color: var(--gog-accent-color);
2054
- --gog-toast-accent-width: 4px;
2055
- --gog-toast-padding: var(--gog-space-12) var(--gog-space-14);
2056
- --gog-toast-radius: 0px;
2057
- --gog-toast-content-gap: var(--gog-space-10);
2058
- --gog-toast-main-gap: var(--gog-space-sm);
2059
- --gog-toast-actions-gap: var(--gog-space-6);
2060
- --gog-toast-message-font-size: var(--gog-text-sm);
2061
- --gog-toast-message-line-height: var(--gog-line-height-relaxed);
2062
- --gog-toast-icon-size: 1rem;
2063
- --gog-toast-icon-line-height: var(--gog-line-height-normal);
2064
- --gog-toast-action-padding: var(--gog-space-4) var(--gog-space-8);
2065
- --gog-toast-action-font-size: var(--gog-text-xs);
2066
- --gog-toast-close-padding: var(--gog-space-2) var(--gog-space-4);
2067
- --gog-toast-close-font-size: var(--gog-text-xs);
2068
- --gog-toast-progress-height: 3px;
2069
- --gog-toast-progress-opacity: 30%;
2070
- --gog-toast-transition-duration: 0.25s;
2071
- /* Card-stack geometry */
2072
- --gog-toast-stack-peek: 14px;
2073
- --gog-toast-stack-scale-step: 0.06;
2074
- --gog-toast-stack-expanded-gap: 84px;
2075
- --gog-toast-stack-min-opacity: 0.4;
2076
- --gog-toast-stack-opacity-step: 0.18;
2077
- --gog-toast-stack-max-depth: 6;
2078
-
2079
- /* ── Toggle ───────────────────────────────────────────────────────────────────
2080
- A switch, not a checkbox: it announces as "switch, on". The outer label size reuses
2081
- the `--gog-control-checkbox-*` scale so a toggle and a checkbox in the same form read
2082
- at the same weight; the track/thumb geometry is its own, since a switch is wider than
2083
- it is tall. */
2084
- --gog-toggle-font-family: var(--gog-font-body);
2085
- --gog-toggle-gap: var(--gog-space-sm);
2086
- --gog-toggle-radius: 999px;
2087
- --gog-toggle-border-width: var(--gog-border-width);
2088
- --gog-toggle-border-style: var(--gog-border-style);
2089
- --gog-toggle-border-color: var(--gog-border-color);
2090
- --gog-toggle-on-border-color: var(--gog-accent-color);
2091
- --gog-toggle-track-off-bg: var(--gog-border-color);
2092
- --gog-toggle-track-on-bg: var(--gog-accent-color);
2093
- --gog-toggle-thumb-off-bg: var(--gog-surface-color);
2094
- --gog-toggle-thumb-on-bg: var(--gog-accent-text-color, var(--gog-primary-color));
2095
- --gog-toggle-thumb-shadow: 0 1px 3px rgba(0, 0, 0, 0.35);
2096
- --gog-toggle-thumb-inset: 2px;
2097
- --gog-toggle-transition-duration: var(--gog-duration-base);
2098
- --gog-toggle-disabled-opacity: var(--gog-disabled-opacity);
2099
- --gog-toggle-label-color: var(--gog-text-color);
2100
- --gog-toggle-label-line-height: var(--gog-line-height-normal);
2101
- --gog-toggle-focus-ring-width: var(--gog-focus-ring-width);
2102
- --gog-toggle-focus-ring-offset: var(--gog-focus-ring-offset);
2103
- --gog-toggle-focus-ring-color: var(--gog-accent-color);
2104
- /* In-track on/off wording */
2105
- --gog-toggle-state-color: var(--gog-accent-text-color, var(--gog-primary-color));
2106
- --gog-toggle-state-font-weight: var(--gog-font-weight-semibold);
2107
- --gog-toggle-state-letter-spacing: 0.04em;
2108
- --gog-toggle-state-padding-inline: var(--gog-space-4);
2109
- --gog-toggle-state-offset: var(--gog-space-6);
2110
- /* Gap between the wording and the thumb parked at the opposite end. The clearance itself
2111
- (thumb size + this) is computed in the component stylesheet, not here: a `var(` to a
2112
- size-class token is substituted where it is *declared*, so doing that calc on :root would
2113
- freeze it to the md thumb and stop it scaling with `size`. */
2114
- --gog-toggle-state-thumb-gap: var(--gog-space-6);
2115
- --gog-toggle-xsm-track-width: 24px;
2116
- --gog-toggle-xsm-track-height: 14px;
2117
- --gog-toggle-xsm-thumb-size: 10px;
2118
- --gog-toggle-xsm-label-size: var(--gog-control-checkbox-label-size-xsm);
2119
- --gog-toggle-xsm-state-font-size: 0.5rem;
2120
- --gog-toggle-sm-track-width: 32px;
2121
- --gog-toggle-sm-track-height: 18px;
2122
- --gog-toggle-sm-thumb-size: 14px;
2123
- --gog-toggle-sm-label-size: var(--gog-control-checkbox-label-size-sm);
2124
- --gog-toggle-sm-state-font-size: 0.5625rem;
2125
- --gog-toggle-md-track-width: 44px;
2126
- --gog-toggle-md-track-height: 24px;
2127
- --gog-toggle-md-thumb-size: 18px;
2128
- --gog-toggle-md-label-size: var(--gog-control-checkbox-label-size-md);
2129
- --gog-toggle-md-state-font-size: 0.625rem;
2130
- --gog-toggle-lg-track-width: 56px;
2131
- --gog-toggle-lg-track-height: 32px;
2132
- --gog-toggle-lg-thumb-size: 26px;
2133
- --gog-toggle-lg-label-size: var(--gog-control-checkbox-label-size-lg);
2134
- --gog-toggle-lg-state-font-size: var(--gog-text-xs);
2135
- --gog-toggle-slg-track-width: 68px;
2136
- --gog-toggle-slg-track-height: 40px;
2137
- --gog-toggle-slg-thumb-size: 34px;
2138
- --gog-toggle-slg-label-size: var(--gog-control-checkbox-label-size-slg);
2139
- --gog-toggle-slg-state-font-size: 0.8125rem;
2140
-
2141
- /* ── Tooltip ──────────────────────────────────────────────────────────────── */
2142
- --gog-tooltip-font-family: var(--gog-font-body);
2143
- --gog-tooltip-font-size: var(--gog-text-xs);
2144
- --gog-tooltip-line-height: var(--gog-line-height-normal);
2145
- --gog-tooltip-padding: var(--gog-space-6) var(--gog-space-10);
2146
- --gog-tooltip-radius: var(--gog-radius);
2147
- --gog-tooltip-max-width: 280px;
2148
- /* Caps the gog-scroll wrapping the bubble's content — see tooltip-bubble.component.html.
2149
- A cap, not a fixed height: shorter content stays exactly as tall as it needs to be, this
2150
- only stops something unusually long (a multi-paragraph TemplateRef) from growing to
2151
- cover most of the viewport. */
2152
- --gog-tooltip-max-height: 220px;
2153
- /* Same "floating panel" recipe as gog-dialog's panel and gog-select's dropdown — a
2154
- surface-colored box with a plain (not accent) border and the shared panel shadow —
2155
- rather than an inverted dark/light bubble, so it reads as part of this site instead of
2156
- a generic dark tooltip dropped on top of it. */
2157
- --gog-tooltip-bg: var(--gog-surface-color);
2158
- --gog-tooltip-color: var(--gog-text-color);
2159
- --gog-tooltip-border-width: var(--gog-panel-border-width);
2160
- --gog-tooltip-border-style: var(--gog-panel-border-style);
2161
- --gog-tooltip-border-color: var(--gog-border-color);
2162
- --gog-tooltip-shadow: var(--gog-panel-shadow);
2163
- --gog-tooltip-arrow-size: 5px;
2164
- /* Space kept between the trigger and the bubble. Read by the directive itself (not just
2165
- CSS) to feed the placement math — see `readPxToken` in `tooltip.directive.ts`. */
2166
- --gog-tooltip-gap: var(--gog-space-8);
2167
- --gog-tooltip-transition-duration: var(--gog-duration-fast);
2168
- }
2169
-
2170
- /*
2171
- * ── color-mix(), and why it is quarantined here ─────────────────────────────────
2172
- *
2173
- * Every token above has a flat value that works in any browser. The richer, mixed value lives
2174
- * in this block, which a browser without `color-mix()` skips entirely.
2175
- *
2176
- * **The usual two-declaration fallback does not work for custom properties, and that is the
2177
- * whole reason this block exists.** A custom property accepts almost any token stream at parse
2178
- * time it is only validated when it is *substituted* — so writing
2179
- *
2180
- * --x: var(--gog-hover-color);
2181
- * --x: color-mix(in srgb, …);
2182
- *
2183
- * leaves the second declaration winning even where `color-mix()` means nothing, and `var(--x)`
2184
- * then resolves to nothing at all. Measured in Chrome (2026-08-30): an element styled that way
2185
- * with an unsupported function computed `background: rgba(0, 0, 0, 0)` — transparent, not the
2186
- * earlier value. That is the reported "colours are wrong in Samsung Internet / Firefox": the
2187
- * declarations were not falling back, they were vanishing.
2188
- *
2189
- * `@supports` is the only mechanism that gates a custom property by feature support, because it
2190
- * is evaluated at parse time rather than at substitution time.
2191
- *
2192
- * `color-mix()` shipped in Chrome 111, Firefox 113, Safari 16.2 and Samsung Internet 22.
2193
- *
2194
- * **That is not below the support floor — it overlaps it.** Angular 21 supports
2195
- * `baseline widely available on 2025-10-20`, whose minimums are Chrome 111, Firefox 112 and
2196
- * Safari 16.4. Firefox 112 is inside that window and has no `color-mix()`, so these fallbacks
2197
- * are load-bearing for a browser the framework itself supports, not a courtesy to ancient ones.
2198
- * Below the floor entirely (Samsung Internet on an older Android, which Angular's list does not
2199
- * mention at all) the library still renders: flat palette colours, less depth, every surface
2200
- * legible and every focus ring visible.
2201
- *
2202
- * The project deliberately declares no `browserslist` — Angular's baseline is the policy, and
2203
- * stating a lower one only produced "unsupported browsers" warnings on every build.
2204
- */
2205
- @supports (color: color-mix(in srgb, red 50%, blue)) {
2206
- :root,
2207
- [data-theme] {
2208
- --gog-accordion-hover-bg: color-mix(in srgb, var(--gog-accent-dim) 10%, transparent);
2209
- --gog-accordion-hover-ring: color-mix(in srgb, var(--gog-accent-color) 30%, transparent);
2210
- --gog-accordion-body-bg: color-mix(in srgb, black 6%, transparent);
2211
- --gog-button-primary-hover-shadow: 0 0 16px
2212
- color-mix(in srgb, var(--gog-accent-bright) 45%, transparent);
2213
- --gog-button-ghost-hover-bg: color-mix(in srgb, var(--gog-accent-color) 12%, transparent);
2214
- /* Every other pressable surface, one rule: 20% of the same ingredient its own hover mixes at
2215
- 10-12%, so the press is a clear step past the hover without becoming a fill. 20 rather than
2216
- a rounder 25 is measured, not chosen: `check:contrast` resolves these washes over the
2217
- surface each one actually sits on, and 21% puts one-dark's mid-grey text under 4.5:1 on the
2218
- tab, accordion and button-toggle presses. The accordion mixes `--gog-accent-dim` because
2219
- its hover does its header sits on a strip where a full-accent wash was too loud
2220
- (21.7.1). */
2221
- --gog-accordion-press-bg: color-mix(in srgb, var(--gog-accent-dim) 20%, transparent);
2222
- --gog-autocomplete-option-press-bg: color-mix(
2223
- in srgb,
2224
- var(--gog-accent-color) 20%,
2225
- transparent
2226
- );
2227
- --gog-button-toggle-press-bg: color-mix(in srgb, var(--gog-accent-color) 20%, transparent);
2228
- --gog-chip-press-bg: color-mix(in srgb, var(--gog-accent-color) 20%, transparent);
2229
- --gog-menu-item-press-bg: color-mix(in srgb, var(--gog-accent-color) 20%, transparent);
2230
- --gog-multiselect-option-press-bg: color-mix(in srgb, var(--gog-accent-color) 20%, transparent);
2231
- --gog-select-option-press-bg: color-mix(in srgb, var(--gog-accent-color) 20%, transparent);
2232
- --gog-tabs-press-bg: color-mix(in srgb, var(--gog-accent-color) 20%, transparent);
2233
-
2234
- /* Button severity — see the block of the same name above for what each ingredient is and
2235
- why the ink mix is 50%. Four severities, one recipe each, so a new status colour would
2236
- need four lines rather than a design decision. */
2237
- --gog-button-success-fill-hover: color-mix(
2238
- in srgb,
2239
- var(--gog-success-color) 88%,
2240
- var(--gog-success-shade)
2241
- );
2242
- --gog-button-success-fill-press: color-mix(
2243
- in srgb,
2244
- var(--gog-success-color) 76%,
2245
- var(--gog-success-shade)
2246
- );
2247
- --gog-button-success-ink: color-mix(
2248
- in srgb,
2249
- var(--gog-success-color) 50%,
2250
- var(--gog-text-color)
2251
- );
2252
- --gog-button-success-wash: color-mix(in srgb, var(--gog-success-color) 12%, transparent);
2253
- --gog-button-danger-fill-hover: color-mix(
2254
- in srgb,
2255
- var(--gog-danger-color) 88%,
2256
- var(--gog-danger-shade)
2257
- );
2258
- --gog-button-danger-fill-press: color-mix(
2259
- in srgb,
2260
- var(--gog-danger-color) 76%,
2261
- var(--gog-danger-shade)
2262
- );
2263
- --gog-button-danger-ink: color-mix(in srgb, var(--gog-danger-color) 50%, var(--gog-text-color));
2264
- --gog-button-danger-wash: color-mix(in srgb, var(--gog-danger-color) 12%, transparent);
2265
- --gog-button-warning-fill-hover: color-mix(
2266
- in srgb,
2267
- var(--gog-warning-color) 88%,
2268
- var(--gog-warning-shade)
2269
- );
2270
- --gog-button-warning-fill-press: color-mix(
2271
- in srgb,
2272
- var(--gog-warning-color) 76%,
2273
- var(--gog-warning-shade)
2274
- );
2275
- --gog-button-warning-ink: color-mix(
2276
- in srgb,
2277
- var(--gog-warning-color) 50%,
2278
- var(--gog-text-color)
2279
- );
2280
- --gog-button-warning-wash: color-mix(in srgb, var(--gog-warning-color) 12%, transparent);
2281
- --gog-button-info-fill-hover: color-mix(
2282
- in srgb,
2283
- var(--gog-info-color) 88%,
2284
- var(--gog-info-shade)
2285
- );
2286
- --gog-button-info-fill-press: color-mix(
2287
- in srgb,
2288
- var(--gog-info-color) 76%,
2289
- var(--gog-info-shade)
2290
- );
2291
- --gog-button-info-ink: color-mix(in srgb, var(--gog-info-color) 50%, var(--gog-text-color));
2292
- --gog-button-info-wash: color-mix(in srgb, var(--gog-info-color) 12%, transparent);
2293
- --gog-calendar-range-bg: color-mix(in srgb, var(--gog-accent-color) 16%, transparent);
2294
- --gog-card-filled-bg: color-mix(in srgb, var(--gog-accent-dim) 8%, var(--gog-surface-color));
2295
- --gog-card-hover-border-color: color-mix(in srgb, var(--gog-accent-color) 45%, transparent);
2296
- --gog-checkbox-focus-ring: color-mix(in srgb, var(--gog-accent-color) 25%, transparent);
2297
- --gog-radio-focus-ring: color-mix(in srgb, var(--gog-accent-color) 25%, transparent);
2298
- --gog-chip-bg: color-mix(in srgb, var(--gog-surface-color) 88%, var(--gog-hover-color));
2299
- --gog-chip-hover-bg: color-mix(in srgb, var(--gog-hover-color) 45%, var(--gog-surface-color));
2300
- --gog-dialog-close-hover-bg: color-mix(in srgb, var(--gog-hover-color) 70%, transparent);
2301
- --gog-autocomplete-option-hover-bg: color-mix(
2302
- in srgb,
2303
- var(--gog-accent-color) 10%,
2304
- transparent
2305
- );
2306
- --gog-autocomplete-option-selected-bg: color-mix(
2307
- in srgb,
2308
- var(--gog-accent-color) 16%,
2309
- transparent
2310
- );
2311
- --gog-input-focus-ring: color-mix(in srgb, var(--gog-accent-color) 25%, transparent);
2312
- --gog-input-spin-hover-bg: color-mix(
2313
- in srgb,
2314
- var(--gog-input-icon-hover-color) 12%,
2315
- transparent
2316
- );
2317
- --gog-multiselect-focus-ring: color-mix(in srgb, var(--gog-accent-color) 25%, transparent);
2318
- --gog-multiselect-option-hover-bg: color-mix(in srgb, var(--gog-accent-color) 10%, transparent);
2319
- --gog-panel-filled-bg: color-mix(in srgb, var(--gog-accent-dim) 8%, var(--gog-surface-color));
2320
- --gog-panel-toggle-hover-bg: color-mix(in srgb, var(--gog-hover-color) 70%, transparent);
2321
- --gog-progressbar-track-base-bg: color-mix(
2322
- in srgb,
2323
- var(--gog-text-color) 20%,
2324
- var(--gog-border-color)
2325
- );
2326
- --gog-progressbar-stripe-color: color-mix(in srgb, var(--gog-surface-color) 45%, transparent);
2327
- --gog-progressbar-accent-buffer-bg: color-mix(
2328
- in srgb,
2329
- var(--gog-accent-color) 35%,
2330
- transparent
2331
- );
2332
- --gog-progressbar-success-buffer-bg: color-mix(
2333
- in srgb,
2334
- var(--gog-success-color) 35%,
2335
- transparent
2336
- );
2337
- --gog-progressbar-danger-buffer-bg: color-mix(
2338
- in srgb,
2339
- var(--gog-danger-color) 35%,
2340
- transparent
2341
- );
2342
- --gog-progressbar-warning-buffer-bg: color-mix(
2343
- in srgb,
2344
- var(--gog-warning-color) 35%,
2345
- transparent
2346
- );
2347
- --gog-progressbar-info-buffer-bg: color-mix(in srgb, var(--gog-info-color) 35%, transparent);
2348
- --gog-select-focus-ring: color-mix(in srgb, var(--gog-accent-color) 25%, transparent);
2349
- --gog-select-option-hover-bg: color-mix(in srgb, var(--gog-accent-color) 10%, transparent);
2350
- --gog-skeleton-base: color-mix(in srgb, var(--gog-border-color) 40%, var(--gog-surface-color));
2351
- --gog-skeleton-shine: color-mix(in srgb, var(--gog-skeleton-base), white 35%);
2352
- --gog-slider-track-bg: color-mix(in srgb, var(--gog-text-color) 30%, var(--gog-border-color));
2353
- --gog-slider-thumb-shadow: color-mix(in srgb, var(--gog-accent-bright) 40%, transparent);
2354
- --gog-slider-focus-ring: color-mix(in srgb, var(--gog-accent-color) 30%, transparent);
2355
- --gog-toggle-track-off-bg: color-mix(in srgb, var(--gog-text-color) 18%, transparent);
2356
- }
2357
- }
1
+ /*
2
+ * @guildofgleks/ui — baseline theme
3
+ *
4
+ * Every token the components read, with a working default, so the library renders
5
+ * correctly from a single import and a consumer can override only what they care about.
6
+ *
7
+ * ── The three layers ─────────────────────────────────────────────────────────────
8
+ * 1. Foundation — palette, type scale, spacing, motion, focus. Restyles everything.
9
+ * 2. Component — `--gog-<component>-*`, spelled out as the component's own element
10
+ * name. Every colour, font, border, radius, shadow, padding and
11
+ * duration each component paints with lives here, so a theme can
12
+ * restyle one component without touching its stylesheet.
13
+ * 3. Instance — a handful of deliberately UNDECLARED tokens (`--gog-button-bg`,
14
+ * `--gog-button-padding`, `--gog-tag-bg`, …) that variant/size classes
15
+ * fall back through. Left unset on purpose: a value declared here
16
+ * would out-cascade the variant classes and pin every button to one
17
+ * look. Set them on an element to override a single instance.
18
+ *
19
+ * No component stylesheet declares a `--gog-*` default of its own — everything a
20
+ * component paints resolves to a token below.
21
+ *
22
+ * ── Why there are two blocks, and which one to add a token to ────────────────────
23
+ * A custom property's `var()` references are substituted on the element that *declares*
24
+ * it, not where it is read. So `--gog-button-primary-bg: var(--gog-accent-color)` declared on
25
+ * `:root` freezes to the root palette: a `data-theme` scope further down the tree could
26
+ * change `--gog-accent-color` and buttons inside it would not follow.
27
+ *
28
+ * `:root` — literals only (and the light palette default). Values that
29
+ * reference nothing, so resolving them once at the root is right.
30
+ * `:root, [data-theme]` — every token whose value reads another token. Re-declared on
31
+ * each theme scope so it re-derives from that scope's palette
32
+ * and metrics. **A new token that contains `var(` goes here.**
33
+ *
34
+ * ── Adding a theme ───────────────────────────────────────────────────────────────
35
+ * Declare a palette against the attribute value; the derived layer re-resolves for you:
36
+ *
37
+ * :root[data-theme='mine'], [data-theme='mine'] { --gog-accent-color: #ff4edb; }
38
+ *
39
+ * Listing both selectors makes the theme work at the root *and* on any subtree, so a
40
+ * single page can show several themes side by side.
41
+ */
42
+
43
+ :root {
44
+ /* ── Typography ───────────────────────────────────────────────────────────────
45
+ Generic stacks on purpose: a UI library should not force a webfont download on
46
+ its consumers. Point these at your own families to restyle all text at once.
47
+ `styles/fonts.css` is an optional import that wires up the showcase's families. */
48
+ --gog-font-heading: system-ui, -apple-system, 'Segoe UI', sans-serif;
49
+ --gog-font-body: system-ui, -apple-system, 'Segoe UI', sans-serif;
50
+ --gog-font-mono: ui-monospace, SFMono-Regular, 'JetBrains Mono', monospace;
51
+
52
+ --gog-text-xs: 0.75rem;
53
+ --gog-text-sm: 0.875rem;
54
+ --gog-text-md: 1rem;
55
+ --gog-text-lg: 1.125rem;
56
+ /* 20px, between `lg` and `xl`. Named for the control size it serves rather than continuing the
57
+ t-shirt run, because that is what asked for it: `gog-button` and the field controls both
58
+ needed a step for their `slg` size and, having none, both wrote `1.25rem` as a literal — the
59
+ same value chosen twice, independently, which is a missing rung and not two opinions. The
60
+ gap from 1.125 to 1.5 is the widest in the scale, so it was the one likely to be filled by
61
+ hand. */
62
+ --gog-text-slg: 1.25rem;
63
+ --gog-text-xl: 1.5rem;
64
+ --gog-text-2xl: 2rem;
65
+ --gog-text-3xl: 3rem;
66
+
67
+ /* Weight, the third character axis after casing and tracking — and the one 21.7.0's character
68
+ layer missed, which is how fifteen component tokens came to hold a bare number. A house style
69
+ that wants lighter chrome sets these four and nothing else; before them it meant finding and
70
+ re-listing every one. Four steps because four are used: no `normal`, because nothing in the
71
+ library paints 400 and an unused token is API nobody asked for. */
72
+ --gog-font-weight-medium: 500;
73
+ --gog-font-weight-semibold: 600;
74
+ --gog-font-weight-bold: 700;
75
+ --gog-font-weight-heavy: 900;
76
+
77
+ /* Leading, the fourth character axis. Twenty component tokens held a bare number — seven of
78
+ them the same 1.4 — so a house style that wanted roomier text had to find every one. Six
79
+ steps because six values are painted; `gog-panel`'s heading keeps its own 1.25, which is
80
+ off this scale on purpose the way an 11px chip is off the type scale. */
81
+ --gog-line-height-none: 1;
82
+ --gog-line-height-tight: 1.2;
83
+ --gog-line-height-snug: 1.3;
84
+ --gog-line-height-normal: 1.4;
85
+ --gog-line-height-relaxed: 1.5;
86
+ --gog-line-height-loose: 1.6;
87
+
88
+ /* The "emphasis" casing character — labels, buttons, section and table headers all shout
89
+ the same way by default. Not every uppercase/1px-tracking declaration in this file reads
90
+ these two: only the ones that genuinely share this idea do. A few (gog-tabs among them)
91
+ stay their own literal on purpose, because normal case or a different tracking reads
92
+ better there — see docs/themes.md, iteration 1, for the full audit of what did and did
93
+ not qualify. */
94
+ --gog-text-transform: uppercase;
95
+ --gog-letter-spacing: 1px;
96
+
97
+ /* ── Spacing & geometry ───────────────────────────────────────────────────────
98
+
99
+ `--gog-density` is the whole spacing system in one number. It multiplies every step
100
+ of the scale below, and every component padding and gap derives from that scale, so
101
+ a theme makes the entire library compact or roomy without naming a single component:
102
+
103
+ [data-theme='compact'] { --gog-density: 0.75; }
104
+
105
+ This is the density half of docs/themes.md's character layer — the same idea as
106
+ --gog-radius for corners. Before it existed, 177 component paddings and gaps were
107
+ literals in two different units, and a theme that wanted tighter controls had to
108
+ re-list all of them; check-tokens.mjs rule G now fails a build that adds another.
109
+
110
+ The steps are named for their pixel value at density 1, because a t-shirt scale
111
+ stops being readable somewhere around the fourth size and this one has fourteen.
112
+ The five original t-shirt names are kept as aliases: they are public API, they are
113
+ what `theme-starter.css` and every existing consumer theme use, and they cost
114
+ nothing to keep.
115
+
116
+ Only the multiplier itself lives here — the scale is in the derived block below,
117
+ because every step reads this token and so has to re-resolve inside each theme
118
+ scope. A step declared here would be computed once against :root's density and a
119
+ [data-theme] subtree would inherit that number, not its own. */
120
+ --gog-density: 1;
121
+
122
+ /* The ground a *raised* surface paints. Equal to the plain surface by default, because on a
123
+ light theme elevation reads as a shadow and the surface itself does not change.
124
+
125
+ On a dark theme a shadow has nothing to darken — 21.7.1 found `elevated` and `outlined`
126
+ cards rendering identically under `data-theme="dark"`, both a thin ring on the same fill.
127
+ Dark themes therefore lift this token instead, which is how elevation has to be expressed
128
+ when the page is already near-black. Each dark theme sets it; light themes leave it alone. */
129
+
130
+ --gog-radius: 8px;
131
+ /* Three border-weight tiers, not one: --gog-control-border-width (2px) is form fields,
132
+ --gog-panel-border-width (1px) is raised/floating surfaces (card, dialog, dropdown panel,
133
+ tooltip — see README.md's note on --gog-panel-*), and this pair is everything smaller and
134
+ inline — chip, tag, badge, toggle, table rows, tabs, calendar cells. It happens to share
135
+ panel's value today; kept separate anyway; a theme wanting thick floating panels but thin
136
+ inline chips (or the reverse) needs the two independently settable. */
137
+ --gog-border-width: 1px;
138
+ --gog-border-style: solid;
139
+ --gog-panel-border-width: 1px;
140
+ --gog-panel-border-style: solid;
141
+
142
+ /* ── Motion ──────────────────────────────────────────────────────────────────
143
+ Every component transition/animation is expressed in these. Set them to 0s to
144
+ flatten all motion theme-wide (components also honour prefers-reduced-motion). */
145
+ --gog-duration-fast: 0.12s;
146
+ --gog-duration-base: 0.15s;
147
+ --gog-duration-slow: 0.2s;
148
+ --gog-easing: ease;
149
+
150
+ /* ── Focus & disabled ───────────────────────────────────────────────────────── */
151
+ --gog-focus-ring-width: 3px;
152
+ --gog-focus-ring-offset: 2px;
153
+ --gog-disabled-opacity: 0.4;
154
+
155
+ /* ── Control metrics ─────────────────────────────────────────────────────────
156
+ Five-tier scale: xsm/slg bookend the original sm/md/lg (restored below to
157
+ their pre-compaction numbers) as new extremes for extra-tight or extra-roomy
158
+ layouts. */
159
+ /* The clear (×) button's glyph, as a fraction of its box. One number written five times —
160
+ `gog-autocomplete`, `gog-datepicker`, `gog-inputfield`, `gog-multiselect` and `gog-select`
161
+ all had their own `0.7` for the same part. `gog-textarea` keeps its own `1` deliberately:
162
+ its clear button sits in a corner rather than in the field's icon row. */
163
+ --gog-control-clear-icon-ratio: 0.7;
164
+ --gog-control-border-width: 2px;
165
+ --gog-control-border-style: solid;
166
+
167
+ --gog-control-checkbox-box-size-xsm: 12px;
168
+ --gog-control-checkbox-box-size-sm: 18px;
169
+ --gog-control-checkbox-box-size-md: 24px;
170
+ --gog-control-checkbox-box-size-lg: 32px;
171
+ --gog-control-checkbox-box-size-slg: 40px;
172
+ --gog-control-checkbox-label-size-xsm: 0.6875rem;
173
+ --gog-control-checkbox-label-size-sm: 0.8125rem;
174
+ --gog-control-checkbox-label-size-md: 0.9375rem;
175
+ --gog-control-checkbox-label-size-lg: 1.0625rem;
176
+ --gog-control-checkbox-label-size-slg: 1.1875rem;
177
+ --gog-control-checkbox-icon-size-xsm: 10px;
178
+ --gog-control-checkbox-icon-size-sm: 12px;
179
+ --gog-control-checkbox-icon-size-md: 14px;
180
+ --gog-control-checkbox-icon-size-lg: 18px;
181
+ --gog-control-checkbox-icon-size-slg: 22px;
182
+
183
+ /* ── Button sizing ─────────────────────────────────────────────────────────── */
184
+
185
+ /* ── Field sizing (input / select / multiselect share one scale) ─────────────
186
+ The offsets are spacing and follow --gog-density with everything else; the glyph
187
+ box does not, because an icon that shrinks with the padding stops being legible
188
+ well before the padding stops being usable. Only the offsets move.
189
+
190
+ Each inset is the text's start edge: one offset before the glyph, the glyph, one
191
+ offset after. It was five hand-measured literals (docs/iteration-8-plan.md tuned
192
+ them in a browser) that happened to satisfy that identity, so nothing here moves
193
+ at density 1 — but a literal cannot follow the density knob, and at 0.75 the text
194
+ used to keep a 36px inset against 7px of padding. Stated as the sum it always was,
195
+ it just works. */
196
+ --gog-field-icon-glyph-xsm: 12px;
197
+ --gog-field-icon-glyph-sm: 14px;
198
+ --gog-field-icon-glyph: 16px;
199
+
200
+ /* ── Float label geometry (input / textarea / select / multiselect) ─────────
201
+ One scale for every field that can float its label. Each control reads these
202
+ through its own `--gog-<block>-float-label-*` token in the derived layer below,
203
+ so setting a value here retunes all of them at once while a single control can
204
+ still be tuned on its own. `reserve` is the headroom added inside the field for
205
+ the 'in'/'on' variants; `in-top` is where the label lands once floated for 'in';
206
+ `over-gap`/`over-reserve` are the gap above the border and the space permanently
207
+ kept clear for the 'over' variant. */
208
+ --gog-field-float-label-reserve: 14px;
209
+ --gog-field-float-label-in-top: 6px;
210
+ --gog-field-float-label-over-reserve: 1.4em;
211
+
212
+ /* ── Icon & spinner ───────────────────────────────────────────────────────── */
213
+ --gog-icon-size: 1.2em;
214
+ --gog-icon-stroke-width: 2;
215
+ --gog-spinner-size-xsm: 12px;
216
+ --gog-spinner-size-sm: 18px;
217
+ --gog-spinner-size-md: 48px;
218
+ --gog-spinner-size-lg: 96px;
219
+ --gog-spinner-size-slg: 144px;
220
+ --gog-spinner-rune-size: 20px;
221
+
222
+ /* ── Toast stack ──────────────────────────────────────────────────────────── */
223
+ --gog-toast-min-width: 280px;
224
+ --gog-toast-max-width: 400px;
225
+ --gog-toast-z-index: 9999;
226
+ --gog-toast-enter-distance: 110%;
227
+ --gog-toast-shadow: 0 4px 24px rgba(0, 0, 0, 0.25);
228
+
229
+ /* ── Overlay stacking ───────────────────────────────────────────────────────
230
+ Baseline for dropdown panels. gog-dialog re-declares this on its own panel so
231
+ dropdowns opened inside a dialog stack above it. */
232
+ /* The library's stacking floor. Every layer below is `base + N`, so an app that has to put the
233
+ whole library above its own chrome moves this one number and keeps the internal order —
234
+ badge 1, toast 100, dropdowns and dialogs 300, tooltip 400, the blocking spinner overlay
235
+ 8000. Before this, shifting the stack meant editing five tokens and hoping none was missed. */
236
+ --gog-z-base: 0;
237
+
238
+ /* ── Light palette (also the no-data-theme default) ───────────────────────── */
239
+ color-scheme: light;
240
+ /* Backgrounds and surfaces */
241
+ --gog-background-color: #f7f3eb; /* Warm parchment page ground */
242
+ --gog-surface-color: #ffffff; /* Bleached parchment for cards — lighter than the page on purpose, so the two tiers read apart */
243
+ --gog-hover-color: #f0e7d7; /* Hover state — soft wax */
244
+ --gog-border-color: #d8c7ad; /* Aged brass rule */
245
+
246
+ /* Type — old oak-gall ink */
247
+ --gog-text-color: #17120c; /* Deep ink — clears WCAG AAA against both surfaces */
248
+ --gog-accent-text-color: #ffffff;
249
+ --gog-muted-text-color: #63503c; /* Muted kiln ink */
250
+
251
+ /* Brand and accents — guild gold leaf */
252
+ --gog-primary-color: #17120c;
253
+ /* Deep guild gold. Darkened from #9e6f00 in 21.7.0: white on the old value was 4.44:1,
254
+ just under WCAG AA's 4.5, and its hover fill was 2.87:1 — the hover was the worse half.
255
+ The hover is now *darker* than the rest state rather than brighter, because gold light
256
+ enough to read as "a brighter gleam" cannot carry white text at all. */
257
+ --gog-accent-color: #926600;
258
+ --gog-accent-bright: #7a5500;
259
+ --gog-accent-dim: #735100; /* Dark bronze */
260
+ --gog-accent-pale: #f8f1df; /* Pale wash beneath the gold */
261
+ --gog-secondary-color: #6b5328;
262
+
263
+ /* Semantic colours, kept in the alchemical family */
264
+ --gog-success-color: #216e4e; /* Emerald */
265
+ --gog-danger-color: #a7232b; /* Ruby */
266
+ --gog-warning-color: #c45100; /* Dark amber */
267
+ --gog-info-color: #2b5c8f; /* Lapis */
268
+
269
+ /* Soft, deep shadow — old leather */
270
+ --gog-panel-shadow: 0 4px 20px rgba(23, 18, 12, 0.08), 0 1px 3px rgba(23, 18, 12, 0.04);
271
+ --gog-spinner-overlay-bg: rgba(247, 243, 235, 0.85);
272
+ }
273
+
274
+ :root[data-theme='light'],
275
+ [data-theme='light'] {
276
+ color-scheme: light;
277
+
278
+ /* Backgrounds and surfaces */
279
+ --gog-background-color: #f7f3eb; /* Warm parchment page ground */
280
+ --gog-surface-color: #ffffff; /* Bleached parchment for cards — lighter than the page on purpose, so the two tiers read apart */
281
+ --gog-hover-color: #f0e7d7; /* Hover state — soft wax */
282
+ --gog-border-color: #d8c7ad; /* Aged brass rule */
283
+
284
+ /* Type — old oak-gall ink */
285
+ --gog-text-color: #17120c; /* Deep ink — clears WCAG AAA against both surfaces */
286
+ --gog-accent-text-color: #ffffff;
287
+ --gog-muted-text-color: #63503c; /* Muted kiln ink */
288
+
289
+ /* Brand and accents — guild gold leaf */
290
+ --gog-primary-color: #17120c;
291
+ /* Deep guild gold. Darkened from #9e6f00 in 21.7.0: white on the old value was 4.44:1,
292
+ just under WCAG AA's 4.5, and its hover fill was 2.87:1 — the hover was the worse half.
293
+ The hover is now *darker* than the rest state rather than brighter, because gold light
294
+ enough to read as "a brighter gleam" cannot carry white text at all. */
295
+ --gog-accent-color: #926600;
296
+ --gog-accent-bright: #7a5500;
297
+ --gog-accent-dim: #735100; /* Dark bronze */
298
+ --gog-accent-pale: #f8f1df; /* Pale wash beneath the gold */
299
+ --gog-secondary-color: #6b5328;
300
+
301
+ /* Semantic colours, kept in the alchemical family */
302
+ --gog-success-color: #216e4e; /* Emerald */
303
+ --gog-danger-color: #a7232b; /* Ruby */
304
+ --gog-warning-color: #c45100; /* Dark amber */
305
+ --gog-info-color: #2b5c8f; /* Lapis */
306
+
307
+ /* Soft, deep shadow — old leather */
308
+ --gog-panel-shadow: 0 4px 20px rgba(23, 18, 12, 0.08), 0 1px 3px rgba(23, 18, 12, 0.04);
309
+ --gog-spinner-overlay-bg: rgba(247, 243, 235, 0.85);
310
+ }
311
+
312
+ :root[data-theme='dark'],
313
+ [data-theme='dark'] {
314
+ color-scheme: dark;
315
+
316
+ /* Backgrounds and surfaces */
317
+ --gog-background-color: #0d0b08; /* Deep forge obsidian */
318
+ --gog-surface-color: #16120e; /* Dark fired iron — cards */
319
+ /* Lifted, not shadowed — see --gog-elevated-surface-color. Deliberately a step above
320
+ --gog-hover-color, not equal to it: hover and the header strips are a light lift, elevation
321
+ is a bigger one, and the first attempt gave all three the same value. */
322
+ --gog-hover-color: #241d17; /* Hover state */
323
+ --gog-border-color: #3d3122; /* Aged chased bronze */
324
+
325
+ /* Type — glowing ivory */
326
+ --gog-text-color: #f3ebd8; /* Soft luminous parchment */
327
+ --gog-accent-text-color: #0d0b08;
328
+ --gog-muted-text-color: #9e8d76; /* Muted bronze */
329
+
330
+ /* Brand and accents — the alchemist's glowing gold */
331
+ --gog-primary-color: #f3ebd8;
332
+ --gog-accent-color: #fbbf24; /* Plasma amber */
333
+ --gog-accent-bright: #fde047; /* Bright gold ray */
334
+ --gog-accent-dim: #b48310; /* Muted gold */
335
+ --gog-accent-pale: #2b210c; /* Dark gold reflection */
336
+ --gog-secondary-color: #d4a373;
337
+
338
+ /* Semantics */
339
+ --gog-success-color: #34d399; /* Glowing emerald */
340
+ --gog-danger-color: #f87171; /* Glowing ruby */
341
+ --gog-warning-color: #fbbf24; /* Amber */
342
+ --gog-info-color: #38bdf8; /* Sapphire */
343
+
344
+ --gog-panel-shadow: 0 10px 30px rgba(0, 0, 0, 0.7), 0 0 0 1px var(--gog-border-color);
345
+ /* `elevated` drops the 1px ring `--gog-panel-shadow` carries for real overlays (dialog,
346
+ dropdown, tooltip), because that ring is exactly what `outlined` draws — with it, the two
347
+ card/panel variants render identically on a dark ground. The blur stays; the ring goes,
348
+ so outlined has an edge and elevated does not. Light themes need none of this: their
349
+ shadow has no ring and reads on its own. */
350
+ /* `elevated` cannot use `--gog-panel-shadow` here. That shadow carries a `0 0 0 1px` ring so
351
+ overlays keep an edge against the page, and the ring is exactly what `outlined` draws — with
352
+ it the two variants render identically. Dropping the ring and keeping the 30px black blur was
353
+ worse: black blurred over a near-black page reads as smudge rather than lift.
354
+
355
+ So elevation is stated the way a dark UI actually states it — a hairline of light along the
356
+ top edge, where a raised surface would catch it, over a tighter, darker shadow that stays
357
+ close to the element instead of hazing the page. */
358
+ --gog-card-elevated-shadow:
359
+ inset 0 1px 0 rgba(255, 255, 255, 0.07), 0 2px 6px rgba(0, 0, 0, 0.55);
360
+ --gog-panel-elevated-shadow:
361
+ inset 0 1px 0 rgba(255, 255, 255, 0.07), 0 2px 6px rgba(0, 0, 0, 0.55);
362
+ --gog-spinner-overlay-bg: rgba(13, 11, 8, 0.85);
363
+ }
364
+
365
+ /*
366
+ * ── Derived layer ───────────────────────────────────────────────────────────────
367
+ * Re-declared on every theme scope so each one re-derives from its own palette and
368
+ * metrics. Everything here reads another token; nothing here is a bare literal.
369
+ */
370
+ :root,
371
+ [data-theme] {
372
+ /* ── Derived foundation tokens ───────────────────────────────────────────────
373
+ Split out of the literal block above because they read other tokens: they have
374
+ to re-resolve inside each theme scope. */
375
+
376
+ /* ── Text on a status fill ───────────────────────────────────────────────────
377
+ `--gog-accent-text-color` means "text on the accent fill" and flips with the theme, which
378
+ made it the obvious label for a status fill too — `gogBadge` used it for all four. It is
379
+ wrong for some of them, and silently: measured 2026-09-04, `material`'s amber under white
380
+ was 1.97:1 and `primeng`'s green 2.28:1, both far under AA, in a pair no check had. The
381
+ accent is one colour a theme tunes deliberately; the four statuses are four more, and
382
+ nothing says one label reads on all five.
383
+
384
+ So each status names its own, defaulting to the accent's answer because that is right in
385
+ seven of the eleven themes. A theme states one of these only where its own hue disagrees —
386
+ `material` puts near-black on its amber, which is Material 3's own convention, and `primeng`
387
+ does the same on all three of Aura's bright hues. Where *neither* label reached AA the hue
388
+ itself moved instead; see the preset files. */
389
+ --gog-success-text-color: var(--gog-accent-text-color, var(--gog-primary-color));
390
+ --gog-danger-text-color: var(--gog-accent-text-color, var(--gog-primary-color));
391
+ --gog-warning-text-color: var(--gog-accent-text-color, var(--gog-primary-color));
392
+ --gog-info-text-color: var(--gog-accent-text-color, var(--gog-primary-color));
393
+
394
+ /* Which way a status fill deepens when it is hovered or held: **away from its own label**, so
395
+ the step always makes the label easier to read rather than harder. That is the theme's ink
396
+ for a fill wearing the accent's white, which is nine of the eleven themes — and the other way
397
+ round for the four fills whose label is the ink itself, `material`'s amber and `primeng`'s
398
+ three, which say so in their own files. Mixing toward a fixed colour instead is what a first
399
+ pass did, and it cost `primeng`'s info button 6.44:1 down to 4.23:1 on press: deepening
400
+ toward the ink walked the fill into the label. */
401
+ --gog-success-shade: var(--gog-text-color);
402
+ --gog-danger-shade: var(--gog-text-color);
403
+ --gog-warning-shade: var(--gog-text-color);
404
+ --gog-info-shade: var(--gog-text-color);
405
+ /* ── Stacking layers ─────────────────────────────────────────────────────────
406
+ All five read `--gog-z-base`, so the whole library moves together. The gaps are
407
+ deliberate: an app that needs to slot its own element between two of these has room
408
+ without touching the library's numbers. */
409
+ --gog-badge-z: calc(var(--gog-z-base) + 1);
410
+ --gog-toast-base-z: calc(var(--gog-z-base) + 100);
411
+ --gog-dropdown-z: calc(var(--gog-z-base) + 300);
412
+ --gog-tooltip-z: calc(var(--gog-z-base) + 400);
413
+ /* The blocking overlay outranks everything, including a dialog it may be covering. */
414
+ --gog-spinner-overlay-z: calc(var(--gog-z-base) + 8000);
415
+
416
+ --gog-space-2: calc(2px * var(--gog-density));
417
+ --gog-space-4: calc(4px * var(--gog-density));
418
+ --gog-space-6: calc(6px * var(--gog-density));
419
+ --gog-space-8: calc(8px * var(--gog-density));
420
+ --gog-space-10: calc(10px * var(--gog-density));
421
+ --gog-space-12: calc(12px * var(--gog-density));
422
+ --gog-space-14: calc(14px * var(--gog-density));
423
+ --gog-space-16: calc(16px * var(--gog-density));
424
+ --gog-space-18: calc(18px * var(--gog-density));
425
+ --gog-space-20: calc(20px * var(--gog-density));
426
+ --gog-space-24: calc(24px * var(--gog-density));
427
+ --gog-space-28: calc(28px * var(--gog-density));
428
+ --gog-space-32: calc(32px * var(--gog-density));
429
+ --gog-space-48: calc(48px * var(--gog-density));
430
+ --gog-space-xs: var(--gog-space-4);
431
+ --gog-space-sm: var(--gog-space-8);
432
+ --gog-space-md: var(--gog-space-16);
433
+ --gog-space-lg: var(--gog-space-24);
434
+ --gog-space-2xl: var(--gog-space-48);
435
+ --gog-control-padding-y: var(--gog-space-10);
436
+ --gog-control-padding-x: var(--gog-space-14);
437
+ --gog-control-checkbox-padding: var(--gog-space-6);
438
+ --gog-field-xsm-padding-y: var(--gog-space-4);
439
+ --gog-field-xsm-padding-x: var(--gog-space-8);
440
+ --gog-field-sm-padding-y: var(--gog-space-6);
441
+ --gog-field-sm-padding-x: var(--gog-space-10);
442
+ --gog-field-lg-padding-y: var(--gog-space-14);
443
+ --gog-field-lg-padding-x: var(--gog-space-18);
444
+ --gog-field-slg-padding-y: var(--gog-space-18);
445
+ --gog-field-slg-padding-x: var(--gog-space-20);
446
+ --gog-field-float-label-over-gap: var(--gog-space-8);
447
+ --gog-toast-gap: var(--gog-space-10);
448
+ --gog-toast-stack-padding: var(--gog-space-16);
449
+ --gog-field-xsm-icon-offset: var(--gog-space-6);
450
+ --gog-field-sm-icon-offset: var(--gog-space-8);
451
+ --gog-field-lg-icon-offset: var(--gog-space-14);
452
+ --gog-field-slg-icon-offset: var(--gog-space-18);
453
+ --gog-control-icon-offset: var(--gog-space-10);
454
+ --gog-elevated-surface-color: var(--gog-surface-color);
455
+ --gog-panel-radius: calc(var(--gog-radius) + 8px);
456
+ --gog-field-xsm-font-size: var(--gog-text-xs);
457
+ --gog-field-sm-font-size: var(--gog-text-sm);
458
+ /* The only field metric that is a type size; the rest of this block is geometry. It lives
459
+ here rather than with them because it reads a token, and a derived value declared on the
460
+ literals-only `:root` freezes to that scope's scale (rule C). */
461
+ --gog-field-slg-font-size: var(--gog-text-slg);
462
+
463
+ --gog-field-md-padding-y: var(--gog-control-padding-y);
464
+ --gog-field-md-padding-x: var(--gog-control-padding-x);
465
+
466
+ /* offset + glyph + offset — see the icon-chrome comment in the literal block above. */
467
+ --gog-field-xsm-icon-inset: calc(
468
+ var(--gog-field-xsm-icon-offset) * 2 + var(--gog-field-icon-glyph-xsm)
469
+ );
470
+ --gog-field-sm-icon-inset: calc(
471
+ var(--gog-field-sm-icon-offset) * 2 + var(--gog-field-icon-glyph-sm)
472
+ );
473
+ --gog-field-md-icon-inset: calc(
474
+ var(--gog-field-md-icon-offset) * 2 + var(--gog-field-icon-glyph)
475
+ );
476
+ --gog-field-lg-icon-inset: calc(
477
+ var(--gog-field-lg-icon-offset) * 2 + var(--gog-field-icon-glyph)
478
+ );
479
+ --gog-field-slg-icon-inset: calc(
480
+ var(--gog-field-slg-icon-offset) * 2 + var(--gog-field-icon-glyph)
481
+ );
482
+ --gog-field-md-font-size: var(--gog-text-md);
483
+ --gog-field-md-icon-offset: var(--gog-control-icon-offset);
484
+ --gog-field-lg-font-size: var(--gog-text-lg);
485
+
486
+ /* ══════════════════════════════════════════════════════════════════════════════
487
+ COMPONENT TOKENS
488
+ Everything below is what an individual component paints with. Override a block
489
+ to restyle just that component; the values themselves all derive from the
490
+ foundation tokens above, so a palette swap carries through for free.
491
+ ══════════════════════════════════════════════════════════════════════════════ */
492
+
493
+ /* ── Accordion ─────────────────────────────────────────────────────────────── */
494
+ --gog-accordion-font-family: var(--gog-font-heading);
495
+ --gog-accordion-body-font-family: var(--gog-font-body);
496
+ --gog-accordion-border-color: var(--gog-accent-dim);
497
+ --gog-accordion-border-width: var(--gog-control-border-width);
498
+ --gog-accordion-border-style: var(--gog-control-border-style);
499
+ --gog-accordion-text-color: var(--gog-text-color);
500
+ --gog-accordion-accent-color: var(--gog-accent-color);
501
+ --gog-accordion-hover-bg: var(--gog-hover-color);
502
+ /* The header's label stays body text while hovered or held, and the lift is carried by the
503
+ background alone. It turned `--gog-accordion-accent-color` until 21.9.0, which is the accent
504
+ — on an accent-tinted strip that measured 3.61:1 in light, 3.79:1 in one-light and 4.09:1 in
505
+ ledger, and worse again once the press deepened the tint. Same trade as the ghost button's
506
+ hover, and made for the same reason: the accent is not a text colour on a ground that is
507
+ itself tinted with the accent. */
508
+ --gog-accordion-hover-color: var(--gog-accordion-text-color);
509
+ --gog-accordion-press-bg: var(--gog-border-color);
510
+ --gog-accordion-hover-ring: var(--gog-accent-dim);
511
+ --gog-accordion-focus-ring-width: var(--gog-focus-ring-width);
512
+ --gog-accordion-body-color: var(--gog-text-color);
513
+ --gog-accordion-body-line-height: var(--gog-line-height-loose);
514
+ --gog-accordion-header-text-transform: var(--gog-text-transform);
515
+ --gog-accordion-header-gap: var(--gog-space-12);
516
+ --gog-accordion-disabled-opacity: var(--gog-disabled-opacity);
517
+ --gog-accordion-transition-duration: var(--gog-duration-base);
518
+ --gog-accordion-body-transition-duration: var(--gog-duration-slow);
519
+ --gog-accordion-chevron-transition-duration: var(--gog-duration-slow);
520
+ --gog-accordion-body-lift: -2px;
521
+ /* Flat by default — corner rounding is a look, not a given; consumers who want it
522
+ opt in per-instance or theme-wide by overriding these two. */
523
+ --gog-accordion-radius: 0px;
524
+ --gog-accordion-body-radius: 0px;
525
+ /* The header carries its own ground and the body does not. Both were `transparent` until
526
+ 21.7.1, which made every open item one continuous band: header and content painted the
527
+ surrounding surface, and the only thing between two open items was a hairline in the accent
528
+ colour. With several open at once nobody could tell where one ended and the next began.
529
+
530
+ Only the header changed. The body stays transparent on purpose, so an accordion dropped on
531
+ a coloured surface still sits on that colour rather than punching a hole in it. */
532
+ --gog-accordion-header-bg: var(--gog-hover-color);
533
+ --gog-accordion-body-bg: transparent;
534
+ /* Per-size metrics. `lg` is the default size. */
535
+ --gog-accordion-xsm-padding-y: var(--gog-space-4);
536
+ --gog-accordion-xsm-padding-x: var(--gog-space-8);
537
+ --gog-accordion-xsm-font-size: var(--gog-text-xs);
538
+ --gog-accordion-xsm-letter-spacing: 0.2px;
539
+ --gog-accordion-xsm-content-gap: var(--gog-space-2);
540
+ --gog-accordion-xsm-body-font-size: var(--gog-text-xs);
541
+ --gog-accordion-xsm-body-line-height: var(--gog-line-height-relaxed);
542
+ --gog-accordion-xsm-body-padding-top: var(--gog-space-4);
543
+ --gog-accordion-xsm-body-padding-bottom: var(--gog-space-6);
544
+ --gog-accordion-xsm-chevron-size: 11px;
545
+ --gog-accordion-xsm-chevron-font-size: 10px;
546
+
547
+ --gog-accordion-sm-padding-y: var(--gog-space-6);
548
+ --gog-accordion-sm-padding-x: var(--gog-space-10);
549
+ --gog-accordion-sm-font-size: var(--gog-text-xs);
550
+ --gog-accordion-sm-letter-spacing: 0.4px;
551
+ --gog-accordion-sm-content-gap: var(--gog-space-2);
552
+ --gog-accordion-sm-body-font-size: var(--gog-text-xs);
553
+ --gog-accordion-sm-body-line-height: var(--gog-accordion-body-line-height);
554
+ --gog-accordion-sm-body-padding-top: var(--gog-space-6);
555
+ --gog-accordion-sm-body-padding-bottom: var(--gog-space-8);
556
+ --gog-accordion-sm-chevron-size: 13px;
557
+ --gog-accordion-sm-chevron-font-size: 12px;
558
+
559
+ --gog-accordion-md-padding-y: var(--gog-space-10);
560
+ --gog-accordion-md-padding-x: var(--gog-space-14);
561
+ --gog-accordion-md-font-size: var(--gog-text-xs);
562
+ --gog-accordion-md-letter-spacing: 0.8px;
563
+ --gog-accordion-md-content-gap: var(--gog-space-2);
564
+ --gog-accordion-md-body-font-size: var(--gog-text-sm);
565
+ --gog-accordion-md-body-line-height: var(--gog-accordion-body-line-height);
566
+ --gog-accordion-md-body-padding-top: var(--gog-space-8);
567
+ --gog-accordion-md-body-padding-bottom: var(--gog-space-12);
568
+ --gog-accordion-md-chevron-size: 15px;
569
+ --gog-accordion-md-chevron-font-size: 14px;
570
+
571
+ --gog-accordion-lg-padding-y: var(--gog-space-14);
572
+ --gog-accordion-lg-padding-x: var(--gog-space-16);
573
+ --gog-accordion-lg-font-size: var(--gog-text-sm);
574
+ --gog-accordion-lg-letter-spacing: 0.8px;
575
+ --gog-accordion-lg-content-gap: var(--gog-space-4);
576
+ --gog-accordion-lg-body-font-size: var(--gog-text-md);
577
+ --gog-accordion-lg-body-line-height: var(--gog-accordion-body-line-height);
578
+ --gog-accordion-lg-body-padding-top: var(--gog-space-12);
579
+ --gog-accordion-lg-body-padding-bottom: var(--gog-space-16);
580
+ --gog-accordion-lg-chevron-size: 18px;
581
+ --gog-accordion-lg-chevron-font-size: 16px;
582
+
583
+ --gog-accordion-slg-padding-y: var(--gog-space-18);
584
+ --gog-accordion-slg-padding-x: var(--gog-space-18);
585
+ --gog-accordion-slg-font-size: var(--gog-text-md);
586
+ --gog-accordion-slg-letter-spacing: 0.8px;
587
+ --gog-accordion-slg-content-gap: var(--gog-space-4);
588
+ --gog-accordion-slg-body-font-size: var(--gog-text-lg);
589
+ --gog-accordion-slg-body-line-height: var(--gog-accordion-body-line-height);
590
+ --gog-accordion-slg-body-padding-top: var(--gog-space-16);
591
+ --gog-accordion-slg-body-padding-bottom: var(--gog-space-20);
592
+ --gog-accordion-slg-chevron-size: 20px;
593
+ --gog-accordion-slg-chevron-font-size: 18px;
594
+
595
+ /* ── Collapsible ───────────────────────────────────────────────────────────
596
+ No portal, no owned markup — see utilities.css for the actual `.gog-collapsible__*`
597
+ rules (they style content this component's consumer projects, which sits outside
598
+ `gog-collapsible`'s own view and can't be reached by its scoped stylesheet). */
599
+ --gog-collapsible-transition-duration: var(--gog-duration-slow);
600
+ /* The panel's natural height, so an open panel never truncates whatever it holds. This was
601
+ a fixed `480px` cap, which bought the CSS-only transition an animatable target but paid
602
+ for it by silently clipping any taller content — `overflow: hidden` means no scrollbar
603
+ and no other sign that the rest of the panel is missing. `max-content` still animates,
604
+ via `interpolate-size: allow-keywords` on the content element (see utilities.css); where
605
+ that is unsupported the panel snaps open instead of easing, which is the right way round
606
+ for the trade — losing an animation is visible and harmless, losing content is neither.
607
+ Set a length here to cap a particular panel on purpose; it will clip, as before. */
608
+ --gog-collapsible-max-height: max-content;
609
+ --gog-collapsible-disabled-opacity: var(--gog-disabled-opacity);
610
+
611
+ /* ── Button ────────────────────────────────────────────────────────────────
612
+ `--gog-button-bg`, `--gog-button-color`, `--gog-button-border`, `--gog-button-shadow`,
613
+ `--gog-button-hover-bg`, `--gog-button-hover-shadow`, `--gog-button-padding` and
614
+ `--gog-button-font-size` are intentionally NOT declared — they are the per-instance
615
+ escape hatch the variant/size classes fall back through. */
616
+ --gog-button-xsm-padding: var(--gog-space-4) var(--gog-space-8);
617
+ --gog-button-sm-padding: var(--gog-space-8) var(--gog-space-14);
618
+ --gog-button-md-padding: var(--gog-space-12) var(--gog-space-20);
619
+ --gog-button-lg-padding: var(--gog-space-16) var(--gog-space-24);
620
+ --gog-button-slg-padding: var(--gog-space-20) var(--gog-space-28);
621
+ --gog-button-xsm-font-size: var(--gog-text-xs);
622
+ --gog-button-sm-font-size: var(--gog-text-sm);
623
+ --gog-button-md-font-size: var(--gog-text-md);
624
+ --gog-button-lg-font-size: var(--gog-text-lg);
625
+ --gog-button-slg-font-size: var(--gog-text-slg);
626
+
627
+ --gog-button-font-family: var(--gog-font-heading);
628
+ --gog-button-font-weight: var(--gog-font-weight-heavy);
629
+ --gog-button-letter-spacing: var(--gog-letter-spacing);
630
+ --gog-button-text-transform: var(--gog-text-transform);
631
+ --gog-button-line-height: var(--gog-line-height-none);
632
+ --gog-button-gap: var(--gog-space-sm);
633
+ --gog-button-radius: var(--gog-radius);
634
+ --gog-button-border-width: var(--gog-control-border-width);
635
+ --gog-button-border-style: var(--gog-control-border-style);
636
+ --gog-button-transition-duration: var(--gog-duration-base);
637
+ --gog-button-focus-ring-width: var(--gog-focus-ring-width);
638
+ /* One pixel further out than the foundation ring: a filled surface needs the extra air for
639
+ the ring to read as separate from the fill. Written as the foundation plus that pixel
640
+ rather than a flat 3px, so a theme that moves the ring moves this with it. */
641
+ --gog-button-focus-ring-offset: calc(var(--gog-focus-ring-offset) + 1px);
642
+ /* Shipped since before the press had a colour, and left spelled `active` on purpose: renaming
643
+ a token consumers already override needs a deprecation cycle, and this is a patch. The state
644
+ it names is the same one `--gog-button-press-*` paints. */
645
+ --gog-button-active-scale: 0.97;
646
+ --gog-button-disabled-opacity: var(--gog-disabled-opacity);
647
+ --gog-button-loading-opacity: 0.7;
648
+ --gog-button-spinner-max-size: 70%;
649
+
650
+ --gog-button-primary-bg: var(--gog-accent-color);
651
+ --gog-button-primary-color: var(--gog-accent-text-color, var(--gog-primary-color));
652
+ --gog-button-primary-border: transparent;
653
+ --gog-button-primary-shadow: none;
654
+ --gog-button-primary-hover-bg: var(--gog-accent-bright);
655
+ --gog-button-primary-hover-color: var(--gog-button-primary-color);
656
+ --gog-button-primary-hover-shadow: 0 0 16px var(--gog-accent-pale);
657
+ /* The label's colour, not the page's. `--gog-text-color` is the colour of text on the page
658
+ background, and a filled button is not the page background — on the dark theme that put pale
659
+ parchment on bright amber, which read as a washed-out spinner beside a near-black label. */
660
+ --gog-button-primary-spinner-color: var(--gog-button-primary-color);
661
+
662
+ --gog-button-secondary-bg: var(--gog-secondary-color);
663
+ --gog-button-secondary-color: var(--gog-accent-text-color, var(--gog-primary-color));
664
+ --gog-button-secondary-border: transparent;
665
+ --gog-button-secondary-shadow: none;
666
+ --gog-button-secondary-hover-bg: var(--gog-accent-color);
667
+ --gog-button-secondary-hover-color: var(--gog-button-secondary-color);
668
+ --gog-button-secondary-hover-shadow: none;
669
+ /* Same reasoning as primary: the other filled variant, the same mismatch. */
670
+ --gog-button-secondary-spinner-color: var(--gog-button-secondary-color);
671
+
672
+ --gog-button-outline-bg: transparent;
673
+ --gog-button-outline-color: var(--gog-accent-color);
674
+ --gog-button-outline-border: var(--gog-accent-color);
675
+ --gog-button-outline-shadow: none;
676
+ --gog-button-outline-hover-bg: var(--gog-accent-color);
677
+ /* The label sits on the accent fill once the button is hovered, so it takes the token that
678
+ means "text on an accent fill" — the same one the two filled variants use. It read
679
+ `--gog-primary-color` until 21.9.0, which is the colour of text on the *page*, and the
680
+ result failed WCAG AA in all 11 shipped themes: 1.11:1 in one-dark, 1.41:1 in dark, 3.65:1
681
+ in light at best. It was invisible to `check:contrast` because that script had no pair for
682
+ this label, the same way it had none for the hover fill until 2026-08-29. It has both now. */
683
+ --gog-button-outline-hover-color: var(--gog-accent-text-color, var(--gog-primary-color));
684
+ --gog-button-outline-hover-shadow: none;
685
+ --gog-button-outline-spinner-color: var(--gog-accent-color);
686
+
687
+ --gog-button-ghost-bg: transparent;
688
+ --gog-button-ghost-color: var(--gog-accent-color);
689
+ --gog-button-ghost-border: transparent;
690
+ --gog-button-ghost-shadow: none;
691
+ --gog-button-ghost-hover-bg: var(--gog-hover-color);
692
+ /* The label leaves the accent while the ground is tinted, and that is the only thing that
693
+ works here. Ghost's resting label *is* `--gog-accent-color`, and its hover tints the ground
694
+ with the same accent, so the two walk toward each other: measured across all 11 themes, the
695
+ label fell under 4.5:1 in `light` (3.94), `primeng` (4.18) and `one-light` (4.22). No ground
696
+ fixes it — a half-strength wash, a neutral `--gog-hover-color`, a text scrim and an
697
+ accent-dim wash were all measured, and `light` fails every one of them, because
698
+ `--gog-accent-color` as *text* on that theme's own background is 4.60:1 with no headroom to
699
+ spend. Moving the label to `--gog-text-color` clears 5.29:1 at worst (one-dark) and leaves
700
+ the ground exactly as it was, so the hover stays the subtle wash this variant is documented
701
+ to have. The press then goes the other way and fills — see `-press-bg` below. */
702
+ --gog-button-ghost-hover-color: var(--gog-text-color);
703
+ --gog-button-ghost-hover-shadow: none;
704
+ --gog-button-ghost-spinner-color: var(--gog-accent-color);
705
+
706
+ /* The held state, and the reason it is a colour rather than only the `--gog-button-active-scale`
707
+ it used to be: `prefers-reduced-motion` switches that transform off, which left a button with
708
+ no press feedback at all for the readers most likely to need it. A colour change is a state,
709
+ not a movement — reduced motion keeps it and only drops the scale, and with transitions off it
710
+ lands instantly. See docs/feedback-triage.md's closing section: reduced motion must remove the
711
+ animation, not the information.
712
+
713
+ Each variant goes one step *deeper* than its own hover, so pressing is distinguishable while
714
+ hovering, which is the normal case for a pointer. `--gog-accent-dim` is that step for the
715
+ three accent-carrying variants; ghost has no fill of its own to deepen, so it takes a
716
+ stronger wash of the same tint its hover uses (see the @supports block at the end of this
717
+ file for the mixed value and why the flat one above it is not a fallback but the value). */
718
+ /* The *toggle* state — `aria-pressed="true"`, a button that stays on — as an inset ring rather
719
+ than a fill. A fill cannot carry it: every other state already owns the background, so a
720
+ toggled button that is also hovered or held would lose the one thing saying it is on. A ring
721
+ composes with all of them, and it is the same reasoning that made `gog-button-toggle-group`'s
722
+ selected option a fill: there, nothing else was competing for the background.
723
+
724
+ The ring takes the colour that is guaranteed to read on its own variant — the label colour on
725
+ the filled two, the accent on the transparent two — so both are pairs `check:contrast`
726
+ already gates. While toggled, this replaces the variant's `box-shadow`, which costs
727
+ `primary` its hover glow: the ring is state and the glow is decoration, and a `box-shadow`
728
+ list cannot hold `none` as a layer, so keeping both was not on offer. */
729
+ --gog-button-toggled-ring-width: 2px;
730
+ --gog-button-primary-toggled-shadow: inset 0 0 0 var(--gog-button-toggled-ring-width)
731
+ var(--gog-accent-text-color, var(--gog-primary-color));
732
+ --gog-button-secondary-toggled-shadow: var(--gog-button-primary-toggled-shadow);
733
+ --gog-button-outline-toggled-shadow: inset 0 0 0 var(--gog-button-toggled-ring-width)
734
+ var(--gog-accent-color);
735
+ --gog-button-ghost-toggled-shadow: var(--gog-button-outline-toggled-shadow);
736
+
737
+ --gog-button-primary-press-bg: var(--gog-accent-dim);
738
+ --gog-button-primary-press-color: var(--gog-button-primary-color);
739
+ --gog-button-secondary-press-bg: var(--gog-accent-dim);
740
+ --gog-button-secondary-press-color: var(--gog-button-secondary-color);
741
+ --gog-button-outline-press-bg: var(--gog-accent-dim);
742
+ --gog-button-outline-press-color: var(--gog-button-outline-hover-color);
743
+ /* Ghost presses to the same deep fill as outline, rather than to a wash like every other
744
+ surface in this file. Measured across all 11 themes: a wash cannot work here, because this
745
+ button's *label* is the accent, so tinting its ground with the accent walks the two together
746
+ — a 24% wash put the label under 4.5:1 in seven themes, and `--gog-accent-pale` was either
747
+ no better or invisible against the hover. A filled press moves the label to
748
+ `--gog-accent-text-color` instead, which is the pair `check:contrast` already gates, so no
749
+ future theme can quietly break it. The other eight surfaces keep their washes: their labels
750
+ are body text, and their worst case across the 11 is 4.80:1. */
751
+ --gog-button-ghost-press-bg: var(--gog-accent-dim);
752
+ --gog-button-ghost-press-color: var(--gog-accent-text-color, var(--gog-primary-color));
753
+
754
+ /* ── Button severity ─────────────────────────────────────────────────────────
755
+ `severity` is orthogonal to `variant`: a destructive action can be a filled button, an
756
+ outlined one or a ghost, and it is still destructive. So this is not a fifth variant — it
757
+ re-points the *ingredients* the four variants are built from, and the shape rules in
758
+ `styles/button.css` apply them per variant. Four severities x six ingredients rather than
759
+ four x four variants x eleven properties, which is what a fifth-variant reading would have
760
+ cost.
761
+
762
+ `-fill` and `-on-fill` are the filled pair, and `-on-fill` is `--gog-<status>-text-color`
763
+ rather than `--gog-accent-text-color`: see that block near the top of this file for why one
764
+ label does not read on every status.
765
+
766
+ `-ink` is the label a *transparent* variant paints, and it is not the raw status colour. As
767
+ text on the page, the raw hue clears 4.5:1 in only five of the eleven themes — `primeng`'s
768
+ amber manages 2.05:1 — so it is mixed toward the theme's own ink until it does. The 50% is
769
+ measured rather than chosen: `material`'s amber is the binding case and needs the hue below
770
+ 54%, so 50 clears every theme with a little headroom. It costs saturation on the themes that
771
+ never needed it; a theme that wants the colour back overrides `--gog-button-<status>-ink`
772
+ directly, which is one token rather than a dial nobody would find. Mixing toward `--gog-text-color` rather than a
773
+ fixed black is what makes one number work on light and dark alike — the ink is dark on one
774
+ and light on the other, and both directions move *away* from the ground.
775
+
776
+ The hover and press fills move the same way, one small step and one larger, so a severity
777
+ button's states step the way an accent one's do. Moving toward the ink also moves away from
778
+ `-on-fill` in the seven themes where that is the accent's white-or-near-black, so the label
779
+ gets easier rather than harder; in the four where `-on-fill` *is* the ink, the rest state
780
+ starts at 6.44:1 or better and a 24% step cannot spend that. The flat values here are what a
781
+ browser without `color-mix()` renders — no step, the same graceful nothing the ghost button
782
+ degrades to — and the mixed ones are in the @supports block at the end of this file. */
783
+ --gog-button-success-fill: var(--gog-success-color);
784
+ --gog-button-success-on-fill: var(--gog-success-text-color);
785
+ --gog-button-success-fill-hover: var(--gog-success-color);
786
+ --gog-button-success-fill-press: var(--gog-success-color);
787
+ --gog-button-success-ink: var(--gog-success-color);
788
+ --gog-button-success-wash: transparent;
789
+
790
+ --gog-button-danger-fill: var(--gog-danger-color);
791
+ --gog-button-danger-on-fill: var(--gog-danger-text-color);
792
+ --gog-button-danger-fill-hover: var(--gog-danger-color);
793
+ --gog-button-danger-fill-press: var(--gog-danger-color);
794
+ --gog-button-danger-ink: var(--gog-danger-color);
795
+ --gog-button-danger-wash: transparent;
796
+
797
+ --gog-button-warning-fill: var(--gog-warning-color);
798
+ --gog-button-warning-on-fill: var(--gog-warning-text-color);
799
+ --gog-button-warning-fill-hover: var(--gog-warning-color);
800
+ --gog-button-warning-fill-press: var(--gog-warning-color);
801
+ --gog-button-warning-ink: var(--gog-warning-color);
802
+ --gog-button-warning-wash: transparent;
803
+
804
+ --gog-button-info-fill: var(--gog-info-color);
805
+ --gog-button-info-on-fill: var(--gog-info-text-color);
806
+ --gog-button-info-fill-hover: var(--gog-info-color);
807
+ --gog-button-info-fill-press: var(--gog-info-color);
808
+ --gog-button-info-ink: var(--gog-info-color);
809
+ --gog-button-info-wash: transparent;
810
+
811
+ /* ── Button toggle group ───────────────────────────────────────────────────
812
+ `--gog-button-toggle-bg`, `-color`, `-padding` and `-font-size` are intentionally NOT
813
+ declared — they are the per-instance escape hatch the size classes fall back through.
814
+ Padding/font-size reuse the `--gog-button-<size>-*` scale so a toggle group and a
815
+ `<gog-button>` at the same `size` line up in a toolbar. */
816
+ --gog-button-toggle-font-family: var(--gog-font-heading);
817
+ --gog-button-toggle-font-weight: var(--gog-font-weight-bold);
818
+ --gog-button-toggle-letter-spacing: 0.5px;
819
+ --gog-button-toggle-text-transform: var(--gog-text-transform);
820
+ --gog-button-toggle-line-height: var(--gog-line-height-none);
821
+ --gog-button-toggle-gap: var(--gog-space-sm);
822
+ --gog-button-toggle-icon-size: 1.1em;
823
+ --gog-button-toggle-radius: var(--gog-radius);
824
+ --gog-button-toggle-border-width: var(--gog-control-border-width);
825
+ --gog-button-toggle-border-style: var(--gog-control-border-style);
826
+ --gog-button-toggle-border-color: var(--gog-border-color);
827
+ --gog-button-toggle-rest-bg: transparent;
828
+ --gog-button-toggle-rest-color: var(--gog-text-color);
829
+ --gog-button-toggle-hover-bg: var(--gog-hover-color);
830
+ --gog-button-toggle-press-bg: var(--gog-border-color);
831
+ --gog-button-toggle-hover-color: var(--gog-text-color);
832
+ --gog-button-toggle-selected-bg: var(--gog-accent-color);
833
+ --gog-button-toggle-selected-color: var(--gog-accent-text-color, var(--gog-primary-color));
834
+ --gog-button-toggle-selected-border-color: var(--gog-accent-color);
835
+ /* A selected option is already filled with the accent, so its press deepens the fill the way
836
+ the filled button variants do rather than washing over it. */
837
+ --gog-button-toggle-selected-press-bg: var(--gog-accent-dim);
838
+ --gog-button-toggle-separated-gap: var(--gog-space-sm);
839
+ --gog-button-toggle-transition-duration: var(--gog-duration-base);
840
+ --gog-button-toggle-disabled-opacity: var(--gog-disabled-opacity);
841
+ --gog-button-toggle-focus-ring-width: var(--gog-focus-ring-width);
842
+ --gog-button-toggle-focus-ring-offset: var(--gog-focus-ring-offset);
843
+ --gog-button-toggle-focus-ring-color: var(--gog-accent-color);
844
+
845
+ /* ── Calendar (the month grid inside gog-datepicker, and gog-calendar on its own) ── */
846
+ --gog-calendar-font-family: var(--gog-font-body);
847
+ --gog-calendar-color: var(--gog-text-color);
848
+ /* Caps the host at its month grid instead of letting the header spread to the container.
849
+ `100%` restores the pre-21.5.0 full-width behaviour. */
850
+ --gog-calendar-max-width: max-content;
851
+ --gog-calendar-padding: var(--gog-space-12);
852
+ --gog-calendar-header-gap: var(--gog-space-4);
853
+ --gog-calendar-header-margin: var(--gog-space-8);
854
+ --gog-calendar-months-gap: var(--gog-space-16);
855
+ --gog-calendar-title-color: var(--gog-text-color);
856
+ --gog-calendar-title-font-weight: var(--gog-font-weight-bold);
857
+ --gog-calendar-nav-size: 28px;
858
+ --gog-calendar-nav-radius: calc(var(--gog-radius) - 2px);
859
+ --gog-calendar-nav-bg: transparent;
860
+ --gog-calendar-nav-color: var(--gog-muted-text-color);
861
+ --gog-calendar-nav-hover-bg: var(--gog-hover-color);
862
+ --gog-calendar-nav-hover-color: var(--gog-text-color);
863
+ --gog-calendar-nav-icon-size: 0.8rem;
864
+ /* Pulls the two chevrons of a year step together so they read as one control. */
865
+ --gog-calendar-nav-icon-overlap: -0.35em;
866
+ --gog-calendar-weekday-padding: var(--gog-space-4) 0;
867
+ --gog-calendar-weekday-color: var(--gog-muted-text-color);
868
+ --gog-calendar-weekday-font-size: var(--gog-text-xs);
869
+ --gog-calendar-weekday-font-weight: var(--gog-font-weight-semibold);
870
+ --gog-calendar-weekday-text-transform: var(--gog-text-transform);
871
+ --gog-calendar-day-radius: calc(var(--gog-radius) - 2px);
872
+ --gog-calendar-day-border-width: var(--gog-border-width);
873
+ --gog-calendar-day-border-style: var(--gog-border-style);
874
+ --gog-calendar-day-rest-bg: transparent;
875
+ --gog-calendar-day-rest-color: var(--gog-text-color);
876
+ --gog-calendar-day-hover-bg: var(--gog-hover-color);
877
+ --gog-calendar-day-outside-color: var(--gog-muted-text-color);
878
+ --gog-calendar-today-border-color: var(--gog-accent-color);
879
+ --gog-calendar-today-font-weight: var(--gog-font-weight-bold);
880
+ --gog-calendar-selected-bg: var(--gog-accent-color);
881
+ --gog-calendar-selected-color: var(--gog-accent-text-color, var(--gog-primary-color));
882
+ --gog-calendar-selected-font-weight: var(--gog-font-weight-bold);
883
+ /* The wash between the two ends of a range: same hue, low enough to read as a band rather
884
+ than as a second selection. */
885
+ --gog-calendar-range-bg: var(--gog-accent-pale);
886
+ --gog-calendar-range-color: var(--gog-text-color);
887
+ --gog-calendar-disabled-opacity: var(--gog-disabled-opacity);
888
+ --gog-calendar-transition-duration: var(--gog-duration-fast);
889
+ --gog-calendar-focus-ring-width: var(--gog-focus-ring-width);
890
+ /* Inset rather than outset: the month grid packs its cells edge to edge, so an outward ring
891
+ would sit on top of the neighbouring day. Negated from the foundation so a theme still
892
+ controls how far it sits from the cell edge. */
893
+ --gog-calendar-focus-ring-offset: calc(var(--gog-focus-ring-offset) * -1);
894
+ --gog-calendar-focus-ring-color: var(--gog-accent-color);
895
+ --gog-calendar-divider-width: 1px;
896
+ --gog-calendar-divider-style: solid;
897
+ --gog-calendar-divider-color: var(--gog-border-color);
898
+ --gog-calendar-time-gap: var(--gog-space-6);
899
+ --gog-calendar-time-margin: var(--gog-space-10);
900
+ --gog-calendar-time-input-width: 3.5rem;
901
+ --gog-calendar-time-input-padding: var(--gog-space-4) var(--gog-space-6);
902
+ --gog-calendar-time-input-bg: var(--gog-background-color);
903
+ --gog-calendar-action-padding: var(--gog-space-4) var(--gog-space-10);
904
+ --gog-calendar-footer-gap: var(--gog-space-8);
905
+ --gog-calendar-xsm-font-size: var(--gog-text-xs);
906
+ --gog-calendar-xsm-day-size: 24px;
907
+ --gog-calendar-sm-font-size: var(--gog-text-sm);
908
+ --gog-calendar-sm-day-size: 28px;
909
+ --gog-calendar-md-font-size: var(--gog-text-sm);
910
+ --gog-calendar-md-day-size: 34px;
911
+ --gog-calendar-lg-font-size: var(--gog-text-md);
912
+ --gog-calendar-lg-day-size: 40px;
913
+ --gog-calendar-slg-font-size: var(--gog-text-lg);
914
+ --gog-calendar-slg-day-size: 46px;
915
+
916
+ /* ── Card ──────────────────────────────────────────────────────────────────
917
+ `--gog-card-bg`, `--gog-card-border-color`, `--gog-card-shadow`, `--gog-card-padding-y`,
918
+ `--gog-card-padding-x` and `--gog-card-gap` are intentionally NOT declared — they are the
919
+ per-instance escape hatch the variant and size classes fall back through. */
920
+ --gog-card-font-family: var(--gog-font-body);
921
+ --gog-card-color: var(--gog-text-color);
922
+ --gog-card-radius: var(--gog-radius);
923
+ --gog-card-border-width: var(--gog-panel-border-width);
924
+ --gog-card-border-style: var(--gog-panel-border-style);
925
+ --gog-card-transition-duration: var(--gog-duration-base);
926
+
927
+ --gog-card-heading-color: var(--gog-text-color);
928
+ --gog-card-heading-font-family: var(--gog-font-heading);
929
+ --gog-card-heading-font-size: var(--gog-text-lg);
930
+ --gog-card-heading-font-weight: var(--gog-font-weight-semibold);
931
+ --gog-card-heading-line-height: var(--gog-line-height-snug);
932
+
933
+ --gog-card-outlined-bg: var(--gog-surface-color);
934
+ --gog-card-outlined-border-color: var(--gog-border-color);
935
+ --gog-card-outlined-shadow: none;
936
+ --gog-card-elevated-bg: var(--gog-elevated-surface-color);
937
+ --gog-card-elevated-border-color: transparent;
938
+ /* The shared surface shadow, so a card sits at the same elevation as a dialog or a
939
+ dropdown panel instead of inventing a second house style for "raised". */
940
+ --gog-card-elevated-shadow: var(--gog-panel-shadow);
941
+ --gog-card-filled-bg: var(--gog-accent-pale);
942
+ --gog-card-filled-border-color: transparent;
943
+ --gog-card-filled-shadow: none;
944
+
945
+ /* Hover and focus only ever show on a card that holds a `gogCardLink`. */
946
+ --gog-card-hover-border-color: var(--gog-accent-dim);
947
+ --gog-card-hover-shadow: var(--gog-panel-shadow);
948
+ --gog-card-focus-ring: var(--gog-accent-color);
949
+ --gog-card-focus-ring-width: var(--gog-focus-ring-width);
950
+ --gog-card-focus-ring-offset: var(--gog-focus-ring-offset);
951
+ --gog-card-disabled-opacity: var(--gog-disabled-opacity);
952
+
953
+ --gog-card-footer-border-color: var(--gog-border-color);
954
+ --gog-card-footer-gap: var(--gog-space-sm);
955
+ --gog-card-footer-padding-top: var(--gog-space-sm);
956
+
957
+ --gog-card-xsm-padding-y: var(--gog-space-8);
958
+ --gog-card-xsm-padding-x: var(--gog-space-10);
959
+ --gog-card-xsm-gap: var(--gog-space-6);
960
+ --gog-card-sm-padding-y: var(--gog-space-12);
961
+ --gog-card-sm-padding-x: var(--gog-space-14);
962
+ --gog-card-sm-gap: var(--gog-space-sm);
963
+ --gog-card-md-padding-y: var(--gog-space-md);
964
+ --gog-card-md-padding-x: var(--gog-space-20);
965
+ --gog-card-md-gap: var(--gog-space-12);
966
+ --gog-card-lg-padding-y: var(--gog-space-20);
967
+ --gog-card-lg-padding-x: var(--gog-space-lg);
968
+ --gog-card-lg-gap: var(--gog-space-14);
969
+ --gog-card-slg-padding-y: var(--gog-space-28);
970
+ --gog-card-slg-padding-x: var(--gog-space-32);
971
+ --gog-card-slg-gap: var(--gog-space-md);
972
+
973
+ /* ── Checkbox ──────────────────────────────────────────────────────────────
974
+ Box/label/icon size and padding come from the `--gog-control-checkbox-*` scale;
975
+ checkbox.component.ts maps the `size` input onto the host. */
976
+ --gog-checkbox-font-family: var(--gog-font-body);
977
+ --gog-checkbox-gap: var(--gog-space-10);
978
+ --gog-checkbox-radius: var(--gog-radius);
979
+ --gog-checkbox-border-width: var(--gog-control-border-width);
980
+ --gog-checkbox-border-style: var(--gog-control-border-style);
981
+ --gog-checkbox-border-color: var(--gog-accent-dim);
982
+ --gog-checkbox-bg: var(--gog-surface-color);
983
+ --gog-checkbox-checked-bg: var(--gog-accent-color);
984
+ --gog-checkbox-checked-border: var(--gog-accent-color);
985
+ --gog-checkbox-icon-color: var(--gog-accent-text-color, var(--gog-primary-color));
986
+ --gog-checkbox-label-color: var(--gog-muted-text-color);
987
+ --gog-checkbox-label-line-height: var(--gog-line-height-snug);
988
+ --gog-checkbox-focus-ring: var(--gog-accent-pale);
989
+ --gog-checkbox-focus-ring-width: var(--gog-focus-ring-width);
990
+ --gog-checkbox-focus-ring-offset: var(--gog-focus-ring-offset);
991
+ --gog-checkbox-disabled-opacity: var(--gog-disabled-opacity);
992
+ --gog-checkbox-transition-duration: var(--gog-duration-base);
993
+ --gog-checkbox-dash-width-ratio: 0.45;
994
+ --gog-checkbox-dash-height: 2px;
995
+ --gog-checkbox-dash-radius: 999px;
996
+
997
+ /* ── Radio group ───────────────────────────────────────────────────────────
998
+ Box/label size reuse the `--gog-control-checkbox-*` scale (see Checkbox above);
999
+ radio-group.component.ts maps the `size` input onto the host the same way. */
1000
+ --gog-radio-font-family: var(--gog-font-body);
1001
+ --gog-radio-group-gap: var(--gog-space-10);
1002
+ --gog-radio-group-label-size: var(--gog-text-sm);
1003
+ --gog-radio-group-label-color: var(--gog-muted-text-color);
1004
+ --gog-radio-group-option-gap: var(--gog-space-8);
1005
+ --gog-radio-group-option-gap-horizontal: var(--gog-space-20);
1006
+ --gog-radio-gap: var(--gog-space-10);
1007
+ --gog-radio-border-width: var(--gog-control-border-width);
1008
+ --gog-radio-border-style: var(--gog-control-border-style);
1009
+ --gog-radio-border-color: var(--gog-accent-dim);
1010
+ --gog-radio-bg: var(--gog-surface-color);
1011
+ --gog-radio-checked-bg: var(--gog-surface-color);
1012
+ --gog-radio-checked-border: var(--gog-accent-color);
1013
+ --gog-radio-dot-color: var(--gog-accent-color);
1014
+ --gog-radio-dot-size-ratio: 0.45;
1015
+ --gog-radio-label-color: var(--gog-muted-text-color);
1016
+ --gog-radio-label-line-height: var(--gog-line-height-snug);
1017
+ --gog-radio-focus-ring: var(--gog-accent-pale);
1018
+ --gog-radio-focus-ring-width: var(--gog-focus-ring-width);
1019
+ --gog-radio-focus-ring-offset: var(--gog-focus-ring-offset);
1020
+ --gog-radio-disabled-opacity: var(--gog-disabled-opacity);
1021
+ --gog-radio-transition-duration: var(--gog-duration-base);
1022
+ --gog-radio-error-font-size: var(--gog-text-xs);
1023
+ --gog-radio-error-color: var(--gog-danger-color);
1024
+
1025
+ /* ── Chip ──────────────────────────────────────────────────────────────────
1026
+ `--gog-chip-*` size tokens below are the per-size scale; the unsuffixed
1027
+ `--gog-chip-font-size`/`-padding-*`/`-gap`/`-avatar-size`/`-icon-size`/
1028
+ `-remove-size` are left undeclared as the per-instance escape hatch. */
1029
+ --gog-chip-font-family: inherit;
1030
+ --gog-chip-bg: var(--gog-surface-color);
1031
+ --gog-chip-hover-bg: var(--gog-hover-color);
1032
+ --gog-chip-press-bg: var(--gog-border-color);
1033
+ --gog-chip-border: var(--gog-border-color);
1034
+ --gog-chip-border-width: var(--gog-border-width);
1035
+ --gog-chip-border-style: var(--gog-border-style);
1036
+ --gog-chip-color: var(--gog-text-color);
1037
+ --gog-chip-font-weight: var(--gog-font-weight-medium);
1038
+ --gog-chip-line-height: var(--gog-line-height-tight);
1039
+ --gog-chip-radius: max(var(--gog-radius), 2px);
1040
+ --gog-chip-pill-radius: 9999px;
1041
+ --gog-chip-remove-color: var(--gog-muted-text-color);
1042
+ --gog-chip-remove-hover-color: var(--gog-text-color);
1043
+ --gog-chip-remove-scale: 1.1;
1044
+ --gog-chip-avatar-inset-ratio: 0.9;
1045
+ --gog-chip-remove-inset-ratio: 0.85;
1046
+ --gog-chip-disabled-opacity: var(--gog-disabled-opacity);
1047
+ /* A selected filter chip (`[(selected)]`, 21.9.0). An inset ring for the reason
1048
+ `--gog-button-primary-toggled-shadow` gives: hover and press own the background, and a
1049
+ selected chip has to stay selected while it is also hovered or held. The accent, so it is
1050
+ the same pair the focus ring is already gated on — and unlike the button there is only one
1051
+ chip variant, so one token covers it. Override this token on the host to restyle a single
1052
+ chip. */
1053
+ --gog-chip-selected-ring-width: 2px;
1054
+ --gog-chip-selected-shadow: inset 0 0 0 var(--gog-chip-selected-ring-width)
1055
+ var(--gog-accent-color);
1056
+ --gog-chip-focus-ring-width: 2px;
1057
+ --gog-chip-focus-ring-offset: var(--gog-focus-ring-offset);
1058
+
1059
+ --gog-chip-xsm-font-size: 0.6875rem;
1060
+ --gog-chip-xsm-padding-block: var(--gog-space-4);
1061
+ --gog-chip-xsm-padding-inline: var(--gog-space-6);
1062
+ --gog-chip-xsm-gap: var(--gog-space-4);
1063
+ --gog-chip-xsm-avatar-size: 0.875rem;
1064
+ --gog-chip-xsm-icon-size: 0.6875rem;
1065
+ --gog-chip-xsm-remove-size: 0.75rem;
1066
+
1067
+ --gog-chip-sm-font-size: var(--gog-text-xs);
1068
+ --gog-chip-sm-padding-block: var(--gog-space-4);
1069
+ --gog-chip-sm-padding-inline: var(--gog-space-8);
1070
+ --gog-chip-sm-gap: var(--gog-space-6);
1071
+ --gog-chip-sm-avatar-size: 1rem;
1072
+ --gog-chip-sm-icon-size: 0.75rem;
1073
+ --gog-chip-sm-remove-size: 0.875rem;
1074
+
1075
+ --gog-chip-md-font-size: var(--gog-text-sm);
1076
+ --gog-chip-md-padding-block: var(--gog-space-8);
1077
+ --gog-chip-md-padding-inline: var(--gog-space-12);
1078
+ --gog-chip-md-gap: var(--gog-space-8);
1079
+ --gog-chip-md-avatar-size: 1.25rem;
1080
+ --gog-chip-md-icon-size: 0.875rem;
1081
+ --gog-chip-md-remove-size: 1rem;
1082
+
1083
+ --gog-chip-lg-font-size: var(--gog-text-md);
1084
+ --gog-chip-lg-padding-block: var(--gog-space-10);
1085
+ --gog-chip-lg-padding-inline: var(--gog-space-14);
1086
+ --gog-chip-lg-gap: var(--gog-space-10);
1087
+ --gog-chip-lg-avatar-size: 1.5rem;
1088
+ --gog-chip-lg-icon-size: 1rem;
1089
+ --gog-chip-lg-remove-size: 1.125rem;
1090
+
1091
+ --gog-chip-slg-font-size: var(--gog-text-lg);
1092
+ --gog-chip-slg-padding-block: var(--gog-space-12);
1093
+ --gog-chip-slg-padding-inline: var(--gog-space-16);
1094
+ --gog-chip-slg-gap: var(--gog-space-12);
1095
+ --gog-chip-slg-avatar-size: 1.75rem;
1096
+ --gog-chip-slg-icon-size: 1.125rem;
1097
+ --gog-chip-slg-remove-size: 1.25rem;
1098
+
1099
+ /* ── Dialog ────────────────────────────────────────────────────────────────── */
1100
+ --gog-dialog-font-family: var(--gog-font-heading);
1101
+ /* Deliberately a flat value rather than a palette derivation: the scrim has to read
1102
+ the same over any page content. Restate it per theme if a lighter wash suits. */
1103
+ --gog-dialog-backdrop-bg: rgba(10, 8, 3, 0.72);
1104
+ --gog-dialog-backdrop-blur: 2px;
1105
+ --gog-dialog-backdrop-padding: var(--gog-space-lg);
1106
+ --gog-dialog-backdrop-fade-duration: var(--gog-duration-base);
1107
+ --gog-dialog-enter-duration: var(--gog-duration-slow);
1108
+ --gog-dialog-enter-distance: -12px;
1109
+ --gog-dialog-bg: var(--gog-surface-color);
1110
+ --gog-dialog-color: var(--gog-text-color);
1111
+ --gog-dialog-border: var(--gog-border-color);
1112
+ --gog-dialog-border-width: var(--gog-panel-border-width);
1113
+ --gog-dialog-border-style: var(--gog-panel-border-style);
1114
+ --gog-dialog-radius: var(--gog-radius);
1115
+ --gog-dialog-shadow: 0 24px 48px rgba(0, 0, 0, 0.5);
1116
+ --gog-dialog-min-width: 320px;
1117
+ --gog-dialog-max-height: 90vh;
1118
+ --gog-dialog-header-padding: var(--gog-space-16) var(--gog-space-20) var(--gog-space-14);
1119
+ --gog-dialog-header-gap: var(--gog-space-12);
1120
+ --gog-dialog-header-border-color: var(--gog-border-color);
1121
+ --gog-dialog-body-padding: var(--gog-space-20);
1122
+ --gog-dialog-body-max-height: calc(var(--gog-dialog-max-height) - 60px);
1123
+ --gog-dialog-close-size: 2rem;
1124
+ --gog-dialog-close-font-size: var(--gog-text-sm);
1125
+ --gog-dialog-close-color: var(--gog-muted-text-color);
1126
+ --gog-dialog-close-hover-color: var(--gog-text-color);
1127
+ --gog-dialog-close-hover-bg: var(--gog-hover-color);
1128
+ --gog-dialog-close-hover-border: var(--gog-border-color);
1129
+ --gog-dialog-close-focus-ring: var(--gog-accent-color);
1130
+ --gog-dialog-close-focus-ring-width: var(--gog-focus-ring-width);
1131
+ --gog-dialog-close-focus-ring-offset: var(--gog-focus-ring-offset);
1132
+
1133
+ /* Confirmation dialog */
1134
+ --gog-confirmation-dialog-gap: var(--gog-space-12);
1135
+ --gog-confirmation-dialog-min-width: 320px;
1136
+ --gog-confirmation-dialog-max-width: 440px;
1137
+ --gog-confirmation-dialog-color: var(--gog-text-color);
1138
+ --gog-confirmation-dialog-description-color: var(--gog-muted-text-color);
1139
+ --gog-confirmation-dialog-actions-gap: var(--gog-space-sm);
1140
+ --gog-confirmation-dialog-actions-offset: var(--gog-space-sm);
1141
+
1142
+ /* ── Autocomplete ──────────────────────────────────────────────────────────
1143
+ A combobox whose trigger is a real text input. Padding/font-size reuse the shared
1144
+ `--gog-field-<size>-*` scale, so it lines up with `gog-inputfield` and `gog-select` in a
1145
+ form. `--gog-autocomplete-bg`, `-color`, `-font-size`, `-padding-x` and `-padding-y` are
1146
+ intentionally NOT declared — they are the per-instance escape hatch the size classes fall
1147
+ back through. */
1148
+ --gog-autocomplete-font-family: var(--gog-font-body);
1149
+ --gog-autocomplete-label-font-family: var(--gog-font-heading);
1150
+ --gog-autocomplete-gap: var(--gog-space-4);
1151
+ --gog-autocomplete-label-color: var(--gog-accent-color);
1152
+ --gog-autocomplete-label-font-size: var(--gog-text-sm);
1153
+ --gog-autocomplete-label-font-weight: var(--gog-font-weight-semibold);
1154
+ --gog-autocomplete-label-letter-spacing: var(--gog-letter-spacing);
1155
+ --gog-autocomplete-label-text-transform: var(--gog-text-transform);
1156
+ --gog-autocomplete-field-bg: var(--gog-surface-color);
1157
+ --gog-autocomplete-text-color: var(--gog-text-color);
1158
+ --gog-autocomplete-placeholder-color: var(--gog-muted-text-color);
1159
+ --gog-autocomplete-border-width: var(--gog-control-border-width);
1160
+ --gog-autocomplete-border-style: var(--gog-control-border-style);
1161
+ --gog-autocomplete-border-color: var(--gog-accent-dim);
1162
+ --gog-autocomplete-hover-border-color: var(--gog-accent-color);
1163
+ --gog-autocomplete-radius: var(--gog-radius);
1164
+ --gog-autocomplete-line-height: var(--gog-line-height-normal);
1165
+ --gog-autocomplete-transition-duration: var(--gog-duration-base);
1166
+ --gog-autocomplete-disabled-opacity: var(--gog-disabled-opacity);
1167
+ --gog-autocomplete-focus-ring-width: var(--gog-focus-ring-width);
1168
+ --gog-autocomplete-focus-ring-offset: var(--gog-focus-ring-offset);
1169
+ --gog-autocomplete-focus-ring-color: var(--gog-accent-color);
1170
+ --gog-autocomplete-error-color: var(--gog-danger-color);
1171
+ --gog-autocomplete-error-border-color: var(--gog-danger-color);
1172
+ --gog-autocomplete-error-font-family: var(--gog-font-body);
1173
+ --gog-autocomplete-error-font-size: var(--gog-text-xs);
1174
+ /* Floor for an auto-width field, so [fullWidth]="false" cannot collapse it to its chrome. */
1175
+ --gog-autocomplete-min-width: 120px;
1176
+ /* Trailing chrome: spinner and clear button, clear outermost — the arrangement the other
1177
+ dropdowns settled on, so all of them line up in a form. */
1178
+ --gog-autocomplete-actions-inset: var(--gog-control-icon-offset);
1179
+ --gog-autocomplete-actions-gap: var(--gog-space-6);
1180
+ /* Right padding on the input, reserving room for the actions above. */
1181
+ --gog-autocomplete-actions-reserve: 40px;
1182
+ --gog-autocomplete-clear-color: var(--gog-autocomplete-placeholder-color);
1183
+ --gog-autocomplete-clear-hover-color: var(--gog-autocomplete-label-color);
1184
+ --gog-autocomplete-clear-icon-ratio: var(--gog-control-clear-icon-ratio);
1185
+ --gog-autocomplete-spinner-size: 0.875rem;
1186
+ /* Panel */
1187
+ --gog-autocomplete-panel-bg: var(--gog-surface-color);
1188
+ --gog-autocomplete-panel-shadow: var(--gog-panel-shadow);
1189
+ --gog-autocomplete-panel-border-width: var(--gog-panel-border-width);
1190
+ --gog-autocomplete-panel-border-style: var(--gog-panel-border-style);
1191
+ --gog-autocomplete-panel-border-color: var(--gog-border-color);
1192
+ --gog-autocomplete-panel-radius: var(--gog-radius);
1193
+ --gog-autocomplete-panel-gap: var(--gog-space-2);
1194
+ --gog-autocomplete-panel-max-height: 260px;
1195
+ /* Ceiling for a content-sized panel, so one very long option cannot span the viewport. */
1196
+ --gog-autocomplete-panel-max-width: 420px;
1197
+ --gog-autocomplete-options-padding: var(--gog-space-4);
1198
+ --gog-autocomplete-option-padding: var(--gog-space-8) var(--gog-space-10);
1199
+ --gog-autocomplete-option-radius: calc(var(--gog-radius) - 4px);
1200
+ --gog-autocomplete-option-gap: var(--gog-space-10);
1201
+ --gog-autocomplete-option-color: var(--gog-text-color);
1202
+ --gog-autocomplete-option-hover-bg: var(--gog-hover-color);
1203
+ --gog-autocomplete-option-press-bg: var(--gog-border-color);
1204
+ --gog-autocomplete-option-hover-color: var(--gog-text-color);
1205
+ --gog-autocomplete-option-selected-bg: var(--gog-accent-pale);
1206
+ /* Body text, not the accent. The selected row is the one option that carries a tint *and* a
1207
+ coloured label, and the accent on that tint measured 4.12:1 in light — `--gog-accent-dim` is
1208
+ worse again (3.77:1 in one-dark). `gog-select` gets away with an accent label because its
1209
+ selected option has no tint behind it. The tint stays as the marker, alongside
1210
+ `aria-selected`. */
1211
+ --gog-autocomplete-option-selected-color: var(--gog-text-color);
1212
+ /* Estimated row height fed into the panel's up/down placement math; not itself a real
1213
+ layout property, so it has no effect unless the JS reads it. */
1214
+ --gog-autocomplete-option-height: 36px;
1215
+ --gog-autocomplete-empty-color: var(--gog-autocomplete-placeholder-color);
1216
+ --gog-autocomplete-empty-font-size: var(--gog-text-sm);
1217
+ --gog-autocomplete-float-label-reserve: var(--gog-field-float-label-reserve);
1218
+ --gog-autocomplete-float-label-in-top: var(--gog-field-float-label-in-top);
1219
+ --gog-autocomplete-float-label-over-gap: var(--gog-field-float-label-over-gap);
1220
+ --gog-autocomplete-float-label-over-reserve: var(--gog-field-float-label-over-reserve);
1221
+
1222
+ /* ── Badge (the `gogBadge` directive; its classes live in utilities.css) ───── */
1223
+ --gog-badge-font-family: var(--gog-font-body);
1224
+ --gog-badge-font-size: var(--gog-text-xs);
1225
+ --gog-badge-font-weight: var(--gog-font-weight-semibold);
1226
+ --gog-badge-line-height: var(--gog-line-height-none);
1227
+ /* Min-width *and* height: a one-digit badge stays a circle, a three-digit one grows
1228
+ sideways only. */
1229
+ --gog-badge-size: 1.25rem;
1230
+ --gog-badge-dot-size: 0.5rem;
1231
+ --gog-badge-padding-inline: var(--gog-space-4);
1232
+ --gog-badge-radius: 999px;
1233
+ /* How far the badge hangs outside its host's corner. */
1234
+ --gog-badge-offset: var(--gog-space-6);
1235
+ --gog-badge-border-width: 0;
1236
+ --gog-badge-border-style: var(--gog-border-style);
1237
+ --gog-badge-border-color: transparent;
1238
+ /* Above the host's own chrome but below any overlay panel (--gog-dropdown-z is 300). */
1239
+ /* Each label is its status's own "text on this fill" token, which flips with the theme — a red
1240
+ badge reads white on light and near-black on dark. It read `--gog-accent-text-color` for all
1241
+ four until 21.9.0, on the assumption that one label works on every fill; four themes proved
1242
+ otherwise, `material`'s amber under white at 1.97:1 the worst of them. See the
1243
+ `--gog-<status>-text-color` block near the top of this file. */
1244
+ --gog-badge-success-bg: var(--gog-success-color);
1245
+ --gog-badge-success-color: var(--gog-success-text-color);
1246
+ --gog-badge-danger-bg: var(--gog-danger-color);
1247
+ --gog-badge-danger-color: var(--gog-danger-text-color);
1248
+ --gog-badge-warning-bg: var(--gog-warning-color);
1249
+ --gog-badge-warning-color: var(--gog-warning-text-color);
1250
+ --gog-badge-info-bg: var(--gog-info-color);
1251
+ --gog-badge-info-color: var(--gog-info-text-color);
1252
+
1253
+ /* ── Datepicker (the field; the grid inside it is themed by --gog-calendar-*) ───
1254
+ `--gog-datepicker-bg`, `-color`, `-font-size`, `-padding-x` and `-padding-y` are
1255
+ intentionally NOT declared — they are the per-instance escape hatch the size classes fall
1256
+ back through. */
1257
+ --gog-datepicker-font-family: var(--gog-font-body);
1258
+ --gog-datepicker-label-font-family: var(--gog-font-heading);
1259
+ --gog-datepicker-gap: var(--gog-space-4);
1260
+ --gog-datepicker-label-color: var(--gog-accent-color);
1261
+ --gog-datepicker-label-font-size: var(--gog-text-sm);
1262
+ --gog-datepicker-label-letter-spacing: var(--gog-letter-spacing);
1263
+ --gog-datepicker-label-text-transform: var(--gog-text-transform);
1264
+ --gog-datepicker-field-bg: var(--gog-surface-color);
1265
+ --gog-datepicker-text-color: var(--gog-text-color);
1266
+ --gog-datepicker-placeholder-color: var(--gog-muted-text-color);
1267
+ --gog-datepicker-border-width: var(--gog-control-border-width);
1268
+ --gog-datepicker-border-style: var(--gog-control-border-style);
1269
+ --gog-datepicker-border-color: var(--gog-accent-dim);
1270
+ --gog-datepicker-hover-border-color: var(--gog-accent-color);
1271
+ --gog-datepicker-radius: var(--gog-radius);
1272
+ --gog-datepicker-line-height: var(--gog-line-height-normal);
1273
+ --gog-datepicker-transition-duration: var(--gog-duration-base);
1274
+ --gog-datepicker-disabled-opacity: var(--gog-disabled-opacity);
1275
+ --gog-datepicker-focus-ring-width: var(--gog-focus-ring-width);
1276
+ --gog-datepicker-focus-ring-offset: var(--gog-focus-ring-offset);
1277
+ --gog-datepicker-focus-ring-color: var(--gog-accent-color);
1278
+ --gog-datepicker-error-color: var(--gog-danger-color);
1279
+ --gog-datepicker-error-border-color: var(--gog-danger-color);
1280
+ --gog-datepicker-error-font-family: var(--gog-font-body);
1281
+ --gog-datepicker-error-font-size: var(--gog-text-xs);
1282
+ --gog-datepicker-min-width: 150px;
1283
+ --gog-datepicker-actions-inset: var(--gog-control-icon-offset);
1284
+ --gog-datepicker-actions-gap: var(--gog-space-6);
1285
+ /* Right padding on the input, reserving room for the calendar and clear buttons. */
1286
+ --gog-datepicker-actions-reserve: 40px;
1287
+ --gog-datepicker-icon-color: var(--gog-accent-color);
1288
+ --gog-datepicker-icon-hover-color: var(--gog-accent-bright);
1289
+ --gog-datepicker-toggle-icon-size: 1rem;
1290
+ --gog-datepicker-clear-color: var(--gog-datepicker-placeholder-color);
1291
+ --gog-datepicker-clear-icon-ratio: var(--gog-control-clear-icon-ratio);
1292
+ --gog-datepicker-panel-bg: var(--gog-surface-color);
1293
+ --gog-datepicker-panel-shadow: var(--gog-panel-shadow);
1294
+ --gog-datepicker-panel-border-width: var(--gog-panel-border-width);
1295
+ --gog-datepicker-panel-border-style: var(--gog-panel-border-style);
1296
+ --gog-datepicker-panel-border-color: var(--gog-border-color);
1297
+ --gog-datepicker-panel-radius: var(--gog-radius);
1298
+ --gog-datepicker-panel-gap: var(--gog-space-2);
1299
+ /* The dropdown surface. Inline mode is `gog-calendar` itself, so it sizes from
1300
+ `--gog-calendar-max-width` rather than from this. */
1301
+ --gog-datepicker-panel-width: max-content;
1302
+ --gog-datepicker-float-label-reserve: var(--gog-field-float-label-reserve);
1303
+ --gog-datepicker-float-label-in-top: var(--gog-field-float-label-in-top);
1304
+ --gog-datepicker-float-label-over-gap: var(--gog-field-float-label-over-gap);
1305
+ --gog-datepicker-float-label-over-reserve: var(--gog-field-float-label-over-reserve);
1306
+
1307
+ /* ── Divider ───────────────────────────────────────────────────────────────── */
1308
+ --gog-divider-line-color: var(--gog-border-color);
1309
+ --gog-divider-line-thickness: 1px;
1310
+ /* The variant classes map onto these, so a theme can decide what "dashed" looks like
1311
+ rather than the value being frozen into the component's stylesheet. */
1312
+ --gog-divider-solid-style: solid;
1313
+ --gog-divider-dashed-style: dashed;
1314
+ --gog-divider-dotted-style: dotted;
1315
+ --gog-divider-block-spacing: var(--gog-space-md);
1316
+ --gog-divider-inline-spacing: var(--gog-space-md);
1317
+ --gog-divider-inset-size: var(--gog-space-lg);
1318
+ /* Floor for a vertical divider with nothing to stretch to — e.g. between two inline
1319
+ buttons. In a flex/grid row it stretches to the row instead. */
1320
+ --gog-divider-vertical-length: 1.5em;
1321
+ --gog-divider-label-gap: var(--gog-space-sm);
1322
+ --gog-divider-label-color: var(--gog-muted-text-color);
1323
+ --gog-divider-label-font-family: var(--gog-font-body);
1324
+ --gog-divider-label-font-size: var(--gog-text-sm);
1325
+ --gog-divider-label-font-weight: var(--gog-font-weight-medium);
1326
+ --gog-divider-label-line-height: var(--gog-line-height-normal);
1327
+
1328
+ /* ── Icon ──────────────────────────────────────────────────────────────────── */
1329
+ --gog-icon-fallback-size: 1em;
1330
+
1331
+ /* ── Input field ───────────────────────────────────────────────────────────── */
1332
+ --gog-input-font-family: var(--gog-font-body);
1333
+ --gog-input-label-font-family: var(--gog-font-heading);
1334
+ --gog-input-gap: var(--gog-space-4);
1335
+ --gog-input-label-color: var(--gog-accent-color);
1336
+ --gog-input-label-font-size: var(--gog-text-sm);
1337
+ --gog-input-label-letter-spacing: var(--gog-letter-spacing);
1338
+ --gog-input-label-text-transform: var(--gog-text-transform);
1339
+ --gog-input-field-bg: var(--gog-surface-color);
1340
+ --gog-input-field-border: var(--gog-accent-dim);
1341
+ --gog-input-field-border-width: var(--gog-control-border-width);
1342
+ --gog-input-field-border-style: var(--gog-control-border-style);
1343
+ --gog-input-radius: var(--gog-radius);
1344
+ --gog-input-field-color: var(--gog-text-color);
1345
+ --gog-input-placeholder-color: var(--gog-muted-text-color);
1346
+ --gog-input-focus-border: var(--gog-accent-color);
1347
+ --gog-input-focus-ring: var(--gog-accent-pale);
1348
+ --gog-input-focus-glow: 0 0 8px var(--gog-input-focus-ring);
1349
+ --gog-input-focus-ring-width: var(--gog-focus-ring-width);
1350
+ --gog-input-focus-ring-offset: var(--gog-focus-ring-offset);
1351
+ --gog-input-error-color: var(--gog-danger-color);
1352
+ --gog-input-error-font-size: var(--gog-text-xs);
1353
+ /* Extra space above the error line, *on top of* the host's own `--gog-input-gap`, which
1354
+ already separates every child of the field. It shipped as `2px` and put this field's error
1355
+ 6px under it while `gog-select`, `gog-autocomplete` and `gog-datepicker` — same gap, no
1356
+ offset — sat at 4px; in one form the six did not line up. Zero by default since 21.9.0, so
1357
+ one mechanism spaces the error line everywhere. Set it if you want this field's error
1358
+ pushed further than the rest. */
1359
+ --gog-input-error-offset: 0px;
1360
+ --gog-input-icon-color: var(--gog-muted-text-color);
1361
+ --gog-input-icon-hover-color: var(--gog-accent-color);
1362
+ --gog-input-icon-action-radius: calc(var(--gog-radius) - 4px);
1363
+ --gog-input-icon-focus-ring-width: 2px;
1364
+ /* Number field's spin buttons — a subtle fill on hover, since they sit flush against the
1365
+ field's own border rather than floating with their own padding like the other icons. */
1366
+ --gog-input-spin-hover-bg: var(--gog-hover-color);
1367
+ --gog-input-disabled-opacity: var(--gog-disabled-opacity);
1368
+ --gog-input-transition-duration: var(--gog-duration-base);
1369
+ /* Float label — also used by gog-textarea, which shares the --gog-input-* block. */
1370
+ /* Clear button — only rendered once the field has text, see `clearable`.
1371
+
1372
+ A quarter of the corner radius rather than a flat `2px`, which is what this was until
1373
+ 21.9.0: at the default `--gog-radius: 8px` it computes to the same 2px, so nothing moves in
1374
+ any shipped theme, but a theme that rounds its corners now rounds this button too. The
1375
+ literal was invisible to `check-tokens` rule G by design — that rule flags a literal only
1376
+ when its value *equals* a character token's current one, so a pill's `999px` is correctly
1377
+ left alone and a small arbitrary number like this one is correctly not detectable. The two
1378
+ sibling controls below carry the same fix.
1379
+
1380
+ `gog-toast` and `gog-accordion` keep their flat `0px` on purpose: those are a chosen shape,
1381
+ not a number that forgot where it came from. */
1382
+ --gog-input-clear-radius: calc(var(--gog-radius) / 4);
1383
+ --gog-input-clear-icon-ratio: var(--gog-control-clear-icon-ratio);
1384
+ /*
1385
+ The textarea's clear button gets a full-size glyph. The 0.7 ratio above suits the dense
1386
+ single-line trigger of a dropdown; on a large multi-line box it reads as a speck.
1387
+ */
1388
+ --gog-textarea-clear-icon-ratio: 1;
1389
+ /* Custom resize grip — see the `::-webkit-resizer` comment in textarea.component.scss for
1390
+ why this replaces rather than restyles the native glyph. Colour follows the field's own
1391
+ border by default, not a fixed muted grey, so it reads as part of the field rather than a
1392
+ mismatched accent. */
1393
+ --gog-textarea-resize-grip-size: 11px;
1394
+ --gog-textarea-resize-grip-color: var(--gog-input-field-border);
1395
+ --gog-textarea-resize-grip-opacity: 0.8;
1396
+ --gog-textarea-resize-grip-stripe-width: 1.5px;
1397
+ --gog-textarea-resize-grip-stripe-gap: var(--gog-space-2);
1398
+ --gog-textarea-resize-grip-offset: 3px;
1399
+ /*
1400
+ Both default to 0 and are overwritten per instance, as an inline style on the field, from
1401
+ the component's own ResizeObserver — they close the gap that opens once the field has been
1402
+ dragged narrower/shorter than its container. Declared here rather than left to a `var()`
1403
+ fallback so the grip's resting geometry is discoverable in this file like everything else;
1404
+ an inline style outranks this declaration, so the per-instance override still wins.
1405
+ */
1406
+ --gog-textarea-resize-inset-right: 0px;
1407
+ --gog-textarea-resize-inset-bottom: 0px;
1408
+ --gog-input-clear-inset: var(--gog-space-8);
1409
+ /*
1410
+ Width of one stepper button, and so of the whole stepper column. Scales with the field's
1411
+ own font size rather than being a fixed px value, so it stays proportional across the five
1412
+ sizes. Read in two places — the buttons themselves, and the offset that moves the clear
1413
+ button clear of them on a clearable number field — which is why it is a token rather than
1414
+ the same `calc()` written twice.
1415
+ */
1416
+ --gog-input-spin-width: calc(
1417
+ var(--gog-input-size-font-size, var(--gog-field-md-font-size)) * 1.35
1418
+ );
1419
+ --gog-input-float-label-reserve: var(--gog-field-float-label-reserve);
1420
+ --gog-input-float-label-in-top: var(--gog-field-float-label-in-top);
1421
+ --gog-input-float-label-over-gap: var(--gog-field-float-label-over-gap);
1422
+ --gog-input-float-label-over-reserve: var(--gog-field-float-label-over-reserve);
1423
+
1424
+ /* ── Multiselect ───────────────────────────────────────────────────────────── */
1425
+ --gog-multiselect-font-family: var(--gog-font-body);
1426
+ --gog-multiselect-label-font-family: var(--gog-font-heading);
1427
+ --gog-multiselect-gap: var(--gog-space-4);
1428
+ --gog-multiselect-option-gap: var(--gog-space-4);
1429
+ --gog-multiselect-options-padding: var(--gog-space-4);
1430
+ --gog-multiselect-label-color: var(--gog-accent-color);
1431
+ --gog-multiselect-label-font-size: var(--gog-text-sm);
1432
+ --gog-multiselect-label-letter-spacing: var(--gog-letter-spacing);
1433
+ --gog-multiselect-label-text-transform: var(--gog-text-transform);
1434
+ --gog-multiselect-field-bg: var(--gog-surface-color);
1435
+ --gog-multiselect-field-border: var(--gog-accent-dim);
1436
+ --gog-multiselect-field-border-width: var(--gog-control-border-width);
1437
+ --gog-multiselect-field-border-style: var(--gog-control-border-style);
1438
+ --gog-multiselect-radius: var(--gog-radius);
1439
+ --gog-multiselect-field-color: var(--gog-text-color);
1440
+ --gog-multiselect-value-color: var(--gog-text-color);
1441
+ --gog-multiselect-placeholder-color: var(--gog-muted-text-color);
1442
+ --gog-multiselect-focus-border: var(--gog-accent-color);
1443
+ --gog-multiselect-focus-ring: var(--gog-accent-pale);
1444
+ --gog-multiselect-focus-glow: 0 0 8px var(--gog-multiselect-focus-ring);
1445
+ --gog-multiselect-focus-ring-width: var(--gog-focus-ring-width);
1446
+ --gog-multiselect-focus-ring-offset: var(--gog-focus-ring-offset);
1447
+ --gog-multiselect-error-color: var(--gog-danger-color);
1448
+ --gog-multiselect-error-font-size: var(--gog-text-xs);
1449
+ /* Zero by default since 21.9.0 — see `--gog-input-error-offset` for why. */
1450
+ --gog-multiselect-error-offset: 0px;
1451
+ --gog-multiselect-border-color: var(--gog-accent-color);
1452
+ --gog-multiselect-panel-bg: var(--gog-surface-color);
1453
+ --gog-multiselect-panel-border: var(--gog-accent-color);
1454
+ --gog-multiselect-panel-shadow: var(--gog-panel-shadow);
1455
+ --gog-multiselect-panel-max-height: 260px;
1456
+ --gog-multiselect-panel-offset: var(--gog-space-2);
1457
+ --gog-multiselect-option-hover-bg: var(--gog-hover-color);
1458
+ --gog-multiselect-option-press-bg: var(--gog-border-color);
1459
+ --gog-multiselect-option-color: var(--gog-text-color);
1460
+ --gog-multiselect-option-gap-inline: var(--gog-space-10);
1461
+ /* Estimated row height fed into the panel's up/down placement math; not itself a real
1462
+ layout property, so it has no effect unless the JS reads it. */
1463
+ --gog-multiselect-option-height: 40px;
1464
+ --gog-multiselect-option-radius: calc(var(--gog-radius) - 2px);
1465
+ --gog-multiselect-option-disabled-opacity: var(--gog-disabled-opacity);
1466
+ --gog-multiselect-option-transition-duration: var(--gog-duration-fast);
1467
+ --gog-multiselect-checkbox-border: var(--gog-accent-dim);
1468
+ --gog-multiselect-checkbox-bg: var(--gog-background-color);
1469
+ --gog-multiselect-checkbox-checked-bg: var(--gog-accent-color);
1470
+ --gog-multiselect-checkbox-checked-color: var(--gog-primary-color);
1471
+ --gog-multiselect-controls-gap: var(--gog-space-4);
1472
+ --gog-multiselect-controls-padding: var(--gog-space-6) var(--gog-space-10);
1473
+ --gog-multiselect-actions-gap: var(--gog-space-6);
1474
+ --gog-multiselect-filter-padding: var(--gog-space-6);
1475
+ --gog-multiselect-filter-input-padding-y: var(--gog-space-6);
1476
+ --gog-multiselect-filter-input-padding-x: var(--gog-space-8);
1477
+ --gog-multiselect-filter-input-bg: var(--gog-background-color);
1478
+ --gog-multiselect-filter-input-color: var(--gog-multiselect-field-color);
1479
+ --gog-multiselect-filter-input-border: var(--gog-multiselect-field-border);
1480
+ --gog-multiselect-filter-input-radius: var(--gog-radius);
1481
+ --gog-multiselect-filter-border-width: var(--gog-panel-border-width);
1482
+ --gog-multiselect-filter-border-style: var(--gog-panel-border-style);
1483
+ --gog-multiselect-filter-border-color: var(--gog-border-color);
1484
+ --gog-multiselect-filter-empty-padding: var(--gog-space-10);
1485
+ --gog-multiselect-filter-empty-color: var(--gog-multiselect-placeholder-color);
1486
+ /* Matches --gog-select-chevron-inset; see the note there. */
1487
+ /* "+N" badge shown when the selection does not fit on one line. */
1488
+ --gog-multiselect-overflow-color: var(--gog-multiselect-placeholder-color);
1489
+ --gog-multiselect-overflow-font-size: var(--gog-text-sm);
1490
+ --gog-multiselect-overflow-gap: var(--gog-space-6);
1491
+ --gog-multiselect-min-width: 120px;
1492
+ --gog-multiselect-panel-max-width: 420px;
1493
+ --gog-multiselect-actions-inset: var(--gog-control-icon-offset);
1494
+ /* A quarter of the corner radius — see `--gog-input-clear-radius` for why. */
1495
+ --gog-multiselect-clear-radius: calc(var(--gog-radius) / 4);
1496
+ --gog-multiselect-disabled-opacity: var(--gog-disabled-opacity);
1497
+ --gog-multiselect-transition-duration: var(--gog-duration-base);
1498
+ --gog-multiselect-float-label-reserve: var(--gog-field-float-label-reserve);
1499
+ --gog-multiselect-float-label-in-top: var(--gog-field-float-label-in-top);
1500
+ --gog-multiselect-float-label-over-gap: var(--gog-field-float-label-over-gap);
1501
+ --gog-multiselect-float-label-over-reserve: var(--gog-field-float-label-over-reserve);
1502
+ --gog-multiselect-arrow-transition-duration: var(--gog-duration-slow);
1503
+ /* Icon geometry, expressed as a ratio of the control's font size. */
1504
+ --gog-multiselect-clear-icon-ratio: var(--gog-control-clear-icon-ratio);
1505
+ --gog-multiselect-arrow-icon-ratio: 0.875;
1506
+ --gog-multiselect-mark-size-ratio: 1.2375;
1507
+ --gog-multiselect-mark-icon-ratio: 1.125;
1508
+
1509
+ /* ── Menu ──────────────────────────────────────────────────────────────────
1510
+ The command menu opened by `[gogMenuTrigger]`. Metrics follow the dropdown panel's, so a
1511
+ menu and a select opened from the same toolbar read as the same surface. */
1512
+ --gog-menu-z: var(--gog-dropdown-z);
1513
+ --gog-menu-bg: var(--gog-surface-color);
1514
+ --gog-menu-border-color: var(--gog-border-color);
1515
+ --gog-menu-border-width: var(--gog-control-border-width);
1516
+ --gog-menu-border-style: var(--gog-control-border-style);
1517
+ --gog-menu-radius: var(--gog-panel-radius);
1518
+ --gog-menu-shadow: var(--gog-dialog-shadow);
1519
+ --gog-menu-font-family: var(--gog-font-body);
1520
+ --gog-menu-padding: var(--gog-space-4);
1521
+ --gog-menu-gap: var(--gog-space-2);
1522
+ --gog-menu-offset: var(--gog-space-4);
1523
+ --gog-menu-min-width: 180px;
1524
+ --gog-menu-max-width: 320px;
1525
+ --gog-menu-max-height: 320px;
1526
+ --gog-menu-transition-duration: var(--gog-duration-base);
1527
+ --gog-menu-focus-ring: var(--gog-accent-color);
1528
+ --gog-menu-focus-ring-width: var(--gog-focus-ring-width);
1529
+ --gog-menu-item-color: var(--gog-text-color);
1530
+ --gog-menu-item-hover-bg: var(--gog-hover-color);
1531
+ /* The held state, same idea as the button's: one step past this surface's own hover, as a
1532
+ colour rather than a movement, so `prefers-reduced-motion` cannot take it away. The flat
1533
+ value here is what a browser without `color-mix()` gets; the tinted one is in the @supports
1534
+ block at the end of the file. */
1535
+ --gog-menu-item-press-bg: var(--gog-border-color);
1536
+ --gog-menu-item-hover-color: var(--gog-text-color);
1537
+ --gog-menu-item-font-size: var(--gog-text-sm);
1538
+ --gog-menu-item-padding: var(--gog-space-8) var(--gog-space-12);
1539
+ --gog-menu-item-radius: var(--gog-radius);
1540
+ --gog-menu-item-gap: var(--gog-space-sm);
1541
+ --gog-menu-item-disabled-opacity: var(--gog-disabled-opacity);
1542
+ --gog-menu-item-disabled-color: var(--gog-muted-text-color);
1543
+ --gog-menu-item-line-height: var(--gog-line-height-normal);
1544
+ --gog-menu-item-icon-size: 1em;
1545
+
1546
+ /* ── Paginator ─────────────────────────────────────────────────────────────── */
1547
+ --gog-paginator-gap: var(--gog-space-4);
1548
+ --gog-paginator-ellipsis-color: var(--gog-muted-text-color);
1549
+ --gog-paginator-ellipsis-font-size: var(--gog-text-sm);
1550
+ --gog-paginator-ellipsis-font-family: var(--gog-font-body);
1551
+ /* Enough for a three-digit page size plus the chevron, so the row doesn't shift on change. */
1552
+ --gog-paginator-page-size-min-width: 5rem;
1553
+ --gog-paginator-ellipsis-min-width: 32px;
1554
+
1555
+ /* ── Panel ─────────────────────────────────────────────────────────────────
1556
+ The `gog-panel` component, which shares its prefix with the foundation surface tier
1557
+ above (`--gog-panel-radius`, `--gog-panel-shadow`, `--gog-panel-border-width`,
1558
+ `--gog-panel-border-style`) deliberately: a panel is the surface those describe, and a
1559
+ theme that sets a house radius for raised surfaces should get it here too.
1560
+
1561
+ `--gog-panel-bg`, `--gog-panel-border-color`, `--gog-panel-padding-y`,
1562
+ `--gog-panel-padding-x` and `--gog-panel-gap` are intentionally NOT declared — the
1563
+ per-instance escape hatch. There is no `--gog-panel-*-shadow` twin of that hatch for the
1564
+ elevated variant: it reads `--gog-panel-shadow` from a declaration the component makes on
1565
+ its own host, so setting that token on one panel already changes only that panel. */
1566
+ --gog-panel-font-family: var(--gog-font-body);
1567
+ --gog-panel-color: var(--gog-text-color);
1568
+ --gog-panel-transition-duration: var(--gog-duration-base);
1569
+
1570
+ --gog-panel-heading-color: var(--gog-text-color);
1571
+ --gog-panel-heading-font-family: var(--gog-font-heading);
1572
+ --gog-panel-heading-font-size: var(--gog-text-xl);
1573
+ --gog-panel-heading-font-weight: var(--gog-font-weight-semibold);
1574
+ --gog-panel-heading-line-height: 1.25;
1575
+
1576
+ --gog-panel-outlined-bg: var(--gog-surface-color);
1577
+ --gog-panel-outlined-border-color: var(--gog-border-color);
1578
+ --gog-panel-outlined-shadow: none;
1579
+ --gog-panel-elevated-bg: var(--gog-elevated-surface-color);
1580
+ --gog-panel-elevated-border-color: transparent;
1581
+ --gog-panel-filled-bg: var(--gog-accent-pale);
1582
+ --gog-panel-filled-border-color: transparent;
1583
+ --gog-panel-filled-shadow: none;
1584
+
1585
+ --gog-panel-header-gap: var(--gog-space-sm);
1586
+ --gog-panel-toggle-size: 2rem;
1587
+ --gog-panel-toggle-radius: var(--gog-radius);
1588
+ --gog-panel-toggle-color: var(--gog-muted-text-color);
1589
+ --gog-panel-toggle-hover-bg: var(--gog-hover-color);
1590
+ --gog-panel-chevron-size: 1rem;
1591
+ --gog-panel-focus-ring: var(--gog-accent-color);
1592
+ --gog-panel-focus-ring-width: var(--gog-focus-ring-width);
1593
+ --gog-panel-focus-ring-offset: var(--gog-focus-ring-offset);
1594
+ --gog-panel-disabled-opacity: var(--gog-disabled-opacity);
1595
+
1596
+ --gog-panel-footer-border-color: var(--gog-border-color);
1597
+ --gog-panel-footer-gap: var(--gog-space-sm);
1598
+ --gog-panel-footer-padding-top: var(--gog-space-sm);
1599
+
1600
+ --gog-panel-xsm-padding-y: var(--gog-space-10);
1601
+ --gog-panel-xsm-padding-x: var(--gog-space-12);
1602
+ --gog-panel-xsm-gap: var(--gog-space-sm);
1603
+ --gog-panel-sm-padding-y: var(--gog-space-14);
1604
+ --gog-panel-sm-padding-x: var(--gog-space-md);
1605
+ --gog-panel-sm-gap: var(--gog-space-10);
1606
+ --gog-panel-md-padding-y: var(--gog-space-18);
1607
+ --gog-panel-md-padding-x: var(--gog-space-20);
1608
+ --gog-panel-md-gap: var(--gog-space-12);
1609
+ --gog-panel-lg-padding-y: var(--gog-space-lg);
1610
+ --gog-panel-lg-padding-x: var(--gog-space-28);
1611
+ --gog-panel-lg-gap: var(--gog-space-md);
1612
+ --gog-panel-slg-padding-y: var(--gog-space-32);
1613
+ --gog-panel-slg-padding-x: var(--gog-space-32);
1614
+ --gog-panel-slg-gap: var(--gog-space-20);
1615
+
1616
+ /* ── Progressbar ──────────────────────────────────────────────────────────── */
1617
+ --gog-progressbar-track-base-bg: var(--gog-border-color);
1618
+ --gog-progressbar-radius: 999px;
1619
+ --gog-progressbar-transition-duration: var(--gog-duration-slow);
1620
+ --gog-progressbar-xsm-height: 2px;
1621
+ --gog-progressbar-sm-height: 4px;
1622
+ --gog-progressbar-md-height: 6px;
1623
+ --gog-progressbar-lg-height: 10px;
1624
+ --gog-progressbar-slg-height: 14px;
1625
+ --gog-progressbar-value-gap: var(--gog-space-sm);
1626
+ --gog-progressbar-value-min-width: 3ch;
1627
+ --gog-progressbar-value-color: var(--gog-muted-text-color);
1628
+ --gog-progressbar-value-font-family: var(--gog-font-body);
1629
+ --gog-progressbar-value-font-size: var(--gog-text-sm);
1630
+ --gog-progressbar-indeterminate-duration: 1.6s;
1631
+ --gog-progressbar-indeterminate-easing: cubic-bezier(0.65, 0.05, 0.36, 1);
1632
+ /* The reduced-motion stand-in for the indeterminate animation. */
1633
+ --gog-progressbar-stripe-size: 6px;
1634
+ --gog-progressbar-stripe-color: var(--gog-surface-color);
1635
+ /* The two hairlines that mark where the fill ends, and the reason they are two.
1636
+ WCAG 1.4.11 wants 3:1 for the part of a graphic that carries its meaning, and here that is
1637
+ the boundary — `showValue` is `false` by default, so nothing else states the value. The fill
1638
+ cannot carry it against the track: measured across the whole `--gog-text-color`-to-
1639
+ `--gog-border-color` axis, no single track colour clears 3:1 against all five fills in any
1640
+ theme but `primeng`, because the fills straddle mid-luminance and a track dark enough for the
1641
+ amber warning lands on the blue info (`docs/backlog.md` has the table).
1642
+ A marker can, but not in one tone either: `--gog-surface-color` alone is 1.79:1 on
1643
+ `material`'s warning fill, `--gog-text-color` alone is 1.06:1 on `one-dark`'s success. As a
1644
+ pair they always work — the ink line is 3.25:1 to 9.57:1 against the track in all eleven
1645
+ themes, and whichever tone a fill sits close to, the other one does not. `check:contrast`
1646
+ gates both halves. */
1647
+ --gog-progressbar-edge-width: 1px;
1648
+ --gog-progressbar-edge-color: var(--gog-text-color);
1649
+ --gog-progressbar-edge-backing-color: var(--gog-surface-color);
1650
+ /* The buffer tier is the same hue at low opacity, so it reads as "ahead of the fill"
1651
+ rather than as a second, competing colour. */
1652
+ --gog-progressbar-accent-bg: var(--gog-accent-color);
1653
+ --gog-progressbar-accent-buffer-bg: var(--gog-accent-pale);
1654
+ --gog-progressbar-success-bg: var(--gog-success-color);
1655
+ --gog-progressbar-success-buffer-bg: var(--gog-border-color);
1656
+ --gog-progressbar-danger-bg: var(--gog-danger-color);
1657
+ --gog-progressbar-danger-buffer-bg: var(--gog-border-color);
1658
+ --gog-progressbar-warning-bg: var(--gog-warning-color);
1659
+ --gog-progressbar-warning-buffer-bg: var(--gog-border-color);
1660
+ --gog-progressbar-info-bg: var(--gog-info-color);
1661
+ --gog-progressbar-info-buffer-bg: var(--gog-border-color);
1662
+
1663
+ /* ── Ripple (the `gogRipple` directive; its classes live in ripple.css) ────
1664
+ `currentColor` rather than a fixed colour on purpose: the wash then reads as the host's
1665
+ own foreground, so one value works on a filled button and on a ghost one without a
1666
+ per-variant tier. The property is inherited, so `--gog-ripple-color` set anywhere above
1667
+ the host reaches it — which is the per-instance override, no undeclared tier needed. */
1668
+ --gog-ripple-color: currentColor;
1669
+ --gog-ripple-opacity: 0.16;
1670
+ /* Longer than any other motion in the library, deliberately: a ripple held to the house 0.2s
1671
+ is over before the eye has followed it across the surface. Still expressed in the
1672
+ foundation scale, so setting the durations to 0s still flattens it theme-wide. */
1673
+ --gog-ripple-enter-duration: calc(var(--gog-duration-slow) * 2);
1674
+ --gog-ripple-exit-duration: var(--gog-duration-slow);
1675
+ --gog-ripple-easing: var(--gog-easing);
1676
+
1677
+ /* ── Scroll ────────────────────────────────────────────────────────────────── */
1678
+ --gog-scroll-track-bg: transparent;
1679
+ --gog-scroll-track-radius: var(--gog-radius);
1680
+ --gog-scroll-thumb-bg: var(--gog-accent-dim);
1681
+ --gog-scroll-thumb-hover-bg: var(--gog-accent-color);
1682
+ --gog-scroll-thumb-active-bg: var(--gog-accent-bright);
1683
+ --gog-scroll-thumb-radius: var(--gog-radius);
1684
+ --gog-scroll-thumb-inset: 2px;
1685
+ --gog-scroll-corner-bg: transparent;
1686
+ --gog-scroll-fade-duration: var(--gog-duration-base);
1687
+ --gog-scroll-focus-ring: var(--gog-accent-color);
1688
+ --gog-scroll-focus-ring-width: var(--gog-focus-ring-width);
1689
+ /* Per-size pair for the two-tier `--gog-scroll-track-width`/`-thumb-min-size` chains
1690
+ that scroll.component.scss's `.gog-scroll--thin` modifier switches between. `normal`
1691
+ is the unmarked default, mirroring --gog-table-lg-*. */
1692
+ --gog-scroll-normal-track-width: 10px;
1693
+ --gog-scroll-thin-track-width: 6px;
1694
+ --gog-scroll-normal-thumb-min-size: 32px;
1695
+ --gog-scroll-thin-thumb-min-size: 24px;
1696
+ /* Invisible pointer-target padding around the thumb (see .gog-scroll__thumb::before) — the
1697
+ `thin` variant gets more of it since its 6px track leaves the least visible thumb to aim
1698
+ at; both land the effective hit width in the ~22-24px range generally recommended for a
1699
+ comfortable pointer target. */
1700
+ --gog-scroll-normal-thumb-hit-padding: var(--gog-space-6);
1701
+ --gog-scroll-thin-thumb-hit-padding: var(--gog-space-8);
1702
+
1703
+ /* ── Select ────────────────────────────────────────────────────────────────── */
1704
+ --gog-select-font-family: var(--gog-font-body);
1705
+ --gog-select-label-font-family: var(--gog-font-heading);
1706
+ --gog-select-gap: var(--gog-space-4);
1707
+ --gog-select-label-color: var(--gog-accent-color);
1708
+ --gog-select-label-font-size: var(--gog-text-sm);
1709
+ --gog-select-label-letter-spacing: var(--gog-letter-spacing);
1710
+ --gog-select-label-text-transform: var(--gog-text-transform);
1711
+ --gog-select-field-bg: var(--gog-surface-color);
1712
+ --gog-select-field-border: var(--gog-accent-dim);
1713
+ --gog-select-field-border-width: var(--gog-control-border-width);
1714
+ --gog-select-field-border-style: var(--gog-control-border-style);
1715
+ --gog-select-radius: var(--gog-radius);
1716
+ --gog-select-field-color: var(--gog-text-color);
1717
+ --gog-select-placeholder-color: var(--gog-muted-text-color);
1718
+ --gog-select-focus-border: var(--gog-accent-color);
1719
+ --gog-select-focus-ring: var(--gog-accent-pale);
1720
+ --gog-select-focus-glow: 0 0 8px var(--gog-select-focus-ring);
1721
+ --gog-select-focus-ring-width: var(--gog-focus-ring-width);
1722
+ --gog-select-focus-ring-offset: var(--gog-focus-ring-offset);
1723
+ --gog-select-error-color: var(--gog-danger-color);
1724
+ --gog-select-error-font-size: var(--gog-text-xs);
1725
+ --gog-select-chevron-color: var(--gog-accent-color);
1726
+ /*
1727
+ Distance from the trigger's right edge to the trailing chrome, matching the leading icon
1728
+ inset on gog-inputfield so a select, a multiselect and an input line up in one form. It is
1729
+ applied as the trigger's `padding-right`, and the chevron sits inside that padding — so this
1730
+ is the gap itself, not the gap plus the chevron. It used to be 40px, which double-counted
1731
+ and put the chevron 42px from the edge.
1732
+ */
1733
+ --gog-select-chevron-inset: var(--gog-control-icon-offset);
1734
+ /* Floor for an auto-width trigger, so [fullWidth]="false" cannot collapse it to the chevron. */
1735
+ --gog-select-min-width: 120px;
1736
+ /* Ceiling for a content-sized panel, so one very long option cannot span the viewport. */
1737
+ --gog-select-panel-max-width: 420px;
1738
+ /* Filter box — only rendered when `filter` is on. */
1739
+ --gog-select-filter-padding: var(--gog-space-6);
1740
+ --gog-select-filter-input-padding-y: var(--gog-space-6);
1741
+ --gog-select-filter-input-padding-x: var(--gog-space-8);
1742
+ --gog-select-filter-input-bg: var(--gog-background-color);
1743
+ --gog-select-filter-input-color: var(--gog-select-field-color);
1744
+ --gog-select-filter-input-border: var(--gog-select-field-border);
1745
+ --gog-select-filter-input-radius: var(--gog-radius);
1746
+ --gog-select-filter-border-width: var(--gog-panel-border-width);
1747
+ --gog-select-filter-border-style: var(--gog-panel-border-style);
1748
+ --gog-select-filter-border-color: var(--gog-select-option-border-color, var(--gog-border-color));
1749
+ --gog-select-filter-empty-padding: var(--gog-space-10);
1750
+ --gog-select-filter-empty-color: var(--gog-select-placeholder-color);
1751
+ /* Clear button — only rendered once a value is selected, see `clearable`. */
1752
+ /* A quarter of the corner radius — see `--gog-input-clear-radius` for why. */
1753
+ --gog-select-clear-radius: calc(var(--gog-radius) / 4);
1754
+ --gog-select-clear-icon-ratio: var(--gog-control-clear-icon-ratio);
1755
+ --gog-select-clear-gap: var(--gog-space-6);
1756
+ --gog-select-clear-color: var(--gog-select-placeholder-color);
1757
+ --gog-select-clear-hover-color: var(--gog-select-label-color);
1758
+ --gog-select-control-gap: var(--gog-space-12);
1759
+ --gog-select-panel-bg: var(--gog-surface-color);
1760
+ --gog-select-panel-shadow: var(--gog-panel-shadow);
1761
+ --gog-select-panel-max-height: 260px;
1762
+ --gog-select-panel-offset: var(--gog-space-2);
1763
+ --gog-select-option-hover-bg: var(--gog-hover-color);
1764
+ --gog-select-option-press-bg: var(--gog-border-color);
1765
+ --gog-select-option-selected-color: var(--gog-accent-color);
1766
+ --gog-select-option-color: var(--gog-text-color);
1767
+ --gog-select-option-gap: var(--gog-space-10);
1768
+ /* Estimated row height fed into the panel's up/down placement math; not itself a real
1769
+ layout property, so it has no effect unless the JS reads it. */
1770
+ --gog-select-option-height: 40px;
1771
+ --gog-select-option-disabled-opacity: var(--gog-disabled-opacity);
1772
+ --gog-select-option-transition-duration: var(--gog-duration-fast);
1773
+ /* Icon geometry, expressed as a ratio of the control's font size. */
1774
+ --gog-select-chevron-icon-ratio: 0.875;
1775
+ --gog-select-mark-size-ratio: 1.125;
1776
+ --gog-select-mark-icon-ratio: 0.875;
1777
+ --gog-select-disabled-opacity: var(--gog-disabled-opacity);
1778
+ --gog-select-transition-duration: var(--gog-duration-base);
1779
+ --gog-select-float-label-reserve: var(--gog-field-float-label-reserve);
1780
+ --gog-select-float-label-in-top: var(--gog-field-float-label-in-top);
1781
+ --gog-select-float-label-over-gap: var(--gog-field-float-label-over-gap);
1782
+ --gog-select-float-label-over-reserve: var(--gog-field-float-label-over-reserve);
1783
+
1784
+ /* ── Skeleton ─────────────────────────────────────────────────────────────── */
1785
+ --gog-skeleton-base: var(--gog-hover-color);
1786
+ --gog-skeleton-shine: var(--gog-surface-color);
1787
+ --gog-skeleton-radius: var(--gog-radius);
1788
+ --gog-skeleton-square-radius: 0px;
1789
+ --gog-skeleton-line-radius: calc(var(--gog-skeleton-radius) / 2);
1790
+ --gog-skeleton-line-gap: var(--gog-space-sm);
1791
+ --gog-skeleton-short-line-width: 60%;
1792
+ --gog-skeleton-pulse-duration: 1.6s;
1793
+ --gog-skeleton-pulse-min-opacity: 0.5;
1794
+ --gog-skeleton-wave-duration: 1.6s;
1795
+ --gog-skeleton-line-height-xsm: 8px;
1796
+ --gog-skeleton-line-height-sm: 10px;
1797
+ --gog-skeleton-line-height-md: 14px;
1798
+ --gog-skeleton-line-height-lg: 18px;
1799
+ --gog-skeleton-line-height-slg: 24px;
1800
+ --gog-skeleton-circle-size-xsm: 24px;
1801
+ --gog-skeleton-circle-size-sm: 32px;
1802
+ --gog-skeleton-circle-size-md: 48px;
1803
+ --gog-skeleton-circle-size-lg: 64px;
1804
+ --gog-skeleton-circle-size-slg: 96px;
1805
+ --gog-skeleton-rect-height-xsm: 40px;
1806
+ --gog-skeleton-rect-height-sm: 64px;
1807
+ --gog-skeleton-rect-height-md: 120px;
1808
+ --gog-skeleton-rect-height-lg: 200px;
1809
+ --gog-skeleton-rect-height-slg: 320px;
1810
+
1811
+ /* ── Slider ───────────────────────────────────────────────────────────────── */
1812
+ --gog-slider-auto-width: 240px;
1813
+ /* Length (height) of a vertical slider's track — the counterpart to
1814
+ --gog-slider-auto-width, which only sizes the horizontal case. */
1815
+ --gog-slider-vertical-length: 160px;
1816
+ --gog-slider-label-font-family: var(--gog-font-heading);
1817
+ --gog-slider-value-font-family: var(--gog-font-mono);
1818
+ --gog-slider-error-font-family: var(--gog-font-body);
1819
+ --gog-slider-gap: var(--gog-space-6);
1820
+ --gog-slider-label-color: var(--gog-accent-color);
1821
+ --gog-slider-label-font-size: var(--gog-text-sm);
1822
+ --gog-slider-label-letter-spacing: var(--gog-letter-spacing);
1823
+ --gog-slider-label-text-transform: var(--gog-text-transform);
1824
+ --gog-slider-value-color: var(--gog-accent-color);
1825
+ --gog-slider-value-font-size: var(--gog-text-sm);
1826
+ --gog-slider-value-min-width: 40px;
1827
+ --gog-slider-track-height: 4px;
1828
+ --gog-slider-track-area-height: 20px;
1829
+ --gog-slider-track-radius: 0px;
1830
+ /*
1831
+ * Deliberately NOT an accent-* token: --gog-accent-dim sits on the same hue ramp as
1832
+ * --gog-slider-fill-bg (--gog-accent-color), so at a 4px track height the two used to
1833
+ * read as one blob rather than "recessed groove + accent fill" same problem in both
1834
+ * themes, since the whole accent ramp is one hue. Mixing --gog-text-color into
1835
+ * --gog-border-color instead gives a desaturated, theme-adaptive groove: it darkens
1836
+ * toward black in the light theme (text-color is near-black there) and lightens toward
1837
+ * parchment in the dark theme (text-color is near-white there), landing at a neutral
1838
+ * warm gray in both — always visibly distinct from the saturated accent fill, and always
1839
+ * legible against its own theme's surface.
1840
+ */
1841
+ --gog-slider-track-bg: var(--gog-border-color);
1842
+ --gog-slider-track-border-width: var(--gog-border-width);
1843
+ --gog-slider-track-border-style: var(--gog-border-style);
1844
+ /* Transparent by default — same opt-in convention as --gog-button-primary-border: the
1845
+ width/style are always in the box model, but invisible until a theme sets a color. */
1846
+ --gog-slider-track-border-color: transparent;
1847
+ /* Bound via `background` (not `background-color`) in slider.component.scss, so this
1848
+ also accepts a gradient (e.g. `linear-gradient(...)`) for the fill style, not just a
1849
+ solid color. */
1850
+ --gog-slider-fill-bg: var(--gog-accent-color);
1851
+ --gog-slider-thumb-size: 16px;
1852
+ --gog-slider-thumb-bg: var(--gog-accent-color);
1853
+ --gog-slider-thumb-border: var(--gog-background-color);
1854
+ --gog-slider-thumb-border-width: var(--gog-control-border-width);
1855
+ --gog-slider-thumb-radius: 50%;
1856
+ --gog-slider-thumb-shadow: var(--gog-accent-pale);
1857
+ --gog-slider-thumb-glow-size: 6px;
1858
+ --gog-slider-focus-ring: var(--gog-accent-pale);
1859
+ --gog-slider-focus-ring-width: var(--gog-focus-ring-width);
1860
+ --gog-slider-range-color: var(--gog-muted-text-color);
1861
+ --gog-slider-range-font-size: var(--gog-text-xs);
1862
+ --gog-slider-error-color: var(--gog-danger-color);
1863
+ --gog-slider-error-font-size: var(--gog-text-xs);
1864
+ --gog-slider-disabled-opacity: var(--gog-disabled-opacity);
1865
+
1866
+ /* ── Spinner ──────────────────────────────────────────────────────────────── */
1867
+ --gog-spinner-rune-font-family: var(--gog-font-heading);
1868
+ --gog-spinner-track-color: var(--gog-accent-dim);
1869
+ --gog-spinner-arc-outer-color: var(--gog-accent-color);
1870
+ --gog-spinner-arc-inner-color: var(--gog-accent-bright);
1871
+ --gog-spinner-diamond-color: var(--gog-accent-bright);
1872
+ --gog-spinner-rune-color: var(--gog-accent-bright);
1873
+ --gog-spinner-glow-color: var(--gog-accent-color);
1874
+ --gog-spinner-track-opacity: 0.35;
1875
+ --gog-spinner-arc-inner-opacity: 0.75;
1876
+ --gog-spinner-diamond-opacity: 0.85;
1877
+ --gog-spinner-arc-outer-pulse-opacity: 0.8;
1878
+ --gog-spinner-arc-inner-pulse-opacity: 0.45;
1879
+ --gog-spinner-rune-pulse-opacity: 0.4;
1880
+ --gog-spinner-arc-outer-dash: 100 63;
1881
+ --gog-spinner-arc-inner-dash: 35 78;
1882
+ --gog-spinner-arc-inner-stroke-compact: 1;
1883
+ --gog-spinner-spin-duration: 1.4s;
1884
+ --gog-spinner-spin-slow-duration: 2s;
1885
+ --gog-spinner-ticks-duration: 6s;
1886
+ --gog-spinner-pulse-duration: 2.8s;
1887
+ --gog-spinner-ring-duration: 1s;
1888
+ --gog-spinner-ring-padding: 16%;
1889
+ --gog-spinner-arc-outer-glow: 5px;
1890
+ --gog-spinner-arc-inner-glow: 4px;
1891
+ --gog-spinner-diamond-glow: 3px;
1892
+ --gog-spinner-rune-glow: 6px;
1893
+ --gog-spinner-ring-glow: 5px;
1894
+ --gog-spinner-overlay-blur: 3px;
1895
+ --gog-spinner-overlay-fade-duration: var(--gog-duration-slow);
1896
+
1897
+ /* ── Table ────────────────────────────────────────────────────────────────── */
1898
+ --gog-table-font-family: var(--gog-font-body);
1899
+ --gog-table-header-font-family: var(--gog-font-heading);
1900
+ --gog-table-numeric-font-family: var(--gog-font-mono);
1901
+ --gog-table-gap: var(--gog-space-12);
1902
+ --gog-table-border-color: var(--gog-accent-dim);
1903
+ --gog-table-border-width: var(--gog-control-border-width);
1904
+ --gog-table-border-style: var(--gog-border-style);
1905
+ --gog-table-row-border-width: var(--gog-border-width);
1906
+ /* The selection column is sized to its checkbox and never grows with content. */
1907
+ --gog-table-select-col-width: 44px;
1908
+ --gog-table-surface: var(--gog-surface-color);
1909
+ /* The header needs its own ground, not the table's. It used to paint `--gog-table-surface`,
1910
+ which is the same colour the body paints, so on a scrolling table with a sticky header the
1911
+ column names slid over rows of identical background and the only thing separating them was
1912
+ the accent colour and the caps — legible on a light theme, not on a dark one. */
1913
+ --gog-table-header-bg: var(--gog-hover-color);
1914
+ --gog-table-text-color: var(--gog-text-color);
1915
+ --gog-table-accent-color: var(--gog-accent-color);
1916
+ --gog-table-accent-bright: var(--gog-accent-bright);
1917
+ --gog-table-hover-bg: var(--gog-accent-pale);
1918
+ /* Selected rows keep this tint through hover, so hovering one never reads as clearing it. */
1919
+ --gog-table-selected-bg: var(--gog-accent-pale);
1920
+ --gog-table-muted-color: var(--gog-muted-text-color);
1921
+ --gog-table-focus-ring: var(--gog-accent-color);
1922
+ --gog-table-focus-ring-width: var(--gog-focus-ring-width);
1923
+ --gog-table-header-letter-spacing: var(--gog-letter-spacing);
1924
+ --gog-table-header-text-transform: var(--gog-text-transform);
1925
+ --gog-table-num-col-width: 48px;
1926
+ --gog-table-th-inner-gap: var(--gog-space-6);
1927
+ --gog-table-sort-icon-size: 0.9em;
1928
+ --gog-table-sort-icon-width: 1.1em;
1929
+ --gog-table-sort-icon-opacity: 0.6;
1930
+ --gog-table-empty-padding: var(--gog-space-24) var(--gog-space-14);
1931
+ --gog-table-empty-font-size: var(--gog-text-md);
1932
+ --gog-table-loading-padding: var(--gog-space-32) var(--gog-space-14);
1933
+ --gog-table-loading-opacity: 0.5;
1934
+ --gog-table-row-transition-duration: var(--gog-duration-fast);
1935
+ --gog-table-footer-gap: var(--gog-space-sm);
1936
+ --gog-table-footer-min-height: 32px;
1937
+ --gog-table-total-font-size: var(--gog-text-xs);
1938
+ --gog-table-total-letter-spacing: 0.5px;
1939
+ --gog-table-total-text-transform: var(--gog-text-transform);
1940
+ --gog-table-num-font-size: var(--gog-text-xs);
1941
+ --gog-table-padding-h: var(--gog-space-14);
1942
+ --gog-table-xsm-padding-v: var(--gog-space-2);
1943
+ --gog-table-xsm-th-font-size: var(--gog-text-xs);
1944
+ --gog-table-xsm-td-font-size: var(--gog-text-xs);
1945
+ --gog-table-sm-padding-v: var(--gog-space-2);
1946
+ --gog-table-sm-th-font-size: var(--gog-text-xs);
1947
+ --gog-table-sm-td-font-size: var(--gog-text-xs);
1948
+ --gog-table-md-padding-v: var(--gog-space-6);
1949
+ --gog-table-md-th-font-size: var(--gog-text-xs);
1950
+ --gog-table-md-td-font-size: var(--gog-text-sm);
1951
+ --gog-table-lg-padding-v: var(--gog-space-10);
1952
+ --gog-table-lg-th-font-size: var(--gog-text-sm);
1953
+ --gog-table-lg-td-font-size: var(--gog-text-md);
1954
+ --gog-table-slg-padding-v: var(--gog-space-14);
1955
+ --gog-table-slg-th-font-size: var(--gog-text-md);
1956
+ --gog-table-slg-td-font-size: var(--gog-text-lg);
1957
+
1958
+ /* ── Tabs ──────────────────────────────────────────────────────────────────
1959
+ `--gog-tabs-tab-bg`, `-tab-color`, `-tab-padding` and `-tab-font-size` are intentionally
1960
+ NOT declared they are the per-instance escape hatch the size classes fall back through.
1961
+ `--gog-tabs-indicator-offset` / `-length` are written as inline styles from the measured
1962
+ header geometry, so they are not declared either. */
1963
+ --gog-tabs-font-family: var(--gog-font-heading);
1964
+ --gog-tabs-font-weight: var(--gog-font-weight-bold);
1965
+ --gog-tabs-letter-spacing: 0.4px;
1966
+ --gog-tabs-text-transform: none;
1967
+ --gog-tabs-line-height: var(--gog-line-height-tight);
1968
+ --gog-tabs-gap: 0px;
1969
+ --gog-tabs-tab-gap: var(--gog-space-sm);
1970
+ --gog-tabs-icon-size: 1.1em;
1971
+ --gog-tabs-rest-bg: transparent;
1972
+ --gog-tabs-rest-color: var(--gog-muted-text-color);
1973
+ --gog-tabs-hover-color: var(--gog-text-color);
1974
+ /* Tabs paint no background at rest and none on hover — the press is the only one they get,
1975
+ which is why this token has no hover counterpart to step past. */
1976
+ --gog-tabs-press-bg: var(--gog-border-color);
1977
+ /* A resting tab's label is deliberately muted, and muted text has no contrast headroom to
1978
+ spend on a tinted ground: on the press wash it fell to 3.24:1 in one-dark and under 4.5 in
1979
+ six other themes. The press takes the full text colour instead — which is also what pressing
1980
+ a tab is about to make it. */
1981
+ --gog-tabs-press-color: var(--gog-text-color);
1982
+ --gog-tabs-active-color: var(--gog-accent-color);
1983
+ --gog-tabs-header-border-width: var(--gog-border-width);
1984
+ --gog-tabs-header-border-style: var(--gog-border-style);
1985
+ --gog-tabs-header-border-color: var(--gog-border-color);
1986
+ --gog-tabs-indicator-color: var(--gog-accent-color);
1987
+ --gog-tabs-indicator-thickness: 2px;
1988
+ --gog-tabs-indicator-radius: 999px;
1989
+ --gog-tabs-transition-duration: var(--gog-duration-base);
1990
+ --gog-tabs-disabled-opacity: var(--gog-disabled-opacity);
1991
+ --gog-tabs-focus-ring-width: var(--gog-focus-ring-width);
1992
+ /* Inset, for the same reason as the calendar cell: tabs sit shoulder to shoulder. */
1993
+ --gog-tabs-focus-ring-offset: calc(var(--gog-focus-ring-offset) * -1);
1994
+ --gog-tabs-focus-ring-color: var(--gog-accent-color);
1995
+ --gog-tabs-panel-padding: var(--gog-space-md);
1996
+ --gog-tabs-panel-color: var(--gog-text-color);
1997
+ --gog-tabs-xsm-padding: var(--gog-space-6) var(--gog-space-10);
1998
+ --gog-tabs-xsm-font-size: var(--gog-text-xs);
1999
+ --gog-tabs-sm-padding: var(--gog-space-8) var(--gog-space-14);
2000
+ --gog-tabs-sm-font-size: var(--gog-text-sm);
2001
+ --gog-tabs-md-padding: var(--gog-space-12) var(--gog-space-18);
2002
+ --gog-tabs-md-font-size: var(--gog-text-md);
2003
+ --gog-tabs-lg-padding: var(--gog-space-16) var(--gog-space-24);
2004
+ --gog-tabs-lg-font-size: var(--gog-text-lg);
2005
+ --gog-tabs-slg-padding: var(--gog-space-20) var(--gog-space-28);
2006
+ --gog-tabs-slg-font-size: var(--gog-text-xl);
2007
+
2008
+ /* ── Tag ──────────────────────────────────────────────────────────────────
2009
+ Like the button, the unsuffixed `--gog-tag-bg`/`-border`/`-color`/`-font-size`
2010
+ and friends stay undeclared so variant and size classes can fall through them. */
2011
+ --gog-tag-font-family: inherit;
2012
+ --gog-tag-default-color: var(--gog-info-color, var(--gog-muted-text-color));
2013
+ --gog-tag-success-color: var(--gog-success-color);
2014
+ --gog-tag-danger-color: var(--gog-danger-color);
2015
+ --gog-tag-warning-color: var(--gog-warning-color);
2016
+ --gog-tag-info-color: var(--gog-info-color);
2017
+ --gog-tag-bg-mix: 10%;
2018
+ /* The label is the status hue mixed **halfway toward the page's ink**, and both halves of that
2019
+ changed in 21.10.0. It was 82% of the hue mixed toward literal `black`, which is a light-theme
2020
+ assumption twice over: on a dark theme it darkened a label that already sat on a dark ground
2021
+ (one-dark's danger tag read 3.11:1), and on a light one 18% of black is not enough to bring a
2022
+ bright hue down to text contrast (material's warning, 2.49:1; primeng's success, 3.06:1).
2023
+ Eleven of the 55 shipped combinations were under WCAG AA and nothing had ever measured them —
2024
+ a tag's colours reach the DOM through `--gog-tag-variant-color`, which `check:contrast` could
2025
+ not follow until the same release taught it to.
2026
+
2027
+ `--gog-text-color` rather than `black` makes the mix follow the theme, and 50% rather than 82%
2028
+ is the same ratio, and the same argument, as `--gog-button-<status>-ink`: as body text the raw
2029
+ status hue clears AA in only a handful of themes. The worst pair is now 4.67:1. */
2030
+ --gog-tag-color-mix: 50%;
2031
+ --gog-tag-bg-base: var(--gog-surface-color);
2032
+ --gog-tag-color-base: var(--gog-text-color);
2033
+ --gog-tag-border-width: var(--gog-border-width);
2034
+ --gog-tag-border-style: var(--gog-border-style);
2035
+ --gog-tag-inner-border-width: var(--gog-border-width);
2036
+ --gog-tag-font-weight: var(--gog-font-weight-semibold);
2037
+ --gog-tag-line-height: var(--gog-line-height-none);
2038
+ --gog-tag-radius: max(var(--gog-radius), 2px);
2039
+ --gog-tag-pill-radius: 9999px;
2040
+
2041
+ --gog-tag-xsm-font-size: 0.6875rem;
2042
+ --gog-tag-xsm-padding-block: var(--gog-space-2);
2043
+ --gog-tag-xsm-padding-inline: var(--gog-space-6);
2044
+ --gog-tag-xsm-gap: var(--gog-space-2);
2045
+ --gog-tag-xsm-icon-size: 0.6875rem;
2046
+
2047
+ --gog-tag-sm-font-size: var(--gog-text-xs);
2048
+ --gog-tag-sm-padding-block: var(--gog-space-4);
2049
+ --gog-tag-sm-padding-inline: var(--gog-space-8);
2050
+ --gog-tag-sm-gap: var(--gog-space-4);
2051
+ --gog-tag-sm-icon-size: 0.75rem;
2052
+
2053
+ --gog-tag-md-font-size: var(--gog-text-sm);
2054
+ --gog-tag-md-padding-block: var(--gog-space-6);
2055
+ --gog-tag-md-padding-inline: var(--gog-space-12);
2056
+ --gog-tag-md-gap: var(--gog-space-6);
2057
+ --gog-tag-md-icon-size: 0.875rem;
2058
+
2059
+ --gog-tag-lg-font-size: var(--gog-text-md);
2060
+ --gog-tag-lg-padding-block: var(--gog-space-8);
2061
+ --gog-tag-lg-padding-inline: var(--gog-space-14);
2062
+ --gog-tag-lg-gap: var(--gog-space-8);
2063
+ --gog-tag-lg-icon-size: 1rem;
2064
+
2065
+ --gog-tag-slg-font-size: var(--gog-text-lg);
2066
+ --gog-tag-slg-padding-block: var(--gog-space-10);
2067
+ --gog-tag-slg-padding-inline: var(--gog-space-16);
2068
+ --gog-tag-slg-gap: var(--gog-space-10);
2069
+ --gog-tag-slg-icon-size: 1.125rem;
2070
+
2071
+ /* ── Toast ────────────────────────────────────────────────────────────────── */
2072
+ --gog-toast-font-family: var(--gog-font-body);
2073
+ --gog-toast-bg: var(--gog-surface-color);
2074
+ --gog-toast-color: var(--gog-text-color);
2075
+ --gog-toast-border: var(--gog-accent-color);
2076
+ --gog-toast-icon-color: var(--gog-accent-color);
2077
+ --gog-toast-success-color: var(--gog-success-color);
2078
+ --gog-toast-error-color: var(--gog-danger-color);
2079
+ --gog-toast-warning-color: var(--gog-accent-bright);
2080
+ --gog-toast-info-color: var(--gog-accent-color);
2081
+ --gog-toast-accent-width: 4px;
2082
+ --gog-toast-padding: var(--gog-space-12) var(--gog-space-14);
2083
+ --gog-toast-radius: 0px;
2084
+ --gog-toast-content-gap: var(--gog-space-10);
2085
+ --gog-toast-main-gap: var(--gog-space-sm);
2086
+ --gog-toast-actions-gap: var(--gog-space-6);
2087
+ --gog-toast-message-font-size: var(--gog-text-sm);
2088
+ --gog-toast-message-line-height: var(--gog-line-height-relaxed);
2089
+ --gog-toast-icon-size: 1rem;
2090
+ --gog-toast-icon-line-height: var(--gog-line-height-normal);
2091
+ --gog-toast-action-padding: var(--gog-space-4) var(--gog-space-8);
2092
+ --gog-toast-action-font-size: var(--gog-text-xs);
2093
+ --gog-toast-close-padding: var(--gog-space-2) var(--gog-space-4);
2094
+ --gog-toast-close-font-size: var(--gog-text-xs);
2095
+ --gog-toast-progress-height: 3px;
2096
+ --gog-toast-progress-opacity: 30%;
2097
+ --gog-toast-transition-duration: 0.25s;
2098
+ /* Card-stack geometry */
2099
+ --gog-toast-stack-peek: 14px;
2100
+ --gog-toast-stack-scale-step: 0.06;
2101
+ --gog-toast-stack-expanded-gap: 84px;
2102
+ --gog-toast-stack-min-opacity: 0.4;
2103
+ --gog-toast-stack-opacity-step: 0.18;
2104
+ --gog-toast-stack-max-depth: 6;
2105
+
2106
+ /* ── Toggle ───────────────────────────────────────────────────────────────────
2107
+ A switch, not a checkbox: it announces as "switch, on". The outer label size reuses
2108
+ the `--gog-control-checkbox-*` scale so a toggle and a checkbox in the same form read
2109
+ at the same weight; the track/thumb geometry is its own, since a switch is wider than
2110
+ it is tall. */
2111
+ --gog-toggle-font-family: var(--gog-font-body);
2112
+ --gog-toggle-gap: var(--gog-space-sm);
2113
+ --gog-toggle-radius: 999px;
2114
+ --gog-toggle-border-width: var(--gog-border-width);
2115
+ --gog-toggle-border-style: var(--gog-border-style);
2116
+ --gog-toggle-border-color: var(--gog-border-color);
2117
+ --gog-toggle-on-border-color: var(--gog-accent-color);
2118
+ --gog-toggle-track-off-bg: var(--gog-border-color);
2119
+ --gog-toggle-track-on-bg: var(--gog-accent-color);
2120
+ --gog-toggle-thumb-off-bg: var(--gog-surface-color);
2121
+ --gog-toggle-thumb-on-bg: var(--gog-accent-text-color, var(--gog-primary-color));
2122
+ --gog-toggle-thumb-shadow: 0 1px 3px rgba(0, 0, 0, 0.35);
2123
+ --gog-toggle-thumb-inset: 2px;
2124
+ --gog-toggle-transition-duration: var(--gog-duration-base);
2125
+ --gog-toggle-disabled-opacity: var(--gog-disabled-opacity);
2126
+ --gog-toggle-label-color: var(--gog-text-color);
2127
+ --gog-toggle-label-line-height: var(--gog-line-height-normal);
2128
+ --gog-toggle-focus-ring-width: var(--gog-focus-ring-width);
2129
+ --gog-toggle-focus-ring-offset: var(--gog-focus-ring-offset);
2130
+ --gog-toggle-focus-ring-color: var(--gog-accent-color);
2131
+ /* In-track on/off wording */
2132
+ --gog-toggle-state-color: var(--gog-accent-text-color, var(--gog-primary-color));
2133
+ --gog-toggle-state-font-weight: var(--gog-font-weight-semibold);
2134
+ --gog-toggle-state-letter-spacing: 0.04em;
2135
+ --gog-toggle-state-padding-inline: var(--gog-space-4);
2136
+ --gog-toggle-state-offset: var(--gog-space-6);
2137
+ /* Gap between the wording and the thumb parked at the opposite end. The clearance itself
2138
+ (thumb size + this) is computed in the component stylesheet, not here: a `var(` to a
2139
+ size-class token is substituted where it is *declared*, so doing that calc on :root would
2140
+ freeze it to the md thumb and stop it scaling with `size`. */
2141
+ --gog-toggle-state-thumb-gap: var(--gog-space-6);
2142
+ --gog-toggle-xsm-track-width: 24px;
2143
+ --gog-toggle-xsm-track-height: 14px;
2144
+ --gog-toggle-xsm-thumb-size: 10px;
2145
+ --gog-toggle-xsm-label-size: var(--gog-control-checkbox-label-size-xsm);
2146
+ --gog-toggle-xsm-state-font-size: 0.5rem;
2147
+ --gog-toggle-sm-track-width: 32px;
2148
+ --gog-toggle-sm-track-height: 18px;
2149
+ --gog-toggle-sm-thumb-size: 14px;
2150
+ --gog-toggle-sm-label-size: var(--gog-control-checkbox-label-size-sm);
2151
+ --gog-toggle-sm-state-font-size: 0.5625rem;
2152
+ --gog-toggle-md-track-width: 44px;
2153
+ --gog-toggle-md-track-height: 24px;
2154
+ --gog-toggle-md-thumb-size: 18px;
2155
+ --gog-toggle-md-label-size: var(--gog-control-checkbox-label-size-md);
2156
+ --gog-toggle-md-state-font-size: 0.625rem;
2157
+ --gog-toggle-lg-track-width: 56px;
2158
+ --gog-toggle-lg-track-height: 32px;
2159
+ --gog-toggle-lg-thumb-size: 26px;
2160
+ --gog-toggle-lg-label-size: var(--gog-control-checkbox-label-size-lg);
2161
+ --gog-toggle-lg-state-font-size: var(--gog-text-xs);
2162
+ --gog-toggle-slg-track-width: 68px;
2163
+ --gog-toggle-slg-track-height: 40px;
2164
+ --gog-toggle-slg-thumb-size: 34px;
2165
+ --gog-toggle-slg-label-size: var(--gog-control-checkbox-label-size-slg);
2166
+ --gog-toggle-slg-state-font-size: 0.8125rem;
2167
+
2168
+ /* ── Tooltip ──────────────────────────────────────────────────────────────── */
2169
+ --gog-tooltip-font-family: var(--gog-font-body);
2170
+ --gog-tooltip-font-size: var(--gog-text-xs);
2171
+ --gog-tooltip-line-height: var(--gog-line-height-normal);
2172
+ --gog-tooltip-padding: var(--gog-space-6) var(--gog-space-10);
2173
+ --gog-tooltip-radius: var(--gog-radius);
2174
+ --gog-tooltip-max-width: 280px;
2175
+ /* Caps the gog-scroll wrapping the bubble's content — see tooltip-bubble.component.html.
2176
+ A cap, not a fixed height: shorter content stays exactly as tall as it needs to be, this
2177
+ only stops something unusually long (a multi-paragraph TemplateRef) from growing to
2178
+ cover most of the viewport. */
2179
+ --gog-tooltip-max-height: 220px;
2180
+ /* Same "floating panel" recipe as gog-dialog's panel and gog-select's dropdown — a
2181
+ surface-colored box with a plain (not accent) border and the shared panel shadow —
2182
+ rather than an inverted dark/light bubble, so it reads as part of this site instead of
2183
+ a generic dark tooltip dropped on top of it. */
2184
+ --gog-tooltip-bg: var(--gog-surface-color);
2185
+ --gog-tooltip-color: var(--gog-text-color);
2186
+ --gog-tooltip-border-width: var(--gog-panel-border-width);
2187
+ --gog-tooltip-border-style: var(--gog-panel-border-style);
2188
+ --gog-tooltip-border-color: var(--gog-border-color);
2189
+ --gog-tooltip-shadow: var(--gog-panel-shadow);
2190
+ --gog-tooltip-arrow-size: 5px;
2191
+ /* Space kept between the trigger and the bubble. Read by the directive itself (not just
2192
+ CSS) to feed the placement math see `readPxToken` in `tooltip.directive.ts`. */
2193
+ --gog-tooltip-gap: var(--gog-space-8);
2194
+ --gog-tooltip-transition-duration: var(--gog-duration-fast);
2195
+ }
2196
+
2197
+ /*
2198
+ * ── color-mix(), and why it is quarantined here ─────────────────────────────────
2199
+ *
2200
+ * Every token above has a flat value that works in any browser. The richer, mixed value lives
2201
+ * in this block, which a browser without `color-mix()` skips entirely.
2202
+ *
2203
+ * **The usual two-declaration fallback does not work for custom properties, and that is the
2204
+ * whole reason this block exists.** A custom property accepts almost any token stream at parse
2205
+ * time it is only validated when it is *substituted* — so writing
2206
+ *
2207
+ * --x: var(--gog-hover-color);
2208
+ * --x: color-mix(in srgb, );
2209
+ *
2210
+ * leaves the second declaration winning even where `color-mix()` means nothing, and `var(--x)`
2211
+ * then resolves to nothing at all. Measured in Chrome (2026-08-30): an element styled that way
2212
+ * with an unsupported function computed `background: rgba(0, 0, 0, 0)` transparent, not the
2213
+ * earlier value. That is the reported "colours are wrong in Samsung Internet / Firefox": the
2214
+ * declarations were not falling back, they were vanishing.
2215
+ *
2216
+ * `@supports` is the only mechanism that gates a custom property by feature support, because it
2217
+ * is evaluated at parse time rather than at substitution time.
2218
+ *
2219
+ * `color-mix()` shipped in Chrome 111, Firefox 113, Safari 16.2 and Samsung Internet 22.
2220
+ *
2221
+ * **That is not below the support floor — it overlaps it.** Angular 21 supports
2222
+ * `baseline widely available on 2025-10-20`, whose minimums are Chrome 111, Firefox 112 and
2223
+ * Safari 16.4. Firefox 112 is inside that window and has no `color-mix()`, so these fallbacks
2224
+ * are load-bearing for a browser the framework itself supports, not a courtesy to ancient ones.
2225
+ * Below the floor entirely (Samsung Internet on an older Android, which Angular's list does not
2226
+ * mention at all) the library still renders: flat palette colours, less depth, every surface
2227
+ * legible and every focus ring visible.
2228
+ *
2229
+ * The project deliberately declares no `browserslist` — Angular's baseline is the policy, and
2230
+ * stating a lower one only produced "unsupported browsers" warnings on every build.
2231
+ */
2232
+ @supports (color: color-mix(in srgb, red 50%, blue)) {
2233
+ :root,
2234
+ [data-theme] {
2235
+ --gog-accordion-hover-bg: color-mix(in srgb, var(--gog-accent-dim) 10%, transparent);
2236
+ --gog-accordion-hover-ring: color-mix(in srgb, var(--gog-accent-color) 30%, transparent);
2237
+ --gog-accordion-body-bg: color-mix(in srgb, black 6%, transparent);
2238
+ --gog-button-primary-hover-shadow: 0 0 16px
2239
+ color-mix(in srgb, var(--gog-accent-bright) 45%, transparent);
2240
+ --gog-button-ghost-hover-bg: color-mix(in srgb, var(--gog-accent-color) 12%, transparent);
2241
+ /* The table's header labels, one step off the raw accent and toward the page's ink. The
2242
+ accent alone is text on a tinted strip (`--gog-table-header-bg` is `--gog-hover-color`), and
2243
+ it read 4.15:1 in `light` and 4.32:1 in `one-light` — the only two themes it failed, and
2244
+ both by a margin small enough that a per-theme patch would have been the tempting fix. This
2245
+ is the general one: 20% of the ink lifts every theme (worst is now one-light at 5.09:1) and
2246
+ keeps the accent identity the header is drawn in. Flat fallback above stays the raw accent,
2247
+ which is what a browser without `color-mix()` has always shown. */
2248
+ --gog-table-accent-color: color-mix(
2249
+ in srgb,
2250
+ var(--gog-accent-color) 80%,
2251
+ var(--gog-text-color)
2252
+ );
2253
+ /* Every other pressable surface, one rule: 20% of the same ingredient its own hover mixes at
2254
+ 10-12%, so the press is a clear step past the hover without becoming a fill. 20 rather than
2255
+ a rounder 25 is measured, not chosen: `check:contrast` resolves these washes over the
2256
+ surface each one actually sits on, and 21% puts one-dark's mid-grey text under 4.5:1 on the
2257
+ tab, accordion and button-toggle presses. The accordion mixes `--gog-accent-dim` because
2258
+ its hover does — its header sits on a strip where a full-accent wash was too loud
2259
+ (21.7.1). */
2260
+ --gog-accordion-press-bg: color-mix(in srgb, var(--gog-accent-dim) 20%, transparent);
2261
+ --gog-autocomplete-option-press-bg: color-mix(
2262
+ in srgb,
2263
+ var(--gog-accent-color) 20%,
2264
+ transparent
2265
+ );
2266
+ --gog-button-toggle-press-bg: color-mix(in srgb, var(--gog-accent-color) 20%, transparent);
2267
+ --gog-chip-press-bg: color-mix(in srgb, var(--gog-accent-color) 20%, transparent);
2268
+ --gog-menu-item-press-bg: color-mix(in srgb, var(--gog-accent-color) 20%, transparent);
2269
+ --gog-multiselect-option-press-bg: color-mix(in srgb, var(--gog-accent-color) 20%, transparent);
2270
+ --gog-select-option-press-bg: color-mix(in srgb, var(--gog-accent-color) 20%, transparent);
2271
+ --gog-tabs-press-bg: color-mix(in srgb, var(--gog-accent-color) 20%, transparent);
2272
+
2273
+ /* Button severity — see the block of the same name above for what each ingredient is and
2274
+ why the ink mix is 50%. Four severities, one recipe each, so a new status colour would
2275
+ need four lines rather than a design decision. */
2276
+ --gog-button-success-fill-hover: color-mix(
2277
+ in srgb,
2278
+ var(--gog-success-color) 88%,
2279
+ var(--gog-success-shade)
2280
+ );
2281
+ --gog-button-success-fill-press: color-mix(
2282
+ in srgb,
2283
+ var(--gog-success-color) 76%,
2284
+ var(--gog-success-shade)
2285
+ );
2286
+ --gog-button-success-ink: color-mix(
2287
+ in srgb,
2288
+ var(--gog-success-color) 50%,
2289
+ var(--gog-text-color)
2290
+ );
2291
+ --gog-button-success-wash: color-mix(in srgb, var(--gog-success-color) 12%, transparent);
2292
+ --gog-button-danger-fill-hover: color-mix(
2293
+ in srgb,
2294
+ var(--gog-danger-color) 88%,
2295
+ var(--gog-danger-shade)
2296
+ );
2297
+ --gog-button-danger-fill-press: color-mix(
2298
+ in srgb,
2299
+ var(--gog-danger-color) 76%,
2300
+ var(--gog-danger-shade)
2301
+ );
2302
+ --gog-button-danger-ink: color-mix(in srgb, var(--gog-danger-color) 50%, var(--gog-text-color));
2303
+ --gog-button-danger-wash: color-mix(in srgb, var(--gog-danger-color) 12%, transparent);
2304
+ --gog-button-warning-fill-hover: color-mix(
2305
+ in srgb,
2306
+ var(--gog-warning-color) 88%,
2307
+ var(--gog-warning-shade)
2308
+ );
2309
+ --gog-button-warning-fill-press: color-mix(
2310
+ in srgb,
2311
+ var(--gog-warning-color) 76%,
2312
+ var(--gog-warning-shade)
2313
+ );
2314
+ --gog-button-warning-ink: color-mix(
2315
+ in srgb,
2316
+ var(--gog-warning-color) 50%,
2317
+ var(--gog-text-color)
2318
+ );
2319
+ --gog-button-warning-wash: color-mix(in srgb, var(--gog-warning-color) 12%, transparent);
2320
+ --gog-button-info-fill-hover: color-mix(
2321
+ in srgb,
2322
+ var(--gog-info-color) 88%,
2323
+ var(--gog-info-shade)
2324
+ );
2325
+ --gog-button-info-fill-press: color-mix(
2326
+ in srgb,
2327
+ var(--gog-info-color) 76%,
2328
+ var(--gog-info-shade)
2329
+ );
2330
+ --gog-button-info-ink: color-mix(in srgb, var(--gog-info-color) 50%, var(--gog-text-color));
2331
+ --gog-button-info-wash: color-mix(in srgb, var(--gog-info-color) 12%, transparent);
2332
+ --gog-calendar-range-bg: color-mix(in srgb, var(--gog-accent-color) 16%, transparent);
2333
+ --gog-card-filled-bg: color-mix(in srgb, var(--gog-accent-dim) 8%, var(--gog-surface-color));
2334
+ --gog-card-hover-border-color: color-mix(in srgb, var(--gog-accent-color) 45%, transparent);
2335
+ --gog-checkbox-focus-ring: color-mix(in srgb, var(--gog-accent-color) 25%, transparent);
2336
+ --gog-radio-focus-ring: color-mix(in srgb, var(--gog-accent-color) 25%, transparent);
2337
+ --gog-chip-bg: color-mix(in srgb, var(--gog-surface-color) 88%, var(--gog-hover-color));
2338
+ --gog-chip-hover-bg: color-mix(in srgb, var(--gog-hover-color) 45%, var(--gog-surface-color));
2339
+ --gog-dialog-close-hover-bg: color-mix(in srgb, var(--gog-hover-color) 70%, transparent);
2340
+ --gog-autocomplete-option-hover-bg: color-mix(
2341
+ in srgb,
2342
+ var(--gog-accent-color) 10%,
2343
+ transparent
2344
+ );
2345
+ --gog-autocomplete-option-selected-bg: color-mix(
2346
+ in srgb,
2347
+ var(--gog-accent-color) 16%,
2348
+ transparent
2349
+ );
2350
+ --gog-input-focus-ring: color-mix(in srgb, var(--gog-accent-color) 25%, transparent);
2351
+ --gog-input-spin-hover-bg: color-mix(
2352
+ in srgb,
2353
+ var(--gog-input-icon-hover-color) 12%,
2354
+ transparent
2355
+ );
2356
+ --gog-multiselect-focus-ring: color-mix(in srgb, var(--gog-accent-color) 25%, transparent);
2357
+ --gog-multiselect-option-hover-bg: color-mix(in srgb, var(--gog-accent-color) 10%, transparent);
2358
+ --gog-panel-filled-bg: color-mix(in srgb, var(--gog-accent-dim) 8%, var(--gog-surface-color));
2359
+ --gog-panel-toggle-hover-bg: color-mix(in srgb, var(--gog-hover-color) 70%, transparent);
2360
+ --gog-progressbar-track-base-bg: color-mix(
2361
+ in srgb,
2362
+ var(--gog-text-color) 20%,
2363
+ var(--gog-border-color)
2364
+ );
2365
+ --gog-progressbar-stripe-color: color-mix(in srgb, var(--gog-surface-color) 45%, transparent);
2366
+ --gog-progressbar-accent-buffer-bg: color-mix(
2367
+ in srgb,
2368
+ var(--gog-accent-color) 35%,
2369
+ transparent
2370
+ );
2371
+ --gog-progressbar-success-buffer-bg: color-mix(
2372
+ in srgb,
2373
+ var(--gog-success-color) 35%,
2374
+ transparent
2375
+ );
2376
+ --gog-progressbar-danger-buffer-bg: color-mix(
2377
+ in srgb,
2378
+ var(--gog-danger-color) 35%,
2379
+ transparent
2380
+ );
2381
+ --gog-progressbar-warning-buffer-bg: color-mix(
2382
+ in srgb,
2383
+ var(--gog-warning-color) 35%,
2384
+ transparent
2385
+ );
2386
+ --gog-progressbar-info-buffer-bg: color-mix(in srgb, var(--gog-info-color) 35%, transparent);
2387
+ --gog-select-focus-ring: color-mix(in srgb, var(--gog-accent-color) 25%, transparent);
2388
+ --gog-select-option-hover-bg: color-mix(in srgb, var(--gog-accent-color) 10%, transparent);
2389
+ --gog-skeleton-base: color-mix(in srgb, var(--gog-border-color) 40%, var(--gog-surface-color));
2390
+ --gog-skeleton-shine: color-mix(in srgb, var(--gog-skeleton-base), white 35%);
2391
+ --gog-slider-track-bg: color-mix(in srgb, var(--gog-text-color) 30%, var(--gog-border-color));
2392
+ --gog-slider-thumb-shadow: color-mix(in srgb, var(--gog-accent-bright) 40%, transparent);
2393
+ --gog-slider-focus-ring: color-mix(in srgb, var(--gog-accent-color) 30%, transparent);
2394
+ --gog-toggle-track-off-bg: color-mix(in srgb, var(--gog-text-color) 18%, transparent);
2395
+ }
2396
+ }