@odx/angular 12.15.1 → 12.16.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/CHANGELOG.md +6 -0
- package/components/anchor-navigation/anchor-navigation.component.d.ts +7 -1
- package/components/anchor-navigation/anchor-navigation.service.d.ts +7 -0
- package/esm2022/components/anchor-navigation/anchor-navigation.component.mjs +11 -2
- package/esm2022/components/anchor-navigation/anchor-navigation.service.mjs +12 -4
- package/fesm2022/odx-angular-components-anchor-navigation.mjs +21 -4
- package/fesm2022/odx-angular-components-anchor-navigation.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -13,6 +13,12 @@ export declare class AnchorNavigationComponent {
|
|
|
13
13
|
* Defaults to `false` (horizontal).
|
|
14
14
|
*/
|
|
15
15
|
vertical: import("@angular/core").InputSignalWithTransform<boolean, boolean>;
|
|
16
|
+
/**
|
|
17
|
+
* Input to specify the threshold for the IntersectionObserver.
|
|
18
|
+
* This determines how much of the target element must be visible before it is considered intersecting.
|
|
19
|
+
* Defaults to `0.5` (50% visibility).
|
|
20
|
+
*/
|
|
21
|
+
threshold: import("@angular/core").InputSignalWithTransform<number, number>;
|
|
16
22
|
/**
|
|
17
23
|
* Input to specify the scrollable container element or document whose scroll position
|
|
18
24
|
* is used to determine the active anchor link. If not provided, defaults to the
|
|
@@ -27,5 +33,5 @@ export declare class AnchorNavigationComponent {
|
|
|
27
33
|
*/
|
|
28
34
|
scrollToAnchor(anchor: AnchorNavigationItemComponent): void;
|
|
29
35
|
static ɵfac: i0.ɵɵFactoryDeclaration<AnchorNavigationComponent, never>;
|
|
30
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<AnchorNavigationComponent, "odx-anchor-navigation", never, { "vertical": { "alias": "vertical"; "required": false; "isSignal": true; }; "scrollableContainer": { "alias": "root"; "required": false; "isSignal": true; }; }, {}, ["projectedAnchorLinks"], ["odx-anchor-navigation-item"], true, never>;
|
|
36
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<AnchorNavigationComponent, "odx-anchor-navigation", never, { "vertical": { "alias": "vertical"; "required": false; "isSignal": true; }; "threshold": { "alias": "threshold"; "required": false; "isSignal": true; }; "scrollableContainer": { "alias": "root"; "required": false; "isSignal": true; }; }, {}, ["projectedAnchorLinks"], ["odx-anchor-navigation-item"], true, never>;
|
|
31
37
|
}
|
|
@@ -6,6 +6,13 @@ export declare class AnchorNavigationService implements OnDestroy {
|
|
|
6
6
|
private intersectionObserver?;
|
|
7
7
|
private readonly intersectionStates;
|
|
8
8
|
private readonly targetScrollSections;
|
|
9
|
+
/**
|
|
10
|
+
* @internal
|
|
11
|
+
* A WritableSignal holding the threshold for the IntersectionObserver.
|
|
12
|
+
* This determines how much of the target element must be visible before it is considered intersecting.
|
|
13
|
+
* Defaults to 0.5 (50% visibility).
|
|
14
|
+
*/
|
|
15
|
+
readonly threshold: WritableSignal<number>;
|
|
9
16
|
/**
|
|
10
17
|
* A WritableSignal holding the scrollable container element or document.
|
|
11
18
|
* This is set by the AnchorNavigationComponent.
|
|
@@ -19,6 +19,14 @@ let AnchorNavigationComponent = class AnchorNavigationComponent {
|
|
|
19
19
|
* Defaults to `false` (horizontal).
|
|
20
20
|
*/
|
|
21
21
|
this.vertical = input(false, { transform: booleanAttribute });
|
|
22
|
+
/**
|
|
23
|
+
* Input to specify the threshold for the IntersectionObserver.
|
|
24
|
+
* This determines how much of the target element must be visible before it is considered intersecting.
|
|
25
|
+
* Defaults to `0.5` (50% visibility).
|
|
26
|
+
*/
|
|
27
|
+
this.threshold = input(0.5, {
|
|
28
|
+
transform: (value) => Math.max(0, Math.min(value, 1)),
|
|
29
|
+
});
|
|
22
30
|
/**
|
|
23
31
|
* Input to specify the scrollable container element or document whose scroll position
|
|
24
32
|
* is used to determine the active anchor link. If not provided, defaults to the
|
|
@@ -29,6 +37,7 @@ let AnchorNavigationComponent = class AnchorNavigationComponent {
|
|
|
29
37
|
this.activeAnchorLink = this.service.activeAnchorLink;
|
|
30
38
|
effect(() => {
|
|
31
39
|
this.service.projectedAnchorLinks.set(this.projectedAnchorLinks());
|
|
40
|
+
this.service.threshold.set(this.threshold());
|
|
32
41
|
const rcInput = this.scrollableContainer();
|
|
33
42
|
if (rcInput !== undefined) {
|
|
34
43
|
this.service.scrollableContainer.set(rcInput);
|
|
@@ -43,7 +52,7 @@ let AnchorNavigationComponent = class AnchorNavigationComponent {
|
|
|
43
52
|
this.service.scrollToAnchor(anchor);
|
|
44
53
|
}
|
|
45
54
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnchorNavigationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
46
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.13", type: AnchorNavigationComponent, isStandalone: true, selector: "odx-anchor-navigation", inputs: { vertical: { classPropertyName: "vertical", publicName: "vertical", isSignal: true, isRequired: false, transformFunction: null }, scrollableContainer: { classPropertyName: "scrollableContainer", publicName: "root", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.odx-anchor-navigation--vertical": "vertical()", "attr.role": "\"navigation\"" } }, providers: [AnchorNavigationService], queries: [{ propertyName: "projectedAnchorLinks", predicate: AnchorNavigationItemComponent, isSignal: true }], ngImport: i0, template: "<ng-content select=\"odx-anchor-navigation-item\" />\n", changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
55
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.13", type: AnchorNavigationComponent, isStandalone: true, selector: "odx-anchor-navigation", inputs: { vertical: { classPropertyName: "vertical", publicName: "vertical", isSignal: true, isRequired: false, transformFunction: null }, threshold: { classPropertyName: "threshold", publicName: "threshold", isSignal: true, isRequired: false, transformFunction: null }, scrollableContainer: { classPropertyName: "scrollableContainer", publicName: "root", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.odx-anchor-navigation--vertical": "vertical()", "attr.role": "\"navigation\"" } }, providers: [AnchorNavigationService], queries: [{ propertyName: "projectedAnchorLinks", predicate: AnchorNavigationItemComponent, isSignal: true }], ngImport: i0, template: "<ng-content select=\"odx-anchor-navigation-item\" />\n", changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
47
56
|
};
|
|
48
57
|
AnchorNavigationComponent = __decorate([
|
|
49
58
|
CSSComponent('anchor-navigation'),
|
|
@@ -57,4 +66,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
57
66
|
'[attr.role]': '"navigation"',
|
|
58
67
|
}, template: "<ng-content select=\"odx-anchor-navigation-item\" />\n" }]
|
|
59
68
|
}], ctorParameters: () => [] });
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5jaG9yLW5hdmlnYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvYW5jaG9yLW5hdmlnYXRpb24vc3JjL2FuY2hvci1uYXZpZ2F0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL2FuY2hvci1uYXZpZ2F0aW9uL3NyYy9hbmNob3ItbmF2aWdhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEosT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBZXRELElBQU0seUJBQXlCLEdBQS9CLE1BQU0seUJBQXlCO0lBbUNwQztRQWxDaUIsWUFBTyxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzNDLFlBQU8sR0FBRyxhQUFhLEVBQUUsQ0FBQztRQUUxQzs7O1dBR0c7UUFDYSx5QkFBb0IsR0FBRyxlQUFlLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUV0Rjs7O1dBR0c7UUFDSSxhQUFRLEdBQUcsS0FBSyxDQUFtQixLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBRWxGOzs7O1dBSUc7UUFDSSxjQUFTLEdBQUcsS0FBSyxDQUFpQixHQUFHLEVBQUU7WUFDNUMsU0FBUyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztTQUM5RCxDQUFDLENBQUM7UUFFSDs7OztXQUlHO1FBQ0gsMkRBQTJEO1FBQ3BELHdCQUFtQixHQUFHLEtBQUssQ0FBcUMsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFckYscUJBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztRQUcvRCxNQUFNLENBQ0osR0FBRyxFQUFFO1lBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztZQUNuRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDN0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFFM0MsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELENBQUM7UUFDSCxDQUFDLEVBQ0QsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FDNUIsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSSxjQUFjLENBQUMsTUFBcUM7UUFDekQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsQ0FBQzsrR0F4RFUseUJBQXlCO21HQUF6Qix5QkFBeUIsd2xCQU56QixDQUFDLHVCQUF1QixDQUFDLCtEQWNtQiw2QkFBNkIsNkNDM0J0Rix3REFDQTs7QURrQmEseUJBQXlCO0lBYnJDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQzs7R0FhckIseUJBQXlCLENBeURyQzs7NEZBekRZLHlCQUF5QjtrQkFackMsU0FBUzsrQkFDRSx1QkFBdUIsbUJBRWhCLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxpQkFDRCxpQkFBaUIsQ0FBQyxJQUFJLGFBQzFCLENBQUMsdUJBQXVCLENBQUMsUUFDOUI7d0JBQ0oseUNBQXlDLEVBQUUsWUFBWTt3QkFDdkQsYUFBYSxFQUFFLGNBQWM7cUJBQzlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYm9vbGVhbkF0dHJpYnV0ZSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29udGVudENoaWxkcmVuLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDU1NDb21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvaW50ZXJuYWwnO1xuaW1wb3J0IHsgaW5qZWN0RWxlbWVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5pbXBvcnQgeyBBbmNob3JOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vYW5jaG9yLW5hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBBbmNob3JOYXZpZ2F0aW9uSXRlbUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cyc7XG5cbkBDU1NDb21wb25lbnQoJ2FuY2hvci1uYXZpZ2F0aW9uJylcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29keC1hbmNob3ItbmF2aWdhdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9hbmNob3ItbmF2aWdhdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtBbmNob3JOYXZpZ2F0aW9uU2VydmljZV0sXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLm9keC1hbmNob3ItbmF2aWdhdGlvbi0tdmVydGljYWxdJzogJ3ZlcnRpY2FsKCknLFxuICAgICdbYXR0ci5yb2xlXSc6ICdcIm5hdmlnYXRpb25cIicsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIEFuY2hvck5hdmlnYXRpb25Db21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2UgPSBpbmplY3QoQW5jaG9yTmF2aWdhdGlvblNlcnZpY2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgZWxlbWVudCA9IGluamVjdEVsZW1lbnQoKTtcblxuICAvKipcbiAgICogQSBTaWduYWwgd2l0aCBsaXN0IG9mIGBBbmNob3JMaW5rRGlyZWN0aXZlYCBpbnN0YW5jZXMgcHJvamVjdGVkIGludG8gdGhpcyBjb21wb25lbnQuXG4gICAqIFRoZXNlIGFyZSB0aGUgYW5jaG9yIGxpbmtzIHRoYXQgdGhpcyBuYXZpZ2F0aW9uIGNvbXBvbmVudCB3aWxsIG1hbmFnZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcm9qZWN0ZWRBbmNob3JMaW5rcyA9IGNvbnRlbnRDaGlsZHJlbihBbmNob3JOYXZpZ2F0aW9uSXRlbUNvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIElucHV0IHRvIGRldGVybWluZSBpZiB0aGUgYW5jaG9yIG5hdmlnYXRpb24gc2hvdWxkIGJlIGRpc3BsYXllZCB2ZXJ0aWNhbGx5LlxuICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgIChob3Jpem9udGFsKS5cbiAgICovXG4gIHB1YmxpYyB2ZXJ0aWNhbCA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4+KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblxuICAvKipcbiAgICogSW5wdXQgdG8gc3BlY2lmeSB0aGUgdGhyZXNob2xkIGZvciB0aGUgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIuXG4gICAqIFRoaXMgZGV0ZXJtaW5lcyBob3cgbXVjaCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQgbXVzdCBiZSB2aXNpYmxlIGJlZm9yZSBpdCBpcyBjb25zaWRlcmVkIGludGVyc2VjdGluZy5cbiAgICogRGVmYXVsdHMgdG8gYDAuNWAgKDUwJSB2aXNpYmlsaXR5KS5cbiAgICovXG4gIHB1YmxpYyB0aHJlc2hvbGQgPSBpbnB1dDxudW1iZXIsIG51bWJlcj4oMC41LCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU6IG51bWJlcikgPT4gTWF0aC5tYXgoMCwgTWF0aC5taW4odmFsdWUsIDEpKSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIElucHV0IHRvIHNwZWNpZnkgdGhlIHNjcm9sbGFibGUgY29udGFpbmVyIGVsZW1lbnQgb3IgZG9jdW1lbnQgd2hvc2Ugc2Nyb2xsIHBvc2l0aW9uXG4gICAqIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhY3RpdmUgYW5jaG9yIGxpbmsuIElmIG5vdCBwcm92aWRlZCwgZGVmYXVsdHMgdG8gdGhlXG4gICAqIGBkb2N1bWVudGAgb2YgdGhlIGN1cnJlbnQgd2luZG93LlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dC1yZW5hbWVcbiAgcHVibGljIHNjcm9sbGFibGVDb250YWluZXIgPSBpbnB1dDxIVE1MRWxlbWVudCB8IERvY3VtZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQsIHsgYWxpYXM6ICdyb290JyB9KTtcblxuICBwdWJsaWMgcmVhZG9ubHkgYWN0aXZlQW5jaG9yTGluayA9IHRoaXMuc2VydmljZS5hY3RpdmVBbmNob3JMaW5rO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnByb2plY3RlZEFuY2hvckxpbmtzLnNldCh0aGlzLnByb2plY3RlZEFuY2hvckxpbmtzKCkpO1xuICAgICAgICB0aGlzLnNlcnZpY2UudGhyZXNob2xkLnNldCh0aGlzLnRocmVzaG9sZCgpKTtcbiAgICAgICAgY29uc3QgcmNJbnB1dCA9IHRoaXMuc2Nyb2xsYWJsZUNvbnRhaW5lcigpO1xuXG4gICAgICAgIGlmIChyY0lucHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLnNlcnZpY2Uuc2Nyb2xsYWJsZUNvbnRhaW5lci5zZXQocmNJbnB1dCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIHRoZSB2aWV3IHRvIHRoZSBzZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYEFuY2hvckxpbmtEaXJlY3RpdmVgLlxuICAgKiBAcGFyYW0gYW5jaG9yIFRoZSBgQW5jaG9yTGlua0RpcmVjdGl2ZWAgaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZSB0YXJnZXQgYW5jaG9yL3NlY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsVG9BbmNob3IoYW5jaG9yOiBBbmNob3JOYXZpZ2F0aW9uSXRlbUNvbXBvbmVudCk6IHZvaWQge1xuICAgIHRoaXMuc2VydmljZS5zY3JvbGxUb0FuY2hvcihhbmNob3IpO1xuICB9XG59XG4iLCI8bmctY29udGVudCBzZWxlY3Q9XCJvZHgtYW5jaG9yLW5hdmlnYXRpb24taXRlbVwiIC8+XG4iXX0=
|
|
@@ -6,6 +6,13 @@ export class AnchorNavigationService {
|
|
|
6
6
|
this.windowRef = inject(WindowRef);
|
|
7
7
|
this.intersectionStates = new Map();
|
|
8
8
|
this.targetScrollSections = computed(() => this.findTargetScrollSections());
|
|
9
|
+
/**
|
|
10
|
+
* @internal
|
|
11
|
+
* A WritableSignal holding the threshold for the IntersectionObserver.
|
|
12
|
+
* This determines how much of the target element must be visible before it is considered intersecting.
|
|
13
|
+
* Defaults to 0.5 (50% visibility).
|
|
14
|
+
*/
|
|
15
|
+
this.threshold = signal(0.5);
|
|
9
16
|
/**
|
|
10
17
|
* A WritableSignal holding the scrollable container element or document.
|
|
11
18
|
* This is set by the AnchorNavigationComponent.
|
|
@@ -26,11 +33,12 @@ export class AnchorNavigationService {
|
|
|
26
33
|
effect((onCleanup) => {
|
|
27
34
|
const currentRoot = this.scrollableContainer();
|
|
28
35
|
const currentLinks = this.projectedAnchorLinks();
|
|
36
|
+
const threshold = this.threshold();
|
|
29
37
|
if (!currentLinks.length) {
|
|
30
38
|
this.disconnectObserver();
|
|
31
39
|
return;
|
|
32
40
|
}
|
|
33
|
-
this.initIntersectionObserver(currentRoot);
|
|
41
|
+
this.initIntersectionObserver(currentRoot, threshold);
|
|
34
42
|
this.updateObservedElements();
|
|
35
43
|
onCleanup(() => {
|
|
36
44
|
this.disconnectObserver();
|
|
@@ -60,13 +68,13 @@ export class AnchorNavigationService {
|
|
|
60
68
|
}
|
|
61
69
|
anchorElement.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
|
62
70
|
}
|
|
63
|
-
initIntersectionObserver(root) {
|
|
71
|
+
initIntersectionObserver(root, threshold) {
|
|
64
72
|
if (this.intersectionObserver) {
|
|
65
73
|
this.intersectionObserver.disconnect();
|
|
66
74
|
}
|
|
67
75
|
this.intersectionObserver = new IntersectionObserver((entries) => this.onIntersectionUpdate(entries), {
|
|
68
76
|
root: root === this.windowRef.document ? null : root,
|
|
69
|
-
threshold
|
|
77
|
+
threshold,
|
|
70
78
|
});
|
|
71
79
|
}
|
|
72
80
|
updateObservedElements() {
|
|
@@ -116,4 +124,4 @@ export class AnchorNavigationService {
|
|
|
116
124
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnchorNavigationService, decorators: [{
|
|
117
125
|
type: Injectable
|
|
118
126
|
}], ctorParameters: () => [] });
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5jaG9yLW5hdmlnYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL2FuY2hvci1uYXZpZ2F0aW9uL3NyYy9hbmNob3ItbmF2aWdhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQWEsTUFBTSxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUN4RyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUl6QyxNQUFNLE9BQU8sdUJBQXVCO0lBMkJsQztRQTFCaUIsY0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU5Qix1QkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztRQUVqRCx5QkFBb0IsR0FBRyxRQUFRLENBQWdCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7UUFFdkc7Ozs7V0FJRztRQUNJLHdCQUFtQixHQUEyQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVyRzs7OztXQUlHO1FBQ0kseUJBQW9CLEdBQTZELE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVuRzs7O1dBR0c7UUFDYSxxQkFBZ0IsR0FBRyxNQUFNLENBQXVDLElBQUksQ0FBQyxDQUFDO1FBR3BGLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ25CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQy9DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBRWpELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUMxQixPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUU5QixTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNiLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksY0FBYyxDQUFDLE1BQTRDO1FBQ2hFLE1BQU0sUUFBUSxHQUFHLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxPQUFPLENBQUMsSUFBSSxDQUFDLDJFQUEyRSxDQUFDLENBQUM7WUFDMUYsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQXVCLENBQUM7UUFFakgsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLE9BQU8sQ0FBQyxJQUFJLENBQUMsNkNBQTZDLFFBQVEsb0NBQW9DLENBQUMsQ0FBQztZQUN4RyxPQUFPO1FBQ1QsQ0FBQztRQUVELGFBQWEsQ0FBQyxjQUFjLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxJQUE0QjtRQUMzRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksb0JBQW9CLENBQUMsQ0FBQyxPQUFvQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDakksSUFBSSxFQUFFLElBQUksS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3BELFNBQVMsRUFBRSxHQUFHO1NBQ2YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQjtZQUFFLE9BQU87UUFDdkMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM3QyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDM0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLG9CQUFxQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsT0FBb0M7UUFDL0QsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBRTVGLElBQUksa0JBQWtCLEdBQXlDLElBQUksQ0FBQztRQUNwRSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNwRCxLQUFLLE1BQU0sT0FBTyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3RDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbEQsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQztnQkFDcEcsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxrQkFBa0I7WUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUVPLHdCQUF3QjtRQUM5QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU07WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUVwQyxNQUFNLFNBQVMsR0FBRyxZQUFZO2FBQzNCLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQzFCLE1BQU0sQ0FBQyxPQUFPLENBQUM7YUFDZixHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO2FBQ2pDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNiLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLGdCQUFnQixDQUFjLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMxRyxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDO0lBQ3hDLENBQUM7K0dBL0hVLHVCQUF1QjttSEFBdkIsdUJBQXVCOzs0RkFBdkIsdUJBQXVCO2tCQURuQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIHNpZ25hbCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdpbmRvd1JlZiB9IGZyb20gJ0BvZHgvYW5ndWxhcic7XG5pbXBvcnQgeyBBbmNob3JOYXZpZ2F0aW9uSXRlbUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9hbmNob3ItbmF2aWdhdGlvbi1pdGVtLmNvbXBvbmVudCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBbmNob3JOYXZpZ2F0aW9uU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2luZG93UmVmID0gaW5qZWN0KFdpbmRvd1JlZik7XG4gIHByaXZhdGUgaW50ZXJzZWN0aW9uT2JzZXJ2ZXI/OiBJbnRlcnNlY3Rpb25PYnNlcnZlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnNlY3Rpb25TdGF0ZXMgPSBuZXcgTWFwPEVsZW1lbnQsIGJvb2xlYW4+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB0YXJnZXRTY3JvbGxTZWN0aW9ucyA9IGNvbXB1dGVkPEhUTUxFbGVtZW50W10+KCgpID0+IHRoaXMuZmluZFRhcmdldFNjcm9sbFNlY3Rpb25zKCkpO1xuXG4gIC8qKlxuICAgKiBBIFdyaXRhYmxlU2lnbmFsIGhvbGRpbmcgdGhlIHNjcm9sbGFibGUgY29udGFpbmVyIGVsZW1lbnQgb3IgZG9jdW1lbnQuXG4gICAqIFRoaXMgaXMgc2V0IGJ5IHRoZSBBbmNob3JOYXZpZ2F0aW9uQ29tcG9uZW50LlxuICAgKiBEZWZhdWx0cyB0byB0aGUgd2luZG93J3MgZG9jdW1lbnQuXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsYWJsZUNvbnRhaW5lcjogV3JpdGFibGVTaWduYWw8SFRNTEVsZW1lbnQgfCBEb2N1bWVudD4gPSBzaWduYWwodGhpcy53aW5kb3dSZWYuZG9jdW1lbnQpO1xuXG4gIC8qKlxuICAgKiBBIFdyaXRhYmxlU2lnbmFsIGhvbGRpbmcgYW4gYXJyYXkgb2YgYEFuY2hvckxpbmtEaXJlY3RpdmVgIGluc3RhbmNlcy5cbiAgICogVGhlc2UgYXJlIHRoZSBsaW5rcyBtYW5hZ2VkIGJ5IHRoZSBzZXJ2aWNlLCB0eXBpY2FsbHkgc2V0IGJ5IHRoZSBgQW5jaG9yTmF2aWdhdGlvbkNvbXBvbmVudGBcbiAgICogYmFzZWQgb24gaXRzIHByb2plY3RlZCBjb250ZW50LlxuICAgKi9cbiAgcHVibGljIHByb2plY3RlZEFuY2hvckxpbmtzOiBXcml0YWJsZVNpZ25hbDxyZWFkb25seSBBbmNob3JOYXZpZ2F0aW9uSXRlbUNvbXBvbmVudFtdPiA9IHNpZ25hbChbXSk7XG5cbiAgLyoqXG4gICAqIEEgcmVhZG9ubHkgU2lnbmFsIGluZGljYXRpbmcgdGhlIGN1cnJlbnRseSBhY3RpdmUgQW5jaG9yTGlua0RpcmVjdGl2ZS5cbiAgICogVGhpcyBpcyB1cGRhdGVkIGJ5IHRoZSBzZXJ2aWNlIGJhc2VkIG9uIHNjcm9sbCBwb3NpdGlvbiBhbmQgaW50ZXJzZWN0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFjdGl2ZUFuY2hvckxpbmsgPSBzaWduYWw8QW5jaG9yTmF2aWdhdGlvbkl0ZW1Db21wb25lbnQgfCBudWxsPihudWxsKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKG9uQ2xlYW51cCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFJvb3QgPSB0aGlzLnNjcm9sbGFibGVDb250YWluZXIoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRMaW5rcyA9IHRoaXMucHJvamVjdGVkQW5jaG9yTGlua3MoKTtcblxuICAgICAgaWYgKCFjdXJyZW50TGlua3MubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdE9ic2VydmVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbml0SW50ZXJzZWN0aW9uT2JzZXJ2ZXIoY3VycmVudFJvb3QpO1xuICAgICAgdGhpcy51cGRhdGVPYnNlcnZlZEVsZW1lbnRzKCk7XG5cbiAgICAgIG9uQ2xlYW51cCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdE9ic2VydmVyKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2Nvbm5lY3RPYnNlcnZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgdGhlIHZpZXcgdG8gdGhlIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBgQW5jaG9yTGlua0RpcmVjdGl2ZWBcbiAgICogYW5kIHNldHMgaXQgYXMgdGhlIGFjdGl2ZSBsaW5rLlxuICAgKlxuICAgKiBAcGFyYW0gYW5jaG9yIFRoZSBgQW5jaG9yTGlua0RpcmVjdGl2ZWAgaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZSB0YXJnZXQgYW5jaG9yL3NlY3Rpb24uXG4gICAqICAgICAgICAgICAgICAgSWYgbnVsbCBvciBpZiB0aGUgYW5jaG9yJ3MgSUQgaXMgbm90IGZvdW5kLCBhIHdhcm5pbmcgaXMgbG9nZ2VkIGFuZCB0aGUgbWV0aG9kIHJldHVybnMuXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsVG9BbmNob3IoYW5jaG9yOiBBbmNob3JOYXZpZ2F0aW9uSXRlbUNvbXBvbmVudCB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBhbmNob3JJZCA9IGFuY2hvcj8uaHJlZigpO1xuICAgIGlmICghYW5jaG9ySWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW0FuY2hvck5hdmlnYXRpb25TZXJ2aWNlXSBBdHRlbXB0ZWQgdG8gc2Nyb2xsIHRvIGFuIGFuY2hvciB3aXRob3V0IGFuIElELmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhbmNob3JFbGVtZW50ID0gdGhpcy5zY3JvbGxhYmxlQ29udGFpbmVyKCkucXVlcnlTZWxlY3RvcihgIyR7Q1NTLmVzY2FwZShhbmNob3JJZCl9YCkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gICAgaWYgKCFhbmNob3JFbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtBbmNob3JOYXZpZ2F0aW9uU2VydmljZV0gQW5jaG9yIHdpdGggSUQgXCIke2FuY2hvcklkfVwiIG5vdCBmb3VuZCBpbiB0aGUgcm9vdCBjb250YWluZXIuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYW5jaG9yRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRJbnRlcnNlY3Rpb25PYnNlcnZlcihyb290OiBIVE1MRWxlbWVudCB8IERvY3VtZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChlbnRyaWVzOiBJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5W10pID0+IHRoaXMub25JbnRlcnNlY3Rpb25VcGRhdGUoZW50cmllcyksIHtcbiAgICAgIHJvb3Q6IHJvb3QgPT09IHRoaXMud2luZG93UmVmLmRvY3VtZW50ID8gbnVsbCA6IHJvb3QsXG4gICAgICB0aHJlc2hvbGQ6IDAuMSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlT2JzZXJ2ZWRFbGVtZW50cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIpIHJldHVybjtcbiAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLmludGVyc2VjdGlvblN0YXRlcy5jbGVhcigpO1xuXG4gICAgY29uc3Qgc2VjdGlvbnMgPSB0aGlzLnRhcmdldFNjcm9sbFNlY3Rpb25zKCk7XG4gICAgc2VjdGlvbnMuZm9yRWFjaCgoc2VjdGlvbikgPT4ge1xuICAgICAgaWYgKHNlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25TdGF0ZXMuc2V0KHNlY3Rpb24sIGZhbHNlKTtcbiAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlciEub2JzZXJ2ZShzZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25JbnRlcnNlY3Rpb25VcGRhdGUoZW50cmllczogSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeVtdKTogdm9pZCB7XG4gICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gdGhpcy5pbnRlcnNlY3Rpb25TdGF0ZXMuc2V0KGVudHJ5LnRhcmdldCwgZW50cnkuaXNJbnRlcnNlY3RpbmcpKTtcblxuICAgIGxldCBuZXdBY3RpdmVDYW5kaWRhdGU6IEFuY2hvck5hdmlnYXRpb25JdGVtQ29tcG9uZW50IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY3VycmVudFNlY3Rpb25zID0gdGhpcy50YXJnZXRTY3JvbGxTZWN0aW9ucygpO1xuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBjdXJyZW50U2VjdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLmludGVyc2VjdGlvblN0YXRlcy5nZXQoc2VjdGlvbikgPT09IHRydWUpIHtcbiAgICAgICAgbmV3QWN0aXZlQ2FuZGlkYXRlID0gdGhpcy5wcm9qZWN0ZWRBbmNob3JMaW5rcygpLmZpbmQoKGxpbmspID0+IGxpbmsuaHJlZigpID09PSBzZWN0aW9uLmlkKSB8fCBudWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5hY3RpdmVBbmNob3JMaW5rKCkgIT09IG5ld0FjdGl2ZUNhbmRpZGF0ZSkgdGhpcy5hY3RpdmVBbmNob3JMaW5rLnNldChuZXdBY3RpdmVDYW5kaWRhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kVGFyZ2V0U2Nyb2xsU2VjdGlvbnMoKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgY29uc3QgY3VycmVudExpbmtzID0gdGhpcy5wcm9qZWN0ZWRBbmNob3JMaW5rcygpO1xuICAgIGlmICghY3VycmVudExpbmtzLmxlbmd0aCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3Qgc2VsZWN0b3JzID0gY3VycmVudExpbmtzXG4gICAgICAubWFwKChsaW5rKSA9PiBsaW5rLmhyZWYoKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5tYXAoKGlkKSA9PiBgIyR7Q1NTLmVzY2FwZShpZCl9YClcbiAgICAgIC5qb2luKCcsJyk7XG4gICAgcmV0dXJuIHNlbGVjdG9ycyA/IEFycmF5LmZyb20odGhpcy5zY3JvbGxhYmxlQ29udGFpbmVyKCkucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oc2VsZWN0b3JzKSkgOiBbXTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzY29ubmVjdE9ic2VydmVyKCk6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyID0gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
|
|
127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5jaG9yLW5hdmlnYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL2FuY2hvci1uYXZpZ2F0aW9uL3NyYy9hbmNob3ItbmF2aWdhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQWEsTUFBTSxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUN4RyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUl6QyxNQUFNLE9BQU8sdUJBQXVCO0lBbUNsQztRQWxDaUIsY0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU5Qix1QkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztRQUVqRCx5QkFBb0IsR0FBRyxRQUFRLENBQWdCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7UUFFdkc7Ozs7O1dBS0c7UUFDYSxjQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXhDOzs7O1dBSUc7UUFDSSx3QkFBbUIsR0FBMkMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFckc7Ozs7V0FJRztRQUNJLHlCQUFvQixHQUE2RCxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFbkc7OztXQUdHO1FBQ2EscUJBQWdCLEdBQUcsTUFBTSxDQUF1QyxJQUFJLENBQUMsQ0FBQztRQUdwRixNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNuQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMvQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUNqRCxNQUFNLFNBQVMs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Q0FBYyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDMUcsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztJQUN4QyxDQUFDOytHQXhJVSx1QkFBdUI7bUhBQXZCLHVCQUF1Qjs7NEZBQXZCLHVCQUF1QjtrQkFEbkMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBzaWduYWwsIFdyaXRhYmxlU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBXaW5kb3dSZWYgfSBmcm9tICdAb2R4L2FuZ3VsYXInO1xuaW1wb3J0IHsgQW5jaG9yTmF2aWdhdGlvbkl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvYW5jaG9yLW5hdmlnYXRpb24taXRlbS5jb21wb25lbnQnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQW5jaG9yTmF2aWdhdGlvblNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvd1JlZiA9IGluamVjdChXaW5kb3dSZWYpO1xuICBwcml2YXRlIGludGVyc2VjdGlvbk9ic2VydmVyPzogSW50ZXJzZWN0aW9uT2JzZXJ2ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJzZWN0aW9uU3RhdGVzID0gbmV3IE1hcDxFbGVtZW50LCBib29sZWFuPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdGFyZ2V0U2Nyb2xsU2VjdGlvbnMgPSBjb21wdXRlZDxIVE1MRWxlbWVudFtdPigoKSA9PiB0aGlzLmZpbmRUYXJnZXRTY3JvbGxTZWN0aW9ucygpKTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEEgV3JpdGFibGVTaWduYWwgaG9sZGluZyB0aGUgdGhyZXNob2xkIGZvciB0aGUgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIuXG4gICAqIFRoaXMgZGV0ZXJtaW5lcyBob3cgbXVjaCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQgbXVzdCBiZSB2aXNpYmxlIGJlZm9yZSBpdCBpcyBjb25zaWRlcmVkIGludGVyc2VjdGluZy5cbiAgICogRGVmYXVsdHMgdG8gMC41ICg1MCUgdmlzaWJpbGl0eSkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGhyZXNob2xkID0gc2lnbmFsKDAuNSk7XG5cbiAgLyoqXG4gICAqIEEgV3JpdGFibGVTaWduYWwgaG9sZGluZyB0aGUgc2Nyb2xsYWJsZSBjb250YWluZXIgZWxlbWVudCBvciBkb2N1bWVudC5cbiAgICogVGhpcyBpcyBzZXQgYnkgdGhlIEFuY2hvck5hdmlnYXRpb25Db21wb25lbnQuXG4gICAqIERlZmF1bHRzIHRvIHRoZSB3aW5kb3cncyBkb2N1bWVudC5cbiAgICovXG4gIHB1YmxpYyBzY3JvbGxhYmxlQ29udGFpbmVyOiBXcml0YWJsZVNpZ25hbDxIVE1MRWxlbWVudCB8IERvY3VtZW50PiA9IHNpZ25hbCh0aGlzLndpbmRvd1JlZi5kb2N1bWVudCk7XG5cbiAgLyoqXG4gICAqIEEgV3JpdGFibGVTaWduYWwgaG9sZGluZyBhbiBhcnJheSBvZiBgQW5jaG9yTGlua0RpcmVjdGl2ZWAgaW5zdGFuY2VzLlxuICAgKiBUaGVzZSBhcmUgdGhlIGxpbmtzIG1hbmFnZWQgYnkgdGhlIHNlcnZpY2UsIHR5cGljYWxseSBzZXQgYnkgdGhlIGBBbmNob3JOYXZpZ2F0aW9uQ29tcG9uZW50YFxuICAgKiBiYXNlZCBvbiBpdHMgcHJvamVjdGVkIGNvbnRlbnQuXG4gICAqL1xuICBwdWJsaWMgcHJvamVjdGVkQW5jaG9yTGlua3M6IFdyaXRhYmxlU2lnbmFsPHJlYWRvbmx5IEFuY2hvck5hdmlnYXRpb25JdGVtQ29tcG9uZW50W10+ID0gc2lnbmFsKFtdKTtcblxuICAvKipcbiAgICogQSByZWFkb25seSBTaWduYWwgaW5kaWNhdGluZyB0aGUgY3VycmVudGx5IGFjdGl2ZSBBbmNob3JMaW5rRGlyZWN0aXZlLlxuICAgKiBUaGlzIGlzIHVwZGF0ZWQgYnkgdGhlIHNlcnZpY2UgYmFzZWQgb24gc2Nyb2xsIHBvc2l0aW9uIGFuZCBpbnRlcnNlY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWN0aXZlQW5jaG9yTGluayA9IHNpZ25hbDxBbmNob3JOYXZpZ2F0aW9uSXRlbUNvbXBvbmVudCB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgob25DbGVhbnVwKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50Um9vdCA9IHRoaXMuc2Nyb2xsYWJsZUNvbnRhaW5lcigpO1xuICAgICAgY29uc3QgY3VycmVudExpbmtzID0gdGhpcy5wcm9qZWN0ZWRBbmNob3JMaW5rcygpO1xuICAgICAgY29uc3QgdGhyZXNob2xkID0gdGhpcy50aHJlc2hvbGQoKTtcblxuICAgICAgaWYgKCFjdXJyZW50TGlua3MubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdE9ic2VydmVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbml0SW50ZXJzZWN0aW9uT2JzZXJ2ZXIoY3VycmVudFJvb3QsIHRocmVzaG9sZCk7XG4gICAgICB0aGlzLnVwZGF0ZU9ic2VydmVkRWxlbWVudHMoKTtcblxuICAgICAgb25DbGVhbnVwKCgpID0+IHtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0T2JzZXJ2ZXIoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzY29ubmVjdE9ic2VydmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyB0aGUgdmlldyB0byB0aGUgc2VjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGBBbmNob3JMaW5rRGlyZWN0aXZlYFxuICAgKiBhbmQgc2V0cyBpdCBhcyB0aGUgYWN0aXZlIGxpbmsuXG4gICAqXG4gICAqIEBwYXJhbSBhbmNob3IgVGhlIGBBbmNob3JMaW5rRGlyZWN0aXZlYCBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlIHRhcmdldCBhbmNob3Ivc2VjdGlvbi5cbiAgICogICAgICAgICAgICAgICBJZiBudWxsIG9yIGlmIHRoZSBhbmNob3IncyBJRCBpcyBub3QgZm91bmQsIGEgd2FybmluZyBpcyBsb2dnZWQgYW5kIHRoZSBtZXRob2QgcmV0dXJucy5cbiAgICovXG4gIHB1YmxpYyBzY3JvbGxUb0FuY2hvcihhbmNob3I6IEFuY2hvck5hdmlnYXRpb25JdGVtQ29tcG9uZW50IHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IGFuY2hvcklkID0gYW5jaG9yPy5ocmVmKCk7XG4gICAgaWYgKCFhbmNob3JJZCkge1xuICAgICAgY29uc29sZS53YXJuKGBbQW5jaG9yTmF2aWdhdGlvblNlcnZpY2VdIEF0dGVtcHRlZCB0byBzY3JvbGwgdG8gYW4gYW5jaG9yIHdpdGhvdXQgYW4gSUQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFuY2hvckVsZW1lbnQgPSB0aGlzLnNjcm9sbGFibGVDb250YWluZXIoKS5xdWVyeVNlbGVjdG9yKGAjJHtDU1MuZXNjYXBlKGFuY2hvcklkKX1gKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgICBpZiAoIWFuY2hvckVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW0FuY2hvck5hdmlnYXRpb25TZXJ2aWNlXSBBbmNob3Igd2l0aCBJRCBcIiR7YW5jaG9ySWR9XCIgbm90IGZvdW5kIGluIHRoZSByb290IGNvbnRhaW5lci5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhbmNob3JFbGVtZW50LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEludGVyc2VjdGlvbk9ic2VydmVyKHJvb3Q6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQsIHRocmVzaG9sZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChlbnRyaWVzOiBJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5W10pID0+IHRoaXMub25JbnRlcnNlY3Rpb25VcGRhdGUoZW50cmllcyksIHtcbiAgICAgIHJvb3Q6IHJvb3QgPT09IHRoaXMud2luZG93UmVmLmRvY3VtZW50ID8gbnVsbCA6IHJvb3QsXG4gICAgICB0aHJlc2hvbGQsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU9ic2VydmVkRWxlbWVudHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyKSByZXR1cm47XG4gICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5pbnRlcnNlY3Rpb25TdGF0ZXMuY2xlYXIoKTtcblxuICAgIGNvbnN0IHNlY3Rpb25zID0gdGhpcy50YXJnZXRTY3JvbGxTZWN0aW9ucygpO1xuICAgIHNlY3Rpb25zLmZvckVhY2goKHNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChzZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuaW50ZXJzZWN0aW9uU3RhdGVzLnNldChzZWN0aW9uLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIhLm9ic2VydmUoc2VjdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9uSW50ZXJzZWN0aW9uVXBkYXRlKGVudHJpZXM6IEludGVyc2VjdGlvbk9ic2VydmVyRW50cnlbXSk6IHZvaWQge1xuICAgIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHRoaXMuaW50ZXJzZWN0aW9uU3RhdGVzLnNldChlbnRyeS50YXJnZXQsIGVudHJ5LmlzSW50ZXJzZWN0aW5nKSk7XG5cbiAgICBsZXQgbmV3QWN0aXZlQ2FuZGlkYXRlOiBBbmNob3JOYXZpZ2F0aW9uSXRlbUNvbXBvbmVudCB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGN1cnJlbnRTZWN0aW9ucyA9IHRoaXMudGFyZ2V0U2Nyb2xsU2VjdGlvbnMoKTtcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgY3VycmVudFNlY3Rpb25zKSB7XG4gICAgICBpZiAodGhpcy5pbnRlcnNlY3Rpb25TdGF0ZXMuZ2V0KHNlY3Rpb24pID09PSB0cnVlKSB7XG4gICAgICAgIG5ld0FjdGl2ZUNhbmRpZGF0ZSA9IHRoaXMucHJvamVjdGVkQW5jaG9yTGlua3MoKS5maW5kKChsaW5rKSA9PiBsaW5rLmhyZWYoKSA9PT0gc2VjdGlvbi5pZCkgfHwgbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aXZlQW5jaG9yTGluaygpICE9PSBuZXdBY3RpdmVDYW5kaWRhdGUpIHRoaXMuYWN0aXZlQW5jaG9yTGluay5zZXQobmV3QWN0aXZlQ2FuZGlkYXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFRhcmdldFNjcm9sbFNlY3Rpb25zKCk6IEhUTUxFbGVtZW50W10ge1xuICAgIGNvbnN0IGN1cnJlbnRMaW5rcyA9IHRoaXMucHJvamVjdGVkQW5jaG9yTGlua3MoKTtcbiAgICBpZiAoIWN1cnJlbnRMaW5rcy5sZW5ndGgpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IHNlbGVjdG9ycyA9IGN1cnJlbnRMaW5rc1xuICAgICAgLm1hcCgobGluaykgPT4gbGluay5ocmVmKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKChpZCkgPT4gYCMke0NTUy5lc2NhcGUoaWQpfWApXG4gICAgICAuam9pbignLCcpO1xuICAgIHJldHVybiBzZWxlY3RvcnMgPyBBcnJheS5mcm9tKHRoaXMuc2Nyb2xsYWJsZUNvbnRhaW5lcigpLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KHNlbGVjdG9ycykpIDogW107XG4gIH1cblxuICBwcml2YXRlIGRpc2Nvbm5lY3RPYnNlcnZlcigpOiB2b2lkIHtcbiAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlciA9IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
|
|
@@ -11,6 +11,13 @@ class AnchorNavigationService {
|
|
|
11
11
|
this.windowRef = inject(WindowRef);
|
|
12
12
|
this.intersectionStates = new Map();
|
|
13
13
|
this.targetScrollSections = computed(() => this.findTargetScrollSections());
|
|
14
|
+
/**
|
|
15
|
+
* @internal
|
|
16
|
+
* A WritableSignal holding the threshold for the IntersectionObserver.
|
|
17
|
+
* This determines how much of the target element must be visible before it is considered intersecting.
|
|
18
|
+
* Defaults to 0.5 (50% visibility).
|
|
19
|
+
*/
|
|
20
|
+
this.threshold = signal(0.5);
|
|
14
21
|
/**
|
|
15
22
|
* A WritableSignal holding the scrollable container element or document.
|
|
16
23
|
* This is set by the AnchorNavigationComponent.
|
|
@@ -31,11 +38,12 @@ class AnchorNavigationService {
|
|
|
31
38
|
effect((onCleanup) => {
|
|
32
39
|
const currentRoot = this.scrollableContainer();
|
|
33
40
|
const currentLinks = this.projectedAnchorLinks();
|
|
41
|
+
const threshold = this.threshold();
|
|
34
42
|
if (!currentLinks.length) {
|
|
35
43
|
this.disconnectObserver();
|
|
36
44
|
return;
|
|
37
45
|
}
|
|
38
|
-
this.initIntersectionObserver(currentRoot);
|
|
46
|
+
this.initIntersectionObserver(currentRoot, threshold);
|
|
39
47
|
this.updateObservedElements();
|
|
40
48
|
onCleanup(() => {
|
|
41
49
|
this.disconnectObserver();
|
|
@@ -65,13 +73,13 @@ class AnchorNavigationService {
|
|
|
65
73
|
}
|
|
66
74
|
anchorElement.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
|
67
75
|
}
|
|
68
|
-
initIntersectionObserver(root) {
|
|
76
|
+
initIntersectionObserver(root, threshold) {
|
|
69
77
|
if (this.intersectionObserver) {
|
|
70
78
|
this.intersectionObserver.disconnect();
|
|
71
79
|
}
|
|
72
80
|
this.intersectionObserver = new IntersectionObserver((entries) => this.onIntersectionUpdate(entries), {
|
|
73
81
|
root: root === this.windowRef.document ? null : root,
|
|
74
|
-
threshold
|
|
82
|
+
threshold,
|
|
75
83
|
});
|
|
76
84
|
}
|
|
77
85
|
updateObservedElements() {
|
|
@@ -160,6 +168,14 @@ let AnchorNavigationComponent = class AnchorNavigationComponent {
|
|
|
160
168
|
* Defaults to `false` (horizontal).
|
|
161
169
|
*/
|
|
162
170
|
this.vertical = input(false, { transform: booleanAttribute });
|
|
171
|
+
/**
|
|
172
|
+
* Input to specify the threshold for the IntersectionObserver.
|
|
173
|
+
* This determines how much of the target element must be visible before it is considered intersecting.
|
|
174
|
+
* Defaults to `0.5` (50% visibility).
|
|
175
|
+
*/
|
|
176
|
+
this.threshold = input(0.5, {
|
|
177
|
+
transform: (value) => Math.max(0, Math.min(value, 1)),
|
|
178
|
+
});
|
|
163
179
|
/**
|
|
164
180
|
* Input to specify the scrollable container element or document whose scroll position
|
|
165
181
|
* is used to determine the active anchor link. If not provided, defaults to the
|
|
@@ -170,6 +186,7 @@ let AnchorNavigationComponent = class AnchorNavigationComponent {
|
|
|
170
186
|
this.activeAnchorLink = this.service.activeAnchorLink;
|
|
171
187
|
effect(() => {
|
|
172
188
|
this.service.projectedAnchorLinks.set(this.projectedAnchorLinks());
|
|
189
|
+
this.service.threshold.set(this.threshold());
|
|
173
190
|
const rcInput = this.scrollableContainer();
|
|
174
191
|
if (rcInput !== undefined) {
|
|
175
192
|
this.service.scrollableContainer.set(rcInput);
|
|
@@ -184,7 +201,7 @@ let AnchorNavigationComponent = class AnchorNavigationComponent {
|
|
|
184
201
|
this.service.scrollToAnchor(anchor);
|
|
185
202
|
}
|
|
186
203
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnchorNavigationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
187
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.13", type: AnchorNavigationComponent, isStandalone: true, selector: "odx-anchor-navigation", inputs: { vertical: { classPropertyName: "vertical", publicName: "vertical", isSignal: true, isRequired: false, transformFunction: null }, scrollableContainer: { classPropertyName: "scrollableContainer", publicName: "root", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.odx-anchor-navigation--vertical": "vertical()", "attr.role": "\"navigation\"" } }, providers: [AnchorNavigationService], queries: [{ propertyName: "projectedAnchorLinks", predicate: AnchorNavigationItemComponent, isSignal: true }], ngImport: i0, template: "<ng-content select=\"odx-anchor-navigation-item\" />\n", changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
204
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.13", type: AnchorNavigationComponent, isStandalone: true, selector: "odx-anchor-navigation", inputs: { vertical: { classPropertyName: "vertical", publicName: "vertical", isSignal: true, isRequired: false, transformFunction: null }, threshold: { classPropertyName: "threshold", publicName: "threshold", isSignal: true, isRequired: false, transformFunction: null }, scrollableContainer: { classPropertyName: "scrollableContainer", publicName: "root", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.odx-anchor-navigation--vertical": "vertical()", "attr.role": "\"navigation\"" } }, providers: [AnchorNavigationService], queries: [{ propertyName: "projectedAnchorLinks", predicate: AnchorNavigationItemComponent, isSignal: true }], ngImport: i0, template: "<ng-content select=\"odx-anchor-navigation-item\" />\n", changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
188
205
|
};
|
|
189
206
|
AnchorNavigationComponent = __decorate([
|
|
190
207
|
CSSComponent('anchor-navigation'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"odx-angular-components-anchor-navigation.mjs","sources":["../../../../libs/angular/components/anchor-navigation/src/anchor-navigation.service.ts","../../../../libs/angular/components/anchor-navigation/src/components/anchor-navigation-item.component.ts","../../../../libs/angular/components/anchor-navigation/src/components/anchor-navigation-item.component.html","../../../../libs/angular/components/anchor-navigation/src/anchor-navigation.component.ts","../../../../libs/angular/components/anchor-navigation/src/anchor-navigation.component.html","../../../../libs/angular/components/anchor-navigation/src/anchor-navigation.module.ts","../../../../libs/angular/components/anchor-navigation/src/odx-angular-components-anchor-navigation.ts"],"sourcesContent":["import { computed, effect, inject, Injectable, OnDestroy, signal, WritableSignal } from '@angular/core';\nimport { WindowRef } from '@odx/angular';\nimport { AnchorNavigationItemComponent } from './components/anchor-navigation-item.component';\n\n@Injectable()\nexport class AnchorNavigationService implements OnDestroy {\n private readonly windowRef = inject(WindowRef);\n private intersectionObserver?: IntersectionObserver;\n private readonly intersectionStates = new Map<Element, boolean>();\n\n private readonly targetScrollSections = computed<HTMLElement[]>(() => this.findTargetScrollSections());\n\n /**\n * A WritableSignal holding the scrollable container element or document.\n * This is set by the AnchorNavigationComponent.\n * Defaults to the window's document.\n */\n public scrollableContainer: WritableSignal<HTMLElement | Document> = signal(this.windowRef.document);\n\n /**\n * A WritableSignal holding an array of `AnchorLinkDirective` instances.\n * These are the links managed by the service, typically set by the `AnchorNavigationComponent`\n * based on its projected content.\n */\n public projectedAnchorLinks: WritableSignal<readonly AnchorNavigationItemComponent[]> = signal([]);\n\n /**\n * A readonly Signal indicating the currently active AnchorLinkDirective.\n * This is updated by the service based on scroll position and intersection.\n */\n public readonly activeAnchorLink = signal<AnchorNavigationItemComponent | null>(null);\n\n constructor() {\n effect((onCleanup) => {\n const currentRoot = this.scrollableContainer();\n const currentLinks = this.projectedAnchorLinks();\n\n if (!currentLinks.length) {\n this.disconnectObserver();\n return;\n }\n\n this.initIntersectionObserver(currentRoot);\n this.updateObservedElements();\n\n onCleanup(() => {\n this.disconnectObserver();\n });\n });\n }\n\n public ngOnDestroy(): void {\n this.disconnectObserver();\n }\n\n /**\n * Scrolls the view to the section associated with the given `AnchorLinkDirective`\n * and sets it as the active link.\n *\n * @param anchor The `AnchorLinkDirective` instance representing the target anchor/section.\n * If null or if the anchor's ID is not found, a warning is logged and the method returns.\n */\n public scrollToAnchor(anchor: AnchorNavigationItemComponent | null): void {\n const anchorId = anchor?.href();\n if (!anchorId) {\n console.warn(`[AnchorNavigationService] Attempted to scroll to an anchor without an ID.`);\n return;\n }\n const anchorElement = this.scrollableContainer().querySelector(`#${CSS.escape(anchorId)}`) as HTMLElement | null;\n\n if (!anchorElement) {\n console.warn(`[AnchorNavigationService] Anchor with ID \"${anchorId}\" not found in the root container.`);\n return;\n }\n\n anchorElement.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n\n private initIntersectionObserver(root: HTMLElement | Document): void {\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n }\n this.intersectionObserver = new IntersectionObserver((entries: IntersectionObserverEntry[]) => this.onIntersectionUpdate(entries), {\n root: root === this.windowRef.document ? null : root,\n threshold: 0.1,\n });\n }\n\n private updateObservedElements(): void {\n if (!this.intersectionObserver) return;\n this.intersectionObserver.disconnect();\n this.intersectionStates.clear();\n\n const sections = this.targetScrollSections();\n sections.forEach((section) => {\n if (section) {\n this.intersectionStates.set(section, false);\n this.intersectionObserver!.observe(section);\n }\n });\n }\n\n private onIntersectionUpdate(entries: IntersectionObserverEntry[]): void {\n entries.forEach((entry) => this.intersectionStates.set(entry.target, entry.isIntersecting));\n\n let newActiveCandidate: AnchorNavigationItemComponent | null = null;\n const currentSections = this.targetScrollSections();\n for (const section of currentSections) {\n if (this.intersectionStates.get(section) === true) {\n newActiveCandidate = this.projectedAnchorLinks().find((link) => link.href() === section.id) || null;\n break;\n }\n }\n\n if (this.activeAnchorLink() !== newActiveCandidate) this.activeAnchorLink.set(newActiveCandidate);\n }\n\n private findTargetScrollSections(): HTMLElement[] {\n const currentLinks = this.projectedAnchorLinks();\n if (!currentLinks.length) return [];\n\n const selectors = currentLinks\n .map((link) => link.href())\n .filter(Boolean)\n .map((id) => `#${CSS.escape(id)}`)\n .join(',');\n return selectors ? Array.from(this.scrollableContainer().querySelectorAll<HTMLElement>(selectors)) : [];\n }\n\n private disconnectObserver(): void {\n this.intersectionObserver?.disconnect();\n this.intersectionObserver = undefined;\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, ViewEncapsulation } from '@angular/core';\nimport { LinkDirective } from '@odx/angular/components/link';\nimport { CSSComponent } from '@odx/angular/internal';\nimport { injectElement } from '@odx/angular/utils';\nimport { AnchorNavigationService } from '../anchor-navigation.service';\n\n@CSSComponent('anchor-navigation-item')\n@Component({\n selector: 'odx-anchor-navigation-item',\n templateUrl: './anchor-navigation-item.component.html',\n standalone: true,\n imports: [LinkDirective],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.is-active]': 'isActive()',\n },\n})\nexport class AnchorNavigationItemComponent {\n private readonly navigationService = inject(AnchorNavigationService);\n public readonly element = injectElement();\n\n public href = input.required<string>();\n public isActive = computed(() => this.navigationService.activeAnchorLink() === this);\n\n protected handleClick(e: Event): void {\n e.preventDefault();\n this.navigationService.scrollToAnchor(this);\n }\n}\n","<a odxLink [href]=\"'#' + href()\" (click)=\"handleClick($event)\" (keydown.space)=\"handleClick($event)\" [attr.aria-current]=\"isActive() ? 'page' : null\">\n <ng-content />\n</a>\n","import { booleanAttribute, ChangeDetectionStrategy, Component, contentChildren, effect, inject, input, ViewEncapsulation } from '@angular/core';\nimport { CSSComponent } from '@odx/angular/internal';\nimport { injectElement } from '@odx/angular/utils';\nimport { AnchorNavigationService } from './anchor-navigation.service';\nimport { AnchorNavigationItemComponent } from './components';\n\n@CSSComponent('anchor-navigation')\n@Component({\n selector: 'odx-anchor-navigation',\n templateUrl: './anchor-navigation.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n providers: [AnchorNavigationService],\n host: {\n '[class.odx-anchor-navigation--vertical]': 'vertical()',\n '[attr.role]': '\"navigation\"',\n },\n})\nexport class AnchorNavigationComponent {\n private readonly service = inject(AnchorNavigationService);\n public readonly element = injectElement();\n\n /**\n * A Signal with list of `AnchorLinkDirective` instances projected into this component.\n * These are the anchor links that this navigation component will manage.\n */\n public readonly projectedAnchorLinks = contentChildren(AnchorNavigationItemComponent);\n\n /**\n * Input to determine if the anchor navigation should be displayed vertically.\n * Defaults to `false` (horizontal).\n */\n public vertical = input<boolean, boolean>(false, { transform: booleanAttribute });\n\n /**\n * Input to specify the scrollable container element or document whose scroll position\n * is used to determine the active anchor link. If not provided, defaults to the\n * `document` of the current window.\n */\n // eslint-disable-next-line @angular-eslint/no-input-rename\n public scrollableContainer = input<HTMLElement | Document | undefined>(undefined, { alias: 'root' });\n\n public readonly activeAnchorLink = this.service.activeAnchorLink;\n\n constructor() {\n effect(\n () => {\n this.service.projectedAnchorLinks.set(this.projectedAnchorLinks());\n const rcInput = this.scrollableContainer();\n\n if (rcInput !== undefined) {\n this.service.scrollableContainer.set(rcInput);\n }\n },\n { allowSignalWrites: true },\n );\n }\n\n /**\n * Scrolls the view to the section associated with the given `AnchorLinkDirective`.\n * @param anchor The `AnchorLinkDirective` instance representing the target anchor/section.\n */\n public scrollToAnchor(anchor: AnchorNavigationItemComponent): void {\n this.service.scrollToAnchor(anchor);\n }\n}\n","<ng-content select=\"odx-anchor-navigation-item\" />\n","import { NgModule } from '@angular/core';\nimport { AnchorNavigationComponent } from './anchor-navigation.component';\nimport { AnchorNavigationItemComponent } from './components';\n\nconst modules = [AnchorNavigationComponent, AnchorNavigationItemComponent];\n\n@NgModule({\n imports: modules,\n exports: modules,\n})\nexport class AnchorNavigationModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"odx-angular-components-anchor-navigation.mjs","sources":["../../../../libs/angular/components/anchor-navigation/src/anchor-navigation.service.ts","../../../../libs/angular/components/anchor-navigation/src/components/anchor-navigation-item.component.ts","../../../../libs/angular/components/anchor-navigation/src/components/anchor-navigation-item.component.html","../../../../libs/angular/components/anchor-navigation/src/anchor-navigation.component.ts","../../../../libs/angular/components/anchor-navigation/src/anchor-navigation.component.html","../../../../libs/angular/components/anchor-navigation/src/anchor-navigation.module.ts","../../../../libs/angular/components/anchor-navigation/src/odx-angular-components-anchor-navigation.ts"],"sourcesContent":["import { computed, effect, inject, Injectable, OnDestroy, signal, WritableSignal } from '@angular/core';\nimport { WindowRef } from '@odx/angular';\nimport { AnchorNavigationItemComponent } from './components/anchor-navigation-item.component';\n\n@Injectable()\nexport class AnchorNavigationService implements OnDestroy {\n private readonly windowRef = inject(WindowRef);\n private intersectionObserver?: IntersectionObserver;\n private readonly intersectionStates = new Map<Element, boolean>();\n\n private readonly targetScrollSections = computed<HTMLElement[]>(() => this.findTargetScrollSections());\n\n /**\n * @internal\n * A WritableSignal holding the threshold for the IntersectionObserver.\n * This determines how much of the target element must be visible before it is considered intersecting.\n * Defaults to 0.5 (50% visibility).\n */\n public readonly threshold = signal(0.5);\n\n /**\n * A WritableSignal holding the scrollable container element or document.\n * This is set by the AnchorNavigationComponent.\n * Defaults to the window's document.\n */\n public scrollableContainer: WritableSignal<HTMLElement | Document> = signal(this.windowRef.document);\n\n /**\n * A WritableSignal holding an array of `AnchorLinkDirective` instances.\n * These are the links managed by the service, typically set by the `AnchorNavigationComponent`\n * based on its projected content.\n */\n public projectedAnchorLinks: WritableSignal<readonly AnchorNavigationItemComponent[]> = signal([]);\n\n /**\n * A readonly Signal indicating the currently active AnchorLinkDirective.\n * This is updated by the service based on scroll position and intersection.\n */\n public readonly activeAnchorLink = signal<AnchorNavigationItemComponent | null>(null);\n\n constructor() {\n effect((onCleanup) => {\n const currentRoot = this.scrollableContainer();\n const currentLinks = this.projectedAnchorLinks();\n const threshold = this.threshold();\n\n if (!currentLinks.length) {\n this.disconnectObserver();\n return;\n }\n\n this.initIntersectionObserver(currentRoot, threshold);\n this.updateObservedElements();\n\n onCleanup(() => {\n this.disconnectObserver();\n });\n });\n }\n\n public ngOnDestroy(): void {\n this.disconnectObserver();\n }\n\n /**\n * Scrolls the view to the section associated with the given `AnchorLinkDirective`\n * and sets it as the active link.\n *\n * @param anchor The `AnchorLinkDirective` instance representing the target anchor/section.\n * If null or if the anchor's ID is not found, a warning is logged and the method returns.\n */\n public scrollToAnchor(anchor: AnchorNavigationItemComponent | null): void {\n const anchorId = anchor?.href();\n if (!anchorId) {\n console.warn(`[AnchorNavigationService] Attempted to scroll to an anchor without an ID.`);\n return;\n }\n const anchorElement = this.scrollableContainer().querySelector(`#${CSS.escape(anchorId)}`) as HTMLElement | null;\n\n if (!anchorElement) {\n console.warn(`[AnchorNavigationService] Anchor with ID \"${anchorId}\" not found in the root container.`);\n return;\n }\n\n anchorElement.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n\n private initIntersectionObserver(root: HTMLElement | Document, threshold: number): void {\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n }\n this.intersectionObserver = new IntersectionObserver((entries: IntersectionObserverEntry[]) => this.onIntersectionUpdate(entries), {\n root: root === this.windowRef.document ? null : root,\n threshold,\n });\n }\n\n private updateObservedElements(): void {\n if (!this.intersectionObserver) return;\n this.intersectionObserver.disconnect();\n this.intersectionStates.clear();\n\n const sections = this.targetScrollSections();\n sections.forEach((section) => {\n if (section) {\n this.intersectionStates.set(section, false);\n this.intersectionObserver!.observe(section);\n }\n });\n }\n\n private onIntersectionUpdate(entries: IntersectionObserverEntry[]): void {\n entries.forEach((entry) => this.intersectionStates.set(entry.target, entry.isIntersecting));\n\n let newActiveCandidate: AnchorNavigationItemComponent | null = null;\n const currentSections = this.targetScrollSections();\n for (const section of currentSections) {\n if (this.intersectionStates.get(section) === true) {\n newActiveCandidate = this.projectedAnchorLinks().find((link) => link.href() === section.id) || null;\n break;\n }\n }\n\n if (this.activeAnchorLink() !== newActiveCandidate) this.activeAnchorLink.set(newActiveCandidate);\n }\n\n private findTargetScrollSections(): HTMLElement[] {\n const currentLinks = this.projectedAnchorLinks();\n if (!currentLinks.length) return [];\n\n const selectors = currentLinks\n .map((link) => link.href())\n .filter(Boolean)\n .map((id) => `#${CSS.escape(id)}`)\n .join(',');\n return selectors ? Array.from(this.scrollableContainer().querySelectorAll<HTMLElement>(selectors)) : [];\n }\n\n private disconnectObserver(): void {\n this.intersectionObserver?.disconnect();\n this.intersectionObserver = undefined;\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, ViewEncapsulation } from '@angular/core';\nimport { LinkDirective } from '@odx/angular/components/link';\nimport { CSSComponent } from '@odx/angular/internal';\nimport { injectElement } from '@odx/angular/utils';\nimport { AnchorNavigationService } from '../anchor-navigation.service';\n\n@CSSComponent('anchor-navigation-item')\n@Component({\n selector: 'odx-anchor-navigation-item',\n templateUrl: './anchor-navigation-item.component.html',\n standalone: true,\n imports: [LinkDirective],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.is-active]': 'isActive()',\n },\n})\nexport class AnchorNavigationItemComponent {\n private readonly navigationService = inject(AnchorNavigationService);\n public readonly element = injectElement();\n\n public href = input.required<string>();\n public isActive = computed(() => this.navigationService.activeAnchorLink() === this);\n\n protected handleClick(e: Event): void {\n e.preventDefault();\n this.navigationService.scrollToAnchor(this);\n }\n}\n","<a odxLink [href]=\"'#' + href()\" (click)=\"handleClick($event)\" (keydown.space)=\"handleClick($event)\" [attr.aria-current]=\"isActive() ? 'page' : null\">\n <ng-content />\n</a>\n","import { booleanAttribute, ChangeDetectionStrategy, Component, contentChildren, effect, inject, input, ViewEncapsulation } from '@angular/core';\nimport { CSSComponent } from '@odx/angular/internal';\nimport { injectElement } from '@odx/angular/utils';\nimport { AnchorNavigationService } from './anchor-navigation.service';\nimport { AnchorNavigationItemComponent } from './components';\n\n@CSSComponent('anchor-navigation')\n@Component({\n selector: 'odx-anchor-navigation',\n templateUrl: './anchor-navigation.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n providers: [AnchorNavigationService],\n host: {\n '[class.odx-anchor-navigation--vertical]': 'vertical()',\n '[attr.role]': '\"navigation\"',\n },\n})\nexport class AnchorNavigationComponent {\n private readonly service = inject(AnchorNavigationService);\n public readonly element = injectElement();\n\n /**\n * A Signal with list of `AnchorLinkDirective` instances projected into this component.\n * These are the anchor links that this navigation component will manage.\n */\n public readonly projectedAnchorLinks = contentChildren(AnchorNavigationItemComponent);\n\n /**\n * Input to determine if the anchor navigation should be displayed vertically.\n * Defaults to `false` (horizontal).\n */\n public vertical = input<boolean, boolean>(false, { transform: booleanAttribute });\n\n /**\n * Input to specify the threshold for the IntersectionObserver.\n * This determines how much of the target element must be visible before it is considered intersecting.\n * Defaults to `0.5` (50% visibility).\n */\n public threshold = input<number, number>(0.5, {\n transform: (value: number) => Math.max(0, Math.min(value, 1)),\n });\n\n /**\n * Input to specify the scrollable container element or document whose scroll position\n * is used to determine the active anchor link. If not provided, defaults to the\n * `document` of the current window.\n */\n // eslint-disable-next-line @angular-eslint/no-input-rename\n public scrollableContainer = input<HTMLElement | Document | undefined>(undefined, { alias: 'root' });\n\n public readonly activeAnchorLink = this.service.activeAnchorLink;\n\n constructor() {\n effect(\n () => {\n this.service.projectedAnchorLinks.set(this.projectedAnchorLinks());\n this.service.threshold.set(this.threshold());\n const rcInput = this.scrollableContainer();\n\n if (rcInput !== undefined) {\n this.service.scrollableContainer.set(rcInput);\n }\n },\n { allowSignalWrites: true },\n );\n }\n\n /**\n * Scrolls the view to the section associated with the given `AnchorLinkDirective`.\n * @param anchor The `AnchorLinkDirective` instance representing the target anchor/section.\n */\n public scrollToAnchor(anchor: AnchorNavigationItemComponent): void {\n this.service.scrollToAnchor(anchor);\n }\n}\n","<ng-content select=\"odx-anchor-navigation-item\" />\n","import { NgModule } from '@angular/core';\nimport { AnchorNavigationComponent } from './anchor-navigation.component';\nimport { AnchorNavigationItemComponent } from './components';\n\nconst modules = [AnchorNavigationComponent, AnchorNavigationItemComponent];\n\n@NgModule({\n imports: modules,\n exports: modules,\n})\nexport class AnchorNavigationModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|