@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
package/dist/vela.css ADDED
@@ -0,0 +1,897 @@
1
+ /*! @omkarux/vela — design tokens + component styles. MIT. */
2
+
3
+ /* ============================================================================
4
+ VELA — Design tokens
5
+ Two layers: primitives (raw scale values) and semantics (role-named).
6
+ Always bind to semantics. Primitives exist so semantics can be re-pointed
7
+ for theming — binding a primitive directly defeats the entire architecture.
8
+ Numeric tokens carry their unit. Use them directly; never calc(... * 1px).
9
+ ============================================================================ */
10
+
11
+ :root {
12
+ color-scheme: light;
13
+
14
+ /* ---- Primitives: neutral ---- */
15
+ --vela-black: #191d1f;
16
+ --vela-white: #ffffff;
17
+ --vela-grey-50: #f7f9f9;
18
+ --vela-grey-100: #eef2f2;
19
+ --vela-grey-200: #dde3e4;
20
+ --vela-grey-300: #c8d0d2;
21
+ --vela-grey-400: #a3aeb1;
22
+ --vela-grey-500: #7f8c90;
23
+ --vela-grey-600: #667377; /* AA-safe de-emphasized text on white */
24
+ --vela-grey-700: #49555a;
25
+ --vela-grey-800: #333d41;
26
+ --vela-grey-850: #262e31;
27
+ --vela-grey-900: #1b2225;
28
+ --vela-grey-950: #11171a;
29
+
30
+ /* ---- Primitives: brand / blue ---- */
31
+ --vela-primary-300: #5fb8c9;
32
+ --vela-primary-400: #2f9db3;
33
+ --vela-primary-500: #0a6c7d;
34
+ --vela-primary-600: #075462;
35
+ --vela-blue-100: #e6eefb;
36
+ --vela-blue-150: #cfdff7;
37
+ --vela-blue-300: #85aae8;
38
+ --vela-blue-500: #3d7fd6;
39
+ --vela-blue-700: #35558a;
40
+ --vela-blue-950: #0e1a2e;
41
+
42
+ /* ---- Primitives: red / critical ---- */
43
+ --vela-red-100: #fce8e6;
44
+ --vela-red-300: #f0918c;
45
+ --vela-red-500: #dd4b3e;
46
+ --vela-red-700: #ab3125;
47
+ --vela-red-950: #2a1310;
48
+ --vela-critical-100: #f2d6d4;
49
+ --vela-critical-300: #cc6f68;
50
+ --vela-critical-500: #a81c14;
51
+ --vela-critical-700: #7d150f;
52
+ --vela-critical-950: #2b100e;
53
+
54
+ /* ---- Primitives: yellow / orange / green ---- */
55
+ --vela-yellow-100: #fdf1d3;
56
+ --vela-yellow-300: #f7d382;
57
+ --vela-yellow-500: #f0c14e;
58
+ --vela-yellow-600: #c99a10;
59
+ --vela-yellow-700: #9a7a0c;
60
+ --vela-yellow-800: #7a6224;
61
+ --vela-yellow-950: #26200e;
62
+ --vela-orange-100: #fde7d0;
63
+ --vela-orange-300: #f5ad63;
64
+ --vela-orange-500: #ea7f1a;
65
+ --vela-orange-600: #c86a0d; /* AA-safe status dot on white */
66
+ --vela-orange-700: #9c5408;
67
+ --vela-orange-950: #281a0b;
68
+ --vela-green-100: #dcefe0;
69
+ --vela-green-300: #86c795;
70
+ --vela-green-500: #4aa863;
71
+ --vela-green-700: #1f7340;
72
+ --vela-green-800: #175c33; /* AA-safe success text on green-100 */
73
+ --vela-green-950: #0d2318;
74
+
75
+ /* ---- Semantic: surface ---- */
76
+ --vela-bg-global: var(--vela-white);
77
+ --vela-bg-container: var(--vela-grey-100);
78
+ --vela-bg-raised: var(--vela-white);
79
+ --vela-bg-hover: var(--vela-grey-100);
80
+ --vela-bg-tooltip: var(--vela-grey-800);
81
+ --vela-bg-inactive: var(--vela-grey-100);
82
+ --vela-bg-selected: var(--vela-blue-100);
83
+ --vela-primary-tint: var(--vela-blue-100);
84
+ --vela-primary-active-bg: var(--vela-primary-500);
85
+
86
+ /* ---- Semantic: border ---- */
87
+ --vela-border-default: var(--vela-grey-500);
88
+ --vela-border-subtle: var(--vela-grey-200);
89
+ --vela-border-active: var(--vela-primary-500);
90
+ --vela-border-inactive: var(--vela-grey-200);
91
+ --vela-border-action: var(--vela-grey-700);
92
+
93
+ /* ---- Semantic: text ---- */
94
+ --vela-text-default: var(--vela-grey-700);
95
+ --vela-text-heading: var(--vela-black);
96
+ --vela-text-de-emphasized: var(--vela-grey-600);
97
+ --vela-text-inactive: var(--vela-grey-400);
98
+ --vela-text-link: var(--vela-primary-500);
99
+ --vela-text-on-brand: var(--vela-white);
100
+ --vela-text-on-tint: var(--vela-grey-700);
101
+ --vela-text-error: var(--vela-red-700);
102
+
103
+ /* ---- Semantic: icon ---- */
104
+ --vela-icon-default: var(--vela-grey-500);
105
+ --vela-icon-strong: var(--vela-grey-700);
106
+ --vela-icon-selected: var(--vela-primary-500);
107
+ --vela-icon-disabled: var(--vela-grey-300);
108
+ --vela-icon-on-brand: var(--vela-white);
109
+
110
+ /* ---- Semantic: button ---- */
111
+ --vela-btn-primary-bg: var(--vela-primary-500);
112
+ --vela-btn-primary-hover-bg: var(--vela-primary-600);
113
+ --vela-btn-primary-border: var(--vela-primary-500);
114
+ --vela-btn-primary-text: var(--vela-white);
115
+ --vela-btn-standard-bg: var(--vela-grey-100);
116
+ --vela-btn-standard-hover-bg: var(--vela-grey-200);
117
+ --vela-btn-standard-text: var(--vela-grey-700);
118
+ --vela-btn-hollow-primary-text: var(--vela-primary-500);
119
+ --vela-btn-hollow-primary-border: var(--vela-primary-500);
120
+ --vela-btn-disabled-bg: var(--vela-grey-200);
121
+ --vela-btn-disabled-text: var(--vela-text-inactive);
122
+
123
+
124
+ /* ---- Semantic: destructive button ----
125
+ NOTE: red-500 on white is 4.08:1 and fails WCAG AA for normal text.
126
+ Destructive filled therefore binds red-700 (6.57:1). This is a
127
+ deliberate divergence from a naive "use the signal color" mapping. */
128
+ --vela-btn-destructive-bg: var(--vela-red-700);
129
+ --vela-btn-destructive-hover-bg: var(--vela-critical-500);
130
+ --vela-btn-destructive-text: var(--vela-white);
131
+ --vela-btn-destructive-hollow-text: var(--vela-red-700);
132
+ --vela-btn-standard-border: var(--vela-grey-600);
133
+ --vela-btn-hollow-hover-bg: var(--vela-primary-tint);
134
+
135
+ /* ---- Semantic: form control ---- */
136
+ --vela-control-bg: var(--vela-white);
137
+ --vela-control-border: var(--vela-grey-500);
138
+ --vela-control-border-hover: var(--vela-grey-500);
139
+ --vela-control-border-active: var(--vela-primary-500);
140
+ --vela-control-border-error: var(--vela-red-500);
141
+ --vela-control-bg-disabled: var(--vela-grey-100);
142
+ --vela-control-placeholder: var(--vela-grey-600);
143
+ --vela-toggle-off-bg: var(--vela-grey-400);
144
+ --vela-toggle-on-bg: var(--vela-primary-500);
145
+ --vela-toggle-knob: var(--vela-white);
146
+
147
+ /* ============================================================================
148
+ SEVERITY — 6 levels. Describes events and alerts.
149
+ Never interchange with Risk or Status. There is no "high severity".
150
+ Every level defines the full row: bg, border, signal, icon, text, indicator.
151
+ ============================================================================ */
152
+ --vela-bg-severity-success: var(--vela-green-100);
153
+ --vela-border-severity-success: var(--vela-green-300);
154
+ --vela-signal-severity-success: var(--vela-green-500);
155
+ --vela-icon-severity-success: var(--vela-green-800);
156
+ --vela-text-severity-success: var(--vela-green-800);
157
+ --vela-border-severity-success-indicator: var(--vela-green-700);
158
+
159
+ --vela-bg-severity-info: var(--vela-blue-100);
160
+ --vela-border-severity-info: var(--vela-blue-300);
161
+ --vela-signal-severity-info: var(--vela-blue-500);
162
+ --vela-icon-severity-info: var(--vela-blue-700);
163
+ --vela-text-severity-info: var(--vela-blue-700);
164
+ --vela-border-severity-info-indicator: var(--vela-blue-700);
165
+
166
+ --vela-bg-severity-warning: var(--vela-yellow-100);
167
+ --vela-border-severity-warning: var(--vela-yellow-300);
168
+ --vela-signal-severity-warning: var(--vela-yellow-500);
169
+ --vela-icon-severity-warning: var(--vela-yellow-800);
170
+ --vela-text-severity-warning: var(--vela-yellow-800);
171
+ --vela-border-severity-warning-indicator: var(--vela-yellow-700);
172
+
173
+ --vela-bg-severity-minor: var(--vela-orange-100);
174
+ --vela-border-severity-minor: var(--vela-orange-300);
175
+ --vela-signal-severity-minor: var(--vela-orange-500);
176
+ --vela-icon-severity-minor: var(--vela-orange-700);
177
+ --vela-text-severity-minor: var(--vela-orange-700);
178
+ --vela-border-severity-minor-indicator: var(--vela-orange-700);
179
+
180
+ --vela-bg-severity-major: var(--vela-red-100);
181
+ --vela-border-severity-major: var(--vela-red-300);
182
+ --vela-signal-severity-major: var(--vela-red-500);
183
+ --vela-icon-severity-major: var(--vela-red-700);
184
+ --vela-text-severity-major: var(--vela-red-700);
185
+ --vela-border-severity-major-indicator: var(--vela-red-700);
186
+
187
+ --vela-bg-severity-critical: var(--vela-critical-100);
188
+ --vela-border-severity-critical: var(--vela-critical-300);
189
+ --vela-signal-severity-critical: var(--vela-critical-500);
190
+ --vela-icon-severity-critical: var(--vela-critical-700);
191
+ --vela-text-severity-critical: var(--vela-critical-700);
192
+ --vela-border-severity-critical-indicator: var(--vela-critical-700);
193
+
194
+ /* ============================================================================
195
+ RISK — 3 levels. Describes scoring. There is no "critical risk".
196
+ ============================================================================ */
197
+ --vela-bg-risk-low: var(--vela-green-100);
198
+ --vela-border-risk-low: var(--vela-green-300);
199
+ --vela-signal-risk-low: var(--vela-green-500);
200
+ --vela-icon-risk-low: var(--vela-green-800);
201
+ --vela-text-risk-low: var(--vela-green-800);
202
+ --vela-border-risk-low-indicator: var(--vela-green-700);
203
+
204
+ --vela-bg-risk-medium: var(--vela-yellow-100);
205
+ --vela-border-risk-medium: var(--vela-yellow-300);
206
+ --vela-signal-risk-medium: var(--vela-yellow-500);
207
+ --vela-icon-risk-medium: var(--vela-yellow-800);
208
+ --vela-text-risk-medium: var(--vela-yellow-800);
209
+ --vela-border-risk-medium-indicator: var(--vela-yellow-700);
210
+
211
+ --vela-bg-risk-high: var(--vela-red-100);
212
+ --vela-border-risk-high: var(--vela-red-300);
213
+ --vela-signal-risk-high: var(--vela-red-500);
214
+ --vela-icon-risk-high: var(--vela-red-700);
215
+ --vela-text-risk-high: var(--vela-red-700);
216
+ --vela-border-risk-high-indicator: var(--vela-red-700);
217
+
218
+ /* ============================================================================
219
+ STATUS — 5 health states. Status Indicator dots only. Neither of the above.
220
+ ============================================================================ */
221
+ --vela-signal-status-unknown: var(--vela-grey-500);
222
+ --vela-signal-status-healthy: var(--vela-green-700);
223
+ --vela-signal-status-warning: var(--vela-yellow-700);
224
+ --vela-signal-status-medium: var(--vela-orange-600);
225
+ --vela-signal-status-unhealthy: var(--vela-red-500);
226
+
227
+ /* ---- Spacing: 5px base. 25 exists; 50 does not. ---- */
228
+ --vela-space-5: 5px;
229
+ --vela-space-10: 10px;
230
+ --vela-space-15: 15px;
231
+ --vela-space-20: 20px;
232
+ --vela-space-25: 25px;
233
+ --vela-space-30: 30px;
234
+ --vela-space-40: 40px;
235
+ --vela-space-60: 60px;
236
+ --vela-space-80: 80px;
237
+
238
+ /* ---- Icon sizes ---- */
239
+ --vela-icon-12: 12px;
240
+ --vela-icon-16: 16px;
241
+ --vela-icon-20: 20px;
242
+ --vela-icon-24: 24px;
243
+
244
+ /* ---- Control heights ---- */
245
+ --vela-control-height-24: 24px;
246
+ --vela-control-height-25: 25px;
247
+ --vela-control-height-26: 26px;
248
+ --vela-control-height-35: 35px;
249
+ --vela-control-height-40: 40px;
250
+ --vela-control-height-48: 48px;
251
+ --vela-control-height-60: 60px;
252
+
253
+ /* ---- Radius ---- */
254
+ --vela-radius-3: 3px;
255
+ --vela-radius-4: 4px;
256
+ --vela-radius-8: 8px;
257
+ --vela-radius-12: 12px;
258
+ --vela-radius-full: 9999px;
259
+
260
+ /* ---- Typography: family & weight ---- */
261
+ --vela-font-family-primary: "Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
262
+ --vela-font-family-display: "Oswald", "Open Sans", -apple-system, sans-serif;
263
+ --vela-font-weight-light: 300;
264
+ --vela-font-weight-regular: 400;
265
+ --vela-font-weight-semibold: 600;
266
+
267
+ /* ---- Typography: scale (size / weight / line-height triples) ---- */
268
+ --vela-text-h1-size: 32px; --vela-text-h1-weight: 300; --vela-text-h1-line-height: 42px;
269
+ --vela-text-h2-size: 24px; --vela-text-h2-weight: 300; --vela-text-h2-line-height: 33px;
270
+ --vela-text-h3-size: 20px; --vela-text-h3-weight: 300; --vela-text-h3-line-height: 27px;
271
+ --vela-text-h4-size: 16px; --vela-text-h4-weight: 400; --vela-text-h4-line-height: 24px;
272
+ --vela-text-h5-size: 14px; --vela-text-h5-weight: 600; --vela-text-h5-line-height: 21px;
273
+ --vela-text-h6-size: 12px; --vela-text-h6-weight: 600; --vela-text-h6-line-height: 18px;
274
+ --vela-text-body-size: 14px; --vela-text-body-weight: 400; --vela-text-body-line-height: 21px;
275
+ --vela-text-meta-size: 12px; --vela-text-meta-weight: 400; --vela-text-meta-line-height: 18px;
276
+ --vela-text-meta-tracking: 0.3px;
277
+
278
+ --vela-text-button-tiny-size: 12px; --vela-text-button-tiny-line-height: 18px;
279
+ --vela-text-button-regular-size: 14px; --vela-text-button-regular-line-height: 21px;
280
+ --vela-text-button-large-size: 15px; --vela-text-button-large-line-height: 22px;
281
+ --vela-text-button-huge-size: 16px; --vela-text-button-huge-line-height: 24px;
282
+
283
+ --vela-text-tab-size: 14px; --vela-text-tab-line-height: 19px;
284
+ --vela-text-tab-large-size: 18px; --vela-text-tab-large-line-height: 25px;
285
+
286
+ /* ---- Focus ---- */
287
+ --vela-focus-ring-width: 2px;
288
+ --vela-focus-ring-offset: 2px;
289
+ --vela-focus-ring-color: var(--vela-border-active);
290
+
291
+ /* ---- Motion (respects reduced-motion in components.css) ---- */
292
+ --vela-duration-fast: 120ms;
293
+ --vela-duration-base: 180ms;
294
+ --vela-ease-standard: cubic-bezier(0.2, 0, 0.2, 1);
295
+ }
296
+
297
+ /* -- dark: OS preference, unless an explicit light choice overrides it ------ */
298
+ @media (prefers-color-scheme: dark) {
299
+ :root:not([data-theme="light"]) {
300
+ /* ============================================================================
301
+ DARK THEME
302
+ Note what is NOT here: primitives. Not one raw hex is redefined below.
303
+ Dark mode is achieved entirely by re-pointing semantic tokens onto a
304
+ different part of the same scale. That is the return on the two-layer
305
+ architecture — and the reason components never bind primitives directly.
306
+ Contrast ratios are asserted in src/styles/contrast.test.ts.
307
+ ============================================================================ */
308
+ color-scheme: dark;
309
+
310
+ /* ---- Surface ---- */
311
+ --vela-bg-global: var(--vela-grey-950);
312
+ --vela-bg-container: var(--vela-grey-900);
313
+ --vela-bg-raised: var(--vela-grey-850);
314
+ --vela-bg-hover: var(--vela-grey-850);
315
+ --vela-bg-tooltip: var(--vela-grey-700);
316
+ --vela-bg-inactive: var(--vela-grey-900);
317
+ --vela-bg-selected: var(--vela-blue-950);
318
+ --vela-primary-tint: var(--vela-blue-950);
319
+ --vela-primary-active-bg: var(--vela-primary-500);
320
+
321
+ /* ---- Border ---- */
322
+ --vela-border-default: var(--vela-grey-600);
323
+ --vela-border-subtle: var(--vela-grey-850);
324
+ --vela-border-active: var(--vela-primary-400);
325
+ --vela-border-inactive: var(--vela-grey-850);
326
+ --vela-border-action: var(--vela-grey-500);
327
+
328
+ /* ---- Text ---- */
329
+ --vela-text-default: var(--vela-grey-300);
330
+ --vela-text-heading: var(--vela-grey-50);
331
+ --vela-text-de-emphasized: var(--vela-grey-500);
332
+ --vela-text-inactive: var(--vela-grey-700);
333
+ --vela-text-link: var(--vela-primary-400);
334
+ --vela-text-on-brand: var(--vela-white);
335
+ --vela-text-on-tint: var(--vela-grey-300);
336
+ --vela-text-error: var(--vela-red-300);
337
+
338
+ /* ---- Icon ---- */
339
+ --vela-icon-default: var(--vela-grey-500);
340
+ --vela-icon-strong: var(--vela-grey-300);
341
+ --vela-icon-selected: var(--vela-primary-400);
342
+ --vela-icon-disabled: var(--vela-grey-700);
343
+ --vela-icon-on-brand: var(--vela-white);
344
+
345
+ /* ---- Button ---- */
346
+ --vela-btn-primary-bg: var(--vela-primary-500);
347
+ --vela-btn-primary-hover-bg: var(--vela-primary-400);
348
+ --vela-btn-primary-border: var(--vela-primary-500);
349
+ --vela-btn-primary-text: var(--vela-white);
350
+ --vela-btn-standard-bg: var(--vela-grey-850);
351
+ --vela-btn-standard-hover-bg: var(--vela-grey-800);
352
+ --vela-btn-standard-text: var(--vela-grey-300);
353
+ --vela-btn-hollow-primary-text: var(--vela-primary-300);
354
+ --vela-btn-hollow-primary-border: var(--vela-primary-400);
355
+ --vela-btn-disabled-bg: var(--vela-grey-850);
356
+ --vela-btn-disabled-text: var(--vela-grey-700);
357
+
358
+
359
+ --vela-btn-destructive-bg: var(--vela-red-700);
360
+ --vela-btn-destructive-hover-bg: var(--vela-red-500);
361
+ --vela-btn-destructive-text: var(--vela-white);
362
+ --vela-btn-destructive-hollow-text: var(--vela-red-300);
363
+ --vela-btn-standard-border: var(--vela-grey-500);
364
+ --vela-btn-hollow-hover-bg: var(--vela-primary-tint);
365
+
366
+ /* ---- Form control ---- */
367
+ --vela-control-bg: var(--vela-grey-900);
368
+ --vela-control-border: var(--vela-grey-600);
369
+ --vela-control-border-hover: var(--vela-grey-500);
370
+ --vela-control-border-active: var(--vela-primary-400);
371
+ --vela-control-border-error: var(--vela-red-500);
372
+ --vela-control-bg-disabled: var(--vela-grey-900);
373
+ --vela-control-placeholder: var(--vela-grey-500);
374
+ --vela-toggle-off-bg: var(--vela-grey-700);
375
+ --vela-toggle-on-bg: var(--vela-primary-500);
376
+ --vela-toggle-knob: var(--vela-white);
377
+
378
+ /* ---- Severity (6) ---- */
379
+ --vela-bg-severity-success: var(--vela-green-950);
380
+ --vela-border-severity-success: var(--vela-green-700);
381
+ --vela-signal-severity-success: var(--vela-green-500);
382
+ --vela-icon-severity-success: var(--vela-green-300);
383
+ --vela-text-severity-success: var(--vela-green-300);
384
+ --vela-border-severity-success-indicator: var(--vela-green-500);
385
+
386
+ --vela-bg-severity-info: var(--vela-blue-950);
387
+ --vela-border-severity-info: var(--vela-blue-700);
388
+ --vela-signal-severity-info: var(--vela-blue-500);
389
+ --vela-icon-severity-info: var(--vela-blue-300);
390
+ --vela-text-severity-info: var(--vela-blue-300);
391
+ --vela-border-severity-info-indicator: var(--vela-blue-500);
392
+
393
+ --vela-bg-severity-warning: var(--vela-yellow-950);
394
+ --vela-border-severity-warning: var(--vela-yellow-700);
395
+ --vela-signal-severity-warning: var(--vela-yellow-500);
396
+ --vela-icon-severity-warning: var(--vela-yellow-300);
397
+ --vela-text-severity-warning: var(--vela-yellow-300);
398
+ --vela-border-severity-warning-indicator: var(--vela-yellow-500);
399
+
400
+ --vela-bg-severity-minor: var(--vela-orange-950);
401
+ --vela-border-severity-minor: var(--vela-orange-700);
402
+ --vela-signal-severity-minor: var(--vela-orange-500);
403
+ --vela-icon-severity-minor: var(--vela-orange-300);
404
+ --vela-text-severity-minor: var(--vela-orange-300);
405
+ --vela-border-severity-minor-indicator: var(--vela-orange-500);
406
+
407
+ --vela-bg-severity-major: var(--vela-red-950);
408
+ --vela-border-severity-major: var(--vela-red-700);
409
+ --vela-signal-severity-major: var(--vela-red-500);
410
+ --vela-icon-severity-major: var(--vela-red-300);
411
+ --vela-text-severity-major: var(--vela-red-300);
412
+ --vela-border-severity-major-indicator: var(--vela-red-500);
413
+
414
+ --vela-bg-severity-critical: var(--vela-critical-950);
415
+ --vela-border-severity-critical: var(--vela-critical-500);
416
+ --vela-signal-severity-critical: var(--vela-critical-300);
417
+ --vela-icon-severity-critical: var(--vela-critical-300);
418
+ --vela-text-severity-critical: var(--vela-critical-300);
419
+ --vela-border-severity-critical-indicator: var(--vela-critical-300);
420
+
421
+ /* ---- Risk (3) ---- */
422
+ --vela-bg-risk-low: var(--vela-green-950);
423
+ --vela-border-risk-low: var(--vela-green-700);
424
+ --vela-signal-risk-low: var(--vela-green-500);
425
+ --vela-icon-risk-low: var(--vela-green-300);
426
+ --vela-text-risk-low: var(--vela-green-300);
427
+ --vela-border-risk-low-indicator: var(--vela-green-500);
428
+
429
+ --vela-bg-risk-medium: var(--vela-yellow-950);
430
+ --vela-border-risk-medium: var(--vela-yellow-700);
431
+ --vela-signal-risk-medium: var(--vela-yellow-500);
432
+ --vela-icon-risk-medium: var(--vela-yellow-300);
433
+ --vela-text-risk-medium: var(--vela-yellow-300);
434
+ --vela-border-risk-medium-indicator: var(--vela-yellow-500);
435
+
436
+ --vela-bg-risk-high: var(--vela-red-950);
437
+ --vela-border-risk-high: var(--vela-red-700);
438
+ --vela-signal-risk-high: var(--vela-red-500);
439
+ --vela-icon-risk-high: var(--vela-red-300);
440
+ --vela-text-risk-high: var(--vela-red-300);
441
+ --vela-border-risk-high-indicator: var(--vela-red-500);
442
+
443
+ /* ---- Status (5 dots) ---- */
444
+ --vela-signal-status-unknown: var(--vela-grey-500);
445
+ --vela-signal-status-healthy: var(--vela-green-500);
446
+ --vela-signal-status-warning: var(--vela-yellow-500);
447
+ --vela-signal-status-medium: var(--vela-orange-500);
448
+ --vela-signal-status-unhealthy: var(--vela-red-500);
449
+
450
+ /* ---- Focus ---- */
451
+ --vela-focus-ring-color: var(--vela-primary-400);
452
+
453
+ }
454
+ }
455
+
456
+ /* -- dark: explicit opt-in, wins over the OS preference -------------------- */
457
+ :root[data-theme="dark"] {
458
+ /* ============================================================================
459
+ DARK THEME
460
+ Note what is NOT here: primitives. Not one raw hex is redefined below.
461
+ Dark mode is achieved entirely by re-pointing semantic tokens onto a
462
+ different part of the same scale. That is the return on the two-layer
463
+ architecture — and the reason components never bind primitives directly.
464
+ Contrast ratios are asserted in src/styles/contrast.test.ts.
465
+ ============================================================================ */
466
+ color-scheme: dark;
467
+
468
+ /* ---- Surface ---- */
469
+ --vela-bg-global: var(--vela-grey-950);
470
+ --vela-bg-container: var(--vela-grey-900);
471
+ --vela-bg-raised: var(--vela-grey-850);
472
+ --vela-bg-hover: var(--vela-grey-850);
473
+ --vela-bg-tooltip: var(--vela-grey-700);
474
+ --vela-bg-inactive: var(--vela-grey-900);
475
+ --vela-bg-selected: var(--vela-blue-950);
476
+ --vela-primary-tint: var(--vela-blue-950);
477
+ --vela-primary-active-bg: var(--vela-primary-500);
478
+
479
+ /* ---- Border ---- */
480
+ --vela-border-default: var(--vela-grey-600);
481
+ --vela-border-subtle: var(--vela-grey-850);
482
+ --vela-border-active: var(--vela-primary-400);
483
+ --vela-border-inactive: var(--vela-grey-850);
484
+ --vela-border-action: var(--vela-grey-500);
485
+
486
+ /* ---- Text ---- */
487
+ --vela-text-default: var(--vela-grey-300);
488
+ --vela-text-heading: var(--vela-grey-50);
489
+ --vela-text-de-emphasized: var(--vela-grey-500);
490
+ --vela-text-inactive: var(--vela-grey-700);
491
+ --vela-text-link: var(--vela-primary-400);
492
+ --vela-text-on-brand: var(--vela-white);
493
+ --vela-text-on-tint: var(--vela-grey-300);
494
+ --vela-text-error: var(--vela-red-300);
495
+
496
+ /* ---- Icon ---- */
497
+ --vela-icon-default: var(--vela-grey-500);
498
+ --vela-icon-strong: var(--vela-grey-300);
499
+ --vela-icon-selected: var(--vela-primary-400);
500
+ --vela-icon-disabled: var(--vela-grey-700);
501
+ --vela-icon-on-brand: var(--vela-white);
502
+
503
+ /* ---- Button ---- */
504
+ --vela-btn-primary-bg: var(--vela-primary-500);
505
+ --vela-btn-primary-hover-bg: var(--vela-primary-400);
506
+ --vela-btn-primary-border: var(--vela-primary-500);
507
+ --vela-btn-primary-text: var(--vela-white);
508
+ --vela-btn-standard-bg: var(--vela-grey-850);
509
+ --vela-btn-standard-hover-bg: var(--vela-grey-800);
510
+ --vela-btn-standard-text: var(--vela-grey-300);
511
+ --vela-btn-hollow-primary-text: var(--vela-primary-300);
512
+ --vela-btn-hollow-primary-border: var(--vela-primary-400);
513
+ --vela-btn-disabled-bg: var(--vela-grey-850);
514
+ --vela-btn-disabled-text: var(--vela-grey-700);
515
+
516
+
517
+ --vela-btn-destructive-bg: var(--vela-red-700);
518
+ --vela-btn-destructive-hover-bg: var(--vela-red-500);
519
+ --vela-btn-destructive-text: var(--vela-white);
520
+ --vela-btn-destructive-hollow-text: var(--vela-red-300);
521
+ --vela-btn-standard-border: var(--vela-grey-500);
522
+ --vela-btn-hollow-hover-bg: var(--vela-primary-tint);
523
+
524
+ /* ---- Form control ---- */
525
+ --vela-control-bg: var(--vela-grey-900);
526
+ --vela-control-border: var(--vela-grey-600);
527
+ --vela-control-border-hover: var(--vela-grey-500);
528
+ --vela-control-border-active: var(--vela-primary-400);
529
+ --vela-control-border-error: var(--vela-red-500);
530
+ --vela-control-bg-disabled: var(--vela-grey-900);
531
+ --vela-control-placeholder: var(--vela-grey-500);
532
+ --vela-toggle-off-bg: var(--vela-grey-700);
533
+ --vela-toggle-on-bg: var(--vela-primary-500);
534
+ --vela-toggle-knob: var(--vela-white);
535
+
536
+ /* ---- Severity (6) ---- */
537
+ --vela-bg-severity-success: var(--vela-green-950);
538
+ --vela-border-severity-success: var(--vela-green-700);
539
+ --vela-signal-severity-success: var(--vela-green-500);
540
+ --vela-icon-severity-success: var(--vela-green-300);
541
+ --vela-text-severity-success: var(--vela-green-300);
542
+ --vela-border-severity-success-indicator: var(--vela-green-500);
543
+
544
+ --vela-bg-severity-info: var(--vela-blue-950);
545
+ --vela-border-severity-info: var(--vela-blue-700);
546
+ --vela-signal-severity-info: var(--vela-blue-500);
547
+ --vela-icon-severity-info: var(--vela-blue-300);
548
+ --vela-text-severity-info: var(--vela-blue-300);
549
+ --vela-border-severity-info-indicator: var(--vela-blue-500);
550
+
551
+ --vela-bg-severity-warning: var(--vela-yellow-950);
552
+ --vela-border-severity-warning: var(--vela-yellow-700);
553
+ --vela-signal-severity-warning: var(--vela-yellow-500);
554
+ --vela-icon-severity-warning: var(--vela-yellow-300);
555
+ --vela-text-severity-warning: var(--vela-yellow-300);
556
+ --vela-border-severity-warning-indicator: var(--vela-yellow-500);
557
+
558
+ --vela-bg-severity-minor: var(--vela-orange-950);
559
+ --vela-border-severity-minor: var(--vela-orange-700);
560
+ --vela-signal-severity-minor: var(--vela-orange-500);
561
+ --vela-icon-severity-minor: var(--vela-orange-300);
562
+ --vela-text-severity-minor: var(--vela-orange-300);
563
+ --vela-border-severity-minor-indicator: var(--vela-orange-500);
564
+
565
+ --vela-bg-severity-major: var(--vela-red-950);
566
+ --vela-border-severity-major: var(--vela-red-700);
567
+ --vela-signal-severity-major: var(--vela-red-500);
568
+ --vela-icon-severity-major: var(--vela-red-300);
569
+ --vela-text-severity-major: var(--vela-red-300);
570
+ --vela-border-severity-major-indicator: var(--vela-red-500);
571
+
572
+ --vela-bg-severity-critical: var(--vela-critical-950);
573
+ --vela-border-severity-critical: var(--vela-critical-500);
574
+ --vela-signal-severity-critical: var(--vela-critical-300);
575
+ --vela-icon-severity-critical: var(--vela-critical-300);
576
+ --vela-text-severity-critical: var(--vela-critical-300);
577
+ --vela-border-severity-critical-indicator: var(--vela-critical-300);
578
+
579
+ /* ---- Risk (3) ---- */
580
+ --vela-bg-risk-low: var(--vela-green-950);
581
+ --vela-border-risk-low: var(--vela-green-700);
582
+ --vela-signal-risk-low: var(--vela-green-500);
583
+ --vela-icon-risk-low: var(--vela-green-300);
584
+ --vela-text-risk-low: var(--vela-green-300);
585
+ --vela-border-risk-low-indicator: var(--vela-green-500);
586
+
587
+ --vela-bg-risk-medium: var(--vela-yellow-950);
588
+ --vela-border-risk-medium: var(--vela-yellow-700);
589
+ --vela-signal-risk-medium: var(--vela-yellow-500);
590
+ --vela-icon-risk-medium: var(--vela-yellow-300);
591
+ --vela-text-risk-medium: var(--vela-yellow-300);
592
+ --vela-border-risk-medium-indicator: var(--vela-yellow-500);
593
+
594
+ --vela-bg-risk-high: var(--vela-red-950);
595
+ --vela-border-risk-high: var(--vela-red-700);
596
+ --vela-signal-risk-high: var(--vela-red-500);
597
+ --vela-icon-risk-high: var(--vela-red-300);
598
+ --vela-text-risk-high: var(--vela-red-300);
599
+ --vela-border-risk-high-indicator: var(--vela-red-500);
600
+
601
+ /* ---- Status (5 dots) ---- */
602
+ --vela-signal-status-unknown: var(--vela-grey-500);
603
+ --vela-signal-status-healthy: var(--vela-green-500);
604
+ --vela-signal-status-warning: var(--vela-yellow-500);
605
+ --vela-signal-status-medium: var(--vela-orange-500);
606
+ --vela-signal-status-unhealthy: var(--vela-red-500);
607
+
608
+ /* ---- Focus ---- */
609
+ --vela-focus-ring-color: var(--vela-primary-400);
610
+
611
+ }
612
+
613
+ /* ============================================================================
614
+ Base — applied only inside .vela-root so the kit never fights a host app's
615
+ global styles. Wrap your app (or any subtree) in <div class="vela-root">.
616
+ ============================================================================ */
617
+
618
+ .vela-root {
619
+ font-family: var(--vela-font-family-primary);
620
+ font-size: var(--vela-text-body-size);
621
+ font-weight: var(--vela-text-body-weight);
622
+ line-height: var(--vela-text-body-line-height);
623
+ color: var(--vela-text-default);
624
+ background: var(--vela-bg-global);
625
+ -webkit-font-smoothing: antialiased;
626
+ }
627
+
628
+ .vela-root *,
629
+ .vela-root *::before,
630
+ .vela-root *::after {
631
+ box-sizing: border-box;
632
+ }
633
+
634
+ /* Every focusable element in the kit uses one focus treatment. */
635
+ .vela-root :focus-visible {
636
+ outline: var(--vela-focus-ring-width) solid var(--vela-focus-ring-color);
637
+ outline-offset: var(--vela-focus-ring-offset);
638
+ }
639
+
640
+ /* Visually hidden, still read by screen readers. */
641
+ .vela-sr-only {
642
+ position: absolute;
643
+ width: 1px;
644
+ height: 1px;
645
+ padding: 0;
646
+ margin: -1px;
647
+ overflow: hidden;
648
+ clip: rect(0, 0, 0, 0);
649
+ white-space: nowrap;
650
+ border: 0;
651
+ }
652
+
653
+ @media (prefers-reduced-motion: reduce) {
654
+ .vela-root *,
655
+ .vela-root *::before,
656
+ .vela-root *::after {
657
+ transition-duration: 0.01ms !important;
658
+ animation-duration: 0.01ms !important;
659
+ animation-iteration-count: 1 !important;
660
+ }
661
+ }
662
+
663
+ /* ============================================================================
664
+ Typography utilities. Use the class that matches the ROLE, rather than
665
+ setting font properties by hand — that is what keeps the scale intact.
666
+ ============================================================================ */
667
+
668
+ .vela-h1 { font-family: var(--vela-font-family-primary); font-size: var(--vela-text-h1-size); font-weight: var(--vela-text-h1-weight); line-height: var(--vela-text-h1-line-height); color: var(--vela-text-heading); margin: 0; }
669
+ .vela-h2 { font-family: var(--vela-font-family-primary); font-size: var(--vela-text-h2-size); font-weight: var(--vela-text-h2-weight); line-height: var(--vela-text-h2-line-height); color: var(--vela-text-heading); margin: 0; }
670
+ .vela-h3 { font-family: var(--vela-font-family-primary); font-size: var(--vela-text-h3-size); font-weight: var(--vela-text-h3-weight); line-height: var(--vela-text-h3-line-height); color: var(--vela-text-heading); margin: 0; }
671
+ .vela-h4 { font-family: var(--vela-font-family-primary); font-size: var(--vela-text-h4-size); font-weight: var(--vela-text-h4-weight); line-height: var(--vela-text-h4-line-height); color: var(--vela-text-heading); margin: 0; }
672
+ .vela-h5 { font-family: var(--vela-font-family-primary); font-size: var(--vela-text-h5-size); font-weight: var(--vela-text-h5-weight); line-height: var(--vela-text-h5-line-height); color: var(--vela-text-heading); margin: 0; }
673
+ .vela-h6 { font-family: var(--vela-font-family-primary); font-size: var(--vela-text-h6-size); font-weight: var(--vela-text-h6-weight); line-height: var(--vela-text-h6-line-height); color: var(--vela-text-heading); margin: 0; }
674
+
675
+ .vela-body { font-size: var(--vela-text-body-size); font-weight: var(--vela-text-body-weight); line-height: var(--vela-text-body-line-height); }
676
+ .vela-meta { font-size: var(--vela-text-meta-size); font-weight: var(--vela-text-meta-weight); line-height: var(--vela-text-meta-line-height); letter-spacing: var(--vela-text-meta-tracking); color: var(--vela-text-de-emphasized); }
677
+ .vela-link { color: var(--vela-text-link); font-weight: var(--vela-font-weight-semibold); text-decoration: none; }
678
+ .vela-link:hover { text-decoration: underline; }
679
+
680
+ /* ---------------------------------------------------------------- Button -- */
681
+ .vela-btn {
682
+ display: inline-flex;
683
+ align-items: center;
684
+ justify-content: center;
685
+ gap: var(--vela-space-5);
686
+ width: auto; /* hugs content — never fix a button width */
687
+ border-radius: var(--vela-radius-4);
688
+ border: 1px solid transparent;
689
+ font-family: var(--vela-font-family-primary);
690
+ font-weight: var(--vela-font-weight-regular);
691
+ cursor: pointer;
692
+ text-decoration: none;
693
+ transition: background-color var(--vela-duration-fast) var(--vela-ease-standard),
694
+ border-color var(--vela-duration-fast) var(--vela-ease-standard),
695
+ color var(--vela-duration-fast) var(--vela-ease-standard);
696
+ }
697
+
698
+ /* -- sizes -- */
699
+ .vela-btn--tiny { height: var(--vela-control-height-24); padding: 0 var(--vela-space-10); font-size: var(--vela-text-button-tiny-size); line-height: var(--vela-text-button-tiny-line-height); }
700
+ .vela-btn--regular { height: var(--vela-control-height-35); padding: 0 var(--vela-space-15); font-size: var(--vela-text-button-regular-size); line-height: var(--vela-text-button-regular-line-height); }
701
+ .vela-btn--large { height: var(--vela-control-height-40); padding: 0 var(--vela-space-20); font-size: var(--vela-text-button-large-size); line-height: var(--vela-text-button-large-line-height); }
702
+ .vela-btn--huge { height: var(--vela-control-height-60); padding: 0 var(--vela-space-30); font-size: var(--vela-text-button-huge-size); line-height: var(--vela-text-button-huge-line-height); }
703
+
704
+ .vela-btn__icon { display: inline-flex; flex: none; }
705
+ .vela-btn--tiny .vela-btn__icon { width: var(--vela-icon-12); height: var(--vela-icon-12); }
706
+ .vela-btn--regular .vela-btn__icon,
707
+ .vela-btn--large .vela-btn__icon,
708
+ .vela-btn--huge .vela-btn__icon { width: var(--vela-icon-16); height: var(--vela-icon-16); }
709
+ .vela-btn__icon > svg { width: 100%; height: 100%; display: block; }
710
+
711
+ /* -- primary -- */
712
+ .vela-btn--primary.vela-btn--filled { background: var(--vela-btn-primary-bg); color: var(--vela-btn-primary-text); border-color: var(--vela-btn-primary-border); }
713
+ .vela-btn--primary.vela-btn--filled:hover:not(:disabled) { background: var(--vela-btn-primary-hover-bg); border-color: var(--vela-btn-primary-hover-bg); }
714
+ .vela-btn--primary.vela-btn--hollow { background: transparent; color: var(--vela-btn-hollow-primary-text); border-color: var(--vela-btn-hollow-primary-border); }
715
+ .vela-btn--primary.vela-btn--hollow:hover:not(:disabled) { background: var(--vela-btn-hollow-hover-bg); }
716
+
717
+ /* -- standard -- */
718
+ .vela-btn--standard.vela-btn--filled { background: var(--vela-btn-standard-bg); color: var(--vela-btn-standard-text); border-color: var(--vela-btn-standard-border); }
719
+ .vela-btn--standard.vela-btn--filled:hover:not(:disabled) { background: var(--vela-btn-standard-hover-bg); }
720
+ .vela-btn--standard.vela-btn--hollow { background: transparent; color: var(--vela-btn-standard-text); border-color: var(--vela-btn-standard-border); }
721
+ .vela-btn--standard.vela-btn--hollow:hover:not(:disabled) { background: var(--vela-bg-hover); }
722
+
723
+ /* -- destructive -- */
724
+ .vela-btn--destructive.vela-btn--filled { background: var(--vela-btn-destructive-bg); color: var(--vela-btn-destructive-text); border-color: var(--vela-btn-destructive-bg); }
725
+ .vela-btn--destructive.vela-btn--filled:hover:not(:disabled) { background: var(--vela-btn-destructive-hover-bg); border-color: var(--vela-btn-destructive-hover-bg); }
726
+ .vela-btn--destructive.vela-btn--hollow { background: transparent; color: var(--vela-btn-destructive-hollow-text); border-color: var(--vela-btn-destructive-hollow-text); }
727
+ .vela-btn--destructive.vela-btn--hollow:hover:not(:disabled) { background: var(--vela-bg-severity-major); }
728
+
729
+ /* -- text-link (primary only, tiny/regular only, never underlined) -- */
730
+ .vela-btn--text-link { background: transparent; border-color: transparent; color: var(--vela-text-link); padding: 0; height: auto; text-decoration: none; }
731
+ .vela-btn--text-link:hover:not(:disabled) { color: var(--vela-btn-primary-hover-bg); text-decoration: none; }
732
+
733
+ /* -- disabled -- */
734
+ .vela-btn:disabled { cursor: not-allowed; background: var(--vela-btn-disabled-bg); color: var(--vela-btn-disabled-text); border-color: var(--vela-border-inactive); }
735
+ .vela-btn--hollow:disabled,
736
+ .vela-btn--text-link:disabled { background: transparent; color: var(--vela-btn-disabled-text); border-color: var(--vela-border-inactive); }
737
+ .vela-btn--text-link:disabled { border-color: transparent; }
738
+
739
+ /* -- loading -- */
740
+ .vela-btn[aria-busy="true"] { cursor: progress; }
741
+ .vela-btn__spinner {
742
+ display: inline-block; flex: none;
743
+ width: var(--vela-icon-12); height: var(--vela-icon-12);
744
+ border: 2px solid currentColor;
745
+ border-right-color: transparent;
746
+ border-radius: var(--vela-radius-full);
747
+ animation: vela-spin 700ms linear infinite;
748
+ }
749
+ .vela-btn--regular .vela-btn__spinner,
750
+ .vela-btn--large .vela-btn__spinner,
751
+ .vela-btn--huge .vela-btn__spinner { width: var(--vela-icon-16); height: var(--vela-icon-16); }
752
+ @keyframes vela-spin { to { transform: rotate(360deg); } }
753
+
754
+ /* ---------------------------------------------------------------- Toggle -- */
755
+ .vela-toggle { display: inline-flex; align-items: center; gap: var(--vela-space-10); cursor: pointer; }
756
+ .vela-toggle--disabled { cursor: not-allowed; }
757
+ .vela-toggle--left { flex-direction: row-reverse; }
758
+
759
+ .vela-toggle__track {
760
+ position: relative; flex: none;
761
+ width: 34px; height: 20px;
762
+ background: var(--vela-toggle-off-bg);
763
+ border: none; border-radius: var(--vela-radius-full);
764
+ padding: 0; cursor: inherit;
765
+ transition: background-color var(--vela-duration-base) var(--vela-ease-standard);
766
+ }
767
+ .vela-toggle--tiny .vela-toggle__track { width: 26px; height: 15px; }
768
+
769
+ .vela-toggle__knob {
770
+ position: absolute; top: 2px; left: 2px;
771
+ width: 16px; height: 16px;
772
+ background: var(--vela-toggle-knob);
773
+ border-radius: var(--vela-radius-full);
774
+ transition: transform var(--vela-duration-base) var(--vela-ease-standard);
775
+ }
776
+ .vela-toggle--tiny .vela-toggle__knob { width: 11px; height: 11px; }
777
+
778
+ .vela-toggle__track[aria-checked='true'] { background: var(--vela-toggle-on-bg); }
779
+ .vela-toggle__track[aria-checked='true'] .vela-toggle__knob { transform: translateX(14px); }
780
+ .vela-toggle--tiny .vela-toggle__track[aria-checked='true'] .vela-toggle__knob { transform: translateX(11px); }
781
+
782
+ .vela-toggle__track:disabled { background: var(--vela-border-inactive); cursor: not-allowed; }
783
+ .vela-toggle__track:disabled .vela-toggle__knob { background: var(--vela-bg-global); }
784
+
785
+ .vela-toggle__label { font-size: var(--vela-text-body-size); line-height: var(--vela-text-body-line-height); color: var(--vela-text-default); }
786
+ .vela-toggle--disabled .vela-toggle__label { color: var(--vela-text-inactive); }
787
+
788
+ /* ----------------------------------------------------------------- Input -- */
789
+ .vela-field { display: flex; flex-direction: column; gap: var(--vela-space-5); }
790
+ .vela-field__label { font-size: var(--vela-text-h6-size); font-weight: var(--vela-font-weight-semibold); line-height: var(--vela-text-h6-line-height); color: var(--vela-text-default); }
791
+ .vela-field__required { color: var(--vela-text-error); margin-left: 2px; }
792
+
793
+ .vela-input {
794
+ width: 100%;
795
+ background: var(--vela-control-bg);
796
+ color: var(--vela-text-default);
797
+ border: 1px solid var(--vela-control-border);
798
+ border-radius: var(--vela-radius-4);
799
+ font-family: var(--vela-font-family-primary);
800
+ font-size: var(--vela-text-body-size);
801
+ line-height: var(--vela-text-body-line-height);
802
+ transition: border-color var(--vela-duration-fast) var(--vela-ease-standard);
803
+ }
804
+ .vela-input--tiny { height: var(--vela-control-height-25); padding: 0 var(--vela-space-5); font-size: var(--vela-text-meta-size); }
805
+ .vela-input--regular { height: var(--vela-control-height-26); padding: 0 var(--vela-space-10); }
806
+ .vela-input--large { height: var(--vela-control-height-35); padding: 0 var(--vela-space-10); }
807
+
808
+ .vela-input::placeholder { color: var(--vela-control-placeholder); }
809
+ .vela-input:hover:not(:disabled):not([aria-invalid='true']) { border-color: var(--vela-control-border-hover); }
810
+ .vela-input:focus { border-color: var(--vela-control-border-active); }
811
+ .vela-input[aria-invalid='true'] { border-color: var(--vela-control-border-error); }
812
+ .vela-input:disabled { background: var(--vela-control-bg-disabled); color: var(--vela-text-inactive); border-color: var(--vela-border-inactive); cursor: not-allowed; }
813
+
814
+ .vela-field__hint { font-size: var(--vela-text-meta-size); line-height: var(--vela-text-meta-line-height); color: var(--vela-text-de-emphasized); }
815
+ .vela-field__error { font-size: var(--vela-text-meta-size); line-height: var(--vela-text-meta-line-height); color: var(--vela-text-error); }
816
+
817
+ /* -------------------------------------------------------- ContextualAlert -- */
818
+ .vela-alert {
819
+ display: flex; align-items: flex-start; gap: var(--vela-space-10);
820
+ padding: var(--vela-space-10) var(--vela-space-15);
821
+ border: 1px solid; border-radius: var(--vela-radius-4);
822
+ font-size: var(--vela-text-body-size); line-height: var(--vela-text-body-line-height);
823
+ }
824
+ .vela-alert__icon { flex: none; width: var(--vela-icon-16); height: var(--vela-icon-16); margin-top: 2px; }
825
+ .vela-alert__body { flex: 1 1 auto; min-width: 0; }
826
+ .vela-alert__title { font-weight: var(--vela-font-weight-semibold); display: block; }
827
+ .vela-alert__dismiss {
828
+ flex: none; background: none; border: none; padding: 2px; margin: -2px -4px -2px 0;
829
+ color: inherit; cursor: pointer; border-radius: var(--vela-radius-3);
830
+ width: var(--vela-icon-20); height: var(--vela-icon-20);
831
+ display: inline-flex; align-items: center; justify-content: center;
832
+ }
833
+ .vela-alert__dismiss:hover { background: rgb(0 0 0 / 0.06); }
834
+
835
+ .vela-alert--success { background: var(--vela-bg-severity-success); border-color: var(--vela-border-severity-success); color: var(--vela-text-severity-success); }
836
+ .vela-alert--info { background: var(--vela-bg-severity-info); border-color: var(--vela-border-severity-info); color: var(--vela-text-severity-info); }
837
+ .vela-alert--warning { background: var(--vela-bg-severity-warning); border-color: var(--vela-border-severity-warning); color: var(--vela-text-severity-warning); }
838
+ .vela-alert--minor { background: var(--vela-bg-severity-minor); border-color: var(--vela-border-severity-minor); color: var(--vela-text-severity-minor); }
839
+ .vela-alert--major { background: var(--vela-bg-severity-major); border-color: var(--vela-border-severity-major); color: var(--vela-text-severity-major); }
840
+ .vela-alert--critical { background: var(--vela-bg-severity-critical); border-color: var(--vela-border-severity-critical); color: var(--vela-text-severity-critical); }
841
+
842
+ .vela-alert--success .vela-alert__icon { color: var(--vela-icon-severity-success); }
843
+ .vela-alert--info .vela-alert__icon { color: var(--vela-icon-severity-info); }
844
+ .vela-alert--warning .vela-alert__icon { color: var(--vela-icon-severity-warning); }
845
+ .vela-alert--minor .vela-alert__icon { color: var(--vela-icon-severity-minor); }
846
+ .vela-alert--major .vela-alert__icon { color: var(--vela-icon-severity-major); }
847
+ .vela-alert--critical .vela-alert__icon { color: var(--vela-icon-severity-critical); }
848
+
849
+ /* ------------------------------------------------------- StatusIndicator -- */
850
+ .vela-status { display: inline-flex; align-items: center; gap: var(--vela-space-5); }
851
+ .vela-status__dot {
852
+ flex: none;
853
+ width: 10px; height: 10px;
854
+ border-radius: var(--vela-radius-full); /* the ONLY component that uses radius-full */
855
+ }
856
+ .vela-status--small .vela-status__dot { width: 8px; height: 8px; }
857
+ .vela-status__label { font-size: var(--vela-text-meta-size); line-height: var(--vela-text-meta-line-height); color: var(--vela-text-default); }
858
+
859
+ .vela-status--unknown .vela-status__dot { background: var(--vela-signal-status-unknown); }
860
+ .vela-status--healthy .vela-status__dot { background: var(--vela-signal-status-healthy); }
861
+ .vela-status--warning .vela-status__dot { background: var(--vela-signal-status-warning); }
862
+ .vela-status--medium .vela-status__dot { background: var(--vela-signal-status-medium); }
863
+ .vela-status--unhealthy .vela-status__dot { background: var(--vela-signal-status-unhealthy); }
864
+
865
+ /* ------------------------------------------------------------------ Tabs -- */
866
+ .vela-tabs { display: flex; flex-direction: column; }
867
+
868
+ .vela-tabs__list {
869
+ display: flex; align-items: stretch; gap: var(--vela-space-20);
870
+ border-bottom: 1px solid var(--vela-border-subtle);
871
+ overflow-x: auto;
872
+ }
873
+
874
+ .vela-tabs__trigger {
875
+ position: relative;
876
+ background: none; border: none; padding: var(--vela-space-10) 0;
877
+ margin-bottom: -1px;
878
+ font-family: var(--vela-font-family-primary);
879
+ font-size: var(--vela-text-tab-size);
880
+ line-height: var(--vela-text-tab-line-height);
881
+ font-weight: var(--vela-font-weight-regular);
882
+ color: var(--vela-text-de-emphasized);
883
+ cursor: pointer; white-space: nowrap;
884
+ border-bottom: 2px solid transparent;
885
+ transition: color var(--vela-duration-fast) var(--vela-ease-standard),
886
+ border-color var(--vela-duration-fast) var(--vela-ease-standard);
887
+ }
888
+ .vela-tabs--large .vela-tabs__trigger { font-size: var(--vela-text-tab-large-size); line-height: var(--vela-text-tab-large-line-height); }
889
+
890
+ .vela-tabs__trigger:hover:not(:disabled) { color: var(--vela-text-default); }
891
+ .vela-tabs__trigger[aria-selected='true'] { color: var(--vela-text-link); border-bottom-color: var(--vela-border-active); }
892
+ .vela-tabs__trigger:disabled { color: var(--vela-text-inactive); cursor: not-allowed; }
893
+
894
+ .vela-tabs__count { margin-left: var(--vela-space-5); font-weight: var(--vela-font-weight-semibold); }
895
+
896
+ .vela-tabs__panel { padding-top: var(--vela-space-15); }
897
+ .vela-tabs__panel:focus-visible { outline: var(--vela-focus-ring-width) solid var(--vela-focus-ring-color); outline-offset: var(--vela-focus-ring-offset); }