@webdevarif/dashui 0.1.0 → 0.1.2

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,402 @@
1
+ /* @webdevarif/dashui — All Tokens Combined
2
+ * Import: import '@webdevarif/dashui/styles'
3
+ */
4
+
5
+ /**
6
+ * @webdevarif/dashui — Primitive Tokens (Layer 1)
7
+ * Raw values. Never use these directly in components.
8
+ * Use semantic tokens instead.
9
+ */
10
+ :root {
11
+ /* ─── Gray Scale ─── */
12
+ --wd-gray-0: #FFFFFF;
13
+ --wd-gray-50: #F9FAFB;
14
+ --wd-gray-100: #F3F4F6;
15
+ --wd-gray-200: #E5E7EB;
16
+ --wd-gray-300: #D1D5DB;
17
+ --wd-gray-400: #9CA3AF;
18
+ --wd-gray-500: #6B7280;
19
+ --wd-gray-600: #4B5563;
20
+ --wd-gray-700: #374151;
21
+ --wd-gray-800: #1F2937;
22
+ --wd-gray-900: #111827;
23
+ --wd-gray-950: #030712;
24
+
25
+ /* ─── Brand (Indigo) ─── */
26
+ --wd-brand-50: #EEF2FF;
27
+ --wd-brand-100: #E0E7FF;
28
+ --wd-brand-200: #C7D2FE;
29
+ --wd-brand-300: #A5B4FC;
30
+ --wd-brand-400: #818CF8;
31
+ --wd-brand-500: #6366F1;
32
+ --wd-brand-600: #4F46E5;
33
+ --wd-brand-700: #4338CA;
34
+ --wd-brand-800: #3730A3;
35
+ --wd-brand-900: #312E81;
36
+
37
+ /* ─── Status ─── */
38
+ --wd-green-500: #16A34A;
39
+ --wd-green-50: #F0FDF4;
40
+ --wd-yellow-500: #D97706;
41
+ --wd-yellow-50: #FFFBEB;
42
+ --wd-red-500: #DC2626;
43
+ --wd-red-50: #FEF2F2;
44
+ --wd-blue-500: #2563EB;
45
+ --wd-blue-50: #EFF6FF;
46
+
47
+ /* ─── Spacing ─── */
48
+ --wd-space-1: 0.25rem; /* 4px */
49
+ --wd-space-2: 0.5rem; /* 8px */
50
+ --wd-space-3: 0.75rem; /* 12px */
51
+ --wd-space-4: 1rem; /* 16px */
52
+ --wd-space-5: 1.25rem; /* 20px */
53
+ --wd-space-6: 1.5rem; /* 24px */
54
+ --wd-space-8: 2rem; /* 32px */
55
+ --wd-space-10: 2.5rem; /* 40px */
56
+ --wd-space-12: 3rem; /* 48px */
57
+ --wd-space-16: 4rem; /* 64px */
58
+
59
+ /* ─── Border Radius ─── */
60
+ --wd-radius-sm: 4px;
61
+ --wd-radius-md: 8px;
62
+ --wd-radius-lg: 12px;
63
+ --wd-radius-xl: 16px;
64
+ --wd-radius-2xl: 20px;
65
+ --wd-radius-full: 9999px;
66
+
67
+ /* ─── Typography ─── */
68
+ --wd-font-sans: 'Inter', system-ui, -apple-system, sans-serif;
69
+ --wd-font-mono: 'JetBrains Mono', 'Fira Code', monospace;
70
+
71
+ --wd-text-xs: 0.75rem; /* 12px */
72
+ --wd-text-sm: 0.875rem; /* 14px */
73
+ --wd-text-base: 1rem; /* 16px */
74
+ --wd-text-lg: 1.125rem; /* 18px */
75
+ --wd-text-xl: 1.25rem; /* 20px */
76
+ --wd-text-2xl: 1.5rem; /* 24px */
77
+ --wd-text-3xl: 1.875rem; /* 30px */
78
+ --wd-text-4xl: 2.25rem; /* 36px */
79
+
80
+ --wd-leading-tight: 1.25;
81
+ --wd-leading-normal: 1.5;
82
+ --wd-leading-relaxed: 1.75;
83
+
84
+ /* ─── Shadows ─── */
85
+ --wd-shadow-xs: 0 1px 2px rgba(0,0,0,0.05);
86
+ --wd-shadow-sm: 0 1px 3px rgba(0,0,0,0.1), 0 1px 2px rgba(0,0,0,0.06);
87
+ --wd-shadow-md: 0 4px 6px rgba(0,0,0,0.07), 0 2px 4px rgba(0,0,0,0.06);
88
+ --wd-shadow-lg: 0 10px 15px rgba(0,0,0,0.1), 0 4px 6px rgba(0,0,0,0.05);
89
+ --wd-shadow-xl: 0 20px 25px rgba(0,0,0,0.1), 0 10px 10px rgba(0,0,0,0.04);
90
+
91
+ /* ─── Animation ─── */
92
+ --wd-duration-fast: 100ms;
93
+ --wd-duration-normal: 200ms;
94
+ --wd-duration-slow: 300ms;
95
+ --wd-ease-default: cubic-bezier(0.4, 0, 0.2, 1);
96
+ }
97
+
98
+
99
+ /**
100
+ * @webdevarif/dashui — Semantic Tokens, Light Mode (Layer 2)
101
+ * Apply via: <html data-dashui-theme="light"> (default)
102
+ * Components use these variables, never primitives directly.
103
+ */
104
+ :root,
105
+ [data-dashui-theme="light"] {
106
+
107
+ /* ─── Surfaces ─── */
108
+ --wd-surface-page: var(--wd-gray-50);
109
+ --wd-surface-card: var(--wd-gray-0);
110
+ --wd-surface-overlay: var(--wd-gray-0);
111
+ --wd-surface-sunken: var(--wd-gray-100);
112
+ --wd-surface-raised: var(--wd-gray-0);
113
+ --wd-surface-sidebar: var(--wd-gray-0);
114
+
115
+ /* ─── Text ─── */
116
+ --wd-text-primary: var(--wd-gray-900);
117
+ --wd-text-secondary: var(--wd-gray-600);
118
+ --wd-text-tertiary: var(--wd-gray-400);
119
+ --wd-text-disabled: var(--wd-gray-300);
120
+ --wd-text-inverse: var(--wd-gray-0);
121
+ --wd-text-on-brand: #FFFFFF;
122
+
123
+ /* ─── Brand ─── */
124
+ --wd-brand: var(--wd-brand-500);
125
+ --wd-brand-hover: var(--wd-brand-600);
126
+ --wd-brand-active: var(--wd-brand-700);
127
+ --wd-brand-subtle: var(--wd-brand-50);
128
+ --wd-brand-muted: var(--wd-brand-100);
129
+ --wd-brand-border: var(--wd-brand-200);
130
+
131
+ /* ─── Border ─── */
132
+ --wd-border: var(--wd-gray-200);
133
+ --wd-border-strong: var(--wd-gray-300);
134
+ --wd-border-focus: var(--wd-brand-500);
135
+
136
+ /* ─── Interactive ─── */
137
+ --wd-interactive-bg: var(--wd-gray-0);
138
+ --wd-interactive-hover: var(--wd-gray-50);
139
+ --wd-interactive-active: var(--wd-gray-100);
140
+ --wd-interactive-selected: var(--wd-brand-50);
141
+ --wd-interactive-selected-border: var(--wd-brand-200);
142
+
143
+ /* ─── Button — Primary ─── */
144
+ --wd-btn-primary-bg: var(--wd-brand-500);
145
+ --wd-btn-primary-bg-hover: var(--wd-brand-600);
146
+ --wd-btn-primary-bg-active: var(--wd-brand-700);
147
+ --wd-btn-primary-text: #FFFFFF;
148
+ --wd-btn-primary-border: var(--wd-brand-500);
149
+
150
+ /* ─── Button — Secondary ─── */
151
+ --wd-btn-secondary-bg: var(--wd-gray-0);
152
+ --wd-btn-secondary-bg-hover: var(--wd-gray-50);
153
+ --wd-btn-secondary-bg-active: var(--wd-gray-100);
154
+ --wd-btn-secondary-text: var(--wd-gray-700);
155
+ --wd-btn-secondary-border: var(--wd-gray-300);
156
+
157
+ /* ─── Button — Destructive ─── */
158
+ --wd-btn-danger-bg: var(--wd-red-500);
159
+ --wd-btn-danger-bg-hover: #B91C1C;
160
+ --wd-btn-danger-text: #FFFFFF;
161
+ --wd-btn-danger-border: var(--wd-red-500);
162
+
163
+ /* ─── Button — Ghost ─── */
164
+ --wd-btn-ghost-bg: transparent;
165
+ --wd-btn-ghost-bg-hover: var(--wd-gray-100);
166
+ --wd-btn-ghost-text: var(--wd-gray-700);
167
+
168
+ /* ─── Input ─── */
169
+ --wd-input-bg: var(--wd-gray-0);
170
+ --wd-input-bg-hover: var(--wd-gray-50);
171
+ --wd-input-bg-focus: var(--wd-gray-0);
172
+ --wd-input-bg-disabled: var(--wd-gray-100);
173
+ --wd-input-text: var(--wd-gray-900);
174
+ --wd-input-placeholder: var(--wd-gray-400);
175
+ --wd-input-border: var(--wd-gray-300);
176
+ --wd-input-border-focus: var(--wd-brand-500);
177
+ --wd-input-border-error: var(--wd-red-500);
178
+
179
+ /* ─── Status ─── */
180
+ --wd-status-success: var(--wd-green-500);
181
+ --wd-status-success-bg: var(--wd-green-50);
182
+ --wd-status-warning: var(--wd-yellow-500);
183
+ --wd-status-warning-bg: var(--wd-yellow-50);
184
+ --wd-status-error: var(--wd-red-500);
185
+ --wd-status-error-bg: var(--wd-red-50);
186
+ --wd-status-info: var(--wd-blue-500);
187
+ --wd-status-info-bg: var(--wd-blue-50);
188
+
189
+ /* ─── Shadows ─── */
190
+ --wd-shadow-card: var(--wd-shadow-sm);
191
+ --wd-shadow-dropdown: var(--wd-shadow-lg);
192
+ --wd-shadow-modal: var(--wd-shadow-xl);
193
+
194
+ /* ─── Radius (semantic) ─── */
195
+ --wd-radius-btn: var(--wd-radius-md);
196
+ --wd-radius-input: var(--wd-radius-md);
197
+ --wd-radius-card: var(--wd-radius-lg);
198
+ --wd-radius-badge: var(--wd-radius-full);
199
+ --wd-radius-dialog: var(--wd-radius-xl);
200
+
201
+ /* ─── Spacing (semantic) ─── */
202
+ --wd-spacing-component-xs: var(--wd-space-2);
203
+ --wd-spacing-component-sm: var(--wd-space-3);
204
+ --wd-spacing-component-md: var(--wd-space-4);
205
+ --wd-spacing-component-lg: var(--wd-space-6);
206
+ --wd-spacing-layout-sm: var(--wd-space-6);
207
+ --wd-spacing-layout-md: var(--wd-space-8);
208
+ --wd-spacing-layout-lg: var(--wd-space-12);
209
+
210
+ /* ─── Sidebar ─── */
211
+ --wd-sidebar-width: 240px;
212
+ --wd-sidebar-collapsed-width: 64px;
213
+ --wd-topbar-height: 60px;
214
+ }
215
+
216
+
217
+ /**
218
+ * @webdevarif/dashui — Semantic Tokens, Dark Mode (Layer 2)
219
+ * Apply via: <html data-dashui-theme="dark">
220
+ */
221
+ [data-dashui-theme="dark"] {
222
+
223
+ /* ─── Surfaces ─── */
224
+ --wd-surface-page: #0A0A0A;
225
+ --wd-surface-card: var(--wd-gray-900);
226
+ --wd-surface-overlay: var(--wd-gray-800);
227
+ --wd-surface-sunken: #050505;
228
+ --wd-surface-raised: var(--wd-gray-800);
229
+ --wd-surface-sidebar: var(--wd-gray-950);
230
+
231
+ /* ─── Text ─── */
232
+ --wd-text-primary: var(--wd-gray-50);
233
+ --wd-text-secondary: var(--wd-gray-400);
234
+ --wd-text-tertiary: var(--wd-gray-500);
235
+ --wd-text-disabled: var(--wd-gray-700);
236
+ --wd-text-inverse: var(--wd-gray-900);
237
+ --wd-text-on-brand: #FFFFFF;
238
+
239
+ /* ─── Brand ─── */
240
+ --wd-brand: var(--wd-brand-400);
241
+ --wd-brand-hover: var(--wd-brand-300);
242
+ --wd-brand-active: var(--wd-brand-200);
243
+ --wd-brand-subtle: rgba(99, 102, 241, 0.12);
244
+ --wd-brand-muted: rgba(99, 102, 241, 0.20);
245
+ --wd-brand-border: rgba(99, 102, 241, 0.30);
246
+
247
+ /* ─── Border ─── */
248
+ --wd-border: var(--wd-gray-800);
249
+ --wd-border-strong: var(--wd-gray-700);
250
+ --wd-border-focus: var(--wd-brand-400);
251
+
252
+ /* ─── Interactive ─── */
253
+ --wd-interactive-bg: var(--wd-gray-900);
254
+ --wd-interactive-hover: var(--wd-gray-800);
255
+ --wd-interactive-active: var(--wd-gray-700);
256
+ --wd-interactive-selected: rgba(99, 102, 241, 0.15);
257
+ --wd-interactive-selected-border: rgba(99, 102, 241, 0.40);
258
+
259
+ /* ─── Button — Primary ─── */
260
+ --wd-btn-primary-bg: var(--wd-brand-500);
261
+ --wd-btn-primary-bg-hover: var(--wd-brand-400);
262
+ --wd-btn-primary-bg-active: var(--wd-brand-300);
263
+ --wd-btn-primary-text: #FFFFFF;
264
+ --wd-btn-primary-border: var(--wd-brand-500);
265
+
266
+ /* ─── Button — Secondary ─── */
267
+ --wd-btn-secondary-bg: var(--wd-gray-800);
268
+ --wd-btn-secondary-bg-hover: var(--wd-gray-700);
269
+ --wd-btn-secondary-bg-active: var(--wd-gray-600);
270
+ --wd-btn-secondary-text: var(--wd-gray-200);
271
+ --wd-btn-secondary-border: var(--wd-gray-700);
272
+
273
+ /* ─── Button — Ghost ─── */
274
+ --wd-btn-ghost-bg: transparent;
275
+ --wd-btn-ghost-bg-hover: var(--wd-gray-800);
276
+ --wd-btn-ghost-text: var(--wd-gray-300);
277
+
278
+ /* ─── Input ─── */
279
+ --wd-input-bg: var(--wd-gray-900);
280
+ --wd-input-bg-hover: var(--wd-gray-800);
281
+ --wd-input-bg-focus: var(--wd-gray-900);
282
+ --wd-input-bg-disabled: var(--wd-gray-950);
283
+ --wd-input-text: var(--wd-gray-100);
284
+ --wd-input-placeholder: var(--wd-gray-600);
285
+ --wd-input-border: var(--wd-gray-700);
286
+ --wd-input-border-focus: var(--wd-brand-400);
287
+ --wd-input-border-error: #F87171;
288
+
289
+ /* ─── Status ─── */
290
+ --wd-status-success: #4ADE80;
291
+ --wd-status-success-bg: rgba(22, 163, 74, 0.15);
292
+ --wd-status-warning: #FCD34D;
293
+ --wd-status-warning-bg: rgba(217, 119, 6, 0.15);
294
+ --wd-status-error: #F87171;
295
+ --wd-status-error-bg: rgba(220, 38, 38, 0.15);
296
+ --wd-status-info: #60A5FA;
297
+ --wd-status-info-bg: rgba(37, 99, 235, 0.15);
298
+
299
+ /* ─── Shadows ─── */
300
+ --wd-shadow-card: 0 1px 3px rgba(0,0,0,0.5);
301
+ --wd-shadow-dropdown: 0 10px 15px rgba(0,0,0,0.6);
302
+ --wd-shadow-modal: 0 20px 40px rgba(0,0,0,0.7);
303
+ }
304
+
305
+
306
+ /**
307
+ * @webdevarif/dashui — Storefront Color Schemes (Layer 3)
308
+ * For customer website sections/blocks.
309
+ * Each section gets class="color-scheme-N"
310
+ * Store brand color overrides --wd-scheme-brand via JS/API.
311
+ */
312
+
313
+ /* Scheme 1 — Light (default) */
314
+ :root,
315
+ .color-scheme-1 {
316
+ --wd-scheme-bg: #FFFFFF;
317
+ --wd-scheme-bg-rgb: 255 255 255;
318
+ --wd-scheme-surface: #F9FAFB;
319
+ --wd-scheme-text: #111827;
320
+ --wd-scheme-text-rgb: 17 24 39;
321
+ --wd-scheme-muted: #6B7280;
322
+ --wd-scheme-heading: #030712;
323
+ --wd-scheme-border: #E5E7EB;
324
+ --wd-scheme-shadow: rgba(0,0,0,0.1);
325
+
326
+ /* Brand — injected by store theme API */
327
+ --wd-scheme-brand: #6366F1;
328
+ --wd-scheme-brand-hover: #4F46E5;
329
+ --wd-scheme-brand-text: #FFFFFF;
330
+
331
+ /* Buttons */
332
+ --wd-scheme-btn-primary-bg: var(--wd-scheme-brand);
333
+ --wd-scheme-btn-primary-bg-hover: var(--wd-scheme-brand-hover);
334
+ --wd-scheme-btn-primary-text: var(--wd-scheme-brand-text);
335
+ --wd-scheme-btn-primary-border: var(--wd-scheme-brand);
336
+
337
+ --wd-scheme-btn-secondary-bg: transparent;
338
+ --wd-scheme-btn-secondary-bg-hover: #F9FAFB;
339
+ --wd-scheme-btn-secondary-text: #111827;
340
+ --wd-scheme-btn-secondary-border: #111827;
341
+
342
+ /* Input */
343
+ --wd-scheme-input-bg: #FFFFFF;
344
+ --wd-scheme-input-text: #111827;
345
+ --wd-scheme-input-border: #D1D5DB;
346
+ }
347
+
348
+ /* Scheme 2 — Dark */
349
+ .color-scheme-2 {
350
+ --wd-scheme-bg: #0A0A0A;
351
+ --wd-scheme-bg-rgb: 10 10 10;
352
+ --wd-scheme-surface: #141414;
353
+ --wd-scheme-text: #F9FAFB;
354
+ --wd-scheme-text-rgb: 249 250 251;
355
+ --wd-scheme-muted: #9CA3AF;
356
+ --wd-scheme-heading: #FFFFFF;
357
+ --wd-scheme-border: #262626;
358
+ --wd-scheme-shadow: rgba(0,0,0,0.5);
359
+
360
+ --wd-scheme-btn-secondary-bg: transparent;
361
+ --wd-scheme-btn-secondary-bg-hover: rgba(255,255,255,0.08);
362
+ --wd-scheme-btn-secondary-text: #F9FAFB;
363
+ --wd-scheme-btn-secondary-border: rgba(255,255,255,0.3);
364
+
365
+ --wd-scheme-input-bg: #1A1A1A;
366
+ --wd-scheme-input-text: #F9FAFB;
367
+ --wd-scheme-input-border: #333333;
368
+ }
369
+
370
+ /* Scheme 3 — Brand/Accent Fill */
371
+ .color-scheme-3 {
372
+ --wd-scheme-bg: var(--wd-scheme-brand);
373
+ --wd-scheme-surface: var(--wd-scheme-brand-hover);
374
+ --wd-scheme-text: rgba(255,255,255,0.95);
375
+ --wd-scheme-muted: rgba(255,255,255,0.70);
376
+ --wd-scheme-heading: #FFFFFF;
377
+ --wd-scheme-border: rgba(255,255,255,0.20);
378
+
379
+ --wd-scheme-btn-primary-bg: #FFFFFF;
380
+ --wd-scheme-btn-primary-bg-hover: #F0F0F0;
381
+ --wd-scheme-btn-primary-text: var(--wd-scheme-brand);
382
+ --wd-scheme-btn-primary-border: #FFFFFF;
383
+
384
+ --wd-scheme-btn-secondary-bg: transparent;
385
+ --wd-scheme-btn-secondary-bg-hover: rgba(255,255,255,0.15);
386
+ --wd-scheme-btn-secondary-text: #FFFFFF;
387
+ --wd-scheme-btn-secondary-border: rgba(255,255,255,0.5);
388
+ }
389
+
390
+ /* Scheme 4 — Soft/Tinted */
391
+ .color-scheme-4 {
392
+ --wd-scheme-bg: #F5F3FF;
393
+ --wd-scheme-surface: #EDE9FE;
394
+ --wd-scheme-text: #1E1B4B;
395
+ --wd-scheme-muted: #6D28D9;
396
+ --wd-scheme-heading: #0F0D2E;
397
+ --wd-scheme-border: #DDD6FE;
398
+ }
399
+
400
+ /* Scheme 5–16: Reserved for user-defined schemes */
401
+ /* Generated dynamically via API: GET /api/theme/{storeId}/styles.css */
402
+
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @webdevarif/dashui — Token Entry Point
3
+ * Import order matters: primitives → semantic → schemes
4
+ *
5
+ * Usage:
6
+ * import '@webdevarif/dashui/tokens'
7
+ */
8
+ @import './primitives.css';
9
+ @import './semantic-light.css';
10
+ @import './semantic-dark.css';
11
+ @import './storefront-schemes.css';
@@ -0,0 +1,92 @@
1
+ /**
2
+ * @webdevarif/dashui — Primitive Tokens (Layer 1)
3
+ * Raw values. Never use these directly in components.
4
+ * Use semantic tokens instead.
5
+ */
6
+ :root {
7
+ /* ─── Gray Scale ─── */
8
+ --wd-gray-0: #FFFFFF;
9
+ --wd-gray-50: #F9FAFB;
10
+ --wd-gray-100: #F3F4F6;
11
+ --wd-gray-200: #E5E7EB;
12
+ --wd-gray-300: #D1D5DB;
13
+ --wd-gray-400: #9CA3AF;
14
+ --wd-gray-500: #6B7280;
15
+ --wd-gray-600: #4B5563;
16
+ --wd-gray-700: #374151;
17
+ --wd-gray-800: #1F2937;
18
+ --wd-gray-900: #111827;
19
+ --wd-gray-950: #030712;
20
+
21
+ /* ─── Brand (Indigo) ─── */
22
+ --wd-brand-50: #EEF2FF;
23
+ --wd-brand-100: #E0E7FF;
24
+ --wd-brand-200: #C7D2FE;
25
+ --wd-brand-300: #A5B4FC;
26
+ --wd-brand-400: #818CF8;
27
+ --wd-brand-500: #6366F1;
28
+ --wd-brand-600: #4F46E5;
29
+ --wd-brand-700: #4338CA;
30
+ --wd-brand-800: #3730A3;
31
+ --wd-brand-900: #312E81;
32
+
33
+ /* ─── Status ─── */
34
+ --wd-green-500: #16A34A;
35
+ --wd-green-50: #F0FDF4;
36
+ --wd-yellow-500: #D97706;
37
+ --wd-yellow-50: #FFFBEB;
38
+ --wd-red-500: #DC2626;
39
+ --wd-red-50: #FEF2F2;
40
+ --wd-blue-500: #2563EB;
41
+ --wd-blue-50: #EFF6FF;
42
+
43
+ /* ─── Spacing ─── */
44
+ --wd-space-1: 0.25rem; /* 4px */
45
+ --wd-space-2: 0.5rem; /* 8px */
46
+ --wd-space-3: 0.75rem; /* 12px */
47
+ --wd-space-4: 1rem; /* 16px */
48
+ --wd-space-5: 1.25rem; /* 20px */
49
+ --wd-space-6: 1.5rem; /* 24px */
50
+ --wd-space-8: 2rem; /* 32px */
51
+ --wd-space-10: 2.5rem; /* 40px */
52
+ --wd-space-12: 3rem; /* 48px */
53
+ --wd-space-16: 4rem; /* 64px */
54
+
55
+ /* ─── Border Radius ─── */
56
+ --wd-radius-sm: 4px;
57
+ --wd-radius-md: 8px;
58
+ --wd-radius-lg: 12px;
59
+ --wd-radius-xl: 16px;
60
+ --wd-radius-2xl: 20px;
61
+ --wd-radius-full: 9999px;
62
+
63
+ /* ─── Typography ─── */
64
+ --wd-font-sans: 'Inter', system-ui, -apple-system, sans-serif;
65
+ --wd-font-mono: 'JetBrains Mono', 'Fira Code', monospace;
66
+
67
+ --wd-text-xs: 0.75rem; /* 12px */
68
+ --wd-text-sm: 0.875rem; /* 14px */
69
+ --wd-text-base: 1rem; /* 16px */
70
+ --wd-text-lg: 1.125rem; /* 18px */
71
+ --wd-text-xl: 1.25rem; /* 20px */
72
+ --wd-text-2xl: 1.5rem; /* 24px */
73
+ --wd-text-3xl: 1.875rem; /* 30px */
74
+ --wd-text-4xl: 2.25rem; /* 36px */
75
+
76
+ --wd-leading-tight: 1.25;
77
+ --wd-leading-normal: 1.5;
78
+ --wd-leading-relaxed: 1.75;
79
+
80
+ /* ─── Shadows ─── */
81
+ --wd-shadow-xs: 0 1px 2px rgba(0,0,0,0.05);
82
+ --wd-shadow-sm: 0 1px 3px rgba(0,0,0,0.1), 0 1px 2px rgba(0,0,0,0.06);
83
+ --wd-shadow-md: 0 4px 6px rgba(0,0,0,0.07), 0 2px 4px rgba(0,0,0,0.06);
84
+ --wd-shadow-lg: 0 10px 15px rgba(0,0,0,0.1), 0 4px 6px rgba(0,0,0,0.05);
85
+ --wd-shadow-xl: 0 20px 25px rgba(0,0,0,0.1), 0 10px 10px rgba(0,0,0,0.04);
86
+
87
+ /* ─── Animation ─── */
88
+ --wd-duration-fast: 100ms;
89
+ --wd-duration-normal: 200ms;
90
+ --wd-duration-slow: 300ms;
91
+ --wd-ease-default: cubic-bezier(0.4, 0, 0.2, 1);
92
+ }
@@ -0,0 +1,87 @@
1
+ /**
2
+ * @webdevarif/dashui — Semantic Tokens, Dark Mode (Layer 2)
3
+ * Apply via: <html data-dashui-theme="dark">
4
+ */
5
+ [data-dashui-theme="dark"] {
6
+
7
+ /* ─── Surfaces ─── */
8
+ --wd-surface-page: #0A0A0A;
9
+ --wd-surface-card: var(--wd-gray-900);
10
+ --wd-surface-overlay: var(--wd-gray-800);
11
+ --wd-surface-sunken: #050505;
12
+ --wd-surface-raised: var(--wd-gray-800);
13
+ --wd-surface-sidebar: var(--wd-gray-950);
14
+
15
+ /* ─── Text ─── */
16
+ --wd-text-primary: var(--wd-gray-50);
17
+ --wd-text-secondary: var(--wd-gray-400);
18
+ --wd-text-tertiary: var(--wd-gray-500);
19
+ --wd-text-disabled: var(--wd-gray-700);
20
+ --wd-text-inverse: var(--wd-gray-900);
21
+ --wd-text-on-brand: #FFFFFF;
22
+
23
+ /* ─── Brand ─── */
24
+ --wd-brand: var(--wd-brand-400);
25
+ --wd-brand-hover: var(--wd-brand-300);
26
+ --wd-brand-active: var(--wd-brand-200);
27
+ --wd-brand-subtle: rgba(99, 102, 241, 0.12);
28
+ --wd-brand-muted: rgba(99, 102, 241, 0.20);
29
+ --wd-brand-border: rgba(99, 102, 241, 0.30);
30
+
31
+ /* ─── Border ─── */
32
+ --wd-border: var(--wd-gray-800);
33
+ --wd-border-strong: var(--wd-gray-700);
34
+ --wd-border-focus: var(--wd-brand-400);
35
+
36
+ /* ─── Interactive ─── */
37
+ --wd-interactive-bg: var(--wd-gray-900);
38
+ --wd-interactive-hover: var(--wd-gray-800);
39
+ --wd-interactive-active: var(--wd-gray-700);
40
+ --wd-interactive-selected: rgba(99, 102, 241, 0.15);
41
+ --wd-interactive-selected-border: rgba(99, 102, 241, 0.40);
42
+
43
+ /* ─── Button — Primary ─── */
44
+ --wd-btn-primary-bg: var(--wd-brand-500);
45
+ --wd-btn-primary-bg-hover: var(--wd-brand-400);
46
+ --wd-btn-primary-bg-active: var(--wd-brand-300);
47
+ --wd-btn-primary-text: #FFFFFF;
48
+ --wd-btn-primary-border: var(--wd-brand-500);
49
+
50
+ /* ─── Button — Secondary ─── */
51
+ --wd-btn-secondary-bg: var(--wd-gray-800);
52
+ --wd-btn-secondary-bg-hover: var(--wd-gray-700);
53
+ --wd-btn-secondary-bg-active: var(--wd-gray-600);
54
+ --wd-btn-secondary-text: var(--wd-gray-200);
55
+ --wd-btn-secondary-border: var(--wd-gray-700);
56
+
57
+ /* ─── Button — Ghost ─── */
58
+ --wd-btn-ghost-bg: transparent;
59
+ --wd-btn-ghost-bg-hover: var(--wd-gray-800);
60
+ --wd-btn-ghost-text: var(--wd-gray-300);
61
+
62
+ /* ─── Input ─── */
63
+ --wd-input-bg: var(--wd-gray-900);
64
+ --wd-input-bg-hover: var(--wd-gray-800);
65
+ --wd-input-bg-focus: var(--wd-gray-900);
66
+ --wd-input-bg-disabled: var(--wd-gray-950);
67
+ --wd-input-text: var(--wd-gray-100);
68
+ --wd-input-placeholder: var(--wd-gray-600);
69
+ --wd-input-border: var(--wd-gray-700);
70
+ --wd-input-border-focus: var(--wd-brand-400);
71
+ --wd-input-border-error: #F87171;
72
+
73
+ /* ─── Status ─── */
74
+ --wd-status-success: #4ADE80;
75
+ --wd-status-success-bg: rgba(22, 163, 74, 0.15);
76
+ --wd-status-warning: #FCD34D;
77
+ --wd-status-warning-bg: rgba(217, 119, 6, 0.15);
78
+ --wd-status-error: #F87171;
79
+ --wd-status-error-bg: rgba(220, 38, 38, 0.15);
80
+ --wd-status-info: #60A5FA;
81
+ --wd-status-info-bg: rgba(37, 99, 235, 0.15);
82
+
83
+ /* ─── Shadows ─── */
84
+ --wd-shadow-card: 0 1px 3px rgba(0,0,0,0.5);
85
+ --wd-shadow-dropdown: 0 10px 15px rgba(0,0,0,0.6);
86
+ --wd-shadow-modal: 0 20px 40px rgba(0,0,0,0.7);
87
+ }