@mikenotthepope/substrateui 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,583 @@
1
+ /*
2
+ * SUBSTRATEUI — Design Token Stylesheet
3
+ * ======================================
4
+ *
5
+ * Import this file into your Tailwind CSS v4 pipeline:
6
+ * @import "tailwindcss";
7
+ * @import "tw-animate-css";
8
+ * @import "substrateui/styles.css";
9
+ * @source "../node_modules/substrateui";
10
+ *
11
+ * Architecture:
12
+ * 1. CSS variables in :root / .dark (the token values)
13
+ * 2. @theme inline (maps variables to Tailwind utilities)
14
+ * 3. Components reference utility classes — automatic dark mode
15
+ */
16
+
17
+ @custom-variant dark (&:is(.dark *));
18
+
19
+
20
+ /* ================================================================
21
+ LAYER 1: RAW PALETTE (OKLCH)
22
+ Never reference these in components directly.
23
+ ================================================================ */
24
+
25
+ :root {
26
+ /* ── Plum ── */
27
+ --raw-plum-50: oklch(0.975 0.009 314);
28
+ --raw-plum-100: oklch(0.937 0.024 313);
29
+ --raw-plum-200: oklch(0.871 0.049 313);
30
+ --raw-plum-300: oklch(0.772 0.086 314);
31
+ --raw-plum-400: oklch(0.657 0.129 314);
32
+ --raw-plum-500: oklch(0.556 0.150 314);
33
+ --raw-plum-600: oklch(0.480 0.145 314);
34
+ --raw-plum-700: oklch(0.417 0.127 315);
35
+ --raw-plum-800: oklch(0.350 0.105 314);
36
+ --raw-plum-900: oklch(0.290 0.084 314);
37
+ --raw-plum-950: oklch(0.226 0.066 312);
38
+
39
+ /* ── Amber (CVD-safe secondary) ── */
40
+ --raw-amber-50: oklch(0.987 0.021 95);
41
+ --raw-amber-100: oklch(0.962 0.058 96);
42
+ --raw-amber-200: oklch(0.924 0.115 96);
43
+ --raw-amber-300: oklch(0.879 0.153 92);
44
+ --raw-amber-400: oklch(0.837 0.164 84);
45
+ --raw-amber-500: oklch(0.711 0.147 78);
46
+ --raw-amber-600: oklch(0.631 0.130 77);
47
+ --raw-amber-700: oklch(0.518 0.106 77);
48
+ --raw-amber-800: oklch(0.435 0.088 78);
49
+
50
+ /* ── Warm Neutrals ── */
51
+ --raw-warm-white: oklch(0.994 0.003 85);
52
+ --raw-warm-50: oklch(0.980 0.003 67);
53
+ --raw-warm-100: oklch(0.954 0.007 68);
54
+ --raw-warm-200: oklch(0.909 0.011 77);
55
+ --raw-warm-300: oklch(0.840 0.016 74);
56
+ --raw-warm-400: oklch(0.710 0.015 68);
57
+ --raw-warm-500: oklch(0.570 0.015 71);
58
+ --raw-warm-600: oklch(0.457 0.012 68);
59
+ --raw-warm-700: oklch(0.359 0.010 74);
60
+ --raw-warm-800: oklch(0.275 0.009 75);
61
+ --raw-warm-850: oklch(0.236 0.006 78);
62
+ --raw-warm-900: oklch(0.211 0.005 68);
63
+ --raw-warm-950: oklch(0.170 0.004 48);
64
+
65
+ /* ── Status ── */
66
+ --raw-success: oklch(0.614 0.130 152);
67
+ --raw-warning: oklch(0.711 0.147 78);
68
+ --raw-error: oklch(0.570 0.180 25);
69
+
70
+ /* ── Forest (green base — demonstration alt theme) ── */
71
+ --raw-forest-50: oklch(0.975 0.018 155);
72
+ --raw-forest-100: oklch(0.935 0.038 155);
73
+ --raw-forest-200: oklch(0.865 0.068 155);
74
+ --raw-forest-300: oklch(0.765 0.105 155);
75
+ --raw-forest-400: oklch(0.655 0.135 155);
76
+ --raw-forest-500: oklch(0.555 0.150 155);
77
+ --raw-forest-600: oklch(0.465 0.145 155);
78
+ --raw-forest-700: oklch(0.385 0.120 155);
79
+ --raw-forest-800: oklch(0.305 0.090 155);
80
+ --raw-forest-900: oklch(0.225 0.060 155);
81
+ --raw-forest-950: oklch(0.150 0.040 155);
82
+
83
+ /* ── Terracotta (warm accent for forest theme) ── */
84
+ --raw-terracotta-50: oklch(0.975 0.018 40);
85
+ --raw-terracotta-100: oklch(0.935 0.040 40);
86
+ --raw-terracotta-200: oklch(0.865 0.075 40);
87
+ --raw-terracotta-300: oklch(0.765 0.115 40);
88
+ --raw-terracotta-400: oklch(0.680 0.145 40);
89
+ --raw-terracotta-500: oklch(0.600 0.165 40);
90
+ --raw-terracotta-600: oklch(0.520 0.155 40);
91
+ --raw-terracotta-700: oklch(0.440 0.125 40);
92
+ --raw-terracotta-800: oklch(0.360 0.098 40);
93
+ --raw-terracotta-900: oklch(0.280 0.070 40);
94
+ --raw-terracotta-950: oklch(0.200 0.050 40);
95
+ }
96
+
97
+
98
+ /* ================================================================
99
+ LAYER 2: SEMANTIC TOKENS — LIGHT MODE
100
+
101
+ Shadcn-expected names: --background, --foreground, --primary, etc.
102
+ SubstrateUI extended names: --surface-*, --border-*, --status-*, etc.
103
+
104
+ Dark mode (.dark) redefines ONLY this layer.
105
+ ================================================================ */
106
+
107
+ :root {
108
+ --radius: 0.625rem;
109
+
110
+ /* ── Shadcn core tokens ── */
111
+ --background: var(--raw-warm-50);
112
+ --foreground: var(--raw-warm-900);
113
+ --card: var(--raw-warm-white);
114
+ --card-foreground: var(--raw-warm-900);
115
+ --popover: var(--raw-warm-white);
116
+ --popover-foreground: var(--raw-warm-900);
117
+ --primary: var(--raw-plum-600);
118
+ --primary-foreground: oklch(1 0 0);
119
+ --secondary: var(--raw-warm-100);
120
+ --secondary-foreground: var(--raw-warm-900);
121
+ --muted: var(--raw-warm-100);
122
+ --muted-foreground: var(--raw-warm-600);
123
+ --accent: var(--raw-plum-100);
124
+ --accent-foreground: var(--raw-plum-700);
125
+ --destructive: var(--raw-error);
126
+ --border: var(--raw-warm-500);
127
+ --input: var(--raw-warm-500);
128
+ --ring: var(--raw-plum-500);
129
+
130
+ /* ── Chart colors ── */
131
+ --chart-1: var(--raw-plum-600);
132
+ --chart-2: var(--raw-amber-500);
133
+ --chart-3: var(--raw-plum-400);
134
+ --chart-4: var(--raw-amber-300);
135
+ --chart-5: var(--raw-plum-200);
136
+
137
+ /* ── Sidebar ── */
138
+ --sidebar: var(--raw-warm-white);
139
+ --sidebar-foreground: var(--raw-warm-900);
140
+ --sidebar-primary: var(--raw-plum-600);
141
+ --sidebar-primary-foreground: oklch(1 0 0);
142
+ --sidebar-accent: var(--raw-plum-100);
143
+ --sidebar-accent-foreground: var(--raw-plum-700);
144
+ --sidebar-border: var(--raw-warm-200);
145
+ --sidebar-ring: var(--raw-plum-500);
146
+
147
+ /* ── SubstrateUI extended: Surfaces ── */
148
+ --surface-ground: var(--raw-warm-50);
149
+ --surface-page: var(--raw-warm-white);
150
+ --surface-raised: var(--raw-warm-white);
151
+ --surface-sunken: var(--raw-warm-100);
152
+ --surface-interactive: var(--raw-warm-100);
153
+ --surface-interactive-hover: var(--raw-warm-200);
154
+
155
+ /* ── SubstrateUI extended: Borders ── */
156
+ --border-default: var(--raw-warm-500);
157
+ --border-strong: var(--raw-warm-700);
158
+ --border-subtle: var(--raw-warm-200);
159
+ --border-accent: var(--raw-plum-500);
160
+
161
+ /* ── SubstrateUI extended: Accent fills ── */
162
+ --accent-fill: var(--raw-plum-600);
163
+ --accent-fill-hover: var(--raw-plum-700);
164
+ --accent-surface: var(--raw-plum-100);
165
+
166
+ /* ── SubstrateUI extended: Secondary (amber) ── */
167
+ --secondary-fill: var(--raw-amber-500);
168
+ --secondary-fill-hover: var(--raw-amber-600);
169
+ --secondary-surface: var(--raw-amber-100);
170
+ --secondary-text: var(--raw-amber-700);
171
+
172
+ /* ── SubstrateUI extended: Status (always pair with icons!) ── */
173
+ --status-success: var(--raw-success);
174
+ --status-success-surface: oklch(0.92 0.05 152);
175
+ --status-success-text: oklch(0.45 0.10 152);
176
+ --status-warning: var(--raw-warning);
177
+ --status-warning-surface: var(--raw-amber-100);
178
+ --status-warning-text: oklch(0.45 0.09 78);
179
+ --status-error: var(--raw-error);
180
+ --status-error-surface: oklch(0.93 0.04 25);
181
+ --status-error-text: oklch(0.45 0.14 25);
182
+
183
+ /* ── SubstrateUI structural (shared across modes) ── */
184
+ --border-width: 2px;
185
+ --press-depth: 1.5px;
186
+ }
187
+
188
+
189
+ /* ── DARK MODE ── */
190
+
191
+ .dark {
192
+ /* ── Shadcn core ── */
193
+ --background: var(--raw-warm-950);
194
+ --foreground: var(--raw-warm-100);
195
+ --card: var(--raw-warm-850);
196
+ --card-foreground: var(--raw-warm-100);
197
+ --popover: var(--raw-warm-800);
198
+ --popover-foreground: var(--raw-warm-100);
199
+ --primary: var(--raw-plum-500);
200
+ --primary-foreground: oklch(1 0 0);
201
+ --secondary: var(--raw-warm-800);
202
+ --secondary-foreground: var(--raw-warm-100);
203
+ --muted: var(--raw-warm-800);
204
+ --muted-foreground: var(--raw-warm-400);
205
+ --accent: oklch(0.556 0.150 314 / 0.15);
206
+ --accent-foreground: var(--raw-plum-300);
207
+ --destructive: oklch(0.58 0.18 25);
208
+ --border: var(--raw-warm-400);
209
+ --input: var(--raw-warm-400);
210
+ --ring: var(--raw-plum-400);
211
+
212
+ /* ── Chart ── */
213
+ --chart-1: var(--raw-plum-400);
214
+ --chart-2: var(--raw-amber-400);
215
+ --chart-3: var(--raw-plum-300);
216
+ --chart-4: var(--raw-amber-300);
217
+ --chart-5: var(--raw-plum-600);
218
+
219
+ /* ── Sidebar ── */
220
+ --sidebar: var(--raw-warm-900);
221
+ --sidebar-foreground: var(--raw-warm-100);
222
+ --sidebar-primary: var(--raw-plum-500);
223
+ --sidebar-primary-foreground: oklch(1 0 0);
224
+ --sidebar-accent: oklch(0.556 0.150 314 / 0.15);
225
+ --sidebar-accent-foreground: var(--raw-plum-300);
226
+ --sidebar-border: var(--raw-warm-700);
227
+ --sidebar-ring: var(--raw-plum-400);
228
+
229
+ /* ── SubstrateUI extended: Surfaces ── */
230
+ --surface-ground: var(--raw-warm-950);
231
+ --surface-page: var(--raw-warm-900);
232
+ --surface-raised: var(--raw-warm-850);
233
+ --surface-sunken: var(--raw-warm-950);
234
+ --surface-interactive: var(--raw-warm-800);
235
+ --surface-interactive-hover: var(--raw-warm-700);
236
+
237
+ /* ── SubstrateUI extended: Borders ── */
238
+ --border-default: var(--raw-warm-400);
239
+ --border-strong: var(--raw-warm-400);
240
+ --border-subtle: var(--raw-warm-800);
241
+ --border-accent: var(--raw-plum-400);
242
+
243
+ /* ── SubstrateUI extended: Accent fills ── */
244
+ --accent-fill: var(--raw-plum-500);
245
+ --accent-fill-hover: var(--raw-plum-400);
246
+ --accent-surface: oklch(0.556 0.150 314 / 0.15);
247
+
248
+ /* ── SubstrateUI extended: Secondary (amber) ── */
249
+ --secondary-fill: var(--raw-amber-400);
250
+ --secondary-fill-hover: var(--raw-amber-300);
251
+ --secondary-surface: oklch(0.837 0.164 84 / 0.12);
252
+ --secondary-text: var(--raw-amber-300);
253
+
254
+ /* ── SubstrateUI extended: Status ── */
255
+ --status-success: oklch(0.70 0.13 152);
256
+ --status-success-surface: oklch(0.614 0.130 152 / 0.15);
257
+ --status-success-text: oklch(0.75 0.10 152);
258
+ --status-warning: var(--raw-amber-400);
259
+ --status-warning-surface: oklch(0.711 0.147 78 / 0.15);
260
+ --status-warning-text: var(--raw-amber-300);
261
+ --status-error: oklch(0.65 0.18 25);
262
+ --status-error-surface: oklch(0.570 0.180 25 / 0.15);
263
+ --status-error-text: oklch(0.75 0.12 25);
264
+ }
265
+
266
+
267
+ /* ================================================================
268
+ LAYER 2b: ALT THEME — FOREST
269
+
270
+ Attached via [data-theme="forest"] on <html>. Mirrors every
271
+ semantic token from :root / .dark, remapped to the forest +
272
+ terracotta palettes. Orthogonal to light/dark — the .dark class
273
+ still toggles modes within the forest theme.
274
+ ================================================================ */
275
+
276
+ [data-theme="forest"] {
277
+ /* ── Shadcn core tokens ── */
278
+ --background: var(--raw-forest-50);
279
+ --foreground: var(--raw-forest-900);
280
+ --card: oklch(0.992 0.006 155);
281
+ --card-foreground: var(--raw-forest-900);
282
+ --popover: oklch(0.992 0.006 155);
283
+ --popover-foreground: var(--raw-forest-900);
284
+ --primary: var(--raw-forest-600);
285
+ --primary-foreground: oklch(1 0 0);
286
+ --secondary: var(--raw-forest-100);
287
+ --secondary-foreground: var(--raw-forest-900);
288
+ --muted: var(--raw-forest-100);
289
+ --muted-foreground: var(--raw-forest-700);
290
+ --accent: var(--raw-terracotta-100);
291
+ --accent-foreground: var(--raw-terracotta-800);
292
+ --destructive: var(--raw-error);
293
+ --border: var(--raw-forest-500);
294
+ --input: var(--raw-forest-500);
295
+ --ring: var(--raw-forest-500);
296
+
297
+ /* ── Chart colors ── */
298
+ --chart-1: var(--raw-forest-600);
299
+ --chart-2: var(--raw-terracotta-500);
300
+ --chart-3: var(--raw-forest-400);
301
+ --chart-4: var(--raw-terracotta-300);
302
+ --chart-5: var(--raw-forest-200);
303
+
304
+ /* ── Sidebar ── */
305
+ --sidebar: oklch(0.992 0.006 155);
306
+ --sidebar-foreground: var(--raw-forest-900);
307
+ --sidebar-primary: var(--raw-forest-600);
308
+ --sidebar-primary-foreground: oklch(1 0 0);
309
+ --sidebar-accent: var(--raw-terracotta-100);
310
+ --sidebar-accent-foreground: var(--raw-terracotta-800);
311
+ --sidebar-border: var(--raw-forest-200);
312
+ --sidebar-ring: var(--raw-forest-500);
313
+
314
+ /* ── Surfaces ── */
315
+ --surface-ground: var(--raw-forest-50);
316
+ --surface-page: oklch(0.992 0.006 155);
317
+ --surface-raised: oklch(0.992 0.006 155);
318
+ --surface-sunken: var(--raw-forest-100);
319
+ --surface-interactive: var(--raw-forest-100);
320
+ --surface-interactive-hover: var(--raw-forest-200);
321
+
322
+ /* ── Borders ── */
323
+ --border-default: var(--raw-forest-500);
324
+ --border-strong: var(--raw-forest-700);
325
+ --border-subtle: var(--raw-forest-200);
326
+ --border-accent: var(--raw-forest-500);
327
+
328
+ /* ── Accent fills ── */
329
+ --accent-fill: var(--raw-forest-600);
330
+ --accent-fill-hover: var(--raw-forest-700);
331
+ --accent-surface: var(--raw-forest-100);
332
+
333
+ /* ── Secondary (terracotta) ── */
334
+ --secondary-fill: var(--raw-terracotta-500);
335
+ --secondary-fill-hover: var(--raw-terracotta-600);
336
+ --secondary-surface: var(--raw-terracotta-100);
337
+ --secondary-text: var(--raw-terracotta-700);
338
+
339
+ /* ── Status (shared across themes) ── */
340
+ --status-success: var(--raw-success);
341
+ --status-success-surface: oklch(0.92 0.05 152);
342
+ --status-success-text: oklch(0.45 0.10 152);
343
+ --status-warning: var(--raw-warning);
344
+ --status-warning-surface: var(--raw-terracotta-100);
345
+ --status-warning-text: oklch(0.45 0.09 78);
346
+ --status-error: var(--raw-error);
347
+ --status-error-surface: oklch(0.93 0.04 25);
348
+ --status-error-text: oklch(0.45 0.14 25);
349
+ }
350
+
351
+
352
+ [data-theme="forest"].dark {
353
+ /* ── Shadcn core ── */
354
+ --background: var(--raw-forest-950);
355
+ --foreground: var(--raw-forest-100);
356
+ --card: var(--raw-forest-900);
357
+ --card-foreground: var(--raw-forest-100);
358
+ --popover: var(--raw-forest-800);
359
+ --popover-foreground: var(--raw-forest-100);
360
+ --primary: var(--raw-forest-600);
361
+ --primary-foreground: oklch(1 0 0);
362
+ --secondary: var(--raw-forest-800);
363
+ --secondary-foreground: var(--raw-forest-100);
364
+ --muted: var(--raw-forest-800);
365
+ --muted-foreground: var(--raw-forest-300);
366
+ --accent: oklch(0.600 0.165 40 / 0.18);
367
+ --accent-foreground: var(--raw-terracotta-300);
368
+ --destructive: oklch(0.58 0.18 25);
369
+ --border: var(--raw-forest-400);
370
+ --input: var(--raw-forest-400);
371
+ --ring: var(--raw-forest-400);
372
+
373
+ /* ── Chart ── */
374
+ --chart-1: var(--raw-forest-400);
375
+ --chart-2: var(--raw-terracotta-400);
376
+ --chart-3: var(--raw-forest-300);
377
+ --chart-4: var(--raw-terracotta-300);
378
+ --chart-5: var(--raw-forest-600);
379
+
380
+ /* ── Sidebar ── */
381
+ --sidebar: var(--raw-forest-900);
382
+ --sidebar-foreground: var(--raw-forest-100);
383
+ --sidebar-primary: var(--raw-forest-600);
384
+ --sidebar-primary-foreground: oklch(1 0 0);
385
+ --sidebar-accent: oklch(0.600 0.165 40 / 0.18);
386
+ --sidebar-accent-foreground: var(--raw-terracotta-300);
387
+ --sidebar-border: var(--raw-forest-700);
388
+ --sidebar-ring: var(--raw-forest-400);
389
+
390
+ /* ── Surfaces ── */
391
+ --surface-ground: var(--raw-forest-950);
392
+ --surface-page: var(--raw-forest-900);
393
+ --surface-raised: var(--raw-forest-800);
394
+ --surface-sunken: var(--raw-forest-950);
395
+ --surface-interactive: var(--raw-forest-800);
396
+ --surface-interactive-hover: var(--raw-forest-700);
397
+
398
+ /* ── Borders ── */
399
+ --border-default: var(--raw-forest-400);
400
+ --border-strong: var(--raw-forest-300);
401
+ --border-subtle: var(--raw-forest-800);
402
+ --border-accent: var(--raw-forest-400);
403
+
404
+ /* ── Accent fills ── */
405
+ --accent-fill: var(--raw-forest-500);
406
+ --accent-fill-hover: var(--raw-forest-400);
407
+ --accent-surface: oklch(0.600 0.165 40 / 0.18);
408
+
409
+ /* ── Secondary (terracotta) ── */
410
+ --secondary-fill: var(--raw-terracotta-400);
411
+ --secondary-fill-hover: var(--raw-terracotta-300);
412
+ --secondary-surface: oklch(0.680 0.145 40 / 0.15);
413
+ --secondary-text: var(--raw-terracotta-300);
414
+
415
+ /* ── Status ── */
416
+ --status-success: oklch(0.70 0.13 152);
417
+ --status-success-surface: oklch(0.614 0.130 152 / 0.15);
418
+ --status-success-text: oklch(0.75 0.10 152);
419
+ --status-warning: var(--raw-terracotta-400);
420
+ --status-warning-surface: oklch(0.600 0.165 40 / 0.18);
421
+ --status-warning-text: var(--raw-terracotta-300);
422
+ --status-error: oklch(0.65 0.18 25);
423
+ --status-error-surface: oklch(0.570 0.180 25 / 0.15);
424
+ --status-error-text: oklch(0.75 0.12 25);
425
+ }
426
+
427
+
428
+ /* ================================================================
429
+ @theme inline — MAPS VARIABLES TO TAILWIND UTILITIES
430
+
431
+ This replaces tailwind.config.ts entirely.
432
+ After this block, bg-primary, text-foreground, etc. all work.
433
+ ================================================================ */
434
+
435
+ @theme inline {
436
+ /* ── Shadcn core (required for components to work) ── */
437
+ --radius: 0.625rem;
438
+ --color-background: var(--background);
439
+ --color-foreground: var(--foreground);
440
+ --color-card: var(--card);
441
+ --color-card-foreground: var(--card-foreground);
442
+ --color-popover: var(--popover);
443
+ --color-popover-foreground: var(--popover-foreground);
444
+ --color-primary: var(--primary);
445
+ --color-primary-foreground: var(--primary-foreground);
446
+ --color-secondary: var(--secondary);
447
+ --color-secondary-foreground: var(--secondary-foreground);
448
+ --color-muted: var(--muted);
449
+ --color-muted-foreground: var(--muted-foreground);
450
+ --color-accent: var(--accent);
451
+ --color-accent-foreground: var(--accent-foreground);
452
+ --color-destructive: var(--destructive);
453
+ --color-border: var(--border);
454
+ --color-input: var(--input);
455
+ --color-ring: var(--ring);
456
+ --color-chart-1: var(--chart-1);
457
+ --color-chart-2: var(--chart-2);
458
+ --color-chart-3: var(--chart-3);
459
+ --color-chart-4: var(--chart-4);
460
+ --color-chart-5: var(--chart-5);
461
+
462
+ /* ── Sidebar ── */
463
+ --color-sidebar: var(--sidebar);
464
+ --color-sidebar-foreground: var(--sidebar-foreground);
465
+ --color-sidebar-primary: var(--sidebar-primary);
466
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
467
+ --color-sidebar-accent: var(--sidebar-accent);
468
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
469
+ --color-sidebar-border: var(--sidebar-border);
470
+ --color-sidebar-ring: var(--sidebar-ring);
471
+
472
+ /* ── SubstrateUI: Raw palette (for one-off use: bg-plum-600) ── */
473
+ --color-plum-50: var(--raw-plum-50);
474
+ --color-plum-100: var(--raw-plum-100);
475
+ --color-plum-200: var(--raw-plum-200);
476
+ --color-plum-300: var(--raw-plum-300);
477
+ --color-plum-400: var(--raw-plum-400);
478
+ --color-plum-500: var(--raw-plum-500);
479
+ --color-plum-600: var(--raw-plum-600);
480
+ --color-plum-700: var(--raw-plum-700);
481
+ --color-plum-800: var(--raw-plum-800);
482
+ --color-plum-900: var(--raw-plum-900);
483
+ --color-plum-950: var(--raw-plum-950);
484
+
485
+ --color-amber-50: var(--raw-amber-50);
486
+ --color-amber-100: var(--raw-amber-100);
487
+ --color-amber-200: var(--raw-amber-200);
488
+ --color-amber-300: var(--raw-amber-300);
489
+ --color-amber-400: var(--raw-amber-400);
490
+ --color-amber-500: var(--raw-amber-500);
491
+ --color-amber-600: var(--raw-amber-600);
492
+ --color-amber-700: var(--raw-amber-700);
493
+ --color-amber-800: var(--raw-amber-800);
494
+
495
+ --color-warm-50: var(--raw-warm-50);
496
+ --color-warm-100: var(--raw-warm-100);
497
+ --color-warm-200: var(--raw-warm-200);
498
+ --color-warm-300: var(--raw-warm-300);
499
+ --color-warm-400: var(--raw-warm-400);
500
+ --color-warm-500: var(--raw-warm-500);
501
+ --color-warm-600: var(--raw-warm-600);
502
+ --color-warm-700: var(--raw-warm-700);
503
+ --color-warm-800: var(--raw-warm-800);
504
+ --color-warm-900: var(--raw-warm-900);
505
+ --color-warm-950: var(--raw-warm-950);
506
+
507
+ /* ── SubstrateUI: Semantic surfaces ── */
508
+ --color-surface-ground: var(--surface-ground);
509
+ --color-surface-page: var(--surface-page);
510
+ --color-surface-raised: var(--surface-raised);
511
+ --color-surface-sunken: var(--surface-sunken);
512
+ --color-surface-interactive: var(--surface-interactive);
513
+ --color-surface-interactive-hover: var(--surface-interactive-hover);
514
+
515
+ /* ── SubstrateUI: Status ── */
516
+ --color-status-success: var(--status-success);
517
+ --color-status-success-surface: var(--status-success-surface);
518
+ --color-status-success-text: var(--status-success-text);
519
+ --color-status-warning: var(--status-warning);
520
+ --color-status-warning-surface: var(--status-warning-surface);
521
+ --color-status-warning-text: var(--status-warning-text);
522
+ --color-status-error: var(--status-error);
523
+ --color-status-error-surface: var(--status-error-surface);
524
+ --color-status-error-text: var(--status-error-text);
525
+
526
+ /* ── Typography ── */
527
+ --font-sans: "DM Sans", system-ui, sans-serif;
528
+ --font-mono: "DM Mono", "SF Mono", monospace;
529
+ }
530
+
531
+
532
+ /* ================================================================
533
+ BASE STYLES
534
+ ================================================================ */
535
+
536
+ * {
537
+ border-color: var(--border);
538
+ }
539
+
540
+ @keyframes sui-spin {
541
+ to { transform: rotate(360deg); }
542
+ }
543
+ [data-slot="spinner"] {
544
+ animation: sui-spin 1s linear infinite;
545
+ border-color: var(--border);
546
+ border-top-color: var(--primary);
547
+ }
548
+
549
+ body {
550
+ background-color: var(--background);
551
+ color: var(--foreground);
552
+ font-family: var(--font-sans);
553
+ -webkit-font-smoothing: antialiased;
554
+ -moz-osx-font-smoothing: grayscale;
555
+ }
556
+
557
+
558
+ /* ── Layout utilities ── */
559
+ .grid-auto-fill {
560
+ grid-template-columns: repeat(auto-fill, minmax(var(--grid-min, 280px), 1fr));
561
+ }
562
+ .grid-auto-fit {
563
+ grid-template-columns: repeat(auto-fit, minmax(var(--grid-min, 280px), 1fr));
564
+ }
565
+
566
+
567
+ /* ================================================================
568
+ REDUCED MOTION
569
+
570
+ Respects prefers-reduced-motion: reduce for users with
571
+ vestibular disorders or motion sensitivity.
572
+ ================================================================ */
573
+
574
+ @media (prefers-reduced-motion: reduce) {
575
+ *,
576
+ *::before,
577
+ *::after {
578
+ animation-duration: 0.01ms !important;
579
+ animation-iteration-count: 1 !important;
580
+ transition-duration: 0.01ms !important;
581
+ scroll-behavior: auto !important;
582
+ }
583
+ }
@@ -0,0 +1,18 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import * as TabsPrimitive from '@radix-ui/react-tabs';
4
+
5
+ /** Root container for a tabbed interface built on Radix Tabs.
6
+ *
7
+ * @example
8
+ * <Tabs defaultValue="tab1"><TabsList><TabsTrigger value="tab1">Tab</TabsTrigger></TabsList><TabsContent value="tab1">Content</TabsContent></Tabs>
9
+ */
10
+ declare const Tabs: React.ForwardRefExoticComponent<TabsPrimitive.TabsProps & React.RefAttributes<HTMLDivElement>>;
11
+ /** Horizontal container for tab triggers with a sunken background. */
12
+ declare function TabsList({ className, ref, ...props }: React.ComponentPropsWithRef<typeof TabsPrimitive.List>): react_jsx_runtime.JSX.Element;
13
+ /** Individual tab button that activates its associated content panel. */
14
+ declare function TabsTrigger({ className, ref, ...props }: React.ComponentPropsWithRef<typeof TabsPrimitive.Trigger>): react_jsx_runtime.JSX.Element;
15
+ /** Content panel displayed when its matching tab trigger is active. */
16
+ declare function TabsContent({ className, ref, ...props }: React.ComponentPropsWithRef<typeof TabsPrimitive.Content>): react_jsx_runtime.JSX.Element;
17
+
18
+ export { Tabs as T, TabsContent as a, TabsList as b, TabsTrigger as c };
@@ -0,0 +1,5 @@
1
+ import { ClassValue } from 'clsx';
2
+
3
+ declare function cn(...inputs: ClassValue[]): string;
4
+
5
+ export { cn };
package/dist/utils.js ADDED
@@ -0,0 +1,4 @@
1
+ "use client";
2
+ export { cn } from './chunk-IQWAGBDM.js';
3
+ //# sourceMappingURL=utils.js.map
4
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"utils.js"}