UNPKG

@zag-js/dom-query

Version:

The dom helper library for zag.js machines

87 lines (85 loc) 2.99 kB
import "./chunk-QZ7TP4HQ.mjs"; // src/press.ts import { addDomEvent, getEventPoint, getEventTarget } from "./event.mjs"; import { contains, getWindow, isActiveElement } from "./node.mjs"; import { noop, pipe } from "./shared.mjs"; function trackPress(options) { const { pointerNode, keyboardNode = pointerNode, onPress, onPressStart, onPressEnd, isValidKey = (e) => e.key === "Enter" } = options; if (!pointerNode) return noop; const win = getWindow(pointerNode); let removeStartListeners = noop; let removeEndListeners = noop; let removeAccessibleListeners = noop; const getInfo = (event) => ({ point: getEventPoint(event), event }); function startPress(event) { onPressStart?.(getInfo(event)); } function cancelPress(event) { onPressEnd?.(getInfo(event)); } const startPointerPress = (startEvent) => { removeEndListeners(); const endPointerPress = (endEvent) => { const target = getEventTarget(endEvent); if (contains(pointerNode, target)) { onPress?.(getInfo(endEvent)); } else { onPressEnd?.(getInfo(endEvent)); } }; const removePointerUpListener = addDomEvent(win, "pointerup", endPointerPress, { passive: !onPress, once: true }); const removePointerCancelListener = addDomEvent(win, "pointercancel", cancelPress, { passive: !onPressEnd, once: true }); removeEndListeners = pipe(removePointerUpListener, removePointerCancelListener); if (isActiveElement(keyboardNode) && startEvent.pointerType === "mouse") { startEvent.preventDefault(); } startPress(startEvent); }; const removePointerListener = addDomEvent(pointerNode, "pointerdown", startPointerPress, { passive: !onPressStart }); const removeFocusListener = addDomEvent(keyboardNode, "focus", startAccessiblePress); removeStartListeners = pipe(removePointerListener, removeFocusListener); function startAccessiblePress() { const handleKeydown = (keydownEvent) => { if (!isValidKey(keydownEvent)) return; const handleKeyup = (keyupEvent) => { if (!isValidKey(keyupEvent)) return; const evt2 = new win.PointerEvent("pointerup"); const info = getInfo(evt2); onPress?.(info); onPressEnd?.(info); }; removeEndListeners(); removeEndListeners = addDomEvent(keyboardNode, "keyup", handleKeyup); const evt = new win.PointerEvent("pointerdown"); startPress(evt); }; const handleBlur = () => { const evt = new win.PointerEvent("pointercancel"); cancelPress(evt); }; const removeKeydownListener = addDomEvent(keyboardNode, "keydown", handleKeydown); const removeBlurListener = addDomEvent(keyboardNode, "blur", handleBlur); removeAccessibleListeners = pipe(removeKeydownListener, removeBlurListener); } return () => { removeStartListeners(); removeEndListeners(); removeAccessibleListeners(); }; } export { trackPress };