@utsp/input 0.5.0 → 0.6.0-nightly.20251207012530.05b8403
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var G=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var ue=Object.prototype.hasOwnProperty;var le=(c,s,e)=>s in c?G(c,s,{enumerable:!0,configurable:!0,writable:!0,value:e}):c[s]=e;var m=(c,s)=>G(c,"name",{value:s,configurable:!0});var de=(c,s)=>{for(var e in s)G(c,e,{get:s[e],enumerable:!0})},ce=(c,s,e,t)=>{if(s&&typeof s=="object"||typeof s=="function")for(let o of re(s))!ue.call(c,o)&&o!==e&&G(c,o,{get:()=>s[o],enumerable:!(t=ae(s,o))||t.enumerable});return c};var he=c=>ce(G({},"__esModule",{value:!0}),c);var d=(c,s,e)=>(le(c,typeof s!="symbol"?s+"":s,e),e);var pe={};de(pe,{BaseInputs:()=>g,GamepadInput:()=>v.GamepadInput,GamepadInputs:()=>I,InputCollector:()=>L,InputDeviceType:()=>v.InputDeviceType,InputEventType:()=>$,KeyboardInput:()=>v.KeyboardInput,KeyboardInputs:()=>E,MobileInputs:()=>k,MouseInput:()=>v.MouseInput,MouseInputs:()=>T,TouchInput:()=>v.TouchInput,UnifiedInputRouter:()=>K,Vector2:()=>R.Vector2,Vector3:()=>R.Vector3,isInputs:()=>q,useGamepadInputs:()=>ee,useKeyboardInputs:()=>Q,useMobileInputs:()=>_,useMouseInputs:()=>Z});module.exports=he(pe);var R=require("@utsp/types"),v=require("@utsp/types");var $=(p=>(p.KeyDown="keydown",p.KeyUp="keyup",p.MouseDown="mousedown",p.MouseUp="mouseup",p.MouseMove="mousemove",p.MouseWheel="mousewheel",p.TouchStart="touchstart",p.TouchEnd="touchend",p.TouchMove="touchmove",p.GamepadConnected="gamepadconnected",p.GamepadDisconnected="gamepaddisconnected",p.GamepadButton="gamepadbutton",p.GamepadAxis="gamepadaxis",p))($||{}),W=class W{constructor(s=window,e={}){d(this,"isActive",!1);d(this,"targetElement");d(this,"config");d(this,"callbacks",{});this.targetElement=s,this.config={enabled:!0,preventDefault:!1,stopPropagation:!1,debug:!1,...e}}isListening(){return this.isActive}destroy(){this.stop(),this.clearCallbacks()}setCallbacks(s){typeof s=="object"&&s!==null&&Object.assign(this.callbacks,s)}clearCallbacks(){this.callbacks={}}getTargetElement(){return this.targetElement}enable(){this.config.enabled=!0,this.isActive||this.start()}disable(){this.config.enabled=!1,this.isActive&&this.stop()}isEnabled(){return this.config.enabled??!0}emit(s,...e){this.callbacks[s]&&this.callbacks[s].forEach(t=>{try{t(...e)}catch(o){this.config.debug&&console.error(`Error in ${s} callback:`,o)}})}log(...s){this.config.debug&&console.warn("[InputSystem]",...s)}};m(W,"BaseInputs");var g=W;function q(c){return typeof c=="object"&&c!==null&&"start"in c&&"stop"in c&&"reset"in c&&"isListening"in c&&"destroy"in c}m(q,"isInputs");var V=class V extends g{constructor(e=window,t={}){super(e,t);d(this,"keys",{});d(this,"keyboardCallbacks",{});d(this,"textInputsThisFrame",[]);d(this,"boundHandlers");this.boundHandlers={keyDown:this.handleKeyDown.bind(this),keyUp:this.handleKeyUp.bind(this)}}start(){this.isActive||(this.targetElement.addEventListener("keydown",this.boundHandlers.keyDown),this.targetElement.addEventListener("keyup",this.boundHandlers.keyUp),this.isActive=!0)}stop(){this.isActive&&(this.targetElement.removeEventListener("keydown",this.boundHandlers.keyDown),this.targetElement.removeEventListener("keyup",this.boundHandlers.keyUp),this.isActive=!1)}reset(){this.keys={}}resetDelta(){}poll(){for(let e in this.keys)this.keys[e].justPressed=!1,this.keys[e].justReleased=!1;this.textInputsThisFrame=[]}getTextInputs(){return this.textInputsThisFrame}isKeyPressed(e){return this.keys[e]?.pressed||!1}isKeyJustPressed(e){return this.keys[e]?.justPressed||!1}isKeyJustReleased(e){return this.keys[e]?.justReleased||!1}getKeysPressed(){return Object.keys(this.keys).filter(e=>this.keys[e].pressed)}getKeysJustPressed(){return Object.keys(this.keys).filter(e=>this.keys[e].justPressed)}getKeysJustReleased(){return Object.keys(this.keys).filter(e=>this.keys[e].justReleased)}isAnyKeyPressed(){return Object.values(this.keys).some(e=>e.pressed)}setKeyboardCallbacks(e){this.keyboardCallbacks={...this.keyboardCallbacks,...e}}clearKeyboardCallbacks(){this.keyboardCallbacks={}}setCallbacks(e){this.isKeyboardCallbacks(e)&&this.setKeyboardCallbacks(e)}isKeyboardCallbacks(e){return typeof e=="object"&&e!==null&&("onKeyDown"in e||"onKeyUp"in e)}handleKeyDown(e){try{let t=e.code,o=/^F([1-9]|1[0-2])$/.test(t),n=(e.ctrlKey||e.metaKey)&&(t==="KeyT"||t==="KeyW"||t==="KeyR"||t==="KeyN"||t==="Tab");this.config.preventDefault&&!o&&!n&&e.preventDefault(),this.config.stopPropagation&&!o&&!n&&e.stopPropagation(),this.keys[t]||(this.keys[t]={pressed:!1,justPressed:!1,justReleased:!1}),this.keys[t].pressed||(this.keys[t].justPressed=!0,this.keyboardCallbacks.onKeyDown?.(t,e)),this.keys[t].pressed=!0,this.keys[t].justReleased=!1;let i=e.key;i.length===1&&!e.ctrlKey&&!e.metaKey&&this.textInputsThisFrame.push(i)}catch(t){console.error("Error in keyboard keydown handler:",t)}}handleKeyUp(e){try{let t=e.code,o=/^F([1-9]|1[0-2])$/.test(t),n=(e.ctrlKey||e.metaKey)&&(t==="KeyT"||t==="KeyW"||t==="KeyR"||t==="KeyN"||t==="Tab");this.config.preventDefault&&!o&&!n&&e.preventDefault(),this.config.stopPropagation&&!o&&!n&&e.stopPropagation(),this.keys[t]||(this.keys[t]={pressed:!1,justPressed:!1,justReleased:!1}),this.keys[t].pressed&&(this.keys[t].justReleased=!0,this.keyboardCallbacks.onKeyUp?.(t,e)),this.keys[t].pressed=!1,this.keys[t].justPressed=!1}catch(t){console.error("Error in keyboard keyup handler:",t)}}};m(V,"KeyboardInputs");var E=V;function Q(c,s){let e=new E(c);return s&&e.setCallbacks(s),e.start(),e}m(Q,"useKeyboardInputs");var C=require("@utsp/types");var U=class U extends g{constructor(e=window,t={}){super(e,t);d(this,"mouseButtons",{left:{pressed:!1,justPressed:!1,justReleased:!1},middle:{pressed:!1,justPressed:!1,justReleased:!1},right:{pressed:!1,justPressed:!1,justReleased:!1}});d(this,"mousePosition",C.Vector2.zero());d(this,"mouseDelta",C.Vector2.zero());d(this,"wheelDelta",0);d(this,"mouseCallbacks",{});d(this,"boundHandlers");this.boundHandlers={mouseDown:this.handleMouseDown.bind(this),mouseUp:this.handleMouseUp.bind(this),mouseMove:this.handleMouseMove.bind(this),wheel:this.handleWheel.bind(this),mouseEnter:this.handleMouseEnter.bind(this),mouseLeave:this.handleMouseLeave.bind(this),contextMenu:this.handleContextMenu.bind(this)}}start(){this.isActive||(this.targetElement.addEventListener("mousedown",this.boundHandlers.mouseDown),this.targetElement.addEventListener("mouseup",this.boundHandlers.mouseUp),this.targetElement.addEventListener("mousemove",this.boundHandlers.mouseMove),this.targetElement.addEventListener("wheel",this.boundHandlers.wheel),this.targetElement.addEventListener("mouseenter",this.boundHandlers.mouseEnter),this.targetElement.addEventListener("mouseleave",this.boundHandlers.mouseLeave),this.targetElement.addEventListener("contextmenu",this.boundHandlers.contextMenu),this.isActive=!0)}stop(){this.isActive&&(this.targetElement.removeEventListener("mousedown",this.boundHandlers.mouseDown),this.targetElement.removeEventListener("mouseup",this.boundHandlers.mouseUp),this.targetElement.removeEventListener("mousemove",this.boundHandlers.mouseMove),this.targetElement.removeEventListener("wheel",this.boundHandlers.wheel),this.targetElement.removeEventListener("mouseenter",this.boundHandlers.mouseEnter),this.targetElement.removeEventListener("mouseleave",this.boundHandlers.mouseLeave),this.targetElement.removeEventListener("contextmenu",this.boundHandlers.contextMenu),this.isActive=!1)}reset(){this.mouseButtons={left:{pressed:!1,justPressed:!1,justReleased:!1},middle:{pressed:!1,justPressed:!1,justReleased:!1},right:{pressed:!1,justPressed:!1,justReleased:!1}},this.mousePosition=C.Vector2.zero(),this.mouseDelta=C.Vector2.zero(),this.wheelDelta=0}poll(){this.mouseButtons.left.justPressed=!1,this.mouseButtons.left.justReleased=!1,this.mouseButtons.middle.justPressed=!1,this.mouseButtons.middle.justReleased=!1,this.mouseButtons.right.justPressed=!1,this.mouseButtons.right.justReleased=!1,this.resetDelta()}resetDelta(){this.mouseDelta=C.Vector2.zero(),this.wheelDelta=0}isLeftMousePressed(){return this.mouseButtons.left.pressed}isLeftMouseJustPressed(){return this.mouseButtons.left.justPressed}isLeftMouseJustReleased(){return this.mouseButtons.left.justReleased}isRightMousePressed(){return this.mouseButtons.right.pressed}isRightMouseJustPressed(){return this.mouseButtons.right.justPressed}isRightMouseJustReleased(){return this.mouseButtons.right.justReleased}isMiddleMousePressed(){return this.mouseButtons.middle.pressed}isMiddleMouseJustPressed(){return this.mouseButtons.middle.justPressed}isMiddleMouseJustReleased(){return this.mouseButtons.middle.justReleased}getMousePosition(){return this.mousePosition.clone()}getMouseDelta(){return this.mouseDelta.clone()}getWheelDelta(){return this.wheelDelta}setMouseCallbacks(e){this.mouseCallbacks={...this.mouseCallbacks,...e}}clearMouseCallbacks(){this.mouseCallbacks={}}setCallbacks(e){this.isMouseCallbacks(e)&&this.setMouseCallbacks(e)}isMouseCallbacks(e){return typeof e=="object"&&e!==null&&("onMouseDown"in e||"onMouseUp"in e||"onMouseMove"in e||"onMouseWheel"in e||"onMouseEnter"in e||"onMouseLeave"in e)}handleMouseDown(e){try{switch(this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation(),e.button){case 0:this.mouseButtons.left.pressed||(this.mouseButtons.left.justPressed=!0),this.mouseButtons.left.pressed=!0,this.mouseButtons.left.justReleased=!1,this.mouseCallbacks.onMouseDown?.("left",this.mousePosition,e);break;case 1:this.mouseButtons.middle.pressed||(this.mouseButtons.middle.justPressed=!0),this.mouseButtons.middle.pressed=!0,this.mouseButtons.middle.justReleased=!1,this.mouseCallbacks.onMouseDown?.("middle",this.mousePosition,e);break;case 2:this.mouseButtons.right.pressed||(this.mouseButtons.right.justPressed=!0),this.mouseButtons.right.pressed=!0,this.mouseButtons.right.justReleased=!1,this.mouseCallbacks.onMouseDown?.("right",this.mousePosition,e);break}}catch(t){console.error("Error in mouse down handler:",t)}}handleMouseUp(e){try{switch(this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation(),e.button){case 0:this.mouseButtons.left.pressed&&(this.mouseButtons.left.justReleased=!0),this.mouseButtons.left.pressed=!1,this.mouseButtons.left.justPressed=!1,this.mouseCallbacks.onMouseUp?.("left",this.mousePosition,e);break;case 1:this.mouseButtons.middle.pressed&&(this.mouseButtons.middle.justReleased=!0),this.mouseButtons.middle.pressed=!1,this.mouseButtons.middle.justPressed=!1,this.mouseCallbacks.onMouseUp?.("middle",this.mousePosition,e);break;case 2:this.mouseButtons.right.pressed&&(this.mouseButtons.right.justReleased=!0),this.mouseButtons.right.pressed=!1,this.mouseButtons.right.justPressed=!1,this.mouseCallbacks.onMouseUp?.("right",this.mousePosition,e);break}}catch(t){console.error("Error in mouse up handler:",t)}}handleMouseMove(e){try{this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation();let t=new C.Vector2(e.clientX,e.clientY);this.mouseDelta=t.subtract(this.mousePosition),this.mousePosition=t,this.mouseCallbacks.onMouseMove?.(this.mousePosition,this.mouseDelta,e)}catch(t){console.error("Error in mouse move handler:",t)}}handleWheel(e){try{this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation(),this.wheelDelta=e.deltaY,this.mouseCallbacks.onMouseWheel?.(this.wheelDelta,e)}catch(t){console.error("Error in mouse wheel handler:",t)}}handleMouseEnter(e){try{this.mouseCallbacks.onMouseEnter?.(e)}catch(t){console.error("Error in mouse enter handler:",t)}}handleMouseLeave(e){try{this.mouseCallbacks.onMouseLeave?.(e)}catch(t){console.error("Error in mouse leave handler:",t)}}handleContextMenu(e){try{e.preventDefault(),this.config.stopPropagation&&e.stopPropagation()}catch(t){console.error("Error in context menu handler:",t)}}};m(U,"MouseInputs");var T=U;function Z(c,s){let e=new T(c);return s&&e.setCallbacks(s),e.start(),e}m(Z,"useMouseInputs");var z=require("@utsp/types");var Y=class Y extends g{constructor(e=window,t={}){super(e,t);d(this,"touches",new Map);d(this,"nativeToInternal",new Map);d(this,"mobileCallbacks",{});d(this,"mobileConfig");d(this,"maxTouches",10);d(this,"lastLogTime",0);d(this,"boundHandlers");this.mobileConfig={targetElement:e,preventDefault:t.preventDefault??!0,passive:t.passive??!1,maxTouches:t.maxTouches??10,enabled:t.enabled??!0,debug:t.debug??!1,stopPropagation:t.stopPropagation??!1},this.maxTouches=this.mobileConfig.maxTouches,this.mobileConfig.preventDefault&&this.mobileConfig.passive&&(console.warn("[MobileInputs] passive=true prevents preventDefault() from working! Setting passive=false."),this.mobileConfig.passive=!1),this.boundHandlers={touchStart:this.handleTouchStart.bind(this),touchEnd:this.handleTouchEnd.bind(this),touchMove:this.handleTouchMove.bind(this),touchCancel:this.handleTouchCancel.bind(this),orientationChange:this.handleOrientationChange.bind(this)}}start(){if(this.isActive)return;let e={passive:!this.mobileConfig.preventDefault&&this.mobileConfig.passive};this.targetElement.addEventListener("touchstart",this.boundHandlers.touchStart,e),this.targetElement.addEventListener("touchend",this.boundHandlers.touchEnd,e),this.targetElement.addEventListener("touchmove",this.boundHandlers.touchMove,e),this.targetElement.addEventListener("touchcancel",this.boundHandlers.touchCancel,e),window.addEventListener("orientationchange",this.boundHandlers.orientationChange),this.isActive=!0}stop(){this.isActive&&(this.targetElement.removeEventListener("touchstart",this.boundHandlers.touchStart),this.targetElement.removeEventListener("touchend",this.boundHandlers.touchEnd),this.targetElement.removeEventListener("touchmove",this.boundHandlers.touchMove),this.targetElement.removeEventListener("touchcancel",this.boundHandlers.touchCancel),window.removeEventListener("orientationchange",this.boundHandlers.orientationChange),this.isActive=!1)}reset(){this.touches.clear(),this.nativeToInternal.clear()}resetDelta(){}poll(){for(let e of this.touches.values())e.justTouched=!1,e.justReleased=!1}isTouchActive(e){return e<0||e>=this.maxTouches?!1:this.touches.has(e)}getTouchPosition(e){if(e<0||e>=this.maxTouches)return null;let t=this.touches.get(e);return t?t.position.clone():null}getTouchStartPosition(e){if(e<0||e>=this.maxTouches)return null;let t=this.touches.get(e);return t?t.startPosition.clone():null}getTouchDelta(e){if(e<0||e>=this.maxTouches)return null;let t=this.touches.get(e);return t?t.position.subtract(t.startPosition):null}getTouchCount(){return this.touches.size}isTouchJustStarted(e){if(e<0||e>=this.maxTouches)return!1;let t=this.touches.get(e);return t?t.justTouched:!1}isTouchJustReleased(e){if(e<0||e>=this.maxTouches)return!1;let t=this.touches.get(e);return t?t.justReleased:!1}isAnyTouchJustStarted(){for(let e of this.touches.values())if(e.justTouched)return!0;return!1}getAllTouches(){return Array.from(this.touches.values())}setMobileCallbacks(e){this.mobileCallbacks={...this.mobileCallbacks,...e}}clearMobileCallbacks(){this.mobileCallbacks={}}setCallbacks(e){this.isMobileCallbacks(e)&&this.setMobileCallbacks(e)}isMobileCallbacks(e){return typeof e=="object"&&e!==null&&("onTouchStart"in e||"onTouchEnd"in e||"onTouchMove"in e||"onTouchCancel"in e||"onOrientationChange"in e)}handleTouchStart(e){try{this.mobileConfig.preventDefault&&e.preventDefault();let t=Array.from(e.changedTouches),o=[];for(let n of t){if(this.touches.size>=this.maxTouches)break;let i=-1;for(let h=0;h<this.maxTouches;h++)if(!this.touches.has(h)){i=h;break}if(i===-1)continue;let a=new z.Vector2(n.clientX,n.clientY),l={id:i,nativeId:n.identifier,position:a.clone(),startPosition:a.clone(),active:!0,justTouched:!0,justReleased:!1};this.touches.set(i,l),this.nativeToInternal.set(n.identifier,i),o.push(l),console.warn(`\u{1F446} Touch START - ID: ${i}`)}this.mobileCallbacks.onTouchStart?.(o,e)}catch(t){console.error("Error in touch start handler:",t)}}handleTouchEnd(e){try{this.mobileConfig.preventDefault&&e.preventDefault();let t=Array.from(e.changedTouches),o=[];for(let n of t){let i=this.nativeToInternal.get(n.identifier);if(i!==void 0){let a=this.touches.get(i);a&&(a.justReleased=!0,a.justTouched=!1,o.push({...a}))}}for(let n of t){let i=this.nativeToInternal.get(n.identifier);i!==void 0&&(this.touches.delete(i),this.nativeToInternal.delete(n.identifier),console.warn(`\u{1F447} Touch END - ID: ${i}`))}this.mobileCallbacks.onTouchEnd?.(o,e)}catch(t){console.error("Error in touch end handler:",t)}}handleTouchMove(e){try{let t=Array.from(e.changedTouches);this.mobileConfig.debug&&(!this.lastLogTime||Date.now()-this.lastLogTime>200)&&(console.warn(`\u{1F504} TouchMove event - ${t.length} touches changed`),this.lastLogTime=Date.now());for(let o of t){let n=this.nativeToInternal.get(o.identifier);if(n!==void 0){let i=this.touches.get(n);if(i){let a=i.position.clone();i.position=new z.Vector2(o.clientX,o.clientY),this.mobileConfig.debug&&(!this.lastLogTime||Date.now()-this.lastLogTime>200)&&console.warn(`\u{1F504} Updated touch ${i.id} (native ${o.identifier}) - ${a.x.toFixed(1)},${a.y.toFixed(1)} \u2192 ${o.clientX.toFixed(1)},${o.clientY.toFixed(1)}`)}}else this.mobileConfig.debug&&console.warn(`\u26A0\uFE0F Touch move for unknown native ID ${o.identifier}`)}this.mobileCallbacks.onTouchMove?.(this.getAllTouches(),e)}catch(t){console.error("Error in touch move handler:",t)}}handleTouchCancel(e){try{this.mobileConfig.preventDefault&&e.preventDefault();let t=[],o=Array.from(e.changedTouches);for(let n of o){let i=this.nativeToInternal.get(n.identifier);if(i!==void 0){let a=this.touches.get(i);a&&(a.justReleased=!0,a.justTouched=!1,t.push({...a}))}}for(let n of o){let i=this.nativeToInternal.get(n.identifier);i!==void 0&&(this.touches.delete(i),this.nativeToInternal.delete(n.identifier),this.mobileConfig.debug&&console.warn(`\u274C Touch CANCEL - ID: ${i}, nativeId: ${n.identifier}`))}this.mobileCallbacks.onTouchCancel?.(t,e)}catch(t){console.error("Error in touch cancel handler:",t)}}handleOrientationChange(e){try{let t=(window.screen.orientation&&window.screen.orientation.angle)??window.orientation??0;this.mobileCallbacks.onOrientationChange?.(t)}catch(t){console.error("Error in orientation change handler:",t)}}};m(Y,"MobileInputs");var k=Y;function _(c,s,e){console.warn("[MobileInputs] useMobileInputs() is deprecated and causes memory leaks. Use useMemo + useEffect instead.");let t=new k(c,e);return s&&t.setCallbacks(s),t.start(),t}m(_,"useMobileInputs");var X=class X extends g{constructor(e={}){super(window,e);d(this,"gamepads",new Map);d(this,"previousGamepads",new Map);d(this,"gamepadCallbacks",{});d(this,"gamepadConfig");d(this,"pollingIntervalId",null);d(this,"rafId",null);d(this,"boundHandlers");this.gamepadConfig={targetElement:window,maxGamepads:e.maxGamepads??4,axisDeadzone:e.axisDeadzone??.1,pollingInterval:e.pollingInterval??16,autoPolling:e.autoPolling??!0,enabled:e.enabled??!0,debug:e.debug??!1,preventDefault:e.preventDefault??!1,stopPropagation:e.stopPropagation??!1},this.boundHandlers={connected:this.handleGamepadConnected.bind(this),disconnected:this.handleGamepadDisconnected.bind(this)}}start(){this.isActive||(window.addEventListener("gamepadconnected",this.boundHandlers.connected),window.addEventListener("gamepaddisconnected",this.boundHandlers.disconnected),this.gamepadConfig.autoPolling&&this.startPolling(),this.isActive=!0,this.log("GamepadInputs started"))}stop(){this.isActive&&(window.removeEventListener("gamepadconnected",this.boundHandlers.connected),window.removeEventListener("gamepaddisconnected",this.boundHandlers.disconnected),this.stopPolling(),this.isActive=!1,this.log("GamepadInputs stopped"))}reset(){this.gamepads.clear(),this.previousGamepads.clear()}resetDelta(){this.previousGamepads.clear(),this.gamepads.forEach((e,t)=>{this.previousGamepads.set(t,this.cloneGamepadState(e))})}startPolling(){if(this.pollingIntervalId!==null||this.rafId!==null)return;let e=m(()=>{this.poll(),this.rafId=requestAnimationFrame(e)},"poll");this.rafId=requestAnimationFrame(e),this.log("Polling started")}stopPolling(){this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null),this.pollingIntervalId!==null&&(clearInterval(this.pollingIntervalId),this.pollingIntervalId=null),this.log("Polling stopped")}poll(){let e=navigator.getGamepads?navigator.getGamepads():[];for(let t=0;t<e.length&&t<this.gamepadConfig.maxGamepads;t++){let o=e[t];o&&this.updateGamepadState(o)}}getConnectedGamepadCount(){return this.gamepads.size}isGamepadConnected(e){return this.gamepads.has(e)&&this.gamepads.get(e).connected}getGamepadState(e){return this.gamepads.get(e)||null}getAllGamepads(){return Array.from(this.gamepads.values()).filter(e=>e.connected)}isButtonPressed(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid buttonIndex: ${t}. Must be a non-negative integer.`);let o=this.gamepads.get(e);return!o||!o.connected||t>=o.buttons.length?!1:o.buttons[t].pressed}isButtonJustPressed(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid buttonIndex: ${t}. Must be a non-negative integer.`);let o=this.gamepads.get(e);return!o||!o.connected||t>=o.buttons.length?!1:o.buttons[t].justPressed}isButtonJustReleased(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid buttonIndex: ${t}. Must be a non-negative integer.`);let o=this.gamepads.get(e);return!o||!o.connected||t>=o.buttons.length?!1:o.buttons[t].justReleased}getButtonValue(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid buttonIndex: ${t}. Must be a non-negative integer.`);let o=this.gamepads.get(e);return!o||!o.connected||t>=o.buttons.length?0:o.buttons[t].value}getAxis(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid axisIndex: ${t}. Must be a non-negative integer.`);let o=this.gamepads.get(e);if(!o||!o.connected||t>=o.axes.length)return 0;let n=o.axes[t];return this.applyDeadzone(n)}getAxisRaw(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid axisIndex: ${t}. Must be a non-negative integer.`);let o=this.gamepads.get(e);return!o||!o.connected||t>=o.axes.length?0:o.axes[t]}getLeftStick(e){return{x:this.getAxis(e,0),y:this.getAxis(e,1)}}getRightStick(e){return{x:this.getAxis(e,2),y:this.getAxis(e,3)}}setGamepadCallbacks(e){this.gamepadCallbacks={...this.gamepadCallbacks,...e}}clearGamepadCallbacks(){this.gamepadCallbacks={}}setCallbacks(e){this.isGamepadCallbacks(e)&&this.setGamepadCallbacks(e)}isGamepadCallbacks(e){return typeof e=="object"&&e!==null&&("onGamepadConnected"in e||"onGamepadDisconnected"in e||"onButtonDown"in e||"onButtonUp"in e||"onAxisMove"in e)}updateGamepadState(e){let t=this.gamepads.get(e.index),o=Array.from(e.buttons).map((a,l)=>{let h=t?.buttons[l],w=a.pressed,b=h?.pressed??!1;return{pressed:w,justPressed:w&&!b,justReleased:!w&&b,value:a.value,touched:a.touched??!1}}),n=Array.from(e.axes),i={id:e.id,index:e.index,connected:e.connected,buttons:o,axes:n,timestamp:e.timestamp,mapping:e.mapping};this.gamepads.set(e.index,i),this.triggerCallbacks(i,t)}triggerCallbacks(e,t){try{e.buttons.forEach((o,n)=>{o.justPressed&&this.gamepadCallbacks.onButtonDown?.(e.index,n,o.value),o.justReleased&&this.gamepadCallbacks.onButtonUp?.(e.index,n)}),e.axes.forEach((o,n)=>{let i=t?.axes[n]??0,a=this.applyDeadzone(o),l=this.applyDeadzone(i);Math.abs(a-l)>.01&&this.gamepadCallbacks.onAxisMove?.(e.index,n,a)})}catch(o){this.log("Error in gamepad callbacks:",o)}}handleGamepadConnected(e){try{this.log(`Gamepad connected: ${e.gamepad.id} at index ${e.gamepad.index}`);let t={id:e.gamepad.id,index:e.gamepad.index,connected:!0,buttons:Array.from(e.gamepad.buttons).map(o=>({pressed:o.pressed,justPressed:!1,justReleased:!1,value:o.value,touched:o.touched??!1})),axes:Array.from(e.gamepad.axes),timestamp:e.gamepad.timestamp,mapping:e.gamepad.mapping};this.gamepads.set(e.gamepad.index,t),this.gamepadCallbacks.onGamepadConnected?.(t)}catch(t){this.log("Error handling gamepad connected:",t)}}handleGamepadDisconnected(e){try{this.log(`Gamepad disconnected at index ${e.gamepad.index}`),this.gamepads.delete(e.gamepad.index),this.previousGamepads.delete(e.gamepad.index),this.gamepadCallbacks.onGamepadDisconnected?.(e.gamepad.index)}catch(t){this.log("Error handling gamepad disconnected:",t)}}applyDeadzone(e){let t=this.gamepadConfig.axisDeadzone;return Math.abs(e)<t?0:(e>0?1:-1)*((Math.abs(e)-t)/(1-t))}cloneGamepadState(e){return{...e,buttons:e.buttons.map(t=>({...t})),axes:[...e.axes]}}};m(X,"GamepadInputs");var I=X;function ee(c,s){let e=new I(s);return c&&e.setGamepadCallbacks(c),e.start(),e}m(ee,"useGamepadInputs");var r=require("@utsp/types");var N=class N{constructor(s={}){d(this,"keyboard",null);d(this,"mouse",null);d(this,"gamepad",null);d(this,"mobile",null);d(this,"config");this.config={enableKeyboardMouse:s.enableKeyboardMouse??!0,enableGamepad:s.enableGamepad??!0,enableMobile:s.enableMobile??!1,targetElement:s.targetElement??window,mobileTargetElement:s.mobileTargetElement??s.targetElement??window,debug:s.debug??!1,keyboardConfig:{preventDefault:!1,stopPropagation:!1,...s.keyboardConfig},mouseConfig:{preventDefault:!1,stopPropagation:!1,...s.mouseConfig},mobileConfig:{preventDefault:!0,passive:!1,maxTouches:10,...s.mobileConfig}},this.initialize()}initialize(){this.config.enableKeyboardMouse&&(this.keyboard=new E(this.config.targetElement,{preventDefault:this.config.keyboardConfig?.preventDefault??!1,stopPropagation:this.config.keyboardConfig?.stopPropagation??!1,debug:this.config.debug}),this.keyboard.start(),this.mouse=new T(this.config.targetElement,{preventDefault:this.config.mouseConfig?.preventDefault??!1,stopPropagation:this.config.mouseConfig?.stopPropagation??!1,debug:this.config.debug}),this.mouse.start(),this.log("Keyboard/Mouse initialized")),this.config.enableGamepad&&(this.gamepad=new I({debug:this.config.debug}),this.gamepad.start(),this.log("Gamepad initialized")),this.config.enableMobile&&(this.config.mobileTargetElement?(this.mobile=new k(this.config.mobileTargetElement,this.config.mobileConfig),this.mobile.start(),this.log("Mobile/Touch initialized")):this.warn("Mobile input enabled but no canvas provided - mobile input will be disabled until setMobileTarget() is called"))}getButton(s,e){if(!(0,r.isButton)({device:s,input:e}))return this.warn(`Input ${e} on device ${s} is not a button`),!1;switch(s){case r.InputDeviceType.Keyboard:return this.getKeyboardButton(e);case r.InputDeviceType.Mouse:return this.getMouseButton(e);case r.InputDeviceType.Gamepad:return this.getGamepadButton(e);case r.InputDeviceType.Touch:return this.getTouchButton(e);default:return this.warn(`Unknown device type: ${s}`),!1}}getButtonJustPressed(s,e){if(!(0,r.isButton)({device:s,input:e}))return this.warn(`Input ${e} on device ${s} is not a button`),!1;switch(s){case r.InputDeviceType.Keyboard:return this.getKeyboardButtonJustPressed(e);case r.InputDeviceType.Mouse:return this.getMouseButtonJustPressed(e);case r.InputDeviceType.Gamepad:return this.getGamepadButtonJustPressed(e);case r.InputDeviceType.Touch:return this.getTouchButtonJustPressed(e);default:return this.warn(`Unknown device type: ${s}`),!1}}getButtonJustReleased(s,e){if(!(0,r.isButton)({device:s,input:e}))return this.warn(`Input ${e} on device ${s} is not a button`),!1;switch(s){case r.InputDeviceType.Keyboard:return this.getKeyboardButtonJustReleased(e);case r.InputDeviceType.Mouse:return this.getMouseButtonJustReleased(e);case r.InputDeviceType.Gamepad:return this.getGamepadButtonJustReleased(e);case r.InputDeviceType.Touch:return this.getTouchButtonJustReleased(e);default:return this.warn(`Unknown device type: ${s}`),!1}}getAxis(s,e){if(!(0,r.isAxis)({device:s,input:e}))return this.warn(`Input ${e} on device ${s} is not an axis`),0;switch(s){case r.InputDeviceType.Keyboard:return this.warn("Keyboard does not have axis inputs"),0;case r.InputDeviceType.Mouse:return this.getMouseAxis(e);case r.InputDeviceType.Gamepad:return this.getGamepadAxis(e);case r.InputDeviceType.Touch:return this.getTouchAxis(e);default:return this.warn(`Unknown device type: ${s}`),0}}getKeyboardButton(s){if(!this.keyboard)return!1;let e=r.KeyboardInput[s];return this.keyboard.isKeyPressed(e)}getKeyboardButtonJustPressed(s){if(!this.keyboard)return!1;let e=r.KeyboardInput[s];return this.keyboard.isKeyJustPressed(e)}getKeyboardButtonJustReleased(s){if(!this.keyboard)return!1;let e=r.KeyboardInput[s];return this.keyboard.isKeyJustReleased(e)}getMouseButton(s){if(!this.mouse)return!1;switch(s){case r.MouseInput.LeftButton:return this.mouse.isLeftMousePressed();case r.MouseInput.RightButton:return this.mouse.isRightMousePressed();case r.MouseInput.MiddleButton:return this.mouse.isMiddleMousePressed();default:return!1}}getMouseButtonJustPressed(s){if(!this.mouse)return!1;switch(s){case r.MouseInput.LeftButton:return this.mouse.isLeftMouseJustPressed();case r.MouseInput.RightButton:return this.mouse.isRightMouseJustPressed();case r.MouseInput.MiddleButton:return this.mouse.isMiddleMouseJustPressed();default:return!1}}getMouseButtonJustReleased(s){if(!this.mouse)return!1;switch(s){case r.MouseInput.LeftButton:return this.mouse.isLeftMouseJustReleased();case r.MouseInput.RightButton:return this.mouse.isRightMouseJustReleased();case r.MouseInput.MiddleButton:return this.mouse.isMiddleMouseJustReleased();default:return!1}}getGamepadButton(s){return!this.gamepad||s>=100?!1:this.gamepad.isButtonPressed(0,s)}getGamepadButtonJustPressed(s){return!this.gamepad||s>=100?!1:this.gamepad.isButtonJustPressed(0,s)}getGamepadButtonJustReleased(s){return!this.gamepad||s>=100?!1:this.gamepad.isButtonJustReleased(0,s)}getTouchButton(s){return this.mobile?s>=100?!1:this.mobile.isTouchActive?.(s)??!1:(console.warn("\u{1F6AB} MobileInputs not initialized!"),!1)}getTouchButtonJustPressed(s){return!this.mobile||s>=100?!1:this.mobile.isTouchJustStarted?.(s)??!1}getTouchButtonJustReleased(s){return!this.mobile||s>=100?!1:this.mobile.isTouchJustReleased?.(s)??!1}getMouseAxis(s){if(!this.mouse)return 0;switch(s){case r.MouseInput.PositionX:return this.mouse.getMousePosition().x;case r.MouseInput.PositionY:return this.mouse.getMousePosition().y;case r.MouseInput.DeltaX:return this.mouse.getMouseDelta().x;case r.MouseInput.DeltaY:return this.mouse.getMouseDelta().y;case r.MouseInput.WheelDeltaY:return this.mouse.getWheelDelta();default:return 0}}getGamepadAxis(s){if(!this.gamepad||s<100)return 0;let e=s-100;return this.gamepad.getAxis(0,e)}getTouchAxis(s){if(!this.mobile)return 0;if(s>=100&&s<200){let e=Math.floor((s-100)/2),t=(s-100)%2===0,o=this.mobile.getTouchPosition?.(e);return this.config.debug&&o&&console.warn(`\u{1F3AF} getTouchAxis(${s}) - touchIndex: ${e}, ${t?"X":"Y"}: ${t?o.x:o.y}`),o?t?o.x:o.y:0}return 0}getMousePosition(){if(!this.mouse)return null;let s=this.mouse.getMousePosition();return{x:s.x,y:s.y}}setMobileTarget(s){if(!s){this.warn("setMobileTarget() called with null/undefined canvas - mobile input will remain disabled");return}if(this.config.mobileTargetElement=s,!this.config.enableMobile){this.warn("setMobileTarget() called but mobile input is disabled in config");return}this.mobile&&this.mobile.stop(),this.mobile=new k(s,this.config.mobileConfig),this.mobile.start()}getTextInputs(){return this.keyboard?this.keyboard.getTextInputs():[]}start(){this.keyboard?.start(),this.mouse?.start(),this.log("Input router started")}stop(){this.keyboard?.stop(),this.mouse?.stop(),this.log("Input router stopped")}reset(){this.keyboard?.reset(),this.mouse?.reset(),this.log("Input router reset")}poll(){this.keyboard?.poll(),this.mouse?.poll(),this.gamepad?.poll(),this.mobile?.poll()}isListening(){return this.keyboard!==null&&this.config.enableKeyboardMouse||this.gamepad!==null&&this.config.enableGamepad||this.mobile!==null&&this.config.enableMobile}destroy(){this.keyboard?.destroy(),this.mouse?.destroy(),this.keyboard=null,this.mouse=null,this.gamepad=null,this.mobile=null,this.log("Input router destroyed")}log(s){this.config.debug&&console.warn(`[InputRouter] ${s}`)}warn(s){console.warn(`[InputRouter] ${s}`)}};m(N,"UnifiedInputRouter");var K=N;var u=require("@utsp/types");var F=class F{static collectAxisSources(s,e){let t=new Map;for(let o of s)for(let n of o.sources){if(t.has(n.sourceId))continue;let i=0,a=!1;if(n.type===u.InputDeviceType.Keyboard&&n.negativeKey!==void 0&&n.positiveKey!==void 0){let l=e.getButton(u.InputDeviceType.Keyboard,n.negativeKey);e.getButton(u.InputDeviceType.Keyboard,n.positiveKey)&&(i+=1),l&&(i-=1),a=!0}else if(n.type===u.InputDeviceType.Mouse&&n.mouseAxis!==void 0)i=e.getAxis(u.InputDeviceType.Mouse,n.mouseAxis),a=!0;else if(n.type===u.InputDeviceType.Gamepad&&n.axis!==void 0)i=e.getAxis(u.InputDeviceType.Gamepad,n.axis),a=!0;else if(n.type===u.InputDeviceType.Touch&&n.touchId!==void 0&&n.touchAxis!==void 0){let l=100+n.touchId*2,h=n.touchAxis==="x"?l:l+1;i=e.getAxis(u.InputDeviceType.Touch,h),a=!0}a&&t.set(n.sourceId,i)}return t}static collectButtonSources(s,e){let t=new Map;for(let o of s)for(let n of o.sources){if(t.has(n.sourceId))continue;let i=!1,a=!1;n.type===u.InputDeviceType.Keyboard&&n.key!==void 0?(i=e.getButton(u.InputDeviceType.Keyboard,n.key),a=!0):n.type===u.InputDeviceType.Mouse&&n.mouseButton!==void 0?(i=e.getButton(u.InputDeviceType.Mouse,n.mouseButton),a=!0):n.type===u.InputDeviceType.Gamepad&&n.button!==void 0?(i=e.getButton(u.InputDeviceType.Gamepad,n.button),a=!0):n.type===u.InputDeviceType.Touch&&n.touchButton!==void 0&&(i=e.getButton(u.InputDeviceType.Touch,n.touchButton),a=!0),a&&t.set(n.sourceId,i)}return t}static collectButtonSourcesWithTransitions(s,e){let t=new Map;for(let o of s)for(let n of o.sources){if(t.has(n.sourceId))continue;let i=!1,a=!1,l=!1,h=!1;n.type===u.InputDeviceType.Keyboard&&n.key!==void 0?(i=e.getButton(u.InputDeviceType.Keyboard,n.key),a=e.getButtonJustPressed?.(u.InputDeviceType.Keyboard,n.key)??!1,l=e.getButtonJustReleased?.(u.InputDeviceType.Keyboard,n.key)??!1,h=!0):n.type===u.InputDeviceType.Mouse&&n.mouseButton!==void 0?(i=e.getButton(u.InputDeviceType.Mouse,n.mouseButton),a=e.getButtonJustPressed?.(u.InputDeviceType.Mouse,n.mouseButton)??!1,l=e.getButtonJustReleased?.(u.InputDeviceType.Mouse,n.mouseButton)??!1,h=!0):n.type===u.InputDeviceType.Gamepad&&n.button!==void 0?(i=e.getButton(u.InputDeviceType.Gamepad,n.button),a=e.getButtonJustPressed?.(u.InputDeviceType.Gamepad,n.button)??!1,l=e.getButtonJustReleased?.(u.InputDeviceType.Gamepad,n.button)??!1,h=!0):n.type===u.InputDeviceType.Touch&&n.touchButton!==void 0&&(i=e.getButton(u.InputDeviceType.Touch,n.touchButton),a=e.getButtonJustPressed?.(u.InputDeviceType.Touch,n.touchButton)??!1,l=e.getButtonJustReleased?.(u.InputDeviceType.Touch,n.touchButton)??!1,h=!0),h&&t.set(n.sourceId,{pressed:i,justPressed:a,justReleased:l})}return t}static collectMousePosition(s,e,t,o,n){let i=s.getAxis(u.InputDeviceType.Mouse,u.MouseInput.PositionX),a=s.getAxis(u.InputDeviceType.Mouse,u.MouseInput.PositionY),l=e.getBoundingClientRect(),h=e.width/e.height,w=l.width/l.height,b,f,p,y;h>w?(b=l.width,f=l.width/h,p=0,y=(l.height-f)/2):(b=l.height*h,f=l.height,p=(l.width-b)/2,y=0);let x=n?.offsetX||0,P=n?.offsetY||0;p+=x,y+=P,b-=2*x,f-=2*P;let B=i-l.left-p,D=a-l.top-y,M=b/t,A=f/o,O=Math.floor(B/M),S=Math.floor(D/A),j=B>=0&&B<b&&D>=0&&D<f;return{x:Math.max(0,Math.min(t-1,O)),y:Math.max(0,Math.min(o-1,S)),over:j}}static collectTouchPositions(s,e,t,o,n=10,i){let a=[],l=e.getBoundingClientRect(),h=e.width/e.height,w=l.width/l.height,b,f,p,y;h>w?(b=l.width,f=l.width/h,p=0,y=(l.height-f)/2):(b=l.height*h,f=l.height,p=(l.width-b)/2,y=0);let x=i?.offsetX||0,P=i?.offsetY||0;p+=x,y+=P,b-=2*x,f-=2*P;let B=b/t,D=f/o;for(let M=0;M<n;M++){let A=M;if(s.getButton(u.InputDeviceType.Touch,A)){let S=100+M*2,j=101+M*2,te=s.getAxis(u.InputDeviceType.Touch,S),se=s.getAxis(u.InputDeviceType.Touch,j),H=te-l.left-p,J=se-l.top-y,oe=Math.floor(H/B),ne=Math.floor(J/D),ie=H>=0&&H<b&&J>=0&&J<f;a.push({id:M,x:Math.max(0,Math.min(t-1,oe)),y:Math.max(0,Math.min(o-1,ne)),over:ie})}}return a}static collectTextInputs(s){return typeof s.getTextInputs=="function"?s.getTextInputs():[]}};m(F,"InputCollector");var L=F;
|
|
1
|
+
"use strict";var B=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var ue=Object.prototype.hasOwnProperty;var le=(d,s,e)=>s in d?B(d,s,{enumerable:!0,configurable:!0,writable:!0,value:e}):d[s]=e;var m=(d,s)=>B(d,"name",{value:s,configurable:!0});var de=(d,s)=>{for(var e in s)B(d,e,{get:s[e],enumerable:!0})},ce=(d,s,e,t)=>{if(s&&typeof s=="object"||typeof s=="function")for(let o of re(s))!ue.call(d,o)&&o!==e&&B(d,o,{get:()=>s[o],enumerable:!(t=ae(s,o))||t.enumerable});return d};var he=d=>ce(B({},"__esModule",{value:!0}),d);var l=(d,s,e)=>(le(d,typeof s!="symbol"?s+"":s,e),e);var pe={};de(pe,{BaseInputs:()=>f,GamepadInput:()=>y.GamepadInput,GamepadInputs:()=>x,InputCollector:()=>L,InputDeviceType:()=>y.InputDeviceType,InputEventType:()=>W,KeyboardInput:()=>y.KeyboardInput,KeyboardInputs:()=>C,MobileInputs:()=>w,MouseInput:()=>y.MouseInput,MouseInputs:()=>I,TouchInput:()=>y.TouchInput,UnifiedInputRouter:()=>G,Vector2:()=>K.Vector2,Vector3:()=>K.Vector3,isInputs:()=>Q,useGamepadInputs:()=>te,useKeyboardInputs:()=>Z,useMobileInputs:()=>ee,useMouseInputs:()=>_});module.exports=he(pe);var K=require("@utsp/types"),y=require("@utsp/types");var W=(p=>(p.KeyDown="keydown",p.KeyUp="keyup",p.MouseDown="mousedown",p.MouseUp="mouseup",p.MouseMove="mousemove",p.MouseWheel="mousewheel",p.TouchStart="touchstart",p.TouchEnd="touchend",p.TouchMove="touchmove",p.GamepadConnected="gamepadconnected",p.GamepadDisconnected="gamepaddisconnected",p.GamepadButton="gamepadbutton",p.GamepadAxis="gamepadaxis",p))(W||{}),V=class V{constructor(s=window,e={}){l(this,"isActive",!1);l(this,"targetElement");l(this,"config");l(this,"callbacks",{});this.targetElement=s,this.config={enabled:!0,preventDefault:!1,stopPropagation:!1,debug:!1,...e}}isListening(){return this.isActive}destroy(){this.stop(),this.clearCallbacks()}setCallbacks(s){typeof s=="object"&&s!==null&&Object.assign(this.callbacks,s)}clearCallbacks(){this.callbacks={}}getTargetElement(){return this.targetElement}enable(){this.config.enabled=!0,this.isActive||this.start()}disable(){this.config.enabled=!1,this.isActive&&this.stop()}isEnabled(){return this.config.enabled??!0}emit(s,...e){this.callbacks[s]&&this.callbacks[s].forEach(t=>{try{t(...e)}catch(o){this.config.debug&&console.error(`Error in ${s} callback:`,o)}})}log(...s){this.config.debug&&console.warn("[InputSystem]",...s)}};m(V,"BaseInputs");var f=V;function Q(d){return typeof d=="object"&&d!==null&&"start"in d&&"stop"in d&&"reset"in d&&"isListening"in d&&"destroy"in d}m(Q,"isInputs");var U=class U extends f{constructor(e=window,t={}){super(e,t);l(this,"keys",{});l(this,"keyboardCallbacks",{});l(this,"textInputsThisFrame",[]);l(this,"boundHandlers");this.boundHandlers={keyDown:this.handleKeyDown.bind(this),keyUp:this.handleKeyUp.bind(this)}}start(){this.isActive||(this.targetElement.addEventListener("keydown",this.boundHandlers.keyDown),this.targetElement.addEventListener("keyup",this.boundHandlers.keyUp),this.isActive=!0)}stop(){this.isActive&&(this.targetElement.removeEventListener("keydown",this.boundHandlers.keyDown),this.targetElement.removeEventListener("keyup",this.boundHandlers.keyUp),this.isActive=!1)}reset(){this.keys={}}resetDelta(){}poll(){for(let e in this.keys)this.keys[e].justPressed=!1,this.keys[e].justReleased=!1;this.textInputsThisFrame=[]}getTextInputs(){return this.textInputsThisFrame}isKeyPressed(e){return this.keys[e]?.pressed||!1}isKeyJustPressed(e){return this.keys[e]?.justPressed||!1}isKeyJustReleased(e){return this.keys[e]?.justReleased||!1}getKeysPressed(){return Object.keys(this.keys).filter(e=>this.keys[e].pressed)}getKeysJustPressed(){return Object.keys(this.keys).filter(e=>this.keys[e].justPressed)}getKeysJustReleased(){return Object.keys(this.keys).filter(e=>this.keys[e].justReleased)}isAnyKeyPressed(){return Object.values(this.keys).some(e=>e.pressed)}setKeyboardCallbacks(e){this.keyboardCallbacks={...this.keyboardCallbacks,...e}}clearKeyboardCallbacks(){this.keyboardCallbacks={}}setCallbacks(e){this.isKeyboardCallbacks(e)&&this.setKeyboardCallbacks(e)}isKeyboardCallbacks(e){return typeof e=="object"&&e!==null&&("onKeyDown"in e||"onKeyUp"in e)}handleKeyDown(e){try{let t=e.code,o=/^F([1-9]|1[0-2])$/.test(t),n=(e.ctrlKey||e.metaKey)&&(t==="KeyT"||t==="KeyW"||t==="KeyR"||t==="KeyN"||t==="Tab");this.config.preventDefault&&!o&&!n&&e.preventDefault(),this.config.stopPropagation&&!o&&!n&&e.stopPropagation(),this.keys[t]||(this.keys[t]={pressed:!1,justPressed:!1,justReleased:!1}),this.keys[t].pressed||(this.keys[t].justPressed=!0,this.keyboardCallbacks.onKeyDown?.(t,e)),this.keys[t].pressed=!0,this.keys[t].justReleased=!1;let i=e.key;i.length===1&&!e.ctrlKey&&!e.metaKey&&this.textInputsThisFrame.push(i)}catch(t){console.error("Error in keyboard keydown handler:",t)}}handleKeyUp(e){try{let t=e.code,o=/^F([1-9]|1[0-2])$/.test(t),n=(e.ctrlKey||e.metaKey)&&(t==="KeyT"||t==="KeyW"||t==="KeyR"||t==="KeyN"||t==="Tab");this.config.preventDefault&&!o&&!n&&e.preventDefault(),this.config.stopPropagation&&!o&&!n&&e.stopPropagation(),this.keys[t]||(this.keys[t]={pressed:!1,justPressed:!1,justReleased:!1}),this.keys[t].pressed&&(this.keys[t].justReleased=!0,this.keyboardCallbacks.onKeyUp?.(t,e)),this.keys[t].pressed=!1,this.keys[t].justPressed=!1}catch(t){console.error("Error in keyboard keyup handler:",t)}}};m(U,"KeyboardInputs");var C=U;function Z(d,s){let e=new C(d);return s&&e.setCallbacks(s),e.start(),e}m(Z,"useKeyboardInputs");var T=require("@utsp/types");var z=class z extends f{constructor(e=window,t={}){super(e,t);l(this,"mouseButtons",{left:{pressed:!1,justPressed:!1,justReleased:!1},middle:{pressed:!1,justPressed:!1,justReleased:!1},right:{pressed:!1,justPressed:!1,justReleased:!1}});l(this,"mousePosition",T.Vector2.zero());l(this,"mouseDelta",T.Vector2.zero());l(this,"wheelDelta",0);l(this,"mouseCallbacks",{});l(this,"boundHandlers");this.boundHandlers={mouseDown:this.handleMouseDown.bind(this),mouseUp:this.handleMouseUp.bind(this),mouseMove:this.handleMouseMove.bind(this),wheel:this.handleWheel.bind(this),mouseEnter:this.handleMouseEnter.bind(this),mouseLeave:this.handleMouseLeave.bind(this),contextMenu:this.handleContextMenu.bind(this)}}start(){this.isActive||(this.targetElement.addEventListener("mousedown",this.boundHandlers.mouseDown),this.targetElement.addEventListener("mouseup",this.boundHandlers.mouseUp),this.targetElement.addEventListener("mousemove",this.boundHandlers.mouseMove),this.targetElement.addEventListener("wheel",this.boundHandlers.wheel),this.targetElement.addEventListener("mouseenter",this.boundHandlers.mouseEnter),this.targetElement.addEventListener("mouseleave",this.boundHandlers.mouseLeave),this.targetElement.addEventListener("contextmenu",this.boundHandlers.contextMenu),this.isActive=!0)}stop(){this.isActive&&(this.targetElement.removeEventListener("mousedown",this.boundHandlers.mouseDown),this.targetElement.removeEventListener("mouseup",this.boundHandlers.mouseUp),this.targetElement.removeEventListener("mousemove",this.boundHandlers.mouseMove),this.targetElement.removeEventListener("wheel",this.boundHandlers.wheel),this.targetElement.removeEventListener("mouseenter",this.boundHandlers.mouseEnter),this.targetElement.removeEventListener("mouseleave",this.boundHandlers.mouseLeave),this.targetElement.removeEventListener("contextmenu",this.boundHandlers.contextMenu),this.isActive=!1)}reset(){this.mouseButtons={left:{pressed:!1,justPressed:!1,justReleased:!1},middle:{pressed:!1,justPressed:!1,justReleased:!1},right:{pressed:!1,justPressed:!1,justReleased:!1}},this.mousePosition=T.Vector2.zero(),this.mouseDelta=T.Vector2.zero(),this.wheelDelta=0}poll(){this.mouseButtons.left.justPressed=!1,this.mouseButtons.left.justReleased=!1,this.mouseButtons.middle.justPressed=!1,this.mouseButtons.middle.justReleased=!1,this.mouseButtons.right.justPressed=!1,this.mouseButtons.right.justReleased=!1,this.resetDelta()}resetDelta(){this.mouseDelta=T.Vector2.zero(),this.wheelDelta=0}isLeftMousePressed(){return this.mouseButtons.left.pressed}isLeftMouseJustPressed(){return this.mouseButtons.left.justPressed}isLeftMouseJustReleased(){return this.mouseButtons.left.justReleased}isRightMousePressed(){return this.mouseButtons.right.pressed}isRightMouseJustPressed(){return this.mouseButtons.right.justPressed}isRightMouseJustReleased(){return this.mouseButtons.right.justReleased}isMiddleMousePressed(){return this.mouseButtons.middle.pressed}isMiddleMouseJustPressed(){return this.mouseButtons.middle.justPressed}isMiddleMouseJustReleased(){return this.mouseButtons.middle.justReleased}getMousePosition(){return this.mousePosition.clone()}getMouseDelta(){return this.mouseDelta.clone()}getWheelDelta(){return this.wheelDelta}setMouseCallbacks(e){this.mouseCallbacks={...this.mouseCallbacks,...e}}clearMouseCallbacks(){this.mouseCallbacks={}}setCallbacks(e){this.isMouseCallbacks(e)&&this.setMouseCallbacks(e)}isMouseCallbacks(e){return typeof e=="object"&&e!==null&&("onMouseDown"in e||"onMouseUp"in e||"onMouseMove"in e||"onMouseWheel"in e||"onMouseEnter"in e||"onMouseLeave"in e)}handleMouseDown(e){try{switch(this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation(),e.button){case 0:this.mouseButtons.left.pressed||(this.mouseButtons.left.justPressed=!0),this.mouseButtons.left.pressed=!0,this.mouseButtons.left.justReleased=!1,this.mouseCallbacks.onMouseDown?.("left",this.mousePosition,e);break;case 1:this.mouseButtons.middle.pressed||(this.mouseButtons.middle.justPressed=!0),this.mouseButtons.middle.pressed=!0,this.mouseButtons.middle.justReleased=!1,this.mouseCallbacks.onMouseDown?.("middle",this.mousePosition,e);break;case 2:this.mouseButtons.right.pressed||(this.mouseButtons.right.justPressed=!0),this.mouseButtons.right.pressed=!0,this.mouseButtons.right.justReleased=!1,this.mouseCallbacks.onMouseDown?.("right",this.mousePosition,e);break}}catch(t){console.error("Error in mouse down handler:",t)}}handleMouseUp(e){try{switch(this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation(),e.button){case 0:this.mouseButtons.left.pressed&&(this.mouseButtons.left.justReleased=!0),this.mouseButtons.left.pressed=!1,this.mouseButtons.left.justPressed=!1,this.mouseCallbacks.onMouseUp?.("left",this.mousePosition,e);break;case 1:this.mouseButtons.middle.pressed&&(this.mouseButtons.middle.justReleased=!0),this.mouseButtons.middle.pressed=!1,this.mouseButtons.middle.justPressed=!1,this.mouseCallbacks.onMouseUp?.("middle",this.mousePosition,e);break;case 2:this.mouseButtons.right.pressed&&(this.mouseButtons.right.justReleased=!0),this.mouseButtons.right.pressed=!1,this.mouseButtons.right.justPressed=!1,this.mouseCallbacks.onMouseUp?.("right",this.mousePosition,e);break}}catch(t){console.error("Error in mouse up handler:",t)}}handleMouseMove(e){try{this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation();let t=new T.Vector2(e.clientX,e.clientY);this.mouseDelta=t.subtract(this.mousePosition),this.mousePosition=t,this.mouseCallbacks.onMouseMove?.(this.mousePosition,this.mouseDelta,e)}catch(t){console.error("Error in mouse move handler:",t)}}handleWheel(e){try{this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation(),this.wheelDelta=e.deltaY,this.mouseCallbacks.onMouseWheel?.(this.wheelDelta,e)}catch(t){console.error("Error in mouse wheel handler:",t)}}handleMouseEnter(e){try{this.mouseCallbacks.onMouseEnter?.(e)}catch(t){console.error("Error in mouse enter handler:",t)}}handleMouseLeave(e){try{this.mouseCallbacks.onMouseLeave?.(e)}catch(t){console.error("Error in mouse leave handler:",t)}}handleContextMenu(e){try{e.preventDefault(),this.config.stopPropagation&&e.stopPropagation()}catch(t){console.error("Error in context menu handler:",t)}}};m(z,"MouseInputs");var I=z;function _(d,s){let e=new I(d);return s&&e.setCallbacks(s),e.start(),e}m(_,"useMouseInputs");var Y=require("@utsp/types");var X=class X extends f{constructor(e=window,t={}){super(e,t);l(this,"touches",new Map);l(this,"nativeToInternal",new Map);l(this,"mobileCallbacks",{});l(this,"mobileConfig");l(this,"maxTouches",10);l(this,"lastLogTime",0);l(this,"boundHandlers");this.mobileConfig={targetElement:e,preventDefault:t.preventDefault??!0,passive:t.passive??!1,maxTouches:t.maxTouches??10,enabled:t.enabled??!0,debug:t.debug??!1,stopPropagation:t.stopPropagation??!1},this.maxTouches=this.mobileConfig.maxTouches,this.mobileConfig.preventDefault&&this.mobileConfig.passive&&(console.warn("[MobileInputs] passive=true prevents preventDefault() from working! Setting passive=false."),this.mobileConfig.passive=!1),this.boundHandlers={touchStart:this.handleTouchStart.bind(this),touchEnd:this.handleTouchEnd.bind(this),touchMove:this.handleTouchMove.bind(this),touchCancel:this.handleTouchCancel.bind(this),orientationChange:this.handleOrientationChange.bind(this)}}start(){if(this.isActive)return;let e={passive:!this.mobileConfig.preventDefault&&this.mobileConfig.passive};this.targetElement.addEventListener("touchstart",this.boundHandlers.touchStart,e),this.targetElement.addEventListener("touchend",this.boundHandlers.touchEnd,e),this.targetElement.addEventListener("touchmove",this.boundHandlers.touchMove,e),this.targetElement.addEventListener("touchcancel",this.boundHandlers.touchCancel,e),window.addEventListener("orientationchange",this.boundHandlers.orientationChange),this.isActive=!0}stop(){this.isActive&&(this.targetElement.removeEventListener("touchstart",this.boundHandlers.touchStart),this.targetElement.removeEventListener("touchend",this.boundHandlers.touchEnd),this.targetElement.removeEventListener("touchmove",this.boundHandlers.touchMove),this.targetElement.removeEventListener("touchcancel",this.boundHandlers.touchCancel),window.removeEventListener("orientationchange",this.boundHandlers.orientationChange),this.isActive=!1)}reset(){this.touches.clear(),this.nativeToInternal.clear()}resetDelta(){}poll(){for(let e of this.touches.values())e.justTouched=!1,e.justReleased=!1}isTouchActive(e){return e<0||e>=this.maxTouches?!1:this.touches.has(e)}getTouchPosition(e){if(e<0||e>=this.maxTouches)return null;let t=this.touches.get(e);return t?t.position.clone():null}getTouchStartPosition(e){if(e<0||e>=this.maxTouches)return null;let t=this.touches.get(e);return t?t.startPosition.clone():null}getTouchDelta(e){if(e<0||e>=this.maxTouches)return null;let t=this.touches.get(e);return t?t.position.subtract(t.startPosition):null}getTouchCount(){return this.touches.size}isTouchJustStarted(e){if(e<0||e>=this.maxTouches)return!1;let t=this.touches.get(e);return t?t.justTouched:!1}isTouchJustReleased(e){if(e<0||e>=this.maxTouches)return!1;let t=this.touches.get(e);return t?t.justReleased:!1}isAnyTouchJustStarted(){for(let e of this.touches.values())if(e.justTouched)return!0;return!1}getAllTouches(){return Array.from(this.touches.values())}setMobileCallbacks(e){this.mobileCallbacks={...this.mobileCallbacks,...e}}clearMobileCallbacks(){this.mobileCallbacks={}}setCallbacks(e){this.isMobileCallbacks(e)&&this.setMobileCallbacks(e)}isMobileCallbacks(e){return typeof e=="object"&&e!==null&&("onTouchStart"in e||"onTouchEnd"in e||"onTouchMove"in e||"onTouchCancel"in e||"onOrientationChange"in e)}handleTouchStart(e){try{this.mobileConfig.preventDefault&&e.preventDefault();let t=Array.from(e.changedTouches),o=[];for(let n of t){if(this.touches.size>=this.maxTouches)break;let i=-1;for(let h=0;h<this.maxTouches;h++)if(!this.touches.has(h)){i=h;break}if(i===-1)continue;let a=new Y.Vector2(n.clientX,n.clientY),c={id:i,nativeId:n.identifier,position:a.clone(),startPosition:a.clone(),active:!0,justTouched:!0,justReleased:!1};this.touches.set(i,c),this.nativeToInternal.set(n.identifier,i),o.push(c),console.warn(`\u{1F446} Touch START - ID: ${i}`)}this.mobileCallbacks.onTouchStart?.(o,e)}catch(t){console.error("Error in touch start handler:",t)}}handleTouchEnd(e){try{this.mobileConfig.preventDefault&&e.preventDefault();let t=Array.from(e.changedTouches),o=[];for(let n of t){let i=this.nativeToInternal.get(n.identifier);if(i!==void 0){let a=this.touches.get(i);a&&(a.justReleased=!0,a.justTouched=!1,o.push({...a}))}}for(let n of t){let i=this.nativeToInternal.get(n.identifier);i!==void 0&&(this.touches.delete(i),this.nativeToInternal.delete(n.identifier),console.warn(`\u{1F447} Touch END - ID: ${i}`))}this.mobileCallbacks.onTouchEnd?.(o,e)}catch(t){console.error("Error in touch end handler:",t)}}handleTouchMove(e){try{let t=Array.from(e.changedTouches);this.mobileConfig.debug&&(!this.lastLogTime||Date.now()-this.lastLogTime>200)&&(console.warn(`\u{1F504} TouchMove event - ${t.length} touches changed`),this.lastLogTime=Date.now());for(let o of t){let n=this.nativeToInternal.get(o.identifier);if(n!==void 0){let i=this.touches.get(n);if(i){let a=i.position.clone();i.position=new Y.Vector2(o.clientX,o.clientY),this.mobileConfig.debug&&(!this.lastLogTime||Date.now()-this.lastLogTime>200)&&console.warn(`\u{1F504} Updated touch ${i.id} (native ${o.identifier}) - ${a.x.toFixed(1)},${a.y.toFixed(1)} \u2192 ${o.clientX.toFixed(1)},${o.clientY.toFixed(1)}`)}}else this.mobileConfig.debug&&console.warn(`\u26A0\uFE0F Touch move for unknown native ID ${o.identifier}`)}this.mobileCallbacks.onTouchMove?.(this.getAllTouches(),e)}catch(t){console.error("Error in touch move handler:",t)}}handleTouchCancel(e){try{this.mobileConfig.preventDefault&&e.preventDefault();let t=[],o=Array.from(e.changedTouches);for(let n of o){let i=this.nativeToInternal.get(n.identifier);if(i!==void 0){let a=this.touches.get(i);a&&(a.justReleased=!0,a.justTouched=!1,t.push({...a}))}}for(let n of o){let i=this.nativeToInternal.get(n.identifier);i!==void 0&&(this.touches.delete(i),this.nativeToInternal.delete(n.identifier),this.mobileConfig.debug&&console.warn(`\u274C Touch CANCEL - ID: ${i}, nativeId: ${n.identifier}`))}this.mobileCallbacks.onTouchCancel?.(t,e)}catch(t){console.error("Error in touch cancel handler:",t)}}handleOrientationChange(e){try{let t=(window.screen.orientation&&window.screen.orientation.angle)??window.orientation??0;this.mobileCallbacks.onOrientationChange?.(t)}catch(t){console.error("Error in orientation change handler:",t)}}};m(X,"MobileInputs");var w=X;function ee(d,s,e){console.warn("[MobileInputs] useMobileInputs() is deprecated and causes memory leaks. Use useMemo + useEffect instead.");let t=new w(d,e);return s&&t.setCallbacks(s),t.start(),t}m(ee,"useMobileInputs");var N=class N extends f{constructor(e={}){super(window,e);l(this,"gamepads",new Map);l(this,"previousGamepads",new Map);l(this,"gamepadCallbacks",{});l(this,"gamepadConfig");l(this,"pollingIntervalId",null);l(this,"rafId",null);l(this,"boundHandlers");this.gamepadConfig={targetElement:window,maxGamepads:e.maxGamepads??4,axisDeadzone:e.axisDeadzone??.1,pollingInterval:e.pollingInterval??16,autoPolling:e.autoPolling??!0,enabled:e.enabled??!0,debug:e.debug??!1,preventDefault:e.preventDefault??!1,stopPropagation:e.stopPropagation??!1},this.boundHandlers={connected:this.handleGamepadConnected.bind(this),disconnected:this.handleGamepadDisconnected.bind(this)}}start(){this.isActive||(window.addEventListener("gamepadconnected",this.boundHandlers.connected),window.addEventListener("gamepaddisconnected",this.boundHandlers.disconnected),this.gamepadConfig.autoPolling&&this.startPolling(),this.isActive=!0,this.log("GamepadInputs started"))}stop(){this.isActive&&(window.removeEventListener("gamepadconnected",this.boundHandlers.connected),window.removeEventListener("gamepaddisconnected",this.boundHandlers.disconnected),this.stopPolling(),this.isActive=!1,this.log("GamepadInputs stopped"))}reset(){this.gamepads.clear(),this.previousGamepads.clear()}resetDelta(){this.previousGamepads.clear(),this.gamepads.forEach((e,t)=>{this.previousGamepads.set(t,this.cloneGamepadState(e))})}startPolling(){if(this.pollingIntervalId!==null||this.rafId!==null)return;let e=m(()=>{this.poll(),this.rafId=requestAnimationFrame(e)},"poll");this.rafId=requestAnimationFrame(e),this.log("Polling started")}stopPolling(){this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null),this.pollingIntervalId!==null&&(clearInterval(this.pollingIntervalId),this.pollingIntervalId=null),this.log("Polling stopped")}poll(){let e=navigator.getGamepads?navigator.getGamepads():[];for(let t=0;t<e.length&&t<this.gamepadConfig.maxGamepads;t++){let o=e[t];o&&this.updateGamepadState(o)}}getConnectedGamepadCount(){return this.gamepads.size}isGamepadConnected(e){return this.gamepads.has(e)&&this.gamepads.get(e).connected}getGamepadState(e){return this.gamepads.get(e)||null}getAllGamepads(){return Array.from(this.gamepads.values()).filter(e=>e.connected)}isButtonPressed(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid buttonIndex: ${t}. Must be a non-negative integer.`);let o=this.gamepads.get(e);return!o||!o.connected||t>=o.buttons.length?!1:o.buttons[t].pressed}isButtonJustPressed(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid buttonIndex: ${t}. Must be a non-negative integer.`);let o=this.gamepads.get(e);return!o||!o.connected||t>=o.buttons.length?!1:o.buttons[t].justPressed}isButtonJustReleased(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid buttonIndex: ${t}. Must be a non-negative integer.`);let o=this.gamepads.get(e);return!o||!o.connected||t>=o.buttons.length?!1:o.buttons[t].justReleased}getButtonValue(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid buttonIndex: ${t}. Must be a non-negative integer.`);let o=this.gamepads.get(e);return!o||!o.connected||t>=o.buttons.length?0:o.buttons[t].value}getAxis(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid axisIndex: ${t}. Must be a non-negative integer.`);let o=this.gamepads.get(e);if(!o||!o.connected||t>=o.axes.length)return 0;let n=o.axes[t];return this.applyDeadzone(n)}getAxisRaw(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid axisIndex: ${t}. Must be a non-negative integer.`);let o=this.gamepads.get(e);return!o||!o.connected||t>=o.axes.length?0:o.axes[t]}getLeftStick(e){return{x:this.getAxis(e,0),y:this.getAxis(e,1)}}getRightStick(e){return{x:this.getAxis(e,2),y:this.getAxis(e,3)}}setGamepadCallbacks(e){this.gamepadCallbacks={...this.gamepadCallbacks,...e}}clearGamepadCallbacks(){this.gamepadCallbacks={}}setCallbacks(e){this.isGamepadCallbacks(e)&&this.setGamepadCallbacks(e)}isGamepadCallbacks(e){return typeof e=="object"&&e!==null&&("onGamepadConnected"in e||"onGamepadDisconnected"in e||"onButtonDown"in e||"onButtonUp"in e||"onAxisMove"in e)}updateGamepadState(e){let t=this.gamepads.get(e.index),o=Array.from(e.buttons).map((a,c)=>{let h=t?.buttons[c],M=a.pressed,g=h?.pressed??!1;return{pressed:M,justPressed:M&&!g,justReleased:!M&&g,value:a.value,touched:a.touched??!1}}),n=Array.from(e.axes),i={id:e.id,index:e.index,connected:e.connected,buttons:o,axes:n,timestamp:e.timestamp,mapping:e.mapping};this.gamepads.set(e.index,i),this.triggerCallbacks(i,t)}triggerCallbacks(e,t){try{e.buttons.forEach((o,n)=>{o.justPressed&&this.gamepadCallbacks.onButtonDown?.(e.index,n,o.value),o.justReleased&&this.gamepadCallbacks.onButtonUp?.(e.index,n)}),e.axes.forEach((o,n)=>{let i=t?.axes[n]??0,a=this.applyDeadzone(o),c=this.applyDeadzone(i);Math.abs(a-c)>.01&&this.gamepadCallbacks.onAxisMove?.(e.index,n,a)})}catch(o){this.log("Error in gamepad callbacks:",o)}}handleGamepadConnected(e){try{this.log(`Gamepad connected: ${e.gamepad.id} at index ${e.gamepad.index}`);let t={id:e.gamepad.id,index:e.gamepad.index,connected:!0,buttons:Array.from(e.gamepad.buttons).map(o=>({pressed:o.pressed,justPressed:!1,justReleased:!1,value:o.value,touched:o.touched??!1})),axes:Array.from(e.gamepad.axes),timestamp:e.gamepad.timestamp,mapping:e.gamepad.mapping};this.gamepads.set(e.gamepad.index,t),this.gamepadCallbacks.onGamepadConnected?.(t)}catch(t){this.log("Error handling gamepad connected:",t)}}handleGamepadDisconnected(e){try{this.log(`Gamepad disconnected at index ${e.gamepad.index}`),this.gamepads.delete(e.gamepad.index),this.previousGamepads.delete(e.gamepad.index),this.gamepadCallbacks.onGamepadDisconnected?.(e.gamepad.index)}catch(t){this.log("Error handling gamepad disconnected:",t)}}applyDeadzone(e){let t=this.gamepadConfig.axisDeadzone;return Math.abs(e)<t?0:(e>0?1:-1)*((Math.abs(e)-t)/(1-t))}cloneGamepadState(e){return{...e,buttons:e.buttons.map(t=>({...t})),axes:[...e.axes]}}};m(N,"GamepadInputs");var x=N;function te(d,s){let e=new x(s);return d&&e.setGamepadCallbacks(d),e.start(),e}m(te,"useGamepadInputs");var r=require("@utsp/types");var F=class F{constructor(s={}){l(this,"keyboard",null);l(this,"mouse",null);l(this,"gamepad",null);l(this,"mobile",null);l(this,"config");this.config={enableKeyboardMouse:s.enableKeyboardMouse??!0,enableGamepad:s.enableGamepad??!0,enableMobile:s.enableMobile??!1,targetElement:s.targetElement??window,mobileTargetElement:s.mobileTargetElement??s.targetElement??window,debug:s.debug??!1,keyboardConfig:{preventDefault:!1,stopPropagation:!1,...s.keyboardConfig},mouseConfig:{preventDefault:!1,stopPropagation:!1,...s.mouseConfig},mobileConfig:{preventDefault:!0,passive:!1,maxTouches:10,...s.mobileConfig}},this.initialize()}initialize(){this.config.enableKeyboardMouse&&(this.keyboard=new C(this.config.targetElement,{preventDefault:this.config.keyboardConfig?.preventDefault??!1,stopPropagation:this.config.keyboardConfig?.stopPropagation??!1,debug:this.config.debug}),this.keyboard.start(),this.mouse=new I(this.config.targetElement,{preventDefault:this.config.mouseConfig?.preventDefault??!1,stopPropagation:this.config.mouseConfig?.stopPropagation??!1,debug:this.config.debug}),this.mouse.start(),this.log("Keyboard/Mouse initialized")),this.config.enableGamepad&&(this.gamepad=new x({debug:this.config.debug}),this.gamepad.start(),this.log("Gamepad initialized")),this.config.enableMobile&&(this.config.mobileTargetElement?(this.mobile=new w(this.config.mobileTargetElement,this.config.mobileConfig),this.mobile.start(),this.log("Mobile/Touch initialized")):this.warn("Mobile input enabled but no canvas provided - mobile input will be disabled until setMobileTarget() is called"))}getButton(s,e){if(!(0,r.isButton)({device:s,input:e}))return this.warn(`Input ${e} on device ${s} is not a button`),!1;switch(s){case r.InputDeviceType.Keyboard:return this.getKeyboardButton(e);case r.InputDeviceType.Mouse:return this.getMouseButton(e);case r.InputDeviceType.Gamepad:return this.getGamepadButton(e);case r.InputDeviceType.Touch:return this.getTouchButton(e);default:return this.warn(`Unknown device type: ${s}`),!1}}getButtonJustPressed(s,e){if(!(0,r.isButton)({device:s,input:e}))return this.warn(`Input ${e} on device ${s} is not a button`),!1;switch(s){case r.InputDeviceType.Keyboard:return this.getKeyboardButtonJustPressed(e);case r.InputDeviceType.Mouse:return this.getMouseButtonJustPressed(e);case r.InputDeviceType.Gamepad:return this.getGamepadButtonJustPressed(e);case r.InputDeviceType.Touch:return this.getTouchButtonJustPressed(e);default:return this.warn(`Unknown device type: ${s}`),!1}}getButtonJustReleased(s,e){if(!(0,r.isButton)({device:s,input:e}))return this.warn(`Input ${e} on device ${s} is not a button`),!1;switch(s){case r.InputDeviceType.Keyboard:return this.getKeyboardButtonJustReleased(e);case r.InputDeviceType.Mouse:return this.getMouseButtonJustReleased(e);case r.InputDeviceType.Gamepad:return this.getGamepadButtonJustReleased(e);case r.InputDeviceType.Touch:return this.getTouchButtonJustReleased(e);default:return this.warn(`Unknown device type: ${s}`),!1}}getAxis(s,e){if(!(0,r.isAxis)({device:s,input:e}))return this.warn(`Input ${e} on device ${s} is not an axis`),0;switch(s){case r.InputDeviceType.Keyboard:return this.warn("Keyboard does not have axis inputs"),0;case r.InputDeviceType.Mouse:return this.getMouseAxis(e);case r.InputDeviceType.Gamepad:return this.getGamepadAxis(e);case r.InputDeviceType.Touch:return this.getTouchAxis(e);default:return this.warn(`Unknown device type: ${s}`),0}}isLeftMousePressed(){return this.mouse?this.mouse.isLeftMousePressed():!1}getKeyboardButton(s){if(!this.keyboard)return!1;let e=r.KeyboardInput[s];return this.keyboard.isKeyPressed(e)}getKeyboardButtonJustPressed(s){if(!this.keyboard)return!1;let e=r.KeyboardInput[s];return this.keyboard.isKeyJustPressed(e)}getKeyboardButtonJustReleased(s){if(!this.keyboard)return!1;let e=r.KeyboardInput[s];return this.keyboard.isKeyJustReleased(e)}getMouseButton(s){if(!this.mouse)return!1;switch(s){case r.MouseInput.LeftButton:return this.mouse.isLeftMousePressed();case r.MouseInput.RightButton:return this.mouse.isRightMousePressed();case r.MouseInput.MiddleButton:return this.mouse.isMiddleMousePressed();default:return!1}}getMouseButtonJustPressed(s){if(!this.mouse)return!1;switch(s){case r.MouseInput.LeftButton:return this.mouse.isLeftMouseJustPressed();case r.MouseInput.RightButton:return this.mouse.isRightMouseJustPressed();case r.MouseInput.MiddleButton:return this.mouse.isMiddleMouseJustPressed();default:return!1}}getMouseButtonJustReleased(s){if(!this.mouse)return!1;switch(s){case r.MouseInput.LeftButton:return this.mouse.isLeftMouseJustReleased();case r.MouseInput.RightButton:return this.mouse.isRightMouseJustReleased();case r.MouseInput.MiddleButton:return this.mouse.isMiddleMouseJustReleased();default:return!1}}getGamepadButton(s){return!this.gamepad||s>=100?!1:this.gamepad.isButtonPressed(0,s)}getGamepadButtonJustPressed(s){return!this.gamepad||s>=100?!1:this.gamepad.isButtonJustPressed(0,s)}getGamepadButtonJustReleased(s){return!this.gamepad||s>=100?!1:this.gamepad.isButtonJustReleased(0,s)}getTouchButton(s){return this.mobile?s>=100?!1:this.mobile.isTouchActive?.(s)??!1:(console.warn("\u{1F6AB} MobileInputs not initialized!"),!1)}getTouchButtonJustPressed(s){return!this.mobile||s>=100?!1:this.mobile.isTouchJustStarted?.(s)??!1}getTouchButtonJustReleased(s){return!this.mobile||s>=100?!1:this.mobile.isTouchJustReleased?.(s)??!1}getMouseAxis(s){if(!this.mouse)return 0;switch(s){case r.MouseInput.PositionX:return this.mouse.getMousePosition().x;case r.MouseInput.PositionY:return this.mouse.getMousePosition().y;case r.MouseInput.DeltaX:return this.mouse.getMouseDelta().x;case r.MouseInput.DeltaY:return this.mouse.getMouseDelta().y;case r.MouseInput.WheelDeltaY:return this.mouse.getWheelDelta();default:return 0}}getGamepadAxis(s){if(!this.gamepad||s<100)return 0;let e=s-100;return this.gamepad.getAxis(0,e)}getTouchAxis(s){if(!this.mobile)return 0;if(s>=100&&s<200){let e=Math.floor((s-100)/2),t=(s-100)%2===0,o=this.mobile.getTouchPosition?.(e);return this.config.debug&&o&&console.warn(`\u{1F3AF} getTouchAxis(${s}) - touchIndex: ${e}, ${t?"X":"Y"}: ${t?o.x:o.y}`),o?t?o.x:o.y:0}return 0}getMousePosition(){if(!this.mouse)return null;let s=this.mouse.getMousePosition();return{x:s.x,y:s.y}}setMobileTarget(s){if(!s){this.warn("setMobileTarget() called with null/undefined canvas - mobile input will remain disabled");return}if(this.config.mobileTargetElement=s,!this.config.enableMobile){this.warn("setMobileTarget() called but mobile input is disabled in config");return}this.mobile&&this.mobile.stop(),this.mobile=new w(s,this.config.mobileConfig),this.mobile.start()}getTextInputs(){return this.keyboard?this.keyboard.getTextInputs():[]}start(){this.keyboard?.start(),this.mouse?.start(),this.log("Input router started")}stop(){this.keyboard?.stop(),this.mouse?.stop(),this.log("Input router stopped")}reset(){this.keyboard?.reset(),this.mouse?.reset(),this.log("Input router reset")}poll(){this.keyboard?.poll(),this.mouse?.poll(),this.gamepad?.poll(),this.mobile?.poll()}isListening(){return this.keyboard!==null&&this.config.enableKeyboardMouse||this.gamepad!==null&&this.config.enableGamepad||this.mobile!==null&&this.config.enableMobile}destroy(){this.keyboard?.destroy(),this.mouse?.destroy(),this.keyboard=null,this.mouse=null,this.gamepad=null,this.mobile=null,this.log("Input router destroyed")}log(s){this.config.debug&&console.warn(`[InputRouter] ${s}`)}warn(s){console.warn(`[InputRouter] ${s}`)}};m(F,"UnifiedInputRouter");var G=F;var u=require("@utsp/types");var O=class O{static collectAxisSources(s,e){let t=new Map;for(let o of s)for(let n of o.sources){if(t.has(n.sourceId))continue;let i=0,a=!1;if(n.type===u.InputDeviceType.Keyboard&&n.negativeKey!==void 0&&n.positiveKey!==void 0){let c=e.getButton(u.InputDeviceType.Keyboard,n.negativeKey);e.getButton(u.InputDeviceType.Keyboard,n.positiveKey)&&(i+=1),c&&(i-=1),a=!0}else if(n.type===u.InputDeviceType.Mouse&&n.mouseAxis!==void 0)i=e.getAxis(u.InputDeviceType.Mouse,n.mouseAxis),a=!0;else if(n.type===u.InputDeviceType.Gamepad&&n.axis!==void 0)i=e.getAxis(u.InputDeviceType.Gamepad,n.axis),a=!0;else if(n.type===u.InputDeviceType.Touch&&n.touchId!==void 0&&n.touchAxis!==void 0){let c=100+n.touchId*2,h=n.touchAxis==="x"?c:c+1;i=e.getAxis(u.InputDeviceType.Touch,h),a=!0}a&&t.set(n.sourceId,i)}return t}static collectButtonSources(s,e){let t=new Map;for(let o of s)for(let n of o.sources){if(t.has(n.sourceId))continue;let i=!1,a=!1;n.type===u.InputDeviceType.Keyboard&&n.key!==void 0?(i=e.getButton(u.InputDeviceType.Keyboard,n.key),a=!0):n.type===u.InputDeviceType.Mouse&&n.mouseButton!==void 0?(i=e.getButton(u.InputDeviceType.Mouse,n.mouseButton),a=!0):n.type===u.InputDeviceType.Gamepad&&n.button!==void 0?(i=e.getButton(u.InputDeviceType.Gamepad,n.button),a=!0):n.type===u.InputDeviceType.Touch&&n.touchButton!==void 0&&(i=e.getButton(u.InputDeviceType.Touch,n.touchButton),a=!0),a&&t.set(n.sourceId,i)}return t}static collectButtonSourcesWithTransitions(s,e){let t=new Map;for(let o of s)for(let n of o.sources){if(t.has(n.sourceId))continue;let i=!1,a=!1,c=!1,h=!1;n.type===u.InputDeviceType.Keyboard&&n.key!==void 0?(i=e.getButton(u.InputDeviceType.Keyboard,n.key),a=e.getButtonJustPressed?.(u.InputDeviceType.Keyboard,n.key)??!1,c=e.getButtonJustReleased?.(u.InputDeviceType.Keyboard,n.key)??!1,h=!0):n.type===u.InputDeviceType.Mouse&&n.mouseButton!==void 0?(i=e.getButton(u.InputDeviceType.Mouse,n.mouseButton),a=e.getButtonJustPressed?.(u.InputDeviceType.Mouse,n.mouseButton)??!1,c=e.getButtonJustReleased?.(u.InputDeviceType.Mouse,n.mouseButton)??!1,h=!0):n.type===u.InputDeviceType.Gamepad&&n.button!==void 0?(i=e.getButton(u.InputDeviceType.Gamepad,n.button),a=e.getButtonJustPressed?.(u.InputDeviceType.Gamepad,n.button)??!1,c=e.getButtonJustReleased?.(u.InputDeviceType.Gamepad,n.button)??!1,h=!0):n.type===u.InputDeviceType.Touch&&n.touchButton!==void 0&&(i=e.getButton(u.InputDeviceType.Touch,n.touchButton),a=e.getButtonJustPressed?.(u.InputDeviceType.Touch,n.touchButton)??!1,c=e.getButtonJustReleased?.(u.InputDeviceType.Touch,n.touchButton)??!1,h=!0),h&&t.set(n.sourceId,{pressed:i,justPressed:a,justReleased:c})}return t}static collectMousePosition(s,e,t,o,n){let i=s.getAxis(u.InputDeviceType.Mouse,u.MouseInput.PositionX),a=s.getAxis(u.InputDeviceType.Mouse,u.MouseInput.PositionY),c=s.isLeftMousePressed?.()??!1,h=e.getBoundingClientRect(),M=e.width/e.height,g=h.width/h.height,b,p,k,E;M>g?(b=h.width,p=h.width/M,k=0,E=(h.height-p)/2):(b=h.height*M,p=h.height,k=(h.width-b)/2,E=0);let D=n?.offsetX||0,R=n?.offsetY||0;k+=D,E+=R;let P=i-h.left-k,v=a-h.top-E,A=b/t,q=p/o,S=Math.floor(P/A),j=Math.floor(v/q),H=P>=0&&P<b&&v>=0&&v<p;return{x:Math.max(0,Math.min(t-1,S)),y:Math.max(0,Math.min(o-1,j)),over:H,isLeftDown:c}}static collectTouchPositions(s,e,t,o,n=10,i){let a=[],c=e.getBoundingClientRect(),h=e.width/e.height,M=c.width/c.height,g,b,p,k;h>M?(g=c.width,b=c.width/h,p=0,k=(c.height-b)/2):(g=c.height*h,b=c.height,p=(c.width-g)/2,k=0);let E=i?.offsetX||0,D=i?.offsetY||0;p+=E,k+=D,g-=2*E,b-=2*D;let R=g/t,P=b/o;for(let v=0;v<n;v++){let A=v;if(s.getButton(u.InputDeviceType.Touch,A)){let S=100+v*2,j=101+v*2,H=s.getAxis(u.InputDeviceType.Touch,S),se=s.getAxis(u.InputDeviceType.Touch,j),J=H-c.left-p,$=se-c.top-k,oe=Math.floor(J/R),ne=Math.floor($/P),ie=J>=0&&J<g&&$>=0&&$<b;a.push({id:v,x:Math.max(0,Math.min(t-1,oe)),y:Math.max(0,Math.min(o-1,ne)),over:ie})}}return a}static collectTextInputs(s){return typeof s.getTextInputs=="function"?s.getTextInputs():[]}};m(O,"InputCollector");var L=O;
|
package/dist/index.d.ts
CHANGED
|
@@ -1086,6 +1086,11 @@ declare class UnifiedInputRouter implements IInputSystem {
|
|
|
1086
1086
|
* Query an axis value (returns number)
|
|
1087
1087
|
*/
|
|
1088
1088
|
getAxis(device: InputDeviceType, input: number): number;
|
|
1089
|
+
/**
|
|
1090
|
+
* Check if left mouse button is currently pressed
|
|
1091
|
+
* Required by IInputSystem for macro button interactions
|
|
1092
|
+
*/
|
|
1093
|
+
isLeftMousePressed(): boolean;
|
|
1089
1094
|
private getKeyboardButton;
|
|
1090
1095
|
private getKeyboardButtonJustPressed;
|
|
1091
1096
|
private getKeyboardButtonJustReleased;
|
|
@@ -1274,7 +1279,7 @@ declare class InputCollector {
|
|
|
1274
1279
|
* @param gridWidth - Number of columns in the grid
|
|
1275
1280
|
* @param gridHeight - Number of rows in the grid
|
|
1276
1281
|
* @param rendererOffsets - Optional renderer content offsets (for centered rendering)
|
|
1277
|
-
* @returns Grid position {x: column, y: row, over: boolean}
|
|
1282
|
+
* @returns Grid position {x: column, y: row, over: boolean, isLeftDown: boolean}
|
|
1278
1283
|
*
|
|
1279
1284
|
* @example
|
|
1280
1285
|
* ```typescript
|
|
@@ -1287,6 +1292,7 @@ declare class InputCollector {
|
|
|
1287
1292
|
* offsets
|
|
1288
1293
|
* );
|
|
1289
1294
|
* user.setMousePosition(mousePos.x, mousePos.y, mousePos.over, 0);
|
|
1295
|
+
* user.updateMacroMouse(mousePos.x, mousePos.y, mousePos.isLeftDown);
|
|
1290
1296
|
* ```
|
|
1291
1297
|
*/
|
|
1292
1298
|
static collectMousePosition(router: IInputSystem, canvas: HTMLCanvasElement, gridWidth: number, gridHeight: number, rendererOffsets?: {
|
|
@@ -1296,6 +1302,7 @@ declare class InputCollector {
|
|
|
1296
1302
|
x: number;
|
|
1297
1303
|
y: number;
|
|
1298
1304
|
over: boolean;
|
|
1305
|
+
isLeftDown: boolean;
|
|
1299
1306
|
};
|
|
1300
1307
|
/**
|
|
1301
1308
|
* Calculate touch positions in grid coordinates
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var F=Object.defineProperty;var oe=(d,s,e)=>s in d?F(d,s,{enumerable:!0,configurable:!0,writable:!0,value:e}):d[s]=e;var p=(d,s)=>F(d,"name",{value:s,configurable:!0});var u=(d,s,e)=>(oe(d,typeof s!="symbol"?s+"":s,e),e);import{Vector2 as We,Vector3 as Ve}from"@utsp/types";import{InputDeviceType as ze,KeyboardInput as Ye,MouseInput as Xe,GamepadInput as Ne,TouchInput as Fe}from"@utsp/types";var O=(h=>(h.KeyDown="keydown",h.KeyUp="keyup",h.MouseDown="mousedown",h.MouseUp="mouseup",h.MouseMove="mousemove",h.MouseWheel="mousewheel",h.TouchStart="touchstart",h.TouchEnd="touchend",h.TouchMove="touchmove",h.GamepadConnected="gamepadconnected",h.GamepadDisconnected="gamepaddisconnected",h.GamepadButton="gamepadbutton",h.GamepadAxis="gamepadaxis",h))(O||{}),S=class S{constructor(s=window,e={}){u(this,"isActive",!1);u(this,"targetElement");u(this,"config");u(this,"callbacks",{});this.targetElement=s,this.config={enabled:!0,preventDefault:!1,stopPropagation:!1,debug:!1,...e}}isListening(){return this.isActive}destroy(){this.stop(),this.clearCallbacks()}setCallbacks(s){typeof s=="object"&&s!==null&&Object.assign(this.callbacks,s)}clearCallbacks(){this.callbacks={}}getTargetElement(){return this.targetElement}enable(){this.config.enabled=!0,this.isActive||this.start()}disable(){this.config.enabled=!1,this.isActive&&this.stop()}isEnabled(){return this.config.enabled??!0}emit(s,...e){this.callbacks[s]&&this.callbacks[s].forEach(t=>{try{t(...e)}catch(n){this.config.debug&&console.error(`Error in ${s} callback:`,n)}})}log(...s){this.config.debug&&console.warn("[InputSystem]",...s)}};p(S,"BaseInputs");var v=S;function ne(d){return typeof d=="object"&&d!==null&&"start"in d&&"stop"in d&&"reset"in d&&"isListening"in d&&"destroy"in d}p(ne,"isInputs");var j=class j extends v{constructor(e=window,t={}){super(e,t);u(this,"keys",{});u(this,"keyboardCallbacks",{});u(this,"textInputsThisFrame",[]);u(this,"boundHandlers");this.boundHandlers={keyDown:this.handleKeyDown.bind(this),keyUp:this.handleKeyUp.bind(this)}}start(){this.isActive||(this.targetElement.addEventListener("keydown",this.boundHandlers.keyDown),this.targetElement.addEventListener("keyup",this.boundHandlers.keyUp),this.isActive=!0)}stop(){this.isActive&&(this.targetElement.removeEventListener("keydown",this.boundHandlers.keyDown),this.targetElement.removeEventListener("keyup",this.boundHandlers.keyUp),this.isActive=!1)}reset(){this.keys={}}resetDelta(){}poll(){for(let e in this.keys)this.keys[e].justPressed=!1,this.keys[e].justReleased=!1;this.textInputsThisFrame=[]}getTextInputs(){return this.textInputsThisFrame}isKeyPressed(e){return this.keys[e]?.pressed||!1}isKeyJustPressed(e){return this.keys[e]?.justPressed||!1}isKeyJustReleased(e){return this.keys[e]?.justReleased||!1}getKeysPressed(){return Object.keys(this.keys).filter(e=>this.keys[e].pressed)}getKeysJustPressed(){return Object.keys(this.keys).filter(e=>this.keys[e].justPressed)}getKeysJustReleased(){return Object.keys(this.keys).filter(e=>this.keys[e].justReleased)}isAnyKeyPressed(){return Object.values(this.keys).some(e=>e.pressed)}setKeyboardCallbacks(e){this.keyboardCallbacks={...this.keyboardCallbacks,...e}}clearKeyboardCallbacks(){this.keyboardCallbacks={}}setCallbacks(e){this.isKeyboardCallbacks(e)&&this.setKeyboardCallbacks(e)}isKeyboardCallbacks(e){return typeof e=="object"&&e!==null&&("onKeyDown"in e||"onKeyUp"in e)}handleKeyDown(e){try{let t=e.code,n=/^F([1-9]|1[0-2])$/.test(t),o=(e.ctrlKey||e.metaKey)&&(t==="KeyT"||t==="KeyW"||t==="KeyR"||t==="KeyN"||t==="Tab");this.config.preventDefault&&!n&&!o&&e.preventDefault(),this.config.stopPropagation&&!n&&!o&&e.stopPropagation(),this.keys[t]||(this.keys[t]={pressed:!1,justPressed:!1,justReleased:!1}),this.keys[t].pressed||(this.keys[t].justPressed=!0,this.keyboardCallbacks.onKeyDown?.(t,e)),this.keys[t].pressed=!0,this.keys[t].justReleased=!1;let i=e.key;i.length===1&&!e.ctrlKey&&!e.metaKey&&this.textInputsThisFrame.push(i)}catch(t){console.error("Error in keyboard keydown handler:",t)}}handleKeyUp(e){try{let t=e.code,n=/^F([1-9]|1[0-2])$/.test(t),o=(e.ctrlKey||e.metaKey)&&(t==="KeyT"||t==="KeyW"||t==="KeyR"||t==="KeyN"||t==="Tab");this.config.preventDefault&&!n&&!o&&e.preventDefault(),this.config.stopPropagation&&!n&&!o&&e.stopPropagation(),this.keys[t]||(this.keys[t]={pressed:!1,justPressed:!1,justReleased:!1}),this.keys[t].pressed&&(this.keys[t].justReleased=!0,this.keyboardCallbacks.onKeyUp?.(t,e)),this.keys[t].pressed=!1,this.keys[t].justPressed=!1}catch(t){console.error("Error in keyboard keyup handler:",t)}}};p(j,"KeyboardInputs");var E=j;function ie(d,s){let e=new E(d);return s&&e.setCallbacks(s),e.start(),e}p(ie,"useKeyboardInputs");import{Vector2 as C}from"@utsp/types";var H=class H extends v{constructor(e=window,t={}){super(e,t);u(this,"mouseButtons",{left:{pressed:!1,justPressed:!1,justReleased:!1},middle:{pressed:!1,justPressed:!1,justReleased:!1},right:{pressed:!1,justPressed:!1,justReleased:!1}});u(this,"mousePosition",C.zero());u(this,"mouseDelta",C.zero());u(this,"wheelDelta",0);u(this,"mouseCallbacks",{});u(this,"boundHandlers");this.boundHandlers={mouseDown:this.handleMouseDown.bind(this),mouseUp:this.handleMouseUp.bind(this),mouseMove:this.handleMouseMove.bind(this),wheel:this.handleWheel.bind(this),mouseEnter:this.handleMouseEnter.bind(this),mouseLeave:this.handleMouseLeave.bind(this),contextMenu:this.handleContextMenu.bind(this)}}start(){this.isActive||(this.targetElement.addEventListener("mousedown",this.boundHandlers.mouseDown),this.targetElement.addEventListener("mouseup",this.boundHandlers.mouseUp),this.targetElement.addEventListener("mousemove",this.boundHandlers.mouseMove),this.targetElement.addEventListener("wheel",this.boundHandlers.wheel),this.targetElement.addEventListener("mouseenter",this.boundHandlers.mouseEnter),this.targetElement.addEventListener("mouseleave",this.boundHandlers.mouseLeave),this.targetElement.addEventListener("contextmenu",this.boundHandlers.contextMenu),this.isActive=!0)}stop(){this.isActive&&(this.targetElement.removeEventListener("mousedown",this.boundHandlers.mouseDown),this.targetElement.removeEventListener("mouseup",this.boundHandlers.mouseUp),this.targetElement.removeEventListener("mousemove",this.boundHandlers.mouseMove),this.targetElement.removeEventListener("wheel",this.boundHandlers.wheel),this.targetElement.removeEventListener("mouseenter",this.boundHandlers.mouseEnter),this.targetElement.removeEventListener("mouseleave",this.boundHandlers.mouseLeave),this.targetElement.removeEventListener("contextmenu",this.boundHandlers.contextMenu),this.isActive=!1)}reset(){this.mouseButtons={left:{pressed:!1,justPressed:!1,justReleased:!1},middle:{pressed:!1,justPressed:!1,justReleased:!1},right:{pressed:!1,justPressed:!1,justReleased:!1}},this.mousePosition=C.zero(),this.mouseDelta=C.zero(),this.wheelDelta=0}poll(){this.mouseButtons.left.justPressed=!1,this.mouseButtons.left.justReleased=!1,this.mouseButtons.middle.justPressed=!1,this.mouseButtons.middle.justReleased=!1,this.mouseButtons.right.justPressed=!1,this.mouseButtons.right.justReleased=!1,this.resetDelta()}resetDelta(){this.mouseDelta=C.zero(),this.wheelDelta=0}isLeftMousePressed(){return this.mouseButtons.left.pressed}isLeftMouseJustPressed(){return this.mouseButtons.left.justPressed}isLeftMouseJustReleased(){return this.mouseButtons.left.justReleased}isRightMousePressed(){return this.mouseButtons.right.pressed}isRightMouseJustPressed(){return this.mouseButtons.right.justPressed}isRightMouseJustReleased(){return this.mouseButtons.right.justReleased}isMiddleMousePressed(){return this.mouseButtons.middle.pressed}isMiddleMouseJustPressed(){return this.mouseButtons.middle.justPressed}isMiddleMouseJustReleased(){return this.mouseButtons.middle.justReleased}getMousePosition(){return this.mousePosition.clone()}getMouseDelta(){return this.mouseDelta.clone()}getWheelDelta(){return this.wheelDelta}setMouseCallbacks(e){this.mouseCallbacks={...this.mouseCallbacks,...e}}clearMouseCallbacks(){this.mouseCallbacks={}}setCallbacks(e){this.isMouseCallbacks(e)&&this.setMouseCallbacks(e)}isMouseCallbacks(e){return typeof e=="object"&&e!==null&&("onMouseDown"in e||"onMouseUp"in e||"onMouseMove"in e||"onMouseWheel"in e||"onMouseEnter"in e||"onMouseLeave"in e)}handleMouseDown(e){try{switch(this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation(),e.button){case 0:this.mouseButtons.left.pressed||(this.mouseButtons.left.justPressed=!0),this.mouseButtons.left.pressed=!0,this.mouseButtons.left.justReleased=!1,this.mouseCallbacks.onMouseDown?.("left",this.mousePosition,e);break;case 1:this.mouseButtons.middle.pressed||(this.mouseButtons.middle.justPressed=!0),this.mouseButtons.middle.pressed=!0,this.mouseButtons.middle.justReleased=!1,this.mouseCallbacks.onMouseDown?.("middle",this.mousePosition,e);break;case 2:this.mouseButtons.right.pressed||(this.mouseButtons.right.justPressed=!0),this.mouseButtons.right.pressed=!0,this.mouseButtons.right.justReleased=!1,this.mouseCallbacks.onMouseDown?.("right",this.mousePosition,e);break}}catch(t){console.error("Error in mouse down handler:",t)}}handleMouseUp(e){try{switch(this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation(),e.button){case 0:this.mouseButtons.left.pressed&&(this.mouseButtons.left.justReleased=!0),this.mouseButtons.left.pressed=!1,this.mouseButtons.left.justPressed=!1,this.mouseCallbacks.onMouseUp?.("left",this.mousePosition,e);break;case 1:this.mouseButtons.middle.pressed&&(this.mouseButtons.middle.justReleased=!0),this.mouseButtons.middle.pressed=!1,this.mouseButtons.middle.justPressed=!1,this.mouseCallbacks.onMouseUp?.("middle",this.mousePosition,e);break;case 2:this.mouseButtons.right.pressed&&(this.mouseButtons.right.justReleased=!0),this.mouseButtons.right.pressed=!1,this.mouseButtons.right.justPressed=!1,this.mouseCallbacks.onMouseUp?.("right",this.mousePosition,e);break}}catch(t){console.error("Error in mouse up handler:",t)}}handleMouseMove(e){try{this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation();let t=new C(e.clientX,e.clientY);this.mouseDelta=t.subtract(this.mousePosition),this.mousePosition=t,this.mouseCallbacks.onMouseMove?.(this.mousePosition,this.mouseDelta,e)}catch(t){console.error("Error in mouse move handler:",t)}}handleWheel(e){try{this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation(),this.wheelDelta=e.deltaY,this.mouseCallbacks.onMouseWheel?.(this.wheelDelta,e)}catch(t){console.error("Error in mouse wheel handler:",t)}}handleMouseEnter(e){try{this.mouseCallbacks.onMouseEnter?.(e)}catch(t){console.error("Error in mouse enter handler:",t)}}handleMouseLeave(e){try{this.mouseCallbacks.onMouseLeave?.(e)}catch(t){console.error("Error in mouse leave handler:",t)}}handleContextMenu(e){try{e.preventDefault(),this.config.stopPropagation&&e.stopPropagation()}catch(t){console.error("Error in context menu handler:",t)}}};p(H,"MouseInputs");var T=H;function ae(d,s){let e=new T(d);return s&&e.setCallbacks(s),e.start(),e}p(ae,"useMouseInputs");import{Vector2 as q}from"@utsp/types";var J=class J extends v{constructor(e=window,t={}){super(e,t);u(this,"touches",new Map);u(this,"nativeToInternal",new Map);u(this,"mobileCallbacks",{});u(this,"mobileConfig");u(this,"maxTouches",10);u(this,"lastLogTime",0);u(this,"boundHandlers");this.mobileConfig={targetElement:e,preventDefault:t.preventDefault??!0,passive:t.passive??!1,maxTouches:t.maxTouches??10,enabled:t.enabled??!0,debug:t.debug??!1,stopPropagation:t.stopPropagation??!1},this.maxTouches=this.mobileConfig.maxTouches,this.mobileConfig.preventDefault&&this.mobileConfig.passive&&(console.warn("[MobileInputs] passive=true prevents preventDefault() from working! Setting passive=false."),this.mobileConfig.passive=!1),this.boundHandlers={touchStart:this.handleTouchStart.bind(this),touchEnd:this.handleTouchEnd.bind(this),touchMove:this.handleTouchMove.bind(this),touchCancel:this.handleTouchCancel.bind(this),orientationChange:this.handleOrientationChange.bind(this)}}start(){if(this.isActive)return;let e={passive:!this.mobileConfig.preventDefault&&this.mobileConfig.passive};this.targetElement.addEventListener("touchstart",this.boundHandlers.touchStart,e),this.targetElement.addEventListener("touchend",this.boundHandlers.touchEnd,e),this.targetElement.addEventListener("touchmove",this.boundHandlers.touchMove,e),this.targetElement.addEventListener("touchcancel",this.boundHandlers.touchCancel,e),window.addEventListener("orientationchange",this.boundHandlers.orientationChange),this.isActive=!0}stop(){this.isActive&&(this.targetElement.removeEventListener("touchstart",this.boundHandlers.touchStart),this.targetElement.removeEventListener("touchend",this.boundHandlers.touchEnd),this.targetElement.removeEventListener("touchmove",this.boundHandlers.touchMove),this.targetElement.removeEventListener("touchcancel",this.boundHandlers.touchCancel),window.removeEventListener("orientationchange",this.boundHandlers.orientationChange),this.isActive=!1)}reset(){this.touches.clear(),this.nativeToInternal.clear()}resetDelta(){}poll(){for(let e of this.touches.values())e.justTouched=!1,e.justReleased=!1}isTouchActive(e){return e<0||e>=this.maxTouches?!1:this.touches.has(e)}getTouchPosition(e){if(e<0||e>=this.maxTouches)return null;let t=this.touches.get(e);return t?t.position.clone():null}getTouchStartPosition(e){if(e<0||e>=this.maxTouches)return null;let t=this.touches.get(e);return t?t.startPosition.clone():null}getTouchDelta(e){if(e<0||e>=this.maxTouches)return null;let t=this.touches.get(e);return t?t.position.subtract(t.startPosition):null}getTouchCount(){return this.touches.size}isTouchJustStarted(e){if(e<0||e>=this.maxTouches)return!1;let t=this.touches.get(e);return t?t.justTouched:!1}isTouchJustReleased(e){if(e<0||e>=this.maxTouches)return!1;let t=this.touches.get(e);return t?t.justReleased:!1}isAnyTouchJustStarted(){for(let e of this.touches.values())if(e.justTouched)return!0;return!1}getAllTouches(){return Array.from(this.touches.values())}setMobileCallbacks(e){this.mobileCallbacks={...this.mobileCallbacks,...e}}clearMobileCallbacks(){this.mobileCallbacks={}}setCallbacks(e){this.isMobileCallbacks(e)&&this.setMobileCallbacks(e)}isMobileCallbacks(e){return typeof e=="object"&&e!==null&&("onTouchStart"in e||"onTouchEnd"in e||"onTouchMove"in e||"onTouchCancel"in e||"onOrientationChange"in e)}handleTouchStart(e){try{this.mobileConfig.preventDefault&&e.preventDefault();let t=Array.from(e.changedTouches),n=[];for(let o of t){if(this.touches.size>=this.maxTouches)break;let i=-1;for(let c=0;c<this.maxTouches;c++)if(!this.touches.has(c)){i=c;break}if(i===-1)continue;let a=new q(o.clientX,o.clientY),r={id:i,nativeId:o.identifier,position:a.clone(),startPosition:a.clone(),active:!0,justTouched:!0,justReleased:!1};this.touches.set(i,r),this.nativeToInternal.set(o.identifier,i),n.push(r),console.warn(`\u{1F446} Touch START - ID: ${i}`)}this.mobileCallbacks.onTouchStart?.(n,e)}catch(t){console.error("Error in touch start handler:",t)}}handleTouchEnd(e){try{this.mobileConfig.preventDefault&&e.preventDefault();let t=Array.from(e.changedTouches),n=[];for(let o of t){let i=this.nativeToInternal.get(o.identifier);if(i!==void 0){let a=this.touches.get(i);a&&(a.justReleased=!0,a.justTouched=!1,n.push({...a}))}}for(let o of t){let i=this.nativeToInternal.get(o.identifier);i!==void 0&&(this.touches.delete(i),this.nativeToInternal.delete(o.identifier),console.warn(`\u{1F447} Touch END - ID: ${i}`))}this.mobileCallbacks.onTouchEnd?.(n,e)}catch(t){console.error("Error in touch end handler:",t)}}handleTouchMove(e){try{let t=Array.from(e.changedTouches);this.mobileConfig.debug&&(!this.lastLogTime||Date.now()-this.lastLogTime>200)&&(console.warn(`\u{1F504} TouchMove event - ${t.length} touches changed`),this.lastLogTime=Date.now());for(let n of t){let o=this.nativeToInternal.get(n.identifier);if(o!==void 0){let i=this.touches.get(o);if(i){let a=i.position.clone();i.position=new q(n.clientX,n.clientY),this.mobileConfig.debug&&(!this.lastLogTime||Date.now()-this.lastLogTime>200)&&console.warn(`\u{1F504} Updated touch ${i.id} (native ${n.identifier}) - ${a.x.toFixed(1)},${a.y.toFixed(1)} \u2192 ${n.clientX.toFixed(1)},${n.clientY.toFixed(1)}`)}}else this.mobileConfig.debug&&console.warn(`\u26A0\uFE0F Touch move for unknown native ID ${n.identifier}`)}this.mobileCallbacks.onTouchMove?.(this.getAllTouches(),e)}catch(t){console.error("Error in touch move handler:",t)}}handleTouchCancel(e){try{this.mobileConfig.preventDefault&&e.preventDefault();let t=[],n=Array.from(e.changedTouches);for(let o of n){let i=this.nativeToInternal.get(o.identifier);if(i!==void 0){let a=this.touches.get(i);a&&(a.justReleased=!0,a.justTouched=!1,t.push({...a}))}}for(let o of n){let i=this.nativeToInternal.get(o.identifier);i!==void 0&&(this.touches.delete(i),this.nativeToInternal.delete(o.identifier),this.mobileConfig.debug&&console.warn(`\u274C Touch CANCEL - ID: ${i}, nativeId: ${o.identifier}`))}this.mobileCallbacks.onTouchCancel?.(t,e)}catch(t){console.error("Error in touch cancel handler:",t)}}handleOrientationChange(e){try{let t=(window.screen.orientation&&window.screen.orientation.angle)??window.orientation??0;this.mobileCallbacks.onOrientationChange?.(t)}catch(t){console.error("Error in orientation change handler:",t)}}};p(J,"MobileInputs");var w=J;function re(d,s,e){console.warn("[MobileInputs] useMobileInputs() is deprecated and causes memory leaks. Use useMemo + useEffect instead.");let t=new w(d,e);return s&&t.setCallbacks(s),t.start(),t}p(re,"useMobileInputs");var $=class $ extends v{constructor(e={}){super(window,e);u(this,"gamepads",new Map);u(this,"previousGamepads",new Map);u(this,"gamepadCallbacks",{});u(this,"gamepadConfig");u(this,"pollingIntervalId",null);u(this,"rafId",null);u(this,"boundHandlers");this.gamepadConfig={targetElement:window,maxGamepads:e.maxGamepads??4,axisDeadzone:e.axisDeadzone??.1,pollingInterval:e.pollingInterval??16,autoPolling:e.autoPolling??!0,enabled:e.enabled??!0,debug:e.debug??!1,preventDefault:e.preventDefault??!1,stopPropagation:e.stopPropagation??!1},this.boundHandlers={connected:this.handleGamepadConnected.bind(this),disconnected:this.handleGamepadDisconnected.bind(this)}}start(){this.isActive||(window.addEventListener("gamepadconnected",this.boundHandlers.connected),window.addEventListener("gamepaddisconnected",this.boundHandlers.disconnected),this.gamepadConfig.autoPolling&&this.startPolling(),this.isActive=!0,this.log("GamepadInputs started"))}stop(){this.isActive&&(window.removeEventListener("gamepadconnected",this.boundHandlers.connected),window.removeEventListener("gamepaddisconnected",this.boundHandlers.disconnected),this.stopPolling(),this.isActive=!1,this.log("GamepadInputs stopped"))}reset(){this.gamepads.clear(),this.previousGamepads.clear()}resetDelta(){this.previousGamepads.clear(),this.gamepads.forEach((e,t)=>{this.previousGamepads.set(t,this.cloneGamepadState(e))})}startPolling(){if(this.pollingIntervalId!==null||this.rafId!==null)return;let e=p(()=>{this.poll(),this.rafId=requestAnimationFrame(e)},"poll");this.rafId=requestAnimationFrame(e),this.log("Polling started")}stopPolling(){this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null),this.pollingIntervalId!==null&&(clearInterval(this.pollingIntervalId),this.pollingIntervalId=null),this.log("Polling stopped")}poll(){let e=navigator.getGamepads?navigator.getGamepads():[];for(let t=0;t<e.length&&t<this.gamepadConfig.maxGamepads;t++){let n=e[t];n&&this.updateGamepadState(n)}}getConnectedGamepadCount(){return this.gamepads.size}isGamepadConnected(e){return this.gamepads.has(e)&&this.gamepads.get(e).connected}getGamepadState(e){return this.gamepads.get(e)||null}getAllGamepads(){return Array.from(this.gamepads.values()).filter(e=>e.connected)}isButtonPressed(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid buttonIndex: ${t}. Must be a non-negative integer.`);let n=this.gamepads.get(e);return!n||!n.connected||t>=n.buttons.length?!1:n.buttons[t].pressed}isButtonJustPressed(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid buttonIndex: ${t}. Must be a non-negative integer.`);let n=this.gamepads.get(e);return!n||!n.connected||t>=n.buttons.length?!1:n.buttons[t].justPressed}isButtonJustReleased(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid buttonIndex: ${t}. Must be a non-negative integer.`);let n=this.gamepads.get(e);return!n||!n.connected||t>=n.buttons.length?!1:n.buttons[t].justReleased}getButtonValue(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid buttonIndex: ${t}. Must be a non-negative integer.`);let n=this.gamepads.get(e);return!n||!n.connected||t>=n.buttons.length?0:n.buttons[t].value}getAxis(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid axisIndex: ${t}. Must be a non-negative integer.`);let n=this.gamepads.get(e);if(!n||!n.connected||t>=n.axes.length)return 0;let o=n.axes[t];return this.applyDeadzone(o)}getAxisRaw(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid axisIndex: ${t}. Must be a non-negative integer.`);let n=this.gamepads.get(e);return!n||!n.connected||t>=n.axes.length?0:n.axes[t]}getLeftStick(e){return{x:this.getAxis(e,0),y:this.getAxis(e,1)}}getRightStick(e){return{x:this.getAxis(e,2),y:this.getAxis(e,3)}}setGamepadCallbacks(e){this.gamepadCallbacks={...this.gamepadCallbacks,...e}}clearGamepadCallbacks(){this.gamepadCallbacks={}}setCallbacks(e){this.isGamepadCallbacks(e)&&this.setGamepadCallbacks(e)}isGamepadCallbacks(e){return typeof e=="object"&&e!==null&&("onGamepadConnected"in e||"onGamepadDisconnected"in e||"onButtonDown"in e||"onButtonUp"in e||"onAxisMove"in e)}updateGamepadState(e){let t=this.gamepads.get(e.index),n=Array.from(e.buttons).map((a,r)=>{let c=t?.buttons[r],k=a.pressed,m=c?.pressed??!1;return{pressed:k,justPressed:k&&!m,justReleased:!k&&m,value:a.value,touched:a.touched??!1}}),o=Array.from(e.axes),i={id:e.id,index:e.index,connected:e.connected,buttons:n,axes:o,timestamp:e.timestamp,mapping:e.mapping};this.gamepads.set(e.index,i),this.triggerCallbacks(i,t)}triggerCallbacks(e,t){try{e.buttons.forEach((n,o)=>{n.justPressed&&this.gamepadCallbacks.onButtonDown?.(e.index,o,n.value),n.justReleased&&this.gamepadCallbacks.onButtonUp?.(e.index,o)}),e.axes.forEach((n,o)=>{let i=t?.axes[o]??0,a=this.applyDeadzone(n),r=this.applyDeadzone(i);Math.abs(a-r)>.01&&this.gamepadCallbacks.onAxisMove?.(e.index,o,a)})}catch(n){this.log("Error in gamepad callbacks:",n)}}handleGamepadConnected(e){try{this.log(`Gamepad connected: ${e.gamepad.id} at index ${e.gamepad.index}`);let t={id:e.gamepad.id,index:e.gamepad.index,connected:!0,buttons:Array.from(e.gamepad.buttons).map(n=>({pressed:n.pressed,justPressed:!1,justReleased:!1,value:n.value,touched:n.touched??!1})),axes:Array.from(e.gamepad.axes),timestamp:e.gamepad.timestamp,mapping:e.gamepad.mapping};this.gamepads.set(e.gamepad.index,t),this.gamepadCallbacks.onGamepadConnected?.(t)}catch(t){this.log("Error handling gamepad connected:",t)}}handleGamepadDisconnected(e){try{this.log(`Gamepad disconnected at index ${e.gamepad.index}`),this.gamepads.delete(e.gamepad.index),this.previousGamepads.delete(e.gamepad.index),this.gamepadCallbacks.onGamepadDisconnected?.(e.gamepad.index)}catch(t){this.log("Error handling gamepad disconnected:",t)}}applyDeadzone(e){let t=this.gamepadConfig.axisDeadzone;return Math.abs(e)<t?0:(e>0?1:-1)*((Math.abs(e)-t)/(1-t))}cloneGamepadState(e){return{...e,buttons:e.buttons.map(t=>({...t})),axes:[...e.axes]}}};p($,"GamepadInputs");var I=$;function ue(d,s){let e=new I(s);return d&&e.setGamepadCallbacks(d),e.start(),e}p(ue,"useGamepadInputs");import{InputDeviceType as b,KeyboardInput as W,MouseInput as f,isButton as V,isAxis as le}from"@utsp/types";var z=class z{constructor(s={}){u(this,"keyboard",null);u(this,"mouse",null);u(this,"gamepad",null);u(this,"mobile",null);u(this,"config");this.config={enableKeyboardMouse:s.enableKeyboardMouse??!0,enableGamepad:s.enableGamepad??!0,enableMobile:s.enableMobile??!1,targetElement:s.targetElement??window,mobileTargetElement:s.mobileTargetElement??s.targetElement??window,debug:s.debug??!1,keyboardConfig:{preventDefault:!1,stopPropagation:!1,...s.keyboardConfig},mouseConfig:{preventDefault:!1,stopPropagation:!1,...s.mouseConfig},mobileConfig:{preventDefault:!0,passive:!1,maxTouches:10,...s.mobileConfig}},this.initialize()}initialize(){this.config.enableKeyboardMouse&&(this.keyboard=new E(this.config.targetElement,{preventDefault:this.config.keyboardConfig?.preventDefault??!1,stopPropagation:this.config.keyboardConfig?.stopPropagation??!1,debug:this.config.debug}),this.keyboard.start(),this.mouse=new T(this.config.targetElement,{preventDefault:this.config.mouseConfig?.preventDefault??!1,stopPropagation:this.config.mouseConfig?.stopPropagation??!1,debug:this.config.debug}),this.mouse.start(),this.log("Keyboard/Mouse initialized")),this.config.enableGamepad&&(this.gamepad=new I({debug:this.config.debug}),this.gamepad.start(),this.log("Gamepad initialized")),this.config.enableMobile&&(this.config.mobileTargetElement?(this.mobile=new w(this.config.mobileTargetElement,this.config.mobileConfig),this.mobile.start(),this.log("Mobile/Touch initialized")):this.warn("Mobile input enabled but no canvas provided - mobile input will be disabled until setMobileTarget() is called"))}getButton(s,e){if(!V({device:s,input:e}))return this.warn(`Input ${e} on device ${s} is not a button`),!1;switch(s){case b.Keyboard:return this.getKeyboardButton(e);case b.Mouse:return this.getMouseButton(e);case b.Gamepad:return this.getGamepadButton(e);case b.Touch:return this.getTouchButton(e);default:return this.warn(`Unknown device type: ${s}`),!1}}getButtonJustPressed(s,e){if(!V({device:s,input:e}))return this.warn(`Input ${e} on device ${s} is not a button`),!1;switch(s){case b.Keyboard:return this.getKeyboardButtonJustPressed(e);case b.Mouse:return this.getMouseButtonJustPressed(e);case b.Gamepad:return this.getGamepadButtonJustPressed(e);case b.Touch:return this.getTouchButtonJustPressed(e);default:return this.warn(`Unknown device type: ${s}`),!1}}getButtonJustReleased(s,e){if(!V({device:s,input:e}))return this.warn(`Input ${e} on device ${s} is not a button`),!1;switch(s){case b.Keyboard:return this.getKeyboardButtonJustReleased(e);case b.Mouse:return this.getMouseButtonJustReleased(e);case b.Gamepad:return this.getGamepadButtonJustReleased(e);case b.Touch:return this.getTouchButtonJustReleased(e);default:return this.warn(`Unknown device type: ${s}`),!1}}getAxis(s,e){if(!le({device:s,input:e}))return this.warn(`Input ${e} on device ${s} is not an axis`),0;switch(s){case b.Keyboard:return this.warn("Keyboard does not have axis inputs"),0;case b.Mouse:return this.getMouseAxis(e);case b.Gamepad:return this.getGamepadAxis(e);case b.Touch:return this.getTouchAxis(e);default:return this.warn(`Unknown device type: ${s}`),0}}getKeyboardButton(s){if(!this.keyboard)return!1;let e=W[s];return this.keyboard.isKeyPressed(e)}getKeyboardButtonJustPressed(s){if(!this.keyboard)return!1;let e=W[s];return this.keyboard.isKeyJustPressed(e)}getKeyboardButtonJustReleased(s){if(!this.keyboard)return!1;let e=W[s];return this.keyboard.isKeyJustReleased(e)}getMouseButton(s){if(!this.mouse)return!1;switch(s){case f.LeftButton:return this.mouse.isLeftMousePressed();case f.RightButton:return this.mouse.isRightMousePressed();case f.MiddleButton:return this.mouse.isMiddleMousePressed();default:return!1}}getMouseButtonJustPressed(s){if(!this.mouse)return!1;switch(s){case f.LeftButton:return this.mouse.isLeftMouseJustPressed();case f.RightButton:return this.mouse.isRightMouseJustPressed();case f.MiddleButton:return this.mouse.isMiddleMouseJustPressed();default:return!1}}getMouseButtonJustReleased(s){if(!this.mouse)return!1;switch(s){case f.LeftButton:return this.mouse.isLeftMouseJustReleased();case f.RightButton:return this.mouse.isRightMouseJustReleased();case f.MiddleButton:return this.mouse.isMiddleMouseJustReleased();default:return!1}}getGamepadButton(s){return!this.gamepad||s>=100?!1:this.gamepad.isButtonPressed(0,s)}getGamepadButtonJustPressed(s){return!this.gamepad||s>=100?!1:this.gamepad.isButtonJustPressed(0,s)}getGamepadButtonJustReleased(s){return!this.gamepad||s>=100?!1:this.gamepad.isButtonJustReleased(0,s)}getTouchButton(s){return this.mobile?s>=100?!1:this.mobile.isTouchActive?.(s)??!1:(console.warn("\u{1F6AB} MobileInputs not initialized!"),!1)}getTouchButtonJustPressed(s){return!this.mobile||s>=100?!1:this.mobile.isTouchJustStarted?.(s)??!1}getTouchButtonJustReleased(s){return!this.mobile||s>=100?!1:this.mobile.isTouchJustReleased?.(s)??!1}getMouseAxis(s){if(!this.mouse)return 0;switch(s){case f.PositionX:return this.mouse.getMousePosition().x;case f.PositionY:return this.mouse.getMousePosition().y;case f.DeltaX:return this.mouse.getMouseDelta().x;case f.DeltaY:return this.mouse.getMouseDelta().y;case f.WheelDeltaY:return this.mouse.getWheelDelta();default:return 0}}getGamepadAxis(s){if(!this.gamepad||s<100)return 0;let e=s-100;return this.gamepad.getAxis(0,e)}getTouchAxis(s){if(!this.mobile)return 0;if(s>=100&&s<200){let e=Math.floor((s-100)/2),t=(s-100)%2===0,n=this.mobile.getTouchPosition?.(e);return this.config.debug&&n&&console.warn(`\u{1F3AF} getTouchAxis(${s}) - touchIndex: ${e}, ${t?"X":"Y"}: ${t?n.x:n.y}`),n?t?n.x:n.y:0}return 0}getMousePosition(){if(!this.mouse)return null;let s=this.mouse.getMousePosition();return{x:s.x,y:s.y}}setMobileTarget(s){if(!s){this.warn("setMobileTarget() called with null/undefined canvas - mobile input will remain disabled");return}if(this.config.mobileTargetElement=s,!this.config.enableMobile){this.warn("setMobileTarget() called but mobile input is disabled in config");return}this.mobile&&this.mobile.stop(),this.mobile=new w(s,this.config.mobileConfig),this.mobile.start()}getTextInputs(){return this.keyboard?this.keyboard.getTextInputs():[]}start(){this.keyboard?.start(),this.mouse?.start(),this.log("Input router started")}stop(){this.keyboard?.stop(),this.mouse?.stop(),this.log("Input router stopped")}reset(){this.keyboard?.reset(),this.mouse?.reset(),this.log("Input router reset")}poll(){this.keyboard?.poll(),this.mouse?.poll(),this.gamepad?.poll(),this.mobile?.poll()}isListening(){return this.keyboard!==null&&this.config.enableKeyboardMouse||this.gamepad!==null&&this.config.enableGamepad||this.mobile!==null&&this.config.enableMobile}destroy(){this.keyboard?.destroy(),this.mouse?.destroy(),this.keyboard=null,this.mouse=null,this.gamepad=null,this.mobile=null,this.log("Input router destroyed")}log(s){this.config.debug&&console.warn(`[InputRouter] ${s}`)}warn(s){console.warn(`[InputRouter] ${s}`)}};p(z,"UnifiedInputRouter");var U=z;import{InputDeviceType as l,MouseInput as Q}from"@utsp/types";var X=class X{static collectAxisSources(s,e){let t=new Map;for(let n of s)for(let o of n.sources){if(t.has(o.sourceId))continue;let i=0,a=!1;if(o.type===l.Keyboard&&o.negativeKey!==void 0&&o.positiveKey!==void 0){let r=e.getButton(l.Keyboard,o.negativeKey);e.getButton(l.Keyboard,o.positiveKey)&&(i+=1),r&&(i-=1),a=!0}else if(o.type===l.Mouse&&o.mouseAxis!==void 0)i=e.getAxis(l.Mouse,o.mouseAxis),a=!0;else if(o.type===l.Gamepad&&o.axis!==void 0)i=e.getAxis(l.Gamepad,o.axis),a=!0;else if(o.type===l.Touch&&o.touchId!==void 0&&o.touchAxis!==void 0){let r=100+o.touchId*2,c=o.touchAxis==="x"?r:r+1;i=e.getAxis(l.Touch,c),a=!0}a&&t.set(o.sourceId,i)}return t}static collectButtonSources(s,e){let t=new Map;for(let n of s)for(let o of n.sources){if(t.has(o.sourceId))continue;let i=!1,a=!1;o.type===l.Keyboard&&o.key!==void 0?(i=e.getButton(l.Keyboard,o.key),a=!0):o.type===l.Mouse&&o.mouseButton!==void 0?(i=e.getButton(l.Mouse,o.mouseButton),a=!0):o.type===l.Gamepad&&o.button!==void 0?(i=e.getButton(l.Gamepad,o.button),a=!0):o.type===l.Touch&&o.touchButton!==void 0&&(i=e.getButton(l.Touch,o.touchButton),a=!0),a&&t.set(o.sourceId,i)}return t}static collectButtonSourcesWithTransitions(s,e){let t=new Map;for(let n of s)for(let o of n.sources){if(t.has(o.sourceId))continue;let i=!1,a=!1,r=!1,c=!1;o.type===l.Keyboard&&o.key!==void 0?(i=e.getButton(l.Keyboard,o.key),a=e.getButtonJustPressed?.(l.Keyboard,o.key)??!1,r=e.getButtonJustReleased?.(l.Keyboard,o.key)??!1,c=!0):o.type===l.Mouse&&o.mouseButton!==void 0?(i=e.getButton(l.Mouse,o.mouseButton),a=e.getButtonJustPressed?.(l.Mouse,o.mouseButton)??!1,r=e.getButtonJustReleased?.(l.Mouse,o.mouseButton)??!1,c=!0):o.type===l.Gamepad&&o.button!==void 0?(i=e.getButton(l.Gamepad,o.button),a=e.getButtonJustPressed?.(l.Gamepad,o.button)??!1,r=e.getButtonJustReleased?.(l.Gamepad,o.button)??!1,c=!0):o.type===l.Touch&&o.touchButton!==void 0&&(i=e.getButton(l.Touch,o.touchButton),a=e.getButtonJustPressed?.(l.Touch,o.touchButton)??!1,r=e.getButtonJustReleased?.(l.Touch,o.touchButton)??!1,c=!0),c&&t.set(o.sourceId,{pressed:i,justPressed:a,justReleased:r})}return t}static collectMousePosition(s,e,t,n,o){let i=s.getAxis(l.Mouse,Q.PositionX),a=s.getAxis(l.Mouse,Q.PositionY),r=e.getBoundingClientRect(),c=e.width/e.height,k=r.width/r.height,m,g,h,y;c>k?(m=r.width,g=r.width/c,h=0,y=(r.height-g)/2):(m=r.height*c,g=r.height,h=(r.width-m)/2,y=0);let x=o?.offsetX||0,P=o?.offsetY||0;h+=x,y+=P,m-=2*x,g-=2*P;let B=i-r.left-h,D=a-r.top-y,M=m/t,G=g/n,N=Math.floor(B/M),K=Math.floor(D/G),L=B>=0&&B<m&&D>=0&&D<g;return{x:Math.max(0,Math.min(t-1,N)),y:Math.max(0,Math.min(n-1,K)),over:L}}static collectTouchPositions(s,e,t,n,o=10,i){let a=[],r=e.getBoundingClientRect(),c=e.width/e.height,k=r.width/r.height,m,g,h,y;c>k?(m=r.width,g=r.width/c,h=0,y=(r.height-g)/2):(m=r.height*c,g=r.height,h=(r.width-m)/2,y=0);let x=i?.offsetX||0,P=i?.offsetY||0;h+=x,y+=P,m-=2*x,g-=2*P;let B=m/t,D=g/n;for(let M=0;M<o;M++){let G=M;if(s.getButton(l.Touch,G)){let K=100+M*2,L=101+M*2,Z=s.getAxis(l.Touch,K),_=s.getAxis(l.Touch,L),R=Z-r.left-h,A=_-r.top-y,ee=Math.floor(R/B),te=Math.floor(A/D),se=R>=0&&R<m&&A>=0&&A<g;a.push({id:M,x:Math.max(0,Math.min(t-1,ee)),y:Math.max(0,Math.min(n-1,te)),over:se})}}return a}static collectTextInputs(s){return typeof s.getTextInputs=="function"?s.getTextInputs():[]}};p(X,"InputCollector");var Y=X;export{v as BaseInputs,Ne as GamepadInput,I as GamepadInputs,Y as InputCollector,ze as InputDeviceType,O as InputEventType,Ye as KeyboardInput,E as KeyboardInputs,w as MobileInputs,Xe as MouseInput,T as MouseInputs,Fe as TouchInput,U as UnifiedInputRouter,We as Vector2,Ve as Vector3,ne as isInputs,ue as useGamepadInputs,ie as useKeyboardInputs,re as useMobileInputs,ae as useMouseInputs};
|
|
1
|
+
var O=Object.defineProperty;var oe=(c,s,e)=>s in c?O(c,s,{enumerable:!0,configurable:!0,writable:!0,value:e}):c[s]=e;var p=(c,s)=>O(c,"name",{value:s,configurable:!0});var r=(c,s,e)=>(oe(c,typeof s!="symbol"?s+"":s,e),e);import{Vector2 as We,Vector3 as Ve}from"@utsp/types";import{InputDeviceType as ze,KeyboardInput as Ye,MouseInput as Xe,GamepadInput as Ne,TouchInput as Fe}from"@utsp/types";var q=(h=>(h.KeyDown="keydown",h.KeyUp="keyup",h.MouseDown="mousedown",h.MouseUp="mouseup",h.MouseMove="mousemove",h.MouseWheel="mousewheel",h.TouchStart="touchstart",h.TouchEnd="touchend",h.TouchMove="touchmove",h.GamepadConnected="gamepadconnected",h.GamepadDisconnected="gamepaddisconnected",h.GamepadButton="gamepadbutton",h.GamepadAxis="gamepadaxis",h))(q||{}),j=class j{constructor(s=window,e={}){r(this,"isActive",!1);r(this,"targetElement");r(this,"config");r(this,"callbacks",{});this.targetElement=s,this.config={enabled:!0,preventDefault:!1,stopPropagation:!1,debug:!1,...e}}isListening(){return this.isActive}destroy(){this.stop(),this.clearCallbacks()}setCallbacks(s){typeof s=="object"&&s!==null&&Object.assign(this.callbacks,s)}clearCallbacks(){this.callbacks={}}getTargetElement(){return this.targetElement}enable(){this.config.enabled=!0,this.isActive||this.start()}disable(){this.config.enabled=!1,this.isActive&&this.stop()}isEnabled(){return this.config.enabled??!0}emit(s,...e){this.callbacks[s]&&this.callbacks[s].forEach(t=>{try{t(...e)}catch(n){this.config.debug&&console.error(`Error in ${s} callback:`,n)}})}log(...s){this.config.debug&&console.warn("[InputSystem]",...s)}};p(j,"BaseInputs");var v=j;function ne(c){return typeof c=="object"&&c!==null&&"start"in c&&"stop"in c&&"reset"in c&&"isListening"in c&&"destroy"in c}p(ne,"isInputs");var H=class H extends v{constructor(e=window,t={}){super(e,t);r(this,"keys",{});r(this,"keyboardCallbacks",{});r(this,"textInputsThisFrame",[]);r(this,"boundHandlers");this.boundHandlers={keyDown:this.handleKeyDown.bind(this),keyUp:this.handleKeyUp.bind(this)}}start(){this.isActive||(this.targetElement.addEventListener("keydown",this.boundHandlers.keyDown),this.targetElement.addEventListener("keyup",this.boundHandlers.keyUp),this.isActive=!0)}stop(){this.isActive&&(this.targetElement.removeEventListener("keydown",this.boundHandlers.keyDown),this.targetElement.removeEventListener("keyup",this.boundHandlers.keyUp),this.isActive=!1)}reset(){this.keys={}}resetDelta(){}poll(){for(let e in this.keys)this.keys[e].justPressed=!1,this.keys[e].justReleased=!1;this.textInputsThisFrame=[]}getTextInputs(){return this.textInputsThisFrame}isKeyPressed(e){return this.keys[e]?.pressed||!1}isKeyJustPressed(e){return this.keys[e]?.justPressed||!1}isKeyJustReleased(e){return this.keys[e]?.justReleased||!1}getKeysPressed(){return Object.keys(this.keys).filter(e=>this.keys[e].pressed)}getKeysJustPressed(){return Object.keys(this.keys).filter(e=>this.keys[e].justPressed)}getKeysJustReleased(){return Object.keys(this.keys).filter(e=>this.keys[e].justReleased)}isAnyKeyPressed(){return Object.values(this.keys).some(e=>e.pressed)}setKeyboardCallbacks(e){this.keyboardCallbacks={...this.keyboardCallbacks,...e}}clearKeyboardCallbacks(){this.keyboardCallbacks={}}setCallbacks(e){this.isKeyboardCallbacks(e)&&this.setKeyboardCallbacks(e)}isKeyboardCallbacks(e){return typeof e=="object"&&e!==null&&("onKeyDown"in e||"onKeyUp"in e)}handleKeyDown(e){try{let t=e.code,n=/^F([1-9]|1[0-2])$/.test(t),o=(e.ctrlKey||e.metaKey)&&(t==="KeyT"||t==="KeyW"||t==="KeyR"||t==="KeyN"||t==="Tab");this.config.preventDefault&&!n&&!o&&e.preventDefault(),this.config.stopPropagation&&!n&&!o&&e.stopPropagation(),this.keys[t]||(this.keys[t]={pressed:!1,justPressed:!1,justReleased:!1}),this.keys[t].pressed||(this.keys[t].justPressed=!0,this.keyboardCallbacks.onKeyDown?.(t,e)),this.keys[t].pressed=!0,this.keys[t].justReleased=!1;let i=e.key;i.length===1&&!e.ctrlKey&&!e.metaKey&&this.textInputsThisFrame.push(i)}catch(t){console.error("Error in keyboard keydown handler:",t)}}handleKeyUp(e){try{let t=e.code,n=/^F([1-9]|1[0-2])$/.test(t),o=(e.ctrlKey||e.metaKey)&&(t==="KeyT"||t==="KeyW"||t==="KeyR"||t==="KeyN"||t==="Tab");this.config.preventDefault&&!n&&!o&&e.preventDefault(),this.config.stopPropagation&&!n&&!o&&e.stopPropagation(),this.keys[t]||(this.keys[t]={pressed:!1,justPressed:!1,justReleased:!1}),this.keys[t].pressed&&(this.keys[t].justReleased=!0,this.keyboardCallbacks.onKeyUp?.(t,e)),this.keys[t].pressed=!1,this.keys[t].justPressed=!1}catch(t){console.error("Error in keyboard keyup handler:",t)}}};p(H,"KeyboardInputs");var C=H;function ie(c,s){let e=new C(c);return s&&e.setCallbacks(s),e.start(),e}p(ie,"useKeyboardInputs");import{Vector2 as T}from"@utsp/types";var J=class J extends v{constructor(e=window,t={}){super(e,t);r(this,"mouseButtons",{left:{pressed:!1,justPressed:!1,justReleased:!1},middle:{pressed:!1,justPressed:!1,justReleased:!1},right:{pressed:!1,justPressed:!1,justReleased:!1}});r(this,"mousePosition",T.zero());r(this,"mouseDelta",T.zero());r(this,"wheelDelta",0);r(this,"mouseCallbacks",{});r(this,"boundHandlers");this.boundHandlers={mouseDown:this.handleMouseDown.bind(this),mouseUp:this.handleMouseUp.bind(this),mouseMove:this.handleMouseMove.bind(this),wheel:this.handleWheel.bind(this),mouseEnter:this.handleMouseEnter.bind(this),mouseLeave:this.handleMouseLeave.bind(this),contextMenu:this.handleContextMenu.bind(this)}}start(){this.isActive||(this.targetElement.addEventListener("mousedown",this.boundHandlers.mouseDown),this.targetElement.addEventListener("mouseup",this.boundHandlers.mouseUp),this.targetElement.addEventListener("mousemove",this.boundHandlers.mouseMove),this.targetElement.addEventListener("wheel",this.boundHandlers.wheel),this.targetElement.addEventListener("mouseenter",this.boundHandlers.mouseEnter),this.targetElement.addEventListener("mouseleave",this.boundHandlers.mouseLeave),this.targetElement.addEventListener("contextmenu",this.boundHandlers.contextMenu),this.isActive=!0)}stop(){this.isActive&&(this.targetElement.removeEventListener("mousedown",this.boundHandlers.mouseDown),this.targetElement.removeEventListener("mouseup",this.boundHandlers.mouseUp),this.targetElement.removeEventListener("mousemove",this.boundHandlers.mouseMove),this.targetElement.removeEventListener("wheel",this.boundHandlers.wheel),this.targetElement.removeEventListener("mouseenter",this.boundHandlers.mouseEnter),this.targetElement.removeEventListener("mouseleave",this.boundHandlers.mouseLeave),this.targetElement.removeEventListener("contextmenu",this.boundHandlers.contextMenu),this.isActive=!1)}reset(){this.mouseButtons={left:{pressed:!1,justPressed:!1,justReleased:!1},middle:{pressed:!1,justPressed:!1,justReleased:!1},right:{pressed:!1,justPressed:!1,justReleased:!1}},this.mousePosition=T.zero(),this.mouseDelta=T.zero(),this.wheelDelta=0}poll(){this.mouseButtons.left.justPressed=!1,this.mouseButtons.left.justReleased=!1,this.mouseButtons.middle.justPressed=!1,this.mouseButtons.middle.justReleased=!1,this.mouseButtons.right.justPressed=!1,this.mouseButtons.right.justReleased=!1,this.resetDelta()}resetDelta(){this.mouseDelta=T.zero(),this.wheelDelta=0}isLeftMousePressed(){return this.mouseButtons.left.pressed}isLeftMouseJustPressed(){return this.mouseButtons.left.justPressed}isLeftMouseJustReleased(){return this.mouseButtons.left.justReleased}isRightMousePressed(){return this.mouseButtons.right.pressed}isRightMouseJustPressed(){return this.mouseButtons.right.justPressed}isRightMouseJustReleased(){return this.mouseButtons.right.justReleased}isMiddleMousePressed(){return this.mouseButtons.middle.pressed}isMiddleMouseJustPressed(){return this.mouseButtons.middle.justPressed}isMiddleMouseJustReleased(){return this.mouseButtons.middle.justReleased}getMousePosition(){return this.mousePosition.clone()}getMouseDelta(){return this.mouseDelta.clone()}getWheelDelta(){return this.wheelDelta}setMouseCallbacks(e){this.mouseCallbacks={...this.mouseCallbacks,...e}}clearMouseCallbacks(){this.mouseCallbacks={}}setCallbacks(e){this.isMouseCallbacks(e)&&this.setMouseCallbacks(e)}isMouseCallbacks(e){return typeof e=="object"&&e!==null&&("onMouseDown"in e||"onMouseUp"in e||"onMouseMove"in e||"onMouseWheel"in e||"onMouseEnter"in e||"onMouseLeave"in e)}handleMouseDown(e){try{switch(this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation(),e.button){case 0:this.mouseButtons.left.pressed||(this.mouseButtons.left.justPressed=!0),this.mouseButtons.left.pressed=!0,this.mouseButtons.left.justReleased=!1,this.mouseCallbacks.onMouseDown?.("left",this.mousePosition,e);break;case 1:this.mouseButtons.middle.pressed||(this.mouseButtons.middle.justPressed=!0),this.mouseButtons.middle.pressed=!0,this.mouseButtons.middle.justReleased=!1,this.mouseCallbacks.onMouseDown?.("middle",this.mousePosition,e);break;case 2:this.mouseButtons.right.pressed||(this.mouseButtons.right.justPressed=!0),this.mouseButtons.right.pressed=!0,this.mouseButtons.right.justReleased=!1,this.mouseCallbacks.onMouseDown?.("right",this.mousePosition,e);break}}catch(t){console.error("Error in mouse down handler:",t)}}handleMouseUp(e){try{switch(this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation(),e.button){case 0:this.mouseButtons.left.pressed&&(this.mouseButtons.left.justReleased=!0),this.mouseButtons.left.pressed=!1,this.mouseButtons.left.justPressed=!1,this.mouseCallbacks.onMouseUp?.("left",this.mousePosition,e);break;case 1:this.mouseButtons.middle.pressed&&(this.mouseButtons.middle.justReleased=!0),this.mouseButtons.middle.pressed=!1,this.mouseButtons.middle.justPressed=!1,this.mouseCallbacks.onMouseUp?.("middle",this.mousePosition,e);break;case 2:this.mouseButtons.right.pressed&&(this.mouseButtons.right.justReleased=!0),this.mouseButtons.right.pressed=!1,this.mouseButtons.right.justPressed=!1,this.mouseCallbacks.onMouseUp?.("right",this.mousePosition,e);break}}catch(t){console.error("Error in mouse up handler:",t)}}handleMouseMove(e){try{this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation();let t=new T(e.clientX,e.clientY);this.mouseDelta=t.subtract(this.mousePosition),this.mousePosition=t,this.mouseCallbacks.onMouseMove?.(this.mousePosition,this.mouseDelta,e)}catch(t){console.error("Error in mouse move handler:",t)}}handleWheel(e){try{this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation(),this.wheelDelta=e.deltaY,this.mouseCallbacks.onMouseWheel?.(this.wheelDelta,e)}catch(t){console.error("Error in mouse wheel handler:",t)}}handleMouseEnter(e){try{this.mouseCallbacks.onMouseEnter?.(e)}catch(t){console.error("Error in mouse enter handler:",t)}}handleMouseLeave(e){try{this.mouseCallbacks.onMouseLeave?.(e)}catch(t){console.error("Error in mouse leave handler:",t)}}handleContextMenu(e){try{e.preventDefault(),this.config.stopPropagation&&e.stopPropagation()}catch(t){console.error("Error in context menu handler:",t)}}};p(J,"MouseInputs");var I=J;function ae(c,s){let e=new I(c);return s&&e.setCallbacks(s),e.start(),e}p(ae,"useMouseInputs");import{Vector2 as Q}from"@utsp/types";var $=class $ extends v{constructor(e=window,t={}){super(e,t);r(this,"touches",new Map);r(this,"nativeToInternal",new Map);r(this,"mobileCallbacks",{});r(this,"mobileConfig");r(this,"maxTouches",10);r(this,"lastLogTime",0);r(this,"boundHandlers");this.mobileConfig={targetElement:e,preventDefault:t.preventDefault??!0,passive:t.passive??!1,maxTouches:t.maxTouches??10,enabled:t.enabled??!0,debug:t.debug??!1,stopPropagation:t.stopPropagation??!1},this.maxTouches=this.mobileConfig.maxTouches,this.mobileConfig.preventDefault&&this.mobileConfig.passive&&(console.warn("[MobileInputs] passive=true prevents preventDefault() from working! Setting passive=false."),this.mobileConfig.passive=!1),this.boundHandlers={touchStart:this.handleTouchStart.bind(this),touchEnd:this.handleTouchEnd.bind(this),touchMove:this.handleTouchMove.bind(this),touchCancel:this.handleTouchCancel.bind(this),orientationChange:this.handleOrientationChange.bind(this)}}start(){if(this.isActive)return;let e={passive:!this.mobileConfig.preventDefault&&this.mobileConfig.passive};this.targetElement.addEventListener("touchstart",this.boundHandlers.touchStart,e),this.targetElement.addEventListener("touchend",this.boundHandlers.touchEnd,e),this.targetElement.addEventListener("touchmove",this.boundHandlers.touchMove,e),this.targetElement.addEventListener("touchcancel",this.boundHandlers.touchCancel,e),window.addEventListener("orientationchange",this.boundHandlers.orientationChange),this.isActive=!0}stop(){this.isActive&&(this.targetElement.removeEventListener("touchstart",this.boundHandlers.touchStart),this.targetElement.removeEventListener("touchend",this.boundHandlers.touchEnd),this.targetElement.removeEventListener("touchmove",this.boundHandlers.touchMove),this.targetElement.removeEventListener("touchcancel",this.boundHandlers.touchCancel),window.removeEventListener("orientationchange",this.boundHandlers.orientationChange),this.isActive=!1)}reset(){this.touches.clear(),this.nativeToInternal.clear()}resetDelta(){}poll(){for(let e of this.touches.values())e.justTouched=!1,e.justReleased=!1}isTouchActive(e){return e<0||e>=this.maxTouches?!1:this.touches.has(e)}getTouchPosition(e){if(e<0||e>=this.maxTouches)return null;let t=this.touches.get(e);return t?t.position.clone():null}getTouchStartPosition(e){if(e<0||e>=this.maxTouches)return null;let t=this.touches.get(e);return t?t.startPosition.clone():null}getTouchDelta(e){if(e<0||e>=this.maxTouches)return null;let t=this.touches.get(e);return t?t.position.subtract(t.startPosition):null}getTouchCount(){return this.touches.size}isTouchJustStarted(e){if(e<0||e>=this.maxTouches)return!1;let t=this.touches.get(e);return t?t.justTouched:!1}isTouchJustReleased(e){if(e<0||e>=this.maxTouches)return!1;let t=this.touches.get(e);return t?t.justReleased:!1}isAnyTouchJustStarted(){for(let e of this.touches.values())if(e.justTouched)return!0;return!1}getAllTouches(){return Array.from(this.touches.values())}setMobileCallbacks(e){this.mobileCallbacks={...this.mobileCallbacks,...e}}clearMobileCallbacks(){this.mobileCallbacks={}}setCallbacks(e){this.isMobileCallbacks(e)&&this.setMobileCallbacks(e)}isMobileCallbacks(e){return typeof e=="object"&&e!==null&&("onTouchStart"in e||"onTouchEnd"in e||"onTouchMove"in e||"onTouchCancel"in e||"onOrientationChange"in e)}handleTouchStart(e){try{this.mobileConfig.preventDefault&&e.preventDefault();let t=Array.from(e.changedTouches),n=[];for(let o of t){if(this.touches.size>=this.maxTouches)break;let i=-1;for(let d=0;d<this.maxTouches;d++)if(!this.touches.has(d)){i=d;break}if(i===-1)continue;let a=new Q(o.clientX,o.clientY),l={id:i,nativeId:o.identifier,position:a.clone(),startPosition:a.clone(),active:!0,justTouched:!0,justReleased:!1};this.touches.set(i,l),this.nativeToInternal.set(o.identifier,i),n.push(l),console.warn(`\u{1F446} Touch START - ID: ${i}`)}this.mobileCallbacks.onTouchStart?.(n,e)}catch(t){console.error("Error in touch start handler:",t)}}handleTouchEnd(e){try{this.mobileConfig.preventDefault&&e.preventDefault();let t=Array.from(e.changedTouches),n=[];for(let o of t){let i=this.nativeToInternal.get(o.identifier);if(i!==void 0){let a=this.touches.get(i);a&&(a.justReleased=!0,a.justTouched=!1,n.push({...a}))}}for(let o of t){let i=this.nativeToInternal.get(o.identifier);i!==void 0&&(this.touches.delete(i),this.nativeToInternal.delete(o.identifier),console.warn(`\u{1F447} Touch END - ID: ${i}`))}this.mobileCallbacks.onTouchEnd?.(n,e)}catch(t){console.error("Error in touch end handler:",t)}}handleTouchMove(e){try{let t=Array.from(e.changedTouches);this.mobileConfig.debug&&(!this.lastLogTime||Date.now()-this.lastLogTime>200)&&(console.warn(`\u{1F504} TouchMove event - ${t.length} touches changed`),this.lastLogTime=Date.now());for(let n of t){let o=this.nativeToInternal.get(n.identifier);if(o!==void 0){let i=this.touches.get(o);if(i){let a=i.position.clone();i.position=new Q(n.clientX,n.clientY),this.mobileConfig.debug&&(!this.lastLogTime||Date.now()-this.lastLogTime>200)&&console.warn(`\u{1F504} Updated touch ${i.id} (native ${n.identifier}) - ${a.x.toFixed(1)},${a.y.toFixed(1)} \u2192 ${n.clientX.toFixed(1)},${n.clientY.toFixed(1)}`)}}else this.mobileConfig.debug&&console.warn(`\u26A0\uFE0F Touch move for unknown native ID ${n.identifier}`)}this.mobileCallbacks.onTouchMove?.(this.getAllTouches(),e)}catch(t){console.error("Error in touch move handler:",t)}}handleTouchCancel(e){try{this.mobileConfig.preventDefault&&e.preventDefault();let t=[],n=Array.from(e.changedTouches);for(let o of n){let i=this.nativeToInternal.get(o.identifier);if(i!==void 0){let a=this.touches.get(i);a&&(a.justReleased=!0,a.justTouched=!1,t.push({...a}))}}for(let o of n){let i=this.nativeToInternal.get(o.identifier);i!==void 0&&(this.touches.delete(i),this.nativeToInternal.delete(o.identifier),this.mobileConfig.debug&&console.warn(`\u274C Touch CANCEL - ID: ${i}, nativeId: ${o.identifier}`))}this.mobileCallbacks.onTouchCancel?.(t,e)}catch(t){console.error("Error in touch cancel handler:",t)}}handleOrientationChange(e){try{let t=(window.screen.orientation&&window.screen.orientation.angle)??window.orientation??0;this.mobileCallbacks.onOrientationChange?.(t)}catch(t){console.error("Error in orientation change handler:",t)}}};p($,"MobileInputs");var E=$;function re(c,s,e){console.warn("[MobileInputs] useMobileInputs() is deprecated and causes memory leaks. Use useMemo + useEffect instead.");let t=new E(c,e);return s&&t.setCallbacks(s),t.start(),t}p(re,"useMobileInputs");var W=class W extends v{constructor(e={}){super(window,e);r(this,"gamepads",new Map);r(this,"previousGamepads",new Map);r(this,"gamepadCallbacks",{});r(this,"gamepadConfig");r(this,"pollingIntervalId",null);r(this,"rafId",null);r(this,"boundHandlers");this.gamepadConfig={targetElement:window,maxGamepads:e.maxGamepads??4,axisDeadzone:e.axisDeadzone??.1,pollingInterval:e.pollingInterval??16,autoPolling:e.autoPolling??!0,enabled:e.enabled??!0,debug:e.debug??!1,preventDefault:e.preventDefault??!1,stopPropagation:e.stopPropagation??!1},this.boundHandlers={connected:this.handleGamepadConnected.bind(this),disconnected:this.handleGamepadDisconnected.bind(this)}}start(){this.isActive||(window.addEventListener("gamepadconnected",this.boundHandlers.connected),window.addEventListener("gamepaddisconnected",this.boundHandlers.disconnected),this.gamepadConfig.autoPolling&&this.startPolling(),this.isActive=!0,this.log("GamepadInputs started"))}stop(){this.isActive&&(window.removeEventListener("gamepadconnected",this.boundHandlers.connected),window.removeEventListener("gamepaddisconnected",this.boundHandlers.disconnected),this.stopPolling(),this.isActive=!1,this.log("GamepadInputs stopped"))}reset(){this.gamepads.clear(),this.previousGamepads.clear()}resetDelta(){this.previousGamepads.clear(),this.gamepads.forEach((e,t)=>{this.previousGamepads.set(t,this.cloneGamepadState(e))})}startPolling(){if(this.pollingIntervalId!==null||this.rafId!==null)return;let e=p(()=>{this.poll(),this.rafId=requestAnimationFrame(e)},"poll");this.rafId=requestAnimationFrame(e),this.log("Polling started")}stopPolling(){this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null),this.pollingIntervalId!==null&&(clearInterval(this.pollingIntervalId),this.pollingIntervalId=null),this.log("Polling stopped")}poll(){let e=navigator.getGamepads?navigator.getGamepads():[];for(let t=0;t<e.length&&t<this.gamepadConfig.maxGamepads;t++){let n=e[t];n&&this.updateGamepadState(n)}}getConnectedGamepadCount(){return this.gamepads.size}isGamepadConnected(e){return this.gamepads.has(e)&&this.gamepads.get(e).connected}getGamepadState(e){return this.gamepads.get(e)||null}getAllGamepads(){return Array.from(this.gamepads.values()).filter(e=>e.connected)}isButtonPressed(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid buttonIndex: ${t}. Must be a non-negative integer.`);let n=this.gamepads.get(e);return!n||!n.connected||t>=n.buttons.length?!1:n.buttons[t].pressed}isButtonJustPressed(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid buttonIndex: ${t}. Must be a non-negative integer.`);let n=this.gamepads.get(e);return!n||!n.connected||t>=n.buttons.length?!1:n.buttons[t].justPressed}isButtonJustReleased(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid buttonIndex: ${t}. Must be a non-negative integer.`);let n=this.gamepads.get(e);return!n||!n.connected||t>=n.buttons.length?!1:n.buttons[t].justReleased}getButtonValue(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid buttonIndex: ${t}. Must be a non-negative integer.`);let n=this.gamepads.get(e);return!n||!n.connected||t>=n.buttons.length?0:n.buttons[t].value}getAxis(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid axisIndex: ${t}. Must be a non-negative integer.`);let n=this.gamepads.get(e);if(!n||!n.connected||t>=n.axes.length)return 0;let o=n.axes[t];return this.applyDeadzone(o)}getAxisRaw(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid gamepadIndex: ${e}. Must be a non-negative integer.`);if(!Number.isInteger(t)||t<0)throw new Error(`Invalid axisIndex: ${t}. Must be a non-negative integer.`);let n=this.gamepads.get(e);return!n||!n.connected||t>=n.axes.length?0:n.axes[t]}getLeftStick(e){return{x:this.getAxis(e,0),y:this.getAxis(e,1)}}getRightStick(e){return{x:this.getAxis(e,2),y:this.getAxis(e,3)}}setGamepadCallbacks(e){this.gamepadCallbacks={...this.gamepadCallbacks,...e}}clearGamepadCallbacks(){this.gamepadCallbacks={}}setCallbacks(e){this.isGamepadCallbacks(e)&&this.setGamepadCallbacks(e)}isGamepadCallbacks(e){return typeof e=="object"&&e!==null&&("onGamepadConnected"in e||"onGamepadDisconnected"in e||"onButtonDown"in e||"onButtonUp"in e||"onAxisMove"in e)}updateGamepadState(e){let t=this.gamepads.get(e.index),n=Array.from(e.buttons).map((a,l)=>{let d=t?.buttons[l],M=a.pressed,g=d?.pressed??!1;return{pressed:M,justPressed:M&&!g,justReleased:!M&&g,value:a.value,touched:a.touched??!1}}),o=Array.from(e.axes),i={id:e.id,index:e.index,connected:e.connected,buttons:n,axes:o,timestamp:e.timestamp,mapping:e.mapping};this.gamepads.set(e.index,i),this.triggerCallbacks(i,t)}triggerCallbacks(e,t){try{e.buttons.forEach((n,o)=>{n.justPressed&&this.gamepadCallbacks.onButtonDown?.(e.index,o,n.value),n.justReleased&&this.gamepadCallbacks.onButtonUp?.(e.index,o)}),e.axes.forEach((n,o)=>{let i=t?.axes[o]??0,a=this.applyDeadzone(n),l=this.applyDeadzone(i);Math.abs(a-l)>.01&&this.gamepadCallbacks.onAxisMove?.(e.index,o,a)})}catch(n){this.log("Error in gamepad callbacks:",n)}}handleGamepadConnected(e){try{this.log(`Gamepad connected: ${e.gamepad.id} at index ${e.gamepad.index}`);let t={id:e.gamepad.id,index:e.gamepad.index,connected:!0,buttons:Array.from(e.gamepad.buttons).map(n=>({pressed:n.pressed,justPressed:!1,justReleased:!1,value:n.value,touched:n.touched??!1})),axes:Array.from(e.gamepad.axes),timestamp:e.gamepad.timestamp,mapping:e.gamepad.mapping};this.gamepads.set(e.gamepad.index,t),this.gamepadCallbacks.onGamepadConnected?.(t)}catch(t){this.log("Error handling gamepad connected:",t)}}handleGamepadDisconnected(e){try{this.log(`Gamepad disconnected at index ${e.gamepad.index}`),this.gamepads.delete(e.gamepad.index),this.previousGamepads.delete(e.gamepad.index),this.gamepadCallbacks.onGamepadDisconnected?.(e.gamepad.index)}catch(t){this.log("Error handling gamepad disconnected:",t)}}applyDeadzone(e){let t=this.gamepadConfig.axisDeadzone;return Math.abs(e)<t?0:(e>0?1:-1)*((Math.abs(e)-t)/(1-t))}cloneGamepadState(e){return{...e,buttons:e.buttons.map(t=>({...t})),axes:[...e.axes]}}};p(W,"GamepadInputs");var x=W;function ue(c,s){let e=new x(s);return c&&e.setGamepadCallbacks(c),e.start(),e}p(ue,"useGamepadInputs");import{InputDeviceType as m,KeyboardInput as V,MouseInput as b,isButton as U,isAxis as le}from"@utsp/types";var Y=class Y{constructor(s={}){r(this,"keyboard",null);r(this,"mouse",null);r(this,"gamepad",null);r(this,"mobile",null);r(this,"config");this.config={enableKeyboardMouse:s.enableKeyboardMouse??!0,enableGamepad:s.enableGamepad??!0,enableMobile:s.enableMobile??!1,targetElement:s.targetElement??window,mobileTargetElement:s.mobileTargetElement??s.targetElement??window,debug:s.debug??!1,keyboardConfig:{preventDefault:!1,stopPropagation:!1,...s.keyboardConfig},mouseConfig:{preventDefault:!1,stopPropagation:!1,...s.mouseConfig},mobileConfig:{preventDefault:!0,passive:!1,maxTouches:10,...s.mobileConfig}},this.initialize()}initialize(){this.config.enableKeyboardMouse&&(this.keyboard=new C(this.config.targetElement,{preventDefault:this.config.keyboardConfig?.preventDefault??!1,stopPropagation:this.config.keyboardConfig?.stopPropagation??!1,debug:this.config.debug}),this.keyboard.start(),this.mouse=new I(this.config.targetElement,{preventDefault:this.config.mouseConfig?.preventDefault??!1,stopPropagation:this.config.mouseConfig?.stopPropagation??!1,debug:this.config.debug}),this.mouse.start(),this.log("Keyboard/Mouse initialized")),this.config.enableGamepad&&(this.gamepad=new x({debug:this.config.debug}),this.gamepad.start(),this.log("Gamepad initialized")),this.config.enableMobile&&(this.config.mobileTargetElement?(this.mobile=new E(this.config.mobileTargetElement,this.config.mobileConfig),this.mobile.start(),this.log("Mobile/Touch initialized")):this.warn("Mobile input enabled but no canvas provided - mobile input will be disabled until setMobileTarget() is called"))}getButton(s,e){if(!U({device:s,input:e}))return this.warn(`Input ${e} on device ${s} is not a button`),!1;switch(s){case m.Keyboard:return this.getKeyboardButton(e);case m.Mouse:return this.getMouseButton(e);case m.Gamepad:return this.getGamepadButton(e);case m.Touch:return this.getTouchButton(e);default:return this.warn(`Unknown device type: ${s}`),!1}}getButtonJustPressed(s,e){if(!U({device:s,input:e}))return this.warn(`Input ${e} on device ${s} is not a button`),!1;switch(s){case m.Keyboard:return this.getKeyboardButtonJustPressed(e);case m.Mouse:return this.getMouseButtonJustPressed(e);case m.Gamepad:return this.getGamepadButtonJustPressed(e);case m.Touch:return this.getTouchButtonJustPressed(e);default:return this.warn(`Unknown device type: ${s}`),!1}}getButtonJustReleased(s,e){if(!U({device:s,input:e}))return this.warn(`Input ${e} on device ${s} is not a button`),!1;switch(s){case m.Keyboard:return this.getKeyboardButtonJustReleased(e);case m.Mouse:return this.getMouseButtonJustReleased(e);case m.Gamepad:return this.getGamepadButtonJustReleased(e);case m.Touch:return this.getTouchButtonJustReleased(e);default:return this.warn(`Unknown device type: ${s}`),!1}}getAxis(s,e){if(!le({device:s,input:e}))return this.warn(`Input ${e} on device ${s} is not an axis`),0;switch(s){case m.Keyboard:return this.warn("Keyboard does not have axis inputs"),0;case m.Mouse:return this.getMouseAxis(e);case m.Gamepad:return this.getGamepadAxis(e);case m.Touch:return this.getTouchAxis(e);default:return this.warn(`Unknown device type: ${s}`),0}}isLeftMousePressed(){return this.mouse?this.mouse.isLeftMousePressed():!1}getKeyboardButton(s){if(!this.keyboard)return!1;let e=V[s];return this.keyboard.isKeyPressed(e)}getKeyboardButtonJustPressed(s){if(!this.keyboard)return!1;let e=V[s];return this.keyboard.isKeyJustPressed(e)}getKeyboardButtonJustReleased(s){if(!this.keyboard)return!1;let e=V[s];return this.keyboard.isKeyJustReleased(e)}getMouseButton(s){if(!this.mouse)return!1;switch(s){case b.LeftButton:return this.mouse.isLeftMousePressed();case b.RightButton:return this.mouse.isRightMousePressed();case b.MiddleButton:return this.mouse.isMiddleMousePressed();default:return!1}}getMouseButtonJustPressed(s){if(!this.mouse)return!1;switch(s){case b.LeftButton:return this.mouse.isLeftMouseJustPressed();case b.RightButton:return this.mouse.isRightMouseJustPressed();case b.MiddleButton:return this.mouse.isMiddleMouseJustPressed();default:return!1}}getMouseButtonJustReleased(s){if(!this.mouse)return!1;switch(s){case b.LeftButton:return this.mouse.isLeftMouseJustReleased();case b.RightButton:return this.mouse.isRightMouseJustReleased();case b.MiddleButton:return this.mouse.isMiddleMouseJustReleased();default:return!1}}getGamepadButton(s){return!this.gamepad||s>=100?!1:this.gamepad.isButtonPressed(0,s)}getGamepadButtonJustPressed(s){return!this.gamepad||s>=100?!1:this.gamepad.isButtonJustPressed(0,s)}getGamepadButtonJustReleased(s){return!this.gamepad||s>=100?!1:this.gamepad.isButtonJustReleased(0,s)}getTouchButton(s){return this.mobile?s>=100?!1:this.mobile.isTouchActive?.(s)??!1:(console.warn("\u{1F6AB} MobileInputs not initialized!"),!1)}getTouchButtonJustPressed(s){return!this.mobile||s>=100?!1:this.mobile.isTouchJustStarted?.(s)??!1}getTouchButtonJustReleased(s){return!this.mobile||s>=100?!1:this.mobile.isTouchJustReleased?.(s)??!1}getMouseAxis(s){if(!this.mouse)return 0;switch(s){case b.PositionX:return this.mouse.getMousePosition().x;case b.PositionY:return this.mouse.getMousePosition().y;case b.DeltaX:return this.mouse.getMouseDelta().x;case b.DeltaY:return this.mouse.getMouseDelta().y;case b.WheelDeltaY:return this.mouse.getWheelDelta();default:return 0}}getGamepadAxis(s){if(!this.gamepad||s<100)return 0;let e=s-100;return this.gamepad.getAxis(0,e)}getTouchAxis(s){if(!this.mobile)return 0;if(s>=100&&s<200){let e=Math.floor((s-100)/2),t=(s-100)%2===0,n=this.mobile.getTouchPosition?.(e);return this.config.debug&&n&&console.warn(`\u{1F3AF} getTouchAxis(${s}) - touchIndex: ${e}, ${t?"X":"Y"}: ${t?n.x:n.y}`),n?t?n.x:n.y:0}return 0}getMousePosition(){if(!this.mouse)return null;let s=this.mouse.getMousePosition();return{x:s.x,y:s.y}}setMobileTarget(s){if(!s){this.warn("setMobileTarget() called with null/undefined canvas - mobile input will remain disabled");return}if(this.config.mobileTargetElement=s,!this.config.enableMobile){this.warn("setMobileTarget() called but mobile input is disabled in config");return}this.mobile&&this.mobile.stop(),this.mobile=new E(s,this.config.mobileConfig),this.mobile.start()}getTextInputs(){return this.keyboard?this.keyboard.getTextInputs():[]}start(){this.keyboard?.start(),this.mouse?.start(),this.log("Input router started")}stop(){this.keyboard?.stop(),this.mouse?.stop(),this.log("Input router stopped")}reset(){this.keyboard?.reset(),this.mouse?.reset(),this.log("Input router reset")}poll(){this.keyboard?.poll(),this.mouse?.poll(),this.gamepad?.poll(),this.mobile?.poll()}isListening(){return this.keyboard!==null&&this.config.enableKeyboardMouse||this.gamepad!==null&&this.config.enableGamepad||this.mobile!==null&&this.config.enableMobile}destroy(){this.keyboard?.destroy(),this.mouse?.destroy(),this.keyboard=null,this.mouse=null,this.gamepad=null,this.mobile=null,this.log("Input router destroyed")}log(s){this.config.debug&&console.warn(`[InputRouter] ${s}`)}warn(s){console.warn(`[InputRouter] ${s}`)}};p(Y,"UnifiedInputRouter");var z=Y;import{InputDeviceType as u,MouseInput as Z}from"@utsp/types";var N=class N{static collectAxisSources(s,e){let t=new Map;for(let n of s)for(let o of n.sources){if(t.has(o.sourceId))continue;let i=0,a=!1;if(o.type===u.Keyboard&&o.negativeKey!==void 0&&o.positiveKey!==void 0){let l=e.getButton(u.Keyboard,o.negativeKey);e.getButton(u.Keyboard,o.positiveKey)&&(i+=1),l&&(i-=1),a=!0}else if(o.type===u.Mouse&&o.mouseAxis!==void 0)i=e.getAxis(u.Mouse,o.mouseAxis),a=!0;else if(o.type===u.Gamepad&&o.axis!==void 0)i=e.getAxis(u.Gamepad,o.axis),a=!0;else if(o.type===u.Touch&&o.touchId!==void 0&&o.touchAxis!==void 0){let l=100+o.touchId*2,d=o.touchAxis==="x"?l:l+1;i=e.getAxis(u.Touch,d),a=!0}a&&t.set(o.sourceId,i)}return t}static collectButtonSources(s,e){let t=new Map;for(let n of s)for(let o of n.sources){if(t.has(o.sourceId))continue;let i=!1,a=!1;o.type===u.Keyboard&&o.key!==void 0?(i=e.getButton(u.Keyboard,o.key),a=!0):o.type===u.Mouse&&o.mouseButton!==void 0?(i=e.getButton(u.Mouse,o.mouseButton),a=!0):o.type===u.Gamepad&&o.button!==void 0?(i=e.getButton(u.Gamepad,o.button),a=!0):o.type===u.Touch&&o.touchButton!==void 0&&(i=e.getButton(u.Touch,o.touchButton),a=!0),a&&t.set(o.sourceId,i)}return t}static collectButtonSourcesWithTransitions(s,e){let t=new Map;for(let n of s)for(let o of n.sources){if(t.has(o.sourceId))continue;let i=!1,a=!1,l=!1,d=!1;o.type===u.Keyboard&&o.key!==void 0?(i=e.getButton(u.Keyboard,o.key),a=e.getButtonJustPressed?.(u.Keyboard,o.key)??!1,l=e.getButtonJustReleased?.(u.Keyboard,o.key)??!1,d=!0):o.type===u.Mouse&&o.mouseButton!==void 0?(i=e.getButton(u.Mouse,o.mouseButton),a=e.getButtonJustPressed?.(u.Mouse,o.mouseButton)??!1,l=e.getButtonJustReleased?.(u.Mouse,o.mouseButton)??!1,d=!0):o.type===u.Gamepad&&o.button!==void 0?(i=e.getButton(u.Gamepad,o.button),a=e.getButtonJustPressed?.(u.Gamepad,o.button)??!1,l=e.getButtonJustReleased?.(u.Gamepad,o.button)??!1,d=!0):o.type===u.Touch&&o.touchButton!==void 0&&(i=e.getButton(u.Touch,o.touchButton),a=e.getButtonJustPressed?.(u.Touch,o.touchButton)??!1,l=e.getButtonJustReleased?.(u.Touch,o.touchButton)??!1,d=!0),d&&t.set(o.sourceId,{pressed:i,justPressed:a,justReleased:l})}return t}static collectMousePosition(s,e,t,n,o){let i=s.getAxis(u.Mouse,Z.PositionX),a=s.getAxis(u.Mouse,Z.PositionY),l=s.isLeftMousePressed?.()??!1,d=e.getBoundingClientRect(),M=e.width/e.height,g=d.width/d.height,f,h,k,w;M>g?(f=d.width,h=d.width/M,k=0,w=(d.height-h)/2):(f=d.height*M,h=d.height,k=(d.width-f)/2,w=0);let B=o?.offsetX||0,D=o?.offsetY||0;k+=B,w+=D;let P=i-d.left-k,y=a-d.top-w,G=f/t,F=h/n,L=Math.floor(P/G),K=Math.floor(y/F),R=P>=0&&P<f&&y>=0&&y<h;return{x:Math.max(0,Math.min(t-1,L)),y:Math.max(0,Math.min(n-1,K)),over:R,isLeftDown:l}}static collectTouchPositions(s,e,t,n,o=10,i){let a=[],l=e.getBoundingClientRect(),d=e.width/e.height,M=l.width/l.height,g,f,h,k;d>M?(g=l.width,f=l.width/d,h=0,k=(l.height-f)/2):(g=l.height*d,f=l.height,h=(l.width-g)/2,k=0);let w=i?.offsetX||0,B=i?.offsetY||0;h+=w,k+=B,g-=2*w,f-=2*B;let D=g/t,P=f/n;for(let y=0;y<o;y++){let G=y;if(s.getButton(u.Touch,G)){let L=100+y*2,K=101+y*2,R=s.getAxis(u.Touch,L),_=s.getAxis(u.Touch,K),A=R-l.left-h,S=_-l.top-k,ee=Math.floor(A/D),te=Math.floor(S/P),se=A>=0&&A<g&&S>=0&&S<f;a.push({id:y,x:Math.max(0,Math.min(t-1,ee)),y:Math.max(0,Math.min(n-1,te)),over:se})}}return a}static collectTextInputs(s){return typeof s.getTextInputs=="function"?s.getTextInputs():[]}};p(N,"InputCollector");var X=N;export{v as BaseInputs,Ne as GamepadInput,x as GamepadInputs,X as InputCollector,ze as InputDeviceType,q as InputEventType,Ye as KeyboardInput,C as KeyboardInputs,E as MobileInputs,Xe as MouseInput,I as MouseInputs,Fe as TouchInput,z as UnifiedInputRouter,We as Vector2,Ve as Vector3,ne as isInputs,ue as useGamepadInputs,ie as useKeyboardInputs,re as useMobileInputs,ae as useMouseInputs};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@utsp/input",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0-nightly.20251207012530.05b8403",
|
|
4
4
|
"description": "Comprehensive input management system for UTSP - keyboard, mouse, gamepad, and touch support with unified routing",
|
|
5
5
|
"author": "THP Software",
|
|
6
6
|
"license": "MIT",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"access": "public"
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@utsp/types": "0.
|
|
55
|
+
"@utsp/types": "0.6.0-nightly.20251207012530.05b8403"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"typescript": "^5.6.3"
|