@ngutil/aria 0.0.21 → 0.0.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,36 @@
1
+ import { computed, Directive, effect, ElementRef, inject } from "@angular/core";
2
+ import { takeUntilDestroyed, toSignal } from "@angular/core/rxjs-interop";
3
+ import { shareReplay } from "rxjs";
4
+ import { FocusService } from "./focus.service";
5
+ import * as i0 from "@angular/core";
6
+ export class FocusState {
7
+ #focus;
8
+ #el;
9
+ #event;
10
+ constructor() {
11
+ this.#focus = inject(FocusService);
12
+ this.#el = inject(ElementRef);
13
+ this.#event = this.#focus.watch(this.#el.nativeElement).pipe(takeUntilDestroyed(), shareReplay(1));
14
+ this.event = toSignal(this.#event, { rejectErrors: true, manualCleanup: true });
15
+ this.origin = computed(() => this.event()?.origin);
16
+ this.within = computed(() => {
17
+ const event = this.event();
18
+ return event ? (event.element !== this.#el.nativeElement ? event.origin : null) : null;
19
+ });
20
+ // TODO: miért kell ez?, ha nincs itt akkor nem frissül
21
+ effect(() => this.origin(), { allowSignalWrites: false });
22
+ }
23
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: FocusState, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
24
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.6", type: FocusState, isStandalone: true, host: { properties: { "attr.focus": "origin()", "attr.focusWithin": "within()" } }, ngImport: i0 }); }
25
+ }
26
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: FocusState, decorators: [{
27
+ type: Directive,
28
+ args: [{
29
+ standalone: true,
30
+ host: {
31
+ "[attr.focus]": "origin()",
32
+ "[attr.focusWithin]": "within()"
33
+ }
34
+ }]
35
+ }], ctorParameters: () => [] });
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXMtc3RhdGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYXJpYS9zcmMvZm9jdXMvZm9jdXMtc3RhdGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQy9FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUV6RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBRWxDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTs7QUFTOUMsTUFBTSxPQUFPLFVBQVU7SUFDVixNQUFNLENBQXVCO0lBQzdCLEdBQUcsQ0FBOEM7SUFFakQsTUFBTSxDQUF1RjtJQVV0RztRQWJTLFdBQU0sR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDN0IsUUFBRyxHQUFHLE1BQU0sQ0FBMEIsVUFBVSxDQUFDLENBQUE7UUFFakQsV0FBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDN0YsVUFBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUUxRSxXQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUU3QyxXQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDMUIsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtRQUMxRixDQUFDLENBQUMsQ0FBQTtRQUdFLHVEQUF1RDtRQUN2RCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtJQUM3RCxDQUFDOzhHQWpCUSxVQUFVO2tHQUFWLFVBQVU7OzJGQUFWLFVBQVU7a0JBUHRCLFNBQVM7bUJBQUM7b0JBQ1AsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLElBQUksRUFBRTt3QkFDRixjQUFjLEVBQUUsVUFBVTt3QkFDMUIsb0JBQW9CLEVBQUUsVUFBVTtxQkFDbkM7aUJBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wdXRlZCwgRGlyZWN0aXZlLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCJcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCwgdG9TaWduYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3BcIlxuXG5pbXBvcnQgeyBzaGFyZVJlcGxheSB9IGZyb20gXCJyeGpzXCJcblxuaW1wb3J0IHsgRm9jdXNTZXJ2aWNlIH0gZnJvbSBcIi4vZm9jdXMuc2VydmljZVwiXG5cbkBEaXJlY3RpdmUoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaG9zdDoge1xuICAgICAgICBcIlthdHRyLmZvY3VzXVwiOiBcIm9yaWdpbigpXCIsXG4gICAgICAgIFwiW2F0dHIuZm9jdXNXaXRoaW5dXCI6IFwid2l0aGluKClcIlxuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgRm9jdXNTdGF0ZSB7XG4gICAgcmVhZG9ubHkgI2ZvY3VzID0gaW5qZWN0KEZvY3VzU2VydmljZSlcbiAgICByZWFkb25seSAjZWwgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpXG5cbiAgICByZWFkb25seSAjZXZlbnQgPSB0aGlzLiNmb2N1cy53YXRjaCh0aGlzLiNlbC5uYXRpdmVFbGVtZW50KS5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpLCBzaGFyZVJlcGxheSgxKSlcbiAgICByZWFkb25seSBldmVudCA9IHRvU2lnbmFsKHRoaXMuI2V2ZW50LCB7IHJlamVjdEVycm9yczogdHJ1ZSwgbWFudWFsQ2xlYW51cDogdHJ1ZSB9KVxuXG4gICAgcmVhZG9ubHkgb3JpZ2luID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5ldmVudCgpPy5vcmlnaW4pXG5cbiAgICByZWFkb25seSB3aXRoaW4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5ldmVudCgpXG4gICAgICAgIHJldHVybiBldmVudCA/IChldmVudC5lbGVtZW50ICE9PSB0aGlzLiNlbC5uYXRpdmVFbGVtZW50ID8gZXZlbnQub3JpZ2luIDogbnVsbCkgOiBudWxsXG4gICAgfSlcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBUT0RPOiBtacOpcnQga2VsbCBlej8sIGhhIG5pbmNzIGl0dCBha2tvciBuZW0gZnJpc3PDvGxcbiAgICAgICAgZWZmZWN0KCgpID0+IHRoaXMub3JpZ2luKCksIHsgYWxsb3dTaWduYWxXcml0ZXM6IGZhbHNlIH0pXG4gICAgfVxufVxuIl19
@@ -1,28 +1,27 @@
1
+ import { FocusTrapFactory } from "@angular/cdk/a11y";
1
2
  import { DOCUMENT } from "@angular/common";
2
3
  import { inject, Inject, Injectable, NgZone } from "@angular/core";
3
- import { combineLatest, filter, map, merge, shareReplay, startWith, Subject } from "rxjs";
4
+ import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
5
+ import { combineLatest, filter, fromEvent, map, shareReplay, startWith } from "rxjs";
4
6
  import { focusable, isFocusable } from "tabbable";
5
- import { Destructible } from "@ngutil/common";
6
7
  import { ActivityService } from "../activity";
7
8
  import * as i0 from "@angular/core";
8
9
  const EVENT_OPTIONS = {
9
10
  capture: true,
10
11
  passive: true
11
12
  };
12
- export class FocusService extends Destructible {
13
+ export class FocusService {
13
14
  #activity = inject(ActivityService);
14
- #focus = new Subject();
15
- #blur = new Subject();
15
+ #focusTrap = inject(FocusTrapFactory);
16
16
  constructor(document, zone) {
17
- super();
18
- zone.runOutsideAngular(() => {
19
- const blur = this.#blur.pipe(startWith(null), shareReplay(1));
20
- const focus = this.#focus.pipe(shareReplay(1));
21
- const events = combineLatest({
17
+ this.events = zone.runOutsideAngular(() => {
18
+ const focus = fromEvent(document, "focus", EVENT_OPTIONS).pipe(map(e => e.target));
19
+ const blur = fromEvent(document, "blur", EVENT_OPTIONS).pipe(startWith(null), map(e => e?.target || null));
20
+ return combineLatest({
22
21
  activity: this.#activity.events,
23
22
  focus: focus,
24
23
  blur: blur
25
- }).pipe(map(({ activity, focus, blur }) => {
24
+ }).pipe(takeUntilDestroyed(), map(({ activity, focus, blur }) => {
26
25
  // console.log({ activity, focus, blur })
27
26
  // If focus in with alt+tab
28
27
  if (blur === document && activity.origin === "keyboard") {
@@ -47,27 +46,18 @@ export class FocusService extends Destructible {
47
46
  return { origin: "program", element: focus };
48
47
  }
49
48
  }), filter(v => !!v), shareReplay(1));
50
- this.events = merge(blur.pipe(map(element => {
51
- return { origin: null, element };
52
- })), events).pipe(shareReplay(1));
53
- document.addEventListener("focus", this.#onFocus, EVENT_OPTIONS);
54
- document.addEventListener("blur", this.#onBlur, EVENT_OPTIONS);
55
- this.d.any(() => {
56
- document.removeEventListener("focus", this.#onFocus, EVENT_OPTIONS);
57
- document.removeEventListener("blur", this.#onBlur, EVENT_OPTIONS);
58
- });
59
49
  });
60
50
  }
61
- #onFocus = (event) => {
62
- this.#focus.next(event.target);
63
- };
64
- #onBlur = (event) => {
65
- this.#blur.next(event.target);
66
- };
67
51
  watch(node) {
68
- return this.events.pipe(filter(event => event.element && (event.element === node || node.contains(event.element))), shareReplay(1));
52
+ return this.events.pipe(map(event => {
53
+ if (event.element &&
54
+ (event.element === node || (typeof node.contains === "function" && node.contains(event.element)))) {
55
+ return event;
56
+ }
57
+ return { element: node, origin: null };
58
+ }));
69
59
  }
70
- focus(node, _origon) {
60
+ focus(node, _origin) {
71
61
  // TODO: focus origin
72
62
  node.focus();
73
63
  }
@@ -80,6 +70,9 @@ export class FocusService extends Destructible {
80
70
  isFocusable(node) {
81
71
  return isFocusable(node);
82
72
  }
73
+ focusTrap(inside, deferCaptureElements = false) {
74
+ return this.#focusTrap.create(inside, deferCaptureElements);
75
+ }
83
76
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: FocusService, deps: [{ token: DOCUMENT }, { token: NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
84
77
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: FocusService, providedIn: "root" }); }
85
78
  }
@@ -96,4 +89,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImpor
96
89
  function isActivityElement(activityEl, focused) {
97
90
  return activityEl != null && focused != null && (activityEl === focused || focused.contains(activityEl));
98
91
  }
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FyaWEvc3JjL2ZvY3VzL2ZvY3VzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBYyxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUVyRyxPQUFPLEVBQUUsU0FBUyxFQUF5QixXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFFeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRTdDLE9BQU8sRUFBa0IsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFBOztBQUU3RCxNQUFNLGFBQWEsR0FBNEI7SUFDM0MsT0FBTyxFQUFFLElBQUk7SUFDYixPQUFPLEVBQUUsSUFBSTtDQUNoQixDQUFBO0FBaUJELE1BQU0sT0FBTyxZQUFhLFNBQVEsWUFBWTtJQUMxQyxTQUFTLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQ25DLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFBO0lBQzVCLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFBO0lBRzNCLFlBQThCLFFBQWtCLEVBQWtCLElBQVk7UUFDMUUsS0FBSyxFQUFFLENBQUE7UUFFUCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFD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QUFVLEVBQUUsTUFBTSxFQUFFOzswQkFPakIsTUFBTTsyQkFBQyxRQUFROzswQkFBdUIsTUFBTTsyQkFBQyxNQUFNOztBQWlHcEUsU0FBUyxpQkFBaUIsQ0FBQyxVQUF3QixFQUFFLE9BQXFCO0lBQ3RFLE9BQU8sVUFBVSxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7QUFDNUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiXG5pbXBvcnQgeyBpbmplY3QsIEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuXG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBmaWx0ZXIsIG1hcCwgbWVyZ2UsIE9ic2VydmFibGUsIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIFN1YmplY3QgfSBmcm9tIFwicnhqc1wiXG5cbmltcG9ydCB7IGZvY3VzYWJsZSwgdHlwZSBGb2N1c2FibGVFbGVtZW50LCBpc0ZvY3VzYWJsZSB9IGZyb20gXCJ0YWJiYWJsZVwiXG5cbmltcG9ydCB7IERlc3RydWN0aWJsZSB9IGZyb20gXCJAbmd1dGlsL2NvbW1vblwiXG5cbmltcG9ydCB7IEFjdGl2aXR5T3JpZ2luLCBBY3Rpdml0eVNlcnZpY2UgfSBmcm9tIFwiLi4vYWN0aXZpdHlcIlxuXG5jb25zdCBFVkVOVF9PUFRJT05TOiBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyA9IHtcbiAgICBjYXB0dXJlOiB0cnVlLFxuICAgIHBhc3NpdmU6IHRydWVcbn1cblxuZXhwb3J0IHR5cGUgRm9jdXNPcmlnaW4gPSBBY3Rpdml0eU9yaWdpbiB8IG51bGxcbi8vIGV4cG9ydCB0eXBlIEZvY3VzVGFyZ2V0ID0gbnVsbCB8IFwic2VsZlwiIHwgXCJjaGlsZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9jdXNDaGFuZ2VzIHtcbiAgICBvcmlnaW46IEZvY3VzT3JpZ2luXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb2N1c2FibGVFdmVudCB7XG4gICAgb3JpZ2luOiBGb2N1c09yaWdpblxuICAgIGV4YWN0OiBib29sZWFuXG4gICAgbm9kZTogTm9kZVxufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXG5leHBvcnQgY2xhc3MgRm9jdXNTZXJ2aWNlIGV4dGVuZHMgRGVzdHJ1Y3RpYmxlIHtcbiAgICAjYWN0aXZpdHkgPSBpbmplY3QoQWN0aXZpdHlTZXJ2aWNlKVxuICAgICNmb2N1cyA9IG5ldyBTdWJqZWN0PE5vZGU+KClcbiAgICAjYmx1ciA9IG5ldyBTdWJqZWN0PE5vZGU+KClcbiAgICBldmVudHMhOiBPYnNlcnZhYmxlPEZvY3VzQ2hhbmdlcz5cblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoRE9DVU1FTlQpIGRvY3VtZW50OiBEb2N1bWVudCwgQEluamVjdChOZ1pvbmUpIHpvbmU6IE5nWm9uZSkge1xuICAgICAgICBzdXBlcigpXG5cbiAgICAgICAgem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibHVyID0gdGhpcy4jYmx1ci5waXBlKHN0YXJ0V2l0aChudWxsKSwgc2hhcmVSZXBsYXkoMSkpXG4gICAgICAgICAgICBjb25zdCBmb2N1cyA9IHRoaXMuI2ZvY3VzLnBpcGUoc2hhcmVSZXBsYXkoMSkpXG5cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IGNvbWJpbmVMYXRlc3Qoe1xuICAgICAgICAgICAgICAgIGFjdGl2aXR5OiB0aGlzLiNhY3Rpdml0eS5ldmVudHMsXG4gICAgICAgICAgICAgICAgZm9jdXM6IGZvY3VzLFxuICAgICAgICAgICAgICAgIGJsdXI6IGJsdXJcbiAgICAgICAgICAgIH0pLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKCh7IGFjdGl2aXR5LCBmb2N1cywgYmx1ciB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHsgYWN0aXZpdHksIGZvY3VzLCBibHVyIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZm9jdXMgaW4gd2l0aCBhbHQrdGFiXG4gICAgICAgICAgICAgICAgICAgIGlmIChibHVyID09PSBkb2N1bWVudCAmJiBhY3Rpdml0eS5vcmlnaW4gPT09IFwia2V5Ym9hcmRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBcInByb2dyYW1cIiwgZWxlbWVudDogZm9jdXMgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzID09PSBkb2N1bWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBcInByb2dyYW1cIiwgZWxlbWVudDogZm9jdXMgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgcHJlc3MgdGFiIGJ1dHRvbiwgZmlyc3QgZmlyZSB0aGUgZXZlbnQgaW4gdGhlIGN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzID09PSBibHVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBwcmVzcyB0YWIsIHRoZSBhY3Rpdml0eSBpcyBvbiB0aGUgY3VycmVudCBmdWNlc2QgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgLy8gc28gd2hlbiBibHVyIGlzIGNoYW5nZWQgdG8gaXQsIHRoZSBmb2N1cyBjaGFuZ2UgaXMgY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpdml0eS5vcmlnaW4gPT09IFwia2V5Ym9hcmRcIiAmJiBpc0FjdGl2aXR5RWxlbWVudChhY3Rpdml0eS5ub2RlLCBibHVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBcImtleWJvYXJkXCIsIGVsZW1lbnQ6IGZvY3VzIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FjdGl2aXR5RWxlbWVudChhY3Rpdml0eS5ub2RlLCBmb2N1cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG9yaWdpbjogYWN0aXZpdHkub3JpZ2luLCBlbGVtZW50OiBmb2N1cyB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBvcmlnaW46IFwicHJvZ3JhbVwiLCBlbGVtZW50OiBmb2N1cyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIodiA9PiAhIXYpLFxuICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICAgICApIGFzIGFueVxuXG4gICAgICAgICAgICB0aGlzLmV2ZW50cyA9IG1lcmdlKFxuICAgICAgICAgICAgICAgIGJsdXIucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWFwKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBudWxsLCBlbGVtZW50IH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGV2ZW50c1xuICAgICAgICAgICAgKS5waXBlKHNoYXJlUmVwbGF5KDEpKSBhcyBhbnlcblxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHRoaXMuI29uRm9jdXMsIEVWRU5UX09QVElPTlMpXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCB0aGlzLiNvbkJsdXIsIEVWRU5UX09QVElPTlMpXG5cbiAgICAgICAgICAgIHRoaXMuZC5hbnkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLiNvbkZvY3VzLCBFVkVOVF9PUFRJT05TKVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuI29uQmx1ciwgRVZFTlRfT1BUSU9OUylcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgI29uRm9jdXMgPSAoZXZlbnQ6IEZvY3VzRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy4jZm9jdXMubmV4dChldmVudC50YXJnZXQgYXMgTm9kZSlcbiAgICB9XG5cbiAgICAjb25CbHVyID0gKGV2ZW50OiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuI2JsdXIubmV4dChldmVudC50YXJnZXQgYXMgTm9kZSlcbiAgICB9XG5cbiAgICB3YXRjaChub2RlOiBOb2RlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50cy5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50LmVsZW1lbnQgJiYgKGV2ZW50LmVsZW1lbnQgPT09IG5vZGUgfHwgbm9kZS5jb250YWlucyhldmVudC5lbGVtZW50KSkpLFxuICAgICAgICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICAgICAgKVxuICAgIH1cblxuICAgIGZvY3VzKG5vZGU6IEhUTUxFbGVtZW50LCBfb3JpZ29uOiBGb2N1c09yaWdpbiB8IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogZm9jdXMgb3JpZ2luXG4gICAgICAgIG5vZGUuZm9jdXMoKVxuICAgIH1cblxuICAgIHF1ZXJ5Rm9jdXNhYmxlKGluc2lkZTogSFRNTEVsZW1lbnQpOiBGb2N1c2FibGVFbGVtZW50W10ge1xuICAgICAgICByZXR1cm4gZm9jdXNhYmxlKGluc2lkZSwgeyBpbmNsdWRlQ29udGFpbmVyOiBmYWxzZSB9KVxuICAgIH1cblxuICAgIGdldEZpcnN0Rm9jdXNhYmxlKGluc2lkZTogSFRNTEVsZW1lbnQpOiBGb2N1c2FibGVFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlGb2N1c2FibGUoaW5zaWRlKVswXVxuICAgIH1cblxuICAgIGlzRm9jdXNhYmxlKG5vZGU6IEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGlzRm9jdXNhYmxlKG5vZGUpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc0FjdGl2aXR5RWxlbWVudChhY3Rpdml0eUVsPzogTm9kZSB8IG51bGwsIGZvY3VzZWQ/OiBOb2RlIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhY3Rpdml0eUVsICE9IG51bGwgJiYgZm9jdXNlZCAhPSBudWxsICYmIChhY3Rpdml0eUVsID09PSBmb2N1c2VkIHx8IGZvY3VzZWQuY29udGFpbnMoYWN0aXZpdHlFbCkpXG59XG4iXX0=
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FyaWEvc3JjL2ZvY3VzL2ZvY3VzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUE7QUFFL0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBYyxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBRWhHLE9BQU8sRUFBRSxTQUFTLEVBQXlCLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUV4RSxPQUFPLEVBQWtCLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQTs7QUFFN0QsTUFBTSxhQUFhLEdBQTRCO0lBQzNDLE9BQU8sRUFBRSxJQUFJO0lBQ2IsT0FBTyxFQUFFLElBQUk7Q0FDaEIsQ0FBQTtBQWdCRCxNQUFNLE9BQU8sWUFBWTtJQUNaLFNBQVMsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUE7SUFDbkMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBRzlDLFlBQThCLFFBQWtCLEVBQWtCLElBQVk7UUFDMUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ3RDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVB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SUFDaEIsQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUFtQjtRQUM5QixPQUFPLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ3pELENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxNQUFtQjtRQUNqQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDekMsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFhO1FBQ3JCLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzVCLENBQUM7SUFFRCxTQUFTLENBQUMsTUFBbUIsRUFBRSx1QkFBZ0MsS0FBSztRQUNoRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO0lBQy9ELENBQUM7OEdBdkZRLFlBQVksa0JBS0QsUUFBUSxhQUE4QixNQUFNO2tIQUx2RCxZQUFZLGNBREMsTUFBTTs7MkZBQ25CLFlBQVk7a0JBRHhCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFNakIsTUFBTTsyQkFBQyxRQUFROzswQkFBdUIsTUFBTTsyQkFBQyxNQUFNOztBQXFGcEUsU0FBUyxpQkFBaUIsQ0FBQyxVQUF3QixFQUFFLE9BQXFCO0lBQ3RFLE9BQU8sVUFBVSxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7QUFDNUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvY3VzVHJhcEZhY3RvcnkgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2ExMXlcIlxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCJcbmltcG9ydCB7IGluamVjdCwgSW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3BcIlxuXG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBmaWx0ZXIsIGZyb21FdmVudCwgbWFwLCBPYnNlcnZhYmxlLCBzaGFyZVJlcGxheSwgc3RhcnRXaXRoIH0gZnJvbSBcInJ4anNcIlxuXG5pbXBvcnQgeyBmb2N1c2FibGUsIHR5cGUgRm9jdXNhYmxlRWxlbWVudCwgaXNGb2N1c2FibGUgfSBmcm9tIFwidGFiYmFibGVcIlxuXG5pbXBvcnQgeyBBY3Rpdml0eU9yaWdpbiwgQWN0aXZpdHlTZXJ2aWNlIH0gZnJvbSBcIi4uL2FjdGl2aXR5XCJcblxuY29uc3QgRVZFTlRfT1BUSU9OUzogQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMgPSB7XG4gICAgY2FwdHVyZTogdHJ1ZSxcbiAgICBwYXNzaXZlOiB0cnVlXG59XG5cbmV4cG9ydCB0eXBlIEZvY3VzT3JpZ2luID0gQWN0aXZpdHlPcmlnaW4gfCBudWxsXG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9jdXNDaGFuZ2VzIHtcbiAgICBvcmlnaW46IEZvY3VzT3JpZ2luXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb2N1c2FibGVFdmVudCB7XG4gICAgb3JpZ2luOiBGb2N1c09yaWdpblxuICAgIGV4YWN0OiBib29sZWFuXG4gICAgbm9kZTogTm9kZVxufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXG5leHBvcnQgY2xhc3MgRm9jdXNTZXJ2aWNlIHtcbiAgICByZWFkb25seSAjYWN0aXZpdHkgPSBpbmplY3QoQWN0aXZpdHlTZXJ2aWNlKVxuICAgIHJlYWRvbmx5ICNmb2N1c1RyYXAgPSBpbmplY3QoRm9jdXNUcmFwRmFjdG9yeSlcbiAgICByZWFkb25seSBldmVudHM6IE9ic2VydmFibGU8Rm9jdXNDaGFuZ2VzPlxuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChET0NVTUVOVCkgZG9jdW1lbnQ6IERvY3VtZW50LCBASW5qZWN0KE5nWm9uZSkgem9uZTogTmdab25lKSB7XG4gICAgICAgIHRoaXMuZXZlbnRzID0gem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb2N1cyA9IGZyb21FdmVudChkb2N1bWVudCwgXCJmb2N1c1wiLCBFVkVOVF9PUFRJT05TKS5waXBlKG1hcChlID0+IGUudGFyZ2V0IGFzIE5vZGUpKVxuICAgICAgICAgICAgY29uc3QgYmx1ciA9IGZyb21FdmVudChkb2N1bWVudCwgXCJibHVyXCIsIEVWRU5UX09QVElPTlMpLnBpcGUoXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKG51bGwpLFxuICAgICAgICAgICAgICAgIG1hcChlID0+IChlPy50YXJnZXQgYXMgTm9kZSkgfHwgbnVsbClcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3Qoe1xuICAgICAgICAgICAgICAgIGFjdGl2aXR5OiB0aGlzLiNhY3Rpdml0eS5ldmVudHMsXG4gICAgICAgICAgICAgICAgZm9jdXM6IGZvY3VzLFxuICAgICAgICAgICAgICAgIGJsdXI6IGJsdXJcbiAgICAgICAgICAgIH0pLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICAgICAgICAgICAgbWFwKCh7IGFjdGl2aXR5LCBmb2N1cywgYmx1ciB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHsgYWN0aXZpdHksIGZvY3VzLCBibHVyIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZm9jdXMgaW4gd2l0aCBhbHQrdGFiXG4gICAgICAgICAgICAgICAgICAgIGlmIChibHVyID09PSBkb2N1bWVudCAmJiBhY3Rpdml0eS5vcmlnaW4gPT09IFwia2V5Ym9hcmRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBcInByb2dyYW1cIiwgZWxlbWVudDogZm9jdXMgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzID09PSBkb2N1bWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBcInByb2dyYW1cIiwgZWxlbWVudDogZm9jdXMgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgcHJlc3MgdGFiIGJ1dHRvbiwgZmlyc3QgZmlyZSB0aGUgZXZlbnQgaW4gdGhlIGN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzID09PSBibHVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBwcmVzcyB0YWIsIHRoZSBhY3Rpdml0eSBpcyBvbiB0aGUgY3VycmVudCBmdWNlc2QgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgLy8gc28gd2hlbiBibHVyIGlzIGNoYW5nZWQgdG8gaXQsIHRoZSBmb2N1cyBjaGFuZ2UgaXMgY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpdml0eS5vcmlnaW4gPT09IFwia2V5Ym9hcmRcIiAmJiBpc0FjdGl2aXR5RWxlbWVudChhY3Rpdml0eS5ub2RlLCBibHVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBcImtleWJvYXJkXCIsIGVsZW1lbnQ6IGZvY3VzIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FjdGl2aXR5RWxlbWVudChhY3Rpdml0eS5ub2RlLCBmb2N1cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG9yaWdpbjogYWN0aXZpdHkub3JpZ2luLCBlbGVtZW50OiBmb2N1cyB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBvcmlnaW46IFwicHJvZ3JhbVwiLCBlbGVtZW50OiBmb2N1cyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIodiA9PiAhIXYpLFxuICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICAgICApIGFzIGFueVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHdhdGNoKG5vZGU6IE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRzLnBpcGUoXG4gICAgICAgICAgICBtYXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuZWxlbWVudCAmJlxuICAgICAgICAgICAgICAgICAgICAoZXZlbnQuZWxlbWVudCA9PT0gbm9kZSB8fCAodHlwZW9mIG5vZGUuY29udGFpbnMgPT09IFwiZnVuY3Rpb25cIiAmJiBub2RlLmNvbnRhaW5zKGV2ZW50LmVsZW1lbnQpKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IGVsZW1lbnQ6IG5vZGUsIG9yaWdpbjogbnVsbCB9XG4gICAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgfVxuXG4gICAgZm9jdXMobm9kZTogSFRNTEVsZW1lbnQsIF9vcmlnaW46IEZvY3VzT3JpZ2luIHwgbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBmb2N1cyBvcmlnaW5cbiAgICAgICAgbm9kZS5mb2N1cygpXG4gICAgfVxuXG4gICAgcXVlcnlGb2N1c2FibGUoaW5zaWRlOiBIVE1MRWxlbWVudCk6IEZvY3VzYWJsZUVsZW1lbnRbXSB7XG4gICAgICAgIHJldHVybiBmb2N1c2FibGUoaW5zaWRlLCB7IGluY2x1ZGVDb250YWluZXI6IGZhbHNlIH0pXG4gICAgfVxuXG4gICAgZ2V0Rmlyc3RGb2N1c2FibGUoaW5zaWRlOiBIVE1MRWxlbWVudCk6IEZvY3VzYWJsZUVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVyeUZvY3VzYWJsZShpbnNpZGUpWzBdXG4gICAgfVxuXG4gICAgaXNGb2N1c2FibGUobm9kZTogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNGb2N1c2FibGUobm9kZSlcbiAgICB9XG5cbiAgICBmb2N1c1RyYXAoaW5zaWRlOiBIVE1MRWxlbWVudCwgZGVmZXJDYXB0dXJlRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZm9jdXNUcmFwLmNyZWF0ZShpbnNpZGUsIGRlZmVyQ2FwdHVyZUVsZW1lbnRzKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNBY3Rpdml0eUVsZW1lbnQoYWN0aXZpdHlFbD86IE5vZGUgfCBudWxsLCBmb2N1c2VkPzogTm9kZSB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYWN0aXZpdHlFbCAhPSBudWxsICYmIGZvY3VzZWQgIT0gbnVsbCAmJiAoYWN0aXZpdHlFbCA9PT0gZm9jdXNlZCB8fCBmb2N1c2VkLmNvbnRhaW5zKGFjdGl2aXR5RWwpKVxufVxuIl19
@@ -1,53 +1,50 @@
1
- import { Directive, ElementRef, inject, NgZone } from "@angular/core";
2
- import { map, shareReplay } from "rxjs";
3
- import { Destructible, FastDOM } from "@ngutil/common";
4
- import { FocusService } from "./focus.service";
1
+ import { Attribute, computed, Directive, effect, inject, input } from "@angular/core";
2
+ import { DisabledState } from "@ngutil/common";
3
+ import { FocusState } from "./focus-state.directive";
5
4
  import * as i0 from "@angular/core";
6
- // TODO: set [attr.focused]="[mouse | keyboard | program] [exact | child]"
7
- export class Focusable extends Destructible {
8
- #service = inject(FocusService);
9
- #elRef = inject((ElementRef));
10
- #el = this.#elRef.nativeElement;
11
- constructor(zone) {
12
- super();
13
- zone.runOutsideAngular(() => {
14
- const events = this.#service.watch(this.#el);
15
- this.events = events.pipe(map(event => {
16
- const self = this.#el;
17
- let exact = null;
18
- let focused = event.element;
19
- while (focused) {
20
- if (focused === self) {
21
- if (exact === null) {
22
- exact = true;
23
- }
24
- break;
25
- }
26
- else {
27
- const attr = focused.getAttribute("focused");
28
- if (attr && attr.length > 0) {
29
- exact = false;
30
- break;
31
- }
32
- focused = focused.parentElement;
33
- }
34
- }
35
- return { origin: event.origin, exact, node: event.element };
36
- }), shareReplay(1));
37
- this.origin = this.events.pipe(map(event => event.origin), shareReplay(1));
38
- this.exact = this.events.pipe(map(event => event.exact), shareReplay(1));
39
- this.d.sub(this.events).subscribe(event => {
40
- FastDOM.setAttributes(this.#el, {
41
- focused: event.origin ? `${event.origin} ${event.exact ? "exact" : "child"}` : null
42
- });
43
- });
5
+ import * as i1 from "./focus-state.directive";
6
+ // TODO: what happens when disabled is changed
7
+ export class Focusable {
8
+ #disabled;
9
+ #tabindex;
10
+ constructor(tabindex) {
11
+ this.#disabled = inject(DisabledState, { optional: true, self: true });
12
+ this.focusable = input(true, { alias: "nuFocusable" });
13
+ this.tabindex = computed(() => {
14
+ const focusable = this.focusable();
15
+ if (focusable === false || this.#disabled?.isDisabled()) {
16
+ return -1;
17
+ }
18
+ if (typeof focusable === "number") {
19
+ return focusable;
20
+ }
21
+ if (focusable === true && this.#tabindex != null && !isNaN(this.#tabindex)) {
22
+ return this.#tabindex;
23
+ }
24
+ return 0;
44
25
  });
26
+ if (tabindex != null) {
27
+ this.#tabindex = Number(tabindex);
28
+ }
29
+ // TODO: miért kell ez?, ha nincs itt akkor nem frissül
30
+ effect(() => this.tabindex(), { allowSignalWrites: false });
45
31
  }
46
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: Focusable, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); }
47
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.6", type: Focusable, isStandalone: true, usesInheritance: true, ngImport: i0 }); }
32
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: Focusable, deps: [{ token: "tabindex", attribute: true }], target: i0.ɵɵFactoryTarget.Directive }); }
33
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "17.3.6", type: Focusable, isStandalone: true, selector: "[nuFocusable]", inputs: { focusable: { classPropertyName: "focusable", publicName: "nuFocusable", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.tabindex": "tabindex()" } }, exportAs: ["nuFocusable"], hostDirectives: [{ directive: i1.FocusState }], ngImport: i0 }); }
48
34
  }
49
35
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: Focusable, decorators: [{
50
36
  type: Directive,
51
- args: [{ standalone: true }]
52
- }], ctorParameters: () => [{ type: i0.NgZone }] });
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXNhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FyaWEvc3JjL2ZvY3VzL2ZvY3VzYWJsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVyRSxPQUFPLEVBQUUsR0FBRyxFQUFjLFdBQVcsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUVuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRXRELE9BQU8sRUFBeUMsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUE7O0FBRXJGLDBFQUEwRTtBQUUxRSxNQUFNLE9BQU8sU0FBVSxTQUFRLFlBQVk7SUFDdkMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUMvQixNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUEsVUFBZ0IsQ0FBQSxDQUFDLENBQUE7SUFDakMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFBO0lBTy9CLFlBQVksSUFBWTtRQUNwQixLQUFLLEVBQUUsQ0FBQTtRQUVQLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDeEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUUzQztZQUFDLElBQStDLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQ2xFLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDUixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFBO2dCQUNyQixJQUFJLEtBQUssR0FBbUIsSUFBSSxDQUFBO2dCQUNoQyxJQUFJLE9BQU8sR0FBdUIsS0FBSyxDQUFDLE9BQU8sQ0FBQTtnQkFFL0MsT0FBTyxPQUFPLEVBQUUsQ0FBQztvQkFDYixJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDbkIsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7NEJBQ2pCLEtBQUssR0FBRyxJQUFJLENBQUE7d0JBQ2hCLENBQUM7d0JBQ0QsTUFBSztvQkFDVCxDQUFDO3lCQUFNLENBQUM7d0JBQ0osTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQTt3QkFDNUMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzs0QkFDMUIsS0FBSyxHQUFHLEtBQUssQ0FBQTs0QkFDYixNQUFLO3dCQUNULENBQUM7d0JBRUQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUE7b0JBQ25DLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFvQixDQUFBO1lBQ2pGLENBQUMsQ0FBQyxFQUNGLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDakIsQ0FDQTtZQUFDLElBQTRDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNwRSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQzFCLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDakIsQ0FDQTtZQUFDLElBQXVDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUM5RCxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQ3pCLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDakIsQ0FBQTtZQUVELElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3RDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDNUIsT0FBTyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO2lCQUN0RixDQUFDLENBQUE7WUFDTixDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQzs4R0F6RFEsU0FBUztrR0FBVCxTQUFTOzsyRkFBVCxTQUFTO2tCQURyQixTQUFTO21CQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgaW5qZWN0LCBOZ1pvbmUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXG5cbmltcG9ydCB7IG1hcCwgT2JzZXJ2YWJsZSwgc2hhcmVSZXBsYXkgfSBmcm9tIFwicnhqc1wiXG5cbmltcG9ydCB7IERlc3RydWN0aWJsZSwgRmFzdERPTSB9IGZyb20gXCJAbmd1dGlsL2NvbW1vblwiXG5cbmltcG9ydCB7IHR5cGUgRm9jdXNhYmxlRXZlbnQsIHR5cGUgRm9jdXNPcmlnaW4sIEZvY3VzU2VydmljZSB9IGZyb20gXCIuL2ZvY3VzLnNlcnZpY2VcIlxuXG4vLyBUT0RPOiBzZXQgW2F0dHIuZm9jdXNlZF09XCJbbW91c2UgfCBrZXlib2FyZCB8IHByb2dyYW1dIFtleGFjdCB8IGNoaWxkXVwiXG5ARGlyZWN0aXZlKHsgc3RhbmRhbG9uZTogdHJ1ZSB9KVxuZXhwb3J0IGNsYXNzIEZvY3VzYWJsZSBleHRlbmRzIERlc3RydWN0aWJsZSB7XG4gICAgI3NlcnZpY2UgPSBpbmplY3QoRm9jdXNTZXJ2aWNlKVxuICAgICNlbFJlZiA9IGluamVjdChFbGVtZW50UmVmPE5vZGU+KVxuICAgICNlbCA9IHRoaXMuI2VsUmVmLm5hdGl2ZUVsZW1lbnRcblxuICAgIHJlYWRvbmx5IGV2ZW50cyE6IE9ic2VydmFibGU8Rm9jdXNhYmxlRXZlbnQ+XG4gICAgcmVhZG9ubHkgb3JpZ2luITogT2JzZXJ2YWJsZTxGb2N1c09yaWdpbj5cbiAgICAvLyByZWFkb25seSBvcmlnaW4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZvY3VzT3JpZ2luPihudWxsKVxuICAgIHJlYWRvbmx5IGV4YWN0ITogT2JzZXJ2YWJsZTxib29sZWFuPlxuXG4gICAgY29uc3RydWN0b3Ioem9uZTogTmdab25lKSB7XG4gICAgICAgIHN1cGVyKClcblxuICAgICAgICB6b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMuI3NlcnZpY2Uud2F0Y2godGhpcy4jZWwpXG5cbiAgICAgICAgICAgIDsodGhpcyBhcyB7IGV2ZW50czogT2JzZXJ2YWJsZTxGb2N1c2FibGVFdmVudD4gfSkuZXZlbnRzID0gZXZlbnRzLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXMuI2VsXG4gICAgICAgICAgICAgICAgICAgIGxldCBleGFjdDogYm9vbGVhbiB8IG51bGwgPSBudWxsXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2N1c2VkOiBIVE1MRWxlbWVudCB8IG51bGwgPSBldmVudC5lbGVtZW50XG5cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZvY3VzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c2VkID09PSBzZWxmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4YWN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0ID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyID0gZm9jdXNlZC5nZXRBdHRyaWJ1dGUoXCJmb2N1c2VkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIgJiYgYXR0ci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0ID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2VkID0gZm9jdXNlZC5wYXJlbnRFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBldmVudC5vcmlnaW4sIGV4YWN0LCBub2RlOiBldmVudC5lbGVtZW50IH0gYXMgRm9jdXNhYmxlRXZlbnRcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzaGFyZVJlcGxheSgxKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgOyh0aGlzIGFzIHsgb3JpZ2luOiBPYnNlcnZhYmxlPEZvY3VzT3JpZ2luPiB9KS5vcmlnaW4gPSB0aGlzLmV2ZW50cy5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChldmVudCA9PiBldmVudC5vcmlnaW4pLFxuICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICA7KHRoaXMgYXMgeyBleGFjdDogT2JzZXJ2YWJsZTxib29sZWFuPiB9KS5leGFjdCA9IHRoaXMuZXZlbnRzLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKGV2ZW50ID0+IGV2ZW50LmV4YWN0KSxcbiAgICAgICAgICAgICAgICBzaGFyZVJlcGxheSgxKVxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICB0aGlzLmQuc3ViKHRoaXMuZXZlbnRzKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIEZhc3RET00uc2V0QXR0cmlidXRlcyh0aGlzLiNlbCwge1xuICAgICAgICAgICAgICAgICAgICBmb2N1c2VkOiBldmVudC5vcmlnaW4gPyBgJHtldmVudC5vcmlnaW59ICR7ZXZlbnQuZXhhY3QgPyBcImV4YWN0XCIgOiBcImNoaWxkXCJ9YCA6IG51bGxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG59XG4iXX0=
37
+ args: [{
38
+ standalone: true,
39
+ selector: "[nuFocusable]",
40
+ exportAs: "nuFocusable",
41
+ host: {
42
+ "[attr.tabindex]": "tabindex()"
43
+ },
44
+ hostDirectives: [FocusState]
45
+ }]
46
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
47
+ type: Attribute,
48
+ args: ["tabindex"]
49
+ }] }] });
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXNhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FyaWEvc3JjL2ZvY3VzL2ZvY3VzYWJsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRXJGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUU5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUE7OztBQUVwRCw4Q0FBOEM7QUFXOUMsTUFBTSxPQUFPLFNBQVM7SUFDVCxTQUFTLENBQXdEO0lBSWpFLFNBQVMsQ0FBUztJQW1CM0IsWUFBbUMsUUFBMEI7UUF2QnBELGNBQVMsR0FBRyxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUVqRSxjQUFTLEdBQUcsS0FBSyxDQUFtQixJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQTtRQUduRSxhQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUM5QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7WUFFbEMsSUFBSSxTQUFTLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQztnQkFDdEQsT0FBTyxDQUFDLENBQUMsQ0FBQTtZQUNiLENBQUM7WUFFRCxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNoQyxPQUFPLFNBQVMsQ0FBQTtZQUNwQixDQUFDO1lBRUQsSUFBSSxTQUFTLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN6RSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUE7WUFDekIsQ0FBQztZQUVELE9BQU8sQ0FBQyxDQUFBO1FBQ1osQ0FBQyxDQUFDLENBQUE7UUFHRSxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNyQyxDQUFDO1FBRUQsdURBQXVEO1FBQ3ZELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQy9ELENBQUM7OEdBL0JRLFNBQVMsa0JBd0JLLFVBQVU7a0dBeEJ4QixTQUFTOzsyRkFBVCxTQUFTO2tCQVRyQixTQUFTO21CQUFDO29CQUNQLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsZUFBZTtvQkFDekIsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLElBQUksRUFBRTt3QkFDRixpQkFBaUIsRUFBRSxZQUFZO3FCQUNsQztvQkFDRCxjQUFjLEVBQUUsQ0FBQyxVQUFVLENBQUM7aUJBQy9COzswQkF5QmdCLFNBQVM7MkJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF0dHJpYnV0ZSwgY29tcHV0ZWQsIERpcmVjdGl2ZSwgZWZmZWN0LCBpbmplY3QsIGlucHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuXG5pbXBvcnQgeyBEaXNhYmxlZFN0YXRlIH0gZnJvbSBcIkBuZ3V0aWwvY29tbW9uXCJcblxuaW1wb3J0IHsgRm9jdXNTdGF0ZSB9IGZyb20gXCIuL2ZvY3VzLXN0YXRlLmRpcmVjdGl2ZVwiXG5cbi8vIFRPRE86IHdoYXQgaGFwcGVucyB3aGVuIGRpc2FibGVkIGlzIGNoYW5nZWRcblxuQERpcmVjdGl2ZSh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogXCJbbnVGb2N1c2FibGVdXCIsXG4gICAgZXhwb3J0QXM6IFwibnVGb2N1c2FibGVcIixcbiAgICBob3N0OiB7XG4gICAgICAgIFwiW2F0dHIudGFiaW5kZXhdXCI6IFwidGFiaW5kZXgoKVwiXG4gICAgfSxcbiAgICBob3N0RGlyZWN0aXZlczogW0ZvY3VzU3RhdGVdXG59KVxuZXhwb3J0IGNsYXNzIEZvY3VzYWJsZSB7XG4gICAgcmVhZG9ubHkgI2Rpc2FibGVkID0gaW5qZWN0KERpc2FibGVkU3RhdGUsIHsgb3B0aW9uYWw6IHRydWUsIHNlbGY6IHRydWUgfSlcblxuICAgIHJlYWRvbmx5IGZvY3VzYWJsZSA9IGlucHV0PGJvb2xlYW4gfCBudW1iZXI+KHRydWUsIHsgYWxpYXM6IFwibnVGb2N1c2FibGVcIiB9KVxuXG4gICAgcmVhZG9ubHkgI3RhYmluZGV4PzogbnVtYmVyXG4gICAgcmVhZG9ubHkgdGFiaW5kZXggPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZSA9IHRoaXMuZm9jdXNhYmxlKClcblxuICAgICAgICBpZiAoZm9jdXNhYmxlID09PSBmYWxzZSB8fCB0aGlzLiNkaXNhYmxlZD8uaXNEaXNhYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gLTFcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgZm9jdXNhYmxlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9jdXNhYmxlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZm9jdXNhYmxlID09PSB0cnVlICYmIHRoaXMuI3RhYmluZGV4ICE9IG51bGwgJiYgIWlzTmFOKHRoaXMuI3RhYmluZGV4KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI3RhYmluZGV4XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gMFxuICAgIH0pXG5cbiAgICBjb25zdHJ1Y3RvcihAQXR0cmlidXRlKFwidGFiaW5kZXhcIikgdGFiaW5kZXg/OiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRhYmluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuI3RhYmluZGV4ID0gTnVtYmVyKHRhYmluZGV4KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogbWnDqXJ0IGtlbGwgZXo/LCBoYSBuaW5jcyBpdHQgYWtrb3IgbmVtIGZyaXNzw7xsXG4gICAgICAgIGVmZmVjdCgoKSA9PiB0aGlzLnRhYmluZGV4KCksIHsgYWxsb3dTaWduYWxXcml0ZXM6IGZhbHNlIH0pXG4gICAgfVxufVxuIl19
@@ -1,4 +1,5 @@
1
1
  export * from "./focus.service";
2
2
  export * from "./focus-trap.directive";
3
3
  export * from "./focusable.directive";
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9mb2N1cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGlCQUFpQixDQUFBO0FBQy9CLGNBQWMsd0JBQXdCLENBQUE7QUFDdEMsY0FBYyx1QkFBdUIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2ZvY3VzLnNlcnZpY2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vZm9jdXMtdHJhcC5kaXJlY3RpdmVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZm9jdXNhYmxlLmRpcmVjdGl2ZVwiXG4iXX0=
4
+ export * from "./focus-state.directive";
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9mb2N1cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGlCQUFpQixDQUFBO0FBQy9CLGNBQWMsd0JBQXdCLENBQUE7QUFDdEMsY0FBYyx1QkFBdUIsQ0FBQTtBQUNyQyxjQUFjLHlCQUF5QixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vZm9jdXMuc2VydmljZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9mb2N1cy10cmFwLmRpcmVjdGl2ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9mb2N1c2FibGUuZGlyZWN0aXZlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZvY3VzLXN0YXRlLmRpcmVjdGl2ZVwiXG4iXX0=
package/esm2022/index.mjs CHANGED
@@ -1,3 +1,4 @@
1
1
  export { ActivityService } from "./activity";
2
- export { FocusService, FocusTrap, Focusable } from "./focus";
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlDLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUMzRSxPQUFPLEVBQWUsWUFBWSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQWdDLE1BQU0sU0FBUyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgQWN0aXZpdHlFdmVudCwgQWN0aXZpdHlPcmlnaW4sIEFjdGl2aXR5U2VydmljZSB9IGZyb20gXCIuL2FjdGl2aXR5XCJcbmV4cG9ydCB7IEZvY3VzT3JpZ2luLCBGb2N1c1NlcnZpY2UsIEZvY3VzVHJhcCwgRm9jdXNhYmxlLCBGb2N1c2FibGVFdmVudCwgRm9jdXNDaGFuZ2VzIH0gZnJvbSBcIi4vZm9jdXNcIlxuIl19
2
+ export { FocusService, FocusTrap, Focusable, FocusState } from "./focus";
3
+ export { KeystrokeService } from "./keystroke";
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlDLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUMzRSxPQUFPLEVBQWUsWUFBWSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFnQyxNQUFNLFNBQVMsQ0FBQTtBQUNuSCxPQUFPLEVBQTZCLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgQWN0aXZpdHlFdmVudCwgQWN0aXZpdHlPcmlnaW4sIEFjdGl2aXR5U2VydmljZSB9IGZyb20gXCIuL2FjdGl2aXR5XCJcbmV4cG9ydCB7IEZvY3VzT3JpZ2luLCBGb2N1c1NlcnZpY2UsIEZvY3VzVHJhcCwgRm9jdXNhYmxlLCBGb2N1c1N0YXRlLCBGb2N1c2FibGVFdmVudCwgRm9jdXNDaGFuZ2VzIH0gZnJvbSBcIi4vZm9jdXNcIlxuZXhwb3J0IHsgS2V5c3Ryb2tlLCBLZXlzdHJva2VFdmVudCwgS2V5c3Ryb2tlU2VydmljZSB9IGZyb20gXCIuL2tleXN0cm9rZVwiXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export * from "./keystroke.service";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9rZXlzdHJva2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxxQkFBcUIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2tleXN0cm9rZS5zZXJ2aWNlXCJcbiJdfQ==
@@ -0,0 +1,94 @@
1
+ import { Injectable } from "@angular/core";
2
+ import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
3
+ import { map, Observable, share, Subject } from "rxjs";
4
+ import { coerceElement } from "@ngutil/common";
5
+ import * as i0 from "@angular/core";
6
+ export class KeystrokeService {
7
+ #keystrokes = {};
8
+ #keyEvent = new Observable((dst) => {
9
+ const handler = (event) => {
10
+ dst.next(event);
11
+ };
12
+ document.addEventListener("keydown", handler, { capture: true });
13
+ document.addEventListener("keyup", handler, { capture: true });
14
+ return () => {
15
+ document.removeEventListener("keydown", handler, { capture: true });
16
+ document.removeEventListener("keyup", handler, { capture: true });
17
+ };
18
+ }).pipe(share());
19
+ #activatedKs = this.#keyEvent.pipe(map(event => {
20
+ const keystroke = eventToKeystroke(event);
21
+ const id = keystrokeId(keystroke);
22
+ return { event, keystrokes: this.#keystrokes[id] || [], keystroke };
23
+ }));
24
+ constructor() {
25
+ this.#activatedKs.pipe(takeUntilDestroyed()).subscribe(({ event, keystrokes, keystroke }) => {
26
+ console.log({ event, keystrokes, keystroke });
27
+ for (const ks of keystrokes) {
28
+ if (event.defaultPrevented) {
29
+ return;
30
+ }
31
+ if (ks.target === event.target ||
32
+ ks.target.contains(event.target) ||
33
+ document.activeElement === ks.target ||
34
+ ks.target.contains(document.activeElement)) {
35
+ ks.subject.next({ original: event, keystroke });
36
+ }
37
+ }
38
+ });
39
+ }
40
+ watch(target, keystroke) {
41
+ const id = keystrokeId(keystroke);
42
+ return new Observable((dst) => {
43
+ if (!this.#keystrokes[id]) {
44
+ this.#keystrokes[id] = [];
45
+ }
46
+ const subject = new Subject();
47
+ const entry = { target: coerceElement(target), keystroke, subject };
48
+ const sub = subject.subscribe(dst);
49
+ this.#keystrokes[id].push(entry);
50
+ return () => {
51
+ sub.unsubscribe();
52
+ if (this.#keystrokes[id]) {
53
+ const index = this.#keystrokes[id].indexOf(entry);
54
+ if (index !== -1) {
55
+ this.#keystrokes[id].splice(index, 1);
56
+ }
57
+ if (this.#keystrokes[id].length === 0) {
58
+ delete this.#keystrokes[id];
59
+ }
60
+ }
61
+ };
62
+ }).pipe(share());
63
+ }
64
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: KeystrokeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
65
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: KeystrokeService, providedIn: "root" }); }
66
+ }
67
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: KeystrokeService, decorators: [{
68
+ type: Injectable,
69
+ args: [{ providedIn: "root" }]
70
+ }], ctorParameters: () => [] });
71
+ function keystrokeId(ks) {
72
+ let res = ks.key;
73
+ if (ks.shift) {
74
+ res += "+shift";
75
+ }
76
+ if (ks.ctrl) {
77
+ res += "+ctrl";
78
+ }
79
+ if (ks.alt) {
80
+ res += "+alt";
81
+ }
82
+ res += `${ks.state}`;
83
+ return res;
84
+ }
85
+ function eventToKeystroke(event) {
86
+ return {
87
+ key: event.key,
88
+ shift: event.shiftKey,
89
+ ctrl: event.ctrlKey,
90
+ alt: event.altKey,
91
+ state: event.type === "keyup" ? "up" : "down"
92
+ };
93
+ }
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5c3Ryb2tlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9rZXlzdHJva2Uva2V5c3Ryb2tlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUUvRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFjLE1BQU0sTUFBTSxDQUFBO0FBRWxFLE9BQU8sRUFBRSxhQUFhLEVBQWdCLE1BQU0sZ0JBQWdCLENBQUE7O0FBdUI1RCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ2hCLFdBQVcsR0FBd0MsRUFBRSxDQUFBO0lBRXJELFNBQVMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLEdBQThCLEVBQUUsRUFBRTtRQUNuRSxNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQW9CLEVBQUUsRUFBRTtZQUNyQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ25CLENBQUMsQ0FBQTtRQUNELFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7UUFDaEUsUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUU5RCxPQUFPLEdBQUcsRUFBRTtZQUNSLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7WUFDbkUsUUFBUSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUNyRSxDQUFDLENBQUE7SUFDTCxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtJQUVQLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDdkMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ1IsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDekMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ2pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFBO0lBQ3ZFLENBQUMsQ0FBQyxDQUNMLENBQUE7SUFFRDtRQUNJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtZQUN4RixPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFBO1lBQzdDLEtBQUssTUFBTSxFQUFFLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQzFCLElBQUksS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUM7b0JBQ3pCLE9BQU07Z0JBQ1YsQ0FBQztnQkFFRCxJQUNJLEVBQUUsQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU07b0JBQzFCLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFjLENBQUM7b0JBQ3hDLFFBQVEsQ0FBQyxhQUFhLEtBQUssRUFBRSxDQUFDLE1BQU07b0JBQ3BDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFxQixDQUFDLEVBQ3BELENBQUM7b0JBQ0MsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUE7Z0JBQ25ELENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQW9CLEVBQUUsU0FBb0I7UUFDNUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ2pDLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxHQUErQixFQUFFLEVBQUU7WUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUE7WUFDN0IsQ0FBQztZQUVELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxFQUFrQixDQUFBO1lBQzdDLE1BQU0sS0FBSyxHQUFtQixFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFBO1lBQ25GLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUE7WUFFbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7WUFFaEMsT0FBTyxHQUFHLEVBQUU7Z0JBQ1IsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFBO2dCQUNqQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDdkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7b0JBQ2pELElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFBO29CQUN6QyxDQUFDO29CQUNELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQ3BDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtvQkFDL0IsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQyxDQUFBO1FBQ0wsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7SUFDcEIsQ0FBQzs4R0F0RVEsZ0JBQWdCO2tIQUFoQixnQkFBZ0IsY0FESCxNQUFNOzsyRkFDbkIsZ0JBQWdCO2tCQUQ1QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7QUEwRWxDLFNBQVMsV0FBVyxDQUFDLEVBQWE7SUFDOUIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQTtJQUNoQixJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLEdBQUcsSUFBSSxRQUFRLENBQUE7SUFDbkIsQ0FBQztJQUNELElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsR0FBRyxJQUFJLE9BQU8sQ0FBQTtJQUNsQixDQUFDO0lBQ0QsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDVCxHQUFHLElBQUksTUFBTSxDQUFBO0lBQ2pCLENBQUM7SUFDRCxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDcEIsT0FBTyxHQUFHLENBQUE7QUFDZCxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFvQjtJQUMxQyxPQUFPO1FBQ0gsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1FBQ2QsS0FBSyxFQUFFLEtBQUssQ0FBQyxRQUFRO1FBQ3JCLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTztRQUNuQixHQUFHLEVBQUUsS0FBSyxDQUFDLE1BQU07UUFDakIsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU07S0FDaEQsQ0FBQTtBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wXCJcblxuaW1wb3J0IHsgbWFwLCBPYnNlcnZhYmxlLCBzaGFyZSwgU3ViamVjdCwgU3Vic2NyaWJlciB9IGZyb20gXCJyeGpzXCJcblxuaW1wb3J0IHsgY29lcmNlRWxlbWVudCwgRWxlbWVudElucHV0IH0gZnJvbSBcIkBuZ3V0aWwvY29tbW9uXCJcblxuZXhwb3J0IGludGVyZmFjZSBLZXlzdHJva2Uge1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VSV9FdmVudHMvS2V5Ym9hcmRfZXZlbnRfa2V5X3ZhbHVlc1xuICAgIGtleTogS2V5Ym9hcmRFdmVudFtcImtleVwiXVxuICAgIHNoaWZ0PzogYm9vbGVhblxuICAgIGN0cmw/OiBib29sZWFuXG4gICAgYWx0PzogYm9vbGVhblxuICAgIHN0YXRlOiBcImRvd25cIiB8IFwidXBcIlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEtleXN0cm9rZUV2ZW50IHtcbiAgICBvcmlnaW5hbDogS2V5Ym9hcmRFdmVudFxuICAgIGtleXN0cm9rZTogS2V5c3Ryb2tlXG59XG5cbmludGVyZmFjZSBLZXlzdHJva2VFbnRyeSB7XG4gICAga2V5c3Ryb2tlOiBLZXlzdHJva2VcbiAgICB0YXJnZXQ6IEhUTUxFbGVtZW50XG4gICAgc3ViamVjdDogU3ViamVjdDxLZXlzdHJva2VFdmVudD5cbn1cblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiBcInJvb3RcIiB9KVxuZXhwb3J0IGNsYXNzIEtleXN0cm9rZVNlcnZpY2Uge1xuICAgIHJlYWRvbmx5ICNrZXlzdHJva2VzOiB7IFtrZXk6IHN0cmluZ106IEtleXN0cm9rZUVudHJ5W10gfSA9IHt9XG5cbiAgICByZWFkb25seSAja2V5RXZlbnQgPSBuZXcgT2JzZXJ2YWJsZSgoZHN0OiBTdWJzY3JpYmVyPEtleWJvYXJkRXZlbnQ+KSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGRzdC5uZXh0KGV2ZW50KVxuICAgICAgICB9XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KVxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KVxuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIGhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KVxuICAgICAgICB9XG4gICAgfSkucGlwZShzaGFyZSgpKVxuXG4gICAgcmVhZG9ubHkgI2FjdGl2YXRlZEtzID0gdGhpcy4ja2V5RXZlbnQucGlwZShcbiAgICAgICAgbWFwKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleXN0cm9rZSA9IGV2ZW50VG9LZXlzdHJva2UoZXZlbnQpXG4gICAgICAgICAgICBjb25zdCBpZCA9IGtleXN0cm9rZUlkKGtleXN0cm9rZSlcbiAgICAgICAgICAgIHJldHVybiB7IGV2ZW50LCBrZXlzdHJva2VzOiB0aGlzLiNrZXlzdHJva2VzW2lkXSB8fCBbXSwga2V5c3Ryb2tlIH1cbiAgICAgICAgfSlcbiAgICApXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy4jYWN0aXZhdGVkS3MucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSkuc3Vic2NyaWJlKCh7IGV2ZW50LCBrZXlzdHJva2VzLCBrZXlzdHJva2UgfSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coeyBldmVudCwga2V5c3Ryb2tlcywga2V5c3Ryb2tlIH0pXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtzIG9mIGtleXN0cm9rZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGtzLnRhcmdldCA9PT0gZXZlbnQudGFyZ2V0IHx8XG4gICAgICAgICAgICAgICAgICAgIGtzLnRhcmdldC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0ga3MudGFyZ2V0IHx8XG4gICAgICAgICAgICAgICAgICAgIGtzLnRhcmdldC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIE5vZGUpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGtzLnN1YmplY3QubmV4dCh7IG9yaWdpbmFsOiBldmVudCwga2V5c3Ryb2tlIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHdhdGNoKHRhcmdldDogRWxlbWVudElucHV0LCBrZXlzdHJva2U6IEtleXN0cm9rZSk6IE9ic2VydmFibGU8S2V5c3Ryb2tlRXZlbnQ+IHtcbiAgICAgICAgY29uc3QgaWQgPSBrZXlzdHJva2VJZChrZXlzdHJva2UpXG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoZHN0OiBTdWJzY3JpYmVyPEtleXN0cm9rZUV2ZW50PikgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLiNrZXlzdHJva2VzW2lkXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2tleXN0cm9rZXNbaWRdID0gW11cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3ViamVjdCA9IG5ldyBTdWJqZWN0PEtleXN0cm9rZUV2ZW50PigpXG4gICAgICAgICAgICBjb25zdCBlbnRyeTogS2V5c3Ryb2tlRW50cnkgPSB7IHRhcmdldDogY29lcmNlRWxlbWVudCh0YXJnZXQpLCBrZXlzdHJva2UsIHN1YmplY3QgfVxuICAgICAgICAgICAgY29uc3Qgc3ViID0gc3ViamVjdC5zdWJzY3JpYmUoZHN0KVxuXG4gICAgICAgICAgICB0aGlzLiNrZXlzdHJva2VzW2lkXS5wdXNoKGVudHJ5KVxuXG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN1Yi51bnN1YnNjcmliZSgpXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI2tleXN0cm9rZXNbaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy4ja2V5c3Ryb2tlc1tpZF0uaW5kZXhPZihlbnRyeSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4ja2V5c3Ryb2tlc1tpZF0uc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNrZXlzdHJva2VzW2lkXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLiNrZXlzdHJva2VzW2lkXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KS5waXBlKHNoYXJlKCkpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBrZXlzdHJva2VJZChrczogS2V5c3Ryb2tlKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzID0ga3Mua2V5XG4gICAgaWYgKGtzLnNoaWZ0KSB7XG4gICAgICAgIHJlcyArPSBcIitzaGlmdFwiXG4gICAgfVxuICAgIGlmIChrcy5jdHJsKSB7XG4gICAgICAgIHJlcyArPSBcIitjdHJsXCJcbiAgICB9XG4gICAgaWYgKGtzLmFsdCkge1xuICAgICAgICByZXMgKz0gXCIrYWx0XCJcbiAgICB9XG4gICAgcmVzICs9IGAke2tzLnN0YXRlfWBcbiAgICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGV2ZW50VG9LZXlzdHJva2UoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBLZXlzdHJva2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIGtleTogZXZlbnQua2V5LFxuICAgICAgICBzaGlmdDogZXZlbnQuc2hpZnRLZXksXG4gICAgICAgIGN0cmw6IGV2ZW50LmN0cmxLZXksXG4gICAgICAgIGFsdDogZXZlbnQuYWx0S2V5LFxuICAgICAgICBzdGF0ZTogZXZlbnQudHlwZSA9PT0gXCJrZXl1cFwiID8gXCJ1cFwiIDogXCJkb3duXCJcbiAgICB9XG59XG4iXX0=
@@ -1,8 +1,10 @@
1
1
  import { DOCUMENT } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { NgZone, Injectable, Inject, inject, ElementRef, Directive } from '@angular/core';
4
- import { Subject, distinctUntilChanged, shareReplay, filter, startWith, combineLatest, map, merge, BehaviorSubject } from 'rxjs';
5
- import { Destructible, FastDOM } from '@ngutil/common';
3
+ import { NgZone, Injectable, Inject, inject, ElementRef, computed, effect, Directive, input, Attribute } from '@angular/core';
4
+ import { Subject, distinctUntilChanged, shareReplay, filter, fromEvent, map, startWith, combineLatest, BehaviorSubject, Observable, share } from 'rxjs';
5
+ import { Destructible, DisabledState, coerceElement } from '@ngutil/common';
6
+ import { FocusTrapFactory } from '@angular/cdk/a11y';
7
+ import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
6
8
  import { focusable, isFocusable } from 'tabbable';
7
9
 
8
10
  const EVENT_OPTIONS$1 = {
@@ -77,20 +79,18 @@ const EVENT_OPTIONS = {
77
79
  capture: true,
78
80
  passive: true
79
81
  };
80
- class FocusService extends Destructible {
82
+ class FocusService {
81
83
  #activity = inject(ActivityService);
82
- #focus = new Subject();
83
- #blur = new Subject();
84
+ #focusTrap = inject(FocusTrapFactory);
84
85
  constructor(document, zone) {
85
- super();
86
- zone.runOutsideAngular(() => {
87
- const blur = this.#blur.pipe(startWith(null), shareReplay(1));
88
- const focus = this.#focus.pipe(shareReplay(1));
89
- const events = combineLatest({
86
+ this.events = zone.runOutsideAngular(() => {
87
+ const focus = fromEvent(document, "focus", EVENT_OPTIONS).pipe(map(e => e.target));
88
+ const blur = fromEvent(document, "blur", EVENT_OPTIONS).pipe(startWith(null), map(e => e?.target || null));
89
+ return combineLatest({
90
90
  activity: this.#activity.events,
91
91
  focus: focus,
92
92
  blur: blur
93
- }).pipe(map(({ activity, focus, blur }) => {
93
+ }).pipe(takeUntilDestroyed(), map(({ activity, focus, blur }) => {
94
94
  // console.log({ activity, focus, blur })
95
95
  // If focus in with alt+tab
96
96
  if (blur === document && activity.origin === "keyboard") {
@@ -115,27 +115,18 @@ class FocusService extends Destructible {
115
115
  return { origin: "program", element: focus };
116
116
  }
117
117
  }), filter(v => !!v), shareReplay(1));
118
- this.events = merge(blur.pipe(map(element => {
119
- return { origin: null, element };
120
- })), events).pipe(shareReplay(1));
121
- document.addEventListener("focus", this.#onFocus, EVENT_OPTIONS);
122
- document.addEventListener("blur", this.#onBlur, EVENT_OPTIONS);
123
- this.d.any(() => {
124
- document.removeEventListener("focus", this.#onFocus, EVENT_OPTIONS);
125
- document.removeEventListener("blur", this.#onBlur, EVENT_OPTIONS);
126
- });
127
118
  });
128
119
  }
129
- #onFocus = (event) => {
130
- this.#focus.next(event.target);
131
- };
132
- #onBlur = (event) => {
133
- this.#blur.next(event.target);
134
- };
135
120
  watch(node) {
136
- return this.events.pipe(filter(event => event.element && (event.element === node || node.contains(event.element))), shareReplay(1));
121
+ return this.events.pipe(map(event => {
122
+ if (event.element &&
123
+ (event.element === node || (typeof node.contains === "function" && node.contains(event.element)))) {
124
+ return event;
125
+ }
126
+ return { element: node, origin: null };
127
+ }));
137
128
  }
138
- focus(node, _origon) {
129
+ focus(node, _origin) {
139
130
  // TODO: focus origin
140
131
  node.focus();
141
132
  }
@@ -148,6 +139,9 @@ class FocusService extends Destructible {
148
139
  isFocusable(node) {
149
140
  return isFocusable(node);
150
141
  }
142
+ focusTrap(inside, deferCaptureElements = false) {
143
+ return this.#focusTrap.create(inside, deferCaptureElements);
144
+ }
151
145
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: FocusService, deps: [{ token: DOCUMENT }, { token: NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
152
146
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: FocusService, providedIn: "root" }); }
153
147
  }
@@ -186,57 +180,174 @@ class FocusTrap extends Destructible {
186
180
  }
187
181
  }
188
182
 
189
- // TODO: set [attr.focused]="[mouse | keyboard | program] [exact | child]"
190
- class Focusable extends Destructible {
191
- #service = inject(FocusService);
192
- #elRef = inject((ElementRef));
193
- #el = this.#elRef.nativeElement;
194
- constructor(zone) {
195
- super();
196
- zone.runOutsideAngular(() => {
197
- const events = this.#service.watch(this.#el);
198
- this.events = events.pipe(map(event => {
199
- const self = this.#el;
200
- let exact = null;
201
- let focused = event.element;
202
- while (focused) {
203
- if (focused === self) {
204
- if (exact === null) {
205
- exact = true;
206
- }
207
- break;
208
- }
209
- else {
210
- const attr = focused.getAttribute("focused");
211
- if (attr && attr.length > 0) {
212
- exact = false;
213
- break;
214
- }
215
- focused = focused.parentElement;
183
+ class FocusState {
184
+ #focus;
185
+ #el;
186
+ #event;
187
+ constructor() {
188
+ this.#focus = inject(FocusService);
189
+ this.#el = inject(ElementRef);
190
+ this.#event = this.#focus.watch(this.#el.nativeElement).pipe(takeUntilDestroyed(), shareReplay(1));
191
+ this.event = toSignal(this.#event, { rejectErrors: true, manualCleanup: true });
192
+ this.origin = computed(() => this.event()?.origin);
193
+ this.within = computed(() => {
194
+ const event = this.event();
195
+ return event ? (event.element !== this.#el.nativeElement ? event.origin : null) : null;
196
+ });
197
+ // TODO: miért kell ez?, ha nincs itt akkor nem frissül
198
+ effect(() => this.origin(), { allowSignalWrites: false });
199
+ }
200
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: FocusState, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
201
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.6", type: FocusState, isStandalone: true, host: { properties: { "attr.focus": "origin()", "attr.focusWithin": "within()" } }, ngImport: i0 }); }
202
+ }
203
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: FocusState, decorators: [{
204
+ type: Directive,
205
+ args: [{
206
+ standalone: true,
207
+ host: {
208
+ "[attr.focus]": "origin()",
209
+ "[attr.focusWithin]": "within()"
216
210
  }
217
- }
218
- return { origin: event.origin, exact, node: event.element };
219
- }), shareReplay(1));
220
- this.origin = this.events.pipe(map(event => event.origin), shareReplay(1));
221
- this.exact = this.events.pipe(map(event => event.exact), shareReplay(1));
222
- this.d.sub(this.events).subscribe(event => {
223
- FastDOM.setAttributes(this.#el, {
224
- focused: event.origin ? `${event.origin} ${event.exact ? "exact" : "child"}` : null
225
- });
226
- });
211
+ }]
212
+ }], ctorParameters: () => [] });
213
+
214
+ // TODO: what happens when disabled is changed
215
+ class Focusable {
216
+ #disabled;
217
+ #tabindex;
218
+ constructor(tabindex) {
219
+ this.#disabled = inject(DisabledState, { optional: true, self: true });
220
+ this.focusable = input(true, { alias: "nuFocusable" });
221
+ this.tabindex = computed(() => {
222
+ const focusable = this.focusable();
223
+ if (focusable === false || this.#disabled?.isDisabled()) {
224
+ return -1;
225
+ }
226
+ if (typeof focusable === "number") {
227
+ return focusable;
228
+ }
229
+ if (focusable === true && this.#tabindex != null && !isNaN(this.#tabindex)) {
230
+ return this.#tabindex;
231
+ }
232
+ return 0;
227
233
  });
234
+ if (tabindex != null) {
235
+ this.#tabindex = Number(tabindex);
236
+ }
237
+ // TODO: miért kell ez?, ha nincs itt akkor nem frissül
238
+ effect(() => this.tabindex(), { allowSignalWrites: false });
228
239
  }
229
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: Focusable, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); }
230
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.6", type: Focusable, isStandalone: true, usesInheritance: true, ngImport: i0 }); }
240
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: Focusable, deps: [{ token: "tabindex", attribute: true }], target: i0.ɵɵFactoryTarget.Directive }); }
241
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "17.3.6", type: Focusable, isStandalone: true, selector: "[nuFocusable]", inputs: { focusable: { classPropertyName: "focusable", publicName: "nuFocusable", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.tabindex": "tabindex()" } }, exportAs: ["nuFocusable"], hostDirectives: [{ directive: FocusState }], ngImport: i0 }); }
231
242
  }
232
243
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: Focusable, decorators: [{
233
244
  type: Directive,
234
- args: [{ standalone: true }]
235
- }], ctorParameters: () => [{ type: i0.NgZone }] });
245
+ args: [{
246
+ standalone: true,
247
+ selector: "[nuFocusable]",
248
+ exportAs: "nuFocusable",
249
+ host: {
250
+ "[attr.tabindex]": "tabindex()"
251
+ },
252
+ hostDirectives: [FocusState]
253
+ }]
254
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
255
+ type: Attribute,
256
+ args: ["tabindex"]
257
+ }] }] });
258
+
259
+ class KeystrokeService {
260
+ #keystrokes = {};
261
+ #keyEvent = new Observable((dst) => {
262
+ const handler = (event) => {
263
+ dst.next(event);
264
+ };
265
+ document.addEventListener("keydown", handler, { capture: true });
266
+ document.addEventListener("keyup", handler, { capture: true });
267
+ return () => {
268
+ document.removeEventListener("keydown", handler, { capture: true });
269
+ document.removeEventListener("keyup", handler, { capture: true });
270
+ };
271
+ }).pipe(share());
272
+ #activatedKs = this.#keyEvent.pipe(map(event => {
273
+ const keystroke = eventToKeystroke(event);
274
+ const id = keystrokeId(keystroke);
275
+ return { event, keystrokes: this.#keystrokes[id] || [], keystroke };
276
+ }));
277
+ constructor() {
278
+ this.#activatedKs.pipe(takeUntilDestroyed()).subscribe(({ event, keystrokes, keystroke }) => {
279
+ console.log({ event, keystrokes, keystroke });
280
+ for (const ks of keystrokes) {
281
+ if (event.defaultPrevented) {
282
+ return;
283
+ }
284
+ if (ks.target === event.target ||
285
+ ks.target.contains(event.target) ||
286
+ document.activeElement === ks.target ||
287
+ ks.target.contains(document.activeElement)) {
288
+ ks.subject.next({ original: event, keystroke });
289
+ }
290
+ }
291
+ });
292
+ }
293
+ watch(target, keystroke) {
294
+ const id = keystrokeId(keystroke);
295
+ return new Observable((dst) => {
296
+ if (!this.#keystrokes[id]) {
297
+ this.#keystrokes[id] = [];
298
+ }
299
+ const subject = new Subject();
300
+ const entry = { target: coerceElement(target), keystroke, subject };
301
+ const sub = subject.subscribe(dst);
302
+ this.#keystrokes[id].push(entry);
303
+ return () => {
304
+ sub.unsubscribe();
305
+ if (this.#keystrokes[id]) {
306
+ const index = this.#keystrokes[id].indexOf(entry);
307
+ if (index !== -1) {
308
+ this.#keystrokes[id].splice(index, 1);
309
+ }
310
+ if (this.#keystrokes[id].length === 0) {
311
+ delete this.#keystrokes[id];
312
+ }
313
+ }
314
+ };
315
+ }).pipe(share());
316
+ }
317
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: KeystrokeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
318
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: KeystrokeService, providedIn: "root" }); }
319
+ }
320
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: KeystrokeService, decorators: [{
321
+ type: Injectable,
322
+ args: [{ providedIn: "root" }]
323
+ }], ctorParameters: () => [] });
324
+ function keystrokeId(ks) {
325
+ let res = ks.key;
326
+ if (ks.shift) {
327
+ res += "+shift";
328
+ }
329
+ if (ks.ctrl) {
330
+ res += "+ctrl";
331
+ }
332
+ if (ks.alt) {
333
+ res += "+alt";
334
+ }
335
+ res += `${ks.state}`;
336
+ return res;
337
+ }
338
+ function eventToKeystroke(event) {
339
+ return {
340
+ key: event.key,
341
+ shift: event.shiftKey,
342
+ ctrl: event.ctrlKey,
343
+ alt: event.altKey,
344
+ state: event.type === "keyup" ? "up" : "down"
345
+ };
346
+ }
236
347
 
237
348
  /**
238
349
  * Generated bundle index. Do not edit.
239
350
  */
240
351
 
241
- export { ActivityService, FocusService, FocusTrap, Focusable };
352
+ export { ActivityService, FocusService, FocusState, FocusTrap, Focusable, KeystrokeService };
242
353
  //# sourceMappingURL=ngutil-aria.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngutil-aria.mjs","sources":["../../../../packages/aria/src/activity/activity.service.ts","../../../../packages/aria/src/focus/focus.service.ts","../../../../packages/aria/src/focus/focus-trap.directive.ts","../../../../packages/aria/src/focus/focusable.directive.ts","../../../../packages/aria/src/ngutil-aria.ts"],"sourcesContent":["import { DOCUMENT } from \"@angular/common\"\nimport { Inject, Injectable, NgZone } from \"@angular/core\"\n\nimport { distinctUntilChanged, filter, Observable, shareReplay, Subject } from \"rxjs\"\n\nimport { Destructible } from \"@ngutil/common\"\n\n// TODO: detect program activity\nexport type ActivityOrigin = \"mouse\" | \"keyboard\" | \"touch\" | \"program\"\n\nexport interface ActivityEvent {\n origin: ActivityOrigin\n node?: Node\n}\n\nconst EVENT_OPTIONS: AddEventListenerOptions = {\n capture: true,\n passive: true\n}\n\n@Injectable({ providedIn: \"root\" })\nexport class ActivityService extends Destructible {\n #activity!: Subject<ActivityEvent>\n\n readonly events!: Observable<ActivityEvent>\n\n constructor(@Inject(DOCUMENT) document: Document, @Inject(NgZone) zone: NgZone) {\n super()\n\n zone.runOutsideAngular(() => {\n this.#activity = new Subject()\n ;(this as { events: Observable<ActivityEvent> }).events = this.#activity.pipe(\n distinctUntilChanged((prev, curr): boolean => {\n if (prev && curr) {\n return prev.origin === curr.origin && prev.node === curr.node\n } else {\n return false\n }\n }),\n shareReplay(1)\n )\n\n document.addEventListener(\"keydown\", this.#onKeydown, EVENT_OPTIONS)\n document.addEventListener(\"mousedown\", this.#onMouseDown, EVENT_OPTIONS)\n document.addEventListener(\"mousemove\", this.#onMouseMove, EVENT_OPTIONS)\n document.addEventListener(\"touchstart\", this.#onTouchStart, EVENT_OPTIONS)\n\n this.d.any(() => {\n document.removeEventListener(\"keydown\", this.#onKeydown, EVENT_OPTIONS)\n document.removeEventListener(\"mousedown\", this.#onMouseDown, EVENT_OPTIONS)\n document.removeEventListener(\"mousemove\", this.#onMouseMove, EVENT_OPTIONS)\n document.removeEventListener(\"touchstart\", this.#onTouchStart, EVENT_OPTIONS)\n })\n })\n }\n\n watchActivity(node?: HTMLElement) {\n if (node) {\n return this.events.pipe(\n filter(\n event =>\n event.node != null &&\n (event.node === node || (event.node instanceof HTMLElement && event.node.contains(node)))\n ),\n shareReplay(1)\n )\n } else {\n return this.events\n }\n }\n\n watchInactvity(timeout: number) {\n throw Error(\"Not implemnted yet\")\n }\n\n #onKeydown = (event: KeyboardEvent) => {\n this.#activity.next({ origin: \"keyboard\", node: event.target as any })\n }\n\n #onMouseDown = (event: MouseEvent) => {\n this.#activity.next({ origin: \"mouse\", node: event.target as any })\n }\n\n #onMouseMove = (event: MouseEvent) => {\n // this.#activity.next({ origin: \"mouse\" })\n }\n\n #onTouchStart = (event: TouchEvent) => {\n this.#activity.next({ origin: \"touch\", node: event.target as any })\n }\n}\n","import { DOCUMENT } from \"@angular/common\"\nimport { inject, Inject, Injectable, NgZone } from \"@angular/core\"\n\nimport { combineLatest, filter, map, merge, Observable, shareReplay, startWith, Subject } from \"rxjs\"\n\nimport { focusable, type FocusableElement, isFocusable } from \"tabbable\"\n\nimport { Destructible } from \"@ngutil/common\"\n\nimport { ActivityOrigin, ActivityService } from \"../activity\"\n\nconst EVENT_OPTIONS: AddEventListenerOptions = {\n capture: true,\n passive: true\n}\n\nexport type FocusOrigin = ActivityOrigin | null\n// export type FocusTarget = null | \"self\" | \"child\"\n\nexport interface FocusChanges {\n origin: FocusOrigin\n element: HTMLElement\n}\n\nexport interface FocusableEvent {\n origin: FocusOrigin\n exact: boolean\n node: Node\n}\n\n@Injectable({ providedIn: \"root\" })\nexport class FocusService extends Destructible {\n #activity = inject(ActivityService)\n #focus = new Subject<Node>()\n #blur = new Subject<Node>()\n events!: Observable<FocusChanges>\n\n constructor(@Inject(DOCUMENT) document: Document, @Inject(NgZone) zone: NgZone) {\n super()\n\n zone.runOutsideAngular(() => {\n const blur = this.#blur.pipe(startWith(null), shareReplay(1))\n const focus = this.#focus.pipe(shareReplay(1))\n\n const events = combineLatest({\n activity: this.#activity.events,\n focus: focus,\n blur: blur\n }).pipe(\n map(({ activity, focus, blur }) => {\n // console.log({ activity, focus, blur })\n\n // If focus in with alt+tab\n if (blur === document && activity.origin === \"keyboard\") {\n return { origin: \"program\", element: focus }\n }\n\n if (focus === document) {\n return { origin: \"program\", element: focus }\n }\n\n // If press tab button, first fire the event in the currently focused element\n if (focus === blur) {\n return null\n }\n\n // When press tab, the activity is on the current fucesd element,\n // so when blur is changed to it, the focus change is completed\n if (activity.origin === \"keyboard\" && isActivityElement(activity.node, blur)) {\n return { origin: \"keyboard\", element: focus }\n }\n\n if (isActivityElement(activity.node, focus)) {\n return { origin: activity.origin, element: focus }\n } else {\n return { origin: \"program\", element: focus }\n }\n }),\n filter(v => !!v),\n shareReplay(1)\n ) as any\n\n this.events = merge(\n blur.pipe(\n map(element => {\n return { origin: null, element }\n })\n ),\n events\n ).pipe(shareReplay(1)) as any\n\n document.addEventListener(\"focus\", this.#onFocus, EVENT_OPTIONS)\n document.addEventListener(\"blur\", this.#onBlur, EVENT_OPTIONS)\n\n this.d.any(() => {\n document.removeEventListener(\"focus\", this.#onFocus, EVENT_OPTIONS)\n document.removeEventListener(\"blur\", this.#onBlur, EVENT_OPTIONS)\n })\n })\n }\n\n #onFocus = (event: FocusEvent) => {\n this.#focus.next(event.target as Node)\n }\n\n #onBlur = (event: FocusEvent) => {\n this.#blur.next(event.target as Node)\n }\n\n watch(node: Node) {\n return this.events.pipe(\n filter(event => event.element && (event.element === node || node.contains(event.element))),\n shareReplay(1)\n )\n }\n\n focus(node: HTMLElement, _origon: FocusOrigin | null) {\n // TODO: focus origin\n node.focus()\n }\n\n queryFocusable(inside: HTMLElement): FocusableElement[] {\n return focusable(inside, { includeContainer: false })\n }\n\n getFirstFocusable(inside: HTMLElement): FocusableElement | undefined {\n return this.queryFocusable(inside)[0]\n }\n\n isFocusable(node: Element): boolean {\n return isFocusable(node)\n }\n}\n\nfunction isActivityElement(activityEl?: Node | null, focused?: Node | null): boolean {\n return activityEl != null && focused != null && (activityEl === focused || focused.contains(activityEl))\n}\n","import { ElementRef, inject } from \"@angular/core\"\n\nimport { BehaviorSubject } from \"rxjs\"\n\nimport { Destructible } from \"@ngutil/common\"\n\nimport { FocusService } from \"./focus.service\"\n\n// TODO: implement\nexport class FocusTrap extends Destructible {\n #manager = inject(FocusService)\n #el = inject(ElementRef<HTMLElement>)\n\n get enabled() {\n return this.#enabled.value\n }\n set enabled(val: boolean) {\n if (this.#enabled.value !== val) {\n this.#enabled.next(val)\n }\n }\n #enabled = new BehaviorSubject<boolean>(true)\n\n enable() {\n this.enabled = true\n }\n\n disable() {\n this.enabled = false\n }\n}\n","import { Directive, ElementRef, inject, NgZone } from \"@angular/core\"\n\nimport { map, Observable, shareReplay } from \"rxjs\"\n\nimport { Destructible, FastDOM } from \"@ngutil/common\"\n\nimport { type FocusableEvent, type FocusOrigin, FocusService } from \"./focus.service\"\n\n// TODO: set [attr.focused]=\"[mouse | keyboard | program] [exact | child]\"\n@Directive({ standalone: true })\nexport class Focusable extends Destructible {\n #service = inject(FocusService)\n #elRef = inject(ElementRef<Node>)\n #el = this.#elRef.nativeElement\n\n readonly events!: Observable<FocusableEvent>\n readonly origin!: Observable<FocusOrigin>\n // readonly origin = new BehaviorSubject<FocusOrigin>(null)\n readonly exact!: Observable<boolean>\n\n constructor(zone: NgZone) {\n super()\n\n zone.runOutsideAngular(() => {\n const events = this.#service.watch(this.#el)\n\n ;(this as { events: Observable<FocusableEvent> }).events = events.pipe(\n map(event => {\n const self = this.#el\n let exact: boolean | null = null\n let focused: HTMLElement | null = event.element\n\n while (focused) {\n if (focused === self) {\n if (exact === null) {\n exact = true\n }\n break\n } else {\n const attr = focused.getAttribute(\"focused\")\n if (attr && attr.length > 0) {\n exact = false\n break\n }\n\n focused = focused.parentElement\n }\n }\n return { origin: event.origin, exact, node: event.element } as FocusableEvent\n }),\n shareReplay(1)\n )\n ;(this as { origin: Observable<FocusOrigin> }).origin = this.events.pipe(\n map(event => event.origin),\n shareReplay(1)\n )\n ;(this as { exact: Observable<boolean> }).exact = this.events.pipe(\n map(event => event.exact),\n shareReplay(1)\n )\n\n this.d.sub(this.events).subscribe(event => {\n FastDOM.setAttributes(this.#el, {\n focused: event.origin ? `${event.origin} ${event.exact ? \"exact\" : \"child\"}` : null\n })\n })\n })\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["EVENT_OPTIONS"],"mappings":"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"}
1
+ {"version":3,"file":"ngutil-aria.mjs","sources":["../../../../packages/aria/src/activity/activity.service.ts","../../../../packages/aria/src/focus/focus.service.ts","../../../../packages/aria/src/focus/focus-trap.directive.ts","../../../../packages/aria/src/focus/focus-state.directive.ts","../../../../packages/aria/src/focus/focusable.directive.ts","../../../../packages/aria/src/keystroke/keystroke.service.ts","../../../../packages/aria/src/ngutil-aria.ts"],"sourcesContent":["import { DOCUMENT } from \"@angular/common\"\nimport { Inject, Injectable, NgZone } from \"@angular/core\"\n\nimport { distinctUntilChanged, filter, Observable, shareReplay, Subject } from \"rxjs\"\n\nimport { Destructible } from \"@ngutil/common\"\n\n// TODO: detect program activity\nexport type ActivityOrigin = \"mouse\" | \"keyboard\" | \"touch\" | \"program\"\n\nexport interface ActivityEvent {\n origin: ActivityOrigin\n node?: Node\n}\n\nconst EVENT_OPTIONS: AddEventListenerOptions = {\n capture: true,\n passive: true\n}\n\n@Injectable({ providedIn: \"root\" })\nexport class ActivityService extends Destructible {\n #activity!: Subject<ActivityEvent>\n\n readonly events!: Observable<ActivityEvent>\n\n constructor(@Inject(DOCUMENT) document: Document, @Inject(NgZone) zone: NgZone) {\n super()\n\n zone.runOutsideAngular(() => {\n this.#activity = new Subject()\n ;(this as { events: Observable<ActivityEvent> }).events = this.#activity.pipe(\n distinctUntilChanged((prev, curr): boolean => {\n if (prev && curr) {\n return prev.origin === curr.origin && prev.node === curr.node\n } else {\n return false\n }\n }),\n shareReplay(1)\n )\n\n document.addEventListener(\"keydown\", this.#onKeydown, EVENT_OPTIONS)\n document.addEventListener(\"mousedown\", this.#onMouseDown, EVENT_OPTIONS)\n document.addEventListener(\"mousemove\", this.#onMouseMove, EVENT_OPTIONS)\n document.addEventListener(\"touchstart\", this.#onTouchStart, EVENT_OPTIONS)\n\n this.d.any(() => {\n document.removeEventListener(\"keydown\", this.#onKeydown, EVENT_OPTIONS)\n document.removeEventListener(\"mousedown\", this.#onMouseDown, EVENT_OPTIONS)\n document.removeEventListener(\"mousemove\", this.#onMouseMove, EVENT_OPTIONS)\n document.removeEventListener(\"touchstart\", this.#onTouchStart, EVENT_OPTIONS)\n })\n })\n }\n\n watchActivity(node?: HTMLElement) {\n if (node) {\n return this.events.pipe(\n filter(\n event =>\n event.node != null &&\n (event.node === node || (event.node instanceof HTMLElement && event.node.contains(node)))\n ),\n shareReplay(1)\n )\n } else {\n return this.events\n }\n }\n\n watchInactvity(timeout: number) {\n throw Error(\"Not implemnted yet\")\n }\n\n #onKeydown = (event: KeyboardEvent) => {\n this.#activity.next({ origin: \"keyboard\", node: event.target as any })\n }\n\n #onMouseDown = (event: MouseEvent) => {\n this.#activity.next({ origin: \"mouse\", node: event.target as any })\n }\n\n #onMouseMove = (event: MouseEvent) => {\n // this.#activity.next({ origin: \"mouse\" })\n }\n\n #onTouchStart = (event: TouchEvent) => {\n this.#activity.next({ origin: \"touch\", node: event.target as any })\n }\n}\n","import { FocusTrapFactory } from \"@angular/cdk/a11y\"\nimport { DOCUMENT } from \"@angular/common\"\nimport { inject, Inject, Injectable, NgZone } from \"@angular/core\"\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\"\n\nimport { combineLatest, filter, fromEvent, map, Observable, shareReplay, startWith } from \"rxjs\"\n\nimport { focusable, type FocusableElement, isFocusable } from \"tabbable\"\n\nimport { ActivityOrigin, ActivityService } from \"../activity\"\n\nconst EVENT_OPTIONS: AddEventListenerOptions = {\n capture: true,\n passive: true\n}\n\nexport type FocusOrigin = ActivityOrigin | null\n\nexport interface FocusChanges {\n origin: FocusOrigin\n element: HTMLElement\n}\n\nexport interface FocusableEvent {\n origin: FocusOrigin\n exact: boolean\n node: Node\n}\n\n@Injectable({ providedIn: \"root\" })\nexport class FocusService {\n readonly #activity = inject(ActivityService)\n readonly #focusTrap = inject(FocusTrapFactory)\n readonly events: Observable<FocusChanges>\n\n constructor(@Inject(DOCUMENT) document: Document, @Inject(NgZone) zone: NgZone) {\n this.events = zone.runOutsideAngular(() => {\n const focus = fromEvent(document, \"focus\", EVENT_OPTIONS).pipe(map(e => e.target as Node))\n const blur = fromEvent(document, \"blur\", EVENT_OPTIONS).pipe(\n startWith(null),\n map(e => (e?.target as Node) || null)\n )\n\n return combineLatest({\n activity: this.#activity.events,\n focus: focus,\n blur: blur\n }).pipe(\n takeUntilDestroyed(),\n map(({ activity, focus, blur }) => {\n // console.log({ activity, focus, blur })\n\n // If focus in with alt+tab\n if (blur === document && activity.origin === \"keyboard\") {\n return { origin: \"program\", element: focus }\n }\n\n if (focus === document) {\n return { origin: \"program\", element: focus }\n }\n\n // If press tab button, first fire the event in the currently focused element\n if (focus === blur) {\n return null\n }\n\n // When press tab, the activity is on the current fucesd element,\n // so when blur is changed to it, the focus change is completed\n if (activity.origin === \"keyboard\" && isActivityElement(activity.node, blur)) {\n return { origin: \"keyboard\", element: focus }\n }\n\n if (isActivityElement(activity.node, focus)) {\n return { origin: activity.origin, element: focus }\n } else {\n return { origin: \"program\", element: focus }\n }\n }),\n filter(v => !!v),\n shareReplay(1)\n ) as any\n })\n }\n\n watch(node: Node) {\n return this.events.pipe(\n map(event => {\n if (\n event.element &&\n (event.element === node || (typeof node.contains === \"function\" && node.contains(event.element)))\n ) {\n return event\n }\n return { element: node, origin: null }\n })\n )\n }\n\n focus(node: HTMLElement, _origin: FocusOrigin | null) {\n // TODO: focus origin\n node.focus()\n }\n\n queryFocusable(inside: HTMLElement): FocusableElement[] {\n return focusable(inside, { includeContainer: false })\n }\n\n getFirstFocusable(inside: HTMLElement): FocusableElement | undefined {\n return this.queryFocusable(inside)[0]\n }\n\n isFocusable(node: Element): boolean {\n return isFocusable(node)\n }\n\n focusTrap(inside: HTMLElement, deferCaptureElements: boolean = false) {\n return this.#focusTrap.create(inside, deferCaptureElements)\n }\n}\n\nfunction isActivityElement(activityEl?: Node | null, focused?: Node | null): boolean {\n return activityEl != null && focused != null && (activityEl === focused || focused.contains(activityEl))\n}\n","import { ElementRef, inject } from \"@angular/core\"\n\nimport { BehaviorSubject } from \"rxjs\"\n\nimport { Destructible } from \"@ngutil/common\"\n\nimport { FocusService } from \"./focus.service\"\n\n// TODO: implement\nexport class FocusTrap extends Destructible {\n #manager = inject(FocusService)\n #el = inject(ElementRef<HTMLElement>)\n\n get enabled() {\n return this.#enabled.value\n }\n set enabled(val: boolean) {\n if (this.#enabled.value !== val) {\n this.#enabled.next(val)\n }\n }\n #enabled = new BehaviorSubject<boolean>(true)\n\n enable() {\n this.enabled = true\n }\n\n disable() {\n this.enabled = false\n }\n}\n","import { computed, Directive, effect, ElementRef, inject } from \"@angular/core\"\nimport { takeUntilDestroyed, toSignal } from \"@angular/core/rxjs-interop\"\n\nimport { shareReplay } from \"rxjs\"\n\nimport { FocusService } from \"./focus.service\"\n\n@Directive({\n standalone: true,\n host: {\n \"[attr.focus]\": \"origin()\",\n \"[attr.focusWithin]\": \"within()\"\n }\n})\nexport class FocusState {\n readonly #focus = inject(FocusService)\n readonly #el = inject<ElementRef<HTMLElement>>(ElementRef)\n\n readonly #event = this.#focus.watch(this.#el.nativeElement).pipe(takeUntilDestroyed(), shareReplay(1))\n readonly event = toSignal(this.#event, { rejectErrors: true, manualCleanup: true })\n\n readonly origin = computed(() => this.event()?.origin)\n\n readonly within = computed(() => {\n const event = this.event()\n return event ? (event.element !== this.#el.nativeElement ? event.origin : null) : null\n })\n\n constructor() {\n // TODO: miért kell ez?, ha nincs itt akkor nem frissül\n effect(() => this.origin(), { allowSignalWrites: false })\n }\n}\n","import { Attribute, computed, Directive, effect, inject, input } from \"@angular/core\"\n\nimport { DisabledState } from \"@ngutil/common\"\n\nimport { FocusState } from \"./focus-state.directive\"\n\n// TODO: what happens when disabled is changed\n\n@Directive({\n standalone: true,\n selector: \"[nuFocusable]\",\n exportAs: \"nuFocusable\",\n host: {\n \"[attr.tabindex]\": \"tabindex()\"\n },\n hostDirectives: [FocusState]\n})\nexport class Focusable {\n readonly #disabled = inject(DisabledState, { optional: true, self: true })\n\n readonly focusable = input<boolean | number>(true, { alias: \"nuFocusable\" })\n\n readonly #tabindex?: number\n readonly tabindex = computed(() => {\n const focusable = this.focusable()\n\n if (focusable === false || this.#disabled?.isDisabled()) {\n return -1\n }\n\n if (typeof focusable === \"number\") {\n return focusable\n }\n\n if (focusable === true && this.#tabindex != null && !isNaN(this.#tabindex)) {\n return this.#tabindex\n }\n\n return 0\n })\n\n constructor(@Attribute(\"tabindex\") tabindex?: string | number) {\n if (tabindex != null) {\n this.#tabindex = Number(tabindex)\n }\n\n // TODO: miért kell ez?, ha nincs itt akkor nem frissül\n effect(() => this.tabindex(), { allowSignalWrites: false })\n }\n}\n","import { Injectable } from \"@angular/core\"\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\"\n\nimport { map, Observable, share, Subject, Subscriber } from \"rxjs\"\n\nimport { coerceElement, ElementInput } from \"@ngutil/common\"\n\nexport interface Keystroke {\n // https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_key_values\n key: KeyboardEvent[\"key\"]\n shift?: boolean\n ctrl?: boolean\n alt?: boolean\n state: \"down\" | \"up\"\n}\n\nexport interface KeystrokeEvent {\n original: KeyboardEvent\n keystroke: Keystroke\n}\n\ninterface KeystrokeEntry {\n keystroke: Keystroke\n target: HTMLElement\n subject: Subject<KeystrokeEvent>\n}\n\n@Injectable({ providedIn: \"root\" })\nexport class KeystrokeService {\n readonly #keystrokes: { [key: string]: KeystrokeEntry[] } = {}\n\n readonly #keyEvent = new Observable((dst: Subscriber<KeyboardEvent>) => {\n const handler = (event: KeyboardEvent) => {\n dst.next(event)\n }\n document.addEventListener(\"keydown\", handler, { capture: true })\n document.addEventListener(\"keyup\", handler, { capture: true })\n\n return () => {\n document.removeEventListener(\"keydown\", handler, { capture: true })\n document.removeEventListener(\"keyup\", handler, { capture: true })\n }\n }).pipe(share())\n\n readonly #activatedKs = this.#keyEvent.pipe(\n map(event => {\n const keystroke = eventToKeystroke(event)\n const id = keystrokeId(keystroke)\n return { event, keystrokes: this.#keystrokes[id] || [], keystroke }\n })\n )\n\n constructor() {\n this.#activatedKs.pipe(takeUntilDestroyed()).subscribe(({ event, keystrokes, keystroke }) => {\n console.log({ event, keystrokes, keystroke })\n for (const ks of keystrokes) {\n if (event.defaultPrevented) {\n return\n }\n\n if (\n ks.target === event.target ||\n ks.target.contains(event.target as Node) ||\n document.activeElement === ks.target ||\n ks.target.contains(document.activeElement as Node)\n ) {\n ks.subject.next({ original: event, keystroke })\n }\n }\n })\n }\n\n watch(target: ElementInput, keystroke: Keystroke): Observable<KeystrokeEvent> {\n const id = keystrokeId(keystroke)\n return new Observable((dst: Subscriber<KeystrokeEvent>) => {\n if (!this.#keystrokes[id]) {\n this.#keystrokes[id] = []\n }\n\n const subject = new Subject<KeystrokeEvent>()\n const entry: KeystrokeEntry = { target: coerceElement(target), keystroke, subject }\n const sub = subject.subscribe(dst)\n\n this.#keystrokes[id].push(entry)\n\n return () => {\n sub.unsubscribe()\n if (this.#keystrokes[id]) {\n const index = this.#keystrokes[id].indexOf(entry)\n if (index !== -1) {\n this.#keystrokes[id].splice(index, 1)\n }\n if (this.#keystrokes[id].length === 0) {\n delete this.#keystrokes[id]\n }\n }\n }\n }).pipe(share())\n }\n}\n\nfunction keystrokeId(ks: Keystroke): string {\n let res = ks.key\n if (ks.shift) {\n res += \"+shift\"\n }\n if (ks.ctrl) {\n res += \"+ctrl\"\n }\n if (ks.alt) {\n res += \"+alt\"\n }\n res += `${ks.state}`\n return res\n}\n\nfunction eventToKeystroke(event: KeyboardEvent): Keystroke {\n return {\n key: event.key,\n shift: event.shiftKey,\n ctrl: event.ctrlKey,\n alt: event.altKey,\n state: event.type === \"keyup\" ? \"up\" : \"down\"\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["EVENT_OPTIONS","i1.FocusState"],"mappings":";;;;;;;;;AAeA,MAAMA,eAAa,GAA4B;AAC3C,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,OAAO,EAAE,IAAI;CAChB,CAAA;AAGK,MAAO,eAAgB,SAAQ,YAAY,CAAA;AAC7C,IAAA,SAAS,CAAyB;IAIlC,WAA8B,CAAA,QAAkB,EAAkB,IAAY,EAAA;AAC1E,QAAA,KAAK,EAAE,CAAA;AAEP,QAAA,IAAI,CAAC,iBAAiB,CAAC,MAAK;AACxB,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,OAAO,EAAE,CAC7B;AAAC,YAAA,IAA8C,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACzE,oBAAoB,CAAC,CAAC,IAAI,EAAE,IAAI,KAAa;AACzC,gBAAA,IAAI,IAAI,IAAI,IAAI,EAAE;AACd,oBAAA,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAA;iBAChE;qBAAM;AACH,oBAAA,OAAO,KAAK,CAAA;iBACf;AACL,aAAC,CAAC,EACF,WAAW,CAAC,CAAC,CAAC,CACjB,CAAA;YAED,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAEA,eAAa,CAAC,CAAA;YACpE,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,EAAEA,eAAa,CAAC,CAAA;YACxE,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,EAAEA,eAAa,CAAC,CAAA;YACxE,QAAQ,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,EAAEA,eAAa,CAAC,CAAA;AAE1E,YAAA,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAK;gBACZ,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAEA,eAAa,CAAC,CAAA;gBACvE,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,EAAEA,eAAa,CAAC,CAAA;gBAC3E,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,EAAEA,eAAa,CAAC,CAAA;gBAC3E,QAAQ,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,EAAEA,eAAa,CAAC,CAAA;AACjF,aAAC,CAAC,CAAA;AACN,SAAC,CAAC,CAAA;KACL;AAED,IAAA,aAAa,CAAC,IAAkB,EAAA;QAC5B,IAAI,IAAI,EAAE;AACN,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACnB,MAAM,CACF,KAAK,IACD,KAAK,CAAC,IAAI,IAAI,IAAI;AAClB,iBAAC,KAAK,CAAC,IAAI,KAAK,IAAI,KAAK,KAAK,CAAC,IAAI,YAAY,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAChG,EACD,WAAW,CAAC,CAAC,CAAC,CACjB,CAAA;SACJ;aAAM;YACH,OAAO,IAAI,CAAC,MAAM,CAAA;SACrB;KACJ;AAED,IAAA,cAAc,CAAC,OAAe,EAAA;AAC1B,QAAA,MAAM,KAAK,CAAC,oBAAoB,CAAC,CAAA;KACpC;AAED,IAAA,UAAU,GAAG,CAAC,KAAoB,KAAI;AAClC,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,MAAa,EAAE,CAAC,CAAA;AAC1E,KAAC,CAAA;AAED,IAAA,YAAY,GAAG,CAAC,KAAiB,KAAI;AACjC,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,MAAa,EAAE,CAAC,CAAA;AACvE,KAAC,CAAA;AAED,IAAA,YAAY,GAAG,CAAC,KAAiB,KAAI;;AAErC,KAAC,CAAA;AAED,IAAA,aAAa,GAAG,CAAC,KAAiB,KAAI;AAClC,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,MAAa,EAAE,CAAC,CAAA;AACvE,KAAC,CAAA;8GApEQ,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAKJ,QAAQ,EAAA,EAAA,EAAA,KAAA,EAA8B,MAAM,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AALvD,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cADF,MAAM,EAAA,CAAA,CAAA,EAAA;;2FACnB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;0BAMjB,MAAM;2BAAC,QAAQ,CAAA;;0BAAuB,MAAM;2BAAC,MAAM,CAAA;;;ACfpE,MAAM,aAAa,GAA4B;AAC3C,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,OAAO,EAAE,IAAI;CAChB,CAAA;MAgBY,YAAY,CAAA;AACZ,IAAA,SAAS,GAAG,MAAM,CAAC,eAAe,CAAC,CAAA;AACnC,IAAA,UAAU,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAA;IAG9C,WAA8B,CAAA,QAAkB,EAAkB,IAAY,EAAA;QAC1E,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAK;YACtC,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAc,CAAC,CAAC,CAAA;AAC1F,YAAA,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,IAAI,CACxD,SAAS,CAAC,IAAI,CAAC,EACf,GAAG,CAAC,CAAC,IAAK,CAAC,EAAE,MAAe,IAAI,IAAI,CAAC,CACxC,CAAA;AAED,YAAA,OAAO,aAAa,CAAC;AACjB,gBAAA,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM;AAC/B,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,IAAI,EAAE,IAAI;AACb,aAAA,CAAC,CAAC,IAAI,CACH,kBAAkB,EAAE,EACpB,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAI;;;gBAI9B,IAAI,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE;oBACrD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;iBAC/C;AAED,gBAAA,IAAI,KAAK,KAAK,QAAQ,EAAE;oBACpB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;iBAC/C;;AAGD,gBAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAChB,oBAAA,OAAO,IAAI,CAAA;iBACd;;;AAID,gBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,IAAI,iBAAiB,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;oBAC1E,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;iBAChD;gBAED,IAAI,iBAAiB,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;oBACzC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;iBACrD;qBAAM;oBACH,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;iBAC/C;AACL,aAAC,CAAC,EACF,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAChB,WAAW,CAAC,CAAC,CAAC,CACV,CAAA;AACZ,SAAC,CAAC,CAAA;KACL;AAED,IAAA,KAAK,CAAC,IAAU,EAAA;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACnB,GAAG,CAAC,KAAK,IAAG;YACR,IACI,KAAK,CAAC,OAAO;iBACZ,KAAK,CAAC,OAAO,KAAK,IAAI,KAAK,OAAO,IAAI,CAAC,QAAQ,KAAK,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EACnG;AACE,gBAAA,OAAO,KAAK,CAAA;aACf;YACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;SACzC,CAAC,CACL,CAAA;KACJ;IAED,KAAK,CAAC,IAAiB,EAAE,OAA2B,EAAA;;QAEhD,IAAI,CAAC,KAAK,EAAE,CAAA;KACf;AAED,IAAA,cAAc,CAAC,MAAmB,EAAA;QAC9B,OAAO,SAAS,CAAC,MAAM,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAA;KACxD;AAED,IAAA,iBAAiB,CAAC,MAAmB,EAAA;QACjC,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;KACxC;AAED,IAAA,WAAW,CAAC,IAAa,EAAA;AACrB,QAAA,OAAO,WAAW,CAAC,IAAI,CAAC,CAAA;KAC3B;AAED,IAAA,SAAS,CAAC,MAAmB,EAAE,oBAAA,GAAgC,KAAK,EAAA;QAChE,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;KAC9D;8GAvFQ,YAAY,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAKD,QAAQ,EAAA,EAAA,EAAA,KAAA,EAA8B,MAAM,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AALvD,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cADC,MAAM,EAAA,CAAA,CAAA,EAAA;;2FACnB,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;0BAMjB,MAAM;2BAAC,QAAQ,CAAA;;0BAAuB,MAAM;2BAAC,MAAM,CAAA;;AAqFpE,SAAS,iBAAiB,CAAC,UAAwB,EAAE,OAAqB,EAAA;IACtE,OAAO,UAAU,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,KAAK,UAAU,KAAK,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAA;AAC5G;;AClHA;AACM,MAAO,SAAU,SAAQ,YAAY,CAAA;AACvC,IAAA,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,CAAA;AAC/B,IAAA,GAAG,GAAG,MAAM,EAAC,UAAuB,EAAC,CAAA;AAErC,IAAA,IAAI,OAAO,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAA;KAC7B;IACD,IAAI,OAAO,CAAC,GAAY,EAAA;QACpB,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,GAAG,EAAE;AAC7B,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;SAC1B;KACJ;AACD,IAAA,QAAQ,GAAG,IAAI,eAAe,CAAU,IAAI,CAAC,CAAA;IAE7C,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;KACtB;IAED,OAAO,GAAA;AACH,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;KACvB;AACJ;;MChBY,UAAU,CAAA;AACV,IAAA,MAAM,CAAuB;AAC7B,IAAA,GAAG,CAA8C;AAEjD,IAAA,MAAM,CAAuF;AAUtG,IAAA,WAAA,GAAA;AAbS,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,CAAA;AAC7B,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAA0B,UAAU,CAAC,CAAA;QAEjD,IAAM,CAAA,MAAA,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;AAC7F,QAAA,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;AAE1E,QAAA,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAA;AAE7C,QAAA,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,MAAK;AAC5B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;AAC1B,YAAA,OAAO,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,IAAI,IAAI,CAAA;AAC1F,SAAC,CAAC,CAAA;;AAIE,QAAA,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAA;KAC5D;8GAjBQ,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAV,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,YAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;2FAAV,UAAU,EAAA,UAAA,EAAA,CAAA;kBAPtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACF,wBAAA,cAAc,EAAE,UAAU;AAC1B,wBAAA,oBAAoB,EAAE,UAAU;AACnC,qBAAA;AACJ,iBAAA,CAAA;;;ACPD;MAWa,SAAS,CAAA;AACT,IAAA,SAAS,CAAwD;AAIjE,IAAA,SAAS,CAAS;AAmB3B,IAAA,WAAA,CAAmC,QAA0B,EAAA;AAvBpD,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAEjE,IAAS,CAAA,SAAA,GAAG,KAAK,CAAmB,IAAI,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAA;AAGnE,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAC9B,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;YAElC,IAAI,SAAS,KAAK,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE;gBACrD,OAAO,CAAC,CAAC,CAAA;aACZ;AAED,YAAA,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;AAC/B,gBAAA,OAAO,SAAS,CAAA;aACnB;AAED,YAAA,IAAI,SAAS,KAAK,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;gBACxE,OAAO,IAAI,CAAC,SAAS,CAAA;aACxB;AAED,YAAA,OAAO,CAAC,CAAA;AACZ,SAAC,CAAC,CAAA;AAGE,QAAA,IAAI,QAAQ,IAAI,IAAI,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;SACpC;;AAGD,QAAA,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAA;KAC9D;AA/BQ,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,SAAS,kBAwBK,UAAU,EAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAxBxB,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,YAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAAC,UAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;2FAAT,SAAS,EAAA,UAAA,EAAA,CAAA;kBATrB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,IAAI,EAAE;AACF,wBAAA,iBAAiB,EAAE,YAAY;AAClC,qBAAA;oBACD,cAAc,EAAE,CAAC,UAAU,CAAC;AAC/B,iBAAA,CAAA;;0BAyBgB,SAAS;2BAAC,UAAU,CAAA;;;MCbxB,gBAAgB,CAAA;IAChB,WAAW,GAAwC,EAAE,CAAA;AAErD,IAAA,SAAS,GAAG,IAAI,UAAU,CAAC,CAAC,GAA8B,KAAI;AACnE,QAAA,MAAM,OAAO,GAAG,CAAC,KAAoB,KAAI;AACrC,YAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACnB,SAAC,CAAA;AACD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AAChE,QAAA,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AAE9D,QAAA,OAAO,MAAK;AACR,YAAA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AACnE,YAAA,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AACrE,SAAC,CAAA;AACL,KAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;IAEP,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACvC,GAAG,CAAC,KAAK,IAAG;AACR,QAAA,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;AACzC,QAAA,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAA;AACjC,QAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,CAAA;KACtE,CAAC,CACL,CAAA;AAED,IAAA,WAAA,GAAA;QACI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,KAAI;YACxF,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAA;AAC7C,YAAA,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE;AACzB,gBAAA,IAAI,KAAK,CAAC,gBAAgB,EAAE;oBACxB,OAAM;iBACT;AAED,gBAAA,IACI,EAAE,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;oBAC1B,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC;AACxC,oBAAA,QAAQ,CAAC,aAAa,KAAK,EAAE,CAAC,MAAM;oBACpC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAqB,CAAC,EACpD;AACE,oBAAA,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;iBAClD;aACJ;AACL,SAAC,CAAC,CAAA;KACL;IAED,KAAK,CAAC,MAAoB,EAAE,SAAoB,EAAA;AAC5C,QAAA,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAA;AACjC,QAAA,OAAO,IAAI,UAAU,CAAC,CAAC,GAA+B,KAAI;YACtD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE;AACvB,gBAAA,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,CAAA;aAC5B;AAED,YAAA,MAAM,OAAO,GAAG,IAAI,OAAO,EAAkB,CAAA;AAC7C,YAAA,MAAM,KAAK,GAAmB,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;YACnF,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;YAElC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAEhC,YAAA,OAAO,MAAK;gBACR,GAAG,CAAC,WAAW,EAAE,CAAA;AACjB,gBAAA,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE;AACtB,oBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AACjD,oBAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AACd,wBAAA,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;qBACxC;oBACD,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;AACnC,wBAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;qBAC9B;iBACJ;AACL,aAAC,CAAA;AACL,SAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;KACnB;8GAtEQ,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cADH,MAAM,EAAA,CAAA,CAAA,EAAA;;2FACnB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;AA0ElC,SAAS,WAAW,CAAC,EAAa,EAAA;AAC9B,IAAA,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,CAAA;AAChB,IAAA,IAAI,EAAE,CAAC,KAAK,EAAE;QACV,GAAG,IAAI,QAAQ,CAAA;KAClB;AACD,IAAA,IAAI,EAAE,CAAC,IAAI,EAAE;QACT,GAAG,IAAI,OAAO,CAAA;KACjB;AACD,IAAA,IAAI,EAAE,CAAC,GAAG,EAAE;QACR,GAAG,IAAI,MAAM,CAAA;KAChB;AACD,IAAA,GAAG,IAAI,CAAG,EAAA,EAAE,CAAC,KAAK,EAAE,CAAA;AACpB,IAAA,OAAO,GAAG,CAAA;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAoB,EAAA;IAC1C,OAAO;QACH,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,KAAK,EAAE,KAAK,CAAC,QAAQ;QACrB,IAAI,EAAE,KAAK,CAAC,OAAO;QACnB,GAAG,EAAE,KAAK,CAAC,MAAM;AACjB,QAAA,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK,OAAO,GAAG,IAAI,GAAG,MAAM;KAChD,CAAA;AACL;;AC5HA;;AAEG;;;;"}
@@ -0,0 +1,13 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class FocusState {
3
+ #private;
4
+ readonly event: import("@angular/core").Signal<import("./focus.service").FocusChanges | {
5
+ element: Node;
6
+ origin: null;
7
+ } | undefined>;
8
+ readonly origin: import("@angular/core").Signal<import("./focus.service").FocusOrigin | undefined>;
9
+ readonly within: import("@angular/core").Signal<import("./focus.service").FocusOrigin>;
10
+ constructor();
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<FocusState, never>;
12
+ static ɵdir: i0.ɵɵDirectiveDeclaration<FocusState, never, never, {}, {}, never, never, true, never>;
13
+ }
@@ -1,7 +1,6 @@
1
1
  import { NgZone } from "@angular/core";
2
2
  import { Observable } from "rxjs";
3
3
  import { type FocusableElement } from "tabbable";
4
- import { Destructible } from "@ngutil/common";
5
4
  import { ActivityOrigin } from "../activity";
6
5
  import * as i0 from "@angular/core";
7
6
  export type FocusOrigin = ActivityOrigin | null;
@@ -14,15 +13,19 @@ export interface FocusableEvent {
14
13
  exact: boolean;
15
14
  node: Node;
16
15
  }
17
- export declare class FocusService extends Destructible {
16
+ export declare class FocusService {
18
17
  #private;
19
- events: Observable<FocusChanges>;
18
+ readonly events: Observable<FocusChanges>;
20
19
  constructor(document: Document, zone: NgZone);
21
- watch(node: Node): Observable<FocusChanges>;
22
- focus(node: HTMLElement, _origon: FocusOrigin | null): void;
20
+ watch(node: Node): Observable<FocusChanges | {
21
+ element: Node;
22
+ origin: null;
23
+ }>;
24
+ focus(node: HTMLElement, _origin: FocusOrigin | null): void;
23
25
  queryFocusable(inside: HTMLElement): FocusableElement[];
24
26
  getFirstFocusable(inside: HTMLElement): FocusableElement | undefined;
25
27
  isFocusable(node: Element): boolean;
28
+ focusTrap(inside: HTMLElement, deferCaptureElements?: boolean): import("@angular/cdk/a11y").FocusTrap;
26
29
  static ɵfac: i0.ɵɵFactoryDeclaration<FocusService, never>;
27
30
  static ɵprov: i0.ɵɵInjectableDeclaration<FocusService>;
28
31
  }
@@ -1,14 +1,10 @@
1
- import { NgZone } from "@angular/core";
2
- import { Observable } from "rxjs";
3
- import { Destructible } from "@ngutil/common";
4
- import { type FocusableEvent, type FocusOrigin } from "./focus.service";
5
1
  import * as i0 from "@angular/core";
6
- export declare class Focusable extends Destructible {
2
+ import * as i1 from "./focus-state.directive";
3
+ export declare class Focusable {
7
4
  #private;
8
- readonly events: Observable<FocusableEvent>;
9
- readonly origin: Observable<FocusOrigin>;
10
- readonly exact: Observable<boolean>;
11
- constructor(zone: NgZone);
12
- static ɵfac: i0.ɵɵFactoryDeclaration<Focusable, never>;
13
- static ɵdir: i0.ɵɵDirectiveDeclaration<Focusable, never, never, {}, {}, never, never, true, never>;
5
+ readonly focusable: import("@angular/core").InputSignal<number | boolean>;
6
+ readonly tabindex: import("@angular/core").Signal<number>;
7
+ constructor(tabindex?: string | number);
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<Focusable, [{ attribute: "tabindex"; }]>;
9
+ static ɵdir: i0.ɵɵDirectiveDeclaration<Focusable, "[nuFocusable]", ["nuFocusable"], { "focusable": { "alias": "nuFocusable"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.FocusState; inputs: {}; outputs: {}; }]>;
14
10
  }
package/focus/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from "./focus.service";
2
2
  export * from "./focus-trap.directive";
3
3
  export * from "./focusable.directive";
4
+ export * from "./focus-state.directive";
package/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export { ActivityEvent, ActivityOrigin, ActivityService } from "./activity";
2
- export { FocusOrigin, FocusService, FocusTrap, Focusable, FocusableEvent, FocusChanges } from "./focus";
2
+ export { FocusOrigin, FocusService, FocusTrap, Focusable, FocusState, FocusableEvent, FocusChanges } from "./focus";
3
+ export { Keystroke, KeystrokeEvent, KeystrokeService } from "./keystroke";
@@ -0,0 +1 @@
1
+ export * from "./keystroke.service";
@@ -0,0 +1,21 @@
1
+ import { Observable } from "rxjs";
2
+ import { ElementInput } from "@ngutil/common";
3
+ import * as i0 from "@angular/core";
4
+ export interface Keystroke {
5
+ key: KeyboardEvent["key"];
6
+ shift?: boolean;
7
+ ctrl?: boolean;
8
+ alt?: boolean;
9
+ state: "down" | "up";
10
+ }
11
+ export interface KeystrokeEvent {
12
+ original: KeyboardEvent;
13
+ keystroke: Keystroke;
14
+ }
15
+ export declare class KeystrokeService {
16
+ #private;
17
+ constructor();
18
+ watch(target: ElementInput, keystroke: Keystroke): Observable<KeystrokeEvent>;
19
+ static ɵfac: i0.ɵɵFactoryDeclaration<KeystrokeService, never>;
20
+ static ɵprov: i0.ɵɵInjectableDeclaration<KeystrokeService>;
21
+ }
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@ngutil/aria",
3
- "version": "0.0.21",
3
+ "version": "0.0.26",
4
4
  "peerDependencies": {
5
+ "@angular/cdk": "^17.3.6",
5
6
  "@angular/common": "^17.3.6",
6
7
  "@angular/core": "^17.3.6",
7
8
  "rxjs": "^7.8.1",
8
9
  "tabbable": "^6.2.0",
9
- "@ngutil/common": "0.0.21"
10
+ "@ngutil/common": "0.0.26"
10
11
  },
11
12
  "publishConfig": {
12
13
  "access": "public",