@softium/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,764 @@
1
+ /**
2
+ * @softium/ui — single-import stylesheet.
3
+ *
4
+ * import '@softium/ui/styles.css';
5
+ *
6
+ * Shared tokens/theme (@softium/styles) + the ui component styles.
7
+ */
8
+
9
+ /**
10
+ * softium-ui shared styles — single import.
11
+ *
12
+ * import '@softium/styles';
13
+ *
14
+ * Design tokens + dark theme + a minimal opt-in base layer.
15
+ */
16
+
17
+ /**
18
+ * softium-ui — shared design tokens
19
+ *
20
+ * Theme via CSS custom properties only (no Tailwind hard-dependency, AG-Grid style).
21
+ * Every visual value across the libraries resolves to one of these `--sft-*` vars,
22
+ * so a host app re-skins everything by overriding tokens — nothing else.
23
+ *
24
+ * Naming follows an Apple-adjacent / Phosphor convention: semantic over literal.
25
+ * Package-specific tokens (e.g. `--sft-table-*`) live in their own package.
26
+ */
27
+
28
+ :root {
29
+ /* ── color: neutral ramp ─────────────────────────────── */
30
+ --sft-color-bg: #ffffff;
31
+ --sft-color-bg-subtle: #f7f8fa;
32
+ --sft-color-bg-hover: #f0f2f5;
33
+ --sft-color-bg-selected: #eaf2ff;
34
+ --sft-color-surface: #ffffff;
35
+ --sft-color-border: #e3e6ea;
36
+ --sft-color-border-strong: #c9ced6;
37
+
38
+ /* ── color: text ─────────────────────────────────────── */
39
+ --sft-color-text: #1d2127;
40
+ --sft-color-text-secondary: #5b6470;
41
+ --sft-color-text-muted: #8a93a0;
42
+ --sft-color-text-on-accent: #ffffff;
43
+
44
+ /* ── color: accent / state ───────────────────────────── */
45
+ --sft-color-accent: #2f6bff;
46
+ --sft-color-accent-hover: #1f57e6;
47
+ --sft-color-accent-subtle: #eaf2ff;
48
+ --sft-color-danger: #e5484d;
49
+ --sft-color-success: #30a46c;
50
+ --sft-color-warning: #f2a31b;
51
+
52
+ /* ── typography ──────────────────────────────────────── */
53
+ --sft-font-family: -apple-system, BlinkMacSystemFont, "Pretendard", "Segoe UI", Roboto,
54
+ "Helvetica Neue", Arial, "Apple SD Gothic Neo", "Malgun Gothic", sans-serif;
55
+ --sft-font-family-mono: "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace;
56
+ --sft-font-size-xs: 11px;
57
+ --sft-font-size-sm: 12px;
58
+ --sft-font-size-md: 13px;
59
+ --sft-font-size-lg: 15px;
60
+ --sft-font-size-xl: 20px;
61
+ --sft-font-weight-regular: 400;
62
+ --sft-font-weight-medium: 500;
63
+ --sft-font-weight-bold: 600;
64
+ --sft-line-height: 1.45;
65
+
66
+ /* ── spacing (4px base) ──────────────────────────────── */
67
+ --sft-space-1: 4px;
68
+ --sft-space-2: 8px;
69
+ --sft-space-3: 12px;
70
+ --sft-space-4: 16px;
71
+ --sft-space-5: 24px;
72
+ --sft-space-6: 32px;
73
+ --sft-space-7: 48px;
74
+ --sft-space-8: 64px;
75
+
76
+ /* ── radius ──────────────────────────────────────────── */
77
+ --sft-radius-sm: 4px;
78
+ --sft-radius-md: 8px;
79
+ --sft-radius-lg: 12px;
80
+ --sft-radius-full: 9999px;
81
+
82
+ /* ── elevation ───────────────────────────────────────── */
83
+ --sft-shadow-sm: 0 1px 2px rgba(16, 24, 40, 0.06);
84
+ --sft-shadow-md: 0 4px 12px rgba(16, 24, 40, 0.1);
85
+ --sft-shadow-overlay: 0 8px 28px rgba(16, 24, 40, 0.16);
86
+
87
+ /* ── motion ──────────────────────────────────────────── */
88
+ --sft-duration-fast: 120ms;
89
+ --sft-duration-base: 200ms;
90
+ --sft-ease: cubic-bezier(0.2, 0, 0, 1);
91
+
92
+ /* ── shared z-index scale ────────────────────────────── */
93
+ --sft-z-header: 2;
94
+ --sft-z-pinned: 3;
95
+ --sft-z-overlay: 10;
96
+ --sft-z-modal: 100;
97
+ }
98
+
99
+ /**
100
+ * softium-ui — dark theme overrides (shared)
101
+ *
102
+ * Two activation paths:
103
+ * 1. Explicit: <html data-theme="dark"> (host controls the toggle)
104
+ * 2. Automatic: prefers-color-scheme, only when the host hasn't forced a theme
105
+ *
106
+ * Dark mode re-points the SAME `--sft-*` tokens — components never branch on theme.
107
+ */
108
+
109
+ [data-theme="dark"] {
110
+ --sft-color-bg: #16181d;
111
+ --sft-color-bg-subtle: #1c1f26;
112
+ --sft-color-bg-hover: #232730;
113
+ --sft-color-bg-selected: #1e2c4a;
114
+ --sft-color-surface: #1a1d23;
115
+ --sft-color-border: #2a2f38;
116
+ --sft-color-border-strong: #3a414d;
117
+
118
+ --sft-color-text: #eceef2;
119
+ --sft-color-text-secondary: #aab2bf;
120
+ --sft-color-text-muted: #6f7884;
121
+ --sft-color-text-on-accent: #ffffff;
122
+
123
+ --sft-color-accent: #5b8bff;
124
+ --sft-color-accent-hover: #6f9bff;
125
+ --sft-color-accent-subtle: #1e2c4a;
126
+ --sft-color-danger: #ff6166;
127
+ --sft-color-success: #46c98a;
128
+ --sft-color-warning: #f5b542;
129
+
130
+ --sft-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
131
+ --sft-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.45);
132
+ --sft-shadow-overlay: 0 8px 28px rgba(0, 0, 0, 0.55);
133
+ }
134
+
135
+ @media (prefers-color-scheme: dark) {
136
+ :root:not([data-theme="light"]):not([data-theme="dark"]) {
137
+ --sft-color-bg: #16181d;
138
+ --sft-color-bg-subtle: #1c1f26;
139
+ --sft-color-bg-hover: #232730;
140
+ --sft-color-bg-selected: #1e2c4a;
141
+ --sft-color-surface: #1a1d23;
142
+ --sft-color-border: #2a2f38;
143
+ --sft-color-border-strong: #3a414d;
144
+
145
+ --sft-color-text: #eceef2;
146
+ --sft-color-text-secondary: #aab2bf;
147
+ --sft-color-text-muted: #6f7884;
148
+
149
+ --sft-color-accent: #5b8bff;
150
+ --sft-color-accent-hover: #6f9bff;
151
+ --sft-color-accent-subtle: #1e2c4a;
152
+ --sft-color-danger: #ff6166;
153
+ --sft-color-success: #46c98a;
154
+ --sft-color-warning: #f5b542;
155
+ }
156
+ }
157
+
158
+ /**
159
+ * softium-ui — minimal base layer (opt-in).
160
+ *
161
+ * Only sets sane defaults scoped to the app shell, not a global reset, so dropping
162
+ * the library into an existing app doesn't fight the host's own resets.
163
+ */
164
+
165
+ .sft-app {
166
+ color: var(--sft-color-text);
167
+ background: var(--sft-color-bg);
168
+ font-family: var(--sft-font-family);
169
+ font-size: var(--sft-font-size-md);
170
+ line-height: var(--sft-line-height);
171
+ -webkit-font-smoothing: antialiased;
172
+ transition: background var(--sft-duration-base) var(--sft-ease), color var(--sft-duration-base)
173
+ var(--sft-ease);
174
+ }
175
+
176
+ .sft-app *,
177
+ .sft-app *::before,
178
+ .sft-app *::after {
179
+ box-sizing: border-box;
180
+ }
181
+
182
+ /**
183
+ * @softium/ui — component styles. Token-driven (see @softium/styles), so the whole
184
+ * shell re-skins on theme change with zero component churn.
185
+ */
186
+
187
+ :root {
188
+ --sft-sidebar-width: 224px;
189
+ --sft-sidebar-collapsed-width: 64px;
190
+ --sft-header-height: 56px;
191
+ }
192
+
193
+ /* ── Button ─────────────────────────────────────────────── */
194
+
195
+ .sft-button {
196
+ display: inline-flex;
197
+ align-items: center;
198
+ justify-content: center;
199
+ gap: var(--sft-space-2);
200
+ font: inherit;
201
+ font-weight: var(--sft-font-weight-medium);
202
+ line-height: 1;
203
+ border: 1px solid transparent;
204
+ border-radius: var(--sft-radius-md);
205
+ cursor: pointer;
206
+ white-space: nowrap;
207
+ transition: background var(--sft-duration-fast) var(--sft-ease), border-color
208
+ var(--sft-duration-fast) var(--sft-ease), color var(--sft-duration-fast) var(--sft-ease);
209
+ }
210
+
211
+ .sft-button:disabled {
212
+ opacity: 0.45;
213
+ cursor: default;
214
+ }
215
+
216
+ .sft-button--sm {
217
+ height: 30px;
218
+ padding: 0 var(--sft-space-3);
219
+ font-size: var(--sft-font-size-sm);
220
+ }
221
+
222
+ .sft-button--md {
223
+ height: 38px;
224
+ padding: 0 var(--sft-space-4);
225
+ font-size: var(--sft-font-size-md);
226
+ }
227
+
228
+ .sft-button--block {
229
+ width: 100%;
230
+ }
231
+
232
+ .sft-button--primary {
233
+ background: var(--sft-color-accent);
234
+ color: var(--sft-color-text-on-accent);
235
+ }
236
+
237
+ .sft-button--primary:not(:disabled):hover {
238
+ background: var(--sft-color-accent-hover);
239
+ }
240
+
241
+ .sft-button--secondary {
242
+ background: var(--sft-color-surface);
243
+ border-color: var(--sft-color-border);
244
+ color: var(--sft-color-text);
245
+ }
246
+
247
+ .sft-button--secondary:not(:disabled):hover {
248
+ background: var(--sft-color-bg-hover);
249
+ }
250
+
251
+ .sft-button--ghost {
252
+ background: transparent;
253
+ color: var(--sft-color-text);
254
+ }
255
+
256
+ .sft-button--ghost:not(:disabled):hover {
257
+ background: var(--sft-color-bg-hover);
258
+ }
259
+
260
+ .sft-button--danger {
261
+ background: var(--sft-color-danger);
262
+ color: #fff;
263
+ }
264
+
265
+ .sft-button--danger:not(:disabled):hover {
266
+ filter: brightness(0.94);
267
+ }
268
+
269
+ .sft-button__icon {
270
+ display: inline-flex;
271
+ align-items: center;
272
+ }
273
+
274
+ /* ── Switch ─────────────────────────────────────────────── */
275
+
276
+ .sft-switch {
277
+ display: inline-flex;
278
+ align-items: center;
279
+ gap: var(--sft-space-2);
280
+ cursor: pointer;
281
+ user-select: none;
282
+ }
283
+
284
+ .sft-switch--disabled {
285
+ opacity: 0.5;
286
+ cursor: default;
287
+ }
288
+
289
+ .sft-switch__input {
290
+ position: absolute;
291
+ width: 1px;
292
+ height: 1px;
293
+ opacity: 0;
294
+ pointer-events: none;
295
+ }
296
+
297
+ .sft-switch__track {
298
+ position: relative;
299
+ flex: none;
300
+ width: 34px;
301
+ height: 20px;
302
+ border-radius: var(--sft-radius-full);
303
+ background: var(--sft-color-border-strong);
304
+ transition: background var(--sft-duration-fast) var(--sft-ease);
305
+ }
306
+
307
+ .sft-switch__thumb {
308
+ position: absolute;
309
+ top: 2px;
310
+ left: 2px;
311
+ width: 16px;
312
+ height: 16px;
313
+ border-radius: 50%;
314
+ background: #fff;
315
+ box-shadow: var(--sft-shadow-sm);
316
+ transition: transform var(--sft-duration-fast) var(--sft-ease);
317
+ }
318
+
319
+ .sft-switch__input:checked + .sft-switch__track {
320
+ background: var(--sft-color-accent);
321
+ }
322
+
323
+ .sft-switch__input:checked + .sft-switch__track .sft-switch__thumb {
324
+ transform: translateX(14px);
325
+ }
326
+
327
+ .sft-switch__input:focus-visible + .sft-switch__track {
328
+ outline: 2px solid var(--sft-color-accent);
329
+ outline-offset: 2px;
330
+ }
331
+
332
+ .sft-switch__label {
333
+ font-size: var(--sft-font-size-sm);
334
+ color: var(--sft-color-text);
335
+ }
336
+
337
+ /* ── AppShell (fixed sidebar + scrolling body) ──────────── */
338
+
339
+ .sft-shell {
340
+ min-height: 100vh;
341
+ background: var(--sft-color-bg);
342
+ }
343
+
344
+ .sft-shell__sidebar {
345
+ position: fixed;
346
+ top: 0;
347
+ left: 0;
348
+ height: 100vh;
349
+ width: var(--sft-sidebar-width);
350
+ overflow-x: hidden;
351
+ overflow-y: auto;
352
+ border-right: 1px solid var(--sft-color-border);
353
+ background: transparent;
354
+ z-index: var(--sft-z-header);
355
+ transition: width var(--sft-duration-base) var(--sft-ease), transform var(--sft-duration-base)
356
+ var(--sft-ease);
357
+ }
358
+
359
+ .sft-shell[data-collapsed] .sft-shell__sidebar {
360
+ width: var(--sft-sidebar-collapsed-width);
361
+ }
362
+
363
+ .sft-shell__main {
364
+ display: flex;
365
+ flex-direction: column;
366
+ min-width: 0;
367
+ height: 100vh;
368
+ overflow-y: auto;
369
+ overscroll-behavior-y: none;
370
+ margin-left: var(--sft-sidebar-width);
371
+ transition: margin-left var(--sft-duration-base) var(--sft-ease);
372
+ }
373
+
374
+ .sft-shell[data-collapsed] .sft-shell__main {
375
+ margin-left: var(--sft-sidebar-collapsed-width);
376
+ }
377
+
378
+ .sft-shell__header {
379
+ position: sticky;
380
+ top: 0;
381
+ z-index: var(--sft-z-header);
382
+ flex: none;
383
+ }
384
+
385
+ .sft-shell__content {
386
+ flex: 1;
387
+ min-height: 0;
388
+ padding: var(--sft-space-6);
389
+ }
390
+
391
+ .sft-shell__overlay {
392
+ display: none;
393
+ }
394
+
395
+ /* ── Header ─────────────────────────────────────────────── */
396
+
397
+ .sft-header {
398
+ display: flex;
399
+ align-items: center;
400
+ gap: var(--sft-space-4);
401
+ height: var(--sft-header-height);
402
+ padding: 0 var(--sft-space-5);
403
+ border-bottom: 1px solid var(--sft-color-border);
404
+ background: var(--sft-color-surface);
405
+ }
406
+
407
+ .sft-header__menu {
408
+ display: none;
409
+ align-items: center;
410
+ }
411
+
412
+ .sft-header__left {
413
+ min-width: 0;
414
+ display: flex;
415
+ align-items: center;
416
+ gap: var(--sft-space-2);
417
+ margin-right: auto;
418
+ }
419
+
420
+ .sft-header__title {
421
+ margin: 0;
422
+ font-size: var(--sft-font-size-lg);
423
+ font-weight: var(--sft-font-weight-bold);
424
+ color: var(--sft-color-text);
425
+ white-space: nowrap;
426
+ overflow: hidden;
427
+ text-overflow: ellipsis;
428
+ }
429
+
430
+ .sft-header__nav {
431
+ display: flex;
432
+ align-items: center;
433
+ gap: var(--sft-space-2);
434
+ height: 100%;
435
+ }
436
+
437
+ .sft-header__actions {
438
+ display: flex;
439
+ align-items: center;
440
+ gap: var(--sft-space-2);
441
+ margin-left: auto;
442
+ }
443
+
444
+ /* header breadcrumb (root / current) */
445
+
446
+ .sft-breadcrumb {
447
+ display: flex;
448
+ align-items: center;
449
+ gap: var(--sft-space-2);
450
+ min-width: 0;
451
+ }
452
+
453
+ .sft-breadcrumb__root {
454
+ font-size: var(--sft-font-size-md);
455
+ color: var(--sft-color-text-muted);
456
+ white-space: nowrap;
457
+ }
458
+
459
+ .sft-breadcrumb__sep {
460
+ color: var(--sft-color-border-strong);
461
+ }
462
+
463
+ .sft-breadcrumb__current {
464
+ font-size: var(--sft-font-size-md);
465
+ font-weight: var(--sft-font-weight-bold);
466
+ color: var(--sft-color-text);
467
+ white-space: nowrap;
468
+ overflow: hidden;
469
+ text-overflow: ellipsis;
470
+ }
471
+
472
+ /* ── Sidebar ────────────────────────────────────────────── */
473
+
474
+ .sft-sidebar {
475
+ display: flex;
476
+ flex-direction: column;
477
+ height: 100%;
478
+ }
479
+
480
+ .sft-sidebar__header {
481
+ display: flex;
482
+ align-items: center;
483
+ gap: var(--sft-space-2);
484
+ height: var(--sft-header-height);
485
+ padding: 0 var(--sft-space-4);
486
+ border-bottom: 1px solid var(--sft-color-border);
487
+ box-sizing: border-box;
488
+ flex: none;
489
+ }
490
+
491
+ .sft-sidebar__header-content {
492
+ flex: 1;
493
+ min-width: 0;
494
+ }
495
+
496
+ .sft-sidebar__collapse {
497
+ display: flex;
498
+ align-items: center;
499
+ justify-content: center;
500
+ width: 32px;
501
+ height: 32px;
502
+ border: 1px solid var(--sft-color-border);
503
+ border-radius: var(--sft-radius-md);
504
+ background: var(--sft-color-surface);
505
+ color: var(--sft-color-text-secondary);
506
+ cursor: pointer;
507
+ flex: none;
508
+ transition: background var(--sft-duration-fast) var(--sft-ease), color var(--sft-duration-fast)
509
+ var(--sft-ease);
510
+ }
511
+
512
+ .sft-sidebar__collapse:hover {
513
+ background: var(--sft-color-bg-hover);
514
+ color: var(--sft-color-text);
515
+ }
516
+
517
+ .sft-sidebar__collapse-icon {
518
+ transition: transform var(--sft-duration-base) var(--sft-ease);
519
+ }
520
+
521
+ .sft-sidebar__collapse-icon--flipped {
522
+ transform: rotate(180deg);
523
+ }
524
+
525
+ .sft-sidebar__content {
526
+ flex: 1;
527
+ overflow-y: auto;
528
+ overflow-x: hidden;
529
+ padding: var(--sft-space-4) var(--sft-space-3);
530
+ display: flex;
531
+ flex-direction: column;
532
+ gap: var(--sft-space-4);
533
+ }
534
+
535
+ .sft-sidebar__footer {
536
+ padding: var(--sft-space-4) var(--sft-space-4);
537
+ border-top: 1px solid var(--sft-color-border);
538
+ flex: none;
539
+ }
540
+
541
+ .sft-sidebar__brand {
542
+ display: flex;
543
+ align-items: center;
544
+ gap: var(--sft-space-2);
545
+ min-width: 0;
546
+ }
547
+
548
+ .sft-sidebar__logo {
549
+ display: inline-flex;
550
+ align-items: center;
551
+ justify-content: center;
552
+ width: 28px;
553
+ height: 28px;
554
+ border-radius: var(--sft-radius-md);
555
+ background: var(--sft-color-accent);
556
+ color: var(--sft-color-text-on-accent);
557
+ font-weight: var(--sft-font-weight-bold);
558
+ flex: none;
559
+ }
560
+
561
+ .sft-sidebar__brand-text {
562
+ display: flex;
563
+ flex-direction: column;
564
+ line-height: 1.2;
565
+ min-width: 0;
566
+ }
567
+
568
+ .sft-sidebar__title {
569
+ font-weight: var(--sft-font-weight-bold);
570
+ color: var(--sft-color-text);
571
+ white-space: nowrap;
572
+ overflow: hidden;
573
+ text-overflow: ellipsis;
574
+ }
575
+
576
+ .sft-sidebar__subtitle {
577
+ font-size: var(--sft-font-size-xs);
578
+ color: var(--sft-color-text-muted);
579
+ }
580
+
581
+ .sft-sidebar__section {
582
+ display: flex;
583
+ flex-direction: column;
584
+ gap: 2px;
585
+ }
586
+
587
+ .sft-sidebar__section-label,
588
+ .sft-sidebar__section-toggle {
589
+ padding: var(--sft-space-1) var(--sft-space-2);
590
+ font-size: var(--sft-font-size-xs);
591
+ font-weight: var(--sft-font-weight-bold);
592
+ letter-spacing: 0.04em;
593
+ text-transform: uppercase;
594
+ color: var(--sft-color-text-muted);
595
+ }
596
+
597
+ .sft-sidebar__section-toggle {
598
+ display: flex;
599
+ align-items: center;
600
+ justify-content: space-between;
601
+ width: 100%;
602
+ border: none;
603
+ background: none;
604
+ border-radius: var(--sft-radius-sm);
605
+ cursor: pointer;
606
+ font-family: inherit;
607
+ transition: background var(--sft-duration-fast) var(--sft-ease), color var(--sft-duration-fast)
608
+ var(--sft-ease);
609
+ }
610
+
611
+ .sft-sidebar__section-toggle:hover {
612
+ background: var(--sft-color-bg-hover);
613
+ color: var(--sft-color-text-secondary);
614
+ }
615
+
616
+ .sft-sidebar__section-chevron {
617
+ flex: none;
618
+ transition: transform var(--sft-duration-fast) var(--sft-ease);
619
+ transform: rotate(-90deg);
620
+ }
621
+
622
+ .sft-sidebar__section-chevron--open {
623
+ transform: rotate(0deg);
624
+ }
625
+
626
+ .sft-sidebar__items {
627
+ display: flex;
628
+ flex-direction: column;
629
+ gap: 1px;
630
+ }
631
+
632
+ .sft-sidebar__item {
633
+ display: flex;
634
+ align-items: center;
635
+ gap: var(--sft-space-2);
636
+ width: 100%;
637
+ padding: 9px var(--sft-space-2);
638
+ border: none;
639
+ border-radius: var(--sft-radius-sm);
640
+ background: transparent;
641
+ color: var(--sft-color-text-secondary);
642
+ font: inherit;
643
+ font-size: var(--sft-font-size-lg);
644
+ text-align: left;
645
+ cursor: pointer;
646
+ transition: background var(--sft-duration-fast) var(--sft-ease);
647
+ }
648
+
649
+ .sft-sidebar__item:hover {
650
+ background: var(--sft-color-bg-hover);
651
+ color: var(--sft-color-text);
652
+ }
653
+
654
+ .sft-sidebar__item--active {
655
+ background: var(--sft-color-accent-subtle);
656
+ color: var(--sft-color-accent);
657
+ font-weight: var(--sft-font-weight-medium);
658
+ }
659
+
660
+ .sft-sidebar__item-icon {
661
+ display: inline-flex;
662
+ width: 20px;
663
+ justify-content: center;
664
+ flex: none;
665
+ }
666
+
667
+ .sft-sidebar__item-label {
668
+ flex: 1;
669
+ min-width: 0;
670
+ overflow: hidden;
671
+ text-overflow: ellipsis;
672
+ white-space: nowrap;
673
+ }
674
+
675
+ .sft-sidebar__tooltip {
676
+ position: fixed;
677
+ transform: translateY(-50%);
678
+ padding: var(--sft-space-1) var(--sft-space-2);
679
+ font-size: var(--sft-font-size-xs);
680
+ font-weight: var(--sft-font-weight-medium);
681
+ color: var(--sft-color-bg);
682
+ background: var(--sft-color-text);
683
+ border-radius: var(--sft-radius-sm);
684
+ white-space: nowrap;
685
+ z-index: var(--sft-z-modal);
686
+ pointer-events: none;
687
+ }
688
+
689
+ /* ── Sidebar: collapsed (icon-only rail) ────────────────── */
690
+
691
+ .sft-sidebar--collapsed .sft-sidebar__header {
692
+ justify-content: center;
693
+ padding: 0;
694
+ }
695
+
696
+ .sft-sidebar--collapsed .sft-sidebar__header-content,
697
+ .sft-sidebar--collapsed .sft-sidebar__footer,
698
+ .sft-sidebar--collapsed .sft-sidebar__section-label,
699
+ .sft-sidebar--collapsed .sft-sidebar__section-toggle,
700
+ .sft-sidebar--collapsed .sft-sidebar__item-label {
701
+ display: none;
702
+ }
703
+
704
+ .sft-sidebar--collapsed .sft-sidebar__content {
705
+ padding: var(--sft-space-4) 0;
706
+ align-items: center;
707
+ }
708
+
709
+ .sft-sidebar--collapsed .sft-sidebar__section {
710
+ width: 100%;
711
+ align-items: center;
712
+ }
713
+
714
+ .sft-sidebar--collapsed .sft-sidebar__items {
715
+ width: 100%;
716
+ align-items: center;
717
+ }
718
+
719
+ .sft-sidebar--collapsed .sft-sidebar__item {
720
+ width: 42px;
721
+ height: 42px;
722
+ padding: 0;
723
+ justify-content: center;
724
+ }
725
+
726
+ .sft-sidebar--collapsed .sft-sidebar__item-icon {
727
+ width: auto;
728
+ }
729
+
730
+ /* ── responsive: tablet auto-rail, mobile drawer ────────── */
731
+
732
+ @media (max-width: 1024px) and (min-width: 769px) {
733
+ .sft-shell__sidebar {
734
+ width: var(--sft-sidebar-collapsed-width);
735
+ }
736
+ .sft-shell__main {
737
+ margin-left: var(--sft-sidebar-collapsed-width);
738
+ }
739
+ }
740
+
741
+ @media (max-width: 768px) {
742
+ .sft-shell__sidebar {
743
+ transform: translateX(-100%);
744
+ width: var(--sft-sidebar-width);
745
+ background: var(--sft-color-bg);
746
+ z-index: calc(var(--sft-z-overlay) + 1);
747
+ }
748
+ .sft-shell[data-drawer-open] .sft-shell__sidebar {
749
+ transform: translateX(0);
750
+ }
751
+ .sft-shell__main {
752
+ margin-left: 0;
753
+ }
754
+ .sft-shell__overlay {
755
+ display: block;
756
+ position: fixed;
757
+ inset: 0;
758
+ background: rgba(16, 24, 40, 0.45);
759
+ z-index: var(--sft-z-overlay);
760
+ }
761
+ .sft-header__menu {
762
+ display: flex;
763
+ }
764
+ }