@kushagradhawan/kookie-ui 0.1.24 → 0.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/components.css +316 -658
  2. package/dist/cjs/components/index.d.ts +1 -0
  3. package/dist/cjs/components/index.d.ts.map +1 -1
  4. package/dist/cjs/components/index.js +1 -1
  5. package/dist/cjs/components/index.js.map +3 -3
  6. package/dist/cjs/components/sidebar.d.ts.map +1 -1
  7. package/dist/cjs/components/sidebar.js +1 -1
  8. package/dist/cjs/components/sidebar.js.map +2 -2
  9. package/dist/cjs/components/user-card.d.ts +12 -0
  10. package/dist/cjs/components/user-card.d.ts.map +1 -0
  11. package/dist/cjs/components/user-card.js +2 -0
  12. package/dist/cjs/components/user-card.js.map +7 -0
  13. package/dist/cjs/components/user-card.props.d.ts +63 -0
  14. package/dist/cjs/components/user-card.props.d.ts.map +1 -0
  15. package/dist/cjs/components/user-card.props.js +2 -0
  16. package/dist/cjs/components/user-card.props.js.map +7 -0
  17. package/dist/esm/components/index.d.ts +1 -0
  18. package/dist/esm/components/index.d.ts.map +1 -1
  19. package/dist/esm/components/index.js +1 -1
  20. package/dist/esm/components/index.js.map +3 -3
  21. package/dist/esm/components/sidebar.d.ts.map +1 -1
  22. package/dist/esm/components/sidebar.js +1 -1
  23. package/dist/esm/components/sidebar.js.map +2 -2
  24. package/dist/esm/components/user-card.d.ts +12 -0
  25. package/dist/esm/components/user-card.d.ts.map +1 -0
  26. package/dist/esm/components/user-card.js +2 -0
  27. package/dist/esm/components/user-card.js.map +7 -0
  28. package/dist/esm/components/user-card.props.d.ts +63 -0
  29. package/dist/esm/components/user-card.props.d.ts.map +1 -0
  30. package/dist/esm/components/user-card.props.js +2 -0
  31. package/dist/esm/components/user-card.props.js.map +7 -0
  32. package/package.json +1 -1
  33. package/src/components/_internal/base-menu.css +5 -5
  34. package/src/components/image.css +1 -1
  35. package/src/components/index.css +1 -0
  36. package/src/components/index.tsx +1 -0
  37. package/src/components/sidebar.css +333 -245
  38. package/src/components/sidebar.tsx +26 -5
  39. package/src/components/user-card.css +29 -0
  40. package/src/components/user-card.props.tsx +45 -0
  41. package/src/components/user-card.tsx +102 -0
  42. package/src/styles/tokens/transition.css +5 -5
  43. package/styles.css +321 -663
  44. package/tokens/base.css +5 -5
  45. package/tokens.css +5 -5
@@ -1,3 +1,5 @@
1
+ @import './_internal/base-menu.css';
2
+
1
3
  /* Sidebar Provider - handles positioning */
2
4
  .rt-SidebarProvider {
3
5
  /* Positioning based on side */
@@ -120,11 +122,11 @@
120
122
  display: flex;
121
123
  align-items: center;
122
124
  gap: var(--space-2);
123
- min-height: var(--sidebar-item-height);
124
- padding-top: var(--sidebar-item-padding-y);
125
- padding-bottom: var(--sidebar-item-padding-y);
126
- padding-left: var(--sidebar-item-padding-left);
127
- padding-right: var(--sidebar-item-padding-right);
125
+ min-height: var(--base-menu-item-height);
126
+ padding-top: var(--base-menu-item-padding-y);
127
+ padding-bottom: var(--base-menu-item-padding-y);
128
+ padding-left: var(--base-menu-item-padding-left);
129
+ padding-right: var(--base-menu-item-padding-right);
128
130
  box-sizing: border-box;
129
131
  position: relative;
130
132
  outline: none;
@@ -165,8 +167,8 @@
165
167
  flex-direction: row;
166
168
  align-items: center;
167
169
  gap: var(--space-2);
168
- padding: var(--sidebar-content-padding);
169
- min-height: var(--sidebar-item-height);
170
+ padding: var(--base-menu-content-padding);
171
+ min-height: var(--base-menu-item-height);
170
172
 
171
173
  /* Make MenuButtons expand to full width */
172
174
  & :where(.rt-SidebarMenuButton) {
@@ -229,10 +231,10 @@
229
231
 
230
232
  /* Sidebar Content - based on rt-BaseMenuContent */
231
233
  .rt-SidebarContent {
232
- --scrollarea-scrollbar-vertical-margin-top: var(--sidebar-content-padding);
233
- --scrollarea-scrollbar-vertical-margin-bottom: var(--sidebar-content-padding);
234
- --scrollarea-scrollbar-horizontal-margin-left: var(--sidebar-content-padding);
235
- --scrollarea-scrollbar-horizontal-margin-right: var(--sidebar-content-padding);
234
+ --scrollarea-scrollbar-vertical-margin-top: var(--base-menu-content-padding);
235
+ --scrollarea-scrollbar-vertical-margin-bottom: var(--base-menu-content-padding);
236
+ --scrollarea-scrollbar-horizontal-margin-left: var(--base-menu-content-padding);
237
+ --scrollarea-scrollbar-horizontal-margin-right: var(--base-menu-content-padding);
236
238
 
237
239
  display: flex;
238
240
  flex-direction: column;
@@ -240,6 +242,12 @@
240
242
  box-sizing: border-box;
241
243
  min-height: 0; /* Critical for flex children to shrink */
242
244
 
245
+ /* Override base menu styling that's not appropriate for sidebars */
246
+ background-color: transparent !important;
247
+ backdrop-filter: none !important;
248
+ box-shadow: none !important;
249
+ border-radius: 0 !important;
250
+
243
251
  /* Ensure ScrollArea takes full height within SidebarContent */
244
252
  & :where(.rt-ScrollAreaRoot) {
245
253
  flex: 1;
@@ -261,8 +269,7 @@
261
269
  flex: 1;
262
270
  display: flex;
263
271
  flex-direction: column;
264
- gap: var(--space-2); /* Use gap for consistent spacing */
265
- padding: var(--sidebar-content-padding);
272
+ padding: var(--base-menu-content-padding);
266
273
  box-sizing: border-box;
267
274
  list-style: none;
268
275
  margin: 0;
@@ -278,30 +285,28 @@
278
285
  list-style: none;
279
286
  }
280
287
 
281
- /* Sidebar Menu Button - matches rt-BaseMenuItem */
288
+ /* Sidebar Menu Button - inherit from BaseMenuItem */
282
289
  .rt-SidebarMenuButton {
283
290
  display: flex;
284
291
  align-items: center;
285
- gap: var(--space-2);
286
- min-height: var(--sidebar-item-height);
287
- padding-top: var(--sidebar-item-padding-y);
288
- padding-bottom: var(--sidebar-item-padding-y);
289
- padding-left: var(--sidebar-item-padding-left);
290
- padding-right: var(--sidebar-item-padding-right);
292
+ gap: var(--space-2); /* Will be overridden by size-specific gap */
293
+ min-height: var(--base-menu-item-height);
294
+ padding-top: var(--base-menu-item-padding-y);
295
+ padding-bottom: var(--base-menu-item-padding-y);
296
+ padding-left: var(--base-menu-item-padding-left);
297
+ padding-right: var(--base-menu-item-padding-right);
291
298
  box-sizing: border-box;
292
299
  position: relative;
293
300
  outline: none;
294
- scroll-margin: var(--sidebar-content-padding) 0;
301
+ scroll-margin: var(--base-menu-content-padding) 0;
295
302
  background: none;
296
303
  border: none;
297
304
  width: 100%;
298
305
  text-align: left;
299
- border-radius: var(--radius-2);
306
+ border-radius: var(--radius-2); /* Will be overridden by size-specific radius */
300
307
 
301
- /* Transitions - similar to button but without transform */
302
- transition: background var(--duration-2) var(--ease-1),
303
- box-shadow var(--duration-2) var(--ease-1),
304
- filter var(--duration-2) var(--ease-1);
308
+ /* Transitions - inherit from base menu */
309
+ transition: var(--transition-menu);
305
310
 
306
311
  /* Fix sticky text highlighting after selection in Firefox */
307
312
  user-select: none;
@@ -330,8 +335,8 @@
330
335
  color: var(--accent-a11);
331
336
  }
332
337
 
333
- /* Gray text support */
334
- & :where(.rt-Text[data-accent-color='gray'], [data-accent-color='gray']) {
338
+ /* Gray text support - inherit from base menu */
339
+ & :where(.rt-Text[data-accent-color='gray'], [data-accent-color='gray']:not(.rt-Badge)) {
335
340
  color: var(--gray-a10);
336
341
  }
337
342
 
@@ -437,11 +442,11 @@
437
442
  display: flex;
438
443
  align-items: center;
439
444
  gap: var(--space-2);
440
- min-height: var(--sidebar-item-height);
441
- padding-top: var(--sidebar-item-padding-y);
442
- padding-bottom: var(--sidebar-item-padding-y);
443
- padding-left: var(--sidebar-item-padding-left);
444
- padding-right: var(--sidebar-item-padding-right);
445
+ min-height: var(--base-menu-item-height);
446
+ padding-top: var(--base-menu-item-padding-y);
447
+ padding-bottom: var(--base-menu-item-padding-y);
448
+ padding-left: var(--base-menu-item-padding-left);
449
+ padding-right: var(--base-menu-item-padding-right);
445
450
  box-sizing: border-box;
446
451
  position: relative;
447
452
  outline: none;
@@ -482,8 +487,8 @@
482
487
  flex-direction: row;
483
488
  align-items: center;
484
489
  gap: var(--space-2);
485
- padding: var(--sidebar-content-padding);
486
- min-height: var(--sidebar-item-height);
490
+ padding: var(--base-menu-content-padding);
491
+ min-height: var(--base-menu-item-height);
487
492
 
488
493
  /* Make MenuButtons expand to full width */
489
494
  & :where(.rt-SidebarMenuButton) {
@@ -550,37 +555,33 @@
550
555
  margin: var(--space-2) 0;
551
556
  }
552
557
 
553
- /* Sidebar Group Components - add spacing between groups */
558
+ /* Sidebar Group Components - identical to base menu */
554
559
  .rt-SidebarGroup {
555
- display: flex;
556
- flex-direction: column;
557
- flex-shrink: 0;
558
-
559
- /* Add spacing between groups without manual separators */
560
- &:where(:not(:first-child)) {
561
- margin-top: var(--space-4);
562
- }
560
+ /* No styling - purely semantic like BaseMenuGroup */
563
561
  }
564
562
 
565
563
  .rt-SidebarGroupLabel {
564
+ /* Inherit all BaseMenuLabel styles */
566
565
  display: flex;
567
566
  align-items: center;
568
- min-height: var(--sidebar-item-height);
569
- padding-top: var(--sidebar-item-padding-y);
570
- padding-bottom: var(--sidebar-item-padding-y);
571
- padding-left: var(--sidebar-item-padding-left);
572
- padding-right: var(--sidebar-item-padding-right);
567
+ min-height: var(--base-menu-item-height);
568
+ padding-top: var(--base-menu-item-padding-y);
569
+ padding-bottom: var(--base-menu-item-padding-y);
570
+ padding-left: var(--base-menu-item-padding-left);
571
+ padding-right: var(--base-menu-item-padding-right);
573
572
  box-sizing: border-box;
574
573
  color: var(--gray-a10);
575
574
  user-select: none;
576
575
  cursor: default;
577
- flex-shrink: 0;
576
+
577
+ /* Add margin-top when following menu items - identical to BaseMenuLabel */
578
+ :where(.rt-SidebarMenuItem) + & {
579
+ margin-top: var(--space-2);
580
+ }
578
581
  }
579
582
 
580
583
  .rt-SidebarGroupContent {
581
- display: flex;
582
- flex-direction: column;
583
- flex-shrink: 0;
584
+ /* No styling - purely semantic container */
584
585
  }
585
586
 
586
587
  /***************************************************************************************************
@@ -590,67 +591,38 @@
590
591
  ***************************************************************************************************/
591
592
 
592
593
  @breakpoints {
593
- /* Container sizing - padding and border radius like Card */
594
+ /* Container sizing - inherit from base menu */
594
595
  .rt-SidebarContainer {
595
596
  &:where(.rt-r-size-1) {
596
597
  --sidebar-base-padding: var(--space-3);
597
- /* Ensure header/footer menu buttons share the same sizing variables as content */
598
- --sidebar-content-padding: var(--space-1);
599
- --sidebar-item-padding-left: var(--space-2);
600
- --sidebar-item-padding-right: var(--space-2);
601
- --sidebar-item-padding-y: calc(var(--space-1) * 0.75);
602
- --sidebar-item-height: var(--space-5);
603
598
  }
604
599
  &:where(.rt-r-size-2) {
605
600
  --sidebar-base-padding: var(--space-4);
606
- /* Ensure header/footer menu buttons share the same sizing variables as content */
607
- --sidebar-content-padding: var(--space-2);
608
- --sidebar-item-padding-left: var(--space-3);
609
- --sidebar-item-padding-right: var(--space-3);
610
- --sidebar-item-padding-y: var(--space-1);
611
- --sidebar-item-height: var(--space-6);
612
601
  }
613
602
  }
614
603
 
615
- /* Content sizing - like base menu (dropdown menu) */
604
+ /* Content sizing - use base menu tokens directly */
616
605
  .rt-SidebarContent {
617
606
  &:where(.rt-r-size-1) {
618
- --sidebar-content-padding: var(--space-1);
619
- --sidebar-item-padding-left: calc(var(--space-5) / 1.2);
620
- --sidebar-item-padding-right: var(--space-2);
621
- --sidebar-item-padding-y: calc(var(--space-1) * 0.75);
622
- --sidebar-item-height: var(--space-5);
623
- border-radius: var(--radius-3);
624
-
625
- /* reset with :not:has so we still support browsers without :has */
626
- &:where(:not(:has(.rt-BaseMenuCheckboxItem, .rt-BaseMenuRadioItem))) {
627
- --sidebar-item-padding-left: var(--space-2);
628
- }
629
- &:where(:has(.rt-BaseMenuCheckboxItem, .rt-BaseMenuRadioItem)) {
630
- --sidebar-item-padding-left: calc(var(--space-5) / 1.2);
631
- }
607
+ --sidebar-content-padding: var(--base-menu-content-padding);
608
+ --sidebar-item-padding-left: var(--base-menu-item-padding-left);
609
+ --sidebar-item-padding-right: var(--base-menu-item-padding-right);
610
+ --sidebar-item-padding-y: var(--base-menu-item-padding-y);
611
+ --sidebar-item-height: var(--base-menu-item-height);
632
612
  }
633
613
  &:where(.rt-r-size-2) {
634
- --sidebar-content-padding: var(--space-2);
635
- --sidebar-item-padding-left: var(--space-3);
636
- --sidebar-item-padding-right: var(--space-3);
637
- --sidebar-item-padding-y: var(--space-1);
638
- --sidebar-item-height: var(--space-6);
639
- border-radius: var(--radius-4);
640
-
641
- /* reset with :not:has so we still support browsers without :has */
642
- &:where(:not(:has(.rt-BaseMenuCheckboxItem, .rt-BaseMenuRadioItem))) {
643
- --sidebar-item-padding-left: var(--space-3);
644
- }
645
- &:where(:has(.rt-BaseMenuCheckboxItem, .rt-BaseMenuRadioItem)) {
646
- --sidebar-item-padding-left: var(--space-5);
647
- }
614
+ --sidebar-content-padding: var(--base-menu-content-padding);
615
+ --sidebar-item-padding-left: var(--base-menu-item-padding-left);
616
+ --sidebar-item-padding-right: var(--base-menu-item-padding-right);
617
+ --sidebar-item-padding-y: var(--base-menu-item-padding-y);
618
+ --sidebar-item-height: var(--base-menu-item-height);
648
619
  }
649
620
  }
650
621
 
651
- /* Size-specific menu button styling - matches base menu items */
622
+ /* Size-specific menu button styling - inherit from base menu */
652
623
  .rt-SidebarContent:where(.rt-r-size-1) {
653
624
  & :where(.rt-SidebarMenuButton) {
625
+ gap: var(--component-gap-2);
654
626
  font-size: var(--font-size-1);
655
627
  line-height: var(--line-height-1);
656
628
  letter-spacing: var(--letter-spacing-1);
@@ -671,52 +643,15 @@
671
643
  flex-shrink: 0;
672
644
  margin-left: auto;
673
645
  }
674
-
675
- /* Group label sizing - matches base menu */
676
- & :where(.rt-SidebarGroupLabel) {
677
- font-size: var(--font-size-1);
678
- line-height: var(--line-height-1);
679
- letter-spacing: var(--letter-spacing-1);
680
- }
681
- }
682
-
683
- /* Header and footer styling for size 1 */
684
- .rt-SidebarContainer:where(.rt-r-size-1) {
685
- & :where(.rt-SidebarHeader .rt-SidebarMenuButton) {
686
- font-size: var(--font-size-1);
687
- line-height: var(--line-height-1);
688
- letter-spacing: var(--letter-spacing-1);
689
- border-radius: var(--radius-1);
690
-
691
- /* stylelint-disable-next-line selector-max-type */
692
- & :where(svg) {
693
- width: var(--content-icon-size-1);
694
- height: var(--content-icon-size-1);
695
- flex-shrink: 0;
696
- }
697
- }
698
-
699
- & :where(.rt-SidebarFooter .rt-SidebarMenuButton) {
700
- font-size: var(--font-size-1);
701
- line-height: var(--line-height-1);
702
- letter-spacing: var(--letter-spacing-1);
703
- border-radius: var(--radius-1);
704
-
705
- /* stylelint-disable-next-line selector-max-type */
706
- & :where(svg) {
707
- width: var(--content-icon-size-1);
708
- height: var(--content-icon-size-1);
709
- flex-shrink: 0;
710
- }
711
- }
712
646
  }
713
647
 
714
648
  .rt-SidebarContent:where(.rt-r-size-2) {
715
649
  & :where(.rt-SidebarMenuButton) {
650
+ gap: var(--component-gap-3);
716
651
  font-size: var(--font-size-2);
717
652
  line-height: var(--line-height-2);
718
653
  letter-spacing: var(--letter-spacing-2);
719
- border-radius: var(--radius-3);
654
+ border-radius: var(--radius-2);
720
655
 
721
656
  /* stylelint-disable-next-line selector-max-type */
722
657
  & :where(svg) {
@@ -733,45 +668,9 @@
733
668
  flex-shrink: 0;
734
669
  margin-left: auto;
735
670
  }
736
-
737
- /* Group label sizing - matches base menu */
738
- & :where(.rt-SidebarGroupLabel) {
739
- font-size: var(--font-size-2);
740
- line-height: var(--line-height-2);
741
- letter-spacing: var(--letter-spacing-2);
742
- }
743
671
  }
744
672
 
745
- /* Header and footer styling for size 2 */
746
- .rt-SidebarContainer:where(.rt-r-size-2) {
747
- & :where(.rt-SidebarHeader .rt-SidebarMenuButton) {
748
- font-size: var(--font-size-2);
749
- line-height: var(--line-height-2);
750
- letter-spacing: var(--letter-spacing-2);
751
- border-radius: var(--radius-3);
752
-
753
- /* stylelint-disable-next-line selector-max-type */
754
- & :where(svg) {
755
- width: var(--content-icon-size-2);
756
- height: var(--content-icon-size-2);
757
- flex-shrink: 0;
758
- }
759
- }
760
673
 
761
- & :where(.rt-SidebarFooter .rt-SidebarMenuButton) {
762
- font-size: var(--font-size-2);
763
- line-height: var(--line-height-2);
764
- letter-spacing: var(--letter-spacing-2);
765
- border-radius: var(--radius-3);
766
-
767
- /* stylelint-disable-next-line selector-max-type */
768
- & :where(svg) {
769
- width: var(--content-icon-size-2);
770
- height: var(--content-icon-size-2);
771
- flex-shrink: 0;
772
- }
773
- }
774
- }
775
674
  }
776
675
 
777
676
  /***************************************************************************************************
@@ -788,24 +687,24 @@
788
687
  border: none;
789
688
  }
790
689
  &:where(.rt-variant-soft) {
791
- /* Use solid accent for solid panels, alpha accent for translucent panels */
792
- background-color: var(--accent-2);
690
+ /* Use solid gray for solid panels, alpha gray for translucent panels */
691
+ background-color: var(--gray-2);
793
692
 
794
693
  /* Theme-level translucent override */
795
694
  :where([data-panel-background='translucent']) & {
796
- background-color: var(--accent-a2);
695
+ background-color: var(--gray-a2);
797
696
  backdrop-filter: var(--backdrop-filter-panel);
798
697
  }
799
698
 
800
699
  /* Component-level overrides (higher specificity) */
801
700
  &:where([data-panel-background='solid']) {
802
- background-color: var(--accent-2);
701
+ background-color: var(--gray-2);
803
702
  backdrop-filter: none;
804
703
  --backdrop-filter-components: none;
805
704
  }
806
705
 
807
706
  &:where([data-panel-background='translucent']) {
808
- background-color: var(--accent-a2);
707
+ background-color: var(--gray-a2);
809
708
  backdrop-filter: var(--backdrop-filter-panel);
810
709
  --backdrop-filter-panel: blur(var(--backdrop-blur-panel));
811
710
  --backdrop-filter-components: blur(var(--backdrop-blur-components));
@@ -822,52 +721,133 @@
822
721
 
823
722
  /* Menu Button Variants - Independent of Container */
824
723
 
825
- /* Menu Variant: Solid */
724
+ /* Menu Variant: Solid - EXACT match to base menu */
826
725
  .rt-SidebarHeader:where(.rt-menu-variant-solid),
827
726
  .rt-SidebarContent:where(.rt-menu-variant-solid),
828
727
  .rt-SidebarFooter:where(.rt-menu-variant-solid) {
829
- /* Active navigation state for solid variant */
830
- & :where(.rt-SidebarMenuButton[data-active]) {
728
+ /* Sub-trigger transitions - match base menu */
729
+ & :where(.rt-SidebarMenuSubTrigger) {
730
+ transition: var(--transition-menu);
731
+
732
+ /* Reduced motion support */
733
+ @media (prefers-reduced-motion: reduce) {
734
+ transition: none;
735
+ }
736
+
737
+ /* Remove backdrop-filter transitions in translucent mode to prevent flickering */
738
+ :where([data-panel-background='translucent']) & {
739
+ transition: background var(--duration-1) var(--ease-1), color var(--duration-2) var(--ease-1);
740
+ }
741
+ }
742
+
743
+ /* Sub-trigger open state - match base menu */
744
+ & :where(.rt-SidebarMenuSubTrigger[data-state='open']) {
745
+ /* Base state: solid gray for solid panels */
746
+ background-color: var(--gray-3);
747
+
748
+ /* Theme-level translucent override */
749
+ :where([data-panel-background='translucent']) & {
750
+ background-color: var(--gray-a3);
751
+ }
752
+
753
+ /* Component-level overrides (higher specificity) */
754
+ &:where([data-panel-background='solid']) {
755
+ background-color: var(--gray-3);
756
+ backdrop-filter: none;
757
+ --backdrop-filter-components: none;
758
+ }
759
+
760
+ &:where([data-panel-background='translucent']) {
761
+ background-color: var(--gray-a3);
762
+ }
763
+ }
764
+
765
+ /* Menu item transitions - match base menu */
766
+ & :where(.rt-SidebarMenuButton) {
767
+ /* Remove backdrop-filter transitions in translucent mode to prevent flickering */
768
+ :where([data-panel-background='translucent']) & {
769
+ transition: background var(--duration-1) var(--ease-1), color var(--duration-2) var(--ease-1);
770
+ }
771
+ }
772
+
773
+ /* Hover/highlighted state for solid variant - EXACT match to base menu */
774
+ & :where(.rt-SidebarMenuButton[data-highlighted]) {
831
775
  background-color: var(--accent-9);
832
776
  color: var(--accent-contrast);
833
777
 
834
- /* Force all text elements to inherit active color */
778
+ & :where(.rt-BaseMenuSubTriggerIcon) {
779
+ color: var(--accent-contrast);
780
+ }
781
+
782
+ /* Force all text elements to inherit hover color, including those with color="gray" */
835
783
  & :where(.rt-Text) {
836
784
  color: inherit !important;
837
785
  }
838
786
 
839
- & :where([data-accent-color='gray']) {
787
+ /* Also target any element with data-accent-color="gray" */
788
+ & :where([data-accent-color='gray']:not(.rt-Badge)) {
840
789
  color: inherit !important;
841
790
  }
842
791
  }
843
792
 
844
- /* Hover/highlighted state for solid variant */
845
- & :where(.rt-SidebarMenuButton[data-highlighted]) {
793
+ /* Active navigation state for solid variant - same as highlighted */
794
+ & :where(.rt-SidebarMenuButton[data-active]) {
846
795
  background-color: var(--accent-9);
847
796
  color: var(--accent-contrast);
848
797
 
849
- /* Force all text elements to inherit hover color */
798
+ /* Force all text elements to inherit active color */
850
799
  & :where(.rt-Text) {
851
800
  color: inherit !important;
852
801
  }
853
802
 
854
- & :where([data-accent-color='gray']) {
803
+ & :where([data-accent-color='gray']:not(.rt-Badge)) {
855
804
  color: inherit !important;
856
805
  }
857
806
  }
858
807
 
859
- /* High contrast support for solid variant */
808
+ /* High contrast support for solid variant - EXACT match to base menu */
860
809
  &:where(.rt-high-contrast) {
861
- & :where(.rt-SidebarMenuButton[data-active]),
862
810
  & :where(.rt-SidebarMenuButton[data-highlighted]) {
863
811
  background-color: var(--accent-12);
864
812
  color: var(--accent-1);
865
813
 
814
+ & :where(.rt-BaseMenuSubTriggerIcon) {
815
+ color: var(--accent-1);
816
+ }
817
+
818
+ /* Force all text elements to inherit hover color in high contrast mode */
819
+ & :where(.rt-Text) {
820
+ color: inherit !important;
821
+ }
822
+
823
+ /* Also target any element with data-accent-color="gray" in high contrast */
824
+ & :where([data-accent-color='gray']:not(.rt-Badge)) {
825
+ color: inherit !important;
826
+ }
827
+
828
+ &:where([data-accent-color]) {
829
+ background-color: var(--accent-9);
830
+ color: var(--accent-contrast);
831
+
832
+ & :where(.rt-Text) {
833
+ color: inherit !important;
834
+ }
835
+
836
+ & :where([data-accent-color='gray']:not(.rt-Badge)) {
837
+ color: inherit !important;
838
+ }
839
+ }
840
+ }
841
+
842
+ & :where(.rt-SidebarMenuButton[data-active]) {
843
+ background-color: var(--accent-12);
844
+ color: var(--accent-1);
845
+
866
846
  & :where(.rt-Text) {
867
847
  color: inherit !important;
868
848
  }
869
849
 
870
- & :where([data-accent-color='gray']) {
850
+ & :where([data-accent-color='gray']:not(.rt-Badge)) {
871
851
  color: inherit !important;
872
852
  }
873
853
 
@@ -879,7 +859,7 @@
879
859
  color: inherit !important;
880
860
  }
881
861
 
882
- & :where([data-accent-color='gray']) {
862
+ & :where([data-accent-color='gray']:not(.rt-Badge)) {
883
863
  color: inherit !important;
884
864
  }
885
865
  }
@@ -887,84 +867,109 @@
887
867
  }
888
868
  }
889
869
 
890
- /* Menu Variant: Soft */
870
+ /* Menu Variant: Soft - EXACT match to base menu */
891
871
  .rt-SidebarHeader:where(.rt-menu-variant-soft),
892
872
  .rt-SidebarContent:where(.rt-menu-variant-soft),
893
873
  .rt-SidebarFooter:where(.rt-menu-variant-soft) {
894
- /* Active navigation state for soft variant */
895
- & :where(.rt-SidebarMenuButton[data-active]) {
896
- /* Use solid accent for solid panels, alpha accent for translucent panels */
897
- background-color: var(--accent-3);
898
- color: var(--accent-12);
874
+ /* Sub-trigger transitions - match base menu */
875
+ & :where(.rt-SidebarMenuSubTrigger) {
876
+ transition: var(--transition-menu);
877
+
878
+ /* Reduced motion support */
879
+ @media (prefers-reduced-motion: reduce) {
880
+ transition: none;
881
+ }
882
+
883
+ /* Remove backdrop-filter transitions in translucent mode to prevent flickering */
884
+ :where([data-panel-background='translucent']) & {
885
+ transition: background var(--duration-1) var(--ease-1), color var(--duration-2) var(--ease-1);
886
+ }
887
+ }
899
888
 
889
+ /* Sub-trigger open state - match base menu */
890
+ & :where(.rt-SidebarMenuSubTrigger[data-state='open']) {
891
+ /* Base state: solid accent for solid panels */
892
+ background-color: var(--accent-3);
893
+
900
894
  /* Theme-level translucent override */
901
895
  :where([data-panel-background='translucent']) & {
902
896
  background-color: var(--accent-a3);
903
- color: var(--accent-a12);
904
- /* Only apply backdrop-filter if parent container doesn't have it (ghost variant) */
905
- backdrop-filter: var(--backdrop-filter-components);
906
897
  }
907
898
 
908
899
  /* Component-level overrides (higher specificity) */
909
- :where(.rt-SidebarContainer[data-panel-background='solid']) & {
900
+ &:where([data-panel-background='solid']) {
910
901
  background-color: var(--accent-3);
911
- color: var(--accent-12);
912
902
  backdrop-filter: none;
913
903
  --backdrop-filter-components: none;
914
904
  }
915
905
 
916
- :where(.rt-SidebarContainer[data-panel-background='translucent']) & {
906
+ &:where([data-panel-background='translucent']) {
917
907
  background-color: var(--accent-a3);
918
- color: var(--accent-a12);
919
- /* Only apply backdrop-filter if parent container doesn't have it (ghost variant) */
920
- backdrop-filter: var(--backdrop-filter-components);
921
- --backdrop-filter-components: blur(var(--backdrop-blur-components));
908
+ }
909
+ }
910
+
911
+ /* Menu item transitions - match base menu */
912
+ & :where(.rt-SidebarMenuButton) {
913
+ /* Remove backdrop-filter transitions in translucent mode to prevent flickering */
914
+ :where([data-panel-background='translucent']) & {
915
+ transition: background var(--duration-1) var(--ease-1), color var(--duration-2) var(--ease-1);
916
+ }
917
+ }
918
+
919
+ /* Hover/highlighted state for soft variant - EXACT match to base menu */
920
+ & :where(.rt-SidebarMenuButton[data-highlighted]) {
921
+ /* Base state: solid accent for solid panels */
922
+ background-color: var(--accent-4);
923
+
924
+ /* Theme-level translucent override */
925
+ :where([data-panel-background='translucent']) & {
926
+ background-color: var(--accent-a4);
922
927
  }
923
928
 
924
- /* Avoid double backdrop-filter on surface variant - container already has backdrop-filter */
925
- :where(.rt-SidebarContainer.rt-variant-surface) & {
929
+ /* Component-level overrides (higher specificity) */
930
+ &:where([data-panel-background='solid']) {
931
+ background-color: var(--accent-4);
926
932
  backdrop-filter: none;
933
+ --backdrop-filter-components: none;
934
+ }
935
+
936
+ &:where([data-panel-background='translucent']) {
937
+ background-color: var(--accent-a4);
927
938
  }
928
939
 
929
940
  /* In soft variant, improve contrast for gray text while maintaining hierarchy */
930
- & :where(.rt-Text[data-accent-color='gray'], [data-accent-color='gray']) {
941
+ & :where(.rt-Text[data-accent-color='gray'], [data-accent-color='gray']:not(.rt-Badge)) {
931
942
  color: var(--gray-11) !important;
932
943
  }
933
944
  }
934
945
 
935
- /* Hover/highlighted state for soft variant */
936
- & :where(.rt-SidebarMenuButton[data-highlighted]) {
937
- /* Use solid accent for solid panels, alpha accent for translucent panels */
946
+ /* Active navigation state for soft variant - use accent-3 like sub-trigger */
947
+ & :where(.rt-SidebarMenuButton[data-active]) {
948
+ /* Base state: solid accent for solid panels */
938
949
  background-color: var(--accent-3);
950
+ color: var(--accent-12);
939
951
 
940
952
  /* Theme-level translucent override */
941
953
  :where([data-panel-background='translucent']) & {
942
954
  background-color: var(--accent-a3);
943
- /* Only apply backdrop-filter if parent container doesn't have it (ghost variant) */
944
- backdrop-filter: var(--backdrop-filter-components);
955
+ color: var(--accent-a12);
945
956
  }
946
957
 
947
958
  /* Component-level overrides (higher specificity) */
948
- :where(.rt-SidebarContainer[data-panel-background='solid']) & {
959
+ &:where([data-panel-background='solid']) {
949
960
  background-color: var(--accent-3);
961
+ color: var(--accent-12);
950
962
  backdrop-filter: none;
951
963
  --backdrop-filter-components: none;
952
964
  }
953
965
 
954
- :where(.rt-SidebarContainer[data-panel-background='translucent']) & {
966
+ &:where([data-panel-background='translucent']) {
955
967
  background-color: var(--accent-a3);
956
- /* Only apply backdrop-filter if parent container doesn't have it (ghost variant) */
957
- backdrop-filter: var(--backdrop-filter-components);
958
- --backdrop-filter-components: blur(var(--backdrop-blur-components));
959
- }
960
-
961
- /* Avoid double backdrop-filter on surface variant - container already has backdrop-filter */
962
- :where(.rt-SidebarContainer.rt-variant-surface) & {
963
- backdrop-filter: none;
968
+ color: var(--accent-a12);
964
969
  }
965
970
 
966
971
  /* In soft variant, improve contrast for gray text while maintaining hierarchy */
967
- & :where(.rt-Text[data-accent-color='gray'], [data-accent-color='gray']) {
972
+ & :where(.rt-Text[data-accent-color='gray'], [data-accent-color='gray']:not(.rt-Badge)) {
968
973
  color: var(--gray-11) !important;
969
974
  }
970
975
  }
@@ -976,23 +981,115 @@
976
981
  margin-bottom: var(--space-1);
977
982
  }
978
983
 
979
- /* Collapsible behavior */
984
+ /* Collapsible behavior - INSTANT TOGGLE APPROACH */
985
+ .rt-SidebarRoot:where([data-collapsible="icon"]) {
986
+ /* No transitions - instant state changes for better UX */
987
+ transition: none;
988
+ overflow: hidden; /* Prevent content from spilling out when width is 0 */
989
+ flex-shrink: 0; /* Don't let flex container shrink this */
990
+ }
991
+
992
+ /* Exception: floating ghost sidebars need visible overflow for shadows */
993
+ .rt-SidebarContainer:where(.rt-variant-ghost[data-collapsible="icon"][data-type="floating"]) {
994
+ overflow: visible !important; /* Allow shadows to show - override the hidden overflow */
995
+ }
996
+
997
+ /* Collapsed state - instant width change, no layout escape */
980
998
  .rt-SidebarRoot:where([data-collapsible="icon"][data-state="collapsed"]) {
981
- transform: translateX(-100%);
982
- transition: transform var(--duration-3) var(--ease-2);
999
+ width: 0;
1000
+ min-width: 0; /* Allow width to go to 0 */
1001
+ opacity: 0; /* Hide content for accessibility */
1002
+ pointer-events: none; /* Disable interactions */
1003
+ /* Keep in layout flow - no position changes */
983
1004
  }
984
1005
 
1006
+ /* Expanded state */
985
1007
  .rt-SidebarRoot:where([data-collapsible="icon"][data-state="expanded"]) {
986
- transform: translateX(0);
987
- transition: transform var(--duration-3) var(--ease-2);
1008
+ width: var(--sidebar-width);
1009
+ min-width: var(--sidebar-width); /* Prevent shrinking */
1010
+ opacity: 1;
1011
+ pointer-events: auto;
988
1012
  }
989
1013
 
990
- /* Right-side sidebar adjustments */
991
- .rt-SidebarRoot:where([data-collapsible="icon"][data-state="collapsed"][data-side="right"]) {
992
- transform: translateX(100%);
1014
+ /* Container locking for stable layouts */
1015
+ .rt-SidebarRoot:where([data-collapsible="icon"][data-state="collapsed"]) {
1016
+ /* Ensure the collapsed sidebar doesn't affect sibling layout */
1017
+ flex-basis: 0;
1018
+ width: 0;
993
1019
  }
994
1020
 
995
- /* Reduced motion support for collapsible */
1021
+ .rt-SidebarRoot:where([data-collapsible="icon"][data-state="expanded"]) {
1022
+ flex-basis: var(--sidebar-width);
1023
+ width: var(--sidebar-width);
1024
+ }
1025
+
1026
+ /* Floating sidebars: Similar approach but can fully hide */
1027
+ .rt-SidebarRoot:where([data-collapsible="icon"][data-type="floating"]) {
1028
+ /* Same instant approach */
1029
+ transition: none;
1030
+ overflow: hidden; /* Default: prevent spillover */
1031
+ flex-shrink: 0;
1032
+ }
1033
+
1034
+ /* Exception: floating ghost sidebars need visible overflow for shadows */
1035
+ .rt-SidebarRoot:where([data-collapsible="icon"][data-type="floating"]:has(.rt-variant-ghost)) {
1036
+ overflow: visible; /* Allow shadows to show */
1037
+ }
1038
+
1039
+ /* Collapsed state - instant width change, no layout escape */
1040
+ .rt-SidebarRoot:where([data-collapsible="icon"][data-state="collapsed"]) {
1041
+ width: 0;
1042
+ min-width: 0;
1043
+ opacity: 0;
1044
+ pointer-events: none;
1045
+ /* For floating, we can add margin to create visual separation when expanded */
1046
+ margin: 0;
1047
+ }
1048
+
1049
+ .rt-SidebarRoot:where([data-collapsible="icon"][data-type="floating"][data-state="expanded"]) {
1050
+ width: var(--sidebar-width);
1051
+ min-width: var(--sidebar-width);
1052
+ opacity: 1;
1053
+ pointer-events: auto;
1054
+ /* Restore floating margins */
1055
+ margin: var(--space-2);
1056
+ /* Remove the width override - let margin work naturally */
1057
+ }
1058
+
1059
+ /* Content protection - prevent internal reflow */
1060
+ .rt-SidebarContainer:where([data-collapsible="icon"]) {
1061
+ /* Lock the content size to prevent internal shifting */
1062
+ width: var(--sidebar-width);
1063
+ min-width: var(--sidebar-width);
1064
+ flex-shrink: 0;
1065
+ }
1066
+
1067
+ .rt-SidebarContent:where([data-collapsible="icon"]) {
1068
+ /* Prevent content from reflowing */
1069
+ width: 100%;
1070
+ min-width: var(--sidebar-width);
1071
+ flex-shrink: 0;
1072
+ }
1073
+
1074
+ /* Mobile responsive behavior - hide completely */
1075
+ @media (max-width: 768px) {
1076
+ .rt-SidebarRoot {
1077
+ display: none;
1078
+ }
1079
+
1080
+ .rt-SidebarRoot:where([data-state="expanded"]) {
1081
+ display: flex;
1082
+ position: fixed;
1083
+ top: 0;
1084
+ left: 0;
1085
+ height: 100vh;
1086
+ width: var(--sidebar-width);
1087
+ z-index: 50;
1088
+ box-shadow: var(--shadow-6);
1089
+ }
1090
+ }
1091
+
1092
+ /* Reduced motion support - already no animations */
996
1093
  @media (prefers-reduced-motion: reduce) {
997
1094
  .rt-SidebarRoot:where([data-collapsible="icon"]) {
998
1095
  transition: none;
@@ -1008,22 +1105,13 @@
1008
1105
 
1009
1106
  /* Reduce right padding on menu buttons with trailing elements */
1010
1107
  .rt-SidebarMenuButton:where(:has(.rt-SidebarMenuShortcut, .rt-SidebarMenuBadge)) {
1011
- /* Size-specific right padding reduction */
1108
+ /* Use base menu padding tokens */
1012
1109
  :where(.rt-SidebarContent.rt-r-size-1) & {
1013
- padding-right: calc(var(--space-1) * 0.75); /* 3px - matches top/bottom padding */
1110
+ padding-right: var(--base-menu-item-padding-y); /* Matches top/bottom padding */
1014
1111
  }
1015
1112
 
1016
1113
  :where(.rt-SidebarContent.rt-r-size-2) & {
1017
- padding-right: var(--space-1); /* 4px - matches top/bottom padding */
1018
- }
1019
-
1020
- /* Also apply to header and footer menu buttons */
1021
- :where(.rt-SidebarContainer.rt-r-size-1) & {
1022
- padding-right: calc(var(--space-1) * 0.75); /* 3px - matches top/bottom padding */
1023
- }
1024
-
1025
- :where(.rt-SidebarContainer.rt-r-size-2) & {
1026
- padding-right: var(--space-1); /* 4px - matches top/bottom padding */
1114
+ padding-right: var(--base-menu-item-padding-y); /* Matches top/bottom padding */
1027
1115
  }
1028
1116
  }
1029
1117