22
33module RubyUI
44 class CollapsiableSidebar < Base
5- SIDEBAR_WIDTH = '16rem'
6- SIDEBAR_WIDTH_ICON = '3rem'
7-
85 def initialize ( side : :left , variant : :sidebar , collapsible : :offcanvas , open : true , **attrs )
96 @side = side
107 @variant = variant
@@ -14,9 +11,9 @@ def initialize(side: :left, variant: :sidebar, collapsible: :offcanvas, open: tr
1411 end
1512
1613 def view_template ( &)
17- div ( ** attrs ) do
18- MobileSidebar ( side : @side , &)
19- div ( **wrapper_attrs ) do
14+ div do
15+ MobileSidebar ( side : @side , ** attrs , &)
16+ div ( **mix ( sidebar_attrs , attrs ) ) do
2017 div ( **gap_element_attrs )
2118 div ( **content_wrapper_attrs ) do
2219 div ( **content_attrs , &)
@@ -27,10 +24,9 @@ def view_template(&)
2724
2825 private
2926
30- def default_attrs
27+ def sidebar_attrs
3128 {
32- class : 'group/sidebar' ,
33- style : "--sidebar-width: #{ SIDEBAR_WIDTH } ; --sidebar-width-icon: #{ SIDEBAR_WIDTH_ICON } ;" ,
29+ class : 'group peer hidden text-sidebar-foreground md:block' ,
3430 data : {
3531 state : @open ? 'expanded' : 'collapsed' ,
3632 collapsible : @open ? '' : @collapsible ,
@@ -42,19 +38,13 @@ def default_attrs
4238 }
4339 end
4440
45- def wrapper_attrs
46- {
47- class : 'peer hidden text-sidebar-foreground md:block'
48- }
49- end
50-
5141 def gap_element_attrs
5242 {
5343 class : [
5444 'relative w-[--sidebar-width] bg-transparent transition-[width]' ,
5545 'duration-200 ease-linear' ,
56- 'group-data-[collapsible=offcanvas]/sidebar :w-0' ,
57- 'group-data-[side=right]/sidebar :rotate-180' ,
46+ 'group-data-[collapsible=offcanvas]:w-0' ,
47+ 'group-data-[side=right]:rotate-180' ,
5848 variant_classes
5949 ]
6050 }
@@ -75,10 +65,10 @@ def content_attrs
7565 {
7666 class : [
7767 'flex h-full w-full flex-col bg-sidebar' ,
78- 'group-data-[variant=floating]/sidebar :rounded-lg' ,
79- 'group-data-[variant=floating]/sidebar :border' ,
80- 'group-data-[variant=floating]/sidebar :border-sidebar-border' ,
81- 'group-data-[variant=floating]/sidebar :shadow'
68+ 'group-data-[variant=floating]:rounded-lg' ,
69+ 'group-data-[variant=floating]:border' ,
70+ 'group-data-[variant=floating]:border-sidebar-border' ,
71+ 'group-data-[variant=floating]:shadow'
8272 ] ,
8373 data : {
8474 sidebar : 'sidebar'
@@ -88,23 +78,23 @@ def content_attrs
8878
8979 def variant_classes
9080 if %i[ floating inset ] . include? ( @variant )
91- 'group-data-[collapsible=icon]/sidebar :w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]'
81+ 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]'
9282 else
93- 'group-data-[collapsible=icon]/sidebar :w-[--sidebar-width-icon]'
83+ 'group-data-[collapsible=icon]:w-[--sidebar-width-icon]'
9484 end
9585 end
9686
9787 def content_wrapper_side_classes
98- return 'left-0 group-data-[collapsible=offcanvas]/sidebar :left-[calc(var(--sidebar-width)*-1)]' if @side == :left
88+ return 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]' if @side == :left
9989
100- 'right-0 group-data-[collapsible=offcanvas]/sidebar :right-[calc(var(--sidebar-width)*-1)]'
90+ 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]'
10191 end
10292
10393 def content_wrapper_variant_classes
10494 if %i[ floating inset ] . include? ( @variant )
105- 'p-2 group-data-[collapsible=icon]/sidebar :w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]'
95+ 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]'
10696 else
107- 'group-data-[collapsible=icon]/sidebar :w-[--sidebar-width-icon] group-data-[side=left]/sidebar :border-r group-data-[side=right]/sidebar :border-l'
97+ 'group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l'
10898 end
10999 end
110100 end
0 commit comments