@fabio.caffarello/react-design-system 4.4.0 → 4.5.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.
@@ -0,0 +1,2920 @@
1
+ /*! Design System raw token source — @theme + light/dark overrides.
2
+ * Generated from src/styles/tokens.css by scripts/build-tokens-css.mjs (issue #234).
3
+ * Consume via the "./theme" export alongside "./styles":
4
+ * @import "tailwindcss";
5
+ * @import "@fabio.caffarello/react-design-system/styles" layer(rds);
6
+ * @import "@fabio.caffarello/react-design-system/theme";
7
+ * Your Tailwind generates the utilities natively from the @theme blocks below.
8
+ * DO NOT edit dist/tokens.css by hand — edit the src/styles token files. */
9
+
10
+ /**
11
+ * Design System — Raw Token Source (consumer-extendable)
12
+ *
13
+ * This is the SOURCE-of-truth token cascade with NOTHING Tailwind-specific
14
+ * around it: no `@import "tailwindcss"`, no `@source`, no utilities, no
15
+ * component classes. It carries only the `@theme {…}` blocks (primitives +
16
+ * semantic) and the light/dark selector overrides.
17
+ *
18
+ * It exists so a Tailwind v4 consumer can `@import` the design system's
19
+ * tokens RAW and let THEIR OWN Tailwind generate the utilities natively
20
+ * (`text-fg-brand`, `bg-surface-brand-strong`, `ring-line-focus`, …) —
21
+ * theme-aware, with one source of truth and no fragile re-export bridge.
22
+ * Issue #234.
23
+ *
24
+ * Build artifact: `scripts/build-tokens-css.mjs` inlines this `@import`
25
+ * chain into `dist/tokens.css` WITHOUT running it through Tailwind (the
26
+ * `@theme` blocks must reach the consumer uncompiled). Published as the
27
+ * `./theme` (and `./theme.css`) package export.
28
+ *
29
+ * DO NOT add `@import "tailwindcss"`, `@source`, `@apply`, or utility/
30
+ * component CSS here — those belong to `src/styles/index.css` (the batteries-
31
+ * included compiled `./styles` bundle), never to the raw token source.
32
+ * `scripts/validate-theme-export.mjs` fails the build if any leak in.
33
+ *
34
+ * The import order mirrors `src/styles/index.css` exactly (primitives →
35
+ * semantic → themes), minus the Tailwind entry and the utilities tail, so
36
+ * the two never drift in token coverage.
37
+ *
38
+ * @brand brasil-a-vera (default, overridable)
39
+ */
40
+
41
+ /* ============================================
42
+ * PRIMITIVE TOKENS
43
+ * Raw design values — colors, spacing, etc.
44
+ * ============================================ */
45
+
46
+ /* ↳ inlined from src/styles/primitives/colors.css */
47
+ /**
48
+ * Design System - Primitive Colors
49
+ *
50
+ * Complete color scales (50-950) for the design system.
51
+ * These are the raw color values that semantic tokens reference.
52
+ *
53
+ * @brand brasil-a-vera (default, overridable)
54
+ * @version 1.0.0
55
+ */
56
+
57
+ @theme {
58
+ /* ============================================
59
+ * BASE COLORS
60
+ * ============================================ */
61
+
62
+ --color-white: #ffffff;
63
+ --color-black: #000000;
64
+ --color-transparent: transparent;
65
+ --color-current: currentColor;
66
+
67
+ /* ============================================
68
+ * INDIGO - Primary Brand Color
69
+ * Modern, tech, innovation
70
+ * ============================================ */
71
+
72
+ --color-indigo-50: #eef2ff;
73
+ --color-indigo-100: #e0e7ff;
74
+ --color-indigo-200: #c7d2fe;
75
+ --color-indigo-300: #a5b4fc;
76
+ --color-indigo-400: #818cf8;
77
+ --color-indigo-500: #6366f1;
78
+ --color-indigo-600: #4f46e5;
79
+ --color-indigo-700: #4338ca;
80
+ --color-indigo-800: #3730a3;
81
+ --color-indigo-900: #312e81;
82
+ --color-indigo-950: #1e1b4b;
83
+
84
+ /* ============================================
85
+ * VIOLET - Secondary Brand Color
86
+ * Complementary to indigo, creative accent
87
+ * ============================================ */
88
+
89
+ --color-violet-50: #f5f3ff;
90
+ --color-violet-100: #ede9fe;
91
+ --color-violet-200: #ddd6fe;
92
+ --color-violet-300: #c4b5fd;
93
+ --color-violet-400: #a78bfa;
94
+ --color-violet-500: #8b5cf6;
95
+ --color-violet-600: #7c3aed;
96
+ --color-violet-700: #6d28d9;
97
+ --color-violet-800: #5b21b6;
98
+ --color-violet-900: #4c1d95;
99
+ --color-violet-950: #2e1065;
100
+
101
+ /* ============================================
102
+ * CYAN - Accent Color
103
+ * Fresh, modern highlights
104
+ * ============================================ */
105
+
106
+ --color-cyan-50: #ecfeff;
107
+ --color-cyan-100: #cffafe;
108
+ --color-cyan-200: #a5f3fc;
109
+ --color-cyan-300: #67e8f9;
110
+ --color-cyan-400: #22d3ee;
111
+ --color-cyan-500: #06b6d4;
112
+ --color-cyan-600: #0891b2;
113
+ --color-cyan-700: #0e7490;
114
+ --color-cyan-800: #155e75;
115
+ --color-cyan-900: #164e63;
116
+ --color-cyan-950: #083344;
117
+
118
+ /* ============================================
119
+ * SLATE - Neutral Color
120
+ * UI backgrounds, text, borders
121
+ * ============================================ */
122
+
123
+ --color-slate-50: #f8fafc;
124
+ --color-slate-100: #f1f5f9;
125
+ --color-slate-200: #e2e8f0;
126
+ --color-slate-300: #cbd5e1;
127
+ --color-slate-400: #94a3b8;
128
+ --color-slate-500: #64748b;
129
+ --color-slate-600: #475569;
130
+ --color-slate-700: #334155;
131
+ --color-slate-800: #1e293b;
132
+ --color-slate-900: #0f172a;
133
+ --color-slate-950: #020617;
134
+
135
+ /* ============================================
136
+ * GRAY - Alternative Neutral
137
+ * Pure gray without blue undertone
138
+ * ============================================ */
139
+
140
+ --color-gray-50: #f9fafb;
141
+ --color-gray-100: #f3f4f6;
142
+ --color-gray-200: #e5e7eb;
143
+ --color-gray-300: #d1d5db;
144
+ --color-gray-400: #9ca3af;
145
+ --color-gray-500: #6b7280;
146
+ --color-gray-600: #4b5563;
147
+ --color-gray-700: #374151;
148
+ --color-gray-800: #1f2937;
149
+ --color-gray-900: #111827;
150
+ --color-gray-950: #030712;
151
+
152
+ /* ============================================
153
+ * EMERALD - Success Color
154
+ * Positive actions, confirmations
155
+ * ============================================ */
156
+
157
+ --color-emerald-50: #ecfdf5;
158
+ --color-emerald-100: #d1fae5;
159
+ --color-emerald-200: #a7f3d0;
160
+ --color-emerald-300: #6ee7b7;
161
+ --color-emerald-400: #34d399;
162
+ --color-emerald-500: #10b981;
163
+ --color-emerald-600: #059669;
164
+ --color-emerald-700: #047857;
165
+ --color-emerald-800: #065f46;
166
+ --color-emerald-900: #064e3b;
167
+ --color-emerald-950: #022c22;
168
+
169
+ /* ============================================
170
+ * GREEN - Alternative Success
171
+ * Brighter, more vibrant success
172
+ * ============================================ */
173
+
174
+ --color-green-50: #f0fdf4;
175
+ --color-green-100: #dcfce7;
176
+ --color-green-200: #bbf7d0;
177
+ --color-green-300: #86efac;
178
+ --color-green-400: #4ade80;
179
+ --color-green-500: #22c55e;
180
+ --color-green-600: #16a34a;
181
+ --color-green-700: #15803d;
182
+ --color-green-800: #166534;
183
+ --color-green-900: #14532d;
184
+ --color-green-950: #052e16;
185
+
186
+ /* ============================================
187
+ * AMBER - Warning Color
188
+ * Caution, attention needed
189
+ * ============================================ */
190
+
191
+ --color-amber-50: #fffbeb;
192
+ --color-amber-100: #fef3c7;
193
+ --color-amber-200: #fde68a;
194
+ --color-amber-300: #fcd34d;
195
+ --color-amber-400: #fbbf24;
196
+ --color-amber-500: #f59e0b;
197
+ --color-amber-600: #d97706;
198
+ --color-amber-700: #b45309;
199
+ --color-amber-800: #92400e;
200
+ --color-amber-900: #78350f;
201
+ --color-amber-950: #451a03;
202
+
203
+ /* ============================================
204
+ * YELLOW - Alternative Warning
205
+ * Brighter, more visible warning
206
+ * ============================================ */
207
+
208
+ --color-yellow-50: #fefce8;
209
+ --color-yellow-100: #fef9c3;
210
+ --color-yellow-200: #fef08a;
211
+ --color-yellow-300: #fde047;
212
+ --color-yellow-400: #facc15;
213
+ --color-yellow-500: #eab308;
214
+ --color-yellow-600: #ca8a04;
215
+ --color-yellow-700: #a16207;
216
+ --color-yellow-800: #854d0e;
217
+ --color-yellow-900: #713f12;
218
+ --color-yellow-950: #422006;
219
+
220
+ /* ============================================
221
+ * ORANGE - Energetic Accent
222
+ * Energy, enthusiasm, CTAs
223
+ * ============================================ */
224
+
225
+ --color-orange-50: #fff7ed;
226
+ --color-orange-100: #ffedd5;
227
+ --color-orange-200: #fed7aa;
228
+ --color-orange-300: #fdba74;
229
+ --color-orange-400: #fb923c;
230
+ --color-orange-500: #f97316;
231
+ --color-orange-600: #ea580c;
232
+ --color-orange-700: #c2410c;
233
+ --color-orange-800: #9a3412;
234
+ --color-orange-900: #7c2d12;
235
+ --color-orange-950: #431407;
236
+
237
+ /* ============================================
238
+ * ROSE - Error Color
239
+ * Errors, destructive actions
240
+ * ============================================ */
241
+
242
+ --color-rose-50: #fff1f2;
243
+ --color-rose-100: #ffe4e6;
244
+ --color-rose-200: #fecdd3;
245
+ --color-rose-300: #fda4af;
246
+ --color-rose-400: #fb7185;
247
+ --color-rose-500: #f43f5e;
248
+ --color-rose-600: #e11d48;
249
+ --color-rose-700: #be123c;
250
+ --color-rose-800: #9f1239;
251
+ --color-rose-900: #881337;
252
+ --color-rose-950: #4c0519;
253
+
254
+ /* ============================================
255
+ * RED - Alternative Error
256
+ * Pure red for critical errors
257
+ * ============================================ */
258
+
259
+ --color-red-50: #fef2f2;
260
+ --color-red-100: #fee2e2;
261
+ --color-red-200: #fecaca;
262
+ --color-red-300: #fca5a5;
263
+ --color-red-400: #f87171;
264
+ --color-red-500: #ef4444;
265
+ --color-red-600: #dc2626;
266
+ --color-red-700: #b91c1c;
267
+ --color-red-800: #991b1b;
268
+ --color-red-900: #7f1d1d;
269
+ --color-red-950: #450a0a;
270
+
271
+ /* ============================================
272
+ * SKY - Info Color
273
+ * Informational, neutral feedback
274
+ * ============================================ */
275
+
276
+ --color-sky-50: #f0f9ff;
277
+ --color-sky-100: #e0f2fe;
278
+ --color-sky-200: #bae6fd;
279
+ --color-sky-300: #7dd3fc;
280
+ --color-sky-400: #38bdf8;
281
+ --color-sky-500: #0ea5e9;
282
+ --color-sky-600: #0284c7;
283
+ --color-sky-700: #0369a1;
284
+ --color-sky-800: #075985;
285
+ --color-sky-900: #0c4a6e;
286
+ --color-sky-950: #082f49;
287
+
288
+ /* ============================================
289
+ * BLUE - Alternative Info
290
+ * Traditional blue info color
291
+ * ============================================ */
292
+
293
+ --color-blue-50: #eff6ff;
294
+ --color-blue-100: #dbeafe;
295
+ --color-blue-200: #bfdbfe;
296
+ --color-blue-300: #93c5fd;
297
+ --color-blue-400: #60a5fa;
298
+ --color-blue-500: #3b82f6;
299
+ --color-blue-600: #2563eb;
300
+ --color-blue-700: #1d4ed8;
301
+ --color-blue-800: #1e40af;
302
+ --color-blue-900: #1e3a8a;
303
+ --color-blue-950: #172554;
304
+
305
+ /* ============================================
306
+ * FUCHSIA - Creative Accent
307
+ * Vibrant, playful, creative variant
308
+ * ============================================ */
309
+
310
+ --color-fuchsia-50: #fdf4ff;
311
+ --color-fuchsia-100: #fae8ff;
312
+ --color-fuchsia-200: #f5d0fe;
313
+ --color-fuchsia-300: #f0abfc;
314
+ --color-fuchsia-400: #e879f9;
315
+ --color-fuchsia-500: #d946ef;
316
+ --color-fuchsia-600: #c026d3;
317
+ --color-fuchsia-700: #a21caf;
318
+ --color-fuchsia-800: #86198f;
319
+ --color-fuchsia-900: #701a75;
320
+ --color-fuchsia-950: #4a044e;
321
+
322
+ /* ============================================
323
+ * PINK - Soft Accent
324
+ * Softer than fuchsia, friendly
325
+ * ============================================ */
326
+
327
+ --color-pink-50: #fdf2f8;
328
+ --color-pink-100: #fce7f3;
329
+ --color-pink-200: #fbcfe8;
330
+ --color-pink-300: #f9a8d4;
331
+ --color-pink-400: #f472b6;
332
+ --color-pink-500: #ec4899;
333
+ --color-pink-600: #db2777;
334
+ --color-pink-700: #be185d;
335
+ --color-pink-800: #9d174d;
336
+ --color-pink-900: #831843;
337
+ --color-pink-950: #500724;
338
+
339
+ /* ============================================
340
+ * PURPLE - Deep Accent
341
+ * Royal, premium feel
342
+ * ============================================ */
343
+
344
+ --color-purple-50: #faf5ff;
345
+ --color-purple-100: #f3e8ff;
346
+ --color-purple-200: #e9d5ff;
347
+ --color-purple-300: #d8b4fe;
348
+ --color-purple-400: #c084fc;
349
+ --color-purple-500: #a855f7;
350
+ --color-purple-600: #9333ea;
351
+ --color-purple-700: #7e22ce;
352
+ --color-purple-800: #6b21a8;
353
+ --color-purple-900: #581c87;
354
+ --color-purple-950: #3b0764;
355
+
356
+ /* ============================================
357
+ * TEAL - Fresh Accent
358
+ * Nature, freshness, balance
359
+ * ============================================ */
360
+
361
+ --color-teal-50: #f0fdfa;
362
+ --color-teal-100: #ccfbf1;
363
+ --color-teal-200: #99f6e4;
364
+ --color-teal-300: #5eead4;
365
+ --color-teal-400: #2dd4bf;
366
+ --color-teal-500: #14b8a6;
367
+ --color-teal-600: #0d9488;
368
+ --color-teal-700: #0f766e;
369
+ --color-teal-800: #115e59;
370
+ --color-teal-900: #134e4a;
371
+ --color-teal-950: #042f2e;
372
+
373
+ /* ============================================
374
+ * LIME - Vibrant Success
375
+ * High energy, growth
376
+ * ============================================ */
377
+
378
+ --color-lime-50: #f7fee7;
379
+ --color-lime-100: #ecfccb;
380
+ --color-lime-200: #d9f99d;
381
+ --color-lime-300: #bef264;
382
+ --color-lime-400: #a3e635;
383
+ --color-lime-500: #84cc16;
384
+ --color-lime-600: #65a30d;
385
+ --color-lime-700: #4d7c0f;
386
+ --color-lime-800: #3f6212;
387
+ --color-lime-900: #365314;
388
+ --color-lime-950: #1a2e05;
389
+ }
390
+
391
+ /* ↳ inlined from src/styles/primitives/brand.css */
392
+ /**
393
+ * Brand Primitive Scales — brasil-a-vera identity (default, overridable)
394
+ *
395
+ * The RDS ships a default brand identity. Consumers reskin by redefining
396
+ * --color-brand-primary-* / --color-brand-secondary-* in their own
397
+ * @theme or :root. The Tailwind primitives in colors.css
398
+ * (--color-indigo-*, --color-pink-*, --color-cyan-*, ...) stay honest
399
+ * to their official Tailwind v4 HEX and are NOT the reskin surface.
400
+ *
401
+ * Semantic tokens in semantic/colors.css cascade via var() and DO NOT
402
+ * need to be touched by consumers.
403
+ *
404
+ * primary scale: institutional navy from brasil-a-vera globals.css.
405
+ * secondary scale: OKLCH-derived from ADR-024 brasil-a-vera purple
406
+ * (hue 295). Reproducible via scripts/derive-brand-secondary.mjs.
407
+ *
408
+ * @brand brasil-a-vera (default, overridable)
409
+ */
410
+
411
+ @theme {
412
+ /* ============================================
413
+ * BRAND PRIMARY — institutional navy (brasil-a-vera)
414
+ * ============================================ */
415
+
416
+ --color-brand-primary-50: #f0f4f8;
417
+ --color-brand-primary-100: #d9e2ec;
418
+ --color-brand-primary-200: #bcccdc;
419
+ --color-brand-primary-300: #9fb3c8;
420
+ --color-brand-primary-400: #7390ad;
421
+ --color-brand-primary-500: #486581;
422
+ --color-brand-primary-600: #334e68;
423
+ --color-brand-primary-700: #243b53;
424
+ --color-brand-primary-800: #1a2a3a;
425
+ --color-brand-primary-900: #102a43;
426
+ --color-brand-primary-950: #061a35;
427
+
428
+ /* ============================================
429
+ * BRAND SECONDARY — ADR-024 purple (OKLCH-derived, hue 295)
430
+ * ============================================ */
431
+
432
+ --color-brand-secondary-50: #f7f5ff;
433
+ --color-brand-secondary-100: #eee9ff;
434
+ --color-brand-secondary-200: #e0d6ff;
435
+ --color-brand-secondary-300: #cbb8ff;
436
+ --color-brand-secondary-400: #aa89fc;
437
+ --color-brand-secondary-500: #8e58f2;
438
+ --color-brand-secondary-600: #703bc8;
439
+ --color-brand-secondary-700: #582aa2;
440
+ --color-brand-secondary-800: #44227e;
441
+ --color-brand-secondary-900: #32185d;
442
+ --color-brand-secondary-950: #180635;
443
+ }
444
+
445
+ /* ↳ inlined from src/styles/primitives/spacing.css */
446
+ /**
447
+ * Design System - Spacing Scale
448
+ *
449
+ * Consistent spacing system based on 4px base unit.
450
+ * Used for margins, paddings, gaps, and layout.
451
+ *
452
+ * @brand brasil-a-vera (default, overridable)
453
+ * @version 1.0.0
454
+ */
455
+
456
+ @theme {
457
+ /* ============================================
458
+ * SPACING SCALE
459
+ * Base unit: 4px (0.25rem)
460
+ * ============================================ */
461
+
462
+ /* Micro spacing (0-4px) */
463
+ --spacing-0: 0px;
464
+ --spacing-px: 1px;
465
+ --spacing-0-5: 0.125rem; /* 2px */
466
+ --spacing-1: 0.25rem; /* 4px */
467
+
468
+ /* Small spacing (8-16px) */
469
+ --spacing-1-5: 0.375rem; /* 6px */
470
+ --spacing-2: 0.5rem; /* 8px */
471
+ --spacing-2-5: 0.625rem; /* 10px */
472
+ --spacing-3: 0.75rem; /* 12px */
473
+ --spacing-3-5: 0.875rem; /* 14px */
474
+ --spacing-4: 1rem; /* 16px */
475
+
476
+ /* Medium spacing (20-32px) */
477
+ --spacing-5: 1.25rem; /* 20px */
478
+ --spacing-6: 1.5rem; /* 24px */
479
+ --spacing-7: 1.75rem; /* 28px */
480
+ --spacing-8: 2rem; /* 32px */
481
+
482
+ /* Large spacing (36-64px) */
483
+ --spacing-9: 2.25rem; /* 36px */
484
+ --spacing-10: 2.5rem; /* 40px */
485
+ --spacing-11: 2.75rem; /* 44px */
486
+ --spacing-12: 3rem; /* 48px */
487
+ --spacing-14: 3.5rem; /* 56px */
488
+ --spacing-16: 4rem; /* 64px */
489
+
490
+ /* Extra large spacing (80-384px) */
491
+ --spacing-20: 5rem; /* 80px */
492
+ --spacing-24: 6rem; /* 96px */
493
+ --spacing-28: 7rem; /* 112px */
494
+ --spacing-32: 8rem; /* 128px */
495
+ --spacing-36: 9rem; /* 144px */
496
+ --spacing-40: 10rem; /* 160px */
497
+ --spacing-44: 11rem; /* 176px */
498
+ --spacing-48: 12rem; /* 192px */
499
+ --spacing-52: 13rem; /* 208px */
500
+ --spacing-56: 14rem; /* 224px */
501
+ --spacing-60: 15rem; /* 240px */
502
+ --spacing-64: 16rem; /* 256px */
503
+ --spacing-72: 18rem; /* 288px */
504
+ --spacing-80: 20rem; /* 320px */
505
+ --spacing-96: 24rem; /* 384px */
506
+
507
+ /* ============================================
508
+ * SEMANTIC SPACING
509
+ * Named tokens for common use cases
510
+ * ============================================ */
511
+
512
+ /* Component internal spacing */
513
+ --spacing-component-xs: var(--spacing-1); /* 4px - tight internal */
514
+ --spacing-component-sm: var(--spacing-2); /* 8px - compact */
515
+ --spacing-component-md: var(--spacing-3); /* 12px - default */
516
+ --spacing-component-lg: var(--spacing-4); /* 16px - comfortable */
517
+ --spacing-component-xl: var(--spacing-6); /* 24px - spacious */
518
+
519
+ /* Layout spacing */
520
+ --spacing-layout-xs: var(--spacing-4); /* 16px */
521
+ --spacing-layout-sm: var(--spacing-6); /* 24px */
522
+ --spacing-layout-md: var(--spacing-8); /* 32px */
523
+ --spacing-layout-lg: var(--spacing-12); /* 48px */
524
+ --spacing-layout-xl: var(--spacing-16); /* 64px */
525
+ --spacing-layout-2xl: var(--spacing-24); /* 96px */
526
+
527
+ /* Section spacing */
528
+ --spacing-section-sm: var(--spacing-12); /* 48px */
529
+ --spacing-section-md: var(--spacing-16); /* 64px */
530
+ --spacing-section-lg: var(--spacing-24); /* 96px */
531
+ --spacing-section-xl: var(--spacing-32); /* 128px */
532
+
533
+ /* Gap spacing (for flexbox/grid) */
534
+ --spacing-gap-xs: var(--spacing-1); /* 4px */
535
+ --spacing-gap-sm: var(--spacing-2); /* 8px */
536
+ --spacing-gap-md: var(--spacing-4); /* 16px */
537
+ --spacing-gap-lg: var(--spacing-6); /* 24px */
538
+ --spacing-gap-xl: var(--spacing-8); /* 32px */
539
+
540
+ /* ============================================
541
+ * FORM ELEMENT SPACING
542
+ * Specific spacing for form controls
543
+ * ============================================ */
544
+
545
+ --spacing-form-element: 38px; /* Standard input height */
546
+ --spacing-form-padding-x: var(--spacing-3); /* 12px */
547
+ --spacing-form-padding-y: var(--spacing-2); /* 8px */
548
+ --spacing-form-gap: var(--spacing-2); /* 8px between fields */
549
+ --spacing-form-label-gap: var(--spacing-1-5); /* 6px label to input */
550
+ }
551
+
552
+ /* ↳ inlined from src/styles/primitives/typography.css */
553
+ /**
554
+ * Design System - Typography
555
+ *
556
+ * Font families, sizes, weights, and line heights.
557
+ * Designed for optimal readability and hierarchy.
558
+ *
559
+ * @brand brasil-a-vera (default, overridable)
560
+ * @version 1.0.0
561
+ */
562
+
563
+ @theme {
564
+ /* ============================================
565
+ * FONT FAMILIES
566
+ * ============================================ */
567
+
568
+ --font-sans:
569
+ ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
570
+ "Segoe UI Symbol", "Noto Color Emoji";
571
+ --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
572
+ --font-mono:
573
+ ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono",
574
+ monospace;
575
+
576
+ /* Brand font - can be customized */
577
+ --font-brand: var(--font-sans);
578
+ --font-display: var(--font-sans);
579
+ --font-body: var(--font-sans);
580
+ --font-code: var(--font-mono);
581
+
582
+ /* ============================================
583
+ * FONT SIZES
584
+ * Scale based on 1rem = 16px
585
+ * ============================================ */
586
+
587
+ --font-size-2xs: 0.625rem; /* 10px */
588
+ --font-size-xs: 0.75rem; /* 12px */
589
+
590
+ /* Tailwind 4 utility-generating namespace (--text-*).
591
+ * text-2xs (10px) is industry-standard for micro-text on badge
592
+ * counters / mini chips; size-only, no default line-height. */
593
+ --text-2xs: var(--font-size-2xs);
594
+ --font-size-sm: 0.875rem; /* 14px */
595
+ --font-size-base: 1rem; /* 16px */
596
+ --font-size-lg: 1.125rem; /* 18px */
597
+ --font-size-xl: 1.25rem; /* 20px */
598
+ --font-size-2xl: 1.5rem; /* 24px */
599
+ --font-size-3xl: 1.875rem; /* 30px */
600
+ --font-size-4xl: 2.25rem; /* 36px */
601
+ --font-size-5xl: 3rem; /* 48px */
602
+ --font-size-6xl: 3.75rem; /* 60px */
603
+ --font-size-7xl: 4.5rem; /* 72px */
604
+ --font-size-8xl: 6rem; /* 96px */
605
+ --font-size-9xl: 8rem; /* 128px */
606
+
607
+ /* ============================================
608
+ * FONT WEIGHTS
609
+ * ============================================ */
610
+
611
+ --font-weight-thin: 100;
612
+ --font-weight-extralight: 200;
613
+ --font-weight-light: 300;
614
+ --font-weight-normal: 400;
615
+ --font-weight-medium: 500;
616
+ --font-weight-semibold: 600;
617
+ --font-weight-bold: 700;
618
+ --font-weight-extrabold: 800;
619
+ --font-weight-black: 900;
620
+
621
+ /* ============================================
622
+ * LINE HEIGHTS
623
+ * ============================================ */
624
+
625
+ --line-height-none: 1;
626
+ --line-height-tight: 1.25;
627
+ --line-height-snug: 1.375;
628
+ --line-height-normal: 1.5;
629
+ --line-height-relaxed: 1.625;
630
+ --line-height-loose: 2;
631
+
632
+ /* Specific line heights */
633
+ --line-height-3: 0.75rem; /* 12px */
634
+ --line-height-4: 1rem; /* 16px */
635
+ --line-height-5: 1.25rem; /* 20px */
636
+ --line-height-6: 1.5rem; /* 24px */
637
+ --line-height-7: 1.75rem; /* 28px */
638
+ --line-height-8: 2rem; /* 32px */
639
+ --line-height-9: 2.25rem; /* 36px */
640
+ --line-height-10: 2.5rem; /* 40px */
641
+
642
+ /* ============================================
643
+ * LETTER SPACING
644
+ * ============================================ */
645
+
646
+ --letter-spacing-tighter: -0.05em;
647
+ --letter-spacing-tight: -0.025em;
648
+ --letter-spacing-normal: 0em;
649
+ --letter-spacing-wide: 0.025em;
650
+ --letter-spacing-wider: 0.05em;
651
+ --letter-spacing-widest: 0.1em;
652
+
653
+ /* ============================================
654
+ * TEXT DECORATION
655
+ * ============================================ */
656
+
657
+ --text-decoration-thickness-auto: auto;
658
+ --text-decoration-thickness-from-font: from-font;
659
+ --text-decoration-thickness-0: 0px;
660
+ --text-decoration-thickness-1: 1px;
661
+ --text-decoration-thickness-2: 2px;
662
+ --text-decoration-thickness-4: 4px;
663
+ --text-decoration-thickness-8: 8px;
664
+
665
+ /* ============================================
666
+ * SEMANTIC TYPOGRAPHY
667
+ * Pre-defined text styles
668
+ * ============================================ */
669
+
670
+ /* Display headings (hero sections) */
671
+ --text-display-1-size: var(--font-size-6xl);
672
+ --text-display-1-weight: var(--font-weight-bold);
673
+ --text-display-1-line-height: var(--line-height-tight);
674
+ --text-display-1-letter-spacing: var(--letter-spacing-tight);
675
+
676
+ --text-display-2-size: var(--font-size-5xl);
677
+ --text-display-2-weight: var(--font-weight-bold);
678
+ --text-display-2-line-height: var(--line-height-tight);
679
+ --text-display-2-letter-spacing: var(--letter-spacing-tight);
680
+
681
+ /* Headings */
682
+ --text-h1-size: var(--font-size-4xl);
683
+ --text-h1-weight: var(--font-weight-bold);
684
+ --text-h1-line-height: var(--line-height-tight);
685
+
686
+ --text-h2-size: var(--font-size-3xl);
687
+ --text-h2-weight: var(--font-weight-semibold);
688
+ --text-h2-line-height: var(--line-height-tight);
689
+
690
+ --text-h3-size: var(--font-size-2xl);
691
+ --text-h3-weight: var(--font-weight-semibold);
692
+ --text-h3-line-height: var(--line-height-snug);
693
+
694
+ --text-h4-size: var(--font-size-xl);
695
+ --text-h4-weight: var(--font-weight-semibold);
696
+ --text-h4-line-height: var(--line-height-snug);
697
+
698
+ --text-h5-size: var(--font-size-lg);
699
+ --text-h5-weight: var(--font-weight-medium);
700
+ --text-h5-line-height: var(--line-height-normal);
701
+
702
+ --text-h6-size: var(--font-size-base);
703
+ --text-h6-weight: var(--font-weight-medium);
704
+ --text-h6-line-height: var(--line-height-normal);
705
+
706
+ /* Body text */
707
+ --text-body-lg-size: var(--font-size-lg);
708
+ --text-body-lg-weight: var(--font-weight-normal);
709
+ --text-body-lg-line-height: var(--line-height-relaxed);
710
+
711
+ --text-body-size: var(--font-size-base);
712
+ --text-body-weight: var(--font-weight-normal);
713
+ --text-body-line-height: var(--line-height-normal);
714
+
715
+ --text-body-sm-size: var(--font-size-sm);
716
+ --text-body-sm-weight: var(--font-weight-normal);
717
+ --text-body-sm-line-height: var(--line-height-normal);
718
+
719
+ /* UI text */
720
+ --text-label-size: var(--font-size-sm);
721
+ --text-label-weight: var(--font-weight-medium);
722
+ --text-label-line-height: var(--line-height-normal);
723
+ --text-label-letter-spacing: var(--letter-spacing-wide);
724
+
725
+ --text-caption-size: var(--font-size-xs);
726
+ --text-caption-weight: var(--font-weight-normal);
727
+ --text-caption-line-height: var(--line-height-normal);
728
+
729
+ --text-overline-size: var(--font-size-xs);
730
+ --text-overline-weight: var(--font-weight-semibold);
731
+ --text-overline-line-height: var(--line-height-normal);
732
+ --text-overline-letter-spacing: var(--letter-spacing-widest);
733
+
734
+ /* Button text */
735
+ --text-button-sm-size: var(--font-size-xs);
736
+ --text-button-sm-weight: var(--font-weight-medium);
737
+
738
+ --text-button-size: var(--font-size-sm);
739
+ --text-button-weight: var(--font-weight-medium);
740
+
741
+ --text-button-lg-size: var(--font-size-base);
742
+ --text-button-lg-weight: var(--font-weight-medium);
743
+
744
+ /* Code text */
745
+ --text-code-size: var(--font-size-sm);
746
+ --text-code-weight: var(--font-weight-normal);
747
+ --text-code-line-height: var(--line-height-relaxed);
748
+ }
749
+
750
+ /* ↳ inlined from src/styles/primitives/shadows.css */
751
+ /**
752
+ * Design System - Shadows
753
+ *
754
+ * Elevation system using box shadows.
755
+ * Creates depth and visual hierarchy.
756
+ *
757
+ * @brand brasil-a-vera (default, overridable)
758
+ * @version 1.0.0
759
+ */
760
+
761
+ @theme {
762
+ /* ============================================
763
+ * BASE SHADOWS
764
+ * Standard elevation levels
765
+ * ============================================ */
766
+
767
+ --shadow-none: none;
768
+
769
+ /* Extra small - subtle depth */
770
+ --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);
771
+
772
+ /* Small - cards, dropdowns (resting state) */
773
+ --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
774
+
775
+ /* Medium - hover states, popovers */
776
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
777
+
778
+ /* Large - modals, dialogs */
779
+ --shadow-lg:
780
+ 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
781
+
782
+ /* Extra large - sticky elements, high elevation */
783
+ --shadow-xl:
784
+ 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
785
+
786
+ /* 2XL - maximum elevation */
787
+ --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);
788
+
789
+ /* Inner shadow - pressed states, inputs */
790
+ --shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);
791
+
792
+ /* ============================================
793
+ * COLORED SHADOWS
794
+ * For brand-colored elements
795
+ * ============================================ */
796
+
797
+ /* Brand-primary shadows — color-mix follows consumer reskin of
798
+ * --color-brand-primary-500 (issue #152 Caminho C). */
799
+ --shadow-primary-sm:
800
+ 0 1px 3px 0
801
+ color-mix(in srgb, var(--color-brand-primary-500) 20%, transparent),
802
+ 0 1px 2px -1px
803
+ color-mix(in srgb, var(--color-brand-primary-500) 20%, transparent);
804
+ --shadow-primary-md:
805
+ 0 4px 6px -1px
806
+ color-mix(in srgb, var(--color-brand-primary-500) 20%, transparent),
807
+ 0 2px 4px -2px
808
+ color-mix(in srgb, var(--color-brand-primary-500) 20%, transparent);
809
+ --shadow-primary-lg:
810
+ 0 10px 15px -3px
811
+ color-mix(in srgb, var(--color-brand-primary-500) 20%, transparent),
812
+ 0 4px 6px -4px
813
+ color-mix(in srgb, var(--color-brand-primary-500) 20%, transparent);
814
+
815
+ /* Brand-secondary shadows */
816
+ --shadow-secondary-sm:
817
+ 0 1px 3px 0
818
+ color-mix(in srgb, var(--color-brand-secondary-500) 20%, transparent),
819
+ 0 1px 2px -1px
820
+ color-mix(in srgb, var(--color-brand-secondary-500) 20%, transparent);
821
+ --shadow-secondary-md:
822
+ 0 4px 6px -1px
823
+ color-mix(in srgb, var(--color-brand-secondary-500) 20%, transparent),
824
+ 0 2px 4px -2px
825
+ color-mix(in srgb, var(--color-brand-secondary-500) 20%, transparent);
826
+ --shadow-secondary-lg:
827
+ 0 10px 15px -3px
828
+ color-mix(in srgb, var(--color-brand-secondary-500) 20%, transparent),
829
+ 0 4px 6px -4px
830
+ color-mix(in srgb, var(--color-brand-secondary-500) 20%, transparent);
831
+
832
+ /* Success (Emerald) shadows */
833
+ --shadow-success-sm:
834
+ 0 1px 3px 0 rgb(16 185 129 / 0.2), 0 1px 2px -1px rgb(16 185 129 / 0.2);
835
+ --shadow-success-md:
836
+ 0 4px 6px -1px rgb(16 185 129 / 0.2), 0 2px 4px -2px rgb(16 185 129 / 0.2);
837
+
838
+ /* Warning (Amber) shadows */
839
+ --shadow-warning-sm:
840
+ 0 1px 3px 0 rgb(245 158 11 / 0.2), 0 1px 2px -1px rgb(245 158 11 / 0.2);
841
+ --shadow-warning-md:
842
+ 0 4px 6px -1px rgb(245 158 11 / 0.2), 0 2px 4px -2px rgb(245 158 11 / 0.2);
843
+
844
+ /* Error (Rose) shadows */
845
+ --shadow-error-sm:
846
+ 0 1px 3px 0 rgb(244 63 94 / 0.2), 0 1px 2px -1px rgb(244 63 94 / 0.2);
847
+ --shadow-error-md:
848
+ 0 4px 6px -1px rgb(244 63 94 / 0.2), 0 2px 4px -2px rgb(244 63 94 / 0.2);
849
+
850
+ /* ============================================
851
+ * SEMANTIC SHADOWS
852
+ * Named shadows for specific use cases
853
+ * ============================================ */
854
+
855
+ /* Component shadows */
856
+ --shadow-card: var(--shadow-sm);
857
+ --shadow-card-hover: var(--shadow-md);
858
+
859
+ --shadow-dropdown: var(--shadow-lg);
860
+ --shadow-popover: var(--shadow-lg);
861
+ --shadow-tooltip: var(--shadow-md);
862
+
863
+ --shadow-modal: var(--shadow-xl);
864
+ --shadow-dialog: var(--shadow-xl);
865
+
866
+ --shadow-sticky: var(--shadow-md);
867
+ --shadow-float: var(--shadow-lg);
868
+
869
+ /* Input shadows */
870
+ --shadow-input: var(--shadow-xs);
871
+ --shadow-input-focus: 0 0 0 3px
872
+ color-mix(in srgb, var(--color-brand-primary-500) 10%, transparent);
873
+ --shadow-input-error: 0 0 0 3px rgb(244 63 94 / 0.1);
874
+ --shadow-input-success: 0 0 0 3px rgb(16 185 129 / 0.1);
875
+
876
+ /* Button shadows */
877
+ --shadow-button: var(--shadow-xs);
878
+ --shadow-button-hover: var(--shadow-sm);
879
+ --shadow-button-active: var(--shadow-inner);
880
+ --shadow-button-primary: var(--shadow-primary-sm);
881
+ --shadow-button-primary-hover: var(--shadow-primary-md);
882
+
883
+ /* ============================================
884
+ * DARK MODE SHADOWS
885
+ * Adjusted for dark backgrounds
886
+ * ============================================ */
887
+
888
+ --shadow-dark-xs: 0 1px 2px 0 rgb(0 0 0 / 0.3);
889
+ --shadow-dark-sm:
890
+ 0 1px 3px 0 rgb(0 0 0 / 0.4), 0 1px 2px -1px rgb(0 0 0 / 0.4);
891
+ --shadow-dark-md:
892
+ 0 4px 6px -1px rgb(0 0 0 / 0.4), 0 2px 4px -2px rgb(0 0 0 / 0.4);
893
+ --shadow-dark-lg:
894
+ 0 10px 15px -3px rgb(0 0 0 / 0.4), 0 4px 6px -4px rgb(0 0 0 / 0.4);
895
+ --shadow-dark-xl:
896
+ 0 20px 25px -5px rgb(0 0 0 / 0.4), 0 8px 10px -6px rgb(0 0 0 / 0.4);
897
+ --shadow-dark-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.6);
898
+
899
+ /* ============================================
900
+ * GLOW EFFECTS
901
+ * For special emphasis
902
+ * ============================================ */
903
+
904
+ --glow-primary: 0 0 20px
905
+ color-mix(in srgb, var(--color-brand-primary-500) 30%, transparent);
906
+ --glow-secondary: 0 0 20px
907
+ color-mix(in srgb, var(--color-brand-secondary-500) 30%, transparent);
908
+ --glow-accent: 0 0 20px rgb(6 182 212 / 0.3);
909
+ --glow-success: 0 0 20px rgb(16 185 129 / 0.3);
910
+ --glow-warning: 0 0 20px rgb(245 158 11 / 0.3);
911
+ --glow-error: 0 0 20px rgb(244 63 94 / 0.3);
912
+ }
913
+
914
+ /* ↳ inlined from src/styles/primitives/radius.css */
915
+ /**
916
+ * Design System - Border Radius
917
+ *
918
+ * Consistent corner rounding system.
919
+ * Creates visual softness and modern feel.
920
+ *
921
+ * @brand brasil-a-vera (default, overridable)
922
+ * @version 1.0.0
923
+ */
924
+
925
+ @theme {
926
+ /* ============================================
927
+ * BASE RADIUS SCALE
928
+ * ============================================ */
929
+
930
+ --radius-none: 0px;
931
+ --radius-sm: 0.125rem; /* 2px */
932
+ --radius-md: 0.25rem; /* 4px - previously 'DEFAULT' */
933
+ --radius-lg: 0.375rem; /* 6px */
934
+ --radius-xl: 0.5rem; /* 8px */
935
+ --radius-2xl: 0.75rem; /* 12px */
936
+ --radius-3xl: 1rem; /* 16px */
937
+ --radius-4xl: 1.5rem; /* 24px */
938
+ --radius-full: 9999px; /* Fully rounded (pills, circles) */
939
+
940
+ /* ============================================
941
+ * SEMANTIC RADIUS
942
+ * Named tokens for specific components
943
+ * ============================================ */
944
+
945
+ /* Buttons */
946
+ --radius-button-sm: var(--radius-md); /* 4px */
947
+ --radius-button: var(--radius-lg); /* 6px */
948
+ --radius-button-lg: var(--radius-xl); /* 8px */
949
+ --radius-button-pill: var(--radius-full);
950
+
951
+ /* Inputs */
952
+ --radius-input: var(--radius-lg); /* 6px */
953
+ --radius-input-sm: var(--radius-md); /* 4px */
954
+ --radius-input-lg: var(--radius-xl); /* 8px */
955
+
956
+ /* Cards */
957
+ --radius-card: var(--radius-xl); /* 8px */
958
+ --radius-card-sm: var(--radius-lg); /* 6px */
959
+ --radius-card-lg: var(--radius-2xl); /* 12px */
960
+
961
+ /* Modals and dialogs */
962
+ --radius-modal: var(--radius-2xl); /* 12px */
963
+ --radius-dialog: var(--radius-2xl); /* 12px */
964
+
965
+ /* Popovers and tooltips */
966
+ --radius-popover: var(--radius-xl); /* 8px */
967
+ --radius-tooltip: var(--radius-lg); /* 6px */
968
+ --radius-dropdown: var(--radius-xl); /* 8px */
969
+
970
+ /* Badges and chips */
971
+ --radius-badge: var(--radius-full); /* Pill shape */
972
+ --radius-chip: var(--radius-lg); /* 6px */
973
+ --radius-tag: var(--radius-md); /* 4px */
974
+
975
+ /* Avatars */
976
+ --radius-avatar: var(--radius-full); /* Circle */
977
+ --radius-avatar-square: var(--radius-lg); /* 6px */
978
+
979
+ /* Progress and sliders */
980
+ --radius-progress: var(--radius-full);
981
+ --radius-slider: var(--radius-full);
982
+ --radius-slider-thumb: var(--radius-full);
983
+
984
+ /* Images and media */
985
+ --radius-image: var(--radius-xl); /* 8px */
986
+ --radius-thumbnail: var(--radius-lg); /* 6px */
987
+ }
988
+
989
+ /* ↳ inlined from src/styles/primitives/animations.css */
990
+ /**
991
+ * Design System - Animations
992
+ *
993
+ * Durations, easings, and transitions.
994
+ * Consistent motion throughout the system.
995
+ *
996
+ * @brand brasil-a-vera (default, overridable)
997
+ * @version 1.0.0
998
+ */
999
+
1000
+ @theme {
1001
+ /* ============================================
1002
+ * DURATIONS
1003
+ * ============================================ */
1004
+
1005
+ --duration-0: 0ms;
1006
+ --duration-75: 75ms;
1007
+ --duration-100: 100ms;
1008
+ --duration-150: 150ms;
1009
+ --duration-200: 200ms;
1010
+ --duration-300: 300ms;
1011
+ --duration-500: 500ms;
1012
+ --duration-700: 700ms;
1013
+ --duration-1000: 1000ms;
1014
+
1015
+ /* Semantic durations */
1016
+ --duration-instant: var(--duration-75); /* Micro interactions */
1017
+ --duration-fast: var(--duration-150); /* Quick feedback */
1018
+ --duration-normal: var(--duration-200); /* Standard transitions */
1019
+ --duration-slow: var(--duration-300); /* Deliberate animations */
1020
+ --duration-slower: var(--duration-500); /* Complex animations */
1021
+
1022
+ /* ============================================
1023
+ * EASINGS
1024
+ * ============================================ */
1025
+
1026
+ --ease-linear: linear;
1027
+ --ease-in: cubic-bezier(0.4, 0, 1, 1);
1028
+ --ease-out: cubic-bezier(0, 0, 0.2, 1);
1029
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
1030
+
1031
+ /* Custom easings */
1032
+ --ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
1033
+ --ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);
1034
+ --ease-smooth: cubic-bezier(0.25, 0.1, 0.25, 1);
1035
+
1036
+ /* Semantic easings */
1037
+ --ease-default: var(--ease-out);
1038
+ --ease-enter: var(--ease-out);
1039
+ --ease-exit: var(--ease-in);
1040
+ --ease-move: var(--ease-in-out);
1041
+
1042
+ /* ============================================
1043
+ * TRANSITIONS
1044
+ * Pre-defined transition strings
1045
+ * ============================================ */
1046
+
1047
+ /* Property-specific */
1048
+ --transition-colors:
1049
+ color var(--duration-fast) var(--ease-default),
1050
+ background-color var(--duration-fast) var(--ease-default),
1051
+ border-color var(--duration-fast) var(--ease-default),
1052
+ text-decoration-color var(--duration-fast) var(--ease-default),
1053
+ fill var(--duration-fast) var(--ease-default),
1054
+ stroke var(--duration-fast) var(--ease-default);
1055
+
1056
+ --transition-opacity: opacity var(--duration-fast) var(--ease-default);
1057
+
1058
+ --transition-shadow: box-shadow var(--duration-fast) var(--ease-default);
1059
+
1060
+ --transition-transform: transform var(--duration-normal) var(--ease-default);
1061
+
1062
+ /* Combined transitions */
1063
+ --transition-all: all var(--duration-normal) var(--ease-default);
1064
+
1065
+ --transition-common:
1066
+ color var(--duration-fast) var(--ease-default),
1067
+ background-color var(--duration-fast) var(--ease-default),
1068
+ border-color var(--duration-fast) var(--ease-default),
1069
+ box-shadow var(--duration-fast) var(--ease-default),
1070
+ opacity var(--duration-fast) var(--ease-default);
1071
+
1072
+ /* ============================================
1073
+ * ANIMATION DELAYS
1074
+ * ============================================ */
1075
+
1076
+ --delay-0: 0ms;
1077
+ --delay-75: 75ms;
1078
+ --delay-100: 100ms;
1079
+ --delay-150: 150ms;
1080
+ --delay-200: 200ms;
1081
+ --delay-300: 300ms;
1082
+ --delay-500: 500ms;
1083
+ --delay-700: 700ms;
1084
+ --delay-1000: 1000ms;
1085
+ }
1086
+
1087
+ /* ============================================
1088
+ * KEYFRAME ANIMATIONS
1089
+ * ============================================ */
1090
+
1091
+ @keyframes fade-in {
1092
+ from {
1093
+ opacity: 0;
1094
+ }
1095
+ to {
1096
+ opacity: 1;
1097
+ }
1098
+ }
1099
+
1100
+ @keyframes fade-out {
1101
+ from {
1102
+ opacity: 1;
1103
+ }
1104
+ to {
1105
+ opacity: 0;
1106
+ }
1107
+ }
1108
+
1109
+ @keyframes slide-in-up {
1110
+ from {
1111
+ transform: translateY(10px);
1112
+ opacity: 0;
1113
+ }
1114
+ to {
1115
+ transform: translateY(0);
1116
+ opacity: 1;
1117
+ }
1118
+ }
1119
+
1120
+ @keyframes slide-in-down {
1121
+ from {
1122
+ transform: translateY(-10px);
1123
+ opacity: 0;
1124
+ }
1125
+ to {
1126
+ transform: translateY(0);
1127
+ opacity: 1;
1128
+ }
1129
+ }
1130
+
1131
+ @keyframes slide-in-left {
1132
+ from {
1133
+ transform: translateX(-10px);
1134
+ opacity: 0;
1135
+ }
1136
+ to {
1137
+ transform: translateX(0);
1138
+ opacity: 1;
1139
+ }
1140
+ }
1141
+
1142
+ @keyframes slide-in-right {
1143
+ from {
1144
+ transform: translateX(10px);
1145
+ opacity: 0;
1146
+ }
1147
+ to {
1148
+ transform: translateX(0);
1149
+ opacity: 1;
1150
+ }
1151
+ }
1152
+
1153
+ @keyframes scale-in {
1154
+ from {
1155
+ transform: scale(0.95);
1156
+ opacity: 0;
1157
+ }
1158
+ to {
1159
+ transform: scale(1);
1160
+ opacity: 1;
1161
+ }
1162
+ }
1163
+
1164
+ @keyframes scale-out {
1165
+ from {
1166
+ transform: scale(1);
1167
+ opacity: 1;
1168
+ }
1169
+ to {
1170
+ transform: scale(0.95);
1171
+ opacity: 0;
1172
+ }
1173
+ }
1174
+
1175
+ @keyframes spin {
1176
+ from {
1177
+ transform: rotate(0deg);
1178
+ }
1179
+ to {
1180
+ transform: rotate(360deg);
1181
+ }
1182
+ }
1183
+
1184
+ @keyframes ping {
1185
+ 75%,
1186
+ 100% {
1187
+ transform: scale(2);
1188
+ opacity: 0;
1189
+ }
1190
+ }
1191
+
1192
+ @keyframes pulse {
1193
+ 0%,
1194
+ 100% {
1195
+ opacity: 1;
1196
+ }
1197
+ 50% {
1198
+ opacity: 0.5;
1199
+ }
1200
+ }
1201
+
1202
+ @keyframes bounce {
1203
+ 0%,
1204
+ 100% {
1205
+ transform: translateY(-25%);
1206
+ animation-timing-function: cubic-bezier(0.8, 0, 1, 1);
1207
+ }
1208
+ 50% {
1209
+ transform: translateY(0);
1210
+ animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
1211
+ }
1212
+ }
1213
+
1214
+ @keyframes shake {
1215
+ 0%,
1216
+ 100% {
1217
+ transform: translateX(0);
1218
+ }
1219
+ 25% {
1220
+ transform: translateX(-4px);
1221
+ }
1222
+ 75% {
1223
+ transform: translateX(4px);
1224
+ }
1225
+ }
1226
+
1227
+ /* Modal/Dialog animations */
1228
+ @keyframes modal-enter {
1229
+ from {
1230
+ opacity: 0;
1231
+ transform: scale(0.95) translateY(-10px);
1232
+ }
1233
+ to {
1234
+ opacity: 1;
1235
+ transform: scale(1) translateY(0);
1236
+ }
1237
+ }
1238
+
1239
+ @keyframes modal-exit {
1240
+ from {
1241
+ opacity: 1;
1242
+ transform: scale(1) translateY(0);
1243
+ }
1244
+ to {
1245
+ opacity: 0;
1246
+ transform: scale(0.95) translateY(-10px);
1247
+ }
1248
+ }
1249
+
1250
+ /* Toast animations */
1251
+ @keyframes toast-enter {
1252
+ from {
1253
+ transform: translateX(100%);
1254
+ opacity: 0;
1255
+ }
1256
+ to {
1257
+ transform: translateX(0);
1258
+ opacity: 1;
1259
+ }
1260
+ }
1261
+
1262
+ @keyframes toast-exit {
1263
+ from {
1264
+ transform: translateX(0);
1265
+ opacity: 1;
1266
+ }
1267
+ to {
1268
+ transform: translateX(100%);
1269
+ opacity: 0;
1270
+ }
1271
+ }
1272
+
1273
+ /* Skeleton loading animation */
1274
+ @keyframes skeleton {
1275
+ 0% {
1276
+ background-position: -200% 0;
1277
+ }
1278
+ 100% {
1279
+ background-position: 200% 0;
1280
+ }
1281
+ }
1282
+
1283
+
1284
+ /* ============================================
1285
+ * SEMANTIC TOKENS
1286
+ * Meaningful tokens that reference primitives.
1287
+ * ============================================ */
1288
+
1289
+ /* ↳ inlined from src/styles/semantic/colors.css */
1290
+ /**
1291
+ * Design System - Semantic Colors
1292
+ *
1293
+ * Meaningful color tokens that reference primitive values.
1294
+ * Declared in @theme so Tailwind v4 generates native utility classes
1295
+ * (bg-surface-base, text-fg-primary, border-line-strong, etc.).
1296
+ * Theme overrides (light/dark) remain in selectors —
1297
+ * see themes/{light,dark}.css.
1298
+ *
1299
+ * @brand brasil-a-vera (default, overridable)
1300
+ * @version 1.0.0
1301
+ */
1302
+
1303
+ @theme {
1304
+ /* ============================================
1305
+ * BRAND COLORS
1306
+ * Core brand identity colors
1307
+ * ============================================ */
1308
+
1309
+ --color-brand-primary: var(--color-brand-primary-500);
1310
+ --color-brand-primary-light: var(--color-brand-primary-400);
1311
+ --color-brand-primary-dark: var(--color-brand-primary-600);
1312
+ --color-brand-primary-darker: var(--color-brand-primary-700);
1313
+
1314
+ --color-brand-secondary: var(--color-brand-secondary-500);
1315
+ --color-brand-secondary-light: var(--color-brand-secondary-400);
1316
+ --color-brand-secondary-dark: var(--color-brand-secondary-600);
1317
+
1318
+ --color-brand-accent: var(--color-cyan-500);
1319
+ --color-brand-accent-light: var(--color-cyan-400);
1320
+ --color-brand-accent-dark: var(--color-cyan-600);
1321
+
1322
+ /* ============================================
1323
+ * FOREGROUND COLORS
1324
+ * Text, icons, and content
1325
+ * ============================================ */
1326
+
1327
+ --color-fg-primary: var(--color-slate-900);
1328
+ --color-fg-secondary: var(--color-slate-600);
1329
+ --color-fg-tertiary: var(--color-slate-500);
1330
+ --color-fg-quaternary: var(--color-slate-400);
1331
+ --color-fg-placeholder: var(--color-slate-400);
1332
+ --color-fg-disabled: var(--color-slate-300);
1333
+ --color-fg-inverse: var(--color-white);
1334
+ --color-fg-inverse-secondary: var(--color-slate-200);
1335
+
1336
+ /* Link colors */
1337
+ --color-fg-link: var(--color-brand-primary-600);
1338
+ --color-fg-link-hover: var(--color-brand-primary-700);
1339
+ --color-fg-link-active: var(--color-brand-primary-800);
1340
+ --color-fg-link-visited: var(--color-brand-secondary-700);
1341
+
1342
+ /* Brand text */
1343
+ --color-fg-brand: var(--color-brand-primary);
1344
+ --color-fg-brand-emphasis: var(--color-brand-primary-600);
1345
+ --color-fg-brand-secondary: var(--color-brand-secondary);
1346
+ --color-fg-brand-secondary-emphasis: var(--color-brand-secondary-600);
1347
+
1348
+ /* Feedback text */
1349
+ --color-fg-success: var(--color-emerald-700);
1350
+ --color-fg-warning: var(--color-amber-700);
1351
+ --color-fg-error: var(--color-rose-700);
1352
+ --color-fg-info: var(--color-sky-700);
1353
+
1354
+ /* On-color feedback text — the text that sits ON the solid (filled)
1355
+ * status surfaces --color-{status}-solid (see FEEDBACK section). White,
1356
+ * calibrated so it clears WCAG AA for normal text against each solid
1357
+ * (emerald-700 5.48:1, amber-700 5.02:1, rose-700 6.29:1, sky-700 5.93:1).
1358
+ * Do NOT confuse with --color-fg-success (the COLORED text used on neutral
1359
+ * or soft-wash surfaces) nor with --color-fg-inverse (slate-900 in dark —
1360
+ * a worse, semantically wrong pair over a saturated status fill). */
1361
+ --color-fg-on-success: var(--color-white);
1362
+ --color-fg-on-warning: var(--color-white);
1363
+ --color-fg-on-error: var(--color-white);
1364
+ --color-fg-on-info: var(--color-white);
1365
+
1366
+ /* ============================================
1367
+ * SURFACE COLORS — Backgrounds
1368
+ * Page and container backgrounds (canvas, subtle, muted, ...)
1369
+ * ============================================ */
1370
+
1371
+ --color-surface-canvas: var(--color-white);
1372
+ --color-surface-subtle: var(--color-slate-50);
1373
+ --color-surface-muted: var(--color-slate-100);
1374
+ --color-surface-emphasis: var(--color-slate-200);
1375
+ --color-surface-strong: var(--color-slate-300);
1376
+ --color-surface-inverse: var(--color-slate-900);
1377
+ --color-surface-inverse-subtle: var(--color-slate-800);
1378
+
1379
+ /* Brand backgrounds */
1380
+ --color-surface-brand-subtle: var(--color-brand-primary-50);
1381
+ --color-surface-brand-muted: var(--color-brand-primary-100);
1382
+ --color-surface-brand: var(--color-brand-primary-500);
1383
+ --color-surface-brand-strong: var(--color-brand-primary-600);
1384
+ --color-surface-brand-emphasis: var(--color-brand-primary-600);
1385
+
1386
+ --color-surface-secondary-subtle: var(--color-brand-secondary-50);
1387
+ --color-surface-secondary: var(--color-brand-secondary-700);
1388
+
1389
+ --color-surface-accent-subtle: var(--color-cyan-50);
1390
+ --color-surface-accent: var(--color-cyan-500);
1391
+
1392
+ /* ============================================
1393
+ * SURFACE COLORS — Elevation layers
1394
+ * Cards, modals, panels (canvas/base/raised/overlay/sunken)
1395
+ * ============================================ */
1396
+
1397
+ --color-surface-base: var(--color-white);
1398
+ --color-surface-raised: var(--color-white);
1399
+ --color-surface-overlay: var(--color-white);
1400
+ --color-surface-sunken: var(--color-slate-50);
1401
+ --color-surface-disabled: var(--color-slate-100);
1402
+
1403
+ /* ============================================
1404
+ * LINE COLORS
1405
+ * Borders, dividers, separators
1406
+ * ============================================ */
1407
+
1408
+ --color-line-default: var(--color-slate-200);
1409
+ --color-line-muted: var(--color-slate-100);
1410
+ --color-line-subtle: var(--color-slate-100);
1411
+ --color-line-emphasis: var(--color-slate-300);
1412
+ --color-line-strong: var(--color-slate-400);
1413
+ --color-line-inverse: var(--color-slate-700);
1414
+
1415
+ /* Focus borders */
1416
+ --color-line-focus: var(--color-brand-primary-500);
1417
+ --color-line-focus-ring: var(--color-brand-primary-500);
1418
+
1419
+ /* Brand borders */
1420
+ --color-line-brand: var(--color-brand-primary-500);
1421
+ --color-line-secondary: var(--color-brand-secondary-500);
1422
+ --color-line-accent: var(--color-cyan-500);
1423
+
1424
+ /* ============================================
1425
+ * SURFACE COLORS — Interactive states
1426
+ * Hover, active, selected, focus (fused from old state namespace)
1427
+ * ============================================ */
1428
+
1429
+ --color-surface-hover: var(--color-slate-50);
1430
+ --color-surface-hover-subtle: var(--color-slate-50);
1431
+ --color-surface-active: var(--color-slate-100);
1432
+ --color-surface-selected: var(--color-brand-primary-50);
1433
+ --color-surface-selected-subtle: var(--color-brand-primary-50);
1434
+ /* state-disabled fused into surface-disabled (identical values) */
1435
+ --color-surface-disabled-subtle: var(--color-slate-50);
1436
+ --color-surface-focus: var(--color-brand-primary-100);
1437
+
1438
+ /* ============================================
1439
+ * FEEDBACK COLORS
1440
+ * For success, warning, error, info states
1441
+ * ============================================ */
1442
+
1443
+ /* Success */
1444
+ --color-success: var(--color-emerald-500);
1445
+ --color-success-light: var(--color-emerald-400);
1446
+ --color-success-dark: var(--color-emerald-700);
1447
+ --color-success-bg: var(--color-emerald-50);
1448
+ --color-success-bg-emphasis: var(--color-emerald-100);
1449
+ --color-success-border: var(--color-emerald-200);
1450
+ --color-success-border-emphasis: var(--color-emerald-500);
1451
+
1452
+ /* Warning */
1453
+ --color-warning: var(--color-amber-500);
1454
+ --color-warning-light: var(--color-amber-400);
1455
+ --color-warning-dark: var(--color-amber-700);
1456
+ --color-warning-bg: var(--color-amber-50);
1457
+ --color-warning-bg-emphasis: var(--color-amber-100);
1458
+ --color-warning-border: var(--color-amber-200);
1459
+ --color-warning-border-emphasis: var(--color-amber-500);
1460
+
1461
+ /* Error */
1462
+ --color-error: var(--color-rose-700);
1463
+ --color-error-light: var(--color-rose-400);
1464
+ --color-error-dark: var(--color-rose-700);
1465
+ --color-error-bg: var(--color-rose-50);
1466
+ --color-error-bg-emphasis: var(--color-rose-100);
1467
+ --color-error-border: var(--color-rose-200);
1468
+ --color-error-border-emphasis: var(--color-rose-500);
1469
+
1470
+ /* Info */
1471
+ --color-info: var(--color-sky-500);
1472
+ --color-info-light: var(--color-sky-400);
1473
+ --color-info-dark: var(--color-sky-700);
1474
+ --color-info-bg: var(--color-sky-50);
1475
+ --color-info-bg-emphasis: var(--color-sky-100);
1476
+ --color-info-border: var(--color-sky-200);
1477
+ --color-info-border-emphasis: var(--color-sky-500);
1478
+
1479
+ /* Status neutral — completes the status family (success/warning/error/info/neutral)
1480
+ * for components like Dot, status Badge, online presence indicators. */
1481
+ --color-status-neutral: var(--color-slate-500);
1482
+
1483
+ /* Solid (filled) status surfaces — saturated backgrounds that CARRY
1484
+ * on-color text (--color-fg-on-{status}, white). Each step is the darkest
1485
+ * needed so white text clears WCAG AA for normal text:
1486
+ * success emerald-700 (5.48:1), warning amber-700 (5.02:1),
1487
+ * error rose-700 (6.29:1), info sky-700 (5.93:1).
1488
+ * These are the TEXT-CARRYING counterparts to the DECORATIVE solids
1489
+ * --color-{status} (emerald-500 etc. — used for Dot/Progress fills where no
1490
+ * text sits, and where white would only reach ~2.5:1). Same split as
1491
+ * surface-brand (decorative) vs surface-brand-strong (carries text). They
1492
+ * stay saturated + white in BOTH themes by design (a status chip, like a
1493
+ * colored button), so the dark.css blocks declare identical values rather
1494
+ * than flipping to a lighter step that white could not sit on. */
1495
+ --color-success-solid: var(--color-emerald-700);
1496
+ --color-warning-solid: var(--color-amber-700);
1497
+ --color-error-solid: var(--color-rose-700);
1498
+ --color-info-solid: var(--color-sky-700);
1499
+
1500
+ /* ============================================
1501
+ * DATA-VISUALIZATION CATEGORICAL PALETTE (Okabe-Ito)
1502
+ *
1503
+ * Colorblind-safe categorical colors for chart series (parties, vote
1504
+ * types, ranges). A SEPARATE axis from the semantic feedback colors:
1505
+ * success/warning/error/info encode STATE, never CATEGORY. These are the
1506
+ * canonical Okabe & Ito (2008) tones — the reference palette engineered to
1507
+ * stay distinguishable under deuteranopia/protanopia/tritanopia — with the
1508
+ * canonical `black` swapped for a neutral gray so the 8th series survives
1509
+ * on a dark canvas. Dark-theme variants in themes/dark.css lift luminance
1510
+ * (hue preserved) so each series clears 3:1 over slate-950 (WCAG 1.4.11).
1511
+ * These intentionally carry literal HEX rather than referencing a tonal
1512
+ * primitive scale — Okabe-Ito is an external canonical set, not a 50..950
1513
+ * ramp. Consume via getChartColor(i) (src/ui/tokens/chart.ts) or the
1514
+ * bg-chart-N / text-chart-N utilities. See .claude/rules/colors.md.
1515
+ * ============================================ */
1516
+
1517
+ --color-chart-1: #e69f00; /* orange */
1518
+ --color-chart-2: #56b4e9; /* sky blue */
1519
+ --color-chart-3: #009e73; /* bluish green */
1520
+ --color-chart-4: #d55e00; /* vermillion */
1521
+ --color-chart-5: #0072b2; /* blue */
1522
+ --color-chart-6: #cc79a7; /* reddish purple */
1523
+ --color-chart-7: #f0e442; /* yellow */
1524
+ --color-chart-8: #999999; /* gray (Okabe-Ito uses black; gray survives dark) */
1525
+
1526
+ /* Data-viz CATEGORICAL tone (soft wash) — the badge-facing member of the
1527
+ * data-viz axis above. A reddish-purple (fuchsia) wash for "category /
1528
+ * analytical" emphasis (e.g. a DataBadge L3/derived-data marker), kept
1529
+ * deliberately distinct from the brand `secondary` violet (state-vs-brand
1530
+ * vs category) and from `accent` (cyan). Mirrors the status soft-wash
1531
+ * trio (bg / dark text / base-border); white is never on it, so the
1532
+ * AA-relevant pair is text-dataviz-dark over bg-dataviz-bg
1533
+ * (fuchsia-700/50 = 5.89:1 light, fuchsia-300/950 = 8.41:1 dark). */
1534
+ --color-dataviz: var(--color-fuchsia-500);
1535
+ --color-dataviz-bg: var(--color-fuchsia-50);
1536
+ --color-dataviz-dark: var(--color-fuchsia-700);
1537
+
1538
+ /* ============================================
1539
+ * SCRIM & TRANSLUCENT STATE LAYERS
1540
+ * Theme-agnostic — these must stay dark in all modes by design.
1541
+ * Scrim is a backdrop veil that focuses attention on an overlay.
1542
+ * Tint is a translucent state layer for hover/interaction feedback
1543
+ * on elements whose surface color is not fixed.
1544
+ * ============================================ */
1545
+
1546
+ /* Scrim color (theme-agnostic — backdrop should be dark in all modes by design) */
1547
+ --color-scrim: rgb(0 0 0 / 0.5);
1548
+
1549
+ /* Tint-hover color (theme-agnostic — translucent layer works over any surface) */
1550
+ --color-tint-hover: rgb(0 0 0 / 0.1);
1551
+
1552
+ /* ============================================
1553
+ * ICON COLORS
1554
+ * For iconography
1555
+ * ============================================ */
1556
+
1557
+ --color-icon-default: var(--color-slate-500);
1558
+ --color-icon-muted: var(--color-slate-400);
1559
+ --color-icon-subtle: var(--color-slate-300);
1560
+ --color-icon-emphasis: var(--color-slate-700);
1561
+ --color-icon-inverse: var(--color-white);
1562
+ --color-icon-brand: var(--color-brand-primary-500);
1563
+ --color-icon-success: var(--color-emerald-500);
1564
+ --color-icon-warning: var(--color-amber-500);
1565
+ --color-icon-error: var(--color-rose-500);
1566
+ --color-icon-info: var(--color-sky-500);
1567
+
1568
+ /* ============================================
1569
+ * OVERLAY COLORS
1570
+ * For modals, drawers, backdrops
1571
+ * ============================================ */
1572
+
1573
+ --color-overlay-light: rgb(255 255 255 / 0.8);
1574
+ --color-overlay-dark: rgb(15 23 42 / 0.5);
1575
+ --color-overlay-darker: rgb(15 23 42 / 0.75);
1576
+ --color-overlay-backdrop: rgb(0 0 0 / 0.5);
1577
+
1578
+ /* ============================================
1579
+ * SKELETON/LOADING COLORS
1580
+ * For loading states
1581
+ * ============================================ */
1582
+
1583
+ --color-skeleton-base: var(--color-slate-200);
1584
+ --color-skeleton-shine: var(--color-slate-100);
1585
+
1586
+ /* ============================================
1587
+ * DIVIDER COLORS
1588
+ * For separators
1589
+ * ============================================ */
1590
+
1591
+ --color-divider: var(--color-slate-200);
1592
+ --color-divider-subtle: var(--color-slate-100);
1593
+ --color-divider-emphasis: var(--color-slate-300);
1594
+ }
1595
+
1596
+ /* ============================================
1597
+ * CANVAS-TOKEN CONSUMPTION
1598
+ *
1599
+ * The body element materialises the design-system canvas color so it
1600
+ * exists in the rendered DOM (axe-core walks the background-color
1601
+ * ancestor chain to compute contrast and DOES NOT read color-scheme).
1602
+ *
1603
+ * Without this rule, --color-surface-canvas was defined but nothing
1604
+ * consumed it: the browser painted an OS/UA dark default when
1605
+ * color-scheme:dark was set, which happened to LOOK approximately
1606
+ * correct, but axe walked the cascade, found rgba(0,0,0,0) everywhere,
1607
+ * defaulted to assuming white-canvas, and flagged every text-fg-* over
1608
+ * an "unbounded" area as ratio ~1.05 — even though the visible
1609
+ * contrast was 6.9–17.0. 67% of the dark color-contrast baseline
1610
+ * (783 of 1159 nodes in the parallel re-sweep) was this single
1611
+ * false-positive class. PR ${??} verified the no-shift property in
1612
+ * light, the spec-alignment shift in dark (UA accidental gray →
1613
+ * DS-specified slate-950), and the surgical positional correlation of
1614
+ * the drop (canvas-fallback stories evaporated; raw-color / Bucket-F /
1615
+ * other-cause stories were untouched).
1616
+ *
1617
+ * `color: var(--color-fg-primary)` makes text without an explicit color
1618
+ * inherit the DS foreground rather than the UA default. Same axe issue
1619
+ * in the foreground direction.
1620
+ * ============================================ */
1621
+
1622
+ @layer base {
1623
+ body {
1624
+ background-color: var(--color-surface-canvas);
1625
+ color: var(--color-fg-primary);
1626
+ }
1627
+ }
1628
+
1629
+ /* ↳ inlined from src/styles/semantic/surfaces.css */
1630
+ /**
1631
+ * Design System - Surface Tokens
1632
+ *
1633
+ * Elevated surfaces, cards, panels, and containers.
1634
+ * Combines colors, shadows, and borders.
1635
+ *
1636
+ * @brand brasil-a-vera (default, overridable)
1637
+ * @version 1.0.0
1638
+ */
1639
+
1640
+ :root {
1641
+ /* ============================================
1642
+ * SURFACE LEVELS
1643
+ * Different elevation levels
1644
+ * ============================================ */
1645
+
1646
+ /* Level 0 - Base/Page background */
1647
+ --surface-0-bg: var(--color-surface-canvas);
1648
+ --surface-0-border: transparent;
1649
+ --surface-0-shadow: none;
1650
+
1651
+ /* Level 1 - Subtle elevation (sunken areas, input fields) */
1652
+ --surface-1-bg: var(--color-surface-sunken);
1653
+ --surface-1-border: var(--color-line-subtle);
1654
+ --surface-1-shadow: var(--shadow-inner);
1655
+
1656
+ /* Level 2 - Cards, panels (resting state) */
1657
+ --surface-2-bg: var(--color-surface-base);
1658
+ --surface-2-border: var(--color-line-default);
1659
+ --surface-2-shadow: var(--shadow-sm);
1660
+
1661
+ /* Level 3 - Raised cards (hover state) */
1662
+ --surface-3-bg: var(--color-surface-raised);
1663
+ --surface-3-border: var(--color-line-default);
1664
+ --surface-3-shadow: var(--shadow-md);
1665
+
1666
+ /* Level 4 - Dropdowns, popovers */
1667
+ --surface-4-bg: var(--color-surface-overlay);
1668
+ --surface-4-border: var(--color-line-default);
1669
+ --surface-4-shadow: var(--shadow-lg);
1670
+
1671
+ /* Level 5 - Modals, dialogs */
1672
+ --surface-5-bg: var(--color-surface-overlay);
1673
+ --surface-5-border: var(--color-line-subtle);
1674
+ --surface-5-shadow: var(--shadow-xl);
1675
+
1676
+ /* Level 6 - Maximum elevation (toasts, notifications) */
1677
+ --surface-6-bg: var(--color-surface-overlay);
1678
+ --surface-6-border: var(--color-line-subtle);
1679
+ --surface-6-shadow: var(--shadow-2xl);
1680
+
1681
+ /* ============================================
1682
+ * COMPONENT SURFACES
1683
+ * Pre-defined surface styles for common components
1684
+ * ============================================ */
1685
+
1686
+ /* Card */
1687
+ --surface-card-bg: var(--surface-2-bg);
1688
+ --surface-card-border: var(--surface-2-border);
1689
+ --surface-card-shadow: var(--surface-2-shadow);
1690
+ --surface-card-radius: var(--radius-card);
1691
+
1692
+ --surface-card-hover-bg: var(--surface-3-bg);
1693
+ --surface-card-hover-border: var(--surface-3-border);
1694
+ --surface-card-hover-shadow: var(--surface-3-shadow);
1695
+
1696
+ /* Card interactive (clickable) */
1697
+ --surface-card-interactive-bg: var(--surface-2-bg);
1698
+ --surface-card-interactive-border: var(--color-line-default);
1699
+ --surface-card-interactive-shadow: var(--shadow-sm);
1700
+
1701
+ --surface-card-interactive-hover-bg: var(--color-surface-subtle);
1702
+ --surface-card-interactive-hover-border: var(--color-line-emphasis);
1703
+ --surface-card-interactive-hover-shadow: var(--shadow-md);
1704
+
1705
+ --surface-card-interactive-active-bg: var(--color-surface-muted);
1706
+ --surface-card-interactive-active-border: var(--color-line-emphasis);
1707
+ --surface-card-interactive-active-shadow: var(--shadow-sm);
1708
+
1709
+ /* Panel */
1710
+ --surface-panel-bg: var(--color-surface-subtle);
1711
+ --surface-panel-border: var(--color-line-default);
1712
+ --surface-panel-shadow: none;
1713
+ --surface-panel-radius: var(--radius-xl);
1714
+
1715
+ /* Sidebar */
1716
+ --surface-sidebar-bg: var(--color-surface-canvas);
1717
+ --surface-sidebar-border: var(--color-line-default);
1718
+ --surface-sidebar-shadow: var(--shadow-sm);
1719
+
1720
+ /* Header */
1721
+ --surface-header-bg: var(--color-surface-canvas);
1722
+ --surface-header-border: var(--color-line-default);
1723
+ --surface-header-shadow: var(--shadow-sm);
1724
+
1725
+ /* Footer */
1726
+ --surface-footer-bg: var(--color-surface-subtle);
1727
+ --surface-footer-border: var(--color-line-default);
1728
+ --surface-footer-shadow: none;
1729
+
1730
+ /* Modal */
1731
+ --surface-modal-bg: var(--surface-5-bg);
1732
+ --surface-modal-border: var(--surface-5-border);
1733
+ --surface-modal-shadow: var(--surface-5-shadow);
1734
+ --surface-modal-radius: var(--radius-modal);
1735
+ --surface-modal-backdrop: var(--color-overlay-backdrop);
1736
+
1737
+ /* Dialog */
1738
+ --surface-dialog-bg: var(--surface-5-bg);
1739
+ --surface-dialog-border: var(--surface-5-border);
1740
+ --surface-dialog-shadow: var(--surface-5-shadow);
1741
+ --surface-dialog-radius: var(--radius-dialog);
1742
+
1743
+ /* Dropdown */
1744
+ --surface-dropdown-bg: var(--surface-4-bg);
1745
+ --surface-dropdown-border: var(--surface-4-border);
1746
+ --surface-dropdown-shadow: var(--surface-4-shadow);
1747
+ --surface-dropdown-radius: var(--radius-dropdown);
1748
+
1749
+ /* Popover */
1750
+ --surface-popover-bg: var(--surface-4-bg);
1751
+ --surface-popover-border: var(--surface-4-border);
1752
+ --surface-popover-shadow: var(--surface-4-shadow);
1753
+ --surface-popover-radius: var(--radius-popover);
1754
+
1755
+ /* Tooltip */
1756
+ --surface-tooltip-bg: var(--color-slate-900);
1757
+ --surface-tooltip-border: transparent;
1758
+ --surface-tooltip-shadow: var(--shadow-md);
1759
+ --surface-tooltip-radius: var(--radius-tooltip);
1760
+ --surface-tooltip-color: var(--color-white);
1761
+
1762
+ /* Toast */
1763
+ --surface-toast-bg: var(--surface-6-bg);
1764
+ --surface-toast-border: var(--surface-6-border);
1765
+ --surface-toast-shadow: var(--surface-6-shadow);
1766
+ --surface-toast-radius: var(--radius-xl);
1767
+
1768
+ /* Input */
1769
+ --surface-input-bg: var(--color-surface-canvas);
1770
+ --surface-input-border: var(--color-line-default);
1771
+ --surface-input-shadow: var(--shadow-xs);
1772
+ --surface-input-radius: var(--radius-input);
1773
+
1774
+ --surface-input-hover-border: var(--color-line-emphasis);
1775
+ --surface-input-focus-border: var(--color-line-focus);
1776
+ --surface-input-focus-shadow: var(--shadow-input-focus);
1777
+
1778
+ --surface-input-error-border: var(--color-error);
1779
+ --surface-input-error-shadow: var(--shadow-input-error);
1780
+
1781
+ --surface-input-disabled-bg: var(--color-surface-muted);
1782
+ --surface-input-disabled-border: var(--color-line-muted);
1783
+
1784
+ /* Button surfaces */
1785
+ --surface-button-primary-bg: var(--color-brand-primary);
1786
+ --surface-button-primary-border: transparent;
1787
+ --surface-button-primary-shadow: var(--shadow-button-primary);
1788
+
1789
+ --surface-button-primary-hover-bg: var(--color-brand-primary-dark);
1790
+ --surface-button-primary-hover-shadow: var(--shadow-button-primary-hover);
1791
+
1792
+ --surface-button-secondary-bg: transparent;
1793
+ --surface-button-secondary-border: var(--color-line-default);
1794
+ --surface-button-secondary-shadow: var(--shadow-button);
1795
+
1796
+ --surface-button-ghost-bg: transparent;
1797
+ --surface-button-ghost-border: transparent;
1798
+
1799
+ /* Table */
1800
+ --surface-table-bg: var(--color-surface-canvas);
1801
+ --surface-table-border: var(--color-line-default);
1802
+ --surface-table-header-bg: var(--color-surface-subtle);
1803
+ --surface-table-row-hover-bg: var(--color-surface-hover);
1804
+ --surface-table-row-selected-bg: var(--color-surface-selected);
1805
+ --surface-table-row-stripe-bg: var(--color-surface-subtle);
1806
+
1807
+ /* Code block */
1808
+ --surface-code-bg: var(--color-slate-900);
1809
+ --surface-code-border: var(--color-slate-700);
1810
+ --surface-code-color: var(--color-slate-100);
1811
+
1812
+ --surface-code-inline-bg: var(--color-slate-100);
1813
+ --surface-code-inline-border: var(--color-slate-200);
1814
+ --surface-code-inline-color: var(--color-rose-600);
1815
+
1816
+ /* ============================================
1817
+ * FEEDBACK SURFACES
1818
+ * For alerts, banners, status indicators
1819
+ * ============================================ */
1820
+
1821
+ /* Success */
1822
+ --surface-success-bg: var(--color-success-bg);
1823
+ --surface-success-border: var(--color-success-border);
1824
+ --surface-success-icon: var(--color-success);
1825
+
1826
+ --surface-success-emphasis-bg: var(--color-success);
1827
+ --surface-success-emphasis-border: var(--color-success-dark);
1828
+ --surface-success-emphasis-color: var(--color-white);
1829
+
1830
+ /* Warning */
1831
+ --surface-warning-bg: var(--color-warning-bg);
1832
+ --surface-warning-border: var(--color-warning-border);
1833
+ --surface-warning-icon: var(--color-warning);
1834
+
1835
+ --surface-warning-emphasis-bg: var(--color-warning);
1836
+ --surface-warning-emphasis-border: var(--color-warning-dark);
1837
+ --surface-warning-emphasis-color: var(--color-slate-900);
1838
+
1839
+ /* Error */
1840
+ --surface-error-bg: var(--color-error-bg);
1841
+ --surface-error-border: var(--color-error-border);
1842
+ --surface-error-icon: var(--color-error);
1843
+
1844
+ --surface-error-emphasis-bg: var(--color-error);
1845
+ --surface-error-emphasis-border: var(--color-error-dark);
1846
+ --surface-error-emphasis-color: var(--color-white);
1847
+
1848
+ /* Info */
1849
+ --surface-info-bg: var(--color-info-bg);
1850
+ --surface-info-border: var(--color-info-border);
1851
+ --surface-info-icon: var(--color-info);
1852
+
1853
+ --surface-info-emphasis-bg: var(--color-info);
1854
+ --surface-info-emphasis-border: var(--color-info-dark);
1855
+ --surface-info-emphasis-color: var(--color-white);
1856
+ }
1857
+
1858
+ /* ↳ inlined from src/styles/semantic/borders.css */
1859
+ /**
1860
+ * Design System - Border Tokens
1861
+ *
1862
+ * Border widths, styles, and complete border definitions.
1863
+ *
1864
+ * @brand brasil-a-vera (default, overridable)
1865
+ * @version 1.0.0
1866
+ */
1867
+
1868
+ @theme {
1869
+ /* ============================================
1870
+ * BORDER WIDTHS
1871
+ * ============================================ */
1872
+
1873
+ --border-width-0: 0px;
1874
+ --border-width-1: 1px;
1875
+ --border-width-2: 2px;
1876
+ --border-width-4: 4px;
1877
+ --border-width-8: 8px;
1878
+
1879
+ /* Semantic widths */
1880
+ --border-width-none: var(--border-width-0);
1881
+ --border-width-thin: var(--border-width-1);
1882
+ --border-width-default: var(--border-width-1);
1883
+ --border-width-medium: var(--border-width-2);
1884
+ --border-width-thick: var(--border-width-4);
1885
+
1886
+ /* ============================================
1887
+ * BORDER STYLES
1888
+ * ============================================ */
1889
+
1890
+ --border-style-solid: solid;
1891
+ --border-style-dashed: dashed;
1892
+ --border-style-dotted: dotted;
1893
+ --border-style-double: double;
1894
+ --border-style-none: none;
1895
+
1896
+ /* ============================================
1897
+ * COMPLETE BORDERS
1898
+ * Ready-to-use border definitions
1899
+ * ============================================ */
1900
+
1901
+ /* Default border */
1902
+ --border-default: var(--border-width-default) var(--border-style-solid)
1903
+ var(--color-line-default);
1904
+ --border-muted: var(--border-width-default) var(--border-style-solid)
1905
+ var(--color-line-muted);
1906
+ --border-subtle: var(--border-width-default) var(--border-style-solid)
1907
+ var(--color-line-subtle);
1908
+ --border-emphasis: var(--border-width-default) var(--border-style-solid)
1909
+ var(--color-line-emphasis);
1910
+ --border-strong: var(--border-width-default) var(--border-style-solid)
1911
+ var(--color-line-strong);
1912
+
1913
+ /* Brand borders */
1914
+ --border-brand: var(--border-width-default) var(--border-style-solid)
1915
+ var(--color-line-brand);
1916
+ --border-brand-emphasis: var(--border-width-medium) var(--border-style-solid)
1917
+ var(--color-line-brand);
1918
+
1919
+ /* Focus borders */
1920
+ --border-focus: var(--border-width-medium) var(--border-style-solid)
1921
+ var(--color-line-focus);
1922
+
1923
+ /* Feedback borders */
1924
+ --border-success: var(--border-width-default) var(--border-style-solid)
1925
+ var(--color-success-border);
1926
+ --border-success-emphasis: var(--border-width-default)
1927
+ var(--border-style-solid) var(--color-success);
1928
+ --border-warning: var(--border-width-default) var(--border-style-solid)
1929
+ var(--color-warning-border);
1930
+ --border-warning-emphasis: var(--border-width-default)
1931
+ var(--border-style-solid) var(--color-warning);
1932
+ --border-error: var(--border-width-default) var(--border-style-solid)
1933
+ var(--color-error-border);
1934
+ --border-error-emphasis: var(--border-width-default) var(--border-style-solid)
1935
+ var(--color-error);
1936
+ --border-info: var(--border-width-default) var(--border-style-solid)
1937
+ var(--color-info-border);
1938
+ --border-info-emphasis: var(--border-width-default) var(--border-style-solid)
1939
+ var(--color-info);
1940
+
1941
+ /* Dashed borders */
1942
+ --border-dashed: var(--border-width-default) var(--border-style-dashed)
1943
+ var(--color-line-default);
1944
+ --border-dashed-emphasis: var(--border-width-default)
1945
+ var(--border-style-dashed) var(--color-line-emphasis);
1946
+
1947
+ /* Dotted borders */
1948
+ --border-dotted: var(--border-width-default) var(--border-style-dotted)
1949
+ var(--color-line-default);
1950
+
1951
+ /* ============================================
1952
+ * OUTLINE TOKENS
1953
+ * For focus indicators
1954
+ * ============================================ */
1955
+
1956
+ --outline-none: none;
1957
+ --outline-default: 2px solid var(--color-line-focus);
1958
+ --outline-offset: 2px;
1959
+
1960
+ /* Focus ring */
1961
+ --ring-width: 3px;
1962
+ --ring-color: var(--color-brand-primary-500);
1963
+ --ring-opacity: 0.2;
1964
+ --ring-offset-width: 2px;
1965
+ --ring-offset-color: var(--color-white);
1966
+
1967
+ /* Focus ring compositions — color-mix preserves the alpha relationship
1968
+ * across consumer reskins (brand-primary override propagates to the
1969
+ * ring automatically). Status rings keep their universal Tailwind
1970
+ * tones (status semantics are not brand-overridable; see issue #152). */
1971
+ --ring-default: 0 0 0 var(--ring-width)
1972
+ color-mix(in srgb, var(--color-brand-primary-500) 20%, transparent);
1973
+ --ring-success: 0 0 0 var(--ring-width)
1974
+ color-mix(in srgb, var(--color-emerald-500) 20%, transparent);
1975
+ --ring-warning: 0 0 0 var(--ring-width)
1976
+ color-mix(in srgb, var(--color-amber-500) 20%, transparent);
1977
+ --ring-error: 0 0 0 var(--ring-width)
1978
+ color-mix(in srgb, var(--color-rose-500) 20%, transparent);
1979
+ --ring-info: 0 0 0 var(--ring-width)
1980
+ color-mix(in srgb, var(--color-sky-500) 20%, transparent);
1981
+
1982
+ /* ============================================
1983
+ * DIVIDER TOKENS
1984
+ * For visual separation
1985
+ * ============================================ */
1986
+
1987
+ --divider-horizontal: var(--border-width-default) var(--border-style-solid)
1988
+ var(--color-divider);
1989
+ --divider-vertical: var(--border-width-default) var(--border-style-solid)
1990
+ var(--color-divider);
1991
+ --divider-subtle: var(--border-width-default) var(--border-style-solid)
1992
+ var(--color-divider-subtle);
1993
+ --divider-emphasis: var(--border-width-default) var(--border-style-solid)
1994
+ var(--color-divider-emphasis);
1995
+ }
1996
+
1997
+
1998
+ /* ============================================
1999
+ * THEMES
2000
+ * Light/dark selector overrides — essential for theme-awareness.
2001
+ * ============================================ */
2002
+
2003
+ /* ↳ inlined from src/styles/themes/index.css */
2004
+ /**
2005
+ * Design System - Theme Aggregator
2006
+ *
2007
+ * Imports all theme files in the correct order.
2008
+ *
2009
+ * @brand brasil-a-vera (default, overridable)
2010
+ * @version 1.0.0
2011
+ */
2012
+
2013
+ /* Base theme utilities and shared variables */
2014
+ /* ↳ inlined from src/styles/themes/base.css */
2015
+ /**
2016
+ * Design System - Theme Base
2017
+ *
2018
+ * Shared theme configuration and utilities.
2019
+ * This file sets up the theme system foundation.
2020
+ *
2021
+ * @brand brasil-a-vera (default, overridable)
2022
+ * @version 1.0.0
2023
+ */
2024
+
2025
+ /* ============================================
2026
+ * THEME DATA ATTRIBUTES
2027
+ * The design system uses the data-theme attribute (or .light / .dark
2028
+ * class) on :root to control color mode.
2029
+ *
2030
+ * Usage:
2031
+ * <html data-theme="light">
2032
+ * <html data-theme="dark">
2033
+ * ============================================ */
2034
+
2035
+ :root {
2036
+ /* ============================================
2037
+ * SHARED THEME VARIABLES
2038
+ * These don't change between light/dark
2039
+ * ============================================ */
2040
+
2041
+ /* Color scheme hint for browsers */
2042
+ color-scheme: light dark;
2043
+
2044
+ /* Default theme - light */
2045
+ --theme-mode: light;
2046
+
2047
+ /* ============================================
2048
+ * Z-INDEX SCALE
2049
+ * Consistent layering across themes
2050
+ * ============================================ */
2051
+
2052
+ --z-behind: -1;
2053
+ --z-base: 0;
2054
+ --z-dropdown: 10;
2055
+ --z-sticky: 20;
2056
+ --z-fixed: 30;
2057
+ --z-modal-backdrop: 40;
2058
+ --z-modal: 50;
2059
+ --z-popover: 60;
2060
+ --z-tooltip: 70;
2061
+ --z-toast: 80;
2062
+ --z-max: 9999;
2063
+
2064
+ /* ============================================
2065
+ * OPACITY SCALE
2066
+ * Consistent transparency values
2067
+ * ============================================ */
2068
+
2069
+ --opacity-0: 0;
2070
+ --opacity-5: 0.05;
2071
+ --opacity-10: 0.1;
2072
+ --opacity-20: 0.2;
2073
+ --opacity-25: 0.25;
2074
+ --opacity-30: 0.3;
2075
+ --opacity-40: 0.4;
2076
+ --opacity-50: 0.5;
2077
+ --opacity-60: 0.6;
2078
+ --opacity-70: 0.7;
2079
+ --opacity-75: 0.75;
2080
+ --opacity-80: 0.8;
2081
+ --opacity-90: 0.9;
2082
+ --opacity-95: 0.95;
2083
+ --opacity-100: 1;
2084
+
2085
+ /* ============================================
2086
+ * ASPECT RATIOS
2087
+ * Common aspect ratios for media
2088
+ * ============================================ */
2089
+
2090
+ --aspect-auto: auto;
2091
+ --aspect-square: 1 / 1;
2092
+ --aspect-video: 16 / 9;
2093
+ --aspect-portrait: 3 / 4;
2094
+ --aspect-landscape: 4 / 3;
2095
+ --aspect-wide: 21 / 9;
2096
+
2097
+ /* ============================================
2098
+ * CONTAINER SIZES
2099
+ * Max widths for content containers
2100
+ * ============================================ */
2101
+
2102
+ --container-xs: 20rem; /* 320px */
2103
+ --container-sm: 24rem; /* 384px */
2104
+ --container-md: 28rem; /* 448px */
2105
+ --container-lg: 32rem; /* 512px */
2106
+ --container-xl: 36rem; /* 576px */
2107
+ --container-2xl: 42rem; /* 672px */
2108
+ --container-3xl: 48rem; /* 768px */
2109
+ --container-4xl: 56rem; /* 896px */
2110
+ --container-5xl: 64rem; /* 1024px */
2111
+ --container-6xl: 72rem; /* 1152px */
2112
+ --container-7xl: 80rem; /* 1280px */
2113
+ --container-full: 100%;
2114
+ --container-prose: 65ch; /* Optimal reading width */
2115
+
2116
+ /* ============================================
2117
+ * BREAKPOINTS
2118
+ * Responsive design breakpoints
2119
+ * ============================================ */
2120
+
2121
+ --breakpoint-sm: 640px;
2122
+ --breakpoint-md: 768px;
2123
+ --breakpoint-lg: 1024px;
2124
+ --breakpoint-xl: 1280px;
2125
+ --breakpoint-2xl: 1536px;
2126
+
2127
+ /* ============================================
2128
+ * SCROLLBAR STYLING
2129
+ * Consistent scrollbar appearance
2130
+ * ============================================ */
2131
+
2132
+ --scrollbar-width: 8px;
2133
+ --scrollbar-width-thin: 4px;
2134
+ /* slate-100 preserved from the prior themes/light.css declaration
2135
+ * (D4). dark.css redeclares this token with a darker value. */
2136
+ --scrollbar-track-bg: var(--color-slate-100);
2137
+ --scrollbar-thumb-bg: var(--color-slate-300);
2138
+ --scrollbar-thumb-hover-bg: var(--color-slate-400);
2139
+ --scrollbar-radius: var(--radius-full);
2140
+ }
2141
+
2142
+ /* ============================================
2143
+ * SCROLLBAR STYLES
2144
+ * Custom scrollbar for WebKit browsers
2145
+ * ============================================ */
2146
+
2147
+ /* Webkit scrollbar */
2148
+ ::-webkit-scrollbar {
2149
+ width: var(--scrollbar-width);
2150
+ height: var(--scrollbar-width);
2151
+ }
2152
+
2153
+ ::-webkit-scrollbar-track {
2154
+ background: var(--scrollbar-track-bg);
2155
+ border-radius: var(--scrollbar-radius);
2156
+ }
2157
+
2158
+ ::-webkit-scrollbar-thumb {
2159
+ background: var(--scrollbar-thumb-bg);
2160
+ border-radius: var(--scrollbar-radius);
2161
+ }
2162
+
2163
+ ::-webkit-scrollbar-thumb:hover {
2164
+ background: var(--scrollbar-thumb-hover-bg);
2165
+ }
2166
+
2167
+ /* Firefox scrollbar */
2168
+ * {
2169
+ scrollbar-width: thin;
2170
+ scrollbar-color: var(--scrollbar-thumb-bg) var(--scrollbar-track-bg);
2171
+ }
2172
+
2173
+ /* Thin scrollbar variant */
2174
+ .scrollbar-thin::-webkit-scrollbar {
2175
+ width: var(--scrollbar-width-thin);
2176
+ height: var(--scrollbar-width-thin);
2177
+ }
2178
+
2179
+ /* Hidden scrollbar (still scrollable) */
2180
+ .scrollbar-hidden {
2181
+ -ms-overflow-style: none;
2182
+ scrollbar-width: none;
2183
+ }
2184
+
2185
+ .scrollbar-hidden::-webkit-scrollbar {
2186
+ display: none;
2187
+ }
2188
+
2189
+ /* ============================================
2190
+ * FOCUS STYLES
2191
+ * Accessible focus indicators
2192
+ * ============================================ */
2193
+
2194
+ /* Remove default focus outline */
2195
+ *:focus {
2196
+ outline: none;
2197
+ }
2198
+
2199
+ /* Keyboard focus only (not mouse/touch) */
2200
+ *:focus-visible {
2201
+ outline: 2px solid var(--color-line-focus);
2202
+ outline-offset: 2px;
2203
+ }
2204
+
2205
+ /* Focus ring utility class */
2206
+ .focus-ring:focus-visible {
2207
+ box-shadow: var(--ring-default);
2208
+ }
2209
+
2210
+ /* Skip to main content link */
2211
+ .skip-link {
2212
+ position: absolute;
2213
+ top: -40px;
2214
+ left: 0;
2215
+ background: var(--color-surface-canvas);
2216
+ color: var(--color-fg-primary);
2217
+ padding: var(--spacing-2) var(--spacing-4);
2218
+ z-index: var(--z-max);
2219
+ transition: top var(--duration-fast) var(--ease-default);
2220
+ }
2221
+
2222
+ .skip-link:focus {
2223
+ top: 0;
2224
+ }
2225
+
2226
+ /* ============================================
2227
+ * SELECTION STYLES
2228
+ * Text selection appearance
2229
+ * ============================================ */
2230
+
2231
+ ::selection {
2232
+ background-color: var(--color-brand-primary-200);
2233
+ color: var(--color-slate-900);
2234
+ }
2235
+
2236
+ /* ============================================
2237
+ * REDUCED MOTION
2238
+ * Respect user preferences
2239
+ * ============================================ */
2240
+
2241
+ @media (prefers-reduced-motion: reduce) {
2242
+ *,
2243
+ *::before,
2244
+ *::after {
2245
+ animation-duration: 0.01ms !important;
2246
+ animation-iteration-count: 1 !important;
2247
+ transition-duration: 0.01ms !important;
2248
+ scroll-behavior: auto !important;
2249
+ }
2250
+ }
2251
+
2252
+
2253
+ /* Color modes */
2254
+ /* ↳ inlined from src/styles/themes/light.css */
2255
+ /**
2256
+ * Light Theme — minimal mode indicator
2257
+ *
2258
+ * Light is the default theme: all light-mode token values are declared
2259
+ * once in semantic/colors.css (@theme), themes/base.css (shared
2260
+ * cross-theme tokens like scrollbar/code/shadow), and semantic/surfaces.css.
2261
+ * This file ONLY carries the theme-mode indicator and the color-scheme
2262
+ * hint — there is nothing else for it to redeclare without drifting from
2263
+ * the @theme defaults.
2264
+ *
2265
+ * Architecture rationale: the Caminho C refactor (issue #152) chose
2266
+ * "single source of truth for light" over "redundant declarations + a
2267
+ * coverage validator" — eliminate the drift surface rather than police it.
2268
+ *
2269
+ * Dark mode keeps its own themes/dark.css (necessarily — dark redeclares
2270
+ * ~117 tokens and validate-dark-coverage.mjs guards the @media duplication).
2271
+ *
2272
+ * @brand brasil-a-vera (default, overridable)
2273
+ */
2274
+
2275
+ :root,
2276
+ [data-theme="light"],
2277
+ .light {
2278
+ --theme-mode: light;
2279
+ color-scheme: light;
2280
+ }
2281
+
2282
+ /* ↳ inlined from src/styles/themes/dark.css */
2283
+ /**
2284
+ * Design System - Dark Theme
2285
+ *
2286
+ * Dark color scheme overrides.
2287
+ * Activated via data-theme="dark" or .dark class.
2288
+ *
2289
+ * @brand brasil-a-vera (default, overridable)
2290
+ * @version 1.0.0
2291
+ */
2292
+
2293
+ [data-theme="dark"],
2294
+ .dark {
2295
+ /* Theme indicator */
2296
+ --theme-mode: dark;
2297
+ color-scheme: dark;
2298
+
2299
+ /* ============================================
2300
+ * BRAND COLORS
2301
+ * Slightly lighter for dark backgrounds
2302
+ * ============================================ */
2303
+
2304
+ --color-brand-primary: var(--color-brand-primary-400);
2305
+ --color-brand-primary-light: var(--color-brand-primary-300);
2306
+ --color-brand-primary-dark: var(--color-brand-primary-500);
2307
+ --color-brand-primary-darker: var(--color-brand-primary-600);
2308
+
2309
+ --color-brand-secondary: var(--color-brand-secondary-400);
2310
+ --color-brand-secondary-light: var(--color-brand-secondary-300);
2311
+ --color-brand-secondary-dark: var(--color-brand-secondary-500);
2312
+
2313
+ --color-brand-accent: var(--color-cyan-400);
2314
+ --color-brand-accent-light: var(--color-cyan-300);
2315
+ --color-brand-accent-dark: var(--color-cyan-500);
2316
+
2317
+ /* ============================================
2318
+ * FOREGROUND COLORS
2319
+ * Inverted for dark backgrounds
2320
+ * ============================================ */
2321
+
2322
+ --color-fg-primary: var(--color-slate-50);
2323
+ --color-fg-secondary: var(--color-slate-300);
2324
+ --color-fg-tertiary: var(--color-slate-400);
2325
+ --color-fg-quaternary: var(--color-slate-500);
2326
+ --color-fg-placeholder: var(--color-slate-500);
2327
+ --color-fg-disabled: var(--color-slate-600);
2328
+ --color-fg-inverse: var(--color-slate-900);
2329
+ --color-fg-inverse-secondary: var(--color-slate-700);
2330
+
2331
+ /* Link colors */
2332
+ --color-fg-link: var(--color-brand-primary-400);
2333
+ --color-fg-link-hover: var(--color-brand-primary-300);
2334
+ --color-fg-link-active: var(--color-brand-primary-200);
2335
+ --color-fg-link-visited: var(--color-brand-secondary-300);
2336
+
2337
+ /* Brand text */
2338
+ --color-fg-brand: var(--color-brand-primary-400);
2339
+ --color-fg-brand-emphasis: var(--color-brand-primary-300);
2340
+ --color-fg-brand-secondary: var(--color-brand-secondary-400);
2341
+ --color-fg-brand-secondary-emphasis: var(--color-brand-secondary-300);
2342
+
2343
+ /* Feedback text */
2344
+ --color-fg-success: var(--color-emerald-400);
2345
+ --color-fg-warning: var(--color-amber-400);
2346
+ --color-fg-error: var(--color-rose-400);
2347
+ --color-fg-info: var(--color-sky-400);
2348
+
2349
+ /* On-color feedback text — constant white in both themes (the solid
2350
+ * status surfaces stay saturated + dark in dark mode too). See
2351
+ * semantic/colors.css for the AA rationale. */
2352
+ --color-fg-on-success: var(--color-white);
2353
+ --color-fg-on-warning: var(--color-white);
2354
+ --color-fg-on-error: var(--color-white);
2355
+ --color-fg-on-info: var(--color-white);
2356
+
2357
+ /* ============================================
2358
+ * SURFACE COLORS — Backgrounds (dark scale)
2359
+ * ============================================ */
2360
+
2361
+ --color-surface-canvas: var(--color-slate-950);
2362
+ --color-surface-subtle: var(--color-slate-900);
2363
+ --color-surface-muted: var(--color-slate-800);
2364
+ --color-surface-emphasis: var(--color-slate-700);
2365
+ --color-surface-strong: var(--color-slate-600);
2366
+ --color-surface-inverse: var(--color-slate-50);
2367
+ --color-surface-inverse-subtle: var(--color-slate-100);
2368
+
2369
+ /* Brand backgrounds */
2370
+ --color-surface-brand-subtle: var(--color-brand-primary-950);
2371
+ --color-surface-brand-muted: var(--color-brand-primary-900);
2372
+ --color-surface-brand: var(--color-brand-primary-500);
2373
+ --color-surface-brand-strong: var(--color-brand-primary-400);
2374
+ --color-surface-brand-emphasis: var(--color-brand-primary-400);
2375
+
2376
+ --color-surface-secondary-subtle: var(--color-brand-secondary-950);
2377
+ --color-surface-secondary: var(--color-brand-secondary-500);
2378
+
2379
+ --color-surface-accent-subtle: var(--color-cyan-950);
2380
+ --color-surface-accent: var(--color-cyan-500);
2381
+
2382
+ /* ============================================
2383
+ * SURFACE COLORS — Elevation layers (dark)
2384
+ * ============================================ */
2385
+
2386
+ --color-surface-base: var(--color-slate-900);
2387
+ --color-surface-raised: var(--color-slate-800);
2388
+ --color-surface-overlay: var(--color-slate-800);
2389
+ --color-surface-sunken: var(--color-slate-950);
2390
+ --color-surface-disabled: var(--color-slate-800);
2391
+
2392
+ /* Surface levels */
2393
+ --surface-0-bg: var(--color-slate-950);
2394
+ --surface-1-bg: var(--color-slate-900);
2395
+ --surface-2-bg: var(--color-slate-800);
2396
+ --surface-3-bg: var(--color-slate-700);
2397
+ --surface-4-bg: var(--color-slate-800);
2398
+ --surface-5-bg: var(--color-slate-800);
2399
+
2400
+ /* ============================================
2401
+ * LINE COLORS
2402
+ * Lighter borders on dark backgrounds
2403
+ * ============================================ */
2404
+
2405
+ --color-line-default: var(--color-slate-700);
2406
+ --color-line-muted: var(--color-slate-800);
2407
+ --color-line-subtle: var(--color-slate-800);
2408
+ --color-line-emphasis: var(--color-slate-600);
2409
+ --color-line-strong: var(--color-slate-500);
2410
+ --color-line-inverse: var(--color-slate-200);
2411
+ --color-line-focus: var(--color-brand-primary-400);
2412
+ --color-line-focus-ring: var(--color-brand-primary-400);
2413
+
2414
+ /* Brand-colored borders — mirror the brand foreground/border ladder
2415
+ * (light theme uses -500, dark theme uses -400) so a Tabs underline or
2416
+ * branded outline reads against a dark surface. Concrete contrast is
2417
+ * verified per release via test:a11y:baseline. */
2418
+ --color-line-brand: var(--color-brand-primary-400);
2419
+ --color-line-secondary: var(--color-brand-secondary-400);
2420
+ --color-line-accent: var(--color-cyan-400);
2421
+
2422
+ /* ============================================
2423
+ * SURFACE COLORS — Interactive states (dark)
2424
+ * ============================================ */
2425
+
2426
+ --color-surface-hover: var(--color-slate-800);
2427
+ --color-surface-hover-subtle: var(--color-slate-900);
2428
+ --color-surface-active: var(--color-slate-700);
2429
+ --color-surface-selected: var(--color-brand-primary-950);
2430
+ --color-surface-selected-subtle: var(--color-brand-primary-900);
2431
+ /* state-disabled fused into surface-disabled (identical values).
2432
+ * disabled-subtle is intentionally close to canvas — slate-900 over
2433
+ * canvas slate-950 is ~1.16:1, mirroring the light pattern where
2434
+ * slate-50 over white is also barely perceptible. The role is
2435
+ * "barely-perceptible disabled wash", not "visible disabled tint". */
2436
+ --color-surface-disabled-subtle: var(--color-slate-900);
2437
+ --color-surface-focus: var(--color-brand-primary-900);
2438
+
2439
+ /* ============================================
2440
+ * FEEDBACK COLORS
2441
+ * Brighter for dark backgrounds
2442
+ * ============================================ */
2443
+
2444
+ /* Success */
2445
+ --color-success: var(--color-emerald-400);
2446
+ --color-success-light: var(--color-emerald-300);
2447
+ --color-success-dark: var(--color-emerald-500);
2448
+ --color-success-bg: var(--color-emerald-950);
2449
+ --color-success-bg-emphasis: var(--color-emerald-900);
2450
+ --color-success-border: var(--color-emerald-800);
2451
+ --color-success-border-emphasis: var(--color-emerald-400);
2452
+
2453
+ /* Warning */
2454
+ --color-warning: var(--color-amber-400);
2455
+ --color-warning-light: var(--color-amber-300);
2456
+ --color-warning-dark: var(--color-amber-500);
2457
+ --color-warning-bg: var(--color-amber-950);
2458
+ --color-warning-bg-emphasis: var(--color-amber-900);
2459
+ --color-warning-border: var(--color-amber-800);
2460
+ --color-warning-border-emphasis: var(--color-amber-400);
2461
+
2462
+ /* Error */
2463
+ --color-error: var(--color-rose-400);
2464
+ --color-error-light: var(--color-rose-300);
2465
+ --color-error-dark: var(--color-rose-400);
2466
+ --color-error-bg: var(--color-rose-950);
2467
+ --color-error-bg-emphasis: var(--color-rose-900);
2468
+ --color-error-border: var(--color-rose-800);
2469
+ --color-error-border-emphasis: var(--color-rose-400);
2470
+
2471
+ /* Info */
2472
+ --color-info: var(--color-sky-400);
2473
+ --color-info-light: var(--color-sky-300);
2474
+ --color-info-dark: var(--color-sky-500);
2475
+
2476
+ /* Status neutral — completes status family in dark mode */
2477
+ --color-status-neutral: var(--color-slate-400);
2478
+ --color-info-bg: var(--color-sky-950);
2479
+ --color-info-bg-emphasis: var(--color-sky-900);
2480
+ --color-info-border: var(--color-sky-800);
2481
+ --color-info-border-emphasis: var(--color-sky-400);
2482
+
2483
+ /* Solid (filled) status surfaces — saturated chips that stay dark in both
2484
+ * themes so white on-color text clears AA. Identical to light by design.
2485
+ * See semantic/colors.css. */
2486
+ --color-success-solid: var(--color-emerald-700);
2487
+ --color-warning-solid: var(--color-amber-700);
2488
+ --color-error-solid: var(--color-rose-700);
2489
+ --color-info-solid: var(--color-sky-700);
2490
+
2491
+ /* ============================================
2492
+ * DATA-VISUALIZATION CATEGORICAL PALETTE (Okabe-Ito, dark-calibrated)
2493
+ * Luminance lifted (hue preserved) so each series clears 3:1 over
2494
+ * slate-950. Must mirror the @media block below. See semantic/colors.css.
2495
+ * ============================================ */
2496
+
2497
+ --color-chart-1: #f2b441; /* orange */
2498
+ --color-chart-2: #7fc8f0; /* sky blue */
2499
+ --color-chart-3: #2cc79a; /* bluish green */
2500
+ --color-chart-4: #f47a2e; /* vermillion */
2501
+ --color-chart-5: #4da3dc; /* blue */
2502
+ --color-chart-6: #e098c3; /* reddish purple */
2503
+ --color-chart-7: #f5ec6b; /* yellow */
2504
+ --color-chart-8: #b8bcc4; /* gray */
2505
+
2506
+ /* Data-viz categorical tone (soft wash) — see semantic/colors.css. */
2507
+ --color-dataviz: var(--color-fuchsia-400);
2508
+ --color-dataviz-bg: var(--color-fuchsia-950);
2509
+ --color-dataviz-dark: var(--color-fuchsia-300);
2510
+
2511
+ /* ============================================
2512
+ * ICON COLORS
2513
+ * ============================================ */
2514
+
2515
+ --color-icon-default: var(--color-slate-400);
2516
+ --color-icon-muted: var(--color-slate-500);
2517
+ --color-icon-subtle: var(--color-slate-600);
2518
+ --color-icon-emphasis: var(--color-slate-200);
2519
+ --color-icon-inverse: var(--color-slate-900);
2520
+ --color-icon-brand: var(--color-brand-primary-400);
2521
+ --color-icon-success: var(--color-emerald-400);
2522
+ --color-icon-warning: var(--color-amber-400);
2523
+ --color-icon-error: var(--color-rose-400);
2524
+ --color-icon-info: var(--color-sky-400);
2525
+
2526
+ /* ============================================
2527
+ * OVERLAY COLORS
2528
+ * ============================================ */
2529
+
2530
+ --color-overlay-light: rgb(255 255 255 / 0.1);
2531
+ --color-overlay-dark: rgb(0 0 0 / 0.6);
2532
+ --color-overlay-darker: rgb(0 0 0 / 0.8);
2533
+ --color-overlay-backdrop: rgb(0 0 0 / 0.7);
2534
+
2535
+ /* ============================================
2536
+ * SHADOWS
2537
+ * Darker, more intense shadows for dark theme
2538
+ * ============================================ */
2539
+
2540
+ --shadow-card: var(--shadow-dark-sm);
2541
+ --shadow-card-hover: var(--shadow-dark-md);
2542
+ --shadow-dropdown: var(--shadow-dark-lg);
2543
+ --shadow-modal: var(--shadow-dark-xl);
2544
+ --shadow-tooltip: var(--shadow-dark-md);
2545
+
2546
+ /* ============================================
2547
+ * SCROLLBAR
2548
+ * Darker scrollbar for dark theme
2549
+ * ============================================ */
2550
+
2551
+ --scrollbar-track-bg: var(--color-slate-900);
2552
+ --scrollbar-thumb-bg: var(--color-slate-600);
2553
+ --scrollbar-thumb-hover-bg: var(--color-slate-500);
2554
+
2555
+ /* ============================================
2556
+ * SKELETON
2557
+ * ============================================ */
2558
+
2559
+ --color-skeleton-base: var(--color-slate-700);
2560
+ --color-skeleton-shine: var(--color-slate-600);
2561
+
2562
+ /* ============================================
2563
+ * DIVIDER
2564
+ * ============================================ */
2565
+
2566
+ --color-divider: var(--color-slate-700);
2567
+ --color-divider-subtle: var(--color-slate-800);
2568
+ --color-divider-emphasis: var(--color-slate-600);
2569
+
2570
+ /* ============================================
2571
+ * CODE
2572
+ * ============================================ */
2573
+
2574
+ --surface-code-bg: var(--color-slate-950);
2575
+ --surface-code-border: var(--color-slate-800);
2576
+ --surface-code-color: var(--color-slate-100);
2577
+
2578
+ --surface-code-inline-bg: var(--color-slate-800);
2579
+ --surface-code-inline-border: var(--color-slate-700);
2580
+ --surface-code-inline-color: var(--color-brand-secondary-300);
2581
+
2582
+ /* ============================================
2583
+ * TOOLTIP
2584
+ * Inverted for dark theme
2585
+ * ============================================ */
2586
+
2587
+ --surface-tooltip-bg: var(--color-slate-100);
2588
+ --surface-tooltip-color: var(--color-slate-900);
2589
+
2590
+ /* ============================================
2591
+ * FOCUS RING
2592
+ * More visible on dark backgrounds
2593
+ * ============================================ */
2594
+
2595
+ --ring-color: var(--color-brand-primary-400);
2596
+ /* D7: color-mix preserves the brand-primary-400 → 30% alpha relationship
2597
+ * across reskins. If a consumer overrides --color-brand-primary-400, the
2598
+ * focus ring follows automatically. WCAG 2.4.11 (focus-visible) is
2599
+ * verified against the resolved alpha in test:a11y:baseline. */
2600
+ --ring-default: 0 0 0 var(--ring-width)
2601
+ color-mix(in srgb, var(--color-brand-primary-400) 30%, transparent);
2602
+
2603
+ /* ============================================
2604
+ * SELECTION
2605
+ * ============================================ */
2606
+
2607
+ ::selection {
2608
+ background-color: var(--color-brand-primary-700);
2609
+ color: var(--color-white);
2610
+ }
2611
+ }
2612
+
2613
+ /* ============================================
2614
+ * SYSTEM PREFERENCE: DARK
2615
+ * Automatically apply dark theme if user prefers.
2616
+ *
2617
+ * IMPORTANT — this block is INTENTIONALLY a verbatim duplicate of the
2618
+ * `[data-theme="dark"], .dark` block above. CSS does not inherit
2619
+ * variables between selectors: a previous version listed only 5 vars
2620
+ * here with a comment "other variables would inherit from .dark", and
2621
+ * that comment was wrong — users on prefers-color-scheme: dark without
2622
+ * an explicit data-theme="dark" received 5 dark vars + ~110 light vars,
2623
+ * which produced Modal/Dialog/CommandPalette with white backgrounds in
2624
+ * OS dark mode (rg 1.05 contrast catastrophe — found by the dark a11y
2625
+ * baseline plumbing).
2626
+ *
2627
+ * Both blocks MUST stay byte-identical except for selector and
2628
+ * `--theme-mode`/`color-scheme` headers. `scripts/validate-dark-coverage.mjs`
2629
+ * runs in pre-push + CI and fails on any divergence — duplication that
2630
+ * cannot drift. If you change a value here, change it in the
2631
+ * `[data-theme="dark"]` block above (and vice versa).
2632
+ * ============================================ */
2633
+
2634
+ @media (prefers-color-scheme: dark) {
2635
+ :root:not([data-theme="light"]):not(.light) {
2636
+ /* Theme indicator */
2637
+ --theme-mode: dark;
2638
+ color-scheme: dark;
2639
+
2640
+ /* ============================================
2641
+ * BRAND COLORS
2642
+ * ============================================ */
2643
+
2644
+ --color-brand-primary: var(--color-brand-primary-400);
2645
+ --color-brand-primary-light: var(--color-brand-primary-300);
2646
+ --color-brand-primary-dark: var(--color-brand-primary-500);
2647
+ --color-brand-primary-darker: var(--color-brand-primary-600);
2648
+
2649
+ --color-brand-secondary: var(--color-brand-secondary-400);
2650
+ --color-brand-secondary-light: var(--color-brand-secondary-300);
2651
+ --color-brand-secondary-dark: var(--color-brand-secondary-500);
2652
+
2653
+ --color-brand-accent: var(--color-cyan-400);
2654
+ --color-brand-accent-light: var(--color-cyan-300);
2655
+ --color-brand-accent-dark: var(--color-cyan-500);
2656
+
2657
+ /* ============================================
2658
+ * FOREGROUND COLORS
2659
+ * ============================================ */
2660
+
2661
+ --color-fg-primary: var(--color-slate-50);
2662
+ --color-fg-secondary: var(--color-slate-300);
2663
+ --color-fg-tertiary: var(--color-slate-400);
2664
+ --color-fg-quaternary: var(--color-slate-500);
2665
+ --color-fg-placeholder: var(--color-slate-500);
2666
+ --color-fg-disabled: var(--color-slate-600);
2667
+ --color-fg-inverse: var(--color-slate-900);
2668
+ --color-fg-inverse-secondary: var(--color-slate-700);
2669
+
2670
+ --color-fg-link: var(--color-brand-primary-400);
2671
+ --color-fg-link-hover: var(--color-brand-primary-300);
2672
+ --color-fg-link-active: var(--color-brand-primary-200);
2673
+ --color-fg-link-visited: var(--color-brand-secondary-300);
2674
+
2675
+ --color-fg-brand: var(--color-brand-primary-400);
2676
+ --color-fg-brand-emphasis: var(--color-brand-primary-300);
2677
+ --color-fg-brand-secondary: var(--color-brand-secondary-400);
2678
+ --color-fg-brand-secondary-emphasis: var(--color-brand-secondary-300);
2679
+
2680
+ --color-fg-success: var(--color-emerald-400);
2681
+ --color-fg-warning: var(--color-amber-400);
2682
+ --color-fg-error: var(--color-rose-400);
2683
+ --color-fg-info: var(--color-sky-400);
2684
+
2685
+ /* On-color feedback text — constant white in both themes. */
2686
+ --color-fg-on-success: var(--color-white);
2687
+ --color-fg-on-warning: var(--color-white);
2688
+ --color-fg-on-error: var(--color-white);
2689
+ --color-fg-on-info: var(--color-white);
2690
+
2691
+ /* ============================================
2692
+ * SURFACE COLORS — Backgrounds
2693
+ * ============================================ */
2694
+
2695
+ --color-surface-canvas: var(--color-slate-950);
2696
+ --color-surface-subtle: var(--color-slate-900);
2697
+ --color-surface-muted: var(--color-slate-800);
2698
+ --color-surface-emphasis: var(--color-slate-700);
2699
+ --color-surface-strong: var(--color-slate-600);
2700
+ --color-surface-inverse: var(--color-slate-50);
2701
+ --color-surface-inverse-subtle: var(--color-slate-100);
2702
+
2703
+ --color-surface-brand-subtle: var(--color-brand-primary-950);
2704
+ --color-surface-brand-muted: var(--color-brand-primary-900);
2705
+ --color-surface-brand: var(--color-brand-primary-500);
2706
+ --color-surface-brand-strong: var(--color-brand-primary-400);
2707
+ --color-surface-brand-emphasis: var(--color-brand-primary-400);
2708
+
2709
+ --color-surface-secondary-subtle: var(--color-brand-secondary-950);
2710
+ --color-surface-secondary: var(--color-brand-secondary-500);
2711
+
2712
+ --color-surface-accent-subtle: var(--color-cyan-950);
2713
+ --color-surface-accent: var(--color-cyan-500);
2714
+
2715
+ /* ============================================
2716
+ * SURFACE COLORS — Elevation layers
2717
+ * ============================================ */
2718
+
2719
+ --color-surface-base: var(--color-slate-900);
2720
+ --color-surface-raised: var(--color-slate-800);
2721
+ --color-surface-overlay: var(--color-slate-800);
2722
+ --color-surface-sunken: var(--color-slate-950);
2723
+ --color-surface-disabled: var(--color-slate-800);
2724
+
2725
+ --surface-0-bg: var(--color-slate-950);
2726
+ --surface-1-bg: var(--color-slate-900);
2727
+ --surface-2-bg: var(--color-slate-800);
2728
+ --surface-3-bg: var(--color-slate-700);
2729
+ --surface-4-bg: var(--color-slate-800);
2730
+ --surface-5-bg: var(--color-slate-800);
2731
+
2732
+ /* ============================================
2733
+ * LINE COLORS
2734
+ * ============================================ */
2735
+
2736
+ --color-line-default: var(--color-slate-700);
2737
+ --color-line-muted: var(--color-slate-800);
2738
+ --color-line-subtle: var(--color-slate-800);
2739
+ --color-line-emphasis: var(--color-slate-600);
2740
+ --color-line-strong: var(--color-slate-500);
2741
+ --color-line-inverse: var(--color-slate-200);
2742
+ --color-line-focus: var(--color-brand-primary-400);
2743
+ --color-line-focus-ring: var(--color-brand-primary-400);
2744
+
2745
+ --color-line-brand: var(--color-brand-primary-400);
2746
+ --color-line-secondary: var(--color-brand-secondary-400);
2747
+ --color-line-accent: var(--color-cyan-400);
2748
+
2749
+ /* ============================================
2750
+ * SURFACE COLORS — Interactive states
2751
+ * ============================================ */
2752
+
2753
+ --color-surface-hover: var(--color-slate-800);
2754
+ --color-surface-hover-subtle: var(--color-slate-900);
2755
+ --color-surface-active: var(--color-slate-700);
2756
+ --color-surface-selected: var(--color-brand-primary-950);
2757
+ --color-surface-selected-subtle: var(--color-brand-primary-900);
2758
+ --color-surface-disabled-subtle: var(--color-slate-900);
2759
+ --color-surface-focus: var(--color-brand-primary-900);
2760
+
2761
+ /* ============================================
2762
+ * FEEDBACK COLORS
2763
+ * ============================================ */
2764
+
2765
+ --color-success: var(--color-emerald-400);
2766
+ --color-success-light: var(--color-emerald-300);
2767
+ --color-success-dark: var(--color-emerald-500);
2768
+ --color-success-bg: var(--color-emerald-950);
2769
+ --color-success-bg-emphasis: var(--color-emerald-900);
2770
+ --color-success-border: var(--color-emerald-800);
2771
+ --color-success-border-emphasis: var(--color-emerald-400);
2772
+
2773
+ --color-warning: var(--color-amber-400);
2774
+ --color-warning-light: var(--color-amber-300);
2775
+ --color-warning-dark: var(--color-amber-500);
2776
+ --color-warning-bg: var(--color-amber-950);
2777
+ --color-warning-bg-emphasis: var(--color-amber-900);
2778
+ --color-warning-border: var(--color-amber-800);
2779
+ --color-warning-border-emphasis: var(--color-amber-400);
2780
+
2781
+ --color-error: var(--color-rose-400);
2782
+ --color-error-light: var(--color-rose-300);
2783
+ --color-error-dark: var(--color-rose-400);
2784
+ --color-error-bg: var(--color-rose-950);
2785
+ --color-error-bg-emphasis: var(--color-rose-900);
2786
+ --color-error-border: var(--color-rose-800);
2787
+ --color-error-border-emphasis: var(--color-rose-400);
2788
+
2789
+ --color-info: var(--color-sky-400);
2790
+ --color-info-light: var(--color-sky-300);
2791
+ --color-info-dark: var(--color-sky-500);
2792
+ --color-info-bg: var(--color-sky-950);
2793
+ --color-info-bg-emphasis: var(--color-sky-900);
2794
+ --color-info-border: var(--color-sky-800);
2795
+ --color-info-border-emphasis: var(--color-sky-400);
2796
+
2797
+ --color-status-neutral: var(--color-slate-400);
2798
+
2799
+ /* Solid (filled) status surfaces — identical to light by design. */
2800
+ --color-success-solid: var(--color-emerald-700);
2801
+ --color-warning-solid: var(--color-amber-700);
2802
+ --color-error-solid: var(--color-rose-700);
2803
+ --color-info-solid: var(--color-sky-700);
2804
+
2805
+ /* ============================================
2806
+ * DATA-VISUALIZATION CATEGORICAL PALETTE (Okabe-Ito, dark-calibrated)
2807
+ * ============================================ */
2808
+
2809
+ --color-chart-1: #f2b441; /* orange */
2810
+ --color-chart-2: #7fc8f0; /* sky blue */
2811
+ --color-chart-3: #2cc79a; /* bluish green */
2812
+ --color-chart-4: #f47a2e; /* vermillion */
2813
+ --color-chart-5: #4da3dc; /* blue */
2814
+ --color-chart-6: #e098c3; /* reddish purple */
2815
+ --color-chart-7: #f5ec6b; /* yellow */
2816
+ --color-chart-8: #b8bcc4; /* gray */
2817
+
2818
+ /* Data-viz categorical tone (soft wash) — see semantic/colors.css. */
2819
+ --color-dataviz: var(--color-fuchsia-400);
2820
+ --color-dataviz-bg: var(--color-fuchsia-950);
2821
+ --color-dataviz-dark: var(--color-fuchsia-300);
2822
+
2823
+ /* ============================================
2824
+ * ICON COLORS
2825
+ * ============================================ */
2826
+
2827
+ --color-icon-default: var(--color-slate-400);
2828
+ --color-icon-muted: var(--color-slate-500);
2829
+ --color-icon-subtle: var(--color-slate-600);
2830
+ --color-icon-emphasis: var(--color-slate-200);
2831
+ --color-icon-inverse: var(--color-slate-900);
2832
+ --color-icon-brand: var(--color-brand-primary-400);
2833
+ --color-icon-success: var(--color-emerald-400);
2834
+ --color-icon-warning: var(--color-amber-400);
2835
+ --color-icon-error: var(--color-rose-400);
2836
+ --color-icon-info: var(--color-sky-400);
2837
+
2838
+ /* ============================================
2839
+ * OVERLAY COLORS
2840
+ * ============================================ */
2841
+
2842
+ --color-overlay-light: rgb(255 255 255 / 0.1);
2843
+ --color-overlay-dark: rgb(0 0 0 / 0.6);
2844
+ --color-overlay-darker: rgb(0 0 0 / 0.8);
2845
+ --color-overlay-backdrop: rgb(0 0 0 / 0.7);
2846
+
2847
+ /* ============================================
2848
+ * SHADOWS
2849
+ * ============================================ */
2850
+
2851
+ --shadow-card: var(--shadow-dark-sm);
2852
+ --shadow-card-hover: var(--shadow-dark-md);
2853
+ --shadow-dropdown: var(--shadow-dark-lg);
2854
+ --shadow-modal: var(--shadow-dark-xl);
2855
+ --shadow-tooltip: var(--shadow-dark-md);
2856
+
2857
+ /* ============================================
2858
+ * SCROLLBAR
2859
+ * ============================================ */
2860
+
2861
+ --scrollbar-track-bg: var(--color-slate-900);
2862
+ --scrollbar-thumb-bg: var(--color-slate-600);
2863
+ --scrollbar-thumb-hover-bg: var(--color-slate-500);
2864
+
2865
+ /* ============================================
2866
+ * SKELETON
2867
+ * ============================================ */
2868
+
2869
+ --color-skeleton-base: var(--color-slate-700);
2870
+ --color-skeleton-shine: var(--color-slate-600);
2871
+
2872
+ /* ============================================
2873
+ * DIVIDER
2874
+ * ============================================ */
2875
+
2876
+ --color-divider: var(--color-slate-700);
2877
+ --color-divider-subtle: var(--color-slate-800);
2878
+ --color-divider-emphasis: var(--color-slate-600);
2879
+
2880
+ /* ============================================
2881
+ * CODE
2882
+ * ============================================ */
2883
+
2884
+ --surface-code-bg: var(--color-slate-950);
2885
+ --surface-code-border: var(--color-slate-800);
2886
+ --surface-code-color: var(--color-slate-100);
2887
+
2888
+ --surface-code-inline-bg: var(--color-slate-800);
2889
+ --surface-code-inline-border: var(--color-slate-700);
2890
+ --surface-code-inline-color: var(--color-brand-secondary-300);
2891
+
2892
+ /* ============================================
2893
+ * TOOLTIP
2894
+ * ============================================ */
2895
+
2896
+ --surface-tooltip-bg: var(--color-slate-100);
2897
+ --surface-tooltip-color: var(--color-slate-900);
2898
+
2899
+ /* ============================================
2900
+ * FOCUS RING
2901
+ * ============================================ */
2902
+
2903
+ --ring-color: var(--color-brand-primary-400);
2904
+ /* D7: color-mix preserves the brand-primary-400 → 30% alpha relationship
2905
+ * across reskins. If a consumer overrides --color-brand-primary-400, the
2906
+ * focus ring follows automatically. WCAG 2.4.11 (focus-visible) is
2907
+ * verified against the resolved alpha in test:a11y:baseline. */
2908
+ --ring-default: 0 0 0 var(--ring-width)
2909
+ color-mix(in srgb, var(--color-brand-primary-400) 30%, transparent);
2910
+ }
2911
+
2912
+ /* ::selection inside @media — sibling to the :root rule above so
2913
+ * older browsers without CSS nesting still parse cleanly. */
2914
+ :root:not([data-theme="light"]):not(.light) ::selection {
2915
+ background-color: var(--color-brand-primary-700);
2916
+ color: var(--color-white);
2917
+ }
2918
+ }
2919
+
2920
+