rootzz-layout 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,1004 @@
1
+ /* ════════════════════════════════════════════════════════════════════════
2
+ rootzz-layout — folha de estilo única (publicada como dist/styles.css)
3
+
4
+ CSS puro, sem Tailwind. Estratégia anti-conflito:
5
+ - Tudo é escopado em `.rootzz-layout` (tokens, reset e classes de componente).
6
+ - As classes têm prefixo `rootzz-` para nunca colidirem com o CSS do consumidor.
7
+ - Não há reset global: o reset abaixo só atinge descendentes de `.rootzz-layout`.
8
+ - Customização = sobrescrever as CSS variables `--rzl-*` no seu próprio CSS.
9
+
10
+ Convenção de nomes (BEM com prefixo `rootzz-`):
11
+ - bloco: `.rootzz-topbar`
12
+ - elemento: `.rootzz-topbar__left`
13
+ - modificador: `.rootzz-sidebar-item--active`
14
+ ════════════════════════════════════════════════════════════════════════ */
15
+
16
+ /* ── Tokens (tema claro = padrão) ─────────────────────────────────────── */
17
+ .rootzz-layout {
18
+ /* Cores de marca */
19
+ --rzl-primary: #2b4acf;
20
+ --rzl-primary-hover: #2540b5;
21
+ --rzl-primary-contrast: #ffffff;
22
+
23
+ /* Item ativo da sidebar — texto na cor primária. */
24
+ --rzl-active-bg: #f0f5ff;
25
+ --rzl-active-fg: var(--rzl-primary);
26
+
27
+ /* Superfícies */
28
+ --rzl-bg: #ffffff; /* área de conteúdo */
29
+ --rzl-surface: #ffffff; /* topbar e sidebar */
30
+
31
+ /* Texto */
32
+ --rzl-fg: #0f1324;
33
+ --rzl-fg-muted: rgba(15, 19, 36, 0.65);
34
+ --rzl-fg-subtle: rgba(15,19,36,0.55);
35
+
36
+ /* Linhas e estados */
37
+ --rzl-border: #e5e7eb;
38
+ --rzl-hover-bg: rgba(15, 19, 36, 0.045);
39
+
40
+ /* Semânticos */
41
+ --rzl-danger: #e11d48;
42
+ --rzl-danger-bg: rgba(225, 29, 72, 0.08);
43
+ --rzl-badge-bg: #e11d48;
44
+ --rzl-badge-fg: #ffffff;
45
+ --rzl-overlay: rgba(15, 19, 36, 0.45);
46
+
47
+ /* Sombras */
48
+ --rzl-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
49
+ --rzl-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
50
+
51
+ /* Dimensões */
52
+ --rzl-topbar-height: 60px;
53
+ --rzl-sidebar-width: 280px;
54
+ --rzl-content-max-width: 1200px;
55
+ --rzl-radius: 8px;
56
+ --rzl-radius-lg: 12px;
57
+
58
+ /* Camadas (z-index) */
59
+ --rzl-z-topbar: 30;
60
+ --rzl-z-overlay: 40;
61
+ --rzl-z-drawer: 50;
62
+ --rzl-z-dropdown: 60;
63
+
64
+ /* Movimento */
65
+ --rzl-duration: 200ms;
66
+ --rzl-ease: cubic-bezier(0.4, 0, 0.2, 1);
67
+
68
+ /* Tipografia — Google Sans é a fonte padrão (herde do app sobrescrevendo --rzl-font) */
69
+ --rzl-font: "Google Sans", sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI",
70
+ Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji";
71
+ }
72
+
73
+ /* ── Tokens (tema escuro) ─────────────────────────────────────────────── */
74
+ .rootzz-layout[data-theme="dark"] {
75
+ --rzl-primary: #4770eb;
76
+ --rzl-primary-hover: #5b82f0;
77
+ --rzl-primary-contrast: #ffffff;
78
+
79
+ --rzl-active-bg: rgba(71, 112, 235, 0.16);
80
+ --rzl-active-fg: var(--rzl-primary);
81
+
82
+ --rzl-bg: #141414;
83
+ --rzl-surface: #1c1c20;
84
+
85
+ --rzl-fg: #ffffff;
86
+ --rzl-fg-muted: rgba(255, 255, 255, 0.65);
87
+ --rzl-fg-subtle: rgba(255, 255, 255, 0.5);
88
+
89
+ --rzl-border: rgba(255, 255, 255, 0.12);
90
+ --rzl-hover-bg: rgba(255, 255, 255, 0.06);
91
+
92
+ --rzl-danger: #fb7185;
93
+ --rzl-danger-bg: rgba(251, 113, 133, 0.14);
94
+ --rzl-badge-bg: #e11d48;
95
+ --rzl-badge-fg: #ffffff;
96
+ --rzl-overlay: rgba(0, 0, 0, 0.6);
97
+ }
98
+
99
+ /* Acessibilidade: sem animação para quem pede menos movimento. */
100
+ @media (prefers-reduced-motion: reduce) {
101
+ .rootzz-layout {
102
+ --rzl-duration: 0.01ms;
103
+ }
104
+ }
105
+
106
+ /* ── Reset mínimo, ESCOPADO ───────────────────────────────────────────── */
107
+ .rootzz-layout,
108
+ .rootzz-layout *,
109
+ .rootzz-layout *::before,
110
+ .rootzz-layout *::after {
111
+ box-sizing: border-box;
112
+ border-width: 0;
113
+ border-style: solid;
114
+ border-color: var(--rzl-border);
115
+ }
116
+
117
+ .rootzz-layout {
118
+ /* Layout do shell: coluna com topbar no topo e (sidebar + conteúdo) abaixo. */
119
+ display: flex;
120
+ flex-direction: column;
121
+ height: 100vh;
122
+ height: 100dvh; /* respeita barras de navegação mobile quando suportado */
123
+ overflow: hidden;
124
+ background: var(--rzl-bg);
125
+ font-family: var(--rzl-font);
126
+ color: var(--rzl-fg);
127
+ line-height: 1.5;
128
+ -webkit-font-smoothing: subpixel-antialiased;
129
+ }
130
+
131
+ .rootzz-layout button {
132
+ font: inherit;
133
+ letter-spacing: inherit;
134
+ color: inherit;
135
+ background: transparent;
136
+ border: 0;
137
+ margin: 0;
138
+ padding: 0;
139
+ cursor: pointer;
140
+ }
141
+
142
+ .rootzz-layout button:disabled {
143
+ cursor: not-allowed;
144
+ }
145
+
146
+ .rootzz-layout a {
147
+ color: inherit;
148
+ text-decoration: none;
149
+ }
150
+
151
+ .rootzz-layout img,
152
+ .rootzz-layout svg {
153
+ display: block;
154
+ }
155
+
156
+ .rootzz-layout img {
157
+ max-width: 100%;
158
+ height: auto;
159
+ }
160
+
161
+ .rootzz-layout ul,
162
+ .rootzz-layout ol {
163
+ margin: 0;
164
+ padding: 0;
165
+ list-style: none;
166
+ }
167
+
168
+ .rootzz-layout input,
169
+ .rootzz-layout textarea,
170
+ .rootzz-layout select {
171
+ font: inherit;
172
+ color: inherit;
173
+ }
174
+
175
+ .rootzz-layout :focus-visible {
176
+ outline: 2px solid var(--rzl-primary);
177
+ outline-offset: 2px;
178
+ }
179
+
180
+ /* ── Shell ────────────────────────────────────────────────────────────── */
181
+ /* Linha abaixo da topbar: sidebar + conteúdo. */
182
+ .rootzz-layout__body {
183
+ display: flex;
184
+ flex: 1 1 0%;
185
+ min-height: 0;
186
+ overflow: hidden;
187
+ }
188
+
189
+ /* ── Topbar ───────────────────────────────────────────────────────────── */
190
+ .rootzz-topbar {
191
+ position: relative;
192
+ z-index: var(--rzl-z-topbar);
193
+ display: flex;
194
+ flex-shrink: 0;
195
+ align-items: center;
196
+ gap: 0.5rem;
197
+ height: var(--rzl-topbar-height);
198
+ padding: 0 0.75rem;
199
+ background: var(--rzl-surface);
200
+ border-bottom: 1px solid var(--rzl-border);
201
+ }
202
+
203
+ .rootzz-topbar__left {
204
+ display: flex;
205
+ flex-shrink: 0;
206
+ align-items: center;
207
+ gap: 0.25rem;
208
+ min-width: 0;
209
+ }
210
+
211
+ .rootzz-topbar__center {
212
+ display: flex;
213
+ flex: 1 1 0%;
214
+ justify-content: center;
215
+ min-width: 0;
216
+ }
217
+
218
+ /* Wrapper da busca: escondido no mobile, visível a partir de md. */
219
+ .rootzz-topbar__search {
220
+ display: none;
221
+ width: 100%;
222
+ max-width: 28rem;
223
+ }
224
+
225
+ .rootzz-topbar__right {
226
+ display: flex;
227
+ flex-shrink: 0;
228
+ align-items: center;
229
+ gap: 0.125rem;
230
+ }
231
+
232
+ /* Botão de menu (hambúrguer): só no mobile. Especificidade dupla
233
+ (.rootzz-icon-button.rootzz-topbar__menu-button) para vencer a regra base
234
+ .rootzz-icon-button (display:inline-flex), que vem depois na folha. */
235
+ .rootzz-icon-button.rootzz-topbar__menu-button {
236
+ display: inline-flex;
237
+ }
238
+
239
+ @media (min-width: 640px) {
240
+ .rootzz-topbar {
241
+ padding: 0 1rem;
242
+ }
243
+ .rootzz-topbar__right {
244
+ gap: 0.25rem;
245
+ }
246
+ }
247
+
248
+ @media (min-width: 768px) {
249
+ .rootzz-topbar__search {
250
+ display: block;
251
+ }
252
+ .rootzz-icon-button.rootzz-topbar__menu-button {
253
+ display: none;
254
+ }
255
+ }
256
+
257
+ /* ── Brand (apps + logo) ──────────────────────────────────────────────── */
258
+ .rootzz-brand {
259
+ display: flex;
260
+ align-items: center;
261
+ gap: 0.375rem;
262
+ min-width: 0;
263
+ }
264
+
265
+ .rootzz-brand__logo {
266
+ display: flex;
267
+ align-items: center;
268
+ min-width: 0;
269
+ padding-left: 0.25rem;
270
+ }
271
+
272
+ .rootzz-brand__logo-link {
273
+ display: inline-flex;
274
+ align-items: center;
275
+ }
276
+
277
+ .rootzz-brand__logo-img {
278
+ width: 20px;
279
+ object-fit: contain;
280
+ }
281
+
282
+ /* Marca de aplicação (prop `application`): logo + nome, link clicável. */
283
+ .rootzz-brand__app {
284
+ display: inline-flex;
285
+ align-items: center;
286
+ gap: 0.5rem;
287
+ min-width: 0;
288
+ }
289
+
290
+ .rootzz-brand__app img {
291
+ max-height: 35px;
292
+ }
293
+
294
+ .rootzz-brand__app-icon {
295
+ height: 20px;
296
+ width: auto;
297
+ object-fit: contain;
298
+ flex-shrink: 0;
299
+ }
300
+
301
+ .rootzz-brand__app-name {
302
+ /* No mobile, só o logo. O nome aparece a partir de sm. */
303
+ display: none;
304
+ min-width: 0;
305
+ font-size: 1.125rem;
306
+ font-weight: 400;
307
+ color: var(--rzl-fg);
308
+ overflow: hidden;
309
+ text-overflow: ellipsis;
310
+ white-space: nowrap;
311
+ }
312
+
313
+ @media (min-width: 640px) {
314
+ .rootzz-brand__app-name {
315
+ display: block;
316
+ }
317
+ }
318
+
319
+ /* ── IconButton ───────────────────────────────────────────────────────── */
320
+ .rootzz-icon-button {
321
+ position: relative;
322
+ display: inline-flex;
323
+ flex-shrink: 0;
324
+ align-items: center;
325
+ justify-content: center;
326
+ border-radius: 9999px;
327
+ color: var(--rzl-fg-muted);
328
+ transition: background-color var(--rzl-duration) var(--rzl-ease),
329
+ color var(--rzl-duration) var(--rzl-ease);
330
+ }
331
+
332
+ .rootzz-icon-button:hover {
333
+ background: var(--rzl-hover-bg);
334
+ color: var(--rzl-fg);
335
+ }
336
+
337
+ .rootzz-icon-button:disabled {
338
+ opacity: 0.5;
339
+ }
340
+
341
+ .rootzz-icon-button:disabled:hover {
342
+ background: transparent;
343
+ }
344
+
345
+ .rootzz-icon-button__badge {
346
+ position: absolute;
347
+ display: flex;
348
+ align-items: center;
349
+ justify-content: center;
350
+ border-radius: 9999px;
351
+ background: var(--rzl-badge-bg);
352
+ color: var(--rzl-badge-fg);
353
+ font-weight: 500;
354
+ box-shadow: 0 0 0 2px var(--rzl-surface);
355
+ }
356
+
357
+ .rootzz-icon-button__badge--dot {
358
+ top: 0.5rem;
359
+ right: 0.5rem;
360
+ height: 0.5rem;
361
+ width: 0.5rem;
362
+ }
363
+
364
+ .rootzz-icon-button__badge--count {
365
+ top: 0.25rem;
366
+ right: 0.25rem;
367
+ height: 18px;
368
+ min-width: 18px;
369
+ padding: 0 0.25rem;
370
+ font-size: 11px;
371
+ line-height: 1;
372
+ }
373
+
374
+ /* ── SearchBar ────────────────────────────────────────────────────────── */
375
+ .rootzz-search {
376
+ display: flex;
377
+ align-items: center;
378
+ gap: 0.5rem;
379
+ height: 2.5rem;
380
+ width: 100%;
381
+ padding: 0 0.75rem;
382
+ border: 1px solid var(--rzl-border);
383
+ border-radius: var(--rzl-radius);
384
+ background: var(--rzl-bg);
385
+ color: var(--rzl-fg-muted);
386
+ transition: border-color var(--rzl-duration) var(--rzl-ease);
387
+ }
388
+
389
+ .rootzz-search:focus-within {
390
+ border-color: var(--rzl-primary);
391
+ }
392
+
393
+ .rootzz-search__icon {
394
+ flex-shrink: 0;
395
+ }
396
+
397
+ .rootzz-search__input {
398
+ width: 100%;
399
+ min-width: 0;
400
+ appearance: none;
401
+ border: 0;
402
+ background: transparent;
403
+ font-size: 0.875rem;
404
+ color: var(--rzl-fg);
405
+ outline: none;
406
+ }
407
+
408
+ .rootzz-search__input::placeholder {
409
+ color: var(--rzl-fg-subtle);
410
+ }
411
+
412
+ .rootzz-search__input::-webkit-search-cancel-button {
413
+ display: none;
414
+ }
415
+
416
+ .rootzz-search__shortcut {
417
+ flex-shrink: 0;
418
+ padding: 0.125rem 0.375rem;
419
+ border: 1px solid var(--rzl-border);
420
+ border-radius: var(--rzl-radius);
421
+ font-size: 0.75rem;
422
+ color: var(--rzl-fg-subtle);
423
+ }
424
+
425
+ /* ── Dropdown ─────────────────────────────────────────────────────────── */
426
+ .rootzz-dropdown {
427
+ position: relative;
428
+ display: inline-flex;
429
+ }
430
+
431
+ .rootzz-dropdown__panel {
432
+ position: absolute;
433
+ top: 100%;
434
+ margin-top: 0.5rem;
435
+ z-index: var(--rzl-z-dropdown);
436
+ transform-origin: top;
437
+ padding: 0.375rem 0;
438
+ border: 1px solid var(--rzl-border);
439
+ border-radius: var(--rzl-radius-lg);
440
+ background: var(--rzl-surface);
441
+ box-shadow: var(--rzl-shadow-lg);
442
+ transition: opacity var(--rzl-duration) var(--rzl-ease),
443
+ transform var(--rzl-duration) var(--rzl-ease);
444
+ }
445
+
446
+ .rootzz-dropdown__panel--start {
447
+ left: 0;
448
+ }
449
+
450
+ .rootzz-dropdown__panel--end {
451
+ right: 0;
452
+ }
453
+
454
+ .rootzz-dropdown__panel--active {
455
+ opacity: 1;
456
+ transform: translateY(0);
457
+ }
458
+
459
+ .rootzz-dropdown__panel--inactive {
460
+ pointer-events: none;
461
+ opacity: 0;
462
+ transform: translateY(-0.25rem);
463
+ }
464
+
465
+ /* ── AppsMenu ─────────────────────────────────────────────────────────── */
466
+ .rootzz-apps {
467
+ padding: 0.5rem;
468
+ }
469
+
470
+ .rootzz-apps__title {
471
+ padding: 0.25rem 0.5rem 0.5rem;
472
+ font-size: 0.75rem;
473
+ font-weight: 600;
474
+ text-transform: uppercase;
475
+ letter-spacing: 0.025em;
476
+ color: var(--rzl-fg-subtle);
477
+ }
478
+
479
+ .rootzz-apps__status {
480
+ padding: 1.5rem 0.5rem;
481
+ text-align: center;
482
+ font-size: 0.875rem;
483
+ color: var(--rzl-fg-muted);
484
+ }
485
+
486
+ .rootzz-apps__grid {
487
+ display: grid;
488
+ grid-template-columns: repeat(3, minmax(0, 1fr));
489
+ gap: 0.25rem;
490
+ max-height: 60vh;
491
+ overflow: auto;
492
+ }
493
+
494
+ .rootzz-apps__item {
495
+ display: flex;
496
+ flex-direction: column;
497
+ align-items: center;
498
+ gap: 0.5rem;
499
+ padding: 0.75rem;
500
+ border-radius: var(--rzl-radius);
501
+ text-align: center;
502
+ transition: background-color var(--rzl-duration) var(--rzl-ease);
503
+ }
504
+
505
+ .rootzz-apps__item:hover {
506
+ background: var(--rzl-hover-bg);
507
+ }
508
+
509
+ .rootzz-apps__icon {
510
+ height: 2.25rem;
511
+ width: 2.25rem;
512
+ object-fit: contain;
513
+ }
514
+
515
+ .rootzz-apps__label {
516
+ font-size: 0.75rem;
517
+ font-weight: 500;
518
+ line-height: 1.25;
519
+ color: var(--rzl-fg);
520
+ }
521
+
522
+ /* ── UserMenu ─────────────────────────────────────────────────────────── */
523
+ .rootzz-user {
524
+ display: flex;
525
+ align-items: center;
526
+ gap: 0.5rem;
527
+ max-width: 220px;
528
+ padding: 0.25rem 0.5rem 0.25rem 0.25rem;
529
+ border-radius: 9999px;
530
+ transition: background-color var(--rzl-duration) var(--rzl-ease);
531
+ }
532
+
533
+ .rootzz-user:hover {
534
+ background: var(--rzl-hover-bg);
535
+ }
536
+
537
+ .rootzz-user__name {
538
+ display: none;
539
+ min-width: 0;
540
+ font-size: 0.875rem;
541
+ font-weight: 500;
542
+ color: var(--rzl-fg);
543
+ overflow: hidden;
544
+ text-overflow: ellipsis;
545
+ white-space: nowrap;
546
+ }
547
+
548
+ .rootzz-user__chevron {
549
+ display: none;
550
+ flex-shrink: 0;
551
+ color: var(--rzl-fg-subtle);
552
+ }
553
+
554
+ @media (min-width: 640px) {
555
+ .rootzz-user__name,
556
+ .rootzz-user__chevron {
557
+ display: block;
558
+ }
559
+ }
560
+
561
+ .rootzz-avatar {
562
+ display: flex;
563
+ flex-shrink: 0;
564
+ align-items: center;
565
+ justify-content: center;
566
+ border-radius: 9999px;
567
+ object-fit: cover;
568
+ }
569
+
570
+ .rootzz-avatar--initials {
571
+ background: var(--rzl-primary);
572
+ color: var(--rzl-primary-contrast);
573
+ font-size: 0.75rem;
574
+ font-weight: 600;
575
+ }
576
+
577
+ .rootzz-user-panel__header {
578
+ display: flex;
579
+ align-items: center;
580
+ gap: 0.625rem;
581
+ padding: 0.25rem 0.75rem 0.5rem;
582
+ }
583
+
584
+ .rootzz-user-panel__info {
585
+ min-width: 0;
586
+ }
587
+
588
+ .rootzz-user-panel__name {
589
+ font-size: 0.875rem;
590
+ font-weight: 600;
591
+ color: var(--rzl-fg);
592
+ overflow: hidden;
593
+ text-overflow: ellipsis;
594
+ white-space: nowrap;
595
+ }
596
+
597
+ .rootzz-user-panel__email {
598
+ font-size: 0.75rem;
599
+ color: var(--rzl-fg-muted);
600
+ overflow: hidden;
601
+ text-overflow: ellipsis;
602
+ white-space: nowrap;
603
+ }
604
+
605
+ .rootzz-menu-item {
606
+ display: flex;
607
+ align-items: center;
608
+ gap: 0.625rem;
609
+ width: 100%;
610
+ padding: 0.5rem 0.75rem;
611
+ text-align: left;
612
+ font-size: 0.875rem;
613
+ color: var(--rzl-fg);
614
+ transition: background-color var(--rzl-duration) var(--rzl-ease);
615
+ }
616
+
617
+ .rootzz-menu-item:hover {
618
+ background: var(--rzl-hover-bg);
619
+ }
620
+
621
+ .rootzz-menu-item--danger {
622
+ color: var(--rzl-danger);
623
+ }
624
+
625
+ .rootzz-menu-item--danger:hover {
626
+ background: var(--rzl-danger-bg);
627
+ }
628
+
629
+ .rootzz-menu-item--disabled {
630
+ pointer-events: none;
631
+ opacity: 0.5;
632
+ }
633
+
634
+ .rootzz-menu-item__icon {
635
+ display: flex;
636
+ flex-shrink: 0;
637
+ align-items: center;
638
+ justify-content: center;
639
+ height: 1rem;
640
+ width: 1rem;
641
+ }
642
+
643
+ .rootzz-menu-item__label {
644
+ overflow: hidden;
645
+ text-overflow: ellipsis;
646
+ white-space: nowrap;
647
+ }
648
+
649
+ /* Divisor genérico de painel (apps/user). */
650
+ .rootzz-divider {
651
+ height: 1px;
652
+ margin: 0.25rem 0;
653
+ background: var(--rzl-border);
654
+ }
655
+
656
+ /* ── ThemeToggle ──────────────────────────────────────────────────────── */
657
+ .rootzz-theme-toggle {
658
+ position: relative;
659
+ height: 1.25rem;
660
+ width: 1.25rem;
661
+ }
662
+
663
+ .rootzz-theme-toggle__icon {
664
+ position: absolute;
665
+ inset: 0;
666
+ transition: opacity var(--rzl-duration) var(--rzl-ease),
667
+ transform var(--rzl-duration) var(--rzl-ease);
668
+ }
669
+
670
+ .rootzz-theme-toggle__icon--visible {
671
+ opacity: 1;
672
+ transform: rotate(0deg);
673
+ }
674
+
675
+ .rootzz-theme-toggle__icon--hidden {
676
+ opacity: 0;
677
+ transform: rotate(-90deg);
678
+ }
679
+
680
+ /* ── Content ──────────────────────────────────────────────────────────── */
681
+ .rootzz-content {
682
+ flex: 1 1 0%;
683
+ min-height: 0;
684
+ overflow-y: auto;
685
+ background: var(--rzl-bg);
686
+ color: var(--rzl-fg);
687
+ }
688
+
689
+ .rootzz-content__inner {
690
+ margin: 0 auto;
691
+ width: 100%;
692
+ }
693
+
694
+ .rootzz-content__inner--max {
695
+ max-width: var(--rzl-content-max-width);
696
+ }
697
+
698
+ .rootzz-content__inner--padded {
699
+ padding: 1.5rem 1rem;
700
+ }
701
+
702
+ @media (min-width: 640px) {
703
+ .rootzz-content__inner--padded {
704
+ padding: 1.5rem;
705
+ }
706
+ }
707
+
708
+ /* ── Overlay ──────────────────────────────────────────────────────────── */
709
+ .rootzz-overlay {
710
+ position: fixed;
711
+ inset: 0;
712
+ z-index: var(--rzl-z-overlay);
713
+ background: var(--rzl-overlay);
714
+ transition: opacity var(--rzl-duration) var(--rzl-ease);
715
+ }
716
+
717
+ .rootzz-overlay--active {
718
+ opacity: 1;
719
+ }
720
+
721
+ .rootzz-overlay--inactive {
722
+ opacity: 0;
723
+ }
724
+
725
+ @media (min-width: 768px) {
726
+ .rootzz-overlay {
727
+ display: none;
728
+ }
729
+ }
730
+
731
+ /* ── Sidebar ──────────────────────────────────────────────────────────── */
732
+ /* Desktop: coluna estática (escondida no mobile). */
733
+ .rootzz-sidebar {
734
+ display: none;
735
+ }
736
+
737
+ @media (min-width: 768px) {
738
+ .rootzz-sidebar {
739
+ display: flex;
740
+ width: var(--rzl-sidebar-width);
741
+ flex-shrink: 0;
742
+ }
743
+ }
744
+
745
+ /* Mobile: drawer off-canvas (escondido no desktop). */
746
+ .rootzz-drawer {
747
+ position: fixed;
748
+ left: 0;
749
+ top: 0;
750
+ z-index: var(--rzl-z-drawer);
751
+ display: flex;
752
+ flex-direction: column;
753
+ height: 100%;
754
+ width: var(--rzl-sidebar-width);
755
+ max-width: 85vw;
756
+ background: var(--rzl-surface);
757
+ box-shadow: var(--rzl-shadow-xl);
758
+ transform: translateX(-100%);
759
+ transition: transform var(--rzl-duration) var(--rzl-ease);
760
+ }
761
+
762
+ .rootzz-drawer--open {
763
+ transform: translateX(0);
764
+ }
765
+
766
+ @media (min-width: 768px) {
767
+ .rootzz-drawer {
768
+ display: none;
769
+ }
770
+ }
771
+
772
+ .rootzz-drawer__header {
773
+ display: flex;
774
+ flex-shrink: 0;
775
+ align-items: center;
776
+ justify-content: space-between;
777
+ height: var(--rzl-topbar-height);
778
+ padding: 0 0.75rem;
779
+ border-bottom: 1px solid var(--rzl-border);
780
+ }
781
+
782
+ .rootzz-drawer__title {
783
+ padding-left: 0.25rem;
784
+ font-size: 0.875rem;
785
+ font-weight: 600;
786
+ color: var(--rzl-fg);
787
+ overflow: hidden;
788
+ text-overflow: ellipsis;
789
+ white-space: nowrap;
790
+ }
791
+
792
+ .rootzz-drawer__body {
793
+ flex: 1 1 0%;
794
+ min-height: 0;
795
+ }
796
+
797
+ /* Navegação interna (compartilhada entre coluna e drawer). */
798
+ .rootzz-nav {
799
+ display: flex;
800
+ flex-direction: column;
801
+ height: 100%;
802
+ min-height: 0;
803
+ width: 100%;
804
+ background: var(--rzl-surface);
805
+ }
806
+
807
+ .rootzz-nav__header {
808
+ flex-shrink: 0;
809
+ padding: 1.25rem 0.75rem 0;
810
+ }
811
+
812
+ .rootzz-nav__scroll {
813
+ flex: 1 1 0%;
814
+ min-height: 0;
815
+ overflow-y: auto;
816
+ padding: 1.25rem;
817
+ }
818
+
819
+ .rootzz-nav__list {
820
+ display: flex;
821
+ flex-direction: column;
822
+ gap: 0.125rem;
823
+ }
824
+
825
+ .rootzz-nav__footer {
826
+ flex-shrink: 0;
827
+ padding: 0.75rem;
828
+ border-top: 1px solid var(--rzl-border);
829
+ }
830
+
831
+ .rootzz-nav__divider {
832
+ height: 1px;
833
+ margin: 0.5rem 0;
834
+ background: var(--rzl-border);
835
+ }
836
+
837
+ /* ── SidebarItem ──────────────────────────────────────────────────────── */
838
+ .rootzz-sidebar-item {
839
+ display: flex;
840
+ align-items: center;
841
+ gap: 0.75rem;
842
+ height: 30px;
843
+ padding-left: 0.75rem;
844
+ padding-right: 0.5rem;
845
+ border-radius: var(--rzl-radius);
846
+ text-align: left;
847
+ font-size: 16px;
848
+ color: var(--rzl-fg);
849
+ transition: background-color var(--rzl-duration) var(--rzl-ease),
850
+ color var(--rzl-duration) var(--rzl-ease);
851
+ }
852
+
853
+ .rootzz-sidebar-item:hover {
854
+ background: var(--rzl-hover-bg);
855
+ }
856
+
857
+ /* Itens dentro de grupos: pill mais estreito que o pai. */
858
+ .rootzz-sidebar-item--nested {
859
+ margin-left: 0.5rem;
860
+ margin-right: 0.5rem;
861
+ }
862
+
863
+ /* Especificidade dupla (.item.item--active) para vencer a base .rootzz-sidebar-item
864
+ independentemente da ordem na folha. Texto do item ativo na cor primária. */
865
+ .rootzz-sidebar-item.rootzz-sidebar-item--active {
866
+ background: var(--rzl-active-bg);
867
+ color: var(--rzl-active-fg);
868
+ }
869
+
870
+ .rootzz-sidebar-item.rootzz-sidebar-item--active:hover {
871
+ background: var(--rzl-active-bg);
872
+ color: var(--rzl-active-fg);
873
+ }
874
+
875
+ .rootzz-sidebar-item--disabled {
876
+ pointer-events: none;
877
+ opacity: 0.5;
878
+ }
879
+
880
+ .rootzz-sidebar-item__icon {
881
+ display: flex;
882
+ flex-shrink: 0;
883
+ align-items: center;
884
+ justify-content: center;
885
+ height: 1.25rem;
886
+ width: 1.25rem;
887
+ color: var(--rzl-fg-muted);
888
+ }
889
+
890
+ .rootzz-sidebar-item.rootzz-sidebar-item--active .rootzz-sidebar-item__icon {
891
+ color: var(--rzl-active-fg);
892
+ }
893
+
894
+ .rootzz-sidebar-item__label {
895
+ flex: 1 1 0%;
896
+ min-width: 0;
897
+ letter-spacing: 0.25px;
898
+ overflow: hidden;
899
+ text-overflow: ellipsis;
900
+ white-space: nowrap;
901
+ }
902
+
903
+ .rootzz-sidebar-item__badge {
904
+ flex-shrink: 0;
905
+ }
906
+
907
+ /* ── SidebarGroup ─────────────────────────────────────────────────────── */
908
+ .rootzz-sidebar-group {
909
+ margin-top: 0.5rem;
910
+ }
911
+
912
+ .rootzz-sidebar-group:first-child {
913
+ margin-top: 0;
914
+ }
915
+
916
+ .rootzz-sidebar-group__trigger {
917
+ width: 100%;
918
+ border-radius: var(--rzl-radius);
919
+ transition: background-color var(--rzl-duration) var(--rzl-ease);
920
+ }
921
+
922
+ .rootzz-sidebar-group__trigger:hover {
923
+ background: var(--rzl-hover-bg);
924
+ }
925
+
926
+ .rootzz-sidebar-group__header {
927
+ display: flex;
928
+ align-items: center;
929
+ gap: 0.5rem;
930
+ height: 2rem;
931
+ /* Alinhado ao padding do item simples (.rootzz-sidebar-item). */
932
+ padding-left: 0.75rem;
933
+ padding-right: 0.5rem;
934
+ font-size: 0.875rem;
935
+ font-weight: 400;
936
+ text-transform: uppercase;
937
+ letter-spacing: 0.05em;
938
+ color: var(--rzl-fg-subtle);
939
+ }
940
+
941
+ .rootzz-sidebar-group__icon {
942
+ display: flex;
943
+ flex-shrink: 0;
944
+ align-items: center;
945
+ justify-content: center;
946
+ height: 1rem;
947
+ width: 1rem;
948
+ }
949
+
950
+ .rootzz-sidebar-group__label {
951
+ flex: 1 1 0%;
952
+ min-width: 0;
953
+ text-align: left;
954
+ overflow: hidden;
955
+ text-overflow: ellipsis;
956
+ white-space: nowrap;
957
+ }
958
+
959
+ .rootzz-sidebar-group__label--active {
960
+ color: var(--rzl-active-fg);
961
+ }
962
+
963
+ .rootzz-sidebar-group__chevron {
964
+ flex-shrink: 0;
965
+ transition: transform var(--rzl-duration) var(--rzl-ease);
966
+ }
967
+
968
+ .rootzz-sidebar-group__chevron--open {
969
+ transform: rotate(180deg);
970
+ }
971
+
972
+ /* Região colapsável: altura animada via grid-template-rows (0fr → 1fr). */
973
+ .rootzz-sidebar-group__region {
974
+ display: grid;
975
+ grid-template-rows: 0fr;
976
+ transition: grid-template-rows var(--rzl-duration) var(--rzl-ease);
977
+ }
978
+
979
+ .rootzz-sidebar-group__region--open {
980
+ grid-template-rows: 1fr;
981
+ }
982
+
983
+ .rootzz-sidebar-group__clip {
984
+ overflow: hidden;
985
+ }
986
+
987
+ .rootzz-sidebar-group__items {
988
+ display: flex;
989
+ flex-direction: column;
990
+ gap: 0.125rem;
991
+ margin-top: 0.125rem;
992
+ }
993
+
994
+ /* ── Utilitário: scroll sem barra visível ─────────────────────────────── */
995
+ .rootzz-scrollbar-none {
996
+ scrollbar-width: none;
997
+ -ms-overflow-style: none;
998
+ }
999
+
1000
+ .rootzz-scrollbar-none::-webkit-scrollbar {
1001
+ width: 0;
1002
+ height: 0;
1003
+ display: none;
1004
+ }