22
33module RubyUI
44 class CollapsiableSidebar < Base
5- def initialize ( side : :left , variant : :sidebar , **attrs )
5+ SIDEBAR_WIDTH = '16rem'
6+ SIDEBAR_WIDTH_ICON = '3rem'
7+
8+ def initialize ( side : :left , variant : :sidebar , collapsible : :offcanvas , open : true , **attrs )
69 @side = side
710 @variant = variant
11+ @collapsible = collapsible
12+ @open = open
813 super ( **attrs )
914 end
1015
1116 def view_template ( &)
1217 div ( **attrs ) do
13- div ( **gap_element_attrs )
14- div ( **content_wrapper_attrs ) do
15- div ( **content_attrs , &)
18+ MobileSidebar ( side : @side , &)
19+ div ( **wrapper_attrs ) do
20+ div ( **gap_element_attrs )
21+ div ( **content_wrapper_attrs ) do
22+ div ( **content_attrs , &)
23+ end
1624 end
1725 end
1826 end
@@ -21,17 +29,32 @@ def view_template(&)
2129
2230 def default_attrs
2331 {
24- class : "peer hidden text-sidebar-foreground md:block"
32+ class : 'group/sidebar' ,
33+ style : "--sidebar-width: #{ SIDEBAR_WIDTH } ; --sidebar-width-icon: #{ SIDEBAR_WIDTH_ICON } ;" ,
34+ data : {
35+ state : @open ? 'expanded' : 'collapsed' ,
36+ collapsible : @open ? '' : @collapsible ,
37+ variant : @variant ,
38+ side : @side ,
39+ collapsible_kind : @collapsible ,
40+ ruby_ui__sidebar_target : 'sidebar'
41+ }
42+ }
43+ end
44+
45+ def wrapper_attrs
46+ {
47+ class : 'peer hidden text-sidebar-foreground md:block'
2548 }
2649 end
2750
2851 def gap_element_attrs
2952 {
3053 class : [
31- " relative w-[--sidebar-width] bg-transparent transition-[width]" ,
32- " duration-200 ease-linear" ,
33- " group-data-[collapsible=offcanvas]/sidebar:w-0" ,
34- " group-data-[side=right]/sidebar:rotate-180" ,
54+ ' relative w-[--sidebar-width] bg-transparent transition-[width]' ,
55+ ' duration-200 ease-linear' ,
56+ ' group-data-[collapsible=offcanvas]/sidebar:w-0' ,
57+ ' group-data-[side=right]/sidebar:rotate-180' ,
3558 variant_classes
3659 ]
3760 }
@@ -40,8 +63,8 @@ def gap_element_attrs
4063 def content_wrapper_attrs
4164 {
4265 class : [
43- " fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width]" ,
44- " transition-[left,right,width] duration-200 ease-linear md:flex" ,
66+ ' fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width]' ,
67+ ' transition-[left,right,width] duration-200 ease-linear md:flex' ,
4568 content_wrapper_side_classes ,
4669 content_wrapper_variant_classes
4770 ]
@@ -51,37 +74,37 @@ def content_wrapper_attrs
5174 def content_attrs
5275 {
5376 class : [
54- " flex h-full w-full flex-col bg-sidebar" ,
55- " group-data-[variant=floating]/sidebar:rounded-lg" ,
56- " group-data-[variant=floating]/sidebar:border" ,
57- " group-data-[variant=floating]/sidebar:border-sidebar-border" ,
58- " group-data-[variant=floating]/sidebar:shadow"
77+ ' 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'
5982 ] ,
6083 data : {
61- sidebar : " sidebar"
84+ sidebar : ' sidebar'
6285 }
6386 }
6487 end
6588
6689 def variant_classes
6790 if %i[ floating inset ] . include? ( @variant )
68- " group-data-[collapsible=icon]/sidebar:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]"
91+ ' group-data-[collapsible=icon]/sidebar:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]'
6992 else
70- " group-data-[collapsible=icon]/sidebar:w-[--sidebar-width-icon]"
93+ ' group-data-[collapsible=icon]/sidebar:w-[--sidebar-width-icon]'
7194 end
7295 end
7396
7497 def content_wrapper_side_classes
75- return " left-0 group-data-[collapsible=offcanvas]/sidebar:left-[calc(var(--sidebar-width)*-1)]" if @side == :left
98+ return ' left-0 group-data-[collapsible=offcanvas]/sidebar:left-[calc(var(--sidebar-width)*-1)]' if @side == :left
7699
77- " right-0 group-data-[collapsible=offcanvas]/sidebar:right-[calc(var(--sidebar-width)*-1)]"
100+ ' right-0 group-data-[collapsible=offcanvas]/sidebar:right-[calc(var(--sidebar-width)*-1)]'
78101 end
79102
80103 def content_wrapper_variant_classes
81104 if %i[ floating inset ] . include? ( @variant )
82- " p-2 group-data-[collapsible=icon]/sidebar:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]"
105+ ' p-2 group-data-[collapsible=icon]/sidebar:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]'
83106 else
84- " group-data-[collapsible=icon]/sidebar:w-[--sidebar-width-icon] group-data-[side=left]/sidebar:border-r group-data-[side=right]/sidebar:border-l"
107+ ' group-data-[collapsible=icon]/sidebar:w-[--sidebar-width-icon] group-data-[side=left]/sidebar:border-r group-data-[side=right]/sidebar:border-l'
85108 end
86109 end
87110 end
0 commit comments