@mikenotthepope/substrateui 0.1.2 → 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.
@@ -0,0 +1,396 @@
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
+
71
+
72
+ /* ================================================================
73
+ LAYER 2: SEMANTIC TOKENS — LIGHT MODE
74
+
75
+ Shadcn-expected names: --background, --foreground, --primary, etc.
76
+ SubstrateUI extended names: --surface-*, --border-*, --status-*, etc.
77
+
78
+ Dark mode (.dark) redefines ONLY this layer.
79
+ ================================================================ */
80
+
81
+ :root {
82
+ --radius: 0.625rem;
83
+
84
+ /* ── Shadcn core tokens ── */
85
+ --background: var(--raw-warm-50);
86
+ --foreground: var(--raw-warm-900);
87
+ --card: var(--raw-warm-white);
88
+ --card-foreground: var(--raw-warm-900);
89
+ --popover: var(--raw-warm-white);
90
+ --popover-foreground: var(--raw-warm-900);
91
+ --primary: var(--raw-plum-600);
92
+ --primary-foreground: oklch(1 0 0);
93
+ --secondary: var(--raw-warm-100);
94
+ --secondary-foreground: var(--raw-warm-900);
95
+ --muted: var(--raw-warm-100);
96
+ --muted-foreground: var(--raw-warm-600);
97
+ --accent: var(--raw-plum-100);
98
+ --accent-foreground: var(--raw-plum-700);
99
+ --destructive: var(--raw-error);
100
+ --border: var(--raw-warm-500);
101
+ --input: var(--raw-warm-500);
102
+ --ring: var(--raw-plum-500);
103
+
104
+ /* ── Chart colors ── */
105
+ --chart-1: var(--raw-plum-600);
106
+ --chart-2: var(--raw-amber-500);
107
+ --chart-3: var(--raw-plum-400);
108
+ --chart-4: var(--raw-amber-300);
109
+ --chart-5: var(--raw-plum-200);
110
+
111
+ /* ── Sidebar ── */
112
+ --sidebar: var(--raw-warm-white);
113
+ --sidebar-foreground: var(--raw-warm-900);
114
+ --sidebar-primary: var(--raw-plum-600);
115
+ --sidebar-primary-foreground: oklch(1 0 0);
116
+ --sidebar-accent: var(--raw-plum-100);
117
+ --sidebar-accent-foreground: var(--raw-plum-700);
118
+ --sidebar-border: var(--raw-warm-200);
119
+ --sidebar-ring: var(--raw-plum-500);
120
+
121
+ /* ── SubstrateUI extended: Surfaces ── */
122
+ --surface-ground: var(--raw-warm-50);
123
+ --surface-page: var(--raw-warm-white);
124
+ --surface-raised: var(--raw-warm-white);
125
+ --surface-sunken: var(--raw-warm-100);
126
+ --surface-interactive: var(--raw-warm-100);
127
+ --surface-interactive-hover: var(--raw-warm-200);
128
+
129
+ /* ── SubstrateUI extended: Borders ── */
130
+ --border-default: var(--raw-warm-500);
131
+ --border-strong: var(--raw-warm-700);
132
+ --border-subtle: var(--raw-warm-200);
133
+ --border-accent: var(--raw-plum-500);
134
+
135
+ /* ── SubstrateUI extended: Accent fills ── */
136
+ --accent-fill: var(--raw-plum-600);
137
+ --accent-fill-hover: var(--raw-plum-700);
138
+ --accent-surface: var(--raw-plum-100);
139
+
140
+ /* ── SubstrateUI extended: Secondary (amber) ── */
141
+ --secondary-fill: var(--raw-amber-500);
142
+ --secondary-fill-hover: var(--raw-amber-600);
143
+ --secondary-surface: var(--raw-amber-100);
144
+ --secondary-text: var(--raw-amber-700);
145
+
146
+ /* ── SubstrateUI extended: Status (always pair with icons!) ── */
147
+ --status-success: var(--raw-success);
148
+ --status-success-surface: oklch(0.92 0.05 152);
149
+ --status-success-text: oklch(0.45 0.10 152);
150
+ --status-warning: var(--raw-warning);
151
+ --status-warning-surface: var(--raw-amber-100);
152
+ --status-warning-text: oklch(0.45 0.09 78);
153
+ --status-error: var(--raw-error);
154
+ --status-error-surface: oklch(0.93 0.04 25);
155
+ --status-error-text: oklch(0.45 0.14 25);
156
+
157
+ /* ── SubstrateUI structural (shared across modes) ── */
158
+ --border-width: 2px;
159
+ --press-depth: 1.5px;
160
+ }
161
+
162
+
163
+ /* ── DARK MODE ── */
164
+
165
+ .dark {
166
+ /* ── Shadcn core ── */
167
+ --background: var(--raw-warm-950);
168
+ --foreground: var(--raw-warm-100);
169
+ --card: var(--raw-warm-850);
170
+ --card-foreground: var(--raw-warm-100);
171
+ --popover: var(--raw-warm-800);
172
+ --popover-foreground: var(--raw-warm-100);
173
+ --primary: var(--raw-plum-500);
174
+ --primary-foreground: oklch(1 0 0);
175
+ --secondary: var(--raw-warm-800);
176
+ --secondary-foreground: var(--raw-warm-100);
177
+ --muted: var(--raw-warm-800);
178
+ --muted-foreground: var(--raw-warm-400);
179
+ --accent: oklch(0.556 0.150 314 / 0.15);
180
+ --accent-foreground: var(--raw-plum-300);
181
+ --destructive: oklch(0.58 0.18 25);
182
+ --border: var(--raw-warm-400);
183
+ --input: var(--raw-warm-400);
184
+ --ring: var(--raw-plum-400);
185
+
186
+ /* ── Chart ── */
187
+ --chart-1: var(--raw-plum-400);
188
+ --chart-2: var(--raw-amber-400);
189
+ --chart-3: var(--raw-plum-300);
190
+ --chart-4: var(--raw-amber-300);
191
+ --chart-5: var(--raw-plum-600);
192
+
193
+ /* ── Sidebar ── */
194
+ --sidebar: var(--raw-warm-900);
195
+ --sidebar-foreground: var(--raw-warm-100);
196
+ --sidebar-primary: var(--raw-plum-500);
197
+ --sidebar-primary-foreground: oklch(1 0 0);
198
+ --sidebar-accent: oklch(0.556 0.150 314 / 0.15);
199
+ --sidebar-accent-foreground: var(--raw-plum-300);
200
+ --sidebar-border: var(--raw-warm-700);
201
+ --sidebar-ring: var(--raw-plum-400);
202
+
203
+ /* ── SubstrateUI extended: Surfaces ── */
204
+ --surface-ground: var(--raw-warm-950);
205
+ --surface-page: var(--raw-warm-900);
206
+ --surface-raised: var(--raw-warm-850);
207
+ --surface-sunken: var(--raw-warm-950);
208
+ --surface-interactive: var(--raw-warm-800);
209
+ --surface-interactive-hover: var(--raw-warm-700);
210
+
211
+ /* ── SubstrateUI extended: Borders ── */
212
+ --border-default: var(--raw-warm-400);
213
+ --border-strong: var(--raw-warm-400);
214
+ --border-subtle: var(--raw-warm-800);
215
+ --border-accent: var(--raw-plum-400);
216
+
217
+ /* ── SubstrateUI extended: Accent fills ── */
218
+ --accent-fill: var(--raw-plum-500);
219
+ --accent-fill-hover: var(--raw-plum-400);
220
+ --accent-surface: oklch(0.556 0.150 314 / 0.15);
221
+
222
+ /* ── SubstrateUI extended: Secondary (amber) ── */
223
+ --secondary-fill: var(--raw-amber-400);
224
+ --secondary-fill-hover: var(--raw-amber-300);
225
+ --secondary-surface: oklch(0.837 0.164 84 / 0.12);
226
+ --secondary-text: var(--raw-amber-300);
227
+
228
+ /* ── SubstrateUI extended: Status ── */
229
+ --status-success: oklch(0.70 0.13 152);
230
+ --status-success-surface: oklch(0.614 0.130 152 / 0.15);
231
+ --status-success-text: oklch(0.75 0.10 152);
232
+ --status-warning: var(--raw-amber-400);
233
+ --status-warning-surface: oklch(0.711 0.147 78 / 0.15);
234
+ --status-warning-text: var(--raw-amber-300);
235
+ --status-error: oklch(0.65 0.18 25);
236
+ --status-error-surface: oklch(0.570 0.180 25 / 0.15);
237
+ --status-error-text: oklch(0.75 0.12 25);
238
+ }
239
+
240
+
241
+ /* ================================================================
242
+ @theme inline — MAPS VARIABLES TO TAILWIND UTILITIES
243
+
244
+ This replaces tailwind.config.ts entirely.
245
+ After this block, bg-primary, text-foreground, etc. all work.
246
+ ================================================================ */
247
+
248
+ @theme inline {
249
+ /* ── Shadcn core (required for components to work) ── */
250
+ --radius: 0.625rem;
251
+ --color-background: var(--background);
252
+ --color-foreground: var(--foreground);
253
+ --color-card: var(--card);
254
+ --color-card-foreground: var(--card-foreground);
255
+ --color-popover: var(--popover);
256
+ --color-popover-foreground: var(--popover-foreground);
257
+ --color-primary: var(--primary);
258
+ --color-primary-foreground: var(--primary-foreground);
259
+ --color-secondary: var(--secondary);
260
+ --color-secondary-foreground: var(--secondary-foreground);
261
+ --color-muted: var(--muted);
262
+ --color-muted-foreground: var(--muted-foreground);
263
+ --color-accent: var(--accent);
264
+ --color-accent-foreground: var(--accent-foreground);
265
+ --color-destructive: var(--destructive);
266
+ --color-border: var(--border);
267
+ --color-input: var(--input);
268
+ --color-ring: var(--ring);
269
+ --color-chart-1: var(--chart-1);
270
+ --color-chart-2: var(--chart-2);
271
+ --color-chart-3: var(--chart-3);
272
+ --color-chart-4: var(--chart-4);
273
+ --color-chart-5: var(--chart-5);
274
+
275
+ /* ── Sidebar ── */
276
+ --color-sidebar: var(--sidebar);
277
+ --color-sidebar-foreground: var(--sidebar-foreground);
278
+ --color-sidebar-primary: var(--sidebar-primary);
279
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
280
+ --color-sidebar-accent: var(--sidebar-accent);
281
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
282
+ --color-sidebar-border: var(--sidebar-border);
283
+ --color-sidebar-ring: var(--sidebar-ring);
284
+
285
+ /* ── SubstrateUI: Raw palette (for one-off use: bg-plum-600) ── */
286
+ --color-plum-50: var(--raw-plum-50);
287
+ --color-plum-100: var(--raw-plum-100);
288
+ --color-plum-200: var(--raw-plum-200);
289
+ --color-plum-300: var(--raw-plum-300);
290
+ --color-plum-400: var(--raw-plum-400);
291
+ --color-plum-500: var(--raw-plum-500);
292
+ --color-plum-600: var(--raw-plum-600);
293
+ --color-plum-700: var(--raw-plum-700);
294
+ --color-plum-800: var(--raw-plum-800);
295
+ --color-plum-900: var(--raw-plum-900);
296
+ --color-plum-950: var(--raw-plum-950);
297
+
298
+ --color-amber-50: var(--raw-amber-50);
299
+ --color-amber-100: var(--raw-amber-100);
300
+ --color-amber-200: var(--raw-amber-200);
301
+ --color-amber-300: var(--raw-amber-300);
302
+ --color-amber-400: var(--raw-amber-400);
303
+ --color-amber-500: var(--raw-amber-500);
304
+ --color-amber-600: var(--raw-amber-600);
305
+ --color-amber-700: var(--raw-amber-700);
306
+ --color-amber-800: var(--raw-amber-800);
307
+
308
+ --color-warm-50: var(--raw-warm-50);
309
+ --color-warm-100: var(--raw-warm-100);
310
+ --color-warm-200: var(--raw-warm-200);
311
+ --color-warm-300: var(--raw-warm-300);
312
+ --color-warm-400: var(--raw-warm-400);
313
+ --color-warm-500: var(--raw-warm-500);
314
+ --color-warm-600: var(--raw-warm-600);
315
+ --color-warm-700: var(--raw-warm-700);
316
+ --color-warm-800: var(--raw-warm-800);
317
+ --color-warm-900: var(--raw-warm-900);
318
+ --color-warm-950: var(--raw-warm-950);
319
+
320
+ /* ── SubstrateUI: Semantic surfaces ── */
321
+ --color-surface-ground: var(--surface-ground);
322
+ --color-surface-page: var(--surface-page);
323
+ --color-surface-raised: var(--surface-raised);
324
+ --color-surface-sunken: var(--surface-sunken);
325
+ --color-surface-interactive: var(--surface-interactive);
326
+ --color-surface-interactive-hover: var(--surface-interactive-hover);
327
+
328
+ /* ── SubstrateUI: Status ── */
329
+ --color-status-success: var(--status-success);
330
+ --color-status-success-surface: var(--status-success-surface);
331
+ --color-status-success-text: var(--status-success-text);
332
+ --color-status-warning: var(--status-warning);
333
+ --color-status-warning-surface: var(--status-warning-surface);
334
+ --color-status-warning-text: var(--status-warning-text);
335
+ --color-status-error: var(--status-error);
336
+ --color-status-error-surface: var(--status-error-surface);
337
+ --color-status-error-text: var(--status-error-text);
338
+
339
+ /* ── Typography ── */
340
+ --font-sans: "DM Sans", system-ui, sans-serif;
341
+ --font-mono: "DM Mono", "SF Mono", monospace;
342
+ }
343
+
344
+
345
+ /* ================================================================
346
+ BASE STYLES
347
+ ================================================================ */
348
+
349
+ * {
350
+ border-color: var(--border);
351
+ }
352
+
353
+ @keyframes sui-spin {
354
+ to { transform: rotate(360deg); }
355
+ }
356
+ [data-slot="spinner"] {
357
+ animation: sui-spin 1s linear infinite;
358
+ border-color: var(--border);
359
+ border-top-color: var(--primary);
360
+ }
361
+
362
+ body {
363
+ background-color: var(--background);
364
+ color: var(--foreground);
365
+ font-family: var(--font-sans);
366
+ -webkit-font-smoothing: antialiased;
367
+ -moz-osx-font-smoothing: grayscale;
368
+ }
369
+
370
+
371
+ /* ── Layout utilities ── */
372
+ .grid-auto-fill {
373
+ grid-template-columns: repeat(auto-fill, minmax(var(--grid-min, 280px), 1fr));
374
+ }
375
+ .grid-auto-fit {
376
+ grid-template-columns: repeat(auto-fit, minmax(var(--grid-min, 280px), 1fr));
377
+ }
378
+
379
+
380
+ /* ================================================================
381
+ REDUCED MOTION
382
+
383
+ Respects prefers-reduced-motion: reduce for users with
384
+ vestibular disorders or motion sensitivity.
385
+ ================================================================ */
386
+
387
+ @media (prefers-reduced-motion: reduce) {
388
+ *,
389
+ *::before,
390
+ *::after {
391
+ animation-duration: 0.01ms !important;
392
+ animation-iteration-count: 1 !important;
393
+ transition-duration: 0.01ms !important;
394
+ scroll-behavior: auto !important;
395
+ }
396
+ }
@@ -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"}
package/package.json CHANGED
@@ -1,82 +1,104 @@
1
1
  {
2
2
  "name": "@mikenotthepope/substrateui",
3
- "version": "0.1.2",
4
- "description": "A neobrutalist React component library with bold borders, hard shadows, and high contrast design.",
3
+ "version": "0.2.0",
4
+ "description": "A chunky, OKLCH-powered design system for Next.js — built on Tailwind CSS v4, Radix UI, and Atomic Design principles.",
5
5
  "license": "MIT",
6
- "author": "mikenotthepope",
6
+ "author": "SubstrateUI",
7
7
  "repository": {
8
8
  "type": "git",
9
- "url": "git+https://github.com/MikeNotThePope/a8f3k2x9q7.git"
10
- },
11
- "homepage": "https://substrate-ui.vercel.app/",
12
- "bugs": {
13
- "url": "https://github.com/MikeNotThePope/a8f3k2x9q7/issues"
9
+ "url": "git+https://github.com/MikeNotThePope/substrateui.git"
14
10
  },
11
+ "homepage": "https://www.substrateui.dev/",
15
12
  "keywords": [
16
- "react",
17
- "components",
18
- "ui",
19
- "neobrutalism",
20
13
  "design-system",
14
+ "react",
15
+ "nextjs",
21
16
  "tailwindcss",
22
- "radix-ui"
17
+ "radix-ui",
18
+ "components",
19
+ "ui"
23
20
  ],
24
- "publishConfig": {
25
- "access": "public"
26
- },
21
+ "type": "module",
27
22
  "main": "./dist/index.js",
28
- "module": "./dist/index.mjs",
23
+ "module": "./dist/index.js",
29
24
  "types": "./dist/index.d.ts",
30
25
  "exports": {
31
26
  ".": {
32
- "import": {
33
- "types": "./dist/index.d.mts",
34
- "default": "./dist/index.mjs"
35
- },
36
- "require": {
37
- "types": "./dist/index.d.ts",
38
- "default": "./dist/index.js"
39
- }
27
+ "types": "./dist/index.d.ts",
28
+ "import": "./dist/index.js"
40
29
  },
41
- "./styles": "./base/substrate.css"
30
+ "./organisms": {
31
+ "types": "./dist/organisms.d.ts",
32
+ "import": "./dist/organisms.js"
33
+ },
34
+ "./utils": {
35
+ "types": "./dist/utils.d.ts",
36
+ "import": "./dist/utils.js"
37
+ },
38
+ "./styles.css": "./dist/styles.css"
42
39
  },
43
40
  "files": [
44
41
  "dist",
45
- "base"
42
+ "README.md",
43
+ "CHANGELOG.md",
44
+ "LICENSE"
46
45
  ],
47
46
  "sideEffects": [
48
47
  "**/*.css"
49
48
  ],
50
49
  "scripts": {
51
50
  "dev": "next dev",
52
- "build": "tsup",
53
- "build:demo": "next build",
51
+ "prebuild": "bun run build-storybook",
52
+ "build": "next build",
53
+ "prebuild:lib": "bun run audit:contrast && bun run audit:direction",
54
+ "build:lib": "tsup && cp src/styles/tokens.css dist/styles.css",
54
55
  "start": "next start",
55
56
  "lint": "eslint",
56
- "prepare": "tsup && sh scripts/check-hooks.sh",
57
- "setup:hooks": "git config core.hooksPath .githooks",
58
- "test": "vitest run",
59
- "test:coverage": "vitest run --coverage",
57
+ "audit:contrast": "tsx scripts/audit-contrast.ts",
58
+ "audit:direction": "tsx scripts/audit-direction.ts",
59
+ "audit:stories": "tsx scripts/audit-stories.ts",
60
+ "test": "NODE_OPTIONS='--throw-deprecation' vitest run",
60
61
  "test:watch": "vitest",
61
- "changeset": "changeset",
62
- "version": "changeset version",
63
- "storybook": "storybook dev -p 6006",
64
- "build-storybook": "storybook build",
62
+ "test:ui": "vitest --ui",
63
+ "test:coverage": "vitest run --coverage",
65
64
  "test:visual": "playwright test",
66
65
  "test:visual:update": "playwright test --update-snapshots",
67
- "prepublishOnly": "tsup",
66
+ "test:visual:report": "playwright show-report",
67
+ "snapshots:download": "bun scripts/snapshots.ts download",
68
+ "snapshots:upload": "bun scripts/snapshots.ts upload",
69
+ "snapshots:regenerate": "bash scripts/snapshots-regenerate.sh",
70
+ "scan:deprecations": "tsx scripts/scan-deprecations.ts",
71
+ "storybook": "storybook dev -p 6006",
72
+ "build-storybook": "storybook build -o public/storybook && node .storybook/rewrite-base-paths.mjs",
73
+ "prepublishOnly": "bun run build:lib",
74
+ "version": "changeset version",
68
75
  "release": "changeset publish"
69
76
  },
77
+ "peerDependencies": {
78
+ "next": ">=15",
79
+ "next-themes": ">=0.4",
80
+ "react": ">=18",
81
+ "react-dom": ">=18",
82
+ "tailwindcss": ">=4"
83
+ },
84
+ "peerDependenciesMeta": {
85
+ "next": {
86
+ "optional": true
87
+ },
88
+ "next-themes": {
89
+ "optional": true
90
+ }
91
+ },
70
92
  "dependencies": {
71
- "@devnomic/marquee": "^1.0.3",
72
- "@hookform/resolvers": "^5.2.2",
73
93
  "@radix-ui/react-accordion": "^1.2.12",
74
94
  "@radix-ui/react-alert-dialog": "^1.1.15",
95
+ "@radix-ui/react-aspect-ratio": "^1.1.8",
75
96
  "@radix-ui/react-avatar": "^1.1.11",
76
97
  "@radix-ui/react-checkbox": "^1.3.3",
77
98
  "@radix-ui/react-collapsible": "^1.1.12",
78
99
  "@radix-ui/react-context-menu": "^2.2.16",
79
100
  "@radix-ui/react-dialog": "^1.1.15",
101
+ "@radix-ui/react-direction": "^1.1.1",
80
102
  "@radix-ui/react-dropdown-menu": "^2.1.16",
81
103
  "@radix-ui/react-hover-card": "^1.1.15",
82
104
  "@radix-ui/react-label": "^2.1.8",
@@ -87,66 +109,63 @@
87
109
  "@radix-ui/react-radio-group": "^1.3.8",
88
110
  "@radix-ui/react-scroll-area": "^1.2.10",
89
111
  "@radix-ui/react-select": "^2.2.6",
112
+ "@radix-ui/react-separator": "^1.1.8",
90
113
  "@radix-ui/react-slider": "^1.3.6",
91
114
  "@radix-ui/react-slot": "^1.2.4",
92
115
  "@radix-ui/react-switch": "^1.2.6",
93
116
  "@radix-ui/react-tabs": "^1.1.13",
117
+ "@radix-ui/react-toggle": "^1.1.10",
118
+ "@radix-ui/react-toggle-group": "^1.1.11",
94
119
  "@radix-ui/react-tooltip": "^1.2.8",
95
- "@radix-ui/react-visually-hidden": "^1.2.4",
120
+ "@rollup/rollup-linux-arm64-gnu": "^4.60.1",
96
121
  "@tanstack/react-table": "^8.21.3",
97
- "@vercel/analytics": "^2.0.1",
98
122
  "class-variance-authority": "^0.7.1",
99
123
  "clsx": "^2.1.1",
100
124
  "cmdk": "^1.1.1",
125
+ "date-fns": "^4.1.0",
101
126
  "embla-carousel-react": "^8.6.0",
102
127
  "input-otp": "^1.4.2",
103
- "lucide-react": "^0.577.0",
128
+ "lucide-react": "^1.7.0",
104
129
  "react-day-picker": "^9.14.0",
105
- "react-hook-form": "^7.72.0",
106
- "react-resizable-panels": "^4.7.6",
107
- "recharts": "^3.8.1",
130
+ "react-resizable-panels": "^4.9.0",
131
+ "recharts": "2.15.4",
108
132
  "sonner": "^2.0.7",
109
133
  "tailwind-merge": "^3.5.0",
110
- "tw-animate-css": "^1.4.0",
111
- "vaul": "^1.1.2",
112
- "zod": "^4.3.6"
113
- },
114
- "peerDependencies": {
115
- "react": "^19",
116
- "react-dom": "^19"
134
+ "vaul": "^1.1.2"
117
135
  },
118
136
  "devDependencies": {
137
+ "@aws-sdk/client-s3": "^3.1024.0",
138
+ "@changesets/changelog-github": "^0.6.0",
119
139
  "@changesets/cli": "^2.30.0",
120
- "@chromatic-com/storybook": "^5.1.1",
121
- "@playwright/test": "^1.58.2",
122
- "@storybook/addon-a11y": "^10.3.3",
123
- "@storybook/addon-docs": "^10.3.3",
124
- "@storybook/addon-onboarding": "^10.3.3",
125
- "@storybook/addon-themes": "^10.3.3",
126
- "@storybook/addon-vitest": "^10.3.3",
127
- "@storybook/react-vite": "^10.3.3",
140
+ "@playwright/test": "^1.59.1",
141
+ "@storybook/addon-a11y": "^10.3.4",
142
+ "@storybook/react-vite": "^10.3.4",
128
143
  "@tailwindcss/postcss": "^4",
129
144
  "@testing-library/jest-dom": "^6.9.1",
130
145
  "@testing-library/react": "^16.3.2",
131
146
  "@testing-library/user-event": "^14.6.1",
132
- "@types/node": "^20",
147
+ "@types/culori": "^4.0.1",
148
+ "@types/node": "^25.5.2",
133
149
  "@types/react": "^19",
134
150
  "@types/react-dom": "^19",
135
- "@vitejs/plugin-react": "^4.7.0",
136
- "@vitest/browser-playwright": "^4.1.2",
151
+ "@vitejs/plugin-react": "^6.0.1",
137
152
  "@vitest/coverage-v8": "^4.1.2",
153
+ "@vitest/ui": "^4.1.2",
154
+ "culori": "^4.0.2",
138
155
  "eslint": "^9",
139
- "eslint-config-next": "16.2.1",
140
- "eslint-plugin-storybook": "^10.3.3",
156
+ "eslint-config-next": "16.2.2",
141
157
  "jsdom": "^29.0.1",
142
- "next": "16.2.1",
143
- "playwright": "^1.58.2",
144
- "storybook": "^10.3.3",
158
+ "next": "16.2.2",
159
+ "next-themes": "^0.4.6",
160
+ "react": "19.2.4",
161
+ "react-dom": "19.2.4",
162
+ "storybook": "^10.3.4",
145
163
  "tailwindcss": "^4",
146
164
  "tsup": "^8.5.1",
165
+ "tsx": "^4.21.0",
166
+ "tw-animate-css": "^1.4.0",
147
167
  "typescript": "^5",
148
- "vitest": "^4.1.2",
149
- "vitest-axe": "^0.1.0"
168
+ "vitest": "^4.1.2"
150
169
  },
151
170
  "ignoreScripts": [
152
171
  "sharp",