@ngrr/ds 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,670 @@
1
+ /**
2
+ * DS-Nagarro — Design Tokens
3
+ *
4
+ * THREE-LAYER ARCHITECTURE
5
+ * ─────────────────────────────────────────────────────────────────────────────
6
+ * Layer 1 — Primitives Raw values only. Never use in components directly.
7
+ * Defined once, never overridden in dark mode.
8
+ *
9
+ * Layer 2 — Semantics Intent-named tokens. Reference primitives via var().
10
+ * Dark mode block re-points these to different primitives.
11
+ *
12
+ * Layer 3 — References Alias tokens that reference other semantic tokens
13
+ * via var(). No overrides ever needed — they follow
14
+ * their parent automatically.
15
+ *
16
+ * ALIAS CHAIN EXAMPLE
17
+ * ─────────────────────────────────────────────────────────────────────────────
18
+ * In components: var(--surface-button-primary-default)
19
+ * → Layer 3 alias: var(--background-interactive-cta-default)
20
+ * → Layer 3 alias: var(--background-accent)
21
+ * → Layer 2 semantic: var(--primitive-accent-600) ← light
22
+ * → Layer 2 semantic: var(--primitive-accent-400) ← dark (override)
23
+ * → Layer 1 raw: #0F766E ← light resolved
24
+ * → Layer 1 raw: #00BBA7 ← dark resolved
25
+ *
26
+ * RULE: Raw hex values appear ONLY in Layer 1. Everywhere else uses var().
27
+ *
28
+ * SOURCES
29
+ * ─────────────────────────────────────────────────────────────────────────────
30
+ * color-light_tokens.json — semantic layer, light mode (alias targets)
31
+ * color-dark_tokens.json — semantic layer, dark mode (alias targets)
32
+ * Accent scale — confirmed from Figma screenshot (teal, not violet)
33
+ */
34
+
35
+
36
+ /* =============================================================================
37
+ LAYER 1 — PRIMITIVES
38
+ Raw values only. Single source of truth for every color in the system.
39
+ Never referenced directly in components.
40
+ Naming: --primitive-{scale}-{step}
41
+ ============================================================================= */
42
+
43
+ :root {
44
+
45
+ /* ── Neutral scale ──────────────────────────────────────────────────────── */
46
+ --primitive-neutral-white: #FFFFFF;
47
+ --primitive-neutral-50: #FCFCFC;
48
+ --primitive-neutral-100: #F6F6F6;
49
+ --primitive-neutral-200: #EFEFEF;
50
+ --primitive-neutral-300: #D4D4D8;
51
+ --primitive-neutral-400: #A1A1AA;
52
+ --primitive-neutral-500: #737373;
53
+ --primitive-neutral-600: #565860;
54
+ --primitive-neutral-700: #4D4C56;
55
+ --primitive-neutral-800: #232526;
56
+ --primitive-neutral-900: #171819;
57
+ --primitive-neutral-950: #09090B;
58
+ --primitive-neutral-black: #000000;
59
+
60
+ /* ── Accent scale (teal — brand color) ─────────────────────────────────── */
61
+ --primitive-accent-25: #F0FDFA;
62
+ --primitive-accent-50: #E0FFF8;
63
+ --primitive-accent-100: #99F6E4;
64
+ --primitive-accent-200: #5EEAD4;
65
+ --primitive-accent-300: #2DD4BF;
66
+ --primitive-accent-400: #00BBA7;
67
+ --primitive-accent-500: #0A7F76;
68
+ --primitive-accent-600: #0F766E;
69
+ --primitive-accent-700: #115E59;
70
+ --primitive-accent-800: #134E4A;
71
+ --primitive-accent-900: #042F2E;
72
+ --primitive-accent-950: #022827;
73
+
74
+ /* ── Teal scale (compatibility primitives) ──────────────────────────────── */
75
+ --primitive-teal-300: #5EEAD4;
76
+ --primitive-teal-400: #2DD4BF;
77
+ --primitive-teal-600: #0D9488;
78
+
79
+ /* ── Violet scale ───────────────────────────────────────────────────────── */
80
+ --primitive-violet-300: #C4B5FD;
81
+ --primitive-violet-400: #A78BFA;
82
+
83
+ /* ── Red scale ──────────────────────────────────────────────────────────── */
84
+ --primitive-red-50: #FEF3F2;
85
+ --primitive-red-200: #FECDCA;
86
+ --primitive-red-300: #FCA5A5;
87
+ --primitive-red-400: #F97066;
88
+ --primitive-red-500: #F04438;
89
+ --primitive-red-600: #D92D20;
90
+ --primitive-red-700: #B42318;
91
+ --primitive-red-800: #912018;
92
+ --primitive-red-950: #55160C;
93
+
94
+ /* ── Green scale ────────────────────────────────────────────────────────── */
95
+ --primitive-green-50: #F0FDF4;
96
+ --primitive-green-200: #BBF7D0;
97
+ --primitive-green-300: #86EFAC;
98
+ --primitive-green-400: #4ADE80;
99
+ --primitive-green-500: #22C55E;
100
+ --primitive-green-700: #15803D;
101
+ --primitive-green-800: #166534;
102
+ --primitive-green-950: #052E16;
103
+
104
+ /* ── Yellow scale ───────────────────────────────────────────────────────── */
105
+ --primitive-yellow-50: #FEFCE8;
106
+ --primitive-yellow-200: #FEF08A;
107
+ --primitive-yellow-300: #FDE047;
108
+ --primitive-yellow-400: #FACC15;
109
+ --primitive-yellow-500: #EAB308;
110
+ --primitive-yellow-800: #854D0E;
111
+ --primitive-yellow-900: #815717;
112
+ --primitive-yellow-950: #422006;
113
+
114
+ /* ── Alpha dark (black with opacity) ───────────────────────────────────── */
115
+ --primitive-alpha-dark-0: rgba(0, 0, 0, 0);
116
+ --primitive-alpha-dark-2: rgba(0, 0, 0, 0.02);
117
+ --primitive-alpha-dark-5: rgba(0, 0, 0, 0.05);
118
+ --primitive-alpha-dark-10: rgba(0, 0, 0, 0.10);
119
+ --primitive-alpha-dark-20: rgba(0, 0, 0, 0.20);
120
+ --primitive-alpha-dark-70: rgba(0, 0, 0, 0.70);
121
+ --primitive-alpha-dark-80: rgba(0, 0, 0, 0.80);
122
+ --primitive-alpha-dark-90: rgba(0, 0, 0, 0.90);
123
+
124
+ /* ── Alpha light (white with opacity) ──────────────────────────────────── */
125
+ --primitive-alpha-light-5: rgba(255, 255, 255, 0.05);
126
+ --primitive-alpha-light-10: rgba(255, 255, 255, 0.10);
127
+ --primitive-alpha-light-20: rgba(255, 255, 255, 0.20);
128
+
129
+
130
+ /* =============================================================================
131
+ LAYER 2 — SEMANTIC TOKENS (light mode)
132
+ All values reference primitives via var(). No raw values here.
133
+ Source: color-light_tokens.json alias targets.
134
+ Dark mode block below re-points these to different primitives.
135
+ ============================================================================= */
136
+
137
+ /* ── Background ─────────────────────────────────────────────────────────── */
138
+ --background-primary: var(--primitive-neutral-50);
139
+ --background-secondary: var(--primitive-neutral-100);
140
+ --background-tertiary: var(--primitive-neutral-200);
141
+ --background-accent: var(--primitive-accent-600);
142
+ --background-disabled: var(--primitive-alpha-dark-5);
143
+
144
+ --background-interactive-cta-hover: var(--primitive-accent-500);
145
+ --background-interactive-cta-pressed: var(--primitive-accent-700);
146
+ --background-interactive-default-hover: var(--primitive-alpha-dark-5);
147
+ --background-interactive-default-pressed: var(--primitive-alpha-dark-10);
148
+ --background-interactive-destructive-default: var(--primitive-red-600);
149
+ --background-interactive-destructive-hover: var(--primitive-red-500);
150
+ --background-interactive-destructive-pressed: var(--primitive-red-700);
151
+
152
+ --background-inverted-primary: var(--primitive-neutral-900);
153
+ --background-inverted-secondary: var(--primitive-neutral-950);
154
+ --background-inverted-tertiary: var(--primitive-neutral-black);
155
+
156
+ --background-selected-soft: var(--primitive-accent-50);
157
+
158
+ --background-feedback-error-default: var(--primitive-red-50);
159
+ --background-feedback-error-critical: var(--primitive-red-600);
160
+ --background-feedback-success-default: var(--primitive-green-50);
161
+ --background-feedback-warning-default: var(--primitive-yellow-50);
162
+
163
+ --background-opacity-invisible: var(--primitive-alpha-dark-0);
164
+ --background-opacity-subtle: var(--primitive-alpha-dark-10);
165
+ --background-opacity-mostly-opaque: var(--primitive-alpha-dark-80);
166
+
167
+ /* Fixed tokens — same in both modes, never overridden */
168
+ --background-fixed-dark-primary: var(--primitive-neutral-900);
169
+ --background-fixed-dark-secondary: var(--primitive-neutral-950);
170
+ --background-fixed-dark-tertiary: var(--primitive-neutral-black);
171
+ --background-fixed-light-primary: var(--primitive-neutral-50);
172
+ --background-fixed-light-secondary: var(--primitive-neutral-100);
173
+ --background-fixed-light-tertiary: var(--primitive-neutral-200);
174
+
175
+ /* ── Text ────────────────────────────────────────────────────────────────── */
176
+ --text-primary: var(--primitive-neutral-950);
177
+ --text-secondary: var(--primitive-neutral-600);
178
+ --text-tertiary: var(--primitive-neutral-500);
179
+ --text-disabled: var(--primitive-neutral-400);
180
+ --text-placeholder: var(--primitive-neutral-400);
181
+
182
+ --text-interactive-cta-hover: var(--primitive-accent-500);
183
+ --text-interactive-cta-pressed: var(--primitive-accent-700);
184
+ --text-interactive-danger-default: var(--primitive-red-600);
185
+ --text-interactive-danger-hover: var(--primitive-red-500);
186
+ --text-interactive-danger-pressed: var(--primitive-red-700);
187
+
188
+ --text-inverted-primary: var(--primitive-neutral-50);
189
+ --text-inverted-secondary: var(--primitive-neutral-300);
190
+ --text-inverted-tertiary: var(--primitive-neutral-400);
191
+
192
+ --text-feedback-error: var(--primitive-red-700);
193
+ --text-feedback-success: var(--primitive-green-700);
194
+ --text-feedback-warning: var(--primitive-yellow-800);
195
+
196
+ /* Fixed text — same in both modes, never overridden */
197
+ --text-fixed-dark-primary: var(--primitive-neutral-950);
198
+ --text-fixed-light-primary: var(--primitive-neutral-50);
199
+
200
+ /* ── Borders ─────────────────────────────────────────────────────────────── */
201
+ --borders-default: var(--primitive-neutral-200);
202
+ --borders-hover: var(--primitive-neutral-300);
203
+ --borders-disabled: var(--primitive-neutral-100);
204
+ --borders-alpha: var(--primitive-alpha-dark-5);
205
+
206
+ --borders-selected-soft: var(--primitive-accent-100);
207
+
208
+ --borders-error-soft: var(--primitive-red-200);
209
+ --borders-error-strong: var(--primitive-red-600);
210
+ --borders-success-soft: var(--primitive-green-200);
211
+ --borders-warning-soft: var(--primitive-yellow-200);
212
+
213
+ /* ── Surface ─────────────────────────────────────────────────────────────── */
214
+ --surface-avatar-default: var(--primitive-neutral-100);
215
+ --surface-input-default: var(--primitive-alpha-dark-2);
216
+ --surface-input-hover: var(--primitive-alpha-dark-5);
217
+ --surface-input-pressed: var(--primitive-alpha-dark-10);
218
+ --surface-tag-neutral: var(--primitive-neutral-100);
219
+ --surface-tag-progress: var(--primitive-accent-25);
220
+ --surface-toggle-off: var(--primitive-alpha-dark-5);
221
+
222
+ /* ── Effects — shadow color sub-tokens ───────────────────────────────────── */
223
+ --effects-shadow-outter-soft: var(--primitive-alpha-dark-5);
224
+ --effects-shadow-outter-strong: var(--primitive-alpha-dark-10);
225
+ --effects-shadow-inner-light-soft: var(--primitive-alpha-light-20);
226
+ --effects-shadow-inner-light-strong: var(--primitive-neutral-white);
227
+ --effects-shadow-inner-dark-soft: var(--primitive-alpha-dark-5);
228
+ --effects-shadow-inner-dark-strong: var(--primitive-alpha-dark-90);
229
+
230
+
231
+ /* =============================================================================
232
+ LAYER 3 — ALIAS / REFERENCE TOKENS
233
+ These reference other semantic tokens via var().
234
+ They require NO dark mode overrides — they update automatically
235
+ when their referenced semantic token is overridden above.
236
+ ============================================================================= */
237
+
238
+ /* Background aliases */
239
+ --background-interactive-cta-default: var(--background-accent);
240
+ --background-interactive-default-default: var(--background-primary);
241
+ --background-selected-strong: var(--background-accent);
242
+ --background-overlay-modality: var(--background-opacity-mostly-opaque);
243
+ --background-page-default: var(--background-primary);
244
+ --background-page-lower: var(--background-tertiary);
245
+
246
+ /* Text aliases */
247
+ --text-accent: var(--background-accent);
248
+ --text-interactive-cta-default: var(--text-accent);
249
+ --text-interactive-default: var(--text-secondary);
250
+ --text-interactive-hover: var(--text-interactive-cta-hover);
251
+ --text-interactive-pressed: var(--text-interactive-cta-pressed);
252
+ --text-selected-default: var(--text-accent);
253
+ --text-tag-neutral: var(--text-secondary);
254
+ --text-tag-error: var(--text-feedback-error);
255
+ --text-tag-success: var(--text-feedback-success);
256
+ --text-tag-warning: var(--text-feedback-warning);
257
+ --text-tag-progress: var(--text-accent);
258
+
259
+ /* Border aliases */
260
+ --borders-divider: var(--borders-default);
261
+ --borders-selected-strong: var(--background-accent);
262
+ --borders-focus-primary: var(--background-primary);
263
+ --borders-focus-secondary: var(--borders-selected-strong);
264
+ --borders-focus-destructive: var(--borders-error-strong);
265
+ --borders-tag-neutral: var(--borders-alpha);
266
+ --borders-tag-error: var(--borders-error-soft);
267
+ --borders-tag-success: var(--borders-success-soft);
268
+ --borders-tag-warning: var(--borders-warning-soft);
269
+ --borders-tag-progress: var(--borders-selected-soft);
270
+
271
+ /* Surface aliases */
272
+ --surface-default: var(--background-primary);
273
+ --surface-elevated: var(--background-primary);
274
+ --surface-disabled: var(--background-disabled);
275
+ --surface-toggle-on: var(--background-selected-strong);
276
+ --surface-tag-error: var(--background-feedback-error-default);
277
+ --surface-tag-success: var(--background-feedback-success-default);
278
+ --surface-tag-warning: var(--background-feedback-warning-default);
279
+
280
+ /* Surface/button — full alias chain preserved from Figma */
281
+ --surface-button-primary-default: var(--background-interactive-cta-default);
282
+ --surface-button-primary-hover: var(--background-interactive-cta-hover);
283
+ --surface-button-primary-pressed: var(--background-interactive-cta-pressed);
284
+ --surface-button-secondary-default: var(--background-interactive-default-default);
285
+ --surface-button-secondary-hover: var(--background-secondary);
286
+ --surface-button-secondary-pressed: var(--background-tertiary);
287
+ --surface-button-destructive-default: var(--background-interactive-destructive-default);
288
+ --surface-button-destructive-hover: var(--background-interactive-destructive-hover);
289
+ --surface-button-destructive-pressed: var(--background-interactive-destructive-pressed);
290
+
291
+ /* Effects — emboss helpers (same both modes) */
292
+ --effects-shadows-default: var(--primitive-alpha-dark-5);
293
+ --effects-separators-emboss-light: var(--primitive-neutral-white);
294
+ --effects-emboss-button-secondary-top: var(--primitive-neutral-white);
295
+ --effects-emboss-button-secondary-bottom: var(--primitive-alpha-dark-5);
296
+
297
+ /* Effects — dimension tokens (unitless, same both modes) */
298
+ --effects-offset-1: 1px;
299
+ --effects-blur-subtle: 2px;
300
+ --effects-spread-positive-1: 1px;
301
+ --effects-elevation-button-default-blur: 2px;
302
+ --effects-emboss-position-y-default: 1px;
303
+ --effects-emboss-position-y-negative: -1px;
304
+
305
+ /* ── Composite box-shadow tokens ────────────────────────────────────────────
306
+ Built from the sub-tokens above. In dark mode, only the color sub-tokens
307
+ change — these composites automatically produce correct dark shadows. */
308
+
309
+ --box-shadow-button-primary-default:
310
+ inset 0 var(--effects-offset-1) 0 0 var(--effects-shadow-inner-light-soft),
311
+ inset 0 var(--effects-emboss-position-y-negative) 0 0 var(--effects-shadow-inner-dark-soft),
312
+ 0 0 0 var(--effects-spread-positive-1) var(--effects-shadow-outter-strong),
313
+ 0 var(--effects-offset-1) var(--effects-blur-subtle) 0 var(--effects-shadow-outter-soft);
314
+
315
+ --box-shadow-button-primary-hover:
316
+ inset 0 var(--effects-offset-1) 0 0 var(--effects-shadow-inner-light-soft),
317
+ inset 0 var(--effects-emboss-position-y-negative) 0 0 var(--effects-shadow-inner-dark-soft),
318
+ 0 0 0 var(--effects-spread-positive-1) var(--effects-shadow-outter-strong),
319
+ 0 2px var(--effects-elevation-button-default-blur) 0 var(--effects-shadow-outter-soft);
320
+
321
+ --box-shadow-button-pressed:
322
+ 0 var(--effects-offset-1) 0 0 var(--effects-separators-emboss-light),
323
+ inset 0 0 0 var(--effects-spread-positive-1) var(--effects-shadows-default);
324
+
325
+ --box-shadow-button-secondary-default:
326
+ inset 0 var(--effects-offset-1) 0 0 var(--effects-emboss-button-secondary-top),
327
+ inset 0 var(--effects-emboss-position-y-negative) 0 0 var(--effects-emboss-button-secondary-bottom),
328
+ 0 0 0 var(--effects-spread-positive-1) var(--effects-shadow-outter-soft),
329
+ 0 var(--effects-offset-1) var(--effects-elevation-button-default-blur) 0 var(--effects-emboss-button-secondary-bottom);
330
+
331
+ --box-shadow-button-secondary-hover:
332
+ inset 0 var(--effects-offset-1) 0 0 var(--effects-emboss-button-secondary-top),
333
+ inset 0 var(--effects-emboss-position-y-negative) 0 0 var(--effects-emboss-button-secondary-bottom),
334
+ 0 0 0 var(--effects-spread-positive-1) var(--effects-shadow-outter-strong),
335
+ 0 var(--effects-offset-1) var(--effects-elevation-button-default-blur) 0 var(--effects-shadow-outter-soft);
336
+
337
+ --box-shadow-button-focus:
338
+ inset 0 0 0 1px var(--borders-focus-secondary),
339
+ inset 0 0 0 2px var(--borders-focus-primary);
340
+
341
+ --box-shadow-button-destructive-focus:
342
+ inset 0 0 0 1px var(--borders-focus-destructive),
343
+ inset 0 0 0 2px var(--borders-focus-primary);
344
+
345
+ --box-shadow-button-group:
346
+ 0 0 0 1px var(--primitive-alpha-dark-5),
347
+ 0 1px 2px 0 var(--primitive-alpha-dark-5);
348
+
349
+ --box-shadow-switcher-track-off:
350
+ 0px 1px 0px 0px var(--primitive-neutral-white),
351
+ inset 0px 0px 0px 1px var(--primitive-alpha-dark-5),
352
+ inset 0px 1px 1px 0px var(--primitive-alpha-dark-5);
353
+
354
+ --box-shadow-switcher-thumb:
355
+ 0px 0px 0px 1px var(--primitive-alpha-dark-5),
356
+ 0px 2px 8px 0px var(--primitive-alpha-dark-5),
357
+ inset 0px 1px 0px 0px var(--primitive-neutral-white),
358
+ inset 0px -1px 0px 0px var(--primitive-neutral-100);
359
+
360
+ /* Backward-compat aliases used by existing input components */
361
+ --color-text-primary: var(--text-primary);
362
+ --color-text-secondary: var(--text-secondary);
363
+ --color-text-placeholder: var(--text-placeholder);
364
+ --color-text-disabled: var(--text-disabled);
365
+ --color-text-danger-default: var(--text-interactive-danger-default);
366
+ --color-text-danger-hover: var(--text-interactive-danger-hover);
367
+ --color-text-danger-pressed: var(--text-interactive-danger-pressed);
368
+ --color-border-default: var(--borders-default);
369
+ --color-border-input-error: var(--borders-error-strong);
370
+ --color-border-text-input-default: var(--borders-default);
371
+ --color-surface-input-bg: var(--surface-input-default);
372
+ --color-surface-hover: var(--surface-input-hover);
373
+ --color-surface-pressed: var(--surface-input-pressed);
374
+ --color-surface-button-primary-default: var(--surface-button-primary-default);
375
+ --color-surface-selected-default: var(--background-selected-soft);
376
+
377
+ --box-shadow-input:
378
+ 0px 1px 0px 0px var(--effects-separators-emboss-light),
379
+ inset 0px 0px 0px 1px var(--effects-shadow-outter-soft),
380
+ inset 0px 1px 1px 0px var(--effects-shadow-inner-dark-soft);
381
+
382
+
383
+ /* =============================================================================
384
+ TYPOGRAPHY — not mode-dependent, defined once
385
+ ============================================================================= */
386
+
387
+ --font-family-default: 'Geist Sans', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
388
+
389
+ --font-size-micro: 0.75rem;
390
+ --font-size-label: 0.875rem;
391
+ --font-size-body-s: 0.875rem;
392
+ --font-size-body-l: 1rem;
393
+ --font-size-display-s: 1.125rem;
394
+ --font-size-display-m: 1.25rem;
395
+ --font-size-display-l: 1.5rem;
396
+ --font-size-display-xl: 1.875rem;
397
+ --font-size-display-2xl: 2.25rem;
398
+ --font-size-display-3xl: 3rem;
399
+
400
+ --font-line-height-micro: 1rem;
401
+ --font-line-height-label: 1rem;
402
+ --font-line-height-body-s: 1.25rem;
403
+ --font-line-height-body-l: 1.5rem;
404
+ --font-line-height-display-s: 1.75rem;
405
+ --font-line-height-display-m: 1.875rem;
406
+ --font-line-height-display-l: 2rem;
407
+ --font-line-height-display-xl: 2.375rem;
408
+ --font-line-height-display-2xl: 2.75rem;
409
+ --font-line-height-display-3xl: 3.75rem;
410
+
411
+ --font-weight-regular: 400;
412
+ --font-weight-medium: 500;
413
+ --font-weight-semibold: 600;
414
+
415
+ --font-letter-spacing-tight: -0.02em;
416
+ --font-letter-spacing-normal: 0em;
417
+ --font-letter-spacing-display: -0.01em;
418
+ --font-letter-spacing-wide: 0.04em;
419
+
420
+
421
+ /* =============================================================================
422
+ SPACING — not mode-dependent
423
+ Space/ = gaps, margins between elements
424
+ Inset/ = internal padding inside components
425
+ ============================================================================= */
426
+
427
+ --space-none: 0px;
428
+ --space-micro: 2px;
429
+ --space-tiny: 4px;
430
+ --space-small: 8px;
431
+ --space-compact: 12px;
432
+ --space-medium: 16px;
433
+ --space-comfortable: 20px;
434
+ --space-large: 24px;
435
+ --space-spacious: 32px;
436
+ --space-generous: 40px;
437
+ --space-ample: 48px;
438
+ --space-grand: 64px;
439
+
440
+ --inset-none: 0px;
441
+ --inset-micro: 2px;
442
+ --inset-tiny: 4px;
443
+ --inset-small: 8px;
444
+ --inset-medium: 12px;
445
+ --inset-large: 16px;
446
+ --inset-xlarge: 24px;
447
+
448
+ --space-form-vertical: var(--space-comfortable);
449
+ --space-toolbar-standard: var(--space-small);
450
+
451
+
452
+ /* =============================================================================
453
+ SIZING, RADIUS, BORDER WIDTH — not mode-dependent
454
+ ===== ======================================================================== */
455
+
456
+ --control-height-standard: 32px;
457
+ --control-height-nested: 24px;
458
+ --control-radius-standard: 16px;
459
+ --control-radius-small: 12px;
460
+
461
+ /* Avatar sizing scale */
462
+ --size-avatar-xxs: 16px;
463
+ --size-avatar-xs: 24px;
464
+ --size-avatar-sm: 32px;
465
+ --size-avatar-md: 40px;
466
+ --size-avatar-lg: 48px;
467
+ --size-avatar-xl: 64px;
468
+ --size-avatar-xxl: 128px;
469
+ --gap-avatar-group: -4px;
470
+ /* Button token aliases expected by existing component CSS */
471
+ --control-button-inset-standard: 8px;
472
+ --control-button-inset-small: 4px;
473
+ --control-button-space-standard: 4px;
474
+ --gap-button-small: 0px;
475
+ --inset-label-wrapper-standard: 4px;
476
+ --control-button-group-larger: var(--space-small);
477
+ --control-button-group-smaller: var(--space-tiny);
478
+ --control-button-space-default: var(--space-small);
479
+ --control-button-space-small: var(--space-tiny);
480
+ --control-chip-space-default: var(--space-small);
481
+ --control-chip-space-small: var(--space-tiny);
482
+
483
+ --dimensions-width-standard: 320px;
484
+ --dimensions-width-popover: 256px;
485
+
486
+ --nav-topbar-height: 48px;
487
+ --nav-toolbar-height: 40px;
488
+ --nav-toolbar-inset: var(--inset-medium);
489
+ --nav-heading-height: 32px;
490
+ --nav-sidebar-width: 200px;
491
+
492
+ --radius-none: 0px;
493
+ --radius-small: 4px;
494
+ --radius-medium: 6px;
495
+ --radius-large: 8px;
496
+ --radius-xlarge: 12px;
497
+ --radius-full: 9999px;
498
+
499
+ --border-width-default: 1px;
500
+ --border-width-medium: 1.5px;
501
+ --border-width-thick: 2px;
502
+ --border-width-focus: 2px;
503
+
504
+ /* Compatibility aliases used by Tag/Chip/CustomViewTab */
505
+ --size-tag-height: var(--control-height-nested);
506
+ --tag-inset: var(--inset-tiny);
507
+ --tag-radius: var(--control-radius-standard);
508
+ --border-ui-icon: 1.25px;
509
+
510
+
511
+ /* =============================================================================
512
+ TRANSITIONS — not mode-dependent
513
+ ============================================================================= */
514
+
515
+ --transition-fast: 100ms ease;
516
+ --transition-medium: 150ms ease;
517
+ --transition-slow: 200ms ease;
518
+
519
+ } /* end :root */
520
+
521
+
522
+ /* =============================================================================
523
+ DARK MODE — [data-theme="dark"]
524
+ Source: color-dark_tokens.json
525
+ Only Layer 2 semantic tokens are overridden here — re-pointed to different
526
+ primitives. Layer 1 (primitives) and Layer 3 (aliases) require no overrides.
527
+ ============================================================================= */
528
+
529
+ [data-theme="dark"] {
530
+
531
+ /* ── Background ─────────────────────────────────────────────────── */
532
+ --background-primary: var(--primitive-neutral-900);
533
+ --background-secondary: var(--primitive-neutral-950);
534
+ --background-tertiary: var(--primitive-neutral-black);
535
+ --background-accent: var(--primitive-accent-400);
536
+ --background-disabled: var(--primitive-alpha-light-5);
537
+
538
+ --background-interactive-cta-hover: var(--primitive-accent-200);
539
+ --background-interactive-cta-pressed: var(--primitive-accent-400);
540
+ --background-interactive-default-hover: var(--primitive-alpha-light-5);
541
+ --background-interactive-default-pressed: var(--primitive-alpha-dark-90);
542
+ --background-interactive-destructive-default: var(--primitive-red-500);
543
+ --background-interactive-destructive-hover: var(--primitive-red-400);
544
+ --background-interactive-destructive-pressed: var(--primitive-red-600);
545
+
546
+ --background-inverted-primary: var(--primitive-neutral-50);
547
+ --background-inverted-secondary: var(--primitive-neutral-100);
548
+ --background-inverted-tertiary: var(--primitive-neutral-200);
549
+
550
+ --background-selected-soft: var(--primitive-accent-900);
551
+
552
+ --background-feedback-error-default: var(--primitive-red-950);
553
+ --background-feedback-error-critical: var(--primitive-red-500);
554
+ --background-feedback-success-default: var(--primitive-green-950);
555
+ --background-feedback-warning-default: var(--primitive-yellow-950);
556
+
557
+ /* ── Text ────────────────────────────────────────────────────────── */
558
+ --text-primary: var(--primitive-neutral-50);
559
+ --text-secondary: var(--primitive-neutral-300);
560
+ --text-tertiary: var(--primitive-neutral-400);
561
+ --text-disabled: var(--primitive-neutral-500);
562
+
563
+ --text-interactive-cta-hover: var(--primitive-accent-200);
564
+ --text-interactive-cta-pressed: var(--primitive-accent-400);
565
+ --text-interactive-danger-default: var(--primitive-red-500);
566
+ --text-interactive-danger-hover: var(--primitive-red-400);
567
+ --text-interactive-danger-pressed: var(--primitive-red-600);
568
+
569
+ --text-inverted-primary: var(--primitive-neutral-950);
570
+ --text-inverted-secondary: var(--primitive-neutral-600);
571
+ --text-inverted-tertiary: var(--primitive-neutral-500);
572
+
573
+ --text-feedback-error: var(--primitive-red-400);
574
+ --text-feedback-success: var(--primitive-green-400);
575
+ --text-feedback-warning: var(--primitive-yellow-300);
576
+
577
+ /* ── Borders ─────────────────────────────────────────────────────── */
578
+ --borders-default: var(--primitive-neutral-800);
579
+ --borders-hover: var(--primitive-neutral-700);
580
+ --borders-disabled: var(--primitive-neutral-900);
581
+ --borders-alpha: var(--primitive-alpha-light-10);
582
+
583
+ --borders-selected-soft: var(--primitive-accent-900);
584
+
585
+ --borders-error-soft: var(--primitive-red-800);
586
+ --borders-error-strong: var(--primitive-red-400);
587
+ --borders-success-soft: var(--primitive-green-800);
588
+ --borders-warning-soft: var(--primitive-yellow-900);
589
+
590
+ /* Special case: in dark mode, borders/tag/success aliases
591
+ background/feedback/success/default instead of borders/success/soft */
592
+ --borders-tag-success: var(--background-feedback-success-default);
593
+
594
+ /* ── Surface ─────────────────────────────────────────────────────── */
595
+ --surface-avatar-default: var(--primitive-neutral-800);
596
+ --surface-input-default: var(--primitive-alpha-dark-90);
597
+ --surface-input-hover: var(--primitive-alpha-dark-80);
598
+ --surface-input-pressed: var(--primitive-alpha-dark-70);
599
+ --surface-tag-neutral: var(--primitive-neutral-800);
600
+ --surface-tag-progress: var(--primitive-accent-950);
601
+ --surface-toggle-off: var(--primitive-alpha-light-5);
602
+ --effects-emboss-button-secondary-top: var(--primitive-alpha-light-5);
603
+ --effects-emboss-button-secondary-bottom: var(--primitive-alpha-dark-20);
604
+
605
+ /* ── Effects — shadow color sub-tokens only ──────────────────────── */
606
+ /* Composite box-shadows auto-update because they reference these via var() */
607
+ --effects-shadow-outter-soft: var(--primitive-alpha-dark-80);
608
+ --effects-shadow-outter-strong: var(--primitive-alpha-dark-90);
609
+ --effects-shadow-inner-dark-soft: var(--primitive-alpha-dark-20);
610
+ --effects-shadow-inner-dark-strong: var(--primitive-neutral-black);
611
+ --effects-shadow-inner-light-strong: var(--primitive-alpha-light-5);
612
+
613
+ } /* end [data-theme="dark"] */
614
+
615
+ /* =============================================================================
616
+ DATAVIZ TOKENS — theme-scoped chart palette
617
+ Added as standalone tokens to avoid changing existing semantic aliases.
618
+ ============================================================================= */
619
+
620
+ /* ── Dataviz tokens · Light ──────────────────────── */
621
+ [data-theme="light"] {
622
+ /* Categorical series */
623
+ --color-dataviz-1: var(--primitive-teal-600);
624
+ --color-dataviz-2: var(--primitive-violet-400);
625
+ --color-dataviz-3: var(--primitive-green-500);
626
+ --color-dataviz-4: var(--primitive-yellow-500);
627
+ --color-dataviz-5: var(--primitive-teal-300);
628
+ --color-dataviz-6: var(--primitive-violet-300);
629
+ --color-dataviz-7: var(--primitive-green-300);
630
+ --color-dataviz-8: var(--primitive-red-300);
631
+
632
+ /* Semantic states */
633
+ --color-dataviz-positive: var(--primitive-green-500);
634
+ --color-dataviz-negative: var(--primitive-red-400);
635
+ --color-dataviz-warning: var(--primitive-yellow-500);
636
+ --color-dataviz-neutral: var(--primitive-neutral-400);
637
+
638
+ /* Chart structure */
639
+ --color-dataviz-grid: var(--primitive-neutral-200);
640
+ --color-dataviz-axis: var(--primitive-neutral-400);
641
+ --color-dataviz-label: var(--primitive-neutral-600);
642
+ --color-dataviz-tooltip-bg: var(--primitive-neutral-white);
643
+ --color-dataviz-tooltip-border: var(--primitive-neutral-200);
644
+ }
645
+
646
+ /* ── Dataviz tokens · Dark ───────────────────────── */
647
+ [data-theme="dark"] {
648
+ /* Categorical series */
649
+ --color-dataviz-1: var(--primitive-teal-400);
650
+ --color-dataviz-2: var(--primitive-violet-400);
651
+ --color-dataviz-3: var(--primitive-green-400);
652
+ --color-dataviz-4: var(--primitive-yellow-400);
653
+ --color-dataviz-5: var(--primitive-teal-300);
654
+ --color-dataviz-6: var(--primitive-violet-300);
655
+ --color-dataviz-7: var(--primitive-green-300);
656
+ --color-dataviz-8: var(--primitive-red-300);
657
+
658
+ /* Semantic states */
659
+ --color-dataviz-positive: var(--primitive-green-400);
660
+ --color-dataviz-negative: var(--primitive-red-300);
661
+ --color-dataviz-warning: var(--primitive-yellow-400);
662
+ --color-dataviz-neutral: var(--primitive-neutral-500);
663
+
664
+ /* Chart structure */
665
+ --color-dataviz-grid: var(--primitive-neutral-800);
666
+ --color-dataviz-axis: var(--primitive-neutral-600);
667
+ --color-dataviz-label: var(--primitive-neutral-400);
668
+ --color-dataviz-tooltip-bg: var(--primitive-neutral-800);
669
+ --color-dataviz-tooltip-border: var(--primitive-neutral-700);
670
+ }