@loworbitstudio/visor-core 0.4.1 → 0.6.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,479 @@
1
+ @layer visor-primitives, visor-semantic, visor-adaptive, visor-bridge;
2
+
3
+ @layer visor-adaptive {
4
+ /* ── Section 1: Shared tokens (mode-independent) ── */
5
+
6
+ /* --- Primitive: Colors --- */
7
+ .space-theme {
8
+ min-height: 100vh;
9
+ font-size: 1rem;
10
+ background: var(--surface-page, var(--surface-background));
11
+ color: var(--text-primary);
12
+ font-family: var(--font-sans);
13
+
14
+ --color-white: #ffffff;
15
+ --color-black: #000000;
16
+ --color-primary-50: #f2f5ff;
17
+ --color-primary-100: #eef2ff;
18
+ --color-primary-200: #eaeeff;
19
+ --color-primary-300: #e2e9ff;
20
+ --color-primary-400: #d8e1ff;
21
+ --color-primary-500: #5b6fff;
22
+ --color-primary-600: #353ac8;
23
+ --color-primary-700: #281fb0;
24
+ --color-primary-800: #1b0b86;
25
+ --color-primary-900: #0e005a;
26
+ --color-primary-950: #04002d;
27
+ --color-accent-50: #f2f5ff;
28
+ --color-accent-100: #eef2ff;
29
+ --color-accent-200: #eaeeff;
30
+ --color-accent-300: #e2e9ff;
31
+ --color-accent-400: #d8e1ff;
32
+ --color-accent-500: #5b6fff;
33
+ --color-accent-600: #353ac8;
34
+ --color-accent-700: #281fb0;
35
+ --color-accent-800: #1b0b86;
36
+ --color-accent-900: #0e005a;
37
+ --color-accent-950: #04002d;
38
+ --color-neutral-50: #f5f5f8;
39
+ --color-neutral-100: #f1f1f8;
40
+ --color-neutral-200: #ecedf8;
41
+ --color-neutral-300: #e5e6f5;
42
+ --color-neutral-400: #dcdceb;
43
+ --color-neutral-500: #6c6c79;
44
+ --color-neutral-600: #545460;
45
+ --color-neutral-700: #41414d;
46
+ --color-neutral-800: #2d2d38;
47
+ --color-neutral-900: #191924;
48
+ --color-neutral-950: #080810;
49
+ --color-success-50: #e8fbeb;
50
+ --color-success-100: #defde3;
51
+ --color-success-500: #22c55e;
52
+ --color-success-600: #00672b;
53
+ --color-success-700: #005120;
54
+ --color-success-900: #002209;
55
+ --color-warning-50: #fff3e6;
56
+ --color-warning-100: #fff1e3;
57
+ --color-warning-500: #f59e0b;
58
+ --color-warning-600: #774a01;
59
+ --color-warning-700: #5e3900;
60
+ --color-warning-900: #281600;
61
+ --color-error-50: #fff2f0;
62
+ --color-error-100: #ffefed;
63
+ --color-error-500: #ef4444;
64
+ --color-error-600: #a30016;
65
+ --color-error-700: #81000f;
66
+ --color-error-900: #3a0003;
67
+ --color-info-50: #ecf7ff;
68
+ --color-info-100: #e8f5ff;
69
+ --color-info-500: #0ea5e9;
70
+ --color-info-600: #005c85;
71
+ --color-info-700: #004869;
72
+ --color-info-900: #001d2e;
73
+ }
74
+
75
+
76
+ /* --- Primitive: Spacing --- */
77
+ .space-theme {
78
+ --spacing-0: 0;
79
+ --spacing-1: 0.25rem;
80
+ --spacing-2: 0.5rem;
81
+ --spacing-3: 0.75rem;
82
+ --spacing-4: 1rem;
83
+ --spacing-5: 1.25rem;
84
+ --spacing-6: 1.5rem;
85
+ --spacing-8: 2rem;
86
+ --spacing-10: 2.5rem;
87
+ --spacing-12: 3rem;
88
+ --spacing-16: 4rem;
89
+ --spacing-20: 5rem;
90
+ --spacing-24: 6rem;
91
+ }
92
+
93
+
94
+ /* --- Primitive: Border Radius --- */
95
+ .space-theme {
96
+ --radius-none: 0;
97
+ --radius-sm: 0.25rem; /* 4px */
98
+ --radius-md: 0.375rem; /* 6px */
99
+ --radius-lg: 0.5rem; /* 8px */
100
+ --radius-xl: 0.75rem; /* 12px */
101
+ --radius-2xl: 0.9997499999999999rem; /* 16px */
102
+ --radius-3xl: 1.5rem; /* 24px */
103
+ --radius-full: 9999px;
104
+ }
105
+
106
+
107
+ /* --- Primitive: Typography --- */
108
+ .space-theme {
109
+ --font-display: Satoshi;
110
+ --font-sans: Satoshi;
111
+ --font-heading: var(--font-sans);
112
+ --font-body: Satoshi;
113
+ --font-mono: Monaspace Neon;
114
+ --font-size-xs: 0.75rem; /* 12px */
115
+ --font-size-sm: 0.875rem; /* 14px */
116
+ --font-size-base: 1rem; /* 16px */
117
+ --font-size-lg: 1.125rem; /* 18px */
118
+ --font-size-xl: 1.25rem; /* 20px */
119
+ --font-size-2xl: 1.5rem; /* 24px */
120
+ --font-size-3xl: 1.875rem; /* 30px */
121
+ --font-size-4xl: 2.25rem; /* 36px */
122
+ --font-weight-normal: 400;
123
+ --font-weight-medium: 500;
124
+ --font-weight-semibold: 700;
125
+ --font-weight-bold: 700;
126
+ --line-height-none: 1;
127
+ --line-height-tight: 1.25;
128
+ --line-height-snug: 1.375;
129
+ --line-height-normal: 1.5;
130
+ --line-height-relaxed: 1.625;
131
+ --line-height-loose: 2;
132
+ --letter-spacing-normal: 0.05em;
133
+ }
134
+
135
+
136
+ /* --- Primitive: Shadows --- */
137
+ .space-theme {
138
+ --shadow-xs: 0 1px 2px rgba(91, 111, 255, 0.08);
139
+ --shadow-sm: 0 1px 3px rgba(91, 111, 255, 0.1);
140
+ --shadow-md: 0 4px 12px rgba(91, 111, 255, 0.12);
141
+ --shadow-lg: 0 10px 24px rgba(91, 111, 255, 0.14);
142
+ --shadow-xl: 0 20px 40px rgba(91, 111, 255, 0.16);
143
+ }
144
+
145
+
146
+ /* --- Primitive: Motion --- */
147
+ .space-theme {
148
+ --motion-duration-100: 100ms;
149
+ --motion-duration-150: 150ms;
150
+ --motion-duration-200: 200ms;
151
+ --motion-duration-300: 300ms;
152
+ --motion-duration-500: 400ms;
153
+ --motion-duration-800: 800ms;
154
+ --motion-easing-linear: linear;
155
+ --motion-easing-ease-in: cubic-bezier(0.4, 0, 1, 1);
156
+ --motion-easing-ease-out: cubic-bezier(0, 0, 0.2, 1);
157
+ --motion-easing-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
158
+ --motion-easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
159
+ }
160
+
161
+
162
+ /* --- Primitive: Miscellaneous --- */
163
+ .space-theme {
164
+ --border-width-1: 1px;
165
+ --border-width-2: 2px;
166
+ --border-width-3: 3px;
167
+ --border-width-4: 4px;
168
+ --z-base: 0;
169
+ --z-raised: 1;
170
+ --z-dropdown: 1000;
171
+ --z-sticky: 1100;
172
+ --z-modal: 1300;
173
+ --z-popover: 1400;
174
+ --z-toast: 1500;
175
+ --overlay-bg: rgba(0, 0, 0, 0.5);
176
+ --focus-ring-width: 2px;
177
+ --focus-ring-offset: 2px;
178
+ }
179
+
180
+
181
+ /* ── Section 2: Dark mode overrides ── */
182
+
183
+ /* --- Adaptive: Text (dark) — manual toggle --- */
184
+ .dark .space-theme {
185
+ --text-primary: #e8e8f0;
186
+ --text-secondary: rgba(232, 232, 240, 0.72);
187
+ --text-tertiary: rgba(232, 232, 240, 0.5);
188
+ --text-disabled: #545460;
189
+ --text-inverse: #191924;
190
+ --text-inverse-secondary: #41414d;
191
+ --text-link: #8b9fff;
192
+ --text-link-hover: #e2e9ff;
193
+ --text-success: #22c55e;
194
+ --text-warning: #f59e0b;
195
+ --text-error: #ef4444;
196
+ --text-info: #0ea5e9;
197
+ }
198
+
199
+
200
+ /* --- Adaptive: Surface (dark) — manual toggle --- */
201
+ .dark .space-theme {
202
+ --surface-page: #080810;
203
+ --surface-card: #0e0e18;
204
+ --surface-popover: #0e0e18;
205
+ --surface-subtle: #2d2d38;
206
+ --surface-muted: #41414d;
207
+ --surface-overlay: #080810;
208
+ --surface-interactive-default: #2d2d38;
209
+ --surface-interactive-hover: #41414d;
210
+ --surface-interactive-active: #545460;
211
+ --surface-interactive-disabled: #2d2d38;
212
+ --surface-selected: #1b0b86;
213
+ --surface-accent-subtle: #0e005a;
214
+ --surface-accent-default: #5b6fff;
215
+ --surface-accent-strong: #d8e1ff;
216
+ --surface-success-subtle: #002209;
217
+ --surface-success-default: #22c55e;
218
+ --surface-warning-subtle: #281600;
219
+ --surface-warning-default: #f59e0b;
220
+ --surface-error-subtle: #3a0003;
221
+ --surface-error-default: #ef4444;
222
+ --surface-info-subtle: #001d2e;
223
+ --surface-info-default: #0ea5e9;
224
+ --surface-elev-0: #080810;
225
+ --surface-elev-1: #191924;
226
+ --surface-elev-2: #2d2d38;
227
+ --surface-elev-3: #41414d;
228
+ --surface-elev-4: #545460;
229
+ }
230
+
231
+
232
+ /* --- Adaptive: Border (dark) — manual toggle --- */
233
+ .dark .space-theme {
234
+ --border-default: #41414d;
235
+ --border-muted: #2d2d38;
236
+ --border-strong: #545460;
237
+ --border-focus: #5b6fff;
238
+ --border-disabled: #2d2d38;
239
+ --border-success: #22c55e;
240
+ --border-warning: #f59e0b;
241
+ --border-error: #ef4444;
242
+ --border-info: #0ea5e9;
243
+ }
244
+
245
+
246
+ /* --- Adaptive: Interactive (dark) — manual toggle --- */
247
+ .dark .space-theme {
248
+ --interactive-primary-bg: #5b6fff;
249
+ --interactive-primary-bg-hover: #d8e1ff;
250
+ --interactive-primary-bg-active: #e2e9ff;
251
+ --interactive-primary-text: #ffffff;
252
+ --interactive-secondary-bg: #2d2d38;
253
+ --interactive-secondary-bg-hover: #41414d;
254
+ --interactive-secondary-bg-active: #545460;
255
+ --interactive-secondary-text: #f5f5f8;
256
+ --interactive-secondary-border: #545460;
257
+ --interactive-destructive-bg: #ef4444;
258
+ --interactive-destructive-bg-hover: #a30016;
259
+ --interactive-destructive-text: #ffffff;
260
+ --interactive-ghost-bg: #2d2d38;
261
+ --interactive-ghost-bg-hover: #41414d;
262
+ }
263
+
264
+
265
+ /* --- Adaptive: Text (dark) — prefers-color-scheme --- */
266
+ @media (prefers-color-scheme: dark) {
267
+ .space-theme:not(.light) {
268
+ --text-primary: #e8e8f0;
269
+ --text-secondary: rgba(232, 232, 240, 0.72);
270
+ --text-tertiary: rgba(232, 232, 240, 0.5);
271
+ --text-disabled: #545460;
272
+ --text-inverse: #191924;
273
+ --text-inverse-secondary: #41414d;
274
+ --text-link: #8b9fff;
275
+ --text-link-hover: #e2e9ff;
276
+ --text-success: #22c55e;
277
+ --text-warning: #f59e0b;
278
+ --text-error: #ef4444;
279
+ --text-info: #0ea5e9;
280
+ }
281
+ }
282
+
283
+
284
+ /* --- Adaptive: Surface (dark) — prefers-color-scheme --- */
285
+ @media (prefers-color-scheme: dark) {
286
+ .space-theme:not(.light) {
287
+ --surface-page: #080810;
288
+ --surface-card: #0e0e18;
289
+ --surface-popover: #0e0e18;
290
+ --surface-subtle: #2d2d38;
291
+ --surface-muted: #41414d;
292
+ --surface-overlay: #080810;
293
+ --surface-interactive-default: #2d2d38;
294
+ --surface-interactive-hover: #41414d;
295
+ --surface-interactive-active: #545460;
296
+ --surface-interactive-disabled: #2d2d38;
297
+ --surface-selected: #1b0b86;
298
+ --surface-accent-subtle: #0e005a;
299
+ --surface-accent-default: #5b6fff;
300
+ --surface-accent-strong: #d8e1ff;
301
+ --surface-success-subtle: #002209;
302
+ --surface-success-default: #22c55e;
303
+ --surface-warning-subtle: #281600;
304
+ --surface-warning-default: #f59e0b;
305
+ --surface-error-subtle: #3a0003;
306
+ --surface-error-default: #ef4444;
307
+ --surface-info-subtle: #001d2e;
308
+ --surface-info-default: #0ea5e9;
309
+ --surface-elev-0: #080810;
310
+ --surface-elev-1: #191924;
311
+ --surface-elev-2: #2d2d38;
312
+ --surface-elev-3: #41414d;
313
+ --surface-elev-4: #545460;
314
+ }
315
+ }
316
+
317
+
318
+ /* --- Adaptive: Border (dark) — prefers-color-scheme --- */
319
+ @media (prefers-color-scheme: dark) {
320
+ .space-theme:not(.light) {
321
+ --border-default: #41414d;
322
+ --border-muted: #2d2d38;
323
+ --border-strong: #545460;
324
+ --border-focus: #5b6fff;
325
+ --border-disabled: #2d2d38;
326
+ --border-success: #22c55e;
327
+ --border-warning: #f59e0b;
328
+ --border-error: #ef4444;
329
+ --border-info: #0ea5e9;
330
+ }
331
+ }
332
+
333
+
334
+ /* --- Adaptive: Interactive (dark) — prefers-color-scheme --- */
335
+ @media (prefers-color-scheme: dark) {
336
+ .space-theme:not(.light) {
337
+ --interactive-primary-bg: #5b6fff;
338
+ --interactive-primary-bg-hover: #d8e1ff;
339
+ --interactive-primary-bg-active: #e2e9ff;
340
+ --interactive-primary-text: #ffffff;
341
+ --interactive-secondary-bg: #2d2d38;
342
+ --interactive-secondary-bg-hover: #41414d;
343
+ --interactive-secondary-bg-active: #545460;
344
+ --interactive-secondary-text: #f5f5f8;
345
+ --interactive-secondary-border: #545460;
346
+ --interactive-destructive-bg: #ef4444;
347
+ --interactive-destructive-bg-hover: #a30016;
348
+ --interactive-destructive-text: #ffffff;
349
+ --interactive-ghost-bg: #2d2d38;
350
+ --interactive-ghost-bg-hover: #41414d;
351
+ }
352
+ }
353
+
354
+
355
+ /* ── Section 3: Light mode overrides ── */
356
+
357
+ /* --- Adaptive: Text (light) --- */
358
+ html:not(.dark) .space-theme {
359
+ --text-primary: #1a1630;
360
+ --text-secondary: rgba(26, 22, 48, 0.72);
361
+ --text-tertiary: rgba(26, 22, 48, 0.65);
362
+ --text-disabled: #e5e6f5;
363
+ --text-inverse: #ffffff;
364
+ --text-inverse-secondary: #ecedf8;
365
+ --text-link: #5b6fff;
366
+ --text-link-hover: #281fb0;
367
+ --text-success: #005120;
368
+ --text-warning: #5e3900;
369
+ --text-error: #81000f;
370
+ --text-info: #004869;
371
+ }
372
+
373
+
374
+ /* --- Adaptive: Surface (light) --- */
375
+ html:not(.dark) .space-theme {
376
+ --surface-page: #e0ddef;
377
+ --surface-card: #f2f0f8;
378
+ --surface-popover: #f2f0f8;
379
+ --surface-subtle: #f5f5f8;
380
+ --surface-muted: #f1f1f8;
381
+ --surface-overlay: #191924;
382
+ --surface-interactive-default: #ffffff;
383
+ --surface-interactive-hover: #f5f5f8;
384
+ --surface-interactive-active: #f1f1f8;
385
+ --surface-interactive-disabled: #f5f5f8;
386
+ --surface-selected: #eef2ff;
387
+ --surface-accent-subtle: #f2f5ff;
388
+ --surface-accent-default: #5b6fff;
389
+ --surface-accent-strong: #353ac8;
390
+ --surface-success-subtle: #e8fbeb;
391
+ --surface-success-default: #22c55e;
392
+ --surface-warning-subtle: #fff3e6;
393
+ --surface-warning-default: #f59e0b;
394
+ --surface-error-subtle: #fff2f0;
395
+ --surface-error-default: #ef4444;
396
+ --surface-info-subtle: #ecf7ff;
397
+ --surface-info-default: #0ea5e9;
398
+ --surface-elev-0: #ffffff;
399
+ --surface-elev-1: #f5f5f8;
400
+ --surface-elev-2: #f1f1f8;
401
+ --surface-elev-3: #ecedf8;
402
+ --surface-elev-4: #e5e6f5;
403
+ }
404
+
405
+
406
+ /* --- Adaptive: Border (light) --- */
407
+ html:not(.dark) .space-theme {
408
+ --border-default: #ecedf8;
409
+ --border-muted: #f1f1f8;
410
+ --border-strong: #e5e6f5;
411
+ --border-focus: #5b6fff;
412
+ --border-disabled: #f1f1f8;
413
+ --border-success: #22c55e;
414
+ --border-warning: #f59e0b;
415
+ --border-error: #ef4444;
416
+ --border-info: #0ea5e9;
417
+ }
418
+
419
+
420
+ /* --- Adaptive: Interactive (light) --- */
421
+ html:not(.dark) .space-theme {
422
+ --interactive-primary-bg: #5b6fff;
423
+ --interactive-primary-bg-hover: #281fb0;
424
+ --interactive-primary-bg-active: #1b0b86;
425
+ --interactive-primary-text: #ffffff;
426
+ --interactive-secondary-bg: #ffffff;
427
+ --interactive-secondary-bg-hover: #f5f5f8;
428
+ --interactive-secondary-bg-active: #f1f1f8;
429
+ --interactive-secondary-text: #191924;
430
+ --interactive-secondary-border: #e5e6f5;
431
+ --interactive-destructive-bg: #a30016;
432
+ --interactive-destructive-bg-hover: #81000f;
433
+ --interactive-destructive-text: #ffffff;
434
+ --interactive-ghost-bg: #ffffff;
435
+ --interactive-ghost-bg-hover: #f1f1f8;
436
+ }
437
+
438
+
439
+ /* --- Fumadocs bridge: dark --- */
440
+ .dark .space-theme {
441
+ --color-fd-background: #080810;
442
+ --color-fd-foreground: #e8e8f0;
443
+ --color-fd-card: #0e0e18;
444
+ --color-fd-card-foreground: #e8e8f0;
445
+ --color-fd-border: #41414d;
446
+ --color-fd-muted: #41414d;
447
+ --color-fd-muted-foreground: rgba(232, 232, 240, 0.72);
448
+ --color-fd-accent: #5b6fff;
449
+ --color-fd-accent-foreground: #ffffff;
450
+ --color-fd-primary: #5b6fff;
451
+ --color-fd-primary-foreground: #ffffff;
452
+ --color-fd-secondary: #41414d;
453
+ --color-fd-secondary-foreground: #e8e8f0;
454
+ --color-fd-popover: #0e0e18;
455
+ --color-fd-popover-foreground: #e8e8f0;
456
+ --color-fd-ring: #5b6fff;
457
+ }
458
+
459
+
460
+ /* --- Fumadocs bridge: light --- */
461
+ html:not(.dark) .space-theme {
462
+ --color-fd-background: #e0ddef;
463
+ --color-fd-foreground: #1a1630;
464
+ --color-fd-card: #f2f0f8;
465
+ --color-fd-card-foreground: #1a1630;
466
+ --color-fd-border: #ecedf8;
467
+ --color-fd-muted: #f1f1f8;
468
+ --color-fd-muted-foreground: rgba(26, 22, 48, 0.72);
469
+ --color-fd-accent: #5b6fff;
470
+ --color-fd-accent-foreground: #ffffff;
471
+ --color-fd-primary: #5b6fff;
472
+ --color-fd-primary-foreground: #ffffff;
473
+ --color-fd-secondary: #f1f1f8;
474
+ --color-fd-secondary-foreground: #1a1630;
475
+ --color-fd-popover: #f2f0f8;
476
+ --color-fd-popover-foreground: #1a1630;
477
+ --color-fd-ring: #5b6fff;
478
+ }
479
+ }
package/dist/tokens.css CHANGED
@@ -5,10 +5,12 @@
5
5
  ============================================ */
6
6
 
7
7
  /* Import order: primitives → semantic → adaptive */
8
+ @layer visor-primitives, visor-semantic, visor-adaptive, visor-bridge;
8
9
 
9
10
  /* ============================================
10
- Tier 1: Primitives
11
+ Tier 1: Primitives → @layer visor-primitives
11
12
  ============================================ */
13
+ @layer visor-primitives {
12
14
  /* --- Primitive: Colors --- */
13
15
  :root {
14
16
  --color-neutral-50: #f9fafb;
@@ -103,6 +105,15 @@
103
105
  }
104
106
 
105
107
 
108
+ /* --- Primitive: Stroke Widths --- */
109
+ :root {
110
+ --stroke-width-thin: 1px;
111
+ --stroke-width-regular: 1.5px;
112
+ --stroke-width-medium: 2px;
113
+ --stroke-width-thick: 2.5px;
114
+ }
115
+
116
+
106
117
  /* --- Primitive: Font Families --- */
107
118
  :root {
108
119
  --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
@@ -112,6 +123,7 @@
112
123
 
113
124
  /* --- Primitive: Font Sizes --- */
114
125
  :root {
126
+ --font-size-2xs: 0.6875rem; /* 11px */
115
127
  --font-size-xs: 0.75rem; /* 12px */
116
128
  --font-size-sm: 0.875rem; /* 14px */
117
129
  --font-size-base: 1rem; /* 16px */
@@ -165,6 +177,19 @@
165
177
  }
166
178
 
167
179
 
180
+ /* --- Primitive: Opacity --- */
181
+ :root {
182
+ --opacity-5: 0.05;
183
+ --opacity-10: 0.1;
184
+ --opacity-12: 0.12;
185
+ --opacity-20: 0.2;
186
+ --opacity-40: 0.4;
187
+ --opacity-50: 0.5;
188
+ --opacity-60: 0.6;
189
+ --opacity-80: 0.8;
190
+ }
191
+
192
+
168
193
  /* --- Primitive: Overlay --- */
169
194
  :root {
170
195
  --overlay-bg: rgba(0, 0, 0, 0.5);
@@ -197,10 +222,12 @@
197
222
  --motion-easing-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
198
223
  --motion-easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
199
224
  }
225
+ }
200
226
 
201
227
  /* ============================================
202
- Tier 2: Semantic
228
+ Tier 2: Semantic → @layer visor-semantic
203
229
  ============================================ */
230
+ @layer visor-semantic {
204
231
  /* --- Semantic: Text --- */
205
232
  :root {
206
233
  --text-primary: var(--color-neutral-900);
@@ -230,6 +257,7 @@
230
257
  --surface-interactive-hover: var(--color-neutral-50);
231
258
  --surface-interactive-active: var(--color-neutral-100);
232
259
  --surface-interactive-disabled: var(--color-neutral-50);
260
+ --surface-selected: var(--color-primary-100);
233
261
  --surface-accent-subtle: var(--color-primary-50);
234
262
  --surface-accent-default: var(--color-primary-500);
235
263
  --surface-accent-strong: var(--color-primary-600);
@@ -241,6 +269,11 @@
241
269
  --surface-error-default: var(--color-error-500);
242
270
  --surface-info-subtle: var(--color-info-50);
243
271
  --surface-info-default: var(--color-info-500);
272
+ --surface-elev-0: var(--color-neutral-950);
273
+ --surface-elev-1: var(--color-neutral-900);
274
+ --surface-elev-2: var(--color-neutral-800);
275
+ --surface-elev-3: var(--color-neutral-700);
276
+ --surface-elev-4: var(--color-neutral-600);
244
277
  }
245
278
 
246
279
 
@@ -365,10 +398,12 @@
365
398
  --sidebar-ring: var(--color-primary-500);
366
399
  --sidebar-text-muted: var(--color-neutral-500);
367
400
  }
401
+ }
368
402
 
369
403
  /* ============================================
370
- Tier 3: Adaptive — Light Theme (:root)
404
+ Tier 3: Adaptive — Light + Dark → @layer visor-adaptive
371
405
  ============================================ */
406
+ @layer visor-adaptive {
372
407
  /* --- Adaptive: Text (light) --- */
373
408
  :root {
374
409
  --text-primary: var(--color-neutral-900);
@@ -398,6 +433,7 @@
398
433
  --surface-interactive-hover: var(--color-neutral-50);
399
434
  --surface-interactive-active: var(--color-neutral-100);
400
435
  --surface-interactive-disabled: var(--color-neutral-50);
436
+ --surface-selected: var(--color-primary-100);
401
437
  --surface-accent-subtle: var(--color-primary-50);
402
438
  --surface-accent-default: var(--color-primary-500);
403
439
  --surface-accent-strong: var(--color-primary-600);
@@ -409,6 +445,11 @@
409
445
  --surface-error-default: var(--color-error-500);
410
446
  --surface-info-subtle: var(--color-info-50);
411
447
  --surface-info-default: var(--color-info-500);
448
+ --surface-elev-0: var(--color-white);
449
+ --surface-elev-1: var(--color-neutral-50);
450
+ --surface-elev-2: var(--color-neutral-100);
451
+ --surface-elev-3: var(--color-neutral-200);
452
+ --surface-elev-4: var(--color-neutral-300);
412
453
  }
413
454
 
414
455
 
@@ -486,10 +527,8 @@
486
527
  --sidebar-text-muted: var(--color-neutral-500);
487
528
  }
488
529
 
489
- /* ============================================
490
- Tier 3: Adaptive — Dark Theme (.dark, .theme-dark, [data-theme="dark"])
491
- and @media (prefers-color-scheme: dark)
492
- ============================================ */
530
+
531
+
493
532
  /* --- Adaptive: Text (dark) — manual toggle --- */
494
533
  .dark,
495
534
  .theme-dark,
@@ -523,6 +562,7 @@
523
562
  --surface-interactive-hover: var(--color-neutral-700);
524
563
  --surface-interactive-active: var(--color-neutral-600);
525
564
  --surface-interactive-disabled: var(--color-neutral-800);
565
+ --surface-selected: var(--color-primary-800);
526
566
  --surface-accent-subtle: var(--color-primary-900);
527
567
  --surface-accent-default: var(--color-primary-500);
528
568
  --surface-accent-strong: var(--color-primary-400);
@@ -534,6 +574,11 @@
534
574
  --surface-error-default: var(--color-error-500);
535
575
  --surface-info-subtle: var(--color-info-900);
536
576
  --surface-info-default: var(--color-info-500);
577
+ --surface-elev-0: var(--color-neutral-950);
578
+ --surface-elev-1: var(--color-neutral-900);
579
+ --surface-elev-2: var(--color-neutral-800);
580
+ --surface-elev-3: var(--color-neutral-700);
581
+ --surface-elev-4: var(--color-neutral-600);
537
582
  }
538
583
 
539
584
 
@@ -656,6 +701,7 @@
656
701
  --surface-interactive-hover: var(--color-neutral-700);
657
702
  --surface-interactive-active: var(--color-neutral-600);
658
703
  --surface-interactive-disabled: var(--color-neutral-800);
704
+ --surface-selected: var(--color-primary-800);
659
705
  --surface-accent-subtle: var(--color-primary-900);
660
706
  --surface-accent-default: var(--color-primary-500);
661
707
  --surface-accent-strong: var(--color-primary-400);
@@ -667,6 +713,11 @@
667
713
  --surface-error-default: var(--color-error-500);
668
714
  --surface-info-subtle: var(--color-info-900);
669
715
  --surface-info-default: var(--color-info-500);
716
+ --surface-elev-0: var(--color-neutral-950);
717
+ --surface-elev-1: var(--color-neutral-900);
718
+ --surface-elev-2: var(--color-neutral-800);
719
+ --surface-elev-3: var(--color-neutral-700);
720
+ --surface-elev-4: var(--color-neutral-600);
670
721
  }
671
722
  }
672
723
 
@@ -756,7 +807,7 @@
756
807
  --sidebar-text-muted: var(--color-neutral-400);
757
808
  }
758
809
  }
759
-
810
+ }
760
811
  /* ============================================
761
812
  Global: Motion Safety
762
813
  ============================================ */
@@ -0,0 +1,23 @@
1
+ /* ============================================
2
+ Visor Design Tokens — Utilities
3
+ Generated by @loworbitstudio/visor-core
4
+ DO NOT EDIT — run `npm run build` to regenerate
5
+ ============================================ */
6
+ @layer visor-primitives, visor-semantic, visor-adaptive, visor-bridge;
7
+
8
+ @layer visor-adaptive {
9
+ /* --- Typography Utilities --- */
10
+ .eyebrow {
11
+ font-size: var(--font-size-2xs);
12
+ font-weight: var(--font-weight-medium);
13
+ letter-spacing: 0.16em;
14
+ text-transform: uppercase;
15
+ color: var(--text-tertiary);
16
+ }
17
+
18
+ .label-tiny {
19
+ font-size: var(--font-size-2xs);
20
+ font-weight: var(--font-weight-medium);
21
+ color: var(--text-tertiary);
22
+ }
23
+ }