@utsp/input 0.9.0 → 0.10.0-nightly.20251213135145.115c488
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/core.cjs +1 -0
- package/dist/core.d.ts +200 -0
- package/dist/core.mjs +1 -0
- package/dist/desktop.cjs +1 -0
- package/dist/desktop.d.ts +540 -0
- package/dist/desktop.mjs +1 -0
- package/dist/gamepad.cjs +1 -0
- package/dist/gamepad.d.ts +563 -0
- package/dist/gamepad.mjs +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +369 -5
- package/dist/index.mjs +1 -1
- package/dist/keyboard.cjs +1 -0
- package/dist/keyboard.d.ts +341 -0
- package/dist/keyboard.mjs +1 -0
- package/dist/mouse.cjs +1 -0
- package/dist/mouse.d.ts +376 -0
- package/dist/mouse.mjs +1 -0
- package/dist/touch.cjs +1 -0
- package/dist/touch.d.ts +572 -0
- package/dist/touch.mjs +1 -0
- package/package.json +54 -2
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var O=Object.defineProperty;var oe=(h,s,e)=>s in h?O(h,s,{enumerable:!0,configurable:!0,writable:!0,value:e}):h[s]=e;var p=(h,s)=>O(h,"name",{value:s,configurable:!0});var r=(h,s,e)=>(oe(h,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=(c=>(c.KeyDown="keydown",c.KeyUp="keyup",c.MouseDown="mousedown",c.MouseUp="mouseup",c.MouseMove="mousemove",c.MouseWheel="mousewheel",c.TouchStart="touchstart",c.TouchEnd="touchend",c.TouchMove="touchmove",c.GamepadConnected="gamepadconnected",c.GamepadDisconnected="gamepaddisconnected",c.GamepadButton="gamepadbutton",c.GamepadAxis="gamepadaxis",c))(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(h){return typeof h=="object"&&h!==null&&"start"in h&&"stop"in h&&"reset"in h&&"isListening"in h&&"destroy"in h}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(h,s){let e=new C(h);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(h,s){let e=new I(h);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(h,s,e){console.warn("[MobileInputs] useMobileInputs() is deprecated and causes memory leaks. Use useMemo + useEffect instead.");let t=new E(h,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(h,s){let e=new x(s);return h&&e.setGamepadCallbacks(h),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,c,k,w;M>g?(f=d.width,c=d.width/M,k=0,w=(d.height-c)/2):(f=d.height*M,c=d.height,k=(d.width-f)/2,w=0);let P=o?.offsetX||0,D=o?.offsetY||0;k+=P,w+=D,f-=P*2,c-=D*2;let B=i-d.left-k,y=a-d.top-w,G=f/t,F=c/n,L=Math.floor(B/G),K=Math.floor(y/F),R=B>=0&&B<f&&y>=0&&y<c;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,c,k;d>M?(g=l.width,f=l.width/d,c=0,k=(l.height-f)/2):(g=l.height*d,f=l.height,c=(l.width-g)/2,k=0);let w=i?.offsetX||0,P=i?.offsetY||0;c+=w,k+=P,g-=w*2,f-=P*2;let D=g/t,B=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-c,S=_-l.top-k,ee=Math.floor(A/D),te=Math.floor(S/B),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};
|
|
1
|
+
var F=Object.defineProperty;var ie=(c,s,e)=>s in c?F(c,s,{enumerable:!0,configurable:!0,writable:!0,value:e}):c[s]=e;var p=(c,s)=>F(c,"name",{value:s,configurable:!0});var r=(c,s,e)=>(ie(c,typeof s!="symbol"?s+"":s,e),e);import{Vector2 as Ne,Vector3 as Oe}from"@utsp/types";import{InputDeviceType as qe,KeyboardInput as Qe,MouseInput as Ze,GamepadInput as _e,TouchInput as et}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||{}),V=class V{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(o){this.config.debug&&console.error(`Error in ${s} callback:`,o)}})}log(...s){this.config.debug&&console.warn("[InputSystem]",...s)}};p(V,"BaseInputs");var y=V;function ae(c){return typeof c=="object"&&c!==null&&"start"in c&&"stop"in c&&"reset"in c&&"isListening"in c&&"destroy"in c}p(ae,"isInputs");var H=class H extends y{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)}shouldAllowDefault(e,t){let o=/^F([1-9]|1[0-2])$/.test(e),n=(t.ctrlKey||t.metaKey)&&(e==="KeyT"||e==="KeyW"||e==="KeyR"||e==="KeyN"||e==="Tab");return o||n}handleKeyDown(e){try{let t=e.code,o=this.shouldAllowDefault(t,e);this.config.preventDefault&&!o&&e.preventDefault(),this.config.stopPropagation&&!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 n=e.key;n.length===1&&!e.ctrlKey&&!e.metaKey&&this.textInputsThisFrame.push(n)}catch(t){console.error("Error in keyboard keydown handler:",t)}}handleKeyUp(e){try{let t=e.code,o=this.shouldAllowDefault(t,e);this.config.preventDefault&&!o&&e.preventDefault(),this.config.stopPropagation&&!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 E=H;function re(c,s){let e=new E(c);return s&&e.setCallbacks(s),e.start(),e}p(re,"useKeyboardInputs");import{Vector2 as k}from"@utsp/types";var P=class P extends y{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",k.zero());r(this,"mouseDelta",k.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=k.zero(),this.mouseDelta=k.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=k.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)}getButtonByIndex(e){let t=P.BUTTON_NAMES[e];return t?{state:this.mouseButtons[t],name:t}:null}handleMouseDown(e){try{this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation();let t=this.getButtonByIndex(e.button);t&&(t.state.pressed||(t.state.justPressed=!0),t.state.pressed=!0,t.state.justReleased=!1,this.mouseCallbacks.onMouseDown?.(t.name,this.mousePosition,e))}catch(t){console.error("Error in mouse down handler:",t)}}handleMouseUp(e){try{this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation();let t=this.getButtonByIndex(e.button);t&&(t.state.pressed&&(t.state.justReleased=!0),t.state.pressed=!1,t.state.justPressed=!1,this.mouseCallbacks.onMouseUp?.(t.name,this.mousePosition,e))}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 k(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(P,"MouseInputs"),r(P,"BUTTON_NAMES",["left","middle","right"]);var I=P;function ue(c,s){let e=new I(c);return s&&e.setCallbacks(s),e.start(),e}p(ue,"useMouseInputs");import{Vector2 as Q}from"@utsp/types";var j=class j extends y{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),o=[];for(let n of t){if(this.touches.size>=this.maxTouches)break;let i=-1;for(let l=0;l<this.maxTouches;l++)if(!this.touches.has(l)){i=l;break}if(i===-1)continue;let a=new Q(n.clientX,n.clientY),d={id:i,nativeId:n.identifier,position:a.clone(),startPosition:a.clone(),active:!0,justTouched:!0,justReleased:!1};this.touches.set(i,d),this.nativeToInternal.set(n.identifier,i),o.push(d),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 Q(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)}}};p(j,"MobileInputs");var w=j;function le(c,s,e){console.warn("[MobileInputs] useMobileInputs() is deprecated and causes memory leaks. Use useMemo + useEffect instead.");let t=new w(c,e);return s&&t.setCallbacks(s),t.start(),t}p(le,"useMobileInputs");var v={tap:10,mediumTap:25,heavyTap:50,success:[30,50,30],error:[50,30,50,30,50],warning:[100],selection:5,impactLight:15,impactMedium:30,impactHeavy:50,notification:[100,100,100,100,100],sos:[100,30,100,30,100,30,200,30,200,30,200,30,100,30,100,30,100]},J=class J{constructor(s={}){r(this,"config");r(this,"supported",!1);r(this,"userActivated",!1);this.config={enabled:s.enabled??!0,debug:s.debug??!1,intensity:Math.max(0,Math.min(1,s.intensity??1))},this.supported=typeof navigator<"u"&&"vibrate"in navigator,this.config.debug&&console.log(`[MobileVibration] Vibration API supported: ${this.supported}`)}isSupported(){return this.supported}isEnabled(){return this.config.enabled&&this.supported}setEnabled(s){this.config.enabled=s,this.config.debug&&console.log(`[MobileVibration] Enabled: ${s}`)}setIntensity(s){this.config.intensity=Math.max(0,Math.min(1,s)),this.config.debug&&console.log(`[MobileVibration] Intensity set to: ${this.config.intensity}`)}getIntensity(){return this.config.intensity}vibrate(s){if(!this.isEnabled())return!1;try{let e=this.scalePattern(s),t=typeof e=="number"?e:[...e],o=navigator.vibrate(t);return this.config.debug&&console.log(`[MobileVibration] Vibrate: ${JSON.stringify(e)} -> ${o}`),o&&(this.userActivated=!0),o}catch(e){return this.config.debug&&console.error("[MobileVibration] Vibration failed:",e),!1}}cancel(){this.supported&&(navigator.vibrate(0),this.config.debug&&console.log("[MobileVibration] Vibration cancelled"))}hasUserActivation(){return this.userActivated}tap(){return this.vibrate(v.tap)}mediumTap(){return this.vibrate(v.mediumTap)}heavyTap(){return this.vibrate(v.heavyTap)}success(){return this.vibrate(v.success)}error(){return this.vibrate(v.error)}warning(){return this.vibrate(v.warning)}selection(){return this.vibrate(v.selection)}impactLight(){return this.vibrate(v.impactLight)}impactMedium(){return this.vibrate(v.impactMedium)}impactHeavy(){return this.vibrate(v.impactHeavy)}notification(){return this.vibrate(v.notification)}scalePattern(s){return this.config.intensity===1?s:typeof s=="number"?Math.round(s*this.config.intensity):s.map((e,t)=>t%2===0?Math.round(e*this.config.intensity):e)}};p(J,"MobileVibration");var D=J,$=null;function de(){return $||($=new D),$}p(de,"getMobileVibration");var ce=.01,W=class W extends y{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");r(this,"vibrationPresets",{tap:{duration:50,strongMagnitude:.3,weakMagnitude:.5},impact:{duration:100,strongMagnitude:.7,weakMagnitude:.3},heavy:{duration:200,strongMagnitude:1,weakMagnitude:.2},success:{duration:150,strongMagnitude:.4,weakMagnitude:.6},error:{duration:300,strongMagnitude:.8,weakMagnitude:.4},explosion:{duration:400,strongMagnitude:1,weakMagnitude:.8},engine:{duration:1e3,strongMagnitude:.5,weakMagnitude:.2},heartbeat:{duration:100,strongMagnitude:.6,weakMagnitude:.1}});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 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)}}supportsVibration(e){let t=this.getNativeGamepad(e);if(!t)return!1;let o=t.vibrationActuator;if(o&&typeof o.playEffect=="function")return!0;let n=t.hapticActuators;return!!(n&&n.length>0)}async vibrate(e,t){let o=this.getNativeGamepad(e);if(!o)return this.log(`Vibrate failed: gamepad ${e} not found`),!1;let{duration:n,strongMagnitude:i=1,weakMagnitude:a=.5,startDelay:d=0}=t;try{let l=o.vibrationActuator;if(l&&typeof l.playEffect=="function"){let f=await l.playEffect("dual-rumble",{startDelay:d,duration:n,strongMagnitude:Math.min(1,Math.max(0,i)),weakMagnitude:Math.min(1,Math.max(0,a))});return this.log(`Vibration effect result: ${f}`),f==="complete"}let m=o.hapticActuators;if(m&&m.length>0){let f=Math.max(i,a);return await m[0].pulse(f,n),!0}return this.log(`Vibrate failed: gamepad ${e} does not support vibration`),!1}catch(l){return this.log("Vibrate error:",l),!1}}async stopVibration(e){let t=this.getNativeGamepad(e);if(!t)return!1;try{let o=t.vibrationActuator;return o&&typeof o.reset=="function"?(await o.reset(),!0):o&&typeof o.playEffect=="function"?(await o.playEffect("dual-rumble",{duration:0,strongMagnitude:0,weakMagnitude:0}),!0):!1}catch(o){return this.log("Stop vibration error:",o),!1}}async stopAllVibrations(){let e=[];for(let[t]of this.gamepads)e.push(this.stopVibration(t));await Promise.all(e)}async vibrateAll(e){let t=[];for(let[o]of this.gamepads)t.push(this.vibrate(o,e));await Promise.all(t)}async vibratePreset(e,t){let o=this.vibrationPresets[t];return o?this.vibrate(e,o):(this.log(`Unknown vibration preset: ${t}`),!1)}getNativeGamepad(e){return(navigator.getGamepads?navigator.getGamepads():[])[e]||null}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,d)=>{let l=t?.buttons[d],m=a.pressed,f=l?.pressed??!1;return{pressed:m,justPressed:m&&!f,justReleased:!m&&f,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),d=this.applyDeadzone(i);Math.abs(a-d)>ce&&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]}}};p(W,"GamepadInputs");var C=W;function pe(c,s){let e=new C(s);return c&&e.setGamepadCallbacks(c),e.start(),e}p(pe,"useGamepadInputs");import{InputDeviceType as b,KeyboardInput as U,MouseInput as g,isButton as X,isAxis as he}from"@utsp/types";var z=class z{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 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 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 C({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(!X({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(!X({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(!X({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(!he({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}}isLeftMousePressed(){return this.mouse?this.mouse.isLeftMousePressed():!1}getKeyboardButton(s){if(!this.keyboard)return!1;let e=U[s];return this.keyboard.isKeyPressed(e)}getKeyboardButtonJustPressed(s){if(!this.keyboard)return!1;let e=U[s];return this.keyboard.isKeyJustPressed(e)}getKeyboardButtonJustReleased(s){if(!this.keyboard)return!1;let e=U[s];return this.keyboard.isKeyJustReleased(e)}getMouseButton(s){if(!this.mouse)return!1;switch(s){case g.LeftButton:return this.mouse.isLeftMousePressed();case g.RightButton:return this.mouse.isRightMousePressed();case g.MiddleButton:return this.mouse.isMiddleMousePressed();default:return!1}}getMouseButtonJustPressed(s){if(!this.mouse)return!1;switch(s){case g.LeftButton:return this.mouse.isLeftMouseJustPressed();case g.RightButton:return this.mouse.isRightMouseJustPressed();case g.MiddleButton:return this.mouse.isMiddleMouseJustPressed();default:return!1}}getMouseButtonJustReleased(s){if(!this.mouse)return!1;switch(s){case g.LeftButton:return this.mouse.isLeftMouseJustReleased();case g.RightButton:return this.mouse.isRightMouseJustReleased();case g.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 g.PositionX:return this.mouse.getMousePosition().x;case g.PositionY:return this.mouse.getMousePosition().y;case g.DeltaX:return this.mouse.getMouseDelta().x;case g.DeltaY:return this.mouse.getMouseDelta().y;case g.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}getGamepad(){return this.gamepad}getKeyboard(){return this.keyboard}getMouse(){return this.mouse}getMobile(){return this.mobile}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 Y=z;import{InputDeviceType as u,MouseInput as Z}from"@utsp/types";var _=100,ee=2,x=class x{static calculateRenderMetrics(s,e){let t=s.getBoundingClientRect(),o=s.width/s.height,n=t.width/t.height,i,a,d,l;o>n?(i=t.width,a=t.width/o,d=0,l=(t.height-a)/2):(i=t.height*o,a=t.height,d=(t.width-i)/2,l=0);let m=e?.offsetX||0,f=e?.offsetY||0;return d+=m,l+=f,i-=m*2,a-=f*2,{renderWidth:i,renderHeight:a,offsetX:d,offsetY:l,rect:t}}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.Keyboard&&n.negativeKey!==void 0&&n.positiveKey!==void 0){let d=e.getButton(u.Keyboard,n.negativeKey);e.getButton(u.Keyboard,n.positiveKey)&&(i+=1),d&&(i-=1),a=!0}else if(n.type===u.Mouse&&n.mouseAxis!==void 0)i=e.getAxis(u.Mouse,n.mouseAxis),a=!0;else if(n.type===u.Gamepad&&n.axis!==void 0)i=e.getAxis(u.Gamepad,n.axis),a=!0;else if(n.type===u.Touch&&n.touchId!==void 0&&n.touchAxis!==void 0){let d=100+n.touchId*2,l=n.touchAxis==="x"?d:d+1;i=e.getAxis(u.Touch,l),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.Keyboard&&n.key!==void 0?(i=e.getButton(u.Keyboard,n.key),a=!0):n.type===u.Mouse&&n.mouseButton!==void 0?(i=e.getButton(u.Mouse,n.mouseButton),a=!0):n.type===u.Gamepad&&n.button!==void 0?(i=e.getButton(u.Gamepad,n.button),a=!0):n.type===u.Touch&&n.touchButton!==void 0&&(i=e.getButton(u.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,d=!1,l=!1;n.type===u.Keyboard&&n.key!==void 0?(i=e.getButton(u.Keyboard,n.key),a=e.getButtonJustPressed?.(u.Keyboard,n.key)??!1,d=e.getButtonJustReleased?.(u.Keyboard,n.key)??!1,l=!0):n.type===u.Mouse&&n.mouseButton!==void 0?(i=e.getButton(u.Mouse,n.mouseButton),a=e.getButtonJustPressed?.(u.Mouse,n.mouseButton)??!1,d=e.getButtonJustReleased?.(u.Mouse,n.mouseButton)??!1,l=!0):n.type===u.Gamepad&&n.button!==void 0?(i=e.getButton(u.Gamepad,n.button),a=e.getButtonJustPressed?.(u.Gamepad,n.button)??!1,d=e.getButtonJustReleased?.(u.Gamepad,n.button)??!1,l=!0):n.type===u.Touch&&n.touchButton!==void 0&&(i=e.getButton(u.Touch,n.touchButton),a=e.getButtonJustPressed?.(u.Touch,n.touchButton)??!1,d=e.getButtonJustReleased?.(u.Touch,n.touchButton)??!1,l=!0),l&&t.set(n.sourceId,{pressed:i,justPressed:a,justReleased:d})}return t}static collectMousePosition(s,e,t,o,n){let i=s.getAxis(u.Mouse,Z.PositionX),a=s.getAxis(u.Mouse,Z.PositionY),d=s.isLeftMousePressed?.()??!1,{renderWidth:l,renderHeight:m,offsetX:f,offsetY:B,rect:h}=x.calculateRenderMetrics(e,n),T=i-h.left-f,M=a-h.top-B,G=l/t,O=m/o,A=Math.floor(T/G),L=Math.floor(M/O),K=T>=0&&T<l&&M>=0&&M<m;return{x:Math.max(0,Math.min(t-1,A)),y:Math.max(0,Math.min(o-1,L)),over:K,isLeftDown:d}}static collectTouchPositions(s,e,t,o,n=10,i){let a=[],{renderWidth:d,renderHeight:l,offsetX:m,offsetY:f,rect:B}=x.calculateRenderMetrics(e,i),h=d/t,T=l/o;for(let M=0;M<n;M++){let G=M;if(s.getButton(u.Touch,G)){let A=_+M*ee,L=_+M*ee+1,K=s.getAxis(u.Touch,A),te=s.getAxis(u.Touch,L),R=K-B.left-m,S=te-B.top-f,se=Math.floor(R/h),oe=Math.floor(S/T),ne=R>=0&&R<d&&S>=0&&S<l;a.push({id:M,x:Math.max(0,Math.min(t-1,se)),y:Math.max(0,Math.min(o-1,oe)),over:ne})}}return a}static collectTextInputs(s){return typeof s.getTextInputs=="function"?s.getTextInputs():[]}};p(x,"InputCollector");var N=x;export{y as BaseInputs,_e as GamepadInput,C as GamepadInputs,N as InputCollector,qe as InputDeviceType,q as InputEventType,Qe as KeyboardInput,E as KeyboardInputs,w as MobileInputs,D as MobileVibration,Ze as MouseInput,I as MouseInputs,et as TouchInput,Y as UnifiedInputRouter,Ne as Vector2,Oe as Vector3,v as VibrationPatterns,de as getMobileVibration,ae as isInputs,pe as useGamepadInputs,re as useKeyboardInputs,le as useMobileInputs,ue as useMouseInputs};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var l=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var K=(o,t,e)=>t in o?l(o,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):o[t]=e;var d=(o,t)=>l(o,"name",{value:t,configurable:!0});var w=(o,t)=>{for(var e in t)l(o,e,{get:t[e],enumerable:!0})},D=(o,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of m(t))!v.call(o,i)&&i!==e&&l(o,i,{get:()=>t[i],enumerable:!(s=g(t,i))||s.enumerable});return o};var C=o=>D(l({},"__esModule",{value:!0}),o);var r=(o,t,e)=>(K(o,typeof t!="symbol"?t+"":t,e),e);var x={};w(x,{BaseInputs:()=>n,InputDeviceType:()=>b.InputDeviceType,InputEventType:()=>p,KeyboardInput:()=>b.KeyboardInput,KeyboardInputs:()=>u,Vector2:()=>k.Vector2,useKeyboardInputs:()=>f});module.exports=C(x);var k=require("@utsp/types"),b=require("@utsp/types");var p=(a=>(a.KeyDown="keydown",a.KeyUp="keyup",a.MouseDown="mousedown",a.MouseUp="mouseup",a.MouseMove="mousemove",a.MouseWheel="mousewheel",a.TouchStart="touchstart",a.TouchEnd="touchend",a.TouchMove="touchmove",a.GamepadConnected="gamepadconnected",a.GamepadDisconnected="gamepaddisconnected",a.GamepadButton="gamepadbutton",a.GamepadAxis="gamepadaxis",a))(p||{}),y=class y{constructor(t=window,e={}){r(this,"isActive",!1);r(this,"targetElement");r(this,"config");r(this,"callbacks",{});this.targetElement=t,this.config={enabled:!0,preventDefault:!1,stopPropagation:!1,debug:!1,...e}}isListening(){return this.isActive}destroy(){this.stop(),this.clearCallbacks()}setCallbacks(t){typeof t=="object"&&t!==null&&Object.assign(this.callbacks,t)}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(t,...e){this.callbacks[t]&&this.callbacks[t].forEach(s=>{try{s(...e)}catch(i){this.config.debug&&console.error(`Error in ${t} callback:`,i)}})}log(...t){this.config.debug&&console.warn("[InputSystem]",...t)}};d(y,"BaseInputs");var n=y;var h=class h extends n{constructor(e=window,s={}){super(e,s);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)}shouldAllowDefault(e,s){let i=/^F([1-9]|1[0-2])$/.test(e),c=(s.ctrlKey||s.metaKey)&&(e==="KeyT"||e==="KeyW"||e==="KeyR"||e==="KeyN"||e==="Tab");return i||c}handleKeyDown(e){try{let s=e.code,i=this.shouldAllowDefault(s,e);this.config.preventDefault&&!i&&e.preventDefault(),this.config.stopPropagation&&!i&&e.stopPropagation(),this.keys[s]||(this.keys[s]={pressed:!1,justPressed:!1,justReleased:!1}),this.keys[s].pressed||(this.keys[s].justPressed=!0,this.keyboardCallbacks.onKeyDown?.(s,e)),this.keys[s].pressed=!0,this.keys[s].justReleased=!1;let c=e.key;c.length===1&&!e.ctrlKey&&!e.metaKey&&this.textInputsThisFrame.push(c)}catch(s){console.error("Error in keyboard keydown handler:",s)}}handleKeyUp(e){try{let s=e.code,i=this.shouldAllowDefault(s,e);this.config.preventDefault&&!i&&e.preventDefault(),this.config.stopPropagation&&!i&&e.stopPropagation(),this.keys[s]||(this.keys[s]={pressed:!1,justPressed:!1,justReleased:!1}),this.keys[s].pressed&&(this.keys[s].justReleased=!0,this.keyboardCallbacks.onKeyUp?.(s,e)),this.keys[s].pressed=!1,this.keys[s].justPressed=!1}catch(s){console.error("Error in keyboard keyup handler:",s)}}};d(h,"KeyboardInputs");var u=h;function f(o,t){let e=new u(o);return t&&e.setCallbacks(t),e.start(),e}d(f,"useKeyboardInputs");
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import { Vector2, Vector3 } from '@utsp/types';
|
|
2
|
+
export { InputDeviceType, KeyboardInput, Vector2 } from '@utsp/types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Base interface for all input management systems
|
|
6
|
+
* This provides a common API for keyboard, mouse, gamepad, and touch inputs
|
|
7
|
+
*/
|
|
8
|
+
interface IInputs {
|
|
9
|
+
/**
|
|
10
|
+
* Start listening to input events
|
|
11
|
+
*/
|
|
12
|
+
start(): void;
|
|
13
|
+
/**
|
|
14
|
+
* Stop listening to input events and cleanup
|
|
15
|
+
*/
|
|
16
|
+
stop(): void;
|
|
17
|
+
/**
|
|
18
|
+
* Reset all input states to default
|
|
19
|
+
*/
|
|
20
|
+
reset(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Check if the input system is currently active/listening
|
|
23
|
+
*/
|
|
24
|
+
isListening(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Cleanup and destroy the instance, removing all event listeners
|
|
27
|
+
*/
|
|
28
|
+
destroy(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Reset delta values (call at the end of each frame/update)
|
|
31
|
+
*/
|
|
32
|
+
resetDelta(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Set or update event callbacks
|
|
35
|
+
*/
|
|
36
|
+
setCallbacks(callbacks: unknown): void;
|
|
37
|
+
/**
|
|
38
|
+
* Remove all event callbacks
|
|
39
|
+
*/
|
|
40
|
+
clearCallbacks(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Check if a key is currently pressed (Keyboard)
|
|
43
|
+
*/
|
|
44
|
+
isKeyPressed?(key: string): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Check if left mouse button is pressed (Mouse)
|
|
47
|
+
*/
|
|
48
|
+
isLeftMousePressed?(): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Get mouse position (Mouse)
|
|
51
|
+
*/
|
|
52
|
+
getMousePosition?(): Vector2 | null;
|
|
53
|
+
/**
|
|
54
|
+
* Get mouse movement delta (Mouse)
|
|
55
|
+
*/
|
|
56
|
+
getMouseDelta?(): Vector2 | null;
|
|
57
|
+
/**
|
|
58
|
+
* Get wheel delta (Mouse)
|
|
59
|
+
*/
|
|
60
|
+
getWheelDelta?(): Vector2 | null;
|
|
61
|
+
/**
|
|
62
|
+
* Check if a button is pressed (Gamepad, TVRemote)
|
|
63
|
+
*/
|
|
64
|
+
isButtonPressed?(button: string | number): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Get axis value (Gamepad, TVRemote)
|
|
67
|
+
*/
|
|
68
|
+
getAxis?(axis: number): number | null;
|
|
69
|
+
/**
|
|
70
|
+
* Get motion/gyroscope data (TVRemote, Mobile)
|
|
71
|
+
*/
|
|
72
|
+
getMotionData?(): MotionData | null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Motion/Gyroscope data interface
|
|
76
|
+
*/
|
|
77
|
+
interface MotionData extends Vector3 {
|
|
78
|
+
timestamp?: number;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Common button state interface
|
|
82
|
+
*/
|
|
83
|
+
interface ButtonState {
|
|
84
|
+
pressed: boolean;
|
|
85
|
+
justPressed: boolean;
|
|
86
|
+
justReleased: boolean;
|
|
87
|
+
timestamp?: number;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Input event types enumeration
|
|
91
|
+
*/
|
|
92
|
+
declare enum InputEventType {
|
|
93
|
+
KeyDown = "keydown",
|
|
94
|
+
KeyUp = "keyup",
|
|
95
|
+
MouseDown = "mousedown",
|
|
96
|
+
MouseUp = "mouseup",
|
|
97
|
+
MouseMove = "mousemove",
|
|
98
|
+
MouseWheel = "mousewheel",
|
|
99
|
+
TouchStart = "touchstart",
|
|
100
|
+
TouchEnd = "touchend",
|
|
101
|
+
TouchMove = "touchmove",
|
|
102
|
+
GamepadConnected = "gamepadconnected",
|
|
103
|
+
GamepadDisconnected = "gamepaddisconnected",
|
|
104
|
+
GamepadButton = "gamepadbutton",
|
|
105
|
+
GamepadAxis = "gamepadaxis"
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Configuration options for input systems
|
|
109
|
+
*/
|
|
110
|
+
interface InputConfig {
|
|
111
|
+
/**
|
|
112
|
+
* Target element to attach listeners to (default: window)
|
|
113
|
+
*/
|
|
114
|
+
targetElement?: HTMLElement | Window;
|
|
115
|
+
/**
|
|
116
|
+
* Enable/disable specific input types
|
|
117
|
+
*/
|
|
118
|
+
enabled?: boolean;
|
|
119
|
+
/**
|
|
120
|
+
* Prevent default browser behaviors
|
|
121
|
+
*/
|
|
122
|
+
preventDefault?: boolean;
|
|
123
|
+
/**
|
|
124
|
+
* Stop event propagation
|
|
125
|
+
*/
|
|
126
|
+
stopPropagation?: boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Enable debug logging
|
|
129
|
+
*/
|
|
130
|
+
debug?: boolean;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Abstract base class for input systems
|
|
134
|
+
* All input classes should extend this to maintain consistency
|
|
135
|
+
*/
|
|
136
|
+
declare abstract class BaseInputs implements IInputs {
|
|
137
|
+
protected isActive: boolean;
|
|
138
|
+
protected targetElement: HTMLElement | Window;
|
|
139
|
+
protected config: InputConfig;
|
|
140
|
+
protected callbacks: Record<string, ((...args: any[]) => void)[]>;
|
|
141
|
+
constructor(targetElement?: HTMLElement | Window, config?: InputConfig);
|
|
142
|
+
abstract start(): void;
|
|
143
|
+
abstract stop(): void;
|
|
144
|
+
abstract reset(): void;
|
|
145
|
+
abstract resetDelta(): void;
|
|
146
|
+
isListening(): boolean;
|
|
147
|
+
destroy(): void;
|
|
148
|
+
setCallbacks(callbacks: unknown): void;
|
|
149
|
+
clearCallbacks(): void;
|
|
150
|
+
/**
|
|
151
|
+
* Get the target element
|
|
152
|
+
*/
|
|
153
|
+
getTargetElement(): HTMLElement | Window;
|
|
154
|
+
/**
|
|
155
|
+
* Enable the input system
|
|
156
|
+
*/
|
|
157
|
+
enable(): void;
|
|
158
|
+
/**
|
|
159
|
+
* Disable the input system
|
|
160
|
+
*/
|
|
161
|
+
disable(): void;
|
|
162
|
+
/**
|
|
163
|
+
* Check if the input system is enabled
|
|
164
|
+
*/
|
|
165
|
+
isEnabled(): boolean;
|
|
166
|
+
/**
|
|
167
|
+
* Emit an event to all registered callbacks
|
|
168
|
+
*/
|
|
169
|
+
protected emit(eventType: string, ...args: unknown[]): void;
|
|
170
|
+
/**
|
|
171
|
+
* Log debug messages if debug mode is enabled
|
|
172
|
+
*/
|
|
173
|
+
protected log(...args: unknown[]): void;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* KeyboardInputs - Keyboard input management
|
|
178
|
+
* Handles keyboard events with support for vanilla JS, React, and other frameworks
|
|
179
|
+
*/
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Keyboard button state with press/release detection
|
|
183
|
+
*/
|
|
184
|
+
interface KeyButtonState {
|
|
185
|
+
pressed: boolean;
|
|
186
|
+
justPressed: boolean;
|
|
187
|
+
justReleased: boolean;
|
|
188
|
+
}
|
|
189
|
+
interface KeyState {
|
|
190
|
+
[key: string]: KeyButtonState;
|
|
191
|
+
}
|
|
192
|
+
interface KeyboardCallbacks {
|
|
193
|
+
onKeyDown?: (key: string, event: KeyboardEvent) => void;
|
|
194
|
+
onKeyUp?: (key: string, event: KeyboardEvent) => void;
|
|
195
|
+
}
|
|
196
|
+
declare class KeyboardInputs extends BaseInputs {
|
|
197
|
+
private keys;
|
|
198
|
+
private keyboardCallbacks;
|
|
199
|
+
private textInputsThisFrame;
|
|
200
|
+
private boundHandlers;
|
|
201
|
+
constructor(targetElement?: HTMLElement | Window, config?: InputConfig);
|
|
202
|
+
start(): void;
|
|
203
|
+
stop(): void;
|
|
204
|
+
reset(): void;
|
|
205
|
+
resetDelta(): void;
|
|
206
|
+
/**
|
|
207
|
+
* Poll - Reset transient states (justPressed/justReleased)
|
|
208
|
+
* Should be called once per frame AFTER collecting input
|
|
209
|
+
*/
|
|
210
|
+
poll(): void;
|
|
211
|
+
/**
|
|
212
|
+
* Get text inputs captured this frame
|
|
213
|
+
* Returns actual characters typed (handles keyboard layout, modifiers, etc.)
|
|
214
|
+
*
|
|
215
|
+
* @returns Array of character strings typed this frame
|
|
216
|
+
*
|
|
217
|
+
* @example
|
|
218
|
+
* ```typescript
|
|
219
|
+
* const textInputs = keyboard.getTextInputs();
|
|
220
|
+
* textInputs.forEach(char => chatBox.append(char));
|
|
221
|
+
* ```
|
|
222
|
+
*/
|
|
223
|
+
getTextInputs(): string[];
|
|
224
|
+
/**
|
|
225
|
+
* Check if a key is currently pressed
|
|
226
|
+
*
|
|
227
|
+
* @param key - Key code (e.g., 'Space', 'KeyA', 'ArrowUp')
|
|
228
|
+
* @returns True if key is pressed, false otherwise
|
|
229
|
+
*
|
|
230
|
+
* @example
|
|
231
|
+
* ```typescript
|
|
232
|
+
* if (keyboard.isKeyPressed('Space')) {
|
|
233
|
+
* player.jump();
|
|
234
|
+
* }
|
|
235
|
+
*
|
|
236
|
+
* if (keyboard.isKeyPressed('KeyW')) {
|
|
237
|
+
* player.moveForward();
|
|
238
|
+
* }
|
|
239
|
+
* ```
|
|
240
|
+
*/
|
|
241
|
+
isKeyPressed(key: string): boolean;
|
|
242
|
+
/**
|
|
243
|
+
* Check if a key was just pressed this frame
|
|
244
|
+
*
|
|
245
|
+
* @param key - Key code (e.g., 'Space', 'KeyA', 'ArrowUp')
|
|
246
|
+
* @returns True if key was just pressed (transition false→true), false otherwise
|
|
247
|
+
*
|
|
248
|
+
* @example
|
|
249
|
+
* ```typescript
|
|
250
|
+
* if (keyboard.isKeyJustPressed('Space')) {
|
|
251
|
+
* player.jump(); // Jump once per press
|
|
252
|
+
* }
|
|
253
|
+
* ```
|
|
254
|
+
*/
|
|
255
|
+
isKeyJustPressed(key: string): boolean;
|
|
256
|
+
/**
|
|
257
|
+
* Check if a key was just released this frame
|
|
258
|
+
*
|
|
259
|
+
* @param key - Key code (e.g., 'Space', 'KeyA', 'ArrowUp')
|
|
260
|
+
* @returns True if key was just released (transition true→false), false otherwise
|
|
261
|
+
*
|
|
262
|
+
* @example
|
|
263
|
+
* ```typescript
|
|
264
|
+
* if (keyboard.isKeyJustReleased('Space')) {
|
|
265
|
+
* releaseChargedShot();
|
|
266
|
+
* }
|
|
267
|
+
* ```
|
|
268
|
+
*/
|
|
269
|
+
isKeyJustReleased(key: string): boolean;
|
|
270
|
+
/**
|
|
271
|
+
* Get all currently pressed keys
|
|
272
|
+
*
|
|
273
|
+
* @returns Array of key codes currently pressed
|
|
274
|
+
*
|
|
275
|
+
* @example
|
|
276
|
+
* ```typescript
|
|
277
|
+
* const keys = keyboard.getKeysPressed();
|
|
278
|
+
* console.log('Pressed keys:', keys); // ['KeyW', 'Space']
|
|
279
|
+
* ```
|
|
280
|
+
*/
|
|
281
|
+
getKeysPressed(): string[];
|
|
282
|
+
/**
|
|
283
|
+
* Get all keys that were just pressed this frame
|
|
284
|
+
*/
|
|
285
|
+
getKeysJustPressed(): string[];
|
|
286
|
+
/**
|
|
287
|
+
* Get all keys that were just released this frame
|
|
288
|
+
*/
|
|
289
|
+
getKeysJustReleased(): string[];
|
|
290
|
+
/**
|
|
291
|
+
* Check if any key is currently pressed
|
|
292
|
+
*
|
|
293
|
+
* @returns True if at least one key is pressed, false otherwise
|
|
294
|
+
*
|
|
295
|
+
* @example
|
|
296
|
+
* ```typescript
|
|
297
|
+
* if (keyboard.isAnyKeyPressed()) {
|
|
298
|
+
* console.log('Player is active');
|
|
299
|
+
* }
|
|
300
|
+
* ```
|
|
301
|
+
*/
|
|
302
|
+
isAnyKeyPressed(): boolean;
|
|
303
|
+
/**
|
|
304
|
+
* Set keyboard-specific callbacks
|
|
305
|
+
*
|
|
306
|
+
* @param callbacks - Object containing callback functions
|
|
307
|
+
*
|
|
308
|
+
* @example
|
|
309
|
+
* ```typescript
|
|
310
|
+
* keyboard.setKeyboardCallbacks({
|
|
311
|
+
* onKeyDown: (key, event) => {
|
|
312
|
+
* console.log(`Key pressed: ${key}`);
|
|
313
|
+
* },
|
|
314
|
+
* onKeyUp: (key, event) => {
|
|
315
|
+
* console.log(`Key released: ${key}`);
|
|
316
|
+
* },
|
|
317
|
+
* });
|
|
318
|
+
* ```
|
|
319
|
+
*/
|
|
320
|
+
setKeyboardCallbacks(callbacks: KeyboardCallbacks): void;
|
|
321
|
+
clearKeyboardCallbacks(): void;
|
|
322
|
+
setCallbacks(callbacks: KeyboardCallbacks | unknown): void;
|
|
323
|
+
private isKeyboardCallbacks;
|
|
324
|
+
/**
|
|
325
|
+
* Check if browser default behavior should be allowed for this keyboard event
|
|
326
|
+
*
|
|
327
|
+
* Returns true for:
|
|
328
|
+
* - Function keys (F1-F12)
|
|
329
|
+
* - Browser shortcuts (Ctrl+T, Ctrl+W, Ctrl+R, Ctrl+N, Ctrl+Tab)
|
|
330
|
+
*/
|
|
331
|
+
private shouldAllowDefault;
|
|
332
|
+
private handleKeyDown;
|
|
333
|
+
private handleKeyUp;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* React hook for keyboard inputs
|
|
337
|
+
*/
|
|
338
|
+
declare function useKeyboardInputs(targetElement?: HTMLElement | Window, callbacks?: KeyboardCallbacks): KeyboardInputs;
|
|
339
|
+
|
|
340
|
+
export { BaseInputs, InputEventType, KeyboardInputs, useKeyboardInputs };
|
|
341
|
+
export type { ButtonState, IInputs, InputConfig, KeyButtonState, KeyState, KeyboardCallbacks };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var p=Object.defineProperty;var h=(a,s,e)=>s in a?p(a,s,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[s]=e;var n=(a,s)=>p(a,"name",{value:s,configurable:!0});var i=(a,s,e)=>(h(a,typeof s!="symbol"?s+"":s,e),e);import{Vector2 as x}from"@utsp/types";import{InputDeviceType as P,KeyboardInput as j}from"@utsp/types";var y=(o=>(o.KeyDown="keydown",o.KeyUp="keyup",o.MouseDown="mousedown",o.MouseUp="mouseup",o.MouseMove="mousemove",o.MouseWheel="mousewheel",o.TouchStart="touchstart",o.TouchEnd="touchend",o.TouchMove="touchmove",o.GamepadConnected="gamepadconnected",o.GamepadDisconnected="gamepaddisconnected",o.GamepadButton="gamepadbutton",o.GamepadAxis="gamepadaxis",o))(y||{}),c=class c{constructor(s=window,e={}){i(this,"isActive",!1);i(this,"targetElement");i(this,"config");i(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(r){this.config.debug&&console.error(`Error in ${s} callback:`,r)}})}log(...s){this.config.debug&&console.warn("[InputSystem]",...s)}};n(c,"BaseInputs");var l=c;var b=class b extends l{constructor(e=window,t={}){super(e,t);i(this,"keys",{});i(this,"keyboardCallbacks",{});i(this,"textInputsThisFrame",[]);i(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)}shouldAllowDefault(e,t){let r=/^F([1-9]|1[0-2])$/.test(e),d=(t.ctrlKey||t.metaKey)&&(e==="KeyT"||e==="KeyW"||e==="KeyR"||e==="KeyN"||e==="Tab");return r||d}handleKeyDown(e){try{let t=e.code,r=this.shouldAllowDefault(t,e);this.config.preventDefault&&!r&&e.preventDefault(),this.config.stopPropagation&&!r&&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 d=e.key;d.length===1&&!e.ctrlKey&&!e.metaKey&&this.textInputsThisFrame.push(d)}catch(t){console.error("Error in keyboard keydown handler:",t)}}handleKeyUp(e){try{let t=e.code,r=this.shouldAllowDefault(t,e);this.config.preventDefault&&!r&&e.preventDefault(),this.config.stopPropagation&&!r&&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)}}};n(b,"KeyboardInputs");var u=b;function f(a,s){let e=new u(a);return s&&e.setCallbacks(s),e.start(),e}n(f,"useKeyboardInputs");export{l as BaseInputs,P as InputDeviceType,y as InputEventType,j as KeyboardInput,u as KeyboardInputs,x as Vector2,f as useKeyboardInputs};
|
package/dist/mouse.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var l=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var w=(o,s,e)=>s in o?l(o,s,{enumerable:!0,configurable:!0,writable:!0,value:e}):o[s]=e;var d=(o,s)=>l(o,"name",{value:s,configurable:!0});var L=(o,s)=>{for(var e in s)l(o,e,{get:s[e],enumerable:!0})},D=(o,s,e,t)=>{if(s&&typeof s=="object"||typeof s=="function")for(let r of g(s))!E.call(o,r)&&r!==e&&l(o,r,{get:()=>s[r],enumerable:!(t=M(s,r))||t.enumerable});return o};var P=o=>D(l({},"__esModule",{value:!0}),o);var i=(o,s,e)=>(w(o,typeof s!="symbol"?s+"":s,e),e);var k={};L(k,{BaseInputs:()=>u,InputDeviceType:()=>m.InputDeviceType,InputEventType:()=>p,MouseInput:()=>m.MouseInput,MouseInputs:()=>h,Vector2:()=>f.Vector2,useMouseInputs:()=>b});module.exports=P(k);var f=require("@utsp/types"),m=require("@utsp/types");var p=(n=>(n.KeyDown="keydown",n.KeyUp="keyup",n.MouseDown="mousedown",n.MouseUp="mouseup",n.MouseMove="mousemove",n.MouseWheel="mousewheel",n.TouchStart="touchstart",n.TouchEnd="touchend",n.TouchMove="touchmove",n.GamepadConnected="gamepadconnected",n.GamepadDisconnected="gamepaddisconnected",n.GamepadButton="gamepadbutton",n.GamepadAxis="gamepadaxis",n))(p||{}),v=class v{constructor(s=window,e={}){i(this,"isActive",!1);i(this,"targetElement");i(this,"config");i(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(r){this.config.debug&&console.error(`Error in ${s} callback:`,r)}})}log(...s){this.config.debug&&console.warn("[InputSystem]",...s)}};d(v,"BaseInputs");var u=v;var a=require("@utsp/types");var c=class c extends u{constructor(e=window,t={}){super(e,t);i(this,"mouseButtons",{left:{pressed:!1,justPressed:!1,justReleased:!1},middle:{pressed:!1,justPressed:!1,justReleased:!1},right:{pressed:!1,justPressed:!1,justReleased:!1}});i(this,"mousePosition",a.Vector2.zero());i(this,"mouseDelta",a.Vector2.zero());i(this,"wheelDelta",0);i(this,"mouseCallbacks",{});i(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=a.Vector2.zero(),this.mouseDelta=a.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=a.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)}getButtonByIndex(e){let t=c.BUTTON_NAMES[e];return t?{state:this.mouseButtons[t],name:t}:null}handleMouseDown(e){try{this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation();let t=this.getButtonByIndex(e.button);t&&(t.state.pressed||(t.state.justPressed=!0),t.state.pressed=!0,t.state.justReleased=!1,this.mouseCallbacks.onMouseDown?.(t.name,this.mousePosition,e))}catch(t){console.error("Error in mouse down handler:",t)}}handleMouseUp(e){try{this.config.preventDefault&&e.preventDefault(),this.config.stopPropagation&&e.stopPropagation();let t=this.getButtonByIndex(e.button);t&&(t.state.pressed&&(t.state.justReleased=!0),t.state.pressed=!1,t.state.justPressed=!1,this.mouseCallbacks.onMouseUp?.(t.name,this.mousePosition,e))}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 a.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)}}};d(c,"MouseInputs"),i(c,"BUTTON_NAMES",["left","middle","right"]);var h=c;function b(o,s){let e=new h(o);return s&&e.setCallbacks(s),e.start(),e}d(b,"useMouseInputs");
|