@@ -25,17 +25,16 @@ const DRAG_CLASS = "vaul-dragging";
25
25
26
26
export type DrawerDirection = "left" | "right" | "top" | "bottom" ;
27
27
28
- export type OnDragEvent = PointerEvent | TouchEvent ;
29
- export type OnDrag = ( event : OnDragEvent , percentageDragged : number ) => void ;
28
+ export type OnDrag = ( event : PointerEvent , percentageDragged : number ) => void ;
30
29
export type OnReleaseEvent = PointerEvent | MouseEvent | TouchEvent ;
31
- export type OnRelease = ( event : OnReleaseEvent , open : boolean ) => void ;
30
+ export type OnRelease = ( event : PointerEvent , open : boolean ) => void ;
32
31
33
32
type DrawerRootStateProps = ReadableBoxedValues < {
34
33
closeThreshold : number ;
35
34
shouldScaleBackground : boolean ;
36
35
scrollLockTimeout : number ;
37
- snapPoints : ( string | number ) [ ] ;
38
- fadeFromIndex : number ;
36
+ snapPoints : ( string | number ) [ ] | null ;
37
+ fadeFromIndex : number | null ;
39
38
fixed : boolean ;
40
39
dismissible : boolean ;
41
40
direction : DrawerDirection ;
@@ -52,7 +51,7 @@ type DrawerRootStateProps = ReadableBoxedValues<{
52
51
} > &
53
52
WritableBoxedValues < {
54
53
open : boolean ;
55
- activeSnapPoint : number | string | null ;
54
+ activeSnapPoint : number | string | null | undefined ;
56
55
} > ;
57
56
58
57
class DrawerRootState {
@@ -279,7 +278,7 @@ class DrawerRootState {
279
278
} ) ;
280
279
}
281
280
282
- setActiveSnapPoint = ( newValue : number | string | null ) => {
281
+ setActiveSnapPoint = ( newValue : number | string | null | undefined ) => {
283
282
this . activeSnapPoint . current = newValue ;
284
283
} ;
285
284
@@ -625,7 +624,7 @@ class DrawerRootState {
625
624
this . dragEndTime = new Date ( ) ;
626
625
} ;
627
626
628
- onRelease = ( e : PointerEvent | MouseEvent ) => {
627
+ onRelease = ( e : PointerEvent ) => {
629
628
const drawerNode = this . drawerNode ;
630
629
if ( ! this . isDragging || ! drawerNode ) return ;
631
630
@@ -806,6 +805,15 @@ class DrawerRootState {
806
805
}
807
806
} ;
808
807
808
+ onOpenChange = ( o : boolean ) => {
809
+ if ( ! o ) {
810
+ this . closeDrawer ( ) ;
811
+ } else {
812
+ this . hasBeenOpened = true ;
813
+ this . setOpen ( true ) ;
814
+ }
815
+ } ;
816
+
809
817
createContentState = ( props : DrawerContentStateProps ) => {
810
818
return new DrawerContentState ( props , this ) ;
811
819
} ;
@@ -939,9 +947,9 @@ class DrawerContentState {
939
947
( ) =>
940
948
( {
941
949
id : this . #id. current ,
942
- "vaul-drawer" : "" ,
943
- "vaul-drawer-direction" : this . root . direction . current ,
944
- "vaul-drawer-visible" : this . root . visible ? "true" : "false" ,
950
+ "data- vaul-drawer" : "" ,
951
+ "data- vaul-drawer-direction" : this . root . direction . current ,
952
+ "data- vaul-drawer-visible" : this . root . visible ? "true" : "false" ,
945
953
style : this . #style,
946
954
onpointerdown : this . #onpointerdown,
947
955
onpointermove : this . #onpointermove,
@@ -975,19 +983,19 @@ class DrawerOverlayState {
975
983
} ) ;
976
984
}
977
985
978
- #onmouseup = ( e : MouseEvent ) => {
986
+ #onmouseup = ( e : PointerEvent ) => {
979
987
this . root . onRelease ( e ) ;
980
988
} ;
981
989
982
990
props = $derived . by (
983
991
( ) =>
984
992
( {
985
993
id : this . #id. current ,
986
- "vaul-drawer-visible" : this . root . visible ? "true" : "false" ,
987
- "vaul-overlay" : "" ,
988
- "vaul-snap-points" :
994
+ "data- vaul-drawer-visible" : this . root . visible ? "true" : "false" ,
995
+ "data- vaul-overlay" : "" ,
996
+ "data- vaul-snap-points" :
989
997
this . root . open . current && this . #hasSnapPoints ? "true" : "false" ,
990
- "vaul-snap-points-overlay" :
998
+ "data- vaul-snap-points-overlay" :
991
999
this . root . open . current && this . root . snapPointState . shouldFade
992
1000
? "true"
993
1001
: "false" ,
@@ -1003,13 +1011,14 @@ type DrawerHandleStateProps = WithRefProps &
1003
1011
1004
1012
const LONG_HANDLE_PRESS_TIMEOUT = 250 ;
1005
1013
const DOUBLE_TAP_TIMEOUT = 120 ;
1014
+
1006
1015
class DrawerHandleState {
1007
1016
#id: DrawerHandleStateProps [ "id" ] ;
1008
1017
#ref: DrawerHandleStateProps [ "ref" ] ;
1009
1018
#preventCycle: DrawerHandleStateProps [ "preventCycle" ] ;
1010
1019
root : DrawerRootState ;
1011
- #closeTimeoutId: number | null = null ;
1012
- #shouldCancelInteractions = false ;
1020
+ #closeTimeoutId: number | null = $state ( null ) ;
1021
+ #shouldCancelInteractions = $state ( false ) ;
1013
1022
1014
1023
constructor ( props : DrawerHandleStateProps , root : DrawerRootState ) {
1015
1024
this . #id = props . id ;
@@ -1039,7 +1048,7 @@ class DrawerHandleState {
1039
1048
1040
1049
handleCycleSnapPoints = ( ) => {
1041
1050
// prevent accidental taps while resizing drawer
1042
- if ( this . root . isDragging || this . #preventCycle || this . #shouldCancelInteractions) {
1051
+ if ( this . root . isDragging || this . #preventCycle. current || this . #shouldCancelInteractions) {
1043
1052
this . handleCancelInteraction ( ) ;
1044
1053
return ;
1045
1054
}
@@ -1114,8 +1123,8 @@ class DrawerHandleState {
1114
1123
( ) =>
1115
1124
( {
1116
1125
id : this . #id. current ,
1117
- "vaul-drawer-visible" : this . root . visible ? "true" : "false" ,
1118
- "vaul-handle" : "" ,
1126
+ "data- vaul-drawer-visible" : this . root . visible ? "true" : "false" ,
1127
+ "data- vaul-handle" : "" ,
1119
1128
"aria-hidden" : "true" ,
1120
1129
onclick : this . #onclick,
1121
1130
ondblclick : this . #ondblclick,
@@ -1128,7 +1137,7 @@ class DrawerHandleState {
1128
1137
hitAreaProps = $derived . by (
1129
1138
( ) =>
1130
1139
( {
1131
- "vaul-handle-hitarea" : "" ,
1140
+ "data- vaul-handle-hitarea" : "" ,
1132
1141
"aria-hidden" : "true" ,
1133
1142
} ) as const
1134
1143
) ;
0 commit comments