99} from 'maverick.js/std' ;
1010
1111import { useMediaContext , type MediaContext } from '../../core/api/media-context' ;
12+ import { isTouchPinchEvent } from '../../utils/dom' ;
1213
1314/**
1415 * This component enables actions to be performed on the media based on user gestures.
@@ -54,10 +55,18 @@ export class Gesture extends Component<GestureProps, {}, GestureEvents> {
5455 eventType = eventType . split ( / ^ d b l / ) [ 1 ] as keyof HTMLElementEventMap ;
5556 }
5657
58+ if ( eventType === 'pointerup' || eventType === 'pointerdown' ) {
59+ const pointer = this . _media . $state . pointer ( ) ;
60+ if ( pointer === 'coarse' ) {
61+ eventType = eventType === 'pointerup' ? 'touchend' : 'touchstart' ;
62+ }
63+ }
64+
5765 listenEvent (
5866 this . _provider ,
5967 eventType as keyof HTMLElementEventMap ,
6068 this . _acceptEvent . bind ( this ) ,
69+ { passive : false } ,
6170 ) ;
6271 }
6372
@@ -66,8 +75,10 @@ export class Gesture extends Component<GestureProps, {}, GestureEvents> {
6675
6776 private _acceptEvent ( event : Event ) {
6877 if (
69- ! this . _inBounds ( event ) ||
70- ( isPointerEvent ( event ) && ( event . button !== 0 || this . _media . activeMenu ) )
78+ ( isPointerEvent ( event ) && ( event . button !== 0 || this . _media . activeMenu ) ) ||
79+ ( isTouchEvent ( event ) && this . _media . activeMenu ) ||
80+ isTouchPinchEvent ( event ) ||
81+ ! this . _inBounds ( event )
7182 ) {
7283 return ;
7384 }
@@ -76,7 +87,9 @@ export class Gesture extends Component<GestureProps, {}, GestureEvents> {
7687 event . MEDIA_GESTURE = true ;
7788 event . preventDefault ( ) ;
7889
79- const isDblEvent = peek ( this . $props . event ) ?. startsWith ( 'dbl' ) ;
90+ const eventType = peek ( this . $props . event ) ,
91+ isDblEvent = eventType ?. startsWith ( 'dbl' ) ;
92+
8093 if ( ! isDblEvent ) {
8194 if ( this . _presses === 0 ) {
8295 setTimeout ( ( ) => {
@@ -116,7 +129,7 @@ export class Gesture extends Component<GestureProps, {}, GestureEvents> {
116129 if ( ! this . el ) return false ;
117130
118131 if ( isPointerEvent ( event ) || isMouseEvent ( event ) || isTouchEvent ( event ) ) {
119- const touch = isTouchEvent ( event ) ? event . touches [ 0 ] : undefined ;
132+ const touch = isTouchEvent ( event ) ? event . changedTouches [ 0 ] ?? event . touches [ 0 ] : undefined ;
120133
121134 const clientX = touch ?. clientX ?? ( event as MouseEvent ) . clientX ;
122135 const clientY = touch ?. clientY ?? ( event as MouseEvent ) . clientY ;
0 commit comments