From 2a8d0269b8d3ab05b789a1bf60d7025973f3bb42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sieciechowicz?= Date: Fri, 1 Aug 2025 19:34:19 +0200 Subject: [PATCH] initial commit --- ...2ad0a5069d7bc3085b962aef432d33722c55ed930c | 1 + .../tsbuildinfo/webland-input.tsbuildinfo | 1 + README.md | 135 +++++++++++++ angular.json | 65 ++++++ ng-package.json | 7 + package.json | 41 ++++ src/lib/modules/input/input-module.ts | 12 ++ .../input/models/devices/input-gamepad.ts | 143 +++++++++++++ .../input/models/devices/input-keyboard.ts | 30 +++ src/lib/modules/input/models/input-action.ts | 50 +++++ src/lib/modules/input/models/input-device.ts | 59 ++++++ src/lib/modules/input/models/input-scheme.ts | 66 ++++++ .../modules/input/services/input.service.ts | 59 ++++++ .../directives/action-binding.directive.ts | 23 +++ .../directives/key-item-group.directive.ts | 28 +++ .../directives/key-item.directive.ts | 189 ++++++++++++++++++ .../modules/navigation/navigation-module.ts | 21 ++ src/public-api.ts | 21 ++ tsconfig.lib.json | 19 ++ tsconfig.lib.prod.json | 11 + tsconfig.spec.json | 14 ++ 21 files changed, 995 insertions(+) create mode 100644 .angular/cache/20.1.3/ng-packagr/291348f0e2f52c222895742ad0a5069d7bc3085b962aef432d33722c55ed930c create mode 100644 .angular/cache/20.1.3/ng-packagr/tsbuildinfo/webland-input.tsbuildinfo create mode 100644 README.md create mode 100644 angular.json create mode 100644 ng-package.json create mode 100644 package.json create mode 100644 src/lib/modules/input/input-module.ts create mode 100644 src/lib/modules/input/models/devices/input-gamepad.ts create mode 100644 src/lib/modules/input/models/devices/input-keyboard.ts create mode 100644 src/lib/modules/input/models/input-action.ts create mode 100644 src/lib/modules/input/models/input-device.ts create mode 100644 src/lib/modules/input/models/input-scheme.ts create mode 100644 src/lib/modules/input/services/input.service.ts create mode 100644 src/lib/modules/navigation/directives/action-binding.directive.ts create mode 100644 src/lib/modules/navigation/directives/key-item-group.directive.ts create mode 100644 src/lib/modules/navigation/directives/key-item.directive.ts create mode 100644 src/lib/modules/navigation/navigation-module.ts create mode 100644 src/public-api.ts create mode 100644 tsconfig.lib.json create mode 100644 tsconfig.lib.prod.json create mode 100644 tsconfig.spec.json diff --git a/.angular/cache/20.1.3/ng-packagr/291348f0e2f52c222895742ad0a5069d7bc3085b962aef432d33722c55ed930c b/.angular/cache/20.1.3/ng-packagr/291348f0e2f52c222895742ad0a5069d7bc3085b962aef432d33722c55ed930c new file mode 100644 index 0000000..2a28444 --- /dev/null +++ b/.angular/cache/20.1.3/ng-packagr/291348f0e2f52c222895742ad0a5069d7bc3085b962aef432d33722c55ed930c @@ -0,0 +1 @@ +{"hash":"fb663ce58a9cfb7a974a6aeca37d5969df004fed8a2c2bdca4fb12e11d39da48","types":[{"exports":["ActionBindingDirective","ActionBindings","ActionCallback","InputAction","InputDevice","InputGamepad","InputKeyState","InputKeyboard","InputModule","InputScheme","InputService","KeyItemDirective","KeyItemEntry","KeyItemGroupDirective","NavigationModule"],"facadeModuleId":"/web/Webland/app/dist/input/tmp-typings/webland-input.d.ts","isDynamicEntry":false,"isEntry":true,"isImplicitEntry":false,"moduleIds":["/web/Webland/app/dist/input/tmp-typings/lib/modules/input/input-module.d.ts","/web/Webland/app/dist/input/tmp-typings/lib/modules/input/models/input-action.d.ts","/web/Webland/app/dist/input/tmp-typings/lib/modules/input/models/input-device.d.ts","/web/Webland/app/dist/input/tmp-typings/lib/modules/input/models/input-scheme.d.ts","/web/Webland/app/dist/input/tmp-typings/lib/modules/input/services/input.service.d.ts","/web/Webland/app/dist/input/tmp-typings/lib/modules/input/models/devices/input-gamepad.d.ts","/web/Webland/app/dist/input/tmp-typings/lib/modules/input/models/devices/input-keyboard.d.ts","/web/Webland/app/dist/input/tmp-typings/lib/modules/navigation/directives/action-binding.directive.d.ts","/web/Webland/app/dist/input/tmp-typings/lib/modules/navigation/directives/key-item-group.directive.d.ts","/web/Webland/app/dist/input/tmp-typings/lib/modules/navigation/directives/key-item.directive.d.ts","/web/Webland/app/dist/input/tmp-typings/lib/modules/navigation/navigation-module.d.ts","/web/Webland/app/dist/input/tmp-typings/webland-input.d.ts"],"name":"webland-input.d","type":"chunk","dynamicImports":[],"fileName":"index.d.ts","implicitlyLoadedBefore":[],"importedBindings":{"@angular/core":["*","EventEmitter","ElementRef","OnInit","OnDestroy"],"@angular/common":["*"],"rxjs":["BehaviorSubject"]},"imports":["@angular/core","@angular/common","rxjs"],"modules":{"/web/Webland/app/dist/input/tmp-typings/lib/modules/input/input-module.d.ts":{"code":"declare class InputModule {\n static ɵfac: i0.ɵɵFactoryDeclaration;\n static ɵmod: i0.ɵɵNgModuleDeclaration;\n static ɵinj: i0.ɵɵInjectorDeclaration;\n}","originalLength":327,"removedExports":[],"renderedExports":["InputModule"],"renderedLength":243},"/web/Webland/app/dist/input/tmp-typings/lib/modules/input/models/input-action.d.ts":{"code":"type ActionCallback = (value: number, data: unknown, angle?: number, timePressed?: number) => void;\ndeclare class InputAction {\n readonly name: string;\n private currentValue;\n private downActions;\n private upActions;\n private changeActions;\n constructor(name: string);\n mapKeysToScheme(scheme: InputScheme, keys: (string | number)[]): this;\n fire(value: number, data?: unknown, angle?: number, timePressed?: number): void;\n onDown(action: ActionCallback): void;\n onUp(action: ActionCallback): void;\n onChange(action: ActionCallback): void;\n}","originalLength":635,"removedExports":[],"renderedExports":["ActionCallback","InputAction"],"renderedLength":574},"/web/Webland/app/dist/input/tmp-typings/lib/modules/input/models/input-device.d.ts":{"code":"interface InputKeyState {\n key: string | number;\n value: number;\n angle?: number;\n}\ndeclare abstract class InputDevice {\n readonly name: string;\n readonly type: string;\n protected scheme?: InputScheme;\n protected keyStates: InputKeyState[];\n keyStateChanged: EventEmitter;\n constructor(name: string, type?: string);\n mapKey(action: InputAction, keys: (string | number)[]): this;\n getScheme(): InputScheme | undefined;\n hasScheme(): boolean;\n setKey(key: string | number, value?: number, angle?: number): this;\n assignScheme(scheme: InputScheme): this;\n}","originalLength":763,"removedExports":[],"renderedExports":["InputKeyState","InputDevice"],"renderedLength":610},"/web/Webland/app/dist/input/tmp-typings/lib/modules/input/models/input-scheme.d.ts":{"code":"declare class InputScheme {\n readonly name: string;\n private data;\n private actions;\n private devices;\n deviceListChanged: BehaviorSubject;\n constructor(name: string);\n clearKeyBindings(): void;\n clearDeviceAssignments(): void;\n unassignDevice(device: InputDevice): void;\n getDevices(): InputDevice[];\n getKeyForAction(action: string): (string | number)[];\n setData(data: unknown): void;\n mapKey(action: InputAction, keys: (string | number)[]): void;\n setKeyState(key: string | number, value: number, angle?: number): void;\n assignDevice(device: InputDevice): void;\n}","originalLength":767,"removedExports":[],"renderedExports":["InputScheme"],"renderedLength":627},"/web/Webland/app/dist/input/tmp-typings/lib/modules/input/services/input.service.d.ts":{"code":"declare class InputService {\n actions: InputAction[];\n schemes: InputScheme[];\n devices: InputDevice[];\n deviceListChanged: BehaviorSubject;\n constructor();\n private defineKeyboard;\n private defineGamepad;\n defineAction(name: string): InputAction;\n defineScheme(name: string): InputScheme;\n getDevices(): InputDevice[];\n static ɵfac: i0.ɵɵFactoryDeclaration;\n static ɵprov: i0.ɵɵInjectableDeclaration;\n}","originalLength":736,"removedExports":[],"renderedExports":["InputService"],"renderedLength":489},"/web/Webland/app/dist/input/tmp-typings/lib/modules/input/models/devices/input-gamepad.d.ts":{"code":"interface GamepadButtonState {\n value: number;\n angle?: number;\n id: number;\n}\ndeclare class InputGamepad extends InputDevice {\n private gamepad;\n static listenerInited: boolean;\n static DeviceConnected: EventEmitter;\n static DeviceDisconnected: EventEmitter;\n static DeviceListChanged: EventEmitter;\n private static gamepads;\n private stateUpdateAgent?;\n private buttonState;\n axesState: GamepadButtonState[];\n constructor(gamepad: Gamepad);\n static GetName(gamepad: Gamepad): string;\n getMapping(): GamepadMappingType;\n private static attachEvents;\n connect(): void;\n disconnect(): void;\n private static updateGamepadStates;\n static Init(): void;\n}","originalLength":866,"removedExports":[],"renderedExports":["InputGamepad"],"renderedLength":754},"/web/Webland/app/dist/input/tmp-typings/lib/modules/input/models/devices/input-keyboard.d.ts":{"code":"declare class InputKeyboard extends InputDevice {\n static listenerInited: boolean;\n constructor(name: string);\n private attachEvents;\n private catchKey;\n}","originalLength":221,"removedExports":[],"renderedExports":["InputKeyboard"],"renderedLength":166},"/web/Webland/app/dist/input/tmp-typings/lib/modules/navigation/directives/action-binding.directive.d.ts":{"code":"declare class ActionBindingDirective {\n inputActionBinding: string;\n private element;\n constructor(elementRef: ElementRef);\n ngOnInit(): void;\n static ɵfac: i0.ɵɵFactoryDeclaration;\n static ɵdir: i0.ɵɵDirectiveDeclaration;\n}","originalLength":530,"removedExports":[],"renderedExports":["ActionBindingDirective"],"renderedLength":441},"/web/Webland/app/dist/input/tmp-typings/lib/modules/navigation/directives/key-item-group.directive.d.ts":{"code":"declare class KeyItemGroupDirective {\n static groups: KeyItemGroupDirective[];\n items: KeyItemEntry[];\n constructor();\n ngOnInit(): void;\n ngOnDestroy(): void;\n static ɵfac: i0.ɵɵFactoryDeclaration;\n static ɵdir: i0.ɵɵDirectiveDeclaration;\n}","originalLength":478,"removedExports":[],"renderedExports":["KeyItemGroupDirective"],"renderedLength":380},"/web/Webland/app/dist/input/tmp-typings/lib/modules/navigation/directives/key-item.directive.d.ts":{"code":"interface ActionBindings {\n [action: string]: () => undefined | boolean;\n}\ninterface KeyItemEntry {\n element: HTMLKeyItemEntryElement;\n top: number;\n left: number;\n}\ninterface HTMLKeyItemEntryElement extends HTMLElement {\n keyId: number;\n active: string;\n actionBindings: ActionBindings;\n activate: () => void;\n deactivate: () => void;\n focus: () => void;\n blur: () => void;\n}\ndeclare class KeyItemDirective implements OnInit, OnDestroy {\n private group;\n active: string;\n activate: () => any;\n deactivate: () => any;\n focus: () => any;\n blur: () => any;\n actionBindings: ActionBindings;\n private static allItems;\n private static current?;\n private element;\n private static NextId;\n private id;\n constructor(group: KeyItemGroupDirective, elementRef: ElementRef);\n static FireAction(action: string): boolean;\n ngOnInit(): void;\n ngOnDestroy(): void;\n onHover(): void;\n onLeave(): void;\n static ActivateCurrentItem(): void;\n static getCurrentGroup(): KeyItemGroupDirective | null;\n static SelectNexItem(fromAngleDeg: number, toAngleDeg: number): void;\n static SetCurrentItem(item?: KeyItemEntry): void;\n static updateItems(): void;\n static ɵfac: i0.ɵɵFactoryDeclaration;\n static ɵdir: i0.ɵɵDirectiveDeclaration;\n}","originalLength":1986,"removedExports":[],"renderedExports":["ActionBindings","KeyItemEntry","KeyItemDirective"],"renderedLength":1785},"/web/Webland/app/dist/input/tmp-typings/lib/modules/navigation/navigation-module.d.ts":{"code":"declare class NavigationModule {\n static ɵfac: i0.ɵɵFactoryDeclaration;\n static ɵmod: i0.ɵɵNgModuleDeclaration;\n static ɵinj: i0.ɵɵInjectorDeclaration;\n}","originalLength":709,"removedExports":[],"renderedExports":["NavigationModule"],"renderedLength":430},"/web/Webland/app/dist/input/tmp-typings/webland-input.d.ts":{"code":null,"originalLength":119,"removedExports":[],"renderedExports":[],"renderedLength":0}},"referencedFiles":[],"code":"import * as i0 from '@angular/core';\nimport { EventEmitter, ElementRef, OnInit, OnDestroy } from '@angular/core';\nimport * as i1 from '@angular/common';\nimport { BehaviorSubject } from 'rxjs';\n\ndeclare class InputModule {\n static ɵfac: i0.ɵɵFactoryDeclaration;\n static ɵmod: i0.ɵɵNgModuleDeclaration;\n static ɵinj: i0.ɵɵInjectorDeclaration;\n}\n\ntype ActionCallback = (value: number, data: unknown, angle?: number, timePressed?: number) => void;\ndeclare class InputAction {\n readonly name: string;\n private currentValue;\n private downActions;\n private upActions;\n private changeActions;\n constructor(name: string);\n mapKeysToScheme(scheme: InputScheme, keys: (string | number)[]): this;\n fire(value: number, data?: unknown, angle?: number, timePressed?: number): void;\n onDown(action: ActionCallback): void;\n onUp(action: ActionCallback): void;\n onChange(action: ActionCallback): void;\n}\n\ninterface InputKeyState {\n key: string | number;\n value: number;\n angle?: number;\n}\ndeclare abstract class InputDevice {\n readonly name: string;\n readonly type: string;\n protected scheme?: InputScheme;\n protected keyStates: InputKeyState[];\n keyStateChanged: EventEmitter;\n constructor(name: string, type?: string);\n mapKey(action: InputAction, keys: (string | number)[]): this;\n getScheme(): InputScheme | undefined;\n hasScheme(): boolean;\n setKey(key: string | number, value?: number, angle?: number): this;\n assignScheme(scheme: InputScheme): this;\n}\n\ndeclare class InputScheme {\n readonly name: string;\n private data;\n private actions;\n private devices;\n deviceListChanged: BehaviorSubject;\n constructor(name: string);\n clearKeyBindings(): void;\n clearDeviceAssignments(): void;\n unassignDevice(device: InputDevice): void;\n getDevices(): InputDevice[];\n getKeyForAction(action: string): (string | number)[];\n setData(data: unknown): void;\n mapKey(action: InputAction, keys: (string | number)[]): void;\n setKeyState(key: string | number, value: number, angle?: number): void;\n assignDevice(device: InputDevice): void;\n}\n\ndeclare class InputService {\n actions: InputAction[];\n schemes: InputScheme[];\n devices: InputDevice[];\n deviceListChanged: BehaviorSubject;\n constructor();\n private defineKeyboard;\n private defineGamepad;\n defineAction(name: string): InputAction;\n defineScheme(name: string): InputScheme;\n getDevices(): InputDevice[];\n static ɵfac: i0.ɵɵFactoryDeclaration;\n static ɵprov: i0.ɵɵInjectableDeclaration;\n}\n\ninterface GamepadButtonState {\n value: number;\n angle?: number;\n id: number;\n}\ndeclare class InputGamepad extends InputDevice {\n private gamepad;\n static listenerInited: boolean;\n static DeviceConnected: EventEmitter;\n static DeviceDisconnected: EventEmitter;\n static DeviceListChanged: EventEmitter;\n private static gamepads;\n private stateUpdateAgent?;\n private buttonState;\n axesState: GamepadButtonState[];\n constructor(gamepad: Gamepad);\n static GetName(gamepad: Gamepad): string;\n getMapping(): GamepadMappingType;\n private static attachEvents;\n connect(): void;\n disconnect(): void;\n private static updateGamepadStates;\n static Init(): void;\n}\n\ndeclare class InputKeyboard extends InputDevice {\n static listenerInited: boolean;\n constructor(name: string);\n private attachEvents;\n private catchKey;\n}\n\ndeclare class ActionBindingDirective {\n inputActionBinding: string;\n private element;\n constructor(elementRef: ElementRef);\n ngOnInit(): void;\n static ɵfac: i0.ɵɵFactoryDeclaration;\n static ɵdir: i0.ɵɵDirectiveDeclaration;\n}\n\ndeclare class KeyItemGroupDirective {\n static groups: KeyItemGroupDirective[];\n items: KeyItemEntry[];\n constructor();\n ngOnInit(): void;\n ngOnDestroy(): void;\n static ɵfac: i0.ɵɵFactoryDeclaration;\n static ɵdir: i0.ɵɵDirectiveDeclaration;\n}\n\ninterface ActionBindings {\n [action: string]: () => undefined | boolean;\n}\ninterface KeyItemEntry {\n element: HTMLKeyItemEntryElement;\n top: number;\n left: number;\n}\ninterface HTMLKeyItemEntryElement extends HTMLElement {\n keyId: number;\n active: string;\n actionBindings: ActionBindings;\n activate: () => void;\n deactivate: () => void;\n focus: () => void;\n blur: () => void;\n}\ndeclare class KeyItemDirective implements OnInit, OnDestroy {\n private group;\n active: string;\n activate: () => any;\n deactivate: () => any;\n focus: () => any;\n blur: () => any;\n actionBindings: ActionBindings;\n private static allItems;\n private static current?;\n private element;\n private static NextId;\n private id;\n constructor(group: KeyItemGroupDirective, elementRef: ElementRef);\n static FireAction(action: string): boolean;\n ngOnInit(): void;\n ngOnDestroy(): void;\n onHover(): void;\n onLeave(): void;\n static ActivateCurrentItem(): void;\n static getCurrentGroup(): KeyItemGroupDirective | null;\n static SelectNexItem(fromAngleDeg: number, toAngleDeg: number): void;\n static SetCurrentItem(item?: KeyItemEntry): void;\n static updateItems(): void;\n static ɵfac: i0.ɵɵFactoryDeclaration;\n static ɵdir: i0.ɵɵDirectiveDeclaration;\n}\n\ndeclare class NavigationModule {\n static ɵfac: i0.ɵɵFactoryDeclaration;\n static ɵmod: i0.ɵɵNgModuleDeclaration;\n static ɵinj: i0.ɵɵInjectorDeclaration;\n}\n\nexport { ActionBindingDirective, InputAction, InputDevice, InputGamepad, InputKeyboard, InputModule, InputScheme, InputService, KeyItemDirective, KeyItemGroupDirective, NavigationModule };\nexport type { ActionBindings, ActionCallback, InputKeyState, KeyItemEntry };\n","map":null,"preliminaryFileName":"index.d.ts","sourcemapFileName":null}],"fesm2022":[{"exports":["ActionBindingDirective","InputAction","InputDevice","InputGamepad","InputKeyboard","InputModule","InputScheme","InputService","KeyItemDirective","KeyItemGroupDirective","NavigationModule"],"facadeModuleId":"/web/Webland/app/dist/input/tmp-esm2022/webland-input.js","isDynamicEntry":false,"isEntry":true,"isImplicitEntry":false,"moduleIds":["/web/Webland/app/dist/input/tmp-esm2022/lib/modules/input/input-module.js","/web/Webland/app/dist/input/tmp-esm2022/lib/modules/input/models/input-scheme.js","/web/Webland/app/dist/input/tmp-esm2022/lib/modules/input/models/input-action.js","/web/Webland/app/dist/input/tmp-esm2022/lib/modules/input/models/input-device.js","/web/Webland/app/dist/input/tmp-esm2022/lib/modules/input/models/devices/input-keyboard.js","/web/Webland/app/dist/input/tmp-esm2022/lib/modules/input/models/devices/input-gamepad.js","/web/Webland/app/dist/input/tmp-esm2022/lib/modules/input/services/input.service.js","/web/Webland/app/dist/input/tmp-esm2022/lib/modules/navigation/directives/action-binding.directive.js","/web/Webland/app/dist/input/tmp-esm2022/lib/modules/navigation/directives/key-item-group.directive.js","/web/Webland/app/dist/input/tmp-esm2022/lib/modules/navigation/directives/key-item.directive.js","/web/Webland/app/dist/input/tmp-esm2022/lib/modules/navigation/navigation-module.js","/web/Webland/app/dist/input/tmp-esm2022/public-api.js","/web/Webland/app/dist/input/tmp-esm2022/webland-input.js"],"name":"webland-input","type":"chunk","dynamicImports":[],"fileName":"webland-input.mjs","implicitlyLoadedBefore":[],"importedBindings":{"@angular/core":["*","NgModule","EventEmitter","Injectable","Input","Directive","HostListener","Optional"],"@angular/common":["CommonModule"],"rxjs":["BehaviorSubject"]},"imports":["@angular/core","@angular/common","rxjs"],"modules":{"/web/Webland/app/dist/input/tmp-esm2022/lib/modules/input/input-module.js":{"code":"class InputModule {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: InputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\n static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.1.3\", ngImport: i0, type: InputModule, imports: [CommonModule] });\n static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: InputModule, imports: [CommonModule] });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: InputModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [],\n imports: [\n CommonModule,\n ],\n exports: []\n }]\n }] });","originalLength":1016,"removedExports":[],"renderedExports":["InputModule"],"renderedLength":841},"/web/Webland/app/dist/input/tmp-esm2022/lib/modules/input/models/input-scheme.js":{"code":"class InputScheme {\n name;\n data;\n actions = [];\n devices = [];\n deviceListChanged = new BehaviorSubject([]);\n constructor(name) {\n this.name = name;\n this.devices = [];\n }\n clearKeyBindings() {\n this.actions = [];\n }\n clearDeviceAssignments() {\n this.devices = [];\n this.deviceListChanged.next(this.devices);\n }\n unassignDevice(device) {\n this.devices.splice(this.devices.indexOf(device), 1);\n this.deviceListChanged.next(this.devices);\n }\n getDevices() {\n return this.devices;\n }\n getKeyForAction(action) {\n return this.actions.find(a => a.action.name === action)?.keys || [];\n }\n setData(data) {\n this.data = data;\n }\n mapKey(action, keys) {\n this.actions.push({ action, keys });\n }\n setKeyState(key, value, angle = 0) {\n const binds = this.actions.filter(a => a.keys.includes(key));\n if (binds.length) {\n binds.forEach(bind => bind.action.fire(value, this.data, angle));\n }\n }\n assignDevice(device) {\n device.assignScheme(this);\n this.devices.push(device);\n this.deviceListChanged.next(this.devices);\n }\n}","originalLength":1302,"removedExports":[],"renderedExports":["InputScheme"],"renderedLength":1214},"/web/Webland/app/dist/input/tmp-esm2022/lib/modules/input/models/input-action.js":{"code":"class InputAction {\n name;\n currentValue = 0;\n downActions = [];\n upActions = [];\n changeActions = [];\n constructor(name) {\n this.name = name;\n }\n mapKeysToScheme(scheme, keys) {\n scheme.mapKey(this, keys);\n return this;\n }\n fire(value, data = undefined, angle, timePressed) {\n const isPressed = value > 0;\n const wasPressed = this.currentValue > 0;\n if (isPressed !== wasPressed) {\n if (isPressed) {\n this.downActions.forEach(action => action(value, data, angle, timePressed));\n }\n else {\n this.upActions.forEach(action => action(value, data, angle, timePressed));\n }\n }\n else {\n this.changeActions.forEach(action => action(value, data, angle, timePressed));\n }\n this.currentValue = value;\n }\n onDown(action) {\n this.downActions.push(action);\n }\n onUp(action) {\n this.upActions.push(action);\n }\n onChange(action) {\n this.changeActions.push(action);\n }\n}","originalLength":1129,"removedExports":[],"renderedExports":["InputAction"],"renderedLength":1081},"/web/Webland/app/dist/input/tmp-esm2022/lib/modules/input/models/input-device.js":{"code":"class InputDevice {\n name;\n type;\n scheme;\n keyStates = [];\n keyStateChanged = new EventEmitter();\n constructor(name, type = 'unknown') {\n this.name = name;\n this.type = type;\n }\n mapKey(action, keys) {\n this.scheme?.mapKey(action, keys);\n return this;\n }\n getScheme() {\n return this.scheme;\n }\n hasScheme() {\n return !!this.scheme;\n }\n setKey(key, value = 1, angle = 0) {\n let exists = this.keyStates.find(k => k.key === key);\n if (!exists) {\n exists = {\n key,\n value,\n angle,\n };\n this.keyStates.push(exists);\n }\n else {\n exists.value = value;\n exists.angle = angle;\n }\n this.keyStateChanged.emit(exists);\n this.scheme?.setKeyState(key, value, angle);\n return this;\n }\n assignScheme(scheme) {\n this.scheme = scheme;\n return this;\n }\n}","originalLength":1093,"removedExports":[],"renderedExports":["InputDevice"],"renderedLength":999},"/web/Webland/app/dist/input/tmp-esm2022/lib/modules/input/models/devices/input-keyboard.js":{"code":"class InputKeyboard extends InputDevice {\n static listenerInited = false;\n constructor(name) {\n super(name, 'keyboard');\n this.attachEvents();\n }\n attachEvents() {\n if (InputKeyboard.listenerInited) {\n return;\n }\n window.addEventListener('keydown', e => this.catchKey(e, 1));\n window.addEventListener('keyup', e => this.catchKey(e, 0));\n InputKeyboard.listenerInited = true;\n }\n catchKey(event, value = 1, angle = 0) {\n const key = event.key;\n super.setKey(key, value, angle);\n event.preventDefault();\n return false;\n }\n}","originalLength":727,"removedExports":[],"renderedExports":["InputKeyboard"],"renderedLength":630},"/web/Webland/app/dist/input/tmp-esm2022/lib/modules/input/models/devices/input-gamepad.js":{"code":"class InputGamepad extends InputDevice {\n gamepad;\n static listenerInited = false;\n static DeviceConnected = new EventEmitter();\n static DeviceDisconnected = new EventEmitter();\n static DeviceListChanged = new EventEmitter();\n static gamepads = [];\n stateUpdateAgent;\n buttonState = [];\n axesState = [];\n constructor(gamepad) {\n super(InputGamepad.GetName(gamepad), 'gamepad');\n this.gamepad = gamepad;\n }\n static GetName(gamepad) {\n return `${gamepad.id} #${gamepad.index}`;\n }\n getMapping() {\n return this.gamepad.mapping;\n }\n static attachEvents() {\n if (InputGamepad.listenerInited) {\n return;\n }\n window.addEventListener('gamepadconnected', e => this.updateGamepadStates(e));\n window.addEventListener('gamepaddisconnected', e => this.updateGamepadStates(e));\n InputGamepad.listenerInited = true;\n }\n connect() {\n this.gamepad.buttons.forEach((button, index) => {\n this.buttonState.push({\n value: button.value,\n angle: 0,\n id: index,\n });\n });\n let axisIndex = 0;\n for (let i = 0; i < this.gamepad.axes.length; i += 2) {\n const axis = {\n value: 0,\n angle: 0,\n id: axisIndex++,\n };\n this.axesState.push(axis);\n }\n this.stateUpdateAgent = setInterval(() => {\n this.gamepad.buttons.forEach((button, index) => {\n const state = this.buttonState.find(s => s.id === index);\n if (!state) {\n return;\n }\n const wasPressed = state.value > 0;\n const isPressed = button.value > 0;\n state.value = button.value;\n if (isPressed !== wasPressed) {\n this.setKey(`gamepad.button.${index}`, button.value);\n }\n });\n axisIndex = 0;\n for (let i = 0; i < this.gamepad.axes.length; i += 2) {\n const state = this.axesState.find(s => s.id === axisIndex);\n if (!state) {\n return;\n }\n const left = Math.abs(Math.max(0, this.gamepad.axes[i]));\n const right = Math.abs(0 - Math.min(0, this.gamepad.axes[i]));\n const up = Math.abs(Math.max(0, this.gamepad.axes[i + 1]));\n const down = Math.abs(0 - Math.min(0, this.gamepad.axes[i + 1]));\n const x = right - left;\n const y = up - down;\n const value = Math.sqrt(x * x + y * y);\n const angle = Math.atan2(x, y);\n if (value !== state.value || angle !== state.angle) {\n this.setKey(`gamepad.axis.${state.id}`, value, angle);\n }\n state.value = value;\n state.angle = angle;\n axisIndex++;\n }\n }, 50);\n }\n disconnect() {\n this.scheme?.unassignDevice(this);\n this.scheme = undefined;\n clearInterval(this.stateUpdateAgent);\n }\n static updateGamepadStates(event) {\n console.log({ event });\n switch (event.type) {\n case 'gamepadconnected':\n const newGamepad = new InputGamepad(event.gamepad);\n this.DeviceConnected.emit(newGamepad);\n this.gamepads.push(newGamepad);\n newGamepad.connect();\n this.DeviceListChanged.emit(this.gamepads);\n break;\n case 'gamepaddisconnected':\n const gamepad = this.gamepads.find(g => g.name === event.gamepad.id);\n if (gamepad) {\n gamepad.disconnect();\n this.DeviceDisconnected.emit(gamepad);\n this.gamepads.splice(this.gamepads.indexOf(gamepad), 1);\n this.DeviceListChanged.emit(this.gamepads);\n }\n break;\n }\n }\n static Init() {\n this.attachEvents();\n }\n}","originalLength":4265,"removedExports":[],"renderedExports":["InputGamepad"],"renderedLength":4123},"/web/Webland/app/dist/input/tmp-esm2022/lib/modules/input/services/input.service.js":{"code":"class InputService {\n actions = [];\n schemes = [];\n devices = [];\n deviceListChanged = new BehaviorSubject([]);\n constructor() {\n this.defineKeyboard();\n this.defineGamepad();\n }\n defineKeyboard() {\n const keyboard = new InputKeyboard('Keyboard');\n this.devices.push(keyboard);\n this.deviceListChanged.next(this.devices);\n }\n defineGamepad() {\n InputGamepad.DeviceConnected.subscribe(gamepad => {\n this.devices.push(gamepad);\n this.deviceListChanged.next(this.devices);\n });\n InputGamepad.DeviceDisconnected.subscribe(gamepad => {\n this.devices = this.devices.filter(d => d.name !== gamepad.name);\n this.deviceListChanged.next(this.devices);\n });\n InputGamepad.Init();\n }\n defineAction(name) {\n const action = new InputAction(name);\n this.actions.push(action);\n return action;\n }\n defineScheme(name) {\n const scheme = new InputScheme(name);\n this.schemes.push(scheme);\n return scheme;\n }\n getDevices() {\n return this.devices;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: InputService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: InputService, providedIn: 'root' });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: InputService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root'\n }]\n }], ctorParameters: () => [] });","originalLength":2132,"removedExports":[],"renderedExports":["InputService"],"renderedLength":1724},"/web/Webland/app/dist/input/tmp-esm2022/lib/modules/navigation/directives/action-binding.directive.js":{"code":"class ActionBindingDirective {\n inputActionBinding = '';\n element;\n constructor(elementRef) {\n this.element = elementRef.nativeElement;\n }\n ngOnInit() {\n this.element.setAttribute('action', this.inputActionBinding);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: ActionBindingDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.1.3\", type: ActionBindingDirective, isStandalone: true, selector: \"[inputActionBinding]\", inputs: { inputActionBinding: \"inputActionBinding\" }, ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: ActionBindingDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[inputActionBinding]',\n standalone: true\n }]\n }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { inputActionBinding: [{\n type: Input\n }] } });","originalLength":1282,"removedExports":[],"renderedExports":["ActionBindingDirective"],"renderedLength":1135},"/web/Webland/app/dist/input/tmp-esm2022/lib/modules/navigation/directives/key-item-group.directive.js":{"code":"class KeyItemGroupDirective {\n static groups = [];\n items = [];\n constructor() {\n }\n ngOnInit() {\n KeyItemDirective.SetCurrentItem();\n KeyItemGroupDirective.groups.push(this);\n }\n ngOnDestroy() {\n const index = KeyItemGroupDirective.groups.findIndex(g => g === this);\n if (index > -1) {\n KeyItemGroupDirective.groups.splice(index, 1);\n }\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: KeyItemGroupDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.1.3\", type: KeyItemGroupDirective, isStandalone: true, selector: \"[inputKeyItemGroup]\", ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: KeyItemGroupDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[inputKeyItemGroup]',\n standalone: true\n }]\n }], ctorParameters: () => [] });","originalLength":1299,"removedExports":[],"renderedExports":["KeyItemGroupDirective"],"renderedLength":1102},"/web/Webland/app/dist/input/tmp-esm2022/lib/modules/navigation/directives/key-item.directive.js":{"code":"class KeyItemDirective {\n group;\n active = 'active';\n activate = () => { };\n deactivate = () => { };\n focus = () => { };\n blur = () => { };\n actionBindings = {};\n static allItems = [];\n static current;\n element;\n static NextId = 0;\n id = KeyItemDirective.NextId++;\n constructor(group, elementRef) {\n this.group = group;\n this.element = elementRef.nativeElement;\n }\n static FireAction(action) {\n const item = KeyItemDirective.current;\n if (item) {\n return item.element.actionBindings?.[action]?.() ?? true;\n }\n return true;\n }\n ngOnInit() {\n this.element.active = this.active;\n this.element.activate = this.activate;\n this.element.deactivate = this.deactivate;\n this.element.keyId = this.id;\n this.element.actionBindings = this.actionBindings;\n this.element.focus = this.focus;\n this.element.blur = this.blur;\n const position = this.element.getBoundingClientRect();\n const item = {\n element: this.element,\n top: position.top + position.height / 2,\n left: position.left + position.width / 2,\n };\n KeyItemDirective.allItems.push(item);\n this.group?.items.push(item);\n if (this.group) {\n this.group.items = this.group.items.sort((a, b) => {\n const tabIndexA = a.element.tabIndex;\n const tabIndexB = b.element.tabIndex;\n return tabIndexA - tabIndexB;\n });\n }\n }\n ngOnDestroy() {\n const index = KeyItemDirective.allItems.findIndex(item => item.element.keyId === this.id);\n if (index > -1) {\n KeyItemDirective.allItems.splice(index, 1);\n }\n if (this.group) {\n const index = this.group.items.findIndex(item => item.element.keyId === this.id);\n if (index > -1) {\n this.group.items.splice(index, 1);\n }\n }\n }\n onHover() {\n if (this.active && !this.element.classList.contains(this.active)) {\n this.element.classList.add(this.active);\n }\n this.focus();\n const item = KeyItemDirective.allItems.find(item => item.element.keyId === this.id);\n KeyItemDirective.SetCurrentItem(item);\n }\n onLeave() {\n if (this.active && this.element.classList.contains(this.active)) {\n this.element.classList.remove(this.active);\n }\n this.blur();\n }\n static ActivateCurrentItem() {\n this.current?.element.activate.bind(this.current?.element)();\n }\n static getCurrentGroup() {\n if (KeyItemGroupDirective.groups.length === 0) {\n return null;\n }\n return KeyItemGroupDirective.groups[KeyItemGroupDirective.groups.length - 1];\n }\n static SelectNexItem(fromAngleDeg, toAngleDeg) {\n this.updateItems();\n let current = this.current;\n let allItems = this.allItems;\n const currentGroup = this.getCurrentGroup();\n if (currentGroup) {\n const isCurrentInCurrentGroup = this.current && currentGroup.items.some(i => i.element.keyId === this.current.element.keyId);\n allItems = currentGroup.items;\n if (!isCurrentInCurrentGroup) {\n current = undefined;\n }\n }\n if (current) {\n const list = allItems.map(item => {\n const distance = Math.sqrt(Math.pow(item.top - this.current.top, 2) + Math.pow(item.left - this.current.left, 2));\n const angle = 90 + Math.atan2(item.top - this.current.top, item.left - this.current.left) * 180 / Math.PI;\n return {\n item,\n distance,\n angle,\n };\n })\n .filter(item => {\n const angle = item.angle;\n const normalizedAngle = angle < 0 ? angle + 360 : angle;\n return normalizedAngle >= fromAngleDeg && normalizedAngle <= toAngleDeg && item.distance > 0;\n })\n .sort((a, b) => a.distance - b.distance);\n if (list.length > 0) {\n this.SetCurrentItem(list[0].item);\n }\n else {\n let index = allItems.findIndex(i => i.element.keyId === this.current.element.keyId);\n index = (index + 1) % allItems.length;\n this.SetCurrentItem(allItems[index]);\n }\n }\n else {\n this.SetCurrentItem(allItems[0]);\n }\n }\n static SetCurrentItem(item) {\n if (this.current?.element.active && this.current.element.classList.contains(this.current.element.active)) {\n this.current.element.classList.remove(this.current.element.active);\n }\n this.current?.element.blur();\n this.current = item;\n this.current?.element.focus();\n if (this.current?.element.active && !this.current.element.classList.contains(this.current.element.active)) {\n this.current.element.classList.add(this.current.element.active);\n }\n }\n static updateItems() {\n this.allItems.forEach(item => {\n const position = item.element.getBoundingClientRect();\n item.top = position.top + position.height / 2;\n item.left = position.left + position.width / 2;\n });\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: KeyItemDirective, deps: [{ token: KeyItemGroupDirective, optional: true }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.1.3\", type: KeyItemDirective, isStandalone: true, selector: \"[inputKeyItem]\", inputs: { active: \"active\", activate: \"activate\", deactivate: \"deactivate\", focus: \"focus\", blur: \"blur\", actionBindings: \"actionBindings\" }, host: { listeners: { \"mouseenter\": \"onHover()\", \"mouseleave\": \"onLeave()\" } }, ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: KeyItemDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[inputKeyItem]',\n standalone: true\n }]\n }], ctorParameters: () => [{ type: KeyItemGroupDirective, decorators: [{\n type: Optional\n }] }, { type: i0.ElementRef }], propDecorators: { active: [{\n type: Input\n }], activate: [{\n type: Input\n }], deactivate: [{\n type: Input\n }], focus: [{\n type: Input\n }], blur: [{\n type: Input\n }], actionBindings: [{\n type: Input\n }], onHover: [{\n type: HostListener,\n args: ['mouseenter']\n }], onLeave: [{\n type: HostListener,\n args: ['mouseleave']\n }] } });","originalLength":7354,"removedExports":[],"renderedExports":["KeyItemDirective"],"renderedLength":7065},"/web/Webland/app/dist/input/tmp-esm2022/lib/modules/navigation/navigation-module.js":{"code":"class NavigationModule {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: NavigationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\n static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.1.3\", ngImport: i0, type: NavigationModule, imports: [CommonModule,\n ActionBindingDirective,\n KeyItemDirective,\n KeyItemGroupDirective], exports: [ActionBindingDirective,\n KeyItemDirective,\n KeyItemGroupDirective] });\n static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: NavigationModule, imports: [CommonModule] });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: NavigationModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [],\n imports: [\n CommonModule,\n ActionBindingDirective,\n KeyItemDirective,\n KeyItemGroupDirective,\n ],\n exports: [\n ActionBindingDirective,\n KeyItemDirective,\n KeyItemGroupDirective,\n ],\n }]\n }] });","originalLength":1770,"removedExports":[],"renderedExports":["NavigationModule"],"renderedLength":1363},"/web/Webland/app/dist/input/tmp-esm2022/public-api.js":{"code":"/*\n * Public API Surface of input\n */","originalLength":778,"removedExports":[],"renderedExports":[],"renderedLength":37},"/web/Webland/app/dist/input/tmp-esm2022/webland-input.js":{"code":"/**\n * Generated bundle index. Do not edit.\n */","originalLength":119,"removedExports":[],"renderedExports":[],"renderedLength":47}},"referencedFiles":[],"code":"import * as i0 from '@angular/core';\nimport { NgModule, EventEmitter, Injectable, Input, Directive, HostListener, Optional } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { BehaviorSubject } from 'rxjs';\n\nclass InputModule {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: InputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\n static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.1.3\", ngImport: i0, type: InputModule, imports: [CommonModule] });\n static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: InputModule, imports: [CommonModule] });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: InputModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [],\n imports: [\n CommonModule,\n ],\n exports: []\n }]\n }] });\n\nclass InputScheme {\n name;\n data;\n actions = [];\n devices = [];\n deviceListChanged = new BehaviorSubject([]);\n constructor(name) {\n this.name = name;\n this.devices = [];\n }\n clearKeyBindings() {\n this.actions = [];\n }\n clearDeviceAssignments() {\n this.devices = [];\n this.deviceListChanged.next(this.devices);\n }\n unassignDevice(device) {\n this.devices.splice(this.devices.indexOf(device), 1);\n this.deviceListChanged.next(this.devices);\n }\n getDevices() {\n return this.devices;\n }\n getKeyForAction(action) {\n return this.actions.find(a => a.action.name === action)?.keys || [];\n }\n setData(data) {\n this.data = data;\n }\n mapKey(action, keys) {\n this.actions.push({ action, keys });\n }\n setKeyState(key, value, angle = 0) {\n const binds = this.actions.filter(a => a.keys.includes(key));\n if (binds.length) {\n binds.forEach(bind => bind.action.fire(value, this.data, angle));\n }\n }\n assignDevice(device) {\n device.assignScheme(this);\n this.devices.push(device);\n this.deviceListChanged.next(this.devices);\n }\n}\n\nclass InputAction {\n name;\n currentValue = 0;\n downActions = [];\n upActions = [];\n changeActions = [];\n constructor(name) {\n this.name = name;\n }\n mapKeysToScheme(scheme, keys) {\n scheme.mapKey(this, keys);\n return this;\n }\n fire(value, data = undefined, angle, timePressed) {\n const isPressed = value > 0;\n const wasPressed = this.currentValue > 0;\n if (isPressed !== wasPressed) {\n if (isPressed) {\n this.downActions.forEach(action => action(value, data, angle, timePressed));\n }\n else {\n this.upActions.forEach(action => action(value, data, angle, timePressed));\n }\n }\n else {\n this.changeActions.forEach(action => action(value, data, angle, timePressed));\n }\n this.currentValue = value;\n }\n onDown(action) {\n this.downActions.push(action);\n }\n onUp(action) {\n this.upActions.push(action);\n }\n onChange(action) {\n this.changeActions.push(action);\n }\n}\n\nclass InputDevice {\n name;\n type;\n scheme;\n keyStates = [];\n keyStateChanged = new EventEmitter();\n constructor(name, type = 'unknown') {\n this.name = name;\n this.type = type;\n }\n mapKey(action, keys) {\n this.scheme?.mapKey(action, keys);\n return this;\n }\n getScheme() {\n return this.scheme;\n }\n hasScheme() {\n return !!this.scheme;\n }\n setKey(key, value = 1, angle = 0) {\n let exists = this.keyStates.find(k => k.key === key);\n if (!exists) {\n exists = {\n key,\n value,\n angle,\n };\n this.keyStates.push(exists);\n }\n else {\n exists.value = value;\n exists.angle = angle;\n }\n this.keyStateChanged.emit(exists);\n this.scheme?.setKeyState(key, value, angle);\n return this;\n }\n assignScheme(scheme) {\n this.scheme = scheme;\n return this;\n }\n}\n\nclass InputKeyboard extends InputDevice {\n static listenerInited = false;\n constructor(name) {\n super(name, 'keyboard');\n this.attachEvents();\n }\n attachEvents() {\n if (InputKeyboard.listenerInited) {\n return;\n }\n window.addEventListener('keydown', e => this.catchKey(e, 1));\n window.addEventListener('keyup', e => this.catchKey(e, 0));\n InputKeyboard.listenerInited = true;\n }\n catchKey(event, value = 1, angle = 0) {\n const key = event.key;\n super.setKey(key, value, angle);\n event.preventDefault();\n return false;\n }\n}\n\nclass InputGamepad extends InputDevice {\n gamepad;\n static listenerInited = false;\n static DeviceConnected = new EventEmitter();\n static DeviceDisconnected = new EventEmitter();\n static DeviceListChanged = new EventEmitter();\n static gamepads = [];\n stateUpdateAgent;\n buttonState = [];\n axesState = [];\n constructor(gamepad) {\n super(InputGamepad.GetName(gamepad), 'gamepad');\n this.gamepad = gamepad;\n }\n static GetName(gamepad) {\n return `${gamepad.id} #${gamepad.index}`;\n }\n getMapping() {\n return this.gamepad.mapping;\n }\n static attachEvents() {\n if (InputGamepad.listenerInited) {\n return;\n }\n window.addEventListener('gamepadconnected', e => this.updateGamepadStates(e));\n window.addEventListener('gamepaddisconnected', e => this.updateGamepadStates(e));\n InputGamepad.listenerInited = true;\n }\n connect() {\n this.gamepad.buttons.forEach((button, index) => {\n this.buttonState.push({\n value: button.value,\n angle: 0,\n id: index,\n });\n });\n let axisIndex = 0;\n for (let i = 0; i < this.gamepad.axes.length; i += 2) {\n const axis = {\n value: 0,\n angle: 0,\n id: axisIndex++,\n };\n this.axesState.push(axis);\n }\n this.stateUpdateAgent = setInterval(() => {\n this.gamepad.buttons.forEach((button, index) => {\n const state = this.buttonState.find(s => s.id === index);\n if (!state) {\n return;\n }\n const wasPressed = state.value > 0;\n const isPressed = button.value > 0;\n state.value = button.value;\n if (isPressed !== wasPressed) {\n this.setKey(`gamepad.button.${index}`, button.value);\n }\n });\n axisIndex = 0;\n for (let i = 0; i < this.gamepad.axes.length; i += 2) {\n const state = this.axesState.find(s => s.id === axisIndex);\n if (!state) {\n return;\n }\n const left = Math.abs(Math.max(0, this.gamepad.axes[i]));\n const right = Math.abs(0 - Math.min(0, this.gamepad.axes[i]));\n const up = Math.abs(Math.max(0, this.gamepad.axes[i + 1]));\n const down = Math.abs(0 - Math.min(0, this.gamepad.axes[i + 1]));\n const x = right - left;\n const y = up - down;\n const value = Math.sqrt(x * x + y * y);\n const angle = Math.atan2(x, y);\n if (value !== state.value || angle !== state.angle) {\n this.setKey(`gamepad.axis.${state.id}`, value, angle);\n }\n state.value = value;\n state.angle = angle;\n axisIndex++;\n }\n }, 50);\n }\n disconnect() {\n this.scheme?.unassignDevice(this);\n this.scheme = undefined;\n clearInterval(this.stateUpdateAgent);\n }\n static updateGamepadStates(event) {\n console.log({ event });\n switch (event.type) {\n case 'gamepadconnected':\n const newGamepad = new InputGamepad(event.gamepad);\n this.DeviceConnected.emit(newGamepad);\n this.gamepads.push(newGamepad);\n newGamepad.connect();\n this.DeviceListChanged.emit(this.gamepads);\n break;\n case 'gamepaddisconnected':\n const gamepad = this.gamepads.find(g => g.name === event.gamepad.id);\n if (gamepad) {\n gamepad.disconnect();\n this.DeviceDisconnected.emit(gamepad);\n this.gamepads.splice(this.gamepads.indexOf(gamepad), 1);\n this.DeviceListChanged.emit(this.gamepads);\n }\n break;\n }\n }\n static Init() {\n this.attachEvents();\n }\n}\n\nclass InputService {\n actions = [];\n schemes = [];\n devices = [];\n deviceListChanged = new BehaviorSubject([]);\n constructor() {\n this.defineKeyboard();\n this.defineGamepad();\n }\n defineKeyboard() {\n const keyboard = new InputKeyboard('Keyboard');\n this.devices.push(keyboard);\n this.deviceListChanged.next(this.devices);\n }\n defineGamepad() {\n InputGamepad.DeviceConnected.subscribe(gamepad => {\n this.devices.push(gamepad);\n this.deviceListChanged.next(this.devices);\n });\n InputGamepad.DeviceDisconnected.subscribe(gamepad => {\n this.devices = this.devices.filter(d => d.name !== gamepad.name);\n this.deviceListChanged.next(this.devices);\n });\n InputGamepad.Init();\n }\n defineAction(name) {\n const action = new InputAction(name);\n this.actions.push(action);\n return action;\n }\n defineScheme(name) {\n const scheme = new InputScheme(name);\n this.schemes.push(scheme);\n return scheme;\n }\n getDevices() {\n return this.devices;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: InputService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: InputService, providedIn: 'root' });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: InputService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root'\n }]\n }], ctorParameters: () => [] });\n\nclass ActionBindingDirective {\n inputActionBinding = '';\n element;\n constructor(elementRef) {\n this.element = elementRef.nativeElement;\n }\n ngOnInit() {\n this.element.setAttribute('action', this.inputActionBinding);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: ActionBindingDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.1.3\", type: ActionBindingDirective, isStandalone: true, selector: \"[inputActionBinding]\", inputs: { inputActionBinding: \"inputActionBinding\" }, ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: ActionBindingDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[inputActionBinding]',\n standalone: true\n }]\n }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { inputActionBinding: [{\n type: Input\n }] } });\n\nclass KeyItemGroupDirective {\n static groups = [];\n items = [];\n constructor() {\n }\n ngOnInit() {\n KeyItemDirective.SetCurrentItem();\n KeyItemGroupDirective.groups.push(this);\n }\n ngOnDestroy() {\n const index = KeyItemGroupDirective.groups.findIndex(g => g === this);\n if (index > -1) {\n KeyItemGroupDirective.groups.splice(index, 1);\n }\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: KeyItemGroupDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.1.3\", type: KeyItemGroupDirective, isStandalone: true, selector: \"[inputKeyItemGroup]\", ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: KeyItemGroupDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[inputKeyItemGroup]',\n standalone: true\n }]\n }], ctorParameters: () => [] });\n\nclass KeyItemDirective {\n group;\n active = 'active';\n activate = () => { };\n deactivate = () => { };\n focus = () => { };\n blur = () => { };\n actionBindings = {};\n static allItems = [];\n static current;\n element;\n static NextId = 0;\n id = KeyItemDirective.NextId++;\n constructor(group, elementRef) {\n this.group = group;\n this.element = elementRef.nativeElement;\n }\n static FireAction(action) {\n const item = KeyItemDirective.current;\n if (item) {\n return item.element.actionBindings?.[action]?.() ?? true;\n }\n return true;\n }\n ngOnInit() {\n this.element.active = this.active;\n this.element.activate = this.activate;\n this.element.deactivate = this.deactivate;\n this.element.keyId = this.id;\n this.element.actionBindings = this.actionBindings;\n this.element.focus = this.focus;\n this.element.blur = this.blur;\n const position = this.element.getBoundingClientRect();\n const item = {\n element: this.element,\n top: position.top + position.height / 2,\n left: position.left + position.width / 2,\n };\n KeyItemDirective.allItems.push(item);\n this.group?.items.push(item);\n if (this.group) {\n this.group.items = this.group.items.sort((a, b) => {\n const tabIndexA = a.element.tabIndex;\n const tabIndexB = b.element.tabIndex;\n return tabIndexA - tabIndexB;\n });\n }\n }\n ngOnDestroy() {\n const index = KeyItemDirective.allItems.findIndex(item => item.element.keyId === this.id);\n if (index > -1) {\n KeyItemDirective.allItems.splice(index, 1);\n }\n if (this.group) {\n const index = this.group.items.findIndex(item => item.element.keyId === this.id);\n if (index > -1) {\n this.group.items.splice(index, 1);\n }\n }\n }\n onHover() {\n if (this.active && !this.element.classList.contains(this.active)) {\n this.element.classList.add(this.active);\n }\n this.focus();\n const item = KeyItemDirective.allItems.find(item => item.element.keyId === this.id);\n KeyItemDirective.SetCurrentItem(item);\n }\n onLeave() {\n if (this.active && this.element.classList.contains(this.active)) {\n this.element.classList.remove(this.active);\n }\n this.blur();\n }\n static ActivateCurrentItem() {\n this.current?.element.activate.bind(this.current?.element)();\n }\n static getCurrentGroup() {\n if (KeyItemGroupDirective.groups.length === 0) {\n return null;\n }\n return KeyItemGroupDirective.groups[KeyItemGroupDirective.groups.length - 1];\n }\n static SelectNexItem(fromAngleDeg, toAngleDeg) {\n this.updateItems();\n let current = this.current;\n let allItems = this.allItems;\n const currentGroup = this.getCurrentGroup();\n if (currentGroup) {\n const isCurrentInCurrentGroup = this.current && currentGroup.items.some(i => i.element.keyId === this.current.element.keyId);\n allItems = currentGroup.items;\n if (!isCurrentInCurrentGroup) {\n current = undefined;\n }\n }\n if (current) {\n const list = allItems.map(item => {\n const distance = Math.sqrt(Math.pow(item.top - this.current.top, 2) + Math.pow(item.left - this.current.left, 2));\n const angle = 90 + Math.atan2(item.top - this.current.top, item.left - this.current.left) * 180 / Math.PI;\n return {\n item,\n distance,\n angle,\n };\n })\n .filter(item => {\n const angle = item.angle;\n const normalizedAngle = angle < 0 ? angle + 360 : angle;\n return normalizedAngle >= fromAngleDeg && normalizedAngle <= toAngleDeg && item.distance > 0;\n })\n .sort((a, b) => a.distance - b.distance);\n if (list.length > 0) {\n this.SetCurrentItem(list[0].item);\n }\n else {\n let index = allItems.findIndex(i => i.element.keyId === this.current.element.keyId);\n index = (index + 1) % allItems.length;\n this.SetCurrentItem(allItems[index]);\n }\n }\n else {\n this.SetCurrentItem(allItems[0]);\n }\n }\n static SetCurrentItem(item) {\n if (this.current?.element.active && this.current.element.classList.contains(this.current.element.active)) {\n this.current.element.classList.remove(this.current.element.active);\n }\n this.current?.element.blur();\n this.current = item;\n this.current?.element.focus();\n if (this.current?.element.active && !this.current.element.classList.contains(this.current.element.active)) {\n this.current.element.classList.add(this.current.element.active);\n }\n }\n static updateItems() {\n this.allItems.forEach(item => {\n const position = item.element.getBoundingClientRect();\n item.top = position.top + position.height / 2;\n item.left = position.left + position.width / 2;\n });\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: KeyItemDirective, deps: [{ token: KeyItemGroupDirective, optional: true }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.1.3\", type: KeyItemDirective, isStandalone: true, selector: \"[inputKeyItem]\", inputs: { active: \"active\", activate: \"activate\", deactivate: \"deactivate\", focus: \"focus\", blur: \"blur\", actionBindings: \"actionBindings\" }, host: { listeners: { \"mouseenter\": \"onHover()\", \"mouseleave\": \"onLeave()\" } }, ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: KeyItemDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[inputKeyItem]',\n standalone: true\n }]\n }], ctorParameters: () => [{ type: KeyItemGroupDirective, decorators: [{\n type: Optional\n }] }, { type: i0.ElementRef }], propDecorators: { active: [{\n type: Input\n }], activate: [{\n type: Input\n }], deactivate: [{\n type: Input\n }], focus: [{\n type: Input\n }], blur: [{\n type: Input\n }], actionBindings: [{\n type: Input\n }], onHover: [{\n type: HostListener,\n args: ['mouseenter']\n }], onLeave: [{\n type: HostListener,\n args: ['mouseleave']\n }] } });\n\nclass NavigationModule {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: NavigationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\n static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.1.3\", ngImport: i0, type: NavigationModule, imports: [CommonModule,\n ActionBindingDirective,\n KeyItemDirective,\n KeyItemGroupDirective], exports: [ActionBindingDirective,\n KeyItemDirective,\n KeyItemGroupDirective] });\n static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: NavigationModule, imports: [CommonModule] });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: NavigationModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [],\n imports: [\n CommonModule,\n ActionBindingDirective,\n KeyItemDirective,\n KeyItemGroupDirective,\n ],\n exports: [\n ActionBindingDirective,\n KeyItemDirective,\n KeyItemGroupDirective,\n ],\n }]\n }] });\n\n/*\n * Public API Surface of input\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { ActionBindingDirective, InputAction, InputDevice, InputGamepad, InputKeyboard, InputModule, InputScheme, InputService, KeyItemDirective, KeyItemGroupDirective, NavigationModule };\n//# sourceMappingURL=webland-input.mjs.map\n","map":null,"preliminaryFileName":"webland-input.mjs","sourcemapFileName":"webland-input.mjs.map"},{"fileName":"webland-input.mjs.map","names":[],"needsCodeReference":false,"originalFileName":null,"originalFileNames":[],"source":"{\"version\":3,\"file\":\"webland-input.mjs\",\"sources\":[\"../../../packages/input/src/lib/modules/input/input-module.ts\",\"../../../packages/input/src/lib/modules/input/models/input-scheme.ts\",\"../../../packages/input/src/lib/modules/input/models/input-action.ts\",\"../../../packages/input/src/lib/modules/input/models/input-device.ts\",\"../../../packages/input/src/lib/modules/input/models/devices/input-keyboard.ts\",\"../../../packages/input/src/lib/modules/input/models/devices/input-gamepad.ts\",\"../../../packages/input/src/lib/modules/input/services/input.service.ts\",\"../../../packages/input/src/lib/modules/navigation/directives/action-binding.directive.ts\",\"../../../packages/input/src/lib/modules/navigation/directives/key-item-group.directive.ts\",\"../../../packages/input/src/lib/modules/navigation/directives/key-item.directive.ts\",\"../../../packages/input/src/lib/modules/navigation/navigation-module.ts\",\"../../../packages/input/src/public-api.ts\",\"../../../packages/input/src/webland-input.ts\"],\"sourcesContent\":[\"import { NgModule } from '@angular/core';\\nimport { CommonModule } from '@angular/common';\\n\\n@NgModule({\\n declarations: [],\\n imports: [\\n CommonModule,\\n ],\\n exports: [\\n ]\\n})\\nexport class InputModule { }\\n\",\"import { BehaviorSubject } from \\\"rxjs\\\";\\nimport { InputAction } from \\\"./input-action\\\";\\nimport { InputDevice } from \\\"./input-device\\\";\\n\\ninterface InputActionBind {\\n action: InputAction;\\n keys: (string | number)[];\\n}\\n\\nexport class InputScheme {\\n\\n private data: unknown;\\n private actions: InputActionBind[] = [];\\n private devices: InputDevice[] = [];\\n public deviceListChanged = new BehaviorSubject([]);\\n\\n constructor(\\n public readonly name: string,\\n ) {\\n this.devices = [];\\n }\\n\\n public clearKeyBindings() {\\n this.actions = [];\\n\\n }\\n\\n public clearDeviceAssignments() {\\n this.devices = [];\\n this.deviceListChanged.next(this.devices);\\n }\\n\\n public unassignDevice(device: InputDevice) {\\n this.devices.splice(this.devices.indexOf(device), 1);\\n this.deviceListChanged.next(this.devices);\\n }\\n\\n public getDevices() {\\n return this.devices;\\n }\\n\\n public getKeyForAction(action: string): (string | number)[] {\\n return this.actions.find(a => a.action.name === action)?.keys || [];\\n }\\n\\n public setData(data: unknown) {\\n this.data = data;\\n }\\n\\n public mapKey(action: InputAction, keys: (string | number)[]) {\\n this.actions.push({ action, keys });\\n }\\n\\n public setKeyState(key: string | number, value: number, angle: number = 0) {\\n const binds = this.actions.filter(a => a.keys.includes(key));\\n if (binds.length) {\\n binds.forEach(bind => bind.action.fire(value, this.data, angle));\\n }\\n }\\n\\n public assignDevice(device: InputDevice): void {\\n device.assignScheme(this);\\n this.devices.push(device);\\n this.deviceListChanged.next(this.devices);\\n }\\n}\\n\",\"import { InputScheme } from \\\"./input-scheme\\\";\\n\\nexport type ActionCallback = (value: number, data: unknown, angle?:number, timePressed?: number) => void;\\n\\nexport class InputAction {\\n\\n private currentValue: number = 0;\\n private downActions: ActionCallback[] = [];\\n private upActions: ActionCallback[] = [];\\n private changeActions: ActionCallback[] = [];\\n\\n constructor(\\n public readonly name: string,\\n ) {\\n\\n }\\n\\n public mapKeysToScheme(scheme: InputScheme, keys: (string | number)[]): this {\\n scheme.mapKey(this, keys);\\n return this;\\n }\\n\\n public fire(value: number, data: unknown = undefined, angle?: number, timePressed?: number) {\\n const isPressed = value > 0;\\n const wasPressed = this.currentValue > 0;\\n if (isPressed !== wasPressed) {\\n if (isPressed) {\\n this.downActions.forEach(action => action(value, data, angle, timePressed));\\n } else {\\n this.upActions.forEach(action => action(value, data, angle, timePressed));\\n }\\n } else {\\n this.changeActions.forEach(action => action(value, data, angle, timePressed));\\n }\\n\\n this.currentValue = value;\\n }\\n\\n public onDown(action: ActionCallback) {\\n this.downActions.push(action);\\n }\\n\\n public onUp(action: ActionCallback) {\\n this.upActions.push(action);\\n }\\n\\n public onChange(action: ActionCallback) {\\n this.changeActions.push(action);\\n }\\n}\\n\",\"import { EventEmitter } from \\\"@angular/core\\\";\\nimport { InputScheme } from \\\"./input-scheme\\\";\\nimport { InputAction } from \\\"./input-action\\\";\\n\\nexport interface InputKeyState {\\n key: string | number;\\n value: number;\\n angle?: number;\\n}\\n\\nexport abstract class InputDevice {\\n\\n protected scheme?: InputScheme;\\n protected keyStates: InputKeyState[] = [];\\n public keyStateChanged = new EventEmitter();\\n\\n constructor(\\n public readonly name: string,\\n public readonly type = 'unknown',\\n ) {\\n }\\n\\n public mapKey(action: InputAction, keys: (string | number)[]): this {\\n this.scheme?.mapKey(action, keys);\\n return this;\\n }\\n\\n public getScheme(): InputScheme | undefined {\\n return this.scheme;\\n }\\n\\n public hasScheme(): boolean {\\n return !!this.scheme;\\n }\\n\\n public setKey(key: string | number, value: number = 1, angle: number = 0): this {\\n let exists = this.keyStates.find(k => k.key === key);\\n if (!exists) {\\n exists = {\\n key,\\n value,\\n angle,\\n };\\n this.keyStates.push(exists);\\n } else {\\n exists.value = value;\\n exists.angle = angle;\\n }\\n\\n this.keyStateChanged.emit(exists);\\n this.scheme?.setKeyState(key, value, angle);\\n return this;\\n }\\n\\n public assignScheme(scheme: InputScheme): this {\\n this.scheme = scheme;\\n return this;\\n }\\n}\\n\",\"import { InputDevice } from \\\"../input-device\\\";\\n\\nexport class InputKeyboard extends InputDevice {\\n\\n static listenerInited = false;\\n\\n constructor(\\n name: string,\\n ) {\\n super(name, 'keyboard');\\n this.attachEvents();\\n }\\n\\n private attachEvents() {\\n if (InputKeyboard.listenerInited) {\\n return;\\n }\\n\\n window.addEventListener('keydown', e => this.catchKey(e, 1));\\n window.addEventListener('keyup', e => this.catchKey(e, 0));\\n InputKeyboard.listenerInited = true;\\n }\\n\\n private catchKey(event: KeyboardEvent, value: number = 1, angle: number = 0): boolean {\\n const key = event.key;\\n super.setKey(key, value, angle);\\n event.preventDefault();\\n return false;\\n }\\n}\\n\",\"import { EventEmitter } from \\\"@angular/core\\\";\\nimport { InputDevice } from \\\"../input-device\\\";\\n\\ninterface GamepadButtonState {\\n value: number;\\n angle?: number;\\n id: number;\\n}\\n\\nexport class InputGamepad extends InputDevice {\\n\\n static listenerInited = false;\\n public static DeviceConnected = new EventEmitter();\\n public static DeviceDisconnected = new EventEmitter();\\n public static DeviceListChanged = new EventEmitter();\\n private static gamepads: InputGamepad[] = [];\\n private stateUpdateAgent?: number;\\n private buttonState: GamepadButtonState[] = [];\\n public axesState: GamepadButtonState[] = [];\\n\\n constructor(\\n private gamepad: Gamepad\\n ) {\\n super(InputGamepad.GetName(gamepad), 'gamepad');\\n }\\n\\n public static GetName(gamepad: Gamepad) {\\n return `${gamepad.id} #${gamepad.index}`;\\n }\\n\\n public getMapping() {\\n return this.gamepad.mapping;\\n }\\n\\n private static attachEvents() {\\n if (InputGamepad.listenerInited) {\\n return;\\n }\\n\\n window.addEventListener('gamepadconnected', e => this.updateGamepadStates(e));\\n window.addEventListener('gamepaddisconnected', e => this.updateGamepadStates(e));\\n\\n InputGamepad.listenerInited = true;\\n }\\n\\n public connect() {\\n this.gamepad.buttons.forEach((button, index) => {\\n this.buttonState.push({\\n value: button.value,\\n angle: 0,\\n id: index,\\n });\\n });\\n\\n let axisIndex = 0;\\n\\n for (let i = 0; i < this.gamepad.axes.length; i+=2) {\\n const axis = {\\n value: 0,\\n angle: 0,\\n id: axisIndex++,\\n };\\n this.axesState.push(axis);\\n }\\n\\n this.stateUpdateAgent = setInterval(() => {\\n this.gamepad.buttons.forEach((button, index) => {\\n const state = this.buttonState.find(s => s.id === index);\\n if (!state) {\\n return;\\n }\\n const wasPressed = state.value > 0;\\n const isPressed = button.value > 0;\\n state.value = button.value;\\n if (isPressed !== wasPressed) {\\n this.setKey(`gamepad.button.${index}`, button.value);\\n }\\n });\\n\\n axisIndex = 0;\\n for (let i = 0; i < this.gamepad.axes.length; i+=2) {\\n const state = this.axesState.find(s => s.id === axisIndex);\\n if (!state) {\\n return;\\n }\\n\\n const left = Math.abs(Math.max(0, this.gamepad.axes[i]));\\n const right = Math.abs(0 - Math.min(0, this.gamepad.axes[i]));\\n const up = Math.abs(Math.max(0, this.gamepad.axes[i + 1]));\\n const down = Math.abs(0 - Math.min(0, this.gamepad.axes[i + 1]));\\n\\n const x = right - left;\\n const y = up - down;\\n\\n const value = Math.sqrt(x * x + y * y);\\n const angle = Math.atan2(x, y);\\n\\n if (value !== state.value || angle !== state.angle) {\\n this.setKey(`gamepad.axis.${state.id}`, value, angle);\\n }\\n\\n state.value = value;\\n state.angle = angle;\\n axisIndex++;\\n }\\n }, 50) as unknown as number;\\n }\\n\\n public disconnect() {\\n this.scheme?.unassignDevice(this);\\n this.scheme = undefined;\\n clearInterval(this.stateUpdateAgent);\\n }\\n\\n private static updateGamepadStates(event: GamepadEvent) {\\n\\n console.log({event});\\n\\n switch (event.type) {\\n case 'gamepadconnected':\\n const newGamepad = new InputGamepad(event.gamepad);\\n this.DeviceConnected.emit(newGamepad);\\n this.gamepads.push(newGamepad);\\n newGamepad.connect();\\n this.DeviceListChanged.emit(this.gamepads);\\n break;\\n\\n case 'gamepaddisconnected':\\n const gamepad = this.gamepads.find(g => g.name === event.gamepad.id);\\n if (gamepad) {\\n gamepad.disconnect();\\n this.DeviceDisconnected.emit(gamepad);\\n this.gamepads.splice(this.gamepads.indexOf(gamepad), 1);\\n this.DeviceListChanged.emit(this.gamepads);\\n }\\n break;\\n }\\n }\\n\\n public static Init() {\\n this.attachEvents();\\n }\\n}\\n\",\"import { Injectable } from \\\"@angular/core\\\";\\nimport { InputScheme } from \\\"../models/input-scheme\\\";\\nimport { InputAction } from \\\"../models/input-action\\\";\\nimport { InputDevice } from \\\"../models/input-device\\\";\\nimport { InputKeyboard } from \\\"../models/devices/input-keyboard\\\";\\nimport { InputGamepad } from \\\"../models/devices/input-gamepad\\\";\\nimport { BehaviorSubject } from \\\"rxjs\\\";\\n\\n@Injectable({\\n providedIn: 'root'\\n})\\nexport class InputService {\\n\\n public actions: InputAction[] = [];\\n public schemes: InputScheme[] = [];\\n public devices: InputDevice[] = [];\\n\\n public deviceListChanged = new BehaviorSubject([]);\\n\\n constructor() {\\n this.defineKeyboard();\\n this.defineGamepad();\\n }\\n\\n private defineKeyboard() {\\n const keyboard = new InputKeyboard('Keyboard');\\n this.devices.push(keyboard);\\n this.deviceListChanged.next(this.devices);\\n }\\n\\n private defineGamepad() {\\n InputGamepad.DeviceConnected.subscribe(gamepad => {\\n this.devices.push(gamepad);\\n this.deviceListChanged.next(this.devices);\\n });\\n InputGamepad.DeviceDisconnected.subscribe(gamepad => {\\n this.devices = this.devices.filter(d => d.name !== gamepad.name);\\n this.deviceListChanged.next(this.devices);\\n });\\n InputGamepad.Init();\\n }\\n\\n public defineAction(name: string): InputAction {\\n const action = new InputAction(name);\\n this.actions.push(action);\\n return action;\\n }\\n\\n public defineScheme(name: string): InputScheme {\\n const scheme = new InputScheme(name);\\n this.schemes.push(scheme);\\n return scheme;\\n }\\n\\n public getDevices(): InputDevice[] {\\n return this.devices;\\n }\\n}\\n\\n\",\"import { Directive, ElementRef, Input } from '@angular/core';\\n\\n@Directive({\\n selector: '[inputActionBinding]',\\n standalone: true\\n})\\nexport class ActionBindingDirective {\\n\\n @Input() inputActionBinding: string = '';\\n\\n private element: HTMLElement;\\n\\n constructor(\\n elementRef: ElementRef,\\n ) {\\n this.element = elementRef.nativeElement as HTMLElement;\\n }\\n\\n ngOnInit(): void {\\n this.element.setAttribute('action', this.inputActionBinding);\\n }\\n\\n}\\n\",\"import { Directive } from '@angular/core';\\nimport { KeyItemDirective, KeyItemEntry } from './key-item.directive';\\n\\n@Directive({\\n selector: '[inputKeyItemGroup]',\\n standalone: true\\n})\\nexport class KeyItemGroupDirective {\\n\\n static groups: KeyItemGroupDirective[] = [];\\n public items: KeyItemEntry[] = [];\\n\\n constructor() {\\n }\\n\\n ngOnInit() {\\n KeyItemDirective.SetCurrentItem();\\n KeyItemGroupDirective.groups.push(this);\\n }\\n\\n ngOnDestroy() {\\n const index = KeyItemGroupDirective.groups.findIndex(g => g === this);\\n if (index > -1) {\\n KeyItemGroupDirective.groups.splice(index, 1);\\n }\\n }\\n\\n}\\n\",\"import { Directive, ElementRef, HostListener, Input, OnDestroy, OnInit, Optional, Host } from '@angular/core';\\nimport { KeyItemGroupDirective } from './key-item-group.directive';\\n\\nexport interface ActionBindings {\\n [action: string]: () => undefined | boolean;\\n}\\n\\nexport interface KeyItemEntry {\\n element: HTMLKeyItemEntryElement;\\n top: number;\\n left: number;\\n}\\n\\ninterface HTMLKeyItemEntryElement extends HTMLElement {\\n keyId: number;\\n active: string;\\n actionBindings: ActionBindings;\\n activate: () => void;\\n deactivate: () => void;\\n focus: () => void;\\n blur: () => void;\\n}\\n\\n@Directive({\\n selector: '[inputKeyItem]',\\n standalone: true\\n})\\nexport class KeyItemDirective implements OnInit, OnDestroy {\\n\\n @Input() active = 'active';\\n @Input() activate: () => any = () => {};\\n @Input() deactivate: () => any = () => {};\\n @Input() focus: () => any = () => {};\\n @Input() blur: () => any = () => {};\\n @Input() actionBindings: ActionBindings = {};\\n private static allItems: KeyItemEntry[] = [];\\n private static current?: KeyItemEntry;\\n private element: HTMLKeyItemEntryElement;\\n private static NextId = 0;\\n private id = KeyItemDirective.NextId++;\\n\\n constructor(\\n @Optional() private group: KeyItemGroupDirective,\\n elementRef: ElementRef,\\n ) {\\n this.element = elementRef.nativeElement as HTMLKeyItemEntryElement;\\n }\\n\\n public static FireAction(action: string): boolean {\\n const item = KeyItemDirective.current;\\n if (item) {\\n return item.element.actionBindings?.[action]?.() ?? true;\\n }\\n\\n return true;\\n }\\n\\n ngOnInit() {\\n this.element.active = this.active;\\n this.element.activate = this.activate;\\n this.element.deactivate = this.deactivate;\\n this.element.keyId = this.id;\\n this.element.actionBindings = this.actionBindings;\\n this.element.focus = this.focus;\\n this.element.blur = this.blur;\\n const position = this.element.getBoundingClientRect();\\n const item = {\\n element: this.element,\\n top: position.top + position.height / 2,\\n left: position.left + position.width / 2,\\n };\\n KeyItemDirective.allItems.push(item);\\n this.group?.items.push(item);\\n if (this.group) {\\n this.group.items = this.group.items.sort((a, b) => {\\n const tabIndexA = a.element.tabIndex;\\n const tabIndexB = b.element.tabIndex;\\n return tabIndexA - tabIndexB;\\n });\\n }\\n }\\n\\n ngOnDestroy() {\\n const index = KeyItemDirective.allItems.findIndex(item => item.element.keyId === this.id);\\n if (index > -1) {\\n KeyItemDirective.allItems.splice(index, 1);\\n }\\n\\n if (this.group) {\\n const index = this.group.items.findIndex(item => item.element.keyId === this.id);\\n if (index > -1) {\\n this.group.items.splice(index, 1);\\n }\\n }\\n }\\n\\n @HostListener('mouseenter')\\n onHover() {\\n if (this.active && !this.element.classList.contains(this.active)) {\\n this.element.classList.add(this.active);\\n }\\n\\n this.focus();\\n\\n const item = KeyItemDirective.allItems.find(item => item.element.keyId === this.id);\\n KeyItemDirective.SetCurrentItem(item);\\n }\\n\\n @HostListener('mouseleave')\\n onLeave() {\\n if (this.active && this.element.classList.contains(this.active)) {\\n this.element.classList.remove(this.active);\\n }\\n\\n this.blur();\\n }\\n\\n static ActivateCurrentItem() {\\n this.current?.element.activate.bind(this.current?.element)();\\n }\\n\\n static getCurrentGroup() {\\n if (KeyItemGroupDirective.groups.length === 0) {\\n return null;\\n }\\n return KeyItemGroupDirective.groups[KeyItemGroupDirective.groups.length - 1];\\n }\\n\\n static SelectNexItem(fromAngleDeg: number, toAngleDeg: number) {\\n this.updateItems();\\n let current = this.current;\\n let allItems = this.allItems;\\n const currentGroup = this.getCurrentGroup();\\n if (currentGroup) {\\n const isCurrentInCurrentGroup = this.current && currentGroup.items.some(i => i.element.keyId === this.current!.element.keyId);\\n allItems = currentGroup.items;\\n if (!isCurrentInCurrentGroup) {\\n current = undefined;\\n }\\n }\\n if (current) {\\n const list = allItems.map(item => {\\n const distance = Math.sqrt(Math.pow(item.top - this.current!.top, 2) + Math.pow(item.left - this.current!.left, 2));\\n const angle = 90 + Math.atan2(item.top - this.current!.top, item.left - this.current!.left) * 180 / Math.PI;\\n return {\\n item,\\n distance,\\n angle,\\n };\\n })\\n .filter(item => {\\n const angle = item.angle;\\n const normalizedAngle = angle < 0 ? angle + 360 : angle;\\n return normalizedAngle >= fromAngleDeg && normalizedAngle <= toAngleDeg && item.distance > 0;\\n })\\n .sort((a, b) => a.distance - b.distance);\\n\\n if (list.length > 0) {\\n this.SetCurrentItem(list[0].item);\\n } else {\\n let index = allItems.findIndex(i => i.element.keyId === this.current!.element.keyId);\\n index = (index + 1) % allItems.length;\\n this.SetCurrentItem(allItems[index]);\\n }\\n } else {\\n this.SetCurrentItem(allItems[0]);\\n }\\n }\\n\\n static SetCurrentItem(item?: KeyItemEntry) {\\n if (this.current?.element.active && this.current.element.classList.contains(this.current.element.active)) {\\n this.current.element.classList.remove(this.current.element.active);\\n }\\n this.current?.element.blur();\\n this.current = item;\\n this.current?.element.focus();\\n if (this.current?.element.active && !this.current.element.classList.contains(this.current.element.active)) {\\n this.current.element.classList.add(this.current.element.active);\\n }\\n }\\n\\n static updateItems() {\\n this.allItems.forEach(item => {\\n const position = item.element.getBoundingClientRect();\\n item.top = position.top + position.height / 2;\\n item.left = position.left + position.width / 2;\\n });\\n }\\n}\\n\",\"import { NgModule } from '@angular/core';\\nimport { CommonModule } from '@angular/common';\\nimport { ActionBindingDirective } from './directives/action-binding.directive';\\nimport { KeyItemDirective } from './directives/key-item.directive';\\nimport { KeyItemGroupDirective } from './directives/key-item-group.directive';\\n\\n@NgModule({\\n declarations: [],\\n imports: [\\n CommonModule,\\n ActionBindingDirective,\\n KeyItemDirective,\\n KeyItemGroupDirective,\\n ],\\n exports: [\\n ActionBindingDirective,\\n KeyItemDirective,\\n KeyItemGroupDirective,\\n ],\\n})\\nexport class NavigationModule { }\\n\",\"/*\\n * Public API Surface of input\\n */\\n\\nexport * from './lib/modules/input/input-module';\\n\\nexport * from './lib/modules/input/services/input.service';\\nexport * from './lib/modules/input/models/input-action';\\nexport * from './lib/modules/input/models/input-device';\\nexport * from './lib/modules/input/models/input-scheme';\\nexport * from './lib/modules/input/models/devices/input-gamepad';\\nexport * from './lib/modules/input/models/devices/input-keyboard';\\n\\n\\n\\nexport * from './lib/modules/navigation/navigation-module';\\n\\nexport * from './lib/modules/navigation/directives/action-binding.directive';\\nexport * from './lib/modules/navigation/directives/key-item-group.directive';\\nexport * from './lib/modules/navigation/directives/key-item.directive';\\n\\n\",\"/**\\n * Generated bundle index. Do not edit.\\n */\\n\\nexport * from './public-api';\\n\"],\"names\":[\"i1.KeyItemGroupDirective\"],\"mappings\":\"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\"}","type":"asset"}]} \ No newline at end of file diff --git a/.angular/cache/20.1.3/ng-packagr/tsbuildinfo/webland-input.tsbuildinfo b/.angular/cache/20.1.3/ng-packagr/tsbuildinfo/webland-input.tsbuildinfo new file mode 100644 index 0000000..7e71401 --- /dev/null +++ b/.angular/cache/20.1.3/ng-packagr/tsbuildinfo/webland-input.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../../../../../../node_modules/typescript/lib/lib.es5.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../../../../../node_modules/typescript/lib/lib.dom.d.ts","../../../../../../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../../../../../node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../../../../../../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../../../../../../node_modules/typescript/lib/lib.scripthost.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../../../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../../../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../../../../../node_modules/typescript/lib/lib.es2022.full.d.ts","../../../../../../../node_modules/tslib/modules/index.d.ts","../../../../../src/public-api.ngtypecheck.ts","../../../../../src/lib/modules/input/input-module.ngtypecheck.ts","../../../../../../../node_modules/@angular/core/graph.d.d.ts","../../../../../../../node_modules/@angular/core/event_dispatcher.d.d.ts","../../../../../../../node_modules/@angular/core/chrome_dev_tools_performance.d.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/Subscription.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/Subscriber.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/Operator.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/Observable.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/types.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/audit.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/auditTime.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/buffer.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/bufferCount.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/bufferTime.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/bufferToggle.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/bufferWhen.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/catchError.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/combineLatestAll.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/combineAll.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/combineLatest.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/combineLatestWith.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/concat.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/concatAll.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/concatMap.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/concatMapTo.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/concatWith.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/connect.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/count.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/debounce.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/debounceTime.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/defaultIfEmpty.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/delay.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/delayWhen.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/dematerialize.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/distinct.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/distinctUntilChanged.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/distinctUntilKeyChanged.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/elementAt.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/endWith.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/every.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/exhaustAll.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/exhaust.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/exhaustMap.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/expand.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/filter.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/finalize.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/find.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/findIndex.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/first.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/Subject.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/groupBy.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/ignoreElements.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/isEmpty.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/last.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/map.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/mapTo.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/Notification.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/materialize.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/max.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/merge.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/mergeAll.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/mergeMap.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/flatMap.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/mergeMapTo.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/mergeScan.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/mergeWith.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/min.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/ConnectableObservable.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/multicast.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/observeOn.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/onErrorResumeNextWith.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/pairwise.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/partition.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/pluck.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/publish.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/publishBehavior.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/publishLast.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/publishReplay.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/race.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/raceWith.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/reduce.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/repeat.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/repeatWhen.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/retry.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/retryWhen.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/refCount.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/sample.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/sampleTime.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/scan.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/sequenceEqual.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/share.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/shareReplay.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/single.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/skip.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/skipLast.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/skipUntil.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/skipWhile.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/startWith.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/subscribeOn.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/switchAll.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/switchMap.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/switchMapTo.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/switchScan.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/take.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/takeLast.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/takeUntil.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/takeWhile.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/tap.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/throttle.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/throttleTime.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/throwIfEmpty.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/timeInterval.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/timeout.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/timeoutWith.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/timestamp.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/toArray.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/window.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/windowCount.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/windowTime.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/windowToggle.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/windowWhen.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/withLatestFrom.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/zip.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/zipAll.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/operators/zipWith.d.ts","../../../../../../../node_modules/rxjs/dist/types/operators/index.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/scheduler/Action.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/Scheduler.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/testing/TestMessage.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/testing/SubscriptionLog.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/testing/SubscriptionLoggable.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/testing/ColdObservable.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/testing/HotObservable.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/scheduler/AsyncScheduler.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/scheduler/timerHandle.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/scheduler/AsyncAction.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/scheduler/VirtualTimeScheduler.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/testing/TestScheduler.d.ts","../../../../../../../node_modules/rxjs/dist/types/testing/index.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/symbol/observable.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/dom/animationFrames.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/BehaviorSubject.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/ReplaySubject.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/AsyncSubject.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/scheduler/AsapScheduler.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/scheduler/asap.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/scheduler/async.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/scheduler/QueueScheduler.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/scheduler/queue.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/scheduler/AnimationFrameScheduler.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/scheduler/animationFrame.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/util/identity.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/util/pipe.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/util/noop.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/util/isObservable.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/lastValueFrom.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/firstValueFrom.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/util/ArgumentOutOfRangeError.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/util/EmptyError.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/util/NotFoundError.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/util/ObjectUnsubscribedError.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/util/SequenceError.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/util/UnsubscriptionError.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/bindCallback.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/bindNodeCallback.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/AnyCatcher.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/combineLatest.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/concat.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/connectable.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/defer.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/empty.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/forkJoin.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/from.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/fromEvent.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/fromEventPattern.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/generate.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/iif.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/interval.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/merge.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/never.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/of.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/onErrorResumeNext.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/pairs.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/partition.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/race.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/range.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/throwError.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/timer.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/using.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/observable/zip.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/scheduled/scheduled.d.ts","../../../../../../../node_modules/rxjs/dist/types/internal/config.d.ts","../../../../../../../node_modules/rxjs/dist/types/index.d.ts","../../../../../../../node_modules/@angular/core/signal.d.d.ts","../../../../../../../node_modules/@angular/core/primitives/di/index.d.ts","../../../../../../../node_modules/@angular/core/discovery.d.d.ts","../../../../../../../node_modules/@angular/core/api.d.d.ts","../../../../../../../node_modules/@angular/core/weak_ref.d.d.ts","../../../../../../../node_modules/@angular/core/index.d.ts","../../../../../../../node_modules/@angular/common/platform_location.d.d.ts","../../../../../../../node_modules/@angular/common/common_module.d.d.ts","../../../../../../../node_modules/@angular/common/xhr.d.d.ts","../../../../../../../node_modules/@angular/common/index.d.ts","../../../../../src/lib/modules/input/input-module.ts","../../../../../src/lib/modules/input/services/input.service.ngtypecheck.ts","../../../../../src/lib/modules/input/models/input-scheme.ngtypecheck.ts","../../../../../src/lib/modules/input/models/input-action.ngtypecheck.ts","../../../../../src/lib/modules/input/models/input-action.ts","../../../../../src/lib/modules/input/models/input-device.ngtypecheck.ts","../../../../../src/lib/modules/input/models/input-device.ts","../../../../../src/lib/modules/input/models/input-scheme.ts","../../../../../src/lib/modules/input/models/devices/input-keyboard.ngtypecheck.ts","../../../../../src/lib/modules/input/models/devices/input-keyboard.ts","../../../../../src/lib/modules/input/models/devices/input-gamepad.ngtypecheck.ts","../../../../../src/lib/modules/input/models/devices/input-gamepad.ts","../../../../../src/lib/modules/input/services/input.service.ts","../../../../../src/lib/modules/navigation/navigation-module.ngtypecheck.ts","../../../../../src/lib/modules/navigation/directives/action-binding.directive.ngtypecheck.ts","../../../../../src/lib/modules/navigation/directives/action-binding.directive.ts","../../../../../src/lib/modules/navigation/directives/key-item.directive.ngtypecheck.ts","../../../../../src/lib/modules/navigation/directives/key-item-group.directive.ngtypecheck.ts","../../../../../src/lib/modules/navigation/directives/key-item-group.directive.ts","../../../../../src/lib/modules/navigation/directives/key-item.directive.ts","../../../../../src/lib/modules/navigation/navigation-module.ts","../../../../../src/public-api.ts","../../../../../src/webland-input.ts"],"fileIdsList":[[258,264,265],[258,264,265,266,267],[264],[69],[67,68],[67,68,69,258,259,260],[67,68,69,258,259,260,261,262,263],[67],[70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,86,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,126,127,128,129,130,131,132,133,134,135,136,137,139,140,141,142,143,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,189,190,191,193,202,204,205,206,207,208,209,211,212,214,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257],[115],[73,74],[70,71,72,74],[71,74],[74,115],[70,74,192],[72,73,74],[70,74],[74],[73],[70,73,115],[71,73,74,231],[73,74,231],[73,239],[71,73,74],[83],[106],[127],[73,74,115],[74,122],[73,74,115,133],[73,74,133],[74,174],[70,74,193],[199,201],[70,74,192,199,200],[192,193,201],[199],[70,74,199,200,201],[215],[210],[213],[71,73,193,194,195,196],[115,193,194,195,196],[193,195],[73,194,195,197,198,202],[70,73],[74,217],[75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,116,117,118,119,120,121,123,124,125,126,127,128,129,130,131,132,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190],[203],[64],[64,66,264,268],[64,264,275,279],[64,275,277],[64,272,276],[64,264,273,274,276],[64,258,271,273,275],[64,258,264,270,273,275,276,278,280],[64,264,283],[64,264,286,288],[64,264,285,287],[64,264,268,282,284,287,288],[64,65,269,273,275,276,278,280,281,284,287,288,289],[64,290]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"3cbad9a1ba4453443026ed38e4b8be018abb26565fa7c944376463ad9df07c41","impliedFormat":1},{"version":"e8ea49a7694972d588676a92d3cf90a73cc1ede0067d2fd34daa21a0c93e8fe4","impliedFormat":99},{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"e3af13c7fd35174366ce0effd9f03ebe553f29b5723c83dcc051ee7ef5a03513","impliedFormat":99},{"version":"d59105aa51f45f4508bef7088aaf9c5ae287203e30ee06945d123b0e88f31bce","affectsGlobalScope":true,"impliedFormat":99},{"version":"7fe92d6c1aba4fc03014313c7d7e7047a9c899375230cc6b459213d71cc35edc","affectsGlobalScope":true,"impliedFormat":99},{"version":"073ca26c96184db9941b5ec0ddea6981c9b816156d9095747809e524fdd90e35","impliedFormat":1},{"version":"e41d17a2ec23306d953cda34e573ed62954ca6ea9b8c8b74e013d07a6886ce47","impliedFormat":1},{"version":"241bd4add06f06f0699dcd58f3b334718d85e3045d9e9d4fa556f11f4d1569c1","impliedFormat":1},{"version":"2ae3787e1498b20aad1b9c2ee9ea517ec30e89b70d242d8e3e52d1e091039695","impliedFormat":1},{"version":"c7c72c4cffb1bc83617eefed71ed68cc89df73cab9e19507ccdecb3e72b4967e","affectsGlobalScope":true,"impliedFormat":1},{"version":"b8bff8a60af0173430b18d9c3e5c443eaa3c515617210c0c7b3d2e1743c19ecb","impliedFormat":1},{"version":"38b38db08e7121828294dec10957a7a9ff263e33e2a904b346516d4a4acca482","impliedFormat":1},{"version":"a76ebdf2579e68e4cfe618269c47e5a12a4e045c2805ed7f7ab37af8daa6b091","impliedFormat":1},{"version":"8a2aaea564939c22be05d665cc955996721bad6d43148f8fa21ae8f64afecd37","impliedFormat":1},{"version":"e59d36b7b6e8ba2dd36d032a5f5c279d2460968c8b4e691ca384f118fb09b52a","impliedFormat":1},{"version":"e96885c0684c9042ec72a9a43ef977f6b4b4a2728f4b9e737edcbaa0c74e5bf6","impliedFormat":1},{"version":"95950a187596e206d32d5d9c7b932901088c65ed8f9040e614aa8e321e0225ef","impliedFormat":1},{"version":"89e061244da3fc21b7330f4bd32f47c1813dd4d7f1dc3d0883d88943f035b993","impliedFormat":1},{"version":"e46558c2e04d06207b080138678020448e7fc201f3d69c2601b0d1456105f29a","impliedFormat":1},{"version":"71549375db52b1163411dba383b5f4618bdf35dc57fa327a1c7d135cf9bf67d1","impliedFormat":1},{"version":"7e6b2d61d6215a4e82ea75bc31a80ebb8ad0c2b37a60c10c70dd671e8d9d6d5d","impliedFormat":1},{"version":"78bea05df2896083cca28ed75784dde46d4b194984e8fc559123b56873580a23","impliedFormat":1},{"version":"5dd04ced37b7ea09f29d277db11f160df7fd73ba8b9dba86cb25552e0653a637","impliedFormat":1},{"version":"f74b81712e06605677ae1f061600201c425430151f95b5ef4d04387ad7617e6a","impliedFormat":1},{"version":"9a72847fcf4ac937e352d40810f7b7aec7422d9178451148296cf1aa19467620","impliedFormat":1},{"version":"3ae18f60e0b96fa1e025059b7d25b3247ba4dcb5f4372f6d6e67ce2adac74eac","impliedFormat":1},{"version":"2b9260f44a2e071450ae82c110f5dc8f330c9e5c3e85567ed97248330f2bf639","impliedFormat":1},{"version":"4f196e13684186bda6f5115fc4677a87cf84a0c9c4fc17b8f51e0984f3697b6d","impliedFormat":1},{"version":"61419f2c5822b28c1ea483258437c1faab87d00c6f84481aa22afb3380d8e9a4","impliedFormat":1},{"version":"64479aee03812264e421c0bf5104a953ca7b02740ba80090aead1330d0effe91","impliedFormat":1},{"version":"0521108c9f8ddb17654a0a54dae6ba9667c99eddccfd6af5748113e022d1c37a","impliedFormat":1},{"version":"c5570e504be103e255d80c60b56c367bf45d502ca52ee35c55dec882f6563b5c","impliedFormat":1},{"version":"ee764e6e9a7f2b987cc1a2c0a9afd7a8f4d5ebc4fdb66ad557a7f14a8c2bd320","impliedFormat":1},{"version":"0520b5093712c10c6ef23b5fea2f833bf5481771977112500045e5ea7e8e2b69","impliedFormat":1},{"version":"5c3cf26654cf762ac4d7fd7b83f09acfe08eef88d2d6983b9a5a423cb4004ca3","impliedFormat":1},{"version":"e60fa19cf7911c1623b891155d7eb6b7e844e9afdf5738e3b46f3b687730a2bd","impliedFormat":1},{"version":"b1fd72ff2bb0ba91bb588f3e5329f8fc884eb859794f1c4657a2bfa122ae54d0","impliedFormat":1},{"version":"6cf42a4f3cfec648545925d43afaa8bb364ac10a839ffed88249da109361b275","impliedFormat":1},{"version":"d7058e75920120b142a9d57be25562a3cd9a936269fd52908505f530105f2ec4","impliedFormat":1},{"version":"6df52b70d7f7702202f672541a5f4a424d478ee5be51a9d37b8ccbe1dbf3c0f2","impliedFormat":1},{"version":"0ca7f997e9a4d8985e842b7c882e521b6f63233c4086e9fe79dd7a9dc4742b5e","impliedFormat":1},{"version":"91046b5c6b55d3b194c81fd4df52f687736fad3095e9d103ead92bb64dc160ee","impliedFormat":1},{"version":"db5704fdad56c74dfc5941283c1182ed471bd17598209d3ac4a49faa72e43cfc","impliedFormat":1},{"version":"758e8e89559b02b81bc0f8fd395b17ad5aff75490c862cbe369bb1a3d1577c40","impliedFormat":1},{"version":"2ee64342c077b1868f1834c063f575063051edd6e2964257d34aad032d6b657c","impliedFormat":1},{"version":"6f6b4b3d670b6a5f0e24ea001c1b3d36453c539195e875687950a178f1730fa7","impliedFormat":1},{"version":"a472a1d3f25ce13a1d44911cd3983956ac040ce2018e155435ea34afb25f864c","impliedFormat":1},{"version":"b48b83a86dd9cfe36f8776b3ff52fcd45b0e043c0538dc4a4b149ba45fe367b9","impliedFormat":1},{"version":"792de5c062444bd2ee0413fb766e57e03cce7cdaebbfc52fc0c7c8e95069c96b","impliedFormat":1},{"version":"a79e3e81094c7a04a885bad9b049c519aace53300fb8a0fe4f26727cb5a746ce","impliedFormat":1},{"version":"93181bac0d90db185bb730c95214f6118ae997fe836a98a49664147fbcaf1988","impliedFormat":1},{"version":"8a4e89564d8ea66ad87ee3762e07540f9f0656a62043c910d819b4746fc429c5","impliedFormat":1},{"version":"b9011d99942889a0f95e120d06b698c628b0b6fdc3e6b7ecb459b97ed7d5bcc6","impliedFormat":1},{"version":"4d639cbbcc2f8f9ce6d55d5d503830d6c2556251df332dc5255d75af53c8a0e7","impliedFormat":1},{"version":"cdb48277f600ab5f429ecf1c5ea046683bc6b9f73f3deab9a100adac4b34969c","impliedFormat":1},{"version":"75be84956a29040a1afbe864c0a7a369dfdb739380072484eff153905ef867ee","impliedFormat":1},{"version":"b06b4adc2ae03331a92abd1b19af8eb91ec2bf8541747ee355887a167d53145e","impliedFormat":1},{"version":"c54166a85bd60f86d1ebb90ce0117c0ecb850b8a33b366691629fdf26f1bbbd8","impliedFormat":1},{"version":"0d417c15c5c635384d5f1819cc253a540fe786cc3fda32f6a2ae266671506a21","impliedFormat":1},{"version":"80f23f1d60fbed356f726b3b26f9d348dddbb34027926d10d59fad961e70a730","impliedFormat":1},{"version":"cb59317243a11379a101eb2f27b9df1022674c3df1df0727360a0a3f963f523b","impliedFormat":1},{"version":"cc20bb2227dd5de0aab0c8d697d1572f8000550e62c7bf5c92f212f657dd88c5","impliedFormat":1},{"version":"06b8a7d46195b6b3980e523ef59746702fd210b71681a83a5cf73799623621f9","impliedFormat":1},{"version":"860e4405959f646c101b8005a191298b2381af8f33716dc5f42097e4620608f8","impliedFormat":1},{"version":"f7e32adf714b8f25d3c1783473abec3f2e82d5724538d8dcf6f51baaaff1ca7a","impliedFormat":1},{"version":"d0da80c845999a16c24d0783033fb5366ada98df17867c98ad433ede05cd87fd","impliedFormat":1},{"version":"bfbf80f9cd4558af2d7b2006065340aaaced15947d590045253ded50aabb9bc5","impliedFormat":1},{"version":"fd9a991b51870325e46ebb0e6e18722d313f60cd8e596e645ec5ac15b96dbf4e","impliedFormat":1},{"version":"c3bd2b94e4298f81743d92945b80e9b56c1cdfb2bef43c149b7106a2491b1fc9","impliedFormat":1},{"version":"a246cce57f558f9ebaffd55c1e5673da44ea603b4da3b2b47eb88915d30a9181","impliedFormat":1},{"version":"d993eacc103c5a065227153c9aae8acea3a4322fe1a169ee7c70b77015bf0bb2","impliedFormat":1},{"version":"fc2b03d0c042aa1627406e753a26a1eaad01b3c496510a78016822ef8d456bb6","impliedFormat":1},{"version":"063c7ebbe756f0155a8b453f410ca6b76ffa1bbc1048735bcaf9c7c81a1ce35f","impliedFormat":1},{"version":"314e402cd481370d08f63051ae8b8c8e6370db5ee3b8820eeeaaf8d722a6dac6","impliedFormat":1},{"version":"9669075ac38ce36b638b290ba468233980d9f38bdc62f0519213b2fd3e2552ec","impliedFormat":1},{"version":"4d123de012c24e2f373925100be73d50517ac490f9ed3578ac82d0168bfbd303","impliedFormat":1},{"version":"656c9af789629aa36b39092bee3757034009620439d9a39912f587538033ce28","impliedFormat":1},{"version":"3ac3f4bdb8c0905d4c3035d6f7fb20118c21e8a17bee46d3735195b0c2a9f39f","impliedFormat":1},{"version":"1f453e6798ed29c86f703e9b41662640d4f2e61337007f27ac1c616f20093f69","impliedFormat":1},{"version":"af43b7871ff21c62bf1a54ec5c488e31a8d3408d5b51ff2e9f8581b6c55f2fc7","impliedFormat":1},{"version":"70550511d25cbb0b6a64dcac7fffc3c1397fd4cbeb6b23ccc7f9b794ab8a6954","impliedFormat":1},{"version":"af0fbf08386603a62f2a78c42d998c90353b1f1d22e05a384545f7accf881e0a","impliedFormat":1},{"version":"cefc20054d20b85b534206dbcedd509bb74f87f3d8bc45c58c7be3a76caa45e1","impliedFormat":1},{"version":"ad6eee4877d0f7e5244d34bc5026fd6e9cf8e66c5c79416b73f9f6ebf132f924","impliedFormat":1},{"version":"4888fd2bcfee9a0ce89d0df860d233e0cee8ee9c479b6bd5a5d5f9aae98342fe","impliedFormat":1},{"version":"f4749c102ced952aa6f40f0b579865429c4869f6d83df91000e98005476bee87","impliedFormat":1},{"version":"56654d2c5923598384e71cb808fac2818ca3f07dd23bb018988a39d5e64f268b","impliedFormat":1},{"version":"8b6719d3b9e65863da5390cb26994602c10a315aa16e7d70778a63fee6c4c079","impliedFormat":1},{"version":"05f56cd4b929977d18df8f3d08a4c929a2592ef5af083e79974b20a063f30940","impliedFormat":1},{"version":"547d3c406a21b30e2b78629ecc0b2ddaf652d9e0bdb2d59ceebce5612906df33","impliedFormat":1},{"version":"b3a4f9385279443c3a5568ec914a9492b59a723386161fd5ef0619d9f8982f97","impliedFormat":1},{"version":"3fe66aba4fbe0c3ba196a4f9ed2a776fe99dc4d1567a558fb11693e9fcc4e6ed","impliedFormat":1},{"version":"140eef237c7db06fc5adcb5df434ee21e81ee3a6fd57e1a75b8b3750aa2df2d8","impliedFormat":1},{"version":"0944ec553e4744efae790c68807a461720cff9f3977d4911ac0d918a17c9dd99","impliedFormat":1},{"version":"cb46b38d5e791acaa243bf342b8b5f8491639847463ac965b93896d4fb0af0d9","impliedFormat":1},{"version":"7c7d9e116fe51100ff766703e6b5e4424f51ad8977fe474ddd8d0959aa6de257","impliedFormat":1},{"version":"af70a2567e586be0083df3938b6a6792e6821363d8ef559ad8d721a33a5bcdaf","impliedFormat":1},{"version":"006cff3a8bcb92d77953f49a94cd7d5272fef4ab488b9052ef82b6a1260d870b","impliedFormat":1},{"version":"7d44bfdc8ee5e9af70738ff652c622ae3ad81815e63ab49bdc593d34cb3a68e5","impliedFormat":1},{"version":"339814517abd4dbc7b5f013dfd3b5e37ef0ea914a8bbe65413ecffd668792bc6","impliedFormat":1},{"version":"34d5bc0a6958967ec237c99f980155b5145b76e6eb927c9ffc57d8680326b5d8","impliedFormat":1},{"version":"9eae79b70c9d8288032cbe1b21d0941f6bd4f315e14786b2c1d10bccc634e897","impliedFormat":1},{"version":"18ce015ed308ea469b13b17f99ce53bbb97975855b2a09b86c052eefa4aa013a","impliedFormat":1},{"version":"5a931bc4106194e474be141e0bc1046629510dc95b9a0e4b02a3783847222965","impliedFormat":1},{"version":"5e5f371bf23d5ced2212a5ff56675aefbd0c9b3f4d4fdda1b6123ac6e28f058c","impliedFormat":1},{"version":"907c17ad5a05eecb29b42b36cc8fec6437be27cc4986bb3a218e4f74f606911c","impliedFormat":1},{"version":"ce60a562cd2a92f37a88f2ddd99a3abfbc5848d7baf38c48fb8d3243701fcb75","impliedFormat":1},{"version":"a726ad2d0a98bfffbe8bc1cd2d90b6d831638c0adc750ce73103a471eb9a891c","impliedFormat":1},{"version":"f44c0c8ce58d3dacac016607a1a90e5342d830ea84c48d2e571408087ae55894","impliedFormat":1},{"version":"75a315a098e630e734d9bc932d9841b64b30f7a349a20cf4717bf93044eff113","impliedFormat":1},{"version":"9131d95e32b3d4611d4046a613e022637348f6cebfe68230d4e81b691e4761a1","impliedFormat":1},{"version":"b03aa292cfdcd4edc3af00a7dbd71136dd067ec70a7536b655b82f4dd444e857","impliedFormat":1},{"version":"b6e2b0448ced813b8c207810d96551a26e7d7bb73255eea4b9701698f78846d6","impliedFormat":1},{"version":"8ae10cd85c1bd94d2f2d17c4cbd25c068a4b2471c70c2d96434239f97040747a","impliedFormat":1},{"version":"9ed5b799c50467b0c9f81ddf544b6bcda3e34d92076d6cab183c84511e45c39f","impliedFormat":1},{"version":"b4fa87cc1833839e51c49f20de71230e259c15b2c9c3e89e4814acc1d1ef10de","impliedFormat":1},{"version":"e90ac9e4ac0326faa1bc39f37af38ace0f9d4a655cd6d147713c653139cf4928","impliedFormat":1},{"version":"ea27110249d12e072956473a86fd1965df8e1be985f3b686b4e277afefdde584","impliedFormat":1},{"version":"8776a368617ce51129b74db7d55c3373dadcce5d0701e61d106e99998922a239","impliedFormat":1},{"version":"5666075052877fe2fdddd5b16de03168076cf0f03fbca5c1d4a3b8f43cba570c","impliedFormat":1},{"version":"9108ab5af05418f599ab48186193b1b07034c79a4a212a7f73535903ba4ca249","impliedFormat":1},{"version":"bb4e2cdcadf9c9e6ee2820af23cee6582d47c9c9c13b0dca1baaffe01fbbcb5f","impliedFormat":1},{"version":"6e30d0b5a1441d831d19fe02300ab3d83726abd5141cbcc0e2993fa0efd33db4","impliedFormat":1},{"version":"423f28126b2fc8d8d6fa558035309000a1297ed24473c595b7dec52e5c7ebae5","impliedFormat":1},{"version":"fb30734f82083d4790775dae393cd004924ebcbfde49849d9430bf0f0229dd16","impliedFormat":1},{"version":"2c92b04a7a4a1cd9501e1be338bf435738964130fb2ad5bd6c339ee41224ac4c","impliedFormat":1},{"version":"c5c5f0157b41833180419dacfbd2bcce78fb1a51c136bd4bcba5249864d8b9b5","impliedFormat":1},{"version":"02ae43d5bae42efcd5a00d3923e764895ce056bca005a9f4e623aa6b4797c8af","impliedFormat":1},{"version":"db6e01f17012a9d7b610ae764f94a1af850f5d98c9c826ad61747dca0fb800bd","impliedFormat":1},{"version":"8a44b424edee7bb17dc35a558cc15f92555f14a0441205613e0e50452ab3a602","impliedFormat":1},{"version":"24a00d0f98b799e6f628373249ece352b328089c3383b5606214357e9107e7d5","impliedFormat":1},{"version":"33637e3bc64edd2075d4071c55d60b32bdb0d243652977c66c964021b6fc8066","impliedFormat":1},{"version":"0f0ad9f14dedfdca37260931fac1edf0f6b951c629e84027255512f06a6ebc4c","impliedFormat":1},{"version":"16ad86c48bf950f5a480dc812b64225ca4a071827d3d18ffc5ec1ae176399e36","impliedFormat":1},{"version":"8cbf55a11ff59fd2b8e39a4aa08e25c5ddce46e3af0ed71fb51610607a13c505","impliedFormat":1},{"version":"d5bc4544938741f5daf8f3a339bfbf0d880da9e89e79f44a6383aaf056fe0159","impliedFormat":1},{"version":"97f9169882d393e6f303f570168ca86b5fe9aab556e9a43672dae7e6bb8e6495","impliedFormat":1},{"version":"7c9adb3fcd7851497818120b7e151465406e711d6a596a71b807f3a17853cb58","impliedFormat":1},{"version":"6752d402f9282dd6f6317c8c048aaaac27295739a166eed27e00391b358fed9a","impliedFormat":1},{"version":"9fd7466b77020847dbc9d2165829796bf7ea00895b2520ff3752ffdcff53564b","impliedFormat":1},{"version":"fbfc12d54a4488c2eb166ed63bab0fb34413e97069af273210cf39da5280c8d6","impliedFormat":1},{"version":"85a84240002b7cf577cec637167f0383409d086e3c4443852ca248fc6e16711e","impliedFormat":1},{"version":"84794e3abd045880e0fadcf062b648faf982aa80cfc56d28d80120e298178626","impliedFormat":1},{"version":"053d8b827286a16a669a36ffc8ccc8acdf8cc154c096610aa12348b8c493c7b8","impliedFormat":1},{"version":"3cce4ce031710970fe12d4f7834375f5fd455aa129af4c11eb787935923ff551","impliedFormat":1},{"version":"8f62cbd3afbd6a07bb8c934294b6bfbe437021b89e53a4da7de2648ecfc7af25","impliedFormat":1},{"version":"62c3621d34fb2567c17a2c4b89914ebefbfbd1b1b875b070391a7d4f722e55dc","impliedFormat":1},{"version":"c05ac811542e0b59cb9c2e8f60e983461f0b0e39cea93e320fad447ff8e474f3","impliedFormat":1},{"version":"8e7a5b8f867b99cc8763c0b024068fb58e09f7da2c4810c12833e1ca6eb11c4f","impliedFormat":1},{"version":"132351cbd8437a463757d3510258d0fa98fd3ebef336f56d6f359cf3e177a3ce","impliedFormat":1},{"version":"df877050b04c29b9f8409aa10278d586825f511f0841d1ec41b6554f8362092b","impliedFormat":1},{"version":"33d1888c3c27d3180b7fd20bac84e97ecad94b49830d5dd306f9e770213027d1","impliedFormat":1},{"version":"ee942c58036a0de88505ffd7c129f86125b783888288c2389330168677d6347f","impliedFormat":1},{"version":"a3f317d500c30ea56d41501632cdcc376dae6d24770563a5e59c039e1c2a08ec","impliedFormat":1},{"version":"eb21ddc3a8136a12e69176531197def71dc28ffaf357b74d4bf83407bd845991","impliedFormat":1},{"version":"0c1651a159995dfa784c57b4ea9944f16bdf8d924ed2d8b3db5c25d25749a343","impliedFormat":1},{"version":"aaa13958e03409d72e179b5d7f6ec5c6cc666b7be14773ae7b6b5ee4921e52db","impliedFormat":1},{"version":"0a86e049843ad02977a94bb9cdfec287a6c5a0a4b6b5391a6648b1a122072c5a","impliedFormat":1},{"version":"40f06693e2e3e58526b713c937895c02e113552dc8ba81ecd49cdd9596567ddb","impliedFormat":1},{"version":"4ed5e1992aedb174fb8f5aa8796aa6d4dcb8bd819b4af1b162a222b680a37fa0","impliedFormat":1},{"version":"d7f4bd46a8b97232ea6f8c28012b8d2b995e55e729d11405f159d3e00c51420a","impliedFormat":1},{"version":"d604d413aff031f4bfbdae1560e54ebf503d374464d76d50a2c6ded4df525712","impliedFormat":1},{"version":"e4f4f9cf1e3ac9fd91ada072e4d428ecbf0aa6dc57138fb797b8a0ca3a1d521c","impliedFormat":1},{"version":"12bfd290936824373edda13f48a4094adee93239b9a73432db603127881a300d","impliedFormat":1},{"version":"340ceb3ea308f8e98264988a663640e567c553b8d6dc7d5e43a8f3b64f780374","impliedFormat":1},{"version":"c5a769564e530fba3ec696d0a5cff1709b9095a0bdf5b0826d940d2fc9786413","impliedFormat":1},{"version":"7124ef724c3fc833a17896f2d994c368230a8d4b235baed39aa8037db31de54f","impliedFormat":1},{"version":"5de1c0759a76e7710f76899dcae601386424eab11fb2efaf190f2b0f09c3d3d3","impliedFormat":1},{"version":"9c5ee8f7e581f045b6be979f062a61bf076d362bf89c7f966b993a23424e8b0d","impliedFormat":1},{"version":"1a11df987948a86aa1ec4867907c59bdf431f13ed2270444bf47f788a5c7f92d","impliedFormat":1},{"version":"8018dd2e95e7ce6e613ddd81672a54532614dc745520a2f9e3860ff7fb1be0ca","impliedFormat":1},{"version":"b756781cd40d465da57d1fc6a442c34ae61fe8c802d752aace24f6a43fedacee","impliedFormat":1},{"version":"0fe76167c87289ea094e01616dcbab795c11b56bad23e1ef8aba9aa37e93432a","impliedFormat":1},{"version":"3a45029dba46b1f091e8dc4d784e7be970e209cd7d4ff02bd15270a98a9ba24b","impliedFormat":1},{"version":"032c1581f921f8874cf42966f27fd04afcabbb7878fa708a8251cac5415a2a06","impliedFormat":1},{"version":"69c68ed9652842ce4b8e495d63d2cd425862104c9fb7661f72e7aa8a9ef836f8","impliedFormat":1},{"version":"0e704ee6e9fd8b6a5a7167886f4d8915f4bc22ed79f19cb7b32bd28458f50643","impliedFormat":1},{"version":"06f62a14599a68bcde148d1efd60c2e52e8fa540cc7dcfa4477af132bb3de271","impliedFormat":1},{"version":"904a96f84b1bcee9a7f0f258d17f8692e6652a0390566515fe6741a5c6db8c1c","impliedFormat":1},{"version":"11f19ce32d21222419cecab448fa335017ebebf4f9e5457c4fa9df42fa2dcca7","impliedFormat":1},{"version":"2e8ee2cbb5e9159764e2189cf5547aebd0e6b0d9a64d479397bb051cd1991744","impliedFormat":1},{"version":"1b0471d75f5adb7f545c1a97c02a0f825851b95fe6e069ac6ecaa461b8bb321d","impliedFormat":1},{"version":"1d157c31a02b1e5cca9bc495b3d8d39f4b42b409da79f863fb953fbe3c7d4884","impliedFormat":1},{"version":"07baaceaec03d88a4b78cb0651b25f1ae0322ac1aa0b555ae3749a79a41cba86","impliedFormat":1},{"version":"619a132f634b4ebe5b4b4179ea5870f62f2cb09916a25957bff17b408de8b56d","impliedFormat":1},{"version":"f60fa446a397eb1aead9c4e568faf2df8068b4d0306ebc075fb4be16ed26b741","impliedFormat":1},{"version":"f3cb784be4d9e91f966a0b5052a098d9b53b0af0d341f690585b0cc05c6ca412","impliedFormat":1},{"version":"350f63439f8fe2e06c97368ddc7fb6d6c676d54f59520966f7dbbe6a4586014e","impliedFormat":1},{"version":"eba613b9b357ac8c50a925fa31dc7e65ff3b95a07efbaa684b624f143d8d34ba","impliedFormat":1},{"version":"45b74185005ed45bec3f07cac6e4d68eaf02ead9ff5a66721679fb28020e5e7c","impliedFormat":1},{"version":"0f6199602df09bdb12b95b5434f5d7474b1490d2cd8cc036364ab3ba6fd24263","impliedFormat":1},{"version":"c8ca7fd9ec7a3ec82185bfc8213e4a7f63ae748fd6fced931741d23ef4ea3c0f","impliedFormat":1},{"version":"5c6a8a3c2a8d059f0592d4eab59b062210a1c871117968b10797dee36d991ef7","impliedFormat":1},{"version":"ad77fd25ece8e09247040826a777dc181f974d28257c9cd5acb4921b51967bd8","impliedFormat":1},{"version":"08890d656cd37089ad3452264e38e4f64a428f3f99171d90a94305a177ae1e71","impliedFormat":99},{"version":"aeca22b7766d30bf409da9d7792dc19258afc87b7668edb639f7b876d9ab8bcf","impliedFormat":99},{"version":"6c64fdb0c208fd30608a86e210c2fc0bac2b822f047af2e60104c06a75da1751","impliedFormat":99},{"version":"07271646a8c285acc6e2a3d465d5e82b784b5a35a27a7694608ee9f4daef711c","impliedFormat":99},{"version":"e615df99d86ec472bd8f14f7936630d4979244da4dfbfe47dc913cdcfc94d8bd","impliedFormat":99},{"version":"1a3589dddb043d12c753946b4d348a080a57e22fc772eaab256075437e44ffd4","impliedFormat":99},{"version":"dbd6fffeca22795f0767d13e1ec91149e39a2394772b46b119e0533d432eafdf","impliedFormat":99},{"version":"e1da668917a116737e45302fb8977f9ea5d69227577b7682838a93fc6eedfbab","impliedFormat":99},{"version":"f8b5bc4b3c70ba780fe57828c6a7799ffd492400cfa1e298da31aca12a7ecac2","impliedFormat":99},{"version":"b8c0f6780193b7e5054e8ca16244ef8c6e16c1b7f48ca984b11262020c8b8a59","impliedFormat":99},{"version":"00293293255e50d8748a19aee2b9b7d737ac3ce002ecfd6746f658ca507728ef","signature":"5afdc3bf53fc198f0883c0f2fa67fad244614c8a8061057cb3621d4382d53b89"},{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"1fb525297a9bc933aaa96234464f6828a4e46dd64eafd06034a511c69d5ebebd","signature":"eea2a0ecfee2316f576ce4781ad441ce4850e131898de07413b17e6608be1f0a"},{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"374ba7a6634c0acbdadb211d7c4eff9df0ab7de6b943de68887ec3103d151cc8","signature":"dc144f73b816f85a63d89d31a3aa8769c88f842b31cab81c95fb9d2835f7a3d9"},{"version":"ea13dd8b3ca270fa6466ca9eb55967be5671bb8c5c6ee2f25d0e082b8d9728e9","signature":"6d4ea3d7ced921e1bf295bdb07d3d4bd01bce7d6b68bbb139a5d663747cb6f13"},{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"8c0db46a702628b300241f3ec134400ba01a31fa711ddba83a34d94be1485578","signature":"a8cfe5186b63aec6f5225dc3fcc08e9bdf85c6f3fd677ecf24bcd10b8d3aaa3d"},{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"c9a94e4e26c25aa0a504a05961a272ead55e0c51e8639a5321c1abcf831e4356","signature":"f520bdfb9fa1f638792c0345fa9f77e2a91dc4edd7834e5b27aa2bb4f4a0dfbe"},{"version":"300fb3d874f47629962ad8c93c8d324cb7f26e02bfaa043f97fca0065f8aa7a7","signature":"965b4694a6fc480809aa15900c59f33f2c5807fdb4b43d0ef145524c2a102076"},{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"d7ec10f975e05bea83c8d31c287211fe8fc4dc9ba05967a6262c97113f50b03c","signature":"5de5addddc24907530aa29f85f29e966451802692cd6147fbfb585791e32b511"},{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"90bb1cceb51dde8598af9db6f0b5ba2461995a013de58511c4ef01d004736622","signature":"3a6d6164cdbb2b47ef3b9659494375ab9e72628cb64f89f23ef5eed93e485524"},{"version":"d2ffad76c845373d6bee7f94a2c67a2b9e23ca10b8164194cf18eaa0446690aa","signature":"5a667d2f4fd709112b3363fe535dd35f050de308b41dde9901b9d79e2f167a95"},{"version":"b31131ac1a95b4da6e0b597511aebeab5dc42aef6514b7159e6e6f75e1450e17","signature":"c35e74243a387b27ef03f061404b2725022db3758cd735f73869096fe988c3ee"},{"version":"a88e42cadef280b69a130d089810aa63eefa87931a8bf0a30b2081640f785a5e","signature":"52f1fb7012986fc3ea17fa6264b0fb9c6621685ed2ed098743007a3ac156c540"},{"version":"269d25eb06209a2c77ae508fc403acce843266c8a3c2cc55b511a264b5c1868c","signature":"a6e63ff1d20e05856424a92ec807b9ae7622c530579ac3157f129c749a03c5a4"}],"root":[65,290,291],"options":{"composite":false,"declaration":true,"declarationDir":"../../../../../../../dist/input/tmp-typings","declarationMap":false,"experimentalDecorators":true,"importHelpers":true,"inlineSourceMap":false,"inlineSources":true,"module":200,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noPropertyAccessFromIndexSignature":true,"outDir":"../../../../../../../dist/input/tmp-esm2022","removeComments":false,"rootDir":"../../../../../src","skipLibCheck":true,"sourceMap":true,"sourceRoot":"","strict":true,"target":9,"tsBuildInfoFile":"./webland-input.tsbuildinfo"},"referencedMap":[[266,1],[268,2],[265,3],[262,4],[69,5],[261,6],[264,7],[259,8],[258,9],[209,10],[207,10],[122,11],[73,12],[72,13],[208,14],[193,15],[115,16],[71,17],[70,18],[257,13],[222,19],[221,19],[133,20],[229,11],[230,11],[232,21],[233,11],[234,18],[235,11],[206,11],[236,11],[237,22],[238,11],[239,19],[240,23],[241,11],[242,11],[243,11],[244,11],[245,19],[246,11],[247,11],[248,11],[249,11],[250,24],[251,11],[252,11],[253,11],[254,11],[255,11],[75,18],[76,18],[77,18],[78,18],[79,18],[80,18],[81,18],[82,11],[84,25],[85,18],[83,18],[86,18],[87,18],[88,18],[89,18],[90,18],[91,18],[92,11],[93,18],[94,18],[95,18],[96,18],[97,18],[98,11],[99,18],[100,18],[101,18],[102,18],[103,18],[104,18],[105,11],[107,26],[106,18],[108,18],[109,18],[110,18],[111,18],[112,24],[113,11],[114,11],[128,27],[116,28],[117,18],[118,18],[119,11],[120,18],[121,18],[123,29],[124,18],[125,18],[126,18],[127,18],[129,18],[130,18],[131,18],[132,18],[134,30],[135,18],[136,18],[137,18],[138,11],[139,18],[140,31],[141,31],[142,31],[143,11],[144,18],[145,18],[146,18],[151,18],[147,18],[148,11],[149,18],[150,11],[152,18],[153,18],[154,18],[155,18],[156,18],[157,18],[158,11],[159,18],[160,18],[161,18],[162,18],[163,18],[164,18],[165,18],[166,18],[167,18],[168,18],[169,18],[170,18],[171,18],[172,18],[173,18],[174,18],[175,32],[176,18],[177,18],[178,18],[179,18],[180,18],[181,18],[182,11],[183,11],[184,11],[185,11],[186,11],[187,18],[188,18],[189,18],[190,18],[256,11],[192,33],[215,34],[210,34],[201,35],[199,36],[213,37],[202,38],[216,39],[211,40],[212,37],[214,41],[197,42],[198,43],[196,44],[194,18],[203,45],[74,46],[220,19],[218,47],[191,48],[204,49],[64,50],[66,50],[269,51],[279,50],[280,52],[277,50],[278,53],[272,50],[273,54],[274,50],[275,55],[271,50],[276,56],[270,50],[281,57],[283,50],[284,58],[286,50],[287,59],[285,50],[288,60],[282,50],[289,61],[65,50],[290,62],[291,63]],"semanticDiagnosticsPerFile":[65,66,270,271,272,274,277,279,282,283,285,286],"version":"5.8.3"} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..187234e --- /dev/null +++ b/README.md @@ -0,0 +1,135 @@ +# @ngshack/input + +Biblioteka komponentów input i nawigacji dla aplikacji Webland z obsługą gamepadów. + +## Instalacja + +```bash +npm install @ngshack/input +``` + +## Development + +### Prerequisites +- Node.js 18+ +- Angular CLI 17+ + +### Setup +```bash +npm install +``` + +### Generate Components +```bash +# Generate new component +ng generate component components/my-component --project=input + +# Generate service +ng generate service services/my-service --project=input + +# Generate module +ng generate module modules/my-module --project=input +``` + +### Build Library +```bash +ng build input +``` + +### Test +```bash +ng test input +``` + +### Publish +```bash +npm run build:libs +npm publish dist/input +``` + +## Usage + +### Navigation Module + +```typescript +import { NavigationModule } from '@ngshack/input'; + +@Component({ + imports: [NavigationModule], + template: ` +
+ +
+ ` +}) +export class MyComponent { + onConfirm() { + console.log('Confirmed!'); + } +} +``` + +### Action Binding Directive + +```typescript +import { ActionBindingDirective } from '@ngshack/input'; + +@Component({ + imports: [ActionBindingDirective], + template: ` +
+ Back Button +
+ ` +}) +export class MyComponent { + goBack() { + // Handle back action + } +} +``` + +## Features + +- 🎮 Gamepad support +- ⌨️ Keyboard navigation +- 🖱️ Mouse/touch support +- 🎯 Action binding system +- 📱 Responsive design +- 🎨 Gaming console theme + +## Publishing the Library + +Once the project is built, you can publish your library by following these steps: + +1. Navigate to the `dist` directory: + ```bash + cd dist/input + ``` + +2. Run the `npm publish` command to publish your library to the npm registry: + ```bash + npm publish + ``` + +## Running unit tests + +To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command: + +```bash +ng test +``` + +## Running end-to-end tests + +For end-to-end (e2e) testing, run: + +```bash +ng e2e +``` + +Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs. + +## Additional Resources + +For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page. diff --git a/angular.json b/angular.json new file mode 100644 index 0000000..6820373 --- /dev/null +++ b/angular.json @@ -0,0 +1,65 @@ +{ + "$schema": "../../node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "input": { + "projectType": "library", + "schematics": { + "@schematics/angular:component": { + "style": "scss", + "flat": false, + "inlineTemplate": false, + "inlineStyle": false, + "type": "Component" + }, + "@schematics/angular:directive": { + "flat": false, + "type": "Directive" + }, + "@schematics/angular:pipe": { + "flat": false, + "type": "Pipe" + }, + "@schematics/angular:service": { + "flat": false, + "type": "Service" + }, + "@schematics/angular:module": { + "flat": false + }, + "@schematics/angular:guard": { + "flat": false, + "type": "Guard" + }, + "@schematics/angular:interceptor": { + "flat": false, + "type": "Interceptor" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "input", + "architect": { + "build": { + "builder": "@angular/build:ng-packagr", + "configurations": { + "production": { + "tsConfig": "tsconfig.lib.prod.json" + }, + "development": { + "tsConfig": "tsconfig.lib.json" + } + }, + "defaultConfiguration": "production" + }, + "test": { + "builder": "@angular/build:karma", + "options": { + "tsConfig": "tsconfig.spec.json" + } + } + } + } + } +} diff --git a/ng-package.json b/ng-package.json new file mode 100644 index 0000000..47a3f93 --- /dev/null +++ b/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/input", + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..26b33b9 --- /dev/null +++ b/package.json @@ -0,0 +1,41 @@ +{ + "name": "@ngshack/input", + "version": "0.0.1", + "description": "Webland input components library", + "author": "Webland Team", + "license": "MIT", + "keywords": ["angular", "input", "forms", "components", "webland"], + "repository": { + "type": "git", + "url": "https://github.com/webland/webland.git", + "directory": "app/packages/input" + }, + "homepage": "https://github.com/webland/webland#readme", + "bugs": { + "url": "https://github.com/webland/webland/issues" + }, + "main": "bundles/webland-input.umd.js", + "module": "fesm2022/webland-input.mjs", + "typings": "index.d.ts", + "exports": { + "./package.json": { + "default": "./package.json" + }, + ".": { + "types": "./index.d.ts", + "esm": "./fesm2022/webland-input.mjs", + "default": "./fesm2022/webland-input.mjs" + } + }, + "peerDependencies": { + "@angular/common": "^20.1.0", + "@angular/core": "^20.1.0" + }, + "dependencies": { + "tslib": "^2.3.0" + }, + "sideEffects": false, + "publishConfig": { + "access": "public" + } +} diff --git a/src/lib/modules/input/input-module.ts b/src/lib/modules/input/input-module.ts new file mode 100644 index 0000000..43eb818 --- /dev/null +++ b/src/lib/modules/input/input-module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@NgModule({ + declarations: [], + imports: [ + CommonModule, + ], + exports: [ + ] +}) +export class InputModule { } diff --git a/src/lib/modules/input/models/devices/input-gamepad.ts b/src/lib/modules/input/models/devices/input-gamepad.ts new file mode 100644 index 0000000..a43ad26 --- /dev/null +++ b/src/lib/modules/input/models/devices/input-gamepad.ts @@ -0,0 +1,143 @@ +import { EventEmitter } from "@angular/core"; +import { InputDevice } from "../input-device"; + +interface GamepadButtonState { + value: number; + angle?: number; + id: number; +} + +export class InputGamepad extends InputDevice { + + static listenerInited = false; + public static DeviceConnected = new EventEmitter(); + public static DeviceDisconnected = new EventEmitter(); + public static DeviceListChanged = new EventEmitter(); + private static gamepads: InputGamepad[] = []; + private stateUpdateAgent?: number; + private buttonState: GamepadButtonState[] = []; + public axesState: GamepadButtonState[] = []; + + constructor( + private gamepad: Gamepad + ) { + super(InputGamepad.GetName(gamepad), 'gamepad'); + } + + public static GetName(gamepad: Gamepad) { + return `${gamepad.id} #${gamepad.index}`; + } + + public getMapping() { + return this.gamepad.mapping; + } + + private static attachEvents() { + if (InputGamepad.listenerInited) { + return; + } + + window.addEventListener('gamepadconnected', e => this.updateGamepadStates(e)); + window.addEventListener('gamepaddisconnected', e => this.updateGamepadStates(e)); + + InputGamepad.listenerInited = true; + } + + public connect() { + this.gamepad.buttons.forEach((button, index) => { + this.buttonState.push({ + value: button.value, + angle: 0, + id: index, + }); + }); + + let axisIndex = 0; + + for (let i = 0; i < this.gamepad.axes.length; i+=2) { + const axis = { + value: 0, + angle: 0, + id: axisIndex++, + }; + this.axesState.push(axis); + } + + this.stateUpdateAgent = setInterval(() => { + this.gamepad.buttons.forEach((button, index) => { + const state = this.buttonState.find(s => s.id === index); + if (!state) { + return; + } + const wasPressed = state.value > 0; + const isPressed = button.value > 0; + state.value = button.value; + if (isPressed !== wasPressed) { + this.setKey(`gamepad.button.${index}`, button.value); + } + }); + + axisIndex = 0; + for (let i = 0; i < this.gamepad.axes.length; i+=2) { + const state = this.axesState.find(s => s.id === axisIndex); + if (!state) { + return; + } + + const left = Math.abs(Math.max(0, this.gamepad.axes[i])); + const right = Math.abs(0 - Math.min(0, this.gamepad.axes[i])); + const up = Math.abs(Math.max(0, this.gamepad.axes[i + 1])); + const down = Math.abs(0 - Math.min(0, this.gamepad.axes[i + 1])); + + const x = right - left; + const y = up - down; + + const value = Math.sqrt(x * x + y * y); + const angle = Math.atan2(x, y); + + if (value !== state.value || angle !== state.angle) { + this.setKey(`gamepad.axis.${state.id}`, value, angle); + } + + state.value = value; + state.angle = angle; + axisIndex++; + } + }, 50) as unknown as number; + } + + public disconnect() { + this.scheme?.unassignDevice(this); + this.scheme = undefined; + clearInterval(this.stateUpdateAgent); + } + + private static updateGamepadStates(event: GamepadEvent) { + + console.log({event}); + + switch (event.type) { + case 'gamepadconnected': + const newGamepad = new InputGamepad(event.gamepad); + this.DeviceConnected.emit(newGamepad); + this.gamepads.push(newGamepad); + newGamepad.connect(); + this.DeviceListChanged.emit(this.gamepads); + break; + + case 'gamepaddisconnected': + const gamepad = this.gamepads.find(g => g.name === event.gamepad.id); + if (gamepad) { + gamepad.disconnect(); + this.DeviceDisconnected.emit(gamepad); + this.gamepads.splice(this.gamepads.indexOf(gamepad), 1); + this.DeviceListChanged.emit(this.gamepads); + } + break; + } + } + + public static Init() { + this.attachEvents(); + } +} diff --git a/src/lib/modules/input/models/devices/input-keyboard.ts b/src/lib/modules/input/models/devices/input-keyboard.ts new file mode 100644 index 0000000..9811a9d --- /dev/null +++ b/src/lib/modules/input/models/devices/input-keyboard.ts @@ -0,0 +1,30 @@ +import { InputDevice } from "../input-device"; + +export class InputKeyboard extends InputDevice { + + static listenerInited = false; + + constructor( + name: string, + ) { + super(name, 'keyboard'); + this.attachEvents(); + } + + private attachEvents() { + if (InputKeyboard.listenerInited) { + return; + } + + window.addEventListener('keydown', e => this.catchKey(e, 1)); + window.addEventListener('keyup', e => this.catchKey(e, 0)); + InputKeyboard.listenerInited = true; + } + + private catchKey(event: KeyboardEvent, value: number = 1, angle: number = 0): boolean { + const key = event.key; + super.setKey(key, value, angle); + event.preventDefault(); + return false; + } +} diff --git a/src/lib/modules/input/models/input-action.ts b/src/lib/modules/input/models/input-action.ts new file mode 100644 index 0000000..c176acb --- /dev/null +++ b/src/lib/modules/input/models/input-action.ts @@ -0,0 +1,50 @@ +import { InputScheme } from "./input-scheme"; + +export type ActionCallback = (value: number, data: unknown, angle?:number, timePressed?: number) => void; + +export class InputAction { + + private currentValue: number = 0; + private downActions: ActionCallback[] = []; + private upActions: ActionCallback[] = []; + private changeActions: ActionCallback[] = []; + + constructor( + public readonly name: string, + ) { + + } + + public mapKeysToScheme(scheme: InputScheme, keys: (string | number)[]): this { + scheme.mapKey(this, keys); + return this; + } + + public fire(value: number, data: unknown = undefined, angle?: number, timePressed?: number) { + const isPressed = value > 0; + const wasPressed = this.currentValue > 0; + if (isPressed !== wasPressed) { + if (isPressed) { + this.downActions.forEach(action => action(value, data, angle, timePressed)); + } else { + this.upActions.forEach(action => action(value, data, angle, timePressed)); + } + } else { + this.changeActions.forEach(action => action(value, data, angle, timePressed)); + } + + this.currentValue = value; + } + + public onDown(action: ActionCallback) { + this.downActions.push(action); + } + + public onUp(action: ActionCallback) { + this.upActions.push(action); + } + + public onChange(action: ActionCallback) { + this.changeActions.push(action); + } +} diff --git a/src/lib/modules/input/models/input-device.ts b/src/lib/modules/input/models/input-device.ts new file mode 100644 index 0000000..97f23be --- /dev/null +++ b/src/lib/modules/input/models/input-device.ts @@ -0,0 +1,59 @@ +import { EventEmitter } from "@angular/core"; +import { InputScheme } from "./input-scheme"; +import { InputAction } from "./input-action"; + +export interface InputKeyState { + key: string | number; + value: number; + angle?: number; +} + +export abstract class InputDevice { + + protected scheme?: InputScheme; + protected keyStates: InputKeyState[] = []; + public keyStateChanged = new EventEmitter(); + + constructor( + public readonly name: string, + public readonly type = 'unknown', + ) { + } + + public mapKey(action: InputAction, keys: (string | number)[]): this { + this.scheme?.mapKey(action, keys); + return this; + } + + public getScheme(): InputScheme | undefined { + return this.scheme; + } + + public hasScheme(): boolean { + return !!this.scheme; + } + + public setKey(key: string | number, value: number = 1, angle: number = 0): this { + let exists = this.keyStates.find(k => k.key === key); + if (!exists) { + exists = { + key, + value, + angle, + }; + this.keyStates.push(exists); + } else { + exists.value = value; + exists.angle = angle; + } + + this.keyStateChanged.emit(exists); + this.scheme?.setKeyState(key, value, angle); + return this; + } + + public assignScheme(scheme: InputScheme): this { + this.scheme = scheme; + return this; + } +} diff --git a/src/lib/modules/input/models/input-scheme.ts b/src/lib/modules/input/models/input-scheme.ts new file mode 100644 index 0000000..a51af4a --- /dev/null +++ b/src/lib/modules/input/models/input-scheme.ts @@ -0,0 +1,66 @@ +import { BehaviorSubject } from "rxjs"; +import { InputAction } from "./input-action"; +import { InputDevice } from "./input-device"; + +interface InputActionBind { + action: InputAction; + keys: (string | number)[]; +} + +export class InputScheme { + + private data: unknown; + private actions: InputActionBind[] = []; + private devices: InputDevice[] = []; + public deviceListChanged = new BehaviorSubject([]); + + constructor( + public readonly name: string, + ) { + this.devices = []; + } + + public clearKeyBindings() { + this.actions = []; + + } + + public clearDeviceAssignments() { + this.devices = []; + this.deviceListChanged.next(this.devices); + } + + public unassignDevice(device: InputDevice) { + this.devices.splice(this.devices.indexOf(device), 1); + this.deviceListChanged.next(this.devices); + } + + public getDevices() { + return this.devices; + } + + public getKeyForAction(action: string): (string | number)[] { + return this.actions.find(a => a.action.name === action)?.keys || []; + } + + public setData(data: unknown) { + this.data = data; + } + + public mapKey(action: InputAction, keys: (string | number)[]) { + this.actions.push({ action, keys }); + } + + public setKeyState(key: string | number, value: number, angle: number = 0) { + const binds = this.actions.filter(a => a.keys.includes(key)); + if (binds.length) { + binds.forEach(bind => bind.action.fire(value, this.data, angle)); + } + } + + public assignDevice(device: InputDevice): void { + device.assignScheme(this); + this.devices.push(device); + this.deviceListChanged.next(this.devices); + } +} diff --git a/src/lib/modules/input/services/input.service.ts b/src/lib/modules/input/services/input.service.ts new file mode 100644 index 0000000..47dde1b --- /dev/null +++ b/src/lib/modules/input/services/input.service.ts @@ -0,0 +1,59 @@ +import { Injectable } from "@angular/core"; +import { InputScheme } from "../models/input-scheme"; +import { InputAction } from "../models/input-action"; +import { InputDevice } from "../models/input-device"; +import { InputKeyboard } from "../models/devices/input-keyboard"; +import { InputGamepad } from "../models/devices/input-gamepad"; +import { BehaviorSubject } from "rxjs"; + +@Injectable({ + providedIn: 'root' +}) +export class InputService { + + public actions: InputAction[] = []; + public schemes: InputScheme[] = []; + public devices: InputDevice[] = []; + + public deviceListChanged = new BehaviorSubject([]); + + constructor() { + this.defineKeyboard(); + this.defineGamepad(); + } + + private defineKeyboard() { + const keyboard = new InputKeyboard('Keyboard'); + this.devices.push(keyboard); + this.deviceListChanged.next(this.devices); + } + + private defineGamepad() { + InputGamepad.DeviceConnected.subscribe(gamepad => { + this.devices.push(gamepad); + this.deviceListChanged.next(this.devices); + }); + InputGamepad.DeviceDisconnected.subscribe(gamepad => { + this.devices = this.devices.filter(d => d.name !== gamepad.name); + this.deviceListChanged.next(this.devices); + }); + InputGamepad.Init(); + } + + public defineAction(name: string): InputAction { + const action = new InputAction(name); + this.actions.push(action); + return action; + } + + public defineScheme(name: string): InputScheme { + const scheme = new InputScheme(name); + this.schemes.push(scheme); + return scheme; + } + + public getDevices(): InputDevice[] { + return this.devices; + } +} + diff --git a/src/lib/modules/navigation/directives/action-binding.directive.ts b/src/lib/modules/navigation/directives/action-binding.directive.ts new file mode 100644 index 0000000..2cb06da --- /dev/null +++ b/src/lib/modules/navigation/directives/action-binding.directive.ts @@ -0,0 +1,23 @@ +import { Directive, ElementRef, Input } from '@angular/core'; + +@Directive({ + selector: '[inputActionBinding]', + standalone: true +}) +export class ActionBindingDirective { + + @Input() inputActionBinding: string = ''; + + private element: HTMLElement; + + constructor( + elementRef: ElementRef, + ) { + this.element = elementRef.nativeElement as HTMLElement; + } + + ngOnInit(): void { + this.element.setAttribute('action', this.inputActionBinding); + } + +} diff --git a/src/lib/modules/navigation/directives/key-item-group.directive.ts b/src/lib/modules/navigation/directives/key-item-group.directive.ts new file mode 100644 index 0000000..2e491bf --- /dev/null +++ b/src/lib/modules/navigation/directives/key-item-group.directive.ts @@ -0,0 +1,28 @@ +import { Directive } from '@angular/core'; +import { KeyItemDirective, KeyItemEntry } from './key-item.directive'; + +@Directive({ + selector: '[inputKeyItemGroup]', + standalone: true +}) +export class KeyItemGroupDirective { + + static groups: KeyItemGroupDirective[] = []; + public items: KeyItemEntry[] = []; + + constructor() { + } + + ngOnInit() { + KeyItemDirective.SetCurrentItem(); + KeyItemGroupDirective.groups.push(this); + } + + ngOnDestroy() { + const index = KeyItemGroupDirective.groups.findIndex(g => g === this); + if (index > -1) { + KeyItemGroupDirective.groups.splice(index, 1); + } + } + +} diff --git a/src/lib/modules/navigation/directives/key-item.directive.ts b/src/lib/modules/navigation/directives/key-item.directive.ts new file mode 100644 index 0000000..1371f4b --- /dev/null +++ b/src/lib/modules/navigation/directives/key-item.directive.ts @@ -0,0 +1,189 @@ +import { Directive, ElementRef, HostListener, Input, OnDestroy, OnInit, Optional, Host } from '@angular/core'; +import { KeyItemGroupDirective } from './key-item-group.directive'; + +export interface ActionBindings { + [action: string]: () => undefined | boolean; +} + +export interface KeyItemEntry { + element: HTMLKeyItemEntryElement; + top: number; + left: number; +} + +interface HTMLKeyItemEntryElement extends HTMLElement { + keyId: number; + active: string; + actionBindings: ActionBindings; + activate: () => void; + deactivate: () => void; + focus: () => void; + blur: () => void; +} + +@Directive({ + selector: '[inputKeyItem]', + standalone: true +}) +export class KeyItemDirective implements OnInit, OnDestroy { + + @Input() active = 'active'; + @Input() activate: () => any = () => {}; + @Input() deactivate: () => any = () => {}; + @Input() focus: () => any = () => {}; + @Input() blur: () => any = () => {}; + @Input() actionBindings: ActionBindings = {}; + private static allItems: KeyItemEntry[] = []; + private static current?: KeyItemEntry; + private element: HTMLKeyItemEntryElement; + private static NextId = 0; + private id = KeyItemDirective.NextId++; + + constructor( + @Optional() private group: KeyItemGroupDirective, + elementRef: ElementRef, + ) { + this.element = elementRef.nativeElement as HTMLKeyItemEntryElement; + } + + public static FireAction(action: string): boolean { + const item = KeyItemDirective.current; + if (item) { + return item.element.actionBindings?.[action]?.() ?? true; + } + + return true; + } + + ngOnInit() { + this.element.active = this.active; + this.element.activate = this.activate; + this.element.deactivate = this.deactivate; + this.element.keyId = this.id; + this.element.actionBindings = this.actionBindings; + this.element.focus = this.focus; + this.element.blur = this.blur; + const position = this.element.getBoundingClientRect(); + const item = { + element: this.element, + top: position.top + position.height / 2, + left: position.left + position.width / 2, + }; + KeyItemDirective.allItems.push(item); + this.group?.items.push(item); + if (this.group) { + this.group.items = this.group.items.sort((a, b) => { + const tabIndexA = a.element.tabIndex; + const tabIndexB = b.element.tabIndex; + return tabIndexA - tabIndexB; + }); + } + } + + ngOnDestroy() { + const index = KeyItemDirective.allItems.findIndex(item => item.element.keyId === this.id); + if (index > -1) { + KeyItemDirective.allItems.splice(index, 1); + } + + if (this.group) { + const index = this.group.items.findIndex(item => item.element.keyId === this.id); + if (index > -1) { + this.group.items.splice(index, 1); + } + } + } + + @HostListener('mouseenter') + onHover() { + if (this.active && !this.element.classList.contains(this.active)) { + this.element.classList.add(this.active); + } + + this.focus(); + + const item = KeyItemDirective.allItems.find(item => item.element.keyId === this.id); + KeyItemDirective.SetCurrentItem(item); + } + + @HostListener('mouseleave') + onLeave() { + if (this.active && this.element.classList.contains(this.active)) { + this.element.classList.remove(this.active); + } + + this.blur(); + } + + static ActivateCurrentItem() { + this.current?.element.activate.bind(this.current?.element)(); + } + + static getCurrentGroup() { + if (KeyItemGroupDirective.groups.length === 0) { + return null; + } + return KeyItemGroupDirective.groups[KeyItemGroupDirective.groups.length - 1]; + } + + static SelectNexItem(fromAngleDeg: number, toAngleDeg: number) { + this.updateItems(); + let current = this.current; + let allItems = this.allItems; + const currentGroup = this.getCurrentGroup(); + if (currentGroup) { + const isCurrentInCurrentGroup = this.current && currentGroup.items.some(i => i.element.keyId === this.current!.element.keyId); + allItems = currentGroup.items; + if (!isCurrentInCurrentGroup) { + current = undefined; + } + } + if (current) { + const list = allItems.map(item => { + const distance = Math.sqrt(Math.pow(item.top - this.current!.top, 2) + Math.pow(item.left - this.current!.left, 2)); + const angle = 90 + Math.atan2(item.top - this.current!.top, item.left - this.current!.left) * 180 / Math.PI; + return { + item, + distance, + angle, + }; + }) + .filter(item => { + const angle = item.angle; + const normalizedAngle = angle < 0 ? angle + 360 : angle; + return normalizedAngle >= fromAngleDeg && normalizedAngle <= toAngleDeg && item.distance > 0; + }) + .sort((a, b) => a.distance - b.distance); + + if (list.length > 0) { + this.SetCurrentItem(list[0].item); + } else { + let index = allItems.findIndex(i => i.element.keyId === this.current!.element.keyId); + index = (index + 1) % allItems.length; + this.SetCurrentItem(allItems[index]); + } + } else { + this.SetCurrentItem(allItems[0]); + } + } + + static SetCurrentItem(item?: KeyItemEntry) { + if (this.current?.element.active && this.current.element.classList.contains(this.current.element.active)) { + this.current.element.classList.remove(this.current.element.active); + } + this.current?.element.blur(); + this.current = item; + this.current?.element.focus(); + if (this.current?.element.active && !this.current.element.classList.contains(this.current.element.active)) { + this.current.element.classList.add(this.current.element.active); + } + } + + static updateItems() { + this.allItems.forEach(item => { + const position = item.element.getBoundingClientRect(); + item.top = position.top + position.height / 2; + item.left = position.left + position.width / 2; + }); + } +} diff --git a/src/lib/modules/navigation/navigation-module.ts b/src/lib/modules/navigation/navigation-module.ts new file mode 100644 index 0000000..5d5b178 --- /dev/null +++ b/src/lib/modules/navigation/navigation-module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ActionBindingDirective } from './directives/action-binding.directive'; +import { KeyItemDirective } from './directives/key-item.directive'; +import { KeyItemGroupDirective } from './directives/key-item-group.directive'; + +@NgModule({ + declarations: [], + imports: [ + CommonModule, + ActionBindingDirective, + KeyItemDirective, + KeyItemGroupDirective, + ], + exports: [ + ActionBindingDirective, + KeyItemDirective, + KeyItemGroupDirective, + ], +}) +export class NavigationModule { } diff --git a/src/public-api.ts b/src/public-api.ts new file mode 100644 index 0000000..ee8aeb5 --- /dev/null +++ b/src/public-api.ts @@ -0,0 +1,21 @@ +/* + * Public API Surface of input + */ + +export * from './lib/modules/input/input-module'; + +export * from './lib/modules/input/services/input.service'; +export * from './lib/modules/input/models/input-action'; +export * from './lib/modules/input/models/input-device'; +export * from './lib/modules/input/models/input-scheme'; +export * from './lib/modules/input/models/devices/input-gamepad'; +export * from './lib/modules/input/models/devices/input-keyboard'; + + + +export * from './lib/modules/navigation/navigation-module'; + +export * from './lib/modules/navigation/directives/action-binding.directive'; +export * from './lib/modules/navigation/directives/key-item-group.directive'; +export * from './lib/modules/navigation/directives/key-item.directive'; + diff --git a/tsconfig.lib.json b/tsconfig.lib.json new file mode 100644 index 0000000..a147b18 --- /dev/null +++ b/tsconfig.lib.json @@ -0,0 +1,19 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "sourceMap": true, + "types": [] + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "**/*.spec.ts" + ] +} diff --git a/tsconfig.lib.prod.json b/tsconfig.lib.prod.json new file mode 100644 index 0000000..9215caa --- /dev/null +++ b/tsconfig.lib.prod.json @@ -0,0 +1,11 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.lib.json", + "compilerOptions": { + "declarationMap": false + }, + "angularCompilerOptions": { + "compilationMode": "partial" + } +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 0000000..0feea88 --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,14 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "include": [ + "src/**/*.ts" + ] +}