From c710de7826093f9f02831f768fbc51dfb34d774a Mon Sep 17 00:00:00 2001 From: Reece Como Date: Mon, 20 Jan 2025 21:39:57 +1100 Subject: [PATCH] v0.5 (#1) --- README.md | 172 +++++---- dist/index.cjs | 2 +- dist/index.cjs.map | 2 +- dist/index.d.ts | 252 ++++++++----- dist/index.mjs | 2 +- dist/index.mjs.map | 2 +- package-lock.json | 4 +- package.json | 2 +- src/Container.mixin.ts | 25 +- src/index.ts | 6 +- src/lib/InputDevice.ts | 25 +- .../devices/__tests__/GamepadDevice.test.ts | 87 ++--- .../devices/__tests__/KeyboardDevice.test.ts | 3 +- src/lib/devices/__tests__/Navigation.test.ts | 97 +++++ .../devices/{ => gamepads}/GamepadDevice.ts | 342 +++++++++-------- src/lib/devices/gamepads/buttons.ts | 25 +- src/lib/devices/gamepads/layouts.ts | 4 +- .../devices/{ => keyboard}/KeyboardDevice.ts | 125 ++++--- src/lib/devices/keyboard/layouts.ts | 2 +- src/lib/navigation/Navigatable.ts | 56 +-- src/lib/navigation/Navigation.ts | 276 -------------- src/lib/navigation/NavigationIntent.ts | 20 +- src/lib/navigation/NavigationResponder.ts | 8 +- src/lib/navigation/NavigationTargetEvent.ts | 8 +- src/lib/navigation/UINavigation.ts | 348 ++++++++++++++++++ 25 files changed, 1106 insertions(+), 789 deletions(-) create mode 100644 src/lib/devices/__tests__/Navigation.test.ts rename src/lib/devices/{ => gamepads}/GamepadDevice.ts (59%) rename src/lib/devices/{ => keyboard}/KeyboardDevice.ts (80%) delete mode 100644 src/lib/navigation/Navigation.ts create mode 100644 src/lib/navigation/UINavigation.ts diff --git a/README.md b/README.md index daaa3f6..d547618 100644 --- a/README.md +++ b/README.md @@ -45,10 +45,10 @@ The core concepts are: 1. **Devices:** _Any human interface device_ 2. **Binds:** _Custom, named input actions that can be triggered by assigned keys or buttons_ -3. **Navigation:** _A global controller that allows non-pointer devices to navigate UIs_ +3. **UINavigation:** _A global controller that allows non-pointer devices to navigate UIs_ > [!NOTE] -> _See [Navigation API](#navigation-api) for more information._ +> _See [UINavigation API](#uinavigation-api) for more information._ ## Installation @@ -77,19 +77,17 @@ Ticker.shared.add(ticker => InputDevice.update()); > [!TIP] > **Input polling:** In the context of a video game, you may want to put the input update at the start of your game event loop instead. -**3.** (Optional) enable the Navigation API +**3.** (Optional) enable the UINavigation API ```ts import * as PIXI from 'pixi.js'; -import { Navigation, registerPixiJSInputDevicesMixin } from 'pixijs-input-devices'; - -// register container mixin -registerPixiJSInputDevicesMixin(PIXI.Container); +import { UINavigation, registerPixiJSNavigationMixin } from 'pixijs-input-devices'; const app = new PIXI.Application(/*…*/) -// set the root view for device navigation -Navigation.stage = app.stage +// enable the navigation API +UINavigation.configureWithRoot( app.stage ) +registerPixiJSNavigationMixin( PIXI.Container ) ``` ✨ You are now ready to use inputs! @@ -237,31 +235,40 @@ gamepad.playVibration({ The gamepad buttons reference **Standard Controller Layout**: -| Button # | ButtonCode | Standard | Nintendo* | Playstation | Xbox | +| Button | BindableCode | Standard | Nintendo [[1]](#gamepad---nintendo-layout-remapping) | Playstation | Xbox | |:---:|:---:|:---:|:---:|:---:|:---:| -| `0` | `"A"` | **A** | A | Cross | A | -| `1` | `"B"` | **B** | X | Circle | B | -| `2` | `"X"` | **X** | B | Square | X | -| `3` | `"Y"` | **Y** | Y | Triangle | Y | +| `0` | `"A"` | **A / FaceButton1** | A | Cross | A | +| `1` | `"B"` | **B / FaceButton2** | X | Circle | B | +| `2` | `"X"` | **X / FaceButton3** | B | Square | X | +| `3` | `"Y"` | **Y / FaceButton4** | Y | Triangle | Y | | `4` | `"LeftShoulder"` | **Left Shoulder** | L | L1 | LB | | `5` | `"RightShoulder"` | **Right Shoulder** | R | R1 | RB | | `6` | `"LeftTrigger"` | **Left Trigger** | L2 | ZL | LT | | `7` | `"RightTrigger"` | **Right Trigger** | R2 | ZR | RT | | `8` | `"Back"` | **Back** | Minus | Options | Back | | `9` | `"Start"` | **Start** | Plus | Select | Start | -| `10` | `"LeftStick"` | **Left Stick (click)** | L3 | L3 | LSB | -| `11` | `"RightStick"` | **Right Stick (click)** | R3 | R3 | RSB | +| `10` | `"LeftStickClick"` | **Left Stick Click** | L3 | L3 | LSB | +| `11` | `"RightStickClick"` | **Right Stick Click** | R3 | R3 | RSB | | `12` | `"DPadUp"` | **D-Pad Up** | ⬆️ | ⬆️ | ⬆️ | | `13` | `"DPadDown"` | **D-Pad Down** | ⬇️ | ⬇️ | ⬇️ | | `14` | `"DPadLeft"` | **D-Pad Left** | ⬅️ | ⬅️ | ⬅️ | | `15` | `"DPadRight"` | **D-Pad Right** | ➡️ | ➡️ | ➡️ | -*See [Nintendo Layout Remapping](#gamepad---nintendo-layout-remapping) for more context +#### Gamepad Axis Codes + +Bindable helpers are available for the joysticks. + +| Axis # | AxisCode | Standard | Layout +|:---:|:---:|:---:|:---:| +| `0` | `"LeftStickLeft"`
`"LeftStickRight"` | **Left Stick (Left/Right)** | ⬅️➡️ | +| `1` | `"LeftStickUp"`
`"LeftStickDown"` | **Left Stick (Up/Down)** | ⬆️⬇️ | +| `2` | `"RightStickLeft"`
`"RightStickRight"` | **Right Stick (Left/Right)** | ⬅️➡️ | +| `3` | `"RightStickUp"`
`"RightStickDown"` | **Right Stick (Up/Down)** | ⬆️⬇️ | #### Gamepad Layouts ```ts -gamepad.layout // "nintendo" | "xbox" | "playstation" | "logitech" | "steam" | "generic" +gamepad.layout // "nintendo" | "xbox" | "playstation" | "logitech" | "steam" | "standard" ``` Layout detection is **highly non-standard** across major browsers, it should generally be used for aesthetic @@ -276,10 +283,10 @@ only major brand controller that deviates from the standard. > ***Nintendo:** Both the labels and physical positions of the A,B,X,Y buttons are different > on Nintendo controllers. > -> Set `GamepadDevice.defaultOptions.remapNintendoMode` to apply the remapping as required. +> Set `GamepadDevice.defaultOptions.nintendoRemapMode` to apply the remapping as required. > -> - `"physical"` _**(default)**_ – The A,B,X,Y button codes will refer the physical layout of a standard controller (Left=X, Top=Y, Bottom=A, Right=B). -> - `"accurate"` – The A,B,X,Y button codes will correspond to the exact Nintendo labels (Left=Y, Top=X, Bottom=B, Right=A). +> - `"physical"` _**(default)**_ – The A,B,X,Y button codes will refer the standard face button positions (Left=X, Top=Y, Bottom=A, Right=B). +> - `"accurate"` – The A,B,X,Y button codes will refer to the exact Nintendo labels (Left=Y, Top=X, Bottom=B, Right=A). > - `"none"` – The A,B,X,Y button codes mapping stay at the default indices (Left=Y, Top=B, Bottom=X, Right=A). > > ``` @@ -299,8 +306,11 @@ only major brand controller that deviates from the standard. You can manually override this per-gamepad, or for all gamepads: ```ts -gamepad.options.remapNintendoMode = "none" -GamepadDevice.defaultOptions.remapNintendoMode = "none" +// set default +GamepadDevice.defaultOptions.nintendoRemapMode = "none" + +// set for a single gamepad +gamepad.options.nintendoRemapMode = "accurate" ``` #### GamepadDevice Events @@ -347,18 +357,18 @@ This allows you to change the keys/buttons later (e.g. allow users to override i ```ts // keyboard: -InputDevice.keyboard.options.binds = { +InputDevice.keyboard.configureBinds({ jump: [ "ArrowUp", "Space", "KeyW" ], crouch: [ "ArrowDown", "KeyS" ], toggleGraphics: [ "KeyB" ], -} +}) // all gamepads: -GamepadDevice.defaultOptions.binds = { - jump: [ "A" ], +GamepadDevice.configureDefaultBinds({ + jump: [ "A", "LeftStickUp" ], crouch: [ "B", "X", "RightTrigger" ], - toggleGraphics: [ "RightStick" ], -} + toggleGraphics: [ "RightStickUp", "RightStickDown" ], +}) ``` These can then be used with either the real-time and event-based APIs. @@ -380,14 +390,14 @@ InputDevice.gamepads[0].onBind( "jump", ( e ) => doJump() ) let jump = false, crouch = false, moveX = 0 const keyboard = InputDevice.keyboard -if ( keyboard.bindPressed( "jump" ) ) jump = true -if ( keyboard.bindPressed( "crouch" ) ) crouch = true +if ( keyboard.pressedBind( "jump" ) ) jump = true +if ( keyboard.pressedBind( "crouch" ) ) crouch = true if ( keyboard.key.ArrowLeft ) moveX = -1 else if ( keyboard.key.ArrowRight ) moveX = 1 for ( const gamepad of InputDevice.gamepads ) { - if ( gamepad.bindPressed( "jump" ) ) jump = true - if ( gamepad.bindPressed( "crouch" ) ) crouch = true + if ( gamepad.pressedBind( "jump" ) ) jump = true + if ( gamepad.pressedBind( "crouch" ) ) crouch = true // gamepads have additional analog inputs // we're going to apply these only if touched @@ -396,42 +406,55 @@ for ( const gamepad of InputDevice.gamepads ) { } ``` -## Navigation API +## UINavigation API _Traverse a UI using input devices._ -The Navigation API is centered around a central **Navigation** controller, which listens to navigation intents from devices, -then handles the intent. +```ts +UINavigation.configureWithRoot( app.stage ) // (or any Container) +``` -The **Navigation** controller maintains a stack of `NavigationResponder` objects, which represent the **current navigation context**. For -example, you might add a `NavigationResponder` for a drop-down UI. A normal `Container` can be used as a `NavigationResponder`, and any -container on the stack will become the **current root container**. +You can manually take control of navigation using: -> [!NOTE] -> The **current root container** is the top-most `Container` on the navigation responder stack, or otherwise `Navigation.stage`. +```ts +// take control +UINavigation.pushResponder( myModalView ) -When a device sends a navigation intent, the **Navigation** controller is responsible for asking each of the responders on the stack -if it can handle the intent. If it can't, it is propagated up all the way to the **current root container**. +// relinquish control +UINavigation.popResponder() +``` -### Default UI Navigation Behavior +The Navigation API is centered around the **UINavigation** manager, which +receives navigation intents from devices and forwards it to the UI context. + +The **UINavigation** manager maintains a stack of responders, which can be a +`Container`, or any object that implements the `NavigationResponder` interface. + +When a device sends a navigation intent, the **UINavigation** manager is +responsible for asking the **first responder** whether it can handle the intent. + +If it returns `false`, any other responders are checked (if they exist), +otherwise the default global navigation behavior kicks in. + +### Default Global Navigation Behaviors When a navigation intent is **not** handled manually by a responder, it is handled in one of the following ways: | Intent | Behavior | |---|---| -|`"navigateBack"`|| -|`"navigateLeft"`, `"navigateRight"`, `"navigateUp"`, `"navigateDown"`|| -|`"trigger"`|| +|`"navigate.back"`|| +|`"navigate.left"`, `"navigate.right"`, `"navigate.up"`, `"navigate.down"`|| +|`"navigate.trigger"`|| -Container event | Description | Equivalent +Container event | Description | Compatibility -----------------|-------------------------------------------------------- -`trigger` | Target was triggered. | `"pointerdown"`, `"mousedown"` -`focus` | Target became focused. | `"pointerover"`, `"mouseover"` -`blur` | Target lost focus. | `"pointerout"`, `"mouseout"` +`"devicedown"` | Target was triggered. | `"pointerdown"`, `"mousedown"` +`"deviceover"` | Target became focused. | `"pointerover"`, `"mouseover"` +`"deviceout"` | Target lost focus. | `"pointerout"`, `"mouseout"` -### Container Navigation +### Container Navigatability -Containers are extended with a few properties/accesors: +Containers are extended with a few properties/accessors: Container properties | type | default | description ---------------------|------|---------|-------------- @@ -443,18 +466,9 @@ Container properties | type | default | description > **isNavigatable:** By default, any element with `"pointerdown"` or `"mousedown"` handlers is navigatable. > [!WARNING] -> **Fallback Hover Effect:** If there is no `"pointerover"` or `"mouseover"` handler detected on a container, `Navigation` +> **Fallback Hover Effect:** If there is no `"pointerover"` or `"mouseover"` handler detected on a container, `UINavigation` > will apply abasic alpha effect to the selected item to indicate which container is currently the navigation target. This -> can be disabled by setting `Navigation.options.useFallbackHoverEffect` to `false`. - - -### Disable Navigation - -You can **disable** the navigation API entirely, either permanently or temporaril): - -```ts -Navigation.options.enabled = false -``` +> can be disabled by setting `UINavigation.options.useFallbackHoverEffect` to `false`. ## Advanced usage @@ -513,7 +527,7 @@ InputDevice.remove( onscreen ) You could set up multiple named inputs: ```ts -InputDevice.keyboard.options.binds = { +InputDevice.keyboard.configureBinds({ jump: [ "ArrowUp", "KeyW" ], defend: [ "ArrowDown", "KeyS" ], left: [ "ArrowLeft", "KeyA" ], @@ -528,7 +542,7 @@ InputDevice.keyboard.options.binds = { p2_defend: [ "ArrowDown" ], p2_left: [ "ArrowLeft" ], p2_right: [ "ArrowRight" ], -} +}) ``` and then switch groups depending on the mode: @@ -536,22 +550,22 @@ and then switch groups depending on the mode: ```ts if ( gameMode === "multiplayer" ) { - player1.jump = device.bindPressed( "p1_jump" ) - player1.defend = device.bindPressed( "p1_defend" ) - player1.moveX += device.bindPressed( "p1_left" ) ? -1 : 0 - player1.moveX += device.bindPressed( "p1_right" ) ? 1 : 0 - - player2.jump = device.bindPressed( "p2_jump" ) - player2.defend = device.bindPressed( "p2_defend" ) - player2.moveX += device.bindPressed( "p2_left" ) ? -1 : 0 - player2.moveX += device.bindPressed( "p2_right" ) ? 1 : 0 + player1.jump = device.pressedBind( "p1_jump" ) + player1.defend = device.pressedBind( "p1_defend" ) + player1.moveX += device.pressedBind( "p1_left" ) ? -1 : 0 + player1.moveX += device.pressedBind( "p1_right" ) ? 1 : 0 + + player2.jump = device.pressedBind( "p2_jump" ) + player2.defend = device.pressedBind( "p2_defend" ) + player2.moveX += device.pressedBind( "p2_left" ) ? -1 : 0 + player2.moveX += device.pressedBind( "p2_right" ) ? 1 : 0 } else { - player1.jump = device.bindPressed( "jump" ) - player1.defend = device.bindPressed( "defend" ) - player1.moveX += device.bindPressed( "left" ) ? -1 : 0 - player1.moveX += device.bindPressed( "right" ) ? 1 : 0 + player1.jump = device.pressedBind( "jump" ) + player1.defend = device.pressedBind( "defend" ) + player1.moveX += device.pressedBind( "left" ) ? -1 : 0 + player1.moveX += device.pressedBind( "right" ) ? 1 : 0 updateComputerPlayerInput( player2 ) } diff --git a/dist/index.cjs b/dist/index.cjs index 0453874..2bb6a72 100644 --- a/dist/index.cjs +++ b/dist/index.cjs @@ -1,2 +1,2 @@ -"use strict";const e=0,t=1,i=2,s=3,o={A:0,B:1,X:2,Y:3,LeftShoulder:4,RightShoulder:5,LeftTrigger:6,RightTrigger:7,Back:8,Start:9,LeftStick:10,RightStick:11,DPadUp:12,DPadDown:13,DPadLeft:14,DPadRight:15},n=["A","B","X","Y","LeftShoulder","RightShoulder","LeftTrigger","RightTrigger","Back","Start","LeftStick","RightStick","DPadUp","DPadDown","DPadLeft","DPadRight"];function getAllNavigatables(e,t=[]){for(const i of e.children)i.isNavigatable?t.push(i):getAllNavigatables(i,t);return t}function getFirstNavigatable(e,t,i,{minimumDistance:s=3}={}){return function chooseFirstNavigatableInDirection(e,t,i,{minimumDistance:s=3}={}){var o,n,a,r,d,c,u,l,h;const g=e.filter((e=>e.isNavigatable&&null!=e.parent&&function isVisible(e){for(;null!=e;){if(!e.visible)return!1;e=e.parent}return!0}(e))),p=g.find((e=>e===t));if(void 0===p)return g.sort(((e,t)=>t.navigationPriority-e.navigationPriority)),g[0];if(void 0===i&&p)return p;const m=null!=p?p:g[Math.floor(Math.random()*g.length)];if(void 0===p)return null!==(o=e[0])&&void 0!==o?o:m;const v=p.getBounds(),y={x:v.left+v.width/2,y:v.top+v.height/2},f=g.filter((e=>e!==p)).map((e=>{const t=e.getBounds(),i={x:t.left+t.width/2,y:t.top+t.height/2};return{element:e,bounds:t,center:i,distSqrd:squaredDist(i,y)}}));switch(i){case"navigateUp":return null!==(a=null===(n=f.filter((e=>e.center.ye.distSqrd-t.distSqrd))[0])||void 0===n?void 0:n.element)&&void 0!==a?a:m;case"navigateLeft":return null!==(d=null===(r=f.filter((e=>e.center.xe.distSqrd-t.distSqrd))[0])||void 0===r?void 0:r.element)&&void 0!==d?d:m;case"navigateRight":return null!==(u=null===(c=f.filter((e=>e.center.x>y.x+s)).sort(((e,t)=>e.distSqrd-t.distSqrd))[0])||void 0===c?void 0:c.element)&&void 0!==u?u:m;case"navigateDown":return null!==(h=null===(l=f.filter((e=>e.center.y>y.y+s)).sort(((e,t)=>e.distSqrd-t.distSqrd))[0])||void 0===l?void 0:l.element)&&void 0!==h?h:m;default:return p}}(getAllNavigatables(e),t,i,{minimumDistance:s})}function isChildOf(e,t){for(;null!=e;){if(e===t)return!0;e=e.parent}return!1}function squaredDist(e,t){const i=t.x-e.x,s=t.y-e.y;return i*i+s*s}class NavigationManager{constructor(){this.options={enabled:!0,useFallbackHoverEffect:!0},this._responderStack=[]}get firstResponder(){return this._responderStack[0]}get responders(){return this._responderStack}commit(e,t){this.options.enabled&&this._propagateIntent(e,t)}popResponder(){var e,t,i,s;const o=this._responderStack.shift();return null===(e=null==o?void 0:o.resignedAsFirstResponder)||void 0===e||e.call(o),this._clearFocusIfNeeded(),this.firstResponder&&(null===(i=(t=this.firstResponder).becameFirstResponder)||void 0===i||i.call(t),(null===(s=this.firstResponder.autoFocus)||void 0===s||s)&&this.autoFocus()),o}pushResponder(e){var t,i,s;if(this._responderStack.includes(e))throw new Error("Responder already in stack.");const o=this.firstResponder;this._responderStack.unshift(e),null===(t=null==o?void 0:o.resignedAsFirstResponder)||void 0===t||t.call(o),this._clearFocusIfNeeded(),null===(i=e.becameFirstResponder)||void 0===i||i.call(e),(null===(s=e.autoFocus)||void 0===s||s)&&this.autoFocus()}autoFocus(){var e;const t=null!==(e=this.responders.find(isContainer))&&void 0!==e?e:this.stage;if(!t)return;const i=getFirstNavigatable(t);void 0!==i?i!==this._focused&&(this._focused&&this._emitBlur(this._focused),this._emitFocus(i),this._focused=i):console.debug("navigation: no navigatable containers found")}_propagateIntent(e,t){var i,s;for(const s of this._responderStack)if(null===(i=s.handledNavigationIntent)||void 0===i?void 0:i.call(s,e,t))return;if(void 0===this.stage)console.warn("navigation: no stage root set");else{const t=null!==(s=this.responders.find(isContainer))&&void 0!==s?s:this.stage;this._handleGlobalIntent(t,e)}}_handleGlobalIntent(e,t){var i,s;if(void 0===this._focused)return void this.autoFocus();if("navigateBack"===t)return this._emitBlur(this._focused),void(this._focused=void 0);if("trigger"===t)return void this._emitTrigger(this._focused);const o=null!==(s=getFirstNavigatable(null!==(i=this.responders.find(isContainer))&&void 0!==i?i:this.stage,this._focused,t))&&void 0!==s?s:this._focused;o!==this._focused&&(this._emitBlur(this._focused),this._emitFocus(o),this._focused=o)}_emitBlur(e){const t=e.eventNames();t.includes("pointerout")?e.emit("pointerout"):t.includes("mouseout")?e.emit("mouseout"):"auto"===e.navigationMode&&this.options.useFallbackHoverEffect&&(e.alpha=1),e.emit("blur")}_emitFocus(e){const t=e.eventNames();t.includes("pointerover")?e.emit("pointerover"):t.includes("mouseover")?e.emit("mouseover"):"auto"===e.navigationMode&&this.options.useFallbackHoverEffect&&(e.alpha=.5),e.emit("focus")}_emitTrigger(e){const t=e.eventNames();t.includes("pointerdown")?e.emit("pointerdown"):t.includes("mousedown")?e.emit("mousedown"):"auto"===e.navigationMode&&this.options.useFallbackHoverEffect&&(e.alpha=.75),e.emit("trigger")}_clearFocusIfNeeded(){var e;const t=null!==(e=this.responders.find(isContainer))&&void 0!==e?e:this.stage;t&&this._focused&&!isChildOf(this._focused,t)&&(this._focused=void 0)}}function isContainer(e){return"children"in e}NavigationManager.global=new NavigationManager;const a=NavigationManager.global;let r=new Map;function throttle(e,t){var i;const s=Date.now();return(null!==(i=r.get(e))&&void 0!==i?i:0)>s||(r.set(e,s+t),!1)}class EventEmitter{constructor(){this._listeners={}}hasListener(e){return void 0!==this._listeners[e]}emit(e,t){var i;null===(i=this._listeners[e])||void 0===i||i.forEach((e=>e(t)))}on(e,t){var i;this._listeners[e]||(this._listeners[e]=[]),null===(i=this._listeners[e])||void 0===i||i.push(t)}off(e,t){var i,s;this._listeners[e]=void 0===t||null===(i=this._listeners[e])||void 0===i?void 0:i.filter((e=>e!==t)),0===(null===(s=this._listeners[e])||void 0===s?void 0:s.length)&&(this._listeners[e]=void 0)}}class GamepadDevice{pressedBind(e){return void 0!==this.options.binds[e]&&this.pressedAny(this.options.binds[e])}pressedAny(e){for(let t=0;t!1)),this._btnPrevState=this._btnPrevState.map((()=>!1))}constructor(e){this.source=e,this.type="gamepad",this.meta={},this.lastInteraction=performance.now(),this.options=JSON.parse(JSON.stringify(GamepadDevice.defaultOptions)),this.leftJoystick={x:0,y:0},this.rightJoystick={x:0,y:0},this.button=Object.keys(o).reduce(((e,t)=>(e[t]=!1,e)),{}),this._btnPrevState=new Array(16),this._axisIntents=new Array(2),this._emitter=new EventEmitter,this._bindEmitter=new EventEmitter,this.leftTrigger=0,this.rightTrigger=0,this.leftShoulder=0,this.rightShoulder=0,this.id="gamepad"+e.index,this.layout=function detectLayout(e){const t=(e.id||"").toLowerCase();return/(steam|28de)/.test(t)?"steam":/(logitech|046d|c216)/.test(t)?"logitech":/(nintendo|switch|joycon|057e)/.test(t)?"nintendo":/(dualshock|dualsense|sony|054c|0ce6|0810)/.test(t)?"playstation":/(xbox|xinput|045e|028e|0291|02a0|02a1|02ea|02ff)/.test(t)?"xbox":"generic"}(e),this._throttleIdLeftStickX=this.id+"-lsx",this._throttleIdLeftStickY=this.id+"-lsy"}updatePresses(r,d){var c,u,l,h,g,p,m;const v=this._btnPrevState.length;for(let e=0;ethis._emitter.emit(s,{device:this,button:t,buttonCode:s}))),Object.entries(this.options.binds).forEach((([e,i])=>{i.includes(s)&&setTimeout((()=>{const i={device:this,button:t,buttonCode:s,name:e};this._bindEmitter.emit(e,i),this._emitter.emit("bind",i)}))})),a.options.enabled&&this.options.navigation.enabled&&void 0!==this.options.navigation.binds[t]&&setTimeout((()=>a.commit(this.options.navigation.binds[t],this))))}const y=this.options.triggerDeadzone;this.leftTrigger=_scale(this.source.buttons[o.LeftTrigger].value,y),this.rightTrigger=_scale(this.source.buttons[o.RightTrigger].value,y),this.leftShoulder=_scale(this.source.buttons[o.LeftShoulder].value,y),this.rightShoulder=_scale(this.source.buttons[o.RightShoulder].value,y);const f=this.options.joystickDeadzone;this.leftJoystick.x=_scale(null!==(h=r.axes[e])&&void 0!==h?h:0,f),this.leftJoystick.y=_scale(null!==(g=r.axes[t])&&void 0!==g?g:0,f),this.rightJoystick.x=_scale(null!==(p=r.axes[i])&&void 0!==p?p:0,f),this.rightJoystick.y=_scale(null!==(m=r.axes[s])&&void 0!==m?m:0,f),0===this.leftJoystick.x&&0===this.leftJoystick.y&&0===this.rightJoystick.x&&0===this.rightJoystick.y||(this.lastInteraction=d);const b=this.options.navigation.joystick;if(Math.abs(this.leftJoystick.x)>=b.commitSensitivity){const t=this.leftJoystick.x<0?"navigateLeft":"navigateRight",i=this._axisIntents[e]?b.repeatCooldownMs:b.firstRepeatCooldownMs;this._axisIntents[e]=!0,this.options.navigation.enabled&&!throttle(this._throttleIdLeftStickX,i)&&setTimeout((()=>a.commit(t,this)))}else this._axisIntents[e]=!1;if(Math.abs(this.leftJoystick.y)>=b.commitSensitivity){const e=this.leftJoystick.y<0?"navigateUp":"navigateDown",i=this._axisIntents[t]?b.repeatCooldownMs:b.firstRepeatCooldownMs;this._axisIntents[t]=!0,this.options.navigation.enabled&&!throttle(this._throttleIdLeftStickY,i)&&setTimeout((()=>a.commit(e,this)))}else this._axisIntents[t]=!1}}function _scale(e,t){const i=(Math.abs(e)-t[0])/(t[1]-t[0]);return i>=0&&i<=1?Math.sign(e)*i:i>1?1*Math.sign(e):0}GamepadDevice.defaultOptions={remapNintendoMode:"physical",binds:{},navigation:{enabled:!0,binds:{[o.A]:"trigger",[o.B]:"navigateBack",[o.Back]:"navigateBack",[o.DPadDown]:"navigateDown",[o.DPadLeft]:"navigateLeft",[o.DPadRight]:"navigateRight",[o.DPadUp]:"navigateUp"},joystick:{commitSensitivity:.5,repeatCooldownMs:80,firstRepeatCooldownMs:400}},joystickDeadzone:[0,1],triggerDeadzone:[0,1],vibration:{enabled:!0,intensity:1}};const d={AltLeft:"AltLeft",AltRight:"AltRight",ArrowDown:"ArrowDown",ArrowLeft:"ArrowLeft",ArrowRight:"ArrowRight",ArrowUp:"ArrowUp",Backquote:"Backquote",Backslash:"Backslash",Backspace:"Backspace",BracketLeft:"BracketLeft",BracketRight:"BracketRight",CapsLock:"CapsLock",Comma:"Comma",ContextMenu:"ContextMenu",ControlLeft:"ControlLeft",ControlRight:"ControlRight",Delete:"Delete",Digit0:"Digit0",Digit1:"Digit1",Digit2:"Digit2",Digit3:"Digit3",Digit4:"Digit4",Digit5:"Digit5",Digit6:"Digit6",Digit7:"Digit7",Digit8:"Digit8",Digit9:"Digit9",End:"End",Enter:"Enter",Equal:"Equal",Escape:"Escape",F1:"F1",F10:"F10",F11:"F11",F12:"F12",F13:"F13",F14:"F14",F15:"F15",F16:"F16",F17:"F17",F18:"F18",F19:"F19",F2:"F2",F20:"F20",F21:"F21",F22:"F22",F23:"F23",F24:"F24",F25:"F25",F26:"F26",F27:"F27",F28:"F28",F29:"F29",F3:"F3",F30:"F30",F31:"F31",F32:"F32",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",Home:"Home",IntlBackslash:"IntlBackslash",IntlRo:"IntlRo",IntlYen:"IntlYen",KeyA:"KeyA",KeyB:"KeyB",KeyC:"KeyC",KeyD:"KeyD",KeyE:"KeyE",KeyF:"KeyF",KeyG:"KeyG",KeyH:"KeyH",KeyI:"KeyI",KeyJ:"KeyJ",KeyK:"KeyK",KeyL:"KeyL",KeyM:"KeyM",KeyN:"KeyN",KeyO:"KeyO",KeyP:"KeyP",KeyQ:"KeyQ",KeyR:"KeyR",KeyS:"KeyS",KeyT:"KeyT",KeyU:"KeyU",KeyV:"KeyV",KeyW:"KeyW",KeyX:"KeyX",KeyY:"KeyY",KeyZ:"KeyZ",Lang1:"Lang1",Lang2:"Lang2",MediaTrackNext:"MediaTrackNext",MediaTrackPrevious:"MediaTrackPrevious",MetaLeft:"MetaLeft",MetaRight:"MetaRight",Minus:"Minus",NumLock:"NumLock",Numpad0:"Numpad0",Numpad1:"Numpad1",Numpad2:"Numpad2",Numpad3:"Numpad3",Numpad4:"Numpad4",Numpad5:"Numpad5",Numpad6:"Numpad6",Numpad7:"Numpad7",Numpad8:"Numpad8",Numpad9:"Numpad9",NumpadAdd:"NumpadAdd",NumpadComma:"NumpadComma",NumpadDecimal:"NumpadDecimal",NumpadDivide:"NumpadDivide",NumpadMultiply:"NumpadMultiply",NumpadSubtract:"NumpadSubtract",OSLeft:"OSLeft",Pause:"Pause",Period:"Period",Quote:"Quote",ScrollLock:"ScrollLock",Semicolon:"Semicolon",ShiftLeft:"ShiftLeft",ShiftRight:"ShiftRight",Slash:"Slash",Space:"Space",Tab:"Tab",VolumeDown:"VolumeDown",VolumeMute:"VolumeMute",VolumeUp:"VolumeUp",WakeUp:"WakeUp"};function __awaiter(e,t,i,s){return new(i||(i=Promise))((function(o,n){function fulfilled(e){try{step(s.next(e))}catch(e){n(e)}}function rejected(e){try{step(s.throw(e))}catch(e){n(e)}}function step(e){e.done?o(e.value):function adopt(e){return e instanceof i?e:new i((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))}let c,u;"function"==typeof SuppressedError&&SuppressedError;const l=["fr","mg","lu"],h=["ab","ba","be","bg","ch","kk","ky","mk","mn","ru","sr","tg","tt","uk","uz"],g=["de","cs","sk","sl","hu","hr","bs","ro","sq","me","lt","lv","et"],p=/ф|и|с|в|у|а|п|р|ш|о|л|д|ь|т|щ|з|й|к|ы|е|г|м|ц|ч|н|я|ё|х|ъ|б|ю|э|ж|и/i,m=/[a-z]/i;function inferKeyboardLayoutFromLang(e=function getLang(){var e;const t=navigator;return null!=(null===(e=t.languages)||void 0===e?void 0:e.length)?t.languages[0]:t.userLanguage||t.language||t.browserLanguage}()){const t=(e||"").toLowerCase(),i=t.split("-")[0];return l.includes(i)||t.startsWith("nl-be")?"AZERTY":h.includes(i)?"JCUKEN":g.includes(i)||t.startsWith("sr-latn")?"QWERTZ":"QWERTY"}const v=new Set(["AZERTY","JCUKEN","QWERTY","QWERTZ"]);function getLayoutKeyLabel(e,t){var i,s;if(void 0===u){const e={ArrowLeft:"⬅",ArrowRight:"➡",ArrowUp:"⬆",ArrowDown:"⬇",AltLeft:"Left Alt",AltRight:"Right Alt",Backquote:"`",Backslash:"\\",Backspace:"Backspace",BracketLeft:"[",BracketRight:"]",CapsLock:"CapsLock",Comma:",",ContextMenu:"Context Menu",ControlLeft:"Left Ctrl",ControlRight:"Right Ctrl",Delete:"Delete",Digit0:"0",Digit1:"1",Digit2:"2",Digit3:"3",Digit4:"4",Digit5:"5",Digit6:"6",Digit7:"7",Digit8:"8",Digit9:"9",End:"End",Enter:"Enter",Equal:"=",Escape:"Esc",F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F11",F12:"F12",F13:"F13",F14:"F14",F15:"F15",F16:"F16",F17:"F17",F18:"F18",F19:"F19",F20:"F20",F21:"F21",F22:"F22",F23:"F23",F24:"F24",F25:"F25",F26:"F26",F27:"F27",F28:"F28",F29:"F29",F30:"F30",F31:"F31",F32:"F32",Home:"Home",IntlBackslash:"\\",IntlRo:"Ro",IntlYen:"¥",KeyA:"A",KeyB:"B",KeyC:"C",KeyD:"D",KeyE:"E",KeyF:"F",KeyG:"G",KeyH:"H",KeyI:"I",KeyJ:"J",KeyK:"K",KeyL:"L",KeyM:"M",KeyN:"N",KeyO:"O",KeyP:"P",KeyQ:"Q",KeyR:"R",KeyS:"S",KeyT:"T",KeyU:"U",KeyV:"V",KeyW:"W",KeyX:"X",KeyY:"Y",KeyZ:"Z",Lang1:"Language 1",Lang2:"Language 2",MediaTrackNext:"Next Track",MediaTrackPrevious:"Previous Track",MetaLeft:"Left "+getMetaKeyLabel(),MetaRight:"Right "+getMetaKeyLabel(),Minus:"-",NumLock:"Num Lock",Numpad0:"Num0",Numpad1:"Num1",Numpad2:"Num2",Numpad3:"Num3",Numpad4:"Num4",Numpad5:"Num5",Numpad6:"Num6",Numpad7:"Num7",Numpad8:"Num8",Numpad9:"Num9",NumpadAdd:"+",NumpadComma:",",NumpadDecimal:".",NumpadDivide:"/",NumpadMultiply:"*",NumpadSubtract:"-",OSLeft:"OS Left",Pause:"Pause",Period:".",Quote:"'",ScrollLock:"Scroll Lock",Semicolon:";",ShiftLeft:"Left Shift",ShiftRight:"Right Shift",Slash:"/",Space:"Space",Tab:"Tab",VolumeDown:"Volume Down",VolumeMute:"Volume Mute",VolumeUp:"Volume Up",WakeUp:"Wake Up"};u={AZERTY:{KeyA:"Q",KeyQ:"A",KeyW:"Z",KeyZ:"W",Backquote:"²",BracketLeft:"«",BracketRight:"»"},JCUKEN:{KeyA:"Ф",KeyB:"И",KeyC:"С",KeyD:"В",KeyE:"У",KeyF:"А",KeyG:"П",KeyH:"Р",KeyI:"Ш",KeyJ:"О",KeyK:"Л",KeyL:"Д",KeyM:"Ь",KeyN:"Т",KeyO:"Щ",KeyP:"З",KeyQ:"Й",KeyR:"К",KeyS:"Ы",KeyT:"Е",KeyU:"Г",KeyV:"М",KeyW:"Ц",KeyX:"Ч",KeyY:"Н",KeyZ:"Я",Backquote:"Ё",BracketLeft:"х",BracketRight:"ъ",Comma:"Б",Period:"Ю",Quote:"Э",Semicolon:"Ж",Slash:"И"},QWERTY:e,QWERTZ:{KeyY:"Z",KeyZ:"Y",BracketLeft:"ü",BracketRight:"ö",Slash:"-"}}}return null!==(s=null!==(i=u[t][e])&&void 0!==i?i:u.QWERTY[e])&&void 0!==s?s:e}function getMetaKeyLabel(){var e,t,i,s;const o=navigator,n=null!==(t=null===(e=o.platform)||void 0===e?void 0:e.toLowerCase())&&void 0!==t?t:"",a=null!==(s=null===(i=o.userAgent)||void 0===i?void 0:i.toLowerCase())&&void 0!==s?s:"";return n.includes("mac")?"⌘":n.includes("win")||n.includes("linux")?"⊞":a.includes("android")?"Search":a.includes("iphone")||a.includes("ipad")?"⌘":"⊞"}const y=["navigateLeft","navigateRight","navigateUp","navigateDown"];class KeyboardDevice{constructor(){this.type="keyboard",this.id="keyboard",this.meta={},this.lastInteraction=performance.now(),this.detectLayoutOnKeypress=!0,this.detected=!1,this.options={binds:{},navigation:{enabled:!0,binds:{Space:"trigger",Enter:"trigger",Escape:"navigateBack",Backspace:"navigateBack",ArrowDown:"navigateDown",ArrowLeft:"navigateLeft",ArrowRight:"navigateRight",ArrowUp:"navigateUp",KeyA:"navigateLeft",KeyD:"navigateRight",KeyS:"navigateDown",KeyW:"navigateUp"}}},this.key=Object.keys(d).reduce(((e,t)=>(e[t]=!1,e)),{}),this._emitter=new EventEmitter,this._bindEmitter=new EventEmitter,this._deferredKeydown=[],this._layout=inferKeyboardLayoutFromLang(),this._layoutSource="lang",function requestKeyboardLayout(){return __awaiter(this,void 0,void 0,(function*(){const e=navigator;if(e.keyboard&&e.keyboard.getLayoutMap)try{const t=yield e.keyboard.getLayoutMap();c=t;const i=t.get("KeyQ"),s=t.get("KeyA"),o=t.get("KeyZ");if("a"===i&&"w"===o&&"q"===s)return"AZERTY";if("q"===i&&"y"===o&&"a"===s)return"QWERTZ";if("q"===i&&"z"===o&&"a"===s)return"QWERTY";if("й"===i&&"я"===o&&"ф"===s)return"JCUKEN"}catch(e){}}))}().then((e=>{void 0!==e&&(this._layoutSource="browser",this._layout=e,this.detectLayoutOnKeypress=!1,this._emitter.emit("layoutdetected",{layoutSource:"browser",layout:e,device:this}))})),this._configureEventListeners()}get layout(){return this._layout}set layout(e){this._layoutSource="manual",this._layout=e,this.detectLayoutOnKeypress=!1}get layoutSource(){return this._layoutSource}pressedBind(e){return void 0!==this.options.binds[e]&&this.pressedAny(this.options.binds[e])}pressedAny(e){for(let t=0;te.charAt(0).toLocaleUpperCase()+e.slice(1))).join(" ")}(t)}(e))&&void 0!==i?i:getLayoutKeyLabel(e,null!=t?t:this._layout)}update(e){this._deferredKeydown.length>0&&(this._deferredKeydown.forEach((e=>this._processDeferredKeydownEvent(e))),this._deferredKeydown.length=0)}clear(){for(const e of Object.keys(d))this.key[e]=!1}_configureEventListeners(){const e=this.key,t=this._deferredKeydown;window.addEventListener("keydown",(i=>{e[i.code]=!0,t.push(i),this.lastInteraction=performance.now()}),{passive:!0,capture:!0}),window.addEventListener("keyup",(t=>{e[t.code]=!1,this.lastInteraction=performance.now()}),{passive:!0,capture:!0})}_processDeferredKeydownEvent(e){const t=e.code;if(!e.repeat){if(this.detectLayoutOnKeypress&&"lang"===this._layoutSource){const t=function detectKeyboardLayoutFromKeydown(e){const t=e.key.toLowerCase(),i=e.code;return p.test(t)?(v.delete("AZERTY"),v.delete("QWERTY"),v.delete("QWERTZ")):"Backquote"===i&&"²"===t||"BracketLeft"===i&&"«"===t||"BracketRight"===i&&"»"===t||"KeyA"===i&&"q"===t||"KeyQ"===i&&"a"===t||"KeyW"===i&&"z"===t||"KeyZ"===i&&"w"===t?(v.delete("JCUKEN"),v.delete("QWERTY"),v.delete("QWERTZ")):"BracketLeft"===i&&"ü"===t||"BracketRight"===i&&"ö"===t||"KeyY"===i&&"z"===t||"KeyZ"===i&&"y"===t||"Slash"===i&&"-"===t?(v.delete("AZERTY"),v.delete("JCUKEN"),v.delete("QWERTY")):"BracketLeft"===i&&"["===t||"BracketRight"===i&&"]"===t||"KeyZ"===i&&"z"===t?(v.delete("AZERTY"),v.delete("JCUKEN"),v.delete("QWERTZ")):"KeyQ"===i&&"q"===t||"KeyW"===i&&"w"===t?(v.delete("AZERTY"),v.delete("JCUKEN")):"KeyY"===i&&"Y"===t?(v.delete("QWERTZ"),v.delete("JCUKEN")):m.test(t)&&v.delete("JCUKEN"),1===v.size?[...v][0]:void 0}(e);void 0!==t&&(this._layout=t,this._layoutSource="keypress",this.detectLayoutOnKeypress=!1,this._emitter.emit("layoutdetected",{layout:t,layoutSource:"keypress",device:this}))}this._emitter.hasListener(t)&&setTimeout((()=>this._emitter.emit(t,{device:this,keyCode:t,keyLabel:this.getKeyLabel(t),event:e}))),Object.entries(this.options.binds).forEach((([i,s])=>{s.includes(t)&&setTimeout((()=>{const s={device:this,keyCode:t,keyLabel:this.getKeyLabel(t),event:e,name:i};this._bindEmitter.emit(i,s),this._emitter.emit("bind",s)}))}))}if(a.options.enabled&&this.options.navigation.enabled&&void 0!==this.options.navigation.binds[t]){const i=this.options.navigation.binds[t];e.repeat&&!y.includes(i)||setTimeout((()=>a.commit(this.options.navigation.binds[t],this)))}}}KeyboardDevice.global=new KeyboardDevice;class InputDeviceManager{constructor(){this.isMobile=(()=>{let e=!1;var t;return t=navigator.userAgent||navigator.vendor,(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0,4)))&&(e=!0),e})(),this.isTouchCapable=function isTouchCapable(){return"ontouchstart"in window||navigator.maxTouchPoints>0}(),this.options={requireFocus:!0,clearInputInBackground:!0},this._devices=[],this._gamepadDevices=[],this._gamepadDeviceMap=new Map,this._customDevices=[],this._emitter=new EventEmitter,this._bindEmitter=new EventEmitter,this._hasFocus=!1,this.keyboard=KeyboardDevice.global,this.isTouchCapable||this.isMobile?window.addEventListener("keydown",(()=>this.add(this.keyboard)),{once:!0}):this.add(this.keyboard),window.addEventListener("gamepadconnected",(()=>this._pollGamepads(performance.now()))),window.addEventListener("gamepaddisconnected",(e=>this._removeGamepad(e.gamepad.index)))}get devices(){return this._devices}get gamepads(){return this._gamepadDevices}get custom(){return this._customDevices}get lastInteractedDevice(){return this._lastInteractedDevice}on(e,t){return this._emitter.on(e,t),this}off(e,t){return this._emitter.off(e,t),this}onBind(e,t){return this._bindEmitter.on(e,t),this}offBind(e,t){return this._bindEmitter.off(e,t),this}emitBind(e){this._bindEmitter.emit(e.name,e)}add(e){-1===this._devices.indexOf(e)&&(this._devices.push(e),e instanceof KeyboardDevice?(e.detected=!0,e.on("bind",(e=>this.emitBind(e)))):e instanceof GamepadDevice?(this._gamepadDeviceMap.set(e.source.index,e),this._gamepadDevices.push(e),e.on("bind",(e=>this.emitBind(e)))):this._customDevices.push(e),this._emitter.emit("deviceadded",{device:e}))}remove(e){if(!(e instanceof KeyboardDevice||e instanceof GamepadDevice)){const t=this._customDevices.indexOf(e);-1!==t&&this._devices.splice(t,1)}const t=this._devices.indexOf(e);-1!==t&&(this._devices.splice(t,1),this._emitter.emit("deviceremoved",{device:e}))}update(){if(this.options.requireFocus&&!document.hasFocus())return this._hasFocus&&this.options.clearInputInBackground&&this.devices.forEach((e=>{var t;return null===(t=e.clear)||void 0===t?void 0:t.call(e)})),this._hasFocus=!1,this._devices;this._hasFocus=!0;const e=performance.now();return this.keyboard.detected&&this.keyboard.update(e),this._gamepadDevices.length>0&&this._pollGamepads(e),this._customDevices.length>0&&this._customDevices.forEach((t=>t.update(e))),this._updateLastInteracted(),this._devices}_updateLastInteracted(){if(0===this._devices.length)return;let e;if(1===this._devices.length)e=this._devices[0];else for(const t of this._devices)(void 0===e||t.lastInteraction>e.lastInteraction)&&(e=t);this._lastInteractedDevice=e}_pollGamepads(e){if(!document.hasFocus())return this._gamepadDevices;if(void 0===navigator.getGamepads)return this._gamepadDevices;for(const t of navigator.getGamepads())if(null!=t)if(this._gamepadDeviceMap.has(t.index)){this._gamepadDeviceMap.get(t.index).update(t,e)}else{const i=new GamepadDevice(t);this.add(i),i.update(t,e)}return this._gamepadDevices}_removeGamepad(e){const t=this._gamepadDeviceMap.get(e);if(!t)return;const i=this._gamepadDevices.indexOf(t);-1!==i&&this._gamepadDevices.splice(i,1),this.remove(t),this._gamepadDeviceMap.delete(e)}}InputDeviceManager.global=new InputDeviceManager;const f=InputDeviceManager.global;exports.Button=o,exports.GamepadDevice=GamepadDevice,exports.InputDevice=f,exports.KeyCode=d,exports.KeyboardDevice=KeyboardDevice,exports.Navigation=a,exports.REPEATABLE_NAV_INTENTS=y,exports.getAllNavigatables=getAllNavigatables,exports.getFirstNavigatable=getFirstNavigatable,exports.isChildOf=isChildOf,exports.registerPixiJSInputDeviceMixin=function registerPixiJSInputDeviceMixin(e){const t=e.prototype;t.navigationPriority=0,t.navigationMode="auto",Object.defineProperty(t,"isNavigatable",{get:function(){if("auto"===this.navigationMode){if(!this.isInteractive)return!1;const e=this.eventNames();return e.includes("pointerdown")||e.includes("mousedown")}return"target"===this.navigationMode},configurable:!0,enumerable:!1})}; +"use strict";const e=0,t=1,i=2,s=3,o=["LeftStickLeft","LeftStickRight","LeftStickUp","LeftStickDown","RightStickLeft","RightStickRight","RightStickUp","RightStickDown"],n={A:0,B:1,X:2,Y:3,LeftShoulder:4,RightShoulder:5,LeftTrigger:6,RightTrigger:7,Back:8,Start:9,LeftStickClick:10,RightStickClick:11,DPadUp:12,DPadDown:13,DPadLeft:14,DPadRight:15},a=["A","B","X","Y","LeftShoulder","RightShoulder","LeftTrigger","RightTrigger","Back","Start","LStick","RStick","DPadUp","DPadDown","DPadLeft","DPadRight"];let r=new Map;function throttle(e,t){var i;const s=Date.now();return(null!==(i=r.get(e))&&void 0!==i?i:0)>s||(r.set(e,s+t),!1)}class EventEmitter{constructor(){this._listeners={}}hasListener(e){return void 0!==this._listeners[e]}emit(e,t){var i;null===(i=this._listeners[e])||void 0===i||i.forEach((e=>e(t)))}on(e,t){var i;this._listeners[e]||(this._listeners[e]=[]),null===(i=this._listeners[e])||void 0===i||i.push(t)}off(e,t){var i,s;this._listeners[e]=void 0===t||null===(i=this._listeners[e])||void 0===i?void 0:i.filter((e=>e!==t)),0===(null===(s=this._listeners[e])||void 0===s?void 0:s.length)&&(this._listeners[e]=void 0)}}class GamepadDevice{static configureDefaultBinds(e){this.defaultOptions.binds=Object.assign(Object.assign({},this.defaultOptions.binds),e)}pressedBind(e){return void 0!==this.options.binds[e]&&this.pressedAny(this.options.binds[e])}pressedAny(e){for(let t=0;t(e[t]=!1,e)),{})}constructor(e){this.source=e,this.type="gamepad",this.meta={},this.lastInteraction=performance.now(),this.options=JSON.parse(JSON.stringify(GamepadDevice.defaultOptions)),this.leftJoystick={x:0,y:0},this.rightJoystick={x:0,y:0},this.button=[...a,...o].reduce(((e,t)=>(e[t]=!1,e)),{}),this._emitter=new EventEmitter,this._bindEmitter=new EventEmitter,this.leftTrigger=0,this.rightTrigger=0,this.leftShoulder=0,this.rightShoulder=0,this.id="gamepad"+e.index,this.layout=function detectLayout(e){const t=(e.id||"").toLowerCase();return/(steam|28de)/.test(t)?"steam":/(logitech|046d|c216)/.test(t)?"logitech":/(nintendo|switch|joycon|057e)/.test(t)?"nintendo":/(dualshock|dualsense|sony|054c|0ce6|0810)/.test(t)?"playstation":/(xbox|xinput|045e|028e|0291|02a0|02a1|02ea|02ff)/.test(t)?"xbox":"standard"}(e)}updatePresses(r,d){var c,u,l,h,g,p,m;const v=this.options.joystick;for(let e=0;e<4;e++){const t=_scale(r.axes[e],v.deadzone),i=o[2*e+(t>0?1:0)];if(Math.abs(t)this._emitter.emit(i,{device:this,axis:e,axisCode:i}))),Object.entries(this.options.binds).forEach((([t,s])=>{s.includes(i)&&setTimeout((()=>{const s={device:this,type:"axis",axis:e,axisCode:i,name:t};this._bindEmitter.emit(t,s),this._emitter.emit("bind",s)}))})))}}for(let e=0;e<16;e++){let t=e;"nintendo"===this.layout&&"none"!==this.options.nintendoRemapMode&&("physical"===this.options.nintendoRemapMode?t===n.B?t=n.A:t===n.A?t=n.B:t===n.X?t=n.Y:t===n.Y&&(t=n.X):t===n.B?t=n.X:t===n.X&&(t=n.B));const i=a[t];if(this.button[i]===(null===(c=r.buttons[e])||void 0===c?void 0:c.pressed))continue;this.lastInteraction=d;const s=null!==(l=null===(u=r.buttons[e])||void 0===u?void 0:u.pressed)&&void 0!==l&&l;this.button[i]=s,s&&(this._emitter.hasListener(i)&&setTimeout((()=>this._emitter.emit(i,{device:this,button:t,buttonCode:i}))),Object.entries(this.options.binds).forEach((([e,s])=>{s.includes(i)&&setTimeout((()=>{const s={device:this,type:"button",button:t,buttonCode:i,name:e};this._bindEmitter.emit(e,s),this._emitter.emit("bind",s)}))})))}const f=this.options.trigger.deadzone;this.leftTrigger=_scale(r.buttons[n.LeftTrigger].value,f),this.rightTrigger=_scale(r.buttons[n.RightTrigger].value,f),this.leftShoulder=_scale(r.buttons[n.LeftShoulder].value,f),this.rightShoulder=_scale(r.buttons[n.RightShoulder].value,f);const y=v.deadzone;this.leftJoystick.x=_scale(null!==(h=r.axes[e])&&void 0!==h?h:0,y),this.leftJoystick.y=_scale(null!==(g=r.axes[t])&&void 0!==g?g:0,y),this.rightJoystick.x=_scale(null!==(p=r.axes[i])&&void 0!==p?p:0,y),this.rightJoystick.y=_scale(null!==(m=r.axes[s])&&void 0!==m?m:0,y)}}function _scale(e,t){const i=(Math.abs(e)-t[0])/(t[1]-t[0]);return i>=0&&i<=1?Math.sign(e)*i:i>1?1*Math.sign(e):0}GamepadDevice.defaultOptions={nintendoRemapMode:"physical",binds:{"navigate.back":["B","Back"],"navigate.down":["DPadDown","LeftStickDown"],"navigate.left":["DPadLeft","LeftStickLeft"],"navigate.right":["DPadRight","LeftStickRight"],"navigate.trigger":["A"],"navigate.up":["DPadUp","LeftStickUp"]},joystick:{deadzone:[0,1],threshold:.25,autoRepeatDelayMs:[400,80]},trigger:{deadzone:[0,1]},vibration:{enabled:!0,intensity:1}};const d={AltLeft:"AltLeft",AltRight:"AltRight",ArrowDown:"ArrowDown",ArrowLeft:"ArrowLeft",ArrowRight:"ArrowRight",ArrowUp:"ArrowUp",Backquote:"Backquote",Backslash:"Backslash",Backspace:"Backspace",BracketLeft:"BracketLeft",BracketRight:"BracketRight",CapsLock:"CapsLock",Comma:"Comma",ContextMenu:"ContextMenu",ControlLeft:"ControlLeft",ControlRight:"ControlRight",Delete:"Delete",Digit0:"Digit0",Digit1:"Digit1",Digit2:"Digit2",Digit3:"Digit3",Digit4:"Digit4",Digit5:"Digit5",Digit6:"Digit6",Digit7:"Digit7",Digit8:"Digit8",Digit9:"Digit9",End:"End",Enter:"Enter",Equal:"Equal",Escape:"Escape",F1:"F1",F10:"F10",F11:"F11",F12:"F12",F13:"F13",F14:"F14",F15:"F15",F16:"F16",F17:"F17",F18:"F18",F19:"F19",F2:"F2",F20:"F20",F21:"F21",F22:"F22",F23:"F23",F24:"F24",F25:"F25",F26:"F26",F27:"F27",F28:"F28",F29:"F29",F3:"F3",F30:"F30",F31:"F31",F32:"F32",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",Home:"Home",IntlBackslash:"IntlBackslash",IntlRo:"IntlRo",IntlYen:"IntlYen",KeyA:"KeyA",KeyB:"KeyB",KeyC:"KeyC",KeyD:"KeyD",KeyE:"KeyE",KeyF:"KeyF",KeyG:"KeyG",KeyH:"KeyH",KeyI:"KeyI",KeyJ:"KeyJ",KeyK:"KeyK",KeyL:"KeyL",KeyM:"KeyM",KeyN:"KeyN",KeyO:"KeyO",KeyP:"KeyP",KeyQ:"KeyQ",KeyR:"KeyR",KeyS:"KeyS",KeyT:"KeyT",KeyU:"KeyU",KeyV:"KeyV",KeyW:"KeyW",KeyX:"KeyX",KeyY:"KeyY",KeyZ:"KeyZ",Lang1:"Lang1",Lang2:"Lang2",MediaTrackNext:"MediaTrackNext",MediaTrackPrevious:"MediaTrackPrevious",MetaLeft:"MetaLeft",MetaRight:"MetaRight",Minus:"Minus",NumLock:"NumLock",Numpad0:"Numpad0",Numpad1:"Numpad1",Numpad2:"Numpad2",Numpad3:"Numpad3",Numpad4:"Numpad4",Numpad5:"Numpad5",Numpad6:"Numpad6",Numpad7:"Numpad7",Numpad8:"Numpad8",Numpad9:"Numpad9",NumpadAdd:"NumpadAdd",NumpadComma:"NumpadComma",NumpadDecimal:"NumpadDecimal",NumpadDivide:"NumpadDivide",NumpadMultiply:"NumpadMultiply",NumpadSubtract:"NumpadSubtract",OSLeft:"OSLeft",Pause:"Pause",Period:"Period",Quote:"Quote",ScrollLock:"ScrollLock",Semicolon:"Semicolon",ShiftLeft:"ShiftLeft",ShiftRight:"ShiftRight",Slash:"Slash",Space:"Space",Tab:"Tab",VolumeDown:"VolumeDown",VolumeMute:"VolumeMute",VolumeUp:"VolumeUp",WakeUp:"WakeUp"};function __awaiter(e,t,i,s){return new(i||(i=Promise))((function(o,n){function fulfilled(e){try{step(s.next(e))}catch(e){n(e)}}function rejected(e){try{step(s.throw(e))}catch(e){n(e)}}function step(e){e.done?o(e.value):function adopt(e){return e instanceof i?e:new i((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))}let c,u;"function"==typeof SuppressedError&&SuppressedError;const l=["fr","mg","lu"],h=["ab","ba","be","bg","ch","kk","ky","mk","mn","ru","sr","tg","tt","uk","uz"],g=["de","cs","sk","sl","hu","hr","bs","ro","sq","me","lt","lv","et"],p=/ф|и|с|в|у|а|п|р|ш|о|л|д|ь|т|щ|з|й|к|ы|е|г|м|ц|ч|н|я|ё|х|ъ|б|ю|э|ж|и/i,m=/[a-z]/i;function inferKeyboardLayoutFromLang(e=function getLang(){var e;const t=navigator;return null!=(null===(e=t.languages)||void 0===e?void 0:e.length)?t.languages[0]:t.userLanguage||t.language||t.browserLanguage}()){const t=(e||"").toLowerCase(),i=t.split("-")[0];return l.includes(i)||t.startsWith("nl-be")?"AZERTY":h.includes(i)?"JCUKEN":g.includes(i)||t.startsWith("sr-latn")?"QWERTZ":"QWERTY"}const v=new Set(["AZERTY","JCUKEN","QWERTY","QWERTZ"]);function getLayoutKeyLabel(e,t){var i,s;if(void 0===u){const e={ArrowLeft:"⬅",ArrowRight:"➡",ArrowUp:"⬆",ArrowDown:"⬇",AltLeft:"Left Alt",AltRight:"Right Alt",Backquote:"`",Backslash:"\\",Backspace:"Backspace",BracketLeft:"[",BracketRight:"]",CapsLock:"CapsLock",Comma:",",ContextMenu:"Context Menu",ControlLeft:"Left Ctrl",ControlRight:"Right Ctrl",Delete:"Delete",Digit0:"0",Digit1:"1",Digit2:"2",Digit3:"3",Digit4:"4",Digit5:"5",Digit6:"6",Digit7:"7",Digit8:"8",Digit9:"9",End:"End",Enter:"Enter",Equal:"=",Escape:"Esc",F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F11",F12:"F12",F13:"F13",F14:"F14",F15:"F15",F16:"F16",F17:"F17",F18:"F18",F19:"F19",F20:"F20",F21:"F21",F22:"F22",F23:"F23",F24:"F24",F25:"F25",F26:"F26",F27:"F27",F28:"F28",F29:"F29",F30:"F30",F31:"F31",F32:"F32",Home:"Home",IntlBackslash:"\\",IntlRo:"Ro",IntlYen:"¥",KeyA:"A",KeyB:"B",KeyC:"C",KeyD:"D",KeyE:"E",KeyF:"F",KeyG:"G",KeyH:"H",KeyI:"I",KeyJ:"J",KeyK:"K",KeyL:"L",KeyM:"M",KeyN:"N",KeyO:"O",KeyP:"P",KeyQ:"Q",KeyR:"R",KeyS:"S",KeyT:"T",KeyU:"U",KeyV:"V",KeyW:"W",KeyX:"X",KeyY:"Y",KeyZ:"Z",Lang1:"Language 1",Lang2:"Language 2",MediaTrackNext:"Next Track",MediaTrackPrevious:"Previous Track",MetaLeft:"Left "+getMetaKeyLabel(),MetaRight:"Right "+getMetaKeyLabel(),Minus:"-",NumLock:"Num Lock",Numpad0:"Num0",Numpad1:"Num1",Numpad2:"Num2",Numpad3:"Num3",Numpad4:"Num4",Numpad5:"Num5",Numpad6:"Num6",Numpad7:"Num7",Numpad8:"Num8",Numpad9:"Num9",NumpadAdd:"+",NumpadComma:",",NumpadDecimal:".",NumpadDivide:"/",NumpadMultiply:"*",NumpadSubtract:"-",OSLeft:"OS Left",Pause:"Pause",Period:".",Quote:"'",ScrollLock:"Scroll Lock",Semicolon:";",ShiftLeft:"Left Shift",ShiftRight:"Right Shift",Slash:"/",Space:"Space",Tab:"Tab",VolumeDown:"Volume Down",VolumeMute:"Volume Mute",VolumeUp:"Volume Up",WakeUp:"Wake Up"};u={AZERTY:{KeyA:"Q",KeyQ:"A",KeyW:"Z",KeyZ:"W",Backquote:"²",BracketLeft:"«",BracketRight:"»"},JCUKEN:{KeyA:"Ф",KeyB:"И",KeyC:"С",KeyD:"В",KeyE:"У",KeyF:"А",KeyG:"П",KeyH:"Р",KeyI:"Ш",KeyJ:"О",KeyK:"Л",KeyL:"Д",KeyM:"Ь",KeyN:"Т",KeyO:"Щ",KeyP:"З",KeyQ:"Й",KeyR:"К",KeyS:"Ы",KeyT:"Е",KeyU:"Г",KeyV:"М",KeyW:"Ц",KeyX:"Ч",KeyY:"Н",KeyZ:"Я",Backquote:"Ё",BracketLeft:"х",BracketRight:"ъ",Comma:"Б",Period:"Ю",Quote:"Э",Semicolon:"Ж",Slash:"И"},QWERTY:e,QWERTZ:{KeyY:"Z",KeyZ:"Y",BracketLeft:"ü",BracketRight:"ö",Slash:"-"}}}return null!==(s=null!==(i=u[t][e])&&void 0!==i?i:u.QWERTY[e])&&void 0!==s?s:e}function getMetaKeyLabel(){var e,t,i,s;const o=navigator,n=null!==(t=null===(e=o.platform)||void 0===e?void 0:e.toLowerCase())&&void 0!==t?t:"",a=null!==(s=null===(i=o.userAgent)||void 0===i?void 0:i.toLowerCase())&&void 0!==s?s:"";return n.includes("mac")?"⌘":n.includes("win")||n.includes("linux")?"⊞":a.includes("android")?"Search":a.includes("iphone")||a.includes("ipad")?"⌘":"⊞"}class KeyboardDevice{constructor(){this.type="keyboard",this.id="keyboard",this.meta={},this.lastInteraction=performance.now(),this.detectLayoutOnKeypress=!0,this.detected=!1,this.options={binds:{"navigate.back":["Escape","Backspace"],"navigate.down":["ArrowDown","KeyS"],"navigate.left":["ArrowLeft","KeyA"],"navigate.right":["ArrowRight","KeyD"],"navigate.trigger":["Enter","Space"],"navigate.up":["ArrowUp","KeyW"]},repeatableBinds:["navigate.down","navigate.left","navigate.right","navigate.up"]},this.key=Object.keys(d).reduce(((e,t)=>(e[t]=!1,e)),{}),this._emitter=new EventEmitter,this._bindEmitter=new EventEmitter,this._deferredKeydown=[],this._layout=inferKeyboardLayoutFromLang(),this._layoutSource="lang",function requestKeyboardLayout(){return __awaiter(this,void 0,void 0,(function*(){const e=navigator;if(e.keyboard&&e.keyboard.getLayoutMap)try{const t=yield e.keyboard.getLayoutMap();c=t;const i=t.get("KeyQ"),s=t.get("KeyA"),o=t.get("KeyZ");if("a"===i&&"w"===o&&"q"===s)return"AZERTY";if("q"===i&&"y"===o&&"a"===s)return"QWERTZ";if("q"===i&&"z"===o&&"a"===s)return"QWERTY";if("й"===i&&"я"===o&&"ф"===s)return"JCUKEN"}catch(e){}}))}().then((e=>{void 0!==e&&(this._layoutSource="browser",this._layout=e,this.detectLayoutOnKeypress=!1,this._emitter.emit("layoutdetected",{layoutSource:"browser",layout:e,device:this}))})),this._configureEventListeners()}get layout(){return this._layout}set layout(e){this._layoutSource="manual",this._layout=e,this.detectLayoutOnKeypress=!1}get layoutSource(){return this._layoutSource}pressedBind(e){return void 0!==this.options.binds[e]&&this.pressedAny(this.options.binds[e])}pressedAny(e){for(let t=0;te.charAt(0).toLocaleUpperCase()+e.slice(1))).join(" ")}(t)}(e))&&void 0!==i?i:getLayoutKeyLabel(e,null!=t?t:this._layout)}update(e){this._deferredKeydown.length>0&&(this._deferredKeydown.forEach((e=>this._processDeferredKeydownEvent(e))),this._deferredKeydown.length=0)}clear(){for(const e of Object.keys(d))this.key[e]=!1}_configureEventListeners(){const e=this.key,t=this._deferredKeydown;window.addEventListener("keydown",(i=>{e[i.code]=!0,t.push(i),this.lastInteraction=performance.now()}),{passive:!0,capture:!0}),window.addEventListener("keyup",(t=>{e[t.code]=!1,this.lastInteraction=performance.now()}),{passive:!0,capture:!0})}_processDeferredKeydownEvent(e){const t=e.code;if(!e.repeat){if(this.detectLayoutOnKeypress&&"lang"===this._layoutSource){const t=function detectKeyboardLayoutFromKeydown(e){const t=e.key.toLowerCase(),i=e.code;return p.test(t)?(v.delete("AZERTY"),v.delete("QWERTY"),v.delete("QWERTZ")):"Backquote"===i&&"²"===t||"BracketLeft"===i&&"«"===t||"BracketRight"===i&&"»"===t||"KeyA"===i&&"q"===t||"KeyQ"===i&&"a"===t||"KeyW"===i&&"z"===t||"KeyZ"===i&&"w"===t?(v.delete("JCUKEN"),v.delete("QWERTY"),v.delete("QWERTZ")):"BracketLeft"===i&&"ü"===t||"BracketRight"===i&&"ö"===t||"KeyY"===i&&"z"===t||"KeyZ"===i&&"y"===t||"Slash"===i&&"-"===t?(v.delete("AZERTY"),v.delete("JCUKEN"),v.delete("QWERTY")):"BracketLeft"===i&&"["===t||"BracketRight"===i&&"]"===t||"KeyZ"===i&&"z"===t?(v.delete("AZERTY"),v.delete("JCUKEN"),v.delete("QWERTZ")):"KeyQ"===i&&"q"===t||"KeyW"===i&&"w"===t?(v.delete("AZERTY"),v.delete("JCUKEN")):"KeyY"===i&&"y"===t?(v.delete("QWERTZ"),v.delete("JCUKEN")):m.test(t)&&v.delete("JCUKEN"),1===v.size?[...v][0]:void 0}(e);void 0!==t&&(this._layout=t,this._layoutSource="keypress",this.detectLayoutOnKeypress=!1,this._emitter.emit("layoutdetected",{layout:t,layoutSource:"keypress",device:this}))}this._emitter.hasListener(t)&&setTimeout((()=>this._emitter.emit(t,{device:this,keyCode:t,keyLabel:this.getKeyLabel(t),event:e})))}Object.entries(this.options.binds).forEach((([i,s])=>{s.includes(t)&&(e.repeat&&!this.options.repeatableBinds.includes(i)||setTimeout((()=>{const s={device:this,keyCode:t,keyLabel:this.getKeyLabel(t),event:e,name:i,repeat:e.repeat};this._bindEmitter.emit(i,s),this._emitter.emit("bind",s)})))}))}}KeyboardDevice.global=new KeyboardDevice;class InputDeviceManager{constructor(){this.isMobile=(()=>{let e=!1;var t;return t=navigator.userAgent||navigator.vendor,(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0,4)))&&(e=!0),e})(),this.isTouchCapable=function isTouchCapable(){return"ontouchstart"in window||navigator.maxTouchPoints>0}(),this.options={requireFocus:!0,clearInputInBackground:!0},this._devices=[],this._gamepadDevices=[],this._gamepadDeviceMap=new Map,this._customDevices=[],this._emitter=new EventEmitter,this._bindEmitter=new EventEmitter,this._hasFocus=!1,this.keyboard=KeyboardDevice.global,this.isTouchCapable||this.isMobile?window.addEventListener("keydown",(()=>this.add(this.keyboard)),{once:!0}):this.add(this.keyboard),window.addEventListener("gamepadconnected",(()=>this._pollGamepads(performance.now()))),window.addEventListener("gamepaddisconnected",(e=>this._removeGamepad(e.gamepad.index)))}get devices(){return this._devices}get gamepads(){return this._gamepadDevices}get custom(){return this._customDevices}get lastInteractedDevice(){return this._lastInteractedDevice}on(e,t){return this._emitter.on(e,t),this}off(e,t){return this._emitter.off(e,t),this}onBind(e,t){return(e=Array.isArray(e)?e:[e]).forEach((e=>this._bindEmitter.on(e,t))),this}offBind(e,t){return(e=Array.isArray(e)?e:[e]).forEach((e=>this._bindEmitter.off(e,t))),this}emitBind(e){this._bindEmitter.emit(e.name,e)}add(e){-1===this._devices.indexOf(e)&&(this._devices.push(e),e instanceof KeyboardDevice?(e.detected=!0,e.on("bind",(e=>this.emitBind(e)))):e instanceof GamepadDevice?(this._gamepadDeviceMap.set(e.source.index,e),this._gamepadDevices.push(e),e.on("bind",(e=>this.emitBind(e)))):this._customDevices.push(e),this._emitter.emit("deviceadded",{device:e}))}remove(e){if(!(e instanceof KeyboardDevice||e instanceof GamepadDevice)){const t=this._customDevices.indexOf(e);-1!==t&&this._devices.splice(t,1)}const t=this._devices.indexOf(e);-1!==t&&(this._devices.splice(t,1),this._emitter.emit("deviceremoved",{device:e}))}update(){if(this.options.requireFocus&&!document.hasFocus())return this._hasFocus&&this.options.clearInputInBackground&&this.devices.forEach((e=>{var t;return null===(t=e.clear)||void 0===t?void 0:t.call(e)})),this._hasFocus=!1,this._devices;this._hasFocus=!0;const e=performance.now();return this.keyboard.detected&&this.keyboard.update(e),this._gamepadDevices.length>0&&this._pollGamepads(e),this._customDevices.length>0&&this._customDevices.forEach((t=>t.update(e))),this._updateLastInteracted(),this._devices}_updateLastInteracted(){if(0===this._devices.length)return;let e;if(1===this._devices.length)e=this._devices[0];else for(const t of this._devices)(void 0===e||t.lastInteraction>e.lastInteraction)&&(e=t);this._lastInteractedDevice=e}_pollGamepads(e){if(!document.hasFocus())return this._gamepadDevices;if(void 0===navigator.getGamepads)return this._gamepadDevices;for(const t of navigator.getGamepads())if(null!=t)if(this._gamepadDeviceMap.has(t.index)){this._gamepadDeviceMap.get(t.index).update(t,e)}else{const i=new GamepadDevice(t);this.add(i),i.update(t,e)}return this._gamepadDevices}_removeGamepad(e){const t=this._gamepadDeviceMap.get(e);if(!t)return;const i=this._gamepadDevices.indexOf(t);-1!==i&&this._gamepadDevices.splice(i,1),this.remove(t),this._gamepadDeviceMap.delete(e)}}InputDeviceManager.global=new InputDeviceManager;const f=InputDeviceManager.global;function getAllNavigatables(e,t=[]){var i;for(const s of null!==(i=e.children)&&void 0!==i?i:[])s.isNavigatable?t.push(s):getAllNavigatables(s,t);return t}function getFirstNavigatable(e,t,i,{minimumDistance:s=0}={}){return function chooseFirstNavigatableInDirection(e,t,i,s=0){var o,n,a,r,d,c,u,l,h;const g=e.filter((e=>e.isNavigatable&&null!=e.parent&&isVisible(e))),p=g.find((e=>e===t));if(void 0===p)return g.sort(((e,t)=>t.navigationPriority-e.navigationPriority)),g[0];if(void 0===i&&p)return p;const m=null!=p?p:g[Math.floor(Math.random()*g.length)];if(void 0===p)return null!==(o=e[0])&&void 0!==o?o:m;const v=p.getGlobalPosition(),f=p.getBounds(),y={x:v.x+f.left+f.width/2,y:v.y+f.top+f.height/2},b=g.filter((e=>e!==p)).map((e=>{const t=e.getGlobalPosition(),i=e.getBounds(),s={x:t.x+i.left+i.width/2,y:t.y+i.top+i.height/2};return{element:e,bounds:i,center:s,xDistSqrd:weightedDistSquared(s,y,1,3),yDistSqrd:weightedDistSquared(s,y,3,1)}}));switch(i){case"navigate.up":return null!==(a=null===(n=b.filter((e=>e.center.ye.yDistSqrd-t.yDistSqrd))[0])||void 0===n?void 0:n.element)&&void 0!==a?a:m;case"navigate.left":return null!==(d=null===(r=b.filter((e=>e.center.xe.xDistSqrd-t.xDistSqrd))[0])||void 0===r?void 0:r.element)&&void 0!==d?d:m;case"navigate.right":return null!==(u=null===(c=b.filter((e=>e.center.x>y.x+s)).sort(((e,t)=>e.xDistSqrd-t.xDistSqrd))[0])||void 0===c?void 0:c.element)&&void 0!==u?u:m;case"navigate.down":return null!==(h=null===(l=b.filter((e=>e.center.y>y.y+s)).sort(((e,t)=>e.yDistSqrd-t.yDistSqrd))[0])||void 0===l?void 0:l.element)&&void 0!==h?h:m;default:return p}}(getAllNavigatables(e),t,i,s)}function isChildOf(e,t){for(;null!=e;){if(e===t)return!0;e=e.parent}return!1}function weightedDistSquared(e,t,i,s){const o=t.x-e.x,n=t.y-e.y;return o*o*i+n*n*s}function isVisible(e){for(;null!=e;){if(!e.visible)return!1;e=e.parent}return!0}const y=["navigate.left","navigate.right","navigate.up","navigate.down","navigate.back","navigate.trigger"];class NavigationManager{constructor(){this.options={useFallbackHoverEffect:!0,minimumDirectionDistance:10},this.enabled=!1,this._responders=[]}get focusTarget(){var e,t;return null!==(t=null===(e=this.responders.find((e=>null!=e.focusTarget&&isVisible(e.focusTarget))))||void 0===e?void 0:e.focusTarget)&&void 0!==t?t:this._rootFocused}set focusTarget(e){const t=this.focusTarget;if(t===e)return;const i=this.getResponderStage();i&&(!e||e.isNavigatable&&isChildOf(e,i))&&(t&&this._emitBlur(t),e&&this._emitFocus(e),this.firstResponder?this.firstResponder.focusTarget=e:this._rootFocused=e)}get firstResponder(){return this._responders[0]}get responders(){return this._responders}configureWithRoot(e){null==this._root&&f.onBind(y,(e=>this._propagate(e))),this._root=e,this.enabled=!0}popResponder(){var e,t,i,s,o;const n=this.focusTarget,a=this._responders.shift();a.focusTarget=void 0;const r=this.focusTarget;return null===(e=null==a?void 0:a.resignedAsFirstResponder)||void 0===e||e.call(a),this._invalidateFocusedIfNeeded(),this.firstResponder&&(null===(i=(t=this.firstResponder).becameFirstResponder)||void 0===i||i.call(t)),n!==r&&(null!==(o=null===(s=this.firstResponder)||void 0===s?void 0:s.autoFocus)&&void 0!==o?o:void 0===r)&&this.autoFocus(),a}pushResponder(e){var t,i,s;const o=e;if(this._responders.includes(o))throw new Error("Responder already in stack.");const n=this.firstResponder;this._responders.unshift(o),null===(t=null==n?void 0:n.resignedAsFirstResponder)||void 0===t||t.call(n),this._invalidateFocusedIfNeeded(),null===(i=o.becameFirstResponder)||void 0===i||i.call(o),(null===(s=o.autoFocus)||void 0===s||s)&&this.autoFocus()}autoFocus(){if(!b.enabled)return;const e=this.getResponderStage();if(!e)return;const t=getFirstNavigatable(e);void 0!==t?t!==this.focusTarget&&(this.focusTarget=t):console.debug("navigation: no navigatable containers found")}getResponderStage(){var e;return null!==(e=this.responders.find(isContainer))&&void 0!==e?e:this._root}_propagate({device:e,name:t}){var i;if(this.enabled){for(const s of this._responders)if(null===(i=s.handledNavigationIntent)||void 0===i?void 0:i.call(s,t,e))return;if(null==this._root)throw this.enabled=!1,new Error("Navigation requires root responder to be configured");{const e=this.getResponderStage();this._handleGlobalIntent(e,t)}}}_handleGlobalIntent(e,t){var i;this._invalidateFocusedIfNeeded(e);const s=this.focusTarget;if(void 0===s)return void this.autoFocus();if("navigate.back"===t)return this._emitBlur(s),void(this.focusTarget=void 0);if("navigate.trigger"===t)return void this._emitTrigger(s);const o=null!==(i=getFirstNavigatable(e,s,t,{minimumDistance:this.options.minimumDirectionDistance}))&&void 0!==i?i:s;o!==s&&(this.focusTarget=o)}_emitBlur(e){const t=e.eventNames();t.includes("pointerout")?e.emit("pointerout"):t.includes("mouseout")?e.emit("mouseout"):this.options.useFallbackHoverEffect&&(e.alpha=1),e.emit("deviceout")}_emitFocus(e){const t=e.eventNames();t.includes("pointerover")?e.emit("pointerover"):t.includes("mouseover")?e.emit("mouseover"):this.options.useFallbackHoverEffect&&(e.alpha=.5),e.emit("deviceover")}_emitTrigger(e){const t=e.eventNames();t.includes("pointerdown")?e.emit("pointerdown"):t.includes("mousedown")?e.emit("mousedown"):this.options.useFallbackHoverEffect&&(e.alpha=.75),e.emit("devicedown")}_invalidateFocusedIfNeeded(e=this.getResponderStage()){if(!e)return;const t=this.focusTarget;t&&!isChildOf(t,e)&&(this._emitBlur(t),this.focusTarget=void 0)}}function isContainer(e){return"children"in e}NavigationManager.global=new NavigationManager;const b=NavigationManager.global;let K=!1;exports.Button=n,exports.GamepadDevice=GamepadDevice,exports.InputDevice=f,exports.KeyCode=d,exports.KeyboardDevice=KeyboardDevice,exports.UINavigation=b,exports.getAllNavigatables=getAllNavigatables,exports.getFirstNavigatable=getFirstNavigatable,exports.isChildOf=isChildOf,exports.isVisible=isVisible,exports.navigationIntents=y,exports.registerPixiJSNavigationMixin=function registerPixiJSNavigationMixin(e){if(K)return;K=!0;const t=e.prototype;t.navigationPriority=0,t.navigationMode="auto",Object.defineProperty(t,"isNavigatable",{get:function(){if("target"===this.navigationMode)return!0;if("none"===this.navigationMode)return!1;const e=this.eventNames();return e.includes("pointerdown")||e.includes("mousedown")},configurable:!0,enumerable:!1})}; //# sourceMappingURL=index.cjs.map diff --git a/dist/index.cjs.map b/dist/index.cjs.map index 6c2b75e..3d73837 100644 --- a/dist/index.cjs.map +++ b/dist/index.cjs.map @@ -1 +1 @@ -{"version":3,"file":"index.cjs","sources":["../src/lib/devices/gamepads/buttons.ts","../src/lib/navigation/Navigatable.ts","../src/lib/navigation/Navigation.ts","../src/lib/utils/throttle.ts","../src/lib/utils/events.ts","../src/lib/devices/GamepadDevice.ts","../src/lib/devices/gamepads/layouts.ts","../src/lib/devices/keyboard/keys.ts","../node_modules/tslib/tslib.es6.js","../src/lib/devices/keyboard/layouts.ts","../src/lib/navigation/NavigationIntent.ts","../src/lib/devices/KeyboardDevice.ts","../src/lib/InputDevice.ts","../src/lib/utils/detectors.ts","../src/Container.mixin.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,"/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n function next() {\r\n while (env.stack.length) {\r\n var rec = env.stack.pop();\r\n try {\r\n var result = rec.dispose && rec.dispose.call(rec.value);\r\n if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n};\r\n",null,null,null,null,null,null],"names":["Axis","Button","A","B","X","Y","LeftShoulder","RightShoulder","LeftTrigger","RightTrigger","Back","Start","LeftStick","RightStick","DPadUp","DPadDown","DPadLeft","DPadRight","ButtonCode","getAllNavigatables","target","navigatables","child","children","isNavigatable","push","getFirstNavigatable","root","currentFocus","nearestDirection","minimumDistance","chooseFirstNavigatableInDirection","elements","filter","el","parent","isVisible","visible","focusedElement","find","undefined","sort","a","b","navigationPriority","fallbackElement","Math","floor","random","length","_a","focusedBounds","getBounds","focusedCenter","x","left","width","y","top","height","otherElements","map","bounds","center","element","distSqrd","squaredDist","_c","_b","_e","_d","_g","_f","_j","_h","isChildOf","dx","dy","NavigationManager","constructor","this","options","enabled","useFallbackHoverEffect","_responderStack","firstResponder","responders","commit","intent","device","_propagateIntent","popResponder","responder","shift","resignedAsFirstResponder","_clearFocusIfNeeded","becameFirstResponder","autoFocus","pushResponder","includes","Error","previousResponder","unshift","call","responderStage","isContainer","stage","navigatable","_focused","_emitBlur","_emitFocus","console","debug","handledNavigationIntent","warn","_handleGlobalIntent","_emitTrigger","nextTarget","eventNames","emit","navigationMode","alpha","global","Navigation","_cooldowns","Map","throttle","id","cooldownMs","now","Date","get","set","EventEmitter","_listeners","hasListener","e","payload","forEach","fn","on","event","off","l","GamepadDevice","pressedBind","name","binds","pressedAny","btns","i","button","pressedAll","listener","_emitter","onBind","_bindEmitter","offBind","playVibration","duration","weakMagnitude","strongMagnitude","vibrationType","rightTrigger","leftTrigger","startDelay","vibration","source","vibrationActuator","intensity","playEffect","update","updatePresses","clear","_axisIntents","_btnPrevState","type","meta","lastInteraction","performance","JSON","parse","stringify","defaultOptions","leftJoystick","rightJoystick","Object","keys","reduce","obj","key","Array","leftShoulder","rightShoulder","index","layout","detectLayout","gamepad","toLowerCase","test","_throttleIdLeftStickX","_throttleIdLeftStickY","buttonCount","remapNintendoMode","buttons","pressed","isPressed","buttonCode","setTimeout","entries","navigation","tdz","triggerDeadzone","_scale","value","jdz","joystickDeadzone","axes","jnav","joystick","abs","commitSensitivity","xIntent","cooldownDuration","repeatCooldownMs","firstRepeatCooldownMs","yIntent","range","scaled","sign","KeyCode","AltLeft","AltRight","ArrowDown","ArrowLeft","ArrowRight","ArrowUp","Backquote","Backslash","Backspace","BracketLeft","BracketRight","CapsLock","Comma","ContextMenu","ControlLeft","ControlRight","Delete","Digit0","Digit1","Digit2","Digit3","Digit4","Digit5","Digit6","Digit7","Digit8","Digit9","End","Enter","Equal","Escape","F1","F10","F11","F12","F13","F14","F15","F16","F17","F18","F19","F2","F20","F21","F22","F23","F24","F25","F26","F27","F28","F29","F3","F30","F31","F32","F4","F5","F6","F7","F8","F9","Home","IntlBackslash","IntlRo","IntlYen","KeyA","KeyB","KeyC","KeyD","KeyE","KeyF","KeyG","KeyH","KeyI","KeyJ","KeyK","KeyL","KeyM","KeyN","KeyO","KeyP","KeyQ","KeyR","KeyS","KeyT","KeyU","KeyV","KeyW","KeyX","KeyY","KeyZ","Lang1","Lang2","MediaTrackNext","MediaTrackPrevious","MetaLeft","MetaRight","Minus","NumLock","Numpad0","Numpad1","Numpad2","Numpad3","Numpad4","Numpad5","Numpad6","Numpad7","Numpad8","Numpad9","NumpadAdd","NumpadComma","NumpadDecimal","NumpadDivide","NumpadMultiply","NumpadSubtract","OSLeft","Pause","Period","Quote","ScrollLock","Semicolon","ShiftLeft","ShiftRight","Slash","Space","Tab","VolumeDown","VolumeMute","VolumeUp","WakeUp","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","result","done","adopt","then","apply","_navigatorLayoutMap","_keyLabels","SuppressedError","MACRO_AZERTY","MACRO_JCUKEN","MACRO_QWERTZ","JCUKEN_REGEX","xxERTx_REGEX","inferKeyboardLayoutFromLang","lang","getLang","n","navigator","languages","userLanguage","language","browserLanguage","tag","macro","split","startsWith","_possibleLayouts","Set","getLayoutKeyLabel","DEFAULT_LABELS","getMetaKeyLabel","AZERTY","JCUKEN","QWERTY","QWERTZ","platform","userAgent","REPEATABLE_NAV_INTENTS","KeyboardDevice","detectLayoutOnKeypress","detected","_deferredKeydown","_layout","_layoutSource","requestKeyboardLayout","keyboard","getLayoutMap","layoutMap","q","z","layoutSource","_configureEventListeners","getKeyLabel","getNavigatorKeyLabel","_toLocaleTitleCase","input","word","charAt","toLocaleUpperCase","slice","join","_processDeferredKeydownEvent","k","d","window","addEventListener","code","passive","capture","keyCode","repeat","detectKeyboardLayoutFromKeydown","delete","size","keyLabel","InputDeviceManager","isMobile","check","vendor","substr","isTouchCapable","maxTouchPoints","requireFocus","clearInputInBackground","_devices","_gamepadDevices","_gamepadDeviceMap","_customDevices","_hasFocus","add","once","_pollGamepads","_removeGamepad","devices","gamepads","custom","lastInteractedDevice","_lastInteractedDevice","emitBind","indexOf","remove","customIndex","splice","devicesIndex","document","hasFocus","_updateLastInteracted","last","getGamepads","has","gamepadIndex","gamepadsIndex","InputDevice","registerPixiJSInputDeviceMixin","container","prototype","defineProperty","isInteractive","onEvents","configurable","enumerable"],"mappings":"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","x_google_ignoreList":[8]} \ No newline at end of file +{"version":3,"file":"index.cjs","sources":["../src/lib/devices/gamepads/buttons.ts","../src/lib/utils/throttle.ts","../src/lib/utils/events.ts","../src/lib/devices/gamepads/GamepadDevice.ts","../src/lib/devices/gamepads/layouts.ts","../src/lib/devices/keyboard/keys.ts","../node_modules/tslib/tslib.es6.js","../src/lib/devices/keyboard/layouts.ts","../src/lib/devices/keyboard/KeyboardDevice.ts","../src/lib/InputDevice.ts","../src/lib/utils/detectors.ts","../src/lib/navigation/Navigatable.ts","../src/lib/navigation/NavigationIntent.ts","../src/lib/navigation/UINavigation.ts","../src/Container.mixin.ts"],"sourcesContent":[null,null,null,null,null,null,"/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n function next() {\r\n while (env.stack.length) {\r\n var rec = env.stack.pop();\r\n try {\r\n var result = rec.dispose && rec.dispose.call(rec.value);\r\n if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n};\r\n",null,null,null,null,null,null,null,null],"names":["Axis","AxisCode","Button","A","B","X","Y","LeftShoulder","RightShoulder","LeftTrigger","RightTrigger","Back","Start","LeftStickClick","RightStickClick","DPadUp","DPadDown","DPadLeft","DPadRight","ButtonCode","_cooldowns","Map","throttle","id","cooldownMs","now","Date","_a","get","undefined","set","EventEmitter","constructor","this","_listeners","hasListener","e","emit","payload","forEach","fn","on","event","push","off","filter","l","_b","length","GamepadDevice","configureDefaultBinds","binds","defaultOptions","Object","assign","pressedBind","name","options","pressedAny","btns","i","button","pressedAll","configureBinds","listener","_emitter","onBind","_bindEmitter","offBind","playVibration","duration","weakMagnitude","strongMagnitude","vibrationType","rightTrigger","leftTrigger","startDelay","vibration","enabled","source","vibrationActuator","intensity","playEffect","update","updatePresses","clear","reduce","obj","key","type","meta","lastInteraction","performance","JSON","parse","stringify","leftJoystick","x","y","rightJoystick","leftShoulder","rightShoulder","index","layout","detectLayout","gamepad","toLowerCase","test","joy","joystick","a","value","_scale","axes","deadzone","axisCode","Math","abs","threshold","throttleMs","autoRepeatDelayMs","setTimeout","device","axis","entries","values","includes","b","nintendoRemapMode","buttonCode","buttons","pressed","isPressed","_d","_c","tdz","trigger","jdz","range","scaled","sign","KeyCode","AltLeft","AltRight","ArrowDown","ArrowLeft","ArrowRight","ArrowUp","Backquote","Backslash","Backspace","BracketLeft","BracketRight","CapsLock","Comma","ContextMenu","ControlLeft","ControlRight","Delete","Digit0","Digit1","Digit2","Digit3","Digit4","Digit5","Digit6","Digit7","Digit8","Digit9","End","Enter","Equal","Escape","F1","F10","F11","F12","F13","F14","F15","F16","F17","F18","F19","F2","F20","F21","F22","F23","F24","F25","F26","F27","F28","F29","F3","F30","F31","F32","F4","F5","F6","F7","F8","F9","Home","IntlBackslash","IntlRo","IntlYen","KeyA","KeyB","KeyC","KeyD","KeyE","KeyF","KeyG","KeyH","KeyI","KeyJ","KeyK","KeyL","KeyM","KeyN","KeyO","KeyP","KeyQ","KeyR","KeyS","KeyT","KeyU","KeyV","KeyW","KeyX","KeyY","KeyZ","Lang1","Lang2","MediaTrackNext","MediaTrackPrevious","MetaLeft","MetaRight","Minus","NumLock","Numpad0","Numpad1","Numpad2","Numpad3","Numpad4","Numpad5","Numpad6","Numpad7","Numpad8","Numpad9","NumpadAdd","NumpadComma","NumpadDecimal","NumpadDivide","NumpadMultiply","NumpadSubtract","OSLeft","Pause","Period","Quote","ScrollLock","Semicolon","ShiftLeft","ShiftRight","Slash","Space","Tab","VolumeDown","VolumeMute","VolumeUp","WakeUp","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","result","done","adopt","then","apply","_navigatorLayoutMap","_keyLabels","SuppressedError","MACRO_AZERTY","MACRO_JCUKEN","MACRO_QWERTZ","JCUKEN_REGEX","xxERTx_REGEX","inferKeyboardLayoutFromLang","lang","getLang","n","navigator","languages","userLanguage","language","browserLanguage","tag","macro","split","startsWith","_possibleLayouts","Set","getLayoutKeyLabel","DEFAULT_LABELS","getMetaKeyLabel","AZERTY","JCUKEN","QWERTY","QWERTZ","platform","userAgent","KeyboardDevice","detectLayoutOnKeypress","detected","repeatableBinds","keys","_deferredKeydown","_layout","_layoutSource","requestKeyboardLayout","keyboard","getLayoutMap","layoutMap","q","z","layoutSource","_configureEventListeners","getKeyLabel","getNavigatorKeyLabel","_toLocaleTitleCase","input","map","word","charAt","toLocaleUpperCase","slice","join","_processDeferredKeydownEvent","k","d","window","addEventListener","code","passive","capture","keyCode","repeat","detectKeyboardLayoutFromKeydown","delete","size","keyLabel","global","InputDeviceManager","isMobile","check","vendor","substr","isTouchCapable","maxTouchPoints","requireFocus","clearInputInBackground","_devices","_gamepadDevices","_gamepadDeviceMap","_customDevices","_hasFocus","add","once","_pollGamepads","_removeGamepad","devices","gamepads","custom","lastInteractedDevice","_lastInteractedDevice","Array","isArray","emitBind","indexOf","remove","customIndex","splice","devicesIndex","document","hasFocus","_updateLastInteracted","last","getGamepads","has","gamepadIndex","gamepadsIndex","InputDevice","getAllNavigatables","target","navigatables","child","children","isNavigatable","getFirstNavigatable","root","currentFocus","nearestDirection","minimumDistance","chooseFirstNavigatableInDirection","elements","el","parent","isVisible","focusedElement","find","sort","navigationPriority","fallbackElement","floor","random","focusedGlobalPos","getGlobalPosition","focusedBounds","getBounds","focusedCenter","left","width","top","height","otherElements","globalPos","bounds","center","element","xDistSqrd","weightedDistSquared","yDistSqrd","_e","_g","_f","_j","_h","isChildOf","xw","yw","dx","dy","visible","navigationIntents","NavigationManager","useFallbackHoverEffect","minimumDirectionDistance","_responders","focusTarget","responders","res","_rootFocused","previous","responderStage","getResponderStage","_emitBlur","_emitFocus","firstResponder","configureWithRoot","stage","_root","_propagate","popResponder","previousFocused","responder","shift","nextFocused","resignedAsFirstResponder","_invalidateFocusedIfNeeded","becameFirstResponder","autoFocus","pushResponder","Error","previousResponder","unshift","call","UINavigation","navigatable","console","debug","isContainer","handledNavigationIntent","_handleGlobalIntent","intent","_emitTrigger","nextTarget","eventNames","alpha","_registered","registerPixiJSNavigationMixin","container","prototype","navigationMode","defineProperty","onEvents","configurable","enumerable"],"mappings":"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","x_google_ignoreList":[6]} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index c2b77f8..0ed3825 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -88,10 +88,10 @@ declare class InputDeviceManager { on(event: K, listener: (event: InputDeviceEvent[K]) => void): this; /** Remove an event listener (or all if none provided) */ off(event: K, listener: (event: InputDeviceEvent[K]) => void): this; - /** Add a named bind event listener (or all if none provided). */ - onBind(name: string, listener: (event: NamedBindEvent) => void): this; + /** Adds a named bind event listener. */ + onBind(name: N | readonly N[], listener: (event: NamedBindEvent) => void): this; /** Remove a named bind event listener (or all if none provided). */ - offBind(name: string, listener?: (event: NamedBindEvent) => void): this; + offBind(name: string | string[], listener?: (event: NamedBindEvent) => void): this; /** Report a named bind event (from a CustomDevice). */ emitBind(e: NamedBindEvent): void; /** Add a custom device. */ @@ -111,38 +111,46 @@ declare class InputDeviceManager { } declare class NavigationManager { static global: NavigationManager; - /** - * Set the stage root to automatically handle global - * navigation intents. - */ - stage?: Container; options: { - /** - * When set to false, navigation will be disabled globally. - */ - enabled: boolean; /** * When enabled, if no "pointover"/"mouseover" listeners * exist, a default alpha effect will be used instead. */ useFallbackHoverEffect: boolean; + /** + * Minimum distance in a direction that a container has to be to + * appear as selectable in that direction. + */ + minimumDirectionDistance: number; }; - private _focused?; - private _responderStack; + /** + * Whether navigation is enabled globally. + */ + enabled: boolean; + private _responders; + private _root?; + private _rootFocused?; private constructor(); /** - * Active global interaction target + * Current navigation target. + */ + get focusTarget(): Container | undefined; + set focusTarget(target: Container | undefined); + /** + * Active global interaction target. */ get firstResponder(): NavigationResponder | undefined; /** - * Stack of global interaction targets + * Stack of global interaction targets. */ get responders(): readonly NavigationResponder[]; /** - * Emit interaction intent to the first responder, - * or the global responder if none. + * Initialize navigation and set the root navigation responder. + * + * @param stage - Root navigation responder container, where navigatable + * containers can live. */ - commit(intent: NavigationIntent, device: Device): void; + configureWithRoot(stage: Container): void; /** * Remove the top-most global interaction target */ @@ -150,18 +158,38 @@ declare class NavigationManager { /** * Set the new top-most global interaction target. */ - pushResponder(responder: NavigationResponder): void; + pushResponder(responder: Container | NavigationResponder): void; /** * Focus on the first navigatable element. */ autoFocus(): void; - private _propagateIntent; + /** + * Current root container for navigation. + */ + getResponderStage(): Container; + private _propagate; private _handleGlobalIntent; private _emitBlur; private _emitFocus; private _emitTrigger; - private _clearFocusIfNeeded; + private _invalidateFocusedIfNeeded; } +declare const Axis: { + readonly LeftStickX: 0; + readonly LeftStickY: 1; + readonly RightStickX: 2; + readonly RightStickY: 3; +}; +declare const AxisCode: readonly [ + "LeftStickLeft", + "LeftStickRight", + "LeftStickUp", + "LeftStickDown", + "RightStickLeft", + "RightStickRight", + "RightStickUp", + "RightStickDown" +]; declare const ButtonCode: readonly [ "A", "B", @@ -173,8 +201,8 @@ declare const ButtonCode: readonly [ "RightTrigger", "Back", "Start", - "LeftStick", - "RightStick", + "LStick", + "RStick", "DPadUp", "DPadDown", "DPadLeft", @@ -191,6 +219,8 @@ declare const ButtonCode: readonly [ */ export declare class GamepadDevice { source: Gamepad; + /** Set named binds for newly connected gamepads */ + static configureDefaultBinds(binds: Partial>): void; static defaultOptions: { /** * When set to `"physical"` _(default)_, ABXY refer to the equivalent @@ -202,7 +232,7 @@ export declare class GamepadDevice { * When set to `"none"`, ABXY refer to the unmapped buttons in the 0, 1, * 2, and 3 positions respectively. */ - remapNintendoMode: RemapNintendoMode; + nintendoRemapMode: NintendoRemapMode; /** * Create named binds of buttons. * @@ -211,6 +241,7 @@ export declare class GamepadDevice { * @example * // set by names * Gamepad.defaultOptions.binds = { + * ...Gamepad.defaultOptions.binds, * jump: [ "A" ], * crouch: [ "X" ], * } @@ -221,36 +252,47 @@ export declare class GamepadDevice { * // ... * } */ - binds: Partial>; - navigation: { - enabled: boolean; - binds: Partial>; - joystick: { - commitSensitivity: number; - repeatCooldownMs: number; - firstRepeatCooldownMs: number; - }; + binds: Partial>; + joystick: { + /** + * The range of movement in a joystick recognized as input, to + * prevent unintended movements caused by imprecision or wear. + * + * @default [ 0, 1 ] + */ + deadzone: [ + number, + number + ]; + /** + * The threshold joysticks must reach to emit navigation and bind events. + * + * @default 0.25 + */ + threshold: number; + /** + * The amount of time (in milliseconds) between emitting axis events in a + * given direction, given as [first, subsequent]. + * + * @default [ delay: 400, repeat: 80 ] + */ + autoRepeatDelayMs: [ + number, + number + ]; + }; + trigger: { + /** + * The range of movement in a trigger recognized as input, to + * revent unintended movements caused by imprecision or wear. + * + * @default [ 0, 1 ] + */ + deadzone: [ + number, + number + ]; }; - /** - * The range of movement in a joystick recognized as input, to - * prevent unintended movements caused by imprecision or wear. - * - * @default [ 0, 1 ] - */ - joystickDeadzone: [ - number, - number - ]; - /** - * The range of movement in a trigger recognized as input, to - * revent unintended movements caused by imprecision or wear. - * - * @default [ 0, 1 ] - */ - triggerDeadzone: [ - number, - number - ]; vibration: { enabled: boolean; intensity: number; @@ -284,11 +326,7 @@ export declare class GamepadDevice { y: number; }; /** Accessors for buttons */ - button: Record; - private _btnPrevState; - private _axisIntents; - private readonly _throttleIdLeftStickX; - private readonly _throttleIdLeftStickY; + button: Record; private readonly _emitter; private readonly _bindEmitter; /** A scalar 0.0 to 1.0 representing the left trigger value */ @@ -302,17 +340,19 @@ export declare class GamepadDevice { /** @returns true if any button from the named bind is pressed. */ pressedBind(name: string): boolean; /** @returns true if any of the given buttons are pressed. */ - pressedAny(btns: ButtonCode[]): boolean; + pressedAny(btns: BindableCode[]): boolean; /** @returns true if all of the given buttons are pressed. */ - pressedAll(btns: ButtonCode[]): boolean; + pressedAll(btns: BindableCode[]): boolean; + /** Set named binds for this gamepad */ + configureBinds(binds: Partial>): void; /** Add an event listener */ on(event: K, listener: (event: GamepadDeviceEvent[K]) => void): this; /** Remove an event listener (or all if none provided). */ off(event: K, listener?: (event: GamepadDeviceEvent[K]) => void): this; /** Add a named bind event listener (or all if none provided). */ - onBind(name: string, listener: (event: GamepadNamedBindButtonPressEvent) => void): this; + onBind(name: string, listener: (event: GamepadNamedBindEvent) => void): this; /** Remove a named bind event listener (or all if none provided). */ - offBind(name: string, listener?: (event: GamepadNamedBindButtonPressEvent) => void): this; + offBind(name: string, listener?: (event: GamepadNamedBindEvent) => void): this; /** * Play a vibration effect (if supported). * @@ -368,10 +408,13 @@ export declare class KeyboardDevice { * } */ binds: Partial>; - navigation: { - enabled: boolean; - binds: NavigationBinds; - }; + /** + * These are the binds that are allowed to repeat when a key + * is held down. + * + * @default ["navigate.down", "navigate.left", "navigate.right", "navigate.up"] + */ + repeatableBinds: string[]; }; /** Accessors for keys */ key: Record; @@ -409,10 +452,12 @@ export declare class KeyboardDevice { pressedAny(keys: KeyCode[]): boolean; /** @returns true if all of the given keys are pressed. */ pressedAll(keys: KeyCode[]): boolean; + /** Set custom binds */ + configureBinds(binds: Partial>): void; /** Add an event listener. */ on(event: K, listener: (event: KeyboardDeviceEvent[K]) => void): this; /** Remove an event listener (or all if none provided). */ - off(event: K, listener: (event: KeyboardDeviceEvent[K]) => void): this; + off(event: K, listener?: (event: KeyboardDeviceEvent[K]) => void): this; /** Add a named bind event listener (or all if none provided). */ onBind(name: string, listener: (event: KeyboardDeviceNamedBindKeydownEvent) => void): this; /** Remove a named bind event listener (or all if none provided). */ @@ -464,9 +509,9 @@ export declare const Button: { /** Start Button (Xbox: "Start", PlayStation: "Options", Nintendo: "Plus") */ readonly Start: 9; /** Left Stick Press (Xbox / PlayStation: "LS", Nintendo: "L3") */ - readonly LeftStick: 10; + readonly LeftStickClick: 10; /** Right Stick Press (Xbox / PlayStation: "RS", Nintendo: "R3") */ - readonly RightStick: 11; + readonly RightStickClick: 11; /** D-Pad Up */ readonly DPadUp: 12; /** D-Pad Down */ @@ -616,8 +661,15 @@ export declare const KeyCode: { * * Set stage to enable the global responder behaviors. */ -export declare const Navigation: NavigationManager; -export declare const REPEATABLE_NAV_INTENTS: readonly NavigationIntent[]; +export declare const UINavigation: NavigationManager; +export declare const navigationIntents: readonly [ + "navigate.left", + "navigate.right", + "navigate.up", + "navigate.down", + "navigate.back", + "navigate.trigger" +]; /** * @returns all navigatable containers in some container */ @@ -629,12 +681,13 @@ export declare function getFirstNavigatable(root: Container, currentFocus?: Cont minimumDistance?: number; }): NavigatableContainer | undefined; export declare function isChildOf(child: Container, root: Container): boolean; +export declare function isVisible(target: Container): boolean; /** * Register the mixin for PIXI.Container. * * @param container A reference to `PIXI.Container`. */ -export declare function registerPixiJSInputDeviceMixin(container: any): void; +export declare function registerPixiJSNavigationMixin(container: any): void; export interface CustomDevice { readonly type: "custom"; readonly id: string; @@ -651,14 +704,16 @@ export interface CustomDevice { */ clear?(): void; } +export interface GamepadAxisEvent { + device: GamepadDevice; + axis: Axis; + axisCode: AxisCode; +} export interface GamepadButtonPressEvent { device: GamepadDevice; button: Button; buttonCode: ButtonCode; } -export interface GamepadNamedBindButtonPressEvent extends GamepadButtonPressEvent { - name: string; -} export interface InputDeviceEvent { deviceadded: { device: Device; @@ -681,6 +736,7 @@ export interface KeyboardDeviceLayoutUpdatedEvent { } export interface KeyboardDeviceNamedBindKeydownEvent extends KeyboardDeviceKeydownEvent { name: string; + repeat: boolean; } /** * A target that responds to navigation on the stack. @@ -693,6 +749,10 @@ export interface NavigationResponder { * @default true */ autoFocus?: boolean; + /** + * Currently focused container. + */ + focusTarget?: Container; /** * Called when received a navigation intent. The target should handle, and * respond with a boolean indicating whether or not the intent was handled. @@ -715,16 +775,35 @@ export interface NavigationResponder { */ resignedAsFirstResponder?(): void; } +export type Axis = (typeof Axis)[keyof typeof Axis]; +export type AxisCode = typeof AxisCode[number]; +/** + * Bindable codes for button and joystick events. + */ +export type BindableCode = ButtonCode | AxisCode; export type Button = (typeof Button)[keyof typeof Button]; export type ButtonCode = typeof ButtonCode[number]; export type Device = GamepadDevice | KeyboardDevice | CustomDevice; export type GamepadButtonDownEvent = (gamepad: GamepadDevice, button: Button) => void; export type GamepadDeviceEvent = { - bind: GamepadNamedBindButtonPressEvent; + bind: GamepadNamedBindEvent; } & { - [button in ButtonCode]: GamepadButtonPressEvent; + [axis in AxisCode]: GamepadAxisEvent; } & { - [button in Button]: GamepadButtonPressEvent; + [button in ButtonCode]: GamepadButtonPressEvent; +}; +export type GamepadNamedBindEvent = { + device: GamepadDevice; + name: string; + type: "button"; + button: Button; + buttonCode: ButtonCode; +} | { + device: GamepadDevice; + name: string; + type: "axis"; + axis: Axis; + axisCode: AxisCode; }; export type GamepadVibration = GamepadEffectParameters & { vibrationType?: GamepadHapticEffectType; @@ -738,22 +817,21 @@ export type KeyboardDeviceEvent = { }; export type KeyboardLayout = "QWERTY" | "AZERTY" | "JCUKEN" | "QWERTZ"; export type KeyboardLayoutSource = "browser" | "lang" | "keypress" | "manual"; -export type NamedBindEvent = { +export type NamedBindEvent = { device: Device; - name: string; + name: BindName; }; export type NavigatableContainer = Container; -export type NavigationBinds = Partial>; -export type NavigationDirection = "navigateLeft" | "navigateRight" | "navigateUp" | "navigateDown"; -export type NavigationIntent = "navigateBack" | "navigateDown" | "navigateLeft" | "navigateRight" | "navigateUp" | "trigger"; -export type NavigationTargetEvent = "focus" | "blur"; -export type RemapNintendoMode = "none" | "accurate" | "physical"; +export type NavigationDirection = "navigate.left" | "navigate.right" | "navigate.up" | "navigate.down"; +export type NavigationIntent = typeof navigationIntents[number]; +export type NavigationTargetEvent = "deviceover" | "devicedown" | "deviceout"; +export type NintendoRemapMode = "none" | "accurate" | "physical"; /** * Common gamepad platform layouts, which may indicate button layout. * * Note: Non-comprehensive list, covers the most brands only. */ -type GamepadLayout = "logitech" | "nintendo" | "playstation" | "steam" | "xbox" | "generic"; +type GamepadLayout = "logitech" | "nintendo" | "playstation" | "steam" | "xbox" | "standard"; export { GamepadLayout as GamepadPlatform, diff --git a/dist/index.mjs b/dist/index.mjs index 5431707..c6749b0 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -1,2 +1,2 @@ -const e=0,t=1,i=2,s=3,n={A:0,B:1,X:2,Y:3,LeftShoulder:4,RightShoulder:5,LeftTrigger:6,RightTrigger:7,Back:8,Start:9,LeftStick:10,RightStick:11,DPadUp:12,DPadDown:13,DPadLeft:14,DPadRight:15},o=["A","B","X","Y","LeftShoulder","RightShoulder","LeftTrigger","RightTrigger","Back","Start","LeftStick","RightStick","DPadUp","DPadDown","DPadLeft","DPadRight"];function getAllNavigatables(e,t=[]){for(const i of e.children)i.isNavigatable?t.push(i):getAllNavigatables(i,t);return t}function getFirstNavigatable(e,t,i,{minimumDistance:s=3}={}){return function chooseFirstNavigatableInDirection(e,t,i,{minimumDistance:s=3}={}){var n,o,a,r,d,c,u,l,h;const g=e.filter((e=>e.isNavigatable&&null!=e.parent&&function isVisible(e){for(;null!=e;){if(!e.visible)return!1;e=e.parent}return!0}(e))),p=g.find((e=>e===t));if(void 0===p)return g.sort(((e,t)=>t.navigationPriority-e.navigationPriority)),g[0];if(void 0===i&&p)return p;const m=null!=p?p:g[Math.floor(Math.random()*g.length)];if(void 0===p)return null!==(n=e[0])&&void 0!==n?n:m;const v=p.getBounds(),y={x:v.left+v.width/2,y:v.top+v.height/2},f=g.filter((e=>e!==p)).map((e=>{const t=e.getBounds(),i={x:t.left+t.width/2,y:t.top+t.height/2};return{element:e,bounds:t,center:i,distSqrd:squaredDist(i,y)}}));switch(i){case"navigateUp":return null!==(a=null===(o=f.filter((e=>e.center.ye.distSqrd-t.distSqrd))[0])||void 0===o?void 0:o.element)&&void 0!==a?a:m;case"navigateLeft":return null!==(d=null===(r=f.filter((e=>e.center.xe.distSqrd-t.distSqrd))[0])||void 0===r?void 0:r.element)&&void 0!==d?d:m;case"navigateRight":return null!==(u=null===(c=f.filter((e=>e.center.x>y.x+s)).sort(((e,t)=>e.distSqrd-t.distSqrd))[0])||void 0===c?void 0:c.element)&&void 0!==u?u:m;case"navigateDown":return null!==(h=null===(l=f.filter((e=>e.center.y>y.y+s)).sort(((e,t)=>e.distSqrd-t.distSqrd))[0])||void 0===l?void 0:l.element)&&void 0!==h?h:m;default:return p}}(getAllNavigatables(e),t,i,{minimumDistance:s})}function isChildOf(e,t){for(;null!=e;){if(e===t)return!0;e=e.parent}return!1}function squaredDist(e,t){const i=t.x-e.x,s=t.y-e.y;return i*i+s*s}class NavigationManager{constructor(){this.options={enabled:!0,useFallbackHoverEffect:!0},this._responderStack=[]}get firstResponder(){return this._responderStack[0]}get responders(){return this._responderStack}commit(e,t){this.options.enabled&&this._propagateIntent(e,t)}popResponder(){var e,t,i,s;const n=this._responderStack.shift();return null===(e=null==n?void 0:n.resignedAsFirstResponder)||void 0===e||e.call(n),this._clearFocusIfNeeded(),this.firstResponder&&(null===(i=(t=this.firstResponder).becameFirstResponder)||void 0===i||i.call(t),(null===(s=this.firstResponder.autoFocus)||void 0===s||s)&&this.autoFocus()),n}pushResponder(e){var t,i,s;if(this._responderStack.includes(e))throw new Error("Responder already in stack.");const n=this.firstResponder;this._responderStack.unshift(e),null===(t=null==n?void 0:n.resignedAsFirstResponder)||void 0===t||t.call(n),this._clearFocusIfNeeded(),null===(i=e.becameFirstResponder)||void 0===i||i.call(e),(null===(s=e.autoFocus)||void 0===s||s)&&this.autoFocus()}autoFocus(){var e;const t=null!==(e=this.responders.find(isContainer))&&void 0!==e?e:this.stage;if(!t)return;const i=getFirstNavigatable(t);void 0!==i?i!==this._focused&&(this._focused&&this._emitBlur(this._focused),this._emitFocus(i),this._focused=i):console.debug("navigation: no navigatable containers found")}_propagateIntent(e,t){var i,s;for(const s of this._responderStack)if(null===(i=s.handledNavigationIntent)||void 0===i?void 0:i.call(s,e,t))return;if(void 0===this.stage)console.warn("navigation: no stage root set");else{const t=null!==(s=this.responders.find(isContainer))&&void 0!==s?s:this.stage;this._handleGlobalIntent(t,e)}}_handleGlobalIntent(e,t){var i,s;if(void 0===this._focused)return void this.autoFocus();if("navigateBack"===t)return this._emitBlur(this._focused),void(this._focused=void 0);if("trigger"===t)return void this._emitTrigger(this._focused);const n=null!==(s=getFirstNavigatable(null!==(i=this.responders.find(isContainer))&&void 0!==i?i:this.stage,this._focused,t))&&void 0!==s?s:this._focused;n!==this._focused&&(this._emitBlur(this._focused),this._emitFocus(n),this._focused=n)}_emitBlur(e){const t=e.eventNames();t.includes("pointerout")?e.emit("pointerout"):t.includes("mouseout")?e.emit("mouseout"):"auto"===e.navigationMode&&this.options.useFallbackHoverEffect&&(e.alpha=1),e.emit("blur")}_emitFocus(e){const t=e.eventNames();t.includes("pointerover")?e.emit("pointerover"):t.includes("mouseover")?e.emit("mouseover"):"auto"===e.navigationMode&&this.options.useFallbackHoverEffect&&(e.alpha=.5),e.emit("focus")}_emitTrigger(e){const t=e.eventNames();t.includes("pointerdown")?e.emit("pointerdown"):t.includes("mousedown")?e.emit("mousedown"):"auto"===e.navigationMode&&this.options.useFallbackHoverEffect&&(e.alpha=.75),e.emit("trigger")}_clearFocusIfNeeded(){var e;const t=null!==(e=this.responders.find(isContainer))&&void 0!==e?e:this.stage;t&&this._focused&&!isChildOf(this._focused,t)&&(this._focused=void 0)}}function isContainer(e){return"children"in e}NavigationManager.global=new NavigationManager;const a=NavigationManager.global;let r=new Map;function throttle(e,t){var i;const s=Date.now();return(null!==(i=r.get(e))&&void 0!==i?i:0)>s||(r.set(e,s+t),!1)}class EventEmitter{constructor(){this._listeners={}}hasListener(e){return void 0!==this._listeners[e]}emit(e,t){var i;null===(i=this._listeners[e])||void 0===i||i.forEach((e=>e(t)))}on(e,t){var i;this._listeners[e]||(this._listeners[e]=[]),null===(i=this._listeners[e])||void 0===i||i.push(t)}off(e,t){var i,s;this._listeners[e]=void 0===t||null===(i=this._listeners[e])||void 0===i?void 0:i.filter((e=>e!==t)),0===(null===(s=this._listeners[e])||void 0===s?void 0:s.length)&&(this._listeners[e]=void 0)}}class GamepadDevice{pressedBind(e){return void 0!==this.options.binds[e]&&this.pressedAny(this.options.binds[e])}pressedAny(e){for(let t=0;t!1)),this._btnPrevState=this._btnPrevState.map((()=>!1))}constructor(e){this.source=e,this.type="gamepad",this.meta={},this.lastInteraction=performance.now(),this.options=JSON.parse(JSON.stringify(GamepadDevice.defaultOptions)),this.leftJoystick={x:0,y:0},this.rightJoystick={x:0,y:0},this.button=Object.keys(n).reduce(((e,t)=>(e[t]=!1,e)),{}),this._btnPrevState=new Array(16),this._axisIntents=new Array(2),this._emitter=new EventEmitter,this._bindEmitter=new EventEmitter,this.leftTrigger=0,this.rightTrigger=0,this.leftShoulder=0,this.rightShoulder=0,this.id="gamepad"+e.index,this.layout=function detectLayout(e){const t=(e.id||"").toLowerCase();return/(steam|28de)/.test(t)?"steam":/(logitech|046d|c216)/.test(t)?"logitech":/(nintendo|switch|joycon|057e)/.test(t)?"nintendo":/(dualshock|dualsense|sony|054c|0ce6|0810)/.test(t)?"playstation":/(xbox|xinput|045e|028e|0291|02a0|02a1|02ea|02ff)/.test(t)?"xbox":"generic"}(e),this._throttleIdLeftStickX=this.id+"-lsx",this._throttleIdLeftStickY=this.id+"-lsy"}updatePresses(r,d){var c,u,l,h,g,p,m;const v=this._btnPrevState.length;for(let e=0;ethis._emitter.emit(s,{device:this,button:t,buttonCode:s}))),Object.entries(this.options.binds).forEach((([e,i])=>{i.includes(s)&&setTimeout((()=>{const i={device:this,button:t,buttonCode:s,name:e};this._bindEmitter.emit(e,i),this._emitter.emit("bind",i)}))})),a.options.enabled&&this.options.navigation.enabled&&void 0!==this.options.navigation.binds[t]&&setTimeout((()=>a.commit(this.options.navigation.binds[t],this))))}const y=this.options.triggerDeadzone;this.leftTrigger=_scale(this.source.buttons[n.LeftTrigger].value,y),this.rightTrigger=_scale(this.source.buttons[n.RightTrigger].value,y),this.leftShoulder=_scale(this.source.buttons[n.LeftShoulder].value,y),this.rightShoulder=_scale(this.source.buttons[n.RightShoulder].value,y);const f=this.options.joystickDeadzone;this.leftJoystick.x=_scale(null!==(h=r.axes[e])&&void 0!==h?h:0,f),this.leftJoystick.y=_scale(null!==(g=r.axes[t])&&void 0!==g?g:0,f),this.rightJoystick.x=_scale(null!==(p=r.axes[i])&&void 0!==p?p:0,f),this.rightJoystick.y=_scale(null!==(m=r.axes[s])&&void 0!==m?m:0,f),0===this.leftJoystick.x&&0===this.leftJoystick.y&&0===this.rightJoystick.x&&0===this.rightJoystick.y||(this.lastInteraction=d);const b=this.options.navigation.joystick;if(Math.abs(this.leftJoystick.x)>=b.commitSensitivity){const t=this.leftJoystick.x<0?"navigateLeft":"navigateRight",i=this._axisIntents[e]?b.repeatCooldownMs:b.firstRepeatCooldownMs;this._axisIntents[e]=!0,this.options.navigation.enabled&&!throttle(this._throttleIdLeftStickX,i)&&setTimeout((()=>a.commit(t,this)))}else this._axisIntents[e]=!1;if(Math.abs(this.leftJoystick.y)>=b.commitSensitivity){const e=this.leftJoystick.y<0?"navigateUp":"navigateDown",i=this._axisIntents[t]?b.repeatCooldownMs:b.firstRepeatCooldownMs;this._axisIntents[t]=!0,this.options.navigation.enabled&&!throttle(this._throttleIdLeftStickY,i)&&setTimeout((()=>a.commit(e,this)))}else this._axisIntents[t]=!1}}function _scale(e,t){const i=(Math.abs(e)-t[0])/(t[1]-t[0]);return i>=0&&i<=1?Math.sign(e)*i:i>1?1*Math.sign(e):0}GamepadDevice.defaultOptions={remapNintendoMode:"physical",binds:{},navigation:{enabled:!0,binds:{[n.A]:"trigger",[n.B]:"navigateBack",[n.Back]:"navigateBack",[n.DPadDown]:"navigateDown",[n.DPadLeft]:"navigateLeft",[n.DPadRight]:"navigateRight",[n.DPadUp]:"navigateUp"},joystick:{commitSensitivity:.5,repeatCooldownMs:80,firstRepeatCooldownMs:400}},joystickDeadzone:[0,1],triggerDeadzone:[0,1],vibration:{enabled:!0,intensity:1}};const d={AltLeft:"AltLeft",AltRight:"AltRight",ArrowDown:"ArrowDown",ArrowLeft:"ArrowLeft",ArrowRight:"ArrowRight",ArrowUp:"ArrowUp",Backquote:"Backquote",Backslash:"Backslash",Backspace:"Backspace",BracketLeft:"BracketLeft",BracketRight:"BracketRight",CapsLock:"CapsLock",Comma:"Comma",ContextMenu:"ContextMenu",ControlLeft:"ControlLeft",ControlRight:"ControlRight",Delete:"Delete",Digit0:"Digit0",Digit1:"Digit1",Digit2:"Digit2",Digit3:"Digit3",Digit4:"Digit4",Digit5:"Digit5",Digit6:"Digit6",Digit7:"Digit7",Digit8:"Digit8",Digit9:"Digit9",End:"End",Enter:"Enter",Equal:"Equal",Escape:"Escape",F1:"F1",F10:"F10",F11:"F11",F12:"F12",F13:"F13",F14:"F14",F15:"F15",F16:"F16",F17:"F17",F18:"F18",F19:"F19",F2:"F2",F20:"F20",F21:"F21",F22:"F22",F23:"F23",F24:"F24",F25:"F25",F26:"F26",F27:"F27",F28:"F28",F29:"F29",F3:"F3",F30:"F30",F31:"F31",F32:"F32",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",Home:"Home",IntlBackslash:"IntlBackslash",IntlRo:"IntlRo",IntlYen:"IntlYen",KeyA:"KeyA",KeyB:"KeyB",KeyC:"KeyC",KeyD:"KeyD",KeyE:"KeyE",KeyF:"KeyF",KeyG:"KeyG",KeyH:"KeyH",KeyI:"KeyI",KeyJ:"KeyJ",KeyK:"KeyK",KeyL:"KeyL",KeyM:"KeyM",KeyN:"KeyN",KeyO:"KeyO",KeyP:"KeyP",KeyQ:"KeyQ",KeyR:"KeyR",KeyS:"KeyS",KeyT:"KeyT",KeyU:"KeyU",KeyV:"KeyV",KeyW:"KeyW",KeyX:"KeyX",KeyY:"KeyY",KeyZ:"KeyZ",Lang1:"Lang1",Lang2:"Lang2",MediaTrackNext:"MediaTrackNext",MediaTrackPrevious:"MediaTrackPrevious",MetaLeft:"MetaLeft",MetaRight:"MetaRight",Minus:"Minus",NumLock:"NumLock",Numpad0:"Numpad0",Numpad1:"Numpad1",Numpad2:"Numpad2",Numpad3:"Numpad3",Numpad4:"Numpad4",Numpad5:"Numpad5",Numpad6:"Numpad6",Numpad7:"Numpad7",Numpad8:"Numpad8",Numpad9:"Numpad9",NumpadAdd:"NumpadAdd",NumpadComma:"NumpadComma",NumpadDecimal:"NumpadDecimal",NumpadDivide:"NumpadDivide",NumpadMultiply:"NumpadMultiply",NumpadSubtract:"NumpadSubtract",OSLeft:"OSLeft",Pause:"Pause",Period:"Period",Quote:"Quote",ScrollLock:"ScrollLock",Semicolon:"Semicolon",ShiftLeft:"ShiftLeft",ShiftRight:"ShiftRight",Slash:"Slash",Space:"Space",Tab:"Tab",VolumeDown:"VolumeDown",VolumeMute:"VolumeMute",VolumeUp:"VolumeUp",WakeUp:"WakeUp"};function __awaiter(e,t,i,s){return new(i||(i=Promise))((function(n,o){function fulfilled(e){try{step(s.next(e))}catch(e){o(e)}}function rejected(e){try{step(s.throw(e))}catch(e){o(e)}}function step(e){e.done?n(e.value):function adopt(e){return e instanceof i?e:new i((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))}let c,u;"function"==typeof SuppressedError&&SuppressedError;const l=["fr","mg","lu"],h=["ab","ba","be","bg","ch","kk","ky","mk","mn","ru","sr","tg","tt","uk","uz"],g=["de","cs","sk","sl","hu","hr","bs","ro","sq","me","lt","lv","et"],p=/ф|и|с|в|у|а|п|р|ш|о|л|д|ь|т|щ|з|й|к|ы|е|г|м|ц|ч|н|я|ё|х|ъ|б|ю|э|ж|и/i,m=/[a-z]/i;function inferKeyboardLayoutFromLang(e=function getLang(){var e;const t=navigator;return null!=(null===(e=t.languages)||void 0===e?void 0:e.length)?t.languages[0]:t.userLanguage||t.language||t.browserLanguage}()){const t=(e||"").toLowerCase(),i=t.split("-")[0];return l.includes(i)||t.startsWith("nl-be")?"AZERTY":h.includes(i)?"JCUKEN":g.includes(i)||t.startsWith("sr-latn")?"QWERTZ":"QWERTY"}const v=new Set(["AZERTY","JCUKEN","QWERTY","QWERTZ"]);function getLayoutKeyLabel(e,t){var i,s;if(void 0===u){const e={ArrowLeft:"⬅",ArrowRight:"➡",ArrowUp:"⬆",ArrowDown:"⬇",AltLeft:"Left Alt",AltRight:"Right Alt",Backquote:"`",Backslash:"\\",Backspace:"Backspace",BracketLeft:"[",BracketRight:"]",CapsLock:"CapsLock",Comma:",",ContextMenu:"Context Menu",ControlLeft:"Left Ctrl",ControlRight:"Right Ctrl",Delete:"Delete",Digit0:"0",Digit1:"1",Digit2:"2",Digit3:"3",Digit4:"4",Digit5:"5",Digit6:"6",Digit7:"7",Digit8:"8",Digit9:"9",End:"End",Enter:"Enter",Equal:"=",Escape:"Esc",F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F11",F12:"F12",F13:"F13",F14:"F14",F15:"F15",F16:"F16",F17:"F17",F18:"F18",F19:"F19",F20:"F20",F21:"F21",F22:"F22",F23:"F23",F24:"F24",F25:"F25",F26:"F26",F27:"F27",F28:"F28",F29:"F29",F30:"F30",F31:"F31",F32:"F32",Home:"Home",IntlBackslash:"\\",IntlRo:"Ro",IntlYen:"¥",KeyA:"A",KeyB:"B",KeyC:"C",KeyD:"D",KeyE:"E",KeyF:"F",KeyG:"G",KeyH:"H",KeyI:"I",KeyJ:"J",KeyK:"K",KeyL:"L",KeyM:"M",KeyN:"N",KeyO:"O",KeyP:"P",KeyQ:"Q",KeyR:"R",KeyS:"S",KeyT:"T",KeyU:"U",KeyV:"V",KeyW:"W",KeyX:"X",KeyY:"Y",KeyZ:"Z",Lang1:"Language 1",Lang2:"Language 2",MediaTrackNext:"Next Track",MediaTrackPrevious:"Previous Track",MetaLeft:"Left "+getMetaKeyLabel(),MetaRight:"Right "+getMetaKeyLabel(),Minus:"-",NumLock:"Num Lock",Numpad0:"Num0",Numpad1:"Num1",Numpad2:"Num2",Numpad3:"Num3",Numpad4:"Num4",Numpad5:"Num5",Numpad6:"Num6",Numpad7:"Num7",Numpad8:"Num8",Numpad9:"Num9",NumpadAdd:"+",NumpadComma:",",NumpadDecimal:".",NumpadDivide:"/",NumpadMultiply:"*",NumpadSubtract:"-",OSLeft:"OS Left",Pause:"Pause",Period:".",Quote:"'",ScrollLock:"Scroll Lock",Semicolon:";",ShiftLeft:"Left Shift",ShiftRight:"Right Shift",Slash:"/",Space:"Space",Tab:"Tab",VolumeDown:"Volume Down",VolumeMute:"Volume Mute",VolumeUp:"Volume Up",WakeUp:"Wake Up"};u={AZERTY:{KeyA:"Q",KeyQ:"A",KeyW:"Z",KeyZ:"W",Backquote:"²",BracketLeft:"«",BracketRight:"»"},JCUKEN:{KeyA:"Ф",KeyB:"И",KeyC:"С",KeyD:"В",KeyE:"У",KeyF:"А",KeyG:"П",KeyH:"Р",KeyI:"Ш",KeyJ:"О",KeyK:"Л",KeyL:"Д",KeyM:"Ь",KeyN:"Т",KeyO:"Щ",KeyP:"З",KeyQ:"Й",KeyR:"К",KeyS:"Ы",KeyT:"Е",KeyU:"Г",KeyV:"М",KeyW:"Ц",KeyX:"Ч",KeyY:"Н",KeyZ:"Я",Backquote:"Ё",BracketLeft:"х",BracketRight:"ъ",Comma:"Б",Period:"Ю",Quote:"Э",Semicolon:"Ж",Slash:"И"},QWERTY:e,QWERTZ:{KeyY:"Z",KeyZ:"Y",BracketLeft:"ü",BracketRight:"ö",Slash:"-"}}}return null!==(s=null!==(i=u[t][e])&&void 0!==i?i:u.QWERTY[e])&&void 0!==s?s:e}function getMetaKeyLabel(){var e,t,i,s;const n=navigator,o=null!==(t=null===(e=n.platform)||void 0===e?void 0:e.toLowerCase())&&void 0!==t?t:"",a=null!==(s=null===(i=n.userAgent)||void 0===i?void 0:i.toLowerCase())&&void 0!==s?s:"";return o.includes("mac")?"⌘":o.includes("win")||o.includes("linux")?"⊞":a.includes("android")?"Search":a.includes("iphone")||a.includes("ipad")?"⌘":"⊞"}const y=["navigateLeft","navigateRight","navigateUp","navigateDown"];class KeyboardDevice{constructor(){this.type="keyboard",this.id="keyboard",this.meta={},this.lastInteraction=performance.now(),this.detectLayoutOnKeypress=!0,this.detected=!1,this.options={binds:{},navigation:{enabled:!0,binds:{Space:"trigger",Enter:"trigger",Escape:"navigateBack",Backspace:"navigateBack",ArrowDown:"navigateDown",ArrowLeft:"navigateLeft",ArrowRight:"navigateRight",ArrowUp:"navigateUp",KeyA:"navigateLeft",KeyD:"navigateRight",KeyS:"navigateDown",KeyW:"navigateUp"}}},this.key=Object.keys(d).reduce(((e,t)=>(e[t]=!1,e)),{}),this._emitter=new EventEmitter,this._bindEmitter=new EventEmitter,this._deferredKeydown=[],this._layout=inferKeyboardLayoutFromLang(),this._layoutSource="lang",function requestKeyboardLayout(){return __awaiter(this,void 0,void 0,(function*(){const e=navigator;if(e.keyboard&&e.keyboard.getLayoutMap)try{const t=yield e.keyboard.getLayoutMap();c=t;const i=t.get("KeyQ"),s=t.get("KeyA"),n=t.get("KeyZ");if("a"===i&&"w"===n&&"q"===s)return"AZERTY";if("q"===i&&"y"===n&&"a"===s)return"QWERTZ";if("q"===i&&"z"===n&&"a"===s)return"QWERTY";if("й"===i&&"я"===n&&"ф"===s)return"JCUKEN"}catch(e){}}))}().then((e=>{void 0!==e&&(this._layoutSource="browser",this._layout=e,this.detectLayoutOnKeypress=!1,this._emitter.emit("layoutdetected",{layoutSource:"browser",layout:e,device:this}))})),this._configureEventListeners()}get layout(){return this._layout}set layout(e){this._layoutSource="manual",this._layout=e,this.detectLayoutOnKeypress=!1}get layoutSource(){return this._layoutSource}pressedBind(e){return void 0!==this.options.binds[e]&&this.pressedAny(this.options.binds[e])}pressedAny(e){for(let t=0;te.charAt(0).toLocaleUpperCase()+e.slice(1))).join(" ")}(t)}(e))&&void 0!==i?i:getLayoutKeyLabel(e,null!=t?t:this._layout)}update(e){this._deferredKeydown.length>0&&(this._deferredKeydown.forEach((e=>this._processDeferredKeydownEvent(e))),this._deferredKeydown.length=0)}clear(){for(const e of Object.keys(d))this.key[e]=!1}_configureEventListeners(){const e=this.key,t=this._deferredKeydown;window.addEventListener("keydown",(i=>{e[i.code]=!0,t.push(i),this.lastInteraction=performance.now()}),{passive:!0,capture:!0}),window.addEventListener("keyup",(t=>{e[t.code]=!1,this.lastInteraction=performance.now()}),{passive:!0,capture:!0})}_processDeferredKeydownEvent(e){const t=e.code;if(!e.repeat){if(this.detectLayoutOnKeypress&&"lang"===this._layoutSource){const t=function detectKeyboardLayoutFromKeydown(e){const t=e.key.toLowerCase(),i=e.code;return p.test(t)?(v.delete("AZERTY"),v.delete("QWERTY"),v.delete("QWERTZ")):"Backquote"===i&&"²"===t||"BracketLeft"===i&&"«"===t||"BracketRight"===i&&"»"===t||"KeyA"===i&&"q"===t||"KeyQ"===i&&"a"===t||"KeyW"===i&&"z"===t||"KeyZ"===i&&"w"===t?(v.delete("JCUKEN"),v.delete("QWERTY"),v.delete("QWERTZ")):"BracketLeft"===i&&"ü"===t||"BracketRight"===i&&"ö"===t||"KeyY"===i&&"z"===t||"KeyZ"===i&&"y"===t||"Slash"===i&&"-"===t?(v.delete("AZERTY"),v.delete("JCUKEN"),v.delete("QWERTY")):"BracketLeft"===i&&"["===t||"BracketRight"===i&&"]"===t||"KeyZ"===i&&"z"===t?(v.delete("AZERTY"),v.delete("JCUKEN"),v.delete("QWERTZ")):"KeyQ"===i&&"q"===t||"KeyW"===i&&"w"===t?(v.delete("AZERTY"),v.delete("JCUKEN")):"KeyY"===i&&"Y"===t?(v.delete("QWERTZ"),v.delete("JCUKEN")):m.test(t)&&v.delete("JCUKEN"),1===v.size?[...v][0]:void 0}(e);void 0!==t&&(this._layout=t,this._layoutSource="keypress",this.detectLayoutOnKeypress=!1,this._emitter.emit("layoutdetected",{layout:t,layoutSource:"keypress",device:this}))}this._emitter.hasListener(t)&&setTimeout((()=>this._emitter.emit(t,{device:this,keyCode:t,keyLabel:this.getKeyLabel(t),event:e}))),Object.entries(this.options.binds).forEach((([i,s])=>{s.includes(t)&&setTimeout((()=>{const s={device:this,keyCode:t,keyLabel:this.getKeyLabel(t),event:e,name:i};this._bindEmitter.emit(i,s),this._emitter.emit("bind",s)}))}))}if(a.options.enabled&&this.options.navigation.enabled&&void 0!==this.options.navigation.binds[t]){const i=this.options.navigation.binds[t];e.repeat&&!y.includes(i)||setTimeout((()=>a.commit(this.options.navigation.binds[t],this)))}}}KeyboardDevice.global=new KeyboardDevice;class InputDeviceManager{constructor(){this.isMobile=(()=>{let e=!1;var t;return t=navigator.userAgent||navigator.vendor,(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0,4)))&&(e=!0),e})(),this.isTouchCapable=function isTouchCapable(){return"ontouchstart"in window||navigator.maxTouchPoints>0}(),this.options={requireFocus:!0,clearInputInBackground:!0},this._devices=[],this._gamepadDevices=[],this._gamepadDeviceMap=new Map,this._customDevices=[],this._emitter=new EventEmitter,this._bindEmitter=new EventEmitter,this._hasFocus=!1,this.keyboard=KeyboardDevice.global,this.isTouchCapable||this.isMobile?window.addEventListener("keydown",(()=>this.add(this.keyboard)),{once:!0}):this.add(this.keyboard),window.addEventListener("gamepadconnected",(()=>this._pollGamepads(performance.now()))),window.addEventListener("gamepaddisconnected",(e=>this._removeGamepad(e.gamepad.index)))}get devices(){return this._devices}get gamepads(){return this._gamepadDevices}get custom(){return this._customDevices}get lastInteractedDevice(){return this._lastInteractedDevice}on(e,t){return this._emitter.on(e,t),this}off(e,t){return this._emitter.off(e,t),this}onBind(e,t){return this._bindEmitter.on(e,t),this}offBind(e,t){return this._bindEmitter.off(e,t),this}emitBind(e){this._bindEmitter.emit(e.name,e)}add(e){-1===this._devices.indexOf(e)&&(this._devices.push(e),e instanceof KeyboardDevice?(e.detected=!0,e.on("bind",(e=>this.emitBind(e)))):e instanceof GamepadDevice?(this._gamepadDeviceMap.set(e.source.index,e),this._gamepadDevices.push(e),e.on("bind",(e=>this.emitBind(e)))):this._customDevices.push(e),this._emitter.emit("deviceadded",{device:e}))}remove(e){if(!(e instanceof KeyboardDevice||e instanceof GamepadDevice)){const t=this._customDevices.indexOf(e);-1!==t&&this._devices.splice(t,1)}const t=this._devices.indexOf(e);-1!==t&&(this._devices.splice(t,1),this._emitter.emit("deviceremoved",{device:e}))}update(){if(this.options.requireFocus&&!document.hasFocus())return this._hasFocus&&this.options.clearInputInBackground&&this.devices.forEach((e=>{var t;return null===(t=e.clear)||void 0===t?void 0:t.call(e)})),this._hasFocus=!1,this._devices;this._hasFocus=!0;const e=performance.now();return this.keyboard.detected&&this.keyboard.update(e),this._gamepadDevices.length>0&&this._pollGamepads(e),this._customDevices.length>0&&this._customDevices.forEach((t=>t.update(e))),this._updateLastInteracted(),this._devices}_updateLastInteracted(){if(0===this._devices.length)return;let e;if(1===this._devices.length)e=this._devices[0];else for(const t of this._devices)(void 0===e||t.lastInteraction>e.lastInteraction)&&(e=t);this._lastInteractedDevice=e}_pollGamepads(e){if(!document.hasFocus())return this._gamepadDevices;if(void 0===navigator.getGamepads)return this._gamepadDevices;for(const t of navigator.getGamepads())if(null!=t)if(this._gamepadDeviceMap.has(t.index)){this._gamepadDeviceMap.get(t.index).update(t,e)}else{const i=new GamepadDevice(t);this.add(i),i.update(t,e)}return this._gamepadDevices}_removeGamepad(e){const t=this._gamepadDeviceMap.get(e);if(!t)return;const i=this._gamepadDevices.indexOf(t);-1!==i&&this._gamepadDevices.splice(i,1),this.remove(t),this._gamepadDeviceMap.delete(e)}}InputDeviceManager.global=new InputDeviceManager;const f=InputDeviceManager.global;function registerPixiJSInputDeviceMixin(e){const t=e.prototype;t.navigationPriority=0,t.navigationMode="auto",Object.defineProperty(t,"isNavigatable",{get:function(){if("auto"===this.navigationMode){if(!this.isInteractive)return!1;const e=this.eventNames();return e.includes("pointerdown")||e.includes("mousedown")}return"target"===this.navigationMode},configurable:!0,enumerable:!1})}export{n as Button,GamepadDevice,f as InputDevice,d as KeyCode,KeyboardDevice,a as Navigation,y as REPEATABLE_NAV_INTENTS,getAllNavigatables,getFirstNavigatable,isChildOf,registerPixiJSInputDeviceMixin}; +const e=0,t=1,i=2,s=3,n=["LeftStickLeft","LeftStickRight","LeftStickUp","LeftStickDown","RightStickLeft","RightStickRight","RightStickUp","RightStickDown"],o={A:0,B:1,X:2,Y:3,LeftShoulder:4,RightShoulder:5,LeftTrigger:6,RightTrigger:7,Back:8,Start:9,LeftStickClick:10,RightStickClick:11,DPadUp:12,DPadDown:13,DPadLeft:14,DPadRight:15},a=["A","B","X","Y","LeftShoulder","RightShoulder","LeftTrigger","RightTrigger","Back","Start","LStick","RStick","DPadUp","DPadDown","DPadLeft","DPadRight"];let r=new Map;function throttle(e,t){var i;const s=Date.now();return(null!==(i=r.get(e))&&void 0!==i?i:0)>s||(r.set(e,s+t),!1)}class EventEmitter{constructor(){this._listeners={}}hasListener(e){return void 0!==this._listeners[e]}emit(e,t){var i;null===(i=this._listeners[e])||void 0===i||i.forEach((e=>e(t)))}on(e,t){var i;this._listeners[e]||(this._listeners[e]=[]),null===(i=this._listeners[e])||void 0===i||i.push(t)}off(e,t){var i,s;this._listeners[e]=void 0===t||null===(i=this._listeners[e])||void 0===i?void 0:i.filter((e=>e!==t)),0===(null===(s=this._listeners[e])||void 0===s?void 0:s.length)&&(this._listeners[e]=void 0)}}class GamepadDevice{static configureDefaultBinds(e){this.defaultOptions.binds=Object.assign(Object.assign({},this.defaultOptions.binds),e)}pressedBind(e){return void 0!==this.options.binds[e]&&this.pressedAny(this.options.binds[e])}pressedAny(e){for(let t=0;t(e[t]=!1,e)),{})}constructor(e){this.source=e,this.type="gamepad",this.meta={},this.lastInteraction=performance.now(),this.options=JSON.parse(JSON.stringify(GamepadDevice.defaultOptions)),this.leftJoystick={x:0,y:0},this.rightJoystick={x:0,y:0},this.button=[...a,...n].reduce(((e,t)=>(e[t]=!1,e)),{}),this._emitter=new EventEmitter,this._bindEmitter=new EventEmitter,this.leftTrigger=0,this.rightTrigger=0,this.leftShoulder=0,this.rightShoulder=0,this.id="gamepad"+e.index,this.layout=function detectLayout(e){const t=(e.id||"").toLowerCase();return/(steam|28de)/.test(t)?"steam":/(logitech|046d|c216)/.test(t)?"logitech":/(nintendo|switch|joycon|057e)/.test(t)?"nintendo":/(dualshock|dualsense|sony|054c|0ce6|0810)/.test(t)?"playstation":/(xbox|xinput|045e|028e|0291|02a0|02a1|02ea|02ff)/.test(t)?"xbox":"standard"}(e)}updatePresses(r,d){var u,c,l,h,g,p,m;const v=this.options.joystick;for(let e=0;e<4;e++){const t=_scale(r.axes[e],v.deadzone),i=n[2*e+(t>0?1:0)];if(Math.abs(t)this._emitter.emit(i,{device:this,axis:e,axisCode:i}))),Object.entries(this.options.binds).forEach((([t,s])=>{s.includes(i)&&setTimeout((()=>{const s={device:this,type:"axis",axis:e,axisCode:i,name:t};this._bindEmitter.emit(t,s),this._emitter.emit("bind",s)}))})))}}for(let e=0;e<16;e++){let t=e;"nintendo"===this.layout&&"none"!==this.options.nintendoRemapMode&&("physical"===this.options.nintendoRemapMode?t===o.B?t=o.A:t===o.A?t=o.B:t===o.X?t=o.Y:t===o.Y&&(t=o.X):t===o.B?t=o.X:t===o.X&&(t=o.B));const i=a[t];if(this.button[i]===(null===(u=r.buttons[e])||void 0===u?void 0:u.pressed))continue;this.lastInteraction=d;const s=null!==(l=null===(c=r.buttons[e])||void 0===c?void 0:c.pressed)&&void 0!==l&&l;this.button[i]=s,s&&(this._emitter.hasListener(i)&&setTimeout((()=>this._emitter.emit(i,{device:this,button:t,buttonCode:i}))),Object.entries(this.options.binds).forEach((([e,s])=>{s.includes(i)&&setTimeout((()=>{const s={device:this,type:"button",button:t,buttonCode:i,name:e};this._bindEmitter.emit(e,s),this._emitter.emit("bind",s)}))})))}const f=this.options.trigger.deadzone;this.leftTrigger=_scale(r.buttons[o.LeftTrigger].value,f),this.rightTrigger=_scale(r.buttons[o.RightTrigger].value,f),this.leftShoulder=_scale(r.buttons[o.LeftShoulder].value,f),this.rightShoulder=_scale(r.buttons[o.RightShoulder].value,f);const y=v.deadzone;this.leftJoystick.x=_scale(null!==(h=r.axes[e])&&void 0!==h?h:0,y),this.leftJoystick.y=_scale(null!==(g=r.axes[t])&&void 0!==g?g:0,y),this.rightJoystick.x=_scale(null!==(p=r.axes[i])&&void 0!==p?p:0,y),this.rightJoystick.y=_scale(null!==(m=r.axes[s])&&void 0!==m?m:0,y)}}function _scale(e,t){const i=(Math.abs(e)-t[0])/(t[1]-t[0]);return i>=0&&i<=1?Math.sign(e)*i:i>1?1*Math.sign(e):0}GamepadDevice.defaultOptions={nintendoRemapMode:"physical",binds:{"navigate.back":["B","Back"],"navigate.down":["DPadDown","LeftStickDown"],"navigate.left":["DPadLeft","LeftStickLeft"],"navigate.right":["DPadRight","LeftStickRight"],"navigate.trigger":["A"],"navigate.up":["DPadUp","LeftStickUp"]},joystick:{deadzone:[0,1],threshold:.25,autoRepeatDelayMs:[400,80]},trigger:{deadzone:[0,1]},vibration:{enabled:!0,intensity:1}};const d={AltLeft:"AltLeft",AltRight:"AltRight",ArrowDown:"ArrowDown",ArrowLeft:"ArrowLeft",ArrowRight:"ArrowRight",ArrowUp:"ArrowUp",Backquote:"Backquote",Backslash:"Backslash",Backspace:"Backspace",BracketLeft:"BracketLeft",BracketRight:"BracketRight",CapsLock:"CapsLock",Comma:"Comma",ContextMenu:"ContextMenu",ControlLeft:"ControlLeft",ControlRight:"ControlRight",Delete:"Delete",Digit0:"Digit0",Digit1:"Digit1",Digit2:"Digit2",Digit3:"Digit3",Digit4:"Digit4",Digit5:"Digit5",Digit6:"Digit6",Digit7:"Digit7",Digit8:"Digit8",Digit9:"Digit9",End:"End",Enter:"Enter",Equal:"Equal",Escape:"Escape",F1:"F1",F10:"F10",F11:"F11",F12:"F12",F13:"F13",F14:"F14",F15:"F15",F16:"F16",F17:"F17",F18:"F18",F19:"F19",F2:"F2",F20:"F20",F21:"F21",F22:"F22",F23:"F23",F24:"F24",F25:"F25",F26:"F26",F27:"F27",F28:"F28",F29:"F29",F3:"F3",F30:"F30",F31:"F31",F32:"F32",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",Home:"Home",IntlBackslash:"IntlBackslash",IntlRo:"IntlRo",IntlYen:"IntlYen",KeyA:"KeyA",KeyB:"KeyB",KeyC:"KeyC",KeyD:"KeyD",KeyE:"KeyE",KeyF:"KeyF",KeyG:"KeyG",KeyH:"KeyH",KeyI:"KeyI",KeyJ:"KeyJ",KeyK:"KeyK",KeyL:"KeyL",KeyM:"KeyM",KeyN:"KeyN",KeyO:"KeyO",KeyP:"KeyP",KeyQ:"KeyQ",KeyR:"KeyR",KeyS:"KeyS",KeyT:"KeyT",KeyU:"KeyU",KeyV:"KeyV",KeyW:"KeyW",KeyX:"KeyX",KeyY:"KeyY",KeyZ:"KeyZ",Lang1:"Lang1",Lang2:"Lang2",MediaTrackNext:"MediaTrackNext",MediaTrackPrevious:"MediaTrackPrevious",MetaLeft:"MetaLeft",MetaRight:"MetaRight",Minus:"Minus",NumLock:"NumLock",Numpad0:"Numpad0",Numpad1:"Numpad1",Numpad2:"Numpad2",Numpad3:"Numpad3",Numpad4:"Numpad4",Numpad5:"Numpad5",Numpad6:"Numpad6",Numpad7:"Numpad7",Numpad8:"Numpad8",Numpad9:"Numpad9",NumpadAdd:"NumpadAdd",NumpadComma:"NumpadComma",NumpadDecimal:"NumpadDecimal",NumpadDivide:"NumpadDivide",NumpadMultiply:"NumpadMultiply",NumpadSubtract:"NumpadSubtract",OSLeft:"OSLeft",Pause:"Pause",Period:"Period",Quote:"Quote",ScrollLock:"ScrollLock",Semicolon:"Semicolon",ShiftLeft:"ShiftLeft",ShiftRight:"ShiftRight",Slash:"Slash",Space:"Space",Tab:"Tab",VolumeDown:"VolumeDown",VolumeMute:"VolumeMute",VolumeUp:"VolumeUp",WakeUp:"WakeUp"};function __awaiter(e,t,i,s){return new(i||(i=Promise))((function(n,o){function fulfilled(e){try{step(s.next(e))}catch(e){o(e)}}function rejected(e){try{step(s.throw(e))}catch(e){o(e)}}function step(e){e.done?n(e.value):function adopt(e){return e instanceof i?e:new i((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))}let u,c;"function"==typeof SuppressedError&&SuppressedError;const l=["fr","mg","lu"],h=["ab","ba","be","bg","ch","kk","ky","mk","mn","ru","sr","tg","tt","uk","uz"],g=["de","cs","sk","sl","hu","hr","bs","ro","sq","me","lt","lv","et"],p=/ф|и|с|в|у|а|п|р|ш|о|л|д|ь|т|щ|з|й|к|ы|е|г|м|ц|ч|н|я|ё|х|ъ|б|ю|э|ж|и/i,m=/[a-z]/i;function inferKeyboardLayoutFromLang(e=function getLang(){var e;const t=navigator;return null!=(null===(e=t.languages)||void 0===e?void 0:e.length)?t.languages[0]:t.userLanguage||t.language||t.browserLanguage}()){const t=(e||"").toLowerCase(),i=t.split("-")[0];return l.includes(i)||t.startsWith("nl-be")?"AZERTY":h.includes(i)?"JCUKEN":g.includes(i)||t.startsWith("sr-latn")?"QWERTZ":"QWERTY"}const v=new Set(["AZERTY","JCUKEN","QWERTY","QWERTZ"]);function getLayoutKeyLabel(e,t){var i,s;if(void 0===c){const e={ArrowLeft:"⬅",ArrowRight:"➡",ArrowUp:"⬆",ArrowDown:"⬇",AltLeft:"Left Alt",AltRight:"Right Alt",Backquote:"`",Backslash:"\\",Backspace:"Backspace",BracketLeft:"[",BracketRight:"]",CapsLock:"CapsLock",Comma:",",ContextMenu:"Context Menu",ControlLeft:"Left Ctrl",ControlRight:"Right Ctrl",Delete:"Delete",Digit0:"0",Digit1:"1",Digit2:"2",Digit3:"3",Digit4:"4",Digit5:"5",Digit6:"6",Digit7:"7",Digit8:"8",Digit9:"9",End:"End",Enter:"Enter",Equal:"=",Escape:"Esc",F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F11",F12:"F12",F13:"F13",F14:"F14",F15:"F15",F16:"F16",F17:"F17",F18:"F18",F19:"F19",F20:"F20",F21:"F21",F22:"F22",F23:"F23",F24:"F24",F25:"F25",F26:"F26",F27:"F27",F28:"F28",F29:"F29",F30:"F30",F31:"F31",F32:"F32",Home:"Home",IntlBackslash:"\\",IntlRo:"Ro",IntlYen:"¥",KeyA:"A",KeyB:"B",KeyC:"C",KeyD:"D",KeyE:"E",KeyF:"F",KeyG:"G",KeyH:"H",KeyI:"I",KeyJ:"J",KeyK:"K",KeyL:"L",KeyM:"M",KeyN:"N",KeyO:"O",KeyP:"P",KeyQ:"Q",KeyR:"R",KeyS:"S",KeyT:"T",KeyU:"U",KeyV:"V",KeyW:"W",KeyX:"X",KeyY:"Y",KeyZ:"Z",Lang1:"Language 1",Lang2:"Language 2",MediaTrackNext:"Next Track",MediaTrackPrevious:"Previous Track",MetaLeft:"Left "+getMetaKeyLabel(),MetaRight:"Right "+getMetaKeyLabel(),Minus:"-",NumLock:"Num Lock",Numpad0:"Num0",Numpad1:"Num1",Numpad2:"Num2",Numpad3:"Num3",Numpad4:"Num4",Numpad5:"Num5",Numpad6:"Num6",Numpad7:"Num7",Numpad8:"Num8",Numpad9:"Num9",NumpadAdd:"+",NumpadComma:",",NumpadDecimal:".",NumpadDivide:"/",NumpadMultiply:"*",NumpadSubtract:"-",OSLeft:"OS Left",Pause:"Pause",Period:".",Quote:"'",ScrollLock:"Scroll Lock",Semicolon:";",ShiftLeft:"Left Shift",ShiftRight:"Right Shift",Slash:"/",Space:"Space",Tab:"Tab",VolumeDown:"Volume Down",VolumeMute:"Volume Mute",VolumeUp:"Volume Up",WakeUp:"Wake Up"};c={AZERTY:{KeyA:"Q",KeyQ:"A",KeyW:"Z",KeyZ:"W",Backquote:"²",BracketLeft:"«",BracketRight:"»"},JCUKEN:{KeyA:"Ф",KeyB:"И",KeyC:"С",KeyD:"В",KeyE:"У",KeyF:"А",KeyG:"П",KeyH:"Р",KeyI:"Ш",KeyJ:"О",KeyK:"Л",KeyL:"Д",KeyM:"Ь",KeyN:"Т",KeyO:"Щ",KeyP:"З",KeyQ:"Й",KeyR:"К",KeyS:"Ы",KeyT:"Е",KeyU:"Г",KeyV:"М",KeyW:"Ц",KeyX:"Ч",KeyY:"Н",KeyZ:"Я",Backquote:"Ё",BracketLeft:"х",BracketRight:"ъ",Comma:"Б",Period:"Ю",Quote:"Э",Semicolon:"Ж",Slash:"И"},QWERTY:e,QWERTZ:{KeyY:"Z",KeyZ:"Y",BracketLeft:"ü",BracketRight:"ö",Slash:"-"}}}return null!==(s=null!==(i=c[t][e])&&void 0!==i?i:c.QWERTY[e])&&void 0!==s?s:e}function getMetaKeyLabel(){var e,t,i,s;const n=navigator,o=null!==(t=null===(e=n.platform)||void 0===e?void 0:e.toLowerCase())&&void 0!==t?t:"",a=null!==(s=null===(i=n.userAgent)||void 0===i?void 0:i.toLowerCase())&&void 0!==s?s:"";return o.includes("mac")?"⌘":o.includes("win")||o.includes("linux")?"⊞":a.includes("android")?"Search":a.includes("iphone")||a.includes("ipad")?"⌘":"⊞"}class KeyboardDevice{constructor(){this.type="keyboard",this.id="keyboard",this.meta={},this.lastInteraction=performance.now(),this.detectLayoutOnKeypress=!0,this.detected=!1,this.options={binds:{"navigate.back":["Escape","Backspace"],"navigate.down":["ArrowDown","KeyS"],"navigate.left":["ArrowLeft","KeyA"],"navigate.right":["ArrowRight","KeyD"],"navigate.trigger":["Enter","Space"],"navigate.up":["ArrowUp","KeyW"]},repeatableBinds:["navigate.down","navigate.left","navigate.right","navigate.up"]},this.key=Object.keys(d).reduce(((e,t)=>(e[t]=!1,e)),{}),this._emitter=new EventEmitter,this._bindEmitter=new EventEmitter,this._deferredKeydown=[],this._layout=inferKeyboardLayoutFromLang(),this._layoutSource="lang",function requestKeyboardLayout(){return __awaiter(this,void 0,void 0,(function*(){const e=navigator;if(e.keyboard&&e.keyboard.getLayoutMap)try{const t=yield e.keyboard.getLayoutMap();u=t;const i=t.get("KeyQ"),s=t.get("KeyA"),n=t.get("KeyZ");if("a"===i&&"w"===n&&"q"===s)return"AZERTY";if("q"===i&&"y"===n&&"a"===s)return"QWERTZ";if("q"===i&&"z"===n&&"a"===s)return"QWERTY";if("й"===i&&"я"===n&&"ф"===s)return"JCUKEN"}catch(e){}}))}().then((e=>{void 0!==e&&(this._layoutSource="browser",this._layout=e,this.detectLayoutOnKeypress=!1,this._emitter.emit("layoutdetected",{layoutSource:"browser",layout:e,device:this}))})),this._configureEventListeners()}get layout(){return this._layout}set layout(e){this._layoutSource="manual",this._layout=e,this.detectLayoutOnKeypress=!1}get layoutSource(){return this._layoutSource}pressedBind(e){return void 0!==this.options.binds[e]&&this.pressedAny(this.options.binds[e])}pressedAny(e){for(let t=0;te.charAt(0).toLocaleUpperCase()+e.slice(1))).join(" ")}(t)}(e))&&void 0!==i?i:getLayoutKeyLabel(e,null!=t?t:this._layout)}update(e){this._deferredKeydown.length>0&&(this._deferredKeydown.forEach((e=>this._processDeferredKeydownEvent(e))),this._deferredKeydown.length=0)}clear(){for(const e of Object.keys(d))this.key[e]=!1}_configureEventListeners(){const e=this.key,t=this._deferredKeydown;window.addEventListener("keydown",(i=>{e[i.code]=!0,t.push(i),this.lastInteraction=performance.now()}),{passive:!0,capture:!0}),window.addEventListener("keyup",(t=>{e[t.code]=!1,this.lastInteraction=performance.now()}),{passive:!0,capture:!0})}_processDeferredKeydownEvent(e){const t=e.code;if(!e.repeat){if(this.detectLayoutOnKeypress&&"lang"===this._layoutSource){const t=function detectKeyboardLayoutFromKeydown(e){const t=e.key.toLowerCase(),i=e.code;return p.test(t)?(v.delete("AZERTY"),v.delete("QWERTY"),v.delete("QWERTZ")):"Backquote"===i&&"²"===t||"BracketLeft"===i&&"«"===t||"BracketRight"===i&&"»"===t||"KeyA"===i&&"q"===t||"KeyQ"===i&&"a"===t||"KeyW"===i&&"z"===t||"KeyZ"===i&&"w"===t?(v.delete("JCUKEN"),v.delete("QWERTY"),v.delete("QWERTZ")):"BracketLeft"===i&&"ü"===t||"BracketRight"===i&&"ö"===t||"KeyY"===i&&"z"===t||"KeyZ"===i&&"y"===t||"Slash"===i&&"-"===t?(v.delete("AZERTY"),v.delete("JCUKEN"),v.delete("QWERTY")):"BracketLeft"===i&&"["===t||"BracketRight"===i&&"]"===t||"KeyZ"===i&&"z"===t?(v.delete("AZERTY"),v.delete("JCUKEN"),v.delete("QWERTZ")):"KeyQ"===i&&"q"===t||"KeyW"===i&&"w"===t?(v.delete("AZERTY"),v.delete("JCUKEN")):"KeyY"===i&&"y"===t?(v.delete("QWERTZ"),v.delete("JCUKEN")):m.test(t)&&v.delete("JCUKEN"),1===v.size?[...v][0]:void 0}(e);void 0!==t&&(this._layout=t,this._layoutSource="keypress",this.detectLayoutOnKeypress=!1,this._emitter.emit("layoutdetected",{layout:t,layoutSource:"keypress",device:this}))}this._emitter.hasListener(t)&&setTimeout((()=>this._emitter.emit(t,{device:this,keyCode:t,keyLabel:this.getKeyLabel(t),event:e})))}Object.entries(this.options.binds).forEach((([i,s])=>{s.includes(t)&&(e.repeat&&!this.options.repeatableBinds.includes(i)||setTimeout((()=>{const s={device:this,keyCode:t,keyLabel:this.getKeyLabel(t),event:e,name:i,repeat:e.repeat};this._bindEmitter.emit(i,s),this._emitter.emit("bind",s)})))}))}}KeyboardDevice.global=new KeyboardDevice;class InputDeviceManager{constructor(){this.isMobile=(()=>{let e=!1;var t;return t=navigator.userAgent||navigator.vendor,(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0,4)))&&(e=!0),e})(),this.isTouchCapable=function isTouchCapable(){return"ontouchstart"in window||navigator.maxTouchPoints>0}(),this.options={requireFocus:!0,clearInputInBackground:!0},this._devices=[],this._gamepadDevices=[],this._gamepadDeviceMap=new Map,this._customDevices=[],this._emitter=new EventEmitter,this._bindEmitter=new EventEmitter,this._hasFocus=!1,this.keyboard=KeyboardDevice.global,this.isTouchCapable||this.isMobile?window.addEventListener("keydown",(()=>this.add(this.keyboard)),{once:!0}):this.add(this.keyboard),window.addEventListener("gamepadconnected",(()=>this._pollGamepads(performance.now()))),window.addEventListener("gamepaddisconnected",(e=>this._removeGamepad(e.gamepad.index)))}get devices(){return this._devices}get gamepads(){return this._gamepadDevices}get custom(){return this._customDevices}get lastInteractedDevice(){return this._lastInteractedDevice}on(e,t){return this._emitter.on(e,t),this}off(e,t){return this._emitter.off(e,t),this}onBind(e,t){return(e=Array.isArray(e)?e:[e]).forEach((e=>this._bindEmitter.on(e,t))),this}offBind(e,t){return(e=Array.isArray(e)?e:[e]).forEach((e=>this._bindEmitter.off(e,t))),this}emitBind(e){this._bindEmitter.emit(e.name,e)}add(e){-1===this._devices.indexOf(e)&&(this._devices.push(e),e instanceof KeyboardDevice?(e.detected=!0,e.on("bind",(e=>this.emitBind(e)))):e instanceof GamepadDevice?(this._gamepadDeviceMap.set(e.source.index,e),this._gamepadDevices.push(e),e.on("bind",(e=>this.emitBind(e)))):this._customDevices.push(e),this._emitter.emit("deviceadded",{device:e}))}remove(e){if(!(e instanceof KeyboardDevice||e instanceof GamepadDevice)){const t=this._customDevices.indexOf(e);-1!==t&&this._devices.splice(t,1)}const t=this._devices.indexOf(e);-1!==t&&(this._devices.splice(t,1),this._emitter.emit("deviceremoved",{device:e}))}update(){if(this.options.requireFocus&&!document.hasFocus())return this._hasFocus&&this.options.clearInputInBackground&&this.devices.forEach((e=>{var t;return null===(t=e.clear)||void 0===t?void 0:t.call(e)})),this._hasFocus=!1,this._devices;this._hasFocus=!0;const e=performance.now();return this.keyboard.detected&&this.keyboard.update(e),this._gamepadDevices.length>0&&this._pollGamepads(e),this._customDevices.length>0&&this._customDevices.forEach((t=>t.update(e))),this._updateLastInteracted(),this._devices}_updateLastInteracted(){if(0===this._devices.length)return;let e;if(1===this._devices.length)e=this._devices[0];else for(const t of this._devices)(void 0===e||t.lastInteraction>e.lastInteraction)&&(e=t);this._lastInteractedDevice=e}_pollGamepads(e){if(!document.hasFocus())return this._gamepadDevices;if(void 0===navigator.getGamepads)return this._gamepadDevices;for(const t of navigator.getGamepads())if(null!=t)if(this._gamepadDeviceMap.has(t.index)){this._gamepadDeviceMap.get(t.index).update(t,e)}else{const i=new GamepadDevice(t);this.add(i),i.update(t,e)}return this._gamepadDevices}_removeGamepad(e){const t=this._gamepadDeviceMap.get(e);if(!t)return;const i=this._gamepadDevices.indexOf(t);-1!==i&&this._gamepadDevices.splice(i,1),this.remove(t),this._gamepadDeviceMap.delete(e)}}InputDeviceManager.global=new InputDeviceManager;const f=InputDeviceManager.global;function getAllNavigatables(e,t=[]){var i;for(const s of null!==(i=e.children)&&void 0!==i?i:[])s.isNavigatable?t.push(s):getAllNavigatables(s,t);return t}function getFirstNavigatable(e,t,i,{minimumDistance:s=0}={}){return function chooseFirstNavigatableInDirection(e,t,i,s=0){var n,o,a,r,d,u,c,l,h;const g=e.filter((e=>e.isNavigatable&&null!=e.parent&&isVisible(e))),p=g.find((e=>e===t));if(void 0===p)return g.sort(((e,t)=>t.navigationPriority-e.navigationPriority)),g[0];if(void 0===i&&p)return p;const m=null!=p?p:g[Math.floor(Math.random()*g.length)];if(void 0===p)return null!==(n=e[0])&&void 0!==n?n:m;const v=p.getGlobalPosition(),f=p.getBounds(),y={x:v.x+f.left+f.width/2,y:v.y+f.top+f.height/2},b=g.filter((e=>e!==p)).map((e=>{const t=e.getGlobalPosition(),i=e.getBounds(),s={x:t.x+i.left+i.width/2,y:t.y+i.top+i.height/2};return{element:e,bounds:i,center:s,xDistSqrd:weightedDistSquared(s,y,1,3),yDistSqrd:weightedDistSquared(s,y,3,1)}}));switch(i){case"navigate.up":return null!==(a=null===(o=b.filter((e=>e.center.ye.yDistSqrd-t.yDistSqrd))[0])||void 0===o?void 0:o.element)&&void 0!==a?a:m;case"navigate.left":return null!==(d=null===(r=b.filter((e=>e.center.xe.xDistSqrd-t.xDistSqrd))[0])||void 0===r?void 0:r.element)&&void 0!==d?d:m;case"navigate.right":return null!==(c=null===(u=b.filter((e=>e.center.x>y.x+s)).sort(((e,t)=>e.xDistSqrd-t.xDistSqrd))[0])||void 0===u?void 0:u.element)&&void 0!==c?c:m;case"navigate.down":return null!==(h=null===(l=b.filter((e=>e.center.y>y.y+s)).sort(((e,t)=>e.yDistSqrd-t.yDistSqrd))[0])||void 0===l?void 0:l.element)&&void 0!==h?h:m;default:return p}}(getAllNavigatables(e),t,i,s)}function isChildOf(e,t){for(;null!=e;){if(e===t)return!0;e=e.parent}return!1}function weightedDistSquared(e,t,i,s){const n=t.x-e.x,o=t.y-e.y;return n*n*i+o*o*s}function isVisible(e){for(;null!=e;){if(!e.visible)return!1;e=e.parent}return!0}const y=["navigate.left","navigate.right","navigate.up","navigate.down","navigate.back","navigate.trigger"];class NavigationManager{constructor(){this.options={useFallbackHoverEffect:!0,minimumDirectionDistance:10},this.enabled=!1,this._responders=[]}get focusTarget(){var e,t;return null!==(t=null===(e=this.responders.find((e=>null!=e.focusTarget&&isVisible(e.focusTarget))))||void 0===e?void 0:e.focusTarget)&&void 0!==t?t:this._rootFocused}set focusTarget(e){const t=this.focusTarget;if(t===e)return;const i=this.getResponderStage();i&&(!e||e.isNavigatable&&isChildOf(e,i))&&(t&&this._emitBlur(t),e&&this._emitFocus(e),this.firstResponder?this.firstResponder.focusTarget=e:this._rootFocused=e)}get firstResponder(){return this._responders[0]}get responders(){return this._responders}configureWithRoot(e){null==this._root&&f.onBind(y,(e=>this._propagate(e))),this._root=e,this.enabled=!0}popResponder(){var e,t,i,s,n;const o=this.focusTarget,a=this._responders.shift();a.focusTarget=void 0;const r=this.focusTarget;return null===(e=null==a?void 0:a.resignedAsFirstResponder)||void 0===e||e.call(a),this._invalidateFocusedIfNeeded(),this.firstResponder&&(null===(i=(t=this.firstResponder).becameFirstResponder)||void 0===i||i.call(t)),o!==r&&(null!==(n=null===(s=this.firstResponder)||void 0===s?void 0:s.autoFocus)&&void 0!==n?n:void 0===r)&&this.autoFocus(),a}pushResponder(e){var t,i,s;const n=e;if(this._responders.includes(n))throw new Error("Responder already in stack.");const o=this.firstResponder;this._responders.unshift(n),null===(t=null==o?void 0:o.resignedAsFirstResponder)||void 0===t||t.call(o),this._invalidateFocusedIfNeeded(),null===(i=n.becameFirstResponder)||void 0===i||i.call(n),(null===(s=n.autoFocus)||void 0===s||s)&&this.autoFocus()}autoFocus(){if(!b.enabled)return;const e=this.getResponderStage();if(!e)return;const t=getFirstNavigatable(e);void 0!==t?t!==this.focusTarget&&(this.focusTarget=t):console.debug("navigation: no navigatable containers found")}getResponderStage(){var e;return null!==(e=this.responders.find(isContainer))&&void 0!==e?e:this._root}_propagate({device:e,name:t}){var i;if(this.enabled){for(const s of this._responders)if(null===(i=s.handledNavigationIntent)||void 0===i?void 0:i.call(s,t,e))return;if(null==this._root)throw this.enabled=!1,new Error("Navigation requires root responder to be configured");{const e=this.getResponderStage();this._handleGlobalIntent(e,t)}}}_handleGlobalIntent(e,t){var i;this._invalidateFocusedIfNeeded(e);const s=this.focusTarget;if(void 0===s)return void this.autoFocus();if("navigate.back"===t)return this._emitBlur(s),void(this.focusTarget=void 0);if("navigate.trigger"===t)return void this._emitTrigger(s);const n=null!==(i=getFirstNavigatable(e,s,t,{minimumDistance:this.options.minimumDirectionDistance}))&&void 0!==i?i:s;n!==s&&(this.focusTarget=n)}_emitBlur(e){const t=e.eventNames();t.includes("pointerout")?e.emit("pointerout"):t.includes("mouseout")?e.emit("mouseout"):this.options.useFallbackHoverEffect&&(e.alpha=1),e.emit("deviceout")}_emitFocus(e){const t=e.eventNames();t.includes("pointerover")?e.emit("pointerover"):t.includes("mouseover")?e.emit("mouseover"):this.options.useFallbackHoverEffect&&(e.alpha=.5),e.emit("deviceover")}_emitTrigger(e){const t=e.eventNames();t.includes("pointerdown")?e.emit("pointerdown"):t.includes("mousedown")?e.emit("mousedown"):this.options.useFallbackHoverEffect&&(e.alpha=.75),e.emit("devicedown")}_invalidateFocusedIfNeeded(e=this.getResponderStage()){if(!e)return;const t=this.focusTarget;t&&!isChildOf(t,e)&&(this._emitBlur(t),this.focusTarget=void 0)}}function isContainer(e){return"children"in e}NavigationManager.global=new NavigationManager;const b=NavigationManager.global;let K=!1;function registerPixiJSNavigationMixin(e){if(K)return;K=!0;const t=e.prototype;t.navigationPriority=0,t.navigationMode="auto",Object.defineProperty(t,"isNavigatable",{get:function(){if("target"===this.navigationMode)return!0;if("none"===this.navigationMode)return!1;const e=this.eventNames();return e.includes("pointerdown")||e.includes("mousedown")},configurable:!0,enumerable:!1})}export{o as Button,GamepadDevice,f as InputDevice,d as KeyCode,KeyboardDevice,b as UINavigation,getAllNavigatables,getFirstNavigatable,isChildOf,isVisible,y as navigationIntents,registerPixiJSNavigationMixin}; //# sourceMappingURL=index.mjs.map diff --git a/dist/index.mjs.map b/dist/index.mjs.map index 2c3bbbf..4eacdb5 100644 --- a/dist/index.mjs.map +++ b/dist/index.mjs.map @@ -1 +1 @@ -{"version":3,"file":"index.mjs","sources":["../src/lib/devices/gamepads/buttons.ts","../src/lib/navigation/Navigatable.ts","../src/lib/navigation/Navigation.ts","../src/lib/utils/throttle.ts","../src/lib/utils/events.ts","../src/lib/devices/GamepadDevice.ts","../src/lib/devices/gamepads/layouts.ts","../src/lib/devices/keyboard/keys.ts","../node_modules/tslib/tslib.es6.js","../src/lib/devices/keyboard/layouts.ts","../src/lib/navigation/NavigationIntent.ts","../src/lib/devices/KeyboardDevice.ts","../src/lib/InputDevice.ts","../src/lib/utils/detectors.ts","../src/Container.mixin.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,"/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n function next() {\r\n while (env.stack.length) {\r\n var rec = env.stack.pop();\r\n try {\r\n var result = rec.dispose && rec.dispose.call(rec.value);\r\n if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n};\r\n",null,null,null,null,null,null],"names":["Axis","Button","A","B","X","Y","LeftShoulder","RightShoulder","LeftTrigger","RightTrigger","Back","Start","LeftStick","RightStick","DPadUp","DPadDown","DPadLeft","DPadRight","ButtonCode","getAllNavigatables","target","navigatables","child","children","isNavigatable","push","getFirstNavigatable","root","currentFocus","nearestDirection","minimumDistance","chooseFirstNavigatableInDirection","elements","filter","el","parent","isVisible","visible","focusedElement","find","undefined","sort","a","b","navigationPriority","fallbackElement","Math","floor","random","length","_a","focusedBounds","getBounds","focusedCenter","x","left","width","y","top","height","otherElements","map","bounds","center","element","distSqrd","squaredDist","_c","_b","_e","_d","_g","_f","_j","_h","isChildOf","dx","dy","NavigationManager","constructor","this","options","enabled","useFallbackHoverEffect","_responderStack","firstResponder","responders","commit","intent","device","_propagateIntent","popResponder","responder","shift","resignedAsFirstResponder","_clearFocusIfNeeded","becameFirstResponder","autoFocus","pushResponder","includes","Error","previousResponder","unshift","call","responderStage","isContainer","stage","navigatable","_focused","_emitBlur","_emitFocus","console","debug","handledNavigationIntent","warn","_handleGlobalIntent","_emitTrigger","nextTarget","eventNames","emit","navigationMode","alpha","global","Navigation","_cooldowns","Map","throttle","id","cooldownMs","now","Date","get","set","EventEmitter","_listeners","hasListener","e","payload","forEach","fn","on","event","off","l","GamepadDevice","pressedBind","name","binds","pressedAny","btns","i","button","pressedAll","listener","_emitter","onBind","_bindEmitter","offBind","playVibration","duration","weakMagnitude","strongMagnitude","vibrationType","rightTrigger","leftTrigger","startDelay","vibration","source","vibrationActuator","intensity","playEffect","update","updatePresses","clear","_axisIntents","_btnPrevState","type","meta","lastInteraction","performance","JSON","parse","stringify","defaultOptions","leftJoystick","rightJoystick","Object","keys","reduce","obj","key","Array","leftShoulder","rightShoulder","index","layout","detectLayout","gamepad","toLowerCase","test","_throttleIdLeftStickX","_throttleIdLeftStickY","buttonCount","remapNintendoMode","buttons","pressed","isPressed","buttonCode","setTimeout","entries","navigation","tdz","triggerDeadzone","_scale","value","jdz","joystickDeadzone","axes","jnav","joystick","abs","commitSensitivity","xIntent","cooldownDuration","repeatCooldownMs","firstRepeatCooldownMs","yIntent","range","scaled","sign","KeyCode","AltLeft","AltRight","ArrowDown","ArrowLeft","ArrowRight","ArrowUp","Backquote","Backslash","Backspace","BracketLeft","BracketRight","CapsLock","Comma","ContextMenu","ControlLeft","ControlRight","Delete","Digit0","Digit1","Digit2","Digit3","Digit4","Digit5","Digit6","Digit7","Digit8","Digit9","End","Enter","Equal","Escape","F1","F10","F11","F12","F13","F14","F15","F16","F17","F18","F19","F2","F20","F21","F22","F23","F24","F25","F26","F27","F28","F29","F3","F30","F31","F32","F4","F5","F6","F7","F8","F9","Home","IntlBackslash","IntlRo","IntlYen","KeyA","KeyB","KeyC","KeyD","KeyE","KeyF","KeyG","KeyH","KeyI","KeyJ","KeyK","KeyL","KeyM","KeyN","KeyO","KeyP","KeyQ","KeyR","KeyS","KeyT","KeyU","KeyV","KeyW","KeyX","KeyY","KeyZ","Lang1","Lang2","MediaTrackNext","MediaTrackPrevious","MetaLeft","MetaRight","Minus","NumLock","Numpad0","Numpad1","Numpad2","Numpad3","Numpad4","Numpad5","Numpad6","Numpad7","Numpad8","Numpad9","NumpadAdd","NumpadComma","NumpadDecimal","NumpadDivide","NumpadMultiply","NumpadSubtract","OSLeft","Pause","Period","Quote","ScrollLock","Semicolon","ShiftLeft","ShiftRight","Slash","Space","Tab","VolumeDown","VolumeMute","VolumeUp","WakeUp","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","result","done","adopt","then","apply","_navigatorLayoutMap","_keyLabels","SuppressedError","MACRO_AZERTY","MACRO_JCUKEN","MACRO_QWERTZ","JCUKEN_REGEX","xxERTx_REGEX","inferKeyboardLayoutFromLang","lang","getLang","n","navigator","languages","userLanguage","language","browserLanguage","tag","macro","split","startsWith","_possibleLayouts","Set","getLayoutKeyLabel","DEFAULT_LABELS","getMetaKeyLabel","AZERTY","JCUKEN","QWERTY","QWERTZ","platform","userAgent","REPEATABLE_NAV_INTENTS","KeyboardDevice","detectLayoutOnKeypress","detected","_deferredKeydown","_layout","_layoutSource","requestKeyboardLayout","keyboard","getLayoutMap","layoutMap","q","z","layoutSource","_configureEventListeners","getKeyLabel","getNavigatorKeyLabel","_toLocaleTitleCase","input","word","charAt","toLocaleUpperCase","slice","join","_processDeferredKeydownEvent","k","d","window","addEventListener","code","passive","capture","keyCode","repeat","detectKeyboardLayoutFromKeydown","delete","size","keyLabel","InputDeviceManager","isMobile","check","vendor","substr","isTouchCapable","maxTouchPoints","requireFocus","clearInputInBackground","_devices","_gamepadDevices","_gamepadDeviceMap","_customDevices","_hasFocus","add","once","_pollGamepads","_removeGamepad","devices","gamepads","custom","lastInteractedDevice","_lastInteractedDevice","emitBind","indexOf","remove","customIndex","splice","devicesIndex","document","hasFocus","_updateLastInteracted","last","getGamepads","has","gamepadIndex","gamepadsIndex","InputDevice","registerPixiJSInputDeviceMixin","container","prototype","defineProperty","isInteractive","onEvents","configurable","enumerable"],"mappings":"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","x_google_ignoreList":[8]} \ No newline at end of file +{"version":3,"file":"index.mjs","sources":["../src/lib/devices/gamepads/buttons.ts","../src/lib/utils/throttle.ts","../src/lib/utils/events.ts","../src/lib/devices/gamepads/GamepadDevice.ts","../src/lib/devices/gamepads/layouts.ts","../src/lib/devices/keyboard/keys.ts","../node_modules/tslib/tslib.es6.js","../src/lib/devices/keyboard/layouts.ts","../src/lib/devices/keyboard/KeyboardDevice.ts","../src/lib/InputDevice.ts","../src/lib/utils/detectors.ts","../src/lib/navigation/Navigatable.ts","../src/lib/navigation/NavigationIntent.ts","../src/lib/navigation/UINavigation.ts","../src/Container.mixin.ts"],"sourcesContent":[null,null,null,null,null,null,"/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n function next() {\r\n while (env.stack.length) {\r\n var rec = env.stack.pop();\r\n try {\r\n var result = rec.dispose && rec.dispose.call(rec.value);\r\n if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n};\r\n",null,null,null,null,null,null,null,null],"names":["Axis","AxisCode","Button","A","B","X","Y","LeftShoulder","RightShoulder","LeftTrigger","RightTrigger","Back","Start","LeftStickClick","RightStickClick","DPadUp","DPadDown","DPadLeft","DPadRight","ButtonCode","_cooldowns","Map","throttle","id","cooldownMs","now","Date","_a","get","undefined","set","EventEmitter","constructor","this","_listeners","hasListener","e","emit","payload","forEach","fn","on","event","push","off","filter","l","_b","length","GamepadDevice","configureDefaultBinds","binds","defaultOptions","Object","assign","pressedBind","name","options","pressedAny","btns","i","button","pressedAll","configureBinds","listener","_emitter","onBind","_bindEmitter","offBind","playVibration","duration","weakMagnitude","strongMagnitude","vibrationType","rightTrigger","leftTrigger","startDelay","vibration","enabled","source","vibrationActuator","intensity","playEffect","update","updatePresses","clear","reduce","obj","key","type","meta","lastInteraction","performance","JSON","parse","stringify","leftJoystick","x","y","rightJoystick","leftShoulder","rightShoulder","index","layout","detectLayout","gamepad","toLowerCase","test","joy","joystick","a","value","_scale","axes","deadzone","axisCode","Math","abs","threshold","throttleMs","autoRepeatDelayMs","setTimeout","device","axis","entries","values","includes","b","nintendoRemapMode","buttonCode","buttons","pressed","isPressed","_d","_c","tdz","trigger","jdz","range","scaled","sign","KeyCode","AltLeft","AltRight","ArrowDown","ArrowLeft","ArrowRight","ArrowUp","Backquote","Backslash","Backspace","BracketLeft","BracketRight","CapsLock","Comma","ContextMenu","ControlLeft","ControlRight","Delete","Digit0","Digit1","Digit2","Digit3","Digit4","Digit5","Digit6","Digit7","Digit8","Digit9","End","Enter","Equal","Escape","F1","F10","F11","F12","F13","F14","F15","F16","F17","F18","F19","F2","F20","F21","F22","F23","F24","F25","F26","F27","F28","F29","F3","F30","F31","F32","F4","F5","F6","F7","F8","F9","Home","IntlBackslash","IntlRo","IntlYen","KeyA","KeyB","KeyC","KeyD","KeyE","KeyF","KeyG","KeyH","KeyI","KeyJ","KeyK","KeyL","KeyM","KeyN","KeyO","KeyP","KeyQ","KeyR","KeyS","KeyT","KeyU","KeyV","KeyW","KeyX","KeyY","KeyZ","Lang1","Lang2","MediaTrackNext","MediaTrackPrevious","MetaLeft","MetaRight","Minus","NumLock","Numpad0","Numpad1","Numpad2","Numpad3","Numpad4","Numpad5","Numpad6","Numpad7","Numpad8","Numpad9","NumpadAdd","NumpadComma","NumpadDecimal","NumpadDivide","NumpadMultiply","NumpadSubtract","OSLeft","Pause","Period","Quote","ScrollLock","Semicolon","ShiftLeft","ShiftRight","Slash","Space","Tab","VolumeDown","VolumeMute","VolumeUp","WakeUp","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","result","done","adopt","then","apply","_navigatorLayoutMap","_keyLabels","SuppressedError","MACRO_AZERTY","MACRO_JCUKEN","MACRO_QWERTZ","JCUKEN_REGEX","xxERTx_REGEX","inferKeyboardLayoutFromLang","lang","getLang","n","navigator","languages","userLanguage","language","browserLanguage","tag","macro","split","startsWith","_possibleLayouts","Set","getLayoutKeyLabel","DEFAULT_LABELS","getMetaKeyLabel","AZERTY","JCUKEN","QWERTY","QWERTZ","platform","userAgent","KeyboardDevice","detectLayoutOnKeypress","detected","repeatableBinds","keys","_deferredKeydown","_layout","_layoutSource","requestKeyboardLayout","keyboard","getLayoutMap","layoutMap","q","z","layoutSource","_configureEventListeners","getKeyLabel","getNavigatorKeyLabel","_toLocaleTitleCase","input","map","word","charAt","toLocaleUpperCase","slice","join","_processDeferredKeydownEvent","k","d","window","addEventListener","code","passive","capture","keyCode","repeat","detectKeyboardLayoutFromKeydown","delete","size","keyLabel","global","InputDeviceManager","isMobile","check","vendor","substr","isTouchCapable","maxTouchPoints","requireFocus","clearInputInBackground","_devices","_gamepadDevices","_gamepadDeviceMap","_customDevices","_hasFocus","add","once","_pollGamepads","_removeGamepad","devices","gamepads","custom","lastInteractedDevice","_lastInteractedDevice","Array","isArray","emitBind","indexOf","remove","customIndex","splice","devicesIndex","document","hasFocus","_updateLastInteracted","last","getGamepads","has","gamepadIndex","gamepadsIndex","InputDevice","getAllNavigatables","target","navigatables","child","children","isNavigatable","getFirstNavigatable","root","currentFocus","nearestDirection","minimumDistance","chooseFirstNavigatableInDirection","elements","el","parent","isVisible","focusedElement","find","sort","navigationPriority","fallbackElement","floor","random","focusedGlobalPos","getGlobalPosition","focusedBounds","getBounds","focusedCenter","left","width","top","height","otherElements","globalPos","bounds","center","element","xDistSqrd","weightedDistSquared","yDistSqrd","_e","_g","_f","_j","_h","isChildOf","xw","yw","dx","dy","visible","navigationIntents","NavigationManager","useFallbackHoverEffect","minimumDirectionDistance","_responders","focusTarget","responders","res","_rootFocused","previous","responderStage","getResponderStage","_emitBlur","_emitFocus","firstResponder","configureWithRoot","stage","_root","_propagate","popResponder","previousFocused","responder","shift","nextFocused","resignedAsFirstResponder","_invalidateFocusedIfNeeded","becameFirstResponder","autoFocus","pushResponder","Error","previousResponder","unshift","call","UINavigation","navigatable","console","debug","isContainer","handledNavigationIntent","_handleGlobalIntent","intent","_emitTrigger","nextTarget","eventNames","alpha","_registered","registerPixiJSNavigationMixin","container","prototype","navigationMode","defineProperty","onEvents","configurable","enumerable"],"mappings":"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","x_google_ignoreList":[6]} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 344013f..ba28679 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pixijs-input-devices", - "version": "0.2.4", + "version": "0.4.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "pixijs-input-devices", - "version": "0.2.4", + "version": "0.4.0", "license": "MIT", "devDependencies": { "@rollup/plugin-commonjs": "^26.0.1", diff --git a/package.json b/package.json index 7dd4c03..62ddb01 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pixijs-input-devices", - "version": "0.4.0", + "version": "0.5.0", "author": "Reece Como ", "authors": [ "Reece Como " diff --git a/src/Container.mixin.ts b/src/Container.mixin.ts index 2d64135..d97afa3 100644 --- a/src/Container.mixin.ts +++ b/src/Container.mixin.ts @@ -1,10 +1,15 @@ +let _registered = false; + /** * Register the mixin for PIXI.Container. * * @param container A reference to `PIXI.Container`. */ -export function registerPixiJSInputDeviceMixin(container: any): void +export function registerPixiJSNavigationMixin( container: any ): void { + if (_registered) return; + _registered = true; + const prototype = container.prototype; // - Properties: @@ -15,17 +20,19 @@ export function registerPixiJSInputDeviceMixin(container: any): void Object.defineProperty(prototype, "isNavigatable", { get: function(): boolean { - if ( this.navigationMode === "auto" ) - { - if ( ! this.isInteractive ) return false; + if ( this.navigationMode === "target" ) return true; + if ( this.navigationMode === "none" ) return false; - const onEvents = this.eventNames(); + // if ( + // this.interactive === false + // || (this.isInteractive !== undefined) + // && !this.isInteractive() + // ) return false; - return onEvents.includes("pointerdown") - || onEvents.includes("mousedown"); - } + const onEvents = this.eventNames(); - return this.navigationMode === "target"; + return onEvents.includes("pointerdown") + || onEvents.includes("mousedown"); }, configurable: true, enumerable: false, diff --git a/src/index.ts b/src/index.ts index d18ab64..93c8f61 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,11 +1,11 @@ export * from "./lib/devices/CustomDevice"; -export * from "./lib/devices/GamepadDevice"; +export * from "./lib/devices/gamepads/GamepadDevice"; export * from "./lib/InputDevice"; -export * from "./lib/devices/KeyboardDevice"; +export * from "./lib/devices/keyboard/KeyboardDevice"; // Navigation export * from "./lib/navigation/Navigatable"; -export * from "./lib/navigation/Navigation"; +export * from "./lib/navigation/UINavigation"; export * from "./lib/navigation/NavigationIntent"; export * from "./lib/navigation/NavigationResponder"; export * from "./lib/navigation/NavigationTargetEvent"; diff --git a/src/lib/InputDevice.ts b/src/lib/InputDevice.ts index 746180e..46dc754 100644 --- a/src/lib/InputDevice.ts +++ b/src/lib/InputDevice.ts @@ -1,6 +1,6 @@ import { CustomDevice } from "./devices/CustomDevice"; -import { GamepadDevice } from "./devices/GamepadDevice"; -import { KeyboardDevice } from "./devices/KeyboardDevice"; +import { GamepadDevice } from "./devices/gamepads/GamepadDevice"; +import { KeyboardDevice } from "./devices/keyboard/KeyboardDevice"; import { isMobile, isTouchCapable } from "./utils/detectors"; import { EventEmitter } from "./utils/events"; @@ -12,9 +12,9 @@ export interface InputDeviceEvent { export type Device = GamepadDevice | KeyboardDevice | CustomDevice; -type NamedBindEvent = { +export type NamedBindEvent = { device: Device; - name: string; + name: BindName; } class InputDeviceManager @@ -127,23 +127,26 @@ class InputDeviceManager return this; } - /** Add a named bind event listener (or all if none provided). */ - public onBind( - name: string, - listener: ( event: NamedBindEvent ) => void + /** Adds a named bind event listener. */ + public onBind( + name: N | readonly N[], + listener: ( event: NamedBindEvent ) => void ): this { - this._bindEmitter.on( name, listener ); + name = Array.isArray( name ) ? name : [name]; + name.forEach( n => this._bindEmitter.on( n, listener ) ); return this; } /** Remove a named bind event listener (or all if none provided). */ public offBind( - name: string, + name: string | string[], listener?: ( event: NamedBindEvent ) => void ): this { - this._bindEmitter.off( name, listener ); + name = Array.isArray( name ) ? name : [name]; + name.forEach( n => this._bindEmitter.off( n, listener ) ); + return this; } diff --git a/src/lib/devices/__tests__/GamepadDevice.test.ts b/src/lib/devices/__tests__/GamepadDevice.test.ts index faf77a5..01a712c 100644 --- a/src/lib/devices/__tests__/GamepadDevice.test.ts +++ b/src/lib/devices/__tests__/GamepadDevice.test.ts @@ -1,4 +1,4 @@ -import { Button, GamepadDevice } from "../GamepadDevice"; +import { Button, GamepadDevice } from "../gamepads/GamepadDevice"; import { Axis } from "../gamepads/buttons"; import { mockGamepadSource } from "./__fixtures__/gamepad"; @@ -7,10 +7,10 @@ describe( "GamepadDevice", () => describe( "layout", () => { it.each([ - [ "generic", "8Bitdo SF30 Pro (Vendor: 2dc8 Product: 6000)" ], - [ "generic", "Generic Game Controller" ], - [ "generic", "UNKNOWN" ], - [ "generic", "USB JOYSTICK PS3 (Vendor: 1f4f Product: 0008)" ], + [ "standard", "8Bitdo SF30 Pro (Vendor: 2dc8 Product: 6000)" ], + [ "standard", "Generic Game Controller" ], + [ "standard", "UNKNOWN" ], + [ "standard", "USB JOYSTICK PS3 (Vendor: 1f4f Product: 0008)" ], [ "logitech", "046d-c216-Logitech Dual Action" ], // Firefox [ "logitech", "46d-c216-Logicool Dual Action" ], // Safari [ "logitech", "Input device (Vendor: 046D Product: C216)" ], @@ -33,7 +33,6 @@ describe( "GamepadDevice", () => id: input, }); const gamepad = new GamepadDevice( source ); - gamepad.options.navigation.enabled = false; expect( gamepad.layout ).toBe( expected ); }); @@ -45,7 +44,6 @@ describe( "GamepadDevice", () => { const source = mockGamepadSource(); const gamepad = new GamepadDevice( source ); - gamepad.options.navigation.enabled = false; gamepad.options.binds = { jump: [ "A", "B" ], @@ -82,37 +80,45 @@ describe( "GamepadDevice", () => }); }); - describe( "buttons and triggers", () => + it( "maps axis, buttons and triggers", () => { - it( "maps triggers", () => - { - const source = mockGamepadSource(); - const gamepad = new GamepadDevice( source ); - gamepad.options.navigation.enabled = false; - - (source.buttons[Button.A] as any).pressed = true; - (source.buttons[Button.RightTrigger] as any).pressed = true; - (source.buttons[Button.RightTrigger] as any).value = 0.67; - (source.buttons[Button.RightStick] as any).pressed = true; - (source.axes[Axis.LeftStickX] as any) = 0.55; - (source.axes[Axis.RightStickY] as any) = -0.33; - - gamepad.update( source, Date.now() ); - - // triggers - expect( gamepad.leftTrigger ).toBe( 0.0 ); - expect( gamepad.rightTrigger ).toBe( 0.67 ); - - // joysticks - expect( gamepad.leftJoystick.x ).toBe( 0.55 ); - expect( gamepad.leftJoystick.y ).toBe( 0.0 ); - expect( gamepad.rightJoystick.x ).toBe( 0.0 ); - expect( gamepad.rightJoystick.y ).toBe( -0.33 ); - - // buttons - expect( gamepad.button.A ).toBe( true ); - expect( gamepad.button.RightStick ).toBe( true ); - }); + const source = mockGamepadSource(); + const gamepad = new GamepadDevice( source ); + + (source.buttons[Button.A] as any).pressed = true; + (source.buttons[Button.RightTrigger] as any).pressed = true; + (source.buttons[Button.RightTrigger] as any).value = 0.67; + (source.buttons[Button.RightStickClick] as any).pressed = true; + (source.axes[Axis.LeftStickX] as any) = 0.55; + (source.axes[Axis.RightStickY] as any) = -0.15; + + gamepad.update( source, Date.now() ); + + // buttons + expect( gamepad.button.A ).toBe( true ); + expect( gamepad.button.RStick ).toBe( true ); + + // joysticks + expect( gamepad.leftJoystick.x ).toBe( 0.55 ); + expect( gamepad.leftJoystick.y ).toBe( 0.0 ); + expect( gamepad.button.LeftStickLeft ).toBe( false ); + expect( gamepad.button.LeftStickDown ).toBe( false ); + expect( gamepad.button.LeftStickUp ).toBe( false ); + expect( gamepad.button.LeftStickRight ).toBe( true ); + + expect( gamepad.rightJoystick.x ).toBe( 0.0 ); + expect( gamepad.rightJoystick.y ).toBe( -0.15 ); + expect( gamepad.button.RightStickLeft ).toBe( false ); + expect( gamepad.button.RightStickDown ).toBe( false ); + expect( gamepad.button.RightStickUp ).toBe( false ); + expect( gamepad.button.RightStickRight ).toBe( false ); + + // triggers + expect( gamepad.leftTrigger ).toBe( 0.0 ); + expect( gamepad.button.LeftTrigger ).toBe( false ); + + expect( gamepad.rightTrigger ).toBe( 0.67 ); + expect( gamepad.button.RightTrigger ).toBe( true ); }); describe( "nintendo layout remapping options", () => @@ -123,12 +129,11 @@ describe( "GamepadDevice", () => id: "Nintendo Switch Pro" }); const gamepad = new GamepadDevice( source ); - gamepad.options.navigation.enabled = false; // sanity check: expect( gamepad.layout ).toBe( "nintendo" ); - gamepad.options.remapNintendoMode = "none"; + gamepad.options.nintendoRemapMode = "none"; (source.buttons[0] as any).pressed = true; (source.buttons[2] as any).pressed = true; gamepad.update( source, Date.now() ); @@ -137,14 +142,14 @@ describe( "GamepadDevice", () => expect( gamepad.button.X ).toBe( true ); expect( gamepad.button.Y ).toBe( false ); - gamepad.options.remapNintendoMode = "accurate"; + gamepad.options.nintendoRemapMode = "accurate"; gamepad.update( source, Date.now() ); expect( gamepad.button.A ).toBe( true ); expect( gamepad.button.B ).toBe( true ); // B (1) is now Nintendo "B" expect( gamepad.button.X ).toBe( false ); // X (2) is now Nintendo "X" expect( gamepad.button.Y ).toBe( false ); - gamepad.options.remapNintendoMode = "physical"; + gamepad.options.nintendoRemapMode = "physical"; gamepad.update( source, Date.now() ); expect( gamepad.button.A ).toBe( false ); // A (0) is now Nintendo "B" expect( gamepad.button.B ).toBe( true ); // B (1) is now Nintendo "A" diff --git a/src/lib/devices/__tests__/KeyboardDevice.test.ts b/src/lib/devices/__tests__/KeyboardDevice.test.ts index f7fed67..b27212b 100644 --- a/src/lib/devices/__tests__/KeyboardDevice.test.ts +++ b/src/lib/devices/__tests__/KeyboardDevice.test.ts @@ -1,4 +1,4 @@ -import { KeyboardDevice } from "../KeyboardDevice"; +import { KeyboardDevice } from "../keyboard/KeyboardDevice"; describe( "KeyboardDevice", () => { @@ -8,7 +8,6 @@ describe( "KeyboardDevice", () => { const now = Date.now(); const keyboard = KeyboardDevice.global; - keyboard.options.navigation.enabled = false; keyboard.options.binds = { jump: [ "Space", "ControlLeft" ], diff --git a/src/lib/devices/__tests__/Navigation.test.ts b/src/lib/devices/__tests__/Navigation.test.ts new file mode 100644 index 0000000..17dc227 --- /dev/null +++ b/src/lib/devices/__tests__/Navigation.test.ts @@ -0,0 +1,97 @@ +import { Container } from "pixi.js"; + +import { UINavigation } from "../../navigation/UINavigation"; +import { registerPixiJSNavigationMixin } from "../../../Container.mixin"; +import { InputDevice } from "../../InputDevice"; + +beforeAll( () => registerPixiJSNavigationMixin(Container) ); + +describe( "Navigation", () => +{ + it( "does the thing", () => + { + jest.useFakeTimers(); + + const stageContainer = new Container(); + + let buttonWasTriggered = false; + + const button1 = new Container(); + button1.x = -100; + button1.interactive = true; + button1.on( "pointerdown", () => + { + // do something + buttonWasTriggered = true; + } ); + + expect( button1.isNavigatable ).toBe( true ); + + const menu = new Container(); + const menuItem1 = new Container(); + const menuItem2 = new Container(); + menu.addChild( menuItem1, menuItem2 ); + menu.x = 100; + menuItem1.y = -50; + menuItem1.navigationMode = "target"; + menuItem2.y = 50; + menuItem2.navigationMode = "target"; + + stageContainer.addChild( + button1, + menu, + ); + + expect( UINavigation.getResponderStage() ).toBe( undefined ); + expect( UINavigation.enabled ).toBe( false ); + + UINavigation.configureWithRoot( stageContainer ); + UINavigation.autoFocus(); + + expect( UINavigation.getResponderStage() ).toBe( stageContainer ); + expect( UINavigation.focusTarget === button1 ).toBe( true ); + + expect( buttonWasTriggered ).toBe( false ); + + InputDevice.emitBind({ + name: "navigate.trigger", + device: InputDevice.keyboard, // any + }); + + expect( buttonWasTriggered ).toBe( true ); + + InputDevice.emitBind({ + name: "navigate.right", + device: InputDevice.keyboard, // any + }); + + expect( UINavigation.focusTarget === menuItem1 ).toBe( true ); + + // add a responder to set the new top-most interaction target + UINavigation.pushResponder( menu ); + + // now try to go back + InputDevice.emitBind({ + name: "navigate.left", + device: InputDevice.keyboard, // any + }); + + expect( UINavigation.focusTarget === menuItem1 ).toBe( true ); + + UINavigation.popResponder(); + + // now try to go back again + InputDevice.emitBind({ + name: "navigate.left", + device: InputDevice.keyboard, // any + }); + + expect( UINavigation.focusTarget === menuItem1 ).toBe( false ); + expect( UINavigation.focusTarget === button1 ).toBe( true ); + }); +}); + +afterEach(() => +{ + jest.useRealTimers(); +}); diff --git a/src/lib/devices/GamepadDevice.ts b/src/lib/devices/gamepads/GamepadDevice.ts similarity index 59% rename from src/lib/devices/GamepadDevice.ts rename to src/lib/devices/gamepads/GamepadDevice.ts index 2d78ef7..feb3f8f 100644 --- a/src/lib/devices/GamepadDevice.ts +++ b/src/lib/devices/gamepads/GamepadDevice.ts @@ -1,16 +1,14 @@ /* eslint-disable brace-style */ -import { Axis, Button, ButtonCode } from "./gamepads/buttons"; -import { detectLayout, GamepadLayout } from "./gamepads/layouts"; -import { Navigation } from "../navigation/Navigation"; -import { NavigationIntent } from "../navigation/NavigationIntent"; -import { throttle } from "../utils/throttle"; -import { EventEmitter } from "../utils/events"; +import { Axis, AxisCode, Button, ButtonCode } from "./buttons"; +import { detectLayout, GamepadLayout } from "./layouts"; +import { throttle } from "../../utils/throttle"; +import { EventEmitter } from "../../utils/events"; -export { Button, GamepadLayout as GamepadPlatform }; +export { Button, GamepadLayout }; -type RemapNintendoMode = "none" | "accurate" | "physical"; +type NintendoRemapMode = "none" | "accurate" | "physical"; export type GamepadVibration = GamepadEffectParameters & { vibrationType?: GamepadHapticEffectType }; export type GamepadButtonDownEvent = ( gamepad: GamepadDevice, button: Button ) => void; @@ -21,19 +19,40 @@ export interface GamepadButtonPressEvent { buttonCode: ButtonCode; } -export interface GamepadNamedBindButtonPressEvent extends GamepadButtonPressEvent { +export interface GamepadAxisEvent { + device: GamepadDevice; + axis: Axis; + axisCode: AxisCode; +} + +export type GamepadNamedBindEvent = { + device: GamepadDevice; name: string; + type: "button"; + button: Button; + buttonCode: ButtonCode; +} | { + device: GamepadDevice; + name: string; + type: "axis"; + axis: Axis; + axisCode: AxisCode; } // eslint-disable-next-line @typescript-eslint/ban-types export type GamepadDeviceEvent = { - bind: GamepadNamedBindButtonPressEvent; + bind: GamepadNamedBindEvent; } & { - [button in ButtonCode]: GamepadButtonPressEvent; + [axis in AxisCode]: GamepadAxisEvent; } & { - [button in Button]: GamepadButtonPressEvent; + [button in ButtonCode]: GamepadButtonPressEvent; }; +/** + * Bindable codes for button and joystick events. + */ +export type BindableCode = ButtonCode | AxisCode; + /** * A gamepad (game controller). * @@ -45,6 +64,17 @@ export type GamepadDeviceEvent = { */ export class GamepadDevice { + /** Set named binds for newly connected gamepads */ + public static configureDefaultBinds( + binds: Partial> + ): void + { + this.defaultOptions.binds = { + ...this.defaultOptions.binds, + ...binds, + }; + } + public static defaultOptions = { /** * When set to `"physical"` _(default)_, ABXY refer to the equivalent @@ -56,7 +86,7 @@ export class GamepadDevice * When set to `"none"`, ABXY refer to the unmapped buttons in the 0, 1, * 2, and 3 positions respectively. */ - remapNintendoMode: "physical" as RemapNintendoMode, + nintendoRemapMode: "physical" as NintendoRemapMode, /** * Create named binds of buttons. @@ -66,6 +96,7 @@ export class GamepadDevice * @example * // set by names * Gamepad.defaultOptions.binds = { + * ...Gamepad.defaultOptions.binds, * jump: [ "A" ], * crouch: [ "X" ], * } @@ -76,43 +107,49 @@ export class GamepadDevice * // ... * } */ - binds: {} as Partial>, - - navigation: { - enabled: true, - - binds: { - [ Button.A ]: "trigger", - [ Button.B ]: "navigateBack", - [ Button.Back ]: "navigateBack", - [ Button.DPadDown ]: "navigateDown", - [ Button.DPadLeft ]: "navigateLeft", - [ Button.DPadRight ]: "navigateRight", - [ Button.DPadUp ]: "navigateUp", - } as Partial>, - - joystick: { - commitSensitivity: 0.5, - repeatCooldownMs: 80, - firstRepeatCooldownMs: 400, - }, + binds: { + "navigate.back": [ "B", "Back" ], + "navigate.down": [ "DPadDown", "LeftStickDown" ], + "navigate.left": [ "DPadLeft", "LeftStickLeft" ], + "navigate.right": [ "DPadRight", "LeftStickRight" ], + "navigate.trigger": [ "A" ], + "navigate.up": [ "DPadUp", "LeftStickUp" ], + } as Partial>, + + joystick: { + /** + * The range of movement in a joystick recognized as input, to + * prevent unintended movements caused by imprecision or wear. + * + * @default [ 0, 1 ] + */ + deadzone: [0.0, 1.0] satisfies [ min: number, max: number ], + + /** + * The threshold joysticks must reach to emit navigation and bind events. + * + * @default 0.25 + */ + threshold: 0.25, + + /** + * The amount of time (in milliseconds) between emitting axis events in a + * given direction, given as [first, subsequent]. + * + * @default [ delay: 400, repeat: 80 ] + */ + autoRepeatDelayMs: [400, 80] satisfies [ delay: number, subsequent: number ], }, - /** - * The range of movement in a joystick recognized as input, to - * prevent unintended movements caused by imprecision or wear. - * - * @default [ 0, 1 ] - */ - joystickDeadzone: [0.0, 1.0] satisfies [ min: number, max: number ], - - /** - * The range of movement in a trigger recognized as input, to - * revent unintended movements caused by imprecision or wear. - * - * @default [ 0, 1 ] - */ - triggerDeadzone: [0.0, 1.0] satisfies [ min: number, max: number ], + trigger: { + /** + * The range of movement in a trigger recognized as input, to + * revent unintended movements caused by imprecision or wear. + * + * @default [ 0, 1 ] + */ + deadzone: [0.0, 1.0] satisfies [ min: number, max: number ], + }, vibration: { enabled: true, @@ -147,20 +184,14 @@ export class GamepadDevice // ----- Joysticks: ----- - public readonly leftJoystick = { - x: 0.0, - y: 0.0, - }; - public readonly rightJoystick = { - x: 0.0, - y: 0.0, - }; + public readonly leftJoystick = { x: 0, y: 0 }; + public readonly rightJoystick = { x: 0, y: 0 }; // ----- Buttons: ----- /** Accessors for buttons */ - public button: Record = - Object.keys(Button).reduce( (obj, key) => + public button: Record = + [...ButtonCode, ...AxisCode ].reduce( (obj, key) => { obj[key] = false; return obj; @@ -168,12 +199,8 @@ export class GamepadDevice // ----- Internal: ----- - private _btnPrevState = new Array(16); - private _axisIntents = new Array(2); - private readonly _throttleIdLeftStickX: string; - private readonly _throttleIdLeftStickY: string; private readonly _emitter = new EventEmitter(); - private readonly _bindEmitter = new EventEmitter>(); + private readonly _bindEmitter = new EventEmitter>(); // ----- Triggers: ----- @@ -196,7 +223,7 @@ export class GamepadDevice } /** @returns true if any of the given buttons are pressed. */ - public pressedAny( btns: ButtonCode[] ): boolean + public pressedAny( btns: BindableCode[] ): boolean { for ( let i = 0; i < btns.length; i++ ) { @@ -207,7 +234,7 @@ export class GamepadDevice } /** @returns true if all of the given buttons are pressed. */ - public pressedAll( btns: ButtonCode[] ): boolean + public pressedAll( btns: BindableCode[] ): boolean { for ( let i = 0; i < btns.length; i++ ) { @@ -217,6 +244,15 @@ export class GamepadDevice return true; } + /** Set named binds for this gamepad */ + public configureBinds( binds: Partial> ): void + { + this.options.binds = { + ...this.options.binds, + ...binds, + }; + } + // ----- Events: ----- /** Add an event listener */ @@ -225,8 +261,7 @@ export class GamepadDevice listener: (event: GamepadDeviceEvent[K]) => void ): this { - const e = typeof event === "number" ? ButtonCode[event] : event; - this._emitter.on(e, listener); + this._emitter.on(event, listener); return this; } @@ -236,15 +271,14 @@ export class GamepadDevice listener?: (event: GamepadDeviceEvent[K]) => void ): this { - const e = typeof event === "number" ? ButtonCode[event] : event; - this._emitter.off(e, listener); + this._emitter.off(event, listener); return this; } /** Add a named bind event listener (or all if none provided). */ public onBind( name: string, - listener: ( event: GamepadNamedBindButtonPressEvent ) => void + listener: ( event: GamepadNamedBindEvent ) => void ): this { this._bindEmitter.on( name, listener ); @@ -254,7 +288,7 @@ export class GamepadDevice /** Remove a named bind event listener (or all if none provided). */ public offBind( name: string, - listener?: ( event: GamepadNamedBindButtonPressEvent ) => void + listener?: ( event: GamepadNamedBindEvent ) => void ): this { this._bindEmitter.off( name, listener ); @@ -311,23 +345,76 @@ export class GamepadDevice public clear(): void { - this._axisIntents = this._axisIntents.map(() => false); - this._btnPrevState = this._btnPrevState.map(() => false); + this.button = [...AxisCode, ...ButtonCode].reduce( (obj, key) => + { + obj[key] = false; + return obj; + }, {} as any ); } public constructor( public source: Gamepad ) { this.id = "gamepad" + source.index; this.layout = detectLayout( source ); - - // cooldown ids: - this._throttleIdLeftStickX = this.id + "-lsx"; - this._throttleIdLeftStickY = this.id + "-lsy"; } private updatePresses( source: Gamepad, now: number ): void { - const buttonCount = this._btnPrevState.length; + const axisCount = 4; + const buttonCount = 16; + const joy = this.options.joystick; + + // axis + for ( let a = 0; a < axisCount; a++ ) + { + const value = _scale( source.axes[a], joy.deadzone ); + const axisCode = AxisCode[a * 2 + ( value > 0 ? 1 : 0 )]; + + if ( Math.abs( value ) < joy.threshold ) + { + this.button[ axisCode ] = false; + } + else + { + const throttleMs = joy.autoRepeatDelayMs[+this.button[ axisCode ]]; + + this.button[ axisCode ] = true; + + if ( !throttle( axisCode, throttleMs ) ) + { + this.lastInteraction = now; + + // emit events + if ( this._emitter.hasListener( axisCode ) ) + { + setTimeout( () => this._emitter.emit( axisCode, { + device: this, + axis: a as Axis, + axisCode, + }) ); + } + + // check named bind events + Object.entries( this.options.binds ).forEach(([ name, values ]) => + { + if ( !values.includes(axisCode) ) return; + + setTimeout( () => { + const event: GamepadNamedBindEvent = { + device: this, + type: "axis", + axis: a as Axis, + axisCode, + name: name, + }; + + this._bindEmitter.emit( name, event ); + this._emitter.emit( "bind", event ); + }); + }); + } + } + } // buttons for (let _b = 0; _b < buttonCount; _b++) @@ -337,11 +424,12 @@ export class GamepadDevice // remap nintendo binds (if enabled) if ( this.layout === "nintendo" && - this.options.remapNintendoMode !== "none" + this.options.nintendoRemapMode !== "none" ) { - if ( this.options.remapNintendoMode === "physical" ) + if ( this.options.nintendoRemapMode === "physical" ) { + // physical: // set A,B,X,Y to be the equivalent physical positions if ( b === Button.B ) b = Button.A; else if ( b === Button.A ) b = Button.B; @@ -350,13 +438,16 @@ export class GamepadDevice } else { + // accurate: // set A,B,X,Y to match nintendo labels if ( b === Button.B ) b = Button.X; else if ( b === Button.X ) b = Button.B; } } - if ( this._btnPrevState[b] === source.buttons[_b]?.pressed ) + const buttonCode = ButtonCode[b]; + + if ( this.button[buttonCode] === source.buttons[_b]?.pressed ) { continue; // skip: no change } @@ -365,9 +456,6 @@ export class GamepadDevice // update const isPressed = source.buttons[_b]?.pressed ?? false; - const buttonCode = ButtonCode[b]; - - this._btnPrevState[b] = isPressed; this.button[buttonCode] = isPressed; if ( isPressed ) @@ -388,8 +476,9 @@ export class GamepadDevice if ( !buttons.includes(buttonCode) ) return; setTimeout( () => { - const event = { + const event: GamepadNamedBindEvent = { device: this, + type: "button", button: b, buttonCode, name: name, @@ -399,93 +488,22 @@ export class GamepadDevice this._emitter.emit( "bind", event ); }); }); - - // navigation - if ( - Navigation.options.enabled && - this.options.navigation.enabled && - this.options.navigation.binds[b] !== undefined - ) - { - setTimeout( () => - Navigation.commit( this.options.navigation.binds[b], this ) - ); - } } } // triggers - const tdz = this.options.triggerDeadzone; - this.leftTrigger = _scale( this.source.buttons[Button.LeftTrigger].value, tdz ); - this.rightTrigger = _scale( this.source.buttons[Button.RightTrigger].value, tdz ); - this.leftShoulder = _scale( this.source.buttons[Button.LeftShoulder].value, tdz ); - this.rightShoulder = _scale( this.source.buttons[Button.RightShoulder].value, tdz ); + const tdz = this.options.trigger.deadzone; + this.leftTrigger = _scale( source.buttons[Button.LeftTrigger].value, tdz ); + this.rightTrigger = _scale( source.buttons[Button.RightTrigger].value, tdz ); + this.leftShoulder = _scale( source.buttons[Button.LeftShoulder].value, tdz ); + this.rightShoulder = _scale( source.buttons[Button.RightShoulder].value, tdz ); // joysticks - const jdz = this.options.joystickDeadzone; + const jdz = joy.deadzone; this.leftJoystick.x = _scale( source.axes[Axis.LeftStickX] ?? 0, jdz ); this.leftJoystick.y = _scale( source.axes[Axis.LeftStickY] ?? 0, jdz); this.rightJoystick.x = _scale( source.axes[Axis.RightStickX] ?? 0, jdz ); this.rightJoystick.y = _scale( source.axes[Axis.RightStickY] ?? 0, jdz ); - - if ( - this.leftJoystick.x !== 0 - || this.leftJoystick.y !== 0 - || this.rightJoystick.x !== 0 - || this.rightJoystick.y !== 0 - ) this.lastInteraction = now; - - const jnav = this.options.navigation.joystick; - - // left joystick navigation: left/right - if ( Math.abs( this.leftJoystick.x ) >= jnav.commitSensitivity ) - { - const xIntent: NavigationIntent = this.leftJoystick.x < 0 ? "navigateLeft" : "navigateRight"; - - // if we sent an intent too recently, this will slow us down. - const cooldownDuration = this._axisIntents[ Axis.LeftStickX ] - ? jnav.repeatCooldownMs - : jnav.firstRepeatCooldownMs; - - this._axisIntents[ Axis.LeftStickX ] = true; - - if ( - this.options.navigation.enabled && - !throttle( this._throttleIdLeftStickX, cooldownDuration ) - ) - { - setTimeout( () => Navigation.commit( xIntent, this ) ); - } - } - else - { - this._axisIntents[ Axis.LeftStickX ] = false; - } - - // left joystick navigation: up/down - if ( Math.abs( this.leftJoystick.y ) >= jnav.commitSensitivity ) - { - const yIntent: NavigationIntent = this.leftJoystick.y < 0 ? "navigateUp" : "navigateDown"; - - // if we sent an intent too recently, this will slow us down. - const cooldownDuration = this._axisIntents[ Axis.LeftStickY ] - ? jnav.repeatCooldownMs - : jnav.firstRepeatCooldownMs; - - this._axisIntents[ Axis.LeftStickY ] = true; - - if ( - this.options.navigation.enabled && - !throttle( this._throttleIdLeftStickY, cooldownDuration ) - ) - { - setTimeout( () => Navigation.commit( yIntent, this ) ); - } - } - else - { - this._axisIntents[ Axis.LeftStickY ] = false; - } } } diff --git a/src/lib/devices/gamepads/buttons.ts b/src/lib/devices/gamepads/buttons.ts index adb5535..d791862 100644 --- a/src/lib/devices/gamepads/buttons.ts +++ b/src/lib/devices/gamepads/buttons.ts @@ -4,6 +4,19 @@ export const Axis = { RightStickX: 2, RightStickY: 3, } as const; +export type Axis = (typeof Axis)[keyof typeof Axis]; + +export const AxisCode = [ + "LeftStickLeft", + "LeftStickRight", + "LeftStickUp", + "LeftStickDown", + "RightStickLeft", + "RightStickRight", + "RightStickUp", + "RightStickDown", +] as const; +export type AxisCode = typeof AxisCode[number]; export const Button = { /** A Button (Xbox / Nintendo: "A", PlayStation: "Cross") */ @@ -27,9 +40,9 @@ export const Button = { /** Start Button (Xbox: "Start", PlayStation: "Options", Nintendo: "Plus") */ Start: 9, /** Left Stick Press (Xbox / PlayStation: "LS", Nintendo: "L3") */ - LeftStick: 10, + LeftStickClick: 10, /** Right Stick Press (Xbox / PlayStation: "RS", Nintendo: "R3") */ - RightStick: 11, + RightStickClick: 11, /** D-Pad Up */ DPadUp: 12, /** D-Pad Down */ @@ -53,8 +66,8 @@ export const ButtonCode = [ "RightTrigger", "Back", "Start", - "LeftStick", - "RightStick", + "LStick", + "RStick", "DPadUp", "DPadDown", "DPadLeft", @@ -74,8 +87,8 @@ export type GamepadButtons = { [Button.RightTrigger]: GamepadButton, [Button.Back]: GamepadButton, [Button.Start]: GamepadButton, - [Button.LeftStick]: GamepadButton, - [Button.RightStick]: GamepadButton, + [Button.LeftStickClick]: GamepadButton, + [Button.RightStickClick]: GamepadButton, [Button.DPadUp]: GamepadButton, [Button.DPadDown]: GamepadButton, [Button.DPadLeft]: GamepadButton, diff --git a/src/lib/devices/gamepads/layouts.ts b/src/lib/devices/gamepads/layouts.ts index 5796d12..13b35e4 100644 --- a/src/lib/devices/gamepads/layouts.ts +++ b/src/lib/devices/gamepads/layouts.ts @@ -3,7 +3,7 @@ * * Note: Non-comprehensive list, covers the most brands only. */ -export type GamepadLayout = "logitech" | "nintendo" | "playstation" | "steam" | "xbox" | "generic"; +export type GamepadLayout = "logitech" | "nintendo" | "playstation" | "steam" | "xbox" | "standard"; /** * Automatically detect layout from Gamepad API `id` field. @@ -22,5 +22,5 @@ export function detectLayout( gamepad: Gamepad ): GamepadLayout if ( /(dualshock|dualsense|sony|054c|0ce6|0810)/.test( id ) ) return "playstation"; if ( /(xbox|xinput|045e|028e|0291|02a0|02a1|02ea|02ff)/.test( id ) ) return "xbox"; - return "generic"; + return "standard"; } diff --git a/src/lib/devices/KeyboardDevice.ts b/src/lib/devices/keyboard/KeyboardDevice.ts similarity index 80% rename from src/lib/devices/KeyboardDevice.ts rename to src/lib/devices/keyboard/KeyboardDevice.ts index b81d9c0..817ead4 100644 --- a/src/lib/devices/KeyboardDevice.ts +++ b/src/lib/devices/keyboard/KeyboardDevice.ts @@ -1,8 +1,14 @@ -import { KeyCode } from "./keyboard/keys"; -import { requestKeyboardLayout, getLayoutKeyLabel, inferKeyboardLayoutFromLang, KeyboardLayout, KeyboardLayoutSource, detectKeyboardLayoutFromKeydown, getNavigatorKeyLabel } from "./keyboard/layouts"; -import { NavigationIntent, REPEATABLE_NAV_INTENTS } from "../navigation/NavigationIntent"; -import { Navigation } from "../navigation/Navigation"; -import { EventEmitter } from "../utils/events"; +import { KeyCode } from "./keys"; +import { EventEmitter } from "../../utils/events"; +import { + requestKeyboardLayout, + getLayoutKeyLabel, + inferKeyboardLayoutFromLang, + KeyboardLayout, + KeyboardLayoutSource, + detectKeyboardLayoutFromKeydown, + getNavigatorKeyLabel +} from "./layouts"; export { KeyCode, KeyboardLayout }; @@ -23,6 +29,7 @@ export interface KeyboardDeviceLayoutUpdatedEvent { export interface KeyboardDeviceNamedBindKeydownEvent extends KeyboardDeviceKeydownEvent { name: string; + repeat: boolean; } export type KeyboardDeviceEvent = { @@ -32,8 +39,6 @@ export type KeyboardDeviceEvent = { [key in KeyCode]: KeyboardDeviceKeydownEvent; }; -type NavigationBinds = Partial>; - export class KeyboardDevice { public static global = new KeyboardDevice(); @@ -83,26 +88,27 @@ export class KeyboardDevice * // ... * } */ - binds: {} as Partial>, - - navigation: { - enabled: true, - - binds: { - "Space": "trigger", - "Enter": "trigger", - "Escape": "navigateBack", - "Backspace": "navigateBack", - "ArrowDown": "navigateDown", - "ArrowLeft": "navigateLeft", - "ArrowRight": "navigateRight", - "ArrowUp": "navigateUp", - "KeyA": "navigateLeft", - "KeyD": "navigateRight", - "KeyS": "navigateDown", - "KeyW": "navigateUp", - } as NavigationBinds, - }, + binds: { + "navigate.back": [ "Escape", "Backspace" ], + "navigate.down": [ "ArrowDown", "KeyS" ], + "navigate.left": [ "ArrowLeft", "KeyA" ], + "navigate.right": [ "ArrowRight", "KeyD" ], + "navigate.trigger": [ "Enter", "Space" ], + "navigate.up": [ "ArrowUp", "KeyW" ], + } as Partial>, + + /** + * These are the binds that are allowed to repeat when a key + * is held down. + * + * @default ["navigate.down", "navigate.left", "navigate.right", "navigate.up"] + */ + repeatableBinds: [ + "navigate.down", + "navigate.left", + "navigate.right", + "navigate.up", + ] }; /** Accessors for keys */ @@ -210,6 +216,15 @@ export class KeyboardDevice return true; } + /** Set custom binds */ + public configureBinds( binds: Partial> ): void + { + this.options.binds = { + ...this.options.binds, + ...binds, + }; + } + // ----- Events: ----- /** Add an event listener. */ @@ -225,7 +240,7 @@ export class KeyboardDevice /** Remove an event listener (or all if none provided). */ public off( event: K, - listener: (event: KeyboardDeviceEvent[K]) => void + listener?: (event: KeyboardDeviceEvent[K]) => void ): this { this._emitter.off(event, listener); @@ -361,43 +376,31 @@ export class KeyboardDevice event: e, })); } - - // check named binds - Object.entries( this.options.binds ).forEach(([ name, keys ]) => - { - if ( !keys.includes( keyCode ) ) return; - - setTimeout( () => - { - const event = { - device: this, - keyCode, - keyLabel: this.getKeyLabel( keyCode ), - event: e, - name: name, - }; - - this._bindEmitter.emit( name, event ); - this._emitter.emit( "bind", event ); - }); - }); } - // navigation - if ( - Navigation.options.enabled && - this.options.navigation.enabled && - this.options.navigation.binds[keyCode] !== undefined - ) + // check named binds + Object.entries( this.options.binds ).forEach(([ name, keys ]) => { - const intent = this.options.navigation.binds[keyCode]!; - - if ( !e.repeat || REPEATABLE_NAV_INTENTS.includes(intent) ) + if ( !keys.includes( keyCode ) ) return; + if ( e.repeat && !this.options.repeatableBinds.includes( name )) { - setTimeout( () => - Navigation.commit( this.options.navigation.binds[keyCode]!, this ) - ); + return; } - } + + setTimeout( () => + { + const event = { + device: this, + keyCode, + keyLabel: this.getKeyLabel( keyCode ), + event: e, + name: name, + repeat: e.repeat, + }; + + this._bindEmitter.emit( name, event ); + this._emitter.emit( "bind", event ); + }); + }); } } diff --git a/src/lib/devices/keyboard/layouts.ts b/src/lib/devices/keyboard/layouts.ts index dc5ab6f..7db3a89 100644 --- a/src/lib/devices/keyboard/layouts.ts +++ b/src/lib/devices/keyboard/layouts.ts @@ -195,7 +195,7 @@ export function detectKeyboardLayoutFromKeydown( // xxERTY else if ( - code === "KeyY" && key === "Y" + code === "KeyY" && key === "y" ) { _possibleLayouts.delete("QWERTZ"); diff --git a/src/lib/navigation/Navigatable.ts b/src/lib/navigation/Navigatable.ts index c85a711..b29d868 100644 --- a/src/lib/navigation/Navigatable.ts +++ b/src/lib/navigation/Navigatable.ts @@ -2,7 +2,7 @@ import { Container } from "pixi.js"; type NavigatableContainer = Container; -type NavigationDirection = "navigateLeft" | "navigateRight" | "navigateUp" | "navigateDown"; +type NavigationDirection = "navigate.left" | "navigate.right" | "navigate.up" | "navigate.down"; /** * @returns all navigatable containers in some container @@ -12,7 +12,7 @@ export function getAllNavigatables( navigatables: NavigatableContainer[] = [] ): NavigatableContainer[] { - for ( const child of target.children ) + for ( const child of target.children ?? [] ) { if ( ( child as any ).isNavigatable ) { @@ -35,15 +35,18 @@ export function getFirstNavigatable( currentFocus?: Container, nearestDirection?: NavigationDirection, { - minimumDistance = 3, + minimumDistance = 0, } = {} ): NavigatableContainer | undefined { const navigatables = getAllNavigatables( root ); - return chooseFirstNavigatableInDirection( navigatables, currentFocus, nearestDirection, { + return chooseFirstNavigatableInDirection( + navigatables, + currentFocus, + nearestDirection, minimumDistance, - }); + ); } export function isChildOf( @@ -66,9 +69,7 @@ function chooseFirstNavigatableInDirection( navigatables: NavigatableContainer[], currentFocus?: Container, nearestDirection?: NavigationDirection, - { - minimumDistance = 3, - } = {} + minimumDistance: number = 0, ): NavigatableContainer | undefined { const elements = navigatables @@ -103,61 +104,64 @@ function chooseFirstNavigatableInDirection( return navigatables[0] ?? fallbackElement; } + const focusedGlobalPos = focusedElement.getGlobalPosition(); const focusedBounds = focusedElement.getBounds(); const focusedCenter = { - x: focusedBounds.left + focusedBounds.width / 2, - y: focusedBounds.top + focusedBounds.height / 2, + x: focusedGlobalPos.x + focusedBounds.left + focusedBounds.width / 2, + y: focusedGlobalPos.y + focusedBounds.top + focusedBounds.height / 2, }; const otherElements = elements .filter( ( el ) => el !== focusedElement ) .map( ( el ) => { + const globalPos = el.getGlobalPosition(); const bounds = el.getBounds(); const center = { - x: bounds.left + bounds.width / 2, - y: bounds.top + bounds.height / 2, + x: globalPos.x + bounds.left + bounds.width / 2, + y: globalPos.y + bounds.top + bounds.height / 2, }; return { element: el, bounds: bounds, center: center, - distSqrd: squaredDist( center, focusedCenter ), + xDistSqrd: weightedDistSquared( center, focusedCenter, 1, 3 ), + yDistSqrd: weightedDistSquared( center, focusedCenter, 3, 1 ), }; }); switch ( nearestDirection ) { - case "navigateUp": { + case "navigate.up": { const sortedUp = otherElements .filter( ( el ) => el.center.y < focusedCenter.y - minimumDistance ) - .sort( ( a, b ) => a.distSqrd - b.distSqrd ); + .sort( ( a, b ) => a.yDistSqrd - b.yDistSqrd ); return sortedUp[0]?.element ?? fallbackElement; } - case "navigateLeft": { + case "navigate.left": { const sortedLeft = otherElements .filter( ( el ) => el.center.x < focusedCenter.x - minimumDistance ) - .sort( ( a, b ) => a.distSqrd - b.distSqrd ); + .sort( ( a, b ) => a.xDistSqrd - b.xDistSqrd ); return sortedLeft[0]?.element ?? fallbackElement; } - case "navigateRight": { + case "navigate.right": { const sortedRight = otherElements .filter( ( el ) => el.center.x > focusedCenter.x + minimumDistance ) - .sort( ( a, b ) => a.distSqrd - b.distSqrd ); + .sort( ( a, b ) => a.xDistSqrd - b.xDistSqrd ); return sortedRight[0]?.element ?? fallbackElement; } - case "navigateDown": { + case "navigate.down": { const sortedDown = otherElements .filter( ( el ) => el.center.y > focusedCenter.y + minimumDistance ) - .sort( ( a, b ) => a.distSqrd - b.distSqrd ); + .sort( ( a, b ) => a.yDistSqrd - b.yDistSqrd ); return sortedDown[0]?.element ?? fallbackElement; } @@ -168,18 +172,20 @@ function chooseFirstNavigatableInDirection( } } -function squaredDist( +function weightedDistSquared( a: { x: number, y : number }, - b: { x: number, y : number } + b: { x: number, y : number }, + xw: number, + yw: number ): number { const dx = b.x - a.x; const dy = b.y - a.y; - return dx * dx + dy * dy; + return dx * dx * xw + dy * dy * yw; } -function isVisible( +export function isVisible( target: Container ): boolean { diff --git a/src/lib/navigation/Navigation.ts b/src/lib/navigation/Navigation.ts deleted file mode 100644 index 1ad1f0d..0000000 --- a/src/lib/navigation/Navigation.ts +++ /dev/null @@ -1,276 +0,0 @@ -import { Container } from "pixi.js"; - -import { Device } from "../InputDevice"; -import { NavigationIntent } from "./NavigationIntent"; -import { NavigationResponder } from "./NavigationResponder"; -import { getFirstNavigatable, isChildOf } from "./Navigatable"; - - -class NavigationManager -{ - public static global = new NavigationManager(); - - /** - * Set the stage root to automatically handle global - * navigation intents. - */ - public stage?: Container; - - public options = { - /** - * When set to false, navigation will be disabled globally. - */ - enabled: true, - - /** - * When enabled, if no "pointover"/"mouseover" listeners - * exist, a default alpha effect will be used instead. - */ - useFallbackHoverEffect: true, - }; - - private _focused?: Container; - private _responderStack: NavigationResponder[] = []; - private constructor() - {} - - /** - * Active global interaction target - */ - public get firstResponder(): NavigationResponder | undefined - { - return this._responderStack[0]; - } - - /** - * Stack of global interaction targets - */ - public get responders(): readonly NavigationResponder[] - { - return this._responderStack; - } - - /** - * Emit interaction intent to the first responder, - * or the global responder if none. - */ - public commit( - intent: NavigationIntent, - device: Device, - ): void - { - if ( !this.options.enabled ) return; - this._propagateIntent( intent, device); - } - - /** - * Remove the top-most global interaction target - */ - public popResponder(): NavigationResponder | undefined - { - const responder = this._responderStack.shift(); - - responder?.resignedAsFirstResponder?.(); - this._clearFocusIfNeeded(); - - if ( this.firstResponder ) - { - this.firstResponder.becameFirstResponder?.(); - if ( this.firstResponder.autoFocus ?? true ) this.autoFocus(); - } - - return responder; - } - - /** - * Set the new top-most global interaction target. - */ - public pushResponder( responder: NavigationResponder ): void - { - if ( this._responderStack.includes( responder ) ) - { - throw new Error( "Responder already in stack." ); - } - - const previousResponder = this.firstResponder; - - this._responderStack.unshift( responder ); - - previousResponder?.resignedAsFirstResponder?.(); - this._clearFocusIfNeeded(); - - responder.becameFirstResponder?.(); - if ( responder.autoFocus ?? true ) this.autoFocus(); - } - - /** - * Focus on the first navigatable element. - */ - public autoFocus(): void - { - const responderStage = this.responders.find( isContainer ) ?? this.stage; - - if ( !responderStage ) return; - - const navigatable = getFirstNavigatable( responderStage ); - - if ( navigatable === undefined ) - { - // early exit: no containers found - console.debug( "navigation: no navigatable containers found" ); - return; - } - - if ( navigatable === this._focused ) return; - if ( this._focused ) this._emitBlur( this._focused ); - this._emitFocus( navigatable ); - this._focused = navigatable; - } - - // ----- Implementation: ----- - - private _propagateIntent( - intent: NavigationIntent, - device: Device, - ): void - { - for ( const target of this._responderStack ) - { - if ( target.handledNavigationIntent?.( intent, device ) ) - { - // stop on the first responder that acknowledges the intent - // has been handled - return; - } - } - - // no custom navigation responders were triggered. - // move on to the default behavior: - if ( this.stage === undefined ) - { - console.warn( "navigation: no stage root set" ); - } - else - { - const responderStage = this.responders.find( isContainer ) ?? this.stage; - this._handleGlobalIntent( responderStage, intent ); - } - } - - private _handleGlobalIntent( - root: Container, - intent: NavigationIntent - ): void - { - // if we currently have no focus target, then find one. - if ( this._focused === undefined ) - { - this.autoFocus(); - - return; - } - - if ( intent === "navigateBack" ) - { - this._emitBlur( this._focused ); - this._focused = undefined; - - return; - } - - if ( intent === "trigger" ) - { - this._emitTrigger( this._focused ); - - return; - } - - const responderStage = this.responders.find( isContainer ) ?? this.stage; - const nextTarget = getFirstNavigatable( responderStage, this._focused, intent ) ?? this._focused; - - if ( nextTarget === this._focused ) - { - // no change, do nothing - return; - } - - this._emitBlur( this._focused ); - this._emitFocus( nextTarget ); - this._focused = nextTarget; - } - - private _emitBlur( target: Container): void - { - const eventNames = target.eventNames(); - - // dispatch default events - if ( eventNames.includes( "pointerout" ) ) target.emit( "pointerout" ); - else if ( eventNames.includes( "mouseout" ) ) target.emit( "mouseout" ); - else if ( target.navigationMode === "auto" && this.options.useFallbackHoverEffect ) - { - target.alpha = 1.0; - } - - // always dispatch the blur event - target.emit( "blur" ); - } - - private _emitFocus( target: Container ): void - { - const eventNames = target.eventNames(); - - // dispatch default events - if ( eventNames.includes( "pointerover" ) ) target.emit( "pointerover" ); - else if ( eventNames.includes( "mouseover" ) ) target.emit( "mouseover" ); - else if ( target.navigationMode === "auto" && this.options.useFallbackHoverEffect ) - { - target.alpha = 0.5; - } - - // always dispatch the blur event - target.emit( "focus" ); - } - - private _emitTrigger( target: Container ): void - { - const eventNames = target.eventNames(); - - // dispatch default events - if ( eventNames.includes( "pointerdown" ) ) target.emit( "pointerdown" ); - else if ( eventNames.includes( "mousedown" ) ) target.emit( "mousedown" ); - else if ( target.navigationMode === "auto" && this.options.useFallbackHoverEffect ) - { - target.alpha = 0.75; - } - - // always dispatch the blur event - target.emit( "trigger" ); - } - - private _clearFocusIfNeeded(): void - { - const responderStage = this.responders.find( isContainer ) ?? this.stage; - - if ( !responderStage ) - { - return; - } - - if ( this._focused && !isChildOf( this._focused, responderStage ) ) - { - this._focused = undefined; - } - } -} - -function isContainer( responder: NavigationResponder ): responder is NavigationResponder & Container -{ - return "children" in responder; -} - -/** - * Responsible for global navigation interactions. - * - * Set stage to enable the global responder behaviors. - */ -export const Navigation = NavigationManager.global; diff --git a/src/lib/navigation/NavigationIntent.ts b/src/lib/navigation/NavigationIntent.ts index 11a2343..7633e4a 100644 --- a/src/lib/navigation/NavigationIntent.ts +++ b/src/lib/navigation/NavigationIntent.ts @@ -1,12 +1,10 @@ -export type NavigationIntent = - | "navigateBack" - | "navigateDown" - | "navigateLeft" - | "navigateRight" - | "navigateUp" - | "trigger" -; +export const navigationIntents = [ + "navigate.left", + "navigate.right", + "navigate.up", + "navigate.down", + "navigate.back", + "navigate.trigger", +] as const; -export const REPEATABLE_NAV_INTENTS: readonly NavigationIntent[] = [ - "navigateLeft", "navigateRight", "navigateUp", "navigateDown" -]; +export type NavigationIntent = typeof navigationIntents[number]; diff --git a/src/lib/navigation/NavigationResponder.ts b/src/lib/navigation/NavigationResponder.ts index 771746b..1464dc3 100644 --- a/src/lib/navigation/NavigationResponder.ts +++ b/src/lib/navigation/NavigationResponder.ts @@ -1,5 +1,6 @@ +import { Container } from "pixi.js"; import { Device } from "../InputDevice"; -import { NavigationIntent } from "./NavigationIntent"; +import { type NavigationIntent } from "./NavigationIntent"; /** * A target that responds to navigation on the stack. @@ -13,6 +14,11 @@ export interface NavigationResponder { */ autoFocus?: boolean + /** + * Currently focused container. + */ + focusTarget?: Container, + /** * Called when received a navigation intent. The target should handle, and * respond with a boolean indicating whether or not the intent was handled. diff --git a/src/lib/navigation/NavigationTargetEvent.ts b/src/lib/navigation/NavigationTargetEvent.ts index 19800ed..744f7c9 100644 --- a/src/lib/navigation/NavigationTargetEvent.ts +++ b/src/lib/navigation/NavigationTargetEvent.ts @@ -1,6 +1,4 @@ export type NavigationTargetEvent = - | "focus" - | "blur" - // | "focusHint" - // | "blurHint" -; + | "deviceover" + | "devicedown" + | "deviceout"; diff --git a/src/lib/navigation/UINavigation.ts b/src/lib/navigation/UINavigation.ts new file mode 100644 index 0000000..512fcd2 --- /dev/null +++ b/src/lib/navigation/UINavigation.ts @@ -0,0 +1,348 @@ +import { Container } from "pixi.js"; + +import { InputDevice, NamedBindEvent } from "../InputDevice"; +import { navigationIntents, type NavigationIntent } from "./NavigationIntent"; +import { NavigationResponder } from "./NavigationResponder"; +import { getFirstNavigatable, isChildOf, isVisible } from "./Navigatable"; + + +class NavigationManager +{ + public static global = new NavigationManager(); + + public options = { + /** + * When enabled, if no "pointover"/"mouseover" listeners + * exist, a default alpha effect will be used instead. + */ + useFallbackHoverEffect: true, + + /** + * Minimum distance in a direction that a container has to be to + * appear as selectable in that direction. + */ + minimumDirectionDistance: 10, + }; + + /** + * Whether navigation is enabled globally. + */ + public enabled = false; + + private _responders: NavigationResponder[] = []; + private _root?: Container; + private _rootFocused?: Container; + + private constructor() + {} + + /** + * Current navigation target. + */ + public get focusTarget(): Container | undefined + { + return this.responders.find(res => + res.focusTarget != null && isVisible( res.focusTarget ) + )?.focusTarget ?? this._rootFocused; + } + + public set focusTarget( target: Container | undefined ) + { + const previous = this.focusTarget; + + if ( previous === target) return; + + const responderStage = this.getResponderStage(); + if ( !responderStage ) return; + + if ( + target && ( + !target.isNavigatable + || !isChildOf( target, responderStage ) + ) + ) return; + + if ( previous ) this._emitBlur( previous ); + if ( target ) this._emitFocus( target ); + + if ( this.firstResponder ) this.firstResponder.focusTarget = target; + else this._rootFocused = target; + } + + /** + * Active global interaction target. + */ + public get firstResponder(): NavigationResponder | undefined + { + return this._responders[0]; + } + + /** + * Stack of global interaction targets. + */ + public get responders(): readonly NavigationResponder[] + { + return this._responders; + } + + /** + * Initialize navigation and set the root navigation responder. + * + * @param stage - Root navigation responder container, where navigatable + * containers can live. + */ + public configureWithRoot( stage: Container ): void + { + if ( this._root == null ) + { + // register mixin + // registerPixiJSNavigationMixin( Container ); + + // listen to intents + InputDevice.onBind( navigationIntents, (e) => this._propagate(e) ); + } + + this._root = stage; + this.enabled = true; + } + + /** + * Remove the top-most global interaction target + */ + public popResponder(): NavigationResponder | undefined + { + const previousFocused = this.focusTarget; + + const responder = this._responders.shift(); + responder.focusTarget = undefined; + + const nextFocused = this.focusTarget; + + responder?.resignedAsFirstResponder?.(); + this._invalidateFocusedIfNeeded(); + + if ( this.firstResponder ) + { + this.firstResponder.becameFirstResponder?.(); + } + + if ( + previousFocused !== nextFocused + && ( + this.firstResponder?.autoFocus + ?? nextFocused === undefined + ) + ) this.autoFocus(); + + return responder; + } + + /** + * Set the new top-most global interaction target. + */ + public pushResponder( responder: Container | NavigationResponder ): void + { + const res = responder as NavigationResponder; + + if ( this._responders.includes( res ) ) + { + throw new Error( "Responder already in stack." ); + } + + const previousResponder = this.firstResponder; + + this._responders.unshift( res ); + + previousResponder?.resignedAsFirstResponder?.(); + this._invalidateFocusedIfNeeded(); + + res.becameFirstResponder?.(); + if ( res.autoFocus ?? true ) this.autoFocus(); + } + + /** + * Focus on the first navigatable element. + */ + public autoFocus(): void + { + if ( !UINavigation.enabled ) return; + + const responderStage = this.getResponderStage(); + if ( !responderStage ) return; + + const navigatable = getFirstNavigatable( responderStage ); + + if ( navigatable === undefined ) + { + // early exit: no containers found + console.debug( "navigation: no navigatable containers found" ); + return; + } + + if ( navigatable === this.focusTarget ) return; + + this.focusTarget = navigatable; + } + + /** + * Current root container for navigation. + */ + public getResponderStage(): Container + { + return this.responders.find( isContainer ) ?? this._root; + } + + // ----- Implementation: ----- + + private _propagate({ device, name }: NamedBindEvent): void + { + if ( !this.enabled ) return; + + for ( const target of this._responders ) + { + if ( target.handledNavigationIntent?.( name, device ) ) + { + // stop on the first responder that acknowledges the intent + // has been handled + return; + } + } + + // no custom navigation responders were triggered. + // move on to the default behavior: + if ( this._root == null ) + { + this.enabled = false; + throw new Error( "Navigation requires root responder to be configured" ); + } + else + { + const responderStage = this.getResponderStage(); + this._handleGlobalIntent( responderStage, name ); + } + } + + private _handleGlobalIntent( + responderStage: Container, + intent: NavigationIntent + ): void + { + this._invalidateFocusedIfNeeded( responderStage ); + + const focusTarget = this.focusTarget; + + // if we currently have no focus target, then find one. + if ( focusTarget === undefined ) + { + this.autoFocus(); + + return; + } + + if ( intent === "navigate.back" ) + { + this._emitBlur( focusTarget ); + this.focusTarget = undefined; + + return; + } + + if ( intent === "navigate.trigger" ) + { + this._emitTrigger( focusTarget ); + + return; + } + + const nextTarget = getFirstNavigatable( + responderStage, + focusTarget, + intent, + { + minimumDistance: this.options.minimumDirectionDistance + } + ) ?? focusTarget; + + if ( nextTarget === focusTarget ) + { + // no change, do nothing + return; + } + + this.focusTarget = nextTarget; + } + + private _emitBlur( target: Container): void + { + const eventNames = target.eventNames(); + + // dispatch default events + if ( eventNames.includes( "pointerout" ) ) target.emit( "pointerout" ); + else if ( eventNames.includes( "mouseout" ) ) target.emit( "mouseout" ); + else if ( this.options.useFallbackHoverEffect ) + { + target.alpha = 1.0; + } + + // always dispatch the blur event + target.emit( "deviceout" ); + } + + private _emitFocus( target: Container ): void + { + const eventNames = target.eventNames(); + + // dispatch default events + if ( eventNames.includes( "pointerover" ) ) target.emit( "pointerover" ); + else if ( eventNames.includes( "mouseover" ) ) target.emit( "mouseover" ); + else if ( this.options.useFallbackHoverEffect ) + { + target.alpha = 0.5; + } + + // always dispatch the focus event + target.emit( "deviceover" ); + } + + private _emitTrigger( target: Container ): void + { + const eventNames = target.eventNames(); + + // dispatch default events + if ( eventNames.includes( "pointerdown" ) ) target.emit( "pointerdown" ); + else if ( eventNames.includes( "mousedown" ) ) target.emit( "mousedown" ); + else if ( this.options.useFallbackHoverEffect ) + { + target.alpha = 0.75; + } + + // always dispatch the trigger event + target.emit( "devicedown" ); + } + + private _invalidateFocusedIfNeeded( + responderStage = this.getResponderStage(), + ): void + { + if ( !responderStage ) return; + const focusTarget = this.focusTarget; + + if ( focusTarget && !isChildOf( focusTarget, responderStage ) ) + { + this._emitBlur( focusTarget ); + this.focusTarget = undefined; + } + } +} + +function isContainer( responder: NavigationResponder ): responder is NavigationResponder & Container +{ + return "children" in responder; +} + +/** + * Responsible for global navigation interactions. + * + * Set stage to enable the global responder behaviors. + */ +export const UINavigation = NavigationManager.global;