@usevyre/react 1.0.0 → 1.0.1

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,2511 @@
1
+ /* ============================================================
2
+ @vyre/react — Component Styles
3
+
4
+ REQUIRES: @import "@vyre/tokens/css" before this file.
5
+
6
+ AI CONTEXT:
7
+ - All colors reference var(--vyre-color-semantic-*) tokens
8
+ - All spacing uses var(--vyre-spacing-*) tokens
9
+ - All typography uses var(--vyre-typography-font-*) tokens
10
+ - Component classes follow BEM: .vyre-[component]__[element]--[modifier]
11
+ ============================================================ */
12
+
13
+ /* ── RESET (scoped) ──────────────────────────────────────────── */
14
+ *, *::before, *::after { box-sizing: border-box; }
15
+
16
+ /* ── BUTTON ──────────────────────────────────────────────────── */
17
+ .vyre-btn {
18
+ display: inline-flex;
19
+ align-items: center;
20
+ justify-content: center;
21
+ gap: var(--vyre-spacing-2);
22
+ padding: var(--vyre-spacing-3) var(--vyre-spacing-5);
23
+ font-family: var(--vyre-typography-font-family-body);
24
+ font-size: var(--vyre-typography-font-size-sm);
25
+ font-weight: var(--vyre-typography-font-weight-medium);
26
+ line-height: 1;
27
+ letter-spacing: 0.01em;
28
+ border: 1px solid transparent;
29
+ border-radius: var(--vyre-border-radius-md);
30
+ cursor: pointer;
31
+ text-decoration: none;
32
+ white-space: nowrap;
33
+ user-select: none;
34
+ -webkit-user-select: none;
35
+ transition:
36
+ background var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
37
+ border-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
38
+ color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
39
+ box-shadow var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
40
+ transform var(--vyre-transition-duration-fast) var(--vyre-transition-easing-spring);
41
+ position: relative;
42
+ overflow: hidden;
43
+ }
44
+
45
+ .vyre-btn:focus-visible {
46
+ outline: 2px solid var(--vyre-color-semantic-accent);
47
+ outline-offset: 3px;
48
+ }
49
+
50
+ .vyre-btn:active:not([aria-disabled="true"]) {
51
+ transform: scale(0.97);
52
+ }
53
+
54
+ .vyre-btn[aria-disabled="true"],
55
+ .vyre-btn:disabled {
56
+ opacity: 0.45;
57
+ cursor: not-allowed;
58
+ pointer-events: none;
59
+ }
60
+
61
+ /* Button — sizes */
62
+ .vyre-btn--sm {
63
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-3);
64
+ font-size: var(--vyre-typography-font-size-xs);
65
+ border-radius: var(--vyre-border-radius-sm);
66
+ gap: var(--vyre-spacing-1);
67
+ }
68
+ .vyre-btn--md { /* default — already set on base */ }
69
+ .vyre-btn--lg {
70
+ padding: var(--vyre-spacing-4) var(--vyre-spacing-8);
71
+ font-size: var(--vyre-typography-font-size-md);
72
+ border-radius: var(--vyre-border-radius-lg);
73
+ }
74
+ .vyre-btn--icon {
75
+ padding: var(--vyre-spacing-2);
76
+ width: 2rem;
77
+ height: 2rem;
78
+ border-radius: var(--vyre-border-radius-md);
79
+ flex-shrink: 0;
80
+ }
81
+
82
+ /* Button — variants */
83
+ .vyre-btn--primary {
84
+ background: var(--vyre-color-semantic-text-primary);
85
+ color: var(--vyre-color-semantic-background);
86
+ border-color: var(--vyre-color-semantic-text-primary);
87
+ }
88
+ .vyre-btn--primary:hover:not([aria-disabled="true"]) {
89
+ background: var(--vyre-color-semantic-text-secondary);
90
+ border-color: var(--vyre-color-semantic-text-secondary);
91
+ }
92
+
93
+ .vyre-btn--secondary {
94
+ background: var(--vyre-color-semantic-surface-raised);
95
+ color: var(--vyre-color-semantic-text-primary);
96
+ border-color: var(--vyre-color-semantic-border);
97
+ }
98
+ .vyre-btn--secondary:hover:not([aria-disabled="true"]) {
99
+ background: var(--vyre-color-semantic-border);
100
+ }
101
+
102
+ .vyre-btn--ghost {
103
+ background: transparent;
104
+ color: var(--vyre-color-semantic-text-secondary);
105
+ border-color: transparent;
106
+ }
107
+ .vyre-btn--ghost:hover:not([aria-disabled="true"]) {
108
+ background: var(--vyre-color-semantic-surface-raised);
109
+ color: var(--vyre-color-semantic-text-primary);
110
+ }
111
+
112
+ .vyre-btn--accent {
113
+ background: var(--vyre-color-semantic-accent);
114
+ color: var(--vyre-color-semantic-accent-foreground);
115
+ border-color: var(--vyre-color-semantic-accent);
116
+ }
117
+ .vyre-btn--accent:hover:not([aria-disabled="true"]) {
118
+ background: var(--vyre-color-semantic-accent-hover);
119
+ border-color: var(--vyre-color-semantic-accent-hover);
120
+ box-shadow: var(--vyre-shadow-glow-accent);
121
+ }
122
+
123
+ .vyre-btn--teal {
124
+ background: transparent;
125
+ color: var(--vyre-color-semantic-teal);
126
+ border-color: var(--vyre-color-semantic-teal);
127
+ }
128
+ .vyre-btn--teal:hover:not([aria-disabled="true"]) {
129
+ background: var(--vyre-color-semantic-teal-subtle);
130
+ box-shadow: var(--vyre-shadow-glow-teal);
131
+ }
132
+
133
+ .vyre-btn--danger {
134
+ background: transparent;
135
+ color: var(--vyre-color-semantic-danger);
136
+ border-color: var(--vyre-color-semantic-danger);
137
+ }
138
+ .vyre-btn--danger:hover:not([aria-disabled="true"]) {
139
+ background: var(--vyre-color-semantic-danger-subtle);
140
+ }
141
+
142
+ /* Button — internal elements */
143
+ .vyre-btn__label { flex: 1; }
144
+ .vyre-btn__icon { display: inline-flex; align-items: center; flex-shrink: 0; }
145
+ .vyre-btn__icon--left { margin-right: calc(-1 * var(--vyre-spacing-1)); }
146
+ .vyre-btn__icon--right { margin-left: calc(-1 * var(--vyre-spacing-1)); }
147
+
148
+ .vyre-btn--loading .vyre-btn__label { opacity: 0.7; }
149
+
150
+ /* Spinner animation */
151
+ @keyframes vyre-spin {
152
+ to { transform: rotate(360deg); }
153
+ }
154
+ .vyre-spinner {
155
+ animation: vyre-spin 0.8s linear infinite;
156
+ flex-shrink: 0;
157
+ }
158
+
159
+ /* ── BADGE ───────────────────────────────────────────────────── */
160
+ .vyre-badge {
161
+ display: inline-flex;
162
+ align-items: center;
163
+ gap: var(--vyre-spacing-1);
164
+ padding: 2px var(--vyre-spacing-2);
165
+ font-family: var(--vyre-typography-font-family-mono);
166
+ font-size: var(--vyre-typography-font-size-xs);
167
+ font-weight: var(--vyre-typography-font-weight-medium);
168
+ line-height: 1.5;
169
+ border-radius: var(--vyre-border-radius-full);
170
+ border: 1px solid;
171
+ letter-spacing: 0.04em;
172
+ white-space: nowrap;
173
+ }
174
+
175
+ .vyre-badge--default {
176
+ background: var(--vyre-color-semantic-surface-raised);
177
+ color: var(--vyre-color-semantic-text-secondary);
178
+ border-color: var(--vyre-color-semantic-border);
179
+ }
180
+ .vyre-badge--accent {
181
+ background: var(--vyre-color-semantic-accent-subtle);
182
+ color: var(--vyre-color-semantic-accent);
183
+ border-color: var(--vyre-color-semantic-accent-subtle-border);
184
+ }
185
+ .vyre-badge--teal {
186
+ background: var(--vyre-color-semantic-teal-subtle);
187
+ color: var(--vyre-color-semantic-teal);
188
+ border-color: var(--vyre-color-semantic-teal-subtle);
189
+ }
190
+ .vyre-badge--success {
191
+ background: var(--vyre-color-semantic-success-subtle);
192
+ color: var(--vyre-color-semantic-success);
193
+ border-color: var(--vyre-color-semantic-success-subtle-border);
194
+ }
195
+ .vyre-badge--warning {
196
+ background: var(--vyre-color-semantic-warning-subtle);
197
+ color: var(--vyre-color-semantic-warning);
198
+ border-color: var(--vyre-color-semantic-warning-subtle-border);
199
+ }
200
+ .vyre-badge--danger {
201
+ background: var(--vyre-color-semantic-danger-subtle);
202
+ color: var(--vyre-color-semantic-danger);
203
+ border-color: var(--vyre-color-semantic-danger-subtle-border);
204
+ }
205
+
206
+ .vyre-badge__dot {
207
+ width: 5px;
208
+ height: 5px;
209
+ border-radius: 50%;
210
+ background: currentColor;
211
+ flex-shrink: 0;
212
+ }
213
+
214
+ /* ── CARD ────────────────────────────────────────────────────── */
215
+ .vyre-card {
216
+ background: var(--vyre-color-semantic-surface);
217
+ border: 1px solid var(--vyre-color-semantic-border-subtle);
218
+ border-radius: var(--vyre-border-radius-xl);
219
+ overflow: hidden;
220
+ transition:
221
+ border-color var(--vyre-transition-duration-normal) var(--vyre-transition-easing-out),
222
+ box-shadow var(--vyre-transition-duration-normal) var(--vyre-transition-easing-out);
223
+ }
224
+
225
+ .vyre-card--default { /* base styles above */ }
226
+ .vyre-card--elevated {
227
+ background: var(--vyre-color-semantic-surface-raised);
228
+ box-shadow: var(--vyre-shadow-md);
229
+ }
230
+ .vyre-card--outlined {
231
+ background: transparent;
232
+ border-color: var(--vyre-color-semantic-border);
233
+ }
234
+ .vyre-card--ghost {
235
+ background: transparent;
236
+ border-color: transparent;
237
+ }
238
+ .vyre-card--accent {
239
+ background: var(--vyre-color-semantic-accent-subtle);
240
+ border-color: var(--vyre-color-semantic-accent-subtle-border);
241
+ }
242
+
243
+ .vyre-card--hoverable:hover,
244
+ .vyre-card--clickable:hover {
245
+ border-color: var(--vyre-color-semantic-border);
246
+ box-shadow: var(--vyre-shadow-md);
247
+ }
248
+ .vyre-card--clickable {
249
+ cursor: pointer;
250
+ }
251
+ .vyre-card--clickable:focus-visible {
252
+ outline: 2px solid var(--vyre-color-semantic-accent);
253
+ outline-offset: 3px;
254
+ }
255
+
256
+ /* Card slots */
257
+ .vyre-card__header { padding: var(--vyre-spacing-6) var(--vyre-spacing-6) 0; }
258
+ .vyre-card__body { padding: var(--vyre-spacing-6); }
259
+ .vyre-card__footer {
260
+ padding: 0 var(--vyre-spacing-6) var(--vyre-spacing-6);
261
+ display: flex;
262
+ align-items: center;
263
+ gap: var(--vyre-spacing-3);
264
+ }
265
+
266
+ .vyre-card__header + .vyre-card__body { padding-top: var(--vyre-spacing-4); }
267
+ .vyre-card__body + .vyre-card__footer { padding-top: 0; }
268
+
269
+ /* ── FIELD / INPUT ───────────────────────────────────────────── */
270
+ .vyre-field {
271
+ display: flex;
272
+ flex-direction: column;
273
+ gap: var(--vyre-spacing-2);
274
+ }
275
+
276
+ .vyre-field__label {
277
+ font-size: var(--vyre-typography-font-size-sm);
278
+ font-weight: var(--vyre-typography-font-weight-medium);
279
+ color: var(--vyre-color-semantic-text-secondary);
280
+ letter-spacing: 0.01em;
281
+ font-family: var(--vyre-typography-font-family-body);
282
+ }
283
+
284
+ .vyre-field__required {
285
+ color: var(--vyre-color-semantic-danger);
286
+ margin-left: var(--vyre-spacing-1);
287
+ }
288
+
289
+ .vyre-field__hint {
290
+ font-size: var(--vyre-typography-font-size-xs);
291
+ color: var(--vyre-color-semantic-text-muted);
292
+ font-family: var(--vyre-typography-font-family-mono);
293
+ line-height: var(--vyre-typography-line-height-normal);
294
+ }
295
+
296
+ .vyre-field--error .vyre-field__hint { color: var(--vyre-color-semantic-danger); }
297
+ .vyre-field--success .vyre-field__hint { color: var(--vyre-color-semantic-teal); }
298
+ .vyre-field--warning .vyre-field__hint { color: var(--vyre-color-semantic-warning); }
299
+
300
+ /* Input base */
301
+ .vyre-input,
302
+ .vyre-textarea {
303
+ background: var(--vyre-color-semantic-surface-raised);
304
+ border: 1px solid var(--vyre-color-semantic-border);
305
+ border-radius: var(--vyre-border-radius-md);
306
+ color: var(--vyre-color-semantic-text-primary);
307
+ font-family: var(--vyre-typography-font-family-body);
308
+ font-size: var(--vyre-typography-font-size-sm);
309
+ padding: var(--vyre-spacing-3) var(--vyre-spacing-4);
310
+ width: 100%;
311
+ transition:
312
+ border-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
313
+ box-shadow var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
314
+ outline: none;
315
+ -webkit-appearance: none;
316
+ line-height: var(--vyre-typography-line-height-normal);
317
+ }
318
+
319
+ .vyre-input::placeholder,
320
+ .vyre-textarea::placeholder {
321
+ color: var(--vyre-color-semantic-text-muted);
322
+ }
323
+
324
+ .vyre-input:focus,
325
+ .vyre-textarea:focus {
326
+ border-color: var(--vyre-color-semantic-accent);
327
+ box-shadow: 0 0 0 3px var(--vyre-color-semantic-accent-subtle);
328
+ }
329
+
330
+ .vyre-field--error .vyre-input,
331
+ .vyre-field--error .vyre-textarea { border-color: var(--vyre-color-semantic-danger); }
332
+ .vyre-field--error .vyre-input:focus,
333
+ .vyre-field--error .vyre-textarea:focus {
334
+ box-shadow: 0 0 0 3px var(--vyre-color-semantic-danger-subtle);
335
+ }
336
+ .vyre-field--success .vyre-input { border-color: var(--vyre-color-semantic-teal); }
337
+
338
+ /* Input sizes */
339
+ .vyre-input--sm { padding: var(--vyre-spacing-2) var(--vyre-spacing-3); font-size: var(--vyre-typography-font-size-xs); }
340
+ .vyre-input--lg { padding: var(--vyre-spacing-4) var(--vyre-spacing-5); font-size: var(--vyre-typography-font-size-md); }
341
+
342
+ /* Input with icon wrapper */
343
+ .vyre-input-wrapper {
344
+ position: relative;
345
+ display: flex;
346
+ align-items: center;
347
+ }
348
+
349
+ .vyre-input__element {
350
+ position: absolute;
351
+ display: flex;
352
+ align-items: center;
353
+ color: var(--vyre-color-semantic-text-muted);
354
+ pointer-events: none;
355
+ }
356
+ .vyre-input__element--left { left: var(--vyre-spacing-3); }
357
+ .vyre-input__element--right { right: var(--vyre-spacing-3); }
358
+
359
+ .vyre-input--has-left { padding-left: 2.25rem; }
360
+ .vyre-input--has-right { padding-right: 2.25rem; }
361
+
362
+ /* Textarea */
363
+ .vyre-textarea {
364
+ min-height: 100px;
365
+ }
366
+
367
+ /* ── MODAL ───────────────────────────────────────────────────── */
368
+ @keyframes vyre-backdrop-in {
369
+ from { opacity: 0; }
370
+ to { opacity: 1; }
371
+ }
372
+
373
+ @keyframes vyre-modal-in {
374
+ from { opacity: 0; transform: scale(0.96) translateY(-8px); }
375
+ to { opacity: 1; transform: scale(1) translateY(0); }
376
+ }
377
+
378
+ .vyre-modal-backdrop {
379
+ position: fixed;
380
+ inset: 0;
381
+ background: rgba(0, 0, 0, 0.45);
382
+ backdrop-filter: blur(6px);
383
+ -webkit-backdrop-filter: blur(6px);
384
+ z-index: 1000;
385
+ display: flex;
386
+ align-items: center;
387
+ justify-content: center;
388
+ padding: var(--vyre-spacing-4);
389
+ animation: vyre-backdrop-in var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
390
+ }
391
+
392
+ .vyre-modal {
393
+ background: var(--vyre-color-semantic-surface-overlay);
394
+ border: 1px solid var(--vyre-color-semantic-border);
395
+ border-radius: var(--vyre-border-radius-2xl);
396
+ box-shadow: var(--vyre-shadow-xl);
397
+ width: 100%;
398
+ max-height: calc(100dvh - var(--vyre-spacing-16));
399
+ overflow-y: auto;
400
+ outline: none;
401
+ animation: vyre-modal-in var(--vyre-transition-duration-normal) var(--vyre-transition-easing-spring);
402
+ }
403
+
404
+ .vyre-modal--sm { max-width: 24rem; }
405
+ .vyre-modal--md { max-width: 32rem; }
406
+ .vyre-modal--lg { max-width: 52rem; }
407
+ .vyre-modal--full {
408
+ max-width: 100%;
409
+ max-height: 100dvh;
410
+ height: 100dvh;
411
+ border-radius: 0;
412
+ margin: 0;
413
+ }
414
+
415
+ .vyre-modal__header {
416
+ padding: var(--vyre-spacing-6) var(--vyre-spacing-6) var(--vyre-spacing-4);
417
+ display: flex;
418
+ align-items: flex-start;
419
+ justify-content: space-between;
420
+ gap: var(--vyre-spacing-4);
421
+ border-bottom: 1px solid var(--vyre-color-semantic-border-subtle);
422
+ }
423
+
424
+ .vyre-modal__body {
425
+ padding: var(--vyre-spacing-6);
426
+ }
427
+
428
+ .vyre-modal__footer {
429
+ padding: var(--vyre-spacing-4) var(--vyre-spacing-6) var(--vyre-spacing-6);
430
+ display: flex;
431
+ align-items: center;
432
+ justify-content: flex-end;
433
+ gap: var(--vyre-spacing-3);
434
+ border-top: 1px solid var(--vyre-color-semantic-border-subtle);
435
+ }
436
+
437
+ /* ── TOAST ───────────────────────────────────────────────────── */
438
+ @keyframes vyre-toast-in {
439
+ from { opacity: 0; transform: translateX(110%); }
440
+ to { opacity: 1; transform: translateX(0); }
441
+ }
442
+
443
+ .vyre-toast-viewport {
444
+ position: fixed;
445
+ bottom: var(--vyre-spacing-6);
446
+ right: var(--vyre-spacing-6);
447
+ z-index: 2000;
448
+ display: flex;
449
+ flex-direction: column;
450
+ gap: var(--vyre-spacing-2);
451
+ max-width: 22rem;
452
+ width: calc(100vw - var(--vyre-spacing-12));
453
+ pointer-events: none;
454
+ }
455
+
456
+ .vyre-toast {
457
+ background: var(--vyre-color-semantic-surface-overlay);
458
+ border: 1px solid var(--vyre-color-semantic-border);
459
+ border-radius: var(--vyre-border-radius-lg);
460
+ box-shadow: var(--vyre-shadow-lg);
461
+ padding: var(--vyre-spacing-4);
462
+ display: flex;
463
+ align-items: flex-start;
464
+ gap: var(--vyre-spacing-3);
465
+ pointer-events: all;
466
+ animation: vyre-toast-in var(--vyre-transition-duration-normal) var(--vyre-transition-easing-spring);
467
+ }
468
+
469
+ .vyre-toast--success { border-left: 3px solid var(--vyre-color-semantic-success); }
470
+ .vyre-toast--warning { border-left: 3px solid var(--vyre-color-semantic-warning); }
471
+ .vyre-toast--danger { border-left: 3px solid var(--vyre-color-semantic-danger); }
472
+
473
+ .vyre-toast__content {
474
+ flex: 1;
475
+ min-width: 0;
476
+ }
477
+
478
+ .vyre-toast__title {
479
+ font-family: var(--vyre-typography-font-family-body);
480
+ font-size: var(--vyre-typography-font-size-sm);
481
+ font-weight: var(--vyre-typography-font-weight-semibold);
482
+ color: var(--vyre-color-semantic-text-primary);
483
+ margin: 0;
484
+ line-height: var(--vyre-typography-line-height-tight);
485
+ }
486
+
487
+ .vyre-toast__description {
488
+ font-family: var(--vyre-typography-font-family-body);
489
+ font-size: var(--vyre-typography-font-size-xs);
490
+ color: var(--vyre-color-semantic-text-secondary);
491
+ margin: var(--vyre-spacing-1) 0 0;
492
+ line-height: var(--vyre-typography-line-height-normal);
493
+ }
494
+
495
+ .vyre-toast__close {
496
+ background: none;
497
+ border: none;
498
+ cursor: pointer;
499
+ color: var(--vyre-color-semantic-text-muted);
500
+ padding: 2px;
501
+ border-radius: var(--vyre-border-radius-sm);
502
+ display: flex;
503
+ align-items: center;
504
+ flex-shrink: 0;
505
+ transition: color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
506
+ }
507
+
508
+ .vyre-toast__close:hover { color: var(--vyre-color-semantic-text-primary); }
509
+
510
+ .vyre-toast__close:focus-visible {
511
+ outline: 2px solid var(--vyre-color-semantic-accent);
512
+ outline-offset: 2px;
513
+ }
514
+
515
+ /* ── SELECT ──────────────────────────────────────────────────── */
516
+ @keyframes vyre-select-in {
517
+ from { opacity: 0; transform: translateY(-6px); }
518
+ to { opacity: 1; transform: translateY(0); }
519
+ }
520
+
521
+ .vyre-select {
522
+ position: relative;
523
+ display: block;
524
+ width: 100%;
525
+ }
526
+
527
+ .vyre-select__trigger {
528
+ width: 100%;
529
+ background: var(--vyre-color-semantic-surface-raised);
530
+ border: 1px solid var(--vyre-color-semantic-border);
531
+ border-radius: var(--vyre-border-radius-md);
532
+ color: var(--vyre-color-semantic-text-primary);
533
+ font-family: var(--vyre-typography-font-family-body);
534
+ font-size: var(--vyre-typography-font-size-sm);
535
+ padding: var(--vyre-spacing-3) var(--vyre-spacing-4);
536
+ display: flex;
537
+ align-items: center;
538
+ justify-content: space-between;
539
+ gap: var(--vyre-spacing-2);
540
+ cursor: pointer;
541
+ text-align: left;
542
+ outline: none;
543
+ transition:
544
+ border-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
545
+ box-shadow var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
546
+ }
547
+
548
+ .vyre-select__trigger:focus-visible,
549
+ .vyre-select__trigger[aria-expanded="true"] {
550
+ border-color: var(--vyre-color-semantic-accent);
551
+ box-shadow: 0 0 0 3px var(--vyre-color-semantic-accent-subtle);
552
+ }
553
+
554
+ .vyre-select__trigger:disabled,
555
+ .vyre-select__trigger[aria-disabled="true"] {
556
+ opacity: 0.45;
557
+ cursor: not-allowed;
558
+ }
559
+
560
+ .vyre-select__placeholder {
561
+ color: var(--vyre-color-semantic-text-muted);
562
+ flex: 1;
563
+ }
564
+
565
+ .vyre-select__value {
566
+ flex: 1;
567
+ overflow: hidden;
568
+ text-overflow: ellipsis;
569
+ white-space: nowrap;
570
+ }
571
+
572
+ .vyre-select__chevron {
573
+ flex-shrink: 0;
574
+ color: var(--vyre-color-semantic-text-muted);
575
+ transition: transform var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
576
+ }
577
+
578
+ .vyre-select__trigger[aria-expanded="true"] .vyre-select__chevron {
579
+ transform: rotate(180deg);
580
+ }
581
+
582
+ .vyre-select__dropdown {
583
+ position: absolute;
584
+ top: calc(100% + var(--vyre-spacing-1));
585
+ left: 0;
586
+ right: 0;
587
+ background: var(--vyre-color-semantic-surface-overlay);
588
+ border: 1px solid var(--vyre-color-semantic-border);
589
+ border-radius: var(--vyre-border-radius-md);
590
+ box-shadow: var(--vyre-shadow-lg);
591
+ overflow-y: auto;
592
+ max-height: 16rem;
593
+ z-index: 200;
594
+ padding: var(--vyre-spacing-1) 0;
595
+ margin: 0;
596
+ list-style: none;
597
+ animation: vyre-select-in var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
598
+ outline: none;
599
+ }
600
+
601
+ .vyre-select__option {
602
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-4);
603
+ cursor: pointer;
604
+ font-family: var(--vyre-typography-font-family-body);
605
+ font-size: var(--vyre-typography-font-size-sm);
606
+ color: var(--vyre-color-semantic-text-primary);
607
+ display: flex;
608
+ align-items: center;
609
+ justify-content: space-between;
610
+ gap: var(--vyre-spacing-2);
611
+ line-height: var(--vyre-typography-line-height-normal);
612
+ transition: background var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
613
+ user-select: none;
614
+ -webkit-user-select: none;
615
+ }
616
+
617
+ .vyre-select__option:hover,
618
+ .vyre-select__option[data-highlighted="true"] {
619
+ background: var(--vyre-color-semantic-surface-raised);
620
+ }
621
+
622
+ .vyre-select__option[aria-selected="true"] {
623
+ color: var(--vyre-color-semantic-accent);
624
+ }
625
+
626
+ .vyre-select__option[aria-disabled="true"] {
627
+ opacity: 0.4;
628
+ cursor: not-allowed;
629
+ pointer-events: none;
630
+ }
631
+
632
+ .vyre-select__check {
633
+ flex-shrink: 0;
634
+ color: var(--vyre-color-semantic-accent);
635
+ }
636
+
637
+ .vyre-select__empty {
638
+ padding: var(--vyre-spacing-4);
639
+ text-align: center;
640
+ font-size: var(--vyre-typography-font-size-sm);
641
+ color: var(--vyre-color-semantic-text-muted);
642
+ font-family: var(--vyre-typography-font-family-body);
643
+ }
644
+
645
+ /* Select size variants */
646
+ .vyre-select--sm .vyre-select__trigger {
647
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-3);
648
+ font-size: var(--vyre-typography-font-size-xs);
649
+ }
650
+
651
+ .vyre-select--lg .vyre-select__trigger {
652
+ padding: var(--vyre-spacing-4) var(--vyre-spacing-5);
653
+ font-size: var(--vyre-typography-font-size-md);
654
+ }
655
+
656
+ /* ── TABS ────────────────────────────────────────────────────── */
657
+ .vyre-tabs {
658
+ display: flex;
659
+ flex-direction: column;
660
+ gap: 0;
661
+ }
662
+
663
+ .vyre-tabs__list {
664
+ display: flex;
665
+ align-items: center;
666
+ gap: 0;
667
+ border-bottom: 1px solid var(--vyre-color-semantic-border-subtle);
668
+ overflow-x: auto;
669
+ scrollbar-width: none;
670
+ -webkit-overflow-scrolling: touch;
671
+ }
672
+ .vyre-tabs__list::-webkit-scrollbar { display: none; }
673
+
674
+ .vyre-tabs__tab {
675
+ padding: var(--vyre-spacing-3) var(--vyre-spacing-4);
676
+ font-family: var(--vyre-typography-font-family-body);
677
+ font-size: var(--vyre-typography-font-size-sm);
678
+ font-weight: var(--vyre-typography-font-weight-medium);
679
+ color: var(--vyre-color-semantic-text-muted);
680
+ background: none;
681
+ border: none;
682
+ border-bottom: 2px solid transparent;
683
+ margin-bottom: -1px;
684
+ cursor: pointer;
685
+ white-space: nowrap;
686
+ outline: none;
687
+ transition:
688
+ color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
689
+ border-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
690
+ }
691
+
692
+ .vyre-tabs__tab:hover:not(:disabled) {
693
+ color: var(--vyre-color-semantic-text-secondary);
694
+ }
695
+
696
+ .vyre-tabs__tab:focus-visible {
697
+ outline: 2px solid var(--vyre-color-semantic-accent);
698
+ outline-offset: -2px;
699
+ border-radius: var(--vyre-border-radius-sm) var(--vyre-border-radius-sm) 0 0;
700
+ }
701
+
702
+ .vyre-tabs__tab--active,
703
+ .vyre-tabs__tab[data-selected="true"] {
704
+ color: var(--vyre-color-semantic-text-primary);
705
+ border-bottom-color: var(--vyre-color-semantic-accent);
706
+ }
707
+
708
+ .vyre-tabs__tab:disabled {
709
+ opacity: 0.4;
710
+ cursor: not-allowed;
711
+ }
712
+
713
+ .vyre-tabs__panels {
714
+ /* layout container for tab panels */
715
+ }
716
+
717
+ .vyre-tabs__panel {
718
+ padding: var(--vyre-spacing-6) 0;
719
+ outline: none;
720
+ }
721
+ .vyre-tabs__panel:focus-visible {
722
+ outline: 2px solid var(--vyre-color-semantic-accent);
723
+ outline-offset: 3px;
724
+ border-radius: var(--vyre-border-radius-sm);
725
+ }
726
+
727
+ /* ── TOOLTIP ─────────────────────────────────────────────────── */
728
+ .vyre-tooltip-wrapper {
729
+ position: relative;
730
+ display: inline-flex;
731
+ align-items: center;
732
+ }
733
+
734
+ .vyre-tooltip {
735
+ position: absolute;
736
+ z-index: 200;
737
+ background: var(--vyre-color-semantic-surface-overlay);
738
+ border: 1px solid var(--vyre-color-semantic-border);
739
+ border-radius: var(--vyre-border-radius-md);
740
+ box-shadow: var(--vyre-shadow-md);
741
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-3);
742
+ font-family: var(--vyre-typography-font-family-body);
743
+ font-size: var(--vyre-typography-font-size-xs);
744
+ color: var(--vyre-color-semantic-text-primary);
745
+ pointer-events: none;
746
+ max-width: 18rem;
747
+ white-space: normal;
748
+ text-align: center;
749
+ animation: vyre-tooltip-in var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out) forwards;
750
+ }
751
+ .vyre-tooltip--leaving {
752
+ animation: vyre-tooltip-out 120ms var(--vyre-transition-easing-out) forwards;
753
+ }
754
+
755
+ @keyframes vyre-tooltip-in {
756
+ from { opacity: 0; transform: var(--_tt) scale(0.92); }
757
+ to { opacity: 1; transform: var(--_tt) scale(1); }
758
+ }
759
+ @keyframes vyre-tooltip-out {
760
+ from { opacity: 1; transform: var(--_tt) scale(1); }
761
+ to { opacity: 0; transform: var(--_tt) scale(0.92); }
762
+ }
763
+
764
+ /* Placement — position + transform-origin for correct scale anchor */
765
+ .vyre-tooltip--top {
766
+ bottom: calc(100% + var(--vyre-spacing-2));
767
+ left: 50%;
768
+ --_tt: translateX(-50%);
769
+ transform-origin: bottom center;
770
+ }
771
+ .vyre-tooltip--bottom {
772
+ top: calc(100% + var(--vyre-spacing-2));
773
+ left: 50%;
774
+ --_tt: translateX(-50%);
775
+ transform-origin: top center;
776
+ }
777
+ .vyre-tooltip--left {
778
+ right: calc(100% + var(--vyre-spacing-2));
779
+ top: 50%;
780
+ --_tt: translateY(-50%);
781
+ transform-origin: center right;
782
+ }
783
+ .vyre-tooltip--right {
784
+ left: calc(100% + var(--vyre-spacing-2));
785
+ top: 50%;
786
+ --_tt: translateY(-50%);
787
+ transform-origin: center left;
788
+ }
789
+
790
+ /* Arrow */
791
+ .vyre-tooltip__arrow {
792
+ position: absolute;
793
+ width: 6px;
794
+ height: 6px;
795
+ background: var(--vyre-color-semantic-surface-overlay);
796
+ border: 1px solid var(--vyre-color-semantic-border);
797
+ transform: rotate(45deg);
798
+ }
799
+
800
+ .vyre-tooltip--top .vyre-tooltip__arrow { bottom: -4px; left: 50%; margin-left: -3px; border-top: none; border-left: none; }
801
+ .vyre-tooltip--bottom .vyre-tooltip__arrow { top: -4px; left: 50%; margin-left: -3px; border-bottom: none; border-right: none; }
802
+ .vyre-tooltip--left .vyre-tooltip__arrow { right: -4px; top: 50%; margin-top: -3px; border-left: none; border-top: none; }
803
+ .vyre-tooltip--right .vyre-tooltip__arrow { left: -4px; top: 50%; margin-top: -3px; border-right: none; border-bottom: none; }
804
+
805
+ /* ── SEPARATOR ───────────────────────────────────────────────── */
806
+ .vyre-separator {
807
+ background: var(--vyre-color-semantic-border-subtle);
808
+ flex-shrink: 0;
809
+ }
810
+ .vyre-separator[data-orientation="horizontal"] { height: 1px; width: 100%; margin: var(--vyre-spacing-2) 0; }
811
+ .vyre-separator[data-orientation="vertical"] { width: 1px; height: 100%; margin: 0 var(--vyre-spacing-2); align-self: stretch; }
812
+
813
+ /* ── LABEL ───────────────────────────────────────────────────── */
814
+ .vyre-label {
815
+ display: inline-flex;
816
+ align-items: center;
817
+ gap: var(--vyre-spacing-1);
818
+ font-family: var(--vyre-typography-font-family-body);
819
+ font-size: var(--vyre-typography-font-size-sm);
820
+ font-weight: var(--vyre-typography-font-weight-medium);
821
+ color: var(--vyre-color-semantic-text-secondary);
822
+ line-height: var(--vyre-typography-line-height-normal);
823
+ cursor: default;
824
+ }
825
+ .vyre-label[data-disabled] { opacity: 0.5; cursor: not-allowed; }
826
+ .vyre-label__required { color: var(--vyre-color-semantic-danger); }
827
+
828
+ /* ── SKELETON ────────────────────────────────────────────────── */
829
+ @keyframes vyre-skeleton-pulse {
830
+ 0%, 100% { opacity: 1; }
831
+ 50% { opacity: 0.4; }
832
+ }
833
+
834
+ .vyre-skeleton {
835
+ background: var(--vyre-color-semantic-surface-raised);
836
+ border-radius: var(--vyre-border-radius-md);
837
+ animation: vyre-skeleton-pulse 1.8s ease-in-out infinite;
838
+ display: block;
839
+ }
840
+ .vyre-skeleton[data-variant="circle"] { border-radius: var(--vyre-border-radius-full); }
841
+ .vyre-skeleton[data-variant="text"] { border-radius: var(--vyre-border-radius-sm); height: 1em; }
842
+
843
+ /* ── AVATAR ──────────────────────────────────────────────────── */
844
+ .vyre-avatar {
845
+ position: relative;
846
+ display: inline-flex;
847
+ align-items: center;
848
+ justify-content: center;
849
+ border-radius: var(--vyre-border-radius-full);
850
+ background: var(--vyre-color-semantic-surface-raised);
851
+ border: 1px solid var(--vyre-color-semantic-border);
852
+ overflow: hidden;
853
+ flex-shrink: 0;
854
+ vertical-align: middle;
855
+ }
856
+ .vyre-avatar[data-size="sm"] { width: 1.75rem; height: 1.75rem; font-size: 0.625rem; }
857
+ .vyre-avatar[data-size="md"] { width: 2.25rem; height: 2.25rem; font-size: 0.75rem; }
858
+ .vyre-avatar[data-size="lg"] { width: 3rem; height: 3rem; font-size: 1rem; }
859
+ .vyre-avatar[data-size="xl"] { width: 4rem; height: 4rem; font-size: 1.25rem; }
860
+
861
+ .vyre-avatar__img {
862
+ width: 100%; height: 100%;
863
+ object-fit: cover;
864
+ border-radius: inherit;
865
+ }
866
+
867
+ .vyre-avatar__fallback {
868
+ font-family: var(--vyre-typography-font-family-body);
869
+ font-weight: var(--vyre-typography-font-weight-semibold);
870
+ color: var(--vyre-color-semantic-text-secondary);
871
+ text-transform: uppercase;
872
+ user-select: none;
873
+ -webkit-user-select: none;
874
+ }
875
+
876
+ .vyre-avatar__status {
877
+ position: absolute;
878
+ bottom: 0; right: 0;
879
+ width: 30%; height: 30%;
880
+ min-width: 8px; min-height: 8px;
881
+ border-radius: 50%;
882
+ border: 2px solid var(--vyre-color-semantic-background);
883
+ }
884
+ .vyre-avatar__status--online { background: var(--vyre-color-semantic-success); }
885
+ .vyre-avatar__status--offline { background: var(--vyre-color-semantic-text-muted); }
886
+ .vyre-avatar__status--busy { background: var(--vyre-color-semantic-danger); }
887
+ .vyre-avatar__status--away { background: var(--vyre-color-semantic-warning); }
888
+
889
+ /* ── ACCORDION ───────────────────────────────────────────────── */
890
+ .vyre-accordion {
891
+ display: flex;
892
+ flex-direction: column;
893
+ width: 100%;
894
+ }
895
+
896
+ .vyre-accordion__item {
897
+ border-bottom: 1px solid var(--vyre-color-semantic-border-subtle);
898
+ }
899
+ .vyre-accordion__item:first-child { border-top: 1px solid var(--vyre-color-semantic-border-subtle); }
900
+
901
+ .vyre-accordion__trigger {
902
+ width: 100%;
903
+ display: flex;
904
+ align-items: center;
905
+ justify-content: space-between;
906
+ gap: var(--vyre-spacing-3);
907
+ padding: var(--vyre-spacing-4) 0;
908
+ background: none;
909
+ border: none;
910
+ cursor: pointer;
911
+ font-family: var(--vyre-typography-font-family-body);
912
+ font-size: var(--vyre-typography-font-size-sm);
913
+ font-weight: var(--vyre-typography-font-weight-medium);
914
+ color: var(--vyre-color-semantic-text-primary);
915
+ text-align: left;
916
+ outline: none;
917
+ transition: color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
918
+ }
919
+ .vyre-accordion__trigger:hover { color: var(--vyre-color-semantic-accent); }
920
+ .vyre-accordion__trigger:focus-visible {
921
+ outline: 2px solid var(--vyre-color-semantic-accent);
922
+ outline-offset: 2px;
923
+ border-radius: var(--vyre-border-radius-sm);
924
+ }
925
+
926
+ .vyre-accordion__trigger-text { display: flex; }
927
+
928
+ .vyre-accordion__chevron {
929
+ flex-shrink: 0;
930
+ color: var(--vyre-color-semantic-text-muted);
931
+ transition: transform var(--vyre-transition-duration-normal) var(--vyre-transition-easing-spring);
932
+ }
933
+ .vyre-accordion__trigger[data-state="open"] .vyre-accordion__chevron {
934
+ transform: rotate(180deg);
935
+ }
936
+
937
+ .vyre-accordion__content { overflow: hidden; }
938
+ .vyre-accordion__content[data-state="closed"] { display: none; }
939
+
940
+ .vyre-accordion__content-inner {
941
+ padding: 0 0 var(--vyre-spacing-4);
942
+ font-size: var(--vyre-typography-font-size-sm);
943
+ color: var(--vyre-color-semantic-text-secondary);
944
+ line-height: var(--vyre-typography-line-height-relaxed);
945
+ }
946
+
947
+ /* ── CHECKBOX ────────────────────────────────────────────────── */
948
+ .vyre-checkbox {
949
+ display: inline-flex;
950
+ align-items: center;
951
+ justify-content: center;
952
+ position: relative;
953
+ flex-shrink: 0;
954
+ }
955
+ .vyre-checkbox--sm { width: 1rem; height: 1rem; }
956
+ .vyre-checkbox--md { width: 1.125rem; height: 1.125rem; }
957
+
958
+ .vyre-checkbox__input {
959
+ position: absolute;
960
+ inset: 0;
961
+ opacity: 0;
962
+ cursor: pointer;
963
+ margin: 0;
964
+ width: 100%; height: 100%;
965
+ }
966
+ .vyre-checkbox__input:disabled { cursor: not-allowed; }
967
+
968
+ .vyre-checkbox__box {
969
+ width: 100%; height: 100%;
970
+ border: 1.5px solid var(--vyre-color-semantic-border-strong);
971
+ border-radius: var(--vyre-border-radius-sm);
972
+ background: var(--vyre-color-semantic-background);
973
+ display: flex;
974
+ align-items: center;
975
+ justify-content: center;
976
+ color: transparent;
977
+ transition:
978
+ background var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
979
+ border-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
980
+ pointer-events: none;
981
+ }
982
+
983
+ .vyre-checkbox__input:checked ~ .vyre-checkbox__box,
984
+ .vyre-checkbox__input:indeterminate ~ .vyre-checkbox__box {
985
+ background: var(--vyre-color-semantic-accent);
986
+ border-color: var(--vyre-color-semantic-accent);
987
+ color: var(--vyre-color-semantic-accent-foreground);
988
+ }
989
+ .vyre-checkbox__input:focus-visible ~ .vyre-checkbox__box {
990
+ outline: 2px solid var(--vyre-color-semantic-accent);
991
+ outline-offset: 2px;
992
+ }
993
+ .vyre-checkbox__input:disabled ~ .vyre-checkbox__box { opacity: 0.45; }
994
+
995
+ /* ── SWITCH ──────────────────────────────────────────────────── */
996
+ .vyre-switch {
997
+ display: inline-flex;
998
+ align-items: center;
999
+ border-radius: var(--vyre-border-radius-full);
1000
+ background: var(--vyre-color-semantic-border);
1001
+ border: none;
1002
+ cursor: pointer;
1003
+ padding: 2px;
1004
+ transition: background var(--vyre-transition-duration-normal) var(--vyre-transition-easing-out);
1005
+ flex-shrink: 0;
1006
+ }
1007
+ .vyre-switch[data-size="sm"] { width: 2rem; height: 1.125rem; }
1008
+ .vyre-switch[data-size="md"] { width: 2.625rem; height: 1.375rem; }
1009
+
1010
+ .vyre-switch[aria-checked="true"] { background: var(--vyre-color-semantic-accent); }
1011
+ .vyre-switch:disabled { opacity: 0.45; cursor: not-allowed; }
1012
+ .vyre-switch:focus-visible {
1013
+ outline: 2px solid var(--vyre-color-semantic-accent);
1014
+ outline-offset: 2px;
1015
+ }
1016
+
1017
+ .vyre-switch__thumb {
1018
+ display: block;
1019
+ border-radius: 50%;
1020
+ background: #fff;
1021
+ box-shadow: var(--vyre-shadow-sm);
1022
+ transition: transform var(--vyre-transition-duration-normal) var(--vyre-transition-easing-spring);
1023
+ }
1024
+ .vyre-switch[data-size="sm"] .vyre-switch__thumb { width: 0.75rem; height: 0.75rem; }
1025
+ .vyre-switch[data-size="md"] .vyre-switch__thumb { width: 1rem; height: 1rem; }
1026
+
1027
+ .vyre-switch[data-size="sm"][aria-checked="true"] .vyre-switch__thumb { transform: translateX(0.875rem); }
1028
+ .vyre-switch[data-size="md"][aria-checked="true"] .vyre-switch__thumb { transform: translateX(1.25rem); }
1029
+
1030
+ /* ── PROGRESS ────────────────────────────────────────────────── */
1031
+ @keyframes vyre-progress-indeterminate {
1032
+ 0% { transform: translateX(-100%) scaleX(0.5); }
1033
+ 50% { transform: translateX(0%) scaleX(0.8); }
1034
+ 100% { transform: translateX(100%) scaleX(0.5); }
1035
+ }
1036
+
1037
+ .vyre-progress {
1038
+ width: 100%;
1039
+ background: var(--vyre-color-semantic-surface-raised);
1040
+ border-radius: var(--vyre-border-radius-full);
1041
+ overflow: hidden;
1042
+ }
1043
+ .vyre-progress[data-size="sm"] { height: 4px; }
1044
+ .vyre-progress[data-size="md"] { height: 6px; }
1045
+ .vyre-progress[data-size="lg"] { height: 10px; }
1046
+
1047
+ .vyre-progress__bar {
1048
+ height: 100%;
1049
+ border-radius: inherit;
1050
+ background: var(--vyre-color-semantic-accent);
1051
+ transition: width var(--vyre-transition-duration-normal) var(--vyre-transition-easing-out);
1052
+ }
1053
+ .vyre-progress[data-variant="teal"] .vyre-progress__bar { background: var(--vyre-color-semantic-teal); }
1054
+ .vyre-progress[data-variant="success"] .vyre-progress__bar { background: var(--vyre-color-semantic-success); }
1055
+ .vyre-progress[data-variant="danger"] .vyre-progress__bar { background: var(--vyre-color-semantic-danger); }
1056
+
1057
+ .vyre-progress[data-indeterminate] .vyre-progress__bar {
1058
+ width: 40% !important;
1059
+ animation: vyre-progress-indeterminate 1.4s ease-in-out infinite;
1060
+ }
1061
+
1062
+ /* ── SLIDER ──────────────────────────────────────────────────── */
1063
+ .vyre-slider {
1064
+ position: relative;
1065
+ display: flex;
1066
+ align-items: center;
1067
+ width: 100%;
1068
+ user-select: none;
1069
+ -webkit-user-select: none;
1070
+ }
1071
+ .vyre-slider--sm { height: 1.25rem; }
1072
+ .vyre-slider--md { height: 1.5rem; }
1073
+
1074
+ .vyre-slider__input {
1075
+ position: absolute;
1076
+ inset: 0;
1077
+ width: 100%;
1078
+ height: 100%;
1079
+ opacity: 0;
1080
+ cursor: pointer;
1081
+ margin: 0;
1082
+ z-index: 1;
1083
+ }
1084
+ .vyre-slider__input:disabled { cursor: not-allowed; }
1085
+
1086
+ .vyre-slider__track {
1087
+ position: relative;
1088
+ width: 100%;
1089
+ height: 4px;
1090
+ background: var(--vyre-color-semantic-surface-raised);
1091
+ border-radius: var(--vyre-border-radius-full);
1092
+ overflow: visible;
1093
+ }
1094
+
1095
+ .vyre-slider__fill {
1096
+ position: absolute;
1097
+ left: 0; top: 0; bottom: 0;
1098
+ background: var(--vyre-color-semantic-accent);
1099
+ border-radius: inherit;
1100
+ transition: width var(--vyre-transition-duration-instant) linear;
1101
+ }
1102
+
1103
+ .vyre-slider__thumb {
1104
+ position: absolute;
1105
+ top: 50%;
1106
+ width: 1rem; height: 1rem;
1107
+ margin-left: -0.5rem;
1108
+ transform: translateY(-50%);
1109
+ background: #fff;
1110
+ border: 2px solid var(--vyre-color-semantic-accent);
1111
+ border-radius: 50%;
1112
+ box-shadow: var(--vyre-shadow-sm);
1113
+ transition: left var(--vyre-transition-duration-instant) linear,
1114
+ box-shadow var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
1115
+ pointer-events: none;
1116
+ }
1117
+ .vyre-slider__input:focus-visible ~ .vyre-slider__track .vyre-slider__thumb {
1118
+ box-shadow: 0 0 0 3px var(--vyre-color-semantic-accent-subtle);
1119
+ }
1120
+
1121
+ /* ── Popover ─────────────────────────────────────────────────── */
1122
+
1123
+ @keyframes vyre-popover-in {
1124
+ from { opacity: 0; transform: scale(0.95); }
1125
+ to { opacity: 1; transform: scale(1); }
1126
+ }
1127
+ @keyframes vyre-popover-out {
1128
+ from { opacity: 1; transform: scale(1); }
1129
+ to { opacity: 0; transform: scale(0.95); }
1130
+ }
1131
+
1132
+ .vyre-popover {
1133
+ position: absolute;
1134
+ z-index: 50;
1135
+ min-width: 14rem;
1136
+ max-width: 20rem;
1137
+ background: var(--vyre-color-semantic-surface-overlay);
1138
+ border: 1px solid var(--vyre-color-semantic-border);
1139
+ border-radius: var(--vyre-radius-lg);
1140
+ box-shadow: var(--vyre-shadow-lg);
1141
+ padding: var(--vyre-spacing-3);
1142
+ color: var(--vyre-color-semantic-text-primary);
1143
+ font-size: var(--vyre-typography-font-size-sm);
1144
+ animation: vyre-popover-in var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out) forwards;
1145
+ }
1146
+ .vyre-popover--leaving {
1147
+ animation: vyre-popover-out 120ms var(--vyre-transition-easing-out) forwards;
1148
+ }
1149
+ /* transform-origin for scale animation — based on which side the popover appears */
1150
+ .vyre-popover--top { transform-origin: bottom center; }
1151
+ .vyre-popover--bottom { transform-origin: top center; }
1152
+ .vyre-popover--left { transform-origin: center right; }
1153
+ .vyre-popover--right { transform-origin: center left; }
1154
+
1155
+ /* ── DropdownMenu ─────────────────────────────────────────────── */
1156
+
1157
+ @keyframes vyre-dropdown-in {
1158
+ from { opacity: 0; transform: translateY(-4px) scale(0.97); }
1159
+ to { opacity: 1; transform: translateY(0) scale(1); }
1160
+ }
1161
+ @keyframes vyre-dropdown-out {
1162
+ from { opacity: 1; transform: translateY(0) scale(1); }
1163
+ to { opacity: 0; transform: translateY(-4px) scale(0.97); }
1164
+ }
1165
+
1166
+ .vyre-dropdown {
1167
+ position: absolute;
1168
+ z-index: 50;
1169
+ min-width: 10rem;
1170
+ background: var(--vyre-color-semantic-surface-overlay);
1171
+ border: 1px solid var(--vyre-color-semantic-border);
1172
+ border-radius: var(--vyre-radius-md);
1173
+ box-shadow: var(--vyre-shadow-lg);
1174
+ padding: var(--vyre-spacing-1) 0;
1175
+ animation: vyre-dropdown-in var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out) forwards;
1176
+ transform-origin: top left;
1177
+ outline: none;
1178
+ }
1179
+ .vyre-dropdown--end { transform-origin: top right; }
1180
+ .vyre-dropdown--top { transform-origin: bottom left; }
1181
+ .vyre-dropdown--top.vyre-dropdown--end { transform-origin: bottom right; }
1182
+ .vyre-dropdown--leaving {
1183
+ animation: vyre-dropdown-out 120ms var(--vyre-transition-easing-out) forwards;
1184
+ }
1185
+
1186
+ .vyre-dropdown__item {
1187
+ display: flex;
1188
+ align-items: center;
1189
+ gap: var(--vyre-spacing-2);
1190
+ width: 100%;
1191
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-3);
1192
+ background: none;
1193
+ border: none;
1194
+ border-radius: 0;
1195
+ font-size: var(--vyre-typography-font-size-sm);
1196
+ color: var(--vyre-color-semantic-text-primary);
1197
+ text-align: left;
1198
+ cursor: pointer;
1199
+ outline: none;
1200
+ transition: background var(--vyre-transition-duration-instant) ease;
1201
+ }
1202
+ .vyre-dropdown__item:hover,
1203
+ .vyre-dropdown__item:focus {
1204
+ background: var(--vyre-color-semantic-surface-raised);
1205
+ }
1206
+ .vyre-dropdown__item[aria-disabled="true"],
1207
+ .vyre-dropdown__item:disabled {
1208
+ opacity: 0.4;
1209
+ cursor: not-allowed;
1210
+ pointer-events: none;
1211
+ }
1212
+ .vyre-dropdown__item--danger { color: var(--vyre-color-semantic-danger); }
1213
+ .vyre-dropdown__item--danger:hover,
1214
+ .vyre-dropdown__item--danger:focus {
1215
+ background: var(--vyre-color-semantic-danger-subtle);
1216
+ }
1217
+
1218
+ .vyre-dropdown__item-icon {
1219
+ display: flex;
1220
+ align-items: center;
1221
+ flex-shrink: 0;
1222
+ opacity: 0.7;
1223
+ }
1224
+ .vyre-dropdown__item-label { flex: 1; }
1225
+ .vyre-dropdown__item-shortcut {
1226
+ font-size: var(--vyre-typography-font-size-xs);
1227
+ color: var(--vyre-color-semantic-text-muted);
1228
+ font-family: inherit;
1229
+ background: none;
1230
+ border: none;
1231
+ padding: 0;
1232
+ margin-left: auto;
1233
+ }
1234
+ .vyre-dropdown__separator {
1235
+ height: 1px;
1236
+ background: var(--vyre-color-semantic-border-subtle);
1237
+ margin: var(--vyre-spacing-1) 0;
1238
+ }
1239
+
1240
+ .vyre-dropdown__label {
1241
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-3) calc(var(--vyre-spacing-1) / 2);
1242
+ font-size: var(--vyre-typography-font-size-xs);
1243
+ font-weight: 600;
1244
+ color: var(--vyre-color-semantic-text-muted);
1245
+ letter-spacing: 0.04em;
1246
+ text-transform: uppercase;
1247
+ user-select: none;
1248
+ }
1249
+
1250
+ /* Checkbox + Radio indicator column */
1251
+ .vyre-dropdown__item--checkbox,
1252
+ .vyre-dropdown__item--radio {
1253
+ padding-left: var(--vyre-spacing-2);
1254
+ }
1255
+ .vyre-dropdown__item-indicator {
1256
+ display: flex;
1257
+ align-items: center;
1258
+ justify-content: center;
1259
+ flex-shrink: 0;
1260
+ width: 1rem;
1261
+ height: 1rem;
1262
+ color: var(--vyre-color-semantic-accent);
1263
+ }
1264
+
1265
+ /* Sub-menu trigger */
1266
+ .vyre-dropdown__item--sub { justify-content: space-between; }
1267
+ .vyre-dropdown__item-chevron {
1268
+ display: flex;
1269
+ align-items: center;
1270
+ flex-shrink: 0;
1271
+ opacity: 0.5;
1272
+ margin-left: auto;
1273
+ padding-left: var(--vyre-spacing-2);
1274
+ }
1275
+
1276
+ /* Sub-menu panel — same card style, no entrance animation needed */
1277
+ .vyre-dropdown--sub {
1278
+ animation: vyre-dropdown-in var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out) forwards;
1279
+ transform-origin: top left;
1280
+ }
1281
+ .vyre-dropdown--sub-left { transform-origin: top right; }
1282
+
1283
+ /* ── Alert ───────────────────────────────────────────────────── */
1284
+
1285
+ .vyre-alert {
1286
+ display: flex;
1287
+ align-items: flex-start;
1288
+ gap: var(--vyre-spacing-3);
1289
+ padding: var(--vyre-spacing-3) var(--vyre-spacing-4);
1290
+ border-radius: var(--vyre-radius-md);
1291
+ border-width: 1px;
1292
+ border-style: solid;
1293
+ font-size: var(--vyre-typography-font-size-sm);
1294
+ }
1295
+
1296
+ .vyre-alert--info {
1297
+ background: rgba(var(--vyre-color-primitive-blue-500-rgb, 59,130,246), 0.06);
1298
+ border-color: rgba(var(--vyre-color-primitive-blue-500-rgb, 59,130,246), 0.25);
1299
+ color: var(--vyre-color-semantic-text-primary);
1300
+ }
1301
+ .vyre-alert--info .vyre-alert__icon { color: #3b82f6; }
1302
+
1303
+ .vyre-alert--success {
1304
+ background: var(--vyre-color-semantic-success-subtle);
1305
+ border-color: rgba(var(--vyre-color-primitive-green-600-rgb, 22,163,74), 0.25);
1306
+ color: var(--vyre-color-semantic-text-primary);
1307
+ }
1308
+ .vyre-alert--success .vyre-alert__icon { color: var(--vyre-color-semantic-success); }
1309
+
1310
+ .vyre-alert--warning {
1311
+ background: var(--vyre-color-semantic-warning-subtle);
1312
+ border-color: rgba(var(--vyre-color-primitive-amber-500-rgb, 245,158,11), 0.3);
1313
+ color: var(--vyre-color-semantic-text-primary);
1314
+ }
1315
+ .vyre-alert--warning .vyre-alert__icon { color: var(--vyre-color-semantic-warning); }
1316
+
1317
+ .vyre-alert--danger {
1318
+ background: var(--vyre-color-semantic-danger-subtle);
1319
+ border-color: rgba(var(--vyre-color-primitive-red-600-rgb, 220,38,38), 0.25);
1320
+ color: var(--vyre-color-semantic-text-primary);
1321
+ }
1322
+ .vyre-alert--danger .vyre-alert__icon { color: var(--vyre-color-semantic-danger); }
1323
+
1324
+ .vyre-alert__icon {
1325
+ display: flex;
1326
+ align-items: center;
1327
+ flex-shrink: 0;
1328
+ margin-top: 1px;
1329
+ }
1330
+ .vyre-alert__body { flex: 1; min-width: 0; }
1331
+ .vyre-alert__title {
1332
+ margin: 0 0 2px;
1333
+ font-weight: 600;
1334
+ font-size: var(--vyre-typography-font-size-sm);
1335
+ }
1336
+ .vyre-alert__description {
1337
+ margin: 0;
1338
+ opacity: 0.85;
1339
+ line-height: 1.5;
1340
+ }
1341
+ .vyre-alert__close {
1342
+ display: flex;
1343
+ align-items: center;
1344
+ justify-content: center;
1345
+ flex-shrink: 0;
1346
+ background: none;
1347
+ border: none;
1348
+ border-radius: var(--vyre-radius-sm);
1349
+ color: var(--vyre-color-semantic-text-muted);
1350
+ cursor: pointer;
1351
+ padding: 2px;
1352
+ margin-top: 1px;
1353
+ transition: color var(--vyre-transition-duration-instant) ease,
1354
+ background var(--vyre-transition-duration-instant) ease;
1355
+ }
1356
+ .vyre-alert__close:hover {
1357
+ color: var(--vyre-color-semantic-text-primary);
1358
+ background: var(--vyre-color-semantic-surface-raised);
1359
+ }
1360
+ .vyre-alert__close:focus-visible {
1361
+ outline: 2px solid var(--vyre-color-semantic-accent);
1362
+ outline-offset: 2px;
1363
+ }
1364
+
1365
+ /* ── AlertDialog ─────────────────────────────────────────────── */
1366
+
1367
+ @keyframes vyre-alert-dialog-in {
1368
+ from { opacity: 0; transform: scale(0.96) translateY(8px); }
1369
+ to { opacity: 1; transform: scale(1) translateY(0); }
1370
+ }
1371
+
1372
+ .vyre-alert-dialog-backdrop {
1373
+ position: fixed;
1374
+ inset: 0;
1375
+ z-index: 60;
1376
+ background: rgba(0, 0, 0, 0.55);
1377
+ display: flex;
1378
+ align-items: center;
1379
+ justify-content: center;
1380
+ padding: var(--vyre-spacing-4);
1381
+ backdrop-filter: blur(2px);
1382
+ }
1383
+ .vyre-alert-dialog {
1384
+ width: 100%;
1385
+ max-width: 26rem;
1386
+ background: var(--vyre-color-semantic-surface-overlay);
1387
+ border: 1px solid var(--vyre-color-semantic-border);
1388
+ border-radius: var(--vyre-radius-xl);
1389
+ box-shadow: var(--vyre-shadow-xl);
1390
+ padding: var(--vyre-spacing-6);
1391
+ animation: vyre-alert-dialog-in var(--vyre-transition-duration-normal) var(--vyre-transition-easing-spring);
1392
+ outline: none;
1393
+ }
1394
+ .vyre-alert-dialog__icon-wrap {
1395
+ display: flex;
1396
+ justify-content: center;
1397
+ margin-bottom: var(--vyre-spacing-4);
1398
+ }
1399
+ .vyre-alert-dialog__icon {
1400
+ display: flex;
1401
+ align-items: center;
1402
+ justify-content: center;
1403
+ width: 2.5rem;
1404
+ height: 2.5rem;
1405
+ border-radius: 50%;
1406
+ }
1407
+ .vyre-alert-dialog__icon--danger { background: var(--vyre-color-semantic-danger-subtle); color: var(--vyre-color-semantic-danger); }
1408
+ .vyre-alert-dialog__icon--warning { background: var(--vyre-color-semantic-warning-subtle); color: var(--vyre-color-semantic-warning); }
1409
+ .vyre-alert-dialog__icon--info { background: var(--vyre-color-semantic-accent-subtle); color: var(--vyre-color-semantic-accent); }
1410
+
1411
+ .vyre-alert-dialog__body { text-align: center; margin-bottom: var(--vyre-spacing-6); }
1412
+ .vyre-alert-dialog__title {
1413
+ margin: 0 0 var(--vyre-spacing-2);
1414
+ font-size: var(--vyre-typography-font-size-lg);
1415
+ font-weight: 600;
1416
+ color: var(--vyre-color-semantic-text-primary);
1417
+ }
1418
+ .vyre-alert-dialog__description {
1419
+ margin: 0;
1420
+ font-size: var(--vyre-typography-font-size-sm);
1421
+ color: var(--vyre-color-semantic-text-secondary);
1422
+ line-height: 1.6;
1423
+ }
1424
+ .vyre-alert-dialog__footer {
1425
+ display: flex;
1426
+ gap: var(--vyre-spacing-3);
1427
+ justify-content: flex-end;
1428
+ }
1429
+ .vyre-alert-dialog__footer .vyre-btn { min-width: 5rem; }
1430
+ .vyre-slider[data-disabled] { opacity: 0.45; }
1431
+
1432
+ /* ── Sheet ───────────────────────────────────────────────────── */
1433
+
1434
+ @keyframes vyre-sheet-right-in { from { transform: translateX(100%); } to { transform: translateX(0); } }
1435
+ @keyframes vyre-sheet-left-in { from { transform: translateX(-100%); } to { transform: translateX(0); } }
1436
+ @keyframes vyre-sheet-top-in { from { transform: translateY(-100%); } to { transform: translateY(0); } }
1437
+ @keyframes vyre-sheet-bottom-in { from { transform: translateY(100%); } to { transform: translateY(0); } }
1438
+
1439
+ .vyre-sheet-backdrop {
1440
+ position: fixed;
1441
+ inset: 0;
1442
+ z-index: 1050;
1443
+ background: rgba(0,0,0,0.5);
1444
+ backdrop-filter: blur(2px);
1445
+ }
1446
+ .vyre-sheet {
1447
+ position: fixed;
1448
+ z-index: 1051;
1449
+ background: var(--vyre-color-semantic-surface);
1450
+ display: flex;
1451
+ flex-direction: column;
1452
+ outline: none;
1453
+ box-shadow: var(--vyre-shadow-xl);
1454
+ }
1455
+ .vyre-sheet:focus-visible { outline: none; }
1456
+
1457
+ /* sides */
1458
+ .vyre-sheet--right { top: 0; right: 0; height: 100%; animation: vyre-sheet-right-in var(--vyre-transition-duration-normal) var(--vyre-transition-easing-spring); }
1459
+ .vyre-sheet--left { top: 0; left: 0; height: 100%; animation: vyre-sheet-left-in var(--vyre-transition-duration-normal) var(--vyre-transition-easing-spring); }
1460
+ .vyre-sheet--top { top: 0; left: 0; width: 100%; animation: vyre-sheet-top-in var(--vyre-transition-duration-normal) var(--vyre-transition-easing-spring); }
1461
+ .vyre-sheet--bottom { bottom: 0; left: 0; width: 100%; animation: vyre-sheet-bottom-in var(--vyre-transition-duration-normal) var(--vyre-transition-easing-spring); }
1462
+
1463
+ /* sizes — for left/right (width) */
1464
+ .vyre-sheet--right.vyre-sheet--sm,
1465
+ .vyre-sheet--left.vyre-sheet--sm { width: 20rem; }
1466
+ .vyre-sheet--right.vyre-sheet--md,
1467
+ .vyre-sheet--left.vyre-sheet--md { width: 28rem; }
1468
+ .vyre-sheet--right.vyre-sheet--lg,
1469
+ .vyre-sheet--left.vyre-sheet--lg { width: 40rem; }
1470
+ .vyre-sheet--right.vyre-sheet--full,
1471
+ .vyre-sheet--left.vyre-sheet--full { width: 100%; }
1472
+
1473
+ /* sizes — for top/bottom (height) */
1474
+ .vyre-sheet--top.vyre-sheet--sm,
1475
+ .vyre-sheet--bottom.vyre-sheet--sm { height: 16rem; }
1476
+ .vyre-sheet--top.vyre-sheet--md,
1477
+ .vyre-sheet--bottom.vyre-sheet--md { height: 24rem; }
1478
+ .vyre-sheet--top.vyre-sheet--lg,
1479
+ .vyre-sheet--bottom.vyre-sheet--lg { height: 40rem; }
1480
+ .vyre-sheet--top.vyre-sheet--full,
1481
+ .vyre-sheet--bottom.vyre-sheet--full { height: 100%; }
1482
+
1483
+ .vyre-sheet__header {
1484
+ display: flex;
1485
+ align-items: center;
1486
+ justify-content: space-between;
1487
+ padding: var(--vyre-spacing-5) var(--vyre-spacing-6);
1488
+ border-bottom: 1px solid var(--vyre-color-semantic-border);
1489
+ flex-shrink: 0;
1490
+ }
1491
+ .vyre-sheet__body {
1492
+ flex: 1;
1493
+ overflow-y: auto;
1494
+ padding: var(--vyre-spacing-6);
1495
+ }
1496
+ .vyre-sheet__footer {
1497
+ display: flex;
1498
+ align-items: center;
1499
+ justify-content: flex-end;
1500
+ gap: var(--vyre-spacing-3);
1501
+ padding: var(--vyre-spacing-4) var(--vyre-spacing-6);
1502
+ border-top: 1px solid var(--vyre-color-semantic-border);
1503
+ flex-shrink: 0;
1504
+ }
1505
+
1506
+ /* ── Breadcrumb ──────────────────────────────────────────────── */
1507
+
1508
+ .vyre-breadcrumb { display: flex; }
1509
+ .vyre-breadcrumb__list {
1510
+ display: flex;
1511
+ align-items: center;
1512
+ flex-wrap: wrap;
1513
+ gap: 0;
1514
+ list-style: none;
1515
+ margin: 0;
1516
+ padding: 0;
1517
+ font-size: var(--vyre-typography-font-size-sm);
1518
+ }
1519
+ .vyre-breadcrumb__item {
1520
+ display: flex;
1521
+ align-items: center;
1522
+ }
1523
+ .vyre-breadcrumb__separator {
1524
+ display: inline-flex;
1525
+ align-items: center;
1526
+ color: var(--vyre-color-semantic-text-muted);
1527
+ margin: 0 var(--vyre-spacing-2);
1528
+ font-size: var(--vyre-typography-font-size-xs);
1529
+ user-select: none;
1530
+ }
1531
+ .vyre-breadcrumb__link {
1532
+ color: var(--vyre-color-semantic-text-secondary);
1533
+ text-decoration: none;
1534
+ transition: color var(--vyre-transition-duration-instant) ease;
1535
+ }
1536
+ .vyre-breadcrumb__link:hover { color: var(--vyre-color-semantic-text-primary); }
1537
+ .vyre-breadcrumb__link:focus-visible {
1538
+ outline: 2px solid var(--vyre-color-semantic-accent);
1539
+ outline-offset: 2px;
1540
+ border-radius: 2px;
1541
+ }
1542
+ .vyre-breadcrumb__link--current {
1543
+ color: var(--vyre-color-semantic-text-primary);
1544
+ font-weight: 500;
1545
+ cursor: default;
1546
+ }
1547
+
1548
+ /* ── Pagination ──────────────────────────────────────────────── */
1549
+
1550
+ .vyre-pagination-row {
1551
+ display: flex;
1552
+ align-items: center;
1553
+ justify-content: space-between;
1554
+ gap: var(--vyre-spacing-4);
1555
+ width: 100%;
1556
+ }
1557
+ .vyre-pagination__info {
1558
+ font-size: var(--vyre-typography-font-size-sm);
1559
+ color: var(--vyre-color-semantic-text-secondary);
1560
+ white-space: nowrap;
1561
+ }
1562
+ .vyre-pagination {
1563
+ display: inline-flex;
1564
+ align-items: center;
1565
+ gap: var(--vyre-spacing-2);
1566
+ }
1567
+ .vyre-pagination__nav {
1568
+ display: inline-flex;
1569
+ align-items: center;
1570
+ justify-content: center;
1571
+ width: 1.875rem;
1572
+ height: 1.875rem;
1573
+ border: none;
1574
+ border-radius: var(--vyre-radius-md);
1575
+ background: none;
1576
+ color: var(--vyre-color-semantic-text-secondary);
1577
+ cursor: pointer;
1578
+ transition: background var(--vyre-transition-duration-instant) ease,
1579
+ color var(--vyre-transition-duration-instant) ease;
1580
+ outline: none;
1581
+ flex-shrink: 0;
1582
+ }
1583
+ .vyre-pagination__nav:hover:not(:disabled) {
1584
+ background: var(--vyre-color-semantic-surface-raised);
1585
+ color: var(--vyre-color-semantic-text-primary);
1586
+ }
1587
+ .vyre-pagination__nav:focus-visible {
1588
+ outline: 2px solid var(--vyre-color-semantic-accent);
1589
+ outline-offset: 2px;
1590
+ }
1591
+ .vyre-pagination__nav:disabled {
1592
+ opacity: 0.3;
1593
+ cursor: not-allowed;
1594
+ }
1595
+ .vyre-pagination__list {
1596
+ display: inline-flex;
1597
+ align-items: center;
1598
+ list-style: none;
1599
+ margin: 0;
1600
+ padding: 2px;
1601
+ gap: 1px;
1602
+ background: var(--vyre-color-semantic-surface-raised);
1603
+ border: 1px solid var(--vyre-color-semantic-border);
1604
+ border-radius: var(--vyre-radius-lg);
1605
+ }
1606
+ .vyre-pagination__btn {
1607
+ display: inline-flex;
1608
+ align-items: center;
1609
+ justify-content: center;
1610
+ min-width: 1.75rem;
1611
+ height: 1.75rem;
1612
+ padding: 0 var(--vyre-spacing-1);
1613
+ border: none;
1614
+ border-radius: calc(var(--vyre-radius-lg) - 3px);
1615
+ background: none;
1616
+ color: var(--vyre-color-semantic-text-secondary);
1617
+ font-size: var(--vyre-typography-font-size-sm);
1618
+ font-family: inherit;
1619
+ cursor: pointer;
1620
+ transition: background var(--vyre-transition-duration-instant) ease,
1621
+ color var(--vyre-transition-duration-instant) ease;
1622
+ outline: none;
1623
+ }
1624
+ .vyre-pagination__btn:hover:not(:disabled) {
1625
+ background: var(--vyre-color-semantic-surface);
1626
+ color: var(--vyre-color-semantic-text-primary);
1627
+ }
1628
+ .vyre-pagination__btn:focus-visible {
1629
+ outline: 2px solid var(--vyre-color-semantic-accent);
1630
+ outline-offset: 1px;
1631
+ }
1632
+ .vyre-pagination__btn--active {
1633
+ background: var(--vyre-color-semantic-accent);
1634
+ color: var(--vyre-color-semantic-accent-foreground);
1635
+ font-weight: 600;
1636
+ box-shadow: 0 1px 3px rgba(0,0,0,0.15);
1637
+ }
1638
+ .vyre-pagination__btn--active:hover:not(:disabled) {
1639
+ background: var(--vyre-color-semantic-accent-hover);
1640
+ color: var(--vyre-color-semantic-accent-foreground);
1641
+ }
1642
+ .vyre-pagination__dots {
1643
+ display: inline-flex;
1644
+ align-items: center;
1645
+ justify-content: center;
1646
+ min-width: 1.25rem;
1647
+ height: 1.75rem;
1648
+ color: var(--vyre-color-semantic-text-muted);
1649
+ font-size: 0.6875rem;
1650
+ letter-spacing: 0.05em;
1651
+ user-select: none;
1652
+ }
1653
+
1654
+ /* ── Table ───────────────────────────────────────────────────── */
1655
+
1656
+ .vyre-table-wrapper {
1657
+ width: 100%;
1658
+ overflow-x: auto;
1659
+ }
1660
+ .vyre-table {
1661
+ width: 100%;
1662
+ border-collapse: collapse;
1663
+ font-size: var(--vyre-typography-font-size-sm);
1664
+ color: var(--vyre-color-semantic-text-primary);
1665
+ }
1666
+ .vyre-table__th {
1667
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-4);
1668
+ font-size: var(--vyre-typography-font-size-xs);
1669
+ font-weight: var(--vyre-typography-font-weight-semibold);
1670
+ color: var(--vyre-color-semantic-text-muted);
1671
+ font-family: var(--vyre-typography-font-family-mono);
1672
+ text-transform: uppercase;
1673
+ letter-spacing: 0.06em;
1674
+ border-bottom: 1px solid var(--vyre-color-semantic-border);
1675
+ white-space: nowrap;
1676
+ text-align: left;
1677
+ }
1678
+ .vyre-table__th--center { text-align: center; }
1679
+ .vyre-table__th--right { text-align: right; }
1680
+
1681
+ .vyre-table__th--sortable { padding: 0; }
1682
+ .vyre-table__sort-btn {
1683
+ display: inline-flex;
1684
+ align-items: center;
1685
+ gap: var(--vyre-spacing-2);
1686
+ width: 100%;
1687
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-4);
1688
+ background: none;
1689
+ border: none;
1690
+ font: inherit;
1691
+ font-size: var(--vyre-typography-font-size-xs);
1692
+ font-weight: var(--vyre-typography-font-weight-semibold);
1693
+ font-family: var(--vyre-typography-font-family-mono);
1694
+ color: var(--vyre-color-semantic-text-muted);
1695
+ text-transform: uppercase;
1696
+ letter-spacing: 0.06em;
1697
+ cursor: pointer;
1698
+ white-space: nowrap;
1699
+ transition: color var(--vyre-transition-duration-instant) ease;
1700
+ }
1701
+ .vyre-table__sort-btn:hover { color: var(--vyre-color-semantic-text-primary); }
1702
+ .vyre-table__sort-btn:focus-visible {
1703
+ outline: 2px solid var(--vyre-color-semantic-accent);
1704
+ outline-offset: -2px;
1705
+ }
1706
+ .vyre-table__sort-icon { display: inline-flex; align-items: center; flex-shrink: 0; }
1707
+ .vyre-table__th--sort-asc .vyre-table__sort-btn,
1708
+ .vyre-table__th--sort-desc .vyre-table__sort-btn { color: var(--vyre-color-semantic-accent); }
1709
+
1710
+ .vyre-table__body .vyre-table__row {
1711
+ border-bottom: 1px solid var(--vyre-color-semantic-border-subtle);
1712
+ }
1713
+ .vyre-table__body .vyre-table__row:last-child { border-bottom: none; }
1714
+
1715
+ .vyre-table--hoverable .vyre-table__body .vyre-table__row:hover {
1716
+ background: var(--vyre-color-semantic-surface-raised);
1717
+ }
1718
+ .vyre-table__row--selected {
1719
+ background: var(--vyre-color-semantic-accent-subtle) !important;
1720
+ }
1721
+ .vyre-table--striped .vyre-table__body .vyre-table__row:nth-child(even) {
1722
+ background: var(--vyre-color-semantic-surface-raised);
1723
+ }
1724
+ .vyre-table--bordered .vyre-table__th,
1725
+ .vyre-table--bordered .vyre-table__td {
1726
+ border: 1px solid var(--vyre-color-semantic-border-subtle);
1727
+ }
1728
+
1729
+ .vyre-table__td {
1730
+ padding: var(--vyre-spacing-3) var(--vyre-spacing-4);
1731
+ color: var(--vyre-color-semantic-text-secondary);
1732
+ line-height: var(--vyre-typography-line-height-normal);
1733
+ vertical-align: top;
1734
+ }
1735
+ .vyre-table__td--left { text-align: left; }
1736
+ .vyre-table__td--center { text-align: center; }
1737
+ .vyre-table__td--right { text-align: right; }
1738
+
1739
+ .vyre-table--compact .vyre-table__th,
1740
+ .vyre-table--compact .vyre-table__td {
1741
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-3);
1742
+ }
1743
+
1744
+ .vyre-table__caption {
1745
+ caption-side: bottom;
1746
+ padding: var(--vyre-spacing-3) var(--vyre-spacing-4);
1747
+ font-size: var(--vyre-typography-font-size-xs);
1748
+ color: var(--vyre-color-semantic-text-muted);
1749
+ text-align: left;
1750
+ }
1751
+
1752
+ /* ── Command ─────────────────────────────────────────────────── */
1753
+
1754
+ @keyframes vyre-command-backdrop-in {
1755
+ from { opacity: 0; }
1756
+ to { opacity: 1; }
1757
+ }
1758
+ @keyframes vyre-command-in {
1759
+ from { opacity: 0; transform: scale(0.97) translateY(-6px); }
1760
+ to { opacity: 1; transform: scale(1) translateY(0); }
1761
+ }
1762
+
1763
+ .vyre-command-backdrop {
1764
+ position: fixed;
1765
+ inset: 0;
1766
+ z-index: 1050;
1767
+ background: rgba(0, 0, 0, 0.45);
1768
+ backdrop-filter: blur(4px);
1769
+ -webkit-backdrop-filter: blur(4px);
1770
+ display: flex;
1771
+ align-items: flex-start;
1772
+ justify-content: center;
1773
+ padding-top: 12vh;
1774
+ animation: vyre-command-backdrop-in var(--vyre-transition-duration-fast) ease;
1775
+ }
1776
+
1777
+ .vyre-command {
1778
+ background: var(--vyre-color-semantic-surface);
1779
+ border: 1px solid var(--vyre-color-semantic-border);
1780
+ border-radius: var(--vyre-radius-xl);
1781
+ overflow: hidden;
1782
+ display: flex;
1783
+ flex-direction: column;
1784
+ }
1785
+
1786
+ .vyre-command--dialog {
1787
+ width: 100%;
1788
+ max-width: 36rem;
1789
+ max-height: 60vh;
1790
+ box-shadow: var(--vyre-shadow-xl);
1791
+ animation: vyre-command-in var(--vyre-transition-duration-normal) var(--vyre-transition-easing-spring);
1792
+ }
1793
+
1794
+ .vyre-command__input-wrapper {
1795
+ display: flex;
1796
+ align-items: center;
1797
+ gap: var(--vyre-spacing-2);
1798
+ padding: var(--vyre-spacing-3) var(--vyre-spacing-4);
1799
+ border-bottom: 1px solid var(--vyre-color-semantic-border-subtle);
1800
+ }
1801
+
1802
+ .vyre-command__search-icon {
1803
+ color: var(--vyre-color-semantic-text-muted);
1804
+ flex-shrink: 0;
1805
+ }
1806
+
1807
+ .vyre-command__input {
1808
+ flex: 1;
1809
+ background: none;
1810
+ border: none;
1811
+ outline: none;
1812
+ font-size: var(--vyre-typography-font-size-sm);
1813
+ font-family: inherit;
1814
+ color: var(--vyre-color-semantic-text-primary);
1815
+ min-width: 0;
1816
+ }
1817
+ .vyre-command__input::placeholder { color: var(--vyre-color-semantic-text-muted); }
1818
+
1819
+ .vyre-command__clear {
1820
+ display: inline-flex;
1821
+ align-items: center;
1822
+ justify-content: center;
1823
+ width: 1.25rem;
1824
+ height: 1.25rem;
1825
+ border-radius: var(--vyre-radius-sm);
1826
+ border: none;
1827
+ background: none;
1828
+ color: var(--vyre-color-semantic-text-muted);
1829
+ cursor: pointer;
1830
+ flex-shrink: 0;
1831
+ transition: color var(--vyre-transition-duration-instant) ease,
1832
+ background var(--vyre-transition-duration-instant) ease;
1833
+ }
1834
+ .vyre-command__clear:hover {
1835
+ color: var(--vyre-color-semantic-text-primary);
1836
+ background: var(--vyre-color-semantic-surface-raised);
1837
+ }
1838
+
1839
+ .vyre-command__list {
1840
+ overflow-y: auto;
1841
+ flex: 1;
1842
+ padding: var(--vyre-spacing-2) 0;
1843
+ scrollbar-width: thin;
1844
+ scrollbar-color: var(--vyre-color-semantic-border) transparent;
1845
+ }
1846
+
1847
+ .vyre-command__empty {
1848
+ padding: var(--vyre-spacing-8) var(--vyre-spacing-4);
1849
+ text-align: center;
1850
+ font-size: var(--vyre-typography-font-size-sm);
1851
+ color: var(--vyre-color-semantic-text-muted);
1852
+ }
1853
+
1854
+ .vyre-command__group + .vyre-command__group {
1855
+ border-top: 1px solid var(--vyre-color-semantic-border-subtle);
1856
+ margin-top: var(--vyre-spacing-1);
1857
+ padding-top: var(--vyre-spacing-1);
1858
+ }
1859
+
1860
+ .vyre-command__group-heading {
1861
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-3) var(--vyre-spacing-1);
1862
+ font-size: var(--vyre-typography-font-size-xs);
1863
+ font-weight: var(--vyre-typography-font-weight-semibold);
1864
+ color: var(--vyre-color-semantic-text-muted);
1865
+ font-family: var(--vyre-typography-font-family-mono);
1866
+ letter-spacing: 0.06em;
1867
+ text-transform: uppercase;
1868
+ }
1869
+
1870
+ .vyre-command__item {
1871
+ display: flex;
1872
+ align-items: center;
1873
+ gap: var(--vyre-spacing-2);
1874
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-3);
1875
+ margin: 1px var(--vyre-spacing-2);
1876
+ border-radius: var(--vyre-radius-md);
1877
+ font-size: var(--vyre-typography-font-size-sm);
1878
+ color: var(--vyre-color-semantic-text-primary);
1879
+ cursor: pointer;
1880
+ transition: background var(--vyre-transition-duration-instant) ease;
1881
+ user-select: none;
1882
+ }
1883
+ .vyre-command__item:hover,
1884
+ .vyre-command__item[aria-selected="true"] {
1885
+ background: var(--vyre-color-semantic-surface-raised);
1886
+ }
1887
+ .vyre-command__item--disabled {
1888
+ opacity: 0.4;
1889
+ cursor: not-allowed;
1890
+ pointer-events: none;
1891
+ }
1892
+
1893
+ .vyre-command__item-icon {
1894
+ display: inline-flex;
1895
+ align-items: center;
1896
+ color: var(--vyre-color-semantic-text-muted);
1897
+ flex-shrink: 0;
1898
+ }
1899
+
1900
+ .vyre-command__item-label {
1901
+ flex: 1;
1902
+ min-width: 0;
1903
+ overflow: hidden;
1904
+ text-overflow: ellipsis;
1905
+ white-space: nowrap;
1906
+ }
1907
+
1908
+ .vyre-command__item-shortcut {
1909
+ font-family: var(--vyre-typography-font-family-mono);
1910
+ font-size: var(--vyre-typography-font-size-xs);
1911
+ color: var(--vyre-color-semantic-text-muted);
1912
+ background: var(--vyre-color-semantic-surface-raised);
1913
+ border: 1px solid var(--vyre-color-semantic-border);
1914
+ border-radius: var(--vyre-radius-sm);
1915
+ padding: 1px 5px;
1916
+ flex-shrink: 0;
1917
+ }
1918
+
1919
+ .vyre-command__separator {
1920
+ height: 1px;
1921
+ background: var(--vyre-color-semantic-border-subtle);
1922
+ margin: var(--vyre-spacing-1) 0;
1923
+ }
1924
+
1925
+ /* ── Calendar & DatePicker ─────────────────────────────────── */
1926
+
1927
+ .vyre-calendar {
1928
+ display: inline-flex;
1929
+ flex-direction: column;
1930
+ gap: var(--vyre-spacing-2);
1931
+ padding: var(--vyre-spacing-3);
1932
+ background: var(--vyre-color-semantic-surface-raised);
1933
+ border: 1px solid var(--vyre-color-semantic-border);
1934
+ border-radius: var(--vyre-radius-lg);
1935
+ width: 280px;
1936
+ user-select: none;
1937
+ }
1938
+
1939
+ /* Header */
1940
+ .vyre-calendar__header {
1941
+ display: flex;
1942
+ align-items: center;
1943
+ justify-content: space-between;
1944
+ gap: var(--vyre-spacing-1);
1945
+ }
1946
+ .vyre-calendar__header-center {
1947
+ display: flex;
1948
+ gap: var(--vyre-spacing-1);
1949
+ flex: 1;
1950
+ justify-content: center;
1951
+ }
1952
+ .vyre-calendar__header-btn {
1953
+ background: none;
1954
+ border: none;
1955
+ cursor: pointer;
1956
+ padding: var(--vyre-spacing-1) var(--vyre-spacing-2);
1957
+ border-radius: var(--vyre-radius-sm);
1958
+ font-size: var(--vyre-typography-font-size-sm);
1959
+ font-weight: 600;
1960
+ color: var(--vyre-color-semantic-text);
1961
+ transition: background 120ms;
1962
+ }
1963
+ .vyre-calendar__header-btn:hover {
1964
+ background: var(--vyre-color-semantic-surface-hover);
1965
+ }
1966
+ .vyre-calendar__nav {
1967
+ display: flex;
1968
+ align-items: center;
1969
+ justify-content: center;
1970
+ width: 28px;
1971
+ height: 28px;
1972
+ border: none;
1973
+ background: none;
1974
+ border-radius: var(--vyre-radius-sm);
1975
+ cursor: pointer;
1976
+ color: var(--vyre-color-semantic-text-muted);
1977
+ transition: background 120ms, color 120ms;
1978
+ flex-shrink: 0;
1979
+ }
1980
+ .vyre-calendar__nav:hover {
1981
+ background: var(--vyre-color-semantic-surface-hover);
1982
+ color: var(--vyre-color-semantic-text);
1983
+ }
1984
+
1985
+ /* Day grid */
1986
+ .vyre-calendar__grid {
1987
+ display: grid;
1988
+ grid-template-columns: repeat(7, 1fr);
1989
+ gap: 2px;
1990
+ }
1991
+ .vyre-calendar__weekday {
1992
+ text-align: center;
1993
+ font-size: 11px;
1994
+ font-weight: 600;
1995
+ color: var(--vyre-color-semantic-text-muted);
1996
+ padding: var(--vyre-spacing-1) 0;
1997
+ }
1998
+ .vyre-calendar__day {
1999
+ aspect-ratio: 1;
2000
+ display: flex;
2001
+ align-items: center;
2002
+ justify-content: center;
2003
+ border: none;
2004
+ background: none;
2005
+ border-radius: var(--vyre-radius-sm);
2006
+ font-size: var(--vyre-typography-font-size-sm);
2007
+ color: var(--vyre-color-semantic-text);
2008
+ cursor: pointer;
2009
+ transition: background 100ms, color 100ms;
2010
+ position: relative;
2011
+ }
2012
+ .vyre-calendar__day:hover:not(:disabled) {
2013
+ background: var(--vyre-color-semantic-surface-hover);
2014
+ }
2015
+ .vyre-calendar__day--today {
2016
+ font-weight: 700;
2017
+ color: var(--vyre-color-semantic-accent);
2018
+ }
2019
+ .vyre-calendar__day--today::after {
2020
+ content: "";
2021
+ position: absolute;
2022
+ bottom: 3px;
2023
+ left: 50%;
2024
+ transform: translateX(-50%);
2025
+ width: 4px;
2026
+ height: 4px;
2027
+ border-radius: 50%;
2028
+ background: var(--vyre-color-semantic-accent);
2029
+ }
2030
+ .vyre-calendar__day--selected {
2031
+ background: var(--vyre-color-semantic-accent) !important;
2032
+ color: var(--vyre-color-semantic-accent-foreground) !important;
2033
+ font-weight: 600;
2034
+ border-radius: var(--vyre-radius-sm);
2035
+ }
2036
+ .vyre-calendar__day--selected.vyre-calendar__day--today::after {
2037
+ background: var(--vyre-color-semantic-accent-foreground);
2038
+ }
2039
+ .vyre-calendar__day--in-range {
2040
+ background: color-mix(in srgb, var(--vyre-color-semantic-accent) 15%, transparent);
2041
+ border-radius: 0;
2042
+ }
2043
+ .vyre-calendar__day--range-start {
2044
+ background: var(--vyre-color-semantic-accent) !important;
2045
+ color: var(--vyre-color-semantic-accent-foreground) !important;
2046
+ border-radius: var(--vyre-radius-sm) 0 0 var(--vyre-radius-sm);
2047
+ }
2048
+ .vyre-calendar__day--range-end {
2049
+ background: var(--vyre-color-semantic-accent) !important;
2050
+ color: var(--vyre-color-semantic-accent-foreground) !important;
2051
+ border-radius: 0 var(--vyre-radius-sm) var(--vyre-radius-sm) 0;
2052
+ }
2053
+ .vyre-calendar__day--disabled {
2054
+ color: var(--vyre-color-semantic-text-muted);
2055
+ opacity: 0.4;
2056
+ cursor: not-allowed;
2057
+ }
2058
+
2059
+ /* Month picker */
2060
+ .vyre-calendar__month-grid {
2061
+ display: grid;
2062
+ grid-template-columns: repeat(3, 1fr);
2063
+ gap: var(--vyre-spacing-1);
2064
+ }
2065
+ .vyre-calendar__month-cell {
2066
+ padding: var(--vyre-spacing-2);
2067
+ border: none;
2068
+ background: none;
2069
+ border-radius: var(--vyre-radius-sm);
2070
+ font-size: var(--vyre-typography-font-size-sm);
2071
+ color: var(--vyre-color-semantic-text);
2072
+ cursor: pointer;
2073
+ transition: background 100ms;
2074
+ text-align: center;
2075
+ }
2076
+ .vyre-calendar__month-cell:hover {
2077
+ background: var(--vyre-color-semantic-surface-hover);
2078
+ }
2079
+ .vyre-calendar__month-cell--active {
2080
+ background: var(--vyre-color-semantic-accent);
2081
+ color: var(--vyre-color-semantic-accent-foreground);
2082
+ font-weight: 600;
2083
+ }
2084
+
2085
+ /* Year picker */
2086
+ .vyre-calendar__year-grid {
2087
+ display: grid;
2088
+ grid-template-columns: repeat(3, 1fr);
2089
+ gap: var(--vyre-spacing-1);
2090
+ }
2091
+ .vyre-calendar__year-cell {
2092
+ padding: var(--vyre-spacing-2);
2093
+ border: none;
2094
+ background: none;
2095
+ border-radius: var(--vyre-radius-sm);
2096
+ font-size: var(--vyre-typography-font-size-sm);
2097
+ color: var(--vyre-color-semantic-text);
2098
+ cursor: pointer;
2099
+ transition: background 100ms;
2100
+ text-align: center;
2101
+ }
2102
+ .vyre-calendar__year-cell:hover {
2103
+ background: var(--vyre-color-semantic-surface-hover);
2104
+ }
2105
+ .vyre-calendar__year-cell--active {
2106
+ background: var(--vyre-color-semantic-accent);
2107
+ color: var(--vyre-color-semantic-accent-foreground);
2108
+ font-weight: 600;
2109
+ }
2110
+
2111
+ /* Time picker */
2112
+ .vyre-calendar__time {
2113
+ display: flex;
2114
+ align-items: center;
2115
+ gap: var(--vyre-spacing-2);
2116
+ padding-top: var(--vyre-spacing-2);
2117
+ border-top: 1px solid var(--vyre-color-semantic-border-subtle);
2118
+ color: var(--vyre-color-semantic-text-muted);
2119
+ }
2120
+ .vyre-calendar__time-input {
2121
+ width: 44px;
2122
+ padding: var(--vyre-spacing-1) var(--vyre-spacing-2);
2123
+ border: 1px solid var(--vyre-color-semantic-border);
2124
+ border-radius: var(--vyre-radius-sm);
2125
+ background: var(--vyre-color-semantic-surface);
2126
+ color: var(--vyre-color-semantic-text);
2127
+ font-size: var(--vyre-typography-font-size-sm);
2128
+ text-align: center;
2129
+ -moz-appearance: textfield;
2130
+ }
2131
+ .vyre-calendar__time-input::-webkit-inner-spin-button,
2132
+ .vyre-calendar__time-input::-webkit-outer-spin-button {
2133
+ -webkit-appearance: none;
2134
+ }
2135
+ .vyre-calendar__time-input:focus {
2136
+ outline: 2px solid var(--vyre-color-semantic-accent);
2137
+ outline-offset: 1px;
2138
+ }
2139
+ .vyre-calendar__time-sep {
2140
+ font-weight: 600;
2141
+ color: var(--vyre-color-semantic-text-muted);
2142
+ }
2143
+
2144
+ /* DatePicker trigger */
2145
+ .vyre-datepicker {
2146
+ position: relative;
2147
+ display: inline-block;
2148
+ }
2149
+ .vyre-datepicker__trigger {
2150
+ display: inline-flex;
2151
+ align-items: center;
2152
+ gap: var(--vyre-spacing-2);
2153
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-3);
2154
+ background: var(--vyre-color-semantic-surface);
2155
+ border: 1px solid var(--vyre-color-semantic-border);
2156
+ border-radius: var(--vyre-radius-md);
2157
+ color: var(--vyre-color-semantic-text);
2158
+ font-size: var(--vyre-typography-font-size-sm);
2159
+ cursor: pointer;
2160
+ min-width: 200px;
2161
+ transition: border-color 120ms;
2162
+ text-align: left;
2163
+ }
2164
+ .vyre-datepicker__trigger:hover {
2165
+ border-color: var(--vyre-color-semantic-accent);
2166
+ }
2167
+ .vyre-datepicker__trigger:focus-visible {
2168
+ outline: 2px solid var(--vyre-color-semantic-accent);
2169
+ outline-offset: 2px;
2170
+ }
2171
+ .vyre-datepicker__trigger--placeholder span {
2172
+ color: var(--vyre-color-semantic-text-muted);
2173
+ }
2174
+ .vyre-datepicker__icon {
2175
+ color: var(--vyre-color-semantic-text-muted);
2176
+ flex-shrink: 0;
2177
+ }
2178
+ .vyre-datepicker__trigger > span {
2179
+ flex: 1;
2180
+ }
2181
+ .vyre-datepicker__clear {
2182
+ display: flex;
2183
+ align-items: center;
2184
+ justify-content: center;
2185
+ background: none;
2186
+ border: none;
2187
+ cursor: pointer;
2188
+ color: var(--vyre-color-semantic-text-muted);
2189
+ padding: 2px;
2190
+ border-radius: var(--vyre-radius-sm);
2191
+ flex-shrink: 0;
2192
+ }
2193
+ .vyre-datepicker__clear:hover {
2194
+ color: var(--vyre-color-semantic-text);
2195
+ }
2196
+
2197
+ /* DatePicker popover */
2198
+ .vyre-datepicker__popover {
2199
+ position: absolute;
2200
+ z-index: 1060;
2201
+ box-shadow: var(--vyre-shadow-lg);
2202
+ border-radius: var(--vyre-radius-lg);
2203
+ animation: vyre-fade-in 120ms ease;
2204
+ }
2205
+
2206
+ /* ── Typography ────────────────────────────────────────────── */
2207
+
2208
+ .vyre-text {
2209
+ font-family: var(--vyre-typography-font-family-body);
2210
+ font-size: var(--vyre-typography-font-size-sm);
2211
+ line-height: var(--vyre-typography-line-height-normal);
2212
+ color: var(--vyre-color-semantic-text);
2213
+ margin: 0;
2214
+ }
2215
+ .vyre-text--xs { font-size: var(--vyre-typography-font-size-xs); }
2216
+ .vyre-text--sm { font-size: var(--vyre-typography-font-size-sm); }
2217
+ .vyre-text--lg { font-size: var(--vyre-typography-font-size-lg); }
2218
+ .vyre-text--xl { font-size: var(--vyre-typography-font-size-xl); }
2219
+
2220
+ .vyre-text--normal { font-weight: var(--vyre-typography-font-weight-normal); }
2221
+ .vyre-text--medium { font-weight: var(--vyre-typography-font-weight-medium); }
2222
+ .vyre-text--semibold { font-weight: var(--vyre-typography-font-weight-semibold); }
2223
+ .vyre-text--bold { font-weight: var(--vyre-typography-font-weight-bold); }
2224
+
2225
+ .vyre-text--muted { color: var(--vyre-color-semantic-text-muted); }
2226
+ .vyre-text--accent { color: var(--vyre-color-semantic-accent); }
2227
+ .vyre-text--danger { color: var(--vyre-color-semantic-danger); }
2228
+ .vyre-text--success { color: var(--vyre-color-semantic-success); }
2229
+ .vyre-text--warning { color: var(--vyre-color-semantic-warning); }
2230
+
2231
+ .vyre-text--truncate {
2232
+ overflow: hidden;
2233
+ text-overflow: ellipsis;
2234
+ white-space: nowrap;
2235
+ }
2236
+ .vyre-text--mono {
2237
+ font-family: var(--vyre-typography-font-family-mono);
2238
+ font-size: 0.9em;
2239
+ }
2240
+
2241
+ .vyre-heading {
2242
+ font-family: var(--vyre-typography-font-family-body);
2243
+ font-weight: var(--vyre-typography-font-weight-bold);
2244
+ line-height: var(--vyre-typography-line-height-tight);
2245
+ color: var(--vyre-color-semantic-text);
2246
+ margin: 0;
2247
+ }
2248
+ .vyre-heading--xs { font-size: var(--vyre-typography-font-size-sm); }
2249
+ .vyre-heading--sm { font-size: var(--vyre-typography-font-size-md); }
2250
+ .vyre-heading--md { font-size: var(--vyre-typography-font-size-lg); }
2251
+ .vyre-heading--lg { font-size: var(--vyre-typography-font-size-xl); }
2252
+ .vyre-heading--xl { font-size: var(--vyre-typography-font-size-2xl); }
2253
+ .vyre-heading--2xl { font-size: var(--vyre-typography-font-size-3xl); }
2254
+ .vyre-heading--3xl { font-size: var(--vyre-typography-font-size-4xl); }
2255
+
2256
+ .vyre-heading--normal { font-weight: var(--vyre-typography-font-weight-normal); }
2257
+ .vyre-heading--medium { font-weight: var(--vyre-typography-font-weight-medium); }
2258
+ .vyre-heading--semibold { font-weight: var(--vyre-typography-font-weight-semibold); }
2259
+
2260
+ .vyre-lead {
2261
+ font-family: var(--vyre-typography-font-family-body);
2262
+ font-size: var(--vyre-typography-font-size-md);
2263
+ line-height: var(--vyre-typography-line-height-relaxed);
2264
+ color: var(--vyre-color-semantic-text-muted);
2265
+ margin: 0;
2266
+ }
2267
+
2268
+ .vyre-code {
2269
+ font-family: var(--vyre-typography-font-family-mono);
2270
+ font-size: 0.875em;
2271
+ background: var(--vyre-color-semantic-surface-raised);
2272
+ border: 1px solid var(--vyre-color-semantic-border-subtle);
2273
+ border-radius: var(--vyre-radius-sm);
2274
+ padding: 1px 6px;
2275
+ color: var(--vyre-color-semantic-text);
2276
+ }
2277
+ .vyre-code-block {
2278
+ font-family: var(--vyre-typography-font-family-mono);
2279
+ font-size: var(--vyre-typography-font-size-sm);
2280
+ background: var(--vyre-color-semantic-surface-raised);
2281
+ border: 1px solid var(--vyre-color-semantic-border);
2282
+ border-radius: var(--vyre-radius-md);
2283
+ padding: var(--vyre-spacing-4);
2284
+ overflow-x: auto;
2285
+ margin: 0;
2286
+ line-height: var(--vyre-typography-line-height-relaxed);
2287
+ color: var(--vyre-color-semantic-text);
2288
+ }
2289
+ .vyre-code-block code {
2290
+ background: none;
2291
+ border: none;
2292
+ padding: 0;
2293
+ font-size: inherit;
2294
+ }
2295
+
2296
+ .vyre-blockquote {
2297
+ border-left: 3px solid var(--vyre-color-semantic-accent);
2298
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-4);
2299
+ margin: 0;
2300
+ color: var(--vyre-color-semantic-text-muted);
2301
+ font-size: var(--vyre-typography-font-size-sm);
2302
+ font-style: italic;
2303
+ line-height: var(--vyre-typography-line-height-relaxed);
2304
+ background: color-mix(in srgb, var(--vyre-color-semantic-accent) 6%, transparent);
2305
+ border-radius: 0 var(--vyre-radius-sm) var(--vyre-radius-sm) 0;
2306
+ }
2307
+
2308
+ /* ── Sidebar ────────────────────────────────────────────────── */
2309
+
2310
+ .vyre-sidebar {
2311
+ display: flex;
2312
+ flex-direction: column;
2313
+ width: 240px;
2314
+ height: 100%;
2315
+ background: var(--vyre-color-semantic-surface);
2316
+ border-right: 1px solid var(--vyre-color-semantic-border-subtle);
2317
+ padding: var(--vyre-spacing-4) 0;
2318
+ flex-shrink: 0;
2319
+ }
2320
+ .vyre-sidebar--collapsed {
2321
+ width: 56px;
2322
+ }
2323
+ .vyre-sidebar--floating {
2324
+ border: 1px solid var(--vyre-color-semantic-border);
2325
+ border-radius: var(--vyre-radius-lg);
2326
+ box-shadow: var(--vyre-shadow-md);
2327
+ min-height: auto;
2328
+ }
2329
+
2330
+ .vyre-sidebar__header {
2331
+ display: flex;
2332
+ align-items: center;
2333
+ gap: var(--vyre-spacing-2);
2334
+ padding: 0 var(--vyre-spacing-3) var(--vyre-spacing-3);
2335
+ border-bottom: 1px solid var(--vyre-color-semantic-border-subtle);
2336
+ margin-bottom: var(--vyre-spacing-2);
2337
+ }
2338
+ .vyre-sidebar__logo {
2339
+ display: flex;
2340
+ align-items: center;
2341
+ justify-content: center;
2342
+ flex-shrink: 0;
2343
+ }
2344
+ .vyre-sidebar__title {
2345
+ font-size: var(--vyre-typography-font-size-sm);
2346
+ font-weight: var(--vyre-typography-font-weight-semibold);
2347
+ color: var(--vyre-color-semantic-text);
2348
+ overflow: hidden;
2349
+ text-overflow: ellipsis;
2350
+ white-space: nowrap;
2351
+ flex: 1;
2352
+ }
2353
+ .vyre-sidebar--collapsed .vyre-sidebar__title { display: none; }
2354
+
2355
+ .vyre-sidebar__content {
2356
+ flex: 1;
2357
+ overflow-y: auto;
2358
+ padding: 0 var(--vyre-spacing-2);
2359
+ display: flex;
2360
+ flex-direction: column;
2361
+ gap: var(--vyre-spacing-1);
2362
+ }
2363
+
2364
+ .vyre-sidebar__section {
2365
+ display: flex;
2366
+ flex-direction: column;
2367
+ gap: 2px;
2368
+ }
2369
+ .vyre-sidebar__section + .vyre-sidebar__section {
2370
+ margin-top: var(--vyre-spacing-3);
2371
+ }
2372
+ .vyre-sidebar__section-label {
2373
+ font-size: 11px;
2374
+ font-weight: var(--vyre-typography-font-weight-semibold);
2375
+ color: var(--vyre-color-semantic-text-muted);
2376
+ text-transform: uppercase;
2377
+ letter-spacing: 0.06em;
2378
+ padding: 0 var(--vyre-spacing-2) var(--vyre-spacing-1);
2379
+ }
2380
+ .vyre-sidebar--collapsed .vyre-sidebar__section-label { display: none; }
2381
+
2382
+ .vyre-sidebar__item {
2383
+ display: flex;
2384
+ align-items: center;
2385
+ gap: var(--vyre-spacing-2);
2386
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-2);
2387
+ border-radius: var(--vyre-radius-md);
2388
+ font-size: var(--vyre-typography-font-size-sm);
2389
+ color: var(--vyre-color-semantic-text-muted);
2390
+ cursor: pointer;
2391
+ background: none;
2392
+ border: none;
2393
+ width: 100%;
2394
+ text-align: left;
2395
+ text-decoration: none;
2396
+ transition: background 120ms, color 120ms;
2397
+ position: relative;
2398
+ }
2399
+ .vyre-sidebar__item:hover {
2400
+ background: var(--vyre-color-semantic-surface-hover);
2401
+ color: var(--vyre-color-semantic-text);
2402
+ }
2403
+ .vyre-sidebar__item--active {
2404
+ background: color-mix(in srgb, var(--vyre-color-semantic-accent) 12%, transparent);
2405
+ color: var(--vyre-color-semantic-accent);
2406
+ font-weight: var(--vyre-typography-font-weight-medium);
2407
+ }
2408
+ .vyre-sidebar__item--active:hover {
2409
+ background: color-mix(in srgb, var(--vyre-color-semantic-accent) 18%, transparent);
2410
+ color: var(--vyre-color-semantic-accent);
2411
+ }
2412
+ .vyre-sidebar__item-icon {
2413
+ display: flex;
2414
+ align-items: center;
2415
+ justify-content: center;
2416
+ flex-shrink: 0;
2417
+ width: 18px;
2418
+ height: 18px;
2419
+ }
2420
+ .vyre-sidebar__item-label {
2421
+ flex: 1;
2422
+ overflow: hidden;
2423
+ text-overflow: ellipsis;
2424
+ white-space: nowrap;
2425
+ }
2426
+ .vyre-sidebar--collapsed .vyre-sidebar__item-label { display: none; }
2427
+ .vyre-sidebar__item-badge {
2428
+ font-size: 11px;
2429
+ font-weight: var(--vyre-typography-font-weight-semibold);
2430
+ background: var(--vyre-color-semantic-accent);
2431
+ color: var(--vyre-color-semantic-accent-foreground);
2432
+ border-radius: 999px;
2433
+ padding: 1px 6px;
2434
+ flex-shrink: 0;
2435
+ }
2436
+ .vyre-sidebar--collapsed .vyre-sidebar__item-badge { display: none; }
2437
+
2438
+ .vyre-sidebar__footer {
2439
+ padding: var(--vyre-spacing-3) var(--vyre-spacing-2) 0;
2440
+ border-top: 1px solid var(--vyre-color-semantic-border-subtle);
2441
+ margin-top: var(--vyre-spacing-2);
2442
+ }
2443
+
2444
+ .vyre-sidebar__toggle {
2445
+ display: flex;
2446
+ align-items: center;
2447
+ justify-content: center;
2448
+ width: 28px;
2449
+ height: 28px;
2450
+ border: none;
2451
+ background: none;
2452
+ border-radius: var(--vyre-radius-sm);
2453
+ cursor: pointer;
2454
+ color: var(--vyre-color-semantic-text-muted);
2455
+ transition: background 120ms, color 120ms;
2456
+ flex-shrink: 0;
2457
+ }
2458
+ .vyre-sidebar__toggle:hover {
2459
+ background: var(--vyre-color-semantic-surface-hover);
2460
+ color: var(--vyre-color-semantic-text);
2461
+ }
2462
+
2463
+ .vyre-app-layout {
2464
+ display: flex;
2465
+ min-height: 100vh;
2466
+ background: var(--vyre-color-semantic-surface);
2467
+ }
2468
+
2469
+ .vyre-app-shell {
2470
+ flex: 1;
2471
+ min-width: 0;
2472
+ display: flex;
2473
+ flex-direction: column;
2474
+ overflow: hidden;
2475
+ }
2476
+
2477
+ .vyre-app-bar {
2478
+ display: flex;
2479
+ align-items: center;
2480
+ gap: var(--vyre-spacing-3);
2481
+ height: 52px;
2482
+ padding: 0 var(--vyre-spacing-4);
2483
+ border-bottom: 1px solid var(--vyre-color-semantic-border-subtle);
2484
+ background: var(--vyre-color-semantic-surface);
2485
+ flex-shrink: 0;
2486
+ }
2487
+
2488
+ .vyre-sidebar-trigger {
2489
+ display: flex;
2490
+ align-items: center;
2491
+ justify-content: center;
2492
+ width: 32px;
2493
+ height: 32px;
2494
+ border: none;
2495
+ background: none;
2496
+ border-radius: var(--vyre-radius-sm);
2497
+ cursor: pointer;
2498
+ color: var(--vyre-color-semantic-text-muted);
2499
+ transition: background 120ms, color 120ms;
2500
+ flex-shrink: 0;
2501
+ }
2502
+ .vyre-sidebar-trigger:hover {
2503
+ background: var(--vyre-color-semantic-surface-hover);
2504
+ color: var(--vyre-color-semantic-text);
2505
+ }
2506
+
2507
+ .vyre-page-content {
2508
+ flex: 1;
2509
+ overflow: auto;
2510
+ padding: var(--vyre-spacing-6);
2511
+ }