@ngxsmk/cdk 1.0.0 → 1.2.0
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/autofocus/autofocus.d.ts +19 -0
- package/autofocus/autofocus.d.ts.map +1 -0
- package/autofocus/index.d.ts +2 -0
- package/autofocus/index.d.ts.map +1 -0
- package/autofocus/ngxsmk-cdk-autofocus.d.ts.map +1 -0
- package/{types/ngxsmk-cdk-click-outside.d.ts → click-outside/click-outside.d.ts} +4 -6
- package/click-outside/click-outside.d.ts.map +1 -0
- package/click-outside/index.d.ts +2 -0
- package/click-outside/index.d.ts.map +1 -0
- package/click-outside/ngxsmk-cdk-click-outside.d.ts.map +1 -0
- package/esm2022/autofocus/autofocus.mjs +44 -0
- package/esm2022/autofocus/index.mjs +2 -0
- package/esm2022/autofocus/ngxsmk-cdk-autofocus.mjs +5 -0
- package/esm2022/click-outside/click-outside.mjs +38 -0
- package/esm2022/click-outside/index.mjs +2 -0
- package/esm2022/click-outside/ngxsmk-cdk-click-outside.mjs +5 -0
- package/esm2022/focus-trap/focus-trap.mjs +69 -0
- package/esm2022/focus-trap/index.mjs +2 -0
- package/esm2022/focus-trap/ngxsmk-cdk-focus-trap.mjs +5 -0
- package/esm2022/focusable/focusable.mjs +15 -0
- package/esm2022/focusable/index.mjs +2 -0
- package/esm2022/focusable/ngxsmk-cdk-focusable.mjs +5 -0
- package/esm2022/intersection-observer/index.mjs +2 -0
- package/esm2022/intersection-observer/intersection-observer.mjs +56 -0
- package/esm2022/intersection-observer/ngxsmk-cdk-intersection-observer.mjs +5 -0
- package/esm2022/live-announcer/index.mjs +2 -0
- package/esm2022/live-announcer/live-announcer.mjs +59 -0
- package/esm2022/live-announcer/ngxsmk-cdk-live-announcer.mjs +5 -0
- package/esm2022/media-query/index.mjs +2 -0
- package/esm2022/media-query/media-query.mjs +22 -0
- package/esm2022/media-query/ngxsmk-cdk-media-query.mjs +5 -0
- package/esm2022/ngxsmk-cdk.mjs +5 -0
- package/esm2022/public-api.mjs +15 -0
- package/esm2022/resize-observer/index.mjs +2 -0
- package/esm2022/resize-observer/ngxsmk-cdk-resize-observer.mjs +5 -0
- package/esm2022/resize-observer/resize-observer.mjs +59 -0
- package/esm2022/scroll-lock/index.mjs +2 -0
- package/esm2022/scroll-lock/ngxsmk-cdk-scroll-lock.mjs +5 -0
- package/esm2022/scroll-lock/scroll-lock.mjs +45 -0
- package/esm2022/testing/a11y.mjs +17 -0
- package/esm2022/testing/index.mjs +2 -0
- package/esm2022/testing/ngxsmk-cdk-testing.mjs +5 -0
- package/esm2022/visually-hidden/index.mjs +2 -0
- package/esm2022/visually-hidden/ngxsmk-cdk-visually-hidden.mjs +5 -0
- package/esm2022/visually-hidden/visually-hidden.mjs +34 -0
- package/fesm2022/ngxsmk-cdk-autofocus.mjs +51 -0
- package/fesm2022/ngxsmk-cdk-autofocus.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-click-outside.mjs +6 -6
- package/fesm2022/ngxsmk-cdk-click-outside.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-focus-trap.mjs +14 -10
- package/fesm2022/ngxsmk-cdk-focus-trap.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-focusable.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-intersection-observer.mjs +63 -0
- package/fesm2022/ngxsmk-cdk-intersection-observer.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-live-announcer.mjs +8 -6
- package/fesm2022/ngxsmk-cdk-live-announcer.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-media-query.mjs +1 -2
- package/fesm2022/ngxsmk-cdk-media-query.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-resize-observer.mjs +66 -0
- package/fesm2022/ngxsmk-cdk-resize-observer.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-scroll-lock.mjs +10 -10
- package/fesm2022/ngxsmk-cdk-scroll-lock.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-testing.mjs +24 -0
- package/fesm2022/ngxsmk-cdk-testing.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-visually-hidden.mjs +3 -3
- package/fesm2022/ngxsmk-cdk-visually-hidden.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk.mjs +11 -266
- package/fesm2022/ngxsmk-cdk.mjs.map +1 -1
- package/focus-trap/focus-trap.d.ts +19 -0
- package/focus-trap/focus-trap.d.ts.map +1 -0
- package/focus-trap/index.d.ts +2 -0
- package/focus-trap/index.d.ts.map +1 -0
- package/focus-trap/ngxsmk-cdk-focus-trap.d.ts.map +1 -0
- package/focusable/focusable.d.ts +5 -0
- package/focusable/focusable.d.ts.map +1 -0
- package/focusable/index.d.ts +2 -0
- package/focusable/index.d.ts.map +1 -0
- package/focusable/ngxsmk-cdk-focusable.d.ts.map +1 -0
- package/index.d.ts +6 -0
- package/intersection-observer/index.d.ts +2 -0
- package/intersection-observer/index.d.ts.map +1 -0
- package/intersection-observer/intersection-observer.d.ts +22 -0
- package/intersection-observer/intersection-observer.d.ts.map +1 -0
- package/intersection-observer/ngxsmk-cdk-intersection-observer.d.ts.map +1 -0
- package/live-announcer/index.d.ts +2 -0
- package/live-announcer/index.d.ts.map +1 -0
- package/{types/ngxsmk-cdk-live-announcer.d.ts → live-announcer/live-announcer.d.ts} +4 -7
- package/live-announcer/live-announcer.d.ts.map +1 -0
- package/live-announcer/ngxsmk-cdk-live-announcer.d.ts.map +1 -0
- package/media-query/index.d.ts +2 -0
- package/media-query/index.d.ts.map +1 -0
- package/{types/ngxsmk-cdk-media-query.d.ts → media-query/media-query.d.ts} +2 -4
- package/media-query/media-query.d.ts.map +1 -0
- package/media-query/ngxsmk-cdk-media-query.d.ts.map +1 -0
- package/ngxsmk-cdk.d.ts.map +1 -0
- package/package.json +51 -12
- package/public-api.d.ts +12 -0
- package/public-api.d.ts.map +1 -0
- package/resize-observer/index.d.ts +2 -0
- package/resize-observer/index.d.ts.map +1 -0
- package/resize-observer/ngxsmk-cdk-resize-observer.d.ts.map +1 -0
- package/resize-observer/resize-observer.d.ts +20 -0
- package/resize-observer/resize-observer.d.ts.map +1 -0
- package/scroll-lock/index.d.ts +2 -0
- package/scroll-lock/index.d.ts.map +1 -0
- package/scroll-lock/ngxsmk-cdk-scroll-lock.d.ts.map +1 -0
- package/{types/ngxsmk-cdk-scroll-lock.d.ts → scroll-lock/scroll-lock.d.ts} +3 -5
- package/scroll-lock/scroll-lock.d.ts.map +1 -0
- package/testing/a11y.d.ts +6 -0
- package/testing/a11y.d.ts.map +1 -0
- package/testing/index.d.ts +2 -0
- package/testing/index.d.ts.map +1 -0
- package/testing/ngxsmk-cdk-testing.d.ts.map +1 -0
- package/visually-hidden/index.d.ts +2 -0
- package/visually-hidden/index.d.ts.map +1 -0
- package/visually-hidden/ngxsmk-cdk-visually-hidden.d.ts.map +1 -0
- package/{types/ngxsmk-cdk-visually-hidden.d.ts → visually-hidden/visually-hidden.d.ts} +3 -5
- package/visually-hidden/visually-hidden.d.ts.map +1 -0
- package/types/ngxsmk-cdk-focus-trap.d.ts +0 -21
- package/types/ngxsmk-cdk-focusable.d.ts +0 -6
- package/types/ngxsmk-cdk.d.ts +0 -96
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { DestroyRef, Directive, ElementRef, inject, input, output } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Emits when the host element's dimensions change.
|
|
5
|
+
*
|
|
6
|
+
* ```html
|
|
7
|
+
* <div [ngxsmkResizeObserver] (resized)="onResize($event)">…</div>
|
|
8
|
+
* ```
|
|
9
|
+
*/
|
|
10
|
+
export class NgxsmkResizeObserver {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.elementRef = inject(ElementRef);
|
|
13
|
+
this.destroyRef = inject(DestroyRef);
|
|
14
|
+
this.debounceMs = input(0);
|
|
15
|
+
this.resized = output();
|
|
16
|
+
this.observer = null;
|
|
17
|
+
this.timeoutId = null;
|
|
18
|
+
if (typeof window === 'undefined' || !('ResizeObserver' in window)) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
this.observer = new ResizeObserver((entries) => {
|
|
22
|
+
const entry = entries[0];
|
|
23
|
+
if (!entry) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const debounce = this.debounceMs();
|
|
27
|
+
if (debounce > 0) {
|
|
28
|
+
if (this.timeoutId) {
|
|
29
|
+
clearTimeout(this.timeoutId);
|
|
30
|
+
}
|
|
31
|
+
this.timeoutId = setTimeout(() => {
|
|
32
|
+
this.resized.emit(entry);
|
|
33
|
+
}, debounce);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
this.resized.emit(entry);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
this.observer.observe(this.elementRef.nativeElement);
|
|
40
|
+
this.destroyRef.onDestroy(() => {
|
|
41
|
+
if (this.timeoutId) {
|
|
42
|
+
clearTimeout(this.timeoutId);
|
|
43
|
+
}
|
|
44
|
+
if (this.observer) {
|
|
45
|
+
this.observer.disconnect();
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkResizeObserver, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
50
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "17.3.0", type: NgxsmkResizeObserver, isStandalone: true, selector: "[ngxsmkResizeObserver]", inputs: { debounceMs: { classPropertyName: "debounceMs", publicName: "debounceMs", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { resized: "resized" }, ngImport: i0 }); }
|
|
51
|
+
}
|
|
52
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkResizeObserver, decorators: [{
|
|
53
|
+
type: Directive,
|
|
54
|
+
args: [{
|
|
55
|
+
standalone: true,
|
|
56
|
+
selector: '[ngxsmkResizeObserver]',
|
|
57
|
+
}]
|
|
58
|
+
}], ctorParameters: () => [] });
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLW9ic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2RrL3Jlc2l6ZS1vYnNlcnZlci9yZXNpemUtb2JzZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUV6Rjs7Ozs7O0dBTUc7QUFLSCxNQUFNLE9BQU8sb0JBQW9CO0lBVS9CO1FBVGlCLGVBQVUsR0FBRyxNQUFNLENBQTBCLFVBQVUsQ0FBQyxDQUFDO1FBQ3pELGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFeEMsZUFBVSxHQUFHLEtBQUssQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUM5QixZQUFPLEdBQUcsTUFBTSxFQUF1QixDQUFDO1FBRXpDLGFBQVEsR0FBMEIsSUFBSSxDQUFDO1FBQ3ZDLGNBQVMsR0FBeUMsSUFBSSxDQUFDO1FBRzdELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ25FLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGNBQWMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzdDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1gsT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbkMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNuQixZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMvQixDQUFDO2dCQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzNCLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNmLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUM3QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkIsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvQixDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0E1Q1Usb0JBQW9CO2tHQUFwQixvQkFBb0I7OzJGQUFwQixvQkFBb0I7a0JBSmhDLFNBQVM7bUJBQUM7b0JBQ1QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSx3QkFBd0I7aUJBQ25DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzdHJveVJlZiwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBFbWl0cyB3aGVuIHRoZSBob3N0IGVsZW1lbnQncyBkaW1lbnNpb25zIGNoYW5nZS5cbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IFtuZ3hzbWtSZXNpemVPYnNlcnZlcl0gKHJlc2l6ZWQpPVwib25SZXNpemUoJGV2ZW50KVwiPuKApjwvZGl2PlxuICogYGBgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ1tuZ3hzbWtSZXNpemVPYnNlcnZlcl0nLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hzbWtSZXNpemVPYnNlcnZlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZiA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICByZWFkb25seSBkZWJvdW5jZU1zID0gaW5wdXQ8bnVtYmVyPigwKTtcbiAgcmVhZG9ubHkgcmVzaXplZCA9IG91dHB1dDxSZXNpemVPYnNlcnZlckVudHJ5PigpO1xuXG4gIHByaXZhdGUgb2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdGltZW91dElkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCAhKCdSZXNpemVPYnNlcnZlcicgaW4gd2luZG93KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1swXTtcbiAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWJvdW5jZSA9IHRoaXMuZGVib3VuY2VNcygpO1xuICAgICAgaWYgKGRlYm91bmNlID4gMCkge1xuICAgICAgICBpZiAodGhpcy50aW1lb3V0SWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXNpemVkLmVtaXQoZW50cnkpO1xuICAgICAgICB9LCBkZWJvdW5jZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlc2l6ZWQuZW1pdChlbnRyeSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgdGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy50aW1lb3V0SWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9ic2VydmVyKSB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './scroll-lock';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jZGsvc2Nyb2xsLWxvY2svaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3Njcm9sbC1sb2NrJztcbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4c21rLWNkay1zY3JvbGwtbG9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Nkay9zY3JvbGwtbG9jay9uZ3hzbWstY2RrLXNjcm9sbC1sb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Injectable, inject } from '@angular/core';
|
|
2
|
+
import { DOCUMENT } from '@angular/common';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Locks body scrolling (for dialogs, drawers, sheets). Reference-counted so
|
|
6
|
+
* nested overlays can lock independently; compensates for scrollbar width to
|
|
7
|
+
* prevent layout shift.
|
|
8
|
+
*/
|
|
9
|
+
export class NgxsmkScrollLock {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.document = inject(DOCUMENT);
|
|
12
|
+
this.locks = 0;
|
|
13
|
+
this.previousOverflow = '';
|
|
14
|
+
this.previousPaddingRight = '';
|
|
15
|
+
}
|
|
16
|
+
lock() {
|
|
17
|
+
if (this.locks++ > 0) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const body = this.document.body;
|
|
21
|
+
const window = this.document.defaultView;
|
|
22
|
+
const scrollbar = window ? window.innerWidth - this.document.documentElement.clientWidth : 0;
|
|
23
|
+
this.previousOverflow = body.style.overflow;
|
|
24
|
+
this.previousPaddingRight = body.style.paddingRight;
|
|
25
|
+
body.style.overflow = 'hidden';
|
|
26
|
+
if (scrollbar > 0) {
|
|
27
|
+
body.style.paddingRight = `${scrollbar}px`;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
unlock() {
|
|
31
|
+
if (this.locks === 0 || --this.locks > 0) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const body = this.document.body;
|
|
35
|
+
body.style.overflow = this.previousOverflow;
|
|
36
|
+
body.style.paddingRight = this.previousPaddingRight;
|
|
37
|
+
}
|
|
38
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkScrollLock, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
39
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkScrollLock, providedIn: 'root' }); }
|
|
40
|
+
}
|
|
41
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkScrollLock, decorators: [{
|
|
42
|
+
type: Injectable,
|
|
43
|
+
args: [{ providedIn: 'root' }]
|
|
44
|
+
}] });
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLWxvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jZGsvc2Nyb2xsLWxvY2svc2Nyb2xsLWxvY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUUzQzs7OztHQUlHO0FBRUgsTUFBTSxPQUFPLGdCQUFnQjtJQUQ3QjtRQUVtQixhQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JDLFVBQUssR0FBRyxDQUFDLENBQUM7UUFDVixxQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDdEIseUJBQW9CLEdBQUcsRUFBRSxDQUFDO0tBMEJuQztJQXhCQyxJQUFJO1FBQ0YsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckIsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFN0YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQzVDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUNwRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDL0IsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsR0FBRyxTQUFTLElBQUksQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDdEQsQ0FBQzs4R0E3QlUsZ0JBQWdCO2tIQUFoQixnQkFBZ0IsY0FESCxNQUFNOzsyRkFDbkIsZ0JBQWdCO2tCQUQ1QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG4vKipcbiAqIExvY2tzIGJvZHkgc2Nyb2xsaW5nIChmb3IgZGlhbG9ncywgZHJhd2Vycywgc2hlZXRzKS4gUmVmZXJlbmNlLWNvdW50ZWQgc29cbiAqIG5lc3RlZCBvdmVybGF5cyBjYW4gbG9jayBpbmRlcGVuZGVudGx5OyBjb21wZW5zYXRlcyBmb3Igc2Nyb2xsYmFyIHdpZHRoIHRvXG4gKiBwcmV2ZW50IGxheW91dCBzaGlmdC5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBOZ3hzbWtTY3JvbGxMb2NrIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XG4gIHByaXZhdGUgbG9ja3MgPSAwO1xuICBwcml2YXRlIHByZXZpb3VzT3ZlcmZsb3cgPSAnJztcbiAgcHJpdmF0ZSBwcmV2aW91c1BhZGRpbmdSaWdodCA9ICcnO1xuXG4gIGxvY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9ja3MrKyA+IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYm9keSA9IHRoaXMuZG9jdW1lbnQuYm9keTtcbiAgICBjb25zdCB3aW5kb3cgPSB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgIGNvbnN0IHNjcm9sbGJhciA9IHdpbmRvdyA/IHdpbmRvdy5pbm5lcldpZHRoIC0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggOiAwO1xuXG4gICAgdGhpcy5wcmV2aW91c092ZXJmbG93ID0gYm9keS5zdHlsZS5vdmVyZmxvdztcbiAgICB0aGlzLnByZXZpb3VzUGFkZGluZ1JpZ2h0ID0gYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ7XG4gICAgYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgIGlmIChzY3JvbGxiYXIgPiAwKSB7XG4gICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IGAke3Njcm9sbGJhcn1weGA7XG4gICAgfVxuICB9XG5cbiAgdW5sb2NrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvY2tzID09PSAwIHx8IC0tdGhpcy5sb2NrcyA+IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYm9keSA9IHRoaXMuZG9jdW1lbnQuYm9keTtcbiAgICBib2R5LnN0eWxlLm92ZXJmbG93ID0gdGhpcy5wcmV2aW91c092ZXJmbG93O1xuICAgIGJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gdGhpcy5wcmV2aW91c1BhZGRpbmdSaWdodDtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as axe from 'axe-core';
|
|
2
|
+
/**
|
|
3
|
+
* Runs axe-core analysis on the provided HTML element and throws an error if any accessibility
|
|
4
|
+
* violations are detected.
|
|
5
|
+
*/
|
|
6
|
+
export async function expectNoA11yViolations(element) {
|
|
7
|
+
const results = await axe.run(element);
|
|
8
|
+
if (results.violations.length > 0) {
|
|
9
|
+
const formatted = results.violations
|
|
10
|
+
.map((v) => `[${v.id}] ${v.help}\n - Help URL: ${v.helpUrl}\n - Nodes affected:\n${v.nodes
|
|
11
|
+
.map((n) => ` * ${n.html}`)
|
|
12
|
+
.join('\n')}`)
|
|
13
|
+
.join('\n\n');
|
|
14
|
+
throw new Error(`Accessibility violations detected:\n\n${formatted}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYTExeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Nkay90ZXN0aW5nL2ExMXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUM7QUFFaEM7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxzQkFBc0IsQ0FBQyxPQUFvQjtJQUMvRCxNQUFNLE9BQU8sR0FBRyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkMsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsVUFBVTthQUNqQyxHQUFHLENBQ0YsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLElBQUksQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxDQUFDLE9BQU8sMEJBQTBCLENBQUMsQ0FBQyxLQUFLO2FBQzdFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ2xCO2FBQ0EsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDeEUsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBheGUgZnJvbSAnYXhlLWNvcmUnO1xuXG4vKipcbiAqIFJ1bnMgYXhlLWNvcmUgYW5hbHlzaXMgb24gdGhlIHByb3ZpZGVkIEhUTUwgZWxlbWVudCBhbmQgdGhyb3dzIGFuIGVycm9yIGlmIGFueSBhY2Nlc3NpYmlsaXR5XG4gKiB2aW9sYXRpb25zIGFyZSBkZXRlY3RlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGVjdE5vQTExeVZpb2xhdGlvbnMoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGF4ZS5ydW4oZWxlbWVudCk7XG4gIGlmIChyZXN1bHRzLnZpb2xhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGZvcm1hdHRlZCA9IHJlc3VsdHMudmlvbGF0aW9uc1xuICAgICAgLm1hcChcbiAgICAgICAgKHYpID0+XG4gICAgICAgICAgYFske3YuaWR9XSAke3YuaGVscH1cXG4gIC0gSGVscCBVUkw6ICR7di5oZWxwVXJsfVxcbiAgLSBOb2RlcyBhZmZlY3RlZDpcXG4ke3Yubm9kZXNcbiAgICAgICAgICAgIC5tYXAoKG4pID0+IGAgICAgKiAke24uaHRtbH1gKVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpfWAsXG4gICAgICApXG4gICAgICAuam9pbignXFxuXFxuJyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBY2Nlc3NpYmlsaXR5IHZpb2xhdGlvbnMgZGV0ZWN0ZWQ6XFxuXFxuJHtmb3JtYXR0ZWR9YCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './a11y';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jZGsvdGVzdGluZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYTExeSc7XG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4c21rLWNkay10ZXN0aW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2RrL3Rlc3Rpbmcvbmd4c21rLWNkay10ZXN0aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './visually-hidden';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jZGsvdmlzdWFsbHktaGlkZGVuL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3Zpc3VhbGx5LWhpZGRlbic7XG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4c21rLWNkay12aXN1YWxseS1oaWRkZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jZGsvdmlzdWFsbHktaGlkZGVuL25neHNtay1jZGstdmlzdWFsbHktaGlkZGVuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Directive } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Hides the host visually while keeping it available to screen readers.
|
|
5
|
+
*
|
|
6
|
+
* ```html
|
|
7
|
+
* <span ngxsmkVisuallyHidden>Opens in a new window</span>
|
|
8
|
+
* ```
|
|
9
|
+
*/
|
|
10
|
+
export class NgxsmkVisuallyHidden {
|
|
11
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkVisuallyHidden, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
12
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.0", type: NgxsmkVisuallyHidden, isStandalone: true, selector: "[ngxsmkVisuallyHidden]", host: { styleAttribute: "\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n border: 0;\n overflow: hidden;\n clip-path: inset(100%);\n white-space: nowrap;\n " }, ngImport: i0 }); }
|
|
13
|
+
}
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkVisuallyHidden, decorators: [{
|
|
15
|
+
type: Directive,
|
|
16
|
+
args: [{
|
|
17
|
+
standalone: true,
|
|
18
|
+
selector: '[ngxsmkVisuallyHidden]',
|
|
19
|
+
host: {
|
|
20
|
+
style: `
|
|
21
|
+
position: absolute;
|
|
22
|
+
width: 1px;
|
|
23
|
+
height: 1px;
|
|
24
|
+
margin: -1px;
|
|
25
|
+
padding: 0;
|
|
26
|
+
border: 0;
|
|
27
|
+
overflow: hidden;
|
|
28
|
+
clip-path: inset(100%);
|
|
29
|
+
white-space: nowrap;
|
|
30
|
+
`,
|
|
31
|
+
},
|
|
32
|
+
}]
|
|
33
|
+
}] });
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsbHktaGlkZGVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2RrL3Zpc3VhbGx5LWhpZGRlbi92aXN1YWxseS1oaWRkZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFMUM7Ozs7OztHQU1HO0FBa0JILE1BQU0sT0FBTyxvQkFBb0I7OEdBQXBCLG9CQUFvQjtrR0FBcEIsb0JBQW9COzsyRkFBcEIsb0JBQW9CO2tCQWpCaEMsU0FBUzttQkFBQztvQkFDVCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsSUFBSSxFQUFFO3dCQUNKLEtBQUssRUFBRTs7Ozs7Ozs7OztLQVVOO3FCQUNGO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogSGlkZXMgdGhlIGhvc3QgdmlzdWFsbHkgd2hpbGUga2VlcGluZyBpdCBhdmFpbGFibGUgdG8gc2NyZWVuIHJlYWRlcnMuXG4gKlxuICogYGBgaHRtbFxuICogPHNwYW4gbmd4c21rVmlzdWFsbHlIaWRkZW4+T3BlbnMgaW4gYSBuZXcgd2luZG93PC9zcGFuPlxuICogYGBgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ1tuZ3hzbWtWaXN1YWxseUhpZGRlbl0nLFxuICBob3N0OiB7XG4gICAgc3R5bGU6IGBcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHdpZHRoOiAxcHg7XG4gICAgICBoZWlnaHQ6IDFweDtcbiAgICAgIG1hcmdpbjogLTFweDtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBib3JkZXI6IDA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgY2xpcC1wYXRoOiBpbnNldCgxMDAlKTtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgYCxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgTmd4c21rVmlzdWFsbHlIaWRkZW4ge31cbiJdfQ==
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, ElementRef, input, booleanAttribute, afterNextRender, Directive } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Automatically focuses the host element on render.
|
|
6
|
+
*
|
|
7
|
+
* ```html
|
|
8
|
+
* <input ngxsmkAutofocus />
|
|
9
|
+
* <button [ngxsmkAutofocus]="shouldFocus" [autofocusDelay]="150">Confirm</button>
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
class NgxsmkAutofocus {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.elementRef = inject(ElementRef);
|
|
15
|
+
this.ngxsmkAutofocus = input(true, { transform: booleanAttribute });
|
|
16
|
+
this.autofocusDelay = input(0);
|
|
17
|
+
afterNextRender(() => {
|
|
18
|
+
if (this.ngxsmkAutofocus()) {
|
|
19
|
+
const delay = this.autofocusDelay();
|
|
20
|
+
if (delay > 0) {
|
|
21
|
+
setTimeout(() => this.focusElement(), delay);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
this.focusElement();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
focusElement() {
|
|
30
|
+
const el = this.elementRef.nativeElement;
|
|
31
|
+
if (el && typeof el.focus === 'function') {
|
|
32
|
+
el.focus();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkAutofocus, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
36
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "17.3.0", type: NgxsmkAutofocus, isStandalone: true, selector: "[ngxsmkAutofocus]", inputs: { ngxsmkAutofocus: { classPropertyName: "ngxsmkAutofocus", publicName: "ngxsmkAutofocus", isSignal: true, isRequired: false, transformFunction: null }, autofocusDelay: { classPropertyName: "autofocusDelay", publicName: "autofocusDelay", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
|
|
37
|
+
}
|
|
38
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkAutofocus, decorators: [{
|
|
39
|
+
type: Directive,
|
|
40
|
+
args: [{
|
|
41
|
+
standalone: true,
|
|
42
|
+
selector: '[ngxsmkAutofocus]',
|
|
43
|
+
}]
|
|
44
|
+
}], ctorParameters: () => [] });
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Generated bundle index. Do not edit.
|
|
48
|
+
*/
|
|
49
|
+
|
|
50
|
+
export { NgxsmkAutofocus };
|
|
51
|
+
//# sourceMappingURL=ngxsmk-cdk-autofocus.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngxsmk-cdk-autofocus.mjs","sources":["../../../../packages/cdk/autofocus/autofocus.ts","../../../../packages/cdk/autofocus/ngxsmk-cdk-autofocus.ts"],"sourcesContent":["import {\n afterNextRender,\n booleanAttribute,\n Directive,\n ElementRef,\n inject,\n input,\n} from '@angular/core';\n\n/**\n * Automatically focuses the host element on render.\n *\n * ```html\n * <input ngxsmkAutofocus />\n * <button [ngxsmkAutofocus]=\"shouldFocus\" [autofocusDelay]=\"150\">Confirm</button>\n * ```\n */\n@Directive({\n standalone: true,\n selector: '[ngxsmkAutofocus]',\n})\nexport class NgxsmkAutofocus {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n readonly ngxsmkAutofocus = input(true, { transform: booleanAttribute });\n readonly autofocusDelay = input<number>(0);\n\n constructor() {\n afterNextRender(() => {\n if (this.ngxsmkAutofocus()) {\n const delay = this.autofocusDelay();\n if (delay > 0) {\n setTimeout(() => this.focusElement(), delay);\n } else {\n this.focusElement();\n }\n }\n });\n }\n\n private focusElement(): void {\n const el = this.elementRef.nativeElement;\n if (el && typeof el.focus === 'function') {\n el.focus();\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AASA;;;;;;;AAOG;MAKU,eAAe,CAAA;AAM1B,IAAA,WAAA,GAAA;AALiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC;QAEhE,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;AAC9D,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAS,CAAC,CAAC;QAGxC,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;AAC1B,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE;AACnC,gBAAA,IAAI,KAAK,GAAG,CAAC,EAAE;oBACb,UAAU,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,CAAC;gBAC9C;qBAAO;oBACL,IAAI,CAAC,YAAY,EAAE;gBACrB;YACF;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,YAAY,GAAA;AAClB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;QACxC,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,KAAK,KAAK,UAAU,EAAE;YACxC,EAAE,CAAC,KAAK,EAAE;QACZ;IACF;8GAxBW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAJ3B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,mBAAmB;AAC9B,iBAAA;;;ACpBD;;AAEG;;;;"}
|
|
@@ -10,9 +10,9 @@ import { inject, ElementRef, output, DestroyRef, Directive } from '@angular/core
|
|
|
10
10
|
* ```
|
|
11
11
|
*/
|
|
12
12
|
class NgxsmkClickOutside {
|
|
13
|
-
host = inject(ElementRef);
|
|
14
|
-
ngxsmkClickOutside = output();
|
|
15
13
|
constructor() {
|
|
14
|
+
this.host = inject(ElementRef);
|
|
15
|
+
this.ngxsmkClickOutside = output();
|
|
16
16
|
const document = inject(DOCUMENT);
|
|
17
17
|
const destroyRef = inject(DestroyRef);
|
|
18
18
|
const onPointerDown = (event) => {
|
|
@@ -26,16 +26,16 @@ class NgxsmkClickOutside {
|
|
|
26
26
|
document.addEventListener('pointerdown', onPointerDown, true);
|
|
27
27
|
destroyRef.onDestroy(() => document.removeEventListener('pointerdown', onPointerDown, true));
|
|
28
28
|
}
|
|
29
|
-
static
|
|
30
|
-
static
|
|
29
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkClickOutside, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
30
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.0", type: NgxsmkClickOutside, isStandalone: true, selector: "[ngxsmkClickOutside]", outputs: { ngxsmkClickOutside: "ngxsmkClickOutside" }, ngImport: i0 }); }
|
|
31
31
|
}
|
|
32
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
32
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkClickOutside, decorators: [{
|
|
33
33
|
type: Directive,
|
|
34
34
|
args: [{
|
|
35
35
|
standalone: true,
|
|
36
36
|
selector: '[ngxsmkClickOutside]',
|
|
37
37
|
}]
|
|
38
|
-
}], ctorParameters: () => []
|
|
38
|
+
}], ctorParameters: () => [] });
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
41
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxsmk-cdk-click-outside.mjs","sources":["../../../../packages/cdk/click-outside/click-outside.ts","../../../../packages/cdk/click-outside/ngxsmk-cdk-click-outside.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport {
|
|
1
|
+
{"version":3,"file":"ngxsmk-cdk-click-outside.mjs","sources":["../../../../packages/cdk/click-outside/click-outside.ts","../../../../packages/cdk/click-outside/ngxsmk-cdk-click-outside.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport { DestroyRef, Directive, ElementRef, inject, output } from '@angular/core';\n\n/**\n * Emits when a pointer press lands outside the host element.\n *\n * ```html\n * <div class=\"menu\" (ngxsmkClickOutside)=\"close()\">…</div>\n * ```\n */\n@Directive({\n standalone: true,\n selector: '[ngxsmkClickOutside]',\n})\nexport class NgxsmkClickOutside {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n readonly ngxsmkClickOutside = output<Event>();\n\n constructor() {\n const document = inject(DOCUMENT);\n const destroyRef = inject(DestroyRef);\n\n const onPointerDown = (event: Event) => {\n const target = event.target as Node | null;\n if (target && !this.host.nativeElement.contains(target)) {\n this.ngxsmkClickOutside.emit(event);\n }\n };\n\n // Capture phase so stopped propagation inside other widgets can't\n // swallow the outside press.\n document.addEventListener('pointerdown', onPointerDown, true);\n destroyRef.onDestroy(() => document.removeEventListener('pointerdown', onPointerDown, true));\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAGA;;;;;;AAMG;MAKU,kBAAkB,CAAA;AAK7B,IAAA,WAAA,GAAA;AAJiB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;QAE1D,IAAA,CAAA,kBAAkB,GAAG,MAAM,EAAS;AAG3C,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACjC,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAErC,QAAA,MAAM,aAAa,GAAG,CAAC,KAAY,KAAI;AACrC,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,YAAA,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACvD,gBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC;YACrC;AACF,QAAA,CAAC;;;QAID,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC;AAC7D,QAAA,UAAU,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IAC9F;8GApBW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,OAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAJ9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,sBAAsB;AACjC,iBAAA;;;ACbD;;AAEG;;;;"}
|
|
@@ -9,13 +9,17 @@ import { getFocusable } from '@ngxsmk/cdk/focusable';
|
|
|
9
9
|
* restores the previously focused element on destroy.
|
|
10
10
|
*/
|
|
11
11
|
class NgxsmkFocusTrap {
|
|
12
|
-
host = inject(ElementRef);
|
|
13
|
-
document = inject(DOCUMENT);
|
|
14
|
-
/** Set to `false` to disable the trap without removing the directive. */
|
|
15
|
-
ngxsmkFocusTrap = input(true, { ...(ngDevMode ? { debugName: "ngxsmkFocusTrap" } : /* istanbul ignore next */ {}), transform: (v) => v === '' || v === true || v === 'true' });
|
|
16
|
-
/** Focus the first focusable child on init; restore focus on destroy. */
|
|
17
|
-
ngxsmkFocusTrapAutoCapture = input(false, { ...(ngDevMode ? { debugName: "ngxsmkFocusTrapAutoCapture" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
18
12
|
constructor() {
|
|
13
|
+
this.host = inject(ElementRef);
|
|
14
|
+
this.document = inject(DOCUMENT);
|
|
15
|
+
/** Set to `false` to disable the trap without removing the directive. */
|
|
16
|
+
this.ngxsmkFocusTrap = input(true, {
|
|
17
|
+
transform: (v) => v === '' || v === true || v === 'true',
|
|
18
|
+
});
|
|
19
|
+
/** Focus the first focusable child on init; restore focus on destroy. */
|
|
20
|
+
this.ngxsmkFocusTrapAutoCapture = input(false, {
|
|
21
|
+
transform: booleanAttribute,
|
|
22
|
+
});
|
|
19
23
|
const previouslyFocused = this.document.activeElement;
|
|
20
24
|
afterNextRender(() => {
|
|
21
25
|
if (this.ngxsmkFocusTrapAutoCapture()) {
|
|
@@ -50,10 +54,10 @@ class NgxsmkFocusTrap {
|
|
|
50
54
|
first.focus();
|
|
51
55
|
}
|
|
52
56
|
}
|
|
53
|
-
static
|
|
54
|
-
static
|
|
57
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkFocusTrap, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
58
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "17.3.0", type: NgxsmkFocusTrap, isStandalone: true, selector: "[ngxsmkFocusTrap]", inputs: { ngxsmkFocusTrap: { classPropertyName: "ngxsmkFocusTrap", publicName: "ngxsmkFocusTrap", isSignal: true, isRequired: false, transformFunction: null }, ngxsmkFocusTrapAutoCapture: { classPropertyName: "ngxsmkFocusTrapAutoCapture", publicName: "ngxsmkFocusTrapAutoCapture", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "keydown": "onKeydown($event)" } }, ngImport: i0 }); }
|
|
55
59
|
}
|
|
56
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
60
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkFocusTrap, decorators: [{
|
|
57
61
|
type: Directive,
|
|
58
62
|
args: [{
|
|
59
63
|
standalone: true,
|
|
@@ -62,7 +66,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
|
|
|
62
66
|
'(keydown)': 'onKeydown($event)',
|
|
63
67
|
},
|
|
64
68
|
}]
|
|
65
|
-
}], ctorParameters: () => []
|
|
69
|
+
}], ctorParameters: () => [] });
|
|
66
70
|
|
|
67
71
|
/**
|
|
68
72
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxsmk-cdk-focus-trap.mjs","sources":["../../../../packages/cdk/focus-trap/focus-trap.ts","../../../../packages/cdk/focus-trap/ngxsmk-cdk-focus-trap.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport {\n DestroyRef,\n Directive,\n ElementRef,\n afterNextRender,\n booleanAttribute,\n inject,\n input,\n} from '@angular/core';\nimport { getFocusable } from '@ngxsmk/cdk/focusable';\n\n/**\n * Traps Tab/Shift+Tab focus cycling inside the host element while active.\n * With `ngxsmkFocusTrapAutoCapture`, moves focus into the trap on init and\n * restores the previously focused element on destroy.\n */\n@Directive({\n standalone: true,\n selector: '[ngxsmkFocusTrap]',\n host: {\n '(keydown)': 'onKeydown($event)',\n },\n})\nexport class NgxsmkFocusTrap {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n\n /** Set to `false` to disable the trap without removing the directive. */\n readonly ngxsmkFocusTrap = input(true, {\n transform: (v: unknown) => v === '' || v === true || v === 'true',\n });\n\n /** Focus the first focusable child on init; restore focus on destroy. */\n readonly ngxsmkFocusTrapAutoCapture = input(false, {\n transform: booleanAttribute,\n });\n\n constructor() {\n const previouslyFocused = this.document.activeElement as HTMLElement | null;\n\n afterNextRender(() => {\n if (this.ngxsmkFocusTrapAutoCapture()) {\n const focusable = getFocusable(this.host.nativeElement);\n (focusable[0] ?? this.host.nativeElement).focus();\n }\n });\n\n inject(DestroyRef).onDestroy(() => {\n if (this.ngxsmkFocusTrapAutoCapture()) {\n previouslyFocused?.focus?.();\n }\n });\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Tab' || !this.ngxsmkFocusTrap()) {\n return;\n }\n const focusable = getFocusable(this.host.nativeElement);\n if (focusable.length === 0) {\n event.preventDefault();\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n const active = this.document.activeElement;\n\n if (event.shiftKey && (active === first || active === this.host.nativeElement)) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAYA;;;;AAIG;MAQU,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"ngxsmk-cdk-focus-trap.mjs","sources":["../../../../packages/cdk/focus-trap/focus-trap.ts","../../../../packages/cdk/focus-trap/ngxsmk-cdk-focus-trap.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport {\n DestroyRef,\n Directive,\n ElementRef,\n afterNextRender,\n booleanAttribute,\n inject,\n input,\n} from '@angular/core';\nimport { getFocusable } from '@ngxsmk/cdk/focusable';\n\n/**\n * Traps Tab/Shift+Tab focus cycling inside the host element while active.\n * With `ngxsmkFocusTrapAutoCapture`, moves focus into the trap on init and\n * restores the previously focused element on destroy.\n */\n@Directive({\n standalone: true,\n selector: '[ngxsmkFocusTrap]',\n host: {\n '(keydown)': 'onKeydown($event)',\n },\n})\nexport class NgxsmkFocusTrap {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n\n /** Set to `false` to disable the trap without removing the directive. */\n readonly ngxsmkFocusTrap = input(true, {\n transform: (v: unknown) => v === '' || v === true || v === 'true',\n });\n\n /** Focus the first focusable child on init; restore focus on destroy. */\n readonly ngxsmkFocusTrapAutoCapture = input(false, {\n transform: booleanAttribute,\n });\n\n constructor() {\n const previouslyFocused = this.document.activeElement as HTMLElement | null;\n\n afterNextRender(() => {\n if (this.ngxsmkFocusTrapAutoCapture()) {\n const focusable = getFocusable(this.host.nativeElement);\n (focusable[0] ?? this.host.nativeElement).focus();\n }\n });\n\n inject(DestroyRef).onDestroy(() => {\n if (this.ngxsmkFocusTrapAutoCapture()) {\n previouslyFocused?.focus?.();\n }\n });\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Tab' || !this.ngxsmkFocusTrap()) {\n return;\n }\n const focusable = getFocusable(this.host.nativeElement);\n if (focusable.length === 0) {\n event.preventDefault();\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n const active = this.document.activeElement;\n\n if (event.shiftKey && (active === first || active === this.host.nativeElement)) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAYA;;;;AAIG;MAQU,eAAe,CAAA;AAc1B,IAAA,WAAA,GAAA;AAbiB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;AAClD,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;AAGnC,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE;AACrC,YAAA,SAAS,EAAE,CAAC,CAAU,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,MAAM;AAClE,SAAA,CAAC;;AAGO,QAAA,IAAA,CAAA,0BAA0B,GAAG,KAAK,CAAC,KAAK,EAAE;AACjD,YAAA,SAAS,EAAE,gBAAgB;AAC5B,SAAA,CAAC;AAGA,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAmC;QAE3E,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,IAAI,CAAC,0BAA0B,EAAE,EAAE;gBACrC,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;AACvD,gBAAA,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE;YACnD;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAK;AAChC,YAAA,IAAI,IAAI,CAAC,0BAA0B,EAAE,EAAE;AACrC,gBAAA,iBAAiB,EAAE,KAAK,IAAI;YAC9B;AACF,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,SAAS,CAAC,KAAoB,EAAA;AACtC,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;YAClD;QACF;QACA,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;AACvD,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YAC1B,KAAK,CAAC,cAAc,EAAE;YACtB;QACF;AAEA,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa;AAE1C,QAAA,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;YAC9E,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,KAAK,EAAE;QACd;aAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE;YAC7C,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,KAAK,EAAE;QACf;IACF;8GApDW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,0BAAA,EAAA,EAAA,iBAAA,EAAA,4BAAA,EAAA,UAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,IAAI,EAAE;AACJ,wBAAA,WAAW,EAAE,mBAAmB;AACjC,qBAAA;AACF,iBAAA;;;ACvBD;;AAEG;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxsmk-cdk-focusable.mjs","sources":["../../../../packages/cdk/focusable/focusable.ts","../../../../packages/cdk/focusable/ngxsmk-cdk-focusable.ts"],"sourcesContent":["/** Selector matching elements that can receive keyboard focus. */\nexport const FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n].join(', ');\n\n/** All keyboard-focusable elements inside `container`, in DOM order. */\nexport function getFocusable(container: HTMLElement): HTMLElement[] {\n return Array.from(
|
|
1
|
+
{"version":3,"file":"ngxsmk-cdk-focusable.mjs","sources":["../../../../packages/cdk/focusable/focusable.ts","../../../../packages/cdk/focusable/ngxsmk-cdk-focusable.ts"],"sourcesContent":["/** Selector matching elements that can receive keyboard focus. */\nexport const FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n].join(', ');\n\n/** All keyboard-focusable elements inside `container`, in DOM order. */\nexport function getFocusable(container: HTMLElement): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\n (el) => el.offsetParent !== null || el === el.ownerDocument.activeElement,\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA;AACO,MAAM,kBAAkB,GAAG;IAChC,SAAS;IACT,wBAAwB;IACxB,4CAA4C;IAC5C,wBAAwB;IACxB,0BAA0B;IAC1B,iCAAiC;IACjC,0BAA0B;AAC3B,CAAA,CAAC,IAAI,CAAC,IAAI;AAEX;AACM,SAAU,YAAY,CAAC,SAAsB,EAAA;AACjD,IAAA,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAc,kBAAkB,CAAC,CAAC,CAAC,MAAM,CACnF,CAAC,EAAE,KAAK,EAAE,CAAC,YAAY,KAAK,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC,aAAa,CAAC,aAAa,CAC1E;AACH;;AChBA;;AAEG;;;;"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, ElementRef, DestroyRef, input, output, effect, Directive } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Monitors the visibility of an element relative to the viewport or a parent container.
|
|
6
|
+
*
|
|
7
|
+
* ```html
|
|
8
|
+
* <div [ngxsmkIntersectionObserver] (intersecting)="onIntersect($event)">…</div>
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
class NgxsmkIntersectionObserver {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.elementRef = inject(ElementRef);
|
|
14
|
+
this.destroyRef = inject(DestroyRef);
|
|
15
|
+
this.rootMargin = input('0px');
|
|
16
|
+
this.threshold = input(0);
|
|
17
|
+
this.intersecting = output();
|
|
18
|
+
this.intersection = output();
|
|
19
|
+
this.observer = null;
|
|
20
|
+
if (typeof window === 'undefined' || !('IntersectionObserver' in window)) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
effect(() => {
|
|
24
|
+
this.cleanup();
|
|
25
|
+
const options = {
|
|
26
|
+
rootMargin: this.rootMargin(),
|
|
27
|
+
threshold: this.threshold(),
|
|
28
|
+
};
|
|
29
|
+
this.observer = new IntersectionObserver((entries) => {
|
|
30
|
+
for (const entry of entries) {
|
|
31
|
+
this.intersecting.emit(entry.isIntersecting);
|
|
32
|
+
this.intersection.emit(entry);
|
|
33
|
+
}
|
|
34
|
+
}, options);
|
|
35
|
+
this.observer.observe(this.elementRef.nativeElement);
|
|
36
|
+
});
|
|
37
|
+
this.destroyRef.onDestroy(() => {
|
|
38
|
+
this.cleanup();
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
cleanup() {
|
|
42
|
+
if (this.observer) {
|
|
43
|
+
this.observer.disconnect();
|
|
44
|
+
this.observer = null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkIntersectionObserver, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
48
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "17.3.0", type: NgxsmkIntersectionObserver, isStandalone: true, selector: "[ngxsmkIntersectionObserver]", inputs: { rootMargin: { classPropertyName: "rootMargin", publicName: "rootMargin", isSignal: true, isRequired: false, transformFunction: null }, threshold: { classPropertyName: "threshold", publicName: "threshold", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { intersecting: "intersecting", intersection: "intersection" }, ngImport: i0 }); }
|
|
49
|
+
}
|
|
50
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkIntersectionObserver, decorators: [{
|
|
51
|
+
type: Directive,
|
|
52
|
+
args: [{
|
|
53
|
+
standalone: true,
|
|
54
|
+
selector: '[ngxsmkIntersectionObserver]',
|
|
55
|
+
}]
|
|
56
|
+
}], ctorParameters: () => [] });
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Generated bundle index. Do not edit.
|
|
60
|
+
*/
|
|
61
|
+
|
|
62
|
+
export { NgxsmkIntersectionObserver };
|
|
63
|
+
//# sourceMappingURL=ngxsmk-cdk-intersection-observer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngxsmk-cdk-intersection-observer.mjs","sources":["../../../../packages/cdk/intersection-observer/intersection-observer.ts","../../../../packages/cdk/intersection-observer/ngxsmk-cdk-intersection-observer.ts"],"sourcesContent":["import { DestroyRef, Directive, ElementRef, inject, input, output, effect } from '@angular/core';\n\n/**\n * Monitors the visibility of an element relative to the viewport or a parent container.\n *\n * ```html\n * <div [ngxsmkIntersectionObserver] (intersecting)=\"onIntersect($event)\">…</div>\n * ```\n */\n@Directive({\n standalone: true,\n selector: '[ngxsmkIntersectionObserver]',\n})\nexport class NgxsmkIntersectionObserver {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly rootMargin = input<string>('0px');\n readonly threshold = input<number | number[]>(0);\n\n readonly intersecting = output<boolean>();\n readonly intersection = output<IntersectionObserverEntry>();\n\n private observer: IntersectionObserver | null = null;\n\n constructor() {\n if (typeof window === 'undefined' || !('IntersectionObserver' in window)) {\n return;\n }\n\n effect(() => {\n this.cleanup();\n\n const options = {\n rootMargin: this.rootMargin(),\n threshold: this.threshold(),\n };\n\n this.observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n this.intersecting.emit(entry.isIntersecting);\n this.intersection.emit(entry);\n }\n }, options);\n\n this.observer.observe(this.elementRef.nativeElement);\n });\n\n this.destroyRef.onDestroy(() => {\n this.cleanup();\n });\n }\n\n private cleanup(): void {\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAEA;;;;;;AAMG;MAKU,0BAA0B,CAAA;AAYrC,IAAA,WAAA,GAAA;AAXiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC;AACxD,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEvC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAS,KAAK,CAAC;AACjC,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAoB,CAAC,CAAC;QAEvC,IAAA,CAAA,YAAY,GAAG,MAAM,EAAW;QAChC,IAAA,CAAA,YAAY,GAAG,MAAM,EAA6B;QAEnD,IAAA,CAAA,QAAQ,GAAgC,IAAI;AAGlD,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,EAAE,sBAAsB,IAAI,MAAM,CAAC,EAAE;YACxE;QACF;QAEA,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,OAAO,EAAE;AAEd,YAAA,MAAM,OAAO,GAAG;AACd,gBAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,gBAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;aAC5B;YAED,IAAI,CAAC,QAAQ,GAAG,IAAI,oBAAoB,CAAC,CAAC,OAAO,KAAI;AACnD,gBAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;oBAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;AAC5C,oBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC/B;YACF,CAAC,EAAE,OAAO,CAAC;YAEX,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AACtD,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;YAC7B,IAAI,CAAC,OAAO,EAAE;AAChB,QAAA,CAAC,CAAC;IACJ;IAEQ,OAAO,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;AAC1B,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QACtB;IACF;8GA7CW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAJtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,8BAA8B;AACzC,iBAAA;;;ACZD;;AAEG;;;;"}
|
|
@@ -7,9 +7,11 @@ import { DOCUMENT } from '@angular/common';
|
|
|
7
7
|
* `aria-live` region appended to the document body.
|
|
8
8
|
*/
|
|
9
9
|
class NgxsmkLiveAnnouncer {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
constructor() {
|
|
11
|
+
this.document = inject(DOCUMENT);
|
|
12
|
+
this.region = null;
|
|
13
|
+
this.clearTimer = null;
|
|
14
|
+
}
|
|
13
15
|
announce(message, politeness = 'polite') {
|
|
14
16
|
const region = this.ensureRegion();
|
|
15
17
|
region.setAttribute('aria-live', politeness);
|
|
@@ -48,10 +50,10 @@ class NgxsmkLiveAnnouncer {
|
|
|
48
50
|
}
|
|
49
51
|
return this.region;
|
|
50
52
|
}
|
|
51
|
-
static
|
|
52
|
-
static
|
|
53
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkLiveAnnouncer, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
54
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkLiveAnnouncer, providedIn: 'root' }); }
|
|
53
55
|
}
|
|
54
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
56
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkLiveAnnouncer, decorators: [{
|
|
55
57
|
type: Injectable,
|
|
56
58
|
args: [{ providedIn: 'root' }]
|
|
57
59
|
}] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxsmk-cdk-live-announcer.mjs","sources":["../../../../packages/cdk/live-announcer/live-announcer.ts","../../../../packages/cdk/live-announcer/ngxsmk-cdk-live-announcer.ts"],"sourcesContent":["import { Injectable, OnDestroy, inject } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\nexport type AnnouncerPoliteness = 'polite' | 'assertive';\n\n/**\n * Announces messages to screen readers through a visually hidden\n * `aria-live` region appended to the document body.\n */\n@Injectable({ providedIn: 'root' })\nexport class NgxsmkLiveAnnouncer implements OnDestroy {\n private readonly document = inject(DOCUMENT);\n private region: HTMLElement | null = null;\n private clearTimer: ReturnType<typeof setTimeout> | null = null;\n\n announce(message: string, politeness: AnnouncerPoliteness = 'polite'): void {\n const region = this.ensureRegion();\n region.setAttribute('aria-live', politeness);\n\n // Clear first so repeating the same message is re-announced.\n region.textContent = '';\n setTimeout(() => (region.textContent = message));\n\n if (this.clearTimer) {\n clearTimeout(this.clearTimer);\n }\n this.clearTimer = setTimeout(() => (region.textContent = ''), 10_000);\n }\n\n ngOnDestroy(): void {\n if (this.clearTimer) {\n clearTimeout(this.clearTimer);\n }\n this.region?.remove();\n }\n\n private ensureRegion(): HTMLElement {\n if (!this.region) {\n const region = this.document.createElement('div');\n region.setAttribute('aria-atomic', 'true');\n region.className = 'ngxsmk-live-announcer';\n Object.assign(region.style, {\n position: 'absolute',\n width: '1px',\n height: '1px',\n margin: '-1px',\n padding: '0',\n border: '0',\n overflow: 'hidden',\n clipPath: 'inset(100%)',\n whiteSpace: 'nowrap',\n });\n this.document.body.appendChild(region);\n this.region = region;\n }\n return this.region;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAKA;;;AAGG;MAEU,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"ngxsmk-cdk-live-announcer.mjs","sources":["../../../../packages/cdk/live-announcer/live-announcer.ts","../../../../packages/cdk/live-announcer/ngxsmk-cdk-live-announcer.ts"],"sourcesContent":["import { Injectable, OnDestroy, inject } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\nexport type AnnouncerPoliteness = 'polite' | 'assertive';\n\n/**\n * Announces messages to screen readers through a visually hidden\n * `aria-live` region appended to the document body.\n */\n@Injectable({ providedIn: 'root' })\nexport class NgxsmkLiveAnnouncer implements OnDestroy {\n private readonly document = inject(DOCUMENT);\n private region: HTMLElement | null = null;\n private clearTimer: ReturnType<typeof setTimeout> | null = null;\n\n announce(message: string, politeness: AnnouncerPoliteness = 'polite'): void {\n const region = this.ensureRegion();\n region.setAttribute('aria-live', politeness);\n\n // Clear first so repeating the same message is re-announced.\n region.textContent = '';\n setTimeout(() => (region.textContent = message));\n\n if (this.clearTimer) {\n clearTimeout(this.clearTimer);\n }\n this.clearTimer = setTimeout(() => (region.textContent = ''), 10_000);\n }\n\n ngOnDestroy(): void {\n if (this.clearTimer) {\n clearTimeout(this.clearTimer);\n }\n this.region?.remove();\n }\n\n private ensureRegion(): HTMLElement {\n if (!this.region) {\n const region = this.document.createElement('div');\n region.setAttribute('aria-atomic', 'true');\n region.className = 'ngxsmk-live-announcer';\n Object.assign(region.style, {\n position: 'absolute',\n width: '1px',\n height: '1px',\n margin: '-1px',\n padding: '0',\n border: '0',\n overflow: 'hidden',\n clipPath: 'inset(100%)',\n whiteSpace: 'nowrap',\n });\n this.document.body.appendChild(region);\n this.region = region;\n }\n return this.region;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAKA;;;AAGG;MAEU,mBAAmB,CAAA;AADhC,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACpC,IAAA,CAAA,MAAM,GAAuB,IAAI;QACjC,IAAA,CAAA,UAAU,GAAyC,IAAI;AA4ChE,IAAA;AA1CC,IAAA,QAAQ,CAAC,OAAe,EAAE,UAAA,GAAkC,QAAQ,EAAA;AAClE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;AAClC,QAAA,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC;;AAG5C,QAAA,MAAM,CAAC,WAAW,GAAG,EAAE;AACvB,QAAA,UAAU,CAAC,OAAO,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,CAAC;AAEhD,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QAC/B;AACA,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,WAAW,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC;IACvE;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QAC/B;AACA,QAAA,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE;IACvB;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACjD,YAAA,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;AAC1C,YAAA,MAAM,CAAC,SAAS,GAAG,uBAAuB;AAC1C,YAAA,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;AAC1B,gBAAA,QAAQ,EAAE,UAAU;AACpB,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,MAAM,EAAE,KAAK;AACb,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,OAAO,EAAE,GAAG;AACZ,gBAAA,MAAM,EAAE,GAAG;AACX,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,QAAQ,EAAE,aAAa;AACvB,gBAAA,UAAU,EAAE,QAAQ;AACrB,aAAA,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;AACtC,YAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACtB;QACA,OAAO,IAAI,CAAC,MAAM;IACpB;8GA9CW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cADN,MAAM,EAAA,CAAA,CAAA;;2FACnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACTlC;;AAEG;;;;"}
|
|
@@ -10,8 +10,7 @@ import { inject, signal, DestroyRef } from '@angular/core';
|
|
|
10
10
|
*/
|
|
11
11
|
function injectMediaQuery(query) {
|
|
12
12
|
const window = inject(DOCUMENT).defaultView;
|
|
13
|
-
const matches = signal(false
|
|
14
|
-
...(ngDevMode ? [{ debugName: "matches" }] : /* istanbul ignore next */ []));
|
|
13
|
+
const matches = signal(false);
|
|
15
14
|
const media = window?.matchMedia?.(query);
|
|
16
15
|
if (media) {
|
|
17
16
|
matches.set(media.matches);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxsmk-cdk-media-query.mjs","sources":["../../../../packages/cdk/media-query/media-query.ts","../../../../packages/cdk/media-query/ngxsmk-cdk-media-query.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport {
|
|
1
|
+
{"version":3,"file":"ngxsmk-cdk-media-query.mjs","sources":["../../../../packages/cdk/media-query/media-query.ts","../../../../packages/cdk/media-query/ngxsmk-cdk-media-query.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport { DestroyRef, Signal, inject, signal } from '@angular/core';\n\n/**\n * Reactive media query. Must be called in an injection context.\n *\n * ```ts\n * private readonly isMobile = injectMediaQuery('(max-width: 767px)');\n * ```\n */\nexport function injectMediaQuery(query: string): Signal<boolean> {\n const window = inject(DOCUMENT).defaultView;\n const matches = signal(false);\n\n const media = window?.matchMedia?.(query);\n if (media) {\n matches.set(media.matches);\n const listener = (event: MediaQueryListEvent) => matches.set(event.matches);\n media.addEventListener('change', listener);\n inject(DestroyRef).onDestroy(() => media.removeEventListener('change', listener));\n }\n\n return matches.asReadonly();\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAGA;;;;;;AAMG;AACG,SAAU,gBAAgB,CAAC,KAAa,EAAA;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW;AAC3C,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;IAE7B,MAAM,KAAK,GAAG,MAAM,EAAE,UAAU,GAAG,KAAK,CAAC;IACzC,IAAI,KAAK,EAAE;AACT,QAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;AAC1B,QAAA,MAAM,QAAQ,GAAG,CAAC,KAA0B,KAAK,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;AAC3E,QAAA,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC1C,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnF;AAEA,IAAA,OAAO,OAAO,CAAC,UAAU,EAAE;AAC7B;;ACvBA;;AAEG;;;;"}
|