{
  "version": 3,
  "sources": ["../../../src/lib/hooks/useGestureEvents.ts"],
  "sourcesContent": ["import * as React from 'react'\nimport { TLWheelEventInfo } from '../editor/types/event-types'\nimport { tlenv } from '../globals/environment'\nimport { Vec } from '../primitives/Vec'\nimport { preventDefault } from '../utils/dom'\nimport { isAccelKey } from '../utils/keyboard'\nimport { normalizeWheel } from '../utils/normalizeWheel'\nimport { useEditor } from './useEditor'\n\n/*\n\n# How does pinching work?\n\nThe pinching handler is fired under two circumstances:\n- when a user is on a MacBook trackpad and is ZOOMING with a two-finger pinch\n- when a user is on a touch device and is ZOOMING with a two-finger pinch\n- when a user is on a touch device and is PANNING with two fingers\n\nZooming is much more expensive than panning (because it causes shapes to render),\nso we want to be sure that we don't zoom while two-finger panning.\n\nIn order to do this, we keep track of a \"pinchState\", which is either:\n- \"zooming\"\n- \"panning\"\n- \"not sure\"\n\nIf a user is on a trackpad, the pinchState will be set to \"zooming\".\n\nIf the user is on a touch screen, then we start in the \"not sure\" state and switch back and forth\nbetween \"zooming\", \"panning\", and \"not sure\" based on what the user is doing with their fingers.\n\nIn the \"not sure\" state, we examine whether the user has moved the center of the gesture far enough\nto suggest that they're panning; or else that they've moved their fingers further apart or closer\ntogether enough to suggest that they're zooming.\n\nIn the \"panning\" state, we check whether the user's fingers have moved far enough apart to suggest\nthat they're zooming. If they have, we switch to the \"zooming\" state.\n\nIn the \"zooming\" state, we just stay zooming\u2014it's not YET possible to switch back to panning.\n\ntodo: compare velocities of change in order to determine whether the user has switched back to panning\n*/\n\n/** Safari's non-standard GestureEvent */\ninterface GestureEvent extends Event {\n\tscale: number\n\trotation: number\n\tclientX: number\n\tclientY: number\n\tshiftKey: boolean\n\taltKey: boolean\n\tmetaKey: boolean\n\tctrlKey: boolean\n}\n\nexport function useGestureEvents(ref: React.RefObject<HTMLDivElement | null>) {\n\tconst editor = useEditor()\n\n\tReact.useEffect(() => {\n\t\tconst elm = ref.current\n\t\tif (!elm) return\n\n\t\tlet pinchState = 'not sure' as 'not sure' | 'zooming' | 'panning'\n\n\t\t// --- Wheel handling ---\n\n\t\tfunction onWheel(event: WheelEvent) {\n\t\t\tif (!editor.getInstanceState().isFocused) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tpinchState = 'not sure'\n\n\t\t\t// Don't handle wheel events over a scrollable editing shape\n\t\t\tconst editingShapeId = editor.getEditingShapeId()\n\t\t\tif (editingShapeId) {\n\t\t\t\tconst shape = editor.getShape(editingShapeId)\n\t\t\t\tif (shape) {\n\t\t\t\t\tconst util = editor.getShapeUtil(shape)\n\t\t\t\t\tif (util.canScroll(shape)) {\n\t\t\t\t\t\tconst bounds = editor.getShapePageBounds(editingShapeId)\n\t\t\t\t\t\tif (bounds?.containsPoint(editor.inputs.getCurrentPagePoint())) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpreventDefault(event)\n\t\t\tevent.stopPropagation()\n\t\t\tconst delta = normalizeWheel(event)\n\n\t\t\tif (delta.x === 0 && delta.y === 0) return\n\n\t\t\tconst info: TLWheelEventInfo = {\n\t\t\t\ttype: 'wheel',\n\t\t\t\tname: 'wheel',\n\t\t\t\tdelta,\n\t\t\t\tpoint: new Vec(event.clientX, event.clientY),\n\t\t\t\tshiftKey: event.shiftKey,\n\t\t\t\taltKey: event.altKey,\n\t\t\t\tctrlKey: event.metaKey || event.ctrlKey,\n\t\t\t\tmetaKey: event.metaKey,\n\t\t\t\taccelKey: isAccelKey(event),\n\t\t\t}\n\n\t\t\teditor.dispatch(info)\n\t\t}\n\n\t\t// --- Touch pinch handling ---\n\n\t\tlet initDistanceBetweenFingers = 1 // the distance between the two fingers when the pinch starts\n\t\tlet initZoom = 1 // the zoom level when the pinch starts\n\t\tlet currDistanceBetweenFingers = 0\n\t\tconst initPointBetweenFingers = new Vec()\n\t\tconst prevPointBetweenFingers = new Vec()\n\n\t\t// Track active touches\n\t\tlet activeTouches: Touch[] = []\n\n\t\tfunction getScaleBounds() {\n\t\t\tconst baseZoom = editor.getBaseZoom()\n\t\t\tconst { zoomSteps, zoomSpeed } = editor.getCameraOptions()\n\t\t\tconst zoomMin = zoomSteps[0] * baseZoom\n\t\t\tconst zoomMax = zoomSteps[zoomSteps.length - 1] * baseZoom\n\t\t\treturn {\n\t\t\t\tmin: zoomMin ** (1 / zoomSpeed),\n\t\t\t\tmax: zoomMax ** (1 / zoomSpeed),\n\t\t\t}\n\t\t}\n\n\t\tfunction getScaleFrom() {\n\t\t\tconst { zoomSpeed } = editor.getCameraOptions()\n\t\t\treturn editor.getZoomLevel() ** (1 / zoomSpeed)\n\t\t}\n\n\t\t// Accumulated scale offset, clamped to bounds \u2014 replaces @use-gesture's offset[0]\n\t\tlet scaleOffset = 1\n\t\tlet initScaleFrom = 1 // the scale-space zoom level when the pinch started\n\n\t\tfunction updatePinchState(isSafariTrackpadPinch: boolean) {\n\t\t\tif (isSafariTrackpadPinch) {\n\t\t\t\tpinchState = 'zooming'\n\t\t\t}\n\n\t\t\tif (pinchState === 'zooming') {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Initial: [touch]-------origin-------[touch]\n\t\t\t// Current: [touch]-----------origin----------[touch]\n\t\t\t//                          |----|     |------------|\n\t\t\t//             originDistance ^           ^ touchDistance\n\n\t\t\t// How far have the two touch points moved towards or away from each other?\n\t\t\tconst touchDistance = Math.abs(currDistanceBetweenFingers - initDistanceBetweenFingers)\n\t\t\t// How far has the point between the touches moved?\n\t\t\tconst originDistance = Vec.Dist(initPointBetweenFingers, prevPointBetweenFingers)\n\n\t\t\tswitch (pinchState) {\n\t\t\t\tcase 'not sure': {\n\t\t\t\t\tif (touchDistance > 24) {\n\t\t\t\t\t\tpinchState = 'zooming'\n\t\t\t\t\t} else if (originDistance > 16) {\n\t\t\t\t\t\tpinchState = 'panning'\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase 'panning': {\n\t\t\t\t\t// Slightly more touch distance needed to go from panning to zooming\n\t\t\t\t\tif (touchDistance > 64) {\n\t\t\t\t\t\tpinchState = 'zooming'\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction dispatchPinchEvent(\n\t\t\tname: 'pinch_start' | 'pinch' | 'pinch_end',\n\t\t\torigin: { x: number; y: number },\n\t\t\tdelta: { x: number; y: number },\n\t\t\tzoom: number,\n\t\t\tevent: TouchEvent | GestureEvent\n\t\t) {\n\t\t\teditor.dispatch({\n\t\t\t\ttype: 'pinch',\n\t\t\t\tname,\n\t\t\t\tpoint: { x: origin.x, y: origin.y, z: zoom },\n\t\t\t\tdelta,\n\t\t\t\tshiftKey: event.shiftKey,\n\t\t\t\taltKey: event.altKey,\n\t\t\t\tctrlKey: event.metaKey || event.ctrlKey,\n\t\t\t\tmetaKey: event.metaKey,\n\t\t\t\taccelKey: isAccelKey(event),\n\t\t\t})\n\t\t}\n\n\t\tfunction getOriginAndDistance(t0: Touch, t1: Touch) {\n\t\t\tconst origin = {\n\t\t\t\tx: (t0.clientX + t1.clientX) / 2,\n\t\t\t\ty: (t0.clientY + t1.clientY) / 2,\n\t\t\t}\n\t\t\tconst distance = Math.hypot(t1.clientX - t0.clientX, t1.clientY - t0.clientY)\n\t\t\treturn { origin, distance }\n\t\t}\n\n\t\tfunction onTouchStart(event: TouchEvent) {\n\t\t\tif (!(event.target === elm || elm?.contains(event.target as Node))) return\n\n\t\t\tactiveTouches = Array.from(event.touches)\n\n\t\t\tif (activeTouches.length === 2) {\n\t\t\t\t// Two fingers down \u2014 start pinch\n\t\t\t\tpinchState = 'not sure'\n\t\t\t\tconst { origin, distance } = getOriginAndDistance(activeTouches[0], activeTouches[1])\n\n\t\t\t\tprevPointBetweenFingers.x = origin.x\n\t\t\t\tprevPointBetweenFingers.y = origin.y\n\t\t\t\tinitPointBetweenFingers.x = origin.x\n\t\t\t\tinitPointBetweenFingers.y = origin.y\n\t\t\t\tinitDistanceBetweenFingers = Math.max(distance, 1)\n\t\t\t\tcurrDistanceBetweenFingers = distance\n\t\t\t\tinitZoom = editor.getZoomLevel()\n\t\t\t\tinitScaleFrom = getScaleFrom()\n\t\t\t\tscaleOffset = initScaleFrom\n\n\t\t\t\tdispatchPinchEvent('pinch_start', origin, { x: 0, y: 0 }, editor.getZoomLevel(), event)\n\t\t\t}\n\t\t}\n\n\t\tfunction onTouchMove(event: TouchEvent) {\n\t\t\tactiveTouches = Array.from(event.touches)\n\n\t\t\tif (activeTouches.length < 2) return\n\n\t\t\tconst { origin, distance } = getOriginAndDistance(activeTouches[0], activeTouches[1])\n\t\t\tcurrDistanceBetweenFingers = distance\n\n\t\t\tconst dx = origin.x - prevPointBetweenFingers.x\n\t\t\tconst dy = origin.y - prevPointBetweenFingers.y\n\n\t\t\tprevPointBetweenFingers.x = origin.x\n\t\t\tprevPointBetweenFingers.y = origin.y\n\n\t\t\tupdatePinchState(false)\n\n\t\t\t// Only update the zoom if the pointers are far enough apart;\n\t\t\t// a very small touchDistance means that the user has probably\n\t\t\t// pinched out and their fingers are touching; this produces\n\t\t\t// very unstable zooming behavior.\n\t\t\tconst bounds = getScaleBounds()\n\t\t\tconst rawScale = initScaleFrom * (distance / initDistanceBetweenFingers)\n\t\t\tscaleOffset = Math.min(bounds.max, Math.max(bounds.min, rawScale))\n\n\t\t\tswitch (pinchState) {\n\t\t\t\tcase 'zooming': {\n\t\t\t\t\tconst currZoom = scaleOffset ** editor.getCameraOptions().zoomSpeed\n\t\t\t\t\tdispatchPinchEvent('pinch', origin, { x: dx, y: dy }, currZoom, event)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase 'panning': {\n\t\t\t\t\tdispatchPinchEvent('pinch', origin, { x: dx, y: dy }, initZoom, event)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction onTouchEnd(event: TouchEvent) {\n\t\t\tconst wasPinching = activeTouches.length >= 2\n\t\t\tactiveTouches = Array.from(event.touches)\n\n\t\t\tif (wasPinching && activeTouches.length < 2) {\n\t\t\t\t// Pinch ended\n\t\t\t\tconst scale = scaleOffset ** editor.getCameraOptions().zoomSpeed\n\t\t\t\tconst origin = { ...prevPointBetweenFingers }\n\t\t\t\tpinchState = 'not sure'\n\n\t\t\t\teditor.timers.requestAnimationFrame(() => {\n\t\t\t\t\tdispatchPinchEvent('pinch_end', origin, { x: origin.x, y: origin.y }, scale, event)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\t// --- Safari trackpad pinch (GestureEvent) ---\n\n\t\tlet safariGestureInitialScale = 1\n\n\t\tfunction onGestureStart(event: Event) {\n\t\t\tconst e = event as GestureEvent\n\t\t\tif (!(e.target === elm || elm?.contains(e.target as Node))) return\n\n\t\t\tpreventDefault(e)\n\t\t\te.stopPropagation()\n\n\t\t\tpinchState = 'not sure'\n\t\t\tsafariGestureInitialScale = getScaleFrom()\n\t\t\tscaleOffset = safariGestureInitialScale\n\t\t\tinitZoom = editor.getZoomLevel()\n\n\t\t\tprevPointBetweenFingers.x = e.clientX\n\t\t\tprevPointBetweenFingers.y = e.clientY\n\t\t\tinitPointBetweenFingers.x = e.clientX\n\t\t\tinitPointBetweenFingers.y = e.clientY\n\t\t\tinitDistanceBetweenFingers = 1\n\t\t\tcurrDistanceBetweenFingers = 1\n\n\t\t\tdispatchPinchEvent(\n\t\t\t\t'pinch_start',\n\t\t\t\t{ x: e.clientX, y: e.clientY },\n\t\t\t\t{ x: 0, y: 0 },\n\t\t\t\teditor.getZoomLevel(),\n\t\t\t\te\n\t\t\t)\n\t\t}\n\n\t\tfunction onGestureChange(event: Event) {\n\t\t\tconst e = event as GestureEvent\n\t\t\tif (!(e.target === elm || elm?.contains(e.target as Node))) return\n\n\t\t\tpreventDefault(e)\n\t\t\te.stopPropagation()\n\n\t\t\tconst dx = e.clientX - prevPointBetweenFingers.x\n\t\t\tconst dy = e.clientY - prevPointBetweenFingers.y\n\n\t\t\tprevPointBetweenFingers.x = e.clientX\n\t\t\tprevPointBetweenFingers.y = e.clientY\n\n\t\t\t// Safari GestureEvent.scale is a multiplier relative to gesture start\n\t\t\tconst bounds = getScaleBounds()\n\t\t\tconst rawScale = safariGestureInitialScale * e.scale\n\t\t\tscaleOffset = Math.min(bounds.max, Math.max(bounds.min, rawScale))\n\n\t\t\t// Update distance tracking for pinch state (treat scale change as distance change)\n\t\t\tcurrDistanceBetweenFingers = e.scale * initDistanceBetweenFingers\n\n\t\t\tupdatePinchState(true)\n\n\t\t\tconst currZoom = scaleOffset ** editor.getCameraOptions().zoomSpeed\n\n\t\t\tdispatchPinchEvent('pinch', { x: e.clientX, y: e.clientY }, { x: dx, y: dy }, currZoom, e)\n\t\t}\n\n\t\tfunction onGestureEnd(event: Event) {\n\t\t\tconst e = event as GestureEvent\n\t\t\tif (!(e.target === elm || elm?.contains(e.target as Node))) return\n\n\t\t\tpreventDefault(e)\n\t\t\te.stopPropagation()\n\n\t\t\tconst scale = scaleOffset ** editor.getCameraOptions().zoomSpeed\n\t\t\tpinchState = 'not sure'\n\n\t\t\teditor.timers.requestAnimationFrame(() => {\n\t\t\t\tdispatchPinchEvent(\n\t\t\t\t\t'pinch_end',\n\t\t\t\t\t{ x: e.clientX, y: e.clientY },\n\t\t\t\t\t{ x: e.clientX, y: e.clientY },\n\t\t\t\t\tscale,\n\t\t\t\t\te\n\t\t\t\t)\n\t\t\t})\n\t\t}\n\n\t\t// --- Attach event listeners ---\n\n\t\telm.addEventListener('wheel', onWheel, { passive: false })\n\n\t\t// On touch devices (iOS), use pointer events for pinch.\n\t\t// On non-touch Safari (macOS trackpad), use GestureEvent.\n\t\t// Never use both simultaneously \u2014 on iOS Safari, both event types fire\n\t\t// for the same pinch gesture, causing conflicting state updates.\n\t\tconst useGestureEvents = !tlenv.isIos && 'GestureEvent' in window\n\n\t\tif (useGestureEvents) {\n\t\t\telm.addEventListener('gesturestart', onGestureStart)\n\t\t\telm.addEventListener('gesturechange', onGestureChange)\n\t\t\telm.addEventListener('gestureend', onGestureEnd)\n\t\t} else {\n\t\t\telm.addEventListener('touchstart', onTouchStart)\n\t\t\telm.addEventListener('touchmove', onTouchMove)\n\t\t\telm.addEventListener('touchend', onTouchEnd)\n\t\t\telm.addEventListener('touchcancel', onTouchEnd)\n\t\t}\n\n\t\treturn () => {\n\t\t\telm.removeEventListener('wheel', onWheel)\n\t\t\tif (useGestureEvents) {\n\t\t\t\telm.removeEventListener('gesturestart', onGestureStart)\n\t\t\t\telm.removeEventListener('gesturechange', onGestureChange)\n\t\t\t\telm.removeEventListener('gestureend', onGestureEnd)\n\t\t\t} else {\n\t\t\t\telm.removeEventListener('touchstart', onTouchStart)\n\t\t\t\telm.removeEventListener('touchmove', onTouchMove)\n\t\t\t\telm.removeEventListener('touchend', onTouchEnd)\n\t\t\t\telm.removeEventListener('touchcancel', onTouchEnd)\n\t\t\t}\n\t\t}\n\t}, [editor, ref])\n}\n"],
  "mappings": "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",
  "names": ["useGestureEvents"]
}
