'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function resolveElements(elementOrSelector, scope, selectorCache) { var _a; if (elementOrSelector instanceof Element) { return [elementOrSelector]; } else if (typeof elementOrSelector === "string") { let root = document; if (scope) { // TODO: Refactor to utils package // invariant( // Boolean(scope.current), // "Scope provided, but no element detected." // ) root = scope.current; } const elements = (_a = selectorCache === null || selectorCache === void 0 ? void 0 : selectorCache[elementOrSelector]) !== null && _a !== void 0 ? _a : root.querySelectorAll(elementOrSelector); return elements ? Array.from(elements) : []; } return Array.from(elementOrSelector); } const isDragging = { x: false, y: false, }; function isDragActive() { return isDragging.x || isDragging.y; } /** * Filter out events that are not pointer events, or are triggering * while a Motion gesture is active. */ function filterEvents(callback) { return (event) => { if (event.pointerType === "touch" || isDragActive()) return; callback(event); }; } /** * Create a hover gesture. hover() is different to .addEventListener("pointerenter") * in that it has an easier syntax, filters out polyfilled touch events, interoperates * with drag gestures, and automatically removes the "pointerennd" event listener when the hover ends. * * @public */ function hover(elementOrSelector, onHoverStart, options = {}) { const gestureAbortController = new AbortController(); const eventOptions = { passive: true, ...options, signal: gestureAbortController.signal, }; const onPointerEnter = filterEvents((enterEvent) => { const { target } = enterEvent; const onHoverEnd = onHoverStart(enterEvent); if (!onHoverEnd || !target) return; const onPointerLeave = filterEvents((leaveEvent) => { onHoverEnd(leaveEvent); target.removeEventListener("pointerleave", onPointerLeave); }); target.addEventListener("pointerleave", onPointerLeave, eventOptions); }); resolveElements(elementOrSelector).forEach((element) => { element.addEventListener("pointerenter", onPointerEnter, eventOptions); }); return () => gestureAbortController.abort(); } function setDragLock(axis) { if (axis === "x" || axis === "y") { if (isDragging[axis]) { return null; } else { isDragging[axis] = true; return () => { isDragging[axis] = false; }; } } else { if (isDragging.x || isDragging.y) { return null; } else { isDragging.x = isDragging.y = true; return () => { isDragging.x = isDragging.y = false; }; } } } exports.hover = hover; exports.isDragActive = isDragActive; exports.isDragging = isDragging; exports.resolveElements = resolveElements; exports.setDragLock = setDragLock;