@tomny-dev/uzi 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.css CHANGED
@@ -1,3 +1,95 @@
1
+ /* src/theme/theme.css */
2
+ :root {
3
+ --focus-ring: 2px solid color-mix(in srgb, var(--ring, #94a3b8) 50%, transparent);
4
+ --focus-ring-offset: 2px;
5
+ --success: hsl(142 71% 45%);
6
+ --warning: hsl(38 92% 50%);
7
+ }
8
+ :root,
9
+ :root[data-uzi-theme=light],
10
+ [data-uzi-theme=light] {
11
+ color-scheme: light;
12
+ --background: hsl(210 20% 98%);
13
+ --foreground: hsl(222 47% 11%);
14
+ --card: hsl(0 0% 100%);
15
+ --card-foreground: hsl(222 47% 11%);
16
+ --popover: hsl(0 0% 100%);
17
+ --popover-foreground: hsl(222 47% 11%);
18
+ --secondary: hsl(214 32% 94%);
19
+ --secondary-foreground: hsl(222 47% 11%);
20
+ --muted: hsl(214 32% 94%);
21
+ --muted-foreground: hsl(215 16% 47%);
22
+ --accent: hsl(214 32% 92%);
23
+ --accent-foreground: hsl(222 47% 11%);
24
+ --destructive: hsl(0 84% 60%);
25
+ --destructive-foreground: hsl(0 0% 98%);
26
+ --border: hsl(214 32% 88%);
27
+ --input: hsl(214 32% 88%);
28
+ --panel: var(--card);
29
+ --text: var(--foreground);
30
+ }
31
+ :root[data-uzi-theme=dark],
32
+ [data-uzi-theme=dark] {
33
+ color-scheme: dark;
34
+ --background: #0f172a;
35
+ --foreground: #e2e8f0;
36
+ --card: #111827;
37
+ --card-foreground: #e2e8f0;
38
+ --popover: #111827;
39
+ --popover-foreground: #e2e8f0;
40
+ --secondary: #152036;
41
+ --secondary-foreground: #e2e8f0;
42
+ --muted: #152036;
43
+ --muted-foreground: #94a3b8;
44
+ --accent: color-mix(in srgb, var(--primary, #22d3ee) 12%, transparent);
45
+ --accent-foreground: #e2e8f0;
46
+ --destructive: hsl(0 72% 51%);
47
+ --destructive-foreground: hsl(0 0% 98%);
48
+ --border: #1f2937;
49
+ --input: #1f2937;
50
+ --panel: #111827;
51
+ --surface-elevated: #0b1224;
52
+ --surface-topbar: color-mix(in srgb, var(--background, #0b1224) 85%, transparent);
53
+ --text: #e2e8f0;
54
+ }
55
+ :root,
56
+ :root[data-uzi-accent=blue],
57
+ [data-uzi-accent=blue] {
58
+ --primary: hsl(221 83% 53%);
59
+ --primary-foreground: hsl(210 40% 98%);
60
+ --ring: hsl(221 83% 53%);
61
+ }
62
+ :root[data-uzi-accent=cyan],
63
+ [data-uzi-accent=cyan] {
64
+ --primary: hsl(188 94% 43%);
65
+ --primary-foreground: hsl(222 47% 11%);
66
+ --ring: hsl(188 94% 43%);
67
+ }
68
+ :root[data-uzi-accent=violet],
69
+ [data-uzi-accent=violet] {
70
+ --primary: hsl(262 83% 58%);
71
+ --primary-foreground: hsl(210 40% 98%);
72
+ --ring: hsl(262 83% 58%);
73
+ }
74
+ :root[data-uzi-accent=emerald],
75
+ [data-uzi-accent=emerald] {
76
+ --primary: hsl(160 84% 39%);
77
+ --primary-foreground: hsl(210 40% 98%);
78
+ --ring: hsl(160 84% 39%);
79
+ }
80
+ :root[data-uzi-accent=amber],
81
+ [data-uzi-accent=amber] {
82
+ --primary: hsl(38 92% 50%);
83
+ --primary-foreground: hsl(222 47% 11%);
84
+ --ring: hsl(38 92% 50%);
85
+ }
86
+ :root[data-uzi-accent=rose],
87
+ [data-uzi-accent=rose] {
88
+ --primary: hsl(346 77% 49%);
89
+ --primary-foreground: hsl(210 40% 98%);
90
+ --ring: hsl(346 77% 49%);
91
+ }
92
+
1
93
  /* src/components/button/button.module.css */
2
94
  .button {
3
95
  display: inline-flex;
@@ -7,7 +99,7 @@
7
99
  font-family: inherit;
8
100
  font-weight: 600;
9
101
  border-radius: 8px;
10
- border: none;
102
+ border: 1px solid transparent;
11
103
  cursor: pointer;
12
104
  text-decoration: none;
13
105
  transition:
@@ -16,6 +108,16 @@
16
108
  color 0.15s,
17
109
  background 0.15s;
18
110
  white-space: nowrap;
111
+ line-height: 1;
112
+ }
113
+ .button:focus-visible {
114
+ outline: var(--focus-ring);
115
+ outline-offset: var(--focus-ring-offset);
116
+ }
117
+ .button svg {
118
+ width: 1rem;
119
+ height: 1rem;
120
+ flex-shrink: 0;
19
121
  }
20
122
  .button:disabled {
21
123
  opacity: 0.45;
@@ -23,51 +125,120 @@
23
125
  }
24
126
  .size-sm {
25
127
  font-size: 0.82rem;
128
+ min-height: 2rem;
26
129
  padding: 6px 14px;
27
130
  }
28
131
  .size-md {
29
132
  font-size: 0.95rem;
133
+ min-height: 2.25rem;
30
134
  padding: 10px 22px;
31
135
  }
32
136
  .size-lg {
33
137
  font-size: 1rem;
138
+ min-height: 2.5rem;
34
139
  padding: 12px 28px;
35
140
  }
141
+ .size-icon {
142
+ width: 2.25rem;
143
+ height: 2.25rem;
144
+ padding: 0;
145
+ }
36
146
  .variant-primary {
37
- background: var(--ts-btn-primary-bg, var(--accent, #22d3ee));
38
- color: var(--ts-btn-primary-text, #0f172a);
39
- border: 1px solid transparent;
147
+ background: var(--ts-btn-primary-bg, var(--primary, #22d3ee));
148
+ color: var(--ts-btn-primary-text, var(--primary-foreground, #0f172a));
40
149
  }
41
150
  .variant-primary:hover:not(:disabled) {
42
151
  opacity: 0.88;
43
152
  }
44
153
  .variant-secondary {
45
- background: var(--ts-btn-secondary-bg, rgba(255, 255, 255, 0.06));
46
- color: var(--ts-btn-secondary-text, var(--text, #e2e8f0));
47
- border: 1px solid var(--ts-btn-secondary-border, var(--border, #1f2937));
154
+ background: var(--ts-btn-secondary-bg, var(--secondary, rgba(255, 255, 255, 0.06)));
155
+ color: var(--ts-btn-secondary-text, var(--secondary-foreground, var(--text, #e2e8f0)));
156
+ border-color: var(--ts-btn-secondary-border, var(--border, #1f2937));
48
157
  }
49
158
  .variant-secondary:hover:not(:disabled) {
50
- background: var(--ts-btn-secondary-hover-bg, rgba(255, 255, 255, 0.1));
159
+ background: var(--ts-btn-secondary-hover-bg, color-mix(in srgb, var(--secondary, rgba(255, 255, 255, 0.06)) 90%, black));
51
160
  }
52
161
  .variant-outline {
53
- background: transparent;
54
- color: var(--ts-btn-outline-text, var(--text, #e2e8f0));
55
- border: 1px solid var(--ts-btn-outline-border, var(--border, #1f2937));
162
+ background: var(--ts-btn-outline-bg, var(--background, transparent));
163
+ color: var(--ts-btn-outline-text, var(--foreground, var(--text, #e2e8f0)));
164
+ border-color: var(--ts-btn-outline-border, var(--border, #1f2937));
56
165
  }
57
166
  .variant-outline:hover:not(:disabled) {
58
- border-color: var(--ts-btn-outline-hover-border, var(--accent, #22d3ee));
59
- color: var(--ts-btn-outline-hover-text, var(--accent, #22d3ee));
167
+ background: var(--ts-btn-outline-hover-bg, var(--accent, rgba(255, 255, 255, 0.06)));
168
+ color: var(--ts-btn-outline-hover-text, var(--accent-foreground, var(--foreground, #e2e8f0)));
60
169
  }
61
170
  .variant-ghost {
62
171
  background: transparent;
63
- color: var(--ts-btn-ghost-text, var(--muted, #94a3b8));
64
- border: 1px solid transparent;
172
+ color: var(--ts-btn-ghost-text, var(--muted-foreground, var(--muted, #94a3b8)));
65
173
  padding-left: 8px;
66
174
  padding-right: 8px;
67
175
  }
68
176
  .variant-ghost:hover:not(:disabled) {
69
- background: rgba(255, 255, 255, 0.05);
70
- color: var(--text, #e2e8f0);
177
+ background: var(--ts-btn-ghost-hover-bg, var(--accent, rgba(255, 255, 255, 0.05)));
178
+ color: var(--ts-btn-ghost-hover-text, var(--accent-foreground, var(--foreground, #e2e8f0)));
179
+ }
180
+ .variant-destructive {
181
+ background: var(--ts-btn-danger-bg, var(--destructive, #f87171));
182
+ color: var(--ts-btn-danger-text, var(--destructive-foreground, #fff));
183
+ }
184
+ .variant-destructive:hover:not(:disabled) {
185
+ opacity: 0.9;
186
+ }
187
+ .variant-link {
188
+ background: transparent;
189
+ color: var(--ts-btn-link-text, var(--primary, #22d3ee));
190
+ border-color: transparent;
191
+ min-height: auto;
192
+ padding: 0;
193
+ border-radius: 0;
194
+ }
195
+ .variant-link:hover:not(:disabled) {
196
+ text-decoration: underline;
197
+ text-underline-offset: 0.2em;
198
+ }
199
+
200
+ /* src/components/avatar/avatar.module.css */
201
+ .avatar {
202
+ position: relative;
203
+ display: inline-flex;
204
+ flex-shrink: 0;
205
+ align-items: center;
206
+ justify-content: center;
207
+ overflow: hidden;
208
+ border-radius: 999px;
209
+ background: var(--ts-avatar-bg, var(--muted, rgba(255, 255, 255, 0.08)));
210
+ color: var(--ts-avatar-fg, var(--muted-foreground, var(--text, #e2e8f0)));
211
+ }
212
+ .size-sm {
213
+ width: 1.75rem;
214
+ height: 1.75rem;
215
+ }
216
+ .size-md {
217
+ width: 2rem;
218
+ height: 2rem;
219
+ }
220
+ .size-lg {
221
+ width: 2.25rem;
222
+ height: 2.25rem;
223
+ }
224
+ .image {
225
+ width: 100%;
226
+ height: 100%;
227
+ object-fit: cover;
228
+ }
229
+ .fallback {
230
+ display: flex;
231
+ width: 100%;
232
+ height: 100%;
233
+ align-items: center;
234
+ justify-content: center;
235
+ border-radius: inherit;
236
+ background: var(--ts-avatar-fallback-bg, var(--muted, rgba(255, 255, 255, 0.08)));
237
+ color: var(--ts-avatar-fallback-fg, var(--muted-foreground, var(--text, #e2e8f0)));
238
+ font-size: 0.85rem;
239
+ font-weight: 700;
240
+ line-height: 1;
241
+ text-transform: uppercase;
71
242
  }
72
243
 
73
244
  /* src/components/card/card.module.css */
@@ -110,8 +281,8 @@
110
281
  border-color: var(--ts-card-hover-border, rgba(34, 211, 238, 0.4));
111
282
  }
112
283
  .interactive:focus-within {
113
- outline: 2px solid var(--ts-card-hover-border, rgba(34, 211, 238, 0.45));
114
- outline-offset: 2px;
284
+ outline: var(--focus-ring);
285
+ outline-offset: var(--focus-ring-offset);
115
286
  }
116
287
  .padding-none {
117
288
  --ts-card-padding: 0;
@@ -200,7 +371,7 @@
200
371
  z-index: 100;
201
372
  }
202
373
  .modal {
203
- background: #0f172a;
374
+ background: var(--background, #0f172a);
204
375
  border: 1px solid var(--border, #1f2937);
205
376
  border-radius: 14px;
206
377
  padding: 24px;
@@ -219,6 +390,9 @@
219
390
  .size-lg {
220
391
  width: min(640px, 100%);
221
392
  }
393
+ .size-xl {
394
+ width: min(900px, 100%);
395
+ }
222
396
  .header {
223
397
  display: flex;
224
398
  align-items: flex-start;
@@ -261,6 +435,10 @@
261
435
  background: rgba(255, 255, 255, 0.07);
262
436
  color: var(--text, #e2e8f0);
263
437
  }
438
+ .closeButton:focus-visible {
439
+ outline: var(--focus-ring);
440
+ outline-offset: var(--focus-ring-offset);
441
+ }
264
442
  .body {
265
443
  display: flex;
266
444
  flex-direction: column;
@@ -272,6 +450,38 @@
272
450
  margin-top: 20px;
273
451
  }
274
452
 
453
+ /* src/components/alert/alert.module.css */
454
+ .alert {
455
+ display: flex;
456
+ align-items: flex-start;
457
+ gap: 0.5rem;
458
+ border-radius: 0.375rem;
459
+ border: 1px solid;
460
+ padding: 0.625rem 0.875rem;
461
+ font-size: 0.875rem;
462
+ line-height: 1.5;
463
+ }
464
+ .success {
465
+ border-color: color-mix(in srgb, var(--success, hsl(142 71% 45%)) 35%, transparent);
466
+ background: color-mix(in srgb, var(--success, hsl(142 71% 45%)) 10%, transparent);
467
+ color: color-mix(in srgb, var(--success, hsl(142 71% 45%)) 90%, var(--foreground, #e2e8f0));
468
+ }
469
+ .error {
470
+ border-color: color-mix(in srgb, var(--destructive, #f87171) 35%, transparent);
471
+ background: color-mix(in srgb, var(--destructive, #f87171) 10%, transparent);
472
+ color: color-mix(in srgb, var(--destructive, #f87171) 90%, var(--foreground, #e2e8f0));
473
+ }
474
+ .warning {
475
+ border-color: color-mix(in srgb, var(--warning, hsl(38 92% 50%)) 35%, transparent);
476
+ background: color-mix(in srgb, var(--warning, hsl(38 92% 50%)) 10%, transparent);
477
+ color: color-mix(in srgb, var(--warning, hsl(38 92% 50%)) 90%, var(--foreground, #e2e8f0));
478
+ }
479
+ .info {
480
+ border-color: color-mix(in srgb, var(--primary, #22d3ee) 35%, transparent);
481
+ background: color-mix(in srgb, var(--primary, #22d3ee) 10%, transparent);
482
+ color: color-mix(in srgb, var(--primary, #22d3ee) 90%, var(--foreground, #e2e8f0));
483
+ }
484
+
275
485
  /* src/components/toast/toast.module.css */
276
486
  .stack {
277
487
  position: fixed;
@@ -408,6 +618,61 @@
408
618
  }
409
619
  }
410
620
 
621
+ /* src/components/input/input.module.css */
622
+ .input {
623
+ display: flex;
624
+ width: 100%;
625
+ min-height: 2.25rem;
626
+ border-radius: 0.5rem;
627
+ border: 1px solid var(--ts-input-border, var(--input, var(--border, #1f2937)));
628
+ background: var(--ts-input-bg, var(--background, #fff));
629
+ color: var(--ts-input-fg, var(--foreground, var(--text, #e2e8f0)));
630
+ padding: 0.25rem 0.75rem;
631
+ font-size: 0.875rem;
632
+ line-height: 1.25rem;
633
+ box-shadow: var(--ts-input-shadow, 0 1px 2px rgba(0, 0, 0, 0.04));
634
+ transition: border-color 0.15s ease, background 0.15s ease;
635
+ }
636
+ .input::placeholder {
637
+ color: var(--ts-input-placeholder, var(--muted-foreground, var(--muted, #94a3b8)));
638
+ }
639
+ .input:focus-visible {
640
+ outline: var(--focus-ring);
641
+ outline-offset: var(--focus-ring-offset);
642
+ }
643
+ .input:disabled {
644
+ cursor: not-allowed;
645
+ opacity: 0.5;
646
+ }
647
+
648
+ /* src/components/label/label.module.css */
649
+ .label {
650
+ font-size: 0.875rem;
651
+ font-weight: 500;
652
+ line-height: 1.2;
653
+ color: var(--ts-label-fg, inherit);
654
+ }
655
+
656
+ /* src/components/checkbox/checkbox.module.css */
657
+ .checkbox {
658
+ width: 1rem;
659
+ height: 1rem;
660
+ margin: 0;
661
+ border-radius: 0.25rem;
662
+ border: 1px solid var(--ts-checkbox-border, var(--primary, var(--border, #1f2937)));
663
+ background: var(--ts-checkbox-bg, var(--background, #fff));
664
+ accent-color: var(--ts-checkbox-accent, var(--primary, #0f172a));
665
+ cursor: pointer;
666
+ }
667
+ .checkbox:focus-visible {
668
+ outline: var(--focus-ring);
669
+ outline-offset: var(--focus-ring-offset);
670
+ }
671
+ .checkbox:disabled {
672
+ cursor: not-allowed;
673
+ opacity: 0.5;
674
+ }
675
+
411
676
  /* src/components/dropdown/dropdown.module.css */
412
677
  .wrapper {
413
678
  position: relative;
@@ -433,6 +698,10 @@
433
698
  .trigger:hover {
434
699
  border-color: var(--ts-dropdown-accent, var(--accent, #22d3ee));
435
700
  }
701
+ .trigger:focus-visible {
702
+ outline: var(--focus-ring);
703
+ outline-offset: var(--focus-ring-offset);
704
+ }
436
705
  .trigger-active {
437
706
  border-color: var(--ts-dropdown-accent, var(--accent, #22d3ee));
438
707
  color: var(--ts-dropdown-accent, var(--accent, #22d3ee));
@@ -492,65 +761,250 @@
492
761
  background: rgba(255, 255, 255, 0.05);
493
762
  color: var(--ts-dropdown-text, var(--text, #e2e8f0));
494
763
  }
764
+ .option:focus-visible {
765
+ outline: var(--focus-ring);
766
+ outline-offset: var(--focus-ring-offset);
767
+ }
495
768
  .option-selected {
496
769
  color: var(--ts-dropdown-accent, var(--accent, #22d3ee));
497
770
  background: rgba(34, 211, 238, 0.08);
498
771
  }
499
772
 
773
+ /* src/components/dropdown-menu/dropdown-menu.module.css */
774
+ .content {
775
+ z-index: 50;
776
+ min-width: 8rem;
777
+ max-height: var(--radix-dropdown-menu-content-available-height);
778
+ overflow-x: hidden;
779
+ overflow-y: auto;
780
+ border: 1px solid var(--ts-menu-border, var(--border, #1f2937));
781
+ border-radius: 0.5rem;
782
+ background: var(--ts-menu-bg, var(--popover, var(--panel, #111827)));
783
+ color: var(--ts-menu-fg, var(--popover-foreground, var(--text, #e2e8f0)));
784
+ padding: 0.25rem;
785
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.18);
786
+ transform-origin: var(--radix-dropdown-menu-content-transform-origin);
787
+ animation: menuFadeIn 140ms ease;
788
+ }
789
+ .item {
790
+ position: relative;
791
+ display: flex;
792
+ width: 100%;
793
+ cursor: default;
794
+ user-select: none;
795
+ align-items: center;
796
+ gap: 0.5rem;
797
+ border-radius: 0.375rem;
798
+ padding: 0.375rem 0.5rem;
799
+ font-size: 0.875rem;
800
+ line-height: 1.25rem;
801
+ outline: none;
802
+ }
803
+ .item[data-inset=true] {
804
+ padding-left: 2rem;
805
+ }
806
+ .item[data-highlighted] {
807
+ background: var(--ts-menu-hover-bg, var(--accent, rgba(255, 255, 255, 0.06)));
808
+ color: var(--ts-menu-hover-fg, var(--accent-foreground, var(--foreground, #e2e8f0)));
809
+ }
810
+ .item[data-disabled] {
811
+ pointer-events: none;
812
+ opacity: 0.5;
813
+ }
814
+ .destructive {
815
+ color: var(--ts-menu-danger, var(--destructive, #f87171));
816
+ }
817
+ .destructive[data-highlighted] {
818
+ background: color-mix(in srgb, var(--destructive, #f87171) 15%, transparent);
819
+ color: var(--ts-menu-danger-fg, var(--destructive, #f87171));
820
+ }
821
+ .insetItem {
822
+ padding-left: 2rem;
823
+ }
824
+ .indicator {
825
+ position: absolute;
826
+ left: 0.5rem;
827
+ display: inline-flex;
828
+ width: 1rem;
829
+ height: 1rem;
830
+ align-items: center;
831
+ justify-content: center;
832
+ color: currentColor;
833
+ }
834
+ .indicatorIcon {
835
+ display: block;
836
+ }
837
+ .radioDot {
838
+ display: block;
839
+ width: 0.5rem;
840
+ height: 0.5rem;
841
+ border-radius: 999px;
842
+ background: currentColor;
843
+ }
844
+ .label {
845
+ padding: 0.375rem 0.5rem;
846
+ font-size: 0.875rem;
847
+ font-weight: 600;
848
+ line-height: 1.25rem;
849
+ }
850
+ .label[data-inset=true] {
851
+ padding-left: 2rem;
852
+ }
853
+ .separator {
854
+ height: 1px;
855
+ margin: 0.25rem -0.25rem;
856
+ background: var(--ts-menu-separator, var(--border, rgba(255, 255, 255, 0.12)));
857
+ }
858
+ .chevron {
859
+ margin-left: auto;
860
+ flex-shrink: 0;
861
+ }
862
+ @keyframes menuFadeIn {
863
+ from {
864
+ opacity: 0;
865
+ transform: translateY(-4px) scale(0.98);
866
+ }
867
+ to {
868
+ opacity: 1;
869
+ transform: translateY(0) scale(1);
870
+ }
871
+ }
872
+
873
+ /* src/components/theme-toggle-button/theme-toggle-button.module.css */
874
+ .withLabel {
875
+ padding-left: 12px;
876
+ padding-right: 12px;
877
+ }
878
+
879
+ /* src/components/top-bar/top-bar.module.css */
880
+ .topBar {
881
+ position: sticky;
882
+ top: 0;
883
+ z-index: 30;
884
+ border-bottom: 1px solid var(--ts-topbar-border, var(--border, rgba(15, 23, 42, 0.1)));
885
+ background: var(--ts-topbar-bg, color-mix(in srgb, var(--background, #fff) 92%, transparent));
886
+ box-shadow: var(--ts-topbar-shadow, 0 1px 2px rgba(15, 23, 42, 0.06));
887
+ backdrop-filter: blur(12px);
888
+ }
889
+ .topBarStatic {
890
+ position: relative;
891
+ }
892
+ .topBarInner {
893
+ display: flex;
894
+ align-items: center;
895
+ justify-content: space-between;
896
+ gap: 1rem;
897
+ min-height: 4.25rem;
898
+ padding: env(safe-area-inset-top) 1rem 0 1rem;
899
+ }
900
+ .topBarStart {
901
+ display: flex;
902
+ align-items: center;
903
+ gap: 0.875rem;
904
+ min-width: 0;
905
+ flex: 1 1 auto;
906
+ }
907
+ .topBarBrand {
908
+ display: inline-flex;
909
+ align-items: center;
910
+ gap: 0.625rem;
911
+ min-width: 0;
912
+ color: var(--ts-topbar-brand-fg, var(--foreground, var(--text, #0f172a)));
913
+ text-decoration: none;
914
+ }
915
+ .topBarBrandContent {
916
+ min-width: 0;
917
+ overflow: hidden;
918
+ text-overflow: ellipsis;
919
+ white-space: nowrap;
920
+ }
921
+ .topBarCenter {
922
+ display: flex;
923
+ align-items: center;
924
+ justify-content: center;
925
+ flex: 0 1 auto;
926
+ min-width: 0;
927
+ }
928
+ .topBarCenterGroup {
929
+ display: inline-flex;
930
+ align-items: center;
931
+ gap: 1rem;
932
+ min-width: 0;
933
+ }
934
+ .topBarActions {
935
+ display: flex;
936
+ align-items: center;
937
+ justify-content: flex-end;
938
+ gap: 0.75rem;
939
+ min-width: 0;
940
+ flex: 1 1 auto;
941
+ }
942
+ @media (max-width: 768px) {
943
+ .topBarInner {
944
+ min-height: 4rem;
945
+ gap: 0.75rem;
946
+ padding-left: max(0.75rem, env(safe-area-inset-left));
947
+ padding-right: max(0.75rem, env(safe-area-inset-right));
948
+ }
949
+ .topBarStart {
950
+ gap: 0.75rem;
951
+ }
952
+ .topBarActions {
953
+ gap: 0.5rem;
954
+ }
955
+ }
956
+
500
957
  /* src/components/app-shell/app-shell.module.css */
501
- .shell {
958
+ .appShell {
502
959
  display: grid;
503
960
  grid-template-rows: calc(var(--app-shell-topbar-height, 64px) + env(safe-area-inset-top)) 1fr;
504
961
  grid-template-columns: var(--app-shell-sidebar-width, 240px) 1fr;
505
962
  min-height: 100vh;
506
963
  min-height: 100dvh;
964
+ }
965
+ .appShellAnimated {
507
966
  transition: grid-template-columns 200ms ease;
508
967
  }
509
- .shell.sidebarOpen {
968
+ .appShell.appShellOpen {
510
969
  grid-template-columns: var(--app-shell-sidebar-width, 240px) 1fr;
511
970
  }
512
- .shell.sidebarCollapsed {
971
+ .appShell.appShellCollapsed {
513
972
  grid-template-columns: 0 1fr;
514
973
  }
515
- .topbar {
974
+ .appShellTopbar {
975
+ --ts-topbar-bg: var(--surface-topbar, var(--surface-elevated, color-mix(in srgb, var(--background, #fff) 90%, transparent)));
976
+ --ts-topbar-border: var(--border);
977
+ --ts-topbar-brand-fg: var(--foreground, var(--text, #0f172a));
516
978
  grid-column: 1 / -1;
517
- display: flex;
518
- align-items: center;
519
- justify-content: space-between;
520
- height: calc(var(--app-shell-topbar-height, 64px) + env(safe-area-inset-top));
521
- padding: env(safe-area-inset-top) 16px 0 16px;
522
- border-bottom: 1px solid var(--border);
523
- background: rgba(17, 24, 39, 0.8);
524
- backdrop-filter: blur(8px);
525
- position: sticky;
526
- top: 0;
527
- z-index: 20;
528
- gap: 12px;
979
+ min-height: calc(var(--app-shell-topbar-height, 64px) + env(safe-area-inset-top));
980
+ padding-left: 0;
981
+ padding-right: 0;
982
+ box-shadow: none;
529
983
  }
530
- .topbarLeft {
984
+ .appShellTopbarLeft {
531
985
  display: flex;
532
986
  align-items: center;
533
987
  gap: 12px;
534
988
  flex: 1;
535
989
  min-width: 0;
536
990
  }
537
- .topbarStart {
991
+ .appShellTopbarStart {
538
992
  flex: 1;
539
993
  min-width: 0;
540
994
  display: flex;
541
995
  align-items: center;
542
996
  }
543
- .topbarRight {
997
+ .appShellTopbarRight {
544
998
  display: flex;
545
999
  align-items: center;
546
1000
  gap: 8px;
547
1001
  min-width: 0;
548
1002
  flex-shrink: 0;
549
1003
  }
550
- .topbarRight > * {
1004
+ .appShellTopbarRight > * {
551
1005
  min-width: 0;
552
1006
  }
553
- .brand {
1007
+ .appShellBrand {
554
1008
  font-size: 26px;
555
1009
  color: var(--text);
556
1010
  text-decoration: none;
@@ -561,7 +1015,7 @@
561
1015
  text-overflow: ellipsis;
562
1016
  white-space: nowrap;
563
1017
  }
564
- .hamburger {
1018
+ .appShellHamburger {
565
1019
  background: transparent;
566
1020
  border: none;
567
1021
  padding: 0;
@@ -575,49 +1029,40 @@
575
1029
  cursor: pointer;
576
1030
  transition: background 120ms ease;
577
1031
  }
578
- .hamburger:hover {
579
- background: rgba(255, 255, 255, 0.06);
1032
+ .appShellHamburger:hover {
1033
+ background: var(--accent);
580
1034
  }
581
- .hamburger:focus,
582
- .hamburger:focus-visible {
583
- outline: none;
584
- box-shadow: none;
1035
+ .appShellHamburger:focus-visible {
1036
+ outline: var(--focus-ring);
1037
+ outline-offset: var(--focus-ring-offset);
585
1038
  }
586
- .hamburger svg {
1039
+ .appShellHamburger svg {
587
1040
  width: 28px;
588
1041
  height: 28px;
589
1042
  }
590
- .sidebar {
1043
+ .appShellSidebar {
591
1044
  border-right: 1px solid var(--border);
592
- background: #152036;
1045
+ background: var(--panel, var(--card, #111827));
593
1046
  padding: 24px;
1047
+ }
1048
+ .appShellAnimated .appShellSidebar {
594
1049
  transition: transform 200ms ease, opacity 200ms ease;
595
1050
  }
596
- .shell.sidebarCollapsed .sidebar {
1051
+ .appShell.appShellCollapsed .appShellSidebar {
597
1052
  transform: translateX(-110%);
598
1053
  opacity: 0;
599
1054
  pointer-events: none;
600
1055
  }
601
- .main {
1056
+ .appShellMain {
602
1057
  overflow-y: auto;
603
- padding: 24px;
604
- padding-bottom: 96px;
605
1058
  min-height: 0;
606
- display: flex;
607
- flex-direction: column;
608
- gap: 16px;
609
- align-items: center;
610
- }
611
- .main > * {
612
- width: 100%;
613
- max-width: 1200px;
614
- min-width: 0;
1059
+ flex: 1 1 0;
615
1060
  }
616
- .backdrop {
1061
+ .appShellBackdrop {
617
1062
  display: none;
618
1063
  }
619
1064
  @media (max-width: 960px) {
620
- .backdrop {
1065
+ .appShellBackdrop {
621
1066
  display: block;
622
1067
  position: fixed;
623
1068
  inset: 0;
@@ -625,16 +1070,16 @@
625
1070
  background: rgba(0, 0, 0, 0.5);
626
1071
  z-index: 14;
627
1072
  }
628
- .shell {
1073
+ .appShell {
629
1074
  --app-shell-topbar-height: 56px;
630
1075
  grid-template-columns: 1fr;
631
1076
  grid-template-rows: calc(var(--app-shell-topbar-height, 56px) + env(safe-area-inset-top)) 1fr;
632
1077
  }
633
- .shell.sidebarOpen,
634
- .shell.sidebarCollapsed {
1078
+ .appShell.appShellOpen,
1079
+ .appShell.appShellCollapsed {
635
1080
  grid-template-columns: 1fr;
636
1081
  }
637
- .sidebar {
1082
+ .appShellSidebar {
638
1083
  display: block;
639
1084
  position: fixed;
640
1085
  top: calc(var(--app-shell-topbar-height, 56px) + env(safe-area-inset-top));
@@ -642,80 +1087,114 @@
642
1087
  bottom: 0;
643
1088
  width: var(--app-shell-sidebar-width, 240px);
644
1089
  max-width: 80vw;
645
- background: #152036;
1090
+ background: var(--panel, var(--card, #111827));
646
1091
  padding: 16px 12px;
647
1092
  transform: translateX(-105%);
648
1093
  z-index: 15;
649
1094
  box-shadow: 0 20px 40px rgba(0, 0, 0, 0.35);
650
1095
  }
651
- .sidebar.open {
1096
+ .appShellSidebar.appShellSidebarOpen {
652
1097
  transform: translateX(0);
653
1098
  }
654
- .topbar {
1099
+ .appShellTopbar {
655
1100
  padding-left: max(12px, env(safe-area-inset-left));
656
1101
  padding-right: max(12px, env(safe-area-inset-right));
657
1102
  gap: 10px;
658
1103
  }
659
- .topbarLeft {
1104
+ .appShellTopbarLeft {
660
1105
  gap: 10px;
661
1106
  flex: 1;
662
1107
  }
663
- .topbarStart {
1108
+ .appShellTopbarStart {
664
1109
  min-width: 0;
665
1110
  }
666
- .topbarRight {
1111
+ .appShellTopbarRight {
667
1112
  gap: 6px;
668
1113
  }
669
- .brand {
1114
+ .appShellBrand {
670
1115
  font-size: 24px;
671
1116
  max-width: 50vw;
672
1117
  }
673
- .hamburger {
1118
+ .appShellHamburger {
674
1119
  width: 40px;
675
1120
  height: 40px;
676
1121
  border-radius: 8px;
677
1122
  }
678
- .hamburger svg {
1123
+ .appShellHamburger svg {
679
1124
  width: 24px;
680
1125
  height: 24px;
681
1126
  }
682
- .main {
683
- padding: 16px;
684
- padding-bottom: 96px;
685
- }
686
1127
  }
687
1128
  @media (max-width: 640px) {
688
- .topbar {
1129
+ .appShellTopbar {
689
1130
  gap: 8px;
690
1131
  }
691
- .brand {
1132
+ .appShellBrand {
692
1133
  font-size: 22px;
693
1134
  max-width: 34vw;
694
1135
  }
695
- .topbarRight {
1136
+ .appShellTopbarRight {
696
1137
  max-width: 44vw;
697
1138
  }
698
- .main {
699
- padding: 12px 10px;
700
- padding-bottom: 88px;
701
- }
702
1139
  }
703
1140
  @media (max-width: 480px) {
704
- .brand {
1141
+ .appShellBrand {
705
1142
  font-size: 20px;
706
1143
  max-width: 30vw;
707
1144
  }
708
1145
  }
709
1146
 
710
1147
  /* src/components/sidebar-nav/sidebar-nav.module.css */
711
- .nav {
1148
+ .uziSidebarNav {
1149
+ --sidebar-nav-icon-size: 18px;
1150
+ --sidebar-nav-icon-size-mobile: 16px;
712
1151
  display: flex;
713
1152
  flex-direction: column;
714
- gap: 8px;
1153
+ gap: 12px;
715
1154
  align-items: stretch;
1155
+ min-height: 100%;
716
1156
  }
717
- .item {
718
- color: var(--text, #e2e8f0);
1157
+ .uziSidebarNavCollapsed {
1158
+ gap: 10px;
1159
+ }
1160
+ .uziSidebarNavHeader,
1161
+ .uziSidebarNavFooter {
1162
+ display: flex;
1163
+ flex-direction: column;
1164
+ gap: 8px;
1165
+ }
1166
+ .uziSidebarNavFooter {
1167
+ margin-top: auto;
1168
+ padding-top: 12px;
1169
+ border-top: 1px solid var(--border, #1f2937);
1170
+ }
1171
+ .uziSidebarNavSections {
1172
+ display: flex;
1173
+ flex: 1 1 auto;
1174
+ flex-direction: column;
1175
+ gap: 14px;
1176
+ }
1177
+ .uziSidebarNavSection {
1178
+ display: flex;
1179
+ flex-direction: column;
1180
+ gap: 8px;
1181
+ }
1182
+ .uziSidebarNavSectionItems {
1183
+ display: flex;
1184
+ flex-direction: column;
1185
+ gap: 8px;
1186
+ }
1187
+ .uziSidebarNavSectionLabel {
1188
+ padding: 0 10px;
1189
+ font-size: 11px;
1190
+ font-weight: 700;
1191
+ letter-spacing: 0.08em;
1192
+ text-transform: uppercase;
1193
+ color: var(--muted-foreground, #94a3b8);
1194
+ opacity: 0.75;
1195
+ }
1196
+ .uziSidebarNavItem {
1197
+ color: var(--foreground, #e2e8f0);
719
1198
  background: transparent;
720
1199
  border: none;
721
1200
  box-shadow: none;
@@ -723,54 +1202,94 @@
723
1202
  border-radius: 10px;
724
1203
  text-decoration: none;
725
1204
  font-size: 14px;
726
- display: flex;
1205
+ display: grid;
1206
+ grid-template-columns: var(--sidebar-nav-icon-size) minmax(0, 1fr);
727
1207
  align-items: center;
728
- gap: 6px;
1208
+ column-gap: 10px;
729
1209
  width: 100%;
730
- justify-content: flex-start;
731
1210
  text-align: left;
732
1211
  box-sizing: border-box;
733
- white-space: nowrap;
734
1212
  line-height: 1.2;
735
1213
  transition: background 120ms ease, color 120ms ease;
736
1214
  }
737
- .item:focus,
738
- .item:focus-visible {
739
- outline: none;
740
- box-shadow: none;
1215
+ button.uziSidebarNavItem {
1216
+ font-family: inherit;
1217
+ cursor: pointer;
741
1218
  }
742
- .item:hover {
743
- background: rgba(29, 43, 70, 0.55);
1219
+ .uziSidebarNavItem:focus-visible {
1220
+ outline: var(--focus-ring);
1221
+ outline-offset: var(--focus-ring-offset);
744
1222
  }
745
- .item.active {
746
- background: rgba(29, 43, 70, 0.85);
747
- color: var(--text, #e2e8f0);
1223
+ .uziSidebarNavItem:hover {
1224
+ background: color-mix(in srgb, var(--primary, #22d3ee) 10%, transparent);
1225
+ }
1226
+ .uziSidebarNavItem.uziSidebarNavItemActive {
1227
+ background: color-mix(in srgb, var(--primary, #22d3ee) 18%, transparent);
1228
+ color: var(--foreground, #e2e8f0);
748
1229
  font-weight: 700;
749
1230
  }
750
- .icon {
751
- width: 18px;
752
- height: 18px;
753
- color: var(--muted, #94a3b8);
1231
+ .uziSidebarNavItemCollapsed {
1232
+ grid-template-columns: 1fr;
1233
+ justify-items: center;
1234
+ padding-right: 10px;
1235
+ padding-left: 10px;
1236
+ }
1237
+ .uziSidebarNavItemDisabled {
1238
+ opacity: 0.5;
1239
+ cursor: not-allowed;
1240
+ }
1241
+ .uziSidebarNavIcon {
1242
+ width: var(--sidebar-nav-icon-size);
1243
+ height: var(--sidebar-nav-icon-size);
1244
+ min-width: var(--sidebar-nav-icon-size);
1245
+ color: var(--muted-foreground, #94a3b8);
754
1246
  display: inline-flex;
755
1247
  align-items: center;
756
1248
  justify-content: center;
757
- flex: 0 0 18px;
758
1249
  vertical-align: middle;
759
1250
  }
760
- .icon svg {
761
- width: 18px;
762
- height: 18px;
1251
+ .uziSidebarNavIcon > * {
1252
+ width: 100% !important;
1253
+ height: 100% !important;
1254
+ max-width: 100%;
1255
+ max-height: 100%;
1256
+ }
1257
+ .uziSidebarNavIcon :where(svg) {
1258
+ width: 100%;
1259
+ height: 100%;
763
1260
  display: block;
764
1261
  stroke: currentColor;
765
1262
  }
766
- .item.active .icon {
767
- color: var(--accent, #22d3ee);
1263
+ .uziSidebarNavItem.uziSidebarNavItemActive .uziSidebarNavIcon {
1264
+ color: var(--primary, #22d3ee);
768
1265
  }
769
- .label {
1266
+ .uziSidebarNavItemBody {
1267
+ display: flex;
1268
+ min-width: 0;
1269
+ flex: 1 1 auto;
1270
+ flex-direction: column;
1271
+ gap: 3px;
1272
+ overflow: hidden;
1273
+ }
1274
+ .uziSidebarNavLabelRow {
1275
+ display: flex;
1276
+ min-width: 0;
1277
+ align-items: center;
1278
+ gap: 8px;
1279
+ }
1280
+ .uziSidebarNavLabel {
770
1281
  flex: 1;
771
1282
  min-width: 0;
1283
+ overflow: hidden;
1284
+ text-overflow: ellipsis;
1285
+ white-space: nowrap;
772
1286
  }
773
- .badge {
1287
+ .uziSidebarNavDescription {
1288
+ color: var(--muted-foreground, #94a3b8);
1289
+ font-size: 12px;
1290
+ line-height: 1.35;
1291
+ }
1292
+ .uziSidebarNavBadge {
774
1293
  display: inline-flex;
775
1294
  align-items: center;
776
1295
  justify-content: center;
@@ -779,33 +1298,43 @@
779
1298
  border-radius: 999px;
780
1299
  border: 1px solid var(--border, #1f2937);
781
1300
  background: rgba(255, 255, 255, 0.04);
782
- color: var(--muted, #94a3b8);
1301
+ color: var(--muted-foreground, #94a3b8);
783
1302
  font-size: 11px;
784
1303
  letter-spacing: 0.04em;
785
1304
  text-transform: uppercase;
786
1305
  }
787
1306
  @media (max-width: 960px) {
788
- .nav {
1307
+ .uziSidebarNav {
1308
+ gap: 10px;
1309
+ }
1310
+ .uziSidebarNavSections {
1311
+ gap: 12px;
1312
+ }
1313
+ .uziSidebarNavSectionItems {
789
1314
  gap: 6px;
790
1315
  }
791
- .item {
1316
+ .uziSidebarNavItem {
792
1317
  padding: 9px 10px 9px 8px;
793
1318
  border-radius: 9px;
794
1319
  font-size: 14px;
795
- gap: 6px;
1320
+ grid-template-columns: var(--sidebar-nav-icon-size-mobile) minmax(0, 1fr);
1321
+ column-gap: 8px;
1322
+ }
1323
+ .uziSidebarNavIcon {
1324
+ width: var(--sidebar-nav-icon-size-mobile);
1325
+ height: var(--sidebar-nav-icon-size-mobile);
1326
+ min-width: var(--sidebar-nav-icon-size-mobile);
796
1327
  }
797
- .icon {
798
- width: 16px;
799
- height: 16px;
800
- flex: 0 0 16px;
1328
+ .uziSidebarNavIcon :where(svg) {
1329
+ width: var(--sidebar-nav-icon-size-mobile);
1330
+ height: var(--sidebar-nav-icon-size-mobile);
801
1331
  }
802
- .icon svg {
803
- width: 16px;
804
- height: 16px;
1332
+ .uziSidebarNavDescription {
1333
+ font-size: 11px;
805
1334
  }
806
1335
  }
807
1336
  @media (max-width: 480px) {
808
- .item {
1337
+ .uziSidebarNavItem {
809
1338
  padding: 8px 9px 8px 7px;
810
1339
  font-size: 13px;
811
1340
  }