@ngutil/aria 0.0.3-dev.6 → 0.0.3-dev.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/activity/activity.service.d.ts +18 -0
- package/activity/index.d.ts +1 -0
- package/esm2022/activity/activity.service.mjs +73 -0
- package/esm2022/activity/index.mjs +2 -0
- package/esm2022/focus/focus.service.mjs +99 -0
- package/esm2022/focus/index.mjs +2 -0
- package/esm2022/index.mjs +3 -2
- package/fesm2022/ngutil-aria.mjs +164 -10
- package/fesm2022/ngutil-aria.mjs.map +1 -1
- package/focus/focus.service.d.ts +28 -0
- package/focus/index.d.ts +1 -0
- package/index.d.ts +2 -1
- package/package.json +4 -2
- package/esm2022/lib/aria/aria.component.mjs +0 -12
- package/lib/aria/aria.component.d.ts +0 -5
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { NgZone } from "@angular/core";
|
|
2
|
+
import { Observable } from "rxjs";
|
|
3
|
+
import { Destructible } from "@ngutil/common";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export type ActivityOrigin = "mouse" | "keyboard" | "touch" | "program";
|
|
6
|
+
export interface ActivityEvent {
|
|
7
|
+
origin: ActivityOrigin;
|
|
8
|
+
node?: Node;
|
|
9
|
+
}
|
|
10
|
+
export declare class ActivityService extends Destructible {
|
|
11
|
+
#private;
|
|
12
|
+
readonly events: Observable<ActivityEvent>;
|
|
13
|
+
constructor(document: Document, zone: NgZone);
|
|
14
|
+
watchActivity(node?: HTMLElement): Observable<ActivityEvent>;
|
|
15
|
+
watchInactvity(timeout: number): void;
|
|
16
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ActivityService, never>;
|
|
17
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<ActivityService>;
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./activity.service";
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { DOCUMENT } from "@angular/common";
|
|
2
|
+
import { Inject, Injectable, NgZone } from "@angular/core";
|
|
3
|
+
import { distinctUntilChanged, filter, shareReplay, Subject } from "rxjs";
|
|
4
|
+
import { Destructible } from "@ngutil/common";
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
const EVENT_OPTIONS = {
|
|
7
|
+
capture: true,
|
|
8
|
+
passive: true
|
|
9
|
+
};
|
|
10
|
+
export class ActivityService extends Destructible {
|
|
11
|
+
#activity;
|
|
12
|
+
constructor(document, zone) {
|
|
13
|
+
super();
|
|
14
|
+
zone.runOutsideAngular(() => {
|
|
15
|
+
this.#activity = new Subject();
|
|
16
|
+
this.events = this.#activity.pipe(distinctUntilChanged((prev, curr) => {
|
|
17
|
+
if (prev && curr) {
|
|
18
|
+
return prev.origin === curr.origin && prev.node === curr.node;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}), shareReplay(1));
|
|
24
|
+
document.addEventListener("keydown", this.#onKeydown, EVENT_OPTIONS);
|
|
25
|
+
document.addEventListener("mousedown", this.#onMouseDown, EVENT_OPTIONS);
|
|
26
|
+
document.addEventListener("mousemove", this.#onMouseMove, EVENT_OPTIONS);
|
|
27
|
+
document.addEventListener("touchstart", this.#onTouchStart, EVENT_OPTIONS);
|
|
28
|
+
this.d.any(() => {
|
|
29
|
+
document.removeEventListener("keydown", this.#onKeydown, EVENT_OPTIONS);
|
|
30
|
+
document.removeEventListener("mousedown", this.#onMouseDown, EVENT_OPTIONS);
|
|
31
|
+
document.removeEventListener("mousemove", this.#onMouseMove, EVENT_OPTIONS);
|
|
32
|
+
document.removeEventListener("touchstart", this.#onTouchStart, EVENT_OPTIONS);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
watchActivity(node) {
|
|
37
|
+
if (node) {
|
|
38
|
+
return this.events.pipe(filter(event => event.node != null &&
|
|
39
|
+
(event.node === node || (event.node instanceof HTMLElement && event.node.contains(node)))), shareReplay(1));
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
return this.events;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
watchInactvity(timeout) {
|
|
46
|
+
throw Error("Not implemnted yet");
|
|
47
|
+
}
|
|
48
|
+
#onKeydown = (event) => {
|
|
49
|
+
this.#activity.next({ origin: "keyboard", node: event.target });
|
|
50
|
+
};
|
|
51
|
+
#onMouseDown = (event) => {
|
|
52
|
+
this.#activity.next({ origin: "mouse", node: event.target });
|
|
53
|
+
};
|
|
54
|
+
#onMouseMove = (event) => {
|
|
55
|
+
// this.#activity.next({ origin: "mouse" })
|
|
56
|
+
};
|
|
57
|
+
#onTouchStart = (event) => {
|
|
58
|
+
this.#activity.next({ origin: "touch", node: event.target });
|
|
59
|
+
};
|
|
60
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ActivityService, deps: [{ token: DOCUMENT }, { token: NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
61
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ActivityService, providedIn: "root" }); }
|
|
62
|
+
}
|
|
63
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ActivityService, decorators: [{
|
|
64
|
+
type: Injectable,
|
|
65
|
+
args: [{ providedIn: "root" }]
|
|
66
|
+
}], ctorParameters: () => [{ type: Document, decorators: [{
|
|
67
|
+
type: Inject,
|
|
68
|
+
args: [DOCUMENT]
|
|
69
|
+
}] }, { type: i0.NgZone, decorators: [{
|
|
70
|
+
type: Inject,
|
|
71
|
+
args: [NgZone]
|
|
72
|
+
}] }] });
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZpdHkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FyaWEvc3JjL2FjdGl2aXR5L2FjdGl2aXR5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUUxRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFjLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFFckYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFBOztBQVU3QyxNQUFNLGFBQWEsR0FBNEI7SUFDM0MsT0FBTyxFQUFFLElBQUk7SUFDYixPQUFPLEVBQUUsSUFBSTtDQUNoQixDQUFBO0FBR0QsTUFBTSxPQUFPLGVBQWdCLFNBQVEsWUFBWTtJQUM3QyxTQUFTLENBQXlCO0lBSWxDLFlBQThCLFFBQWtCLEVBQWtCLElBQVk7UUFDMUUsS0FBSyxFQUFFLENBQUE7UUFFUCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FDN0I7WUFBQyxJQUE4QyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDekUsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFXLEVBQUU7Z0JBQ3pDLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNmLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQTtnQkFDakUsQ0FBQztxQkFBTSxDQUFDO29CQUNKLE9BQU8sS0FBSyxD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QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBTWpCLE1BQU07MkJBQUMsUUFBUTs7MEJBQXVCLE1BQU07MkJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCJcblxuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgT2JzZXJ2YWJsZSwgc2hhcmVSZXBsYXksIFN1YmplY3QgfSBmcm9tIFwicnhqc1wiXG5cbmltcG9ydCB7IERlc3RydWN0aWJsZSB9IGZyb20gXCJAbmd1dGlsL2NvbW1vblwiXG5cbi8vIFRPRE86IGRldGVjdCBwcm9ncmFtIGFjdGl2aXR5XG5leHBvcnQgdHlwZSBBY3Rpdml0eU9yaWdpbiA9IFwibW91c2VcIiB8IFwia2V5Ym9hcmRcIiB8IFwidG91Y2hcIiB8IFwicHJvZ3JhbVwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlFdmVudCB7XG4gICAgb3JpZ2luOiBBY3Rpdml0eU9yaWdpblxuICAgIG5vZGU/OiBOb2RlXG59XG5cbmNvbnN0IEVWRU5UX09QVElPTlM6IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zID0ge1xuICAgIGNhcHR1cmU6IHRydWUsXG4gICAgcGFzc2l2ZTogdHJ1ZVxufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXG5leHBvcnQgY2xhc3MgQWN0aXZpdHlTZXJ2aWNlIGV4dGVuZHMgRGVzdHJ1Y3RpYmxlIHtcbiAgICAjYWN0aXZpdHkhOiBTdWJqZWN0PEFjdGl2aXR5RXZlbnQ+XG5cbiAgICByZWFkb25seSBldmVudHMhOiBPYnNlcnZhYmxlPEFjdGl2aXR5RXZlbnQ+XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KERPQ1VNRU5UKSBkb2N1bWVudDogRG9jdW1lbnQsIEBJbmplY3QoTmdab25lKSB6b25lOiBOZ1pvbmUpIHtcbiAgICAgICAgc3VwZXIoKVxuXG4gICAgICAgIHpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jYWN0aXZpdHkgPSBuZXcgU3ViamVjdCgpXG4gICAgICAgICAgICA7KHRoaXMgYXMgeyBldmVudHM6IE9ic2VydmFibGU8QWN0aXZpdHlFdmVudD4gfSkuZXZlbnRzID0gdGhpcy4jYWN0aXZpdHkucGlwZShcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJldiwgY3Vycik6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldiAmJiBjdXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldi5vcmlnaW4gPT09IGN1cnIub3JpZ2luICYmIHByZXYubm9kZSA9PT0gY3Vyci5ub2RlXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI29uS2V5ZG93biwgRVZFTlRfT1BUSU9OUylcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgdGhpcy4jb25Nb3VzZURvd24sIEVWRU5UX09QVElPTlMpXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMuI29uTW91c2VNb3ZlLCBFVkVOVF9PUFRJT05TKVxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgdGhpcy4jb25Ub3VjaFN0YXJ0LCBFVkVOVF9PUFRJT05TKVxuXG4gICAgICAgICAgICB0aGlzLmQuYW55KCgpID0+IHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNvbktleWRvd24sIEVWRU5UX09QVElPTlMpXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCB0aGlzLiNvbk1vdXNlRG93biwgRVZFTlRfT1BUSU9OUylcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMuI29uTW91c2VNb3ZlLCBFVkVOVF9PUFRJT05TKVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIHRoaXMuI29uVG91Y2hTdGFydCwgRVZFTlRfT1BUSU9OUylcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgd2F0Y2hBY3Rpdml0eShub2RlPzogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV2ZW50cy5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Lm5vZGUgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGV2ZW50Lm5vZGUgPT09IG5vZGUgfHwgKGV2ZW50Lm5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBldmVudC5ub2RlLmNvbnRhaW5zKG5vZGUpKSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ldmVudHNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHdhdGNoSW5hY3R2aXR5KHRpbWVvdXQ6IG51bWJlcikge1xuICAgICAgICB0aHJvdyBFcnJvcihcIk5vdCBpbXBsZW1udGVkIHlldFwiKVxuICAgIH1cblxuICAgICNvbktleWRvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy4jYWN0aXZpdHkubmV4dCh7IG9yaWdpbjogXCJrZXlib2FyZFwiLCBub2RlOiBldmVudC50YXJnZXQgYXMgYW55IH0pXG4gICAgfVxuXG4gICAgI29uTW91c2VEb3duID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuI2FjdGl2aXR5Lm5leHQoeyBvcmlnaW46IFwibW91c2VcIiwgbm9kZTogZXZlbnQudGFyZ2V0IGFzIGFueSB9KVxuICAgIH1cblxuICAgICNvbk1vdXNlTW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAvLyB0aGlzLiNhY3Rpdml0eS5uZXh0KHsgb3JpZ2luOiBcIm1vdXNlXCIgfSlcbiAgICB9XG5cbiAgICAjb25Ub3VjaFN0YXJ0ID0gKGV2ZW50OiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuI2FjdGl2aXR5Lm5leHQoeyBvcmlnaW46IFwidG91Y2hcIiwgbm9kZTogZXZlbnQudGFyZ2V0IGFzIGFueSB9KVxuICAgIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from "./activity.service";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9hY3Rpdml0eS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG9CQUFvQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vYWN0aXZpdHkuc2VydmljZVwiXG4iXX0=
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { DOCUMENT } from "@angular/common";
|
|
2
|
+
import { inject, Inject, Injectable, NgZone } from "@angular/core";
|
|
3
|
+
import { combineLatest, filter, map, merge, shareReplay, startWith, Subject } from "rxjs";
|
|
4
|
+
import { focusable, isFocusable } from "tabbable";
|
|
5
|
+
import { Destructible } from "@ngutil/common";
|
|
6
|
+
import { ActivityService } from "../activity";
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
const EVENT_OPTIONS = {
|
|
9
|
+
capture: true,
|
|
10
|
+
passive: true
|
|
11
|
+
};
|
|
12
|
+
export class FocusService extends Destructible {
|
|
13
|
+
#activity = inject(ActivityService);
|
|
14
|
+
#focus = new Subject();
|
|
15
|
+
#blur = new Subject();
|
|
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({
|
|
22
|
+
activity: this.#activity.events,
|
|
23
|
+
focus: focus,
|
|
24
|
+
blur: blur
|
|
25
|
+
}).pipe(map(({ activity, focus, blur }) => {
|
|
26
|
+
// console.log({ activity, focus, blur })
|
|
27
|
+
// If focus in with alt+tab
|
|
28
|
+
if (blur === document && activity.origin === "keyboard") {
|
|
29
|
+
return { origin: "program", element: focus };
|
|
30
|
+
}
|
|
31
|
+
if (focus === document) {
|
|
32
|
+
return { origin: "program", element: focus };
|
|
33
|
+
}
|
|
34
|
+
// If press tab button, first fire the event in the currently focused element
|
|
35
|
+
if (focus === blur) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
// When press tab, the activity is on the current fucesd element,
|
|
39
|
+
// so when blur is changed to it, the focus change is completed
|
|
40
|
+
if (activity.origin === "keyboard" && isActivityElement(activity.node, blur)) {
|
|
41
|
+
return { origin: "keyboard", element: focus };
|
|
42
|
+
}
|
|
43
|
+
if (isActivityElement(activity.node, focus)) {
|
|
44
|
+
return { origin: activity.origin, element: focus };
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
return { origin: "program", element: focus };
|
|
48
|
+
}
|
|
49
|
+
}), 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
|
+
});
|
|
60
|
+
}
|
|
61
|
+
#onFocus = (event) => {
|
|
62
|
+
this.#focus.next(event.target);
|
|
63
|
+
};
|
|
64
|
+
#onBlur = (event) => {
|
|
65
|
+
this.#blur.next(event.target);
|
|
66
|
+
};
|
|
67
|
+
watch(node) {
|
|
68
|
+
return this.events.pipe(filter(event => event.element && (event.element === node || node.contains(event.element))), shareReplay(1));
|
|
69
|
+
}
|
|
70
|
+
focus(node, origon) {
|
|
71
|
+
// TODO: focus origin
|
|
72
|
+
node.focus();
|
|
73
|
+
}
|
|
74
|
+
queryFocusable(inside) {
|
|
75
|
+
return focusable(inside, { includeContainer: false });
|
|
76
|
+
}
|
|
77
|
+
getFirstFocusable(inside) {
|
|
78
|
+
return this.queryFocusable(inside)[0];
|
|
79
|
+
}
|
|
80
|
+
isFocusable(node) {
|
|
81
|
+
return isFocusable(node);
|
|
82
|
+
}
|
|
83
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: FocusService, deps: [{ token: DOCUMENT }, { token: NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
84
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: FocusService, providedIn: "root" }); }
|
|
85
|
+
}
|
|
86
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: FocusService, decorators: [{
|
|
87
|
+
type: Injectable,
|
|
88
|
+
args: [{ providedIn: "root" }]
|
|
89
|
+
}], ctorParameters: () => [{ type: Document, decorators: [{
|
|
90
|
+
type: Inject,
|
|
91
|
+
args: [DOCUMENT]
|
|
92
|
+
}] }, { type: i0.NgZone, decorators: [{
|
|
93
|
+
type: Inject,
|
|
94
|
+
args: [NgZone]
|
|
95
|
+
}] }] });
|
|
96
|
+
function isActivityElement(activityEl, focused) {
|
|
97
|
+
return activityEl != null && focused != null && (activityEl === focused || focused.contains(activityEl));
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FyaWEvc3JjL2ZvY3VzL2ZvY3VzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBYyxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUVyRyxPQUFPLEVBQUUsU0FBUyxFQUF5QixXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFFeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRTdDLE9BQU8sRUFBa0IsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFBOztBQUU3RCxNQUFNLGFBQWEsR0FBNEI7SUFDM0MsT0FBTyxFQUFFLElBQUk7SUFDYixPQUFPLEVBQUUsSUFBSTtDQUNoQixDQUFBO0FBaUJELE1BQU0sT0FBTyxZQUFhLFNBQVEsWUFBWTtJQUMxQyxTQUFTLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQ25DLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFBO0lBQzVCLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFBO0lBRzNCLFlBQThCLFFBQWtCLEVBQWtCLElBQVk7UUFDMUUsS0FBSyxFQUFFLENBQUE7UUFFUCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFD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QUFVLEVBQUUsTUFBTSxFQUFFOzswQkFPakIsTUFBTTsyQkFBQyxRQUFROzswQkFBdUIsTUFBTTsyQkFBQyxNQUFNOztBQWlHcEUsU0FBUyxpQkFBaUIsQ0FBQyxVQUF3QixFQUFFLE9BQXFCO0lBQ3RFLE9BQU8sVUFBVSxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7QUFDNUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiXG5pbXBvcnQgeyBpbmplY3QsIEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuXG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBmaWx0ZXIsIG1hcCwgbWVyZ2UsIE9ic2VydmFibGUsIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIFN1YmplY3QgfSBmcm9tIFwicnhqc1wiXG5cbmltcG9ydCB7IGZvY3VzYWJsZSwgdHlwZSBGb2N1c2FibGVFbGVtZW50LCBpc0ZvY3VzYWJsZSB9IGZyb20gXCJ0YWJiYWJsZVwiXG5cbmltcG9ydCB7IERlc3RydWN0aWJsZSB9IGZyb20gXCJAbmd1dGlsL2NvbW1vblwiXG5cbmltcG9ydCB7IEFjdGl2aXR5T3JpZ2luLCBBY3Rpdml0eVNlcnZpY2UgfSBmcm9tIFwiLi4vYWN0aXZpdHlcIlxuXG5jb25zdCBFVkVOVF9PUFRJT05TOiBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyA9IHtcbiAgICBjYXB0dXJlOiB0cnVlLFxuICAgIHBhc3NpdmU6IHRydWVcbn1cblxuZXhwb3J0IHR5cGUgRm9jdXNPcmlnaW4gPSBBY3Rpdml0eU9yaWdpbiB8IG51bGxcbi8vIGV4cG9ydCB0eXBlIEZvY3VzVGFyZ2V0ID0gbnVsbCB8IFwic2VsZlwiIHwgXCJjaGlsZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9jdXNDaGFuZ2VzIHtcbiAgICBvcmlnaW46IEZvY3VzT3JpZ2luXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb2N1c2FibGVFdmVudCB7XG4gICAgb3JpZ2luOiBGb2N1c09yaWdpblxuICAgIGV4YWN0OiBib29sZWFuXG4gICAgbm9kZTogTm9kZVxufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXG5leHBvcnQgY2xhc3MgRm9jdXNTZXJ2aWNlIGV4dGVuZHMgRGVzdHJ1Y3RpYmxlIHtcbiAgICAjYWN0aXZpdHkgPSBpbmplY3QoQWN0aXZpdHlTZXJ2aWNlKVxuICAgICNmb2N1cyA9IG5ldyBTdWJqZWN0PE5vZGU+KClcbiAgICAjYmx1ciA9IG5ldyBTdWJqZWN0PE5vZGU+KClcbiAgICBldmVudHMhOiBPYnNlcnZhYmxlPEZvY3VzQ2hhbmdlcz5cblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoRE9DVU1FTlQpIGRvY3VtZW50OiBEb2N1bWVudCwgQEluamVjdChOZ1pvbmUpIHpvbmU6IE5nWm9uZSkge1xuICAgICAgICBzdXBlcigpXG5cbiAgICAgICAgem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibHVyID0gdGhpcy4jYmx1ci5waXBlKHN0YXJ0V2l0aChudWxsKSwgc2hhcmVSZXBsYXkoMSkpXG4gICAgICAgICAgICBjb25zdCBmb2N1cyA9IHRoaXMuI2ZvY3VzLnBpcGUoc2hhcmVSZXBsYXkoMSkpXG5cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IGNvbWJpbmVMYXRlc3Qoe1xuICAgICAgICAgICAgICAgIGFjdGl2aXR5OiB0aGlzLiNhY3Rpdml0eS5ldmVudHMsXG4gICAgICAgICAgICAgICAgZm9jdXM6IGZvY3VzLFxuICAgICAgICAgICAgICAgIGJsdXI6IGJsdXJcbiAgICAgICAgICAgIH0pLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKCh7IGFjdGl2aXR5LCBmb2N1cywgYmx1ciB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHsgYWN0aXZpdHksIGZvY3VzLCBibHVyIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZm9jdXMgaW4gd2l0aCBhbHQrdGFiXG4gICAgICAgICAgICAgICAgICAgIGlmIChibHVyID09PSBkb2N1bWVudCAmJiBhY3Rpdml0eS5vcmlnaW4gPT09IFwia2V5Ym9hcmRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBcInByb2dyYW1cIiwgZWxlbWVudDogZm9jdXMgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzID09PSBkb2N1bWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBcInByb2dyYW1cIiwgZWxlbWVudDogZm9jdXMgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgcHJlc3MgdGFiIGJ1dHRvbiwgZmlyc3QgZmlyZSB0aGUgZXZlbnQgaW4gdGhlIGN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzID09PSBibHVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBwcmVzcyB0YWIsIHRoZSBhY3Rpdml0eSBpcyBvbiB0aGUgY3VycmVudCBmdWNlc2QgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgLy8gc28gd2hlbiBibHVyIGlzIGNoYW5nZWQgdG8gaXQsIHRoZSBmb2N1cyBjaGFuZ2UgaXMgY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpdml0eS5vcmlnaW4gPT09IFwia2V5Ym9hcmRcIiAmJiBpc0FjdGl2aXR5RWxlbWVudChhY3Rpdml0eS5ub2RlLCBibHVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBcImtleWJvYXJkXCIsIGVsZW1lbnQ6IGZvY3VzIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FjdGl2aXR5RWxlbWVudChhY3Rpdml0eS5ub2RlLCBmb2N1cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG9yaWdpbjogYWN0aXZpdHkub3JpZ2luLCBlbGVtZW50OiBmb2N1cyB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBvcmlnaW46IFwicHJvZ3JhbVwiLCBlbGVtZW50OiBmb2N1cyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIodiA9PiAhIXYpLFxuICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICAgICApIGFzIGFueVxuXG4gICAgICAgICAgICB0aGlzLmV2ZW50cyA9IG1lcmdlKFxuICAgICAgICAgICAgICAgIGJsdXIucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWFwKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBudWxsLCBlbGVtZW50IH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGV2ZW50c1xuICAgICAgICAgICAgKS5waXBlKHNoYXJlUmVwbGF5KDEpKSBhcyBhbnlcblxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHRoaXMuI29uRm9jdXMsIEVWRU5UX09QVElPTlMpXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCB0aGlzLiNvbkJsdXIsIEVWRU5UX09QVElPTlMpXG5cbiAgICAgICAgICAgIHRoaXMuZC5hbnkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLiNvbkZvY3VzLCBFVkVOVF9PUFRJT05TKVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuI29uQmx1ciwgRVZFTlRfT1BUSU9OUylcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgI29uRm9jdXMgPSAoZXZlbnQ6IEZvY3VzRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy4jZm9jdXMubmV4dChldmVudC50YXJnZXQgYXMgTm9kZSlcbiAgICB9XG5cbiAgICAjb25CbHVyID0gKGV2ZW50OiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuI2JsdXIubmV4dChldmVudC50YXJnZXQgYXMgTm9kZSlcbiAgICB9XG5cbiAgICB3YXRjaChub2RlOiBOb2RlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50cy5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50LmVsZW1lbnQgJiYgKGV2ZW50LmVsZW1lbnQgPT09IG5vZGUgfHwgbm9kZS5jb250YWlucyhldmVudC5lbGVtZW50KSkpLFxuICAgICAgICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICAgICAgKVxuICAgIH1cblxuICAgIGZvY3VzKG5vZGU6IEhUTUxFbGVtZW50LCBvcmlnb246IEZvY3VzT3JpZ2luIHwgbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBmb2N1cyBvcmlnaW5cbiAgICAgICAgbm9kZS5mb2N1cygpXG4gICAgfVxuXG4gICAgcXVlcnlGb2N1c2FibGUoaW5zaWRlOiBIVE1MRWxlbWVudCk6IEZvY3VzYWJsZUVsZW1lbnRbXSB7XG4gICAgICAgIHJldHVybiBmb2N1c2FibGUoaW5zaWRlLCB7IGluY2x1ZGVDb250YWluZXI6IGZhbHNlIH0pXG4gICAgfVxuXG4gICAgZ2V0Rmlyc3RGb2N1c2FibGUoaW5zaWRlOiBIVE1MRWxlbWVudCk6IEZvY3VzYWJsZUVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVyeUZvY3VzYWJsZShpbnNpZGUpWzBdXG4gICAgfVxuXG4gICAgaXNGb2N1c2FibGUobm9kZTogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNGb2N1c2FibGUobm9kZSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzQWN0aXZpdHlFbGVtZW50KGFjdGl2aXR5RWw/OiBOb2RlIHwgbnVsbCwgZm9jdXNlZD86IE5vZGUgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGFjdGl2aXR5RWwgIT0gbnVsbCAmJiBmb2N1c2VkICE9IG51bGwgJiYgKGFjdGl2aXR5RWwgPT09IGZvY3VzZWQgfHwgZm9jdXNlZC5jb250YWlucyhhY3Rpdml0eUVsKSlcbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from "./focus.service";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9mb2N1cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGlCQUFpQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vZm9jdXMuc2VydmljZVwiXG4iXX0=
|
package/esm2022/index.mjs
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export * from "./
|
|
2
|
-
|
|
1
|
+
export * from "./activity";
|
|
2
|
+
export * from "./focus";
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFlBQVksQ0FBQTtBQUMxQixjQUFjLFNBQVMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2FjdGl2aXR5XCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZvY3VzXCJcbiJdfQ==
|
package/fesm2022/ngutil-aria.mjs
CHANGED
|
@@ -1,19 +1,173 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DOCUMENT } from '@angular/common';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import {
|
|
3
|
+
import { NgZone, Injectable, Inject, inject } from '@angular/core';
|
|
4
|
+
import { Subject, distinctUntilChanged, shareReplay, filter, startWith, combineLatest, map, merge } from 'rxjs';
|
|
5
|
+
import { Destructible } from '@ngutil/common';
|
|
6
|
+
import { focusable, isFocusable } from 'tabbable';
|
|
4
7
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
+
const EVENT_OPTIONS$1 = {
|
|
9
|
+
capture: true,
|
|
10
|
+
passive: true
|
|
11
|
+
};
|
|
12
|
+
class ActivityService extends Destructible {
|
|
13
|
+
#activity;
|
|
14
|
+
constructor(document, zone) {
|
|
15
|
+
super();
|
|
16
|
+
zone.runOutsideAngular(() => {
|
|
17
|
+
this.#activity = new Subject();
|
|
18
|
+
this.events = this.#activity.pipe(distinctUntilChanged((prev, curr) => {
|
|
19
|
+
if (prev && curr) {
|
|
20
|
+
return prev.origin === curr.origin && prev.node === curr.node;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}), shareReplay(1));
|
|
26
|
+
document.addEventListener("keydown", this.#onKeydown, EVENT_OPTIONS$1);
|
|
27
|
+
document.addEventListener("mousedown", this.#onMouseDown, EVENT_OPTIONS$1);
|
|
28
|
+
document.addEventListener("mousemove", this.#onMouseMove, EVENT_OPTIONS$1);
|
|
29
|
+
document.addEventListener("touchstart", this.#onTouchStart, EVENT_OPTIONS$1);
|
|
30
|
+
this.d.any(() => {
|
|
31
|
+
document.removeEventListener("keydown", this.#onKeydown, EVENT_OPTIONS$1);
|
|
32
|
+
document.removeEventListener("mousedown", this.#onMouseDown, EVENT_OPTIONS$1);
|
|
33
|
+
document.removeEventListener("mousemove", this.#onMouseMove, EVENT_OPTIONS$1);
|
|
34
|
+
document.removeEventListener("touchstart", this.#onTouchStart, EVENT_OPTIONS$1);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
watchActivity(node) {
|
|
39
|
+
if (node) {
|
|
40
|
+
return this.events.pipe(filter(event => event.node != null &&
|
|
41
|
+
(event.node === node || (event.node instanceof HTMLElement && event.node.contains(node)))), shareReplay(1));
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
return this.events;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
watchInactvity(timeout) {
|
|
48
|
+
throw Error("Not implemnted yet");
|
|
49
|
+
}
|
|
50
|
+
#onKeydown = (event) => {
|
|
51
|
+
this.#activity.next({ origin: "keyboard", node: event.target });
|
|
52
|
+
};
|
|
53
|
+
#onMouseDown = (event) => {
|
|
54
|
+
this.#activity.next({ origin: "mouse", node: event.target });
|
|
55
|
+
};
|
|
56
|
+
#onMouseMove = (event) => {
|
|
57
|
+
// this.#activity.next({ origin: "mouse" })
|
|
58
|
+
};
|
|
59
|
+
#onTouchStart = (event) => {
|
|
60
|
+
this.#activity.next({ origin: "touch", node: event.target });
|
|
61
|
+
};
|
|
62
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ActivityService, deps: [{ token: DOCUMENT }, { token: NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
63
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ActivityService, providedIn: "root" }); }
|
|
64
|
+
}
|
|
65
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ActivityService, decorators: [{
|
|
66
|
+
type: Injectable,
|
|
67
|
+
args: [{ providedIn: "root" }]
|
|
68
|
+
}], ctorParameters: () => [{ type: Document, decorators: [{
|
|
69
|
+
type: Inject,
|
|
70
|
+
args: [DOCUMENT]
|
|
71
|
+
}] }, { type: i0.NgZone, decorators: [{
|
|
72
|
+
type: Inject,
|
|
73
|
+
args: [NgZone]
|
|
74
|
+
}] }] });
|
|
75
|
+
|
|
76
|
+
const EVENT_OPTIONS = {
|
|
77
|
+
capture: true,
|
|
78
|
+
passive: true
|
|
79
|
+
};
|
|
80
|
+
class FocusService extends Destructible {
|
|
81
|
+
#activity = inject(ActivityService);
|
|
82
|
+
#focus = new Subject();
|
|
83
|
+
#blur = new Subject();
|
|
84
|
+
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({
|
|
90
|
+
activity: this.#activity.events,
|
|
91
|
+
focus: focus,
|
|
92
|
+
blur: blur
|
|
93
|
+
}).pipe(map(({ activity, focus, blur }) => {
|
|
94
|
+
// console.log({ activity, focus, blur })
|
|
95
|
+
// If focus in with alt+tab
|
|
96
|
+
if (blur === document && activity.origin === "keyboard") {
|
|
97
|
+
return { origin: "program", element: focus };
|
|
98
|
+
}
|
|
99
|
+
if (focus === document) {
|
|
100
|
+
return { origin: "program", element: focus };
|
|
101
|
+
}
|
|
102
|
+
// If press tab button, first fire the event in the currently focused element
|
|
103
|
+
if (focus === blur) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
// When press tab, the activity is on the current fucesd element,
|
|
107
|
+
// so when blur is changed to it, the focus change is completed
|
|
108
|
+
if (activity.origin === "keyboard" && isActivityElement(activity.node, blur)) {
|
|
109
|
+
return { origin: "keyboard", element: focus };
|
|
110
|
+
}
|
|
111
|
+
if (isActivityElement(activity.node, focus)) {
|
|
112
|
+
return { origin: activity.origin, element: focus };
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
return { origin: "program", element: focus };
|
|
116
|
+
}
|
|
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
|
+
});
|
|
128
|
+
}
|
|
129
|
+
#onFocus = (event) => {
|
|
130
|
+
this.#focus.next(event.target);
|
|
131
|
+
};
|
|
132
|
+
#onBlur = (event) => {
|
|
133
|
+
this.#blur.next(event.target);
|
|
134
|
+
};
|
|
135
|
+
watch(node) {
|
|
136
|
+
return this.events.pipe(filter(event => event.element && (event.element === node || node.contains(event.element))), shareReplay(1));
|
|
137
|
+
}
|
|
138
|
+
focus(node, origon) {
|
|
139
|
+
// TODO: focus origin
|
|
140
|
+
node.focus();
|
|
141
|
+
}
|
|
142
|
+
queryFocusable(inside) {
|
|
143
|
+
return focusable(inside, { includeContainer: false });
|
|
144
|
+
}
|
|
145
|
+
getFirstFocusable(inside) {
|
|
146
|
+
return this.queryFocusable(inside)[0];
|
|
147
|
+
}
|
|
148
|
+
isFocusable(node) {
|
|
149
|
+
return isFocusable(node);
|
|
150
|
+
}
|
|
151
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: FocusService, deps: [{ token: DOCUMENT }, { token: NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
152
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: FocusService, providedIn: "root" }); }
|
|
153
|
+
}
|
|
154
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: FocusService, decorators: [{
|
|
155
|
+
type: Injectable,
|
|
156
|
+
args: [{ providedIn: "root" }]
|
|
157
|
+
}], ctorParameters: () => [{ type: Document, decorators: [{
|
|
158
|
+
type: Inject,
|
|
159
|
+
args: [DOCUMENT]
|
|
160
|
+
}] }, { type: i0.NgZone, decorators: [{
|
|
161
|
+
type: Inject,
|
|
162
|
+
args: [NgZone]
|
|
163
|
+
}] }] });
|
|
164
|
+
function isActivityElement(activityEl, focused) {
|
|
165
|
+
return activityEl != null && focused != null && (activityEl === focused || focused.contains(activityEl));
|
|
8
166
|
}
|
|
9
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: AriaComponent, decorators: [{
|
|
10
|
-
type: Component,
|
|
11
|
-
args: [{ selector: "nu-aria", standalone: true, imports: [CommonModule], template: `<p>aria works!</p>` }]
|
|
12
|
-
}] });
|
|
13
167
|
|
|
14
168
|
/**
|
|
15
169
|
* Generated bundle index. Do not edit.
|
|
16
170
|
*/
|
|
17
171
|
|
|
18
|
-
export {
|
|
172
|
+
export { ActivityService, FocusService };
|
|
19
173
|
//# sourceMappingURL=ngutil-aria.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngutil-aria.mjs","sources":["../../../../packages/aria/src/lib/aria/aria.component.ts","../../../../packages/aria/src/ngutil-aria.ts"],"sourcesContent":["import { CommonModule } from \"@angular/common\"\nimport { Component } from \"@angular/core\"\n\n@Component({\n selector: \"nu-aria\",\n standalone: true,\n imports: [CommonModule],\n template: `<p>aria works!</p>`,\n styleUrl: \"./aria.component.scss\"\n})\nexport class AriaComponent {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAUa,aAAa,CAAA;8GAAb,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAHZ,CAAoB,kBAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EADpB,YAAY,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FAIb,aAAa,EAAA,UAAA,EAAA,CAAA;kBAPzB,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAS,cACP,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,YACb,CAAoB,kBAAA,CAAA,EAAA,CAAA;;;ACPlC;;AAEG;;;;"}
|
|
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/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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["EVENT_OPTIONS"],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { NgZone } from "@angular/core";
|
|
2
|
+
import { Observable } from "rxjs";
|
|
3
|
+
import { type FocusableElement } from "tabbable";
|
|
4
|
+
import { Destructible } from "@ngutil/common";
|
|
5
|
+
import { ActivityOrigin } from "../activity";
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export type FocusOrigin = ActivityOrigin | null;
|
|
8
|
+
export interface FocusChanges {
|
|
9
|
+
origin: FocusOrigin;
|
|
10
|
+
element: HTMLElement;
|
|
11
|
+
}
|
|
12
|
+
export interface FocusableEvent {
|
|
13
|
+
origin: FocusOrigin;
|
|
14
|
+
exact: boolean;
|
|
15
|
+
node: Node;
|
|
16
|
+
}
|
|
17
|
+
export declare class FocusService extends Destructible {
|
|
18
|
+
#private;
|
|
19
|
+
events: Observable<FocusChanges>;
|
|
20
|
+
constructor(document: Document, zone: NgZone);
|
|
21
|
+
watch(node: Node): Observable<FocusChanges>;
|
|
22
|
+
focus(node: HTMLElement, origon: FocusOrigin | null): void;
|
|
23
|
+
queryFocusable(inside: HTMLElement): FocusableElement[];
|
|
24
|
+
getFirstFocusable(inside: HTMLElement): FocusableElement | undefined;
|
|
25
|
+
isFocusable(node: Element): boolean;
|
|
26
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FocusService, never>;
|
|
27
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<FocusService>;
|
|
28
|
+
}
|
package/focus/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./focus.service";
|
package/index.d.ts
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export * from "./
|
|
1
|
+
export * from "./activity";
|
|
2
|
+
export * from "./focus";
|
package/package.json
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ngutil/aria",
|
|
3
|
-
"version": "0.0.3-dev.
|
|
3
|
+
"version": "0.0.3-dev.8",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"directory": "../../dist/packages/aria/"
|
|
7
7
|
},
|
|
8
8
|
"peerDependencies": {
|
|
9
9
|
"@angular/common": "^17.1.0",
|
|
10
|
-
"@angular/core": "^17.1.0"
|
|
10
|
+
"@angular/core": "^17.1.0",
|
|
11
|
+
"tabbable": "^6.2.0",
|
|
12
|
+
"@ngutil/common": "0.0.3-dev.8"
|
|
11
13
|
},
|
|
12
14
|
"dependencies": {
|
|
13
15
|
"tslib": "^2.3.0"
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from "@angular/common";
|
|
2
|
-
import { Component } from "@angular/core";
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export class AriaComponent {
|
|
5
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: AriaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: AriaComponent, isStandalone: true, selector: "nu-aria", ngImport: i0, template: `<p>aria works!</p>`, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
|
|
7
|
-
}
|
|
8
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: AriaComponent, decorators: [{
|
|
9
|
-
type: Component,
|
|
10
|
-
args: [{ selector: "nu-aria", standalone: true, imports: [CommonModule], template: `<p>aria works!</p>` }]
|
|
11
|
-
}] });
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJpYS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9saWIvYXJpYS9hcmlhLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDOUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQTs7QUFTekMsTUFBTSxPQUFPLGFBQWE7OEdBQWIsYUFBYTtrR0FBYixhQUFhLG1FQUhaLG9CQUFvQix5RUFEcEIsWUFBWTs7MkZBSWIsYUFBYTtrQkFQekIsU0FBUzsrQkFDSSxTQUFTLGNBQ1AsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLFlBQ2Isb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiXG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcIm51LWFyaWFcIixcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIHRlbXBsYXRlOiBgPHA+YXJpYSB3b3JrcyE8L3A+YCxcbiAgICBzdHlsZVVybDogXCIuL2FyaWEuY29tcG9uZW50LnNjc3NcIlxufSlcbmV4cG9ydCBjbGFzcyBBcmlhQ29tcG9uZW50IHt9XG4iXX0=
|