@vashu96/ui 0.0.4 → 0.0.8

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.
Files changed (4) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +29 -1
  3. package/package.json +15 -10
  4. package/src/styles.css +1788 -0
package/src/styles.css ADDED
@@ -0,0 +1,1788 @@
1
+ /* ═══════════════════════════════════════════════════════
2
+ CRYSTAL FLAT DESIGN SYSTEM
3
+ Glassmorphism 2.0 — Linear Aesthetic
4
+ ═══════════════════════════════════════════════════════ */
5
+
6
+ @theme {
7
+ /* ─── Typography ─── */
8
+ --font-heading: "Inter", system-ui, sans-serif;
9
+ --font-body: "SN Pro", "Inter", system-ui, sans-serif;
10
+
11
+ /* ─── Color Palette: Cosmic Slate ─── */
12
+ --color-slate-50: #f8fafc;
13
+ --color-slate-100: #f1f5f9;
14
+ --color-slate-200: #e2e8f0;
15
+ --color-slate-300: #cbd5e1;
16
+ --color-slate-400: #94a3b8;
17
+ --color-slate-500: #64748b;
18
+ --color-slate-600: #475569;
19
+ --color-slate-700: #334155;
20
+ --color-slate-800: #1e293b;
21
+ --color-slate-900: #0f172a;
22
+ --color-slate-950: #020617;
23
+
24
+ /* ─── Semantic Surface Tokens (Light) ─── */
25
+ --color-surface-base: var(--color-slate-50);
26
+ --color-surface-1: #ffffff;
27
+ --color-surface-2: var(--color-slate-100);
28
+ --color-surface-3: var(--color-slate-200);
29
+
30
+ /* ─── Text ─── */
31
+ --color-text-primary: var(--color-slate-900);
32
+ --color-text-secondary: var(--color-slate-500);
33
+ --color-text-tertiary: var(--color-slate-400);
34
+ --color-text-inverse: #ffffff;
35
+
36
+ /* ─── Borders ─── */
37
+ --color-border-default: rgba(0, 0, 0, 0.06);
38
+ --color-border-strong: rgba(0, 0, 0, 0.1);
39
+
40
+ /* ─── Brand / Action ─── */
41
+ --color-primary: #4f46e5; /* Indigo — WCAG AA safe on white (4.6:1) */
42
+ --color-primary-hover: #4338ca;
43
+ --color-primary-active: #3730a3;
44
+ --color-primary-subtle: rgba(79, 70, 229, 0.08);
45
+
46
+ --color-secondary: #f59e0b; /* Amber */
47
+
48
+ /* ─── Status ─── */
49
+ --color-success: #22c55e;
50
+ --color-warning: #f59e0b;
51
+ --color-danger: #ef4444;
52
+ --color-info: #3b82f6;
53
+
54
+ /* ─── Glass ─── */
55
+ --glass-blur: 20px;
56
+ --glass-bg: rgba(255, 255, 255, 0.65);
57
+ --glass-border: rgba(255, 255, 255, 0.2);
58
+ --glass-inner-glow: inset 0 1px 0 0 rgba(255, 255, 255, 0.4);
59
+
60
+ /* ─── Spacing (extend Tailwind if needed) ─── */
61
+
62
+ /* ─── Radius ─── */
63
+ --radius-sm: 6px;
64
+ --radius-md: 10px;
65
+ --radius-lg: 14px;
66
+ --radius-xl: 20px;
67
+ --radius-full: 9999px;
68
+
69
+ /* ─── Motion ─── */
70
+ --ease-spring: cubic-bezier(0.25, 1.25, 0.5, 1);
71
+ --ease-smooth: cubic-bezier(0.4, 0, 0.2, 1);
72
+ --duration-fast: 150ms;
73
+ --duration-normal: 200ms;
74
+ --duration-slow: 300ms;
75
+ }
76
+
77
+ /* ═══════════════════════════════════════════════════════
78
+ DARK THEME
79
+ ═══════════════════════════════════════════════════════ */
80
+ [data-theme="dark"] {
81
+ --color-surface-base: #0a0a0f;
82
+ --color-surface-1: #111118;
83
+ --color-surface-2: #191920;
84
+ --color-surface-3: #222230;
85
+
86
+ --color-text-primary: var(--color-slate-50);
87
+ --color-text-secondary: var(--color-slate-400);
88
+ --color-text-tertiary: var(--color-slate-600);
89
+
90
+ --color-border-default: rgba(255, 255, 255, 0.06);
91
+ --color-border-strong: rgba(255, 255, 255, 0.1);
92
+
93
+ --color-primary-subtle: rgba(99, 102, 241, 0.15);
94
+
95
+ --glass-bg: rgba(17, 17, 24, 0.65);
96
+ --glass-border: rgba(255, 255, 255, 0.08);
97
+ --glass-inner-glow: inset 0 1px 0 0 rgba(255, 255, 255, 0.06);
98
+ }
99
+
100
+ /* ═══════════════════════════════════════════════════════
101
+ BASE LAYER
102
+ ═══════════════════════════════════════════════════════ */
103
+ @layer base {
104
+ html,
105
+ body {
106
+ background-color: var(--color-surface-base);
107
+ color: var(--color-text-primary);
108
+ min-height: 100vh;
109
+ font-family: var(--font-body);
110
+ -webkit-font-smoothing: antialiased;
111
+ -moz-osx-font-smoothing: grayscale;
112
+ transition:
113
+ background-color var(--duration-slow) var(--ease-smooth),
114
+ color var(--duration-slow) var(--ease-smooth);
115
+ }
116
+
117
+ h1,
118
+ h2,
119
+ h3,
120
+ h4,
121
+ h5,
122
+ h6 {
123
+ font-family: var(--font-heading);
124
+ font-weight: 600;
125
+ letter-spacing: -0.02em;
126
+ }
127
+
128
+ *:focus-visible {
129
+ outline: 2px solid var(--color-primary);
130
+ outline-offset: 2px;
131
+ }
132
+ }
133
+
134
+ /* ═══════════════════════════════════════════════════════
135
+ COMPONENT LAYER
136
+ ═══════════════════════════════════════════════════════ */
137
+ @layer components {
138
+ /* ─── Glass ─── */
139
+ .glass {
140
+ background: var(--glass-bg);
141
+ backdrop-filter: blur(var(--glass-blur));
142
+ -webkit-backdrop-filter: blur(var(--glass-blur));
143
+ border: 1px solid var(--glass-border);
144
+ box-shadow: var(--glass-inner-glow);
145
+ }
146
+
147
+ .glass-strong {
148
+ background: var(--glass-bg);
149
+ backdrop-filter: blur(calc(var(--glass-blur) * 1.5));
150
+ -webkit-backdrop-filter: blur(calc(var(--glass-blur) * 1.5));
151
+ border: 1px solid var(--glass-border);
152
+ box-shadow: var(--glass-inner-glow);
153
+ }
154
+
155
+ /* ─── Spotlight (mouse-tracking glow) ─── */
156
+ .spotlight {
157
+ position: relative;
158
+ overflow: hidden;
159
+ }
160
+
161
+ .spotlight::before {
162
+ content: "";
163
+ position: absolute;
164
+ inset: 0;
165
+ opacity: 0;
166
+ background: radial-gradient(
167
+ 600px circle at var(--mouse-x, 50%) var(--mouse-y, 50%),
168
+ rgba(99, 102, 241, 0.06),
169
+ transparent 40%
170
+ );
171
+ transition: opacity var(--duration-normal) var(--ease-smooth);
172
+ pointer-events: none;
173
+ z-index: 0;
174
+ }
175
+
176
+ .spotlight:hover::before {
177
+ opacity: 1;
178
+ }
179
+
180
+ /* Spotlight border glow variant */
181
+ .spotlight-border {
182
+ position: relative;
183
+ }
184
+
185
+ .spotlight-border::after {
186
+ content: "";
187
+ position: absolute;
188
+ inset: -1px;
189
+ border-radius: inherit;
190
+ opacity: 0;
191
+ background: radial-gradient(
192
+ 300px circle at var(--mouse-x, 50%) var(--mouse-y, 50%),
193
+ rgba(99, 102, 241, 0.3),
194
+ transparent 40%
195
+ );
196
+ mask:
197
+ linear-gradient(#fff 0 0) content-box,
198
+ linear-gradient(#fff 0 0);
199
+ mask-composite: exclude;
200
+ padding: 1px;
201
+ transition: opacity var(--duration-normal) var(--ease-smooth);
202
+ pointer-events: none;
203
+ z-index: 1;
204
+ }
205
+
206
+ .spotlight-border:hover::after {
207
+ opacity: 1;
208
+ }
209
+
210
+ /* ─── Noise Overlay ─── */
211
+ .noise-overlay {
212
+ position: relative;
213
+ }
214
+
215
+ .noise-overlay::after {
216
+ content: "";
217
+ position: absolute;
218
+ inset: 0;
219
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
220
+ opacity: 0.03;
221
+ mix-blend-mode: overlay;
222
+ pointer-events: none;
223
+ z-index: 1;
224
+ border-radius: inherit;
225
+ }
226
+
227
+ /* ─── Buttons ─── */
228
+ .btn {
229
+ display: inline-flex;
230
+ align-items: center;
231
+ justify-content: center;
232
+ gap: 0.5rem;
233
+ font-family: var(--font-body);
234
+ font-weight: 500;
235
+ border-radius: var(--radius-md);
236
+ transition: all var(--duration-fast) var(--ease-smooth);
237
+ cursor: pointer;
238
+ user-select: none;
239
+ border: 1px solid transparent;
240
+ line-height: 1;
241
+ }
242
+
243
+ .btn-primary {
244
+ background-color: var(--color-primary);
245
+ color: var(--color-text-inverse);
246
+ }
247
+ .btn-primary:hover {
248
+ background-color: var(--color-primary-hover);
249
+ }
250
+ .btn-primary:active {
251
+ background-color: var(--color-primary-active);
252
+ }
253
+
254
+ .btn-secondary {
255
+ background-color: var(--color-surface-2);
256
+ color: var(--color-text-primary);
257
+ border-color: var(--color-border-default);
258
+ }
259
+ .btn-secondary:hover {
260
+ background-color: var(--color-surface-3);
261
+ border-color: var(--color-border-strong);
262
+ }
263
+
264
+ .btn-ghost {
265
+ background-color: transparent;
266
+ color: var(--color-text-secondary);
267
+ }
268
+ .btn-ghost:hover {
269
+ background-color: var(--color-primary-subtle);
270
+ color: var(--color-text-primary);
271
+ }
272
+
273
+ .btn-danger {
274
+ background-color: var(--color-danger);
275
+ color: var(--color-text-inverse);
276
+ }
277
+ .btn-danger:hover {
278
+ opacity: 0.9;
279
+ }
280
+
281
+ /* ─── Text ─── */
282
+ .text-primary {
283
+ color: var(--color-text-primary);
284
+ }
285
+ .text-secondary {
286
+ color: var(--color-text-secondary);
287
+ }
288
+ .text-tertiary {
289
+ color: var(--color-text-tertiary);
290
+ }
291
+
292
+ /* ─── Surfaces ─── */
293
+ .surface-base {
294
+ background-color: var(--color-surface-base);
295
+ }
296
+ .surface-1 {
297
+ background-color: var(--color-surface-1);
298
+ }
299
+ .surface-2 {
300
+ background-color: var(--color-surface-2);
301
+ }
302
+ .surface-3 {
303
+ background-color: var(--color-surface-3);
304
+ }
305
+
306
+ /* ─── Borders ─── */
307
+ .border-default {
308
+ border-color: var(--color-border-default);
309
+ }
310
+ .border-strong {
311
+ border-color: var(--color-border-strong);
312
+ }
313
+
314
+ /* ═══════════════════════════════════════════════════
315
+ P2 — INTERACTION
316
+ ═══════════════════════════════════════════════════ */
317
+
318
+ /* ─── Dialog ─── */
319
+ .dialog-root {
320
+ border: none;
321
+ border-radius: var(--radius-lg);
322
+ background: transparent;
323
+ padding: 0;
324
+ margin: auto;
325
+ max-height: 85vh;
326
+ width: calc(100% - 2rem);
327
+ overflow: visible;
328
+ outline: none;
329
+ }
330
+ .dialog-root::backdrop {
331
+ background: rgba(0, 0, 0, 0.45);
332
+ backdrop-filter: blur(6px);
333
+ -webkit-backdrop-filter: blur(6px);
334
+ animation: dialog-backdrop-in var(--duration-slow) var(--ease-smooth);
335
+ }
336
+ .dialog-root[open] {
337
+ animation: dialog-slide-in var(--duration-slow) var(--ease-spring);
338
+ }
339
+ .dialog-panel {
340
+ background: var(--color-surface-1);
341
+ border: 1px solid var(--color-border-default);
342
+ border-radius: var(--radius-lg);
343
+ box-shadow:
344
+ var(--glass-inner-glow),
345
+ 0 25px 50px -12px rgba(0, 0, 0, 0.25);
346
+ padding: 1.5rem;
347
+ overflow-y: auto;
348
+ max-height: 85vh;
349
+ }
350
+ .dialog-header {
351
+ display: flex;
352
+ flex-direction: column;
353
+ gap: 0.25rem;
354
+ margin-bottom: 1rem;
355
+ }
356
+ .dialog-footer {
357
+ display: flex;
358
+ justify-content: flex-end;
359
+ gap: 0.5rem;
360
+ margin-top: 1.5rem;
361
+ padding-top: 1rem;
362
+ border-top: 1px solid var(--color-border-default);
363
+ }
364
+ .dialog-title {
365
+ font-family: var(--font-heading);
366
+ font-size: 1.125rem;
367
+ font-weight: 600;
368
+ color: var(--color-text-primary);
369
+ letter-spacing: -0.02em;
370
+ }
371
+ .dialog-description {
372
+ font-size: 0.875rem;
373
+ color: var(--color-text-secondary);
374
+ line-height: 1.5;
375
+ }
376
+ .dialog-close {
377
+ position: absolute;
378
+ top: 1rem;
379
+ right: 1rem;
380
+ display: flex;
381
+ align-items: center;
382
+ justify-content: center;
383
+ width: 28px;
384
+ height: 28px;
385
+ border-radius: var(--radius-sm);
386
+ color: var(--color-text-tertiary);
387
+ cursor: pointer;
388
+ border: none;
389
+ background: transparent;
390
+ transition: all var(--duration-fast) var(--ease-smooth);
391
+ }
392
+ .dialog-close:hover {
393
+ background: var(--color-surface-3);
394
+ color: var(--color-text-primary);
395
+ }
396
+
397
+ @keyframes dialog-slide-in {
398
+ from {
399
+ opacity: 0;
400
+ transform: translateY(12px) scale(0.97);
401
+ }
402
+ to {
403
+ opacity: 1;
404
+ transform: translateY(0) scale(1);
405
+ }
406
+ }
407
+ @keyframes dialog-backdrop-in {
408
+ from {
409
+ opacity: 0;
410
+ }
411
+ to {
412
+ opacity: 1;
413
+ }
414
+ }
415
+
416
+ /* ─── Tooltip ─── */
417
+ .tooltip {
418
+ background: var(--color-slate-800);
419
+ color: var(--color-slate-50);
420
+ font-size: 0.75rem;
421
+ line-height: 1.4;
422
+ padding: 0.375rem 0.625rem;
423
+ border-radius: var(--radius-sm);
424
+ white-space: nowrap;
425
+ pointer-events: none;
426
+ animation: tooltip-in var(--duration-fast) var(--ease-smooth);
427
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
428
+ }
429
+ @keyframes tooltip-in {
430
+ from {
431
+ opacity: 0;
432
+ transform: scale(0.95);
433
+ }
434
+ to {
435
+ opacity: 1;
436
+ transform: scale(1);
437
+ }
438
+ }
439
+
440
+ /* ─── Dropdown ─── */
441
+ .dropdown-menu {
442
+ background: var(--color-surface-1);
443
+ border: 1px solid var(--color-border-default);
444
+ border-radius: var(--radius-md);
445
+ box-shadow:
446
+ var(--glass-inner-glow),
447
+ 0 10px 25px rgba(0, 0, 0, 0.12);
448
+ padding: 0.25rem;
449
+ min-width: 10rem;
450
+ animation: dropdown-in var(--duration-normal) var(--ease-spring);
451
+ }
452
+ .dropdown-item {
453
+ display: flex;
454
+ align-items: center;
455
+ gap: 0.5rem;
456
+ padding: 0.5rem 0.75rem;
457
+ font-size: 0.875rem;
458
+ color: var(--color-text-primary);
459
+ border-radius: var(--radius-sm);
460
+ cursor: pointer;
461
+ transition: background var(--duration-fast) var(--ease-smooth);
462
+ user-select: none;
463
+ }
464
+ .dropdown-item:hover {
465
+ background: var(--color-primary-subtle);
466
+ }
467
+ .dropdown-item:focus-visible {
468
+ background: var(--color-primary-subtle);
469
+ outline: none;
470
+ }
471
+ .dropdown-item-destructive {
472
+ color: var(--color-danger);
473
+ }
474
+ .dropdown-item-destructive:hover {
475
+ background: rgba(239, 68, 68, 0.08);
476
+ }
477
+ .dropdown-separator {
478
+ height: 1px;
479
+ background: var(--color-border-default);
480
+ margin: 0.25rem 0.5rem;
481
+ }
482
+ @keyframes dropdown-in {
483
+ from {
484
+ opacity: 0;
485
+ transform: translateY(-4px) scale(0.97);
486
+ }
487
+ to {
488
+ opacity: 1;
489
+ transform: translateY(0) scale(1);
490
+ }
491
+ }
492
+
493
+ /* ─── Alert ─── */
494
+ .alert {
495
+ display: flex;
496
+ align-items: flex-start;
497
+ gap: 0.75rem;
498
+ padding: 0.875rem 1rem;
499
+ border-radius: var(--radius-md);
500
+ border-left: 3px solid;
501
+ font-size: 0.875rem;
502
+ line-height: 1.5;
503
+ }
504
+ .alert-icon {
505
+ flex-shrink: 0;
506
+ margin-top: 1px;
507
+ }
508
+ .alert-content {
509
+ flex: 1;
510
+ min-width: 0;
511
+ }
512
+ .alert-title {
513
+ font-weight: 600;
514
+ color: var(--color-text-primary);
515
+ margin-bottom: 0.125rem;
516
+ }
517
+ .alert-description {
518
+ color: var(--color-text-secondary);
519
+ }
520
+ .alert-dismiss {
521
+ flex-shrink: 0;
522
+ display: flex;
523
+ align-items: center;
524
+ justify-content: center;
525
+ width: 24px;
526
+ height: 24px;
527
+ border-radius: var(--radius-sm);
528
+ border: none;
529
+ background: transparent;
530
+ color: var(--color-text-tertiary);
531
+ cursor: pointer;
532
+ transition: all var(--duration-fast) var(--ease-smooth);
533
+ }
534
+ .alert-dismiss:hover {
535
+ background: rgba(0, 0, 0, 0.06);
536
+ color: var(--color-text-primary);
537
+ }
538
+ .alert-info {
539
+ background: rgba(59, 130, 246, 0.06);
540
+ border-color: var(--color-info);
541
+ color: var(--color-info);
542
+ }
543
+ .alert-success {
544
+ background: rgba(34, 197, 94, 0.06);
545
+ border-color: var(--color-success);
546
+ color: var(--color-success);
547
+ }
548
+ .alert-warning {
549
+ background: rgba(245, 158, 11, 0.06);
550
+ border-color: var(--color-warning);
551
+ color: var(--color-warning);
552
+ }
553
+ .alert-danger {
554
+ background: rgba(239, 68, 68, 0.06);
555
+ border-color: var(--color-danger);
556
+ color: var(--color-danger);
557
+ }
558
+
559
+ /* ─── Toast ─── */
560
+ .toast-container {
561
+ position: fixed;
562
+ bottom: 1rem;
563
+ right: 1rem;
564
+ display: flex;
565
+ flex-direction: column;
566
+ gap: 0.5rem;
567
+ z-index: 10000;
568
+ max-width: 24rem;
569
+ pointer-events: none;
570
+ }
571
+ .toast {
572
+ display: flex;
573
+ align-items: flex-start;
574
+ gap: 0.75rem;
575
+ padding: 0.875rem 1rem;
576
+ background: var(--color-surface-1);
577
+ border: 1px solid var(--color-border-default);
578
+ border-radius: var(--radius-md);
579
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
580
+ border-left: 3px solid;
581
+ pointer-events: auto;
582
+ }
583
+ .toast-enter {
584
+ animation: toast-slide-in var(--duration-slow) var(--ease-spring);
585
+ }
586
+ .toast-exit {
587
+ animation: toast-slide-out var(--duration-normal) var(--ease-smooth)
588
+ forwards;
589
+ }
590
+ .toast-body {
591
+ flex: 1;
592
+ min-width: 0;
593
+ }
594
+ .toast-title {
595
+ font-size: 0.875rem;
596
+ font-weight: 600;
597
+ color: var(--color-text-primary);
598
+ }
599
+ .toast-description {
600
+ font-size: 0.8125rem;
601
+ color: var(--color-text-secondary);
602
+ margin-top: 0.125rem;
603
+ }
604
+ .toast-close {
605
+ flex-shrink: 0;
606
+ display: flex;
607
+ align-items: center;
608
+ justify-content: center;
609
+ width: 24px;
610
+ height: 24px;
611
+ border-radius: var(--radius-sm);
612
+ border: none;
613
+ background: transparent;
614
+ color: var(--color-text-tertiary);
615
+ cursor: pointer;
616
+ transition: all var(--duration-fast) var(--ease-smooth);
617
+ }
618
+ .toast-close:hover {
619
+ background: var(--color-surface-3);
620
+ color: var(--color-text-primary);
621
+ }
622
+ .toast-info {
623
+ border-left-color: var(--color-info);
624
+ }
625
+ .toast-success {
626
+ border-left-color: var(--color-success);
627
+ }
628
+ .toast-warning {
629
+ border-left-color: var(--color-warning);
630
+ }
631
+ .toast-danger {
632
+ border-left-color: var(--color-danger);
633
+ }
634
+
635
+ @keyframes toast-slide-in {
636
+ from {
637
+ opacity: 0;
638
+ transform: translateX(100%);
639
+ }
640
+ to {
641
+ opacity: 1;
642
+ transform: translateX(0);
643
+ }
644
+ }
645
+ @keyframes toast-slide-out {
646
+ from {
647
+ opacity: 1;
648
+ transform: translateX(0);
649
+ }
650
+ to {
651
+ opacity: 0;
652
+ transform: translateX(100%);
653
+ }
654
+ }
655
+
656
+ /* ═══════════════════════════════════════════════════
657
+ P3 — FORMS
658
+ ═══════════════════════════════════════════════════ */
659
+
660
+ /* ─── Label ─── */
661
+ .form-label {
662
+ display: inline-flex;
663
+ align-items: center;
664
+ gap: 0.25rem;
665
+ font-size: 0.875rem;
666
+ font-weight: 500;
667
+ color: var(--color-text-primary);
668
+ line-height: 1.4;
669
+ }
670
+ .form-label-required::after {
671
+ content: "*";
672
+ color: var(--color-danger);
673
+ margin-left: 0.125rem;
674
+ }
675
+
676
+ /* ─── Textarea ─── */
677
+ .form-textarea {
678
+ display: block;
679
+ width: 100%;
680
+ min-height: 5rem;
681
+ padding: 0.625rem 0.75rem;
682
+ font-size: 0.875rem;
683
+ font-family: var(--font-body);
684
+ color: var(--color-text-primary);
685
+ background: var(--color-surface-1);
686
+ border: 1px solid var(--color-border-default);
687
+ border-radius: var(--radius-md);
688
+ transition: all var(--duration-fast) var(--ease-smooth);
689
+ line-height: 1.5;
690
+ }
691
+ .form-textarea:hover {
692
+ border-color: var(--color-border-strong);
693
+ }
694
+ .form-textarea:focus {
695
+ outline: none;
696
+ border-color: var(--color-primary);
697
+ box-shadow: 0 0 0 3px var(--color-primary-subtle);
698
+ }
699
+ .form-textarea-error {
700
+ border-color: var(--color-danger);
701
+ }
702
+ .form-textarea-error:focus {
703
+ box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.1);
704
+ }
705
+
706
+ /* ─── Checkbox ─── */
707
+ .checkbox-wrapper {
708
+ display: inline-flex;
709
+ align-items: center;
710
+ gap: 0.5rem;
711
+ cursor: pointer;
712
+ user-select: none;
713
+ }
714
+ .checkbox-control {
715
+ position: relative;
716
+ width: 18px;
717
+ height: 18px;
718
+ border: 2px solid var(--color-border-strong);
719
+ border-radius: 4px;
720
+ transition: all var(--duration-fast) var(--ease-smooth);
721
+ display: flex;
722
+ align-items: center;
723
+ justify-content: center;
724
+ flex-shrink: 0;
725
+ }
726
+ .checkbox-control[data-checked="true"] {
727
+ background: var(--color-primary);
728
+ border-color: var(--color-primary);
729
+ }
730
+ .checkbox-control[data-indeterminate="true"] {
731
+ background: var(--color-primary);
732
+ border-color: var(--color-primary);
733
+ }
734
+ .checkbox-icon {
735
+ color: white;
736
+ opacity: 0;
737
+ transform: scale(0.5);
738
+ transition: all var(--duration-fast) var(--ease-spring);
739
+ }
740
+ .checkbox-control[data-checked="true"] .checkbox-icon,
741
+ .checkbox-control[data-indeterminate="true"] .checkbox-icon {
742
+ opacity: 1;
743
+ transform: scale(1);
744
+ }
745
+ .checkbox-label {
746
+ font-size: 0.875rem;
747
+ color: var(--color-text-primary);
748
+ }
749
+
750
+ /* ─── Switch ─── */
751
+ .switch-wrapper {
752
+ display: inline-flex;
753
+ align-items: center;
754
+ gap: 0.5rem;
755
+ cursor: pointer;
756
+ user-select: none;
757
+ }
758
+ .switch-track {
759
+ position: relative;
760
+ width: 40px;
761
+ height: 22px;
762
+ background: var(--color-surface-3);
763
+ border-radius: var(--radius-full);
764
+ border: 1px solid var(--color-border-default);
765
+ transition: all var(--duration-normal) var(--ease-smooth);
766
+ flex-shrink: 0;
767
+ }
768
+ .switch-track[data-checked="true"] {
769
+ background: var(--color-primary);
770
+ border-color: var(--color-primary);
771
+ }
772
+ .switch-track-sm {
773
+ width: 32px;
774
+ height: 18px;
775
+ }
776
+ .switch-thumb {
777
+ position: absolute;
778
+ top: 2px;
779
+ left: 2px;
780
+ width: 16px;
781
+ height: 16px;
782
+ background: white;
783
+ border-radius: var(--radius-full);
784
+ transition: transform var(--duration-normal) var(--ease-spring);
785
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
786
+ }
787
+ .switch-track[data-checked="true"] .switch-thumb {
788
+ transform: translateX(18px);
789
+ }
790
+ .switch-track-sm .switch-thumb {
791
+ width: 12px;
792
+ height: 12px;
793
+ }
794
+ .switch-track-sm[data-checked="true"] .switch-thumb {
795
+ transform: translateX(14px);
796
+ }
797
+ .switch-label {
798
+ font-size: 0.875rem;
799
+ color: var(--color-text-primary);
800
+ }
801
+
802
+ /* ─── Slider ─── */
803
+ .form-slider {
804
+ -webkit-appearance: none;
805
+ appearance: none;
806
+ width: 100%;
807
+ height: 6px;
808
+ border-radius: var(--radius-full);
809
+ background: var(--color-surface-3);
810
+ outline: none;
811
+ cursor: pointer;
812
+ }
813
+ .form-slider::-webkit-slider-thumb {
814
+ -webkit-appearance: none;
815
+ appearance: none;
816
+ width: 18px;
817
+ height: 18px;
818
+ border-radius: 50%;
819
+ background: var(--color-primary);
820
+ border: 2px solid white;
821
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2);
822
+ cursor: grab;
823
+ transition: transform var(--duration-fast) var(--ease-spring);
824
+ }
825
+ .form-slider::-webkit-slider-thumb:hover {
826
+ transform: scale(1.15);
827
+ }
828
+ .form-slider::-webkit-slider-thumb:active {
829
+ cursor: grabbing;
830
+ transform: scale(1.05);
831
+ }
832
+ .form-slider::-moz-range-thumb {
833
+ width: 18px;
834
+ height: 18px;
835
+ border-radius: 50%;
836
+ background: var(--color-primary);
837
+ border: 2px solid white;
838
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2);
839
+ cursor: grab;
840
+ }
841
+
842
+ /* ─── Select ─── */
843
+ .select-trigger {
844
+ display: flex;
845
+ align-items: center;
846
+ justify-content: space-between;
847
+ width: 100%;
848
+ padding: 0.5rem 0.75rem;
849
+ font-size: 0.875rem;
850
+ color: var(--color-text-primary);
851
+ background: var(--color-surface-1);
852
+ border: 1px solid var(--color-border-default);
853
+ border-radius: var(--radius-md);
854
+ cursor: pointer;
855
+ transition: all var(--duration-fast) var(--ease-smooth);
856
+ }
857
+ .select-trigger:hover {
858
+ border-color: var(--color-border-strong);
859
+ }
860
+ .select-trigger:focus {
861
+ outline: none;
862
+ border-color: var(--color-primary);
863
+ box-shadow: 0 0 0 3px var(--color-primary-subtle);
864
+ }
865
+ .select-trigger-error {
866
+ border-color: var(--color-danger);
867
+ }
868
+ .select-placeholder {
869
+ color: var(--color-text-tertiary);
870
+ }
871
+ .select-option {
872
+ display: flex;
873
+ align-items: center;
874
+ justify-content: space-between;
875
+ padding: 0.5rem 0.75rem;
876
+ font-size: 0.875rem;
877
+ color: var(--color-text-primary);
878
+ border-radius: var(--radius-sm);
879
+ cursor: pointer;
880
+ transition: background var(--duration-fast) var(--ease-smooth);
881
+ }
882
+ .select-option:hover {
883
+ background: var(--color-primary-subtle);
884
+ }
885
+ .select-option[data-selected="true"] {
886
+ color: var(--color-primary);
887
+ font-weight: 500;
888
+ }
889
+
890
+ /* ─── Tabs ─── */
891
+ .tabs-list {
892
+ display: flex;
893
+ gap: 0;
894
+ border-bottom: 1px solid var(--color-border-default);
895
+ position: relative;
896
+ }
897
+ .tabs-trigger {
898
+ position: relative;
899
+ padding: 0.625rem 1rem;
900
+ font-size: 0.875rem;
901
+ font-weight: 500;
902
+ color: var(--color-text-secondary);
903
+ cursor: pointer;
904
+ border: none;
905
+ background: transparent;
906
+ transition: color var(--duration-fast) var(--ease-smooth);
907
+ }
908
+ .tabs-trigger:hover {
909
+ color: var(--color-text-primary);
910
+ }
911
+ .tabs-trigger[data-active="true"] {
912
+ color: var(--color-primary);
913
+ }
914
+ .tabs-indicator {
915
+ position: absolute;
916
+ bottom: -1px;
917
+ height: 2px;
918
+ background: var(--color-primary);
919
+ border-radius: 1px;
920
+ transition: all var(--duration-normal) var(--ease-spring);
921
+ }
922
+ .tabs-content {
923
+ padding-top: 1rem;
924
+ }
925
+ }
926
+
927
+ /* ════════════════════════════════════════════════════════
928
+ P4 — DATA DISPLAY
929
+ ════════════════════════════════════════════════════════ */
930
+
931
+ @layer components {
932
+ /* ─── Table ─── */
933
+ .data-table {
934
+ width: 100%;
935
+ border-collapse: collapse;
936
+ font-size: 0.875rem;
937
+ }
938
+ .data-table-header {
939
+ border-bottom: 1px solid var(--color-border);
940
+ }
941
+ .data-table-head {
942
+ text-align: left;
943
+ padding: 0.75rem 1rem;
944
+ font-weight: 600;
945
+ font-size: 0.75rem;
946
+ text-transform: uppercase;
947
+ letter-spacing: 0.05em;
948
+ color: var(--color-text-tertiary);
949
+ }
950
+ .data-table-body .data-table-row {
951
+ border-bottom: 1px solid var(--color-border);
952
+ transition: background var(--duration-fast) ease;
953
+ }
954
+ .data-table-body .data-table-row:hover {
955
+ background: var(--color-surface-raised);
956
+ }
957
+ .data-table-cell {
958
+ padding: 0.75rem 1rem;
959
+ color: var(--color-text-secondary);
960
+ }
961
+
962
+ /* ─── Avatar ─── */
963
+ .avatar {
964
+ display: inline-flex;
965
+ align-items: center;
966
+ justify-content: center;
967
+ border-radius: 9999px;
968
+ overflow: hidden;
969
+ flex-shrink: 0;
970
+ background: var(--color-surface-raised);
971
+ border: 2px solid var(--color-border);
972
+ }
973
+ .avatar-xs {
974
+ width: 1.5rem;
975
+ height: 1.5rem;
976
+ font-size: 0.5rem;
977
+ }
978
+ .avatar-sm {
979
+ width: 2rem;
980
+ height: 2rem;
981
+ font-size: 0.625rem;
982
+ }
983
+ .avatar-md {
984
+ width: 2.5rem;
985
+ height: 2.5rem;
986
+ font-size: 0.75rem;
987
+ }
988
+ .avatar-lg {
989
+ width: 3rem;
990
+ height: 3rem;
991
+ font-size: 1rem;
992
+ }
993
+ .avatar-xl {
994
+ width: 4rem;
995
+ height: 4rem;
996
+ font-size: 1.25rem;
997
+ }
998
+ .avatar-image {
999
+ width: 100%;
1000
+ height: 100%;
1001
+ object-fit: cover;
1002
+ }
1003
+ .avatar-fallback {
1004
+ font-weight: 600;
1005
+ color: var(--color-text-secondary);
1006
+ text-transform: uppercase;
1007
+ user-select: none;
1008
+ }
1009
+
1010
+ /* ─── Skeleton ─── */
1011
+ .skeleton {
1012
+ background: linear-gradient(
1013
+ 90deg,
1014
+ var(--color-surface-raised) 25%,
1015
+ var(--color-border) 50%,
1016
+ var(--color-surface-raised) 75%
1017
+ );
1018
+ background-size: 200% 100%;
1019
+ animation: skeleton-shimmer 1.5s ease infinite;
1020
+ border-radius: var(--radius-md);
1021
+ }
1022
+ .skeleton-text {
1023
+ height: 0.875rem;
1024
+ width: 100%;
1025
+ border-radius: var(--radius-sm);
1026
+ }
1027
+ .skeleton-circular {
1028
+ border-radius: 9999px;
1029
+ }
1030
+ .skeleton-rectangular {
1031
+ border-radius: var(--radius-md);
1032
+ }
1033
+ @keyframes skeleton-shimmer {
1034
+ 0% {
1035
+ background-position: 200% 0;
1036
+ }
1037
+ 100% {
1038
+ background-position: -200% 0;
1039
+ }
1040
+ }
1041
+
1042
+ /* ─── Progress ─── */
1043
+ .progress-wrapper {
1044
+ display: flex;
1045
+ flex-direction: column;
1046
+ gap: 0.375rem;
1047
+ }
1048
+ .progress-label-row {
1049
+ display: flex;
1050
+ justify-content: space-between;
1051
+ align-items: center;
1052
+ }
1053
+ .progress-label {
1054
+ font-size: 0.75rem;
1055
+ font-weight: 500;
1056
+ color: var(--color-text-secondary);
1057
+ }
1058
+ .progress-value {
1059
+ font-size: 0.75rem;
1060
+ font-family: var(--font-mono, monospace);
1061
+ color: var(--color-text-tertiary);
1062
+ }
1063
+ .progress-track {
1064
+ width: 100%;
1065
+ height: 6px;
1066
+ border-radius: 9999px;
1067
+ background: var(--color-surface-raised);
1068
+ overflow: hidden;
1069
+ }
1070
+ .progress-bar {
1071
+ height: 100%;
1072
+ border-radius: 9999px;
1073
+ transition: width var(--duration-normal) var(--ease-spring);
1074
+ }
1075
+ .progress-bar-default {
1076
+ background: var(--color-primary);
1077
+ }
1078
+ .progress-bar-success {
1079
+ background: var(--color-success);
1080
+ }
1081
+ .progress-bar-warning {
1082
+ background: var(--color-warning);
1083
+ }
1084
+ .progress-bar-danger {
1085
+ background: var(--color-danger);
1086
+ }
1087
+
1088
+ /* ─── Spinner ─── */
1089
+ .spinner-wrapper {
1090
+ display: inline-flex;
1091
+ align-items: center;
1092
+ gap: 0.5rem;
1093
+ }
1094
+ .spinner {
1095
+ animation: spinner-rotate 0.75s linear infinite;
1096
+ }
1097
+ .spinner-sm {
1098
+ width: 1rem;
1099
+ height: 1rem;
1100
+ }
1101
+ .spinner-md {
1102
+ width: 1.5rem;
1103
+ height: 1.5rem;
1104
+ }
1105
+ .spinner-lg {
1106
+ width: 2rem;
1107
+ height: 2rem;
1108
+ }
1109
+ .spinner-track {
1110
+ stroke: var(--color-border);
1111
+ }
1112
+ .spinner-arc {
1113
+ stroke: var(--color-primary);
1114
+ }
1115
+ .spinner-label {
1116
+ font-size: 0.875rem;
1117
+ color: var(--color-text-secondary);
1118
+ }
1119
+ @keyframes spinner-rotate {
1120
+ to {
1121
+ transform: rotate(360deg);
1122
+ }
1123
+ }
1124
+
1125
+ /* ─── Tag ─── */
1126
+ .tag {
1127
+ display: inline-flex;
1128
+ align-items: center;
1129
+ gap: 0.25rem;
1130
+ padding: 0.125rem 0.5rem;
1131
+ font-size: 0.75rem;
1132
+ font-weight: 500;
1133
+ border-radius: 9999px;
1134
+ line-height: 1.5;
1135
+ border: 1px solid transparent;
1136
+ transition: all var(--duration-fast) ease;
1137
+ }
1138
+ .tag-icon {
1139
+ display: inline-flex;
1140
+ align-items: center;
1141
+ font-size: 0.7rem;
1142
+ }
1143
+ .tag-remove {
1144
+ display: inline-flex;
1145
+ align-items: center;
1146
+ margin-left: 0.125rem;
1147
+ border-radius: 9999px;
1148
+ padding: 0.0625rem;
1149
+ cursor: pointer;
1150
+ background: none;
1151
+ border: none;
1152
+ color: inherit;
1153
+ opacity: 0.6;
1154
+ transition: opacity var(--duration-fast) ease;
1155
+ }
1156
+ .tag-remove:hover {
1157
+ opacity: 1;
1158
+ }
1159
+ .tag-default {
1160
+ background: var(--color-surface-raised);
1161
+ color: var(--color-text-secondary);
1162
+ border-color: var(--color-border);
1163
+ }
1164
+ .tag-primary {
1165
+ background: var(--color-primary-subtle);
1166
+ color: var(--color-primary);
1167
+ border-color: var(--color-primary);
1168
+ }
1169
+ .tag-success {
1170
+ background: rgba(16, 185, 129, 0.12);
1171
+ color: var(--color-success);
1172
+ border-color: var(--color-success);
1173
+ }
1174
+ .tag-warning {
1175
+ background: rgba(245, 158, 11, 0.12);
1176
+ color: var(--color-warning);
1177
+ border-color: var(--color-warning);
1178
+ }
1179
+ .tag-danger {
1180
+ background: rgba(239, 68, 68, 0.12);
1181
+ color: var(--color-danger);
1182
+ border-color: var(--color-danger);
1183
+ }
1184
+ .tag-info {
1185
+ background: rgba(59, 130, 246, 0.12);
1186
+ color: var(--color-info);
1187
+ border-color: var(--color-info);
1188
+ }
1189
+
1190
+ /* ─── Empty State ─── */
1191
+ .empty-state {
1192
+ display: flex;
1193
+ flex-direction: column;
1194
+ align-items: center;
1195
+ justify-content: center;
1196
+ text-align: center;
1197
+ padding: 3rem 1.5rem;
1198
+ gap: 0.75rem;
1199
+ }
1200
+ .empty-state-icon {
1201
+ display: flex;
1202
+ align-items: center;
1203
+ justify-content: center;
1204
+ width: 3.5rem;
1205
+ height: 3.5rem;
1206
+ border-radius: var(--radius-lg);
1207
+ background: var(--color-surface-raised);
1208
+ color: var(--color-text-tertiary);
1209
+ margin-bottom: 0.5rem;
1210
+ }
1211
+ .empty-state-title {
1212
+ font-size: 1rem;
1213
+ font-weight: 600;
1214
+ color: var(--color-text-primary);
1215
+ }
1216
+ .empty-state-description {
1217
+ font-size: 0.875rem;
1218
+ color: var(--color-text-tertiary);
1219
+ max-width: 24rem;
1220
+ }
1221
+ .empty-state-action {
1222
+ margin-top: 0.5rem;
1223
+ }
1224
+ }
1225
+
1226
+ /* ════════════════════════════════════════════════════════
1227
+ P5 — ADVANCED NAVIGATION
1228
+ ════════════════════════════════════════════════════════ */
1229
+
1230
+ @layer components {
1231
+ /* ─── Sheet ─── */
1232
+ .sheet-overlay {
1233
+ position: fixed;
1234
+ inset: 0;
1235
+ z-index: 9990;
1236
+ background: rgba(0, 0, 0, 0.5);
1237
+ backdrop-filter: blur(4px);
1238
+ animation: fade-in var(--duration-fast) ease;
1239
+ }
1240
+ .sheet-panel {
1241
+ position: fixed;
1242
+ z-index: 9991;
1243
+ background: var(--color-surface-base);
1244
+ border: 1px solid var(--color-border);
1245
+ box-shadow: var(--shadow-xl);
1246
+ display: flex;
1247
+ flex-direction: column;
1248
+ overflow-y: auto;
1249
+ }
1250
+ .sheet-right {
1251
+ top: 0;
1252
+ right: 0;
1253
+ bottom: 0;
1254
+ width: min(24rem, 85vw);
1255
+ animation: sheet-slide-right var(--duration-normal) var(--ease-spring);
1256
+ }
1257
+ .sheet-left {
1258
+ top: 0;
1259
+ left: 0;
1260
+ bottom: 0;
1261
+ width: min(24rem, 85vw);
1262
+ animation: sheet-slide-left var(--duration-normal) var(--ease-spring);
1263
+ }
1264
+ .sheet-top {
1265
+ top: 0;
1266
+ left: 0;
1267
+ right: 0;
1268
+ max-height: 60vh;
1269
+ animation: sheet-slide-top var(--duration-normal) var(--ease-spring);
1270
+ }
1271
+ .sheet-bottom {
1272
+ bottom: 0;
1273
+ left: 0;
1274
+ right: 0;
1275
+ max-height: 60vh;
1276
+ animation: sheet-slide-bottom var(--duration-normal) var(--ease-spring);
1277
+ }
1278
+ @keyframes sheet-slide-right {
1279
+ from {
1280
+ transform: translateX(100%);
1281
+ }
1282
+ }
1283
+ @keyframes sheet-slide-left {
1284
+ from {
1285
+ transform: translateX(-100%);
1286
+ }
1287
+ }
1288
+ @keyframes sheet-slide-top {
1289
+ from {
1290
+ transform: translateY(-100%);
1291
+ }
1292
+ }
1293
+ @keyframes sheet-slide-bottom {
1294
+ from {
1295
+ transform: translateY(100%);
1296
+ }
1297
+ }
1298
+ .sheet-header {
1299
+ display: flex;
1300
+ flex-direction: column;
1301
+ gap: 0.25rem;
1302
+ padding: 1.5rem;
1303
+ border-bottom: 1px solid var(--color-border);
1304
+ }
1305
+ .sheet-title {
1306
+ font-size: 1.125rem;
1307
+ font-weight: 600;
1308
+ color: var(--color-text-primary);
1309
+ }
1310
+ .sheet-description {
1311
+ font-size: 0.875rem;
1312
+ color: var(--color-text-secondary);
1313
+ }
1314
+ .sheet-close {
1315
+ position: absolute;
1316
+ top: 1rem;
1317
+ right: 1rem;
1318
+ display: flex;
1319
+ align-items: center;
1320
+ justify-content: center;
1321
+ width: 2rem;
1322
+ height: 2rem;
1323
+ border-radius: var(--radius-md);
1324
+ border: none;
1325
+ background: none;
1326
+ color: var(--color-text-tertiary);
1327
+ cursor: pointer;
1328
+ transition: all var(--duration-fast) ease;
1329
+ }
1330
+ .sheet-close:hover {
1331
+ background: var(--color-surface-raised);
1332
+ color: var(--color-text-primary);
1333
+ }
1334
+ .sheet-footer {
1335
+ display: flex;
1336
+ justify-content: flex-end;
1337
+ gap: 0.5rem;
1338
+ padding: 1rem 1.5rem;
1339
+ border-top: 1px solid var(--color-border);
1340
+ margin-top: auto;
1341
+ }
1342
+
1343
+ /* ─── Command ─── */
1344
+ .command-overlay {
1345
+ position: fixed;
1346
+ inset: 0;
1347
+ z-index: 9995;
1348
+ background: rgba(0, 0, 0, 0.5);
1349
+ backdrop-filter: blur(4px);
1350
+ display: flex;
1351
+ align-items: flex-start;
1352
+ justify-content: center;
1353
+ padding-top: 15vh;
1354
+ animation: fade-in var(--duration-fast) ease;
1355
+ }
1356
+ .command-dialog {
1357
+ width: min(32rem, 90vw);
1358
+ background: var(--color-surface-base);
1359
+ border: 1px solid var(--color-border);
1360
+ border-radius: var(--radius-lg);
1361
+ box-shadow: var(--shadow-xl);
1362
+ overflow: hidden;
1363
+ animation: dialog-enter var(--duration-normal) var(--ease-spring);
1364
+ }
1365
+ .command-input-wrapper {
1366
+ display: flex;
1367
+ align-items: center;
1368
+ gap: 0.5rem;
1369
+ padding: 0.75rem 1rem;
1370
+ border-bottom: 1px solid var(--color-border);
1371
+ }
1372
+ .command-search-icon {
1373
+ flex-shrink: 0;
1374
+ color: var(--color-text-tertiary);
1375
+ }
1376
+ .command-input {
1377
+ flex: 1;
1378
+ background: transparent;
1379
+ border: none;
1380
+ outline: none;
1381
+ font-size: 0.9375rem;
1382
+ color: var(--color-text-primary);
1383
+ }
1384
+ .command-input::placeholder {
1385
+ color: var(--color-text-tertiary);
1386
+ }
1387
+ .command-list {
1388
+ max-height: 20rem;
1389
+ overflow-y: auto;
1390
+ padding: 0.25rem;
1391
+ }
1392
+ .command-empty {
1393
+ padding: 2rem 1rem;
1394
+ text-align: center;
1395
+ font-size: 0.875rem;
1396
+ color: var(--color-text-tertiary);
1397
+ }
1398
+ .command-group-label {
1399
+ padding: 0.5rem 0.75rem 0.25rem;
1400
+ font-size: 0.6875rem;
1401
+ font-weight: 600;
1402
+ text-transform: uppercase;
1403
+ letter-spacing: 0.05em;
1404
+ color: var(--color-text-tertiary);
1405
+ }
1406
+ .command-item {
1407
+ display: flex;
1408
+ align-items: center;
1409
+ gap: 0.5rem;
1410
+ padding: 0.5rem 0.75rem;
1411
+ border-radius: var(--radius-md);
1412
+ font-size: 0.875rem;
1413
+ color: var(--color-text-secondary);
1414
+ cursor: pointer;
1415
+ transition: background var(--duration-fast) ease;
1416
+ }
1417
+ .command-item[data-active="true"] {
1418
+ background: var(--color-primary-subtle);
1419
+ color: var(--color-text-primary);
1420
+ }
1421
+ .command-item-icon {
1422
+ display: flex;
1423
+ align-items: center;
1424
+ flex-shrink: 0;
1425
+ color: var(--color-text-tertiary);
1426
+ }
1427
+ .command-item[data-active="true"] .command-item-icon {
1428
+ color: var(--color-primary);
1429
+ }
1430
+ .command-item-label {
1431
+ flex: 1;
1432
+ }
1433
+ .command-shortcut {
1434
+ font-size: 0.6875rem;
1435
+ font-family: var(--font-mono, monospace);
1436
+ padding: 0.125rem 0.375rem;
1437
+ border-radius: var(--radius-sm);
1438
+ background: var(--color-surface-raised);
1439
+ border: 1px solid var(--color-border);
1440
+ color: var(--color-text-tertiary);
1441
+ }
1442
+
1443
+ /* ─── Sidebar ─── */
1444
+ .sidebar {
1445
+ position: relative;
1446
+ display: flex;
1447
+ flex-direction: column;
1448
+ width: 16rem;
1449
+ height: 100%;
1450
+ background: var(--color-surface-base);
1451
+ border-right: 1px solid var(--color-border);
1452
+ transition:
1453
+ width var(--duration-normal) var(--ease-spring),
1454
+ border-radius var(--duration-normal) var(--ease-spring);
1455
+ overflow: hidden;
1456
+ }
1457
+ .sidebar-collapsed {
1458
+ width: 3.5rem;
1459
+ border-radius: var(--radius-xl);
1460
+ border-right: 1px solid var(--color-border); /* Helper to maintain border */
1461
+ }
1462
+
1463
+ /* Header */
1464
+ .sidebar-header {
1465
+ display: flex;
1466
+ align-items: center;
1467
+ justify-content: space-between;
1468
+ padding: 0.75rem;
1469
+ border-bottom: 1px solid var(--color-border);
1470
+ min-height: 3.5rem;
1471
+ gap: 0.5rem;
1472
+ transition: padding var(--duration-normal) var(--ease-spring);
1473
+ }
1474
+ .sidebar-header-collapsed {
1475
+ justify-content: center;
1476
+ padding: 0;
1477
+ gap: 0;
1478
+ }
1479
+ /* Hide non-toggle children in header when collapsed */
1480
+ .sidebar-header-collapsed > *:not(.sidebar-toggle) {
1481
+ opacity: 0;
1482
+ width: 0;
1483
+ overflow: hidden;
1484
+ pointer-events: none;
1485
+ transition:
1486
+ opacity var(--duration-fast) ease,
1487
+ width var(--duration-fast) ease;
1488
+ }
1489
+
1490
+ /* Content */
1491
+ /* Content */
1492
+ .sidebar-content {
1493
+ position: relative;
1494
+ flex: 1;
1495
+ overflow-y: auto;
1496
+ overflow-x: hidden;
1497
+ padding: 0.5rem;
1498
+ transition: padding var(--duration-normal) var(--ease-spring);
1499
+
1500
+ /* Custom Scrollbar */
1501
+ scrollbar-width: thin;
1502
+ scrollbar-color: var(--color-border) transparent;
1503
+ }
1504
+ .sidebar-content::-webkit-scrollbar {
1505
+ width: 6px;
1506
+ }
1507
+ .sidebar-content::-webkit-scrollbar-track {
1508
+ background: transparent;
1509
+ }
1510
+ .sidebar-content::-webkit-scrollbar-thumb {
1511
+ background-color: var(--color-border);
1512
+ border-radius: 20px;
1513
+ border: 2px solid transparent;
1514
+ background-clip: content-box;
1515
+ }
1516
+ .sidebar-content::-webkit-scrollbar-thumb:hover {
1517
+ background-color: var(--color-text-tertiary);
1518
+ }
1519
+ .sidebar-collapsed .sidebar-content {
1520
+ padding: 1rem 0;
1521
+ display: flex;
1522
+ flex-direction: column;
1523
+ align-items: center;
1524
+ }
1525
+ .sidebar-glider {
1526
+ position: absolute;
1527
+ background: var(--color-primary-subtle);
1528
+ border-radius: var(--radius-md);
1529
+ transition:
1530
+ transform 0.2s cubic-bezier(0.2, 0, 0, 1),
1531
+ width 0.2s cubic-bezier(0.2, 0, 0, 1),
1532
+ left 0.2s cubic-bezier(0.2, 0, 0, 1),
1533
+ height 0.2s cubic-bezier(0.2, 0, 0, 1),
1534
+ opacity 0.2s ease;
1535
+ z-index: 0;
1536
+ pointer-events: none;
1537
+ }
1538
+ .sidebar-collapsed .sidebar-glider {
1539
+ border-radius: var(--radius-lg);
1540
+ }
1541
+
1542
+ /* Group */
1543
+ .sidebar-group {
1544
+ margin-bottom: 0.5rem;
1545
+ width: 100%;
1546
+ display: flex;
1547
+ flex-direction: column;
1548
+ align-items: center;
1549
+ /* Removed relative positioning to allow items to offset against SidebarContent */
1550
+ z-index: 1;
1551
+ }
1552
+ .sidebar-group-label {
1553
+ padding: 0.5rem 0.75rem 0.25rem;
1554
+ font-size: 0.6875rem;
1555
+ font-weight: 600;
1556
+ text-transform: uppercase;
1557
+ letter-spacing: 0.05em;
1558
+ color: var(--color-text-tertiary);
1559
+ white-space: nowrap;
1560
+ overflow: hidden;
1561
+ transition: all var(--duration-fast) ease;
1562
+ align-self: flex-start;
1563
+ }
1564
+ .sidebar-group-label-collapsed {
1565
+ padding: 0.375rem 0;
1566
+ display: flex;
1567
+ align-items: center;
1568
+ justify-content: center;
1569
+ width: 1.5rem;
1570
+ align-self: center;
1571
+ }
1572
+ .sidebar-group-divider {
1573
+ width: 1.5rem;
1574
+ height: 1px;
1575
+ background: var(--color-border);
1576
+ border-radius: 1px;
1577
+ }
1578
+
1579
+ /* Item */
1580
+ .sidebar-item {
1581
+ position: relative;
1582
+ z-index: 1;
1583
+ display: flex;
1584
+ align-items: center;
1585
+ gap: 0.5rem;
1586
+ width: 100%;
1587
+ padding: 0.5rem 0.75rem;
1588
+ border: none;
1589
+ background: none;
1590
+ border-radius: var(--radius-md);
1591
+ font-size: 0.875rem;
1592
+ color: var(--color-text-secondary);
1593
+ cursor: pointer;
1594
+ transition: color var(--duration-fast) ease;
1595
+ text-align: left;
1596
+ overflow: hidden;
1597
+ white-space: nowrap;
1598
+ }
1599
+ .sidebar-item:hover {
1600
+ color: var(--color-text-primary);
1601
+ }
1602
+ .sidebar-item-active {
1603
+ color: var(--color-primary);
1604
+ font-weight: 500;
1605
+ }
1606
+ .sidebar-item-collapsed {
1607
+ display: grid;
1608
+ place-items: center;
1609
+ place-content: center;
1610
+ padding: 0;
1611
+ width: 2.25rem;
1612
+ height: 2.25rem;
1613
+ border-radius: var(--radius-lg);
1614
+ }
1615
+ .sidebar-item-icon {
1616
+ display: grid;
1617
+ place-items: center;
1618
+ flex-shrink: 0;
1619
+ width: 1.25rem;
1620
+ height: 1.25rem;
1621
+ line-height: 0;
1622
+ }
1623
+ .sidebar-item-icon svg {
1624
+ display: block;
1625
+ width: 100%;
1626
+ height: 100%;
1627
+ }
1628
+ .sidebar-item-label {
1629
+ white-space: nowrap;
1630
+ overflow: hidden;
1631
+ text-overflow: ellipsis;
1632
+ opacity: 1;
1633
+ max-width: 12rem;
1634
+ transition:
1635
+ opacity var(--duration-fast) ease,
1636
+ max-width var(--duration-normal) var(--ease-spring);
1637
+ }
1638
+ .sidebar-item-collapsed .sidebar-item-label {
1639
+ opacity: 0;
1640
+ max-width: 0;
1641
+ pointer-events: none;
1642
+ display: none;
1643
+ }
1644
+
1645
+ /* Footer */
1646
+ .sidebar-footer {
1647
+ padding: 0.75rem;
1648
+ border-top: 1px solid var(--color-border);
1649
+ }
1650
+
1651
+ /* Toggle */
1652
+ .sidebar-toggle {
1653
+ display: grid;
1654
+ place-items: center;
1655
+ place-content: center;
1656
+ width: 2rem;
1657
+ height: 2rem;
1658
+ padding: 0;
1659
+ flex-shrink: 0;
1660
+ border-radius: var(--radius-md);
1661
+ border: 1px solid var(--color-border);
1662
+ background: var(--color-surface-base);
1663
+ color: var(--color-text-tertiary);
1664
+ cursor: pointer;
1665
+ transition: all var(--duration-fast) ease;
1666
+ box-shadow: var(--shadow-sm);
1667
+ line-height: 0;
1668
+ }
1669
+ .sidebar-toggle:hover {
1670
+ background: var(--color-surface-raised);
1671
+ color: var(--color-text-primary);
1672
+ }
1673
+ .sidebar-toggle svg {
1674
+ display: block;
1675
+ }
1676
+ .sidebar-toggle-icon {
1677
+ transition: transform var(--duration-normal) var(--ease-spring);
1678
+ /* Ensure icon is perfectly centered optically */
1679
+ transform-origin: center;
1680
+ }
1681
+ .sidebar-toggle-icon[data-collapsed="true"] {
1682
+ transform: rotate(180deg);
1683
+ }
1684
+
1685
+ /* Tooltip (shows on collapsed items) */
1686
+ .sidebar-tooltip {
1687
+ position: fixed;
1688
+ z-index: 9999;
1689
+ padding: 0.375rem 0.625rem;
1690
+ font-size: 0.75rem;
1691
+ font-weight: 500;
1692
+ color: var(--color-text-primary);
1693
+ background: var(--color-surface-base);
1694
+ border: 1px solid var(--color-border);
1695
+ border-radius: var(--radius-md);
1696
+ box-shadow: var(--shadow-md);
1697
+ white-space: nowrap;
1698
+ pointer-events: none;
1699
+ transform: translateY(-50%);
1700
+ animation: fade-in var(--duration-fast) ease;
1701
+ }
1702
+
1703
+ /* ─── Breadcrumb ─── */
1704
+ .breadcrumb-list {
1705
+ display: flex;
1706
+ align-items: center;
1707
+ gap: 0.25rem;
1708
+ list-style: none;
1709
+ padding: 0;
1710
+ margin: 0;
1711
+ flex-wrap: wrap;
1712
+ }
1713
+ .breadcrumb-item {
1714
+ display: inline-flex;
1715
+ align-items: center;
1716
+ gap: 0.25rem;
1717
+ }
1718
+ .breadcrumb-link {
1719
+ font-size: 0.875rem;
1720
+ color: var(--color-text-tertiary);
1721
+ text-decoration: none;
1722
+ transition: color var(--duration-fast) ease;
1723
+ }
1724
+ .breadcrumb-link:hover {
1725
+ color: var(--color-primary);
1726
+ text-decoration: underline;
1727
+ }
1728
+ .breadcrumb-page {
1729
+ font-size: 0.875rem;
1730
+ font-weight: 500;
1731
+ color: var(--color-text-primary);
1732
+ }
1733
+ .breadcrumb-separator {
1734
+ display: inline-flex;
1735
+ align-items: center;
1736
+ color: var(--color-text-tertiary);
1737
+ list-style: none;
1738
+ }
1739
+
1740
+ /* ─── Pagination ─── */
1741
+ .pagination {
1742
+ display: flex;
1743
+ align-items: center;
1744
+ gap: 0.25rem;
1745
+ user-select: none;
1746
+ }
1747
+ .pagination-btn {
1748
+ display: inline-flex;
1749
+ align-items: center;
1750
+ justify-content: center;
1751
+ min-width: 2rem;
1752
+ height: 2rem;
1753
+ padding: 0 0.5rem;
1754
+ border: 1px solid var(--color-border);
1755
+ border-radius: var(--radius-md);
1756
+ background: transparent;
1757
+ font-size: 0.8125rem;
1758
+ color: var(--color-text-secondary);
1759
+ cursor: pointer;
1760
+ transition: all var(--duration-fast) ease;
1761
+ }
1762
+ .pagination-btn:hover:not(:disabled) {
1763
+ background: var(--color-surface-raised);
1764
+ color: var(--color-text-primary);
1765
+ }
1766
+ .pagination-btn:disabled {
1767
+ opacity: 0.4;
1768
+ cursor: not-allowed;
1769
+ }
1770
+ .pagination-btn-active {
1771
+ background: var(--color-primary);
1772
+ color: #fff;
1773
+ border-color: var(--color-primary);
1774
+ }
1775
+ .pagination-btn-active:hover:not(:disabled) {
1776
+ background: var(--color-primary);
1777
+ color: #fff;
1778
+ }
1779
+ .pagination-dots {
1780
+ display: inline-flex;
1781
+ align-items: center;
1782
+ justify-content: center;
1783
+ min-width: 2rem;
1784
+ height: 2rem;
1785
+ font-size: 0.875rem;
1786
+ color: var(--color-text-tertiary);
1787
+ }
1788
+ }