@odx/angular 12.15.1 → 12.17.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 CHANGED
@@ -1,5 +1,17 @@
1
1
  # @odx/angular
2
2
 
3
+ ## 12.17.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 53d31be: Project minor dependencies update
8
+
9
+ ## 12.16.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 90631e1: Threshold input for Anchor Navigation component added
14
+
3
15
  ## 12.15.1
4
16
 
5
17
  ### Patch Changes
@@ -413,7 +425,6 @@
413
425
  ### Major Changes
414
426
 
415
427
  - c42ff73: New 'angular-chart-js' library for chart-js customization. Please note that '@odx/angular/charts-config' has been removed from the '@odx/angular' library and you should install '@odx/angular-chart-js' and change the path in the 'ChartThemeModule' import.
416
-
417
428
  1. Install new package: 'npm install @odx/angular-chart-js'
418
429
  2. Change the path if you already use 'ChartThemeModule' before: '@odx/angular/charts-config' => '@odx/angular-chart-js'.
419
430
 
@@ -524,7 +535,6 @@
524
535
  ### Major Changes
525
536
 
526
537
  - a931064: Breaking changes:
527
-
528
538
  - The CalendarComponent no longer uses date-fns for providing translated months and weekdays names. This is because previously, in order to configure the CalendarComponent, the developer was forced to use date-fns types, which required to have date-fns installed.
529
539
  - Configuration options of CalendarComponent were reduced. Properties such as monthYearLabel, monthLabel, weekLabel, dayLabel, yearLabel, dayA11yLabel, monthA11yLabel, yearA11yLabel and locale are no longer available. Now instead of adjusting unreasonable number of formatting options, the developer just sets the language through LocalizationService and the native Intl.DateTimeFormat() gets the right translations in right locale and format internally. So in order to use translated version of the CalendarComponent, call localizationService.setActiveLanguage() method with valid and available language code.
530
540
  - Simplified approach to LocalizationService. Fields availableLocales, defaultLocale and methods getActiveLocale() and setActiveLocale() are no longer available and should be substituted with availableLanguages, defaultLanguage, getActiveLanguage() and setActiveLanguage(). It's up to developer to supply either language subcode ('en'), or language with specified region ('en-US'). Both are treated as same locale with or without information about the region (which can obviously have an impact on label formatting appearance). It also goes for 'availableLanguages' configuration property, which can hold variously represented language codes, in example: ['en-US', 'en-GB', 'en', 'fr', 'de-DE']. Internally, LocalizationService also uses the Intl.Locale features.
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5jaG9yLW5hdmlnYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvYW5jaG9yLW5hdmlnYXRpb24vc3JjL2FuY2hvci1uYXZpZ2F0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL2FuY2hvci1uYXZpZ2F0aW9uL3NyYy9hbmNob3ItbmF2aWdhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEosT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBZXRELElBQU0seUJBQXlCLEdBQS9CLE1BQU0seUJBQXlCO0lBMEJwQztRQXpCaUIsWUFBTyxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzNDLFlBQU8sR0FBRyxhQUFhLEVBQUUsQ0FBQztRQUUxQzs7O1dBR0c7UUFDYSx5QkFBb0IsR0FBRyxlQUFlLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUV0Rjs7O1dBR0c7UUFDSSxhQUFRLEdBQUcsS0FBSyxDQUFtQixLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBRWxGOzs7O1dBSUc7UUFDSCwyREFBMkQ7UUFDcEQsd0JBQW1CLEdBQUcsS0FBSyxDQUFxQyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUVyRixxQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1FBRy9ELE1BQU0sQ0FDSixHQUFHLEVBQUU7WUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBRTNDLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoRCxDQUFDO1FBQ0gsQ0FBQyxFQUNELEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQzVCLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksY0FBYyxDQUFDLE1BQXFDO1FBQ3pELElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7K0dBOUNVLHlCQUF5QjttR0FBekIseUJBQXlCLG9kQU56QixDQUFDLHVCQUF1QixDQUFDLCtEQWNtQiw2QkFBNkIsNkNDM0J0Rix3REFDQTs7QURrQmEseUJBQXlCO0lBYnJDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQzs7R0FhckIseUJBQXlCLENBK0NyQzs7NEZBL0NZLHlCQUF5QjtrQkFackMsU0FBUzsrQkFDRSx1QkFBdUIsbUJBRWhCLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxpQkFDRCxpQkFBaUIsQ0FBQyxJQUFJLGFBQzFCLENBQUMsdUJBQXVCLENBQUMsUUFDOUI7d0JBQ0oseUNBQXlDLEVBQUUsWUFBWTt3QkFDdkQsYUFBYSxFQUFFLGNBQWM7cUJBQzlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYm9vbGVhbkF0dHJpYnV0ZSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29udGVudENoaWxkcmVuLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDU1NDb21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvaW50ZXJuYWwnO1xuaW1wb3J0IHsgaW5qZWN0RWxlbWVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5pbXBvcnQgeyBBbmNob3JOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vYW5jaG9yLW5hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBBbmNob3JOYXZpZ2F0aW9uSXRlbUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cyc7XG5cbkBDU1NDb21wb25lbnQoJ2FuY2hvci1uYXZpZ2F0aW9uJylcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29keC1hbmNob3ItbmF2aWdhdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9hbmNob3ItbmF2aWdhdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtBbmNob3JOYXZpZ2F0aW9uU2VydmljZV0sXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLm9keC1hbmNob3ItbmF2aWdhdGlvbi0tdmVydGljYWxdJzogJ3ZlcnRpY2FsKCknLFxuICAgICdbYXR0ci5yb2xlXSc6ICdcIm5hdmlnYXRpb25cIicsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIEFuY2hvck5hdmlnYXRpb25Db21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2UgPSBpbmplY3QoQW5jaG9yTmF2aWdhdGlvblNlcnZpY2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgZWxlbWVudCA9IGluamVjdEVsZW1lbnQoKTtcblxuICAvKipcbiAgICogQSBTaWduYWwgd2l0aCBsaXN0IG9mIGBBbmNob3JMaW5rRGlyZWN0aXZlYCBpbnN0YW5jZXMgcHJvamVjdGVkIGludG8gdGhpcyBjb21wb25lbnQuXG4gICAqIFRoZXNlIGFyZSB0aGUgYW5jaG9yIGxpbmtzIHRoYXQgdGhpcyBuYXZpZ2F0aW9uIGNvbXBvbmVudCB3aWxsIG1hbmFnZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcm9qZWN0ZWRBbmNob3JMaW5rcyA9IGNvbnRlbnRDaGlsZHJlbihBbmNob3JOYXZpZ2F0aW9uSXRlbUNvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIElucHV0IHRvIGRldGVybWluZSBpZiB0aGUgYW5jaG9yIG5hdmlnYXRpb24gc2hvdWxkIGJlIGRpc3BsYXllZCB2ZXJ0aWNhbGx5LlxuICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgIChob3Jpem9udGFsKS5cbiAgICovXG4gIHB1YmxpYyB2ZXJ0aWNhbCA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4+KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblxuICAvKipcbiAgICogSW5wdXQgdG8gc3BlY2lmeSB0aGUgc2Nyb2xsYWJsZSBjb250YWluZXIgZWxlbWVudCBvciBkb2N1bWVudCB3aG9zZSBzY3JvbGwgcG9zaXRpb25cbiAgICogaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGFjdGl2ZSBhbmNob3IgbGluay4gSWYgbm90IHByb3ZpZGVkLCBkZWZhdWx0cyB0byB0aGVcbiAgICogYGRvY3VtZW50YCBvZiB0aGUgY3VycmVudCB3aW5kb3cuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICBwdWJsaWMgc2Nyb2xsYWJsZUNvbnRhaW5lciA9IGlucHV0PEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCwgeyBhbGlhczogJ3Jvb3QnIH0pO1xuXG4gIHB1YmxpYyByZWFkb25seSBhY3RpdmVBbmNob3JMaW5rID0gdGhpcy5zZXJ2aWNlLmFjdGl2ZUFuY2hvckxpbms7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnNlcnZpY2UucHJvamVjdGVkQW5jaG9yTGlua3Muc2V0KHRoaXMucHJvamVjdGVkQW5jaG9yTGlua3MoKSk7XG4gICAgICAgIGNvbnN0IHJjSW5wdXQgPSB0aGlzLnNjcm9sbGFibGVDb250YWluZXIoKTtcblxuICAgICAgICBpZiAocmNJbnB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5zZXJ2aWNlLnNjcm9sbGFibGVDb250YWluZXIuc2V0KHJjSW5wdXQpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyB0aGUgdmlldyB0byB0aGUgc2VjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGBBbmNob3JMaW5rRGlyZWN0aXZlYC5cbiAgICogQHBhcmFtIGFuY2hvciBUaGUgYEFuY2hvckxpbmtEaXJlY3RpdmVgIGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUgdGFyZ2V0IGFuY2hvci9zZWN0aW9uLlxuICAgKi9cbiAgcHVibGljIHNjcm9sbFRvQW5jaG9yKGFuY2hvcjogQW5jaG9yTmF2aWdhdGlvbkl0ZW1Db21wb25lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnNlcnZpY2Uuc2Nyb2xsVG9BbmNob3IoYW5jaG9yKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRlbnQgc2VsZWN0PVwib2R4LWFuY2hvci1uYXZpZ2F0aW9uLWl0ZW1cIiAvPlxuIl19
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: 0.1,
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5jaG9yLW5hdmlnYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL2FuY2hvci1uYXZpZ2F0aW9uL3NyYy9hbmNob3ItbmF2aWdhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQWEsTUFBTSxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUN4RyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUl6QyxNQUFNLE9BQU8sdUJBQXVCO0lBMkJsQztRQTFCaUIsY0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU5Qix1QkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztRQUVqRCx5QkFBb0IsR0FBRyxRQUFRLENBQWdCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7UUFFdkc7Ozs7V0FJRztRQUNJLHdCQUFtQixHQUEyQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVyRzs7OztXQUlHO1FBQ0kseUJBQW9CLEdBQTZELE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVuRzs7O1dBR0c7UUFDYSxxQkFBZ0IsR0FBRyxNQUFNLENBQXVDLElBQUksQ0FBQyxDQUFDO1FBR3BGLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ25CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQy9DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBRWpELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxD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QUN4QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDO0lBQ3hDLENBQUM7K0dBL0hVLHVCQUF1QjttSEFBdkIsdUJBQXVCOzs0RkFBdkIsdUJBQXVCO2tCQURuQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIHNpZ25hbCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdpbmRvd1JlZiB9IGZyb20gJ0BvZHgvYW5ndWxhcic7XG5pbXBvcnQgeyBBbmNob3JOYXZpZ2F0aW9uSXRlbUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9hbmNob3ItbmF2aWdhdGlvbi1pdGVtLmNvbXBvbmVudCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBbmNob3JOYXZpZ2F0aW9uU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2luZG93UmVmID0gaW5qZWN0KFdpbmRvd1JlZik7XG4gIHByaXZhdGUgaW50ZXJzZWN0aW9uT2JzZXJ2ZXI/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: 0.1,
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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@odx/angular",
3
- "version": "12.15.1",
3
+ "version": "12.17.0",
4
4
  "author": "Drägerwerk AG & Co.KGaA",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "peerDependencies": {
@@ -412,18 +412,18 @@
412
412
  "esm": "./esm2022/components/rich-list/odx-angular-components-rich-list.mjs",
413
413
  "default": "./fesm2022/odx-angular-components-rich-list.mjs"
414
414
  },
415
- "./components/search-bar": {
416
- "types": "./components/search-bar/index.d.ts",
417
- "esm2022": "./esm2022/components/search-bar/odx-angular-components-search-bar.mjs",
418
- "esm": "./esm2022/components/search-bar/odx-angular-components-search-bar.mjs",
419
- "default": "./fesm2022/odx-angular-components-search-bar.mjs"
420
- },
421
415
  "./components/select": {
422
416
  "types": "./components/select/index.d.ts",
423
417
  "esm2022": "./esm2022/components/select/odx-angular-components-select.mjs",
424
418
  "esm": "./esm2022/components/select/odx-angular-components-select.mjs",
425
419
  "default": "./fesm2022/odx-angular-components-select.mjs"
426
420
  },
421
+ "./components/search-bar": {
422
+ "types": "./components/search-bar/index.d.ts",
423
+ "esm2022": "./esm2022/components/search-bar/odx-angular-components-search-bar.mjs",
424
+ "esm": "./esm2022/components/search-bar/odx-angular-components-search-bar.mjs",
425
+ "default": "./fesm2022/odx-angular-components-search-bar.mjs"
426
+ },
427
427
  "./components/slider": {
428
428
  "types": "./components/slider/index.d.ts",
429
429
  "esm2022": "./esm2022/components/slider/odx-angular-components-slider.mjs",