@vielzeug/gesture 26.10.15 → 26.10.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,68 @@
1
- import{GestureConfigError as e}from"./errors.js";var t=500,n=8;function resolveDurationMs(n){if(n===void 0)return t;if(!Number.isFinite(n)||n<=0)throw new e(`durationMs must be a positive finite number, got: ${n}`);return n}function resolveSlopPx(t){if(t===void 0)return n;if(!Number.isFinite(t)||t<0)throw new e(`slopPx must be a non-negative finite number, got: ${t}`);return t}function createLongPress(e,t={}){let{disabled:n,durationMs:r,onLongPress:i,shouldStart:a,signal:o,slopPx:s}=t,c=resolveDurationMs(r),l=resolveSlopPx(s),u=new AbortController,d=null,f=null,p=null,m=!1,h=!1,isDisabled=()=>!!(typeof n==`function`?n():n),removeTracking=()=>{d&&=(d.removeEventListener(`pointermove`,onPointerMove,!0),d.removeEventListener(`pointerup`,onPointerUp,!0),d.removeEventListener(`pointercancel`,onPointerCancel,!0),d.removeEventListener(`visibilitychange`,onVisibilityChange),d.defaultView?.removeEventListener(`blur`,onWindowBlur),null)},clearHold=()=>{p&&clearTimeout(p),p=null,f=null,removeTracking()},fire=()=>{let t=f;p=null,f=null,removeTracking(),t&&(m=!0,i?.({event:t.event,pointerId:t.pointerId,pointerType:t.pointerType,target:e}))},cancel=()=>h||!f&&!p?!1:(clearHold(),!0),dispose=()=>{h||(h=!0,o?.removeEventListener(`abort`,dispose),u.abort(),clearHold(),e.removeEventListener(`pointerdown`,onPointerDown),e.removeEventListener(`click`,onClickCapture,!0))},matchesPointer=e=>f?.pointerId===e.pointerId,onVisibilityChange=()=>{d?.visibilityState===`hidden`&&cancel()},onWindowBlur=()=>{cancel()},onClickCapture=e=>{m&&(m=!1,e.preventDefault(),e.stopPropagation())},handlePointerDown=t=>{h||f||isDisabled()||!t.isPrimary||t.button!==0||(!a||a(t))&&(m=!1,f={event:t,pointerId:t.pointerId,pointerType:t.pointerType,startX:t.clientX,startY:t.clientY},d=e.ownerDocument,d.addEventListener(`pointermove`,onPointerMove,!0),d.addEventListener(`pointerup`,onPointerUp,!0),d.addEventListener(`pointercancel`,onPointerCancel,!0),d.addEventListener(`visibilitychange`,onVisibilityChange),d.defaultView?.addEventListener(`blur`,onWindowBlur),p=setTimeout(fire,c))},handlePointerMove=e=>{f&&matchesPointer(e)&&Math.hypot(e.clientX-f.startX,e.clientY-f.startY)>l&&clearHold()},handlePointerUp=e=>{matchesPointer(e)&&clearHold()},handlePointerCancel=e=>{matchesPointer(e)&&clearHold()},onPointerDown=e=>handlePointerDown(e),onPointerMove=e=>handlePointerMove(e),onPointerUp=e=>handlePointerUp(e),onPointerCancel=e=>handlePointerCancel(e);return e.addEventListener(`pointerdown`,onPointerDown),e.addEventListener(`click`,onClickCapture,!0),o?.aborted?dispose():o?.addEventListener(`abort`,dispose,{once:!0}),{get active(){return f!==null||p!==null},cancel,get disposalSignal(){return u.signal},dispose,get disposed(){return h},[Symbol.dispose]:dispose}}export{createLongPress,resolveDurationMs,resolveSlopPx};
1
+ import { GestureConfigError as e } from "./errors.js";
2
+ //#region src/long-press.ts
3
+ var t = 500, n = 8;
4
+ function resolveDurationMs(n) {
5
+ if (n === void 0) return t;
6
+ if (!Number.isFinite(n) || n <= 0) throw new e(`durationMs must be a positive finite number, got: ${n}`);
7
+ return n;
8
+ }
9
+ function resolveSlopPx(t) {
10
+ if (t === void 0) return n;
11
+ if (!Number.isFinite(t) || t < 0) throw new e(`slopPx must be a non-negative finite number, got: ${t}`);
12
+ return t;
13
+ }
14
+ function createLongPress(e, t = {}) {
15
+ let { disabled: n, durationMs: r, onLongPress: i, shouldStart: a, signal: o, slopPx: s } = t, c = resolveDurationMs(r), l = resolveSlopPx(s), u = new AbortController(), d = null, f = null, p = null, m = !1, h = !1, isDisabled = () => !!(typeof n == "function" ? n() : n), removeTracking = () => {
16
+ d &&= (d.removeEventListener("pointermove", onPointerMove, !0), d.removeEventListener("pointerup", onPointerUp, !0), d.removeEventListener("pointercancel", onPointerCancel, !0), d.removeEventListener("visibilitychange", onVisibilityChange), d.defaultView?.removeEventListener("blur", onWindowBlur), null);
17
+ }, clearHold = () => {
18
+ p && clearTimeout(p), p = null, f = null, removeTracking();
19
+ }, fire = () => {
20
+ let t = f;
21
+ p = null, f = null, removeTracking(), t && (m = !0, i?.({
22
+ event: t.event,
23
+ pointerId: t.pointerId,
24
+ pointerType: t.pointerType,
25
+ target: e
26
+ }));
27
+ }, cancel = () => h || !f && !p ? !1 : (clearHold(), !0), dispose = () => {
28
+ h || (h = !0, o?.removeEventListener("abort", dispose), u.abort(), clearHold(), e.removeEventListener("pointerdown", onPointerDown), e.removeEventListener("click", onClickCapture, !0));
29
+ }, matchesPointer = (e) => f?.pointerId === e.pointerId, onVisibilityChange = () => {
30
+ d?.visibilityState === "hidden" && cancel();
31
+ }, onWindowBlur = () => {
32
+ cancel();
33
+ }, onClickCapture = (e) => {
34
+ m && (m = !1, e.preventDefault(), e.stopPropagation());
35
+ }, handlePointerDown = (t) => {
36
+ h || f || isDisabled() || !t.isPrimary || t.button !== 0 || (!a || a(t)) && (m = !1, f = {
37
+ event: t,
38
+ pointerId: t.pointerId,
39
+ pointerType: t.pointerType,
40
+ startX: t.clientX,
41
+ startY: t.clientY
42
+ }, d = e.ownerDocument, d.addEventListener("pointermove", onPointerMove, !0), d.addEventListener("pointerup", onPointerUp, !0), d.addEventListener("pointercancel", onPointerCancel, !0), d.addEventListener("visibilitychange", onVisibilityChange), d.defaultView?.addEventListener("blur", onWindowBlur), p = setTimeout(fire, c));
43
+ }, handlePointerMove = (e) => {
44
+ f && matchesPointer(e) && Math.hypot(e.clientX - f.startX, e.clientY - f.startY) > l && clearHold();
45
+ }, handlePointerUp = (e) => {
46
+ matchesPointer(e) && clearHold();
47
+ }, handlePointerCancel = (e) => {
48
+ matchesPointer(e) && clearHold();
49
+ }, onPointerDown = (e) => handlePointerDown(e), onPointerMove = (e) => handlePointerMove(e), onPointerUp = (e) => handlePointerUp(e), onPointerCancel = (e) => handlePointerCancel(e);
50
+ return e.addEventListener("pointerdown", onPointerDown), e.addEventListener("click", onClickCapture, !0), o?.aborted ? dispose() : o?.addEventListener("abort", dispose, { once: !0 }), {
51
+ get active() {
52
+ return f !== null || p !== null;
53
+ },
54
+ cancel,
55
+ get disposalSignal() {
56
+ return u.signal;
57
+ },
58
+ dispose,
59
+ get disposed() {
60
+ return h;
61
+ },
62
+ [Symbol.dispose]: dispose
63
+ };
64
+ }
65
+ //#endregion
66
+ export { createLongPress, resolveDurationMs, resolveSlopPx };
67
+
2
68
  //# sourceMappingURL=long-press.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"long-press.js","names":[],"sources":["../src/long-press.ts"],"sourcesContent":["import type { GestureHandle } from './_gesture.js';\nimport { GestureConfigError } from './errors.js';\n\nexport type LongPressDetail = Readonly<{\n /** The pointerdown that started the hold; its `target` is the pressed element. */\n event: PointerEvent;\n pointerId: number;\n pointerType: string;\n /** The element the recognizer is bound to. */\n target: Element;\n}>;\n\nexport type LongPressOptions = Readonly<{\n /** Hold time in milliseconds. Default 500. */\n durationMs?: number;\n disabled?: boolean | (() => boolean | undefined);\n onLongPress?: (detail: LongPressDetail) => void;\n /** Restrict which pointers may start a hold (for example, excluding `mouse`). */\n shouldStart?: (event: PointerEvent) => boolean;\n /** Movement beyond this distance in pixels cancels the hold. Default 8. */\n slopPx?: number;\n signal?: AbortSignal;\n}>;\n\nexport type LongPress = GestureHandle;\n\nconst DEFAULT_DURATION_MS = 500;\nconst DEFAULT_SLOP_PX = 8;\n\nexport function resolveDurationMs(value: number | undefined): number {\n if (value === undefined) return DEFAULT_DURATION_MS;\n if (!Number.isFinite(value) || value <= 0) {\n throw new GestureConfigError(`durationMs must be a positive finite number, got: ${value}`);\n }\n return value;\n}\n\nexport function resolveSlopPx(value: number | undefined): number {\n if (value === undefined) return DEFAULT_SLOP_PX;\n if (!Number.isFinite(value) || value < 0) {\n throw new GestureConfigError(`slopPx must be a non-negative finite number, got: ${value}`);\n }\n return value;\n}\n\ntype PendingHold = {\n event: PointerEvent;\n pointerId: number;\n pointerType: string;\n startX: number;\n startY: number;\n};\n\n/**\n * Long-press recognition over an element: a primary pointer held past `durationMs` fires\n * `onLongPress` with the originating pointerdown, movement beyond `slopPx` cancels back to\n * a normal press, and the click that follows a fired hold is swallowed (capture phase) so\n * releasing never commits what the hold opened. Focus moves and page hides cancel the hold.\n */\nexport function createLongPress(target: Element, options: LongPressOptions = {}): LongPress {\n const { disabled, durationMs, onLongPress, shouldStart, signal, slopPx } = options;\n const duration = resolveDurationMs(durationMs);\n const slop = resolveSlopPx(slopPx);\n const disposalController = new AbortController();\n let trackingDocument: Document | null = null;\n let pending: PendingHold | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let swallowClick = false;\n let disposed = false;\n\n const isDisabled = (): boolean => Boolean(typeof disabled === 'function' ? disabled() : disabled);\n\n const removeTracking = (): void => {\n if (!trackingDocument) return;\n trackingDocument.removeEventListener('pointermove', onPointerMove, true);\n trackingDocument.removeEventListener('pointerup', onPointerUp, true);\n trackingDocument.removeEventListener('pointercancel', onPointerCancel, true);\n trackingDocument.removeEventListener('visibilitychange', onVisibilityChange);\n trackingDocument.defaultView?.removeEventListener('blur', onWindowBlur);\n trackingDocument = null;\n };\n\n const clearHold = (): void => {\n if (timer) clearTimeout(timer);\n timer = null;\n pending = null;\n removeTracking();\n };\n\n const fire = (): void => {\n const hold = pending;\n timer = null;\n pending = null;\n removeTracking();\n if (!hold) return;\n swallowClick = true;\n onLongPress?.({\n event: hold.event,\n pointerId: hold.pointerId,\n pointerType: hold.pointerType,\n target,\n });\n };\n\n const cancel = (): boolean => {\n if (disposed) return false;\n if (!pending && !timer) return false;\n clearHold();\n return true;\n };\n\n const dispose = (): void => {\n if (disposed) return;\n disposed = true;\n signal?.removeEventListener('abort', dispose);\n disposalController.abort();\n clearHold();\n target.removeEventListener('pointerdown', onPointerDown);\n target.removeEventListener('click', onClickCapture, true);\n };\n\n const matchesPointer = (event: PointerEvent): boolean => pending?.pointerId === event.pointerId;\n\n const onVisibilityChange = (): void => {\n if (trackingDocument?.visibilityState === 'hidden') cancel();\n };\n\n const onWindowBlur = (): void => {\n cancel();\n };\n\n const onClickCapture = (event: Event): void => {\n if (!swallowClick) return;\n swallowClick = false;\n event.preventDefault();\n event.stopPropagation();\n };\n\n const handlePointerDown = (event: PointerEvent): void => {\n if (disposed || pending || isDisabled() || !event.isPrimary || event.button !== 0) return;\n if (shouldStart && !shouldStart(event)) return;\n\n // A fired hold whose click never arrived (the press opened a context menu, the\n // pointer was released off-element) must not swallow an unrelated later click.\n swallowClick = false;\n\n pending = {\n event,\n pointerId: event.pointerId,\n pointerType: event.pointerType,\n startX: event.clientX,\n startY: event.clientY,\n };\n trackingDocument = target.ownerDocument;\n trackingDocument.addEventListener('pointermove', onPointerMove, true);\n trackingDocument.addEventListener('pointerup', onPointerUp, true);\n trackingDocument.addEventListener('pointercancel', onPointerCancel, true);\n trackingDocument.addEventListener('visibilitychange', onVisibilityChange);\n trackingDocument.defaultView?.addEventListener('blur', onWindowBlur);\n timer = setTimeout(fire, duration);\n };\n\n const handlePointerMove = (event: PointerEvent): void => {\n if (!pending || !matchesPointer(event)) return;\n if (Math.hypot(event.clientX - pending.startX, event.clientY - pending.startY) > slop) clearHold();\n };\n\n const handlePointerUp = (event: PointerEvent): void => {\n if (!matchesPointer(event)) return;\n clearHold();\n };\n\n const handlePointerCancel = (event: PointerEvent): void => {\n if (!matchesPointer(event)) return;\n clearHold();\n };\n\n const onPointerDown: EventListener = (event) => handlePointerDown(event as PointerEvent);\n const onPointerMove: EventListener = (event) => handlePointerMove(event as PointerEvent);\n const onPointerUp: EventListener = (event) => handlePointerUp(event as PointerEvent);\n const onPointerCancel: EventListener = (event) => handlePointerCancel(event as PointerEvent);\n\n target.addEventListener('pointerdown', onPointerDown);\n target.addEventListener('click', onClickCapture, true);\n if (signal?.aborted) dispose();\n else signal?.addEventListener('abort', dispose, { once: true });\n\n return {\n get active() {\n return pending !== null || timer !== null;\n },\n cancel,\n get disposalSignal() {\n return disposalController.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n [Symbol.dispose]: dispose,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"long-press.js","names":["DEFAULT_DURATION_MS","DEFAULT_SLOP_PX","value","GestureConfigError","options","duration","durationMs","slop","slopPx","disposalController","trackingDocument","pending","timer","swallowClick","disposed","disabled","hold","onLongPress","signal","target","event","shouldStart"],"sources":["../src/long-press.ts"],"sourcesContent":["import type { GestureHandle } from './_gesture.js';\nimport { GestureConfigError } from './errors.js';\n\nexport type LongPressDetail = Readonly<{\n /** The pointerdown that started the hold; its `target` is the pressed element. */\n event: PointerEvent;\n pointerId: number;\n pointerType: string;\n /** The element the recognizer is bound to. */\n target: Element;\n}>;\n\nexport type LongPressOptions = Readonly<{\n /** Hold time in milliseconds. Default 500. */\n durationMs?: number;\n disabled?: boolean | (() => boolean | undefined);\n onLongPress?: (detail: LongPressDetail) => void;\n /** Restrict which pointers may start a hold (for example, excluding `mouse`). */\n shouldStart?: (event: PointerEvent) => boolean;\n /** Movement beyond this distance in pixels cancels the hold. Default 8. */\n slopPx?: number;\n signal?: AbortSignal;\n}>;\n\nexport type LongPress = GestureHandle;\n\nconst DEFAULT_DURATION_MS = 500;\nconst DEFAULT_SLOP_PX = 8;\n\nexport function resolveDurationMs(value: number | undefined): number {\n if (value === undefined) return DEFAULT_DURATION_MS;\n if (!Number.isFinite(value) || value <= 0) {\n throw new GestureConfigError(`durationMs must be a positive finite number, got: ${value}`);\n }\n return value;\n}\n\nexport function resolveSlopPx(value: number | undefined): number {\n if (value === undefined) return DEFAULT_SLOP_PX;\n if (!Number.isFinite(value) || value < 0) {\n throw new GestureConfigError(`slopPx must be a non-negative finite number, got: ${value}`);\n }\n return value;\n}\n\ntype PendingHold = {\n event: PointerEvent;\n pointerId: number;\n pointerType: string;\n startX: number;\n startY: number;\n};\n\n/**\n * Long-press recognition over an element: a primary pointer held past `durationMs` fires\n * `onLongPress` with the originating pointerdown, movement beyond `slopPx` cancels back to\n * a normal press, and the click that follows a fired hold is swallowed (capture phase) so\n * releasing never commits what the hold opened. Focus moves and page hides cancel the hold.\n */\nexport function createLongPress(target: Element, options: LongPressOptions = {}): LongPress {\n const { disabled, durationMs, onLongPress, shouldStart, signal, slopPx } = options;\n const duration = resolveDurationMs(durationMs);\n const slop = resolveSlopPx(slopPx);\n const disposalController = new AbortController();\n let trackingDocument: Document | null = null;\n let pending: PendingHold | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let swallowClick = false;\n let disposed = false;\n\n const isDisabled = (): boolean => Boolean(typeof disabled === 'function' ? disabled() : disabled);\n\n const removeTracking = (): void => {\n if (!trackingDocument) return;\n trackingDocument.removeEventListener('pointermove', onPointerMove, true);\n trackingDocument.removeEventListener('pointerup', onPointerUp, true);\n trackingDocument.removeEventListener('pointercancel', onPointerCancel, true);\n trackingDocument.removeEventListener('visibilitychange', onVisibilityChange);\n trackingDocument.defaultView?.removeEventListener('blur', onWindowBlur);\n trackingDocument = null;\n };\n\n const clearHold = (): void => {\n if (timer) clearTimeout(timer);\n timer = null;\n pending = null;\n removeTracking();\n };\n\n const fire = (): void => {\n const hold = pending;\n timer = null;\n pending = null;\n removeTracking();\n if (!hold) return;\n swallowClick = true;\n onLongPress?.({\n event: hold.event,\n pointerId: hold.pointerId,\n pointerType: hold.pointerType,\n target,\n });\n };\n\n const cancel = (): boolean => {\n if (disposed) return false;\n if (!pending && !timer) return false;\n clearHold();\n return true;\n };\n\n const dispose = (): void => {\n if (disposed) return;\n disposed = true;\n signal?.removeEventListener('abort', dispose);\n disposalController.abort();\n clearHold();\n target.removeEventListener('pointerdown', onPointerDown);\n target.removeEventListener('click', onClickCapture, true);\n };\n\n const matchesPointer = (event: PointerEvent): boolean => pending?.pointerId === event.pointerId;\n\n const onVisibilityChange = (): void => {\n if (trackingDocument?.visibilityState === 'hidden') cancel();\n };\n\n const onWindowBlur = (): void => {\n cancel();\n };\n\n const onClickCapture = (event: Event): void => {\n if (!swallowClick) return;\n swallowClick = false;\n event.preventDefault();\n event.stopPropagation();\n };\n\n const handlePointerDown = (event: PointerEvent): void => {\n if (disposed || pending || isDisabled() || !event.isPrimary || event.button !== 0) return;\n if (shouldStart && !shouldStart(event)) return;\n\n // A fired hold whose click never arrived (the press opened a context menu, the\n // pointer was released off-element) must not swallow an unrelated later click.\n swallowClick = false;\n\n pending = {\n event,\n pointerId: event.pointerId,\n pointerType: event.pointerType,\n startX: event.clientX,\n startY: event.clientY,\n };\n trackingDocument = target.ownerDocument;\n trackingDocument.addEventListener('pointermove', onPointerMove, true);\n trackingDocument.addEventListener('pointerup', onPointerUp, true);\n trackingDocument.addEventListener('pointercancel', onPointerCancel, true);\n trackingDocument.addEventListener('visibilitychange', onVisibilityChange);\n trackingDocument.defaultView?.addEventListener('blur', onWindowBlur);\n timer = setTimeout(fire, duration);\n };\n\n const handlePointerMove = (event: PointerEvent): void => {\n if (!pending || !matchesPointer(event)) return;\n if (Math.hypot(event.clientX - pending.startX, event.clientY - pending.startY) > slop) clearHold();\n };\n\n const handlePointerUp = (event: PointerEvent): void => {\n if (!matchesPointer(event)) return;\n clearHold();\n };\n\n const handlePointerCancel = (event: PointerEvent): void => {\n if (!matchesPointer(event)) return;\n clearHold();\n };\n\n const onPointerDown: EventListener = (event) => handlePointerDown(event as PointerEvent);\n const onPointerMove: EventListener = (event) => handlePointerMove(event as PointerEvent);\n const onPointerUp: EventListener = (event) => handlePointerUp(event as PointerEvent);\n const onPointerCancel: EventListener = (event) => handlePointerCancel(event as PointerEvent);\n\n target.addEventListener('pointerdown', onPointerDown);\n target.addEventListener('click', onClickCapture, true);\n if (signal?.aborted) dispose();\n else signal?.addEventListener('abort', dispose, { once: true });\n\n return {\n get active() {\n return pending !== null || timer !== null;\n },\n cancel,\n get disposalSignal() {\n return disposalController.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n [Symbol.dispose]: dispose,\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pan-gesture.cjs","names":[],"sources":["../src/pan-gesture.ts"],"sourcesContent":["import type { GestureEndReason, GestureHandle } from './_gesture.js';\nimport {\n createPointerSession,\n type PointerAxis,\n type PointerSessionDetail,\n resolveActivationDistance,\n} from './_pointer-session.js';\n\nexport type PanAxis = PointerAxis;\nexport type PanEndReason = GestureEndReason;\n\nexport type PanGestureDetail = Readonly<{\n axis: PanAxis;\n current: number;\n distance: number;\n event: PointerEvent;\n pointerId: number;\n pointerType: string;\n start: number;\n target: Element;\n}>;\n\nexport type PanGestureEndDetail = PanGestureDetail & Readonly<{ reason: PanEndReason }>;\n\nexport type PanGestureOptions = Readonly<{\n activationDistance?: number;\n axis?: PanAxis | (() => PanAxis);\n disabled?: boolean | (() => boolean | undefined);\n onEnd?: (detail: PanGestureEndDetail) => void;\n onMove?: (detail: PanGestureDetail) => void;\n onStart?: (detail: PanGestureDetail) => void;\n pointerCapture?: boolean;\n shouldStart?: (event: PointerEvent) => boolean;\n signal?: AbortSignal;\n}>;\n\nexport type PanGesture = GestureHandle;\n\nfunction toPanDetail(detail: PointerSessionDetail): PanGestureDetail {\n const axis = detail.axis as PanAxis;\n const start = axis === 'x' ? detail.startX : detail.startY;\n const current = axis === 'x' ? detail.currentX : detail.currentY;\n return {\n axis,\n current,\n distance: current - start,\n event: detail.event,\n pointerId: detail.pointerId,\n pointerType: detail.pointerType,\n start,\n target: detail.target,\n };\n}\n\nexport function createPanGesture(target: Element, options: PanGestureOptions = {}): PanGesture {\n const {\n activationDistance,\n axis,\n disabled,\n onEnd,\n onMove,\n onStart,\n pointerCapture = true,\n shouldStart,\n signal,\n } = options;\n\n return createPointerSession(target, {\n activationDistance: resolveActivationDistance(activationDistance),\n axis: axis ?? 'x',\n disabled,\n onEnd: onEnd ? (detail) => onEnd({ ...toPanDetail(detail), reason: detail.reason }) : undefined,\n onMove: onMove ? (detail) => onMove(toPanDetail(detail)) : undefined,\n onStart: onStart ? (detail) => onStart(toPanDetail(detail)) : undefined,\n pointerCapture,\n shouldStart,\n signal,\n });\n}\n"],"mappings":"0CAsCA,SAAS,YAAY,EAAgD,CACnE,IAAM,EAAO,EAAO,KACd,EAAQ,IAAS,IAAM,EAAO,OAAS,EAAO,OAC9C,EAAU,IAAS,IAAM,EAAO,SAAW,EAAO,SACxD,MAAO,CACL,OACA,UACA,SAAU,EAAU,EACpB,MAAO,EAAO,MACd,UAAW,EAAO,UAClB,YAAa,EAAO,YACpB,QACA,OAAQ,EAAO,MACjB,CACF,CAEA,SAAgB,iBAAiB,EAAiB,EAA6B,CAAC,EAAe,CAC7F,GAAM,CACJ,qBACA,OACA,WACA,QACA,SACA,UACA,iBAAiB,GACjB,cACA,UACE,EAEJ,OAAO,EAAA,qBAAqB,EAAQ,CAClC,mBAAoB,EAAA,0BAA0B,CAAkB,EAChE,KAAM,GAAQ,IACd,WACA,MAAO,EAAS,GAAW,EAAM,CAAE,GAAG,YAAY,CAAM,EAAG,OAAQ,EAAO,MAAO,CAAC,EAAI,IAAA,GACtF,OAAQ,EAAU,GAAW,EAAO,YAAY,CAAM,CAAC,EAAI,IAAA,GAC3D,QAAS,EAAW,GAAW,EAAQ,YAAY,CAAM,CAAC,EAAI,IAAA,GAC9D,iBACA,cACA,QACF,CAAC,CACH"}
1
+ {"version":3,"file":"pan-gesture.cjs","names":["createPointerSession","resolveActivationDistance","require__pointer_session","axis","detail","start","current","options","target","activationDistance","onEnd","onMove","onStart"],"sources":["../src/pan-gesture.ts"],"sourcesContent":["import type { GestureEndReason, GestureHandle } from './_gesture.js';\nimport {\n createPointerSession,\n type PointerAxis,\n type PointerSessionDetail,\n resolveActivationDistance,\n} from './_pointer-session.js';\n\nexport type PanAxis = PointerAxis;\nexport type PanEndReason = GestureEndReason;\n\nexport type PanGestureDetail = Readonly<{\n axis: PanAxis;\n current: number;\n distance: number;\n event: PointerEvent;\n pointerId: number;\n pointerType: string;\n start: number;\n target: Element;\n}>;\n\nexport type PanGestureEndDetail = PanGestureDetail & Readonly<{ reason: PanEndReason }>;\n\nexport type PanGestureOptions = Readonly<{\n activationDistance?: number;\n axis?: PanAxis | (() => PanAxis);\n disabled?: boolean | (() => boolean | undefined);\n onEnd?: (detail: PanGestureEndDetail) => void;\n onMove?: (detail: PanGestureDetail) => void;\n onStart?: (detail: PanGestureDetail) => void;\n pointerCapture?: boolean;\n shouldStart?: (event: PointerEvent) => boolean;\n signal?: AbortSignal;\n}>;\n\nexport type PanGesture = GestureHandle;\n\nfunction toPanDetail(detail: PointerSessionDetail): PanGestureDetail {\n const axis = detail.axis as PanAxis;\n const start = axis === 'x' ? detail.startX : detail.startY;\n const current = axis === 'x' ? detail.currentX : detail.currentY;\n return {\n axis,\n current,\n distance: current - start,\n event: detail.event,\n pointerId: detail.pointerId,\n pointerType: detail.pointerType,\n start,\n target: detail.target,\n };\n}\n\nexport function createPanGesture(target: Element, options: PanGestureOptions = {}): PanGesture {\n const {\n activationDistance,\n axis,\n disabled,\n onEnd,\n onMove,\n onStart,\n pointerCapture = true,\n shouldStart,\n signal,\n } = options;\n\n return createPointerSession(target, {\n activationDistance: resolveActivationDistance(activationDistance),\n axis: axis ?? 'x',\n disabled,\n onEnd: onEnd ? (detail) => onEnd({ ...toPanDetail(detail), reason: detail.reason }) : undefined,\n onMove: onMove ? (detail) => onMove(toPanDetail(detail)) : undefined,\n onStart: onStart ? (detail) => onStart(toPanDetail(detail)) : undefined,\n pointerCapture,\n shouldStart,\n signal,\n });\n}\n"],"mappings":"A,0CAsCA,SAAS,YAAY,EAAgD,CACnE,IAAMG,EAAOC,EAAO,KACdC,EAAQF,IAAS,IAAMC,EAAO,OAASA,EAAO,OAC9CE,EAAUH,IAAS,IAAMC,EAAO,SAAWA,EAAO,SACxD,MAAO,CACL,OACA,UACA,SAAUE,EAAUD,EACpB,MAAOD,EAAO,MACd,UAAWA,EAAO,UAClB,YAAaA,EAAO,YACpB,QACA,OAAQA,EAAO,MACjB,CACF,CAEA,SAAgB,iBAAiB,EAAiB,EAA6B,CAAC,EAAe,CAC7F,GAAM,CACJ,qBACA,OACA,WACA,QACA,SACA,UACA,iBAAiB,GACjB,cACA,UACEG,EAEJ,OAAOP,EAAAA,qBAAqBQ,EAAQ,CAClC,mBAAoBP,EAAAA,0BAA0BQ,CAAkB,EAChE,KAAMN,GAAQ,IACd,WACA,MAAOO,EAAS,GAAWA,EAAM,CAAE,GAAG,YAAYN,CAAM,EAAG,OAAQA,EAAO,MAAO,CAAC,EAAI,IAAA,GACtF,OAAQO,EAAU,GAAWA,EAAO,YAAYP,CAAM,CAAC,EAAI,IAAA,GAC3D,QAASQ,EAAW,GAAWA,EAAQ,YAAYR,CAAM,CAAC,EAAI,IAAA,GAC9D,iBACA,cACA,QACF,CAAC,CACH,C"}
@@ -1,2 +1,36 @@
1
- import{createPointerSession as e,resolveActivationDistance as t}from"./_pointer-session.js";function toPanDetail(e){let t=e.axis,n=t===`x`?e.startX:e.startY,r=t===`x`?e.currentX:e.currentY;return{axis:t,current:r,distance:r-n,event:e.event,pointerId:e.pointerId,pointerType:e.pointerType,start:n,target:e.target}}function createPanGesture(n,r={}){let{activationDistance:i,axis:a,disabled:o,onEnd:s,onMove:c,onStart:l,pointerCapture:u=!0,shouldStart:d,signal:f}=r;return e(n,{activationDistance:t(i),axis:a??`x`,disabled:o,onEnd:s?e=>s({...toPanDetail(e),reason:e.reason}):void 0,onMove:c?e=>c(toPanDetail(e)):void 0,onStart:l?e=>l(toPanDetail(e)):void 0,pointerCapture:u,shouldStart:d,signal:f})}export{createPanGesture};
1
+ import { createPointerSession as e, resolveActivationDistance as t } from "./_pointer-session.js";
2
+ //#region src/pan-gesture.ts
3
+ function toPanDetail(e) {
4
+ let t = e.axis, n = t === "x" ? e.startX : e.startY, r = t === "x" ? e.currentX : e.currentY;
5
+ return {
6
+ axis: t,
7
+ current: r,
8
+ distance: r - n,
9
+ event: e.event,
10
+ pointerId: e.pointerId,
11
+ pointerType: e.pointerType,
12
+ start: n,
13
+ target: e.target
14
+ };
15
+ }
16
+ function createPanGesture(n, r = {}) {
17
+ let { activationDistance: i, axis: a, disabled: o, onEnd: s, onMove: c, onStart: l, pointerCapture: u = !0, shouldStart: d, signal: f } = r;
18
+ return e(n, {
19
+ activationDistance: t(i),
20
+ axis: a ?? "x",
21
+ disabled: o,
22
+ onEnd: s ? (e) => s({
23
+ ...toPanDetail(e),
24
+ reason: e.reason
25
+ }) : void 0,
26
+ onMove: c ? (e) => c(toPanDetail(e)) : void 0,
27
+ onStart: l ? (e) => l(toPanDetail(e)) : void 0,
28
+ pointerCapture: u,
29
+ shouldStart: d,
30
+ signal: f
31
+ });
32
+ }
33
+ //#endregion
34
+ export { createPanGesture };
35
+
2
36
  //# sourceMappingURL=pan-gesture.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pan-gesture.js","names":[],"sources":["../src/pan-gesture.ts"],"sourcesContent":["import type { GestureEndReason, GestureHandle } from './_gesture.js';\nimport {\n createPointerSession,\n type PointerAxis,\n type PointerSessionDetail,\n resolveActivationDistance,\n} from './_pointer-session.js';\n\nexport type PanAxis = PointerAxis;\nexport type PanEndReason = GestureEndReason;\n\nexport type PanGestureDetail = Readonly<{\n axis: PanAxis;\n current: number;\n distance: number;\n event: PointerEvent;\n pointerId: number;\n pointerType: string;\n start: number;\n target: Element;\n}>;\n\nexport type PanGestureEndDetail = PanGestureDetail & Readonly<{ reason: PanEndReason }>;\n\nexport type PanGestureOptions = Readonly<{\n activationDistance?: number;\n axis?: PanAxis | (() => PanAxis);\n disabled?: boolean | (() => boolean | undefined);\n onEnd?: (detail: PanGestureEndDetail) => void;\n onMove?: (detail: PanGestureDetail) => void;\n onStart?: (detail: PanGestureDetail) => void;\n pointerCapture?: boolean;\n shouldStart?: (event: PointerEvent) => boolean;\n signal?: AbortSignal;\n}>;\n\nexport type PanGesture = GestureHandle;\n\nfunction toPanDetail(detail: PointerSessionDetail): PanGestureDetail {\n const axis = detail.axis as PanAxis;\n const start = axis === 'x' ? detail.startX : detail.startY;\n const current = axis === 'x' ? detail.currentX : detail.currentY;\n return {\n axis,\n current,\n distance: current - start,\n event: detail.event,\n pointerId: detail.pointerId,\n pointerType: detail.pointerType,\n start,\n target: detail.target,\n };\n}\n\nexport function createPanGesture(target: Element, options: PanGestureOptions = {}): PanGesture {\n const {\n activationDistance,\n axis,\n disabled,\n onEnd,\n onMove,\n onStart,\n pointerCapture = true,\n shouldStart,\n signal,\n } = options;\n\n return createPointerSession(target, {\n activationDistance: resolveActivationDistance(activationDistance),\n axis: axis ?? 'x',\n disabled,\n onEnd: onEnd ? (detail) => onEnd({ ...toPanDetail(detail), reason: detail.reason }) : undefined,\n onMove: onMove ? (detail) => onMove(toPanDetail(detail)) : undefined,\n onStart: onStart ? (detail) => onStart(toPanDetail(detail)) : undefined,\n pointerCapture,\n shouldStart,\n signal,\n });\n}\n"],"mappings":"4FAsCA,SAAS,YAAY,EAAgD,CACnE,IAAM,EAAO,EAAO,KACd,EAAQ,IAAS,IAAM,EAAO,OAAS,EAAO,OAC9C,EAAU,IAAS,IAAM,EAAO,SAAW,EAAO,SACxD,MAAO,CACL,OACA,UACA,SAAU,EAAU,EACpB,MAAO,EAAO,MACd,UAAW,EAAO,UAClB,YAAa,EAAO,YACpB,QACA,OAAQ,EAAO,MACjB,CACF,CAEA,SAAgB,iBAAiB,EAAiB,EAA6B,CAAC,EAAe,CAC7F,GAAM,CACJ,qBACA,OACA,WACA,QACA,SACA,UACA,iBAAiB,GACjB,cACA,UACE,EAEJ,OAAO,EAAqB,EAAQ,CAClC,mBAAoB,EAA0B,CAAkB,EAChE,KAAM,GAAQ,IACd,WACA,MAAO,EAAS,GAAW,EAAM,CAAE,GAAG,YAAY,CAAM,EAAG,OAAQ,EAAO,MAAO,CAAC,EAAI,IAAA,GACtF,OAAQ,EAAU,GAAW,EAAO,YAAY,CAAM,CAAC,EAAI,IAAA,GAC3D,QAAS,EAAW,GAAW,EAAQ,YAAY,CAAM,CAAC,EAAI,IAAA,GAC9D,iBACA,cACA,QACF,CAAC,CACH"}
1
+ {"version":3,"file":"pan-gesture.js","names":["axis","detail","start","current","options","createPointerSession","target","resolveActivationDistance","activationDistance","onEnd","onMove","onStart"],"sources":["../src/pan-gesture.ts"],"sourcesContent":["import type { GestureEndReason, GestureHandle } from './_gesture.js';\nimport {\n createPointerSession,\n type PointerAxis,\n type PointerSessionDetail,\n resolveActivationDistance,\n} from './_pointer-session.js';\n\nexport type PanAxis = PointerAxis;\nexport type PanEndReason = GestureEndReason;\n\nexport type PanGestureDetail = Readonly<{\n axis: PanAxis;\n current: number;\n distance: number;\n event: PointerEvent;\n pointerId: number;\n pointerType: string;\n start: number;\n target: Element;\n}>;\n\nexport type PanGestureEndDetail = PanGestureDetail & Readonly<{ reason: PanEndReason }>;\n\nexport type PanGestureOptions = Readonly<{\n activationDistance?: number;\n axis?: PanAxis | (() => PanAxis);\n disabled?: boolean | (() => boolean | undefined);\n onEnd?: (detail: PanGestureEndDetail) => void;\n onMove?: (detail: PanGestureDetail) => void;\n onStart?: (detail: PanGestureDetail) => void;\n pointerCapture?: boolean;\n shouldStart?: (event: PointerEvent) => boolean;\n signal?: AbortSignal;\n}>;\n\nexport type PanGesture = GestureHandle;\n\nfunction toPanDetail(detail: PointerSessionDetail): PanGestureDetail {\n const axis = detail.axis as PanAxis;\n const start = axis === 'x' ? detail.startX : detail.startY;\n const current = axis === 'x' ? detail.currentX : detail.currentY;\n return {\n axis,\n current,\n distance: current - start,\n event: detail.event,\n pointerId: detail.pointerId,\n pointerType: detail.pointerType,\n start,\n target: detail.target,\n };\n}\n\nexport function createPanGesture(target: Element, options: PanGestureOptions = {}): PanGesture {\n const {\n activationDistance,\n axis,\n disabled,\n onEnd,\n onMove,\n onStart,\n pointerCapture = true,\n shouldStart,\n signal,\n } = options;\n\n return createPointerSession(target, {\n activationDistance: resolveActivationDistance(activationDistance),\n axis: axis ?? 'x',\n disabled,\n onEnd: onEnd ? (detail) => onEnd({ ...toPanDetail(detail), reason: detail.reason }) : undefined,\n onMove: onMove ? (detail) => onMove(toPanDetail(detail)) : undefined,\n onStart: onStart ? (detail) => onStart(toPanDetail(detail)) : undefined,\n pointerCapture,\n shouldStart,\n signal,\n });\n}\n"],"mappings":";;AAsCA,SAAS,YAAY,GAAgD;CACnE,IAAMA,IAAOC,EAAO,MACdC,IAAQF,MAAS,MAAMC,EAAO,SAASA,EAAO,QAC9CE,IAAUH,MAAS,MAAMC,EAAO,WAAWA,EAAO;CACxD,OAAO;EACL;EACA;EACA,UAAUE,IAAUD;EACpB,OAAOD,EAAO;EACd,WAAWA,EAAO;EAClB,aAAaA,EAAO;EACpB;EACA,QAAQA,EAAO;CACjB;AACF;AAEA,SAAgB,iBAAiB,GAAiB,IAA6B,CAAC,GAAe;CAC7F,IAAM,EACJ,uBACA,SACA,aACA,UACA,WACA,YACA,oBAAiB,IACjB,gBACA,cACEG;CAEJ,OAAOC,EAAqBC,GAAQ;EAClC,oBAAoBC,EAA0BC,CAAkB;EAChE,MAAMR,KAAQ;EACd;EACA,OAAOS,KAAS,MAAWA,EAAM;GAAE,GAAG,YAAYR,CAAM;GAAG,QAAQA,EAAO;EAAO,CAAC,IAAI,KAAA;EACtF,QAAQS,KAAU,MAAWA,EAAO,YAAYT,CAAM,CAAC,IAAI,KAAA;EAC3D,SAASU,KAAW,MAAWA,EAAQ,YAAYV,CAAM,CAAC,IAAI,KAAA;EAC9D;EACA;EACA;CACF,CAAC;AACH"}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@vielzeug/gesture",
3
- "version": "26.10.15",
3
+ "version": "26.10.17",
4
4
  "description": "Framework-neutral two-dimensional pointer drag and one-axis pan recognition with lifecycle-owned handles",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/helmuthdu/vielzeug",
8
8
  "directory": "packages/gesture"
9
9
  },
10
+ "license": "MIT",
10
11
  "type": "module",
11
12
  "engines": {
12
13
  "node": ">=22"
@@ -42,10 +43,10 @@
42
43
  "verify:exports": "node verify-exports.mjs"
43
44
  },
44
45
  "devDependencies": {
45
- "@playwright/test": "^1.63.0",
46
- "@types/node": "^26.6.2",
46
+ "@playwright/test": "^1.64.1",
47
+ "@types/node": "^26.6.5",
47
48
  "typescript": "^6.0.3",
48
- "vite": "^8.3.0",
49
- "vitest": "^5.0.1"
49
+ "vite": "^8.3.4",
50
+ "vitest": "^5.0.5"
50
51
  }
51
52
  }