@@ -14,6 +14,18 @@ const isOnMobile = (element: HTMLDivElement) => {
14
14
const CSidebar = defineComponent ( {
15
15
name : 'CSidebar' ,
16
16
props : {
17
+ /**
18
+ * Sets if the color of text should be colored for a light or dark dark background.
19
+ *
20
+ * @values 'dark', light'
21
+ */
22
+ colorScheme : {
23
+ type : String ,
24
+ default : undefined ,
25
+ validator : ( value : string ) => {
26
+ return [ 'dark' , 'light' ] . includes ( value )
27
+ } ,
28
+ } ,
17
29
/**
18
30
* Make sidebar narrow.
19
31
*/
@@ -22,6 +34,17 @@ const CSidebar = defineComponent({
22
34
* Set sidebar to overlaid variant.
23
35
*/
24
36
overlaid : Boolean ,
37
+ /**
38
+ * Components placement, there’s no default placement.
39
+ * @values 'start', 'end'
40
+ */
41
+ placement : {
42
+ type : String ,
43
+ default : undefined ,
44
+ validator : ( value : string ) => {
45
+ return [ 'start' , 'end' ] . includes ( value )
46
+ } ,
47
+ } ,
25
48
/**
26
49
* Place sidebar in non-static positions.
27
50
*/
@@ -64,10 +87,16 @@ const CSidebar = defineComponent({
64
87
'visible-change' ,
65
88
] ,
66
89
setup ( props , { attrs, slots, emit } ) {
67
- const mobile = ref ( )
68
- const inViewport = ref ( )
69
90
const sidebarRef = ref ( )
70
- const visible = ref ( props . visible )
91
+
92
+ const inViewport = ref ( )
93
+ const mobile = ref ( )
94
+ const visibleMobile = ref ( false )
95
+ const visibleDesktop = ref (
96
+ props . visible !== undefined ? props . visible : props . overlaid ? false : true ,
97
+ )
98
+
99
+ // const visible = ref(props.visible)
71
100
72
101
watch ( inViewport , ( ) => {
73
102
emit ( 'visible-change' , inViewport . value )
@@ -76,11 +105,14 @@ const CSidebar = defineComponent({
76
105
77
106
watch (
78
107
( ) => props . visible ,
79
- ( ) => ( visible . value = props . visible ) ,
108
+ ( ) => props . visible !== undefined && handleVisibleChange ( props . visible ) ,
80
109
)
81
110
82
111
watch ( mobile , ( ) => {
83
- if ( mobile . value && visible . value ) visible . value = false
112
+ if ( mobile . value ) {
113
+ console . log ( 'mobile' )
114
+ visibleMobile . value = false
115
+ }
84
116
} )
85
117
86
118
onMounted ( ( ) => {
@@ -109,8 +141,17 @@ const CSidebar = defineComponent({
109
141
} )
110
142
} )
111
143
144
+ const handleVisibleChange = ( visible : boolean ) => {
145
+ if ( mobile . value ) {
146
+ visibleMobile . value = visible
147
+ return
148
+ }
149
+
150
+ visibleDesktop . value = visible
151
+ }
152
+
112
153
const handleHide = ( ) => {
113
- visible . value = false
154
+ handleVisibleChange ( false )
114
155
emit ( 'visible-change' , false )
115
156
}
116
157
@@ -146,13 +187,15 @@ const CSidebar = defineComponent({
146
187
class : [
147
188
'sidebar' ,
148
189
{
190
+ [ `sidebar-${ props . colorScheme } ` ] : props . colorScheme ,
149
191
'sidebar-narrow' : props . narrow ,
150
192
'sidebar-overlaid' : props . overlaid ,
193
+ [ `sidebar-${ props . placement } ` ] : props . placement ,
151
194
[ `sidebar-${ props . position } ` ] : props . position ,
152
195
[ `sidebar-${ props . size } ` ] : props . size ,
153
196
'sidebar-narrow-unfoldable' : props . unfoldable ,
154
- show : visible . value === true && mobile . value ,
155
- hide : visible . value === false && ! mobile . value ,
197
+ show : ( mobile . value && visibleMobile . value ) || ( props . overlaid && visibleDesktop . value ) ,
198
+ hide : visibleDesktop . value === false && ! mobile . value && ! props . overlaid ,
156
199
} ,
157
200
attrs . class ,
158
201
] ,
@@ -163,7 +206,7 @@ const CSidebar = defineComponent({
163
206
mobile . value &&
164
207
h ( CBackdrop , {
165
208
class : 'sidebar-backdrop' ,
166
- visible : props . visible ,
209
+ visible : visibleMobile . value ,
167
210
onClick : ( ) => handleHide ( ) ,
168
211
} ) ,
169
212
]
0 commit comments