@webstacks/ui 0.2.0 → 0.3.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webstacks/ui",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "A shareable React component library",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -17,10 +17,14 @@
17
17
  "default": "./dist/index.cjs"
18
18
  }
19
19
  },
20
- "./styles.css": "./dist/styles.css"
20
+ "./styles.css": "./dist/styles.css",
21
+ "./styles": "./src/styles/globals.css",
22
+ "./fonts.css": "./src/styles/fonts.css"
21
23
  },
22
24
  "files": [
23
- "dist"
25
+ "dist",
26
+ "src/styles",
27
+ "src/fonts"
24
28
  ],
25
29
  "sideEffects": [
26
30
  "**/*.css"
@@ -28,6 +32,7 @@
28
32
  "scripts": {
29
33
  "build": "tsup",
30
34
  "dev": "tsup --watch",
35
+ "dev:preview": "vite dev/",
31
36
  "lint": "eslint . --ext .ts,.tsx",
32
37
  "typecheck": "tsc --noEmit",
33
38
  "clean": "rm -rf dist",
@@ -41,13 +46,15 @@
41
46
  "@types/node": "^25.3.0",
42
47
  "@types/react": "^18.2.0",
43
48
  "@types/react-dom": "^18.2.0",
49
+ "@vitejs/plugin-react": "^5.1.4",
44
50
  "autoprefixer": "^10.4.16",
45
51
  "postcss": "^8.4.32",
46
52
  "react": "^18.2.0",
47
53
  "react-dom": "^18.2.0",
48
54
  "tailwindcss": "^3.4.0",
49
55
  "tsup": "^8.0.1",
50
- "typescript": "^5.3.3"
56
+ "typescript": "^5.3.3",
57
+ "vite": "^7.3.1"
51
58
  },
52
59
  "dependencies": {
53
60
  "@hookform/resolvers": "^5.2.2",
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,240 @@
1
+ /**
2
+ * Design System Color Primitives
3
+ * Complete color palette with primary, secondary, accent, and semantic colors
4
+ * Matches the marketing/apps/web color system
5
+ */
6
+
7
+ :root {
8
+ /* Base Colors */
9
+ --color-white: hsl(0, 0%, 100%);
10
+ --color-black: hsl(0, 0%, 0%);
11
+ --color-cream: hsl(45, 100%, 98%);
12
+
13
+ /* Primary Teal Scale */
14
+ --color-teal-50: hsl(175, 15%, 83%);
15
+ --color-teal-100: hsl(177, 14%, 71%);
16
+ --color-teal-200: hsl(178, 14%, 56%);
17
+ --color-teal-300: hsl(177, 14%, 42%);
18
+ --color-teal-400: hsl(177, 37%, 27%);
19
+ --color-teal-500: hsl(177, 94%, 13%);
20
+ --color-teal-600: hsl(178, 93%, 11%);
21
+ --color-teal-700: hsl(177, 95%, 9%);
22
+ --color-teal-800: hsl(178, 94%, 6%);
23
+ --color-teal-900: hsl(177, 91%, 4%);
24
+ --color-teal-1000: hsl(175, 100%, 3%);
25
+
26
+ /* Blue Scale */
27
+ --color-blue-50: hsl(207, 100%, 95%);
28
+ --color-blue-100: hsl(207, 100%, 87%);
29
+ --color-blue-200: hsl(207, 100%, 78%);
30
+ --color-blue-300: hsl(207, 100%, 68%);
31
+ --color-blue-400: hsl(207, 100%, 59%);
32
+ --color-blue-500: hsl(207, 100%, 50%);
33
+ --color-blue-600: hsl(212, 100%, 50%);
34
+ --color-blue-700: hsl(217, 89%, 46%);
35
+ --color-blue-800: hsl(219, 79%, 47%);
36
+ --color-blue-900: hsl(222, 74%, 41%);
37
+
38
+ /* Cyan Scale */
39
+ --color-cyan-50: hsl(180, 100%, 93%);
40
+ --color-cyan-100: hsl(180, 100%, 81%);
41
+ --color-cyan-200: hsl(180, 100%, 59%);
42
+ --color-cyan-300: hsl(180, 100%, 49%);
43
+ --color-cyan-400: hsl(180, 100%, 48%);
44
+ --color-cyan-500: hsl(181, 100%, 49%);
45
+ --color-cyan-600: hsl(182, 100%, 45%);
46
+ --color-cyan-700: hsl(184, 100%, 39%);
47
+ --color-cyan-800: hsl(185, 100%, 35%);
48
+ --color-cyan-900: hsl(187, 100%, 27%);
49
+
50
+ /* Mint Scale */
51
+ --color-mint-50: hsl(148, 89%, 94%);
52
+ --color-mint-100: hsl(148, 88%, 87%);
53
+ --color-mint-200: hsl(149, 90%, 74%);
54
+ --color-mint-300: hsl(157, 89%, 50%);
55
+ --color-mint-400: hsl(160, 100%, 46%);
56
+ --color-mint-500: hsl(163, 100%, 45%);
57
+ --color-mint-600: hsl(166, 100%, 42%);
58
+ --color-mint-700: hsl(169, 100%, 37%);
59
+ --color-mint-800: hsl(170, 100%, 34%);
60
+ --color-mint-900: hsl(172, 100%, 27%);
61
+
62
+ /* Magenta Scale */
63
+ --color-magenta-50: hsl(315, 73%, 93%);
64
+ --color-magenta-100: hsl(317, 64%, 81%);
65
+ --color-magenta-200: hsl(318, 62%, 68%);
66
+ --color-magenta-300: hsl(319, 56%, 56%);
67
+ --color-magenta-400: hsl(320, 72%, 44%);
68
+ --color-magenta-500: hsl(321, 100%, 35%);
69
+ --color-magenta-600: hsl(321, 100%, 33%);
70
+ --color-magenta-700: hsl(322, 100%, 29%);
71
+ --color-magenta-800: hsl(323, 100%, 26%);
72
+ --color-magenta-900: hsl(325, 100%, 21%);
73
+
74
+ /* Orange Scale */
75
+ --color-orange-50: hsl(5, 85%, 95%);
76
+ --color-orange-100: hsl(9, 99%, 87%);
77
+ --color-orange-200: hsl(11, 99%, 79%);
78
+ --color-orange-300: hsl(14, 99%, 71%);
79
+ --color-orange-400: hsl(16, 100%, 64%);
80
+ --color-orange-500: hsl(17, 100%, 59%);
81
+ --color-orange-600: hsl(18, 91%, 56%);
82
+ --color-orange-700: hsl(19, 83%, 53%);
83
+ --color-orange-800: hsl(20, 77%, 50%);
84
+ --color-orange-900: hsl(22, 75%, 42%);
85
+
86
+ /* Yellow Scale */
87
+ --color-yellow-50: hsl(53, 100%, 95%);
88
+ --color-yellow-100: hsl(51, 100%, 87%);
89
+ --color-yellow-200: hsl(51, 100%, 77%);
90
+ --color-yellow-300: hsl(51, 100%, 69%);
91
+ --color-yellow-400: hsl(50, 98%, 62%);
92
+ --color-yellow-500: hsl(51, 100%, 50%);
93
+ --color-yellow-600: hsl(46, 99%, 50%);
94
+ --color-yellow-700: hsl(41, 99%, 50%);
95
+ --color-yellow-800: hsl(36, 99%, 51%);
96
+ --color-yellow-900: hsl(27, 99%, 48%);
97
+
98
+ /* Green Scale */
99
+ --color-green-50: hsl(91, 85%, 92%);
100
+ --color-green-100: hsl(91, 84%, 87%);
101
+ --color-green-200: hsl(91, 85%, 81%);
102
+ --color-green-300: hsl(91, 86%, 75%);
103
+ --color-green-400: hsl(91, 85%, 69%);
104
+ --color-green-500: hsl(91, 85%, 62%);
105
+ --color-green-600: hsl(91, 56%, 52%);
106
+ --color-green-700: hsl(91, 37%, 42%);
107
+ --color-green-800: hsl(91, 51%, 31%);
108
+ --color-green-900: hsl(91, 51%, 21%);
109
+ --color-green-1000: hsl(91, 52%, 12%);
110
+
111
+ /* Purple Scale */
112
+ --color-purple-50: hsl(276, 82%, 94%);
113
+ --color-purple-100: hsl(277, 82%, 89%);
114
+ --color-purple-200: hsl(277, 83%, 84%);
115
+ --color-purple-300: hsl(277, 84%, 78%);
116
+ --color-purple-400: hsl(277, 83%, 73%);
117
+ --color-purple-500: hsl(277, 83%, 67%);
118
+ --color-purple-600: hsl(277, 52%, 56%);
119
+ --color-purple-700: hsl(277, 33%, 45%);
120
+ --color-purple-800: hsl(277, 40%, 34%);
121
+ --color-purple-900: hsl(277, 40%, 22%);
122
+ --color-purple-1000: hsl(276, 39%, 14%);
123
+
124
+ /* Pink Scale */
125
+ --color-pink-50: hsl(21, 100%, 97%);
126
+ --color-pink-100: hsl(21, 100%, 95%);
127
+ --color-pink-200: hsl(21, 100%, 93%);
128
+ --color-pink-300: hsl(21, 100%, 91%);
129
+ --color-pink-400: hsl(21, 100%, 89%);
130
+ --color-pink-500: hsl(21, 100%, 86%);
131
+ --color-pink-600: hsl(21, 40%, 72%);
132
+ --color-pink-700: hsl(21, 21%, 58%);
133
+ --color-pink-800: hsl(21, 12%, 43%);
134
+ --color-pink-900: hsl(21, 16%, 29%);
135
+ --color-pink-1000: hsl(21, 16%, 17%);
136
+
137
+ /* Tertiary Violet Scale */
138
+ --color-violet-50: hsl(263, 22%, 84%);
139
+ --color-violet-100: hsl(264, 22%, 73%);
140
+ --color-violet-200: hsl(263, 22%, 59%);
141
+ --color-violet-300: hsl(263, 22%, 46%);
142
+ --color-violet-400: hsl(263, 45%, 32%);
143
+ --color-violet-500: hsl(263, 94%, 19%);
144
+ --color-violet-600: hsl(263, 93%, 16%);
145
+ --color-violet-700: hsl(263, 94%, 13%);
146
+ --color-violet-800: hsl(263, 92%, 10%);
147
+ --color-violet-900: hsl(264, 94%, 6%);
148
+ --color-violet-1000: hsl(263, 90%, 4%);
149
+
150
+ /* Neutral/Gray Scale */
151
+ --color-neutral-50: hsl(0, 0%, 93%);
152
+ --color-neutral-100: hsl(0, 0%, 90%);
153
+ --color-neutral-200: hsl(0, 0%, 63%);
154
+ --color-neutral-300: hsl(0, 0%, 56%);
155
+ --color-neutral-400: hsl(0, 0%, 53%);
156
+ --color-neutral-500: hsl(0, 0%, 49%);
157
+ --color-neutral-600: hsl(0, 0%, 27%);
158
+ --color-neutral-700: hsl(0, 0%, 18%);
159
+ --color-neutral-800: hsl(0, 0%, 16%);
160
+ --color-neutral-900: hsl(0, 0%, 10%);
161
+ --color-neutral-950: hsl(0, 0%, 6%);
162
+
163
+ /* Error Scale */
164
+ --color-error-50: hsl(357, 90%, 96%);
165
+ --color-error-100: hsl(358, 85%, 92%);
166
+ --color-error-200: hsl(358, 84%, 85%);
167
+ --color-error-300: hsl(356, 89%, 74%);
168
+ --color-error-400: hsl(354, 100%, 69%);
169
+ --color-error-500: hsl(351, 100%, 63%);
170
+ --color-error-600: hsl(350, 88%, 59%);
171
+ --color-error-700: hsl(351, 78%, 56%);
172
+ --color-error-800: hsl(350, 66%, 51%);
173
+ --color-error-900: hsl(349, 53%, 45%);
174
+
175
+ /* Warning Scale */
176
+ --color-warning-50: hsl(47, 90%, 96%);
177
+ --color-warning-100: hsl(49, 89%, 93%);
178
+ --color-warning-200: hsl(48, 88%, 87%);
179
+ --color-warning-300: hsl(48, 94%, 82%);
180
+ --color-warning-400: hsl(49, 98%, 77%);
181
+ --color-warning-500: hsl(49, 100%, 73%);
182
+ --color-warning-600: hsl(44, 92%, 70%);
183
+ --color-warning-700: hsl(38, 83%, 67%);
184
+ --color-warning-800: hsl(33, 77%, 64%);
185
+ --color-warning-900: hsl(23, 71%, 58%);
186
+
187
+ /* Success Scale */
188
+ --color-success-50: hsl(145, 81%, 96%);
189
+ --color-success-100: hsl(140, 80%, 90%);
190
+ --color-success-200: hsl(144, 78%, 80%);
191
+ --color-success-300: hsl(148, 74%, 67%);
192
+ --color-success-400: hsl(150, 66%, 52%);
193
+ --color-success-500: hsl(152, 53%, 39%);
194
+ --color-success-600: hsl(153, 42%, 30%);
195
+ --color-success-700: hsl(155, 97%, 24%);
196
+ --color-success-800: hsl(155, 90%, 20%);
197
+ --color-success-900: hsl(151, 34%, 12%);
198
+
199
+ /* Alpha Colors (with transparency) */
200
+ --color-alpha-blue: hsla(212, 100%, 50%, 0.3);
201
+ --color-alpha-dark-blue: hsla(217, 89%, 46%, 0.2);
202
+ --color-alpha-teal: hsla(177, 94%, 13%, 0.2);
203
+ --color-alpha-cyan: hsla(180, 100%, 59%, 0.2);
204
+ --color-alpha-mint: hsla(157, 89%, 50%, 0.2);
205
+ --color-alpha-green: hsla(91, 85%, 62%, 0.2);
206
+ --color-alpha-purple: hsla(276, 82%, 94%, 0.2);
207
+ --color-alpha-violet: hsla(277, 83%, 67%, 0.2);
208
+ --color-alpha-magenta: hsla(320, 72%, 44%, 0.2);
209
+ --color-alpha-orange: hsla(17, 100%, 59%, 0.2);
210
+ --color-alpha-yellow: hsla(51, 100%, 50%, 0.2);
211
+ --color-alpha-error: hsla(354, 100%, 69%, 0.2);
212
+ --color-alpha-warning: hsla(49, 100%, 73%, 0.2);
213
+ --color-alpha-success: hsla(153, 42%, 30%, 0.2);
214
+
215
+ /* Alpha Black Scale */
216
+ --color-alpha-black-2: hsla(0, 0%, 0%, 0.01);
217
+ --color-alpha-black-5: hsla(0, 0%, 0%, 0.05);
218
+ --color-alpha-black-10: hsla(0, 0%, 0%, 0.1);
219
+ --color-alpha-black-20: hsla(0, 0%, 0%, 0.2);
220
+ --color-alpha-black-30: hsla(0, 0%, 0%, 0.3);
221
+ --color-alpha-black-40: hsla(0, 0%, 0%, 0.4);
222
+ --color-alpha-black-50: hsla(0, 0%, 0%, 0.5);
223
+ --color-alpha-black-60: hsla(0, 0%, 0%, 0.6);
224
+ --color-alpha-black-70: hsla(0, 0%, 0%, 0.69);
225
+ --color-alpha-black-80: hsla(0, 0%, 0%, 0.8);
226
+ --color-alpha-black-90: hsla(0, 0%, 0%, 0.89);
227
+
228
+ /* Alpha White Scale */
229
+ --color-alpha-white-2: hsla(0, 0%, 100%, 0.01);
230
+ --color-alpha-white-5: hsla(0, 0%, 100%, 0.05);
231
+ --color-alpha-white-10: hsla(0, 0%, 100%, 0.1);
232
+ --color-alpha-white-20: hsla(0, 0%, 100%, 0.2);
233
+ --color-alpha-white-30: hsla(0, 0%, 100%, 0.3);
234
+ --color-alpha-white-40: hsla(0, 0%, 100%, 0.4);
235
+ --color-alpha-white-50: hsla(0, 0%, 100%, 0.5);
236
+ --color-alpha-white-60: hsla(0, 0%, 100%, 0.6);
237
+ --color-alpha-white-70: hsla(0, 0%, 100%, 0.69);
238
+ --color-alpha-white-80: hsla(0, 0%, 100%, 0.8);
239
+ --color-alpha-white-90: hsla(0, 0%, 100%, 0.89);
240
+ }
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Font Face Declarations
3
+ * Saans (primary/secondary/accent) + TT Interphases Pro Mono
4
+ */
5
+
6
+ /* ── Saans ── */
7
+ @font-face {
8
+ font-family: "Saans";
9
+ src: url("../fonts/Saans Light.otf") format("opentype");
10
+ font-weight: 300;
11
+ font-style: normal;
12
+ font-display: swap;
13
+ }
14
+
15
+ @font-face {
16
+ font-family: "Saans";
17
+ src: url("../fonts/Saans Regular.otf") format("opentype");
18
+ font-weight: 400;
19
+ font-style: normal;
20
+ font-display: swap;
21
+ }
22
+
23
+ @font-face {
24
+ font-family: "Saans";
25
+ src: url("../fonts/Saans Medium.otf") format("opentype");
26
+ font-weight: 500;
27
+ font-style: normal;
28
+ font-display: swap;
29
+ }
30
+
31
+ @font-face {
32
+ font-family: "Saans";
33
+ src: url("../fonts/Saans SemiBold.otf") format("opentype");
34
+ font-weight: 600;
35
+ font-style: normal;
36
+ font-display: swap;
37
+ }
38
+
39
+ @font-face {
40
+ font-family: "Saans";
41
+ src: url("../fonts/Saans Bold.otf") format("opentype");
42
+ font-weight: 700;
43
+ font-style: normal;
44
+ font-display: swap;
45
+ }
46
+
47
+ /* ── TT Interphases Pro Mono ── */
48
+ @font-face {
49
+ font-family: "TT Interphases Pro Mono";
50
+ src: url("../fonts/TT_Interphases_Pro_Mono_Regular.ttf") format("truetype");
51
+ font-weight: 400;
52
+ font-style: normal;
53
+ font-display: swap;
54
+ }
55
+
56
+ @font-face {
57
+ font-family: "TT Interphases Pro Mono";
58
+ src: url("../fonts/TT_Interphases_Pro_Mono_Italic.ttf") format("truetype");
59
+ font-weight: 400;
60
+ font-style: italic;
61
+ font-display: swap;
62
+ }
63
+
64
+ @font-face {
65
+ font-family: "TT Interphases Pro Mono";
66
+ src: url("../fonts/TT_Interphases_Pro_Mono_Bold.ttf") format("truetype");
67
+ font-weight: 700;
68
+ font-style: normal;
69
+ font-display: swap;
70
+ }
71
+
72
+ @font-face {
73
+ font-family: "TT Interphases Pro Mono";
74
+ src: url("../fonts/TT_Interphases_Pro_Mono_Bold_Italic.ttf") format("truetype");
75
+ font-weight: 700;
76
+ font-style: italic;
77
+ font-display: swap;
78
+ }
79
+
80
+ /* ── Semantic Font Variables ── */
81
+ :root {
82
+ --font-primary: "Saans";
83
+ --font-secondary: "Saans";
84
+ --font-accent: "Saans";
85
+ --font-mono: "TT Interphases Pro Mono";
86
+
87
+ --font-body: var(--font-primary), ui-sans-serif, system-ui, sans-serif;
88
+ --font-heading: var(--font-secondary), ui-sans-serif, system-ui, sans-serif;
89
+ --font-heading-display: var(--font-secondary), ui-sans-serif, system-ui, sans-serif;
90
+ --font-heading-accent: var(--font-accent), ui-sans-serif, system-ui, sans-serif;
91
+ --font-eyebrow: var(--font-mono), ui-monospace, SFMono-Regular, monospace;
92
+ --font-ui: var(--font-primary), ui-sans-serif, system-ui, sans-serif;
93
+ --font-caption: var(--font-primary), ui-sans-serif, system-ui, sans-serif;
94
+ --font-code: var(--font-mono), ui-monospace, SFMono-Regular, monospace;
95
+ }
@@ -0,0 +1,9 @@
1
+ /* Design system: fonts → primitives → semantic tokens → shadcn bridge → typography */
2
+ @import "./fonts.css";
3
+ @import "./color.css";
4
+ @import "./tokens.css";
5
+ @import "./typography.css";
6
+
7
+ @tailwind base;
8
+ @tailwind components;
9
+ @tailwind utilities;
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Semantic Design Tokens
3
+ * Maps the Webstacks design system to shadcn/ui CSS variables.
4
+ *
5
+ * Layer 1: --color-* primitives (color.css)
6
+ * Layer 2: --token-* semantic tokens (this file, :root / .dark / .light)
7
+ * Layer 3: shadcn variables (--background, --primary, etc.) mapped from --token-*
8
+ */
9
+
10
+ /* ==========================================================================
11
+ SEMANTIC TOKENS — :root (light) and .dark overrides
12
+ ========================================================================== */
13
+
14
+ :root {
15
+ /* ── Text ── */
16
+ --token-text-heading: var(--color-black);
17
+ --token-text-body: var(--color-neutral-700);
18
+ --token-text-eyebrow: var(--color-black);
19
+ --token-text-link: var(--color-black);
20
+ --token-text-link-hover: var(--color-blue-900);
21
+ --token-text-hyperlink: var(--color-blue-700);
22
+ --token-text-hyperlink-hover: var(--color-blue-900);
23
+ --token-text-button: var(--color-white);
24
+ --token-text-button-hover: var(--color-white);
25
+ --token-text-secondary-button: var(--color-black);
26
+ --token-text-disabled: var(--color-neutral-600);
27
+ --token-text-placeholder: var(--color-neutral-800);
28
+ --token-text-nav-item: var(--color-black);
29
+ --token-text-muted: var(--color-neutral-400);
30
+ --token-text-subtle: var(--color-neutral-500);
31
+ --token-text-faint: var(--color-neutral-600);
32
+ --token-text-on-dark: var(--color-white);
33
+ --token-text-on-light: var(--color-black);
34
+ --token-text-inverse: var(--color-white);
35
+
36
+ /* ── Surface / Background ── */
37
+ --token-bg-background: var(--color-white);
38
+ --token-bg-secondary-background: var(--color-neutral-200);
39
+ --token-bg-card: var(--color-white);
40
+ --token-bg-button-primary: var(--color-blue-700);
41
+ --token-bg-button-primary-hover: var(--color-blue-900);
42
+ --token-bg-button-secondary: var(--color-white);
43
+ --token-bg-button-secondary-hover: var(--color-neutral-200);
44
+ --token-bg-disabled: var(--color-neutral-400);
45
+ --token-bg-input: var(--color-white);
46
+ --token-bg-card-hover: var(--color-neutral-100);
47
+ --token-bg-surface-elevated: var(--color-neutral-100);
48
+ --token-bg-surface-sunken: var(--color-neutral-200);
49
+ --token-bg-overlay: var(--color-alpha-black-50);
50
+ --token-bg-muted: var(--color-neutral-100);
51
+
52
+ /* ── Icon ── */
53
+ --token-icon-primary: var(--color-blue-700);
54
+ --token-icon-button: var(--color-white);
55
+ --token-icon-muted: var(--color-neutral-800);
56
+ --token-icon-subtle: var(--color-neutral-500);
57
+
58
+ /* ── Border / Stroke ── */
59
+ --token-border-primary: var(--color-blue-600);
60
+ --token-border-secondary: var(--color-alpha-black-5);
61
+ --token-border-card: var(--color-neutral-500);
62
+ --token-border-input: var(--color-neutral-500);
63
+ --token-border-subtle: var(--color-neutral-200);
64
+ --token-border-strong: var(--color-neutral-700);
65
+ --token-border-muted: var(--color-neutral-300);
66
+
67
+ /* ── Semantic state ── */
68
+ --token-bg-success: var(--color-success-50);
69
+ --token-bg-warning: var(--color-warning-50);
70
+ --token-bg-error: var(--color-error-50);
71
+ --token-text-success: var(--color-success-700);
72
+ --token-text-warning: var(--color-warning-700);
73
+ --token-text-error: var(--color-error-700);
74
+
75
+ /* ── Logo ── */
76
+ --token-logo-icon: var(--color-blue-600);
77
+ --token-logo-text: var(--color-black);
78
+ }
79
+
80
+ .dark {
81
+ /* ── Text ── */
82
+ --token-text-heading: var(--color-white);
83
+ --token-text-body: var(--color-neutral-200);
84
+ --token-text-eyebrow: var(--color-white);
85
+ --token-text-link: var(--color-white);
86
+ --token-text-link-hover: var(--color-blue-600);
87
+ --token-text-hyperlink: var(--color-blue-600);
88
+ --token-text-hyperlink-hover: var(--color-blue-800);
89
+ --token-text-button: var(--color-white);
90
+ --token-text-button-hover: var(--color-white);
91
+ --token-text-secondary-button: var(--color-white);
92
+ --token-text-disabled: var(--color-neutral-500);
93
+ --token-text-placeholder: var(--color-neutral-500);
94
+ --token-text-nav-item: var(--color-white);
95
+ --token-text-muted: var(--color-neutral-400);
96
+ --token-text-subtle: var(--color-neutral-500);
97
+ --token-text-faint: var(--color-neutral-600);
98
+ --token-text-on-dark: var(--color-white);
99
+ --token-text-on-light: var(--color-black);
100
+ --token-text-inverse: var(--color-black);
101
+
102
+ /* ── Surface / Background ── */
103
+ --token-bg-background: var(--color-black);
104
+ --token-bg-secondary-background: var(--color-neutral-900);
105
+ --token-bg-card: var(--color-black);
106
+ --token-bg-button-primary: var(--color-blue-700);
107
+ --token-bg-button-primary-hover: var(--color-blue-900);
108
+ --token-bg-button-secondary: var(--color-black);
109
+ --token-bg-button-secondary-hover: var(--color-neutral-100);
110
+ --token-bg-disabled: var(--color-neutral-600);
111
+ --token-bg-input: var(--color-neutral-950);
112
+ --token-bg-card-hover: var(--color-neutral-900);
113
+ --token-bg-surface-elevated: var(--color-neutral-900);
114
+ --token-bg-surface-sunken: var(--color-neutral-950);
115
+ --token-bg-overlay: var(--color-alpha-black-60);
116
+ --token-bg-muted: var(--color-neutral-900);
117
+
118
+ /* ── Icon ── */
119
+ --token-icon-primary: var(--color-blue-600);
120
+ --token-icon-button: var(--color-white);
121
+ --token-icon-muted: var(--color-neutral-500);
122
+ --token-icon-subtle: var(--color-neutral-300);
123
+
124
+ /* ── Border / Stroke ── */
125
+ --token-border-primary: var(--color-blue-600);
126
+ --token-border-secondary: var(--color-neutral-900);
127
+ --token-border-card: var(--color-neutral-700);
128
+ --token-border-input: var(--color-neutral-900);
129
+ --token-border-subtle: var(--color-neutral-800);
130
+ --token-border-strong: var(--color-neutral-300);
131
+ --token-border-muted: var(--color-neutral-700);
132
+
133
+ /* ── Semantic state ── */
134
+ --token-bg-success: var(--color-success-900);
135
+ --token-bg-warning: var(--color-warning-900);
136
+ --token-bg-error: var(--color-alpha-error);
137
+ --token-text-success: var(--color-success-200);
138
+ --token-text-warning: var(--color-warning-200);
139
+ --token-text-error: var(--color-error-300);
140
+
141
+ /* ── Logo ── */
142
+ --token-logo-icon: var(--color-blue-600);
143
+ --token-logo-text: var(--color-white);
144
+ }
145
+
146
+ /* ==========================================================================
147
+ SHADCN BRIDGE — maps --token-* to shadcn's expected CSS variables
148
+ shadcn components use these variables internally (e.g. bg-background,
149
+ text-primary, border-border, etc.)
150
+ ========================================================================== */
151
+
152
+ :root {
153
+ --background: var(--token-bg-background);
154
+ --foreground: var(--token-text-heading);
155
+
156
+ --card: var(--token-bg-card);
157
+ --card-foreground: var(--token-text-heading);
158
+
159
+ --popover: var(--token-bg-card);
160
+ --popover-foreground: var(--token-text-heading);
161
+
162
+ --primary: var(--token-bg-button-primary);
163
+ --primary-foreground: var(--token-text-button);
164
+
165
+ --secondary: var(--token-bg-secondary-background);
166
+ --secondary-foreground: var(--token-text-secondary-button);
167
+
168
+ --muted: var(--token-bg-muted);
169
+ --muted-foreground: var(--token-text-muted);
170
+
171
+ --accent: var(--token-bg-surface-elevated);
172
+ --accent-foreground: var(--token-text-heading);
173
+
174
+ --destructive: var(--color-error-600);
175
+ --destructive-foreground: var(--color-white);
176
+
177
+ --border: var(--token-border-subtle);
178
+ --input: var(--token-border-input);
179
+ --ring: var(--token-border-primary);
180
+
181
+ --radius: 0.5rem;
182
+
183
+ --chart-1: var(--color-blue-600);
184
+ --chart-2: var(--color-teal-500);
185
+ --chart-3: var(--color-mint-500);
186
+ --chart-4: var(--color-purple-500);
187
+ --chart-5: var(--color-orange-500);
188
+
189
+ /* Sidebar */
190
+ --sidebar-background: var(--token-bg-background);
191
+ --sidebar-foreground: var(--token-text-body);
192
+ --sidebar-primary: var(--token-bg-button-primary);
193
+ --sidebar-primary-foreground: var(--token-text-button);
194
+ --sidebar-accent: var(--token-bg-surface-elevated);
195
+ --sidebar-accent-foreground: var(--token-text-heading);
196
+ --sidebar-border: var(--token-border-subtle);
197
+ --sidebar-ring: var(--token-border-primary);
198
+ }
199
+
200
+ .dark {
201
+ --background: var(--token-bg-background);
202
+ --foreground: var(--token-text-heading);
203
+
204
+ --card: var(--token-bg-card);
205
+ --card-foreground: var(--token-text-heading);
206
+
207
+ --popover: var(--token-bg-card);
208
+ --popover-foreground: var(--token-text-heading);
209
+
210
+ --primary: var(--token-bg-button-primary);
211
+ --primary-foreground: var(--token-text-button);
212
+
213
+ --secondary: var(--token-bg-secondary-background);
214
+ --secondary-foreground: var(--token-text-secondary-button);
215
+
216
+ --muted: var(--token-bg-muted);
217
+ --muted-foreground: var(--token-text-muted);
218
+
219
+ --accent: var(--token-bg-surface-elevated);
220
+ --accent-foreground: var(--token-text-heading);
221
+
222
+ --destructive: var(--color-error-400);
223
+ --destructive-foreground: var(--color-white);
224
+
225
+ --border: var(--token-border-subtle);
226
+ --input: var(--token-border-input);
227
+ --ring: var(--token-border-primary);
228
+
229
+ --chart-1: var(--color-blue-400);
230
+ --chart-2: var(--color-teal-300);
231
+ --chart-3: var(--color-mint-300);
232
+ --chart-4: var(--color-purple-400);
233
+ --chart-5: var(--color-orange-400);
234
+
235
+ --sidebar-background: var(--token-bg-background);
236
+ --sidebar-foreground: var(--token-text-body);
237
+ --sidebar-primary: var(--token-bg-button-primary);
238
+ --sidebar-primary-foreground: var(--token-text-button);
239
+ --sidebar-accent: var(--token-bg-surface-elevated);
240
+ --sidebar-accent-foreground: var(--token-text-heading);
241
+ --sidebar-border: var(--token-border-subtle);
242
+ --sidebar-ring: var(--token-border-primary);
243
+ }