@novie/ui 0.1.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 (54) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -0
  3. package/dist/components/ui/alert.d.ts +13 -0
  4. package/dist/components/ui/alert.d.ts.map +1 -0
  5. package/dist/components/ui/avatar.d.ts +14 -0
  6. package/dist/components/ui/avatar.d.ts.map +1 -0
  7. package/dist/components/ui/badge.d.ts +16 -0
  8. package/dist/components/ui/badge.d.ts.map +1 -0
  9. package/dist/components/ui/button.d.ts +12 -0
  10. package/dist/components/ui/button.d.ts.map +1 -0
  11. package/dist/components/ui/card.d.ts +11 -0
  12. package/dist/components/ui/card.d.ts.map +1 -0
  13. package/dist/components/ui/checkbox.d.ts +9 -0
  14. package/dist/components/ui/checkbox.d.ts.map +1 -0
  15. package/dist/components/ui/dialog.d.ts +12 -0
  16. package/dist/components/ui/dialog.d.ts.map +1 -0
  17. package/dist/components/ui/icon-button.d.ts +12 -0
  18. package/dist/components/ui/icon-button.d.ts.map +1 -0
  19. package/dist/components/ui/input-field.d.ts +15 -0
  20. package/dist/components/ui/input-field.d.ts.map +1 -0
  21. package/dist/components/ui/input.d.ts +3 -0
  22. package/dist/components/ui/input.d.ts.map +1 -0
  23. package/dist/components/ui/label.d.ts +3 -0
  24. package/dist/components/ui/label.d.ts.map +1 -0
  25. package/dist/components/ui/progress.d.ts +20 -0
  26. package/dist/components/ui/progress.d.ts.map +1 -0
  27. package/dist/components/ui/radio-group.d.ts +10 -0
  28. package/dist/components/ui/radio-group.d.ts.map +1 -0
  29. package/dist/components/ui/search-input.d.ts +9 -0
  30. package/dist/components/ui/search-input.d.ts.map +1 -0
  31. package/dist/components/ui/separator.d.ts +10 -0
  32. package/dist/components/ui/separator.d.ts.map +1 -0
  33. package/dist/components/ui/stepper.d.ts +28 -0
  34. package/dist/components/ui/stepper.d.ts.map +1 -0
  35. package/dist/components/ui/switch.d.ts +14 -0
  36. package/dist/components/ui/switch.d.ts.map +1 -0
  37. package/dist/components/ui/table.d.ts +11 -0
  38. package/dist/components/ui/table.d.ts.map +1 -0
  39. package/dist/components/ui/tag.d.ts +13 -0
  40. package/dist/components/ui/tag.d.ts.map +1 -0
  41. package/dist/components/ui/toast.d.ts +19 -0
  42. package/dist/components/ui/toast.d.ts.map +1 -0
  43. package/dist/components/ui/tooltip.d.ts +11 -0
  44. package/dist/components/ui/tooltip.d.ts.map +1 -0
  45. package/dist/index.css +2 -0
  46. package/dist/index.d.ts +30 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +6824 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/lib/utils.d.ts +3 -0
  51. package/dist/lib/utils.d.ts.map +1 -0
  52. package/package.json +84 -0
  53. package/src/index.css +986 -0
  54. package/tailwind.config.ts +149 -0
package/src/index.css ADDED
@@ -0,0 +1,986 @@
1
+ @import "@fontsource-variable/google-sans-flex";
2
+
3
+ @tailwind base;
4
+ @tailwind components;
5
+ @tailwind utilities;
6
+
7
+ *,
8
+ ::before,
9
+ ::after {
10
+ font-family: 'Google Sans Flex Variable', ui-sans-serif, system-ui, -apple-system, sans-serif !important;
11
+ }
12
+
13
+ /*
14
+ * Novie Design System — Color Tokens
15
+ * Source: Figma file 7gGNjg9EKbHtiB2fyuljQe, node 361:21232
16
+ * Format: HSL values without hsl() wrapper (shadcn/Next.js convention)
17
+ *
18
+ * Token layers:
19
+ * Palette → raw color scales (fern-600, gray-900, red-500 …)
20
+ * Semantic → purpose-based aliases that reference the palette
21
+ *
22
+ * Annotation format:
23
+ * semantic: <Figma semantic token> ← palette: <Figma palette source> hex: <value>
24
+ *
25
+ * Usage in tailwind.config.ts:
26
+ * primary: { DEFAULT: "hsl(var(--primary))" }
27
+ */
28
+
29
+ :root {
30
+ /* ========================================
31
+ * SEMANTIC TOKENS
32
+ * ======================================== */
33
+
34
+ /* --- Surfaces --- */
35
+ --background: 0 0% 100%;
36
+ /* semantic: surface/default ← palette: white hex: #ffffff */
37
+ --foreground: 0 0% 20%;
38
+ /* semantic: text/primary/default ← palette: neutral-900 hex: #333333 */
39
+ --card: 0 0% 100%;
40
+ /* semantic: surface/default ← palette: white hex: #ffffff */
41
+ --card-foreground: 0 0% 20%;
42
+ /* semantic: text/primary/default ← palette: neutral-900 hex: #333333 */
43
+ --popover: 0 0% 100%;
44
+ /* semantic: surface/default ← palette: white hex: #ffffff */
45
+ --popover-foreground: 0 0% 20%;
46
+ /* semantic: text/primary/default ← palette: neutral-900 hex: #333333 */
47
+
48
+ /* --- Primary (pure black / white) --- */
49
+ --primary: 0 0% 0%;
50
+ /* semantic: bg/primary/default ← palette: gray-900 hex: #000000 */
51
+ --primary-foreground: 0 0% 100%;
52
+ /* semantic: button/primary/text ← palette: white hex: #ffffff */
53
+ --primary-secondary: 200 12% 95.1%;
54
+ /* semantic: bg/primary/secondary ← palette: gray-100 hex: #f1f3f4 */
55
+ --primary-tertiary: 0 0% 89.8%;
56
+ /* semantic: bg/primary/tertiary ← palette: gray-200 hex: #e5e5e5 */
57
+
58
+ /* --- Secondary --- */
59
+ --secondary: 200 12% 95.1%;
60
+ /* semantic: bg/primary/secondary ← palette: gray-100 hex: #f1f3f4 */
61
+ --secondary-foreground: 0 0% 20%;
62
+ /* semantic: text/primary/default ← palette: neutral-900 hex: #333333 */
63
+
64
+ /* --- Muted --- */
65
+ --muted: 0 0% 89.8%;
66
+ /* semantic: bg/primary/tertiary ← palette: gray-200 hex: #e5e5e5 */
67
+ --muted-foreground: 0 0% 39.6%;
68
+ /* semantic: text/primary/secondary ← palette: neutral-700 hex: #656565 */
69
+
70
+ /* --- Accent (warm sand) --- */
71
+ --accent: 45 25% 93.7%;
72
+ /* semantic: bg/interactive/secondary ← palette: sand-400 hex: #f3f1eb */
73
+ --accent-foreground: 0 0% 20%;
74
+ /* semantic: text/primary/default ← palette: neutral-900 hex: #333333 */
75
+
76
+ /* --- Destructive (Novie red) --- */
77
+ --destructive: 10.7 77% 44.3%;
78
+ /* semantic: bg/error/default ← palette: red-500 hex: #c8391a */
79
+ --destructive-foreground: 0 0% 100%;
80
+ /* semantic: text/inverse/default ← palette: white hex: #ffffff */
81
+
82
+ /* --- Borders --- */
83
+ --border: 0 0% 78%;
84
+ /* semantic: border/default/default ← palette: neutral-200 hex: #c7c7c7 */
85
+ --input: 0 0% 85.1%;
86
+ /* semantic: border/default/secondary ← palette: neutral-100 hex: #d9d9d9 */
87
+ --ring: 0 0% 0%;
88
+ /* semantic: border/focus/default ← palette: gray-900 hex: #000000 */
89
+
90
+ --radius: 0.5rem;
91
+
92
+ /* ========================================
93
+ * STATUS TOKENS
94
+ * ======================================== */
95
+
96
+ /* --- Success (fern) --- */
97
+ --success: 148.1 23.2% 39.8%;
98
+ /* semantic: bg/success/default ← palette: fern-600 hex: #4e7d64 */
99
+ --success-foreground: 0 0% 100%;
100
+ /* semantic: text/inverse/default ← palette: white hex: #ffffff */
101
+ --success-secondary: 143.1 28.9% 64.7%;
102
+ /* semantic: bg/success/secondary ← palette: fern-400 hex: #8bbf9f */
103
+ --success-tertiary: 152.3 30.2% 91.6%;
104
+ /* semantic: bg/success/tertiary ← palette: fern-100 hex: #e3f0ea */
105
+
106
+ /* --- Warning (orange) --- */
107
+ --warning: 30.2 100% 61.4%;
108
+ /* semantic: bg/warning/default ← palette: orange-500 hex: #ff9d3a */
109
+ --warning-foreground: 39 90% 97.3%;
110
+ /* semantic: text/primary/on-dark ← palette: page-secondary hex: #fcfaf6 */
111
+ --warning-secondary: 30 100% 74.5%;
112
+ /* semantic: bg/warning/secondary ← palette: orange-300 hex: #ffbe7d */
113
+ --warning-tertiary: 30 100% 87.1%;
114
+ /* semantic: bg/warning/tertiary ← palette: orange-100 hex: #ffdebd */
115
+
116
+ /* --- Info (slate) --- */
117
+ --info: 210 11.9% 39.6%;
118
+ /* semantic: bg/info/default ← palette: slate-700 hex: #596571 */
119
+ --info-foreground: 0 0% 100%;
120
+ /* semantic: text/inverse/default ← palette: white hex: #ffffff */
121
+ --info-secondary: 210 12.5% 78%;
122
+ /* semantic: bg/info/secondary ← palette: slate-200 hex: #c0c7ce */
123
+ --info-tertiary: 210 10.5% 92.5%;
124
+ /* semantic: bg/info/tertiary ← palette: slate-50 hex: #eaecee */
125
+
126
+ /* --- Error (alias for destructive, with secondary/tertiary) --- */
127
+ --error: 10.7 77% 44.3%;
128
+ /* semantic: bg/error/default ← palette: red-500 hex: #c8391a */
129
+ --error-foreground: 0 0% 100%;
130
+ /* semantic: text/inverse/default ← palette: white hex: #ffffff */
131
+ --error-secondary: 14.8 81% 79.4%;
132
+ /* semantic: bg/error/secondary ← palette: red-200 hex: #f5b5a0 */
133
+ --error-tertiary: 17.6 81% 95.9%;
134
+ /* semantic: bg/error/tertiary ← palette: red-50 hex: #fdf1ec */
135
+
136
+ /* ========================================
137
+ * PAGE & SURFACE TOKENS (sand palette)
138
+ * ======================================== */
139
+
140
+ --page: 45 25% 93.7%;
141
+ /* semantic: bg/page/default ← palette: sand-400 hex: #f3f1eb */
142
+ --page-secondary: 40 50% 97.6%;
143
+ /* semantic: bg/page/secondary ← palette: sand-300 hex: #fcfaf6 */
144
+ --page-tertiary: 36 11.6% 91.6%;
145
+ /* semantic: bg/page/tertiary ← palette: sand-500 hex: #eceae7 */
146
+ --surface-inset: 36 11.6% 91.6%;
147
+ /* semantic: bg/surface/inset ← palette: sand-500 hex: #eceae7 */
148
+ --surface-elevated: 0 0% 100%;
149
+ /* semantic: bg/surface/elevated ← palette: white hex: #ffffff */
150
+ --surface-overlay: 0 0% 0% / 50%;
151
+ /* semantic: bg/surface/overlay ← palette: black-50a hex: #00000080 */
152
+
153
+ /* ========================================
154
+ * INTERACTIVE TOKENS
155
+ * ======================================== */
156
+
157
+ --interactive: 0 0% 100%;
158
+ /* semantic: bg/interactive/default ← palette: white hex: #ffffff */
159
+ --interactive-disabled: 0 0% 78%;
160
+ /* semantic: bg/interactive/disabled ← palette: neutral-200 hex: #c7c7c7 */
161
+ --interactive-secondary: 45 25% 93.7%;
162
+ /* semantic: bg/interactive/secondary ← palette: sand-400 hex: #f3f1eb */
163
+ --interactive-tertiary: 40 50% 97.6%;
164
+ /* semantic: bg/interactive/tertiary ← palette: sand-300 hex: #fcfaf6 */
165
+
166
+ /* ========================================
167
+ * SCENARIO BACKGROUNDS
168
+ * ======================================== */
169
+
170
+ --scenario-fern: 152.3 30.2% 91.6%;
171
+ /* semantic: bg/scenario/fern ← palette: fern-100 hex: #e3f0ea */
172
+ --scenario-orange: 30 100% 87.1%;
173
+ /* semantic: bg/scenario/orange ← palette: orange-100 hex: #ffdebd */
174
+ --scenario-red: 15.7 82.1% 89%;
175
+ /* semantic: bg/scenario/red ← palette: red-100 hex: #fad8cc */
176
+ --scenario-slate: 210 13.2% 85.1%;
177
+ /* semantic: bg/scenario/slate ← palette: slate-100 hex: #d4d9de */
178
+
179
+ /* ========================================
180
+ * BORDER TOKENS
181
+ * ======================================== */
182
+
183
+ --border-default: 0 0% 78%;
184
+ /* semantic: border/default/default ← palette: neutral-200 hex: #c7c7c7 */
185
+ --border-disabled: 0 0% 85.1%;
186
+ /* semantic: border/default/disabled ← palette: neutral-100 hex: #d9d9d9 */
187
+ --border-secondary: 0 0% 85.1%;
188
+ /* semantic: border/default/secondary ← palette: neutral-100 hex: #d9d9d9 */
189
+ --border-strong: 0 0% 63.9%;
190
+ /* semantic: border/default/strong ← palette: neutral-400 hex: #a3a3a3 */
191
+ --border-focus: 0 0% 0%;
192
+ /* semantic: border/focus/default ← palette: gray-900 hex: #000000 */
193
+ --border-focus-error: 10.7 77% 44.3%;
194
+ /* semantic: border/focus/error ← palette: red-500 hex: #c8391a */
195
+ --border-error: 10.7 77% 44.3%;
196
+ /* semantic: border/error/default ← palette: red-500 hex: #c8391a */
197
+ --border-error-secondary: 12.8 76.2% 68.6%;
198
+ /* semantic: border/error/secondary ← palette: red-300 hex: #ec8c72 */
199
+ --border-success: 148.1 23.2% 39.8%;
200
+ /* semantic: border/success/default ← palette: fern-600 hex: #4e7d64 */
201
+ --border-success-secondary: 143.1 28.9% 64.7%;
202
+ /* semantic: border/success/secondary ← palette: fern-400 hex: #8bbf9f */
203
+ --border-info: 210 12.6% 50.2%;
204
+ /* semantic: border/info/default ← palette: slate-600 hex: #708090 */
205
+ --border-warning: 32.9 100% 50%;
206
+ /* semantic: border/warning/default ← palette: orange-600 hex: #ff8c00 */
207
+ --border-warning-secondary: 30.2 100% 61.4%;
208
+ /* semantic: border/warning/secondary ← palette: orange-500 hex: #ff9d3a */
209
+ --border-warning-tertiary: 29.6 100% 68.2%;
210
+ /* semantic: border/warning/tertiary ← palette: orange-400 hex: #ffad5d */
211
+
212
+ /* ========================================
213
+ * TEXT TOKENS
214
+ * ======================================== */
215
+
216
+ --text-primary: 0 0% 20%;
217
+ /* semantic: text/primary/default ← palette: neutral-900 hex: #333333 */
218
+ --text-primary-secondary: 0 0% 39.6%;
219
+ /* semantic: text/primary/secondary ← palette: neutral-700 hex: #656565 */
220
+ --text-primary-tertiary: 0 0% 39.6%;
221
+ /* semantic: text/primary/tertiary ← palette: neutral-700 hex: #656565 */
222
+ --text-primary-on-dark: 40 50% 97.6%;
223
+ /* semantic: text/primary/on-dark ← palette: sand-300 hex: #fcfaf6 */
224
+ --text-disabled: 0 0% 63.9%;
225
+ /* semantic: text/disabled/default ← palette: neutral-400 hex: #a3a3a3 */
226
+ --text-disabled-on: 0 0% 56.9%;
227
+ /* semantic: text/disabled/on-disabled ← palette: neutral-500 hex: #919191 */
228
+ --text-error: 11.2 80.6% 36.5%;
229
+ /* semantic: text/error/default ← palette: red-600 hex: #a82e12 */
230
+ --text-error-on-surface: 10.3 78.4% 14.5%;
231
+ /* semantic: text/error/on-surface ← palette: red-900 hex: #421208 */
232
+ --text-success: 148.1 23.2% 39.8%;
233
+ /* semantic: text/success/default ← palette: fern-600 hex: #4e7d64 */
234
+ --text-success-on-surface: 146.1 33.3% 27.1%;
235
+ /* semantic: text/success/on-surface ← palette: fern-700 hex: #2e5c42 */
236
+ --text-warning: 31.5 86.9% 41.8%;
237
+ /* semantic: text/warning/default ← palette: orange-700 hex: #c76f0e */
238
+ --text-warning-on-surface: 29.2 68.4% 22.4%;
239
+ /* semantic: text/warning/on-surface ← palette: orange-900 hex: #603812 */
240
+ --text-info: 208.2 11.3% 29.6%;
241
+ /* semantic: text/info/default ← palette: slate-800 hex: #434c54 */
242
+ --text-inverse: 0 0% 100%;
243
+ /* semantic: text/inverse/default ← palette: white hex: #ffffff */
244
+ --text-link: 212.7 10.7% 20.2%;
245
+ /* semantic: text/link/default ← palette: slate-900 hex: #2e3339 */
246
+ --text-link-visited: 210 11.9% 39.6%;
247
+ /* semantic: text/link/visited ← palette: slate-700 hex: #596571 */
248
+
249
+ /* ========================================
250
+ * ICON TOKENS
251
+ * ======================================== */
252
+
253
+ --icon-default: 0 0% 20%;
254
+ /* semantic: Icon/default/default ← palette: neutral-900 hex: #333333 */
255
+ --icon-secondary: 0 0% 50.2%;
256
+ /* semantic: Icon/default/secondary ← palette: neutral-600 hex: #808080 */
257
+ --icon-tertiary: 0 0% 63.9%;
258
+ /* semantic: Icon/default/tertiary ← palette: neutral-400 hex: #a3a3a3 */
259
+ --icon-disabled: 0 0% 70.6%;
260
+ /* semantic: Icon/default/disabled ← palette: neutral-300 hex: #b4b4b4 */
261
+ --icon-on-dark: 0 0% 100%;
262
+ /* semantic: Icon/default/on-dark ← palette: white hex: #ffffff */
263
+ --icon-on-color: 0 0% 100%;
264
+ /* semantic: Icon/default/on-color ← palette: white hex: #ffffff */
265
+ --icon-border-primary: 0 0% 0%;
266
+ /* semantic: Icon/border/primary ← palette: gray-900 hex: #000000 */
267
+ --icon-border-solid-primary: 0 0% 100%;
268
+ /* semantic: Icon/border/Solid primary ← palette: white hex: #ffffff */
269
+ --icon-border-secondary: 0 0% 29.8%;
270
+ /* semantic: Icon/border/secondary ← palette: neutral-800 hex: #4c4c4c */
271
+
272
+ /* Icon/error */
273
+ --icon-error: 11.2 80.6% 36.5%;
274
+ /* semantic: Icon/error/default ← palette: red-600 hex: #a82e12 */
275
+ --icon-error-on-surface: 0 0% 100%;
276
+ /* semantic: Icon/error/on-surface ← palette: white hex: #ffffff */
277
+ --icon-error-on-positive: 3 100% 88.2%;
278
+ /* semantic: Icon/error/On Positive ← palette: — hex: #ffc6c3 */
279
+ --icon-error-on-positive-secondary: 357 54.5% 21.6%;
280
+ /* semantic: Icon/error/On Positive Secondary ← palette: — hex: #55191c */
281
+ --icon-error-on-positive-tertiary: 354 64.1% 30.6%;
282
+ /* semantic: Icon/error/On Positive Tertiary ← palette: — hex: #801c26 */
283
+ --icon-error-secondary: 356.5 75.6% 59.8%;
284
+ /* semantic: Icon/error/Secondary ← palette: — hex: #e64b54 */
285
+ --icon-error-tertiary: 0 80.1% 68.4%;
286
+ /* semantic: Icon/error/Tertiary ← palette: — hex: #ef6e6e */
287
+
288
+ /* Icon/success */
289
+ --icon-success: 146.1 33.3% 27.1%;
290
+ /* semantic: Icon/success/default ← palette: fern-700 hex: #2e5c42 */
291
+ --icon-success-on-surface: 0 0% 100%;
292
+ /* semantic: Icon/success/on-surface ← palette: white hex: #ffffff */
293
+ --icon-success-on-positive: 140.6 84.2% 92.5%;
294
+ /* semantic: Icon/success/On Positive ← palette: — hex: #dcfce7 */
295
+ --icon-success-on-positive-secondary: 142.8 64.2% 24.1%;
296
+ /* semantic: Icon/success/On Positive Secondary ← palette: — hex: #166534 */
297
+ --icon-success-on-positive-tertiary: 143.8 61.2% 20.2%;
298
+ /* semantic: Icon/success/On Positive Tertiary ← palette: — hex: #14532d */
299
+ --icon-success-tertiary: 142.1 70.6% 45.3%;
300
+ /* semantic: Icon/success/Tertiary ← palette: — hex: #22c55e */
301
+
302
+ /* Icon/warning */
303
+ --icon-warning: 31.5 86.9% 41.8%;
304
+ /* semantic: Icon/warning/default ← palette: orange-700 hex: #c76f0e */
305
+ --icon-warning-on-surface: 0 0% 100%;
306
+ /* semantic: Icon/warning/on-surface ← palette: white hex: #ffffff */
307
+ --icon-warning-on-positive: 31.5 86.9% 41.8%;
308
+ /* semantic: Icon/warning/On Positive ← palette: orange-700 hex: #c76f0e */
309
+ --icon-warning-on-positive-secondary: 32.9 100% 50%;
310
+ /* semantic: Icon/warning/On Positive Secondary ← palette: orange-600 hex: #ff8c00 */
311
+ --icon-warning-on-positive-tertiary: 30.2 100% 61.4%;
312
+ /* semantic: Icon/warning/On Positive Tertiary ← palette: orange-500 hex: #ff9d3a */
313
+ --icon-warning-tertiary: 29.6 100% 68.2%;
314
+ /* semantic: Icon/warning/Tertiary ← palette: orange-400 hex: #ffad5d */
315
+
316
+ /* Icon/info */
317
+ --icon-info: 210 11.9% 39.6%;
318
+ /* semantic: Icon/info/default ← palette: slate-700 hex: #596571 */
319
+ --icon-info-on-disabled: 0 0% 63.9%;
320
+ /* semantic: Icon/info/On Disabled ← palette: neutral-400 hex: #a3a3a3 */
321
+
322
+ /* Icon/neutral */
323
+ --icon-neutral: 212.7 10.7% 20.2%;
324
+ /* semantic: Icon/neutral/Default ← palette: slate-900 hex: #2e3339 */
325
+ --icon-neutral-on-neutral: 210 13.2% 85.1%;
326
+ /* semantic: Icon/neutral/On Neutral ← palette: slate-100 hex: #d4d9de */
327
+ --icon-neutral-on-neutral-secondary: 212.7 10.7% 20.2%;
328
+ /* semantic: Icon/neutral/On Neutral Secondary ← palette: slate-900 hex: #2e3339 */
329
+ --icon-neutral-on-neutral-tertiary: 208.2 11.3% 29.6%;
330
+ /* semantic: Icon/neutral/On Neutral Tertiary ← palette: slate-800 hex: #434c54 */
331
+ --icon-neutral-secondary: 210 11.9% 39.6%;
332
+ /* semantic: Icon/neutral/Secondary ← palette: slate-700 hex: #596571 */
333
+ --icon-neutral-tertiary: 210 12.6% 50.2%;
334
+ /* semantic: Icon/neutral/Tertiary ← palette: slate-600 hex: #708090 */
335
+
336
+ /* ========================================
337
+ * BUTTON TOKENS
338
+ * ======================================== */
339
+
340
+ --button-primary-bg: 0 0% 0%;
341
+ /* semantic: button/primary/background ← palette: gray-900 hex: #000000 */
342
+ --button-primary-bg-disabled: 0 0% 78%;
343
+ /* semantic: button/primary/background-disabled ← palette: neutral-200 hex: #c7c7c7 */
344
+ --button-primary-text: 0 0% 100%;
345
+ /* semantic: button/primary/text ← palette: white hex: #ffffff */
346
+ --button-secondary-bg: 0 0% 0% / 0%;
347
+ /* semantic: button/secondary/background ← palette: transparent hex: #00000000 */
348
+ --button-secondary-hover-border: 0 0% 53.7%;
349
+ /* semantic: button/secondary/border-hover ← palette: gray-500 hex: #898989 */
350
+ --button-primary-hover: 0 0% 14.1%;
351
+ /* semantic: button/primary-hover ← palette: gray-800 hex: #242424 */
352
+ --button-primary-text-disabled: 215 9% 29.4%;
353
+ /* semantic: text/info/default ← palette: slate-600 hex: #434c54 */
354
+ --button-danger-hover: 346.3 71.3% 39.6%;
355
+ /* semantic: background/error/default-hover ← palette: red-700 hex: #ad1c31 */
356
+ --button-danger-bg-disabled: 14.1 85.5% 79.6%;
357
+ /* semantic: button/destructive/background-disabled ← palette: red-200 hex: #f5b5a0 */
358
+ --button-danger-text-disabled: 14.5 71.4% 16.5%;
359
+ /* semantic: text/error/on-surface ← palette: red-900 hex: #421208 */
360
+ --button-ghost-bg: 0 0% 0% / 0%;
361
+ /* semantic: button/ghost/background ← palette: transparent hex: #00000000 */
362
+ --button-ghost-hover: 210 17% 98%;
363
+ /* semantic: background/primary/default-hover ← palette: gray-50 hex: #f8f9fa */
364
+ --icon-button-hover: 0 0% 50.2%;
365
+ /* semantic: icon/default/secondary ← palette: neutral-500 hex: #808080 */
366
+ --icon-button-disabled: 0 0% 70.6%;
367
+ /* semantic: icon/default/disabled ← palette: neutral-300 hex: #b4b4b4 */
368
+ --icon-button-danger-bg: 12.4 80.9% 36.5%;
369
+ /* semantic: icon/error/default ← palette: red-600 hex: #a82e12 */
370
+ --icon-button-danger-hover: 14.1 85.5% 79.6%;
371
+ /* semantic: background/error/secondary ← palette: red-200 hex: #f5b5a0 */
372
+ --icon-button-danger-disabled: 18 80% 96.1%;
373
+ /* semantic: background/error/tertiary ← palette: red-50 hex: #fdf1ec */
374
+
375
+ /* ========================================
376
+ * SHADOW TOKENS
377
+ * ======================================== */
378
+
379
+ --shadow-sm: 0 0% 0% / 30%;
380
+ /* semantic: shadow/sm ← palette: black-30a hex: #0000004d */
381
+ --shadow-default: 0 0% 0% / 30%;
382
+ /* semantic: shadow/default ← palette: black-30a hex: #0000004d */
383
+ --shadow-lg: 0 0% 0% / 50%;
384
+ /* semantic: shadow/lg ← palette: black-50a hex: #00000080 */
385
+
386
+ /* ========================================
387
+ * CHART COLORS
388
+ * ======================================== */
389
+
390
+ --chart-1: 10.7 77% 44.3%;
391
+ /* semantic: chart/1 ← palette: red-500 hex: #c8391a */
392
+ --chart-2: 148.1 23.2% 39.8%;
393
+ /* semantic: chart/2 ← palette: fern-600 hex: #4e7d64 */
394
+ --chart-3: 210 11.9% 39.6%;
395
+ /* semantic: chart/3 ← palette: slate-700 hex: #596571 */
396
+ --chart-4: 30.2 100% 61.4%;
397
+ /* semantic: chart/4 ← palette: orange-500 hex: #ff9d3a */
398
+ --chart-5: 45 25% 93.7%;
399
+ /* semantic: chart/5 ← palette: sand-400 hex: #f3f1eb */
400
+
401
+ /* ========================================
402
+ * PALETTE — Raw color scales
403
+ * These are the base values that semantic tokens reference.
404
+ * Use semantic tokens above whenever possible.
405
+ * ======================================== */
406
+
407
+ /* --- Fern --- */
408
+ --fern-50: 145.7 30.4% 95.5%;
409
+ /* #f0f7f3 */
410
+ --fern-100: 152.3 30.2% 91.6%;
411
+ /* #e3f0ea */
412
+ --fern-200: 148.8 26.9% 81.8%;
413
+ /* #c4ddd0 */
414
+ --fern-300: 150.7 27.5% 70.8%;
415
+ /* #a0c9b5 */
416
+ --fern-400: 143.1 28.9% 64.7%;
417
+ /* #8bbf9f */
418
+ --fern-500: 150 21.1% 51.8%;
419
+ /* #6a9e84 */
420
+ --fern-600: 148.1 23.2% 39.8%;
421
+ /* #4e7d64 */
422
+ --fern-700: 146.1 33.3% 27.1%;
423
+ /* #2e5c42 */
424
+ --fern-800: 147.3 37.1% 17.5%;
425
+ /* #1c3d2b */
426
+ --fern-900: 150 44% 9.8%;
427
+ /* #0e2419 */
428
+
429
+ /* --- Gray --- */
430
+ --gray-0: 0 0% 100%;
431
+ /* #ffffff */
432
+ --gray-50: 210 16.7% 97.6%;
433
+ /* #f8f9fa */
434
+ --gray-100: 200 12% 95.1%;
435
+ /* #f1f3f4 */
436
+ --gray-200: 0 0% 89.8%;
437
+ /* #e5e5e5 */
438
+ --gray-300: 0 0% 83.9%;
439
+ /* #d6d6d6 */
440
+ --gray-400: 0 0% 68.6%;
441
+ /* #afafaf */
442
+ --gray-500: 0 0% 53.7%;
443
+ /* #898989 */
444
+ --gray-600: 0 0% 39.6%;
445
+ /* #656565 */
446
+ --gray-650: 213.3 4.5% 39%;
447
+ /* #5f6368 */
448
+ --gray-700: 0 0% 23.1%;
449
+ /* #3b3b3b */
450
+ --gray-800: 0 0% 14.1%;
451
+ /* #242424 */
452
+ --gray-900: 0 0% 0%;
453
+ /* #000000 */
454
+
455
+ /* --- Green --- */
456
+ --green-50: 80 36% 95.1%;
457
+ /* #f4f7ee */
458
+ --green-100: 78.3 39% 88.4%;
459
+ /* #e6edd6 */
460
+ --green-200: 82.7 39.8% 77.8%;
461
+ /* #ccddb0 */
462
+ --green-300: 85.1 41.1% 64.7%;
463
+ /* #abca80 */
464
+ --green-400: 85.2 39.4% 50.2%;
465
+ /* #88b24e */
466
+ --green-500: 85 49% 38.4%;
467
+ /* #6a9232 */
468
+ --green-600: 85.5 50% 31.4%;
469
+ /* #567828 */
470
+ --green-700: 84.8 42% 27.1%;
471
+ /* #4a6228 */
472
+ --green-800: 87.3 42.3% 20.4%;
473
+ /* #364a1e */
474
+ --green-900: 90 42.9% 13.7%;
475
+ /* #233214 */
476
+
477
+ /* --- Neutral --- */
478
+ --neutral-50: 0 0% 92.5%;
479
+ /* #ececec */
480
+ --neutral-100: 0 0% 85.1%;
481
+ /* #d9d9d9 */
482
+ --neutral-200: 0 0% 78%;
483
+ /* #c7c7c7 */
484
+ --neutral-300: 0 0% 70.6%;
485
+ /* #b4b4b4 */
486
+ --neutral-400: 0 0% 63.9%;
487
+ /* #a3a3a3 */
488
+ --neutral-500: 0 0% 56.9%;
489
+ /* #919191 */
490
+ --neutral-600: 0 0% 50.2%;
491
+ /* #808080 */
492
+ --neutral-700: 0 0% 39.6%;
493
+ /* #656565 */
494
+ --neutral-800: 0 0% 29.8%;
495
+ /* #4c4c4c */
496
+ --neutral-900: 0 0% 20%;
497
+ /* #333333 */
498
+
499
+ /* --- Orange --- */
500
+ --orange-50: 30.9 100% 93.5%;
501
+ /* #ffefde */
502
+ --orange-100: 30 100% 87.1%;
503
+ /* #ffdebd */
504
+ --orange-200: 30 100% 80.8%;
505
+ /* #ffce9d */
506
+ --orange-300: 30 100% 74.5%;
507
+ /* #ffbe7d */
508
+ --orange-400: 29.6 100% 68.2%;
509
+ /* #ffad5d */
510
+ --orange-500: 30.2 100% 61.4%;
511
+ /* #ff9d3a */
512
+ --orange-600: 32.9 100% 50%;
513
+ /* #ff8c00 */
514
+ --orange-700: 31.5 86.9% 41.8%;
515
+ /* #c76f0e */
516
+ --orange-800: 30.5 78% 32.2%;
517
+ /* #925312 */
518
+ --orange-900: 29.2 68.4% 22.4%;
519
+ /* #603812 */
520
+
521
+ /* --- Red --- */
522
+ --red-50: 17.6 81% 95.9%;
523
+ /* #fdf1ec */
524
+ --red-100: 15.7 82.1% 89%;
525
+ /* #fad8cc */
526
+ --red-200: 14.8 81% 79.4%;
527
+ /* #f5b5a0 */
528
+ --red-300: 12.8 76.2% 68.6%;
529
+ /* #ec8c72 */
530
+ --red-400: 12 72.1% 56.5%;
531
+ /* #e06040 */
532
+ --red-500: 10.7 77% 44.3%;
533
+ /* #c8391a */
534
+ --red-600: 11.2 80.6% 36.5%;
535
+ /* #a82e12 */
536
+ --red-700: 10.1 78.8% 29.6%;
537
+ /* #872410 */
538
+ --red-800: 10.1 78.8% 22.2%;
539
+ /* #651b0c */
540
+ --red-900: 10.3 78.4% 14.5%;
541
+ /* #421208 */
542
+
543
+ /* --- Sand --- */
544
+ --sand-50: 0 0% 99.6%;
545
+ /* #fefefe */
546
+ --sand-100: 45 50% 98.4%;
547
+ /* #fdfcf9 */
548
+ --sand-200: 36 55.6% 98.2%;
549
+ /* #fdfbf8 */
550
+ --sand-300: 40 50% 97.6%;
551
+ /* #fcfaf6 */
552
+ --sand-400: 45 25% 93.7%;
553
+ /* #f3f1eb */
554
+ --sand-500: 36 11.6% 91.6%;
555
+ /* #eceae7 */
556
+ --sand-600: 42.9 7.7% 82.2%;
557
+ /* #d5d3ce */
558
+ --sand-700: 42.9 5.2% 73.5%;
559
+ /* #bfbdb8 */
560
+ --sand-800: 42.9 3.9% 64.9%;
561
+ /* #a9a7a2 */
562
+ --sand-900: 42.9 3% 53.5%;
563
+ /* #8c8a85 */
564
+
565
+ /* --- Black & White (with alpha variants) --- */
566
+ --black: 0 0% 0%;
567
+ /* #000000 */
568
+ --white: 0 0% 100%;
569
+ /* #ffffff */
570
+ --black-30a: 0 0% 0% / 30%;
571
+ /* #0000004d */
572
+ --black-50a: 0 0% 0% / 50%;
573
+ /* #00000080 */
574
+ --white-30a: 0 0% 100% / 30%;
575
+ /* #ffffff4d */
576
+ --white-50a: 0 0% 100% / 50%;
577
+ /* #ffffff80 */
578
+
579
+ /* --- Slate --- */
580
+ --slate-50: 210 10.5% 92.5%;
581
+ /* #eaecee */
582
+ --slate-100: 210 13.2% 85.1%;
583
+ /* #d4d9de */
584
+ --slate-200: 210 12.5% 78%;
585
+ /* #c0c7ce */
586
+ --slate-300: 211.6 12.8% 70.8%;
587
+ /* #abb4be */
588
+ --slate-400: 210 13% 63.9%;
589
+ /* #97a3af */
590
+ --slate-500: 210 12.7% 56.9%;
591
+ /* #83919f */
592
+ --slate-600: 210 12.6% 50.2%;
593
+ /* #708090 */
594
+ --slate-700: 210 11.9% 39.6%;
595
+ /* #596571 */
596
+ --slate-800: 208.2 11.3% 29.6%;
597
+ /* #434c54 */
598
+ --slate-900: 212.7 10.7% 20.2%;
599
+ /* #2e3339 */
600
+ }
601
+
602
+ .dark {
603
+ /* ========================================
604
+ * DARK MODE — Figma-accurate palette mappings
605
+ * Source: Figma Colors page, Light→Dark column
606
+ * ======================================== */
607
+
608
+ /* --- Surfaces --- */
609
+ --background: 0 0% 14.1%;
610
+ /* semantic: surface/default (dark) ← palette: gray-800 hex: #242424 */
611
+ --foreground: 0 0% 92.5%;
612
+ /* semantic: text/primary/default (dark) ← palette: neutral-50 hex: #ececec */
613
+ --card: 0 0% 14.1%;
614
+ /* semantic: surface/default (dark) ← palette: gray-800 hex: #242424 */
615
+ --card-foreground: 0 0% 92.5%;
616
+ /* semantic: text/primary/default (dark) ← palette: neutral-50 hex: #ececec */
617
+ --popover: 0 0% 14.1%;
618
+ /* semantic: surface/default (dark) ← palette: gray-800 hex: #242424 */
619
+ --popover-foreground: 0 0% 92.5%;
620
+ /* semantic: text/primary/default (dark) ← palette: neutral-50 hex: #ececec */
621
+
622
+ /* --- Primary (inverted: dark=white, light=black) --- */
623
+ --primary: 0 0% 100%;
624
+ /* semantic: bg/primary/default (dark) ← palette: white hex: #ffffff */
625
+ --primary-foreground: 0 0% 0%;
626
+ /* semantic: button/primary/text (dark) ← palette: gray-900 hex: #000000 */
627
+ --primary-secondary: 0 0% 14.1%;
628
+ /* semantic: bg/primary/secondary (dark) ← palette: gray-800 hex: #242424 */
629
+ --primary-tertiary: 0 0% 23.1%;
630
+ /* semantic: bg/primary/tertiary (dark) ← palette: gray-700 hex: #3b3b3b */
631
+
632
+ /* --- Secondary (maps to primary/secondary) --- */
633
+ --secondary: 0 0% 14.1%;
634
+ /* semantic: bg/primary/secondary (dark) ← palette: gray-800 hex: #242424 */
635
+ --secondary-foreground: 0 0% 92.5%;
636
+ /* semantic: text/primary/default (dark) ← palette: neutral-50 hex: #ececec */
637
+
638
+ /* --- Muted (maps to primary/tertiary) --- */
639
+ --muted: 0 0% 23.1%;
640
+ /* semantic: bg/primary/tertiary (dark) ← palette: gray-700 hex: #3b3b3b */
641
+ --muted-foreground: 0 0% 78%;
642
+ /* semantic: text/primary/secondary (dark) ← palette: neutral-200 hex: #c7c7c7 */
643
+
644
+ /* --- Accent (maps to interactive/secondary) --- */
645
+ --accent: 0 0% 14.1%;
646
+ /* semantic: bg/interactive/secondary (dark) ← palette: gray-800 hex: #242424 */
647
+ --accent-foreground: 0 0% 92.5%;
648
+ /* semantic: text/primary/default (dark) ← palette: neutral-50 hex: #ececec */
649
+
650
+ /* --- Destructive (bg/error/default: dark stays red-500) --- */
651
+ --destructive: 10.7 77% 44.3%;
652
+ /* semantic: bg/error/default (dark) ← palette: red-500 hex: #c8391a */
653
+ --destructive-foreground: 0 0% 100%;
654
+ /* semantic: text/inverse/default (dark) ← palette: white hex: #ffffff */
655
+
656
+ /* --- Borders --- */
657
+ --border: 0 0% 39.6%;
658
+ /* semantic: border/default/default (dark) ← palette: gray-600 hex: #656565 */
659
+ --input: 0 0% 23.1%;
660
+ /* semantic: border/default/secondary (dark) ← palette: gray-700 hex: #3b3b3b */
661
+ --ring: 0 0% 100%;
662
+ /* semantic: border/focus/default (dark) ← palette: white hex: #ffffff */
663
+
664
+ /* ========================================
665
+ * STATUS TOKENS
666
+ * ======================================== */
667
+
668
+ /* --- Success (fern) --- */
669
+ --success: 146.1 33.3% 27.1%;
670
+ /* semantic: bg/success/default (dark) ← palette: fern-700 hex: #2e5c42 */
671
+ --success-foreground: 0 0% 100%;
672
+ /* semantic: text/inverse/default (dark) ← palette: white hex: #ffffff */
673
+ --success-secondary: 147.3 37.1% 17.5%;
674
+ /* semantic: bg/success/secondary (dark) ← palette: fern-800 hex: #1c3d2b */
675
+ --success-tertiary: 147.3 37.1% 17.5%;
676
+ /* semantic: bg/success/tertiary (dark) ← palette: fern-800 hex: #1c3d2b */
677
+
678
+ /* --- Warning (orange) --- */
679
+ --warning: 30.2 100% 61.4%;
680
+ /* semantic: bg/warning/default (dark) ← palette: orange-500 hex: #ff9d3a */
681
+ --warning-foreground: 39 90% 97.3%;
682
+ /* semantic: text/primary/on-dark (dark) ← palette: page-secondary hex: #fcfaf6 */
683
+ --warning-secondary: 30.5 78% 32.2%;
684
+ /* semantic: bg/warning/secondary (dark) ← palette: orange-800 hex: #925312 */
685
+ --warning-tertiary: 29.2 68.4% 22.4%;
686
+ /* semantic: bg/warning/tertiary (dark) ← palette: orange-900 hex: #603812 */
687
+
688
+ /* --- Info (slate) --- */
689
+ --info: 210 11.9% 39.6%;
690
+ /* semantic: bg/info/default (dark) ← palette: slate-700 hex: #596571 — NOTE: same as light, no dark override in Figma data */
691
+ --info-foreground: 0 0% 100%;
692
+ /* semantic: text/inverse/default (dark) ← palette: white hex: #ffffff */
693
+ --info-secondary: 208.2 11.3% 29.6%;
694
+ /* semantic: bg/info/secondary (dark) ← palette: slate-800 hex: #434c54 */
695
+ --info-tertiary: 208.2 11.3% 29.6%;
696
+ /* semantic: bg/info/tertiary (dark) ← palette: slate-800 hex: #434c54 */
697
+
698
+ /* --- Error (alias for destructive, with secondary/tertiary) --- */
699
+ --error: 10.7 77% 44.3%;
700
+ /* semantic: bg/error/default (dark) ← palette: red-500 hex: #c8391a */
701
+ --error-foreground: 0 0% 100%;
702
+ /* semantic: text/inverse/default (dark) ← palette: white hex: #ffffff */
703
+ --error-secondary: 10.1 78.8% 29.6%;
704
+ /* semantic: bg/error/secondary (dark) ← palette: red-700 hex: #872410 */
705
+ --error-tertiary: 10.1 78.8% 22.2%;
706
+ /* semantic: bg/error/tertiary (dark) ← palette: red-800 hex: #651b0c */
707
+
708
+ /* ========================================
709
+ * PAGE & SURFACE TOKENS
710
+ * ======================================== */
711
+
712
+ --page: 0 0% 0%;
713
+ /* semantic: bg/page/default (dark) ← palette: gray-900 hex: #000000 */
714
+ --page-secondary: 0 0% 14.1%;
715
+ /* semantic: bg/page/secondary (dark) ← palette: gray-800 hex: #242424 */
716
+ --page-tertiary: 0 0% 23.1%;
717
+ /* semantic: bg/page/tertiary (dark) ← palette: gray-700 hex: #3b3b3b */
718
+ --surface-inset: 0 0% 23.1%;
719
+ /* semantic: bg/surface/inset (dark) ← palette: gray-700 hex: #3b3b3b */
720
+ --surface-elevated: 0 0% 23.1%;
721
+ /* semantic: bg/surface/elevated (dark) ← palette: gray-700 hex: #3b3b3b */
722
+ --surface-overlay: 0 0% 0% / 50%;
723
+ /* semantic: bg/surface/overlay (dark) ← palette: black-50a hex: #00000080 */
724
+
725
+ /* ========================================
726
+ * INTERACTIVE TOKENS
727
+ * ======================================== */
728
+
729
+ --interactive: 0 0% 14.1%;
730
+ /* semantic: bg/interactive/default (dark) ← palette: gray-800 hex: #242424 */
731
+ --interactive-disabled: 0 0% 23.1%;
732
+ /* semantic: bg/interactive/disabled (dark) ← palette: gray-700 hex: #3b3b3b */
733
+ --interactive-secondary: 0 0% 23.1%;
734
+ /* semantic: bg/interactive/secondary (dark) ← palette: gray-700 hex: #3b3b3b */
735
+ --interactive-tertiary: 0 0% 39.6%;
736
+ /* semantic: bg/interactive/tertiary (dark) ← palette: gray-600 hex: #656565 */
737
+
738
+ /* ========================================
739
+ * SCENARIO BACKGROUNDS
740
+ * ======================================== */
741
+
742
+ --scenario-fern: 147.3 37.1% 17.5%;
743
+ /* semantic: bg/scenario/fern (dark) ← palette: fern-800 hex: #1c3d2b */
744
+ --scenario-orange: 29.2 68.4% 22.4%;
745
+ /* semantic: bg/scenario/orange (dark) ← palette: orange-900 hex: #603812 */
746
+ --scenario-red: 10.1 78.8% 22.2%;
747
+ /* semantic: bg/scenario/red (dark) ← palette: red-800 hex: #651b0c */
748
+ --scenario-slate: 208.2 11.3% 29.6%;
749
+ /* semantic: bg/scenario/slate (dark) ← palette: slate-800 hex: #434c54 */
750
+
751
+ /* ========================================
752
+ * BORDER TOKENS
753
+ * ======================================== */
754
+
755
+ --border-default: 0 0% 39.6%;
756
+ /* semantic: border/default/default (dark) ← palette: gray-600 hex: #656565 */
757
+ --border-disabled: 0 0% 23.1%;
758
+ /* semantic: border/default/disabled (dark) ← palette: gray-700 hex: #3b3b3b */
759
+ --border-secondary: 0 0% 23.1%;
760
+ /* semantic: border/default/secondary (dark) ← palette: gray-700 hex: #3b3b3b */
761
+ --border-strong: 0 0% 53.7%;
762
+ /* semantic: border/default/strong (dark) ← palette: gray-500 hex: #898989 */
763
+ --border-focus: 0 0% 100%;
764
+ /* semantic: border/focus/default (dark) ← palette: white hex: #ffffff */
765
+ --border-focus-error: 12 72.1% 56.5%;
766
+ /* semantic: border/focus/error (dark) ← palette: red-400 hex: #e06040 */
767
+ --border-error: 12 72.1% 56.5%;
768
+ /* semantic: border/error/default (dark) ← palette: red-400 hex: #e06040 */
769
+ --border-error-secondary: 10.1 78.8% 29.6%;
770
+ /* semantic: border/error/secondary (dark) ← palette: red-700 hex: #872410 */
771
+ --border-success: 150 21.1% 51.8%;
772
+ /* semantic: border/success/default (dark) ← palette: fern-500 hex: #6a9e84 */
773
+ --border-success-secondary: 146.1 33.3% 27.1%;
774
+ /* semantic: border/success/secondary (dark) ← palette: fern-700 hex: #2e5c42 */
775
+ --border-info: 210 13% 63.9%;
776
+ /* semantic: border/info/default (dark) ← palette: slate-400 hex: #97a3af */
777
+ --border-warning: 30.2 100% 61.4%;
778
+ /* semantic: border/warning/default (dark) ← palette: orange-500 hex: #ff9d3a */
779
+ --border-warning-secondary: 30.2 100% 61.4%;
780
+ /* semantic: border/warning/secondary (dark) — no separate Figma mapping, using orange-500 (estimated) */
781
+ --border-warning-tertiary: 29.6 100% 68.2%;
782
+ /* semantic: border/warning/tertiary (dark) — no separate Figma mapping, using orange-400 (estimated) */
783
+
784
+ /* ========================================
785
+ * TEXT TOKENS
786
+ * ======================================== */
787
+
788
+ --text-primary: 0 0% 92.5%;
789
+ /* semantic: text/primary/default (dark) ← palette: neutral-50 hex: #ececec */
790
+ --text-primary-secondary: 0 0% 78%;
791
+ /* semantic: text/primary/secondary (dark) ← palette: neutral-200 hex: #c7c7c7 */
792
+ --text-primary-tertiary: 0 0% 56.9%;
793
+ /* semantic: text/primary/tertiary (dark) ← palette: neutral-500 hex: #919191 */
794
+ --text-primary-on-dark: 0 0% 20%;
795
+ /* semantic: text/primary/on-dark (dark) ← palette: neutral-900 hex: #333333 */
796
+ --text-disabled: 0 0% 56.9%;
797
+ /* semantic: text/disabled/default (dark) ← palette: neutral-500 hex: #919191 */
798
+ --text-disabled-on: 0 0% 63.9%;
799
+ /* semantic: text/disabled/on-disabled (dark) ← palette: neutral-400 hex: #a3a3a3 */
800
+ --text-error: 12.8 76.2% 68.6%;
801
+ /* semantic: text/error/default (dark) ← palette: red-300 hex: #ec8c72 */
802
+ --text-error-on-surface: 15.7 82.1% 89%;
803
+ /* semantic: text/error/on-surface (dark) ← palette: red-100 hex: #fad8cc */
804
+ --text-success: 150.7 27.5% 70.8%;
805
+ /* semantic: text/success/default (dark) ← palette: fern-300 hex: #a0c9b5 */
806
+ --text-success-on-surface: 148.8 26.9% 81.8%;
807
+ /* semantic: text/success/on-surface (dark) ← palette: fern-200 hex: #c4ddd0 */
808
+ --text-warning: 29.6 100% 68.2%;
809
+ /* semantic: text/warning/default (dark) ← palette: orange-400 hex: #ffad5d */
810
+ --text-warning-on-surface: 30 100% 87.1%;
811
+ /* semantic: text/warning/on-surface (dark) ← palette: orange-100 hex: #ffdebd */
812
+ --text-info: 211.6 12.8% 70.8%;
813
+ /* semantic: text/info/default (dark) ← palette: slate-300 hex: #abb4be */
814
+ --text-inverse: 0 0% 20%;
815
+ /* semantic: text/inverse/default (dark) ← palette: neutral-900 hex: #333333 */
816
+ --text-link: 210 12.5% 78%;
817
+ /* semantic: text/link/default (dark) ← palette: slate-200 hex: #c0c7ce */
818
+ --text-link-visited: 210 13% 63.9%;
819
+ /* semantic: text/link/visited (dark) ← palette: slate-400 hex: #97a3af */
820
+
821
+ /* ========================================
822
+ * ICON TOKENS
823
+ * ======================================== */
824
+
825
+ --icon-default: 0 0% 92.5%;
826
+ /* semantic: Icon/default/default (dark) ← palette: neutral-50 hex: #ececec */
827
+ --icon-secondary: 0 0% 70.6%;
828
+ /* semantic: Icon/default/secondary (dark) ← palette: neutral-300 hex: #b4b4b4 */
829
+ --icon-tertiary: 0 0% 56.9%;
830
+ /* semantic: Icon/default/tertiary (dark) ← palette: neutral-500 hex: #919191 */
831
+ --icon-disabled: 0 0% 50.2%;
832
+ /* semantic: Icon/default/disabled (dark) ← palette: neutral-600 hex: #808080 */
833
+ --icon-on-dark: 0 0% 20%;
834
+ /* semantic: Icon/default/on-dark (dark) ← palette: neutral-900 hex: #333333 */
835
+ --icon-on-color: 0 0% 100%;
836
+ /* semantic: Icon/default/on-color (dark) ← palette: white hex: #ffffff */
837
+ --icon-border-primary: 0 0% 100%;
838
+ /* semantic: Icon/border/primary (dark) ← palette: white hex: #ffffff — (estimated, invert of gray-900) */
839
+ --icon-border-solid-primary: 0 0% 0%;
840
+ /* semantic: Icon/border/Solid primary (dark) ← palette: gray-900 hex: #000000 — (estimated, invert of white) */
841
+ --icon-border-secondary: 0 0% 70.6%;
842
+ /* semantic: Icon/border/secondary (dark) ← palette: neutral-300 hex: #b4b4b4 — (estimated) */
843
+
844
+ /* Icon/error */
845
+ --icon-error: 12.8 76.2% 68.6%;
846
+ /* semantic: Icon/error/default (dark) ← palette: red-300 hex: #ec8c72 */
847
+ --icon-error-on-surface: 10.3 78.4% 14.5%;
848
+ /* semantic: Icon/error/on-surface (dark) ← palette: red-900 hex: #421208 */
849
+ --icon-error-on-positive: 3 100% 88.2%;
850
+ /* semantic: Icon/error/On Positive (dark) — no Figma dark mapping (estimated) */
851
+ --icon-error-on-positive-secondary: 357 54.5% 21.6%;
852
+ /* semantic: Icon/error/On Positive Secondary (dark) — (estimated) */
853
+ --icon-error-on-positive-tertiary: 354 64.1% 30.6%;
854
+ /* semantic: Icon/error/On Positive Tertiary (dark) — (estimated) */
855
+ --icon-error-secondary: 356.5 75.6% 59.8%;
856
+ /* semantic: Icon/error/Secondary (dark) — (estimated) */
857
+ --icon-error-tertiary: 0 80.1% 68.4%;
858
+ /* semantic: Icon/error/Tertiary (dark) — (estimated) */
859
+
860
+ /* Icon/success */
861
+ --icon-success: 150.7 27.5% 70.8%;
862
+ /* semantic: Icon/success/default (dark) ← palette: fern-300 hex: #a0c9b5 */
863
+ --icon-success-on-surface: 150 44% 9.8%;
864
+ /* semantic: Icon/success/on-surface (dark) ← palette: fern-900 hex: #0e2419 — NOTE: Figma typo "fern900" */
865
+ --icon-success-on-positive: 140.6 84.2% 92.5%;
866
+ /* semantic: Icon/success/On Positive (dark) — (estimated) */
867
+ --icon-success-on-positive-secondary: 142.8 64.2% 24.1%;
868
+ /* semantic: Icon/success/On Positive Secondary (dark) — (estimated) */
869
+ --icon-success-on-positive-tertiary: 143.8 61.2% 20.2%;
870
+ /* semantic: Icon/success/On Positive Tertiary (dark) — (estimated) */
871
+ --icon-success-tertiary: 142.1 70.6% 45.3%;
872
+ /* semantic: Icon/success/Tertiary (dark) — (estimated) */
873
+
874
+ /* Icon/warning */
875
+ --icon-warning: 29.6 100% 68.2%;
876
+ /* semantic: Icon/warning/default (dark) ← palette: orange-400 hex: #ffad5d */
877
+ --icon-warning-on-surface: 29.2 68.4% 22.4%;
878
+ /* semantic: Icon/warning/on-surface (dark) ← palette: orange-900 hex: #603812 */
879
+ --icon-warning-on-positive: 29.6 100% 68.2%;
880
+ /* semantic: Icon/warning/On Positive (dark) — (estimated, same as default) */
881
+ --icon-warning-on-positive-secondary: 30.2 100% 61.4%;
882
+ /* semantic: Icon/warning/On Positive Secondary (dark) — (estimated) */
883
+ --icon-warning-on-positive-tertiary: 30.5 78% 32.2%;
884
+ /* semantic: Icon/warning/On Positive Tertiary (dark) — (estimated) */
885
+ --icon-warning-tertiary: 30 100% 74.5%;
886
+ /* semantic: Icon/warning/Tertiary (dark) — (estimated, orange-300) */
887
+
888
+ /* Icon/info */
889
+ --icon-info: 211.6 12.8% 70.8%;
890
+ /* semantic: Icon/info/default (dark) ← palette: slate-300 hex: #abb4be */
891
+ --icon-info-on-disabled: 0 0% 56.9%;
892
+ /* semantic: Icon/info/On Disabled (dark) — (estimated, neutral-500) */
893
+
894
+ /* Icon/neutral */
895
+ --icon-neutral: 210 12.5% 78%;
896
+ /* semantic: Icon/neutral/Default (dark) — (estimated, slate-200) */
897
+ --icon-neutral-on-neutral: 212.7 10.7% 20.2%;
898
+ /* semantic: Icon/neutral/On Neutral (dark) — (estimated, invert: slate-900) */
899
+ --icon-neutral-on-neutral-secondary: 210 12.5% 78%;
900
+ /* semantic: Icon/neutral/On Neutral Secondary (dark) — (estimated, slate-200) */
901
+ --icon-neutral-on-neutral-tertiary: 211.6 12.8% 70.8%;
902
+ /* semantic: Icon/neutral/On Neutral Tertiary (dark) — (estimated, slate-300) */
903
+ --icon-neutral-secondary: 210 13% 63.9%;
904
+ /* semantic: Icon/neutral/Secondary (dark) — (estimated, slate-400) */
905
+ --icon-neutral-tertiary: 210 12.7% 56.9%;
906
+ /* semantic: Icon/neutral/Tertiary (dark) — (estimated, slate-500) */
907
+
908
+ /* Icon/brand */
909
+ /* --icon-brand not in :root but Figma shows: Icon/brand/default dark = fern-400 (143.1 28.9% 64.7%) */
910
+
911
+ /* ========================================
912
+ * BUTTON TOKENS
913
+ * ======================================== */
914
+
915
+ --button-primary-bg: 0 0% 100%;
916
+ /* semantic: button/primary/background (dark) ← palette: white hex: #ffffff */
917
+ --button-primary-bg-disabled: 0 0% 23.1%;
918
+ /* semantic: button/primary/background-disabled (dark) ← palette: gray-700 hex: #3b3b3b */
919
+ --button-primary-text: 0 0% 0%;
920
+ /* semantic: button/primary/text (dark) ← palette: gray-900 hex: #000000 */
921
+ --button-secondary-bg: 0 0% 0% / 0%;
922
+ /* semantic: button/secondary/background (dark) ← palette: black-0 hex: transparent */
923
+ --button-secondary-hover-border: 0 0% 53.7%;
924
+ /* semantic: button/secondary/border-hover (dark) ← palette: gray-500 hex: #898989 (estimated) */
925
+ --button-primary-hover: 0 0% 89.8%;
926
+ /* semantic: button/primary-hover (dark) ← palette: gray-200 hex: #e5e5e5 (estimated) */
927
+ --button-primary-text-disabled: 215 9% 29.4%;
928
+ /* semantic: text/info/default (dark) ← palette: slate-600 hex: #434c54 (estimated) */
929
+ --button-danger-hover: 346.3 71.3% 39.6%;
930
+ /* semantic: background/error/default-hover (dark) ← palette: red-700 hex: #ad1c31 (estimated) */
931
+ --button-danger-bg-disabled: 14.1 85.5% 79.6%;
932
+ /* semantic: button/destructive/background-disabled (dark) ← palette: red-200 hex: #f5b5a0 (estimated) */
933
+ --button-danger-text-disabled: 14.5 71.4% 16.5%;
934
+ /* semantic: text/error/on-surface (dark) ← palette: red-900 hex: #421208 (estimated) */
935
+ --button-ghost-bg: 0 0% 0% / 0%;
936
+ /* semantic: button/ghost/background (dark) ← palette: black-0 hex: transparent */
937
+ --button-ghost-hover: 0 0% 23.1%;
938
+ /* semantic: background/primary/default-hover (dark) ← palette: gray-700 hex: #3b3b3b (estimated) */
939
+ --icon-button-hover: 0 0% 50.2%;
940
+ /* semantic: icon/default/secondary (dark) ← palette: neutral-500 hex: #808080 (estimated) */
941
+ --icon-button-disabled: 0 0% 70.6%;
942
+ /* semantic: icon/default/disabled (dark) ← palette: neutral-300 hex: #b4b4b4 (estimated) */
943
+ --icon-button-danger-bg: 12.4 80.9% 36.5%;
944
+ /* semantic: icon/error/default (dark) ← palette: red-600 hex: #a82e12 (estimated) */
945
+ --icon-button-danger-hover: 14.1 85.5% 79.6%;
946
+ /* semantic: background/error/secondary (dark) ← palette: red-200 hex: #f5b5a0 (estimated) */
947
+ --icon-button-danger-disabled: 18 80% 96.1%;
948
+ /* semantic: background/error/tertiary (dark) ← palette: red-50 hex: #fdf1ec (estimated) */
949
+
950
+ /* ========================================
951
+ * SHADOW TOKENS
952
+ * ======================================== */
953
+
954
+ --shadow-sm: 0 0% 0% / 50%;
955
+ /* semantic: shadow/sm (dark) ← palette: black-50a hex: #00000080 */
956
+ --shadow-default: 0 0% 0% / 50%;
957
+ /* semantic: shadow/default (dark) ← palette: black-50a hex: #00000080 */
958
+ --shadow-lg: 0 0% 0% / 50%;
959
+ /* semantic: shadow/lg (dark) ← palette: black-50a hex: #00000080 */
960
+
961
+ /* ========================================
962
+ * CHART COLORS (no Figma dark mapping — estimated from nearby patterns)
963
+ * ======================================== */
964
+
965
+ --chart-1: 12 72.1% 56.5%;
966
+ /* semantic: chart/1 (dark) ← palette: red-400 (estimated) hex: #e06040 */
967
+ --chart-2: 150 21.1% 51.8%;
968
+ /* semantic: chart/2 (dark) ← palette: fern-500 (estimated) hex: #6a9e84 */
969
+ --chart-3: 210 13% 63.9%;
970
+ /* semantic: chart/3 (dark) ← palette: slate-400 (estimated) hex: #97a3af */
971
+ --chart-4: 29.6 100% 68.2%;
972
+ /* semantic: chart/4 (dark) ← palette: orange-400 (estimated) hex: #ffad5d */
973
+ --chart-5: 0 0% 23.1%;
974
+ /* semantic: chart/5 (dark) ← palette: gray-700 (estimated) hex: #3b3b3b */
975
+ }
976
+
977
+ @layer base {
978
+ * {
979
+ @apply border-border;
980
+ }
981
+
982
+ html,
983
+ body {
984
+ @apply bg-background text-foreground;
985
+ }
986
+ }