@bensdev/react-sidebar 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,723 @@
1
+ /**
2
+ * @bensdev/react-sidebar — default stylesheet.
3
+ *
4
+ * Every visual value lives in a `--bsb-*` custom property. Override them with the `theme` prop
5
+ * (inline vars, wins over everything below), with plain CSS (`.my-app .bsb-root { --bsb-bg: ... }`),
6
+ * or per-slot via the `classNames` prop. Nothing below reads Tailwind or any other framework.
7
+ */
8
+
9
+ .bsb-root,
10
+ .bsb-root *,
11
+ .bsb-root *::before,
12
+ .bsb-root *::after {
13
+ box-sizing: border-box;
14
+ }
15
+ .bsb-root ul {
16
+ margin: 0;
17
+ padding: 0;
18
+ list-style: none;
19
+ }
20
+ .bsb-root a {
21
+ color: inherit;
22
+ text-decoration: none;
23
+ }
24
+ .bsb-root button {
25
+ margin: 0;
26
+ padding: 0;
27
+ background: none;
28
+ border: 0;
29
+ font: inherit;
30
+ color: inherit;
31
+ cursor: pointer;
32
+ text-align: start;
33
+ }
34
+ .bsb-root img {
35
+ max-width: 100%;
36
+ display: block;
37
+ }
38
+
39
+ /* ── tokens: layout ─────────────────────────────────────────────────── */
40
+ .bsb-root {
41
+ --bsb-width: 260px;
42
+ --bsb-width-collapsed: 68px;
43
+ --bsb-drawer-width: 280px;
44
+ --bsb-header-height: 64px;
45
+ --bsb-header-padding-x: 16px;
46
+ --bsb-header-gap: 10px;
47
+ --bsb-nav-padding-y: 12px;
48
+ --bsb-item-height: 44px;
49
+ --bsb-item-gap: 2px;
50
+ --bsb-item-inline-margin: 8px;
51
+ --bsb-item-padding-x: 12px;
52
+ --bsb-item-icon-gap: 12px;
53
+ --bsb-icon-size: 18px;
54
+ --bsb-accent-width: 3px;
55
+ --bsb-indent-step: 12px;
56
+ --bsb-footer-padding: 12px;
57
+ --bsb-logo-size: 32px;
58
+ --bsb-avatar-size: 32px;
59
+ --bsb-toggle-size: 28px;
60
+ --bsb-toggle-offset-y: 32px;
61
+ --bsb-toggle-border-width: 2px;
62
+ --bsb-tooltip-offset: 12px;
63
+ --bsb-scrollbar-width: 4px;
64
+ --bsb-z-toggle: 30;
65
+ --bsb-z-tooltip: 50;
66
+ --bsb-z-drawer: 1100;
67
+
68
+ /* radii */
69
+ --bsb-radius-item: 8px;
70
+ --bsb-radius-logo: 8px;
71
+ --bsb-radius-tooltip: 6px;
72
+ --bsb-radius-badge: 9999px;
73
+ --bsb-radius-action: 4px;
74
+ --bsb-radius-avatar: 9999px;
75
+
76
+ /* typography */
77
+ --bsb-font-family: inherit;
78
+ --bsb-font-display: inherit;
79
+ --bsb-item-font-size: 14px;
80
+ --bsb-item-font-weight: 500;
81
+ --bsb-item-line-height: 20px;
82
+ --bsb-title-font-size: 16px;
83
+ --bsb-title-font-weight: 700;
84
+ --bsb-title-letter-spacing: -0.025em;
85
+ --bsb-subtitle-font-size: 10px;
86
+ --bsb-subtitle-letter-spacing: 0.025em;
87
+ --bsb-heading-font-size: 10px;
88
+ --bsb-heading-font-weight: 600;
89
+ --bsb-heading-letter-spacing: 0.1em;
90
+ --bsb-tooltip-font-size: 12px;
91
+ --bsb-badge-font-size: 10px;
92
+ --bsb-badge-font-weight: 700;
93
+ --bsb-user-name-font-size: 14px;
94
+ --bsb-user-meta-font-size: 11px;
95
+
96
+ /* motion */
97
+ --bsb-ease: cubic-bezier(0.16, 1, 0.3, 1);
98
+ --bsb-duration-collapse: 300ms;
99
+ --bsb-duration-item: 150ms;
100
+ --bsb-duration-drawer: 400ms;
101
+ --bsb-duration-backdrop: 200ms;
102
+ --bsb-tooltip-delay: 0ms;
103
+
104
+ /* colors — neutral slate defaults, override via `theme` or plain CSS */
105
+ --bsb-bg: #1e293b;
106
+ --bsb-border: rgba(255, 255, 255, 0.08);
107
+ --bsb-divider: rgba(255, 255, 255, 0.06);
108
+ --bsb-item-fg: #cbd5e1;
109
+ --bsb-item-hover-bg: rgba(255, 255, 255, 0.06);
110
+ --bsb-item-hover-fg: #ffffff;
111
+ --bsb-item-active-bg: rgba(255, 255, 255, 0.1);
112
+ --bsb-item-active-fg: #ffffff;
113
+ --bsb-item-accent: #38bdf8;
114
+ --bsb-item-disabled-fg: rgba(203, 213, 225, 0.4);
115
+ --bsb-focus-ring: #38bdf8;
116
+ --bsb-focus-ring-width: 2px;
117
+ --bsb-heading-fg: #94a3b8;
118
+ --bsb-logo-bg: #334155;
119
+ --bsb-logo-fg: #ffffff;
120
+ --bsb-title-fg: #ffffff;
121
+ --bsb-subtitle-fg: #94a3b8;
122
+ --bsb-badge-bg: rgba(56, 189, 248, 0.2);
123
+ --bsb-badge-fg: #7dd3fc;
124
+ --bsb-badge-border: rgba(56, 189, 248, 0.3);
125
+ --bsb-badge-danger-bg: rgba(248, 113, 113, 0.2);
126
+ --bsb-badge-danger-fg: #fca5a5;
127
+ --bsb-badge-success-bg: rgba(74, 222, 128, 0.2);
128
+ --bsb-badge-success-fg: #86efac;
129
+ --bsb-tooltip-bg: #0f172a;
130
+ --bsb-tooltip-fg: #e2e8f0;
131
+ --bsb-tooltip-border: #334155;
132
+ --bsb-toggle-bg: #334155;
133
+ --bsb-toggle-hover-bg: #475569;
134
+ --bsb-toggle-fg: #ffffff;
135
+ --bsb-toggle-border: #1e293b;
136
+ --bsb-avatar-bg: #334155;
137
+ --bsb-avatar-fg: #ffffff;
138
+ --bsb-avatar-ring: rgba(255, 255, 255, 0.15);
139
+ --bsb-user-name-fg: #e2e8f0;
140
+ --bsb-user-meta-fg: #94a3b8;
141
+ --bsb-action-fg: #94a3b8;
142
+ --bsb-action-hover-fg: #ffffff;
143
+ --bsb-action-hover-bg: rgba(255, 255, 255, 0.08);
144
+ --bsb-scrollbar-thumb: rgba(255, 255, 255, 0.15);
145
+ --bsb-scrollbar-thumb-hover: rgba(255, 255, 255, 0.25);
146
+ --bsb-backdrop-bg: rgba(0, 0, 0, 0.5);
147
+ --bsb-backdrop-blur: 4px;
148
+ --bsb-shadow-logo: 0 1px 2px rgba(0, 0, 0, 0.05);
149
+ --bsb-shadow-toggle: 0 4px 12px rgba(0, 0, 0, 0.15);
150
+ --bsb-shadow-tooltip: 0 12px 32px rgba(0, 0, 0, 0.25);
151
+ --bsb-shadow-drawer: 0 24px 48px rgba(0, 0, 0, 0.35);
152
+
153
+ /* derived */
154
+ --bsb-current-width: var(--bsb-width);
155
+
156
+ position: relative;
157
+ font-family: var(--bsb-font-family);
158
+ color: var(--bsb-item-fg);
159
+ }
160
+ .bsb-root[data-collapsed='true'] {
161
+ --bsb-current-width: var(--bsb-width-collapsed);
162
+ }
163
+
164
+ /* ── dark mode: explicit attr, or ancestor .dark / [data-theme=dark] — pure CSS, no FOUC ── */
165
+ .bsb-root[data-color-scheme='dark'] {
166
+ --bsb-bg: #0f172a;
167
+ --bsb-border: rgba(255, 255, 255, 0.06);
168
+ --bsb-divider: rgba(255, 255, 255, 0.05);
169
+ }
170
+ :where(.dark, [data-theme='dark']) .bsb-root:not([data-color-scheme]) {
171
+ --bsb-bg: #0f172a;
172
+ --bsb-border: rgba(255, 255, 255, 0.06);
173
+ --bsb-divider: rgba(255, 255, 255, 0.05);
174
+ }
175
+
176
+ /* ── layout shell ────────────────────────────────────────────────────── */
177
+ .bsb-root:not([data-position='right']) {
178
+ width: var(--bsb-current-width);
179
+ }
180
+ .bsb-root {
181
+ display: flex;
182
+ flex-direction: column;
183
+ height: 100%;
184
+ background: var(--bsb-bg);
185
+ border-inline-end: 1px solid transparent;
186
+ transition: width var(--bsb-duration-collapse) var(--bsb-ease);
187
+ overflow: visible; /* the collapse toggle straddles the edge */
188
+ }
189
+ .bsb-root--bordered {
190
+ border-inline-end-color: var(--bsb-border);
191
+ }
192
+ .bsb-root[data-position='right'] {
193
+ border-inline-end-color: transparent;
194
+ border-inline-start: 1px solid transparent;
195
+ }
196
+ .bsb-root--bordered[data-position='right'] {
197
+ border-inline-start-color: var(--bsb-border);
198
+ }
199
+
200
+ .bsb-shell {
201
+ display: flex;
202
+ flex-direction: column;
203
+ height: 100%;
204
+ min-height: 0;
205
+ }
206
+
207
+ /* ── header / brand ──────────────────────────────────────────────────── */
208
+ .bsb-header {
209
+ position: relative;
210
+ display: flex;
211
+ align-items: center;
212
+ gap: var(--bsb-header-gap);
213
+ height: var(--bsb-header-height);
214
+ padding-inline: var(--bsb-header-padding-x);
215
+ border-bottom: 1px solid var(--bsb-divider);
216
+ flex-shrink: 0;
217
+ }
218
+ .bsb-header--collapsed {
219
+ justify-content: center;
220
+ }
221
+ .bsb-brand {
222
+ display: flex;
223
+ align-items: center;
224
+ gap: var(--bsb-header-gap);
225
+ min-width: 0;
226
+ flex: 1;
227
+ background: none;
228
+ border: 0;
229
+ cursor: default;
230
+ }
231
+ a.bsb-brand,
232
+ button.bsb-brand {
233
+ cursor: pointer;
234
+ }
235
+ .bsb-logo {
236
+ flex-shrink: 0;
237
+ width: var(--bsb-logo-size);
238
+ height: var(--bsb-logo-size);
239
+ border-radius: var(--bsb-radius-logo);
240
+ background: var(--bsb-logo-bg);
241
+ color: var(--bsb-logo-fg);
242
+ display: flex;
243
+ align-items: center;
244
+ justify-content: center;
245
+ font-family: var(--bsb-font-display);
246
+ font-weight: 800;
247
+ font-size: 14px;
248
+ box-shadow: var(--bsb-shadow-logo);
249
+ }
250
+ .bsb-brand__text {
251
+ display: flex;
252
+ flex-direction: column;
253
+ line-height: 1;
254
+ flex: 1;
255
+ min-width: 0;
256
+ }
257
+ .bsb-brand__title-row {
258
+ display: flex;
259
+ align-items: center;
260
+ gap: 8px;
261
+ }
262
+ .bsb-title {
263
+ font-family: var(--bsb-font-display);
264
+ font-weight: var(--bsb-title-font-weight);
265
+ font-size: var(--bsb-title-font-size);
266
+ letter-spacing: var(--bsb-title-letter-spacing);
267
+ color: var(--bsb-title-fg);
268
+ white-space: nowrap;
269
+ overflow: hidden;
270
+ text-overflow: ellipsis;
271
+ }
272
+ .bsb-subtitle {
273
+ margin-top: 2px;
274
+ font-size: var(--bsb-subtitle-font-size);
275
+ letter-spacing: var(--bsb-subtitle-letter-spacing);
276
+ color: var(--bsb-subtitle-fg);
277
+ white-space: nowrap;
278
+ }
279
+
280
+ /* ── nav / list ──────────────────────────────────────────────────────── */
281
+ .bsb-nav {
282
+ flex: 1;
283
+ overflow-y: auto;
284
+ overflow-x: hidden;
285
+ padding-block: var(--bsb-nav-padding-y);
286
+ }
287
+ .bsb-nav::-webkit-scrollbar {
288
+ width: var(--bsb-scrollbar-width);
289
+ height: var(--bsb-scrollbar-width);
290
+ }
291
+ .bsb-nav::-webkit-scrollbar-track {
292
+ background: transparent;
293
+ }
294
+ .bsb-nav::-webkit-scrollbar-thumb {
295
+ background: var(--bsb-scrollbar-thumb);
296
+ border-radius: 9999px;
297
+ }
298
+ .bsb-nav::-webkit-scrollbar-thumb:hover {
299
+ background: var(--bsb-scrollbar-thumb-hover);
300
+ }
301
+ .bsb-nav {
302
+ scrollbar-width: thin;
303
+ scrollbar-color: var(--bsb-scrollbar-thumb) transparent;
304
+ }
305
+ .bsb-list {
306
+ display: flex;
307
+ flex-direction: column;
308
+ gap: var(--bsb-item-gap);
309
+ }
310
+ .bsb-list-item {
311
+ display: block;
312
+ }
313
+
314
+ /* ── item row ────────────────────────────────────────────────────────── */
315
+ .bsb-item {
316
+ position: relative;
317
+ display: flex;
318
+ align-items: center;
319
+ gap: var(--bsb-item-icon-gap);
320
+ width: calc(100% - 2 * var(--bsb-item-inline-margin));
321
+ height: var(--bsb-item-height);
322
+ margin-inline: var(--bsb-item-inline-margin);
323
+ padding-inline: var(--bsb-item-padding-x);
324
+ border-radius: var(--bsb-radius-item);
325
+ font-size: var(--bsb-item-font-size);
326
+ font-weight: var(--bsb-item-font-weight);
327
+ line-height: var(--bsb-item-line-height);
328
+ color: var(--bsb-item-fg);
329
+ transition:
330
+ background-color var(--bsb-duration-item) ease,
331
+ color var(--bsb-duration-item) ease,
332
+ padding-left var(--bsb-duration-item) ease;
333
+ }
334
+ a.bsb-item,
335
+ button.bsb-item {
336
+ cursor: pointer;
337
+ }
338
+ .bsb-item:hover {
339
+ background: var(--bsb-item-hover-bg);
340
+ color: var(--bsb-item-hover-fg);
341
+ }
342
+ .bsb-item--active {
343
+ background: var(--bsb-item-active-bg);
344
+ color: var(--bsb-item-active-fg);
345
+ border-left: var(--bsb-accent-width) solid var(--bsb-item-accent);
346
+ padding-left: calc(var(--bsb-item-padding-x) - var(--bsb-accent-width));
347
+ }
348
+ .bsb-item--disabled {
349
+ color: var(--bsb-item-disabled-fg);
350
+ cursor: not-allowed;
351
+ pointer-events: none;
352
+ }
353
+ .bsb-item__icon {
354
+ flex: 0 0 auto;
355
+ display: inline-flex;
356
+ align-items: center;
357
+ justify-content: center;
358
+ width: var(--bsb-icon-size);
359
+ height: var(--bsb-icon-size);
360
+ }
361
+ .bsb-item__label {
362
+ overflow: hidden;
363
+ text-overflow: ellipsis;
364
+ white-space: nowrap;
365
+ flex: 1;
366
+ min-width: 0;
367
+ }
368
+ .bsb-item:focus-visible,
369
+ .bsb-toggle:focus-visible,
370
+ .bsb-drawer__close:focus-visible,
371
+ .bsb-footer-action:focus-visible,
372
+ .bsb-brand:focus-visible {
373
+ outline: var(--bsb-focus-ring-width) solid var(--bsb-focus-ring);
374
+ outline-offset: 2px;
375
+ }
376
+
377
+ /* collapsed rail: unmount labels/badges/chevrons from layout, not just hide them visually */
378
+ .bsb-root[data-collapsed='true'] .bsb-item__label,
379
+ .bsb-root[data-collapsed='true'] > .bsb-shell .bsb-badge,
380
+ .bsb-root[data-collapsed='true'] .bsb-group__chevron {
381
+ display: none;
382
+ }
383
+ /* …except inside a collapsed-rail flyout, where the full row is shown again */
384
+ .bsb-group__flyout .bsb-item__label,
385
+ .bsb-group__flyout .bsb-badge {
386
+ display: inline-block;
387
+ }
388
+
389
+ /* ── badge ───────────────────────────────────────────────────────────── */
390
+ .bsb-badge {
391
+ flex-shrink: 0;
392
+ display: inline-flex;
393
+ align-items: center;
394
+ justify-content: center;
395
+ min-width: 18px;
396
+ height: 18px;
397
+ padding-inline: 6px;
398
+ border-radius: var(--bsb-radius-badge);
399
+ font-size: var(--bsb-badge-font-size);
400
+ font-weight: var(--bsb-badge-font-weight);
401
+ background: var(--bsb-badge-bg);
402
+ color: var(--bsb-badge-fg);
403
+ border: 1px solid var(--bsb-badge-border);
404
+ }
405
+ .bsb-badge--danger {
406
+ background: var(--bsb-badge-danger-bg, var(--bsb-badge-bg));
407
+ color: var(--bsb-badge-danger-fg, var(--bsb-badge-fg));
408
+ border-color: transparent;
409
+ }
410
+ .bsb-badge--success {
411
+ background: var(--bsb-badge-success-bg, var(--bsb-badge-bg));
412
+ color: var(--bsb-badge-success-fg, var(--bsb-badge-fg));
413
+ border-color: transparent;
414
+ }
415
+
416
+ /* ── tooltip (collapsed mode) ───────────────────────────────────────── */
417
+ .bsb-tooltip {
418
+ position: absolute;
419
+ top: 50%;
420
+ left: 100%;
421
+ transform: translateY(-50%);
422
+ margin-inline-start: var(--bsb-tooltip-offset);
423
+ padding: 6px 10px;
424
+ border-radius: var(--bsb-radius-tooltip);
425
+ background: var(--bsb-tooltip-bg);
426
+ color: var(--bsb-tooltip-fg);
427
+ border: 1px solid var(--bsb-tooltip-border);
428
+ box-shadow: var(--bsb-shadow-tooltip);
429
+ font-size: var(--bsb-tooltip-font-size);
430
+ font-weight: 500;
431
+ white-space: nowrap;
432
+ opacity: 0;
433
+ pointer-events: none;
434
+ z-index: var(--bsb-z-tooltip);
435
+ transition: opacity var(--bsb-duration-item) ease var(--bsb-tooltip-delay);
436
+ }
437
+ .bsb-root[data-position='right'] .bsb-tooltip {
438
+ left: auto;
439
+ right: 100%;
440
+ margin-inline-start: 0;
441
+ margin-inline-end: var(--bsb-tooltip-offset);
442
+ }
443
+ .bsb-item:hover > .bsb-tooltip,
444
+ .bsb-item:focus-visible > .bsb-tooltip,
445
+ .bsb-group__trigger:hover > .bsb-tooltip,
446
+ .bsb-group__trigger:focus-visible > .bsb-tooltip {
447
+ opacity: 1;
448
+ }
449
+
450
+ /* ── groups / submenus ──────────────────────────────────────────────── */
451
+ .bsb-group__chevron {
452
+ flex-shrink: 0;
453
+ display: inline-flex;
454
+ transition: transform var(--bsb-duration-item) ease;
455
+ }
456
+ .bsb-group__chevron--open {
457
+ transform: rotate(-180deg);
458
+ }
459
+ .bsb-group__panel {
460
+ display: flex;
461
+ flex-direction: column;
462
+ gap: var(--bsb-item-gap);
463
+ margin-top: var(--bsb-item-gap);
464
+ }
465
+ .bsb-heading {
466
+ padding: 10px 20px 4px;
467
+ font-size: var(--bsb-heading-font-size);
468
+ font-weight: var(--bsb-heading-font-weight);
469
+ letter-spacing: var(--bsb-heading-letter-spacing);
470
+ text-transform: uppercase;
471
+ color: var(--bsb-heading-fg);
472
+ }
473
+ .bsb-divider {
474
+ border: none;
475
+ border-top: 1px solid var(--bsb-divider);
476
+ margin: 8px 16px;
477
+ }
478
+
479
+ /* collapsed-rail flyout */
480
+ .bsb-group--flyout {
481
+ position: relative;
482
+ }
483
+ .bsb-group__flyout {
484
+ position: absolute;
485
+ top: 0;
486
+ left: 100%;
487
+ margin-inline-start: 8px;
488
+ min-width: 200px;
489
+ padding: 8px;
490
+ border-radius: var(--bsb-radius-item);
491
+ background: var(--bsb-bg);
492
+ border: 1px solid var(--bsb-border);
493
+ box-shadow: var(--bsb-shadow-tooltip);
494
+ opacity: 0;
495
+ pointer-events: none;
496
+ transform: translateY(-4px);
497
+ transition:
498
+ opacity var(--bsb-duration-item) ease,
499
+ transform var(--bsb-duration-item) ease;
500
+ z-index: var(--bsb-z-tooltip);
501
+ }
502
+ .bsb-root[data-position='right'] .bsb-group__flyout {
503
+ left: auto;
504
+ right: 100%;
505
+ margin-inline-start: 0;
506
+ margin-inline-end: 8px;
507
+ }
508
+ .bsb-group--flyout:hover > .bsb-group__flyout,
509
+ .bsb-group--flyout:focus-within > .bsb-group__flyout {
510
+ opacity: 1;
511
+ pointer-events: auto;
512
+ transform: translateY(0);
513
+ }
514
+ .bsb-group__flyout-label {
515
+ padding: 4px 8px 8px;
516
+ font-size: var(--bsb-heading-font-size);
517
+ font-weight: var(--bsb-heading-font-weight);
518
+ letter-spacing: var(--bsb-heading-letter-spacing);
519
+ text-transform: uppercase;
520
+ color: var(--bsb-heading-fg);
521
+ }
522
+ .bsb-group__flyout .bsb-item {
523
+ margin-inline: 0;
524
+ width: 100%;
525
+ }
526
+
527
+ /* ── footer / user ───────────────────────────────────────────────────── */
528
+ .bsb-footer {
529
+ flex-shrink: 0;
530
+ padding: var(--bsb-footer-padding);
531
+ border-top: 1px solid var(--bsb-divider);
532
+ }
533
+ .bsb-footer--stacked {
534
+ display: flex;
535
+ flex-direction: column;
536
+ align-items: center;
537
+ gap: 8px;
538
+ }
539
+ .bsb-user {
540
+ display: flex;
541
+ align-items: center;
542
+ gap: 12px;
543
+ }
544
+ .bsb-user--centered {
545
+ justify-content: center;
546
+ }
547
+ .bsb-avatar {
548
+ flex-shrink: 0;
549
+ width: var(--bsb-avatar-size);
550
+ height: var(--bsb-avatar-size);
551
+ border-radius: var(--bsb-radius-avatar);
552
+ background: var(--bsb-avatar-bg);
553
+ color: var(--bsb-avatar-fg);
554
+ box-shadow: 0 0 0 2px var(--bsb-avatar-ring);
555
+ display: flex;
556
+ align-items: center;
557
+ justify-content: center;
558
+ overflow: hidden;
559
+ }
560
+ .bsb-avatar__img {
561
+ width: 100%;
562
+ height: 100%;
563
+ object-fit: cover;
564
+ border-radius: var(--bsb-radius-avatar);
565
+ }
566
+ .bsb-avatar__initials {
567
+ font-size: 12px;
568
+ font-weight: 700;
569
+ }
570
+ .bsb-user__text {
571
+ flex: 1;
572
+ min-width: 0;
573
+ display: flex;
574
+ flex-direction: column;
575
+ }
576
+ .bsb-user__name {
577
+ font-size: var(--bsb-user-name-font-size);
578
+ font-weight: 500;
579
+ color: var(--bsb-user-name-fg);
580
+ white-space: nowrap;
581
+ overflow: hidden;
582
+ text-overflow: ellipsis;
583
+ }
584
+ .bsb-user__meta {
585
+ font-size: var(--bsb-user-meta-font-size);
586
+ color: var(--bsb-user-meta-fg);
587
+ white-space: nowrap;
588
+ overflow: hidden;
589
+ text-overflow: ellipsis;
590
+ }
591
+ .bsb-footer-action {
592
+ flex-shrink: 0;
593
+ display: inline-flex;
594
+ align-items: center;
595
+ justify-content: center;
596
+ width: 26px;
597
+ height: 26px;
598
+ border-radius: var(--bsb-radius-action);
599
+ color: var(--bsb-action-fg);
600
+ transition:
601
+ color var(--bsb-duration-item) ease,
602
+ background-color var(--bsb-duration-item) ease;
603
+ }
604
+ .bsb-footer-action:hover {
605
+ color: var(--bsb-action-hover-fg);
606
+ background: var(--bsb-action-hover-bg);
607
+ }
608
+
609
+ /* ── collapse toggle ─────────────────────────────────────────────────── */
610
+ .bsb-toggle {
611
+ position: absolute;
612
+ top: var(--bsb-toggle-offset-y);
613
+ left: calc(var(--bsb-current-width) - var(--bsb-toggle-size) / 2);
614
+ transform: translateY(-50%);
615
+ width: var(--bsb-toggle-size);
616
+ height: var(--bsb-toggle-size);
617
+ border-radius: 9999px;
618
+ z-index: var(--bsb-z-toggle);
619
+ background: var(--bsb-toggle-bg);
620
+ color: var(--bsb-toggle-fg);
621
+ border: var(--bsb-toggle-border-width) solid var(--bsb-toggle-border);
622
+ box-shadow: var(--bsb-shadow-toggle);
623
+ display: flex;
624
+ align-items: center;
625
+ justify-content: center;
626
+ transition:
627
+ left var(--bsb-duration-collapse) var(--bsb-ease),
628
+ right var(--bsb-duration-collapse) var(--bsb-ease),
629
+ background-color var(--bsb-duration-item) ease;
630
+ }
631
+ .bsb-root[data-position='right'] .bsb-toggle {
632
+ left: auto;
633
+ right: calc(var(--bsb-current-width) - var(--bsb-toggle-size) / 2);
634
+ }
635
+ .bsb-toggle:hover {
636
+ background: var(--bsb-toggle-hover-bg);
637
+ }
638
+ .bsb-toggle:active {
639
+ transform: translateY(-50%) scale(0.95);
640
+ }
641
+ .bsb-toggle[data-toggle-strategy='fixed'] {
642
+ position: fixed;
643
+ }
644
+
645
+ /* ── mobile drawer ───────────────────────────────────────────────────── */
646
+ .bsb-backdrop {
647
+ position: fixed;
648
+ inset: 0;
649
+ z-index: var(--bsb-z-drawer);
650
+ background: var(--bsb-backdrop-bg);
651
+ -webkit-backdrop-filter: blur(var(--bsb-backdrop-blur));
652
+ backdrop-filter: blur(var(--bsb-backdrop-blur));
653
+ opacity: 0;
654
+ transition: opacity var(--bsb-duration-backdrop) ease;
655
+ }
656
+ .bsb-backdrop[data-state='open'] {
657
+ opacity: 1;
658
+ }
659
+ .bsb-drawer {
660
+ position: fixed;
661
+ inset-block: 0;
662
+ inset-inline-start: 0;
663
+ z-index: calc(var(--bsb-z-drawer) + 1);
664
+ width: var(--bsb-drawer-current-width, var(--bsb-drawer-width, 280px));
665
+ display: flex;
666
+ flex-direction: column;
667
+ background: var(--bsb-bg);
668
+ box-shadow: var(--bsb-shadow-drawer);
669
+ transform: translateX(-100%);
670
+ transition: transform var(--bsb-duration-drawer) var(--bsb-ease);
671
+ outline: none;
672
+ }
673
+ .bsb-drawer[data-state='open'] {
674
+ transform: translateX(0);
675
+ }
676
+ .bsb-drawer[data-position='right'] {
677
+ inset-inline-start: auto;
678
+ inset-inline-end: 0;
679
+ transform: translateX(100%);
680
+ }
681
+ .bsb-drawer[data-position='right'][data-state='open'] {
682
+ transform: translateX(0);
683
+ }
684
+ .bsb-drawer .bsb-shell {
685
+ width: 100%;
686
+ }
687
+ .bsb-drawer__close {
688
+ position: absolute;
689
+ top: 16px;
690
+ right: 16px;
691
+ z-index: 1;
692
+ display: inline-flex;
693
+ align-items: center;
694
+ justify-content: center;
695
+ width: 28px;
696
+ height: 28px;
697
+ border-radius: var(--bsb-radius-action);
698
+ color: var(--bsb-action-fg);
699
+ }
700
+ .bsb-drawer[data-position='right'] .bsb-drawer__close {
701
+ right: auto;
702
+ left: 16px;
703
+ }
704
+ .bsb-drawer__close:hover {
705
+ color: var(--bsb-action-hover-fg);
706
+ background: var(--bsb-action-hover-bg);
707
+ }
708
+
709
+ /* ── reduced motion ──────────────────────────────────────────────────── */
710
+ @media (prefers-reduced-motion: reduce) {
711
+ .bsb-root,
712
+ .bsb-root *,
713
+ .bsb-backdrop,
714
+ .bsb-drawer {
715
+ transition-duration: 1ms !important;
716
+ animation-duration: 1ms !important;
717
+ }
718
+ }
719
+ .bsb-root[data-reduce-motion='true'],
720
+ .bsb-root[data-reduce-motion='true'] * {
721
+ transition-duration: 1ms !important;
722
+ animation-duration: 1ms !important;
723
+ }