@zag-js/dom-event
Advanced tools
Comparing version 0.53.0 to 0.54.0
@@ -1,2 +0,479 @@ | ||
"use strict";var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:true})};var __copyProps=(to,from,except,desc)=>{if(from&&typeof from==="object"||typeof from==="function"){for(let key of __getOwnPropNames(from))if(!__hasOwnProp.call(to,key)&&key!==except)__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})}return to};var __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:true}),mod);var src_exports={};__export(src_exports,{addDomEvent:()=>addDomEvent,clickIfLink:()=>clickIfLink,fireBlurEvent:()=>fireBlurEvent,fireCustomEvent:()=>fireCustomEvent,getEventKey:()=>getEventKey,getEventPoint:()=>getEventPoint,getEventStep:()=>getEventStep,getNativeEvent:()=>getNativeEvent,getRelativePoint:()=>getRelativePoint,isContextMenuEvent:()=>isContextMenuEvent,isKeyboardClick:()=>isKeyboardClick,isLeftClick:()=>isLeftClick,isModifierKey:()=>isModifierKey,isPrintableKey:()=>isPrintableKey,isVirtualClick:()=>isVirtualClick,isVirtualPointerEvent:()=>isVirtualPointerEvent,queueBeforeEvent:()=>queueBeforeEvent,requestPointerLock:()=>requestPointerLock,trackFocusVisible:()=>trackFocusVisible,trackPointerMove:()=>trackPointerMove,trackPress:()=>trackPress,trackVisualViewport:()=>trackVisualViewport});module.exports=__toCommonJS(src_exports);var addDomEvent=(target,eventName,handler,options)=>{const node=typeof target==="function"?target():target;node?.addEventListener(eventName,handler,options);return()=>{node?.removeEventListener(eventName,handler,options)}};var import_dom_query=require("@zag-js/dom-query");function isKeyboardClick(e){return e.detail===0||e.clientX===0&&e.clientY===0}function isPrintableKey(e){return e.key.length===1&&!e.ctrlKey&&!e.metaKey}function isVirtualPointerEvent(e){return e.width===0&&e.height===0||e.width===1&&e.height===1&&e.pressure===0&&e.detail===0&&e.pointerType==="mouse"}function isVirtualClick(e){if(e.mozInputSource===0&&e.isTrusted)return true;return e.detail===0&&!e.pointerType}var isLeftClick=e=>e.button===0;var isContextMenuEvent=e=>{return e.button===2||(0,import_dom_query.isMac)()&&e.ctrlKey&&e.button===0};var isModifierKey=e=>e.ctrlKey||e.altKey||e.metaKey;var import_dom_query2=require("@zag-js/dom-query");function queueBeforeEvent(element,type,cb){const createTimer=callback=>{const timerId=requestAnimationFrame(callback);return()=>cancelAnimationFrame(timerId)};const cancelTimer=createTimer(()=>{element.removeEventListener(type,callSync,true);cb()});const callSync=()=>{cancelTimer();cb()};element.addEventListener(type,callSync,{once:true,capture:true});return cancelTimer}function isLinkElement(element){return element?.matches("a[href]")??false}function clickIfLink(element){if(!isLinkElement(element))return;const click=()=>element.click();if((0,import_dom_query2.isFirefox)()){queueBeforeEvent(element,"keyup",click)}else{queueMicrotask(click)}}function fireCustomEvent(el,type,init){if(!el)return;const win=el.ownerDocument.defaultView||window;const event=new win.CustomEvent(type,init);return el.dispatchEvent(event)}function fireBlurEvent(el,init){const win=el.ownerDocument.defaultView||window;const event=new win.FocusEvent("blur",init);const allowed=el.dispatchEvent(event);const bubbleInit={...init,bubbles:true};el.dispatchEvent(new win.FocusEvent("focusout",bubbleInit));return allowed}var keyMap={Up:"ArrowUp",Down:"ArrowDown",Esc:"Escape"," ":"Space",",":"Comma",Left:"ArrowLeft",Right:"ArrowRight"};var rtlKeyMap={ArrowLeft:"ArrowRight",ArrowRight:"ArrowLeft"};function getEventKey(event,options={}){const{dir="ltr",orientation="horizontal"}=options;let{key}=event;key=keyMap[key]??key;const isRtl=dir==="rtl"&&orientation==="horizontal";if(isRtl&&key in rtlKeyMap){key=rtlKeyMap[key]}return key}function pointFromTouch(e,type="client"){const point=e.touches[0]||e.changedTouches[0];return{x:point[`${type}X`],y:point[`${type}Y`]}}function pointFromMouse(point,type="client"){return{x:point[`${type}X`],y:point[`${type}Y`]}}var isTouchEvent=event=>"touches"in event&&event.touches.length>0;function getEventPoint(event,type="client"){return isTouchEvent(event)?pointFromTouch(event,type):pointFromMouse(event,type)}var PAGE_KEYS=new Set(["PageUp","PageDown"]);var ARROW_KEYS=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]);function getEventStep(event){if(event.ctrlKey||event.metaKey){return .1}else{const isPageKey=PAGE_KEYS.has(event.key);const isSkipKey=isPageKey||event.shiftKey&&ARROW_KEYS.has(event.key);return isSkipKey?10:1}}function getNativeEvent(event){return event.nativeEvent??event}function clamp(value){return Math.max(0,Math.min(1,value))}function getRelativePoint(point,element){const{left,top,width,height}=element.getBoundingClientRect();const offset={x:point.x-left,y:point.y-top};const percent={x:clamp(offset.x/width),y:clamp(offset.y/height)};function getPercentValue(options={}){const{dir="ltr",orientation="horizontal",inverted}=options;const invertX=typeof inverted==="object"?inverted.x:inverted;const invertY=typeof inverted==="object"?inverted.y:inverted;if(orientation==="horizontal"){return dir==="rtl"||invertX?1-percent.x:percent.x}return invertY?1-percent.y:percent.y}return{offset,percent,getPercentValue}}function requestPointerLock(doc,fn){const body=doc.body;const supported="pointerLockElement"in doc||"mozPointerLockElement"in doc;const isLocked=()=>!!doc.pointerLockElement;function onPointerChange(){fn?.(isLocked())}function onPointerError(event){if(isLocked())fn?.(false);console.error("PointerLock error occured:",event);doc.exitPointerLock()}if(!supported)return;try{body.requestPointerLock()}catch{}const cleanup=[addDomEvent(doc,"pointerlockchange",onPointerChange,false),addDomEvent(doc,"pointerlockerror",onPointerError,false)];return()=>{cleanup.forEach(cleanup2=>cleanup2());doc.exitPointerLock()}}var import_dom_query3=require("@zag-js/dom-query");var pipe=(...fns)=>arg=>fns.reduce((acc,fn)=>fn(acc),arg);var noop=()=>void 0;var isValidKey=e=>{return!(e.metaKey||!(0,import_dom_query3.isMac)()&&e.altKey||e.ctrlKey||e.key==="Control"||e.key==="Shift"||e.key==="Meta")};function trackFocusVisible(node,options){if(!node)return;const{onFocus,onBlur}=options;const win=(0,import_dom_query3.getWindow)(node);let focused=false;const handleFocus=e=>{let isFocusVisible=false;try{isFocusVisible=node.matches(":focus-visible")}catch{isFocusVisible=true}if(!isFocusVisible)return;focused=true;onFocus?.(e)};const handleBlur=e=>{if(!focused)return;focused=false;onBlur?.(e)};const handleKeydown=e=>{if(!node.matches(":focus")||!isValidKey(e))return;focused=true;const evt=new win.FocusEvent("focus");onFocus?.(evt)};return pipe(addDomEvent(node,"focusin",handleFocus),addDomEvent(node,"focusout",handleBlur),addDomEvent(node,"keydown",handleKeydown,true))}var import_text_selection=require("@zag-js/text-selection");function trackPointerMove(doc,handlers){const{onPointerMove,onPointerUp}=handlers;const history=[];const handleMove=event=>{const point=getEventPoint(event);history.push({...point,timestamp:performance.now()});const distance=Math.sqrt(point.x**2+point.y**2);const moveBuffer=event.pointerType==="touch"?10:5;if(distance<moveBuffer)return;if(event.pointerType==="mouse"&&event.button===0){onPointerUp();return}onPointerMove({point,event,velocity:getVelocity(history,.1)})};const cleanups=[addDomEvent(doc,"pointermove",handleMove,false),addDomEvent(doc,"pointerup",onPointerUp,false),addDomEvent(doc,"pointercancel",onPointerUp,false),addDomEvent(doc,"contextmenu",onPointerUp,false),(0,import_text_selection.disableTextSelection)({doc})];return()=>{cleanups.forEach(cleanup=>cleanup());history.length=0}}function lastDevicePoint(history){return history[history.length-1]}function ms(seconds){return seconds*1e3}function sec(milliseconds){return milliseconds/1e3}function getVelocity(history,timeDelta){if(history.length<2)return{x:0,y:0};let i=history.length-1;let timestampedPoint=null;const lastPoint=lastDevicePoint(history);while(i>=0){timestampedPoint=history[i];if(lastPoint.timestamp-timestampedPoint.timestamp>ms(timeDelta)){break}i--}if(!timestampedPoint)return{x:0,y:0};const time=sec(lastPoint.timestamp-timestampedPoint.timestamp);if(time===0)return{x:0,y:0};const currentVelocity={x:(lastPoint.x-timestampedPoint.x)/time,y:(lastPoint.y-timestampedPoint.y)/time};if(currentVelocity.x===Infinity)currentVelocity.x=0;if(currentVelocity.y===Infinity)currentVelocity.y=0;return{x:Math.abs(currentVelocity.x),y:Math.abs(currentVelocity.y)}}var import_dom_query4=require("@zag-js/dom-query");function trackPress(options){const{pointerNode,keyboardNode=pointerNode,onPress,onPressStart,onPressEnd,isValidKey:isValidKey2=e=>e.key==="Enter"}=options;if(!pointerNode)return noop;const win=(0,import_dom_query4.getWindow)(pointerNode);const doc=(0,import_dom_query4.getDocument)(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=(0,import_dom_query4.getEventTarget)(endEvent);if((0,import_dom_query4.contains)(pointerNode,target)){onPress?.(getInfo(endEvent))}else{onPressEnd?.(getInfo(endEvent))}};const removePointerUpListener=addDomEvent(win,"pointerup",endPointerPress,{passive:!onPress});const removePointerCancelListener=addDomEvent(win,"pointercancel",cancelPress,{passive:!onPressEnd});removeEndListeners=pipe(removePointerUpListener,removePointerCancelListener);if(doc.activeElement===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(!isValidKey2(keydownEvent))return;const handleKeyup=keyupEvent=>{if(!isValidKey2(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 function(){removeStartListeners();removeEndListeners();removeAccessibleListeners()}}function trackVisualViewport(doc,fn){const win=doc?.defaultView||window;const onResize=()=>{fn?.(getViewportSize(win))};onResize();return addDomEvent(win.visualViewport??win,"resize",onResize)}function getViewportSize(win){return{width:win.visualViewport?.width||win.innerWidth,height:win.visualViewport?.height||win.innerHeight}}0&&(module.exports={addDomEvent,clickIfLink,fireBlurEvent,fireCustomEvent,getEventKey,getEventPoint,getEventStep,getNativeEvent,getRelativePoint,isContextMenuEvent,isKeyboardClick,isLeftClick,isModifierKey,isPrintableKey,isVirtualClick,isVirtualPointerEvent,queueBeforeEvent,requestPointerLock,trackFocusVisible,trackPointerMove,trackPress,trackVisualViewport}); | ||
"use strict"; | ||
var __defProp = Object.defineProperty; | ||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | ||
var __getOwnPropNames = Object.getOwnPropertyNames; | ||
var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
var __export = (target, all) => { | ||
for (var name in all) | ||
__defProp(target, name, { get: all[name], enumerable: true }); | ||
}; | ||
var __copyProps = (to, from, except, desc) => { | ||
if (from && typeof from === "object" || typeof from === "function") { | ||
for (let key of __getOwnPropNames(from)) | ||
if (!__hasOwnProp.call(to, key) && key !== except) | ||
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); | ||
} | ||
return to; | ||
}; | ||
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); | ||
// src/index.ts | ||
var src_exports = {}; | ||
__export(src_exports, { | ||
addDomEvent: () => addDomEvent, | ||
clickIfLink: () => clickIfLink, | ||
fireBlurEvent: () => fireBlurEvent, | ||
fireCustomEvent: () => fireCustomEvent, | ||
getEventKey: () => getEventKey, | ||
getEventPoint: () => getEventPoint, | ||
getEventStep: () => getEventStep, | ||
getNativeEvent: () => getNativeEvent, | ||
getRelativePoint: () => getRelativePoint, | ||
isContextMenuEvent: () => isContextMenuEvent, | ||
isKeyboardClick: () => isKeyboardClick, | ||
isLeftClick: () => isLeftClick, | ||
isModifierKey: () => isModifierKey, | ||
isPrintableKey: () => isPrintableKey, | ||
isVirtualClick: () => isVirtualClick, | ||
isVirtualPointerEvent: () => isVirtualPointerEvent, | ||
queueBeforeEvent: () => queueBeforeEvent, | ||
requestPointerLock: () => requestPointerLock, | ||
trackFocusVisible: () => trackFocusVisible, | ||
trackPointerMove: () => trackPointerMove, | ||
trackPress: () => trackPress, | ||
trackVisualViewport: () => trackVisualViewport | ||
}); | ||
module.exports = __toCommonJS(src_exports); | ||
// src/add-dom-event.ts | ||
var addDomEvent = (target, eventName, handler, options) => { | ||
const node = typeof target === "function" ? target() : target; | ||
node?.addEventListener(eventName, handler, options); | ||
return () => { | ||
node?.removeEventListener(eventName, handler, options); | ||
}; | ||
}; | ||
// src/assertion.ts | ||
var import_dom_query = require("@zag-js/dom-query"); | ||
function isKeyboardClick(e) { | ||
return e.detail === 0 || e.clientX === 0 && e.clientY === 0; | ||
} | ||
function isPrintableKey(e) { | ||
return e.key.length === 1 && !e.ctrlKey && !e.metaKey; | ||
} | ||
function isVirtualPointerEvent(e) { | ||
return e.width === 0 && e.height === 0 || e.width === 1 && e.height === 1 && e.pressure === 0 && e.detail === 0 && e.pointerType === "mouse"; | ||
} | ||
function isVirtualClick(e) { | ||
if (e.mozInputSource === 0 && e.isTrusted) | ||
return true; | ||
return e.detail === 0 && !e.pointerType; | ||
} | ||
var isLeftClick = (e) => e.button === 0; | ||
var isContextMenuEvent = (e) => { | ||
return e.button === 2 || (0, import_dom_query.isMac)() && e.ctrlKey && e.button === 0; | ||
}; | ||
var isModifierKey = (e) => e.ctrlKey || e.altKey || e.metaKey; | ||
// src/click-link.ts | ||
var import_dom_query2 = require("@zag-js/dom-query"); | ||
// src/queue-before-event.ts | ||
function queueBeforeEvent(element, type, cb) { | ||
const createTimer = (callback) => { | ||
const timerId = requestAnimationFrame(callback); | ||
return () => cancelAnimationFrame(timerId); | ||
}; | ||
const cancelTimer = createTimer(() => { | ||
element.removeEventListener(type, callSync, true); | ||
cb(); | ||
}); | ||
const callSync = () => { | ||
cancelTimer(); | ||
cb(); | ||
}; | ||
element.addEventListener(type, callSync, { once: true, capture: true }); | ||
return cancelTimer; | ||
} | ||
// src/click-link.ts | ||
function isLinkElement(element) { | ||
return element?.matches("a[href]") ?? false; | ||
} | ||
function clickIfLink(element) { | ||
if (!isLinkElement(element)) | ||
return; | ||
const click = () => element.click(); | ||
if ((0, import_dom_query2.isFirefox)()) { | ||
queueBeforeEvent(element, "keyup", click); | ||
} else { | ||
queueMicrotask(click); | ||
} | ||
} | ||
// src/fire-event.ts | ||
function fireCustomEvent(el, type, init) { | ||
if (!el) | ||
return; | ||
const win = el.ownerDocument.defaultView || window; | ||
const event = new win.CustomEvent(type, init); | ||
return el.dispatchEvent(event); | ||
} | ||
function fireBlurEvent(el, init) { | ||
const win = el.ownerDocument.defaultView || window; | ||
const event = new win.FocusEvent("blur", init); | ||
const allowed = el.dispatchEvent(event); | ||
const bubbleInit = { ...init, bubbles: true }; | ||
el.dispatchEvent(new win.FocusEvent("focusout", bubbleInit)); | ||
return allowed; | ||
} | ||
// src/get-event-key.ts | ||
var keyMap = { | ||
Up: "ArrowUp", | ||
Down: "ArrowDown", | ||
Esc: "Escape", | ||
" ": "Space", | ||
",": "Comma", | ||
Left: "ArrowLeft", | ||
Right: "ArrowRight" | ||
}; | ||
var rtlKeyMap = { | ||
ArrowLeft: "ArrowRight", | ||
ArrowRight: "ArrowLeft" | ||
}; | ||
function getEventKey(event, options = {}) { | ||
const { dir = "ltr", orientation = "horizontal" } = options; | ||
let { key } = event; | ||
key = keyMap[key] ?? key; | ||
const isRtl = dir === "rtl" && orientation === "horizontal"; | ||
if (isRtl && key in rtlKeyMap) { | ||
key = rtlKeyMap[key]; | ||
} | ||
return key; | ||
} | ||
// src/get-event-point.ts | ||
function pointFromTouch(e, type = "client") { | ||
const point = e.touches[0] || e.changedTouches[0]; | ||
return { x: point[`${type}X`], y: point[`${type}Y`] }; | ||
} | ||
function pointFromMouse(point, type = "client") { | ||
return { x: point[`${type}X`], y: point[`${type}Y`] }; | ||
} | ||
var isTouchEvent = (event) => "touches" in event && event.touches.length > 0; | ||
function getEventPoint(event, type = "client") { | ||
return isTouchEvent(event) ? pointFromTouch(event, type) : pointFromMouse(event, type); | ||
} | ||
// src/get-event-step.ts | ||
var PAGE_KEYS = /* @__PURE__ */ new Set(["PageUp", "PageDown"]); | ||
var ARROW_KEYS = /* @__PURE__ */ new Set(["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"]); | ||
function getEventStep(event) { | ||
if (event.ctrlKey || event.metaKey) { | ||
return 0.1; | ||
} else { | ||
const isPageKey = PAGE_KEYS.has(event.key); | ||
const isSkipKey = isPageKey || event.shiftKey && ARROW_KEYS.has(event.key); | ||
return isSkipKey ? 10 : 1; | ||
} | ||
} | ||
// src/get-native-event.ts | ||
function getNativeEvent(event) { | ||
return event.nativeEvent ?? event; | ||
} | ||
// src/get-point-value.ts | ||
function clamp(value) { | ||
return Math.max(0, Math.min(1, value)); | ||
} | ||
function getRelativePoint(point, element) { | ||
const { left, top, width, height } = element.getBoundingClientRect(); | ||
const offset = { x: point.x - left, y: point.y - top }; | ||
const percent = { x: clamp(offset.x / width), y: clamp(offset.y / height) }; | ||
function getPercentValue(options = {}) { | ||
const { dir = "ltr", orientation = "horizontal", inverted } = options; | ||
const invertX = typeof inverted === "object" ? inverted.x : inverted; | ||
const invertY = typeof inverted === "object" ? inverted.y : inverted; | ||
if (orientation === "horizontal") { | ||
return dir === "rtl" || invertX ? 1 - percent.x : percent.x; | ||
} | ||
return invertY ? 1 - percent.y : percent.y; | ||
} | ||
return { offset, percent, getPercentValue }; | ||
} | ||
// src/request-pointer-lock.ts | ||
function requestPointerLock(doc, fn) { | ||
const body = doc.body; | ||
const supported = "pointerLockElement" in doc || "mozPointerLockElement" in doc; | ||
const isLocked = () => !!doc.pointerLockElement; | ||
function onPointerChange() { | ||
fn?.(isLocked()); | ||
} | ||
function onPointerError(event) { | ||
if (isLocked()) | ||
fn?.(false); | ||
console.error("PointerLock error occured:", event); | ||
doc.exitPointerLock(); | ||
} | ||
if (!supported) | ||
return; | ||
try { | ||
body.requestPointerLock(); | ||
} catch { | ||
} | ||
const cleanup = [ | ||
addDomEvent(doc, "pointerlockchange", onPointerChange, false), | ||
addDomEvent(doc, "pointerlockerror", onPointerError, false) | ||
]; | ||
return () => { | ||
cleanup.forEach((cleanup2) => cleanup2()); | ||
doc.exitPointerLock(); | ||
}; | ||
} | ||
// src/track-focus-visible.ts | ||
var import_dom_query3 = require("@zag-js/dom-query"); | ||
// src/pipe.ts | ||
var pipe = (...fns) => (arg) => fns.reduce((acc, fn) => fn(acc), arg); | ||
var noop = () => void 0; | ||
// src/track-focus-visible.ts | ||
var isValidKey = (e) => { | ||
return !(e.metaKey || !(0, import_dom_query3.isMac)() && e.altKey || e.ctrlKey || e.key === "Control" || e.key === "Shift" || e.key === "Meta"); | ||
}; | ||
function trackFocusVisible(node, options) { | ||
if (!node) | ||
return; | ||
const { onFocus, onBlur } = options; | ||
const win = (0, import_dom_query3.getWindow)(node); | ||
let focused = false; | ||
const handleFocus = (e) => { | ||
let isFocusVisible = false; | ||
try { | ||
isFocusVisible = node.matches(":focus-visible"); | ||
} catch { | ||
isFocusVisible = true; | ||
} | ||
if (!isFocusVisible) | ||
return; | ||
focused = true; | ||
onFocus?.(e); | ||
}; | ||
const handleBlur = (e) => { | ||
if (!focused) | ||
return; | ||
focused = false; | ||
onBlur?.(e); | ||
}; | ||
const handleKeydown = (e) => { | ||
if (!node.matches(":focus") || !isValidKey(e)) | ||
return; | ||
focused = true; | ||
const evt = new win.FocusEvent("focus"); | ||
onFocus?.(evt); | ||
}; | ||
return pipe( | ||
addDomEvent(node, "focusin", handleFocus), | ||
addDomEvent(node, "focusout", handleBlur), | ||
addDomEvent(node, "keydown", handleKeydown, true) | ||
); | ||
} | ||
// src/track-pointer-move.ts | ||
var import_text_selection = require("@zag-js/text-selection"); | ||
function trackPointerMove(doc, handlers) { | ||
const { onPointerMove, onPointerUp } = handlers; | ||
const history = []; | ||
const handleMove = (event) => { | ||
const point = getEventPoint(event); | ||
history.push({ ...point, timestamp: performance.now() }); | ||
const distance = Math.sqrt(point.x ** 2 + point.y ** 2); | ||
const moveBuffer = event.pointerType === "touch" ? 10 : 5; | ||
if (distance < moveBuffer) | ||
return; | ||
if (event.pointerType === "mouse" && event.button === 0) { | ||
onPointerUp(); | ||
return; | ||
} | ||
onPointerMove({ point, event, velocity: getVelocity(history, 0.1) }); | ||
}; | ||
const cleanups = [ | ||
addDomEvent(doc, "pointermove", handleMove, false), | ||
addDomEvent(doc, "pointerup", onPointerUp, false), | ||
addDomEvent(doc, "pointercancel", onPointerUp, false), | ||
addDomEvent(doc, "contextmenu", onPointerUp, false), | ||
(0, import_text_selection.disableTextSelection)({ doc }) | ||
]; | ||
return () => { | ||
cleanups.forEach((cleanup) => cleanup()); | ||
history.length = 0; | ||
}; | ||
} | ||
function lastDevicePoint(history) { | ||
return history[history.length - 1]; | ||
} | ||
function ms(seconds) { | ||
return seconds * 1e3; | ||
} | ||
function sec(milliseconds) { | ||
return milliseconds / 1e3; | ||
} | ||
function getVelocity(history, timeDelta) { | ||
if (history.length < 2) | ||
return { x: 0, y: 0 }; | ||
let i = history.length - 1; | ||
let timestampedPoint = null; | ||
const lastPoint = lastDevicePoint(history); | ||
while (i >= 0) { | ||
timestampedPoint = history[i]; | ||
if (lastPoint.timestamp - timestampedPoint.timestamp > ms(timeDelta)) { | ||
break; | ||
} | ||
i--; | ||
} | ||
if (!timestampedPoint) | ||
return { x: 0, y: 0 }; | ||
const time = sec(lastPoint.timestamp - timestampedPoint.timestamp); | ||
if (time === 0) | ||
return { x: 0, y: 0 }; | ||
const currentVelocity = { | ||
x: (lastPoint.x - timestampedPoint.x) / time, | ||
y: (lastPoint.y - timestampedPoint.y) / time | ||
}; | ||
if (currentVelocity.x === Infinity) | ||
currentVelocity.x = 0; | ||
if (currentVelocity.y === Infinity) | ||
currentVelocity.y = 0; | ||
return { | ||
x: Math.abs(currentVelocity.x), | ||
y: Math.abs(currentVelocity.y) | ||
}; | ||
} | ||
// src/track-press.ts | ||
var import_dom_query4 = require("@zag-js/dom-query"); | ||
function trackPress(options) { | ||
const { | ||
pointerNode, | ||
keyboardNode = pointerNode, | ||
onPress, | ||
onPressStart, | ||
onPressEnd, | ||
isValidKey: isValidKey2 = (e) => e.key === "Enter" | ||
} = options; | ||
if (!pointerNode) | ||
return noop; | ||
const win = (0, import_dom_query4.getWindow)(pointerNode); | ||
const doc = (0, import_dom_query4.getDocument)(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 = (0, import_dom_query4.getEventTarget)(endEvent); | ||
if ((0, import_dom_query4.contains)(pointerNode, target)) { | ||
onPress?.(getInfo(endEvent)); | ||
} else { | ||
onPressEnd?.(getInfo(endEvent)); | ||
} | ||
}; | ||
const removePointerUpListener = addDomEvent(win, "pointerup", endPointerPress, { passive: !onPress }); | ||
const removePointerCancelListener = addDomEvent(win, "pointercancel", cancelPress, { passive: !onPressEnd }); | ||
removeEndListeners = pipe(removePointerUpListener, removePointerCancelListener); | ||
if (doc.activeElement === 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 (!isValidKey2(keydownEvent)) | ||
return; | ||
const handleKeyup = (keyupEvent) => { | ||
if (!isValidKey2(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 function() { | ||
removeStartListeners(); | ||
removeEndListeners(); | ||
removeAccessibleListeners(); | ||
}; | ||
} | ||
// src/track-visual-viewport.ts | ||
function trackVisualViewport(doc, fn) { | ||
const win = doc?.defaultView || window; | ||
const onResize = () => { | ||
fn?.(getViewportSize(win)); | ||
}; | ||
onResize(); | ||
return addDomEvent(win.visualViewport ?? win, "resize", onResize); | ||
} | ||
function getViewportSize(win) { | ||
return { | ||
width: win.visualViewport?.width || win.innerWidth, | ||
height: win.visualViewport?.height || win.innerHeight | ||
}; | ||
} | ||
// Annotate the CommonJS export names for ESM import in node: | ||
0 && (module.exports = { | ||
addDomEvent, | ||
clickIfLink, | ||
fireBlurEvent, | ||
fireCustomEvent, | ||
getEventKey, | ||
getEventPoint, | ||
getEventStep, | ||
getNativeEvent, | ||
getRelativePoint, | ||
isContextMenuEvent, | ||
isKeyboardClick, | ||
isLeftClick, | ||
isModifierKey, | ||
isPrintableKey, | ||
isVirtualClick, | ||
isVirtualPointerEvent, | ||
queueBeforeEvent, | ||
requestPointerLock, | ||
trackFocusVisible, | ||
trackPointerMove, | ||
trackPress, | ||
trackVisualViewport | ||
}); | ||
//# sourceMappingURL=index.js.map |
{ | ||
"name": "@zag-js/dom-event", | ||
"version": "0.53.0", | ||
"version": "0.54.0", | ||
"description": "", | ||
@@ -28,5 +28,5 @@ "keywords": [ | ||
"dependencies": { | ||
"@zag-js/types": "0.53.0", | ||
"@zag-js/dom-query": "0.53.0", | ||
"@zag-js/text-selection": "0.53.0" | ||
"@zag-js/types": "0.54.0", | ||
"@zag-js/dom-query": "0.54.0", | ||
"@zag-js/text-selection": "0.54.0" | ||
}, | ||
@@ -33,0 +33,0 @@ "devDependencies": { |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
115225
1560
1
+ Added@zag-js/dom-query@0.54.0(transitive)
+ Added@zag-js/text-selection@0.54.0(transitive)
+ Added@zag-js/types@0.54.0(transitive)
- Removed@zag-js/dom-query@0.53.0(transitive)
- Removed@zag-js/text-selection@0.53.0(transitive)
- Removed@zag-js/types@0.53.0(transitive)
Updated@zag-js/dom-query@0.54.0
Updated@zag-js/types@0.54.0