@guildofgleks/ui 21.6.0 → 21.7.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
@@ -19,25 +19,6 @@
19
19
  * No component stylesheet declares a `--gog-*` default of its own — everything a
20
20
  * component paints resolves to a token below.
21
21
  *
22
- * ── The pre-21.5.0 spellings, and why they sit in a fallback ─────────────────────
23
- * Three prefixes were abbreviations of a component's name, which is the one thing a
24
- * consumer cannot guess: `--gog-btn-*`, `--gog-ms-*`, `--gog-confirm-*`. 21.5.0 spells them
25
- * out — `--gog-button-*`, `--gog-multiselect-*`, `--gog-confirmation-dialog-*` — and keeps
26
- * the old ones working by putting each one in its replacement's fallback:
27
- *
28
- * --gog-button-md-padding: var(--gog-btn-md-padding, 0.75rem 1.25rem);
29
- *
30
- * The spelled-out name is the declaration; the old name is declared nowhere, so a consumer
31
- * who set it still feeds the component from wherever they set it, in every scope. Do not
32
- * "simplify" this into an alias declared beside the original (`--gog-button-x: var(--gog-btn-x)`):
33
- * the derived block re-declares itself inside every nested `[data-theme]`, so that shape
34
- * silently discards a root-level override of the *new* name inside any themed subtree. That
35
- * was measured, not theorised.
36
- *
37
- * @deprecated since 21.5.0 (2026-08-19) — use the spelled-out prefixes. Removed in 21.7.0.
38
- * Removing them is deleting the `var(--gog-btn-…, )` wrapper from each declaration below;
39
- * nothing else moves.
40
- *
41
22
  * ── Why there are two blocks, and which one to add a token to ────────────────────
42
23
  * A custom property's `var()` references are substituted on the element that *declares*
43
24
  * it, not where it is read. So `--gog-button-primary-bg: var(--gog-accent-color)` declared on
@@ -76,14 +57,49 @@
76
57
  --gog-text-2xl: 2rem;
77
58
  --gog-text-3xl: 3rem;
78
59
 
79
- /* ── Spacing & geometry ─────────────────────────────────────────────────────── */
80
- --gog-space-xs: 4px;
81
- --gog-space-sm: 8px;
82
- --gog-space-md: 16px;
83
- --gog-space-lg: 24px;
84
- --gog-space-2xl: 48px;
60
+ /* The "emphasis" casing character labels, buttons, section and table headers all shout
61
+ the same way by default. Not every uppercase/1px-tracking declaration in this file reads
62
+ these two: only the ones that genuinely share this idea do. A few (gog-tabs among them)
63
+ stay their own literal on purpose, because normal case or a different tracking reads
64
+ better there — see docs/themes.md, iteration 1, for the full audit of what did and did
65
+ not qualify. */
66
+ --gog-text-transform: uppercase;
67
+ --gog-letter-spacing: 1px;
68
+
69
+ /* ── Spacing & geometry ───────────────────────────────────────────────────────
70
+
71
+ `--gog-density` is the whole spacing system in one number. It multiplies every step
72
+ of the scale below, and every component padding and gap derives from that scale, so
73
+ a theme makes the entire library compact or roomy without naming a single component:
74
+
75
+ [data-theme='compact'] { --gog-density: 0.75; }
76
+
77
+ This is the density half of docs/themes.md's character layer — the same idea as
78
+ --gog-radius for corners. Before it existed, 177 component paddings and gaps were
79
+ literals in two different units, and a theme that wanted tighter controls had to
80
+ re-list all of them; check-tokens.mjs rule G now fails a build that adds another.
81
+
82
+ The steps are named for their pixel value at density 1, because a t-shirt scale
83
+ stops being readable somewhere around the fourth size and this one has fourteen.
84
+ The five original t-shirt names are kept as aliases: they are public API, they are
85
+ what `theme-starter.css` and every existing consumer theme use, and they cost
86
+ nothing to keep.
87
+
88
+ Only the multiplier itself lives here — the scale is in the derived block below,
89
+ because every step reads this token and so has to re-resolve inside each theme
90
+ scope. A step declared here would be computed once against :root's density and a
91
+ [data-theme] subtree would inherit that number, not its own. */
92
+ --gog-density: 1;
85
93
 
86
94
  --gog-radius: 8px;
95
+ /* Three border-weight tiers, not one: --gog-control-border-width (2px) is form fields,
96
+ --gog-panel-border-width (1px) is raised/floating surfaces (card, dialog, dropdown panel,
97
+ tooltip — see README.md's note on --gog-panel-*), and this pair is everything smaller and
98
+ inline — chip, tag, badge, toggle, table rows, tabs, calendar cells. It happens to share
99
+ panel's value today; kept separate anyway; a theme wanting thick floating panels but thin
100
+ inline chips (or the reverse) needs the two independently settable. */
101
+ --gog-border-width: 1px;
102
+ --gog-border-style: solid;
87
103
  --gog-panel-border-width: 1px;
88
104
  --gog-panel-border-style: solid;
89
105
 
@@ -104,13 +120,9 @@
104
120
  Five-tier scale: xsm/slg bookend the original sm/md/lg (restored below to
105
121
  their pre-compaction numbers) as new extremes for extra-tight or extra-roomy
106
122
  layouts. */
107
- --gog-control-padding-y: 10px;
108
- --gog-control-padding-x: 14px;
109
- --gog-control-icon-offset: 10px;
110
123
  --gog-control-border-width: 2px;
111
124
  --gog-control-border-style: solid;
112
125
 
113
- --gog-control-checkbox-padding: 6px;
114
126
  --gog-control-checkbox-box-size-xsm: 12px;
115
127
  --gog-control-checkbox-box-size-sm: 18px;
116
128
  --gog-control-checkbox-box-size-md: 24px;
@@ -129,29 +141,22 @@
129
141
 
130
142
  /* ── Button sizing ─────────────────────────────────────────────────────────── */
131
143
 
132
- /* ── Field sizing (input / select / multiselect share one scale) ───────────── */
133
- --gog-field-xsm-padding-y: 4px;
134
- --gog-field-xsm-padding-x: 8px;
135
- --gog-field-xsm-icon-offset: 6px;
136
- --gog-field-xsm-icon-inset: 24px;
137
-
138
- --gog-field-sm-padding-y: 6px;
139
- --gog-field-sm-padding-x: 10px;
140
- --gog-field-sm-icon-offset: 8px;
141
- --gog-field-sm-icon-inset: 30px;
142
-
143
- --gog-field-md-icon-inset: 36px;
144
-
145
- --gog-field-lg-padding-y: 14px;
146
- --gog-field-lg-padding-x: 18px;
147
- --gog-field-lg-icon-offset: 14px;
148
- --gog-field-lg-icon-inset: 44px;
144
+ /* ── Field sizing (input / select / multiselect share one scale) ─────────────
145
+ The offsets are spacing and follow --gog-density with everything else; the glyph
146
+ box does not, because an icon that shrinks with the padding stops being legible
147
+ well before the padding stops being usable. Only the offsets move.
148
+
149
+ Each inset is the text's start edge: one offset before the glyph, the glyph, one
150
+ offset after. It was five hand-measured literals (docs/iteration-8-plan.md tuned
151
+ them in a browser) that happened to satisfy that identity, so nothing here moves
152
+ at density 1 — but a literal cannot follow the density knob, and at 0.75 the text
153
+ used to keep a 36px inset against 7px of padding. Stated as the sum it always was,
154
+ it just works. */
155
+ --gog-field-icon-glyph-xsm: 12px;
156
+ --gog-field-icon-glyph-sm: 14px;
157
+ --gog-field-icon-glyph: 16px;
149
158
 
150
- --gog-field-slg-padding-y: 18px;
151
- --gog-field-slg-padding-x: 22px;
152
159
  --gog-field-slg-font-size: 1.25rem;
153
- --gog-field-slg-icon-offset: 18px;
154
- --gog-field-slg-icon-inset: 52px;
155
160
 
156
161
  /* ── Float label geometry (input / textarea / select / multiselect) ─────────
157
162
  One scale for every field that can float its label. Each control reads these
@@ -163,7 +168,6 @@
163
168
  kept clear for the 'over' variant. */
164
169
  --gog-field-float-label-reserve: 14px;
165
170
  --gog-field-float-label-in-top: 6px;
166
- --gog-field-float-label-over-gap: 8px;
167
171
  --gog-field-float-label-over-reserve: 1.4em;
168
172
 
169
173
  /* ── Icon & spinner ───────────────────────────────────────────────────────── */
@@ -179,8 +183,6 @@
179
183
  /* ── Toast stack ──────────────────────────────────────────────────────────── */
180
184
  --gog-toast-min-width: 280px;
181
185
  --gog-toast-max-width: 400px;
182
- --gog-toast-gap: 10px;
183
- --gog-toast-stack-padding: 16px;
184
186
  --gog-toast-z-index: 9999;
185
187
  --gog-toast-enter-distance: 110%;
186
188
  --gog-toast-shadow: 0 4px 24px rgba(0, 0, 0, 0.25);
@@ -193,32 +195,36 @@
193
195
 
194
196
  /* ── Light palette (also the no-data-theme default) ───────────────────────── */
195
197
  color-scheme: light;
196
- /* Фоновые и поверхностные тона */
197
- --gog-background-color: #f7f3eb; /* Тёплый пергаментный фон страницы */
198
- --gog-surface-color: #ffffff; /* КИСЛО-БЕЛЫЙ ПЕРГАМЕНТ карточек (создает контраст со слоем 1!) */
199
- --gog-hover-color: #f0e7d7; /* Состояние наведения (мягкий воск) */
200
- --gog-border-color: #d8c7ad; /* Состаренная латунная рамка */
201
-
202
- /* Типографика (Старинные дубовые чернила) */
203
- --gog-text-color: #17120c; /* Глубокие чернила (высокий контраст WCAG AAA) */
198
+ /* Backgrounds and surfaces */
199
+ --gog-background-color: #f7f3eb; /* Warm parchment page ground */
200
+ --gog-surface-color: #ffffff; /* Bleached parchment for cards lighter than the page on purpose, so the two tiers read apart */
201
+ --gog-hover-color: #f0e7d7; /* Hover state soft wax */
202
+ --gog-border-color: #d8c7ad; /* Aged brass rule */
203
+
204
+ /* Type old oak-gall ink */
205
+ --gog-text-color: #17120c; /* Deep ink clears WCAG AAA against both surfaces */
204
206
  --gog-accent-text-color: #ffffff;
205
- --gog-muted-text-color: #63503c; /* Приглушенные печные чернила */
207
+ --gog-muted-text-color: #63503c; /* Muted kiln ink */
206
208
 
207
- /* Бренд и акценты (Гильдейское Сусальное Золото) */
209
+ /* Brand and accents guild gold leaf */
208
210
  --gog-primary-color: #17120c;
209
- --gog-accent-color: #9e6f00; /* Насыщенный благородный золотисто-бронзовый */
210
- --gog-accent-bright: #c88e00; /* Яркий отблеск золота */
211
- --gog-accent-dim: #735100; /* Темная бронза */
212
- --gog-accent-pale: #f8f1df; /* Светлая подложка под золото */
211
+ /* Deep guild gold. Darkened from #9e6f00 in 21.7.0: white on the old value was 4.44:1,
212
+ just under WCAG AA's 4.5, and its hover fill was 2.87:1 the hover was the worse half.
213
+ The hover is now *darker* than the rest state rather than brighter, because gold light
214
+ enough to read as "a brighter gleam" cannot carry white text at all. */
215
+ --gog-accent-color: #926600;
216
+ --gog-accent-bright: #7a5500;
217
+ --gog-accent-dim: #735100; /* Dark bronze */
218
+ --gog-accent-pale: #f8f1df; /* Pale wash beneath the gold */
213
219
  --gog-secondary-color: #6b5328;
214
220
 
215
- /* Гармонизированная алхимическая семантика */
216
- --gog-success-color: #216e4e; /* Изумруд */
217
- --gog-danger-color: #a7232b; /* Рубин */
218
- --gog-warning-color: #c45100; /* Тёмный янтарь */
219
- --gog-info-color: #2b5c8f; /* Лазурит */
221
+ /* Semantic colours, kept in the alchemical family */
222
+ --gog-success-color: #216e4e; /* Emerald */
223
+ --gog-danger-color: #a7232b; /* Ruby */
224
+ --gog-warning-color: #c45100; /* Dark amber */
225
+ --gog-info-color: #2b5c8f; /* Lapis */
220
226
 
221
- /* Объёмная мягкая тень старой кожи */
227
+ /* Soft, deep shadow old leather */
222
228
  --gog-panel-shadow: 0 4px 20px rgba(23, 18, 12, 0.08), 0 1px 3px rgba(23, 18, 12, 0.04);
223
229
  --gog-spinner-overlay-bg: rgba(247, 243, 235, 0.85);
224
230
  }
@@ -227,32 +233,36 @@
227
233
  [data-theme='light'] {
228
234
  color-scheme: light;
229
235
 
230
- /* Фоновые и поверхностные тона */
231
- --gog-background-color: #f7f3eb; /* Тёплый пергаментный фон страницы */
232
- --gog-surface-color: #ffffff; /* КИСЛО-БЕЛЫЙ ПЕРГАМЕНТ карточек (создает контраст со слоем 1!) */
233
- --gog-hover-color: #f0e7d7; /* Состояние наведения (мягкий воск) */
234
- --gog-border-color: #d8c7ad; /* Состаренная латунная рамка */
236
+ /* Backgrounds and surfaces */
237
+ --gog-background-color: #f7f3eb; /* Warm parchment page ground */
238
+ --gog-surface-color: #ffffff; /* Bleached parchment for cards lighter than the page on purpose, so the two tiers read apart */
239
+ --gog-hover-color: #f0e7d7; /* Hover state soft wax */
240
+ --gog-border-color: #d8c7ad; /* Aged brass rule */
235
241
 
236
- /* Типографика (Старинные дубовые чернила) */
237
- --gog-text-color: #17120c; /* Глубокие чернила (высокий контраст WCAG AAA) */
242
+ /* Type old oak-gall ink */
243
+ --gog-text-color: #17120c; /* Deep ink clears WCAG AAA against both surfaces */
238
244
  --gog-accent-text-color: #ffffff;
239
- --gog-muted-text-color: #63503c; /* Приглушенные печные чернила */
245
+ --gog-muted-text-color: #63503c; /* Muted kiln ink */
240
246
 
241
- /* Бренд и акценты (Гильдейское Сусальное Золото) */
247
+ /* Brand and accents guild gold leaf */
242
248
  --gog-primary-color: #17120c;
243
- --gog-accent-color: #9e6f00; /* Насыщенный благородный золотисто-бронзовый */
244
- --gog-accent-bright: #c88e00; /* Яркий отблеск золота */
245
- --gog-accent-dim: #735100; /* Темная бронза */
246
- --gog-accent-pale: #f8f1df; /* Светлая подложка под золото */
249
+ /* Deep guild gold. Darkened from #9e6f00 in 21.7.0: white on the old value was 4.44:1,
250
+ just under WCAG AA's 4.5, and its hover fill was 2.87:1 the hover was the worse half.
251
+ The hover is now *darker* than the rest state rather than brighter, because gold light
252
+ enough to read as "a brighter gleam" cannot carry white text at all. */
253
+ --gog-accent-color: #926600;
254
+ --gog-accent-bright: #7a5500;
255
+ --gog-accent-dim: #735100; /* Dark bronze */
256
+ --gog-accent-pale: #f8f1df; /* Pale wash beneath the gold */
247
257
  --gog-secondary-color: #6b5328;
248
258
 
249
- /* Гармонизированная алхимическая семантика */
250
- --gog-success-color: #216e4e; /* Изумруд */
251
- --gog-danger-color: #a7232b; /* Рубин */
252
- --gog-warning-color: #c45100; /* Тёмный янтарь */
253
- --gog-info-color: #2b5c8f; /* Лазурит */
259
+ /* Semantic colours, kept in the alchemical family */
260
+ --gog-success-color: #216e4e; /* Emerald */
261
+ --gog-danger-color: #a7232b; /* Ruby */
262
+ --gog-warning-color: #c45100; /* Dark amber */
263
+ --gog-info-color: #2b5c8f; /* Lapis */
254
264
 
255
- /* Объёмная мягкая тень старой кожи */
265
+ /* Soft, deep shadow old leather */
256
266
  --gog-panel-shadow: 0 4px 20px rgba(23, 18, 12, 0.08), 0 1px 3px rgba(23, 18, 12, 0.04);
257
267
  --gog-spinner-overlay-bg: rgba(247, 243, 235, 0.85);
258
268
  }
@@ -261,30 +271,30 @@
261
271
  [data-theme='dark'] {
262
272
  color-scheme: dark;
263
273
 
264
- /* Фоновые и поверхностные тона */
265
- --gog-background-color: #0d0b08; /* Глубокий кузнечный обсидиан */
266
- --gog-surface-color: #16120e; /* Тёмное обожженное железо (карточки) */
267
- --gog-hover-color: #241d17; /* Наведение на элементы */
268
- --gog-border-color: #3d3122; /* Состаренная чеканенная бронза */
274
+ /* Backgrounds and surfaces */
275
+ --gog-background-color: #0d0b08; /* Deep forge obsidian */
276
+ --gog-surface-color: #16120e; /* Dark fired iron cards */
277
+ --gog-hover-color: #241d17; /* Hover state */
278
+ --gog-border-color: #3d3122; /* Aged chased bronze */
269
279
 
270
- /* Типографика (Светящаяся Слоновая Кость) */
271
- --gog-text-color: #f3ebd8; /* Мягкий светящийся пергамент */
280
+ /* Type glowing ivory */
281
+ --gog-text-color: #f3ebd8; /* Soft luminous parchment */
272
282
  --gog-accent-text-color: #0d0b08;
273
- --gog-muted-text-color: #9e8d76; /* Приглушенная бронза */
283
+ --gog-muted-text-color: #9e8d76; /* Muted bronze */
274
284
 
275
- /* Бренд и акценты (Светящееся Золото Алхимии) */
285
+ /* Brand and accents the alchemist's glowing gold */
276
286
  --gog-primary-color: #f3ebd8;
277
- --gog-accent-color: #fbbf24; /* Плазменный янтарь */
278
- --gog-accent-bright: #fde047; /* Яркий золотой луч */
279
- --gog-accent-dim: #b48310; /* Приглушенное золото */
280
- --gog-accent-pale: #2b210c; /* Тёмный золотой отсвет */
287
+ --gog-accent-color: #fbbf24; /* Plasma amber */
288
+ --gog-accent-bright: #fde047; /* Bright gold ray */
289
+ --gog-accent-dim: #b48310; /* Muted gold */
290
+ --gog-accent-pale: #2b210c; /* Dark gold reflection */
281
291
  --gog-secondary-color: #d4a373;
282
292
 
283
- /* Семантика */
284
- --gog-success-color: #34d399; /* Светящийся изумруд */
285
- --gog-danger-color: #f87171; /* Светящийся рубин */
286
- --gog-warning-color: #fbbf24; /* Янтарь */
287
- --gog-info-color: #38bdf8; /* Сапфир */
293
+ /* Semantics */
294
+ --gog-success-color: #34d399; /* Glowing emerald */
295
+ --gog-danger-color: #f87171; /* Glowing ruby */
296
+ --gog-warning-color: #fbbf24; /* Amber */
297
+ --gog-info-color: #38bdf8; /* Sapphire */
288
298
 
289
299
  --gog-panel-shadow: 0 10px 30px rgba(0, 0, 0, 0.7), 0 0 0 1px var(--gog-border-color);
290
300
  --gog-spinner-overlay-bg: rgba(13, 11, 8, 0.85);
@@ -300,11 +310,66 @@
300
310
  /* ── Derived foundation tokens ───────────────────────────────────────────────
301
311
  Split out of the literal block above because they read other tokens: they have
302
312
  to re-resolve inside each theme scope. */
313
+ --gog-space-2: calc(2px * var(--gog-density));
314
+ --gog-space-4: calc(4px * var(--gog-density));
315
+ --gog-space-6: calc(6px * var(--gog-density));
316
+ --gog-space-8: calc(8px * var(--gog-density));
317
+ --gog-space-10: calc(10px * var(--gog-density));
318
+ --gog-space-12: calc(12px * var(--gog-density));
319
+ --gog-space-14: calc(14px * var(--gog-density));
320
+ --gog-space-16: calc(16px * var(--gog-density));
321
+ --gog-space-18: calc(18px * var(--gog-density));
322
+ --gog-space-20: calc(20px * var(--gog-density));
323
+ --gog-space-24: calc(24px * var(--gog-density));
324
+ --gog-space-28: calc(28px * var(--gog-density));
325
+ --gog-space-32: calc(32px * var(--gog-density));
326
+ --gog-space-48: calc(48px * var(--gog-density));
327
+ --gog-space-xs: var(--gog-space-4);
328
+ --gog-space-sm: var(--gog-space-8);
329
+ --gog-space-md: var(--gog-space-16);
330
+ --gog-space-lg: var(--gog-space-24);
331
+ --gog-space-2xl: var(--gog-space-48);
332
+ --gog-control-padding-y: var(--gog-space-10);
333
+ --gog-control-padding-x: var(--gog-space-14);
334
+ --gog-control-checkbox-padding: var(--gog-space-6);
335
+ --gog-field-xsm-padding-y: var(--gog-space-4);
336
+ --gog-field-xsm-padding-x: var(--gog-space-8);
337
+ --gog-field-sm-padding-y: var(--gog-space-6);
338
+ --gog-field-sm-padding-x: var(--gog-space-10);
339
+ --gog-field-lg-padding-y: var(--gog-space-14);
340
+ --gog-field-lg-padding-x: var(--gog-space-18);
341
+ --gog-field-slg-padding-y: var(--gog-space-18);
342
+ --gog-field-slg-padding-x: var(--gog-space-20);
343
+ --gog-field-float-label-over-gap: var(--gog-space-8);
344
+ --gog-toast-gap: var(--gog-space-10);
345
+ --gog-toast-stack-padding: var(--gog-space-16);
346
+ --gog-field-xsm-icon-offset: var(--gog-space-6);
347
+ --gog-field-sm-icon-offset: var(--gog-space-8);
348
+ --gog-field-lg-icon-offset: var(--gog-space-14);
349
+ --gog-field-slg-icon-offset: var(--gog-space-18);
350
+ --gog-control-icon-offset: var(--gog-space-10);
303
351
  --gog-panel-radius: calc(var(--gog-radius) + 8px);
304
352
  --gog-field-xsm-font-size: var(--gog-text-xs);
305
353
  --gog-field-sm-font-size: var(--gog-text-sm);
306
354
  --gog-field-md-padding-y: var(--gog-control-padding-y);
307
355
  --gog-field-md-padding-x: var(--gog-control-padding-x);
356
+
357
+ /* offset + glyph + offset — see the icon-chrome comment in the literal block above. */
358
+ --gog-field-xsm-icon-inset: calc(
359
+ var(--gog-field-xsm-icon-offset) * 2 + var(--gog-field-icon-glyph-xsm)
360
+ );
361
+ --gog-field-sm-icon-inset: calc(
362
+ var(--gog-field-sm-icon-offset) * 2 + var(--gog-field-icon-glyph-sm)
363
+ );
364
+ --gog-field-md-icon-inset: calc(
365
+ var(--gog-field-md-icon-offset) * 2 + var(--gog-field-icon-glyph)
366
+ );
367
+ --gog-field-lg-icon-inset: calc(
368
+ var(--gog-field-lg-icon-offset) * 2 + var(--gog-field-icon-glyph)
369
+ );
370
+ --gog-field-slg-icon-inset: calc(
371
+ var(--gog-field-slg-icon-offset) * 2 + var(--gog-field-icon-glyph)
372
+ );
308
373
  --gog-field-md-font-size: var(--gog-text-md);
309
374
  --gog-field-md-icon-offset: var(--gog-control-icon-offset);
310
375
  --gog-field-lg-font-size: var(--gog-text-lg);
@@ -329,8 +394,8 @@
329
394
  --gog-accordion-focus-ring-width: var(--gog-focus-ring-width);
330
395
  --gog-accordion-body-color: var(--gog-text-color);
331
396
  --gog-accordion-body-line-height: 1.6;
332
- --gog-accordion-header-text-transform: uppercase;
333
- --gog-accordion-header-gap: 12px;
397
+ --gog-accordion-header-text-transform: var(--gog-text-transform);
398
+ --gog-accordion-header-gap: var(--gog-space-12);
334
399
  --gog-accordion-disabled-opacity: 0.5;
335
400
  --gog-accordion-transition-duration: var(--gog-duration-base);
336
401
  --gog-accordion-body-transition-duration: var(--gog-duration-slow);
@@ -345,63 +410,63 @@
345
410
  reads slightly darker than the header regardless of the surrounding surface color. */
346
411
  --gog-accordion-body-bg: color-mix(in srgb, black 6%, transparent);
347
412
  /* Per-size metrics. `lg` is the default size. */
348
- --gog-accordion-xsm-padding-y: 4px;
349
- --gog-accordion-xsm-padding-x: 8px;
413
+ --gog-accordion-xsm-padding-y: var(--gog-space-4);
414
+ --gog-accordion-xsm-padding-x: var(--gog-space-8);
350
415
  --gog-accordion-xsm-font-size: var(--gog-text-xs);
351
416
  --gog-accordion-xsm-letter-spacing: 0.2px;
352
- --gog-accordion-xsm-content-gap: 2px;
417
+ --gog-accordion-xsm-content-gap: var(--gog-space-2);
353
418
  --gog-accordion-xsm-body-font-size: var(--gog-text-xs);
354
419
  --gog-accordion-xsm-body-line-height: 1.5;
355
- --gog-accordion-xsm-body-padding-top: 4px;
356
- --gog-accordion-xsm-body-padding-bottom: 6px;
420
+ --gog-accordion-xsm-body-padding-top: var(--gog-space-4);
421
+ --gog-accordion-xsm-body-padding-bottom: var(--gog-space-6);
357
422
  --gog-accordion-xsm-chevron-size: 11px;
358
423
  --gog-accordion-xsm-chevron-font-size: 10px;
359
424
 
360
- --gog-accordion-sm-padding-y: 6px;
361
- --gog-accordion-sm-padding-x: 10px;
425
+ --gog-accordion-sm-padding-y: var(--gog-space-6);
426
+ --gog-accordion-sm-padding-x: var(--gog-space-10);
362
427
  --gog-accordion-sm-font-size: var(--gog-text-xs);
363
428
  --gog-accordion-sm-letter-spacing: 0.4px;
364
- --gog-accordion-sm-content-gap: 2px;
429
+ --gog-accordion-sm-content-gap: var(--gog-space-2);
365
430
  --gog-accordion-sm-body-font-size: var(--gog-text-xs);
366
431
  --gog-accordion-sm-body-line-height: var(--gog-accordion-body-line-height);
367
- --gog-accordion-sm-body-padding-top: 6px;
368
- --gog-accordion-sm-body-padding-bottom: 8px;
432
+ --gog-accordion-sm-body-padding-top: var(--gog-space-6);
433
+ --gog-accordion-sm-body-padding-bottom: var(--gog-space-8);
369
434
  --gog-accordion-sm-chevron-size: 13px;
370
435
  --gog-accordion-sm-chevron-font-size: 12px;
371
436
 
372
- --gog-accordion-md-padding-y: 10px;
373
- --gog-accordion-md-padding-x: 14px;
437
+ --gog-accordion-md-padding-y: var(--gog-space-10);
438
+ --gog-accordion-md-padding-x: var(--gog-space-14);
374
439
  --gog-accordion-md-font-size: var(--gog-text-xs);
375
440
  --gog-accordion-md-letter-spacing: 0.8px;
376
- --gog-accordion-md-content-gap: 2px;
441
+ --gog-accordion-md-content-gap: var(--gog-space-2);
377
442
  --gog-accordion-md-body-font-size: var(--gog-text-sm);
378
443
  --gog-accordion-md-body-line-height: var(--gog-accordion-body-line-height);
379
- --gog-accordion-md-body-padding-top: 8px;
380
- --gog-accordion-md-body-padding-bottom: 12px;
444
+ --gog-accordion-md-body-padding-top: var(--gog-space-8);
445
+ --gog-accordion-md-body-padding-bottom: var(--gog-space-12);
381
446
  --gog-accordion-md-chevron-size: 15px;
382
447
  --gog-accordion-md-chevron-font-size: 14px;
383
448
 
384
- --gog-accordion-lg-padding-y: 14px;
385
- --gog-accordion-lg-padding-x: 16px;
449
+ --gog-accordion-lg-padding-y: var(--gog-space-14);
450
+ --gog-accordion-lg-padding-x: var(--gog-space-16);
386
451
  --gog-accordion-lg-font-size: var(--gog-text-sm);
387
452
  --gog-accordion-lg-letter-spacing: 0.8px;
388
- --gog-accordion-lg-content-gap: 4px;
453
+ --gog-accordion-lg-content-gap: var(--gog-space-4);
389
454
  --gog-accordion-lg-body-font-size: var(--gog-text-md);
390
455
  --gog-accordion-lg-body-line-height: var(--gog-accordion-body-line-height);
391
- --gog-accordion-lg-body-padding-top: 12px;
392
- --gog-accordion-lg-body-padding-bottom: 16px;
456
+ --gog-accordion-lg-body-padding-top: var(--gog-space-12);
457
+ --gog-accordion-lg-body-padding-bottom: var(--gog-space-16);
393
458
  --gog-accordion-lg-chevron-size: 18px;
394
459
  --gog-accordion-lg-chevron-font-size: 16px;
395
460
 
396
- --gog-accordion-slg-padding-y: 18px;
397
- --gog-accordion-slg-padding-x: 18px;
461
+ --gog-accordion-slg-padding-y: var(--gog-space-18);
462
+ --gog-accordion-slg-padding-x: var(--gog-space-18);
398
463
  --gog-accordion-slg-font-size: var(--gog-text-md);
399
464
  --gog-accordion-slg-letter-spacing: 0.8px;
400
- --gog-accordion-slg-content-gap: 4px;
465
+ --gog-accordion-slg-content-gap: var(--gog-space-4);
401
466
  --gog-accordion-slg-body-font-size: var(--gog-text-lg);
402
467
  --gog-accordion-slg-body-line-height: var(--gog-accordion-body-line-height);
403
- --gog-accordion-slg-body-padding-top: 16px;
404
- --gog-accordion-slg-body-padding-bottom: 20px;
468
+ --gog-accordion-slg-body-padding-top: var(--gog-space-16);
469
+ --gog-accordion-slg-body-padding-bottom: var(--gog-space-20);
405
470
  --gog-accordion-slg-chevron-size: 20px;
406
471
  --gog-accordion-slg-chevron-font-size: 18px;
407
472
 
@@ -425,113 +490,85 @@
425
490
  `--gog-button-bg`, `--gog-button-color`, `--gog-button-border`, `--gog-button-shadow`,
426
491
  `--gog-button-hover-bg`, `--gog-button-hover-shadow`, `--gog-button-padding` and
427
492
  `--gog-button-font-size` are intentionally NOT declared — they are the per-instance
428
- escape hatch the variant/size classes fall back through. Their `--gog-btn-*` spellings
429
- are honoured by button.css's own fallback chain until 21.7.0, which is why they are the
430
- only `--gog-btn-*` names that do not appear below. */
431
- /* The size scale, moved out of the literals-only `:root` block by 21.5.0's rename: each
432
- now carries its pre-21.5.0 spelling as a fallback, and a value containing var() has to
433
- live here. The literals themselves have not changed. */
434
- --gog-button-xsm-padding: var(--gog-btn-xsm-padding, 0.25rem 0.5rem);
435
- --gog-button-sm-padding: var(--gog-btn-sm-padding, 0.5rem 0.875rem);
436
- --gog-button-md-padding: var(--gog-btn-md-padding, 0.75rem 1.25rem);
437
- --gog-button-lg-padding: var(--gog-btn-lg-padding, 1rem 1.5rem);
438
- --gog-button-slg-padding: var(--gog-btn-slg-padding, 1.25rem 1.75rem);
439
- --gog-button-xsm-font-size: var(--gog-btn-xsm-font-size, 0.75rem);
440
- --gog-button-sm-font-size: var(--gog-btn-sm-font-size, 0.875rem);
441
- --gog-button-md-font-size: var(--gog-btn-md-font-size, 1rem);
442
- --gog-button-lg-font-size: var(--gog-btn-lg-font-size, 1.125rem);
443
- --gog-button-slg-font-size: var(--gog-btn-slg-font-size, 1.25rem);
444
-
445
- --gog-button-font-family: var(--gog-btn-font-family, var(--gog-font-heading));
446
- --gog-button-font-weight: var(--gog-btn-font-weight, 900);
447
- --gog-button-letter-spacing: var(--gog-btn-letter-spacing, 1px);
448
- --gog-button-text-transform: var(--gog-btn-text-transform, uppercase);
449
- --gog-button-line-height: var(--gog-btn-line-height, 1);
450
- --gog-button-gap: var(--gog-btn-gap, var(--gog-space-sm));
451
- --gog-button-radius: var(--gog-btn-radius, var(--gog-radius));
452
- --gog-button-border-width: var(--gog-btn-border-width, var(--gog-control-border-width));
453
- --gog-button-border-style: var(--gog-btn-border-style, var(--gog-control-border-style));
454
- --gog-button-transition-duration: var(--gog-btn-transition-duration, var(--gog-duration-base));
455
- --gog-button-focus-ring-width: var(--gog-btn-focus-ring-width, var(--gog-focus-ring-width));
456
- --gog-button-focus-ring-offset: var(--gog-btn-focus-ring-offset, 3px);
457
- --gog-button-active-scale: var(--gog-btn-active-scale, 0.97);
458
- --gog-button-disabled-opacity: var(--gog-btn-disabled-opacity, var(--gog-disabled-opacity));
459
- --gog-button-loading-opacity: var(--gog-btn-loading-opacity, 0.7);
460
- --gog-button-spinner-max-size: var(--gog-btn-spinner-max-size, 70%);
461
-
462
- --gog-button-primary-bg: var(--gog-btn-primary-bg, var(--gog-accent-color));
463
- --gog-button-primary-color: var(
464
- --gog-btn-primary-color,
465
- var(--gog-accent-text-color, var(--gog-primary-color))
466
- );
467
- --gog-button-primary-border: var(--gog-btn-primary-border, transparent);
468
- --gog-button-primary-shadow: var(--gog-btn-primary-shadow, none);
469
- --gog-button-primary-hover-bg: var(--gog-btn-primary-hover-bg, var(--gog-accent-bright));
470
- --gog-button-primary-hover-color: var(
471
- --gog-btn-primary-hover-color,
472
- var(--gog-button-primary-color)
473
- );
474
- --gog-button-primary-hover-shadow: var(
475
- --gog-btn-primary-hover-shadow,
476
- 0 0 16px color-mix(in srgb, var(--gog-accent-bright) 45%, transparent)
477
- );
493
+ escape hatch the variant/size classes fall back through. */
494
+ --gog-button-xsm-padding: var(--gog-space-4) var(--gog-space-8);
495
+ --gog-button-sm-padding: var(--gog-space-8) var(--gog-space-14);
496
+ --gog-button-md-padding: var(--gog-space-12) var(--gog-space-20);
497
+ --gog-button-lg-padding: var(--gog-space-16) var(--gog-space-24);
498
+ --gog-button-slg-padding: var(--gog-space-20) var(--gog-space-28);
499
+ --gog-button-xsm-font-size: 0.75rem;
500
+ --gog-button-sm-font-size: 0.875rem;
501
+ --gog-button-md-font-size: 1rem;
502
+ --gog-button-lg-font-size: 1.125rem;
503
+ --gog-button-slg-font-size: 1.25rem;
504
+
505
+ --gog-button-font-family: var(--gog-font-heading);
506
+ --gog-button-font-weight: 900;
507
+ --gog-button-letter-spacing: var(--gog-letter-spacing);
508
+ --gog-button-text-transform: var(--gog-text-transform);
509
+ --gog-button-line-height: 1;
510
+ --gog-button-gap: var(--gog-space-sm);
511
+ --gog-button-radius: var(--gog-radius);
512
+ --gog-button-border-width: var(--gog-control-border-width);
513
+ --gog-button-border-style: var(--gog-control-border-style);
514
+ --gog-button-transition-duration: var(--gog-duration-base);
515
+ --gog-button-focus-ring-width: var(--gog-focus-ring-width);
516
+ --gog-button-focus-ring-offset: 3px;
517
+ --gog-button-active-scale: 0.97;
518
+ --gog-button-disabled-opacity: var(--gog-disabled-opacity);
519
+ --gog-button-loading-opacity: 0.7;
520
+ --gog-button-spinner-max-size: 70%;
521
+
522
+ --gog-button-primary-bg: var(--gog-accent-color);
523
+ --gog-button-primary-color: var(--gog-accent-text-color, var(--gog-primary-color));
524
+ --gog-button-primary-border: transparent;
525
+ --gog-button-primary-shadow: none;
526
+ --gog-button-primary-hover-bg: var(--gog-accent-bright);
527
+ --gog-button-primary-hover-color: var(--gog-button-primary-color);
528
+ --gog-button-primary-hover-shadow: 0 0 16px
529
+ color-mix(in srgb, var(--gog-accent-bright) 45%, transparent);
478
530
  /* The label's colour, not the page's. `--gog-text-color` is the colour of text on the page
479
531
  background, and a filled button is not the page background — on the dark theme that put pale
480
532
  parchment on bright amber, which read as a washed-out spinner beside a near-black label. */
481
- --gog-button-primary-spinner-color: var(
482
- --gog-btn-primary-spinner-color,
483
- var(--gog-button-primary-color)
484
- );
485
-
486
- --gog-button-secondary-bg: var(--gog-btn-secondary-bg, var(--gog-secondary-color));
487
- --gog-button-secondary-color: var(
488
- --gog-btn-secondary-color,
489
- var(--gog-accent-text-color, var(--gog-primary-color))
490
- );
491
- --gog-button-secondary-border: var(--gog-btn-secondary-border, transparent);
492
- --gog-button-secondary-shadow: var(--gog-btn-secondary-shadow, none);
493
- --gog-button-secondary-hover-bg: var(--gog-btn-secondary-hover-bg, var(--gog-accent-color));
494
- --gog-button-secondary-hover-color: var(
495
- --gog-btn-secondary-hover-color,
496
- var(--gog-button-secondary-color)
497
- );
498
- --gog-button-secondary-hover-shadow: var(--gog-btn-secondary-hover-shadow, none);
533
+ --gog-button-primary-spinner-color: var(--gog-button-primary-color);
534
+
535
+ --gog-button-secondary-bg: var(--gog-secondary-color);
536
+ --gog-button-secondary-color: var(--gog-accent-text-color, var(--gog-primary-color));
537
+ --gog-button-secondary-border: transparent;
538
+ --gog-button-secondary-shadow: none;
539
+ --gog-button-secondary-hover-bg: var(--gog-accent-color);
540
+ --gog-button-secondary-hover-color: var(--gog-button-secondary-color);
541
+ --gog-button-secondary-hover-shadow: none;
499
542
  /* Same reasoning as primary: the other filled variant, the same mismatch. */
500
- --gog-button-secondary-spinner-color: var(
501
- --gog-btn-secondary-spinner-color,
502
- var(--gog-button-secondary-color)
503
- );
504
-
505
- --gog-button-outline-bg: var(--gog-btn-outline-bg, transparent);
506
- --gog-button-outline-color: var(--gog-btn-outline-color, var(--gog-accent-color));
507
- --gog-button-outline-border: var(--gog-btn-outline-border, var(--gog-accent-color));
508
- --gog-button-outline-shadow: var(--gog-btn-outline-shadow, none);
509
- --gog-button-outline-hover-bg: var(--gog-btn-outline-hover-bg, var(--gog-accent-color));
510
- --gog-button-outline-hover-color: var(--gog-btn-outline-hover-color, var(--gog-primary-color));
511
- --gog-button-outline-hover-shadow: var(--gog-btn-outline-hover-shadow, none);
512
- --gog-button-outline-spinner-color: var(--gog-btn-outline-spinner-color, var(--gog-accent-color));
513
-
514
- --gog-button-ghost-bg: var(--gog-btn-ghost-bg, transparent);
515
- --gog-button-ghost-color: var(--gog-btn-ghost-color, var(--gog-accent-color));
516
- --gog-button-ghost-border: var(--gog-btn-ghost-border, transparent);
517
- --gog-button-ghost-shadow: var(--gog-btn-ghost-shadow, none);
518
- --gog-button-ghost-hover-bg: var(
519
- --gog-btn-ghost-hover-bg,
520
- color-mix(in srgb, var(--gog-accent-color) 12%, transparent)
521
- );
522
- --gog-button-ghost-hover-color: var(--gog-btn-ghost-hover-color, var(--gog-button-ghost-color));
523
- --gog-button-ghost-hover-shadow: var(--gog-btn-ghost-hover-shadow, none);
524
- --gog-button-ghost-spinner-color: var(--gog-btn-ghost-spinner-color, var(--gog-accent-color));
543
+ --gog-button-secondary-spinner-color: var(--gog-button-secondary-color);
544
+
545
+ --gog-button-outline-bg: transparent;
546
+ --gog-button-outline-color: var(--gog-accent-color);
547
+ --gog-button-outline-border: var(--gog-accent-color);
548
+ --gog-button-outline-shadow: none;
549
+ --gog-button-outline-hover-bg: var(--gog-accent-color);
550
+ --gog-button-outline-hover-color: var(--gog-primary-color);
551
+ --gog-button-outline-hover-shadow: none;
552
+ --gog-button-outline-spinner-color: var(--gog-accent-color);
553
+
554
+ --gog-button-ghost-bg: transparent;
555
+ --gog-button-ghost-color: var(--gog-accent-color);
556
+ --gog-button-ghost-border: transparent;
557
+ --gog-button-ghost-shadow: none;
558
+ --gog-button-ghost-hover-bg: color-mix(in srgb, var(--gog-accent-color) 12%, transparent);
559
+ --gog-button-ghost-hover-color: var(--gog-button-ghost-color);
560
+ --gog-button-ghost-hover-shadow: none;
561
+ --gog-button-ghost-spinner-color: var(--gog-accent-color);
525
562
 
526
563
  /* ── Button toggle group ───────────────────────────────────────────────────
527
564
  `--gog-button-toggle-bg`, `-color`, `-padding` and `-font-size` are intentionally NOT
528
565
  declared — they are the per-instance escape hatch the size classes fall back through.
529
- Padding/font-size reuse the `--gog-btn-<size>-*` scale so a toggle group and a
566
+ Padding/font-size reuse the `--gog-button-<size>-*` scale so a toggle group and a
530
567
  `<gog-button>` at the same `size` line up in a toolbar. */
531
568
  --gog-button-toggle-font-family: var(--gog-font-heading);
532
569
  --gog-button-toggle-font-weight: 700;
533
570
  --gog-button-toggle-letter-spacing: 0.5px;
534
- --gog-button-toggle-text-transform: uppercase;
571
+ --gog-button-toggle-text-transform: var(--gog-text-transform);
535
572
  --gog-button-toggle-line-height: 1;
536
573
  --gog-button-toggle-gap: var(--gog-space-sm);
537
574
  --gog-button-toggle-icon-size: 1.1em;
@@ -559,14 +596,14 @@
559
596
  /* Caps the host at its month grid instead of letting the header spread to the container.
560
597
  `100%` restores the pre-21.5.0 full-width behaviour. */
561
598
  --gog-calendar-max-width: max-content;
562
- --gog-calendar-padding: 12px;
563
- --gog-calendar-header-gap: 4px;
599
+ --gog-calendar-padding: var(--gog-space-12);
600
+ --gog-calendar-header-gap: var(--gog-space-4);
564
601
  --gog-calendar-header-margin: 8px;
565
- --gog-calendar-months-gap: 16px;
602
+ --gog-calendar-months-gap: var(--gog-space-16);
566
603
  --gog-calendar-title-color: var(--gog-text-color);
567
604
  --gog-calendar-title-font-weight: 700;
568
605
  --gog-calendar-nav-size: 28px;
569
- --gog-calendar-nav-radius: 6px;
606
+ --gog-calendar-nav-radius: calc(var(--gog-radius) - 2px);
570
607
  --gog-calendar-nav-bg: transparent;
571
608
  --gog-calendar-nav-color: var(--gog-muted-text-color);
572
609
  --gog-calendar-nav-hover-bg: var(--gog-hover-color);
@@ -574,14 +611,14 @@
574
611
  --gog-calendar-nav-icon-size: 0.8rem;
575
612
  /* Pulls the two chevrons of a year step together so they read as one control. */
576
613
  --gog-calendar-nav-icon-overlap: -0.35em;
577
- --gog-calendar-weekday-padding: 4px 0;
614
+ --gog-calendar-weekday-padding: var(--gog-space-4) 0;
578
615
  --gog-calendar-weekday-color: var(--gog-muted-text-color);
579
616
  --gog-calendar-weekday-font-size: var(--gog-text-xs);
580
617
  --gog-calendar-weekday-font-weight: 600;
581
- --gog-calendar-weekday-text-transform: uppercase;
582
- --gog-calendar-day-radius: 6px;
583
- --gog-calendar-day-border-width: 1px;
584
- --gog-calendar-day-border-style: solid;
618
+ --gog-calendar-weekday-text-transform: var(--gog-text-transform);
619
+ --gog-calendar-day-radius: calc(var(--gog-radius) - 2px);
620
+ --gog-calendar-day-border-width: var(--gog-border-width);
621
+ --gog-calendar-day-border-style: var(--gog-border-style);
585
622
  --gog-calendar-day-rest-bg: transparent;
586
623
  --gog-calendar-day-rest-color: var(--gog-text-color);
587
624
  --gog-calendar-day-hover-bg: var(--gog-hover-color);
@@ -603,13 +640,13 @@
603
640
  --gog-calendar-divider-width: 1px;
604
641
  --gog-calendar-divider-style: solid;
605
642
  --gog-calendar-divider-color: var(--gog-border-color);
606
- --gog-calendar-time-gap: 6px;
643
+ --gog-calendar-time-gap: var(--gog-space-6);
607
644
  --gog-calendar-time-margin: 10px;
608
645
  --gog-calendar-time-input-width: 3.5rem;
609
- --gog-calendar-time-input-padding: 4px 6px;
646
+ --gog-calendar-time-input-padding: var(--gog-space-4) var(--gog-space-6);
610
647
  --gog-calendar-time-input-bg: var(--gog-background-color);
611
- --gog-calendar-action-padding: 4px 10px;
612
- --gog-calendar-footer-gap: 8px;
648
+ --gog-calendar-action-padding: var(--gog-space-4) var(--gog-space-10);
649
+ --gog-calendar-footer-gap: var(--gog-space-8);
613
650
  --gog-calendar-xsm-font-size: var(--gog-text-xs);
614
651
  --gog-calendar-xsm-day-size: 24px;
615
652
  --gog-calendar-sm-font-size: var(--gog-text-sm);
@@ -621,11 +658,68 @@
621
658
  --gog-calendar-slg-font-size: var(--gog-text-lg);
622
659
  --gog-calendar-slg-day-size: 46px;
623
660
 
661
+ /* ── Card ──────────────────────────────────────────────────────────────────
662
+ `--gog-card-bg`, `--gog-card-border-color`, `--gog-card-shadow`, `--gog-card-padding-y`,
663
+ `--gog-card-padding-x` and `--gog-card-gap` are intentionally NOT declared — they are the
664
+ per-instance escape hatch the variant and size classes fall back through. */
665
+ --gog-card-font-family: var(--gog-font-body);
666
+ --gog-card-color: var(--gog-text-color);
667
+ --gog-card-radius: var(--gog-radius);
668
+ --gog-card-border-width: var(--gog-panel-border-width);
669
+ --gog-card-border-style: var(--gog-panel-border-style);
670
+ --gog-card-transition-duration: var(--gog-duration-base);
671
+
672
+ --gog-card-heading-color: var(--gog-text-color);
673
+ --gog-card-heading-font-family: var(--gog-font-heading);
674
+ --gog-card-heading-font-size: var(--gog-text-lg);
675
+ --gog-card-heading-font-weight: 600;
676
+ --gog-card-heading-line-height: 1.3;
677
+
678
+ --gog-card-outlined-bg: var(--gog-surface-color);
679
+ --gog-card-outlined-border-color: var(--gog-border-color);
680
+ --gog-card-outlined-shadow: none;
681
+ --gog-card-elevated-bg: var(--gog-surface-color);
682
+ --gog-card-elevated-border-color: transparent;
683
+ /* The shared surface shadow, so a card sits at the same elevation as a dialog or a
684
+ dropdown panel instead of inventing a second house style for "raised". */
685
+ --gog-card-elevated-shadow: var(--gog-panel-shadow);
686
+ --gog-card-filled-bg: color-mix(in srgb, var(--gog-accent-dim) 8%, var(--gog-surface-color));
687
+ --gog-card-filled-border-color: transparent;
688
+ --gog-card-filled-shadow: none;
689
+
690
+ /* Hover and focus only ever show on a card that holds a `gogCardLink`. */
691
+ --gog-card-hover-border-color: color-mix(in srgb, var(--gog-accent-color) 45%, transparent);
692
+ --gog-card-hover-shadow: var(--gog-panel-shadow);
693
+ --gog-card-focus-ring: var(--gog-accent-color);
694
+ --gog-card-focus-ring-width: var(--gog-focus-ring-width);
695
+ --gog-card-focus-ring-offset: var(--gog-focus-ring-offset);
696
+ --gog-card-disabled-opacity: var(--gog-disabled-opacity);
697
+
698
+ --gog-card-footer-border-color: var(--gog-border-color);
699
+ --gog-card-footer-gap: var(--gog-space-sm);
700
+ --gog-card-footer-padding-top: var(--gog-space-sm);
701
+
702
+ --gog-card-xsm-padding-y: var(--gog-space-8);
703
+ --gog-card-xsm-padding-x: var(--gog-space-10);
704
+ --gog-card-xsm-gap: var(--gog-space-6);
705
+ --gog-card-sm-padding-y: var(--gog-space-12);
706
+ --gog-card-sm-padding-x: var(--gog-space-14);
707
+ --gog-card-sm-gap: var(--gog-space-sm);
708
+ --gog-card-md-padding-y: var(--gog-space-md);
709
+ --gog-card-md-padding-x: var(--gog-space-20);
710
+ --gog-card-md-gap: var(--gog-space-12);
711
+ --gog-card-lg-padding-y: var(--gog-space-20);
712
+ --gog-card-lg-padding-x: var(--gog-space-lg);
713
+ --gog-card-lg-gap: var(--gog-space-14);
714
+ --gog-card-slg-padding-y: var(--gog-space-28);
715
+ --gog-card-slg-padding-x: var(--gog-space-32);
716
+ --gog-card-slg-gap: var(--gog-space-md);
717
+
624
718
  /* ── Checkbox ──────────────────────────────────────────────────────────────
625
719
  Box/label/icon size and padding come from the `--gog-control-checkbox-*` scale;
626
720
  checkbox.component.ts maps the `size` input onto the host. */
627
721
  --gog-checkbox-font-family: var(--gog-font-body);
628
- --gog-checkbox-gap: 10px;
722
+ --gog-checkbox-gap: var(--gog-space-10);
629
723
  --gog-checkbox-radius: var(--gog-radius);
630
724
  --gog-checkbox-border-width: var(--gog-control-border-width);
631
725
  --gog-checkbox-border-style: var(--gog-control-border-style);
@@ -649,12 +743,12 @@
649
743
  Box/label size reuse the `--gog-control-checkbox-*` scale (see Checkbox above);
650
744
  radio-group.component.ts maps the `size` input onto the host the same way. */
651
745
  --gog-radio-font-family: var(--gog-font-body);
652
- --gog-radio-group-gap: 10px;
746
+ --gog-radio-group-gap: var(--gog-space-10);
653
747
  --gog-radio-group-label-size: var(--gog-text-sm);
654
748
  --gog-radio-group-label-color: var(--gog-muted-text-color);
655
- --gog-radio-group-option-gap: 8px;
656
- --gog-radio-group-option-gap-horizontal: 20px;
657
- --gog-radio-gap: 10px;
749
+ --gog-radio-group-option-gap: var(--gog-space-8);
750
+ --gog-radio-group-option-gap-horizontal: var(--gog-space-20);
751
+ --gog-radio-gap: var(--gog-space-10);
658
752
  --gog-radio-border-width: var(--gog-control-border-width);
659
753
  --gog-radio-border-style: var(--gog-control-border-style);
660
754
  --gog-radio-border-color: var(--gog-accent-dim);
@@ -681,8 +775,8 @@
681
775
  --gog-chip-bg: color-mix(in srgb, var(--gog-surface-color) 88%, var(--gog-hover-color));
682
776
  --gog-chip-hover-bg: color-mix(in srgb, var(--gog-hover-color) 45%, var(--gog-surface-color));
683
777
  --gog-chip-border: var(--gog-border-color);
684
- --gog-chip-border-width: 1px;
685
- --gog-chip-border-style: solid;
778
+ --gog-chip-border-width: var(--gog-border-width);
779
+ --gog-chip-border-style: var(--gog-border-style);
686
780
  --gog-chip-color: var(--gog-text-color);
687
781
  --gog-chip-font-weight: 500;
688
782
  --gog-chip-line-height: 1.2;
@@ -698,41 +792,41 @@
698
792
  --gog-chip-focus-ring-offset: var(--gog-focus-ring-offset);
699
793
 
700
794
  --gog-chip-xsm-font-size: 0.6875rem;
701
- --gog-chip-xsm-padding-block: 0.225rem;
702
- --gog-chip-xsm-padding-inline: 0.375rem;
703
- --gog-chip-xsm-gap: 0.275rem;
795
+ --gog-chip-xsm-padding-block: var(--gog-space-4);
796
+ --gog-chip-xsm-padding-inline: var(--gog-space-6);
797
+ --gog-chip-xsm-gap: var(--gog-space-4);
704
798
  --gog-chip-xsm-avatar-size: 0.875rem;
705
799
  --gog-chip-xsm-icon-size: 0.6875rem;
706
800
  --gog-chip-xsm-remove-size: 0.75rem;
707
801
 
708
802
  --gog-chip-sm-font-size: 0.75rem;
709
- --gog-chip-sm-padding-block: 0.3rem;
710
- --gog-chip-sm-padding-inline: 0.5rem;
711
- --gog-chip-sm-gap: 0.375rem;
803
+ --gog-chip-sm-padding-block: var(--gog-space-4);
804
+ --gog-chip-sm-padding-inline: var(--gog-space-8);
805
+ --gog-chip-sm-gap: var(--gog-space-6);
712
806
  --gog-chip-sm-avatar-size: 1rem;
713
807
  --gog-chip-sm-icon-size: 0.75rem;
714
808
  --gog-chip-sm-remove-size: 0.875rem;
715
809
 
716
810
  --gog-chip-md-font-size: 0.875rem;
717
- --gog-chip-md-padding-block: 0.45rem;
718
- --gog-chip-md-padding-inline: 0.75rem;
719
- --gog-chip-md-gap: 0.5rem;
811
+ --gog-chip-md-padding-block: var(--gog-space-8);
812
+ --gog-chip-md-padding-inline: var(--gog-space-12);
813
+ --gog-chip-md-gap: var(--gog-space-8);
720
814
  --gog-chip-md-avatar-size: 1.25rem;
721
815
  --gog-chip-md-icon-size: 0.875rem;
722
816
  --gog-chip-md-remove-size: 1rem;
723
817
 
724
818
  --gog-chip-lg-font-size: 1rem;
725
- --gog-chip-lg-padding-block: 0.6rem;
726
- --gog-chip-lg-padding-inline: 0.875rem;
727
- --gog-chip-lg-gap: 0.625rem;
819
+ --gog-chip-lg-padding-block: var(--gog-space-10);
820
+ --gog-chip-lg-padding-inline: var(--gog-space-14);
821
+ --gog-chip-lg-gap: var(--gog-space-10);
728
822
  --gog-chip-lg-avatar-size: 1.5rem;
729
823
  --gog-chip-lg-icon-size: 1rem;
730
824
  --gog-chip-lg-remove-size: 1.125rem;
731
825
 
732
826
  --gog-chip-slg-font-size: 1.125rem;
733
- --gog-chip-slg-padding-block: 0.75rem;
734
- --gog-chip-slg-padding-inline: 1rem;
735
- --gog-chip-slg-gap: 0.75rem;
827
+ --gog-chip-slg-padding-block: var(--gog-space-12);
828
+ --gog-chip-slg-padding-inline: var(--gog-space-16);
829
+ --gog-chip-slg-gap: var(--gog-space-12);
736
830
  --gog-chip-slg-avatar-size: 1.75rem;
737
831
  --gog-chip-slg-icon-size: 1.125rem;
738
832
  --gog-chip-slg-remove-size: 1.25rem;
@@ -756,10 +850,10 @@
756
850
  --gog-dialog-shadow: 0 24px 48px rgba(0, 0, 0, 0.5);
757
851
  --gog-dialog-min-width: 320px;
758
852
  --gog-dialog-max-height: 90vh;
759
- --gog-dialog-header-padding: 16px 20px 14px;
760
- --gog-dialog-header-gap: 12px;
853
+ --gog-dialog-header-padding: var(--gog-space-16) var(--gog-space-20) var(--gog-space-14);
854
+ --gog-dialog-header-gap: var(--gog-space-12);
761
855
  --gog-dialog-header-border-color: var(--gog-border-color);
762
- --gog-dialog-body-padding: 20px;
856
+ --gog-dialog-body-padding: var(--gog-space-20);
763
857
  --gog-dialog-body-max-height: calc(var(--gog-dialog-max-height) - 60px);
764
858
  --gog-dialog-close-size: 2rem;
765
859
  --gog-dialog-close-font-size: 0.875rem;
@@ -772,16 +866,13 @@
772
866
  --gog-dialog-close-focus-ring-offset: var(--gog-focus-ring-offset);
773
867
 
774
868
  /* Confirmation dialog */
775
- --gog-confirmation-dialog-gap: var(--gog-confirm-gap, 12px);
776
- --gog-confirmation-dialog-min-width: var(--gog-confirm-min-width, 320px);
777
- --gog-confirmation-dialog-max-width: var(--gog-confirm-max-width, 440px);
778
- --gog-confirmation-dialog-color: var(--gog-confirm-color, var(--gog-text-color));
779
- --gog-confirmation-dialog-description-color: var(
780
- --gog-confirm-description-color,
781
- var(--gog-muted-text-color)
782
- );
783
- --gog-confirmation-dialog-actions-gap: var(--gog-confirm-actions-gap, var(--gog-space-sm));
784
- --gog-confirmation-dialog-actions-offset: var(--gog-confirm-actions-offset, var(--gog-space-sm));
869
+ --gog-confirmation-dialog-gap: var(--gog-space-12);
870
+ --gog-confirmation-dialog-min-width: 320px;
871
+ --gog-confirmation-dialog-max-width: 440px;
872
+ --gog-confirmation-dialog-color: var(--gog-text-color);
873
+ --gog-confirmation-dialog-description-color: var(--gog-muted-text-color);
874
+ --gog-confirmation-dialog-actions-gap: var(--gog-space-sm);
875
+ --gog-confirmation-dialog-actions-offset: var(--gog-space-sm);
785
876
 
786
877
  /* ── Autocomplete ──────────────────────────────────────────────────────────
787
878
  A combobox whose trigger is a real text input. Padding/font-size reuse the shared
@@ -791,12 +882,12 @@
791
882
  back through. */
792
883
  --gog-autocomplete-font-family: var(--gog-font-body);
793
884
  --gog-autocomplete-label-font-family: var(--gog-font-heading);
794
- --gog-autocomplete-gap: 4px;
885
+ --gog-autocomplete-gap: var(--gog-space-4);
795
886
  --gog-autocomplete-label-color: var(--gog-accent-color);
796
887
  --gog-autocomplete-label-font-size: var(--gog-text-sm);
797
888
  --gog-autocomplete-label-font-weight: 600;
798
- --gog-autocomplete-label-letter-spacing: 1px;
799
- --gog-autocomplete-label-text-transform: uppercase;
889
+ --gog-autocomplete-label-letter-spacing: var(--gog-letter-spacing);
890
+ --gog-autocomplete-label-text-transform: var(--gog-text-transform);
800
891
  --gog-autocomplete-field-bg: var(--gog-surface-color);
801
892
  --gog-autocomplete-text-color: var(--gog-text-color);
802
893
  --gog-autocomplete-placeholder-color: var(--gog-muted-text-color);
@@ -820,7 +911,7 @@
820
911
  /* Trailing chrome: spinner and clear button, clear outermost — the arrangement the other
821
912
  dropdowns settled on, so all of them line up in a form. */
822
913
  --gog-autocomplete-actions-inset: var(--gog-control-icon-offset);
823
- --gog-autocomplete-actions-gap: 6px;
914
+ --gog-autocomplete-actions-gap: var(--gog-space-6);
824
915
  /* Right padding on the input, reserving room for the actions above. */
825
916
  --gog-autocomplete-actions-reserve: 40px;
826
917
  --gog-autocomplete-clear-color: var(--gog-autocomplete-placeholder-color);
@@ -834,14 +925,14 @@
834
925
  --gog-autocomplete-panel-border-style: var(--gog-panel-border-style);
835
926
  --gog-autocomplete-panel-border-color: var(--gog-border-color);
836
927
  --gog-autocomplete-panel-radius: var(--gog-radius);
837
- --gog-autocomplete-panel-gap: 2px;
928
+ --gog-autocomplete-panel-gap: var(--gog-space-2);
838
929
  --gog-autocomplete-panel-max-height: 260px;
839
930
  /* Ceiling for a content-sized panel, so one very long option cannot span the viewport. */
840
931
  --gog-autocomplete-panel-max-width: 420px;
841
- --gog-autocomplete-options-padding: 4px;
842
- --gog-autocomplete-option-padding: 8px 10px;
843
- --gog-autocomplete-option-radius: 4px;
844
- --gog-autocomplete-option-gap: 10px;
932
+ --gog-autocomplete-options-padding: var(--gog-space-4);
933
+ --gog-autocomplete-option-padding: var(--gog-space-8) var(--gog-space-10);
934
+ --gog-autocomplete-option-radius: calc(var(--gog-radius) - 4px);
935
+ --gog-autocomplete-option-gap: var(--gog-space-10);
845
936
  --gog-autocomplete-option-color: var(--gog-text-color);
846
937
  --gog-autocomplete-option-hover-bg: color-mix(in srgb, var(--gog-accent-color) 10%, transparent);
847
938
  --gog-autocomplete-option-hover-color: var(--gog-text-color);
@@ -870,12 +961,12 @@
870
961
  sideways only. */
871
962
  --gog-badge-size: 1.25rem;
872
963
  --gog-badge-dot-size: 0.5rem;
873
- --gog-badge-padding-inline: 5px;
964
+ --gog-badge-padding-inline: var(--gog-space-4);
874
965
  --gog-badge-radius: 999px;
875
966
  /* How far the badge hangs outside its host's corner. */
876
967
  --gog-badge-offset: 6px;
877
968
  --gog-badge-border-width: 0;
878
- --gog-badge-border-style: solid;
969
+ --gog-badge-border-style: var(--gog-border-style);
879
970
  --gog-badge-border-color: transparent;
880
971
  /* Above the host's own chrome but below any overlay panel (--gog-dropdown-z is 300). */
881
972
  --gog-badge-z: 1;
@@ -896,11 +987,11 @@
896
987
  back through. */
897
988
  --gog-datepicker-font-family: var(--gog-font-body);
898
989
  --gog-datepicker-label-font-family: var(--gog-font-heading);
899
- --gog-datepicker-gap: 4px;
990
+ --gog-datepicker-gap: var(--gog-space-4);
900
991
  --gog-datepicker-label-color: var(--gog-accent-color);
901
992
  --gog-datepicker-label-font-size: var(--gog-text-sm);
902
- --gog-datepicker-label-letter-spacing: 1px;
903
- --gog-datepicker-label-text-transform: uppercase;
993
+ --gog-datepicker-label-letter-spacing: var(--gog-letter-spacing);
994
+ --gog-datepicker-label-text-transform: var(--gog-text-transform);
904
995
  --gog-datepicker-field-bg: var(--gog-surface-color);
905
996
  --gog-datepicker-text-color: var(--gog-text-color);
906
997
  --gog-datepicker-placeholder-color: var(--gog-muted-text-color);
@@ -921,7 +1012,7 @@
921
1012
  --gog-datepicker-error-font-size: var(--gog-text-xs);
922
1013
  --gog-datepicker-min-width: 150px;
923
1014
  --gog-datepicker-actions-inset: var(--gog-control-icon-offset);
924
- --gog-datepicker-actions-gap: 6px;
1015
+ --gog-datepicker-actions-gap: var(--gog-space-6);
925
1016
  /* Right padding on the input, reserving room for the calendar and clear buttons. */
926
1017
  --gog-datepicker-actions-reserve: 40px;
927
1018
  --gog-datepicker-icon-color: var(--gog-accent-color);
@@ -935,7 +1026,7 @@
935
1026
  --gog-datepicker-panel-border-style: var(--gog-panel-border-style);
936
1027
  --gog-datepicker-panel-border-color: var(--gog-border-color);
937
1028
  --gog-datepicker-panel-radius: var(--gog-radius);
938
- --gog-datepicker-panel-gap: 2px;
1029
+ --gog-datepicker-panel-gap: var(--gog-space-2);
939
1030
  /* The dropdown surface. Inline mode is `gog-calendar` itself, so it sizes from
940
1031
  `--gog-calendar-max-width` rather than from this. */
941
1032
  --gog-datepicker-panel-width: max-content;
@@ -971,11 +1062,11 @@
971
1062
  /* ── Input field ───────────────────────────────────────────────────────────── */
972
1063
  --gog-input-font-family: var(--gog-font-body);
973
1064
  --gog-input-label-font-family: var(--gog-font-heading);
974
- --gog-input-gap: 4px;
1065
+ --gog-input-gap: var(--gog-space-4);
975
1066
  --gog-input-label-color: var(--gog-accent-color);
976
1067
  --gog-input-label-font-size: var(--gog-text-sm);
977
- --gog-input-label-letter-spacing: 1px;
978
- --gog-input-label-text-transform: uppercase;
1068
+ --gog-input-label-letter-spacing: var(--gog-letter-spacing);
1069
+ --gog-input-label-text-transform: var(--gog-text-transform);
979
1070
  --gog-input-field-bg: var(--gog-surface-color);
980
1071
  --gog-input-field-border: var(--gog-accent-dim);
981
1072
  --gog-input-field-border-width: var(--gog-control-border-width);
@@ -993,7 +1084,7 @@
993
1084
  --gog-input-error-offset: 2px;
994
1085
  --gog-input-icon-color: var(--gog-muted-text-color);
995
1086
  --gog-input-icon-hover-color: var(--gog-accent-color);
996
- --gog-input-icon-action-radius: 4px;
1087
+ --gog-input-icon-action-radius: calc(var(--gog-radius) - 4px);
997
1088
  --gog-input-icon-focus-ring-width: 2px;
998
1089
  /* Number field's spin buttons — a subtle fill on hover, since they sit flush against the
999
1090
  field's own border rather than floating with their own padding like the other icons. */
@@ -1017,7 +1108,7 @@
1017
1108
  --gog-textarea-resize-grip-color: var(--gog-input-field-border);
1018
1109
  --gog-textarea-resize-grip-opacity: 0.8;
1019
1110
  --gog-textarea-resize-grip-stripe-width: 1.5px;
1020
- --gog-textarea-resize-grip-stripe-gap: 3px;
1111
+ --gog-textarea-resize-grip-stripe-gap: var(--gog-space-2);
1021
1112
  --gog-textarea-resize-grip-offset: 3px;
1022
1113
  /*
1023
1114
  Both default to 0 and are overwritten per instance, as an inline style on the field, from
@@ -1044,149 +1135,87 @@
1044
1135
  --gog-input-float-label-over-gap: var(--gog-field-float-label-over-gap);
1045
1136
  --gog-input-float-label-over-reserve: var(--gog-field-float-label-over-reserve);
1046
1137
 
1047
- /* ── Multiselect ─────────────────────────────────────────────────────────────
1048
- `--gog-ms-*` was the pre-21.3.0 spelling and sits in each token's fallback, so an
1049
- existing override of it still feeds the component — see the header's note on the
1050
- pre-21.5.0 spellings for why it is a fallback rather than a second declaration.
1051
- Until 21.5.0 these were two declarations per token, which had that bug.
1052
- @deprecated since 21.3.0 (2026-08-07) — use `--gog-multiselect-*`. Removed in 21.7.0. */
1053
- --gog-multiselect-font-family: var(--gog-ms-font-family, var(--gog-font-body));
1054
- --gog-multiselect-label-font-family: var(--gog-ms-label-font-family, var(--gog-font-heading));
1055
- --gog-multiselect-gap: var(--gog-ms-gap, 4px);
1056
- --gog-multiselect-option-gap: var(--gog-ms-option-gap, 4px);
1057
- --gog-multiselect-options-padding: var(--gog-ms-options-padding, 4px);
1058
- --gog-multiselect-label-color: var(--gog-ms-label-color, var(--gog-accent-color));
1059
- --gog-multiselect-label-font-size: var(--gog-ms-label-font-size, var(--gog-text-sm));
1060
- --gog-multiselect-label-letter-spacing: var(--gog-ms-label-letter-spacing, 1px);
1061
- --gog-multiselect-label-text-transform: var(--gog-ms-label-text-transform, uppercase);
1062
- --gog-multiselect-field-bg: var(--gog-ms-field-bg, var(--gog-surface-color));
1063
- --gog-multiselect-field-border: var(--gog-ms-field-border, var(--gog-accent-dim));
1064
- --gog-multiselect-field-border-width: var(
1065
- --gog-ms-field-border-width,
1066
- var(--gog-control-border-width)
1067
- );
1068
- --gog-multiselect-field-border-style: var(
1069
- --gog-ms-field-border-style,
1070
- var(--gog-control-border-style)
1071
- );
1072
- --gog-multiselect-radius: var(--gog-ms-radius, var(--gog-radius));
1073
- --gog-multiselect-field-color: var(--gog-ms-field-color, var(--gog-text-color));
1074
- --gog-multiselect-value-color: var(--gog-ms-value-color, var(--gog-text-color));
1075
- --gog-multiselect-placeholder-color: var(--gog-ms-placeholder-color, var(--gog-muted-text-color));
1076
- --gog-multiselect-focus-border: var(--gog-ms-focus-border, var(--gog-accent-color));
1077
- --gog-multiselect-focus-ring: var(
1078
- --gog-ms-focus-ring,
1079
- color-mix(in srgb, var(--gog-accent-color) 25%, transparent)
1080
- );
1081
- --gog-multiselect-focus-glow: var(--gog-ms-focus-glow, 0 0 8px var(--gog-ms-focus-ring));
1082
- --gog-multiselect-focus-ring-width: var(--gog-ms-focus-ring-width, var(--gog-focus-ring-width));
1083
- --gog-multiselect-focus-ring-offset: var(
1084
- --gog-ms-focus-ring-offset,
1085
- var(--gog-focus-ring-offset)
1086
- );
1087
- --gog-multiselect-error-color: var(--gog-ms-error-color, var(--gog-danger-color));
1088
- --gog-multiselect-error-font-size: var(--gog-ms-error-font-size, var(--gog-text-xs));
1089
- --gog-multiselect-error-offset: var(--gog-ms-error-offset, 2px);
1090
- --gog-multiselect-border-color: var(--gog-ms-border-color, var(--gog-accent-color));
1091
- --gog-multiselect-panel-bg: var(--gog-ms-panel-bg, var(--gog-surface-color));
1092
- --gog-multiselect-panel-border: var(--gog-ms-panel-border, var(--gog-accent-color));
1093
- --gog-multiselect-panel-shadow: var(--gog-ms-panel-shadow, var(--gog-panel-shadow));
1094
- --gog-multiselect-panel-max-height: var(--gog-ms-panel-max-height, 260px);
1095
- --gog-multiselect-panel-offset: var(--gog-ms-panel-offset, 2px);
1096
- --gog-multiselect-option-hover-bg: var(
1097
- --gog-ms-option-hover-bg,
1098
- color-mix(in srgb, var(--gog-accent-color) 10%, transparent)
1099
- );
1100
- --gog-multiselect-option-color: var(--gog-ms-option-color, var(--gog-text-color));
1101
- --gog-multiselect-option-gap-inline: var(--gog-ms-option-gap-inline, 10px);
1138
+ /* ── Multiselect ───────────────────────────────────────────────────────────── */
1139
+ --gog-multiselect-font-family: var(--gog-font-body);
1140
+ --gog-multiselect-label-font-family: var(--gog-font-heading);
1141
+ --gog-multiselect-gap: var(--gog-space-4);
1142
+ --gog-multiselect-option-gap: var(--gog-space-4);
1143
+ --gog-multiselect-options-padding: var(--gog-space-4);
1144
+ --gog-multiselect-label-color: var(--gog-accent-color);
1145
+ --gog-multiselect-label-font-size: var(--gog-text-sm);
1146
+ --gog-multiselect-label-letter-spacing: var(--gog-letter-spacing);
1147
+ --gog-multiselect-label-text-transform: var(--gog-text-transform);
1148
+ --gog-multiselect-field-bg: var(--gog-surface-color);
1149
+ --gog-multiselect-field-border: var(--gog-accent-dim);
1150
+ --gog-multiselect-field-border-width: var(--gog-control-border-width);
1151
+ --gog-multiselect-field-border-style: var(--gog-control-border-style);
1152
+ --gog-multiselect-radius: var(--gog-radius);
1153
+ --gog-multiselect-field-color: var(--gog-text-color);
1154
+ --gog-multiselect-value-color: var(--gog-text-color);
1155
+ --gog-multiselect-placeholder-color: var(--gog-muted-text-color);
1156
+ --gog-multiselect-focus-border: var(--gog-accent-color);
1157
+ --gog-multiselect-focus-ring: color-mix(in srgb, var(--gog-accent-color) 25%, transparent);
1158
+ --gog-multiselect-focus-glow: 0 0 8px var(--gog-multiselect-focus-ring);
1159
+ --gog-multiselect-focus-ring-width: var(--gog-focus-ring-width);
1160
+ --gog-multiselect-focus-ring-offset: var(--gog-focus-ring-offset);
1161
+ --gog-multiselect-error-color: var(--gog-danger-color);
1162
+ --gog-multiselect-error-font-size: var(--gog-text-xs);
1163
+ --gog-multiselect-error-offset: 2px;
1164
+ --gog-multiselect-border-color: var(--gog-accent-color);
1165
+ --gog-multiselect-panel-bg: var(--gog-surface-color);
1166
+ --gog-multiselect-panel-border: var(--gog-accent-color);
1167
+ --gog-multiselect-panel-shadow: var(--gog-panel-shadow);
1168
+ --gog-multiselect-panel-max-height: 260px;
1169
+ --gog-multiselect-panel-offset: 2px;
1170
+ --gog-multiselect-option-hover-bg: color-mix(in srgb, var(--gog-accent-color) 10%, transparent);
1171
+ --gog-multiselect-option-color: var(--gog-text-color);
1172
+ --gog-multiselect-option-gap-inline: var(--gog-space-10);
1102
1173
  /* Estimated row height fed into the panel's up/down placement math; not itself a real
1103
1174
  layout property, so it has no effect unless the JS reads it. */
1104
- --gog-multiselect-option-height: var(--gog-ms-option-height, 40px);
1105
- --gog-multiselect-option-radius: var(--gog-ms-option-radius, calc(var(--gog-radius) - 2px));
1106
- --gog-multiselect-option-disabled-opacity: var(--gog-ms-option-disabled-opacity, 0.5);
1107
- --gog-multiselect-option-transition-duration: var(
1108
- --gog-ms-option-transition-duration,
1109
- var(--gog-duration-fast)
1110
- );
1111
- --gog-multiselect-checkbox-border: var(--gog-ms-checkbox-border, var(--gog-accent-dim));
1112
- --gog-multiselect-checkbox-bg: var(--gog-ms-checkbox-bg, var(--gog-background-color));
1113
- --gog-multiselect-checkbox-checked-bg: var(--gog-ms-checkbox-checked-bg, var(--gog-accent-color));
1114
- --gog-multiselect-checkbox-checked-color: var(
1115
- --gog-ms-checkbox-checked-color,
1116
- var(--gog-primary-color)
1117
- );
1118
- --gog-multiselect-controls-gap: var(--gog-ms-controls-gap, 4px);
1119
- --gog-multiselect-controls-padding: var(--gog-ms-controls-padding, 6px 10px);
1120
- --gog-multiselect-actions-gap: var(--gog-ms-actions-gap, 6px);
1121
- --gog-multiselect-filter-padding: var(--gog-ms-filter-padding, 6px);
1122
- --gog-multiselect-filter-input-padding-y: var(--gog-ms-filter-input-padding-y, 6px);
1123
- --gog-multiselect-filter-input-padding-x: var(--gog-ms-filter-input-padding-x, 8px);
1124
- --gog-multiselect-filter-input-bg: var(--gog-ms-filter-input-bg, var(--gog-background-color));
1125
- --gog-multiselect-filter-input-color: var(
1126
- --gog-ms-filter-input-color,
1127
- var(--gog-multiselect-control-color)
1128
- );
1129
- --gog-multiselect-filter-input-border: var(
1130
- --gog-ms-filter-input-border,
1131
- var(--gog-multiselect-control-border)
1132
- );
1133
- --gog-multiselect-filter-input-radius: var(--gog-ms-filter-input-radius, var(--gog-radius));
1134
- --gog-multiselect-filter-border-width: var(
1135
- --gog-ms-filter-border-width,
1136
- var(--gog-panel-border-width)
1137
- );
1138
- --gog-multiselect-filter-border-style: var(
1139
- --gog-ms-filter-border-style,
1140
- var(--gog-panel-border-style)
1141
- );
1142
- --gog-multiselect-filter-border-color: var(--gog-ms-filter-border-color, var(--gog-border-color));
1143
- --gog-multiselect-filter-empty-padding: var(--gog-ms-filter-empty-padding, 10px);
1144
- --gog-multiselect-filter-empty-color: var(
1145
- --gog-ms-filter-empty-color,
1146
- var(--gog-multiselect-placeholder-color)
1147
- );
1175
+ --gog-multiselect-option-height: 40px;
1176
+ --gog-multiselect-option-radius: calc(var(--gog-radius) - 2px);
1177
+ --gog-multiselect-option-disabled-opacity: 0.5;
1178
+ --gog-multiselect-option-transition-duration: var(--gog-duration-fast);
1179
+ --gog-multiselect-checkbox-border: var(--gog-accent-dim);
1180
+ --gog-multiselect-checkbox-bg: var(--gog-background-color);
1181
+ --gog-multiselect-checkbox-checked-bg: var(--gog-accent-color);
1182
+ --gog-multiselect-checkbox-checked-color: var(--gog-primary-color);
1183
+ --gog-multiselect-controls-gap: var(--gog-space-4);
1184
+ --gog-multiselect-controls-padding: var(--gog-space-6) var(--gog-space-10);
1185
+ --gog-multiselect-actions-gap: var(--gog-space-6);
1186
+ --gog-multiselect-filter-padding: var(--gog-space-6);
1187
+ --gog-multiselect-filter-input-padding-y: var(--gog-space-6);
1188
+ --gog-multiselect-filter-input-padding-x: var(--gog-space-8);
1189
+ --gog-multiselect-filter-input-bg: var(--gog-background-color);
1190
+ --gog-multiselect-filter-input-color: var(--gog-multiselect-field-color);
1191
+ --gog-multiselect-filter-input-border: var(--gog-multiselect-field-border);
1192
+ --gog-multiselect-filter-input-radius: var(--gog-radius);
1193
+ --gog-multiselect-filter-border-width: var(--gog-panel-border-width);
1194
+ --gog-multiselect-filter-border-style: var(--gog-panel-border-style);
1195
+ --gog-multiselect-filter-border-color: var(--gog-border-color);
1196
+ --gog-multiselect-filter-empty-padding: var(--gog-space-10);
1197
+ --gog-multiselect-filter-empty-color: var(--gog-multiselect-placeholder-color);
1148
1198
  /* Matches --gog-select-chevron-inset; see the note there. */
1149
1199
  /* "+N" badge shown when the selection does not fit on one line. */
1150
- --gog-multiselect-overflow-color: var(
1151
- --gog-ms-overflow-color,
1152
- var(--gog-multiselect-placeholder-color)
1153
- );
1154
- --gog-multiselect-overflow-font-size: var(--gog-ms-overflow-font-size, var(--gog-text-sm));
1155
- --gog-multiselect-overflow-gap: var(--gog-ms-overflow-gap, 6px);
1156
- --gog-multiselect-min-width: var(--gog-ms-min-width, 120px);
1157
- --gog-multiselect-panel-max-width: var(--gog-ms-panel-max-width, 420px);
1158
- --gog-multiselect-actions-inset: var(--gog-ms-actions-inset, var(--gog-control-icon-offset));
1159
- --gog-multiselect-clear-radius: var(--gog-ms-clear-radius, 2px);
1160
- --gog-multiselect-disabled-opacity: var(--gog-ms-disabled-opacity, var(--gog-disabled-opacity));
1161
- --gog-multiselect-transition-duration: var(
1162
- --gog-ms-transition-duration,
1163
- var(--gog-duration-base)
1164
- );
1165
- --gog-multiselect-float-label-reserve: var(
1166
- --gog-ms-float-label-reserve,
1167
- var(--gog-field-float-label-reserve)
1168
- );
1169
- --gog-multiselect-float-label-in-top: var(
1170
- --gog-ms-float-label-in-top,
1171
- var(--gog-field-float-label-in-top)
1172
- );
1173
- --gog-multiselect-float-label-over-gap: var(
1174
- --gog-ms-float-label-over-gap,
1175
- var(--gog-field-float-label-over-gap)
1176
- );
1177
- --gog-multiselect-float-label-over-reserve: var(
1178
- --gog-ms-float-label-over-reserve,
1179
- var(--gog-field-float-label-over-reserve)
1180
- );
1181
- --gog-multiselect-arrow-transition-duration: var(
1182
- --gog-ms-arrow-transition-duration,
1183
- var(--gog-duration-slow)
1184
- );
1200
+ --gog-multiselect-overflow-color: var(--gog-multiselect-placeholder-color);
1201
+ --gog-multiselect-overflow-font-size: var(--gog-text-sm);
1202
+ --gog-multiselect-overflow-gap: var(--gog-space-6);
1203
+ --gog-multiselect-min-width: 120px;
1204
+ --gog-multiselect-panel-max-width: 420px;
1205
+ --gog-multiselect-actions-inset: var(--gog-control-icon-offset);
1206
+ --gog-multiselect-clear-radius: 2px;
1207
+ --gog-multiselect-disabled-opacity: var(--gog-disabled-opacity);
1208
+ --gog-multiselect-transition-duration: var(--gog-duration-base);
1209
+ --gog-multiselect-float-label-reserve: var(--gog-field-float-label-reserve);
1210
+ --gog-multiselect-float-label-in-top: var(--gog-field-float-label-in-top);
1211
+ --gog-multiselect-float-label-over-gap: var(--gog-field-float-label-over-gap);
1212
+ --gog-multiselect-float-label-over-reserve: var(--gog-field-float-label-over-reserve);
1213
+ --gog-multiselect-arrow-transition-duration: var(--gog-duration-slow);
1185
1214
  /* Icon geometry, expressed as a ratio of the control's font size. */
1186
- --gog-multiselect-clear-icon-ratio: var(--gog-ms-clear-icon-ratio, 0.7);
1187
- --gog-multiselect-arrow-icon-ratio: var(--gog-ms-arrow-icon-ratio, 0.875);
1188
- --gog-multiselect-mark-size-ratio: var(--gog-ms-mark-size-ratio, 1.2375);
1189
- --gog-multiselect-mark-icon-ratio: var(--gog-ms-mark-icon-ratio, 1.125);
1215
+ --gog-multiselect-clear-icon-ratio: 0.7;
1216
+ --gog-multiselect-arrow-icon-ratio: 0.875;
1217
+ --gog-multiselect-mark-size-ratio: 1.2375;
1218
+ --gog-multiselect-mark-icon-ratio: 1.125;
1190
1219
 
1191
1220
  /* ── Menu ──────────────────────────────────────────────────────────────────
1192
1221
  The command menu opened by `[gogMenuTrigger]`. Metrics follow the dropdown panel's, so a
@@ -1199,8 +1228,8 @@
1199
1228
  --gog-menu-radius: var(--gog-panel-radius);
1200
1229
  --gog-menu-shadow: var(--gog-dialog-shadow);
1201
1230
  --gog-menu-font-family: var(--gog-font-body);
1202
- --gog-menu-padding: 4px;
1203
- --gog-menu-gap: 2px;
1231
+ --gog-menu-padding: var(--gog-space-4);
1232
+ --gog-menu-gap: var(--gog-space-2);
1204
1233
  --gog-menu-offset: 4px;
1205
1234
  --gog-menu-min-width: 180px;
1206
1235
  --gog-menu-max-width: 320px;
@@ -1212,7 +1241,7 @@
1212
1241
  --gog-menu-item-hover-bg: var(--gog-hover-color);
1213
1242
  --gog-menu-item-hover-color: var(--gog-text-color);
1214
1243
  --gog-menu-item-font-size: var(--gog-text-sm);
1215
- --gog-menu-item-padding: 8px 12px;
1244
+ --gog-menu-item-padding: var(--gog-space-8) var(--gog-space-12);
1216
1245
  --gog-menu-item-radius: var(--gog-radius);
1217
1246
  --gog-menu-item-gap: var(--gog-space-sm);
1218
1247
  --gog-menu-item-disabled-opacity: var(--gog-disabled-opacity);
@@ -1221,7 +1250,7 @@
1221
1250
  --gog-menu-item-icon-size: 1em;
1222
1251
 
1223
1252
  /* ── Paginator ─────────────────────────────────────────────────────────────── */
1224
- --gog-paginator-gap: 4px;
1253
+ --gog-paginator-gap: var(--gog-space-4);
1225
1254
  --gog-paginator-ellipsis-color: var(--gog-muted-text-color);
1226
1255
  --gog-paginator-ellipsis-font-size: var(--gog-text-sm);
1227
1256
  --gog-paginator-ellipsis-font-family: var(--gog-font-body);
@@ -1229,6 +1258,67 @@
1229
1258
  --gog-paginator-page-size-min-width: 5rem;
1230
1259
  --gog-paginator-ellipsis-min-width: 32px;
1231
1260
 
1261
+ /* ── Panel ─────────────────────────────────────────────────────────────────
1262
+ The `gog-panel` component, which shares its prefix with the foundation surface tier
1263
+ above (`--gog-panel-radius`, `--gog-panel-shadow`, `--gog-panel-border-width`,
1264
+ `--gog-panel-border-style`) deliberately: a panel is the surface those describe, and a
1265
+ theme that sets a house radius for raised surfaces should get it here too.
1266
+
1267
+ `--gog-panel-bg`, `--gog-panel-border-color`, `--gog-panel-padding-y`,
1268
+ `--gog-panel-padding-x` and `--gog-panel-gap` are intentionally NOT declared — the
1269
+ per-instance escape hatch. There is no `--gog-panel-*-shadow` twin of that hatch for the
1270
+ elevated variant: it reads `--gog-panel-shadow` from a declaration the component makes on
1271
+ its own host, so setting that token on one panel already changes only that panel. */
1272
+ --gog-panel-font-family: var(--gog-font-body);
1273
+ --gog-panel-color: var(--gog-text-color);
1274
+ --gog-panel-transition-duration: var(--gog-duration-base);
1275
+
1276
+ --gog-panel-heading-color: var(--gog-text-color);
1277
+ --gog-panel-heading-font-family: var(--gog-font-heading);
1278
+ --gog-panel-heading-font-size: var(--gog-text-xl);
1279
+ --gog-panel-heading-font-weight: 600;
1280
+ --gog-panel-heading-line-height: 1.25;
1281
+
1282
+ --gog-panel-outlined-bg: var(--gog-surface-color);
1283
+ --gog-panel-outlined-border-color: var(--gog-border-color);
1284
+ --gog-panel-outlined-shadow: none;
1285
+ --gog-panel-elevated-bg: var(--gog-surface-color);
1286
+ --gog-panel-elevated-border-color: transparent;
1287
+ --gog-panel-filled-bg: color-mix(in srgb, var(--gog-accent-dim) 8%, var(--gog-surface-color));
1288
+ --gog-panel-filled-border-color: transparent;
1289
+ --gog-panel-filled-shadow: none;
1290
+
1291
+ --gog-panel-header-gap: var(--gog-space-sm);
1292
+ --gog-panel-toggle-size: 2rem;
1293
+ --gog-panel-toggle-radius: var(--gog-radius);
1294
+ --gog-panel-toggle-color: var(--gog-muted-text-color);
1295
+ --gog-panel-toggle-hover-bg: color-mix(in srgb, var(--gog-hover-color) 70%, transparent);
1296
+ --gog-panel-chevron-size: 1rem;
1297
+ --gog-panel-focus-ring: var(--gog-accent-color);
1298
+ --gog-panel-focus-ring-width: var(--gog-focus-ring-width);
1299
+ --gog-panel-focus-ring-offset: var(--gog-focus-ring-offset);
1300
+ --gog-panel-disabled-opacity: var(--gog-disabled-opacity);
1301
+
1302
+ --gog-panel-footer-border-color: var(--gog-border-color);
1303
+ --gog-panel-footer-gap: var(--gog-space-sm);
1304
+ --gog-panel-footer-padding-top: var(--gog-space-sm);
1305
+
1306
+ --gog-panel-xsm-padding-y: var(--gog-space-10);
1307
+ --gog-panel-xsm-padding-x: var(--gog-space-12);
1308
+ --gog-panel-xsm-gap: var(--gog-space-sm);
1309
+ --gog-panel-sm-padding-y: var(--gog-space-14);
1310
+ --gog-panel-sm-padding-x: var(--gog-space-md);
1311
+ --gog-panel-sm-gap: var(--gog-space-10);
1312
+ --gog-panel-md-padding-y: var(--gog-space-18);
1313
+ --gog-panel-md-padding-x: var(--gog-space-20);
1314
+ --gog-panel-md-gap: var(--gog-space-12);
1315
+ --gog-panel-lg-padding-y: var(--gog-space-lg);
1316
+ --gog-panel-lg-padding-x: var(--gog-space-28);
1317
+ --gog-panel-lg-gap: var(--gog-space-md);
1318
+ --gog-panel-slg-padding-y: var(--gog-space-32);
1319
+ --gog-panel-slg-padding-x: var(--gog-space-32);
1320
+ --gog-panel-slg-gap: var(--gog-space-20);
1321
+
1232
1322
  /* ── Progressbar ──────────────────────────────────────────────────────────── */
1233
1323
  --gog-progressbar-track-base-bg: color-mix(
1234
1324
  in srgb,
@@ -1273,6 +1363,20 @@
1273
1363
  --gog-progressbar-info-bg: var(--gog-info-color);
1274
1364
  --gog-progressbar-info-buffer-bg: color-mix(in srgb, var(--gog-info-color) 35%, transparent);
1275
1365
 
1366
+ /* ── Ripple (the `gogRipple` directive; its classes live in ripple.css) ────
1367
+ `currentColor` rather than a fixed colour on purpose: the wash then reads as the host's
1368
+ own foreground, so one value works on a filled button and on a ghost one without a
1369
+ per-variant tier. The property is inherited, so `--gog-ripple-color` set anywhere above
1370
+ the host reaches it — which is the per-instance override, no undeclared tier needed. */
1371
+ --gog-ripple-color: currentColor;
1372
+ --gog-ripple-opacity: 0.16;
1373
+ /* Longer than any other motion in the library, deliberately: a ripple held to the house 0.2s
1374
+ is over before the eye has followed it across the surface. Still expressed in the
1375
+ foundation scale, so setting the durations to 0s still flattens it theme-wide. */
1376
+ --gog-ripple-enter-duration: calc(var(--gog-duration-slow) * 2);
1377
+ --gog-ripple-exit-duration: var(--gog-duration-slow);
1378
+ --gog-ripple-easing: var(--gog-easing);
1379
+
1276
1380
  /* ── Scroll ────────────────────────────────────────────────────────────────── */
1277
1381
  --gog-scroll-track-bg: transparent;
1278
1382
  --gog-scroll-track-radius: var(--gog-radius);
@@ -1296,17 +1400,17 @@
1296
1400
  `thin` variant gets more of it since its 6px track leaves the least visible thumb to aim
1297
1401
  at; both land the effective hit width in the ~22-24px range generally recommended for a
1298
1402
  comfortable pointer target. */
1299
- --gog-scroll-normal-thumb-hit-padding: 6px;
1300
- --gog-scroll-thin-thumb-hit-padding: 9px;
1403
+ --gog-scroll-normal-thumb-hit-padding: var(--gog-space-6);
1404
+ --gog-scroll-thin-thumb-hit-padding: var(--gog-space-8);
1301
1405
 
1302
1406
  /* ── Select ────────────────────────────────────────────────────────────────── */
1303
1407
  --gog-select-font-family: var(--gog-font-body);
1304
1408
  --gog-select-label-font-family: var(--gog-font-heading);
1305
- --gog-select-gap: 4px;
1409
+ --gog-select-gap: var(--gog-space-4);
1306
1410
  --gog-select-label-color: var(--gog-accent-color);
1307
1411
  --gog-select-label-font-size: var(--gog-text-sm);
1308
- --gog-select-label-letter-spacing: 1px;
1309
- --gog-select-label-text-transform: uppercase;
1412
+ --gog-select-label-letter-spacing: var(--gog-letter-spacing);
1413
+ --gog-select-label-text-transform: var(--gog-text-transform);
1310
1414
  --gog-select-field-bg: var(--gog-surface-color);
1311
1415
  --gog-select-field-border: var(--gog-accent-dim);
1312
1416
  --gog-select-field-border-width: var(--gog-control-border-width);
@@ -1335,25 +1439,25 @@
1335
1439
  /* Ceiling for a content-sized panel, so one very long option cannot span the viewport. */
1336
1440
  --gog-select-panel-max-width: 420px;
1337
1441
  /* Filter box — only rendered when `filter` is on. */
1338
- --gog-select-filter-padding: 6px;
1339
- --gog-select-filter-input-padding-y: 6px;
1340
- --gog-select-filter-input-padding-x: 8px;
1442
+ --gog-select-filter-padding: var(--gog-space-6);
1443
+ --gog-select-filter-input-padding-y: var(--gog-space-6);
1444
+ --gog-select-filter-input-padding-x: var(--gog-space-8);
1341
1445
  --gog-select-filter-input-bg: var(--gog-background-color);
1342
- --gog-select-filter-input-color: var(--gog-select-control-color);
1343
- --gog-select-filter-input-border: var(--gog-select-control-border);
1446
+ --gog-select-filter-input-color: var(--gog-select-field-color);
1447
+ --gog-select-filter-input-border: var(--gog-select-field-border);
1344
1448
  --gog-select-filter-input-radius: var(--gog-radius);
1345
1449
  --gog-select-filter-border-width: var(--gog-panel-border-width);
1346
1450
  --gog-select-filter-border-style: var(--gog-panel-border-style);
1347
1451
  --gog-select-filter-border-color: var(--gog-select-option-border-color, var(--gog-border-color));
1348
- --gog-select-filter-empty-padding: 10px;
1452
+ --gog-select-filter-empty-padding: var(--gog-space-10);
1349
1453
  --gog-select-filter-empty-color: var(--gog-select-placeholder-color);
1350
1454
  /* Clear button — only rendered once a value is selected, see `clearable`. */
1351
1455
  --gog-select-clear-radius: 2px;
1352
1456
  --gog-select-clear-icon-ratio: 0.7;
1353
- --gog-select-clear-gap: 6px;
1457
+ --gog-select-clear-gap: var(--gog-space-6);
1354
1458
  --gog-select-clear-color: var(--gog-select-placeholder-color);
1355
1459
  --gog-select-clear-hover-color: var(--gog-select-label-color);
1356
- --gog-select-control-gap: 12px;
1460
+ --gog-select-control-gap: var(--gog-space-12);
1357
1461
  --gog-select-panel-bg: var(--gog-surface-color);
1358
1462
  --gog-select-panel-shadow: var(--gog-panel-shadow);
1359
1463
  --gog-select-panel-max-height: 260px;
@@ -1361,7 +1465,7 @@
1361
1465
  --gog-select-option-hover-bg: color-mix(in srgb, var(--gog-accent-color) 10%, transparent);
1362
1466
  --gog-select-option-selected-color: var(--gog-accent-color);
1363
1467
  --gog-select-option-color: var(--gog-text-color);
1364
- --gog-select-option-gap: 10px;
1468
+ --gog-select-option-gap: var(--gog-space-10);
1365
1469
  /* Estimated row height fed into the panel's up/down placement math; not itself a real
1366
1470
  layout property, so it has no effect unless the JS reads it. */
1367
1471
  --gog-select-option-height: 40px;
@@ -1413,11 +1517,11 @@
1413
1517
  --gog-slider-label-font-family: var(--gog-font-heading);
1414
1518
  --gog-slider-value-font-family: var(--gog-font-mono);
1415
1519
  --gog-slider-error-font-family: var(--gog-font-body);
1416
- --gog-slider-gap: 6px;
1520
+ --gog-slider-gap: var(--gog-space-6);
1417
1521
  --gog-slider-label-color: var(--gog-accent-color);
1418
1522
  --gog-slider-label-font-size: var(--gog-text-sm);
1419
- --gog-slider-label-letter-spacing: 1px;
1420
- --gog-slider-label-text-transform: uppercase;
1523
+ --gog-slider-label-letter-spacing: var(--gog-letter-spacing);
1524
+ --gog-slider-label-text-transform: var(--gog-text-transform);
1421
1525
  --gog-slider-value-color: var(--gog-accent-color);
1422
1526
  --gog-slider-value-font-size: var(--gog-text-sm);
1423
1527
  --gog-slider-value-min-width: 40px;
@@ -1436,9 +1540,9 @@
1436
1540
  * legible against its own theme's surface.
1437
1541
  */
1438
1542
  --gog-slider-track-bg: color-mix(in srgb, var(--gog-text-color) 30%, var(--gog-border-color));
1439
- --gog-slider-track-border-width: 1px;
1440
- --gog-slider-track-border-style: solid;
1441
- /* Transparent by default — same opt-in convention as --gog-btn-primary-border: the
1543
+ --gog-slider-track-border-width: var(--gog-border-width);
1544
+ --gog-slider-track-border-style: var(--gog-border-style);
1545
+ /* Transparent by default — same opt-in convention as --gog-button-primary-border: the
1442
1546
  width/style are always in the box model, but invisible until a theme sets a color. */
1443
1547
  --gog-slider-track-border-color: transparent;
1444
1548
  /* Bound via `background` (not `background-color`) in slider.component.scss, so this
@@ -1448,7 +1552,7 @@
1448
1552
  --gog-slider-thumb-size: 16px;
1449
1553
  --gog-slider-thumb-bg: var(--gog-accent-color);
1450
1554
  --gog-slider-thumb-border: var(--gog-background-color);
1451
- --gog-slider-thumb-border-width: 2px;
1555
+ --gog-slider-thumb-border-width: var(--gog-control-border-width);
1452
1556
  --gog-slider-thumb-radius: 50%;
1453
1557
  --gog-slider-thumb-shadow: color-mix(in srgb, var(--gog-accent-bright) 40%, transparent);
1454
1558
  --gog-slider-thumb-glow-size: 6px;
@@ -1495,11 +1599,11 @@
1495
1599
  --gog-table-font-family: var(--gog-font-body);
1496
1600
  --gog-table-header-font-family: var(--gog-font-heading);
1497
1601
  --gog-table-numeric-font-family: var(--gog-font-mono);
1498
- --gog-table-gap: 12px;
1602
+ --gog-table-gap: var(--gog-space-12);
1499
1603
  --gog-table-border-color: var(--gog-accent-dim);
1500
- --gog-table-border-width: 2px;
1501
- --gog-table-border-style: solid;
1502
- --gog-table-row-border-width: 1px;
1604
+ --gog-table-border-width: var(--gog-control-border-width);
1605
+ --gog-table-border-style: var(--gog-border-style);
1606
+ --gog-table-row-border-width: var(--gog-border-width);
1503
1607
  /* The selection column is sized to its checkbox and never grows with content. */
1504
1608
  --gog-table-select-col-width: 44px;
1505
1609
  --gog-table-surface: var(--gog-surface-color);
@@ -1512,38 +1616,38 @@
1512
1616
  --gog-table-muted-color: var(--gog-muted-text-color);
1513
1617
  --gog-table-focus-ring: var(--gog-accent-color);
1514
1618
  --gog-table-focus-ring-width: var(--gog-focus-ring-width);
1515
- --gog-table-header-letter-spacing: 1px;
1516
- --gog-table-header-text-transform: uppercase;
1619
+ --gog-table-header-letter-spacing: var(--gog-letter-spacing);
1620
+ --gog-table-header-text-transform: var(--gog-text-transform);
1517
1621
  --gog-table-num-col-width: 48px;
1518
- --gog-table-th-inner-gap: 6px;
1622
+ --gog-table-th-inner-gap: var(--gog-space-6);
1519
1623
  --gog-table-sort-icon-size: 0.9em;
1520
1624
  --gog-table-sort-icon-width: 1.1em;
1521
1625
  --gog-table-sort-icon-opacity: 0.6;
1522
- --gog-table-empty-padding: 24px 14px;
1626
+ --gog-table-empty-padding: var(--gog-space-24) var(--gog-space-14);
1523
1627
  --gog-table-empty-font-size: var(--gog-text-md);
1524
- --gog-table-loading-padding: 32px 14px;
1628
+ --gog-table-loading-padding: var(--gog-space-32) var(--gog-space-14);
1525
1629
  --gog-table-loading-opacity: 0.5;
1526
1630
  --gog-table-row-transition-duration: var(--gog-duration-fast);
1527
1631
  --gog-table-footer-gap: var(--gog-space-sm);
1528
1632
  --gog-table-footer-min-height: 32px;
1529
1633
  --gog-table-total-font-size: var(--gog-text-xs);
1530
1634
  --gog-table-total-letter-spacing: 0.5px;
1531
- --gog-table-total-text-transform: uppercase;
1635
+ --gog-table-total-text-transform: var(--gog-text-transform);
1532
1636
  --gog-table-num-font-size: var(--gog-text-xs);
1533
- --gog-table-padding-h: 14px;
1534
- --gog-table-xsm-padding-v: 2px;
1637
+ --gog-table-padding-h: var(--gog-space-14);
1638
+ --gog-table-xsm-padding-v: var(--gog-space-2);
1535
1639
  --gog-table-xsm-th-font-size: var(--gog-text-xs);
1536
1640
  --gog-table-xsm-td-font-size: var(--gog-text-xs);
1537
- --gog-table-sm-padding-v: 3px;
1641
+ --gog-table-sm-padding-v: var(--gog-space-2);
1538
1642
  --gog-table-sm-th-font-size: var(--gog-text-xs);
1539
1643
  --gog-table-sm-td-font-size: var(--gog-text-xs);
1540
- --gog-table-md-padding-v: 6px;
1644
+ --gog-table-md-padding-v: var(--gog-space-6);
1541
1645
  --gog-table-md-th-font-size: var(--gog-text-xs);
1542
1646
  --gog-table-md-td-font-size: var(--gog-text-sm);
1543
- --gog-table-lg-padding-v: 10px;
1647
+ --gog-table-lg-padding-v: var(--gog-space-10);
1544
1648
  --gog-table-lg-th-font-size: var(--gog-text-sm);
1545
1649
  --gog-table-lg-td-font-size: var(--gog-text-md);
1546
- --gog-table-slg-padding-v: 14px;
1650
+ --gog-table-slg-padding-v: var(--gog-space-14);
1547
1651
  --gog-table-slg-th-font-size: var(--gog-text-md);
1548
1652
  --gog-table-slg-td-font-size: var(--gog-text-lg);
1549
1653
 
@@ -1564,8 +1668,8 @@
1564
1668
  --gog-tabs-rest-color: var(--gog-muted-text-color);
1565
1669
  --gog-tabs-hover-color: var(--gog-text-color);
1566
1670
  --gog-tabs-active-color: var(--gog-accent-color);
1567
- --gog-tabs-header-border-width: 1px;
1568
- --gog-tabs-header-border-style: solid;
1671
+ --gog-tabs-header-border-width: var(--gog-border-width);
1672
+ --gog-tabs-header-border-style: var(--gog-border-style);
1569
1673
  --gog-tabs-header-border-color: var(--gog-border-color);
1570
1674
  --gog-tabs-indicator-color: var(--gog-accent-color);
1571
1675
  --gog-tabs-indicator-thickness: 2px;
@@ -1577,15 +1681,15 @@
1577
1681
  --gog-tabs-focus-ring-color: var(--gog-accent-color);
1578
1682
  --gog-tabs-panel-padding: var(--gog-space-md);
1579
1683
  --gog-tabs-panel-color: var(--gog-text-color);
1580
- --gog-tabs-xsm-padding: 0.375rem 0.625rem;
1684
+ --gog-tabs-xsm-padding: var(--gog-space-6) var(--gog-space-10);
1581
1685
  --gog-tabs-xsm-font-size: var(--gog-text-xs);
1582
- --gog-tabs-sm-padding: 0.5rem 0.875rem;
1686
+ --gog-tabs-sm-padding: var(--gog-space-8) var(--gog-space-14);
1583
1687
  --gog-tabs-sm-font-size: var(--gog-text-sm);
1584
- --gog-tabs-md-padding: 0.75rem 1.125rem;
1688
+ --gog-tabs-md-padding: var(--gog-space-12) var(--gog-space-18);
1585
1689
  --gog-tabs-md-font-size: var(--gog-text-md);
1586
- --gog-tabs-lg-padding: 1rem 1.5rem;
1690
+ --gog-tabs-lg-padding: var(--gog-space-16) var(--gog-space-24);
1587
1691
  --gog-tabs-lg-font-size: var(--gog-text-lg);
1588
- --gog-tabs-slg-padding: 1.25rem 1.75rem;
1692
+ --gog-tabs-slg-padding: var(--gog-space-20) var(--gog-space-28);
1589
1693
  --gog-tabs-slg-font-size: var(--gog-text-xl);
1590
1694
 
1591
1695
  /* ── Tag ──────────────────────────────────────────────────────────────────
@@ -1601,42 +1705,42 @@
1601
1705
  --gog-tag-color-mix: 82%;
1602
1706
  --gog-tag-bg-base: var(--gog-surface-color);
1603
1707
  --gog-tag-color-base: black;
1604
- --gog-tag-border-width: 1px;
1605
- --gog-tag-border-style: solid;
1606
- --gog-tag-inner-border-width: 1px;
1708
+ --gog-tag-border-width: var(--gog-border-width);
1709
+ --gog-tag-border-style: var(--gog-border-style);
1710
+ --gog-tag-inner-border-width: var(--gog-border-width);
1607
1711
  --gog-tag-font-weight: 600;
1608
1712
  --gog-tag-line-height: 1;
1609
1713
  --gog-tag-radius: max(var(--gog-radius), 2px);
1610
1714
  --gog-tag-pill-radius: 9999px;
1611
1715
 
1612
1716
  --gog-tag-xsm-font-size: 0.6875rem;
1613
- --gog-tag-xsm-padding-block: 0.1875rem;
1614
- --gog-tag-xsm-padding-inline: 0.375rem;
1615
- --gog-tag-xsm-gap: 0.1875rem;
1717
+ --gog-tag-xsm-padding-block: var(--gog-space-2);
1718
+ --gog-tag-xsm-padding-inline: var(--gog-space-6);
1719
+ --gog-tag-xsm-gap: var(--gog-space-2);
1616
1720
  --gog-tag-xsm-icon-size: 0.6875rem;
1617
1721
 
1618
1722
  --gog-tag-sm-font-size: 0.75rem;
1619
- --gog-tag-sm-padding-block: 0.25rem;
1620
- --gog-tag-sm-padding-inline: 0.5rem;
1621
- --gog-tag-sm-gap: 0.25rem;
1723
+ --gog-tag-sm-padding-block: var(--gog-space-4);
1724
+ --gog-tag-sm-padding-inline: var(--gog-space-8);
1725
+ --gog-tag-sm-gap: var(--gog-space-4);
1622
1726
  --gog-tag-sm-icon-size: 0.75rem;
1623
1727
 
1624
1728
  --gog-tag-md-font-size: 0.875rem;
1625
- --gog-tag-md-padding-block: 0.375rem;
1626
- --gog-tag-md-padding-inline: 0.75rem;
1627
- --gog-tag-md-gap: 0.375rem;
1729
+ --gog-tag-md-padding-block: var(--gog-space-6);
1730
+ --gog-tag-md-padding-inline: var(--gog-space-12);
1731
+ --gog-tag-md-gap: var(--gog-space-6);
1628
1732
  --gog-tag-md-icon-size: 0.875rem;
1629
1733
 
1630
1734
  --gog-tag-lg-font-size: 1rem;
1631
- --gog-tag-lg-padding-block: 0.5rem;
1632
- --gog-tag-lg-padding-inline: 0.875rem;
1633
- --gog-tag-lg-gap: 0.5rem;
1735
+ --gog-tag-lg-padding-block: var(--gog-space-8);
1736
+ --gog-tag-lg-padding-inline: var(--gog-space-14);
1737
+ --gog-tag-lg-gap: var(--gog-space-8);
1634
1738
  --gog-tag-lg-icon-size: 1rem;
1635
1739
 
1636
1740
  --gog-tag-slg-font-size: 1.125rem;
1637
- --gog-tag-slg-padding-block: 0.625rem;
1638
- --gog-tag-slg-padding-inline: 1rem;
1639
- --gog-tag-slg-gap: 0.625rem;
1741
+ --gog-tag-slg-padding-block: var(--gog-space-10);
1742
+ --gog-tag-slg-padding-inline: var(--gog-space-16);
1743
+ --gog-tag-slg-gap: var(--gog-space-10);
1640
1744
  --gog-tag-slg-icon-size: 1.125rem;
1641
1745
 
1642
1746
  /* ── Toast ────────────────────────────────────────────────────────────────── */
@@ -1650,18 +1754,18 @@
1650
1754
  --gog-toast-warning-color: var(--gog-accent-bright);
1651
1755
  --gog-toast-info-color: var(--gog-accent-color);
1652
1756
  --gog-toast-accent-width: 4px;
1653
- --gog-toast-padding: 12px 14px;
1757
+ --gog-toast-padding: var(--gog-space-12) var(--gog-space-14);
1654
1758
  --gog-toast-radius: 0px;
1655
- --gog-toast-content-gap: 10px;
1759
+ --gog-toast-content-gap: var(--gog-space-10);
1656
1760
  --gog-toast-main-gap: var(--gog-space-sm);
1657
- --gog-toast-actions-gap: 6px;
1761
+ --gog-toast-actions-gap: var(--gog-space-6);
1658
1762
  --gog-toast-message-font-size: var(--gog-text-sm);
1659
1763
  --gog-toast-message-line-height: 1.5;
1660
1764
  --gog-toast-icon-size: 1rem;
1661
1765
  --gog-toast-icon-line-height: 1.4;
1662
- --gog-toast-action-padding: 0.25rem 0.5rem;
1766
+ --gog-toast-action-padding: var(--gog-space-4) var(--gog-space-8);
1663
1767
  --gog-toast-action-font-size: 0.75rem;
1664
- --gog-toast-close-padding: 0.125rem 0.25rem;
1768
+ --gog-toast-close-padding: var(--gog-space-2) var(--gog-space-4);
1665
1769
  --gog-toast-close-font-size: 0.75rem;
1666
1770
  --gog-toast-progress-height: 3px;
1667
1771
  --gog-toast-progress-opacity: 30%;
@@ -1683,8 +1787,8 @@
1683
1787
  --gog-toggle-font-family: var(--gog-font-body);
1684
1788
  --gog-toggle-gap: var(--gog-space-sm);
1685
1789
  --gog-toggle-radius: 999px;
1686
- --gog-toggle-border-width: 1px;
1687
- --gog-toggle-border-style: solid;
1790
+ --gog-toggle-border-width: var(--gog-border-width);
1791
+ --gog-toggle-border-style: var(--gog-border-style);
1688
1792
  --gog-toggle-border-color: var(--gog-border-color);
1689
1793
  --gog-toggle-on-border-color: var(--gog-accent-color);
1690
1794
  --gog-toggle-track-off-bg: color-mix(in srgb, var(--gog-text-color) 18%, transparent);
@@ -1704,13 +1808,13 @@
1704
1808
  --gog-toggle-state-color: var(--gog-accent-text-color, var(--gog-primary-color));
1705
1809
  --gog-toggle-state-font-weight: 600;
1706
1810
  --gog-toggle-state-letter-spacing: 0.04em;
1707
- --gog-toggle-state-padding-inline: 4px;
1811
+ --gog-toggle-state-padding-inline: var(--gog-space-4);
1708
1812
  --gog-toggle-state-offset: 6px;
1709
1813
  /* Gap between the wording and the thumb parked at the opposite end. The clearance itself
1710
1814
  (thumb size + this) is computed in the component stylesheet, not here: a `var(` to a
1711
1815
  size-class token is substituted where it is *declared*, so doing that calc on :root would
1712
1816
  freeze it to the md thumb and stop it scaling with `size`. */
1713
- --gog-toggle-state-thumb-gap: 6px;
1817
+ --gog-toggle-state-thumb-gap: var(--gog-space-6);
1714
1818
  --gog-toggle-xsm-track-width: 24px;
1715
1819
  --gog-toggle-xsm-track-height: 14px;
1716
1820
  --gog-toggle-xsm-thumb-size: 10px;
@@ -1741,7 +1845,7 @@
1741
1845
  --gog-tooltip-font-family: var(--gog-font-body);
1742
1846
  --gog-tooltip-font-size: var(--gog-text-xs);
1743
1847
  --gog-tooltip-line-height: 1.4;
1744
- --gog-tooltip-padding: 6px 10px;
1848
+ --gog-tooltip-padding: var(--gog-space-6) var(--gog-space-10);
1745
1849
  --gog-tooltip-radius: var(--gog-radius);
1746
1850
  --gog-tooltip-max-width: 280px;
1747
1851
  /* Caps the gog-scroll wrapping the bubble's content — see tooltip-bubble.component.html.
@@ -1762,7 +1866,7 @@
1762
1866
  --gog-tooltip-arrow-size: 5px;
1763
1867
  /* Space kept between the trigger and the bubble. Read by the directive itself (not just
1764
1868
  CSS) to feed the placement math — see `readPxToken` in `tooltip.directive.ts`. */
1765
- --gog-tooltip-gap: 8px;
1869
+ --gog-tooltip-gap: var(--gog-space-8);
1766
1870
  --gog-tooltip-z: 400;
1767
1871
  --gog-tooltip-transition-duration: var(--gog-duration-fast);
1768
1872
  }