@ngutil/aria 0.0.3-dev.9 → 0.0.4

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,25 @@
1
+ import { ElementRef, inject } from "@angular/core";
2
+ import { BehaviorSubject } from "rxjs";
3
+ import { Destructible } from "@ngutil/common";
4
+ import { FocusService } from "./focus.service";
5
+ // TODO: implement
6
+ export class FocusTrap extends Destructible {
7
+ #manager = inject(FocusService);
8
+ #el = inject((ElementRef));
9
+ get enabled() {
10
+ return this.#enabled.value;
11
+ }
12
+ set enabled(val) {
13
+ if (this.#enabled.value !== val) {
14
+ this.#enabled.next(val);
15
+ }
16
+ }
17
+ #enabled = new BehaviorSubject(true);
18
+ enable() {
19
+ this.enabled = true;
20
+ }
21
+ disable() {
22
+ this.enabled = false;
23
+ }
24
+ }
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXMtdHJhcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9mb2N1cy9mb2N1cy10cmFwLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUU3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFFOUMsa0JBQWtCO0FBQ2xCLE1BQU0sT0FBTyxTQUFVLFNBQVEsWUFBWTtJQUN2QyxRQUFRLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBQy9CLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQSxVQUF1QixDQUFBLENBQUMsQ0FBQTtJQUVyQyxJQUFJLE9BQU87UUFDUCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFBO0lBQzlCLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxHQUFZO1FBQ3BCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDM0IsQ0FBQztJQUNMLENBQUM7SUFDRCxRQUFRLEdBQUcsSUFBSSxlQUFlLENBQVUsSUFBSSxDQUFDLENBQUE7SUFFN0MsTUFBTTtRQUNGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO0lBQ3ZCLENBQUM7SUFFRCxPQUFPO1FBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7SUFDeEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiwgaW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tIFwicnhqc1wiXG5cbmltcG9ydCB7IERlc3RydWN0aWJsZSB9IGZyb20gXCJAbmd1dGlsL2NvbW1vblwiXG5cbmltcG9ydCB7IEZvY3VzU2VydmljZSB9IGZyb20gXCIuL2ZvY3VzLnNlcnZpY2VcIlxuXG4vLyBUT0RPOiBpbXBsZW1lbnRcbmV4cG9ydCBjbGFzcyBGb2N1c1RyYXAgZXh0ZW5kcyBEZXN0cnVjdGlibGUge1xuICAgICNtYW5hZ2VyID0gaW5qZWN0KEZvY3VzU2VydmljZSlcbiAgICAjZWwgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pXG5cbiAgICBnZXQgZW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2VuYWJsZWQudmFsdWVcbiAgICB9XG4gICAgc2V0IGVuYWJsZWQodmFsOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLiNlbmFibGVkLnZhbHVlICE9PSB2YWwpIHtcbiAgICAgICAgICAgIHRoaXMuI2VuYWJsZWQubmV4dCh2YWwpXG4gICAgICAgIH1cbiAgICB9XG4gICAgI2VuYWJsZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpXG5cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcbiAgICB9XG5cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxuICAgIH1cbn1cbiJdfQ==
@@ -67,7 +67,7 @@ export class FocusService extends Destructible {
67
67
  watch(node) {
68
68
  return this.events.pipe(filter(event => event.element && (event.element === node || node.contains(event.element))), shareReplay(1));
69
69
  }
70
- focus(node, origon) {
70
+ focus(node, _origon) {
71
71
  // TODO: focus origin
72
72
  node.focus();
73
73
  }
@@ -96,4 +96,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImpor
96
96
  function isActivityElement(activityEl, focused) {
97
97
  return activityEl != null && focused != null && (activityEl === focused || focused.contains(activityEl));
98
98
  }
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FyaWEvc3JjL2ZvY3VzL2ZvY3VzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBYyxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUVyRyxPQUFPLEVBQUUsU0FBUyxFQUF5QixXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFFeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRTdDLE9BQU8sRUFBa0IsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFBOztBQUU3RCxNQUFNLGFBQWEsR0FBNEI7SUFDM0MsT0FBTyxFQUFFLElBQUk7SUFDYixPQUFPLEVBQUUsSUFBSTtDQUNoQixDQUFBO0FBaUJELE1BQU0sT0FBTyxZQUFhLFNBQVEsWUFBWTtJQUMxQyxTQUFTLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQ25DLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFBO0lBQzVCLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFBO0lBRzNCLFlBQThCLFFBQWtCLEVBQWtCLElBQVk7UUFDMUUsS0FBSyxFQUFFLENBQUE7UUFFUCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFD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QUFVLEVBQUUsTUFBTSxFQUFFOzswQkFPakIsTUFBTTsyQkFBQyxRQUFROzswQkFBdUIsTUFBTTsyQkFBQyxNQUFNOztBQWlHcEUsU0FBUyxpQkFBaUIsQ0FBQyxVQUF3QixFQUFFLE9BQXFCO0lBQ3RFLE9BQU8sVUFBVSxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7QUFDNUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiXG5pbXBvcnQgeyBpbmplY3QsIEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuXG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBmaWx0ZXIsIG1hcCwgbWVyZ2UsIE9ic2VydmFibGUsIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIFN1YmplY3QgfSBmcm9tIFwicnhqc1wiXG5cbmltcG9ydCB7IGZvY3VzYWJsZSwgdHlwZSBGb2N1c2FibGVFbGVtZW50LCBpc0ZvY3VzYWJsZSB9IGZyb20gXCJ0YWJiYWJsZVwiXG5cbmltcG9ydCB7IERlc3RydWN0aWJsZSB9IGZyb20gXCJAbmd1dGlsL2NvbW1vblwiXG5cbmltcG9ydCB7IEFjdGl2aXR5T3JpZ2luLCBBY3Rpdml0eVNlcnZpY2UgfSBmcm9tIFwiLi4vYWN0aXZpdHlcIlxuXG5jb25zdCBFVkVOVF9PUFRJT05TOiBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyA9IHtcbiAgICBjYXB0dXJlOiB0cnVlLFxuICAgIHBhc3NpdmU6IHRydWVcbn1cblxuZXhwb3J0IHR5cGUgRm9jdXNPcmlnaW4gPSBBY3Rpdml0eU9yaWdpbiB8IG51bGxcbi8vIGV4cG9ydCB0eXBlIEZvY3VzVGFyZ2V0ID0gbnVsbCB8IFwic2VsZlwiIHwgXCJjaGlsZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9jdXNDaGFuZ2VzIHtcbiAgICBvcmlnaW46IEZvY3VzT3JpZ2luXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb2N1c2FibGVFdmVudCB7XG4gICAgb3JpZ2luOiBGb2N1c09yaWdpblxuICAgIGV4YWN0OiBib29sZWFuXG4gICAgbm9kZTogTm9kZVxufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXG5leHBvcnQgY2xhc3MgRm9jdXNTZXJ2aWNlIGV4dGVuZHMgRGVzdHJ1Y3RpYmxlIHtcbiAgICAjYWN0aXZpdHkgPSBpbmplY3QoQWN0aXZpdHlTZXJ2aWNlKVxuICAgICNmb2N1cyA9IG5ldyBTdWJqZWN0PE5vZGU+KClcbiAgICAjYmx1ciA9IG5ldyBTdWJqZWN0PE5vZGU+KClcbiAgICBldmVudHMhOiBPYnNlcnZhYmxlPEZvY3VzQ2hhbmdlcz5cblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoRE9DVU1FTlQpIGRvY3VtZW50OiBEb2N1bWVudCwgQEluamVjdChOZ1pvbmUpIHpvbmU6IE5nWm9uZSkge1xuICAgICAgICBzdXBlcigpXG5cbiAgICAgICAgem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibHVyID0gdGhpcy4jYmx1ci5waXBlKHN0YXJ0V2l0aChudWxsKSwgc2hhcmVSZXBsYXkoMSkpXG4gICAgICAgICAgICBjb25zdCBmb2N1cyA9IHRoaXMuI2ZvY3VzLnBpcGUoc2hhcmVSZXBsYXkoMSkpXG5cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IGNvbWJpbmVMYXRlc3Qoe1xuICAgICAgICAgICAgICAgIGFjdGl2aXR5OiB0aGlzLiNhY3Rpdml0eS5ldmVudHMsXG4gICAgICAgICAgICAgICAgZm9jdXM6IGZvY3VzLFxuICAgICAgICAgICAgICAgIGJsdXI6IGJsdXJcbiAgICAgICAgICAgIH0pLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKCh7IGFjdGl2aXR5LCBmb2N1cywgYmx1ciB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHsgYWN0aXZpdHksIGZvY3VzLCBibHVyIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZm9jdXMgaW4gd2l0aCBhbHQrdGFiXG4gICAgICAgICAgICAgICAgICAgIGlmIChibHVyID09PSBkb2N1bWVudCAmJiBhY3Rpdml0eS5vcmlnaW4gPT09IFwia2V5Ym9hcmRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBcInByb2dyYW1cIiwgZWxlbWVudDogZm9jdXMgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzID09PSBkb2N1bWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBcInByb2dyYW1cIiwgZWxlbWVudDogZm9jdXMgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgcHJlc3MgdGFiIGJ1dHRvbiwgZmlyc3QgZmlyZSB0aGUgZXZlbnQgaW4gdGhlIGN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzID09PSBibHVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBwcmVzcyB0YWIsIHRoZSBhY3Rpdml0eSBpcyBvbiB0aGUgY3VycmVudCBmdWNlc2QgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgLy8gc28gd2hlbiBibHVyIGlzIGNoYW5nZWQgdG8gaXQsIHRoZSBmb2N1cyBjaGFuZ2UgaXMgY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpdml0eS5vcmlnaW4gPT09IFwia2V5Ym9hcmRcIiAmJiBpc0FjdGl2aXR5RWxlbWVudChhY3Rpdml0eS5ub2RlLCBibHVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBcImtleWJvYXJkXCIsIGVsZW1lbnQ6IGZvY3VzIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FjdGl2aXR5RWxlbWVudChhY3Rpdml0eS5ub2RlLCBmb2N1cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG9yaWdpbjogYWN0aXZpdHkub3JpZ2luLCBlbGVtZW50OiBmb2N1cyB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBvcmlnaW46IFwicHJvZ3JhbVwiLCBlbGVtZW50OiBmb2N1cyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIodiA9PiAhIXYpLFxuICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICAgICApIGFzIGFueVxuXG4gICAgICAgICAgICB0aGlzLmV2ZW50cyA9IG1lcmdlKFxuICAgICAgICAgICAgICAgIGJsdXIucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWFwKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBudWxsLCBlbGVtZW50IH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGV2ZW50c1xuICAgICAgICAgICAgKS5waXBlKHNoYXJlUmVwbGF5KDEpKSBhcyBhbnlcblxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHRoaXMuI29uRm9jdXMsIEVWRU5UX09QVElPTlMpXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCB0aGlzLiNvbkJsdXIsIEVWRU5UX09QVElPTlMpXG5cbiAgICAgICAgICAgIHRoaXMuZC5hbnkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLiNvbkZvY3VzLCBFVkVOVF9PUFRJT05TKVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuI29uQmx1ciwgRVZFTlRfT1BUSU9OUylcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgI29uRm9jdXMgPSAoZXZlbnQ6IEZvY3VzRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy4jZm9jdXMubmV4dChldmVudC50YXJnZXQgYXMgTm9kZSlcbiAgICB9XG5cbiAgICAjb25CbHVyID0gKGV2ZW50OiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuI2JsdXIubmV4dChldmVudC50YXJnZXQgYXMgTm9kZSlcbiAgICB9XG5cbiAgICB3YXRjaChub2RlOiBOb2RlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50cy5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50LmVsZW1lbnQgJiYgKGV2ZW50LmVsZW1lbnQgPT09IG5vZGUgfHwgbm9kZS5jb250YWlucyhldmVudC5lbGVtZW50KSkpLFxuICAgICAgICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICAgICAgKVxuICAgIH1cblxuICAgIGZvY3VzKG5vZGU6IEhUTUxFbGVtZW50LCBvcmlnb246IEZvY3VzT3JpZ2luIHwgbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBmb2N1cyBvcmlnaW5cbiAgICAgICAgbm9kZS5mb2N1cygpXG4gICAgfVxuXG4gICAgcXVlcnlGb2N1c2FibGUoaW5zaWRlOiBIVE1MRWxlbWVudCk6IEZvY3VzYWJsZUVsZW1lbnRbXSB7XG4gICAgICAgIHJldHVybiBmb2N1c2FibGUoaW5zaWRlLCB7IGluY2x1ZGVDb250YWluZXI6IGZhbHNlIH0pXG4gICAgfVxuXG4gICAgZ2V0Rmlyc3RGb2N1c2FibGUoaW5zaWRlOiBIVE1MRWxlbWVudCk6IEZvY3VzYWJsZUVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVyeUZvY3VzYWJsZShpbnNpZGUpWzBdXG4gICAgfVxuXG4gICAgaXNGb2N1c2FibGUobm9kZTogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNGb2N1c2FibGUobm9kZSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzQWN0aXZpdHlFbGVtZW50KGFjdGl2aXR5RWw/OiBOb2RlIHwgbnVsbCwgZm9jdXNlZD86IE5vZGUgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGFjdGl2aXR5RWwgIT0gbnVsbCAmJiBmb2N1c2VkICE9IG51bGwgJiYgKGFjdGl2aXR5RWwgPT09IGZvY3VzZWQgfHwgZm9jdXNlZC5jb250YWlucyhhY3Rpdml0eUVsKSlcbn1cbiJdfQ==
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FyaWEvc3JjL2ZvY3VzL2ZvY3VzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBYyxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUVyRyxPQUFPLEVBQUUsU0FBUyxFQUF5QixXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFFeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRTdDLE9BQU8sRUFBa0IsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFBOztBQUU3RCxNQUFNLGFBQWEsR0FBNEI7SUFDM0MsT0FBTyxFQUFFLElBQUk7SUFDYixPQUFPLEVBQUUsSUFBSTtDQUNoQixDQUFBO0FBaUJELE1BQU0sT0FBTyxZQUFhLFNBQVEsWUFBWTtJQUMxQyxTQUFTLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQ25DLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFBO0lBQzVCLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFBO0lBRzNCLFlBQThCLFFBQWtCLEVBQWtCLElBQVk7UUFDMUUsS0FBSyxFQUFFLENBQUE7UUFFUCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFD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QUFVLEVBQUUsTUFBTSxFQUFFOzswQkFPakIsTUFBTTsyQkFBQyxRQUFROzswQkFBdUIsTUFBTTsyQkFBQyxNQUFNOztBQWlHcEUsU0FBUyxpQkFBaUIsQ0FBQyxVQUF3QixFQUFFLE9BQXFCO0lBQ3RFLE9BQU8sVUFBVSxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7QUFDNUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiXG5pbXBvcnQgeyBpbmplY3QsIEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuXG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBmaWx0ZXIsIG1hcCwgbWVyZ2UsIE9ic2VydmFibGUsIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIFN1YmplY3QgfSBmcm9tIFwicnhqc1wiXG5cbmltcG9ydCB7IGZvY3VzYWJsZSwgdHlwZSBGb2N1c2FibGVFbGVtZW50LCBpc0ZvY3VzYWJsZSB9IGZyb20gXCJ0YWJiYWJsZVwiXG5cbmltcG9ydCB7IERlc3RydWN0aWJsZSB9IGZyb20gXCJAbmd1dGlsL2NvbW1vblwiXG5cbmltcG9ydCB7IEFjdGl2aXR5T3JpZ2luLCBBY3Rpdml0eVNlcnZpY2UgfSBmcm9tIFwiLi4vYWN0aXZpdHlcIlxuXG5jb25zdCBFVkVOVF9PUFRJT05TOiBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyA9IHtcbiAgICBjYXB0dXJlOiB0cnVlLFxuICAgIHBhc3NpdmU6IHRydWVcbn1cblxuZXhwb3J0IHR5cGUgRm9jdXNPcmlnaW4gPSBBY3Rpdml0eU9yaWdpbiB8IG51bGxcbi8vIGV4cG9ydCB0eXBlIEZvY3VzVGFyZ2V0ID0gbnVsbCB8IFwic2VsZlwiIHwgXCJjaGlsZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9jdXNDaGFuZ2VzIHtcbiAgICBvcmlnaW46IEZvY3VzT3JpZ2luXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb2N1c2FibGVFdmVudCB7XG4gICAgb3JpZ2luOiBGb2N1c09yaWdpblxuICAgIGV4YWN0OiBib29sZWFuXG4gICAgbm9kZTogTm9kZVxufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXG5leHBvcnQgY2xhc3MgRm9jdXNTZXJ2aWNlIGV4dGVuZHMgRGVzdHJ1Y3RpYmxlIHtcbiAgICAjYWN0aXZpdHkgPSBpbmplY3QoQWN0aXZpdHlTZXJ2aWNlKVxuICAgICNmb2N1cyA9IG5ldyBTdWJqZWN0PE5vZGU+KClcbiAgICAjYmx1ciA9IG5ldyBTdWJqZWN0PE5vZGU+KClcbiAgICBldmVudHMhOiBPYnNlcnZhYmxlPEZvY3VzQ2hhbmdlcz5cblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoRE9DVU1FTlQpIGRvY3VtZW50OiBEb2N1bWVudCwgQEluamVjdChOZ1pvbmUpIHpvbmU6IE5nWm9uZSkge1xuICAgICAgICBzdXBlcigpXG5cbiAgICAgICAgem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibHVyID0gdGhpcy4jYmx1ci5waXBlKHN0YXJ0V2l0aChudWxsKSwgc2hhcmVSZXBsYXkoMSkpXG4gICAgICAgICAgICBjb25zdCBmb2N1cyA9IHRoaXMuI2ZvY3VzLnBpcGUoc2hhcmVSZXBsYXkoMSkpXG5cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IGNvbWJpbmVMYXRlc3Qoe1xuICAgICAgICAgICAgICAgIGFjdGl2aXR5OiB0aGlzLiNhY3Rpdml0eS5ldmVudHMsXG4gICAgICAgICAgICAgICAgZm9jdXM6IGZvY3VzLFxuICAgICAgICAgICAgICAgIGJsdXI6IGJsdXJcbiAgICAgICAgICAgIH0pLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKCh7IGFjdGl2aXR5LCBmb2N1cywgYmx1ciB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHsgYWN0aXZpdHksIGZvY3VzLCBibHVyIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZm9jdXMgaW4gd2l0aCBhbHQrdGFiXG4gICAgICAgICAgICAgICAgICAgIGlmIChibHVyID09PSBkb2N1bWVudCAmJiBhY3Rpdml0eS5vcmlnaW4gPT09IFwia2V5Ym9hcmRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBcInByb2dyYW1cIiwgZWxlbWVudDogZm9jdXMgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzID09PSBkb2N1bWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBcInByb2dyYW1cIiwgZWxlbWVudDogZm9jdXMgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgcHJlc3MgdGFiIGJ1dHRvbiwgZmlyc3QgZmlyZSB0aGUgZXZlbnQgaW4gdGhlIGN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzID09PSBibHVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBwcmVzcyB0YWIsIHRoZSBhY3Rpdml0eSBpcyBvbiB0aGUgY3VycmVudCBmdWNlc2QgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgLy8gc28gd2hlbiBibHVyIGlzIGNoYW5nZWQgdG8gaXQsIHRoZSBmb2N1cyBjaGFuZ2UgaXMgY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpdml0eS5vcmlnaW4gPT09IFwia2V5Ym9hcmRcIiAmJiBpc0FjdGl2aXR5RWxlbWVudChhY3Rpdml0eS5ub2RlLCBibHVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBcImtleWJvYXJkXCIsIGVsZW1lbnQ6IGZvY3VzIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FjdGl2aXR5RWxlbWVudChhY3Rpdml0eS5ub2RlLCBmb2N1cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG9yaWdpbjogYWN0aXZpdHkub3JpZ2luLCBlbGVtZW50OiBmb2N1cyB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBvcmlnaW46IFwicHJvZ3JhbVwiLCBlbGVtZW50OiBmb2N1cyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIodiA9PiAhIXYpLFxuICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICAgICApIGFzIGFueVxuXG4gICAgICAgICAgICB0aGlzLmV2ZW50cyA9IG1lcmdlKFxuICAgICAgICAgICAgICAgIGJsdXIucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWFwKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBudWxsLCBlbGVtZW50IH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGV2ZW50c1xuICAgICAgICAgICAgKS5waXBlKHNoYXJlUmVwbGF5KDEpKSBhcyBhbnlcblxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHRoaXMuI29uRm9jdXMsIEVWRU5UX09QVElPTlMpXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCB0aGlzLiNvbkJsdXIsIEVWRU5UX09QVElPTlMpXG5cbiAgICAgICAgICAgIHRoaXMuZC5hbnkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLiNvbkZvY3VzLCBFVkVOVF9PUFRJT05TKVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuI29uQmx1ciwgRVZFTlRfT1BUSU9OUylcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgI29uRm9jdXMgPSAoZXZlbnQ6IEZvY3VzRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy4jZm9jdXMubmV4dChldmVudC50YXJnZXQgYXMgTm9kZSlcbiAgICB9XG5cbiAgICAjb25CbHVyID0gKGV2ZW50OiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuI2JsdXIubmV4dChldmVudC50YXJnZXQgYXMgTm9kZSlcbiAgICB9XG5cbiAgICB3YXRjaChub2RlOiBOb2RlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50cy5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50LmVsZW1lbnQgJiYgKGV2ZW50LmVsZW1lbnQgPT09IG5vZGUgfHwgbm9kZS5jb250YWlucyhldmVudC5lbGVtZW50KSkpLFxuICAgICAgICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICAgICAgKVxuICAgIH1cblxuICAgIGZvY3VzKG5vZGU6IEhUTUxFbGVtZW50LCBfb3JpZ29uOiBGb2N1c09yaWdpbiB8IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogZm9jdXMgb3JpZ2luXG4gICAgICAgIG5vZGUuZm9jdXMoKVxuICAgIH1cblxuICAgIHF1ZXJ5Rm9jdXNhYmxlKGluc2lkZTogSFRNTEVsZW1lbnQpOiBGb2N1c2FibGVFbGVtZW50W10ge1xuICAgICAgICByZXR1cm4gZm9jdXNhYmxlKGluc2lkZSwgeyBpbmNsdWRlQ29udGFpbmVyOiBmYWxzZSB9KVxuICAgIH1cblxuICAgIGdldEZpcnN0Rm9jdXNhYmxlKGluc2lkZTogSFRNTEVsZW1lbnQpOiBGb2N1c2FibGVFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlGb2N1c2FibGUoaW5zaWRlKVswXVxuICAgIH1cblxuICAgIGlzRm9jdXNhYmxlKG5vZGU6IEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGlzRm9jdXNhYmxlKG5vZGUpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc0FjdGl2aXR5RWxlbWVudChhY3Rpdml0eUVsPzogTm9kZSB8IG51bGwsIGZvY3VzZWQ/OiBOb2RlIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhY3Rpdml0eUVsICE9IG51bGwgJiYgZm9jdXNlZCAhPSBudWxsICYmIChhY3Rpdml0eUVsID09PSBmb2N1c2VkIHx8IGZvY3VzZWQuY29udGFpbnMoYWN0aXZpdHlFbCkpXG59XG4iXX0=
@@ -0,0 +1,53 @@
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";
5
+ 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
+ });
44
+ });
45
+ }
46
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: Focusable, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); }
47
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.3", type: Focusable, isStandalone: true, usesInheritance: true, ngImport: i0 }); }
48
+ }
49
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: Focusable, decorators: [{
50
+ type: Directive,
51
+ args: [{ standalone: true }]
52
+ }], ctorParameters: () => [{ type: i0.NgZone }] });
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXNhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FyaWEvc3JjL2ZvY3VzL2ZvY3VzYWJsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVyRSxPQUFPLEVBQUUsR0FBRyxFQUFjLFdBQVcsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUVuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRXRELE9BQU8sRUFBeUMsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUE7O0FBRXJGLDBFQUEwRTtBQUUxRSxNQUFNLE9BQU8sU0FBVSxTQUFRLFlBQVk7SUFDdkMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUMvQixNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUEsVUFBZ0IsQ0FBQSxDQUFDLENBQUE7SUFDakMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFBO0lBTy9CLFlBQVksSUFBWTtRQUNwQixLQUFLLEVBQUUsQ0FBQTtRQUVQLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDeEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUUzQztZQUFDLElBQStDLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQ2xFLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDUixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFBO2dCQUNyQixJQUFJLEtBQUssR0FBbUIsSUFBSSxDQUFBO2dCQUNoQyxJQUFJLE9BQU8sR0FBdUIsS0FBSyxDQUFDLE9BQU8sQ0FBQTtnQkFFL0MsT0FBTyxPQUFPLEVBQUUsQ0FBQztvQkFDYixJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDbkIsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7NEJBQ2pCLEtBQUssR0FBRyxJQUFJLENBQUE7d0JBQ2hCLENBQUM7d0JBQ0QsTUFBSztvQkFDVCxDQUFDO3lCQUFNLENBQUM7d0JBQ0osTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQTt3QkFDNUMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzs0QkFDMUIsS0FBSyxHQUFHLEtBQUssQ0FBQTs0QkFDYixNQUFLO3dCQUNULENBQUM7d0JBRUQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUE7b0JBQ25DLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFvQixDQUFBO1lBQ2pGLENBQUMsQ0FBQyxFQUNGLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDakIsQ0FDQTtZQUFDLElBQTRDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNwRSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQzFCLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDakIsQ0FDQTtZQUFDLElBQXVDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUM5RCxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQ3pCLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDakIsQ0FBQTtZQUVELElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3RDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDNUIsT0FBTyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO2lCQUN0RixDQUFDLENBQUE7WUFDTixDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQzs4R0F6RFEsU0FBUztrR0FBVCxTQUFTOzsyRkFBVCxTQUFTO2tCQURyQixTQUFTO21CQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgaW5qZWN0LCBOZ1pvbmUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXG5cbmltcG9ydCB7IG1hcCwgT2JzZXJ2YWJsZSwgc2hhcmVSZXBsYXkgfSBmcm9tIFwicnhqc1wiXG5cbmltcG9ydCB7IERlc3RydWN0aWJsZSwgRmFzdERPTSB9IGZyb20gXCJAbmd1dGlsL2NvbW1vblwiXG5cbmltcG9ydCB7IHR5cGUgRm9jdXNhYmxlRXZlbnQsIHR5cGUgRm9jdXNPcmlnaW4sIEZvY3VzU2VydmljZSB9IGZyb20gXCIuL2ZvY3VzLnNlcnZpY2VcIlxuXG4vLyBUT0RPOiBzZXQgW2F0dHIuZm9jdXNlZF09XCJbbW91c2UgfCBrZXlib2FyZCB8IHByb2dyYW1dIFtleGFjdCB8IGNoaWxkXVwiXG5ARGlyZWN0aXZlKHsgc3RhbmRhbG9uZTogdHJ1ZSB9KVxuZXhwb3J0IGNsYXNzIEZvY3VzYWJsZSBleHRlbmRzIERlc3RydWN0aWJsZSB7XG4gICAgI3NlcnZpY2UgPSBpbmplY3QoRm9jdXNTZXJ2aWNlKVxuICAgICNlbFJlZiA9IGluamVjdChFbGVtZW50UmVmPE5vZGU+KVxuICAgICNlbCA9IHRoaXMuI2VsUmVmLm5hdGl2ZUVsZW1lbnRcblxuICAgIHJlYWRvbmx5IGV2ZW50cyE6IE9ic2VydmFibGU8Rm9jdXNhYmxlRXZlbnQ+XG4gICAgcmVhZG9ubHkgb3JpZ2luITogT2JzZXJ2YWJsZTxGb2N1c09yaWdpbj5cbiAgICAvLyByZWFkb25seSBvcmlnaW4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZvY3VzT3JpZ2luPihudWxsKVxuICAgIHJlYWRvbmx5IGV4YWN0ITogT2JzZXJ2YWJsZTxib29sZWFuPlxuXG4gICAgY29uc3RydWN0b3Ioem9uZTogTmdab25lKSB7XG4gICAgICAgIHN1cGVyKClcblxuICAgICAgICB6b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMuI3NlcnZpY2Uud2F0Y2godGhpcy4jZWwpXG5cbiAgICAgICAgICAgIDsodGhpcyBhcyB7IGV2ZW50czogT2JzZXJ2YWJsZTxGb2N1c2FibGVFdmVudD4gfSkuZXZlbnRzID0gZXZlbnRzLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXMuI2VsXG4gICAgICAgICAgICAgICAgICAgIGxldCBleGFjdDogYm9vbGVhbiB8IG51bGwgPSBudWxsXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2N1c2VkOiBIVE1MRWxlbWVudCB8IG51bGwgPSBldmVudC5lbGVtZW50XG5cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZvY3VzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c2VkID09PSBzZWxmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4YWN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0ID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyID0gZm9jdXNlZC5nZXRBdHRyaWJ1dGUoXCJmb2N1c2VkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIgJiYgYXR0ci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0ID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2VkID0gZm9jdXNlZC5wYXJlbnRFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luOiBldmVudC5vcmlnaW4sIGV4YWN0LCBub2RlOiBldmVudC5lbGVtZW50IH0gYXMgRm9jdXNhYmxlRXZlbnRcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzaGFyZVJlcGxheSgxKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgOyh0aGlzIGFzIHsgb3JpZ2luOiBPYnNlcnZhYmxlPEZvY3VzT3JpZ2luPiB9KS5vcmlnaW4gPSB0aGlzLmV2ZW50cy5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChldmVudCA9PiBldmVudC5vcmlnaW4pLFxuICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICA7KHRoaXMgYXMgeyBleGFjdDogT2JzZXJ2YWJsZTxib29sZWFuPiB9KS5leGFjdCA9IHRoaXMuZXZlbnRzLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKGV2ZW50ID0+IGV2ZW50LmV4YWN0KSxcbiAgICAgICAgICAgICAgICBzaGFyZVJlcGxheSgxKVxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICB0aGlzLmQuc3ViKHRoaXMuZXZlbnRzKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIEZhc3RET00uc2V0QXR0cmlidXRlcyh0aGlzLiNlbCwge1xuICAgICAgICAgICAgICAgICAgICBmb2N1c2VkOiBldmVudC5vcmlnaW4gPyBgJHtldmVudC5vcmlnaW59ICR7ZXZlbnQuZXhhY3QgPyBcImV4YWN0XCIgOiBcImNoaWxkXCJ9YCA6IG51bGxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG59XG4iXX0=
@@ -1,2 +1,4 @@
1
1
  export * from "./focus.service";
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9mb2N1cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGlCQUFpQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vZm9jdXMuc2VydmljZVwiXG4iXX0=
2
+ export * from "./focus-trap.directive";
3
+ export * from "./focusable.directive";
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9mb2N1cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGlCQUFpQixDQUFBO0FBQy9CLGNBQWMsd0JBQXdCLENBQUE7QUFDdEMsY0FBYyx1QkFBdUIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2ZvY3VzLnNlcnZpY2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vZm9jdXMtdHJhcC5kaXJlY3RpdmVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZm9jdXNhYmxlLmRpcmVjdGl2ZVwiXG4iXX0=
package/esm2022/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
- export * from "./activity";
2
- export * from "./focus";
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFlBQVksQ0FBQTtBQUMxQixjQUFjLFNBQVMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2FjdGl2aXR5XCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZvY3VzXCJcbiJdfQ==
1
+ export { ActivityService } from "./activity";
2
+ export { FocusService, FocusTrap, Focusable } from "./focus";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlDLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUMzRSxPQUFPLEVBQWUsWUFBWSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQWdDLE1BQU0sU0FBUyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgQWN0aXZpdHlFdmVudCwgQWN0aXZpdHlPcmlnaW4sIEFjdGl2aXR5U2VydmljZSB9IGZyb20gXCIuL2FjdGl2aXR5XCJcbmV4cG9ydCB7IEZvY3VzT3JpZ2luLCBGb2N1c1NlcnZpY2UsIEZvY3VzVHJhcCwgRm9jdXNhYmxlLCBGb2N1c2FibGVFdmVudCwgRm9jdXNDaGFuZ2VzIH0gZnJvbSBcIi4vZm9jdXNcIlxuIl19
@@ -1,8 +1,8 @@
1
1
  import { DOCUMENT } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
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';
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';
6
6
  import { focusable, isFocusable } from 'tabbable';
7
7
 
8
8
  const EVENT_OPTIONS$1 = {
@@ -135,7 +135,7 @@ class FocusService extends Destructible {
135
135
  watch(node) {
136
136
  return this.events.pipe(filter(event => event.element && (event.element === node || node.contains(event.element))), shareReplay(1));
137
137
  }
138
- focus(node, origon) {
138
+ focus(node, _origon) {
139
139
  // TODO: focus origin
140
140
  node.focus();
141
141
  }
@@ -165,9 +165,78 @@ function isActivityElement(activityEl, focused) {
165
165
  return activityEl != null && focused != null && (activityEl === focused || focused.contains(activityEl));
166
166
  }
167
167
 
168
+ // TODO: implement
169
+ class FocusTrap extends Destructible {
170
+ #manager = inject(FocusService);
171
+ #el = inject((ElementRef));
172
+ get enabled() {
173
+ return this.#enabled.value;
174
+ }
175
+ set enabled(val) {
176
+ if (this.#enabled.value !== val) {
177
+ this.#enabled.next(val);
178
+ }
179
+ }
180
+ #enabled = new BehaviorSubject(true);
181
+ enable() {
182
+ this.enabled = true;
183
+ }
184
+ disable() {
185
+ this.enabled = false;
186
+ }
187
+ }
188
+
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;
216
+ }
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
+ });
227
+ });
228
+ }
229
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: Focusable, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); }
230
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.3", type: Focusable, isStandalone: true, usesInheritance: true, ngImport: i0 }); }
231
+ }
232
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: Focusable, decorators: [{
233
+ type: Directive,
234
+ args: [{ standalone: true }]
235
+ }], ctorParameters: () => [{ type: i0.NgZone }] });
236
+
168
237
  /**
169
238
  * Generated bundle index. Do not edit.
170
239
  */
171
240
 
172
- export { ActivityService, FocusService };
241
+ export { ActivityService, FocusService, FocusTrap, Focusable };
173
242
  //# 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/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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"}
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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"}
@@ -0,0 +1,8 @@
1
+ import { Destructible } from "@ngutil/common";
2
+ export declare class FocusTrap extends Destructible {
3
+ #private;
4
+ get enabled(): boolean;
5
+ set enabled(val: boolean);
6
+ enable(): void;
7
+ disable(): void;
8
+ }
@@ -19,7 +19,7 @@ export declare class FocusService extends Destructible {
19
19
  events: Observable<FocusChanges>;
20
20
  constructor(document: Document, zone: NgZone);
21
21
  watch(node: Node): Observable<FocusChanges>;
22
- focus(node: HTMLElement, origon: FocusOrigin | null): void;
22
+ focus(node: HTMLElement, _origon: FocusOrigin | null): void;
23
23
  queryFocusable(inside: HTMLElement): FocusableElement[];
24
24
  getFirstFocusable(inside: HTMLElement): FocusableElement | undefined;
25
25
  isFocusable(node: Element): boolean;
@@ -0,0 +1,14 @@
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
+ import * as i0 from "@angular/core";
6
+ export declare class Focusable extends Destructible {
7
+ #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>;
14
+ }
package/focus/index.d.ts CHANGED
@@ -1 +1,3 @@
1
1
  export * from "./focus.service";
2
+ export * from "./focus-trap.directive";
3
+ export * from "./focusable.directive";
package/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export * from "./activity";
2
- export * from "./focus";
1
+ export { ActivityEvent, ActivityOrigin, ActivityService } from "./activity";
2
+ export { FocusOrigin, FocusService, FocusTrap, Focusable, FocusableEvent, FocusChanges } from "./focus";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngutil/aria",
3
- "version": "0.0.3-dev.9",
3
+ "version": "0.0.4",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "directory": "../../dist/packages/aria/"
@@ -9,7 +9,8 @@
9
9
  "@angular/common": "^17.1.0",
10
10
  "@angular/core": "^17.1.0",
11
11
  "tabbable": "^6.2.0",
12
- "@ngutil/common": "0.0.3-dev.9"
12
+ "rxjs": "^7.8.1",
13
+ "@ngutil/common": "0.0.4"
13
14
  },
14
15
  "dependencies": {
15
16
  "tslib": "^2.3.0"