ng-primitives 0.8.0 → 0.9.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/esm2022/interactions/focus-visible/focus-visible.directive.mjs +25 -18
- package/esm2022/utils/index.mjs +2 -2
- package/esm2022/utils/signals/async.mjs +18 -2
- package/fesm2022/ng-primitives-interactions.mjs +23 -17
- package/fesm2022/ng-primitives-interactions.mjs.map +1 -1
- package/fesm2022/ng-primitives-utils.mjs +18 -2
- package/fesm2022/ng-primitives-utils.mjs.map +1 -1
- package/generators.json +10 -0
- package/interactions/focus-visible/focus-visible.directive.d.ts +3 -2
- package/package.json +14 -14
- package/schematics/checkbox/compat.d.ts +2 -0
- package/schematics/checkbox/compat.js +13 -0
- package/schematics/checkbox/compat.js.map +1 -0
- package/schematics/checkbox/files/checkbox.component.__style__.template +1 -0
- package/schematics/checkbox/files/checkbox.component.html.template +1 -0
- package/schematics/checkbox/files/checkbox.component.ts.template +69 -0
- package/schematics/checkbox/generator.d.ts +11 -0
- package/schematics/checkbox/generator.js +48 -0
- package/schematics/checkbox/generator.js.map +1 -0
- package/schematics/checkbox/schema.d.ts +16 -0
- package/schematics/checkbox/schema.json +39 -0
- package/utils/index.d.ts +1 -1
- package/utils/signals/async.d.ts +10 -1
|
@@ -6,9 +6,10 @@
|
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*/
|
|
8
8
|
import { FocusMonitor } from '@angular/cdk/a11y';
|
|
9
|
-
import { Directive, ElementRef,
|
|
9
|
+
import { Directive, ElementRef, booleanAttribute, inject, input, output, signal, } from '@angular/core';
|
|
10
10
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
11
11
|
import { injectDisabled } from 'ng-primitives/internal';
|
|
12
|
+
import { onBooleanChange } from 'ng-primitives/utils';
|
|
12
13
|
import { NgpFocusVisibleToken } from './focus-visible.token';
|
|
13
14
|
import * as i0 from "@angular/core";
|
|
14
15
|
export class NgpFocusVisible {
|
|
@@ -42,10 +43,15 @@ export class NgpFocusVisible {
|
|
|
42
43
|
* Whether the element is currently focused.
|
|
43
44
|
*/
|
|
44
45
|
this.isFocused = signal(false);
|
|
46
|
+
// handle focus state
|
|
45
47
|
this.focusMonitor
|
|
46
48
|
.monitor(this.elementRef.nativeElement)
|
|
47
49
|
.pipe(takeUntilDestroyed())
|
|
48
|
-
.subscribe(origin =>
|
|
50
|
+
.subscribe(origin =>
|
|
51
|
+
// null indicates the element was blurred
|
|
52
|
+
origin === null ? this.onBlur() : this.onFocus(origin));
|
|
53
|
+
// if the component becomes disabled and it is focused, hide the focus
|
|
54
|
+
onBooleanChange(this.isDisabled, () => this.focus(false));
|
|
49
55
|
}
|
|
50
56
|
onFocus(origin) {
|
|
51
57
|
if (this.isDisabled() || this.isFocused()) {
|
|
@@ -53,26 +59,30 @@ export class NgpFocusVisible {
|
|
|
53
59
|
}
|
|
54
60
|
// for some elements the focus visible state should always appear on focus
|
|
55
61
|
if (this.alwaysShowFocus()) {
|
|
56
|
-
this.
|
|
57
|
-
this.focusChange.emit(true);
|
|
62
|
+
this.focus(true);
|
|
58
63
|
return;
|
|
59
64
|
}
|
|
60
65
|
// if the focus origin is keyboard, then the focus is visible
|
|
61
66
|
if (origin === 'keyboard') {
|
|
62
|
-
this.
|
|
63
|
-
this.focusChange.emit(true);
|
|
67
|
+
this.focus(true);
|
|
64
68
|
return;
|
|
65
69
|
}
|
|
66
70
|
}
|
|
67
|
-
/**
|
|
68
|
-
* Listen for blur events.
|
|
69
|
-
*/
|
|
70
71
|
onBlur() {
|
|
71
72
|
if (this.isDisabled() || !this.isFocused()) {
|
|
72
73
|
return;
|
|
73
74
|
}
|
|
74
|
-
this.
|
|
75
|
-
|
|
75
|
+
this.focus(false);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Trigger the focus signal along with the focusChange event.
|
|
79
|
+
*/
|
|
80
|
+
focus(value) {
|
|
81
|
+
if (this.isFocused() === value) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
this.isFocused.set(value);
|
|
85
|
+
this.focusChange.emit(value);
|
|
76
86
|
}
|
|
77
87
|
alwaysShowFocus() {
|
|
78
88
|
const nonTextInputTypes = [
|
|
@@ -103,7 +113,7 @@ export class NgpFocusVisible {
|
|
|
103
113
|
return false;
|
|
104
114
|
}
|
|
105
115
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpFocusVisible, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
106
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.1", type: NgpFocusVisible, isStandalone: true, selector: "[ngpFocusVisible]", inputs: { disabled: { classPropertyName: "disabled", publicName: "ngpFocusVisibleDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { focusChange: "ngpFocusVisible" }, host: {
|
|
116
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.1", type: NgpFocusVisible, isStandalone: true, selector: "[ngpFocusVisible]", inputs: { disabled: { classPropertyName: "disabled", publicName: "ngpFocusVisibleDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { focusChange: "ngpFocusVisible" }, host: { properties: { "attr.data-focus-visible": "isFocused()" } }, providers: [{ provide: NgpFocusVisibleToken, useExisting: NgpFocusVisible }], exportAs: ["ngpFocusVisible"], ngImport: i0 }); }
|
|
107
117
|
}
|
|
108
118
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpFocusVisible, decorators: [{
|
|
109
119
|
type: Directive,
|
|
@@ -113,11 +123,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImpor
|
|
|
113
123
|
exportAs: 'ngpFocusVisible',
|
|
114
124
|
providers: [{ provide: NgpFocusVisibleToken, useExisting: NgpFocusVisible }],
|
|
115
125
|
host: {
|
|
116
|
-
'[attr.data-focus-visible]': 'isFocused()
|
|
126
|
+
'[attr.data-focus-visible]': 'isFocused()',
|
|
117
127
|
},
|
|
118
128
|
}]
|
|
119
|
-
}], ctorParameters: () => []
|
|
120
|
-
|
|
121
|
-
args: ['blur']
|
|
122
|
-
}] } });
|
|
123
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXMtdmlzaWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1wcmltaXRpdmVzL2ludGVyYWN0aW9ucy9zcmMvZm9jdXMtdmlzaWJsZS9mb2N1cy12aXNpYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxPQUFPLEVBQUUsWUFBWSxFQUFlLE1BQU0sbUJBQW1CLENBQUM7QUFFOUQsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQVc3RCxNQUFNLE9BQU8sZUFBZTtJQW9DMUI7UUFuQ0E7O1dBRUc7UUFDYyxlQUFVLEdBQUcsTUFBTSxDQUEwQixVQUFVLENBQUMsQ0FBQztRQUUxRTs7V0FFRztRQUNjLGlCQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXJEOztXQUVHO1FBQ00sYUFBUSxHQUFHLEtBQUssQ0FBd0IsS0FBSyxFQUFFO1lBQ3RELEtBQUssRUFBRSx5QkFBeUI7WUFDaEMsU0FBUyxFQUFFLGdCQUFnQjtTQUM1QixDQUFDLENBQUM7UUFFSDs7V0FFRztRQUNjLGVBQVUsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTVEOztXQUVHO1FBQ00sZ0JBQVcsR0FBRyxNQUFNLENBQVU7WUFDckMsS0FBSyxFQUFFLGlCQUFpQjtTQUN6QixDQUFDLENBQUM7UUFFSDs7V0FFRztR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RUFBRSw4QkFBOEI7cUJBQzVEO2lCQUNGO3dEQW9FVyxNQUFNO3NCQURmLFlBQVk7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IMKpIDIwMjQgQW5ndWxhciBQcmltaXRpdmVzLlxuICogaHR0cHM6Ly9naXRodWIuY29tL25nLXByaW1pdGl2ZXMvbmctcHJpbWl0aXZlc1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSAyLjAgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuaW1wb3J0IHsgRm9jdXNNb25pdG9yLCBGb2N1c09yaWdpbiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgaW5qZWN0RGlzYWJsZWQgfSBmcm9tICduZy1wcmltaXRpdmVzL2ludGVybmFsJztcbmltcG9ydCB7IE5ncEZvY3VzVmlzaWJsZVRva2VuIH0gZnJvbSAnLi9mb2N1cy12aXNpYmxlLnRva2VuJztcblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnW25ncEZvY3VzVmlzaWJsZV0nLFxuICBleHBvcnRBczogJ25ncEZvY3VzVmlzaWJsZScsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTmdwRm9jdXNWaXNpYmxlVG9rZW4sIHVzZUV4aXN0aW5nOiBOZ3BGb2N1c1Zpc2libGUgfV0sXG4gIGhvc3Q6IHtcbiAgICAnW2F0dHIuZGF0YS1mb2N1cy12aXNpYmxlXSc6ICdpc0ZvY3VzZWQoKSAmJiAhaXNEaXNhYmxlZCgpJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgTmdwRm9jdXNWaXNpYmxlIHtcbiAgLyoqXG4gICAqIEFjY2VzcyB0aGUgZWxlbWVudCB0aGF0IHRoZSBkaXJlY3RpdmUgaXMgYXBwbGllZCB0by5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZiA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG5cbiAgLyoqXG4gICAqIEFjY2VzcyB0aGUgZm9jdXMgbW9uaXRvci5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZm9jdXNNb25pdG9yID0gaW5qZWN0KEZvY3VzTW9uaXRvcik7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZm9jdXMgZXZlbnRzIGFyZSBsaXN0ZW5lZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IGRpc2FibGVkID0gaW5wdXQ8Ym9vbGVhbiwgQm9vbGVhbklucHV0PihmYWxzZSwge1xuICAgIGFsaWFzOiAnbmdwRm9jdXNWaXNpYmxlRGlzYWJsZWQnLFxuICAgIHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEFjY2VzcyB0aGUgZGlzYWJsZWQgc3RhdGUgZnJvbSBhbnkgcGFyZW50LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpc0Rpc2FibGVkID0gaW5qZWN0RGlzYWJsZWQodGhpcy5kaXNhYmxlZCk7XG5cbiAgLyoqXG4gICAqIEVtaXQgd2hlbiB0aGUgZWxlbWVudCBpcyB2aXN1YWxseSBmb2N1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9jdXNDaGFuZ2UgPSBvdXRwdXQ8Ym9vbGVhbj4oe1xuICAgIGFsaWFzOiAnbmdwRm9jdXNWaXNpYmxlJyxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgY3VycmVudGx5IGZvY3VzZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNGb2N1c2VkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmZvY3VzTW9uaXRvclxuICAgICAgLm1vbml0b3IodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUob3JpZ2luID0+IHRoaXMub25Gb2N1cyhvcmlnaW4pKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Gb2N1cyhvcmlnaW46IEZvY3VzT3JpZ2luKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCgpIHx8IHRoaXMuaXNGb2N1c2VkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBmb3Igc29tZSBlbGVtZW50cyB0aGUgZm9jdXMgdmlzaWJsZSBzdGF0ZSBzaG91bGQgYWx3YXlzIGFwcGVhciBvbiBmb2N1c1xuICAgIGlmICh0aGlzLmFsd2F5c1Nob3dGb2N1cygpKSB7XG4gICAgICB0aGlzLmlzRm9jdXNlZC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmZvY3VzQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGZvY3VzIG9yaWdpbiBpcyBrZXlib2FyZCwgdGhlbiB0aGUgZm9jdXMgaXMgdmlzaWJsZVxuICAgIGlmIChvcmlnaW4gPT09ICdrZXlib2FyZCcpIHtcbiAgICAgIHRoaXMuaXNGb2N1c2VkLnNldCh0cnVlKTtcbiAgICAgIHRoaXMuZm9jdXNDaGFuZ2UuZW1pdCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIGZvciBibHVyIGV2ZW50cy5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInKVxuICBwcm90ZWN0ZWQgb25CbHVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQoKSB8fCAhdGhpcy5pc0ZvY3VzZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNGb2N1c2VkLnNldChmYWxzZSk7XG4gICAgdGhpcy5mb2N1c0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgYWx3YXlzU2hvd0ZvY3VzKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vblRleHRJbnB1dFR5cGVzID0gW1xuICAgICAgJ2NoZWNrYm94JyxcbiAgICAgICdyYWRpbycsXG4gICAgICAncmFuZ2UnLFxuICAgICAgJ2NvbG9yJyxcbiAgICAgICdmaWxlJyxcbiAgICAgICdpbWFnZScsXG4gICAgICAnYnV0dG9uJyxcbiAgICAgICdzdWJtaXQnLFxuICAgICAgJ3Jlc2V0JyxcbiAgICBdO1xuXG4gICAgLy8gaWYgdGhpcyBpcyBhbiBpbnB1dCBlbGVtZW50IGFuZCBpdCBpcyBhIHRleHQgaW5wdXRcbiAgICBpZiAoXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiZcbiAgICAgICFub25UZXh0SW5wdXRUeXBlcy5pbmNsdWRlcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC50eXBlKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhpcyBpcyBhIHRleHRhcmVhXG4gICAgaWYgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhpcyBpcyBhbiBlbGVtZW50IHdpdGggY29udGVudGVkaXRhYmxlXG4gICAgaWYgKFxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUgfHxcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJylcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
|
|
129
|
+
}], ctorParameters: () => [] });
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXMtdmlzaWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1wcmltaXRpdmVzL2ludGVyYWN0aW9ucy9zcmMvZm9jdXMtdmlzaWJsZS9mb2N1cy12aXNpYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxPQUFPLEVBQUUsWUFBWSxFQUFlLE1BQU0sbUJBQW1CLENBQUM7QUFFOUQsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2hCLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQVc3RCxNQUFNLE9BQU8sZUFBZTtJQW9DMUI7UUFuQ0E7O1dBRUc7UUFDYyxlQUFVLEdBQUcsTUFBTSxDQUEwQixVQUFVLENBQUMsQ0FBQztRQUUxRTs7V0FFRztRQUNjLGlCQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXJEOztXQUVHO1FBQ00sYUFBUSxHQUFHLEtBQUssQ0FBd0IsS0FBSyxFQUFFO1lBQ3RELEtBQUssRUFBRSx5QkFBeUI7WUFDaEMsU0FBUyxFQUFFLGdCQUFnQjtTQUM1QixDQUFDLENBQUM7UUFFSDs7V0FFRztRQUNjLGVBQVUsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTVEOztXQUVHO1FBQ00sZ0JBQVcsR0FBRyxNQUFNLENBQVU7WUFDckMsS0FBSyxFQUFFLGlC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RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxDQUFDOzsyRkFLakUsZUFBZTtrQkFUM0IsU0FBUzttQkFBQztvQkFDVCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsU0FBUyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxpQkFBaUIsRUFBRSxDQUFDO29CQUM1RSxJQUFJLEVBQUU7d0JBQ0osMkJBQTJCLEVBQUUsYUFBYTtxQkFDM0M7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCDCqSAyMDI0IEFuZ3VsYXIgUHJpbWl0aXZlcy5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1wcmltaXRpdmVzL25nLXByaW1pdGl2ZXNcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbmltcG9ydCB7IEZvY3VzTW9uaXRvciwgRm9jdXNPcmlnaW4gfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBCb29sZWFuSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBib29sZWFuQXR0cmlidXRlLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBpbmplY3REaXNhYmxlZCB9IGZyb20gJ25nLXByaW1pdGl2ZXMvaW50ZXJuYWwnO1xuaW1wb3J0IHsgb25Cb29sZWFuQ2hhbmdlIH0gZnJvbSAnbmctcHJpbWl0aXZlcy91dGlscyc7XG5pbXBvcnQgeyBOZ3BGb2N1c1Zpc2libGVUb2tlbiB9IGZyb20gJy4vZm9jdXMtdmlzaWJsZS50b2tlbic7XG5cbkBEaXJlY3RpdmUoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ1tuZ3BGb2N1c1Zpc2libGVdJyxcbiAgZXhwb3J0QXM6ICduZ3BGb2N1c1Zpc2libGUnLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE5ncEZvY3VzVmlzaWJsZVRva2VuLCB1c2VFeGlzdGluZzogTmdwRm9jdXNWaXNpYmxlIH1dLFxuICBob3N0OiB7XG4gICAgJ1thdHRyLmRhdGEtZm9jdXMtdmlzaWJsZV0nOiAnaXNGb2N1c2VkKCknLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBOZ3BGb2N1c1Zpc2libGUge1xuICAvKipcbiAgICogQWNjZXNzIHRoZSBlbGVtZW50IHRoYXQgdGhlIGRpcmVjdGl2ZSBpcyBhcHBsaWVkIHRvLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcblxuICAvKipcbiAgICogQWNjZXNzIHRoZSBmb2N1cyBtb25pdG9yLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBmb2N1c01vbml0b3IgPSBpbmplY3QoRm9jdXNNb25pdG9yKTtcblxuICAvKipcbiAgICogV2hldGhlciBmb2N1cyBldmVudHMgYXJlIGxpc3RlbmVkIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZWQgPSBpbnB1dDxib29sZWFuLCBCb29sZWFuSW5wdXQ+KGZhbHNlLCB7XG4gICAgYWxpYXM6ICduZ3BGb2N1c1Zpc2libGVEaXNhYmxlZCcsXG4gICAgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLFxuICB9KTtcblxuICAvKipcbiAgICogQWNjZXNzIHRoZSBkaXNhYmxlZCBzdGF0ZSBmcm9tIGFueSBwYXJlbnQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGlzRGlzYWJsZWQgPSBpbmplY3REaXNhYmxlZCh0aGlzLmRpc2FibGVkKTtcblxuICAvKipcbiAgICogRW1pdCB3aGVuIHRoZSBlbGVtZW50IGlzIHZpc3VhbGx5IGZvY3VzZWQuXG4gICAqL1xuICByZWFkb25seSBmb2N1c0NoYW5nZSA9IG91dHB1dDxib29sZWFuPih7XG4gICAgYWxpYXM6ICduZ3BGb2N1c1Zpc2libGUnLFxuICB9KTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZWxlbWVudCBpcyBjdXJyZW50bHkgZm9jdXNlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBpc0ZvY3VzZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIGhhbmRsZSBmb2N1cyBzdGF0ZVxuICAgIHRoaXMuZm9jdXNNb25pdG9yXG4gICAgICAubW9uaXRvcih0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgLnN1YnNjcmliZShvcmlnaW4gPT5cbiAgICAgICAgLy8gbnVsbCBpbmRpY2F0ZXMgdGhlIGVsZW1lbnQgd2FzIGJsdXJyZWRcbiAgICAgICAgb3JpZ2luID09PSBudWxsID8gdGhpcy5vbkJsdXIoKSA6IHRoaXMub25Gb2N1cyhvcmlnaW4pLFxuICAgICAgKTtcblxuICAgIC8vIGlmIHRoZSBjb21wb25lbnQgYmVjb21lcyBkaXNhYmxlZCBhbmQgaXQgaXMgZm9jdXNlZCwgaGlkZSB0aGUgZm9jdXNcbiAgICBvbkJvb2xlYW5DaGFuZ2UodGhpcy5pc0Rpc2FibGVkLCAoKSA9PiB0aGlzLmZvY3VzKGZhbHNlKSk7XG4gIH1cblxuICBwcml2YXRlIG9uRm9jdXMob3JpZ2luOiBGb2N1c09yaWdpbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQoKSB8fCB0aGlzLmlzRm9jdXNlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZm9yIHNvbWUgZWxlbWVudHMgdGhlIGZvY3VzIHZpc2libGUgc3RhdGUgc2hvdWxkIGFsd2F5cyBhcHBlYXIgb24gZm9jdXNcbiAgICBpZiAodGhpcy5hbHdheXNTaG93Rm9jdXMoKSkge1xuICAgICAgdGhpcy5mb2N1cyh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgZm9jdXMgb3JpZ2luIGlzIGtleWJvYXJkLCB0aGVuIHRoZSBmb2N1cyBpcyB2aXNpYmxlXG4gICAgaWYgKG9yaWdpbiA9PT0gJ2tleWJvYXJkJykge1xuICAgICAgdGhpcy5mb2N1cyh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uQmx1cigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkKCkgfHwgIXRoaXMuaXNGb2N1c2VkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZvY3VzKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIHRoZSBmb2N1cyBzaWduYWwgYWxvbmcgd2l0aCB0aGUgZm9jdXNDaGFuZ2UgZXZlbnQuXG4gICAqL1xuICBwcml2YXRlIGZvY3VzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuaXNGb2N1c2VkKCkgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc0ZvY3VzZWQuc2V0KHZhbHVlKTtcbiAgICB0aGlzLmZvY3VzQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhbHdheXNTaG93Rm9jdXMoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgbm9uVGV4dElucHV0VHlwZXMgPSBbXG4gICAgICAnY2hlY2tib3gnLFxuICAgICAgJ3JhZGlvJyxcbiAgICAgICdyYW5nZScsXG4gICAgICAnY29sb3InLFxuICAgICAgJ2ZpbGUnLFxuICAgICAgJ2ltYWdlJyxcbiAgICAgICdidXR0b24nLFxuICAgICAgJ3N1Ym1pdCcsXG4gICAgICAncmVzZXQnLFxuICAgIF07XG5cbiAgICAvLyBpZiB0aGlzIGlzIGFuIGlucHV0IGVsZW1lbnQgYW5kIGl0IGlzIGEgdGV4dCBpbnB1dFxuICAgIGlmIChcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJlxuICAgICAgIW5vblRleHRJbnB1dFR5cGVzLmluY2x1ZGVzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnR5cGUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGlzIGlzIGEgdGV4dGFyZWFcbiAgICBpZiAodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGlzIGlzIGFuIGVsZW1lbnQgd2l0aCBjb250ZW50ZWRpdGFibGVcbiAgICBpZiAoXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSB8fFxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=
|
package/esm2022/utils/index.mjs
CHANGED
|
@@ -8,6 +8,6 @@
|
|
|
8
8
|
export { injectDisposables } from './helpers/disposables';
|
|
9
9
|
export { FocusManager } from './helpers/focus-manager';
|
|
10
10
|
export { uniqueId } from './helpers/unique-id';
|
|
11
|
-
export { onBooleanChange, onChange } from './signals/async';
|
|
11
|
+
export { onBooleanChange, onChange, onFormControlChange } from './signals/async';
|
|
12
12
|
export { injectDimensions } from './ui/dimensions';
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1wcmltaXRpdmVzL3V0aWxzL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCDCqSAyMDI0IEFuZ3VsYXIgUHJpbWl0aXZlcy5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1wcmltaXRpdmVzL25nLXByaW1pdGl2ZXNcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuZXhwb3J0IHsgaW5qZWN0RGlzcG9zYWJsZXMgfSBmcm9tICcuL2hlbHBlcnMvZGlzcG9zYWJsZXMnO1xuZXhwb3J0IHsgRm9jdXNNYW5hZ2VyIH0gZnJvbSAnLi9oZWxwZXJzL2ZvY3VzLW1hbmFnZXInO1xuZXhwb3J0IHsgdW5pcXVlSWQgfSBmcm9tICcuL2hlbHBlcnMvdW5pcXVlLWlkJztcbmV4cG9ydCB7IG9uQm9vbGVhbkNoYW5nZSwgb25DaGFuZ2UsIG9uRm9ybUNvbnRyb2xDaGFuZ2UgfSBmcm9tICcuL3NpZ25hbHMvYXN5bmMnO1xuZXhwb3J0IHsgaW5qZWN0RGltZW5zaW9ucyB9IGZyb20gJy4vdWkvZGltZW5zaW9ucyc7XG4iXX0=
|
|
@@ -34,6 +34,22 @@ export function onChange(source, fn, options) {
|
|
|
34
34
|
* @param options
|
|
35
35
|
*/
|
|
36
36
|
export function onBooleanChange(source, onTrue, onFalse, options) {
|
|
37
|
-
onChange(source, value => (value ? onTrue() : onFalse()), options);
|
|
37
|
+
onChange(source, value => (value ? onTrue?.() : onFalse?.()), options);
|
|
38
38
|
}
|
|
39
|
-
|
|
39
|
+
/**
|
|
40
|
+
* A utility to sync the value of a signal with the Angular Forms onChange callback.
|
|
41
|
+
* @param source The signal to sync with the onChange callback.
|
|
42
|
+
* @param fn The onChange callback.
|
|
43
|
+
* @param options The options for the effect.
|
|
44
|
+
*/
|
|
45
|
+
export function onFormControlChange(source, fn, options) {
|
|
46
|
+
const previousValue = signal(source());
|
|
47
|
+
effect(() => {
|
|
48
|
+
const value = source();
|
|
49
|
+
if (value !== previousValue() && value !== undefined && value !== null) {
|
|
50
|
+
fn?.(value);
|
|
51
|
+
previousValue.set(value);
|
|
52
|
+
}
|
|
53
|
+
}, { allowSignalWrites: true, injector: options?.injector });
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1wcmltaXRpdmVzL3V0aWxzL3NyYy9zaWduYWxzL2FzeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE9BQU8sRUFBb0IsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVqRTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FDdEIsTUFBb0MsRUFDcEMsRUFBOEUsRUFDOUUsT0FBZ0M7SUFFaEMsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFdkMsTUFBTSxDQUNKLEdBQUcsRUFBRTtRQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLElBQUksS0FBSyxLQUFLLGFBQWEsRUFBRSxFQUFFLENBQUM7WUFDOUIsRUFBRSxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQzNCLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUMsRUFDRCxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUN6RCxDQUFDO0lBRUYscUNBQXFDO0lBQ3JDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsTUFBdUIsRUFDdkIsTUFBbUIsRUFDbkIsT0FBb0IsRUFDcEIsT0FBZ0M7SUFFaEMsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxNQUFvQyxFQUNwQyxFQUF1QixFQUN2QixPQUFnQztJQUVoQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUV2QyxNQUFNLENBQ0osR0FBRyxFQUFFO1FBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFFdkIsSUFBSSxLQUFLLEtBQUssYUFBYSxFQUFFLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdkUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDWixhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDLEVBQ0QsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FDekQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCDCqSAyMDI0IEFuZ3VsYXIgUHJpbWl0aXZlcy5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1wcmltaXRpdmVzL25nLXByaW1pdGl2ZXNcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbmltcG9ydCB7IEluamVjdG9yLCBTaWduYWwsIGVmZmVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogTGlzdGVuIGZvciBjaGFuZ2VzIHRvIGEgc2lnbmFsIGFuZCBjYWxsIGEgZnVuY3Rpb24gd2hlbiB0aGUgc2lnbmFsIGNoYW5nZXMuXG4gKiBAcGFyYW0gc291cmNlXG4gKiBAcGFyYW0gZm5cbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gb3B0aW9ucy5pbmplY3RvclxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkNoYW5nZTxUPihcbiAgc291cmNlOiBTaWduYWw8VCB8IG51bGwgfCB1bmRlZmluZWQ+LFxuICBmbjogKHZhbHVlOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJldmlvdXNWYWx1ZTogVCB8IG51bGwgfCB1bmRlZmluZWQpID0+IHZvaWQsXG4gIG9wdGlvbnM/OiB7IGluamVjdG9yOiBJbmplY3RvciB9LFxuKTogdm9pZCB7XG4gIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBzaWduYWwoc291cmNlKCkpO1xuXG4gIGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZSgpO1xuICAgICAgaWYgKHZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKCkpIHtcbiAgICAgICAgZm4odmFsdWUsIHByZXZpb3VzVmFsdWUoKSk7XG4gICAgICAgIHByZXZpb3VzVmFsdWUuc2V0KHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUsIGluamVjdG9yOiBvcHRpb25zPy5pbmplY3RvciB9LFxuICApO1xuXG4gIC8vIGNhbGwgdGhlIGZuIHdpdGggdGhlIGluaXRpYWwgdmFsdWVcbiAgZm4oc291cmNlKCksIG51bGwpO1xufVxuXG4vKipcbiAqIExpc3RlbiBmb3IgY2hhbmdlcyB0byBhIGJvb2xlYW4gc2lnbmFsIGFuZCBjYWxsIG9uZSBvZiB0d28gZnVuY3Rpb25zIHdoZW4gdGhlIHNpZ25hbCBjaGFuZ2VzLlxuICogQHBhcmFtIHNvdXJjZVxuICogQHBhcmFtIG9uVHJ1ZVxuICogQHBhcmFtIG9uRmFsc2VcbiAqIEBwYXJhbSBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkJvb2xlYW5DaGFuZ2UoXG4gIHNvdXJjZTogU2lnbmFsPGJvb2xlYW4+LFxuICBvblRydWU/OiAoKSA9PiB2b2lkLFxuICBvbkZhbHNlPzogKCkgPT4gdm9pZCxcbiAgb3B0aW9ucz86IHsgaW5qZWN0b3I6IEluamVjdG9yIH0sXG4pOiB2b2lkIHtcbiAgb25DaGFuZ2Uoc291cmNlLCB2YWx1ZSA9PiAodmFsdWUgPyBvblRydWU/LigpIDogb25GYWxzZT8uKCkpLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBBIHV0aWxpdHkgdG8gc3luYyB0aGUgdmFsdWUgb2YgYSBzaWduYWwgd2l0aCB0aGUgQW5ndWxhciBGb3JtcyBvbkNoYW5nZSBjYWxsYmFjay5cbiAqIEBwYXJhbSBzb3VyY2UgVGhlIHNpZ25hbCB0byBzeW5jIHdpdGggdGhlIG9uQ2hhbmdlIGNhbGxiYWNrLlxuICogQHBhcmFtIGZuIFRoZSBvbkNoYW5nZSBjYWxsYmFjay5cbiAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIGZvciB0aGUgZWZmZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gb25Gb3JtQ29udHJvbENoYW5nZTxUPihcbiAgc291cmNlOiBTaWduYWw8VCB8IG51bGwgfCB1bmRlZmluZWQ+LFxuICBmbj86ICh2YWx1ZTogVCkgPT4gdm9pZCxcbiAgb3B0aW9ucz86IHsgaW5qZWN0b3I6IEluamVjdG9yIH0sXG4pOiB2b2lkIHtcbiAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHNpZ25hbChzb3VyY2UoKSk7XG5cbiAgZWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gc291cmNlKCk7XG5cbiAgICAgIGlmICh2YWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSgpICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgZm4/Lih2YWx1ZSk7XG4gICAgICAgIHByZXZpb3VzVmFsdWUuc2V0KHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUsIGluamVjdG9yOiBvcHRpb25zPy5pbmplY3RvciB9LFxuICApO1xufVxuIl19
|
|
@@ -2,7 +2,7 @@ import { DOCUMENT, isPlatformBrowser } from '@angular/common';
|
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { InjectionToken, inject, PLATFORM_ID, Injectable, input, booleanAttribute, signal, output, Directive, HostListener, ElementRef } from '@angular/core';
|
|
4
4
|
import { injectDisabled } from 'ng-primitives/internal';
|
|
5
|
-
import { onChange, injectDisposables } from 'ng-primitives/utils';
|
|
5
|
+
import { onChange, onBooleanChange, injectDisposables } from 'ng-primitives/utils';
|
|
6
6
|
import { FocusMonitor } from '@angular/cdk/a11y';
|
|
7
7
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
8
8
|
|
|
@@ -350,10 +350,15 @@ class NgpFocusVisible {
|
|
|
350
350
|
* Whether the element is currently focused.
|
|
351
351
|
*/
|
|
352
352
|
this.isFocused = signal(false);
|
|
353
|
+
// handle focus state
|
|
353
354
|
this.focusMonitor
|
|
354
355
|
.monitor(this.elementRef.nativeElement)
|
|
355
356
|
.pipe(takeUntilDestroyed())
|
|
356
|
-
.subscribe(origin =>
|
|
357
|
+
.subscribe(origin =>
|
|
358
|
+
// null indicates the element was blurred
|
|
359
|
+
origin === null ? this.onBlur() : this.onFocus(origin));
|
|
360
|
+
// if the component becomes disabled and it is focused, hide the focus
|
|
361
|
+
onBooleanChange(this.isDisabled, () => this.focus(false));
|
|
357
362
|
}
|
|
358
363
|
onFocus(origin) {
|
|
359
364
|
if (this.isDisabled() || this.isFocused()) {
|
|
@@ -361,26 +366,30 @@ class NgpFocusVisible {
|
|
|
361
366
|
}
|
|
362
367
|
// for some elements the focus visible state should always appear on focus
|
|
363
368
|
if (this.alwaysShowFocus()) {
|
|
364
|
-
this.
|
|
365
|
-
this.focusChange.emit(true);
|
|
369
|
+
this.focus(true);
|
|
366
370
|
return;
|
|
367
371
|
}
|
|
368
372
|
// if the focus origin is keyboard, then the focus is visible
|
|
369
373
|
if (origin === 'keyboard') {
|
|
370
|
-
this.
|
|
371
|
-
this.focusChange.emit(true);
|
|
374
|
+
this.focus(true);
|
|
372
375
|
return;
|
|
373
376
|
}
|
|
374
377
|
}
|
|
375
|
-
/**
|
|
376
|
-
* Listen for blur events.
|
|
377
|
-
*/
|
|
378
378
|
onBlur() {
|
|
379
379
|
if (this.isDisabled() || !this.isFocused()) {
|
|
380
380
|
return;
|
|
381
381
|
}
|
|
382
|
-
this.
|
|
383
|
-
|
|
382
|
+
this.focus(false);
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Trigger the focus signal along with the focusChange event.
|
|
386
|
+
*/
|
|
387
|
+
focus(value) {
|
|
388
|
+
if (this.isFocused() === value) {
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
this.isFocused.set(value);
|
|
392
|
+
this.focusChange.emit(value);
|
|
384
393
|
}
|
|
385
394
|
alwaysShowFocus() {
|
|
386
395
|
const nonTextInputTypes = [
|
|
@@ -411,7 +420,7 @@ class NgpFocusVisible {
|
|
|
411
420
|
return false;
|
|
412
421
|
}
|
|
413
422
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpFocusVisible, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
414
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.1", type: NgpFocusVisible, isStandalone: true, selector: "[ngpFocusVisible]", inputs: { disabled: { classPropertyName: "disabled", publicName: "ngpFocusVisibleDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { focusChange: "ngpFocusVisible" }, host: {
|
|
423
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.1", type: NgpFocusVisible, isStandalone: true, selector: "[ngpFocusVisible]", inputs: { disabled: { classPropertyName: "disabled", publicName: "ngpFocusVisibleDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { focusChange: "ngpFocusVisible" }, host: { properties: { "attr.data-focus-visible": "isFocused()" } }, providers: [{ provide: NgpFocusVisibleToken, useExisting: NgpFocusVisible }], exportAs: ["ngpFocusVisible"], ngImport: i0 }); }
|
|
415
424
|
}
|
|
416
425
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpFocusVisible, decorators: [{
|
|
417
426
|
type: Directive,
|
|
@@ -421,13 +430,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImpor
|
|
|
421
430
|
exportAs: 'ngpFocusVisible',
|
|
422
431
|
providers: [{ provide: NgpFocusVisibleToken, useExisting: NgpFocusVisible }],
|
|
423
432
|
host: {
|
|
424
|
-
'[attr.data-focus-visible]': 'isFocused()
|
|
433
|
+
'[attr.data-focus-visible]': 'isFocused()',
|
|
425
434
|
},
|
|
426
435
|
}]
|
|
427
|
-
}], ctorParameters: () => []
|
|
428
|
-
type: HostListener,
|
|
429
|
-
args: ['blur']
|
|
430
|
-
}] } });
|
|
436
|
+
}], ctorParameters: () => [] });
|
|
431
437
|
|
|
432
438
|
/**
|
|
433
439
|
* Copyright © 2024 Angular Primitives.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-primitives-interactions.mjs","sources":["../../../../packages/ng-primitives/interactions/src/hover/hover.token.ts","../../../../packages/ng-primitives/interactions/src/hover/hover.directive.ts","../../../../packages/ng-primitives/interactions/src/focus/focus.token.ts","../../../../packages/ng-primitives/interactions/src/focus/focus.directive.ts","../../../../packages/ng-primitives/interactions/src/focus-visible/focus-visible.token.ts","../../../../packages/ng-primitives/interactions/src/focus-visible/focus-visible.directive.ts","../../../../packages/ng-primitives/interactions/src/press/press.token.ts","../../../../packages/ng-primitives/interactions/src/press/press.directive.ts","../../../../packages/ng-primitives/interactions/src/move/move.token.ts","../../../../packages/ng-primitives/interactions/src/move/move.directive.ts","../../../../packages/ng-primitives/interactions/src/index.ts","../../../../packages/ng-primitives/interactions/src/ng-primitives-interactions.ts"],"sourcesContent":["/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpHover } from './hover.directive';\n\nexport const NgpHoverToken = new InjectionToken<NgpHover>('NgpHoverToken');\n\n/**\n * Inject the Hover directive instance\n * @returns Hover directive instance\n */\nexport function injectHover(): NgpHover {\n return inject(NgpHoverToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport type { BooleanInput } from '@angular/cdk/coercion';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n Directive,\n HostListener,\n Injectable,\n PLATFORM_ID,\n booleanAttribute,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { injectDisabled } from 'ng-primitives/internal';\nimport { onChange } from 'ng-primitives/utils';\nimport { NgpHoverToken } from './hover.token';\n\n/**\n * We use a service here as this value is a singleton\n * and allows us to register the dom events once.\n */\n@Injectable({\n providedIn: 'root',\n})\nclass GlobalPointerEvents {\n /**\n * Whether global mouse events should be ignored.\n */\n ignoreEmulatedMouseEvents: boolean = false;\n\n /**\n * Access the document.\n */\n private readonly document = inject(DOCUMENT);\n\n /**\n * Determine the platform id.\n */\n private readonly platformId = inject(PLATFORM_ID);\n\n constructor() {\n // we only want to setup events on the client\n if (isPlatformBrowser(this.platformId)) {\n this.setupGlobalTouchEvents();\n }\n }\n\n private setupGlobalTouchEvents(): void {\n this.document.addEventListener('pointerup', this.handleGlobalPointerEvent.bind(this));\n this.document.addEventListener('touchend', this.setGlobalIgnoreEmulatedMouseEvents.bind(this));\n }\n\n private setGlobalIgnoreEmulatedMouseEvents(): void {\n this.ignoreEmulatedMouseEvents = true;\n // Clear globalIgnoreEmulatedMouseEvents after a short timeout. iOS fires onPointerEnter\n // with pointerType=\"mouse\" immediately after onPointerUp and before onFocus. On other\n // devices that don't have this quirk, we don't want to ignore a mouse hover sometime in\n // the distant future because a user previously touched the element.\n setTimeout(() => (this.ignoreEmulatedMouseEvents = false), 50);\n }\n\n private handleGlobalPointerEvent(event: PointerEvent): void {\n if (event.pointerType === 'touch') {\n this.setGlobalIgnoreEmulatedMouseEvents();\n }\n }\n}\n\n/**\n * A directive for normalizing hover events across the different browsers and devices.\n *\n * This is an Angular port of the useHover hook from\n * react-aria: https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/interactions/src/useHover.ts\n */\n@Directive({\n standalone: true,\n selector: '[ngpHover]',\n exportAs: 'ngpHover',\n providers: [{ provide: NgpHoverToken, useExisting: NgpHover }],\n host: {\n '[attr.data-hover]': 'hovered()',\n },\n})\nexport class NgpHover {\n /**\n * Access the global pointer events handler.\n */\n private readonly globalPointerEvents = inject(GlobalPointerEvents);\n\n /**\n * Whether hoving should be disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpHoverDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Access the disabled state from any parent.\n */\n private readonly isDisabled = injectDisabled(this.disabled);\n\n /**\n * Store the current hover state.\n */\n protected hovered = signal<boolean>(false);\n\n /**\n * Whether this element should ignore emulated mouse events.\n */\n private ignoreEmulatedMouseEvents: boolean = false;\n\n /**\n * Emit an event when hovering starts.\n */\n readonly hoverStart = output<void>({ alias: 'ngpHoverStart' });\n\n /**\n * Emit an event when hovering ends.\n */\n readonly hoverEnd = output<void>({ alias: 'ngpHoverEnd' });\n\n /**\n * Emit an event when the hover state changes.\n */\n readonly hoverChange = output<boolean>({ alias: 'ngpHover' });\n\n constructor() {\n onChange(this.disabled, this.reset.bind(this));\n onChange(this.isDisabled, this.reset.bind(this));\n }\n\n private reset(shouldReset?: boolean | null): void {\n if (shouldReset) {\n this.onHoverEnd('mouse');\n }\n }\n\n /**\n * Trigger the hover start events.\n * @param event\n * @param pointerType\n */\n private onHoverStart(event: Event, pointerType: string): void {\n if (\n this.isDisabled() ||\n pointerType === 'touch' ||\n this.hovered() ||\n !(event.currentTarget as Element)?.contains(event.target as Element)\n ) {\n return;\n }\n\n this.hovered.set(true);\n this.hoverStart.emit();\n this.hoverChange.emit(true);\n }\n\n /**\n * Trigger the hover end events.\n * @param pointerType\n */\n private onHoverEnd(pointerType: string): void {\n if (pointerType === 'touch' || !this.hovered()) {\n return;\n }\n\n this.hovered.set(false);\n this.hoverEnd.emit();\n this.hoverChange.emit(false);\n }\n\n @HostListener('pointerenter', ['$event'])\n protected onPointerEnter(event: PointerEvent): void {\n if (this.globalPointerEvents.ignoreEmulatedMouseEvents && event.pointerType === 'mouse') {\n return;\n }\n\n this.onHoverStart(event, event.pointerType);\n }\n\n @HostListener('pointerleave', ['$event'])\n protected onPointerLeave(event: PointerEvent): void {\n if (!this.isDisabled() && (event.currentTarget as Element)?.contains(event.target as Element)) {\n this.onHoverEnd(event.pointerType);\n }\n }\n\n @HostListener('touchstart')\n protected onTouchStart(): void {\n this.ignoreEmulatedMouseEvents = true;\n }\n\n @HostListener('mouseenter', ['$event'])\n protected onMouseEnter(event: MouseEvent): void {\n if (!this.ignoreEmulatedMouseEvents && !this.globalPointerEvents.ignoreEmulatedMouseEvents) {\n this.onHoverStart(event, 'mouse');\n }\n\n this.ignoreEmulatedMouseEvents = false;\n }\n\n @HostListener('mouseleave', ['$event'])\n protected onMouseLeave(event: MouseEvent): void {\n if (!this.isDisabled() && (event.currentTarget as Element)?.contains(event.target as Element)) {\n this.onHoverEnd('mouse');\n }\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpFocus } from './focus.directive';\n\nexport const NgpFocusToken = new InjectionToken<NgpFocus>('NgpFocusToken');\n\n/**\n * Inject the Focus directive instance\n */\nexport function injectFocus(): NgpFocus {\n return inject(NgpFocusToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { Directive, HostListener, booleanAttribute, input, output, signal } from '@angular/core';\nimport { injectDisabled } from 'ng-primitives/internal';\nimport { NgpFocusToken } from './focus.token';\n\n/**\n * This was inspired by the React Aria useFocus hook.\n * https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/interactions/src/useFocus.ts#L20\n */\n@Directive({\n standalone: true,\n selector: '[ngpFocus]',\n exportAs: 'ngpFocus',\n providers: [{ provide: NgpFocusToken, useExisting: NgpFocus }],\n host: {\n '[attr.data-focus]': 'isFocused()',\n },\n})\nexport class NgpFocus {\n /**\n * Whether the element is currently focused.\n */\n protected isFocused = signal<boolean>(false);\n\n /**\n * Whether listening for focus events is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpFocusDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Access the disabled state from any parent.\n */\n private readonly isDisabled = injectDisabled(this.disabled);\n\n /**\n * Emit when the focus state changes.\n */\n readonly focus = output<boolean>({ alias: 'ngpFocus' });\n\n /**\n * Listen for focus events.\n * @param event\n */\n @HostListener('focus', ['$event'])\n protected onFocus(event: FocusEvent) {\n if (this.isDisabled()) {\n return;\n }\n\n const ownerDocument = (event.target as HTMLElement)?.ownerDocument ?? document;\n\n // ensure this element is still focused\n if (ownerDocument.activeElement === event.target && event.currentTarget === event.target) {\n this.focus.emit(true);\n this.isFocused.set(true);\n }\n }\n\n /**\n * Listen for blur events.\n * @param event\n */\n @HostListener('blur', ['$event'])\n protected onBlur(event: FocusEvent) {\n if (this.isDisabled()) {\n return;\n }\n\n if (event.currentTarget === event.target) {\n this.focus.emit(false);\n this.isFocused.set(false);\n }\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpFocusVisible } from './focus-visible.directive';\n\nexport const NgpFocusVisibleToken = new InjectionToken<NgpFocusVisible>('NgpFocusVisibleToken');\n\n/**\n * Inject the FocusVisible directive instance\n */\nexport function injectFocusVisible(): NgpFocusVisible {\n return inject(NgpFocusVisibleToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { FocusMonitor, FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport {\n Directive,\n ElementRef,\n HostListener,\n booleanAttribute,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { injectDisabled } from 'ng-primitives/internal';\nimport { NgpFocusVisibleToken } from './focus-visible.token';\n\n@Directive({\n standalone: true,\n selector: '[ngpFocusVisible]',\n exportAs: 'ngpFocusVisible',\n providers: [{ provide: NgpFocusVisibleToken, useExisting: NgpFocusVisible }],\n host: {\n '[attr.data-focus-visible]': 'isFocused() && !isDisabled()',\n },\n})\nexport class NgpFocusVisible {\n /**\n * Access the element that the directive is applied to.\n */\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Access the focus monitor.\n */\n private readonly focusMonitor = inject(FocusMonitor);\n\n /**\n * Whether focus events are listened to.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpFocusVisibleDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Access the disabled state from any parent.\n */\n private readonly isDisabled = injectDisabled(this.disabled);\n\n /**\n * Emit when the element is visually focused.\n */\n readonly focusChange = output<boolean>({\n alias: 'ngpFocusVisible',\n });\n\n /**\n * Whether the element is currently focused.\n */\n protected readonly isFocused = signal<boolean>(false);\n\n constructor() {\n this.focusMonitor\n .monitor(this.elementRef.nativeElement)\n .pipe(takeUntilDestroyed())\n .subscribe(origin => this.onFocus(origin));\n }\n\n private onFocus(origin: FocusOrigin): void {\n if (this.isDisabled() || this.isFocused()) {\n return;\n }\n\n // for some elements the focus visible state should always appear on focus\n if (this.alwaysShowFocus()) {\n this.isFocused.set(true);\n this.focusChange.emit(true);\n return;\n }\n\n // if the focus origin is keyboard, then the focus is visible\n if (origin === 'keyboard') {\n this.isFocused.set(true);\n this.focusChange.emit(true);\n return;\n }\n }\n\n /**\n * Listen for blur events.\n */\n @HostListener('blur')\n protected onBlur(): void {\n if (this.isDisabled() || !this.isFocused()) {\n return;\n }\n\n this.isFocused.set(false);\n this.focusChange.emit(false);\n }\n\n private alwaysShowFocus(): boolean {\n const nonTextInputTypes = [\n 'checkbox',\n 'radio',\n 'range',\n 'color',\n 'file',\n 'image',\n 'button',\n 'submit',\n 'reset',\n ];\n\n // if this is an input element and it is a text input\n if (\n this.elementRef.nativeElement instanceof HTMLInputElement &&\n !nonTextInputTypes.includes(this.elementRef.nativeElement.type)\n ) {\n return true;\n }\n\n // if this is a textarea\n if (this.elementRef.nativeElement instanceof HTMLTextAreaElement) {\n return true;\n }\n\n // if this is an element with contenteditable\n if (\n this.elementRef.nativeElement.isContentEditable ||\n this.elementRef.nativeElement.hasAttribute('contenteditable')\n ) {\n return true;\n }\n\n return false;\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpPress } from './press.directive';\n\nexport const NgpPressToken = new InjectionToken<NgpPress>('NgpPressToken');\n\n/**\n * Inject the Press directive instance\n */\nexport function injectPress(): NgpPress {\n return inject(NgpPressToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport {\n Directive,\n ElementRef,\n HostListener,\n booleanAttribute,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { injectDisabled } from 'ng-primitives/internal';\nimport { injectDisposables } from 'ng-primitives/utils';\nimport { NgpPressToken } from './press.token';\n\n/**\n * This was inpsired by Headless UI's active-press hook:\n * https://github.com/tailwindlabs/headlessui/blob/main/packages/%40headlessui-react/src/hooks/use-active-press.tsx\n */\n\n@Directive({\n standalone: true,\n selector: '[ngpPress]',\n exportAs: 'ngpPress',\n providers: [{ provide: NgpPressToken, useExisting: NgpPress }],\n host: {\n '[attr.data-press]': 'pressed() && !isDisabled()',\n },\n})\nexport class NgpPress {\n /**\n * Access the HTML Element.\n */\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Access the disposables.\n */\n private readonly disposables = injectDisposables();\n\n /**\n * Whether listening for press events is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpPressDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Access the disabled state from any parent.\n */\n private readonly isDisabled = injectDisabled(this.disabled);\n\n /**\n * Emit when the press begins.\n */\n readonly pressStart = output<void>({\n alias: 'ngpPressStart',\n });\n\n /**\n * Emit when the press ends.\n */\n readonly pressEnd = output<void>({\n alias: 'ngpPressEnd',\n });\n\n /**\n * Emit when the press changes.\n */\n readonly pressChange = output<boolean>({\n alias: 'ngpPress',\n });\n\n /**\n * The press state.\n */\n protected readonly pressed = signal(false);\n\n /**\n * Reset the press state.\n */\n private reset(): void {\n // if we are not pressing, then do nothing\n if (!this.pressed()) {\n return;\n }\n\n // clear any existing disposables\n this.disposableListeners.forEach(dispose => dispose());\n this.pressed.set(false);\n this.pressEnd.emit();\n this.pressChange.emit(false);\n }\n\n /**\n * Store the list of disposables.\n */\n private disposableListeners: (() => void)[] = [];\n\n @HostListener('pointerdown')\n protected onPointerDown(): void {\n if (this.isDisabled()) {\n return;\n }\n\n // clear any existing disposables\n this.disposableListeners.forEach(dispose => dispose());\n\n // update the press state\n this.pressed.set(true);\n this.pressStart.emit();\n this.pressChange.emit(true);\n\n // setup global event listeners to catch events on elements outside the directive\n const ownerDocument = this.element.nativeElement.ownerDocument ?? document;\n\n // if the pointer up event happens on any elements, then we are no longer pressing on this element\n const pointerUp = this.disposables.addEventListener(\n ownerDocument,\n 'pointerup',\n this.reset.bind(this),\n false,\n );\n\n // Instead of relying on the `pointerleave` event, which is not consistently called on iOS Safari,\n // we use the `pointermove` event to determine if we are still \"pressing\".\n // By checking if the target is still within the element, we can determine if the press is ongoing.\n const pointerMove = this.disposables.addEventListener(\n ownerDocument,\n 'pointermove',\n this.onPointerMove.bind(this) as EventListener,\n false,\n );\n\n // if the pointer is cancelled, then we are no longer pressing on this element\n const pointerCancel = this.disposables.addEventListener(\n ownerDocument,\n 'pointercancel',\n this.reset.bind(this),\n false,\n );\n\n this.disposableListeners = [pointerUp, pointerMove, pointerCancel];\n }\n\n private onPointerMove(event: PointerEvent): void {\n if (\n this.element.nativeElement !== event.target &&\n !this.element.nativeElement.contains(event.target as Node)\n ) {\n this.reset();\n }\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpMove } from './move.directive';\n\nexport const NgpMoveToken = new InjectionToken<NgpMove>('NgpMoveToken');\n\n/**\n * Inject the Move directive instance\n */\nexport function injectMove(): NgpMove {\n return inject(NgpMoveToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, HostListener, input, output, signal } from '@angular/core';\nimport { injectDisabled } from 'ng-primitives/internal';\nimport { injectDisposables } from 'ng-primitives/utils';\nimport { NgpMoveToken } from './move.token';\n\n/**\n * Inspired by react-aria useMove hook:\n * https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/interactions/src/useMove.ts\n */\n\n@Directive({\n standalone: true,\n selector: '[ngpMove]',\n exportAs: 'ngpMove',\n providers: [{ provide: NgpMoveToken, useExisting: NgpMove }],\n host: {\n '[attr.data-move]': 'isMoving()',\n },\n})\nexport class NgpMove {\n /**\n * Access the disposable helper.\n */\n private readonly disposables = injectDisposables();\n\n /**\n * Whether movement is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMoveDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Access the disabled state from any parent.\n */\n private readonly isDisabled = injectDisabled(this.disabled);\n\n /**\n * Emit when the move event begins.\n */\n readonly start = output<NgpMoveStartEvent>({\n alias: 'ngpMoveStart',\n });\n\n /**\n * Emit when the element is moved.\n */\n readonly move = output<NgpMoveEvent>({\n alias: 'ngpMove',\n });\n\n /**\n * Emit when the move event ends.\n */\n readonly end = output<NgpMoveEndEvent>({\n alias: 'ngpMoveEnd',\n });\n\n /**\n * Whether the element is currently being moved.\n */\n private isMoving = signal<boolean>(false);\n\n /**\n * Store the last x position of the element.\n */\n private x: number | null = null;\n\n /**\n * Store the last y position of the element.\n */\n private y: number | null = null;\n\n /**\n * Store the id of the last pointer.\n */\n private pointerId: number | null = null;\n\n /**\n * Store the disposable event listeners.\n */\n private disposableListeners: (() => void)[] = [];\n\n /**\n * Handle a move start.\n */\n private onMoveStart(event: PointerEvent | KeyboardEvent, pointerType: PointerType): void {\n this.start.emit({\n pointerType,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n altKey: event.altKey,\n });\n this.isMoving.set(true);\n }\n\n /**\n * Handle a move event.\n */\n private onMove(\n event: PointerEvent | KeyboardEvent,\n pointerType: PointerType,\n deltaX: number,\n deltaY: number,\n ): void {\n if (deltaX === 0 && deltaY === 0) {\n return;\n }\n\n this.move.emit({\n deltaX,\n deltaY,\n pointerType,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n altKey: event.altKey,\n });\n }\n\n /**\n * Handle a move end.\n */\n private onMoveEnd(event: PointerEvent | KeyboardEvent, pointerType: PointerType): void {\n this.end.emit({\n pointerType,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n altKey: event.altKey,\n });\n this.isMoving.set(false);\n }\n\n /**\n * Handle the pointer down event.\n */\n @HostListener('pointerdown', ['$event'])\n protected onPointerDown(event: PointerEvent): void {\n // ignore right-click or additional pointers\n if (event.button !== 0 || this.pointerId !== null || this.isDisabled()) {\n return;\n }\n\n // prevent the default behavior\n event.preventDefault();\n event.stopPropagation();\n\n this.onMoveStart(event, event.pointerType as PointerType);\n\n // store the pointer id and initial position\n this.pointerId = event.pointerId;\n this.x = event.pageX;\n this.y = event.pageY;\n\n // add global event listeners\n const pointerMove = this.disposables.addEventListener(\n window,\n 'pointermove',\n this.onPointerMove.bind(this) as EventListener,\n false,\n );\n\n const pointerUp = this.disposables.addEventListener(\n window,\n 'pointerup',\n this.onPointerUp.bind(this) as EventListener,\n false,\n );\n\n const pointerCancel = this.disposables.addEventListener(\n window,\n 'pointercancel',\n this.onPointerUp.bind(this) as EventListener,\n false,\n );\n\n // store the disposable event listeners\n this.disposableListeners = [pointerMove, pointerUp, pointerCancel];\n }\n\n /**\n * Handle the pointer up event.\n */\n protected onPointerUp(event: PointerEvent): void {\n if (this.pointerId !== event.pointerId) {\n return;\n }\n\n const pointerType = (event.pointerType ?? 'mouse') as PointerType;\n this.onMoveEnd(event, pointerType);\n this.pointerId = null;\n this.disposableListeners.forEach(dispose => dispose());\n }\n\n /**\n * Handle the pointer move event.\n */\n protected onPointerMove(event: PointerEvent): void {\n if (this.pointerId !== event.pointerId) {\n return;\n }\n\n // Problems with PointerEvent#movementX/movementY:\n // 1. it is always 0 on macOS Safari.\n // 2. On Chrome Android, it's scaled by devicePixelRatio, but not on Chrome macOS\n this.onMove(\n event,\n event.pointerType as PointerType,\n event.pageX - (this.x ?? 0),\n event.pageY - (this.y ?? 0),\n );\n this.x = event.pageX;\n this.y = event.pageY;\n }\n\n private triggerKeyboardMove(event: KeyboardEvent, deltaX: number, deltaY: number): void {\n if (this.isDisabled()) {\n return;\n }\n\n this.onMoveStart(event, 'keyboard');\n this.onMove(event, 'keyboard', deltaX, deltaY);\n this.onMoveEnd(event, 'keyboard');\n }\n\n @HostListener('keydown.ArrowUp', ['$event'])\n protected onArrowUp(event: KeyboardEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.triggerKeyboardMove(event, 0, -1);\n }\n\n @HostListener('keydown.ArrowDown', ['$event'])\n protected onArrowDown(event: KeyboardEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.triggerKeyboardMove(event, 0, 1);\n }\n\n @HostListener('keydown.ArrowLeft', ['$event'])\n protected onArrowLeft(event: KeyboardEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.triggerKeyboardMove(event, -1, 0);\n }\n\n @HostListener('keydown.ArrowRight', ['$event'])\n protected onArrowRight(event: KeyboardEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.triggerKeyboardMove(event, 1, 0);\n }\n}\n\ninterface NgpMoveBaseEvent {\n /**\n * Whether the event was triggered by a mouse or keyboard event.\n */\n pointerType: PointerType;\n /**\n * Whether the shift key was pressed during the event.\n */\n shiftKey: boolean;\n /**\n * Whether the control key was pressed during the event.\n */\n ctrlKey: boolean;\n /**\n * Whether the meta key was pressed during the event.\n */\n metaKey: boolean;\n /**\n * Whether the alt key was pressed during the event.\n */\n altKey: boolean;\n}\n\nexport type NgpMoveStartEvent = NgpMoveBaseEvent;\nexport type NgpMoveEndEvent = NgpMoveBaseEvent;\n\nexport interface NgpMoveEvent extends NgpMoveBaseEvent {\n /**\n * The amount of pixels moved in the x-axis.\n */\n deltaX: number;\n /**\n * The amount of pixels moved in the y-axis.\n */\n deltaY: number;\n}\n\nexport type PointerType = 'mouse' | 'pen' | 'touch' | 'keyboard' | 'virtual';\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nexport { NgpHover } from './hover/hover.directive';\nexport { NgpHoverToken, injectHover } from './hover/hover.token';\nexport { NgpFocus } from './focus/focus.directive';\nexport { NgpFocusToken } from './focus/focus.token';\nexport { NgpFocusVisible } from './focus-visible/focus-visible.directive';\nexport { NgpFocusVisibleToken } from './focus-visible/focus-visible.token';\nexport { NgpPress } from './press/press.directive';\nexport { NgpPressToken } from './press/press.token';\nexport { NgpMove } from './move/move.directive';\nexport { NgpMoveToken } from './move/move.token';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;AAAA;;;;;;AAMG;MAIU,aAAa,GAAG,IAAI,cAAc,CAAW,eAAe,EAAE;AAE3E;;;AAGG;SACa,WAAW,GAAA;AACzB,IAAA,OAAO,MAAM,CAAC,aAAa,CAAC,CAAC;AAC/B;;ACMA;;;AAGG;AACH,MAGM,mBAAmB,CAAA;AAgBvB,IAAA,WAAA,GAAA;AAfA;;AAEG;QACH,IAAyB,CAAA,yBAAA,GAAY,KAAK,CAAC;AAE3C;;AAEG;AACc,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAE7C;;AAEG;AACc,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;;AAIhD,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACtC,IAAI,CAAC,sBAAsB,EAAE,CAAC;SAC/B;KACF;IAEO,sBAAsB,GAAA;AAC5B,QAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACtF,QAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,kCAAkC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;KAChG;IAEO,kCAAkC,GAAA;AACxC,QAAA,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;;;;;AAKtC,QAAA,UAAU,CAAC,OAAO,IAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;KAChE;AAEO,IAAA,wBAAwB,CAAC,KAAmB,EAAA;AAClD,QAAA,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE;YACjC,IAAI,CAAC,kCAAkC,EAAE,CAAC;SAC3C;KACF;8GAzCG,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;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,cAFX,MAAM,EAAA,CAAA,CAAA,EAAA;;2FAEd,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;AA6CD;;;;;AAKG;MAUU,QAAQ,CAAA;AA4CnB,IAAA,WAAA,GAAA;AA3CA;;AAEG;AACc,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAEnE;;AAEG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAE;AACtD,YAAA,KAAK,EAAE,kBAAkB;AACzB,YAAA,SAAS,EAAE,gBAAgB;AAC5B,SAAA,CAAC,CAAC;AAEH;;AAEG;AACc,QAAA,IAAA,CAAA,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAE5D;;AAEG;AACO,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;AAE3C;;AAEG;QACK,IAAyB,CAAA,yBAAA,GAAY,KAAK,CAAC;AAEnD;;AAEG;QACM,IAAU,CAAA,UAAA,GAAG,MAAM,CAAO,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;AAE/D;;AAEG;QACM,IAAQ,CAAA,QAAA,GAAG,MAAM,CAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;AAE3D;;AAEG;QACM,IAAW,CAAA,WAAA,GAAG,MAAM,CAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;AAG5D,QAAA,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,QAAA,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;KAClD;AAEO,IAAA,KAAK,CAAC,WAA4B,EAAA;QACxC,IAAI,WAAW,EAAE;AACf,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;SAC1B;KACF;AAED;;;;AAIG;IACK,YAAY,CAAC,KAAY,EAAE,WAAmB,EAAA;QACpD,IACE,IAAI,CAAC,UAAU,EAAE;AACjB,YAAA,WAAW,KAAK,OAAO;YACvB,IAAI,CAAC,OAAO,EAAE;YACd,CAAE,KAAK,CAAC,aAAyB,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAiB,CAAC,EACpE;YACA,OAAO;SACR;AAED,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC7B;AAED;;;AAGG;AACK,IAAA,UAAU,CAAC,WAAmB,EAAA;QACpC,IAAI,WAAW,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;YAC9C,OAAO;SACR;AAED,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC9B;AAGS,IAAA,cAAc,CAAC,KAAmB,EAAA;AAC1C,QAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,yBAAyB,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE;YACvF,OAAO;SACR;QAED,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;KAC7C;AAGS,IAAA,cAAc,CAAC,KAAmB,EAAA;AAC1C,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAK,KAAK,CAAC,aAAyB,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAiB,CAAC,EAAE;AAC7F,YAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;SACpC;KACF;IAGS,YAAY,GAAA;AACpB,QAAA,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;KACvC;AAGS,IAAA,YAAY,CAAC,KAAiB,EAAA;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,yBAAyB,EAAE;AAC1F,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;SACnC;AAED,QAAA,IAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC;KACxC;AAGS,IAAA,YAAY,CAAC,KAAiB,EAAA;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAK,KAAK,CAAC,aAAyB,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAiB,CAAC,EAAE;AAC7F,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;SAC1B;KACF;8GA5HU,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,EAAA,EAAA,SAAA,EALR,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;2FAKnD,QAAQ,EAAA,UAAA,EAAA,CAAA;kBATpB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,QAAQ,EAAE,UAAU;oBACpB,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAU,QAAA,EAAE,CAAC;AAC9D,oBAAA,IAAI,EAAE;AACJ,wBAAA,mBAAmB,EAAE,WAAW;AACjC,qBAAA;AACF,iBAAA,CAAA;wDA2FW,cAAc,EAAA,CAAA;sBADvB,YAAY;uBAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,CAAA;gBAU9B,cAAc,EAAA,CAAA;sBADvB,YAAY;uBAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,CAAA;gBAQ9B,YAAY,EAAA,CAAA;sBADrB,YAAY;uBAAC,YAAY,CAAA;gBAMhB,YAAY,EAAA,CAAA;sBADrB,YAAY;uBAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,CAAA;gBAU5B,YAAY,EAAA,CAAA;sBADrB,YAAY;uBAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,CAAA;;;ACjNxC;;;;;;AAMG;MAIU,aAAa,GAAG,IAAI,cAAc,CAAW,eAAe,EAAE;AAE3E;;AAEG;SACa,WAAW,GAAA;AACzB,IAAA,OAAO,MAAM,CAAC,aAAa,CAAC,CAAC;AAC/B;;ACLA;;;AAGG;MAUU,QAAQ,CAAA;AATrB,IAAA,WAAA,GAAA;AAUE;;AAEG;AACO,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;AAE7C;;AAEG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAE;AACtD,YAAA,KAAK,EAAE,kBAAkB;AACzB,YAAA,SAAS,EAAE,gBAAgB;AAC5B,SAAA,CAAC,CAAC;AAEH;;AAEG;AACc,QAAA,IAAA,CAAA,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAE5D;;AAEG;QACM,IAAK,CAAA,KAAA,GAAG,MAAM,CAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;AAoCzD,KAAA;AAlCC;;;AAGG;AAEO,IAAA,OAAO,CAAC,KAAiB,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACrB,OAAO;SACR;QAED,MAAM,aAAa,GAAI,KAAK,CAAC,MAAsB,EAAE,aAAa,IAAI,QAAQ,CAAC;;AAG/E,QAAA,IAAI,aAAa,CAAC,aAAa,KAAK,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,KAAK,CAAC,MAAM,EAAE;AACxF,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SAC1B;KACF;AAED;;;AAGG;AAEO,IAAA,MAAM,CAAC,KAAiB,EAAA;AAChC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACrB,OAAO;SACR;QAED,IAAI,KAAK,CAAC,aAAa,KAAK,KAAK,CAAC,MAAM,EAAE;AACxC,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACvB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SAC3B;KACF;8GAzDU,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,UAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,EAAA,EAAA,SAAA,EALR,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;2FAKnD,QAAQ,EAAA,UAAA,EAAA,CAAA;kBATpB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,QAAQ,EAAE,UAAU;oBACpB,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAU,QAAA,EAAE,CAAC;AAC9D,oBAAA,IAAI,EAAE;AACJ,wBAAA,mBAAmB,EAAE,aAAa;AACnC,qBAAA;AACF,iBAAA,CAAA;8BA8BW,OAAO,EAAA,CAAA;sBADhB,YAAY;uBAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAA;gBAoBvB,MAAM,EAAA,CAAA;sBADf,YAAY;uBAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAA;;;ACxElC;;;;;;AAMG;MAIU,oBAAoB,GAAG,IAAI,cAAc,CAAkB,sBAAsB,EAAE;AAEhG;;AAEG;SACa,kBAAkB,GAAA;AAChC,IAAA,OAAO,MAAM,CAAC,oBAAoB,CAAC,CAAC;AACtC;;ACjBA;;;;;;AAMG;MA0BU,eAAe,CAAA;AAoC1B,IAAA,WAAA,GAAA;AAnCA;;AAEG;AACc,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC,CAAC;AAE1E;;AAEG;AACc,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AAErD;;AAEG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAE;AACtD,YAAA,KAAK,EAAE,yBAAyB;AAChC,YAAA,SAAS,EAAE,gBAAgB;AAC5B,SAAA,CAAC,CAAC;AAEH;;AAEG;AACc,QAAA,IAAA,CAAA,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAE5D;;AAEG;QACM,IAAW,CAAA,WAAA,GAAG,MAAM,CAAU;AACrC,YAAA,KAAK,EAAE,iBAAiB;AACzB,SAAA,CAAC,CAAC;AAEH;;AAEG;AACgB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;AAGpD,QAAA,IAAI,CAAC,YAAY;AACd,aAAA,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;aACtC,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC1B,aAAA,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;KAC9C;AAEO,IAAA,OAAO,CAAC,MAAmB,EAAA;QACjC,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACzC,OAAO;SACR;;AAGD,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;AAC1B,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO;SACR;;AAGD,QAAA,IAAI,MAAM,KAAK,UAAU,EAAE;AACzB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO;SACR;KACF;AAED;;AAEG;IAEO,MAAM,GAAA;QACd,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;YAC1C,OAAO;SACR;AAED,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC1B,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC9B;IAEO,eAAe,GAAA;AACrB,QAAA,MAAM,iBAAiB,GAAG;YACxB,UAAU;YACV,OAAO;YACP,OAAO;YACP,OAAO;YACP,MAAM;YACN,OAAO;YACP,QAAQ;YACR,QAAQ;YACR,OAAO;SACR,CAAC;;AAGF,QAAA,IACE,IAAI,CAAC,UAAU,CAAC,aAAa,YAAY,gBAAgB;AACzD,YAAA,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,EAC/D;AACA,YAAA,OAAO,IAAI,CAAC;SACb;;QAGD,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,YAAY,mBAAmB,EAAE;AAChE,YAAA,OAAO,IAAI,CAAC;SACb;;AAGD,QAAA,IACE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,iBAAiB;YAC/C,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,iBAAiB,CAAC,EAC7D;AACA,YAAA,OAAO,IAAI,CAAC;SACb;AAED,QAAA,OAAO,KAAK,CAAC;KACd;8GA/GU,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,MAAA,EAAA,UAAA,EAAA,EAAA,UAAA,EAAA,EAAA,yBAAA,EAAA,8BAAA,EAAA,EAAA,EAAA,SAAA,EALf,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;2FAKjE,eAAe,EAAA,UAAA,EAAA,CAAA;kBAT3B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,QAAQ,EAAE,iBAAiB;oBAC3B,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAiB,eAAA,EAAE,CAAC;AAC5E,oBAAA,IAAI,EAAE;AACJ,wBAAA,2BAA2B,EAAE,8BAA8B;AAC5D,qBAAA;AACF,iBAAA,CAAA;wDAoEW,MAAM,EAAA,CAAA;sBADf,YAAY;uBAAC,MAAM,CAAA;;;AClGtB;;;;;;AAMG;MAIU,aAAa,GAAG,IAAI,cAAc,CAAW,eAAe,EAAE;AAE3E;;AAEG;SACa,WAAW,GAAA;AACzB,IAAA,OAAO,MAAM,CAAC,aAAa,CAAC,CAAC;AAC/B;;ACKA;;;AAGG;MAWU,QAAQ,CAAA;AATrB,IAAA,WAAA,GAAA;AAUE;;AAEG;AACc,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAA0B,UAAU,CAAC,CAAC;AAEvE;;AAEG;QACc,IAAW,CAAA,WAAA,GAAG,iBAAiB,EAAE,CAAC;AAEnD;;AAEG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAE;AACtD,YAAA,KAAK,EAAE,kBAAkB;AACzB,YAAA,SAAS,EAAE,gBAAgB;AAC5B,SAAA,CAAC,CAAC;AAEH;;AAEG;AACc,QAAA,IAAA,CAAA,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAE5D;;AAEG;QACM,IAAU,CAAA,UAAA,GAAG,MAAM,CAAO;AACjC,YAAA,KAAK,EAAE,eAAe;AACvB,SAAA,CAAC,CAAC;AAEH;;AAEG;QACM,IAAQ,CAAA,QAAA,GAAG,MAAM,CAAO;AAC/B,YAAA,KAAK,EAAE,aAAa;AACrB,SAAA,CAAC,CAAC;AAEH;;AAEG;QACM,IAAW,CAAA,WAAA,GAAG,MAAM,CAAU;AACrC,YAAA,KAAK,EAAE,UAAU;AAClB,SAAA,CAAC,CAAC;AAEH;;AAEG;AACgB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAkB3C;;AAEG;QACK,IAAmB,CAAA,mBAAA,GAAmB,EAAE,CAAC;AAwDlD,KAAA;AA3EC;;AAEG;IACK,KAAK,GAAA;;AAEX,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;YACnB,OAAO;SACR;;AAGD,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC,CAAC;AACvD,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC9B;IAQS,aAAa,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACrB,OAAO;SACR;;AAGD,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC,CAAC;;AAGvD,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;QAG5B,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,IAAI,QAAQ,CAAC;;QAG3E,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CACjD,aAAa,EACb,WAAW,EACX,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EACrB,KAAK,CACN,CAAC;;;;QAKF,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CACnD,aAAa,EACb,aAAa,EACb,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAkB,EAC9C,KAAK,CACN,CAAC;;QAGF,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CACrD,aAAa,EACb,eAAe,EACf,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EACrB,KAAK,CACN,CAAC;QAEF,IAAI,CAAC,mBAAmB,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;KACpE;AAEO,IAAA,aAAa,CAAC,KAAmB,EAAA;QACvC,IACE,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,KAAK,CAAC,MAAM;AAC3C,YAAA,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,EAC1D;YACA,IAAI,CAAC,KAAK,EAAE,CAAC;SACd;KACF;8GA5HU,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,4BAAA,EAAA,EAAA,EAAA,SAAA,EALR,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;2FAKnD,QAAQ,EAAA,UAAA,EAAA,CAAA;kBATpB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,QAAQ,EAAE,UAAU;oBACpB,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAU,QAAA,EAAE,CAAC;AAC9D,oBAAA,IAAI,EAAE;AACJ,wBAAA,mBAAmB,EAAE,4BAA4B;AAClD,qBAAA;AACF,iBAAA,CAAA;8BAyEW,aAAa,EAAA,CAAA;sBADtB,YAAY;uBAAC,aAAa,CAAA;;;AC3G7B;;;;;;AAMG;MAIU,YAAY,GAAG,IAAI,cAAc,CAAU,cAAc,EAAE;AAExE;;AAEG;SACa,UAAU,GAAA;AACxB,IAAA,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC;AAC9B;;ACJA;;;AAGG;MAWU,OAAO,CAAA;AATpB,IAAA,WAAA,GAAA;AAUE;;AAEG;QACc,IAAW,CAAA,WAAA,GAAG,iBAAiB,EAAE,CAAC;AAEnD;;AAEG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAE;AACtD,YAAA,KAAK,EAAE,iBAAiB;AACxB,YAAA,SAAS,EAAE,gBAAgB;AAC5B,SAAA,CAAC,CAAC;AAEH;;AAEG;AACc,QAAA,IAAA,CAAA,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAE5D;;AAEG;QACM,IAAK,CAAA,KAAA,GAAG,MAAM,CAAoB;AACzC,YAAA,KAAK,EAAE,cAAc;AACtB,SAAA,CAAC,CAAC;AAEH;;AAEG;QACM,IAAI,CAAA,IAAA,GAAG,MAAM,CAAe;AACnC,YAAA,KAAK,EAAE,SAAS;AACjB,SAAA,CAAC,CAAC;AAEH;;AAEG;QACM,IAAG,CAAA,GAAA,GAAG,MAAM,CAAkB;AACrC,YAAA,KAAK,EAAE,YAAY;AACpB,SAAA,CAAC,CAAC;AAEH;;AAEG;AACK,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;AAE1C;;AAEG;QACK,IAAC,CAAA,CAAA,GAAkB,IAAI,CAAC;AAEhC;;AAEG;QACK,IAAC,CAAA,CAAA,GAAkB,IAAI,CAAC;AAEhC;;AAEG;QACK,IAAS,CAAA,SAAA,GAAkB,IAAI,CAAC;AAExC;;AAEG;QACK,IAAmB,CAAA,mBAAA,GAAmB,EAAE,CAAC;AA6KlD,KAAA;AA3KC;;AAEG;IACK,WAAW,CAAC,KAAmC,EAAE,WAAwB,EAAA;AAC/E,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACd,WAAW;YACX,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;AACrB,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KACzB;AAED;;AAEG;AACK,IAAA,MAAM,CACZ,KAAmC,EACnC,WAAwB,EACxB,MAAc,EACd,MAAc,EAAA;QAEd,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE;YAChC,OAAO;SACR;AAED,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YACb,MAAM;YACN,MAAM;YACN,WAAW;YACX,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;AACrB,SAAA,CAAC,CAAC;KACJ;AAED;;AAEG;IACK,SAAS,CAAC,KAAmC,EAAE,WAAwB,EAAA;AAC7E,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YACZ,WAAW;YACX,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;AACrB,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KAC1B;AAED;;AAEG;AAEO,IAAA,aAAa,CAAC,KAAmB,EAAA;;AAEzC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACtE,OAAO;SACR;;QAGD,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,WAA0B,CAAC,CAAC;;AAG1D,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;AACjC,QAAA,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;;QAGrB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CACnD,MAAM,EACN,aAAa,EACb,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAkB,EAC9C,KAAK,CACN,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CACjD,MAAM,EACN,WAAW,EACX,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAkB,EAC5C,KAAK,CACN,CAAC;QAEF,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CACrD,MAAM,EACN,eAAe,EACf,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAkB,EAC5C,KAAK,CACN,CAAC;;QAGF,IAAI,CAAC,mBAAmB,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;KACpE;AAED;;AAEG;AACO,IAAA,WAAW,CAAC,KAAmB,EAAA;QACvC,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE;YACtC,OAAO;SACR;QAED,MAAM,WAAW,IAAI,KAAK,CAAC,WAAW,IAAI,OAAO,CAAgB,CAAC;AAClE,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;AACnC,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC,CAAC;KACxD;AAED;;AAEG;AACO,IAAA,aAAa,CAAC,KAAmB,EAAA;QACzC,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE;YACtC,OAAO;SACR;;;;AAKD,QAAA,IAAI,CAAC,MAAM,CACT,KAAK,EACL,KAAK,CAAC,WAA0B,EAChC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAC3B,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAC5B,CAAC;AACF,QAAA,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;KACtB;AAEO,IAAA,mBAAmB,CAAC,KAAoB,EAAE,MAAc,EAAE,MAAc,EAAA;AAC9E,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACrB,OAAO;SACR;AAED,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC/C,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;KACnC;AAGS,IAAA,SAAS,CAAC,KAAoB,EAAA;QACtC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KACxC;AAGS,IAAA,WAAW,CAAC,KAAoB,EAAA;QACxC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;KACvC;AAGS,IAAA,WAAW,CAAC,KAAoB,EAAA;QACxC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KACxC;AAGS,IAAA,YAAY,CAAC,KAAoB,EAAA;QACzC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;KACvC;8GA3OU,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAP,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,cAAA,EAAA,IAAA,EAAA,SAAA,EAAA,GAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,EAAA,EAAA,SAAA,EALP,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;2FAKjD,OAAO,EAAA,UAAA,EAAA,CAAA;kBATnB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,WAAW;AACrB,oBAAA,QAAQ,EAAE,SAAS;oBACnB,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAS,OAAA,EAAE,CAAC;AAC5D,oBAAA,IAAI,EAAE;AACJ,wBAAA,kBAAkB,EAAE,YAAY;AACjC,qBAAA;AACF,iBAAA,CAAA;8BA0HW,aAAa,EAAA,CAAA;sBADtB,YAAY;uBAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,CAAA;gBA0F7B,SAAS,EAAA,CAAA;sBADlB,YAAY;uBAAC,iBAAiB,EAAE,CAAC,QAAQ,CAAC,CAAA;gBAQjC,WAAW,EAAA,CAAA;sBADpB,YAAY;uBAAC,mBAAmB,EAAE,CAAC,QAAQ,CAAC,CAAA;gBAQnC,WAAW,EAAA,CAAA;sBADpB,YAAY;uBAAC,mBAAmB,EAAE,CAAC,QAAQ,CAAC,CAAA;gBAQnC,YAAY,EAAA,CAAA;sBADrB,YAAY;uBAAC,oBAAoB,EAAE,CAAC,QAAQ,CAAC,CAAA;;;ACjQhD;;;;;;AAMG;;ACNH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"ng-primitives-interactions.mjs","sources":["../../../../packages/ng-primitives/interactions/src/hover/hover.token.ts","../../../../packages/ng-primitives/interactions/src/hover/hover.directive.ts","../../../../packages/ng-primitives/interactions/src/focus/focus.token.ts","../../../../packages/ng-primitives/interactions/src/focus/focus.directive.ts","../../../../packages/ng-primitives/interactions/src/focus-visible/focus-visible.token.ts","../../../../packages/ng-primitives/interactions/src/focus-visible/focus-visible.directive.ts","../../../../packages/ng-primitives/interactions/src/press/press.token.ts","../../../../packages/ng-primitives/interactions/src/press/press.directive.ts","../../../../packages/ng-primitives/interactions/src/move/move.token.ts","../../../../packages/ng-primitives/interactions/src/move/move.directive.ts","../../../../packages/ng-primitives/interactions/src/index.ts","../../../../packages/ng-primitives/interactions/src/ng-primitives-interactions.ts"],"sourcesContent":["/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpHover } from './hover.directive';\n\nexport const NgpHoverToken = new InjectionToken<NgpHover>('NgpHoverToken');\n\n/**\n * Inject the Hover directive instance\n * @returns Hover directive instance\n */\nexport function injectHover(): NgpHover {\n return inject(NgpHoverToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport type { BooleanInput } from '@angular/cdk/coercion';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n Directive,\n HostListener,\n Injectable,\n PLATFORM_ID,\n booleanAttribute,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { injectDisabled } from 'ng-primitives/internal';\nimport { onChange } from 'ng-primitives/utils';\nimport { NgpHoverToken } from './hover.token';\n\n/**\n * We use a service here as this value is a singleton\n * and allows us to register the dom events once.\n */\n@Injectable({\n providedIn: 'root',\n})\nclass GlobalPointerEvents {\n /**\n * Whether global mouse events should be ignored.\n */\n ignoreEmulatedMouseEvents: boolean = false;\n\n /**\n * Access the document.\n */\n private readonly document = inject(DOCUMENT);\n\n /**\n * Determine the platform id.\n */\n private readonly platformId = inject(PLATFORM_ID);\n\n constructor() {\n // we only want to setup events on the client\n if (isPlatformBrowser(this.platformId)) {\n this.setupGlobalTouchEvents();\n }\n }\n\n private setupGlobalTouchEvents(): void {\n this.document.addEventListener('pointerup', this.handleGlobalPointerEvent.bind(this));\n this.document.addEventListener('touchend', this.setGlobalIgnoreEmulatedMouseEvents.bind(this));\n }\n\n private setGlobalIgnoreEmulatedMouseEvents(): void {\n this.ignoreEmulatedMouseEvents = true;\n // Clear globalIgnoreEmulatedMouseEvents after a short timeout. iOS fires onPointerEnter\n // with pointerType=\"mouse\" immediately after onPointerUp and before onFocus. On other\n // devices that don't have this quirk, we don't want to ignore a mouse hover sometime in\n // the distant future because a user previously touched the element.\n setTimeout(() => (this.ignoreEmulatedMouseEvents = false), 50);\n }\n\n private handleGlobalPointerEvent(event: PointerEvent): void {\n if (event.pointerType === 'touch') {\n this.setGlobalIgnoreEmulatedMouseEvents();\n }\n }\n}\n\n/**\n * A directive for normalizing hover events across the different browsers and devices.\n *\n * This is an Angular port of the useHover hook from\n * react-aria: https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/interactions/src/useHover.ts\n */\n@Directive({\n standalone: true,\n selector: '[ngpHover]',\n exportAs: 'ngpHover',\n providers: [{ provide: NgpHoverToken, useExisting: NgpHover }],\n host: {\n '[attr.data-hover]': 'hovered()',\n },\n})\nexport class NgpHover {\n /**\n * Access the global pointer events handler.\n */\n private readonly globalPointerEvents = inject(GlobalPointerEvents);\n\n /**\n * Whether hoving should be disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpHoverDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Access the disabled state from any parent.\n */\n private readonly isDisabled = injectDisabled(this.disabled);\n\n /**\n * Store the current hover state.\n */\n protected hovered = signal<boolean>(false);\n\n /**\n * Whether this element should ignore emulated mouse events.\n */\n private ignoreEmulatedMouseEvents: boolean = false;\n\n /**\n * Emit an event when hovering starts.\n */\n readonly hoverStart = output<void>({ alias: 'ngpHoverStart' });\n\n /**\n * Emit an event when hovering ends.\n */\n readonly hoverEnd = output<void>({ alias: 'ngpHoverEnd' });\n\n /**\n * Emit an event when the hover state changes.\n */\n readonly hoverChange = output<boolean>({ alias: 'ngpHover' });\n\n constructor() {\n onChange(this.disabled, this.reset.bind(this));\n onChange(this.isDisabled, this.reset.bind(this));\n }\n\n private reset(shouldReset?: boolean | null): void {\n if (shouldReset) {\n this.onHoverEnd('mouse');\n }\n }\n\n /**\n * Trigger the hover start events.\n * @param event\n * @param pointerType\n */\n private onHoverStart(event: Event, pointerType: string): void {\n if (\n this.isDisabled() ||\n pointerType === 'touch' ||\n this.hovered() ||\n !(event.currentTarget as Element)?.contains(event.target as Element)\n ) {\n return;\n }\n\n this.hovered.set(true);\n this.hoverStart.emit();\n this.hoverChange.emit(true);\n }\n\n /**\n * Trigger the hover end events.\n * @param pointerType\n */\n private onHoverEnd(pointerType: string): void {\n if (pointerType === 'touch' || !this.hovered()) {\n return;\n }\n\n this.hovered.set(false);\n this.hoverEnd.emit();\n this.hoverChange.emit(false);\n }\n\n @HostListener('pointerenter', ['$event'])\n protected onPointerEnter(event: PointerEvent): void {\n if (this.globalPointerEvents.ignoreEmulatedMouseEvents && event.pointerType === 'mouse') {\n return;\n }\n\n this.onHoverStart(event, event.pointerType);\n }\n\n @HostListener('pointerleave', ['$event'])\n protected onPointerLeave(event: PointerEvent): void {\n if (!this.isDisabled() && (event.currentTarget as Element)?.contains(event.target as Element)) {\n this.onHoverEnd(event.pointerType);\n }\n }\n\n @HostListener('touchstart')\n protected onTouchStart(): void {\n this.ignoreEmulatedMouseEvents = true;\n }\n\n @HostListener('mouseenter', ['$event'])\n protected onMouseEnter(event: MouseEvent): void {\n if (!this.ignoreEmulatedMouseEvents && !this.globalPointerEvents.ignoreEmulatedMouseEvents) {\n this.onHoverStart(event, 'mouse');\n }\n\n this.ignoreEmulatedMouseEvents = false;\n }\n\n @HostListener('mouseleave', ['$event'])\n protected onMouseLeave(event: MouseEvent): void {\n if (!this.isDisabled() && (event.currentTarget as Element)?.contains(event.target as Element)) {\n this.onHoverEnd('mouse');\n }\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpFocus } from './focus.directive';\n\nexport const NgpFocusToken = new InjectionToken<NgpFocus>('NgpFocusToken');\n\n/**\n * Inject the Focus directive instance\n */\nexport function injectFocus(): NgpFocus {\n return inject(NgpFocusToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { Directive, HostListener, booleanAttribute, input, output, signal } from '@angular/core';\nimport { injectDisabled } from 'ng-primitives/internal';\nimport { NgpFocusToken } from './focus.token';\n\n/**\n * This was inspired by the React Aria useFocus hook.\n * https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/interactions/src/useFocus.ts#L20\n */\n@Directive({\n standalone: true,\n selector: '[ngpFocus]',\n exportAs: 'ngpFocus',\n providers: [{ provide: NgpFocusToken, useExisting: NgpFocus }],\n host: {\n '[attr.data-focus]': 'isFocused()',\n },\n})\nexport class NgpFocus {\n /**\n * Whether the element is currently focused.\n */\n protected isFocused = signal<boolean>(false);\n\n /**\n * Whether listening for focus events is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpFocusDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Access the disabled state from any parent.\n */\n private readonly isDisabled = injectDisabled(this.disabled);\n\n /**\n * Emit when the focus state changes.\n */\n readonly focus = output<boolean>({ alias: 'ngpFocus' });\n\n /**\n * Listen for focus events.\n * @param event\n */\n @HostListener('focus', ['$event'])\n protected onFocus(event: FocusEvent) {\n if (this.isDisabled()) {\n return;\n }\n\n const ownerDocument = (event.target as HTMLElement)?.ownerDocument ?? document;\n\n // ensure this element is still focused\n if (ownerDocument.activeElement === event.target && event.currentTarget === event.target) {\n this.focus.emit(true);\n this.isFocused.set(true);\n }\n }\n\n /**\n * Listen for blur events.\n * @param event\n */\n @HostListener('blur', ['$event'])\n protected onBlur(event: FocusEvent) {\n if (this.isDisabled()) {\n return;\n }\n\n if (event.currentTarget === event.target) {\n this.focus.emit(false);\n this.isFocused.set(false);\n }\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpFocusVisible } from './focus-visible.directive';\n\nexport const NgpFocusVisibleToken = new InjectionToken<NgpFocusVisible>('NgpFocusVisibleToken');\n\n/**\n * Inject the FocusVisible directive instance\n */\nexport function injectFocusVisible(): NgpFocusVisible {\n return inject(NgpFocusVisibleToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { FocusMonitor, FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport {\n Directive,\n ElementRef,\n booleanAttribute,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { injectDisabled } from 'ng-primitives/internal';\nimport { onBooleanChange } from 'ng-primitives/utils';\nimport { NgpFocusVisibleToken } from './focus-visible.token';\n\n@Directive({\n standalone: true,\n selector: '[ngpFocusVisible]',\n exportAs: 'ngpFocusVisible',\n providers: [{ provide: NgpFocusVisibleToken, useExisting: NgpFocusVisible }],\n host: {\n '[attr.data-focus-visible]': 'isFocused()',\n },\n})\nexport class NgpFocusVisible {\n /**\n * Access the element that the directive is applied to.\n */\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Access the focus monitor.\n */\n private readonly focusMonitor = inject(FocusMonitor);\n\n /**\n * Whether focus events are listened to.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpFocusVisibleDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Access the disabled state from any parent.\n */\n private readonly isDisabled = injectDisabled(this.disabled);\n\n /**\n * Emit when the element is visually focused.\n */\n readonly focusChange = output<boolean>({\n alias: 'ngpFocusVisible',\n });\n\n /**\n * Whether the element is currently focused.\n */\n protected readonly isFocused = signal<boolean>(false);\n\n constructor() {\n // handle focus state\n this.focusMonitor\n .monitor(this.elementRef.nativeElement)\n .pipe(takeUntilDestroyed())\n .subscribe(origin =>\n // null indicates the element was blurred\n origin === null ? this.onBlur() : this.onFocus(origin),\n );\n\n // if the component becomes disabled and it is focused, hide the focus\n onBooleanChange(this.isDisabled, () => this.focus(false));\n }\n\n private onFocus(origin: FocusOrigin): void {\n if (this.isDisabled() || this.isFocused()) {\n return;\n }\n\n // for some elements the focus visible state should always appear on focus\n if (this.alwaysShowFocus()) {\n this.focus(true);\n return;\n }\n\n // if the focus origin is keyboard, then the focus is visible\n if (origin === 'keyboard') {\n this.focus(true);\n return;\n }\n }\n\n private onBlur(): void {\n if (this.isDisabled() || !this.isFocused()) {\n return;\n }\n\n this.focus(false);\n }\n\n /**\n * Trigger the focus signal along with the focusChange event.\n */\n private focus(value: boolean) {\n if (this.isFocused() === value) {\n return;\n }\n\n this.isFocused.set(value);\n this.focusChange.emit(value);\n }\n\n private alwaysShowFocus(): boolean {\n const nonTextInputTypes = [\n 'checkbox',\n 'radio',\n 'range',\n 'color',\n 'file',\n 'image',\n 'button',\n 'submit',\n 'reset',\n ];\n\n // if this is an input element and it is a text input\n if (\n this.elementRef.nativeElement instanceof HTMLInputElement &&\n !nonTextInputTypes.includes(this.elementRef.nativeElement.type)\n ) {\n return true;\n }\n\n // if this is a textarea\n if (this.elementRef.nativeElement instanceof HTMLTextAreaElement) {\n return true;\n }\n\n // if this is an element with contenteditable\n if (\n this.elementRef.nativeElement.isContentEditable ||\n this.elementRef.nativeElement.hasAttribute('contenteditable')\n ) {\n return true;\n }\n\n return false;\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpPress } from './press.directive';\n\nexport const NgpPressToken = new InjectionToken<NgpPress>('NgpPressToken');\n\n/**\n * Inject the Press directive instance\n */\nexport function injectPress(): NgpPress {\n return inject(NgpPressToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport {\n Directive,\n ElementRef,\n HostListener,\n booleanAttribute,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { injectDisabled } from 'ng-primitives/internal';\nimport { injectDisposables } from 'ng-primitives/utils';\nimport { NgpPressToken } from './press.token';\n\n/**\n * This was inpsired by Headless UI's active-press hook:\n * https://github.com/tailwindlabs/headlessui/blob/main/packages/%40headlessui-react/src/hooks/use-active-press.tsx\n */\n\n@Directive({\n standalone: true,\n selector: '[ngpPress]',\n exportAs: 'ngpPress',\n providers: [{ provide: NgpPressToken, useExisting: NgpPress }],\n host: {\n '[attr.data-press]': 'pressed() && !isDisabled()',\n },\n})\nexport class NgpPress {\n /**\n * Access the HTML Element.\n */\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Access the disposables.\n */\n private readonly disposables = injectDisposables();\n\n /**\n * Whether listening for press events is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpPressDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Access the disabled state from any parent.\n */\n private readonly isDisabled = injectDisabled(this.disabled);\n\n /**\n * Emit when the press begins.\n */\n readonly pressStart = output<void>({\n alias: 'ngpPressStart',\n });\n\n /**\n * Emit when the press ends.\n */\n readonly pressEnd = output<void>({\n alias: 'ngpPressEnd',\n });\n\n /**\n * Emit when the press changes.\n */\n readonly pressChange = output<boolean>({\n alias: 'ngpPress',\n });\n\n /**\n * The press state.\n */\n protected readonly pressed = signal(false);\n\n /**\n * Reset the press state.\n */\n private reset(): void {\n // if we are not pressing, then do nothing\n if (!this.pressed()) {\n return;\n }\n\n // clear any existing disposables\n this.disposableListeners.forEach(dispose => dispose());\n this.pressed.set(false);\n this.pressEnd.emit();\n this.pressChange.emit(false);\n }\n\n /**\n * Store the list of disposables.\n */\n private disposableListeners: (() => void)[] = [];\n\n @HostListener('pointerdown')\n protected onPointerDown(): void {\n if (this.isDisabled()) {\n return;\n }\n\n // clear any existing disposables\n this.disposableListeners.forEach(dispose => dispose());\n\n // update the press state\n this.pressed.set(true);\n this.pressStart.emit();\n this.pressChange.emit(true);\n\n // setup global event listeners to catch events on elements outside the directive\n const ownerDocument = this.element.nativeElement.ownerDocument ?? document;\n\n // if the pointer up event happens on any elements, then we are no longer pressing on this element\n const pointerUp = this.disposables.addEventListener(\n ownerDocument,\n 'pointerup',\n this.reset.bind(this),\n false,\n );\n\n // Instead of relying on the `pointerleave` event, which is not consistently called on iOS Safari,\n // we use the `pointermove` event to determine if we are still \"pressing\".\n // By checking if the target is still within the element, we can determine if the press is ongoing.\n const pointerMove = this.disposables.addEventListener(\n ownerDocument,\n 'pointermove',\n this.onPointerMove.bind(this) as EventListener,\n false,\n );\n\n // if the pointer is cancelled, then we are no longer pressing on this element\n const pointerCancel = this.disposables.addEventListener(\n ownerDocument,\n 'pointercancel',\n this.reset.bind(this),\n false,\n );\n\n this.disposableListeners = [pointerUp, pointerMove, pointerCancel];\n }\n\n private onPointerMove(event: PointerEvent): void {\n if (\n this.element.nativeElement !== event.target &&\n !this.element.nativeElement.contains(event.target as Node)\n ) {\n this.reset();\n }\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpMove } from './move.directive';\n\nexport const NgpMoveToken = new InjectionToken<NgpMove>('NgpMoveToken');\n\n/**\n * Inject the Move directive instance\n */\nexport function injectMove(): NgpMove {\n return inject(NgpMoveToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, HostListener, input, output, signal } from '@angular/core';\nimport { injectDisabled } from 'ng-primitives/internal';\nimport { injectDisposables } from 'ng-primitives/utils';\nimport { NgpMoveToken } from './move.token';\n\n/**\n * Inspired by react-aria useMove hook:\n * https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/interactions/src/useMove.ts\n */\n\n@Directive({\n standalone: true,\n selector: '[ngpMove]',\n exportAs: 'ngpMove',\n providers: [{ provide: NgpMoveToken, useExisting: NgpMove }],\n host: {\n '[attr.data-move]': 'isMoving()',\n },\n})\nexport class NgpMove {\n /**\n * Access the disposable helper.\n */\n private readonly disposables = injectDisposables();\n\n /**\n * Whether movement is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMoveDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Access the disabled state from any parent.\n */\n private readonly isDisabled = injectDisabled(this.disabled);\n\n /**\n * Emit when the move event begins.\n */\n readonly start = output<NgpMoveStartEvent>({\n alias: 'ngpMoveStart',\n });\n\n /**\n * Emit when the element is moved.\n */\n readonly move = output<NgpMoveEvent>({\n alias: 'ngpMove',\n });\n\n /**\n * Emit when the move event ends.\n */\n readonly end = output<NgpMoveEndEvent>({\n alias: 'ngpMoveEnd',\n });\n\n /**\n * Whether the element is currently being moved.\n */\n private isMoving = signal<boolean>(false);\n\n /**\n * Store the last x position of the element.\n */\n private x: number | null = null;\n\n /**\n * Store the last y position of the element.\n */\n private y: number | null = null;\n\n /**\n * Store the id of the last pointer.\n */\n private pointerId: number | null = null;\n\n /**\n * Store the disposable event listeners.\n */\n private disposableListeners: (() => void)[] = [];\n\n /**\n * Handle a move start.\n */\n private onMoveStart(event: PointerEvent | KeyboardEvent, pointerType: PointerType): void {\n this.start.emit({\n pointerType,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n altKey: event.altKey,\n });\n this.isMoving.set(true);\n }\n\n /**\n * Handle a move event.\n */\n private onMove(\n event: PointerEvent | KeyboardEvent,\n pointerType: PointerType,\n deltaX: number,\n deltaY: number,\n ): void {\n if (deltaX === 0 && deltaY === 0) {\n return;\n }\n\n this.move.emit({\n deltaX,\n deltaY,\n pointerType,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n altKey: event.altKey,\n });\n }\n\n /**\n * Handle a move end.\n */\n private onMoveEnd(event: PointerEvent | KeyboardEvent, pointerType: PointerType): void {\n this.end.emit({\n pointerType,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n altKey: event.altKey,\n });\n this.isMoving.set(false);\n }\n\n /**\n * Handle the pointer down event.\n */\n @HostListener('pointerdown', ['$event'])\n protected onPointerDown(event: PointerEvent): void {\n // ignore right-click or additional pointers\n if (event.button !== 0 || this.pointerId !== null || this.isDisabled()) {\n return;\n }\n\n // prevent the default behavior\n event.preventDefault();\n event.stopPropagation();\n\n this.onMoveStart(event, event.pointerType as PointerType);\n\n // store the pointer id and initial position\n this.pointerId = event.pointerId;\n this.x = event.pageX;\n this.y = event.pageY;\n\n // add global event listeners\n const pointerMove = this.disposables.addEventListener(\n window,\n 'pointermove',\n this.onPointerMove.bind(this) as EventListener,\n false,\n );\n\n const pointerUp = this.disposables.addEventListener(\n window,\n 'pointerup',\n this.onPointerUp.bind(this) as EventListener,\n false,\n );\n\n const pointerCancel = this.disposables.addEventListener(\n window,\n 'pointercancel',\n this.onPointerUp.bind(this) as EventListener,\n false,\n );\n\n // store the disposable event listeners\n this.disposableListeners = [pointerMove, pointerUp, pointerCancel];\n }\n\n /**\n * Handle the pointer up event.\n */\n protected onPointerUp(event: PointerEvent): void {\n if (this.pointerId !== event.pointerId) {\n return;\n }\n\n const pointerType = (event.pointerType ?? 'mouse') as PointerType;\n this.onMoveEnd(event, pointerType);\n this.pointerId = null;\n this.disposableListeners.forEach(dispose => dispose());\n }\n\n /**\n * Handle the pointer move event.\n */\n protected onPointerMove(event: PointerEvent): void {\n if (this.pointerId !== event.pointerId) {\n return;\n }\n\n // Problems with PointerEvent#movementX/movementY:\n // 1. it is always 0 on macOS Safari.\n // 2. On Chrome Android, it's scaled by devicePixelRatio, but not on Chrome macOS\n this.onMove(\n event,\n event.pointerType as PointerType,\n event.pageX - (this.x ?? 0),\n event.pageY - (this.y ?? 0),\n );\n this.x = event.pageX;\n this.y = event.pageY;\n }\n\n private triggerKeyboardMove(event: KeyboardEvent, deltaX: number, deltaY: number): void {\n if (this.isDisabled()) {\n return;\n }\n\n this.onMoveStart(event, 'keyboard');\n this.onMove(event, 'keyboard', deltaX, deltaY);\n this.onMoveEnd(event, 'keyboard');\n }\n\n @HostListener('keydown.ArrowUp', ['$event'])\n protected onArrowUp(event: KeyboardEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.triggerKeyboardMove(event, 0, -1);\n }\n\n @HostListener('keydown.ArrowDown', ['$event'])\n protected onArrowDown(event: KeyboardEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.triggerKeyboardMove(event, 0, 1);\n }\n\n @HostListener('keydown.ArrowLeft', ['$event'])\n protected onArrowLeft(event: KeyboardEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.triggerKeyboardMove(event, -1, 0);\n }\n\n @HostListener('keydown.ArrowRight', ['$event'])\n protected onArrowRight(event: KeyboardEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.triggerKeyboardMove(event, 1, 0);\n }\n}\n\ninterface NgpMoveBaseEvent {\n /**\n * Whether the event was triggered by a mouse or keyboard event.\n */\n pointerType: PointerType;\n /**\n * Whether the shift key was pressed during the event.\n */\n shiftKey: boolean;\n /**\n * Whether the control key was pressed during the event.\n */\n ctrlKey: boolean;\n /**\n * Whether the meta key was pressed during the event.\n */\n metaKey: boolean;\n /**\n * Whether the alt key was pressed during the event.\n */\n altKey: boolean;\n}\n\nexport type NgpMoveStartEvent = NgpMoveBaseEvent;\nexport type NgpMoveEndEvent = NgpMoveBaseEvent;\n\nexport interface NgpMoveEvent extends NgpMoveBaseEvent {\n /**\n * The amount of pixels moved in the x-axis.\n */\n deltaX: number;\n /**\n * The amount of pixels moved in the y-axis.\n */\n deltaY: number;\n}\n\nexport type PointerType = 'mouse' | 'pen' | 'touch' | 'keyboard' | 'virtual';\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nexport { NgpHover } from './hover/hover.directive';\nexport { NgpHoverToken, injectHover } from './hover/hover.token';\nexport { NgpFocus } from './focus/focus.directive';\nexport { NgpFocusToken } from './focus/focus.token';\nexport { NgpFocusVisible } from './focus-visible/focus-visible.directive';\nexport { NgpFocusVisibleToken } from './focus-visible/focus-visible.token';\nexport { NgpPress } from './press/press.directive';\nexport { NgpPressToken } from './press/press.token';\nexport { NgpMove } from './move/move.directive';\nexport { NgpMoveToken } from './move/move.token';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -155,7 +155,23 @@ function onChange(source, fn, options) {
|
|
|
155
155
|
* @param options
|
|
156
156
|
*/
|
|
157
157
|
function onBooleanChange(source, onTrue, onFalse, options) {
|
|
158
|
-
onChange(source, value => (value ? onTrue() : onFalse()), options);
|
|
158
|
+
onChange(source, value => (value ? onTrue?.() : onFalse?.()), options);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* A utility to sync the value of a signal with the Angular Forms onChange callback.
|
|
162
|
+
* @param source The signal to sync with the onChange callback.
|
|
163
|
+
* @param fn The onChange callback.
|
|
164
|
+
* @param options The options for the effect.
|
|
165
|
+
*/
|
|
166
|
+
function onFormControlChange(source, fn, options) {
|
|
167
|
+
const previousValue = signal(source());
|
|
168
|
+
effect(() => {
|
|
169
|
+
const value = source();
|
|
170
|
+
if (value !== previousValue() && value !== undefined && value !== null) {
|
|
171
|
+
fn?.(value);
|
|
172
|
+
previousValue.set(value);
|
|
173
|
+
}
|
|
174
|
+
}, { allowSignalWrites: true, injector: options?.injector });
|
|
159
175
|
}
|
|
160
176
|
|
|
161
177
|
/**
|
|
@@ -209,5 +225,5 @@ function injectDimensions() {
|
|
|
209
225
|
* Generated bundle index. Do not edit.
|
|
210
226
|
*/
|
|
211
227
|
|
|
212
|
-
export { FocusManager, injectDimensions, injectDisposables, onBooleanChange, onChange, uniqueId };
|
|
228
|
+
export { FocusManager, injectDimensions, injectDisposables, onBooleanChange, onChange, onFormControlChange, uniqueId };
|
|
213
229
|
//# sourceMappingURL=ng-primitives-utils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-primitives-utils.mjs","sources":["../../../../packages/ng-primitives/utils/src/helpers/disposables.ts","../../../../packages/ng-primitives/utils/src/helpers/focus-manager.ts","../../../../packages/ng-primitives/utils/src/helpers/unique-id.ts","../../../../packages/ng-primitives/utils/src/signals/async.ts","../../../../packages/ng-primitives/utils/src/ui/dimensions.ts","../../../../packages/ng-primitives/utils/src/index.ts","../../../../packages/ng-primitives/utils/src/ng-primitives-utils.ts"],"sourcesContent":["/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { DestroyRef, inject } from '@angular/core';\n\n/**\n * Disposable functions are a way to manage timers, intervals, and event listeners\n * that should be cleared when a component is destroyed.\n *\n * This is heavily inspired by Headless UI disposables:\n * https://github.com/tailwindlabs/headlessui/blob/main/packages/%40headlessui-react/src/utils/disposables.ts\n */\nexport function injectDisposables() {\n const destroyRef = inject(DestroyRef);\n\n return {\n /**\n * Set a timeout that will be cleared when the component is destroyed.\n * @param callback The callback to execute\n * @param delay The delay before the callback is executed\n * @returns A function to clear the timeout\n */\n setTimeout: (callback: () => void, delay: number) => {\n const id = setTimeout(callback, delay);\n const cleanup = () => clearTimeout(id);\n destroyRef.onDestroy(cleanup);\n return cleanup;\n },\n /**\n * Set an interval that will be cleared when the component is destroyed.\n * @param callback The callback to execute\n * @param delay The delay before the callback is executed\n * @param target\n * @param type\n * @param listener\n * @param options\n * @returns A function to clear the interval\n */\n addEventListener: (\n target: EventTarget,\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => {\n target.addEventListener(type, listener, options);\n const cleanup = () => target.removeEventListener(type, listener, options);\n destroyRef.onDestroy(cleanup);\n return cleanup;\n },\n /**\n * Set an interval that will be cleared when the component is destroyed.\n * @param callback The callback to execute\n * @param delay The delay before the callback is executed\n * @returns A function to clear the interval\n */\n setInterval: (callback: () => void, delay: number) => {\n const id = setInterval(callback, delay);\n const cleanup = () => clearInterval(id);\n destroyRef.onDestroy(cleanup);\n return cleanup;\n },\n /**\n * Set a requestAnimationFrame that will be cleared when the component is destroyed.\n * @param callback The callback to execute\n * @returns A function to clear the requestAnimationFrame\n */\n requestAnimationFrame: (callback: FrameRequestCallback) => {\n const id = requestAnimationFrame(callback);\n const cleanup = () => cancelAnimationFrame(id);\n destroyRef.onDestroy(cleanup);\n return cleanup;\n },\n };\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { FocusOrigin } from '@angular/cdk/a11y';\nimport { coerceElement } from '@angular/cdk/coercion';\nimport { ElementRef, Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FocusManager {\n /**\n * Focus an element with an optional origin.\n */\n focus(element: ElementRef<HTMLElement>, origin?: FocusOrigin): void;\n focus(element: HTMLElement, origin?: FocusOrigin): void;\n focus(element: ElementRef<HTMLElement> | HTMLElement, origin: FocusOrigin = 'program'): void {\n element = coerceElement(element);\n\n switch (origin) {\n case 'keyboard':\n // trigger the focus-visible state for keyboard users\n element.contentEditable = 'true';\n element.focus({ preventScroll: true });\n element.contentEditable = 'false';\n break;\n default:\n element.focus();\n break;\n }\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * Store a map of unique ids for elements so that there are no collisions.\n */\nconst uniqueIdMap = new Map<string, number>();\n\n/**\n * Generate a unique id for an element\n * @param prefix - The prefix to use for the id\n * @returns The generated id\n */\nexport function uniqueId(prefix: string): string {\n const id = uniqueIdMap.get(prefix) ?? 0;\n uniqueIdMap.set(prefix, id + 1);\n return `${prefix}-${id}`;\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { Injector, Signal, effect, signal } from '@angular/core';\n\n/**\n * Listen for changes to a signal and call a function when the signal changes.\n * @param source\n * @param fn\n * @param options\n * @param options.injector\n * @internal\n */\nexport function onChange<T>(\n source: Signal<T | null | undefined>,\n fn: (value: T | null | undefined, previousValue: T | null | undefined) => void,\n options?: { injector: Injector },\n): void {\n const previousValue = signal(source());\n\n effect(\n () => {\n const value = source();\n if (value !== previousValue()) {\n fn(value, previousValue());\n previousValue.set(value);\n }\n },\n { allowSignalWrites: true, injector: options?.injector },\n );\n\n // call the fn with the initial value\n fn(source(), null);\n}\n\n/**\n * Listen for changes to a boolean signal and call one of two functions when the signal changes.\n * @param source\n * @param onTrue\n * @param onFalse\n * @param options\n */\nexport function onBooleanChange(\n source: Signal<boolean>,\n onTrue: () => void,\n onFalse: () => void,\n options?: { injector: Injector },\n): void {\n onChange(source, value => (value ? onTrue() : onFalse()), options);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport {\n AfterRenderPhase,\n ElementRef,\n Renderer2,\n afterNextRender,\n inject,\n signal,\n} from '@angular/core';\n\n/**\n * Injects the dimensions of the element\n * @returns The dimensions of the element\n */\nexport function injectDimensions() {\n const renderer = inject(Renderer2);\n const element = inject<ElementRef<HTMLElement>>(ElementRef);\n const size = signal<{ width: number; height: number; mounted: boolean }>({\n width: 0,\n height: 0,\n mounted: false,\n });\n let transitionDuration: string | undefined, animationName: string | undefined;\n\n afterNextRender(\n () => {\n transitionDuration = element.nativeElement.style.transitionDuration;\n animationName = element.nativeElement.style.animationName;\n },\n { phase: AfterRenderPhase.EarlyRead },\n );\n\n afterNextRender(\n () => {\n // block any animations/transitions so the element renders at its full dimensions\n renderer.setStyle(element.nativeElement, 'transitionDuration', '0s');\n renderer.setStyle(element.nativeElement, 'animationName', 'none');\n },\n { phase: AfterRenderPhase.Write },\n );\n\n afterNextRender(\n () => {\n const { width, height } = element.nativeElement.getBoundingClientRect();\n size.set({ width, height, mounted: true });\n\n // restore the original transition duration and animation name\n renderer.setStyle(element.nativeElement, 'transitionDuration', transitionDuration);\n renderer.setStyle(element.nativeElement, 'animationName', animationName);\n },\n { phase: AfterRenderPhase.Read },\n );\n\n return size;\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nexport { injectDisposables } from './helpers/disposables';\nexport { FocusManager } from './helpers/focus-manager';\nexport { uniqueId } from './helpers/unique-id';\nexport { onBooleanChange, onChange } from './signals/async';\nexport { injectDimensions } from './ui/dimensions';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ng-primitives-utils.mjs","sources":["../../../../packages/ng-primitives/utils/src/helpers/disposables.ts","../../../../packages/ng-primitives/utils/src/helpers/focus-manager.ts","../../../../packages/ng-primitives/utils/src/helpers/unique-id.ts","../../../../packages/ng-primitives/utils/src/signals/async.ts","../../../../packages/ng-primitives/utils/src/ui/dimensions.ts","../../../../packages/ng-primitives/utils/src/index.ts","../../../../packages/ng-primitives/utils/src/ng-primitives-utils.ts"],"sourcesContent":["/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { DestroyRef, inject } from '@angular/core';\n\n/**\n * Disposable functions are a way to manage timers, intervals, and event listeners\n * that should be cleared when a component is destroyed.\n *\n * This is heavily inspired by Headless UI disposables:\n * https://github.com/tailwindlabs/headlessui/blob/main/packages/%40headlessui-react/src/utils/disposables.ts\n */\nexport function injectDisposables() {\n const destroyRef = inject(DestroyRef);\n\n return {\n /**\n * Set a timeout that will be cleared when the component is destroyed.\n * @param callback The callback to execute\n * @param delay The delay before the callback is executed\n * @returns A function to clear the timeout\n */\n setTimeout: (callback: () => void, delay: number) => {\n const id = setTimeout(callback, delay);\n const cleanup = () => clearTimeout(id);\n destroyRef.onDestroy(cleanup);\n return cleanup;\n },\n /**\n * Set an interval that will be cleared when the component is destroyed.\n * @param callback The callback to execute\n * @param delay The delay before the callback is executed\n * @param target\n * @param type\n * @param listener\n * @param options\n * @returns A function to clear the interval\n */\n addEventListener: (\n target: EventTarget,\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => {\n target.addEventListener(type, listener, options);\n const cleanup = () => target.removeEventListener(type, listener, options);\n destroyRef.onDestroy(cleanup);\n return cleanup;\n },\n /**\n * Set an interval that will be cleared when the component is destroyed.\n * @param callback The callback to execute\n * @param delay The delay before the callback is executed\n * @returns A function to clear the interval\n */\n setInterval: (callback: () => void, delay: number) => {\n const id = setInterval(callback, delay);\n const cleanup = () => clearInterval(id);\n destroyRef.onDestroy(cleanup);\n return cleanup;\n },\n /**\n * Set a requestAnimationFrame that will be cleared when the component is destroyed.\n * @param callback The callback to execute\n * @returns A function to clear the requestAnimationFrame\n */\n requestAnimationFrame: (callback: FrameRequestCallback) => {\n const id = requestAnimationFrame(callback);\n const cleanup = () => cancelAnimationFrame(id);\n destroyRef.onDestroy(cleanup);\n return cleanup;\n },\n };\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { FocusOrigin } from '@angular/cdk/a11y';\nimport { coerceElement } from '@angular/cdk/coercion';\nimport { ElementRef, Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FocusManager {\n /**\n * Focus an element with an optional origin.\n */\n focus(element: ElementRef<HTMLElement>, origin?: FocusOrigin): void;\n focus(element: HTMLElement, origin?: FocusOrigin): void;\n focus(element: ElementRef<HTMLElement> | HTMLElement, origin: FocusOrigin = 'program'): void {\n element = coerceElement(element);\n\n switch (origin) {\n case 'keyboard':\n // trigger the focus-visible state for keyboard users\n element.contentEditable = 'true';\n element.focus({ preventScroll: true });\n element.contentEditable = 'false';\n break;\n default:\n element.focus();\n break;\n }\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * Store a map of unique ids for elements so that there are no collisions.\n */\nconst uniqueIdMap = new Map<string, number>();\n\n/**\n * Generate a unique id for an element\n * @param prefix - The prefix to use for the id\n * @returns The generated id\n */\nexport function uniqueId(prefix: string): string {\n const id = uniqueIdMap.get(prefix) ?? 0;\n uniqueIdMap.set(prefix, id + 1);\n return `${prefix}-${id}`;\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { Injector, Signal, effect, signal } from '@angular/core';\n\n/**\n * Listen for changes to a signal and call a function when the signal changes.\n * @param source\n * @param fn\n * @param options\n * @param options.injector\n * @internal\n */\nexport function onChange<T>(\n source: Signal<T | null | undefined>,\n fn: (value: T | null | undefined, previousValue: T | null | undefined) => void,\n options?: { injector: Injector },\n): void {\n const previousValue = signal(source());\n\n effect(\n () => {\n const value = source();\n if (value !== previousValue()) {\n fn(value, previousValue());\n previousValue.set(value);\n }\n },\n { allowSignalWrites: true, injector: options?.injector },\n );\n\n // call the fn with the initial value\n fn(source(), null);\n}\n\n/**\n * Listen for changes to a boolean signal and call one of two functions when the signal changes.\n * @param source\n * @param onTrue\n * @param onFalse\n * @param options\n */\nexport function onBooleanChange(\n source: Signal<boolean>,\n onTrue?: () => void,\n onFalse?: () => void,\n options?: { injector: Injector },\n): void {\n onChange(source, value => (value ? onTrue?.() : onFalse?.()), options);\n}\n\n/**\n * A utility to sync the value of a signal with the Angular Forms onChange callback.\n * @param source The signal to sync with the onChange callback.\n * @param fn The onChange callback.\n * @param options The options for the effect.\n */\nexport function onFormControlChange<T>(\n source: Signal<T | null | undefined>,\n fn?: (value: T) => void,\n options?: { injector: Injector },\n): void {\n const previousValue = signal(source());\n\n effect(\n () => {\n const value = source();\n\n if (value !== previousValue() && value !== undefined && value !== null) {\n fn?.(value);\n previousValue.set(value);\n }\n },\n { allowSignalWrites: true, injector: options?.injector },\n );\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport {\n AfterRenderPhase,\n ElementRef,\n Renderer2,\n afterNextRender,\n inject,\n signal,\n} from '@angular/core';\n\n/**\n * Injects the dimensions of the element\n * @returns The dimensions of the element\n */\nexport function injectDimensions() {\n const renderer = inject(Renderer2);\n const element = inject<ElementRef<HTMLElement>>(ElementRef);\n const size = signal<{ width: number; height: number; mounted: boolean }>({\n width: 0,\n height: 0,\n mounted: false,\n });\n let transitionDuration: string | undefined, animationName: string | undefined;\n\n afterNextRender(\n () => {\n transitionDuration = element.nativeElement.style.transitionDuration;\n animationName = element.nativeElement.style.animationName;\n },\n { phase: AfterRenderPhase.EarlyRead },\n );\n\n afterNextRender(\n () => {\n // block any animations/transitions so the element renders at its full dimensions\n renderer.setStyle(element.nativeElement, 'transitionDuration', '0s');\n renderer.setStyle(element.nativeElement, 'animationName', 'none');\n },\n { phase: AfterRenderPhase.Write },\n );\n\n afterNextRender(\n () => {\n const { width, height } = element.nativeElement.getBoundingClientRect();\n size.set({ width, height, mounted: true });\n\n // restore the original transition duration and animation name\n renderer.setStyle(element.nativeElement, 'transitionDuration', transitionDuration);\n renderer.setStyle(element.nativeElement, 'animationName', animationName);\n },\n { phase: AfterRenderPhase.Read },\n );\n\n return size;\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nexport { injectDisposables } from './helpers/disposables';\nexport { FocusManager } from './helpers/focus-manager';\nexport { uniqueId } from './helpers/unique-id';\nexport { onBooleanChange, onChange, onFormControlChange } from './signals/async';\nexport { injectDimensions } from './ui/dimensions';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/generators.json
CHANGED
|
@@ -19,6 +19,11 @@
|
|
|
19
19
|
"factory": "./schematics/form-field/generator",
|
|
20
20
|
"schema": "./schematics/form-field/schema.json",
|
|
21
21
|
"description": "Add a form field component to the project."
|
|
22
|
+
},
|
|
23
|
+
"checkbox": {
|
|
24
|
+
"factory": "./schematics/checkbox/generator",
|
|
25
|
+
"schema": "./schematics/checkbox/schema.json",
|
|
26
|
+
"description": "Add a checkbox component to the project."
|
|
22
27
|
}
|
|
23
28
|
},
|
|
24
29
|
"schematics": {
|
|
@@ -42,6 +47,11 @@
|
|
|
42
47
|
"description": "Add a form field component to the project.",
|
|
43
48
|
"factory": "./schematics/form-field/compat",
|
|
44
49
|
"schema": "./schematics/form-field/schema.json"
|
|
50
|
+
},
|
|
51
|
+
"checkbox": {
|
|
52
|
+
"factory": "./schematics/checkbox/compat",
|
|
53
|
+
"schema": "./schematics/checkbox/schema.json",
|
|
54
|
+
"description": "Add a checkbox component to the project."
|
|
45
55
|
}
|
|
46
56
|
}
|
|
47
57
|
}
|
|
@@ -27,10 +27,11 @@ export declare class NgpFocusVisible {
|
|
|
27
27
|
protected readonly isFocused: import("@angular/core").WritableSignal<boolean>;
|
|
28
28
|
constructor();
|
|
29
29
|
private onFocus;
|
|
30
|
+
private onBlur;
|
|
30
31
|
/**
|
|
31
|
-
*
|
|
32
|
+
* Trigger the focus signal along with the focusChange event.
|
|
32
33
|
*/
|
|
33
|
-
|
|
34
|
+
private focus;
|
|
34
35
|
private alwaysShowFocus;
|
|
35
36
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgpFocusVisible, never>;
|
|
36
37
|
static ɵdir: i0.ɵɵDirectiveDeclaration<NgpFocusVisible, "[ngpFocusVisible]", ["ngpFocusVisible"], { "disabled": { "alias": "ngpFocusVisibleDisabled"; "required": false; "isSignal": true; }; }, { "focusChange": "ngpFocusVisible"; }, never, never, true, never>;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ng-primitives",
|
|
3
3
|
"license": "Apache-2.0",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.9.0",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/core": ">=18.0.0",
|
|
7
7
|
"@angular/cdk": ">=18.0.0",
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
"@angular/common": ">=18.0.0"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"nx": "^19.3.1",
|
|
15
14
|
"@nx/devkit": "^19.3.1",
|
|
15
|
+
"nx": "^19.3.1",
|
|
16
16
|
"tslib": "^2.3.0"
|
|
17
17
|
},
|
|
18
18
|
"ng-add": {
|
|
@@ -50,36 +50,36 @@
|
|
|
50
50
|
"esm": "./esm2022/accordion/ng-primitives-accordion.mjs",
|
|
51
51
|
"default": "./fesm2022/ng-primitives-accordion.mjs"
|
|
52
52
|
},
|
|
53
|
-
"./avatar": {
|
|
54
|
-
"types": "./avatar/index.d.ts",
|
|
55
|
-
"esm2022": "./esm2022/avatar/ng-primitives-avatar.mjs",
|
|
56
|
-
"esm": "./esm2022/avatar/ng-primitives-avatar.mjs",
|
|
57
|
-
"default": "./fesm2022/ng-primitives-avatar.mjs"
|
|
58
|
-
},
|
|
59
53
|
"./autofill": {
|
|
60
54
|
"types": "./autofill/index.d.ts",
|
|
61
55
|
"esm2022": "./esm2022/autofill/ng-primitives-autofill.mjs",
|
|
62
56
|
"esm": "./esm2022/autofill/ng-primitives-autofill.mjs",
|
|
63
57
|
"default": "./fesm2022/ng-primitives-autofill.mjs"
|
|
64
58
|
},
|
|
59
|
+
"./avatar": {
|
|
60
|
+
"types": "./avatar/index.d.ts",
|
|
61
|
+
"esm2022": "./esm2022/avatar/ng-primitives-avatar.mjs",
|
|
62
|
+
"esm": "./esm2022/avatar/ng-primitives-avatar.mjs",
|
|
63
|
+
"default": "./fesm2022/ng-primitives-avatar.mjs"
|
|
64
|
+
},
|
|
65
65
|
"./button": {
|
|
66
66
|
"types": "./button/index.d.ts",
|
|
67
67
|
"esm2022": "./esm2022/button/ng-primitives-button.mjs",
|
|
68
68
|
"esm": "./esm2022/button/ng-primitives-button.mjs",
|
|
69
69
|
"default": "./fesm2022/ng-primitives-button.mjs"
|
|
70
70
|
},
|
|
71
|
-
"./checkbox": {
|
|
72
|
-
"types": "./checkbox/index.d.ts",
|
|
73
|
-
"esm2022": "./esm2022/checkbox/ng-primitives-checkbox.mjs",
|
|
74
|
-
"esm": "./esm2022/checkbox/ng-primitives-checkbox.mjs",
|
|
75
|
-
"default": "./fesm2022/ng-primitives-checkbox.mjs"
|
|
76
|
-
},
|
|
77
71
|
"./date-picker": {
|
|
78
72
|
"types": "./date-picker/index.d.ts",
|
|
79
73
|
"esm2022": "./esm2022/date-picker/ng-primitives-date-picker.mjs",
|
|
80
74
|
"esm": "./esm2022/date-picker/ng-primitives-date-picker.mjs",
|
|
81
75
|
"default": "./fesm2022/ng-primitives-date-picker.mjs"
|
|
82
76
|
},
|
|
77
|
+
"./checkbox": {
|
|
78
|
+
"types": "./checkbox/index.d.ts",
|
|
79
|
+
"esm2022": "./esm2022/checkbox/ng-primitives-checkbox.mjs",
|
|
80
|
+
"esm": "./esm2022/checkbox/ng-primitives-checkbox.mjs",
|
|
81
|
+
"default": "./fesm2022/ng-primitives-checkbox.mjs"
|
|
82
|
+
},
|
|
83
83
|
"./date-time": {
|
|
84
84
|
"types": "./date-time/index.d.ts",
|
|
85
85
|
"esm2022": "./esm2022/date-time/ng-primitives-date-time.mjs",
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* Copyright © 2024 Angular Primitives.
|
|
5
|
+
* https://github.com/ng-primitives/ng-primitives
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the Apache 2.0 license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
const devkit_1 = require("@nx/devkit");
|
|
11
|
+
const generator_1 = require("./generator");
|
|
12
|
+
exports.default = (0, devkit_1.convertNxGenerator)(generator_1.default);
|
|
13
|
+
//# sourceMappingURL=compat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compat.js","sourceRoot":"","sources":["../../../../../packages/ng-primitives/schematics/checkbox/compat.ts"],"names":[],"mappings":";;AAAA;;;;;;GAMG;AACH,uCAAgD;AAChD,2CAA4C;AAE5C,kBAAe,IAAA,2BAAkB,EAAC,mBAAiB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%- styles %>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%- template %>
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { forwardRef, model, Component } from '@angular/core';
|
|
2
|
+
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
+
import { NgpCheckbox } from 'ng-primitives/checkbox';
|
|
4
|
+
import { onChange } from 'ng-primitives/utils';
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@Component({
|
|
8
|
+
standalone: true,
|
|
9
|
+
selector: '<%= selector %>',
|
|
10
|
+
hostDirectives: [
|
|
11
|
+
{
|
|
12
|
+
directive: NgpCheckbox,
|
|
13
|
+
inputs: ['ngpCheckboxChecked:checked'],
|
|
14
|
+
outputs: ['ngpCheckboxCheckedChange:checkedChange'],
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
providers: [
|
|
18
|
+
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => <%= className %>Component), multi: true },
|
|
19
|
+
],
|
|
20
|
+
<%_ if (inlineTemplate) { -%>
|
|
21
|
+
template: `<%- template %>`,
|
|
22
|
+
<%_ } else { -%>
|
|
23
|
+
templateUrl: './<%= name %>.component.html',
|
|
24
|
+
<%_ } -%>
|
|
25
|
+
<%_ if (inlineStyle) { -%>
|
|
26
|
+
styles: `<%- styles %>`,
|
|
27
|
+
<%_ } else { -%>
|
|
28
|
+
styleUrl: './<%= name %>.component.<%= style %>',
|
|
29
|
+
<%_ } -%>
|
|
30
|
+
host: {
|
|
31
|
+
'(focusout)': 'onTouched?.()',
|
|
32
|
+
},
|
|
33
|
+
})
|
|
34
|
+
export class <%= className %>Component implements ControlValueAccessor {
|
|
35
|
+
/**
|
|
36
|
+
* The checked state of the checkbox.
|
|
37
|
+
*/
|
|
38
|
+
readonly checked = model<boolean>(false);
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The onChange callback.
|
|
42
|
+
*/
|
|
43
|
+
private onChange?: (value: boolean) => void;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The onTouched callback.
|
|
47
|
+
*/
|
|
48
|
+
protected onTouched?: () => void;
|
|
49
|
+
|
|
50
|
+
constructor() {
|
|
51
|
+
onChange(this.checked, (value) => {
|
|
52
|
+
if (value !== undefined) {
|
|
53
|
+
this.onChange?.(value!);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
writeValue(checked: boolean): void {
|
|
59
|
+
this.checked.set(checked);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
registerOnChange(fn: (value: boolean) => void): void {
|
|
63
|
+
this.onChange = fn;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
registerOnTouched(fn: () => void): void {
|
|
67
|
+
this.onTouched = fn;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright © 2024 Angular Primitives.
|
|
3
|
+
* https://github.com/ng-primitives/ng-primitives
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the Apache 2.0 license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
import { Tree } from '@nx/devkit';
|
|
9
|
+
import { CheckboxGeneratorSchema } from './schema';
|
|
10
|
+
export declare function checkboxGenerator(tree: Tree, options: CheckboxGeneratorSchema): Promise<void>;
|
|
11
|
+
export default checkboxGenerator;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkboxGenerator = checkboxGenerator;
|
|
4
|
+
/**
|
|
5
|
+
* Copyright © 2024 Angular Primitives.
|
|
6
|
+
* https://github.com/ng-primitives/ng-primitives
|
|
7
|
+
*
|
|
8
|
+
* This source code is licensed under the Apache 2.0 license found in the
|
|
9
|
+
* LICENSE file in the root directory of this source tree.
|
|
10
|
+
*/
|
|
11
|
+
const devkit_1 = require("@nx/devkit");
|
|
12
|
+
const path = require("path");
|
|
13
|
+
const styles = `
|
|
14
|
+
:host {
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
:host[data-hover='true'] {
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
:host[data-checked='true'] {
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
:host[data-focus-visible='true'] {
|
|
24
|
+
}
|
|
25
|
+
`;
|
|
26
|
+
const template = `
|
|
27
|
+
@if (checked()) {
|
|
28
|
+
<!-- Add checkmark here -->
|
|
29
|
+
}`;
|
|
30
|
+
async function checkboxGenerator(tree, options) {
|
|
31
|
+
const { fileName } = (0, devkit_1.names)(options.name);
|
|
32
|
+
(0, devkit_1.generateFiles)(tree, path.join(__dirname, 'files'), options.directory, {
|
|
33
|
+
...options,
|
|
34
|
+
...(0, devkit_1.names)(options.name),
|
|
35
|
+
selector: `${options.prefix}-${fileName}`,
|
|
36
|
+
styles,
|
|
37
|
+
template,
|
|
38
|
+
});
|
|
39
|
+
if (options.inlineStyle) {
|
|
40
|
+
tree.delete(path.join(options.directory, `${fileName}.component.${options.style}`));
|
|
41
|
+
}
|
|
42
|
+
if (options.inlineTemplate) {
|
|
43
|
+
tree.delete(path.join(options.directory, `${fileName}.component.html`));
|
|
44
|
+
}
|
|
45
|
+
await (0, devkit_1.formatFiles)(tree);
|
|
46
|
+
}
|
|
47
|
+
exports.default = checkboxGenerator;
|
|
48
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../packages/ng-primitives/schematics/checkbox/generator.ts"],"names":[],"mappings":";;AA6BA,8CAoBC;AAjDD;;;;;;GAMG;AACH,uCAAqE;AACrE,6BAA6B;AAG7B,MAAM,MAAM,GAAG;;;;;;;;;;;;CAYd,CAAC;AACF,MAAM,QAAQ,GAAG;;;EAGf,CAAC;AAEI,KAAK,UAAU,iBAAiB,CAAC,IAAU,EAAE,OAAgC;IAClF,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,cAAK,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE;QACpE,GAAG,OAAO;QACV,GAAG,IAAA,cAAK,EAAC,OAAO,CAAC,IAAI,CAAC;QACtB,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI,QAAQ,EAAE;QACzC,MAAM;QACN,QAAQ;KACT,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,QAAQ,cAAc,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,QAAQ,iBAAiB,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,kBAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright © 2024 Angular Primitives.
|
|
3
|
+
* https://github.com/ng-primitives/ng-primitives
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the Apache 2.0 license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface CheckboxGeneratorSchema {
|
|
10
|
+
name: string;
|
|
11
|
+
prefix: string;
|
|
12
|
+
directory: string;
|
|
13
|
+
style: 'css' | 'scss';
|
|
14
|
+
inlineStyle: boolean;
|
|
15
|
+
inlineTemplate: boolean;
|
|
16
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema",
|
|
3
|
+
"$id": "Checkbox",
|
|
4
|
+
"title": "",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"name": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"description": "The name of the component",
|
|
10
|
+
"default": "checkbox"
|
|
11
|
+
},
|
|
12
|
+
"prefix": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"description": "The prefix to apply to the generated component selector.",
|
|
15
|
+
"default": "app"
|
|
16
|
+
},
|
|
17
|
+
"directory": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"description": "The directory at which to create the component file",
|
|
20
|
+
"default": ""
|
|
21
|
+
},
|
|
22
|
+
"style": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"description": "The file extension or preprocessor to use for style files, or `none` to skip generating the style file.",
|
|
25
|
+
"default": "css",
|
|
26
|
+
"enum": ["scss", "css"]
|
|
27
|
+
},
|
|
28
|
+
"inlineStyle": {
|
|
29
|
+
"type": "boolean",
|
|
30
|
+
"description": "Include styles inline in the component.ts file. Only CSS styles can be included inline.",
|
|
31
|
+
"default": true
|
|
32
|
+
},
|
|
33
|
+
"inlineTemplate": {
|
|
34
|
+
"type": "boolean",
|
|
35
|
+
"description": "Include template inline in the component.ts file",
|
|
36
|
+
"default": true
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
package/utils/index.d.ts
CHANGED
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
export { injectDisposables } from './helpers/disposables';
|
|
9
9
|
export { FocusManager } from './helpers/focus-manager';
|
|
10
10
|
export { uniqueId } from './helpers/unique-id';
|
|
11
|
-
export { onBooleanChange, onChange } from './signals/async';
|
|
11
|
+
export { onBooleanChange, onChange, onFormControlChange } from './signals/async';
|
|
12
12
|
export { injectDimensions } from './ui/dimensions';
|
package/utils/signals/async.d.ts
CHANGED
|
@@ -24,6 +24,15 @@ export declare function onChange<T>(source: Signal<T | null | undefined>, fn: (v
|
|
|
24
24
|
* @param onFalse
|
|
25
25
|
* @param options
|
|
26
26
|
*/
|
|
27
|
-
export declare function onBooleanChange(source: Signal<boolean>, onTrue
|
|
27
|
+
export declare function onBooleanChange(source: Signal<boolean>, onTrue?: () => void, onFalse?: () => void, options?: {
|
|
28
|
+
injector: Injector;
|
|
29
|
+
}): void;
|
|
30
|
+
/**
|
|
31
|
+
* A utility to sync the value of a signal with the Angular Forms onChange callback.
|
|
32
|
+
* @param source The signal to sync with the onChange callback.
|
|
33
|
+
* @param fn The onChange callback.
|
|
34
|
+
* @param options The options for the effect.
|
|
35
|
+
*/
|
|
36
|
+
export declare function onFormControlChange<T>(source: Signal<T | null | undefined>, fn?: (value: T) => void, options?: {
|
|
28
37
|
injector: Injector;
|
|
29
38
|
}): void;
|