{"version":3,"file":"index.mjs","sources":["../../../../src/gestures/press/index.ts"],"sourcesContent":["import { isHTMLElement } from \"../../utils/is-html-element\"\nimport { ElementOrSelector } from \"../../utils/resolve-elements\"\nimport { isDragActive } from \"../drag/state/is-active\"\nimport { EventOptions } from \"../types\"\nimport { isNodeOrChild } from \"../utils/is-node-or-child\"\nimport { isPrimaryPointer } from \"../utils/is-primary-pointer\"\nimport { setupGesture } from \"../utils/setup\"\nimport { OnPressStartEvent } from \"./types\"\nimport { isElementKeyboardAccessible } from \"./utils/is-keyboard-accessible\"\nimport { enableKeyboardPress } from \"./utils/keyboard\"\nimport { isPressing } from \"./utils/state\"\n\n/**\n * Filter out events that are not primary pointer events, or are triggering\n * while a Motion gesture is active.\n */\nfunction isValidPressEvent(event: PointerEvent) {\n    return isPrimaryPointer(event) && !isDragActive()\n}\n\nconst claimedPointerDownEvents = new WeakSet<Event>()\n\nexport interface PointerEventOptions extends EventOptions {\n    useGlobalTarget?: boolean\n    stopPropagation?: boolean\n}\n\n/**\n * Create a press gesture.\n *\n * Press is different to `\"pointerdown\"`, `\"pointerup\"` in that it\n * automatically filters out secondary pointer events like right\n * click and multitouch.\n *\n * It also adds accessibility support for keyboards, where\n * an element with a press gesture will receive focus and\n *  trigger on Enter `\"keydown\"` and `\"keyup\"` events.\n *\n * This is different to a browser's `\"click\"` event, which does\n * respond to keyboards but only for the `\"click\"` itself, rather\n * than the press start and end/cancel. The element also needs\n * to be focusable for this to work, whereas a press gesture will\n * make an element focusable by default.\n *\n * @public\n */\nexport function press(\n    targetOrSelector: ElementOrSelector,\n    onPressStart: OnPressStartEvent,\n    options: PointerEventOptions = {}\n): VoidFunction {\n    const [targets, eventOptions, cancelEvents] = setupGesture(\n        targetOrSelector,\n        options\n    )\n\n    const startPress = (startEvent: PointerEvent) => {\n        const target = startEvent.currentTarget as Element\n\n        if (!isValidPressEvent(startEvent)) return\n        if (claimedPointerDownEvents.has(startEvent)) return\n\n        isPressing.add(target)\n\n        if (options.stopPropagation) {\n            claimedPointerDownEvents.add(startEvent)\n        }\n\n        const onPressEnd = onPressStart(target, startEvent)\n\n        const onPointerEnd = (endEvent: PointerEvent, success: boolean) => {\n            window.removeEventListener(\"pointerup\", onPointerUp)\n            window.removeEventListener(\"pointercancel\", onPointerCancel)\n\n            if (isPressing.has(target)) {\n                isPressing.delete(target)\n            }\n\n            if (!isValidPressEvent(endEvent)) {\n                return\n            }\n\n            if (typeof onPressEnd === \"function\") {\n                onPressEnd(endEvent, { success })\n            }\n        }\n\n        const onPointerUp = (upEvent: PointerEvent) => {\n            onPointerEnd(\n                upEvent,\n                (target as any) === window ||\n                    (target as any) === document ||\n                    options.useGlobalTarget ||\n                    isNodeOrChild(target, upEvent.target as Element)\n            )\n        }\n\n        const onPointerCancel = (cancelEvent: PointerEvent) => {\n            onPointerEnd(cancelEvent, false)\n        }\n\n        window.addEventListener(\"pointerup\", onPointerUp, eventOptions)\n        window.addEventListener(\"pointercancel\", onPointerCancel, eventOptions)\n    }\n\n    targets.forEach((target: EventTarget) => {\n        const pointerDownTarget = options.useGlobalTarget ? window : target\n        pointerDownTarget.addEventListener(\n            \"pointerdown\",\n            startPress as EventListener,\n            eventOptions\n        )\n\n        if (isHTMLElement(target)) {\n            target.addEventListener(\"focus\", (event) =>\n                enableKeyboardPress(event as FocusEvent, eventOptions)\n            )\n\n            if (\n                !isElementKeyboardAccessible(target) &&\n                !target.hasAttribute(\"tabindex\")\n            ) {\n                target.tabIndex = 0\n            }\n        }\n    })\n\n    return cancelEvents\n}\n"],"names":[],"mappings":"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"}