@@ -57,8 +57,14 @@ export type CreateVaulProps = {
57
57
scrollLockTimeout ?: number ;
58
58
fixed ?: boolean ;
59
59
dismissible ?: boolean ;
60
- onDrag ?: ( event : SvelteEvent < PointerEvent , HTMLElement > , percentageDragged : number ) => void ;
61
- onRelease ?: ( event : SvelteEvent < PointerEvent | MouseEvent , HTMLElement > , open : boolean ) => void ;
60
+ onDrag ?: (
61
+ event : SvelteEvent < PointerEvent | TouchEvent , HTMLElement > ,
62
+ percentageDragged : number
63
+ ) => void ;
64
+ onRelease ?: (
65
+ event : SvelteEvent < PointerEvent | MouseEvent | TouchEvent , HTMLElement > ,
66
+ open : boolean
67
+ ) => void ;
62
68
modal ?: boolean ;
63
69
nested ?: boolean ;
64
70
onClose ?: ( ) => void ;
@@ -342,21 +348,19 @@ export function createVaul(props: CreateVaulProps) {
342
348
return true ;
343
349
}
344
350
345
- function onDrag ( event : SvelteEvent < PointerEvent , HTMLElement > ) {
351
+ function onDrag ( event : SvelteEvent < PointerEvent | TouchEvent , HTMLElement > ) {
346
352
if ( ! isDragging ) return ;
347
353
// We need to know how much of the drawer has been dragged in percentages so that we can transform background accordingly
348
- const draggedDistance = pointerStartY - event . screenY ;
354
+ const draggedDistance = getDistanceMoved ( pointerStartY , event ) ;
349
355
const isDraggingDown = draggedDistance > 0 ;
350
356
351
357
const $activeSnapPointIndex = get ( activeSnapPointIndex ) ;
352
358
const $snapPoints = get ( snapPoints ) ;
353
359
354
360
// Disallow dragging down to close when first snap point is the active one and dismissible prop is set to false.
355
361
if ( $snapPoints && $activeSnapPointIndex === 0 && ! get ( dismissible ) ) return ;
362
+ if ( ! isAllowedToDrag && ! shouldDrag ( event . target as HTMLElement , isDraggingDown ) ) return ;
356
363
357
- if ( ! isAllowedToDrag && ! shouldDrag ( event . target as HTMLElement , isDraggingDown ) ) {
358
- return ;
359
- }
360
364
const $drawerRef = get ( drawerRef ) ;
361
365
if ( ! $drawerRef ) return ;
362
366
@@ -390,7 +394,7 @@ export function createVaul(props: CreateVaulProps) {
390
394
391
395
// We need to capture last time when drag with scroll was triggered and have a timeout between
392
396
const absDraggedDistance = Math . abs ( draggedDistance ) ;
393
- const wrapper = document . querySelector ( "[data-vaul-drawer-wrapper]" ) ;
397
+
394
398
let percentageDragged = absDraggedDistance / drawerHeightRef ;
395
399
const snapPointPercentageDragged = getSnapPointsPercentageDragged (
396
400
absDraggedDistance ,
@@ -418,6 +422,7 @@ export function createVaul(props: CreateVaulProps) {
418
422
true
419
423
) ;
420
424
}
425
+ const wrapper = document . querySelector ( "[data-vaul-drawer-wrapper]" ) ;
421
426
422
427
if ( wrapper && $overlayRef && get ( shouldScaleBackground ) ) {
423
428
// Calculate percentageDragged as a fraction (0 to 1)
@@ -555,6 +560,7 @@ export function createVaul(props: CreateVaulProps) {
555
560
556
561
function closeDrawer ( withKeyboard : boolean = false ) {
557
562
if ( isClosing ) return ;
563
+
558
564
const $drawerRef = get ( drawerRef ) ;
559
565
if ( ! $drawerRef ) return ;
560
566
@@ -638,7 +644,7 @@ export function createVaul(props: CreateVaulProps) {
638
644
}
639
645
}
640
646
641
- function onRelease ( event : SvelteEvent < PointerEvent | MouseEvent , HTMLElement > ) {
647
+ function onRelease ( event : SvelteEvent < PointerEvent | MouseEvent | TouchEvent , HTMLElement > ) {
642
648
const $drawerRef = get ( drawerRef ) ;
643
649
if ( ! isDragging || ! $drawerRef ) return ;
644
650
@@ -664,7 +670,7 @@ export function createVaul(props: CreateVaulProps) {
664
670
if ( dragStartTime === null ) return ;
665
671
666
672
const timeTaken = dragEndTime . getTime ( ) - dragStartTime . getTime ( ) ;
667
- const distMoved = pointerStartY - event . screenY ;
673
+ const distMoved = getDistanceMoved ( pointerStartY , event ) ;
668
674
const velocity = Math . abs ( distMoved ) / timeTaken ;
669
675
670
676
if ( velocity > 0.05 ) {
@@ -766,7 +772,7 @@ export function createVaul(props: CreateVaulProps) {
766
772
}
767
773
768
774
function onNestedDrag (
769
- _ : SvelteEvent < PointerEvent | MouseEvent , HTMLElement > ,
775
+ _ : SvelteEvent < PointerEvent | MouseEvent | TouchEvent , HTMLElement > ,
770
776
percentageDragged : number
771
777
) {
772
778
if ( percentageDragged < 0 ) return ;
@@ -780,7 +786,10 @@ export function createVaul(props: CreateVaulProps) {
780
786
} ) ;
781
787
}
782
788
783
- function onNestedRelease ( _ : SvelteEvent < PointerEvent | MouseEvent , HTMLElement > , o : boolean ) {
789
+ function onNestedRelease (
790
+ _ : SvelteEvent < PointerEvent | MouseEvent | TouchEvent , HTMLElement > ,
791
+ o : boolean
792
+ ) {
784
793
const scale = o ? ( window . innerWidth - NESTED_DISPLACEMENT ) / window . innerWidth : 1 ;
785
794
const y = o ? - NESTED_DISPLACEMENT : 0 ;
786
795
@@ -839,3 +848,13 @@ export function dampenValue(v: number) {
839
848
function getScale ( ) {
840
849
return ( window . innerWidth - WINDOW_TOP_OFFSET ) / window . innerWidth ;
841
850
}
851
+
852
+ function getDistanceMoved (
853
+ pointerStartY : number ,
854
+ event : SvelteEvent < PointerEvent | MouseEvent | TouchEvent , HTMLElement >
855
+ ) {
856
+ if ( event instanceof TouchEvent ) {
857
+ return pointerStartY - event . changedTouches [ 0 ] . screenY ;
858
+ }
859
+ return pointerStartY - event . screenY ;
860
+ }
0 commit comments