@omkarux/vela 0.2.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.
Files changed (45) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/LICENSE +21 -0
  3. package/README.md +112 -0
  4. package/dist/components/Button/Button.d.ts +32 -0
  5. package/dist/components/Button/Button.js +51 -0
  6. package/dist/components/Button/index.d.ts +2 -0
  7. package/dist/components/ContextualAlert/ContextualAlert.d.ts +18 -0
  8. package/dist/components/ContextualAlert/ContextualAlert.js +49 -0
  9. package/dist/components/ContextualAlert/index.d.ts +2 -0
  10. package/dist/components/Input/Input.d.ts +12 -0
  11. package/dist/components/Input/Input.js +31 -0
  12. package/dist/components/Input/index.d.ts +2 -0
  13. package/dist/components/StatusIndicator/StatusIndicator.d.ts +14 -0
  14. package/dist/components/StatusIndicator/StatusIndicator.js +31 -0
  15. package/dist/components/StatusIndicator/index.d.ts +2 -0
  16. package/dist/components/Tabs/Tabs.d.ts +44 -0
  17. package/dist/components/Tabs/Tabs.js +94 -0
  18. package/dist/components/Tabs/index.d.ts +2 -0
  19. package/dist/components/Toggle/Toggle.d.ts +23 -0
  20. package/dist/components/Toggle/Toggle.js +55 -0
  21. package/dist/components/Toggle/index.d.ts +2 -0
  22. package/dist/index.d.ts +24 -0
  23. package/dist/index.js +16 -0
  24. package/dist/lib/cn.d.ts +5 -0
  25. package/dist/lib/cn.js +6 -0
  26. package/dist/lib/icons.d.ts +7 -0
  27. package/dist/lib/icons.js +32 -0
  28. package/dist/tokens.css +610 -0
  29. package/dist/vela.css +897 -0
  30. package/guidelines/components/button.md +104 -0
  31. package/guidelines/components/contextual-alert.md +59 -0
  32. package/guidelines/components/input.md +65 -0
  33. package/guidelines/components/status-indicator.md +48 -0
  34. package/guidelines/components/tabs.md +71 -0
  35. package/guidelines/components/toggle.md +53 -0
  36. package/guidelines/foundations/color.md +67 -0
  37. package/guidelines/foundations/radius.md +17 -0
  38. package/guidelines/foundations/sizing.md +35 -0
  39. package/guidelines/foundations/spacing.md +28 -0
  40. package/guidelines/foundations/typography.md +34 -0
  41. package/guidelines/llms.txt +33 -0
  42. package/guidelines/overview.md +48 -0
  43. package/guidelines/setup.md +64 -0
  44. package/guidelines/tokens.md +69 -0
  45. package/package.json +84 -0
@@ -0,0 +1,610 @@
1
+ /*! @omkarux/vela — design tokens + component styles. MIT. */
2
+ /* ============================================================================
3
+ VELA — Design tokens
4
+ Two layers: primitives (raw scale values) and semantics (role-named).
5
+ Always bind to semantics. Primitives exist so semantics can be re-pointed
6
+ for theming — binding a primitive directly defeats the entire architecture.
7
+ Numeric tokens carry their unit. Use them directly; never calc(... * 1px).
8
+ ============================================================================ */
9
+
10
+ :root {
11
+ color-scheme: light;
12
+
13
+ /* ---- Primitives: neutral ---- */
14
+ --vela-black: #191d1f;
15
+ --vela-white: #ffffff;
16
+ --vela-grey-50: #f7f9f9;
17
+ --vela-grey-100: #eef2f2;
18
+ --vela-grey-200: #dde3e4;
19
+ --vela-grey-300: #c8d0d2;
20
+ --vela-grey-400: #a3aeb1;
21
+ --vela-grey-500: #7f8c90;
22
+ --vela-grey-600: #667377; /* AA-safe de-emphasized text on white */
23
+ --vela-grey-700: #49555a;
24
+ --vela-grey-800: #333d41;
25
+ --vela-grey-850: #262e31;
26
+ --vela-grey-900: #1b2225;
27
+ --vela-grey-950: #11171a;
28
+
29
+ /* ---- Primitives: brand / blue ---- */
30
+ --vela-primary-300: #5fb8c9;
31
+ --vela-primary-400: #2f9db3;
32
+ --vela-primary-500: #0a6c7d;
33
+ --vela-primary-600: #075462;
34
+ --vela-blue-100: #e6eefb;
35
+ --vela-blue-150: #cfdff7;
36
+ --vela-blue-300: #85aae8;
37
+ --vela-blue-500: #3d7fd6;
38
+ --vela-blue-700: #35558a;
39
+ --vela-blue-950: #0e1a2e;
40
+
41
+ /* ---- Primitives: red / critical ---- */
42
+ --vela-red-100: #fce8e6;
43
+ --vela-red-300: #f0918c;
44
+ --vela-red-500: #dd4b3e;
45
+ --vela-red-700: #ab3125;
46
+ --vela-red-950: #2a1310;
47
+ --vela-critical-100: #f2d6d4;
48
+ --vela-critical-300: #cc6f68;
49
+ --vela-critical-500: #a81c14;
50
+ --vela-critical-700: #7d150f;
51
+ --vela-critical-950: #2b100e;
52
+
53
+ /* ---- Primitives: yellow / orange / green ---- */
54
+ --vela-yellow-100: #fdf1d3;
55
+ --vela-yellow-300: #f7d382;
56
+ --vela-yellow-500: #f0c14e;
57
+ --vela-yellow-600: #c99a10;
58
+ --vela-yellow-700: #9a7a0c;
59
+ --vela-yellow-800: #7a6224;
60
+ --vela-yellow-950: #26200e;
61
+ --vela-orange-100: #fde7d0;
62
+ --vela-orange-300: #f5ad63;
63
+ --vela-orange-500: #ea7f1a;
64
+ --vela-orange-600: #c86a0d; /* AA-safe status dot on white */
65
+ --vela-orange-700: #9c5408;
66
+ --vela-orange-950: #281a0b;
67
+ --vela-green-100: #dcefe0;
68
+ --vela-green-300: #86c795;
69
+ --vela-green-500: #4aa863;
70
+ --vela-green-700: #1f7340;
71
+ --vela-green-800: #175c33; /* AA-safe success text on green-100 */
72
+ --vela-green-950: #0d2318;
73
+
74
+ /* ---- Semantic: surface ---- */
75
+ --vela-bg-global: var(--vela-white);
76
+ --vela-bg-container: var(--vela-grey-100);
77
+ --vela-bg-raised: var(--vela-white);
78
+ --vela-bg-hover: var(--vela-grey-100);
79
+ --vela-bg-tooltip: var(--vela-grey-800);
80
+ --vela-bg-inactive: var(--vela-grey-100);
81
+ --vela-bg-selected: var(--vela-blue-100);
82
+ --vela-primary-tint: var(--vela-blue-100);
83
+ --vela-primary-active-bg: var(--vela-primary-500);
84
+
85
+ /* ---- Semantic: border ---- */
86
+ --vela-border-default: var(--vela-grey-500);
87
+ --vela-border-subtle: var(--vela-grey-200);
88
+ --vela-border-active: var(--vela-primary-500);
89
+ --vela-border-inactive: var(--vela-grey-200);
90
+ --vela-border-action: var(--vela-grey-700);
91
+
92
+ /* ---- Semantic: text ---- */
93
+ --vela-text-default: var(--vela-grey-700);
94
+ --vela-text-heading: var(--vela-black);
95
+ --vela-text-de-emphasized: var(--vela-grey-600);
96
+ --vela-text-inactive: var(--vela-grey-400);
97
+ --vela-text-link: var(--vela-primary-500);
98
+ --vela-text-on-brand: var(--vela-white);
99
+ --vela-text-on-tint: var(--vela-grey-700);
100
+ --vela-text-error: var(--vela-red-700);
101
+
102
+ /* ---- Semantic: icon ---- */
103
+ --vela-icon-default: var(--vela-grey-500);
104
+ --vela-icon-strong: var(--vela-grey-700);
105
+ --vela-icon-selected: var(--vela-primary-500);
106
+ --vela-icon-disabled: var(--vela-grey-300);
107
+ --vela-icon-on-brand: var(--vela-white);
108
+
109
+ /* ---- Semantic: button ---- */
110
+ --vela-btn-primary-bg: var(--vela-primary-500);
111
+ --vela-btn-primary-hover-bg: var(--vela-primary-600);
112
+ --vela-btn-primary-border: var(--vela-primary-500);
113
+ --vela-btn-primary-text: var(--vela-white);
114
+ --vela-btn-standard-bg: var(--vela-grey-100);
115
+ --vela-btn-standard-hover-bg: var(--vela-grey-200);
116
+ --vela-btn-standard-text: var(--vela-grey-700);
117
+ --vela-btn-hollow-primary-text: var(--vela-primary-500);
118
+ --vela-btn-hollow-primary-border: var(--vela-primary-500);
119
+ --vela-btn-disabled-bg: var(--vela-grey-200);
120
+ --vela-btn-disabled-text: var(--vela-text-inactive);
121
+
122
+
123
+ /* ---- Semantic: destructive button ----
124
+ NOTE: red-500 on white is 4.08:1 and fails WCAG AA for normal text.
125
+ Destructive filled therefore binds red-700 (6.57:1). This is a
126
+ deliberate divergence from a naive "use the signal color" mapping. */
127
+ --vela-btn-destructive-bg: var(--vela-red-700);
128
+ --vela-btn-destructive-hover-bg: var(--vela-critical-500);
129
+ --vela-btn-destructive-text: var(--vela-white);
130
+ --vela-btn-destructive-hollow-text: var(--vela-red-700);
131
+ --vela-btn-standard-border: var(--vela-grey-600);
132
+ --vela-btn-hollow-hover-bg: var(--vela-primary-tint);
133
+
134
+ /* ---- Semantic: form control ---- */
135
+ --vela-control-bg: var(--vela-white);
136
+ --vela-control-border: var(--vela-grey-500);
137
+ --vela-control-border-hover: var(--vela-grey-500);
138
+ --vela-control-border-active: var(--vela-primary-500);
139
+ --vela-control-border-error: var(--vela-red-500);
140
+ --vela-control-bg-disabled: var(--vela-grey-100);
141
+ --vela-control-placeholder: var(--vela-grey-600);
142
+ --vela-toggle-off-bg: var(--vela-grey-400);
143
+ --vela-toggle-on-bg: var(--vela-primary-500);
144
+ --vela-toggle-knob: var(--vela-white);
145
+
146
+ /* ============================================================================
147
+ SEVERITY — 6 levels. Describes events and alerts.
148
+ Never interchange with Risk or Status. There is no "high severity".
149
+ Every level defines the full row: bg, border, signal, icon, text, indicator.
150
+ ============================================================================ */
151
+ --vela-bg-severity-success: var(--vela-green-100);
152
+ --vela-border-severity-success: var(--vela-green-300);
153
+ --vela-signal-severity-success: var(--vela-green-500);
154
+ --vela-icon-severity-success: var(--vela-green-800);
155
+ --vela-text-severity-success: var(--vela-green-800);
156
+ --vela-border-severity-success-indicator: var(--vela-green-700);
157
+
158
+ --vela-bg-severity-info: var(--vela-blue-100);
159
+ --vela-border-severity-info: var(--vela-blue-300);
160
+ --vela-signal-severity-info: var(--vela-blue-500);
161
+ --vela-icon-severity-info: var(--vela-blue-700);
162
+ --vela-text-severity-info: var(--vela-blue-700);
163
+ --vela-border-severity-info-indicator: var(--vela-blue-700);
164
+
165
+ --vela-bg-severity-warning: var(--vela-yellow-100);
166
+ --vela-border-severity-warning: var(--vela-yellow-300);
167
+ --vela-signal-severity-warning: var(--vela-yellow-500);
168
+ --vela-icon-severity-warning: var(--vela-yellow-800);
169
+ --vela-text-severity-warning: var(--vela-yellow-800);
170
+ --vela-border-severity-warning-indicator: var(--vela-yellow-700);
171
+
172
+ --vela-bg-severity-minor: var(--vela-orange-100);
173
+ --vela-border-severity-minor: var(--vela-orange-300);
174
+ --vela-signal-severity-minor: var(--vela-orange-500);
175
+ --vela-icon-severity-minor: var(--vela-orange-700);
176
+ --vela-text-severity-minor: var(--vela-orange-700);
177
+ --vela-border-severity-minor-indicator: var(--vela-orange-700);
178
+
179
+ --vela-bg-severity-major: var(--vela-red-100);
180
+ --vela-border-severity-major: var(--vela-red-300);
181
+ --vela-signal-severity-major: var(--vela-red-500);
182
+ --vela-icon-severity-major: var(--vela-red-700);
183
+ --vela-text-severity-major: var(--vela-red-700);
184
+ --vela-border-severity-major-indicator: var(--vela-red-700);
185
+
186
+ --vela-bg-severity-critical: var(--vela-critical-100);
187
+ --vela-border-severity-critical: var(--vela-critical-300);
188
+ --vela-signal-severity-critical: var(--vela-critical-500);
189
+ --vela-icon-severity-critical: var(--vela-critical-700);
190
+ --vela-text-severity-critical: var(--vela-critical-700);
191
+ --vela-border-severity-critical-indicator: var(--vela-critical-700);
192
+
193
+ /* ============================================================================
194
+ RISK — 3 levels. Describes scoring. There is no "critical risk".
195
+ ============================================================================ */
196
+ --vela-bg-risk-low: var(--vela-green-100);
197
+ --vela-border-risk-low: var(--vela-green-300);
198
+ --vela-signal-risk-low: var(--vela-green-500);
199
+ --vela-icon-risk-low: var(--vela-green-800);
200
+ --vela-text-risk-low: var(--vela-green-800);
201
+ --vela-border-risk-low-indicator: var(--vela-green-700);
202
+
203
+ --vela-bg-risk-medium: var(--vela-yellow-100);
204
+ --vela-border-risk-medium: var(--vela-yellow-300);
205
+ --vela-signal-risk-medium: var(--vela-yellow-500);
206
+ --vela-icon-risk-medium: var(--vela-yellow-800);
207
+ --vela-text-risk-medium: var(--vela-yellow-800);
208
+ --vela-border-risk-medium-indicator: var(--vela-yellow-700);
209
+
210
+ --vela-bg-risk-high: var(--vela-red-100);
211
+ --vela-border-risk-high: var(--vela-red-300);
212
+ --vela-signal-risk-high: var(--vela-red-500);
213
+ --vela-icon-risk-high: var(--vela-red-700);
214
+ --vela-text-risk-high: var(--vela-red-700);
215
+ --vela-border-risk-high-indicator: var(--vela-red-700);
216
+
217
+ /* ============================================================================
218
+ STATUS — 5 health states. Status Indicator dots only. Neither of the above.
219
+ ============================================================================ */
220
+ --vela-signal-status-unknown: var(--vela-grey-500);
221
+ --vela-signal-status-healthy: var(--vela-green-700);
222
+ --vela-signal-status-warning: var(--vela-yellow-700);
223
+ --vela-signal-status-medium: var(--vela-orange-600);
224
+ --vela-signal-status-unhealthy: var(--vela-red-500);
225
+
226
+ /* ---- Spacing: 5px base. 25 exists; 50 does not. ---- */
227
+ --vela-space-5: 5px;
228
+ --vela-space-10: 10px;
229
+ --vela-space-15: 15px;
230
+ --vela-space-20: 20px;
231
+ --vela-space-25: 25px;
232
+ --vela-space-30: 30px;
233
+ --vela-space-40: 40px;
234
+ --vela-space-60: 60px;
235
+ --vela-space-80: 80px;
236
+
237
+ /* ---- Icon sizes ---- */
238
+ --vela-icon-12: 12px;
239
+ --vela-icon-16: 16px;
240
+ --vela-icon-20: 20px;
241
+ --vela-icon-24: 24px;
242
+
243
+ /* ---- Control heights ---- */
244
+ --vela-control-height-24: 24px;
245
+ --vela-control-height-25: 25px;
246
+ --vela-control-height-26: 26px;
247
+ --vela-control-height-35: 35px;
248
+ --vela-control-height-40: 40px;
249
+ --vela-control-height-48: 48px;
250
+ --vela-control-height-60: 60px;
251
+
252
+ /* ---- Radius ---- */
253
+ --vela-radius-3: 3px;
254
+ --vela-radius-4: 4px;
255
+ --vela-radius-8: 8px;
256
+ --vela-radius-12: 12px;
257
+ --vela-radius-full: 9999px;
258
+
259
+ /* ---- Typography: family & weight ---- */
260
+ --vela-font-family-primary: "Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
261
+ --vela-font-family-display: "Oswald", "Open Sans", -apple-system, sans-serif;
262
+ --vela-font-weight-light: 300;
263
+ --vela-font-weight-regular: 400;
264
+ --vela-font-weight-semibold: 600;
265
+
266
+ /* ---- Typography: scale (size / weight / line-height triples) ---- */
267
+ --vela-text-h1-size: 32px; --vela-text-h1-weight: 300; --vela-text-h1-line-height: 42px;
268
+ --vela-text-h2-size: 24px; --vela-text-h2-weight: 300; --vela-text-h2-line-height: 33px;
269
+ --vela-text-h3-size: 20px; --vela-text-h3-weight: 300; --vela-text-h3-line-height: 27px;
270
+ --vela-text-h4-size: 16px; --vela-text-h4-weight: 400; --vela-text-h4-line-height: 24px;
271
+ --vela-text-h5-size: 14px; --vela-text-h5-weight: 600; --vela-text-h5-line-height: 21px;
272
+ --vela-text-h6-size: 12px; --vela-text-h6-weight: 600; --vela-text-h6-line-height: 18px;
273
+ --vela-text-body-size: 14px; --vela-text-body-weight: 400; --vela-text-body-line-height: 21px;
274
+ --vela-text-meta-size: 12px; --vela-text-meta-weight: 400; --vela-text-meta-line-height: 18px;
275
+ --vela-text-meta-tracking: 0.3px;
276
+
277
+ --vela-text-button-tiny-size: 12px; --vela-text-button-tiny-line-height: 18px;
278
+ --vela-text-button-regular-size: 14px; --vela-text-button-regular-line-height: 21px;
279
+ --vela-text-button-large-size: 15px; --vela-text-button-large-line-height: 22px;
280
+ --vela-text-button-huge-size: 16px; --vela-text-button-huge-line-height: 24px;
281
+
282
+ --vela-text-tab-size: 14px; --vela-text-tab-line-height: 19px;
283
+ --vela-text-tab-large-size: 18px; --vela-text-tab-large-line-height: 25px;
284
+
285
+ /* ---- Focus ---- */
286
+ --vela-focus-ring-width: 2px;
287
+ --vela-focus-ring-offset: 2px;
288
+ --vela-focus-ring-color: var(--vela-border-active);
289
+
290
+ /* ---- Motion (respects reduced-motion in components.css) ---- */
291
+ --vela-duration-fast: 120ms;
292
+ --vela-duration-base: 180ms;
293
+ --vela-ease-standard: cubic-bezier(0.2, 0, 0.2, 1);
294
+ }
295
+
296
+ /* -- dark: OS preference, unless an explicit light choice overrides it ------ */
297
+ @media (prefers-color-scheme: dark) {
298
+ :root:not([data-theme="light"]) {
299
+ /* ============================================================================
300
+ DARK THEME
301
+ Note what is NOT here: primitives. Not one raw hex is redefined below.
302
+ Dark mode is achieved entirely by re-pointing semantic tokens onto a
303
+ different part of the same scale. That is the return on the two-layer
304
+ architecture — and the reason components never bind primitives directly.
305
+ Contrast ratios are asserted in src/styles/contrast.test.ts.
306
+ ============================================================================ */
307
+ color-scheme: dark;
308
+
309
+ /* ---- Surface ---- */
310
+ --vela-bg-global: var(--vela-grey-950);
311
+ --vela-bg-container: var(--vela-grey-900);
312
+ --vela-bg-raised: var(--vela-grey-850);
313
+ --vela-bg-hover: var(--vela-grey-850);
314
+ --vela-bg-tooltip: var(--vela-grey-700);
315
+ --vela-bg-inactive: var(--vela-grey-900);
316
+ --vela-bg-selected: var(--vela-blue-950);
317
+ --vela-primary-tint: var(--vela-blue-950);
318
+ --vela-primary-active-bg: var(--vela-primary-500);
319
+
320
+ /* ---- Border ---- */
321
+ --vela-border-default: var(--vela-grey-600);
322
+ --vela-border-subtle: var(--vela-grey-850);
323
+ --vela-border-active: var(--vela-primary-400);
324
+ --vela-border-inactive: var(--vela-grey-850);
325
+ --vela-border-action: var(--vela-grey-500);
326
+
327
+ /* ---- Text ---- */
328
+ --vela-text-default: var(--vela-grey-300);
329
+ --vela-text-heading: var(--vela-grey-50);
330
+ --vela-text-de-emphasized: var(--vela-grey-500);
331
+ --vela-text-inactive: var(--vela-grey-700);
332
+ --vela-text-link: var(--vela-primary-400);
333
+ --vela-text-on-brand: var(--vela-white);
334
+ --vela-text-on-tint: var(--vela-grey-300);
335
+ --vela-text-error: var(--vela-red-300);
336
+
337
+ /* ---- Icon ---- */
338
+ --vela-icon-default: var(--vela-grey-500);
339
+ --vela-icon-strong: var(--vela-grey-300);
340
+ --vela-icon-selected: var(--vela-primary-400);
341
+ --vela-icon-disabled: var(--vela-grey-700);
342
+ --vela-icon-on-brand: var(--vela-white);
343
+
344
+ /* ---- Button ---- */
345
+ --vela-btn-primary-bg: var(--vela-primary-500);
346
+ --vela-btn-primary-hover-bg: var(--vela-primary-400);
347
+ --vela-btn-primary-border: var(--vela-primary-500);
348
+ --vela-btn-primary-text: var(--vela-white);
349
+ --vela-btn-standard-bg: var(--vela-grey-850);
350
+ --vela-btn-standard-hover-bg: var(--vela-grey-800);
351
+ --vela-btn-standard-text: var(--vela-grey-300);
352
+ --vela-btn-hollow-primary-text: var(--vela-primary-300);
353
+ --vela-btn-hollow-primary-border: var(--vela-primary-400);
354
+ --vela-btn-disabled-bg: var(--vela-grey-850);
355
+ --vela-btn-disabled-text: var(--vela-grey-700);
356
+
357
+
358
+ --vela-btn-destructive-bg: var(--vela-red-700);
359
+ --vela-btn-destructive-hover-bg: var(--vela-red-500);
360
+ --vela-btn-destructive-text: var(--vela-white);
361
+ --vela-btn-destructive-hollow-text: var(--vela-red-300);
362
+ --vela-btn-standard-border: var(--vela-grey-500);
363
+ --vela-btn-hollow-hover-bg: var(--vela-primary-tint);
364
+
365
+ /* ---- Form control ---- */
366
+ --vela-control-bg: var(--vela-grey-900);
367
+ --vela-control-border: var(--vela-grey-600);
368
+ --vela-control-border-hover: var(--vela-grey-500);
369
+ --vela-control-border-active: var(--vela-primary-400);
370
+ --vela-control-border-error: var(--vela-red-500);
371
+ --vela-control-bg-disabled: var(--vela-grey-900);
372
+ --vela-control-placeholder: var(--vela-grey-500);
373
+ --vela-toggle-off-bg: var(--vela-grey-700);
374
+ --vela-toggle-on-bg: var(--vela-primary-500);
375
+ --vela-toggle-knob: var(--vela-white);
376
+
377
+ /* ---- Severity (6) ---- */
378
+ --vela-bg-severity-success: var(--vela-green-950);
379
+ --vela-border-severity-success: var(--vela-green-700);
380
+ --vela-signal-severity-success: var(--vela-green-500);
381
+ --vela-icon-severity-success: var(--vela-green-300);
382
+ --vela-text-severity-success: var(--vela-green-300);
383
+ --vela-border-severity-success-indicator: var(--vela-green-500);
384
+
385
+ --vela-bg-severity-info: var(--vela-blue-950);
386
+ --vela-border-severity-info: var(--vela-blue-700);
387
+ --vela-signal-severity-info: var(--vela-blue-500);
388
+ --vela-icon-severity-info: var(--vela-blue-300);
389
+ --vela-text-severity-info: var(--vela-blue-300);
390
+ --vela-border-severity-info-indicator: var(--vela-blue-500);
391
+
392
+ --vela-bg-severity-warning: var(--vela-yellow-950);
393
+ --vela-border-severity-warning: var(--vela-yellow-700);
394
+ --vela-signal-severity-warning: var(--vela-yellow-500);
395
+ --vela-icon-severity-warning: var(--vela-yellow-300);
396
+ --vela-text-severity-warning: var(--vela-yellow-300);
397
+ --vela-border-severity-warning-indicator: var(--vela-yellow-500);
398
+
399
+ --vela-bg-severity-minor: var(--vela-orange-950);
400
+ --vela-border-severity-minor: var(--vela-orange-700);
401
+ --vela-signal-severity-minor: var(--vela-orange-500);
402
+ --vela-icon-severity-minor: var(--vela-orange-300);
403
+ --vela-text-severity-minor: var(--vela-orange-300);
404
+ --vela-border-severity-minor-indicator: var(--vela-orange-500);
405
+
406
+ --vela-bg-severity-major: var(--vela-red-950);
407
+ --vela-border-severity-major: var(--vela-red-700);
408
+ --vela-signal-severity-major: var(--vela-red-500);
409
+ --vela-icon-severity-major: var(--vela-red-300);
410
+ --vela-text-severity-major: var(--vela-red-300);
411
+ --vela-border-severity-major-indicator: var(--vela-red-500);
412
+
413
+ --vela-bg-severity-critical: var(--vela-critical-950);
414
+ --vela-border-severity-critical: var(--vela-critical-500);
415
+ --vela-signal-severity-critical: var(--vela-critical-300);
416
+ --vela-icon-severity-critical: var(--vela-critical-300);
417
+ --vela-text-severity-critical: var(--vela-critical-300);
418
+ --vela-border-severity-critical-indicator: var(--vela-critical-300);
419
+
420
+ /* ---- Risk (3) ---- */
421
+ --vela-bg-risk-low: var(--vela-green-950);
422
+ --vela-border-risk-low: var(--vela-green-700);
423
+ --vela-signal-risk-low: var(--vela-green-500);
424
+ --vela-icon-risk-low: var(--vela-green-300);
425
+ --vela-text-risk-low: var(--vela-green-300);
426
+ --vela-border-risk-low-indicator: var(--vela-green-500);
427
+
428
+ --vela-bg-risk-medium: var(--vela-yellow-950);
429
+ --vela-border-risk-medium: var(--vela-yellow-700);
430
+ --vela-signal-risk-medium: var(--vela-yellow-500);
431
+ --vela-icon-risk-medium: var(--vela-yellow-300);
432
+ --vela-text-risk-medium: var(--vela-yellow-300);
433
+ --vela-border-risk-medium-indicator: var(--vela-yellow-500);
434
+
435
+ --vela-bg-risk-high: var(--vela-red-950);
436
+ --vela-border-risk-high: var(--vela-red-700);
437
+ --vela-signal-risk-high: var(--vela-red-500);
438
+ --vela-icon-risk-high: var(--vela-red-300);
439
+ --vela-text-risk-high: var(--vela-red-300);
440
+ --vela-border-risk-high-indicator: var(--vela-red-500);
441
+
442
+ /* ---- Status (5 dots) ---- */
443
+ --vela-signal-status-unknown: var(--vela-grey-500);
444
+ --vela-signal-status-healthy: var(--vela-green-500);
445
+ --vela-signal-status-warning: var(--vela-yellow-500);
446
+ --vela-signal-status-medium: var(--vela-orange-500);
447
+ --vela-signal-status-unhealthy: var(--vela-red-500);
448
+
449
+ /* ---- Focus ---- */
450
+ --vela-focus-ring-color: var(--vela-primary-400);
451
+
452
+ }
453
+ }
454
+
455
+ /* -- dark: explicit opt-in, wins over the OS preference -------------------- */
456
+ :root[data-theme="dark"] {
457
+ /* ============================================================================
458
+ DARK THEME
459
+ Note what is NOT here: primitives. Not one raw hex is redefined below.
460
+ Dark mode is achieved entirely by re-pointing semantic tokens onto a
461
+ different part of the same scale. That is the return on the two-layer
462
+ architecture — and the reason components never bind primitives directly.
463
+ Contrast ratios are asserted in src/styles/contrast.test.ts.
464
+ ============================================================================ */
465
+ color-scheme: dark;
466
+
467
+ /* ---- Surface ---- */
468
+ --vela-bg-global: var(--vela-grey-950);
469
+ --vela-bg-container: var(--vela-grey-900);
470
+ --vela-bg-raised: var(--vela-grey-850);
471
+ --vela-bg-hover: var(--vela-grey-850);
472
+ --vela-bg-tooltip: var(--vela-grey-700);
473
+ --vela-bg-inactive: var(--vela-grey-900);
474
+ --vela-bg-selected: var(--vela-blue-950);
475
+ --vela-primary-tint: var(--vela-blue-950);
476
+ --vela-primary-active-bg: var(--vela-primary-500);
477
+
478
+ /* ---- Border ---- */
479
+ --vela-border-default: var(--vela-grey-600);
480
+ --vela-border-subtle: var(--vela-grey-850);
481
+ --vela-border-active: var(--vela-primary-400);
482
+ --vela-border-inactive: var(--vela-grey-850);
483
+ --vela-border-action: var(--vela-grey-500);
484
+
485
+ /* ---- Text ---- */
486
+ --vela-text-default: var(--vela-grey-300);
487
+ --vela-text-heading: var(--vela-grey-50);
488
+ --vela-text-de-emphasized: var(--vela-grey-500);
489
+ --vela-text-inactive: var(--vela-grey-700);
490
+ --vela-text-link: var(--vela-primary-400);
491
+ --vela-text-on-brand: var(--vela-white);
492
+ --vela-text-on-tint: var(--vela-grey-300);
493
+ --vela-text-error: var(--vela-red-300);
494
+
495
+ /* ---- Icon ---- */
496
+ --vela-icon-default: var(--vela-grey-500);
497
+ --vela-icon-strong: var(--vela-grey-300);
498
+ --vela-icon-selected: var(--vela-primary-400);
499
+ --vela-icon-disabled: var(--vela-grey-700);
500
+ --vela-icon-on-brand: var(--vela-white);
501
+
502
+ /* ---- Button ---- */
503
+ --vela-btn-primary-bg: var(--vela-primary-500);
504
+ --vela-btn-primary-hover-bg: var(--vela-primary-400);
505
+ --vela-btn-primary-border: var(--vela-primary-500);
506
+ --vela-btn-primary-text: var(--vela-white);
507
+ --vela-btn-standard-bg: var(--vela-grey-850);
508
+ --vela-btn-standard-hover-bg: var(--vela-grey-800);
509
+ --vela-btn-standard-text: var(--vela-grey-300);
510
+ --vela-btn-hollow-primary-text: var(--vela-primary-300);
511
+ --vela-btn-hollow-primary-border: var(--vela-primary-400);
512
+ --vela-btn-disabled-bg: var(--vela-grey-850);
513
+ --vela-btn-disabled-text: var(--vela-grey-700);
514
+
515
+
516
+ --vela-btn-destructive-bg: var(--vela-red-700);
517
+ --vela-btn-destructive-hover-bg: var(--vela-red-500);
518
+ --vela-btn-destructive-text: var(--vela-white);
519
+ --vela-btn-destructive-hollow-text: var(--vela-red-300);
520
+ --vela-btn-standard-border: var(--vela-grey-500);
521
+ --vela-btn-hollow-hover-bg: var(--vela-primary-tint);
522
+
523
+ /* ---- Form control ---- */
524
+ --vela-control-bg: var(--vela-grey-900);
525
+ --vela-control-border: var(--vela-grey-600);
526
+ --vela-control-border-hover: var(--vela-grey-500);
527
+ --vela-control-border-active: var(--vela-primary-400);
528
+ --vela-control-border-error: var(--vela-red-500);
529
+ --vela-control-bg-disabled: var(--vela-grey-900);
530
+ --vela-control-placeholder: var(--vela-grey-500);
531
+ --vela-toggle-off-bg: var(--vela-grey-700);
532
+ --vela-toggle-on-bg: var(--vela-primary-500);
533
+ --vela-toggle-knob: var(--vela-white);
534
+
535
+ /* ---- Severity (6) ---- */
536
+ --vela-bg-severity-success: var(--vela-green-950);
537
+ --vela-border-severity-success: var(--vela-green-700);
538
+ --vela-signal-severity-success: var(--vela-green-500);
539
+ --vela-icon-severity-success: var(--vela-green-300);
540
+ --vela-text-severity-success: var(--vela-green-300);
541
+ --vela-border-severity-success-indicator: var(--vela-green-500);
542
+
543
+ --vela-bg-severity-info: var(--vela-blue-950);
544
+ --vela-border-severity-info: var(--vela-blue-700);
545
+ --vela-signal-severity-info: var(--vela-blue-500);
546
+ --vela-icon-severity-info: var(--vela-blue-300);
547
+ --vela-text-severity-info: var(--vela-blue-300);
548
+ --vela-border-severity-info-indicator: var(--vela-blue-500);
549
+
550
+ --vela-bg-severity-warning: var(--vela-yellow-950);
551
+ --vela-border-severity-warning: var(--vela-yellow-700);
552
+ --vela-signal-severity-warning: var(--vela-yellow-500);
553
+ --vela-icon-severity-warning: var(--vela-yellow-300);
554
+ --vela-text-severity-warning: var(--vela-yellow-300);
555
+ --vela-border-severity-warning-indicator: var(--vela-yellow-500);
556
+
557
+ --vela-bg-severity-minor: var(--vela-orange-950);
558
+ --vela-border-severity-minor: var(--vela-orange-700);
559
+ --vela-signal-severity-minor: var(--vela-orange-500);
560
+ --vela-icon-severity-minor: var(--vela-orange-300);
561
+ --vela-text-severity-minor: var(--vela-orange-300);
562
+ --vela-border-severity-minor-indicator: var(--vela-orange-500);
563
+
564
+ --vela-bg-severity-major: var(--vela-red-950);
565
+ --vela-border-severity-major: var(--vela-red-700);
566
+ --vela-signal-severity-major: var(--vela-red-500);
567
+ --vela-icon-severity-major: var(--vela-red-300);
568
+ --vela-text-severity-major: var(--vela-red-300);
569
+ --vela-border-severity-major-indicator: var(--vela-red-500);
570
+
571
+ --vela-bg-severity-critical: var(--vela-critical-950);
572
+ --vela-border-severity-critical: var(--vela-critical-500);
573
+ --vela-signal-severity-critical: var(--vela-critical-300);
574
+ --vela-icon-severity-critical: var(--vela-critical-300);
575
+ --vela-text-severity-critical: var(--vela-critical-300);
576
+ --vela-border-severity-critical-indicator: var(--vela-critical-300);
577
+
578
+ /* ---- Risk (3) ---- */
579
+ --vela-bg-risk-low: var(--vela-green-950);
580
+ --vela-border-risk-low: var(--vela-green-700);
581
+ --vela-signal-risk-low: var(--vela-green-500);
582
+ --vela-icon-risk-low: var(--vela-green-300);
583
+ --vela-text-risk-low: var(--vela-green-300);
584
+ --vela-border-risk-low-indicator: var(--vela-green-500);
585
+
586
+ --vela-bg-risk-medium: var(--vela-yellow-950);
587
+ --vela-border-risk-medium: var(--vela-yellow-700);
588
+ --vela-signal-risk-medium: var(--vela-yellow-500);
589
+ --vela-icon-risk-medium: var(--vela-yellow-300);
590
+ --vela-text-risk-medium: var(--vela-yellow-300);
591
+ --vela-border-risk-medium-indicator: var(--vela-yellow-500);
592
+
593
+ --vela-bg-risk-high: var(--vela-red-950);
594
+ --vela-border-risk-high: var(--vela-red-700);
595
+ --vela-signal-risk-high: var(--vela-red-500);
596
+ --vela-icon-risk-high: var(--vela-red-300);
597
+ --vela-text-risk-high: var(--vela-red-300);
598
+ --vela-border-risk-high-indicator: var(--vela-red-500);
599
+
600
+ /* ---- Status (5 dots) ---- */
601
+ --vela-signal-status-unknown: var(--vela-grey-500);
602
+ --vela-signal-status-healthy: var(--vela-green-500);
603
+ --vela-signal-status-warning: var(--vela-yellow-500);
604
+ --vela-signal-status-medium: var(--vela-orange-500);
605
+ --vela-signal-status-unhealthy: var(--vela-red-500);
606
+
607
+ /* ---- Focus ---- */
608
+ --vela-focus-ring-color: var(--vela-primary-400);
609
+
610
+ }