@odx/angular 12.25.0 → 12.25.1

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,11 @@
1
1
  # @odx/angular
2
2
 
3
+ ## 12.25.1
4
+
5
+ ### Patch Changes
6
+
7
+ - e4730df: Fix: TabBar Component - scroll item into view method fixed to prevent page scrolling on load and resize
8
+
3
9
  ## 12.25.0
4
10
 
5
11
  ### Minor Changes
@@ -46,7 +46,7 @@ export declare class ScrollableService implements OnDestroy {
46
46
  *
47
47
  * @param {HTMLElement | null} activeItem - The currently active item to scroll into view.
48
48
  */
49
- scrollActiveItemIntoView(activeItem: HTMLElement | null): void;
49
+ scrollActiveItemIntoHorizontalView(activeItem: HTMLElement | null): void;
50
50
  private observeVisibility;
51
51
  static ɵfac: i0.ɵɵFactoryDeclaration<ScrollableService, never>;
52
52
  static ɵprov: i0.ɵɵInjectableDeclaration<ScrollableService>;
@@ -77,10 +77,31 @@ export class ScrollableService {
77
77
  *
78
78
  * @param {HTMLElement | null} activeItem - The currently active item to scroll into view.
79
79
  */
80
- scrollActiveItemIntoView(activeItem) {
81
- if (activeItem) {
82
- activeItem.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });
83
- }
80
+ scrollActiveItemIntoHorizontalView(activeItem) {
81
+ const container = this.scrollContainer?.nativeElement;
82
+ if (!container || !activeItem)
83
+ return;
84
+ // Use a small epsilon to avoid false positives from subpixel rounding.
85
+ const isHorizontallyScrollable = container.scrollWidth - container.clientWidth > 1;
86
+ // If there is no horizontal overflow, any attempt to "scroll into view" can only scroll ancestor containers
87
+ // (including the page). This is the root cause of the page jumping on load/resize.
88
+ if (!isHorizontallyScrollable)
89
+ return;
90
+ const containerRect = container.getBoundingClientRect();
91
+ const itemRect = activeItem.getBoundingClientRect();
92
+ const isFullyVisible = itemRect.left >= containerRect.left && itemRect.right <= containerRect.right;
93
+ if (isFullyVisible)
94
+ return;
95
+ const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);
96
+ let targetLeft = container.scrollLeft;
97
+ const itemLeft = itemRect.left - containerRect.left + container.scrollLeft;
98
+ const itemCenter = itemLeft + itemRect.width / 2;
99
+ targetLeft = itemCenter - container.clientWidth / 2;
100
+ targetLeft = Math.min(maxLeft, Math.max(0, targetLeft));
101
+ const leftChanged = Math.abs(targetLeft - container.scrollLeft) > 1;
102
+ if (!leftChanged)
103
+ return;
104
+ container.scrollTo({ left: targetLeft, behavior: 'smooth' });
84
105
  }
85
106
  observeVisibility(items, callback) {
86
107
  const visibleMap = new Map();
@@ -105,4 +126,4 @@ export class ScrollableService {
105
126
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScrollableService, decorators: [{
106
127
  type: Injectable
107
128
  }] });
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYWJsZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2Nkay9zY3JvbGxhYmxlL3NyYy9saWIvc2Nyb2xsYWJsZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxVQUFVLEVBQWEsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU0xRTs7O0dBR0c7QUFFSCxNQUFNLE9BQU8saUJBQWlCO0lBRDlCO1FBS0U7Ozs7V0FJRztRQUNhLGFBQVEsR0FBRyxNQUFNLENBQXFCLElBQUksQ0FBQyxDQUFDO1FBRTVEOzs7O1dBSUc7UUFDYSxhQUFRLEdBQUcsTUFBTSxDQUFxQixJQUFJLENBQUMsQ0FBQztRQUU1RDs7O1dBR0c7UUFDYSxpQkFBWSxHQUFHLE1BQU0sQ0FBZ0IsRUFBRSxDQUFDLENBQUM7S0EwRjFEO0lBeEZRLFdBQVc7UUFDaEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE9BQU8sQ0FBQyxlQUF3QyxFQUFFLEtBQWdDO1FBQ3ZGLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3pDLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7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SSxDQUFDLGVBQWdCLENBQUMsYUFBYTtZQUN6QyxTQUFTLEVBQUUsQ0FBQztTQUNiLENBQ0YsQ0FBQztRQUVGLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNoRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDOytHQS9HVSxpQkFBaUI7bUhBQWpCLGlCQUFpQjs7NEZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdGFibGUsIE9uRGVzdHJveSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsYWJsZUl0ZW0ge1xuICBlbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pjtcbn1cblxuLyoqXG4gKiBTZXJ2aWNlIHRvIG1hbmFnZSBzY3JvbGxhYmxlIGl0ZW1zIHdpdGhpbiBhIGNvbnRhaW5lciwgcHJvdmlkaW5nIGZ1bmN0aW9uYWxpdHkgdG8gb2JzZXJ2ZSBpdGVtIHZpc2liaWxpdHlcbiAqIGFuZCBuYXZpZ2F0ZSB0aHJvdWdoIHRoZW0uXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTY3JvbGxhYmxlU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgaW50ZXJzZWN0aW9uT2JzZXJ2ZXI/OiBJbnRlcnNlY3Rpb25PYnNlcnZlcjtcbiAgcHJpdmF0ZSBzY3JvbGxDb250YWluZXI/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAvKipcbiAgICogUmVmZXJlbmNlcyB0byB0aGUgbmV4dCBhbmQgcHJldmlvdXMgc2Nyb2xsYWJsZSBpdGVtcy5cbiAgICpcbiAgICogQHR5cGUge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuZXh0SXRlbSA9IHNpZ25hbDxIVE1MRWxlbWVudCB8IG51bGw+KG51bGwpO1xuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2VzIHRvIHRoZSBwcmV2aW91cyBzY3JvbGxhYmxlIGl0ZW0uXG4gICAqXG4gICAqIEB0eXBlIHtIVE1MRWxlbWVudCB8IG51bGx9XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJldkl0ZW0gPSBzaWduYWw8SFRNTEVsZW1lbnQgfCBudWxsPihudWxsKTtcblxuICAvKiogTGlzdCBvZiBjdXJyZW50bHkgdmlzaWJsZSBpdGVtcyB3aXRoaW4gdGhlIHNjcm9sbCBjb250YWluZXIuXG4gICAqXG4gICAqIEB0eXBlIHtIVE1MRWxlbWVudFtdfVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZpc2libGVJdGVtcyA9IHNpZ25hbDxIVE1MRWxlbWVudFtdPihbXSk7XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgb2JzZXJ2aW5nIHRoZSBzY3JvbGxhYmxlIGl0ZW1zIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50UmVmPEhUTUxFbGVtZW50Pn0gc2Nyb2xsQ29udGFpbmVyIC0gVGhlIGNvbnRhaW5lciBlbGVtZW50IHRoYXQgaG9sZHMgdGhlIHNjcm9sbGFibGUgaXRlbXMuXG4gICAqIEBwYXJhbSB7cmVhZG9ubHkgU2Nyb2xsYWJsZUl0ZW1bXX0gaXRlbXMgLSBUaGUgbGlzdCBvZiBzY3JvbGxhYmxlIGl0ZW1zIHRvIG9ic2VydmUuXG4gICAqL1xuICBwdWJsaWMgb2JzZXJ2ZShzY3JvbGxDb250YWluZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LCBpdGVtczogcmVhZG9ubHkgU2Nyb2xsYWJsZUl0ZW1bXSk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyID0gc2Nyb2xsQ29udGFpbmVyO1xuICAgIGlmICh0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyKSB7XG4gICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxJdGVtcyA9IGl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgIGlmICghdGhpcy5zY3JvbGxDb250YWluZXIgfHwgYWxsSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLm5leHRJdGVtLnNldChudWxsKTtcbiAgICAgIHRoaXMucHJldkl0ZW0uc2V0KG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSB0aGlzLm9ic2VydmVWaXNpYmlsaXR5KGFsbEl0ZW1zLCAodmlzaWJsZSkgPT4ge1xuICAgICAgbGV0IHByZXZJdGVtOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IG5leHRJdGVtOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gICAgICBpZiAodmlzaWJsZS5sZW5ndGggPiAwICYmIGFsbEl0ZW1zLmxlbmd0aCA+IHZpc2libGUubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0VmlzaWJsZUluZGV4ID0gYWxsSXRlbXMuaW5kZXhPZih2aXNpYmxlWzBdKTtcbiAgICAgICAgaWYgKGZpcnN0VmlzaWJsZUluZGV4ID4gMCkge1xuICAgICAgICAgIHByZXZJdGVtID0gYWxsSXRlbXNbZmlyc3RWaXNpYmxlSW5kZXggLSAxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RWaXNpYmxlSW5kZXggPSBhbGxJdGVtcy5pbmRleE9mKHZpc2libGVbdmlzaWJsZS5sZW5ndGggLSAxXSk7XG4gICAgICAgIGlmIChsYXN0VmlzaWJsZUluZGV4IDwgYWxsSXRlbXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIG5leHRJdGVtID0gYWxsSXRlbXNbbGFzdFZpc2libGVJbmRleCArIDFdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmV4dEl0ZW0uc2V0KG5leHRJdGVtKTtcbiAgICAgIHRoaXMucHJldkl0ZW0uc2V0KHByZXZJdGVtKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIHRoZSBjb250YWluZXIgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7J25leHQnIHwgJ3ByZXYnfSBkaXJlY3Rpb24gLSBUaGUgZGlyZWN0aW9uIHRvIHNjcm9sbCAoJ25leHQnIGZvciByaWdodCwgJ3ByZXYnIGZvciBsZWZ0KS5cbiAgICovXG4gIHB1YmxpYyBzY3JvbGwoZGlyZWN0aW9uOiAxIHwgLTEgPSAxKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5zY3JvbGxDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICAgIGNvbnRhaW5lci5zY3JvbGxCeSh7IGxlZnQ6IChjb250YWluZXIuY2xpZW50V2lkdGggKiBkaXJlY3Rpb24pIC8gMiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIHRoZSBhY3RpdmUgaXRlbSBpbnRvIHZpZXcgd2l0aGluIHRoZSBzY3JvbGwgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50IHwgbnVsbH0gYWN0aXZlSXRlbSAtIFRoZSBjdXJyZW50bHkgYWN0aXZlIGl0ZW0gdG8gc2Nyb2xsIGludG8gdmlldy5cbiAgICovXG4gIHB1YmxpYyBzY3JvbGxBY3RpdmVJdGVtSW50b1ZpZXcoYWN0aXZlSXRlbTogSFRNTEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKGFjdGl2ZUl0ZW0pIHtcbiAgICAgIGFjdGl2ZUl0ZW0uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcsIGlubGluZTogJ2NlbnRlcicgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvYnNlcnZlVmlzaWJpbGl0eShpdGVtczogSFRNTEVsZW1lbnRbXSwgY2FsbGJhY2s6ICh2aXNpYmxlOiBIVE1MRWxlbWVudFtdKSA9PiB2b2lkKTogSW50ZXJzZWN0aW9uT2JzZXJ2ZXIge1xuICAgIGNvbnN0IHZpc2libGVNYXAgPSBuZXcgTWFwPEhUTUxFbGVtZW50LCBib29sZWFuPigpO1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKFxuICAgICAgKGVudHJpZXMpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gZW50cnkuaXNJbnRlcnNlY3RpbmcgJiYgZW50cnkuaW50ZXJzZWN0aW9uUmF0aW8gPj0gMC43NTtcbiAgICAgICAgICB2aXNpYmxlTWFwLnNldChlbnRyeS50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIGlzVmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmlzaWJsZSA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gdmlzaWJsZU1hcC5nZXQoaXRlbSkpO1xuICAgICAgICB0aGlzLnZpc2libGVJdGVtcy5zZXQodmlzaWJsZSk7XG4gICAgICAgIGNhbGxiYWNrKHZpc2libGUpO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcm9vdDogdGhpcy5zY3JvbGxDb250YWluZXIhLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IG9ic2VydmVyLm9ic2VydmUoaXRlbSkpO1xuICAgIHJldHVybiBvYnNlcnZlcjtcbiAgfVxufVxuIl19
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYWJsZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2Nkay9zY3JvbGxhYmxlL3NyYy9saWIvc2Nyb2xsYWJsZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxVQUFVLEVBQWEsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU0xRTs7O0dBR0c7QUFFSCxNQUFNLE9BQU8saUJBQWlCO0lBRDlCO1FBS0U7Ozs7V0FJRztRQUNhLGFBQVEsR0FBRyxNQUFNLENBQXFCLElBQUksQ0FBQyxDQUFDO1FBRTVEOzs7O1dBSUc7UUFDYSxhQUFRLEdBQUcsTUFBTSxDQUFxQixJQUFJLENBQUMsQ0FBQztRQUU1RDs7O1dBR0c7UUFDYSxpQkFBWSxHQUFHLE1BQU0sQ0FBZ0IsRUFBRSxDQUFDLENBQUM7S0FpSDFEO0lBL0dRLFdBQVc7UUFDaEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE9BQU8sQ0FBQyxlQUF3QyxFQUFFLEtBQWdDO1FBQ3ZGLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3pDLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7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QUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEIsQ0FBQyxFQUNEO1lBQ0UsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFnQixDQUFDLGFBQWE7WUFDekMsU0FBUyxFQUFFLENBQUM7U0FDYixDQUNGLENBQUM7UUFFRixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDaEQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzsrR0F0SVUsaUJBQWlCO21IQUFqQixpQkFBaUI7OzRGQUFqQixpQkFBaUI7a0JBRDdCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNjcm9sbGFibGVJdGVtIHtcbiAgZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG59XG5cbi8qKlxuICogU2VydmljZSB0byBtYW5hZ2Ugc2Nyb2xsYWJsZSBpdGVtcyB3aXRoaW4gYSBjb250YWluZXIsIHByb3ZpZGluZyBmdW5jdGlvbmFsaXR5IHRvIG9ic2VydmUgaXRlbSB2aXNpYmlsaXR5XG4gKiBhbmQgbmF2aWdhdGUgdGhyb3VnaCB0aGVtLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2Nyb2xsYWJsZVNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGludGVyc2VjdGlvbk9ic2VydmVyPzogSW50ZXJzZWN0aW9uT2JzZXJ2ZXI7XG4gIHByaXZhdGUgc2Nyb2xsQ29udGFpbmVyPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZXMgdG8gdGhlIG5leHQgYW5kIHByZXZpb3VzIHNjcm9sbGFibGUgaXRlbXMuXG4gICAqXG4gICAqIEB0eXBlIHtIVE1MRWxlbWVudCB8IG51bGx9XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmV4dEl0ZW0gPSBzaWduYWw8SFRNTEVsZW1lbnQgfCBudWxsPihudWxsKTtcblxuICAvKipcbiAgICogUmVmZXJlbmNlcyB0byB0aGUgcHJldmlvdXMgc2Nyb2xsYWJsZSBpdGVtLlxuICAgKlxuICAgKiBAdHlwZSB7SFRNTEVsZW1lbnQgfCBudWxsfVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByZXZJdGVtID0gc2lnbmFsPEhUTUxFbGVtZW50IHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIExpc3Qgb2YgY3VycmVudGx5IHZpc2libGUgaXRlbXMgd2l0aGluIHRoZSBzY3JvbGwgY29udGFpbmVyLlxuICAgKlxuICAgKiBAdHlwZSB7SFRNTEVsZW1lbnRbXX1cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2aXNpYmxlSXRlbXMgPSBzaWduYWw8SFRNTEVsZW1lbnRbXT4oW10pO1xuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIG9ic2VydmluZyB0aGUgc2Nyb2xsYWJsZSBpdGVtcyB3aXRoaW4gdGhlIHNwZWNpZmllZCBjb250YWluZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudFJlZjxIVE1MRWxlbWVudD59IHNjcm9sbENvbnRhaW5lciAtIFRoZSBjb250YWluZXIgZWxlbWVudCB0aGF0IGhvbGRzIHRoZSBzY3JvbGxhYmxlIGl0ZW1zLlxuICAgKiBAcGFyYW0ge3JlYWRvbmx5IFNjcm9sbGFibGVJdGVtW119IGl0ZW1zIC0gVGhlIGxpc3Qgb2Ygc2Nyb2xsYWJsZSBpdGVtcyB0byBvYnNlcnZlLlxuICAgKi9cbiAgcHVibGljIG9ic2VydmUoc2Nyb2xsQ29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiwgaXRlbXM6IHJlYWRvbmx5IFNjcm9sbGFibGVJdGVtW10pOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lciA9IHNjcm9sbENvbnRhaW5lcjtcbiAgICBpZiAodGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlcikge1xuICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsSXRlbXMgPSBpdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0uZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICBpZiAoIXRoaXMuc2Nyb2xsQ29udGFpbmVyIHx8IGFsbEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5uZXh0SXRlbS5zZXQobnVsbCk7XG4gICAgICB0aGlzLnByZXZJdGVtLnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyID0gdGhpcy5vYnNlcnZlVmlzaWJpbGl0eShhbGxJdGVtcywgKHZpc2libGUpID0+IHtcbiAgICAgIGxldCBwcmV2SXRlbTogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICAgIGxldCBuZXh0SXRlbTogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAgICAgaWYgKHZpc2libGUubGVuZ3RoID4gMCAmJiBhbGxJdGVtcy5sZW5ndGggPiB2aXNpYmxlLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBmaXJzdFZpc2libGVJbmRleCA9IGFsbEl0ZW1zLmluZGV4T2YodmlzaWJsZVswXSk7XG4gICAgICAgIGlmIChmaXJzdFZpc2libGVJbmRleCA+IDApIHtcbiAgICAgICAgICBwcmV2SXRlbSA9IGFsbEl0ZW1zW2ZpcnN0VmlzaWJsZUluZGV4IC0gMV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXN0VmlzaWJsZUluZGV4ID0gYWxsSXRlbXMuaW5kZXhPZih2aXNpYmxlW3Zpc2libGUubGVuZ3RoIC0gMV0pO1xuICAgICAgICBpZiAobGFzdFZpc2libGVJbmRleCA8IGFsbEl0ZW1zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBuZXh0SXRlbSA9IGFsbEl0ZW1zW2xhc3RWaXNpYmxlSW5kZXggKyAxXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLm5leHRJdGVtLnNldChuZXh0SXRlbSk7XG4gICAgICB0aGlzLnByZXZJdGVtLnNldChwcmV2SXRlbSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyB0aGUgY29udGFpbmVyIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0geyduZXh0JyB8ICdwcmV2J30gZGlyZWN0aW9uIC0gVGhlIGRpcmVjdGlvbiB0byBzY3JvbGwgKCduZXh0JyBmb3IgcmlnaHQsICdwcmV2JyBmb3IgbGVmdCkuXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsKGRpcmVjdGlvbjogMSB8IC0xID0gMSk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgICBjb250YWluZXIuc2Nyb2xsQnkoeyBsZWZ0OiAoY29udGFpbmVyLmNsaWVudFdpZHRoICogZGlyZWN0aW9uKSAvIDIgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyB0aGUgYWN0aXZlIGl0ZW0gaW50byB2aWV3IHdpdGhpbiB0aGUgc2Nyb2xsIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudCB8IG51bGx9IGFjdGl2ZUl0ZW0gLSBUaGUgY3VycmVudGx5IGFjdGl2ZSBpdGVtIHRvIHNjcm9sbCBpbnRvIHZpZXcuXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsQWN0aXZlSXRlbUludG9Ib3Jpem9udGFsVmlldyhhY3RpdmVJdGVtOiBIVE1MRWxlbWVudCB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnNjcm9sbENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWNvbnRhaW5lciB8fCAhYWN0aXZlSXRlbSkgcmV0dXJuO1xuXG4gICAgLy8gVXNlIGEgc21hbGwgZXBzaWxvbiB0byBhdm9pZCBmYWxzZSBwb3NpdGl2ZXMgZnJvbSBzdWJwaXhlbCByb3VuZGluZy5cbiAgICBjb25zdCBpc0hvcml6b250YWxseVNjcm9sbGFibGUgPSBjb250YWluZXIuc2Nyb2xsV2lkdGggLSBjb250YWluZXIuY2xpZW50V2lkdGggPiAxO1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIGhvcml6b250YWwgb3ZlcmZsb3csIGFueSBhdHRlbXB0IHRvIFwic2Nyb2xsIGludG8gdmlld1wiIGNhbiBvbmx5IHNjcm9sbCBhbmNlc3RvciBjb250YWluZXJzXG4gICAgLy8gKGluY2x1ZGluZyB0aGUgcGFnZSkuIFRoaXMgaXMgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIHBhZ2UganVtcGluZyBvbiBsb2FkL3Jlc2l6ZS5cbiAgICBpZiAoIWlzSG9yaXpvbnRhbGx5U2Nyb2xsYWJsZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBpdGVtUmVjdCA9IGFjdGl2ZUl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBjb25zdCBpc0Z1bGx5VmlzaWJsZSA9IGl0ZW1SZWN0LmxlZnQgPj0gY29udGFpbmVyUmVjdC5sZWZ0ICYmIGl0ZW1SZWN0LnJpZ2h0IDw9IGNvbnRhaW5lclJlY3QucmlnaHQ7XG4gICAgaWYgKGlzRnVsbHlWaXNpYmxlKSByZXR1cm47XG5cbiAgICBjb25zdCBtYXhMZWZ0ID0gTWF0aC5tYXgoMCwgY29udGFpbmVyLnNjcm9sbFdpZHRoIC0gY29udGFpbmVyLmNsaWVudFdpZHRoKTtcbiAgICBsZXQgdGFyZ2V0TGVmdCA9IGNvbnRhaW5lci5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IGl0ZW1MZWZ0ID0gaXRlbVJlY3QubGVmdCAtIGNvbnRhaW5lclJlY3QubGVmdCArIGNvbnRhaW5lci5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IGl0ZW1DZW50ZXIgPSBpdGVtTGVmdCArIGl0ZW1SZWN0LndpZHRoIC8gMjtcbiAgICB0YXJnZXRMZWZ0ID0gaXRlbUNlbnRlciAtIGNvbnRhaW5lci5jbGllbnRXaWR0aCAvIDI7XG4gICAgdGFyZ2V0TGVmdCA9IE1hdGgubWluKG1heExlZnQsIE1hdGgubWF4KDAsIHRhcmdldExlZnQpKTtcblxuICAgIGNvbnN0IGxlZnRDaGFuZ2VkID0gTWF0aC5hYnModGFyZ2V0TGVmdCAtIGNvbnRhaW5lci5zY3JvbGxMZWZ0KSA+IDE7XG4gICAgaWYgKCFsZWZ0Q2hhbmdlZCkgcmV0dXJuO1xuXG4gICAgY29udGFpbmVyLnNjcm9sbFRvKHsgbGVmdDogdGFyZ2V0TGVmdCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvYnNlcnZlVmlzaWJpbGl0eShpdGVtczogSFRNTEVsZW1lbnRbXSwgY2FsbGJhY2s6ICh2aXNpYmxlOiBIVE1MRWxlbWVudFtdKSA9PiB2b2lkKTogSW50ZXJzZWN0aW9uT2JzZXJ2ZXIge1xuICAgIGNvbnN0IHZpc2libGVNYXAgPSBuZXcgTWFwPEhUTUxFbGVtZW50LCBib29sZWFuPigpO1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKFxuICAgICAgKGVudHJpZXMpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gZW50cnkuaXNJbnRlcnNlY3RpbmcgJiYgZW50cnkuaW50ZXJzZWN0aW9uUmF0aW8gPj0gMC43NTtcbiAgICAgICAgICB2aXNpYmxlTWFwLnNldChlbnRyeS50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIGlzVmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmlzaWJsZSA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gdmlzaWJsZU1hcC5nZXQoaXRlbSkpO1xuICAgICAgICB0aGlzLnZpc2libGVJdGVtcy5zZXQodmlzaWJsZSk7XG4gICAgICAgIGNhbGxiYWNrKHZpc2libGUpO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcm9vdDogdGhpcy5zY3JvbGxDb250YWluZXIhLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IG9ic2VydmVyLm9ic2VydmUoaXRlbSkpO1xuICAgIHJldHVybiBvYnNlcnZlcjtcbiAgfVxufVxuIl19
@@ -19,7 +19,7 @@ import * as i1 from "@odx/angular";
19
19
  */
20
20
  let SwitchComponent = class SwitchComponent extends CheckBoxControl {
21
21
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SwitchComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
22
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: SwitchComponent, isStandalone: true, selector: "odx-switch", host: { properties: { "class.is-active": "checked" } }, providers: [ReadonlyController.connect()], usesInheritance: true, hostDirectives: [{ directive: i1.WithDisabledState }], ngImport: i0, template: "<label class=\"odx-switch__label\">\n <input\n odxControl\n class=\"odx-switch__input\"\n [attr.aria-checked]=\"ariaChecked\"\n [attr.aria-invalid]=\"hasError || null\"\n [attr.aria-readonly]=\"isReadonly || null\"\n [attr.aria-required]=\"isRequired || null\"\n [attr.tabindex]=\"tabindex || null\"\n [checked]=\"checked\"\n [disabled]=\"isDisabled || isReadonly\"\n [name]=\"name\"\n [readonly]=\"isReadonly\"\n [value]=\"value\"\n type=\"checkbox\"\n (blur)=\"onTouched()\"\n (change)=\"onChanged($event)\"\n />\n <div class=\"odx-switch__track\">\n <div class=\"odx-switch__thumb\">\n <odx-icon class=\"odx-switch__icon\" iconSet=\"core\" [name]=\"checked ? 'check' : 'close'\" />\n </div>\n </div>\n <div class=\"odx-switch__content\">\n <ng-content />\n @if (isRequired) {\n <span class=\"odx-switch__required\">*</span>\n }\n </div>\n</label>\n", dependencies: [{ kind: "directive", type: ControlDirective, selector: "[odxControl]", exportAs: ["odxControl"] }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
22
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: SwitchComponent, isStandalone: true, selector: "odx-switch", host: { properties: { "class.is-active": "checked" } }, providers: [ReadonlyController.connect()], usesInheritance: true, hostDirectives: [{ directive: i1.WithDisabledState }], ngImport: i0, template: "<label class=\"odx-switch__label\">\n <input\n odxControl\n class=\"odx-switch__input\"\n [attr.aria-checked]=\"ariaChecked\"\n [attr.aria-invalid]=\"hasError || null\"\n [attr.aria-readonly]=\"isReadonly || null\"\n [attr.aria-required]=\"isRequired || null\"\n [attr.tabindex]=\"tabindex || null\"\n [checked]=\"checked\"\n [disabled]=\"isDisabled || isReadonly\"\n [name]=\"name\"\n [readonly]=\"isReadonly\"\n [value]=\"value\"\n type=\"checkbox\"\n (blur)=\"onTouched()\"\n (change)=\"onChanged($event)\"\n />\n <div class=\"odx-switch__thumb-container\">\n <div class=\"odx-switch__track\"></div>\n <div class=\"odx-switch__thumb\">\n <odx-icon class=\"odx-switch__icon\" iconSet=\"core\" [name]=\"checked ? 'check' : 'close'\" />\n </div>\n </div>\n <div class=\"odx-switch__content\">\n <ng-content />\n @if (isRequired) {\n <span class=\"odx-switch__required\">*</span>\n }\n </div>\n</label>\n", dependencies: [{ kind: "directive", type: ControlDirective, selector: "[odxControl]", exportAs: ["odxControl"] }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
23
23
  };
24
24
  SwitchComponent = __decorate([
25
25
  CSSComponent('switch')
@@ -29,6 +29,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29
29
  type: Component,
30
30
  args: [{ standalone: true, selector: 'odx-switch', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [ControlDirective, IconComponent], providers: [ReadonlyController.connect()], hostDirectives: [WithDisabledState], host: {
31
31
  '[class.is-active]': 'checked',
32
- }, template: "<label class=\"odx-switch__label\">\n <input\n odxControl\n class=\"odx-switch__input\"\n [attr.aria-checked]=\"ariaChecked\"\n [attr.aria-invalid]=\"hasError || null\"\n [attr.aria-readonly]=\"isReadonly || null\"\n [attr.aria-required]=\"isRequired || null\"\n [attr.tabindex]=\"tabindex || null\"\n [checked]=\"checked\"\n [disabled]=\"isDisabled || isReadonly\"\n [name]=\"name\"\n [readonly]=\"isReadonly\"\n [value]=\"value\"\n type=\"checkbox\"\n (blur)=\"onTouched()\"\n (change)=\"onChanged($event)\"\n />\n <div class=\"odx-switch__track\">\n <div class=\"odx-switch__thumb\">\n <odx-icon class=\"odx-switch__icon\" iconSet=\"core\" [name]=\"checked ? 'check' : 'close'\" />\n </div>\n </div>\n <div class=\"odx-switch__content\">\n <ng-content />\n @if (isRequired) {\n <span class=\"odx-switch__required\">*</span>\n }\n </div>\n</label>\n" }]
32
+ }, template: "<label class=\"odx-switch__label\">\n <input\n odxControl\n class=\"odx-switch__input\"\n [attr.aria-checked]=\"ariaChecked\"\n [attr.aria-invalid]=\"hasError || null\"\n [attr.aria-readonly]=\"isReadonly || null\"\n [attr.aria-required]=\"isRequired || null\"\n [attr.tabindex]=\"tabindex || null\"\n [checked]=\"checked\"\n [disabled]=\"isDisabled || isReadonly\"\n [name]=\"name\"\n [readonly]=\"isReadonly\"\n [value]=\"value\"\n type=\"checkbox\"\n (blur)=\"onTouched()\"\n (change)=\"onChanged($event)\"\n />\n <div class=\"odx-switch__thumb-container\">\n <div class=\"odx-switch__track\"></div>\n <div class=\"odx-switch__thumb\">\n <odx-icon class=\"odx-switch__icon\" iconSet=\"core\" [name]=\"checked ? 'check' : 'close'\" />\n </div>\n </div>\n <div class=\"odx-switch__content\">\n <ng-content />\n @if (isRequired) {\n <span class=\"odx-switch__required\">*</span>\n }\n </div>\n</label>\n" }]
33
33
  }] });
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpdGNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL3N3aXRjaC9zcmMvbGliL3N3aXRjaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9zd2l0Y2gvc3JjL2xpYi9zd2l0Y2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7QUFFckQ7Ozs7Ozs7OztHQVNHO0FBZUksSUFBTSxlQUFlLEdBQXJCLE1BQU0sZUFBZ0IsU0FBUSxlQUFlOytHQUF2QyxlQUFlO21HQUFmLGVBQWUsaUhBTmYsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyx3R0N6QjNDLGk2QkE4QkEsNENETlksZ0JBQWdCLG1GQUFFLGFBQWE7O0FBTzlCLGVBQWU7SUFkM0IsWUFBWSxDQUFDLFFBQVEsQ0FBQztHQWNWLGVBQWUsQ0FBMkI7OzRGQUExQyxlQUFlO2tCQWIzQixTQUFTO2lDQUNJLElBQUksWUFDTixZQUFZLG1CQUVMLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksV0FDNUIsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsYUFDL0IsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxrQkFDekIsQ0FBQyxpQkFBaUIsQ0FBQyxRQUM3Qjt3QkFDSixtQkFBbUIsRUFBRSxTQUFTO3FCQUMvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZWFkb25seUNvbnRyb2xsZXIsIFdpdGhEaXNhYmxlZFN0YXRlIH0gZnJvbSAnQG9keC9hbmd1bGFyJztcbmltcG9ydCB7IENoZWNrQm94Q29udHJvbCB9IGZyb20gJ0BvZHgvYW5ndWxhci9jZGsvY2hlY2tib3gtY29udHJvbCc7XG5pbXBvcnQgeyBDb250cm9sRGlyZWN0aXZlIH0gZnJvbSAnQG9keC9hbmd1bGFyL2Nkay9jdXN0b20tZm9ybS1jb250cm9sJztcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9pY29uJztcbmltcG9ydCB7IENTU0NvbXBvbmVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci9pbnRlcm5hbCc7XG5cbi8qKlxuICogU3dpdGNoQ29tcG9uZW50IHByb3ZpZGVzIGEgY3VzdG9tIHN3aXRjaCAodG9nZ2xlKSBjb250cm9sIHRoYXQgY2FuIGJlIHVzZWQgd2l0aGluIGZvcm1zXG4gKiBvciBzdGFuZGFsb25lIGZvciB0b2dnbGluZyBhIHNwZWNpZmljIGJpbmFyeSBzdGF0ZS4gSXQgc3VwcG9ydHMgcmVhZG9ubHkgYW5kIGRpc2FibGVkIHN0YXRlcyxcbiAqIGFuZCBpbnRlZ3JhdGVzIHNlYW1sZXNzbHkgd2l0aCBBbmd1bGFyJ3MgZm9ybSBjb250cm9scyBmb3IgZGF0YSBiaW5kaW5nIGFuZCBzdGF0ZSBtYW5hZ2VtZW50LlxuICogSGFzIGhvc3QgZGlyZWN0aXZlcyBmb3IgZGlzYWJsZWQgc3RhdGUgaGFuZGxpbmcuXG4gKiBFeHRlbmRzIENoZWNrQm94Q29udHJvbCB0byBwcm92aWRlIGFkZGl0aW9uYWwgYmVoYXZpb3IuXG4gKlxuICogQHNlZSB7V2l0aERpc2FibGVkU3RhdGV9XG4gKiBAc2VlIHtDaGVja0JveENvbnRyb2x9XG4gKi9cbkBDU1NDb21wb25lbnQoJ3N3aXRjaCcpXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdvZHgtc3dpdGNoJyxcbiAgdGVtcGxhdGVVcmw6ICdzd2l0Y2guY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW0NvbnRyb2xEaXJlY3RpdmUsIEljb25Db21wb25lbnRdLFxuICBwcm92aWRlcnM6IFtSZWFkb25seUNvbnRyb2xsZXIuY29ubmVjdCgpXSxcbiAgaG9zdERpcmVjdGl2ZXM6IFtXaXRoRGlzYWJsZWRTdGF0ZV0sXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmlzLWFjdGl2ZV0nOiAnY2hlY2tlZCcsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIFN3aXRjaENvbXBvbmVudCBleHRlbmRzIENoZWNrQm94Q29udHJvbCB7fVxuIiwiPGxhYmVsIGNsYXNzPVwib2R4LXN3aXRjaF9fbGFiZWxcIj5cbiAgPGlucHV0XG4gICAgb2R4Q29udHJvbFxuICAgIGNsYXNzPVwib2R4LXN3aXRjaF9faW5wdXRcIlxuICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJhcmlhQ2hlY2tlZFwiXG4gICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImhhc0Vycm9yIHx8IG51bGxcIlxuICAgIFthdHRyLmFyaWEtcmVhZG9ubHldPVwiaXNSZWFkb25seSB8fCBudWxsXCJcbiAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImlzUmVxdWlyZWQgfHwgbnVsbFwiXG4gICAgW2F0dHIudGFiaW5kZXhdPVwidGFiaW5kZXggfHwgbnVsbFwiXG4gICAgW2NoZWNrZWRdPVwiY2hlY2tlZFwiXG4gICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQgfHwgaXNSZWFkb25seVwiXG4gICAgW25hbWVdPVwibmFtZVwiXG4gICAgW3JlYWRvbmx5XT1cImlzUmVhZG9ubHlcIlxuICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAoYmx1cik9XCJvblRvdWNoZWQoKVwiXG4gICAgKGNoYW5nZSk9XCJvbkNoYW5nZWQoJGV2ZW50KVwiXG4gIC8+XG4gIDxkaXYgY2xhc3M9XCJvZHgtc3dpdGNoX190cmFja1wiPlxuICAgIDxkaXYgY2xhc3M9XCJvZHgtc3dpdGNoX190aHVtYlwiPlxuICAgICAgPG9keC1pY29uIGNsYXNzPVwib2R4LXN3aXRjaF9faWNvblwiIGljb25TZXQ9XCJjb3JlXCIgW25hbWVdPVwiY2hlY2tlZCA/ICdjaGVjaycgOiAnY2xvc2UnXCIgLz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJvZHgtc3dpdGNoX19jb250ZW50XCI+XG4gICAgPG5nLWNvbnRlbnQgLz5cbiAgICBAaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgIDxzcGFuIGNsYXNzPVwib2R4LXN3aXRjaF9fcmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgIH1cbiAgPC9kaXY+XG48L2xhYmVsPlxuIl19
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpdGNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL3N3aXRjaC9zcmMvbGliL3N3aXRjaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9zd2l0Y2gvc3JjL2xpYi9zd2l0Y2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7QUFFckQ7Ozs7Ozs7OztHQVNHO0FBZUksSUFBTSxlQUFlLEdBQXJCLE1BQU0sZUFBZ0IsU0FBUSxlQUFlOytHQUF2QyxlQUFlO21HQUFmLGVBQWUsaUhBTmYsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyx3R0N6QjNDLHc5QkErQkEsNENEUFksZ0JBQWdCLG1GQUFFLGFBQWE7O0FBTzlCLGVBQWU7SUFkM0IsWUFBWSxDQUFDLFFBQVEsQ0FBQztHQWNWLGVBQWUsQ0FBMkI7OzRGQUExQyxlQUFlO2tCQWIzQixTQUFTO2lDQUNJLElBQUksWUFDTixZQUFZLG1CQUVMLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksV0FDNUIsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsYUFDL0IsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxrQkFDekIsQ0FBQyxpQkFBaUIsQ0FBQyxRQUM3Qjt3QkFDSixtQkFBbUIsRUFBRSxTQUFTO3FCQUMvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZWFkb25seUNvbnRyb2xsZXIsIFdpdGhEaXNhYmxlZFN0YXRlIH0gZnJvbSAnQG9keC9hbmd1bGFyJztcbmltcG9ydCB7IENoZWNrQm94Q29udHJvbCB9IGZyb20gJ0BvZHgvYW5ndWxhci9jZGsvY2hlY2tib3gtY29udHJvbCc7XG5pbXBvcnQgeyBDb250cm9sRGlyZWN0aXZlIH0gZnJvbSAnQG9keC9hbmd1bGFyL2Nkay9jdXN0b20tZm9ybS1jb250cm9sJztcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9pY29uJztcbmltcG9ydCB7IENTU0NvbXBvbmVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci9pbnRlcm5hbCc7XG5cbi8qKlxuICogU3dpdGNoQ29tcG9uZW50IHByb3ZpZGVzIGEgY3VzdG9tIHN3aXRjaCAodG9nZ2xlKSBjb250cm9sIHRoYXQgY2FuIGJlIHVzZWQgd2l0aGluIGZvcm1zXG4gKiBvciBzdGFuZGFsb25lIGZvciB0b2dnbGluZyBhIHNwZWNpZmljIGJpbmFyeSBzdGF0ZS4gSXQgc3VwcG9ydHMgcmVhZG9ubHkgYW5kIGRpc2FibGVkIHN0YXRlcyxcbiAqIGFuZCBpbnRlZ3JhdGVzIHNlYW1sZXNzbHkgd2l0aCBBbmd1bGFyJ3MgZm9ybSBjb250cm9scyBmb3IgZGF0YSBiaW5kaW5nIGFuZCBzdGF0ZSBtYW5hZ2VtZW50LlxuICogSGFzIGhvc3QgZGlyZWN0aXZlcyBmb3IgZGlzYWJsZWQgc3RhdGUgaGFuZGxpbmcuXG4gKiBFeHRlbmRzIENoZWNrQm94Q29udHJvbCB0byBwcm92aWRlIGFkZGl0aW9uYWwgYmVoYXZpb3IuXG4gKlxuICogQHNlZSB7V2l0aERpc2FibGVkU3RhdGV9XG4gKiBAc2VlIHtDaGVja0JveENvbnRyb2x9XG4gKi9cbkBDU1NDb21wb25lbnQoJ3N3aXRjaCcpXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdvZHgtc3dpdGNoJyxcbiAgdGVtcGxhdGVVcmw6ICdzd2l0Y2guY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW0NvbnRyb2xEaXJlY3RpdmUsIEljb25Db21wb25lbnRdLFxuICBwcm92aWRlcnM6IFtSZWFkb25seUNvbnRyb2xsZXIuY29ubmVjdCgpXSxcbiAgaG9zdERpcmVjdGl2ZXM6IFtXaXRoRGlzYWJsZWRTdGF0ZV0sXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmlzLWFjdGl2ZV0nOiAnY2hlY2tlZCcsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIFN3aXRjaENvbXBvbmVudCBleHRlbmRzIENoZWNrQm94Q29udHJvbCB7fVxuIiwiPGxhYmVsIGNsYXNzPVwib2R4LXN3aXRjaF9fbGFiZWxcIj5cbiAgPGlucHV0XG4gICAgb2R4Q29udHJvbFxuICAgIGNsYXNzPVwib2R4LXN3aXRjaF9faW5wdXRcIlxuICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJhcmlhQ2hlY2tlZFwiXG4gICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImhhc0Vycm9yIHx8IG51bGxcIlxuICAgIFthdHRyLmFyaWEtcmVhZG9ubHldPVwiaXNSZWFkb25seSB8fCBudWxsXCJcbiAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImlzUmVxdWlyZWQgfHwgbnVsbFwiXG4gICAgW2F0dHIudGFiaW5kZXhdPVwidGFiaW5kZXggfHwgbnVsbFwiXG4gICAgW2NoZWNrZWRdPVwiY2hlY2tlZFwiXG4gICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQgfHwgaXNSZWFkb25seVwiXG4gICAgW25hbWVdPVwibmFtZVwiXG4gICAgW3JlYWRvbmx5XT1cImlzUmVhZG9ubHlcIlxuICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAoYmx1cik9XCJvblRvdWNoZWQoKVwiXG4gICAgKGNoYW5nZSk9XCJvbkNoYW5nZWQoJGV2ZW50KVwiXG4gIC8+XG4gIDxkaXYgY2xhc3M9XCJvZHgtc3dpdGNoX190aHVtYi1jb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwib2R4LXN3aXRjaF9fdHJhY2tcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwib2R4LXN3aXRjaF9fdGh1bWJcIj5cbiAgICAgIDxvZHgtaWNvbiBjbGFzcz1cIm9keC1zd2l0Y2hfX2ljb25cIiBpY29uU2V0PVwiY29yZVwiIFtuYW1lXT1cImNoZWNrZWQgPyAnY2hlY2snIDogJ2Nsb3NlJ1wiIC8+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwib2R4LXN3aXRjaF9fY29udGVudFwiPlxuICAgIDxuZy1jb250ZW50IC8+XG4gICAgQGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICA8c3BhbiBjbGFzcz1cIm9keC1zd2l0Y2hfX3JlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICB9XG4gIDwvZGl2PlxuPC9sYWJlbD5cbiJdfQ==
@@ -73,9 +73,9 @@ let TabBarComponent = class TabBarComponent {
73
73
  selectedIndex: this.selectedIndex(),
74
74
  selectedTab: this.activeItem(),
75
75
  }));
76
- merge(this.keyManager.change.pipe(tap((index) => this.selectedIndex.set(index ?? -1))), fromElementResize$(this.element.nativeElement, 600).pipe(tap(() => this.scrollableService.scrollActiveItemIntoView(this.activeItem()?.element.nativeElement ?? null))), toObservable(tabState).pipe(skip(1), distinctUntilChanged((a, b) => a.selectedIndex === b.selectedIndex), filter(({ selectedTab }) => !selectedTab?.disabled), tap((state) => {
76
+ merge(this.keyManager.change.pipe(tap((index) => this.selectedIndex.set(index ?? -1))), fromElementResize$(this.element.nativeElement, 600).pipe(tap(() => this.scrollableService.scrollActiveItemIntoHorizontalView(this.activeItem()?.element.nativeElement ?? null))), toObservable(tabState).pipe(skip(1), distinctUntilChanged((a, b) => a.selectedIndex === b.selectedIndex), filter(({ selectedTab }) => !selectedTab?.disabled), tap((state) => {
77
77
  this.selectedTabChanged.emit(state);
78
- this.scrollableService.scrollActiveItemIntoView(state.selectedTab?.element.nativeElement ?? null);
78
+ this.scrollableService.scrollActiveItemIntoHorizontalView(state.selectedTab?.element.nativeElement ?? null);
79
79
  })))
80
80
  .pipe(this.takeUntilDestroyed())
81
81
  .subscribe();
@@ -118,7 +118,7 @@ let TabBarComponent = class TabBarComponent {
118
118
  return;
119
119
  if (this.scrollableService.visibleItems().includes(activeItem))
120
120
  return;
121
- this.scrollableService.scrollActiveItemIntoView(activeItem);
121
+ this.scrollableService.scrollActiveItemIntoHorizontalView(activeItem);
122
122
  }
123
123
  scrollTabs(direction = 1) {
124
124
  this.scrollableService.scroll(direction);
@@ -142,4 +142,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
142
142
  '(focus)': 'onFocused()',
143
143
  }, template: "<button #tabAction class=\"odx-tab-bar__action odx-tab-bar__action--prev\" [class.is-active]=\"!!prevTab()\" (click)=\"scrollTabs(-1)\" tabindex=\"-1\">\n <odx-icon class=\"tab-bar-action-icon\" name=\"chevron-left\" iconSet=\"core\" />\n</button>\n<div class=\"odx-tab-bar__inner\" #scrollContainer tabindex=\"-1\">\n <div class=\"odx-tab-bar__panel\" role=\"tablist\" #tabBarPanel>\n <ng-content />\n <div class=\"odx-tab-bar__indicator\" [odxActiveIndicator]=\"activeItem()?.element?.nativeElement\" odxActiveIndicatorPosition=\"start\"></div>\n </div>\n</div>\n<button #tabAction class=\"odx-tab-bar__action odx-tab-bar__action--next\" [class.is-active]=\"!!nextTab()\" (click)=\"scrollTabs()\" tabindex=\"-1\">\n <odx-icon class=\"tab-bar-action-icon\" name=\"chevron-right\" iconSet=\"core\" />\n</button>\n" }]
144
144
  }], ctorParameters: () => [] });
145
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy90YWItYmFyL3NyYy9saWIvdGFiLWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy90YWItYmFyL3NyYy9saWIvdGFiLWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixlQUFlLEVBQ2YsTUFBTSxFQUVOLFVBQVUsRUFDVixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDN0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxN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RUFBRSxtQkFBbUI7d0JBQ2hDLFNBQVMsRUFBRSxhQUFhO3FCQUN6QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBjb250ZW50Q2hpbGRyZW4sXG4gIGVmZmVjdCxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgaW5qZWN0LFxuICBJbmplY3RvcixcbiAgbW9kZWwsXG4gIG91dHB1dCxcbiAgdmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b09ic2VydmFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBBY3RpdmVJbmRpY2F0b3JEaXJlY3RpdmUgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY2RrL2FjdGl2ZS1pbmRpY2F0b3InO1xuaW1wb3J0IHsgU2Nyb2xsYWJsZVNlcnZpY2UgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY2RrL3Njcm9sbGFibGUnO1xuaW1wb3J0IHsgSWNvbkNvbXBvbmVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci9jb21wb25lbnRzL2ljb24nO1xuaW1wb3J0IHsgQ1NTQ29tcG9uZW50IH0gZnJvbSAnQG9keC9hbmd1bGFyL2ludGVybmFsJztcbmltcG9ydCB7IGZyb21FbGVtZW50UmVzaXplJCB9IGZyb20gJ0BvZHgvYW5ndWxhci9yeGpzJztcbmltcG9ydCB7IGluamVjdEVsZW1lbnQsIHVudGlsRGVzdHJveWVkIH0gZnJvbSAnQG9keC9hbmd1bGFyL3V0aWxzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1lcmdlLCBza2lwLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRhYkJhckl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgVGFiQ2hhbmdlRXZlbnQgfSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQgeyBUQUJfQkFSIH0gZnJvbSAnLi90YWItYmFyLmNvbmZpZyc7XG5cbi8qKlxuICogYFRhYkJhckNvbXBvbmVudGAgY3JlYXRlcyBhIGR5bmFtaWMgYW5kIGFjY2Vzc2libGUgdGFiIGJhciBpbnRlcmZhY2UsXG4gKiBmYWNpbGl0YXRpbmcgdGhlIG1hbmFnZW1lbnQgYW5kIGludGVyYWN0aW9uIHdpdGggYSBjb2xsZWN0aW9uIG9mIHRhYnMuXG4gKiBJdCBzdXBwb3J0cyBrZXlib2FyZCBuYXZpZ2F0aW9uLCBkeW5hbWljIHRhYiBtYW5hZ2VtZW50LCBhbmQgcmVzcG9uc2l2ZSBvdmVyZmxvdyBhY3Rpb25zLlxuICpcbiAqIFRoZSBjb21wb25lbnQgaW50ZWdyYXRlcyB3aXRoIEFuZ3VsYXIncyBDb250ZW50Q2hpbGRyZW4gdG8gZHluYW1pY2FsbHkgbWFuYWdlIHRoZSB0YWJzIGJhc2VkIG9uIHRoZWlyIGNvbnRlbnQuXG4gKiBJdCB1c2VzIEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyIGZyb20gQW5ndWxhciBDREsgZm9yIG1hbmFnaW5nIGZvY3VzIGFuZCBrZXlib2FyZCBuYXZpZ2F0aW9uLFxuICogbWFraW5nIGl0IGFjY2Vzc2libGUgYW5kIHVzZXItZnJpZW5kbHkuIEFkZGl0aW9uYWxseSwgaXQgaGFuZGxlcyBvdmVyZmxvdyB3aXRoIG5hdmlnYXRpb25hbCBhcnJvd3MsXG4gKiBhbGxvd2luZyBmb3IgYSBzbW9vdGggdXNlciBleHBlcmllbmNlIGV2ZW4gd2l0aCBhIGxhcmdlIG51bWJlciBvZiB0YWJzLlxuICovXG5AQ1NTQ29tcG9uZW50KCd0YWItYmFyJylcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29keC10YWItYmFyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSWNvbkNvbXBvbmVudCwgQWN0aXZlSW5kaWNhdG9yRGlyZWN0aXZlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYi1iYXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBUQUJfQkFSLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUYWJCYXJDb21wb25lbnQpIH0sIFNjcm9sbGFibGVTZXJ2aWNlXSxcbiAgaG9zdDoge1xuICAgIHJvbGU6ICd0YWJwYW5lbCcsXG4gICAgdGFiaW5kZXg6ICcwJyxcbiAgICAnW2NsYXNzLm9keC10YWItYmFyLS1vdmVyZmxvdy1sZWZ0XSc6ICchIXByZXZUYWIoKScsXG4gICAgJ1tjbGFzcy5vZHgtdGFiLWJhci0tb3ZlcmZsb3ctcmlnaHRdJzogJyEhbmV4dFRhYigpJyxcbiAgICAnKGtleWRvd24pJzogJ29uS2V5ZG93bigkZXZlbnQpJyxcbiAgICAnKGZvY3VzKSc6ICdvbkZvY3VzZWQoKScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIFRhYkJhckNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFrZVVudGlsRGVzdHJveWVkID0gdW50aWxEZXN0cm95ZWQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JvbGxhYmxlU2VydmljZSA9IGluamVjdChTY3JvbGxhYmxlU2VydmljZSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHRUYWIgPSB0aGlzLnNjcm9sbGFibGVTZXJ2aWNlLm5leHRJdGVtO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJldlRhYiA9IHRoaXMuc2Nyb2xsYWJsZVNlcnZpY2UucHJldkl0ZW07XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRhYnMgPSBjb250ZW50Q2hpbGRyZW48VGFiQmFySXRlbUNvbXBvbmVudD4oVGFiQmFySXRlbUNvbXBvbmVudCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBhY3RpdmVJdGVtID0gY29tcHV0ZWQoKCkgPT4gdGhpcy50YWJzKCkuYXQodGhpcy5zZWxlY3RlZEluZGV4KCkpID8/IG51bGwpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkga2V5TWFuYWdlcjogQWN0aXZlRGVzY2VuZGFudEtleU1hbmFnZXI8VGFiQmFySXRlbUNvbXBvbmVudD4gPSBuZXcgQWN0aXZlRGVzY2VuZGFudEtleU1hbmFnZXIodGhpcy50YWJzLCBpbmplY3QoSW5qZWN0b3IpKVxuICAgIC53aXRoV3JhcCgpXG4gICAgLndpdGhIb21lQW5kRW5kKClcbiAgICAud2l0aEhvcml6b250YWxPcmllbnRhdGlvbignbHRyJylcbiAgICAud2l0aFZlcnRpY2FsT3JpZW50YXRpb24oZmFsc2UpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzY3JvbGxDb250YWluZXJFbGVtZW50ID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+Pignc2Nyb2xsQ29udGFpbmVyJyk7XG4gIHB1YmxpYyByZWFkb25seSBlbGVtZW50ID0gaW5qZWN0RWxlbWVudCgpO1xuXG4gIC8qKlxuICAgKiBJbmRleCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRhYi4gVXNlIHRoaXMgcHJvcGVydHkgdG8gcHJvZ3JhbW1hdGljYWxseVxuICAgKiBjaGFuZ2UgdGhlIGFjdGl2ZSB0YWIuIEl0IHJlc3BvbmRzIHRvIGNoYW5nZXMgYnkgdXBkYXRpbmcgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgY29ycmVzcG9uZGluZ1xuICAgKiB0YWIgaXRlbSBhbmQgYWRqdXN0aW5nIHRoZSB2aWV3IGlmIG5lY2Vzc2FyeS5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGV4YW1wbGVcbiAgICogUHJvZ3JhbW1hdGljYWxseSBzZWxlY3QgdGhlIHNlY29uZCB0YWIgKGluZGV4IHN0YXJ0cyBmcm9tIDApOlxuICAgKiBgYGBodG1sXG4gICAqIDxvZHgtdGFiLWJhciBbc2VsZWN0ZWRJbmRleF09XCIxXCI+PC9vZHgtdGFiLWJhcj5cbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0ZWRJbmRleCA9IG1vZGVsPG51bWJlcj4oMCk7XG5cbiAgLyoqXG4gICAqIEFuIEV2ZW50RW1pdHRlciB0aGF0IGVtaXRzIHdoZW5ldmVyIGEgbmV3IHRhYiBpcyBzZWxlY3RlZC4gSXQgcHJvdmlkZXMgdGhlIGBUYWJDaGFuZ2VFdmVudGBcbiAgICogd2hpY2ggY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBuZXdseSBzZWxlY3RlZCB0YWIgYW5kIHRoZSBpbnN0YW5jZSBvZiB0aGUgY29ycmVzcG9uZGluZ1xuICAgKiBgVGFiQmFySXRlbUNvbXBvbmVudGAuIFN1YnNjcmliZSB0byB0aGlzIG91dHB1dCB0byBwZXJmb3JtIGFjdGlvbnMgd2hlbiB0aGUgYWN0aXZlIHRhYiBjaGFuZ2VzLlxuICAgKlxuICAgKiBAZW1pdHMge1RhYkNoYW5nZUV2ZW50fVxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBodG1sXG4gICAqIDxvZHgtdGFiLWJhciAoc2VsZWN0ZWRUYWJDaGFuZ2VkKT1cIm9uVGFiQ2hhbmdlKCRldmVudClcIj48L29keC10YWItYmFyPlxuICAgKiBgYGBcbiAgICpcbiAgICogYGBgdHNcbiAgICogb25UYWJDaGFuZ2UoZXZlbnQ6IFRhYkNoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAqICAgY29uc29sZS5sb2coYE5ldyBhY3RpdmUgdGFiIGluZGV4OiAke2V2ZW50LnNlbGVjdGVkSW5kZXh9YCk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0ZWRUYWJDaGFuZ2VkID0gb3V0cHV0PFRhYkNoYW5nZUV2ZW50PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGNvbnN0IHRhYlN0YXRlID0gY29tcHV0ZWQoKCkgPT4gKHtcbiAgICAgIHNlbGVjdGVkSW5kZXg6IHRoaXMuc2VsZWN0ZWRJbmRleCgpLFxuICAgICAgc2VsZWN0ZWRUYWI6IHRoaXMuYWN0aXZlSXRlbSgpLFxuICAgIH0pKTtcblxuICAgIG1lcmdlKFxuICAgICAgdGhpcy5rZXlNYW5hZ2VyLmNoYW5nZS5waXBlKHRhcCgoaW5kZXgpID0+IHRoaXMuc2VsZWN0ZWRJbmRleC5zZXQoaW5kZXggPz8gLTEpKSksXG4gICAgICBmcm9tRWxlbWVudFJlc2l6ZSQodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIDYwMCkucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuc2Nyb2xsYWJsZVNlcnZpY2Uuc2Nyb2xsQWN0aXZlSXRlbUludG9WaWV3KHRoaXMuYWN0aXZlSXRlbSgpPy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbCkpLFxuICAgICAgKSxcbiAgICAgIHRvT2JzZXJ2YWJsZSh0YWJTdGF0ZSkucGlwZShcbiAgICAgICAgc2tpcCgxKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGEuc2VsZWN0ZWRJbmRleCA9PT0gYi5zZWxlY3RlZEluZGV4KSxcbiAgICAgICAgZmlsdGVyKCh7IHNlbGVjdGVkVGFiIH0pID0+ICFzZWxlY3RlZFRhYj8uZGlzYWJsZWQpLFxuICAgICAgICB0YXAoKHN0YXRlKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYkNoYW5nZWQuZW1pdChzdGF0ZSk7XG4gICAgICAgICAgdGhpcy5zY3JvbGxhYmxlU2VydmljZS5zY3JvbGxBY3RpdmVJdGVtSW50b1ZpZXcoc3RhdGUuc2VsZWN0ZWRUYWI/LmVsZW1lbnQubmF0aXZlRWxlbWVudCA/PyBudWxsKTtcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgIClcbiAgICAgIC5waXBlKHRoaXMudGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMua2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKHRoaXMuc2VsZWN0ZWRJbmRleCgpKTtcbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXG4gICAgKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB0aGlzLnNjcm9sbGFibGVTZXJ2aWNlLm9ic2VydmUodGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50KCksIHRoaXMudGFicygpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZXMgdGhlIHNwZWNpZmllZCB0YWIgaXRlbSwgbWFraW5nIGl0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGFiLlxuICAgKiBJZiB0aGUgaXRlbSBpcyBhbHJlYWR5IGFjdGl2ZSwgbm8gYWN0aW9uIGlzIHRha2VuLlxuICAgKlxuICAgKiBAcGFyYW0ge1RhYkJhckl0ZW1Db21wb25lbnQgfCBudWxsfSBpdGVtIC0gVGhlIHRhYiBpdGVtIHRvIGFjdGl2YXRlLlxuICAgKi9cbiAgcHVibGljIGFjdGl2YXRlSXRlbShpdGVtPzogVGFiQmFySXRlbUNvbXBvbmVudCB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoaXRlbSA9PT0gdGhpcy5rZXlNYW5hZ2VyPy5hY3RpdmVJdGVtKSByZXR1cm47XG4gICAgY29uc3Qgc2VsZWN0ZWRJbmRleCA9IGl0ZW0gPyB0aGlzLnRhYnMoKS5pbmRleE9mKGl0ZW0pIDogLTE7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4LnNldChzZWxlY3RlZEluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSBzcGVjaWZpZWQgdGFiIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIHRoZSB0YWIgYmFyLlxuICAgKiBJZiB0aGUgaXRlbSBpcyBjdXJyZW50bHkgYWN0aXZlLCB0aGUgcHJldmlvdXMgdGFiIGlzIGFjdGl2YXRlZC5cbiAgICpcbiAgICogQHBhcmFtIHtUYWJCYXJJdGVtQ29tcG9uZW50fSBpdGVtIC0gVGhlIHRhYiBpdGVtIHRvIHJlbW92ZS5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVJdGVtKGl0ZW06IFRhYkJhckl0ZW1Db21wb25lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5rZXlNYW5hZ2VyPy5hY3RpdmVJdGVtICE9PSBpdGVtKSByZXR1cm47XG4gICAgdGhpcy5rZXlNYW5hZ2VyPy5zZXRQcmV2aW91c0l0ZW1BY3RpdmUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmtleU1hbmFnZXI/Lm9uS2V5ZG93bihldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Gb2N1c2VkKCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZUl0ZW0gPSB0aGlzLmFjdGl2ZUl0ZW0oKT8uZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghYWN0aXZlSXRlbSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnNjcm9sbGFibGVTZXJ2aWNlLnZpc2libGVJdGVtcygpLmluY2x1ZGVzKGFjdGl2ZUl0ZW0pKSByZXR1cm47XG4gICAgdGhpcy5zY3JvbGxhYmxlU2VydmljZS5zY3JvbGxBY3RpdmVJdGVtSW50b1ZpZXcoYWN0aXZlSXRlbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVGFicyhkaXJlY3Rpb246IDEgfCAtMSA9IDEpOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbGFibGVTZXJ2aWNlLnNjcm9sbChkaXJlY3Rpb24pO1xuICB9XG59XG4iLCI8YnV0dG9uICN0YWJBY3Rpb24gY2xhc3M9XCJvZHgtdGFiLWJhcl9fYWN0aW9uIG9keC10YWItYmFyX19hY3Rpb24tLXByZXZcIiBbY2xhc3MuaXMtYWN0aXZlXT1cIiEhcHJldlRhYigpXCIgKGNsaWNrKT1cInNjcm9sbFRhYnMoLTEpXCIgdGFiaW5kZXg9XCItMVwiPlxuICA8b2R4LWljb24gY2xhc3M9XCJ0YWItYmFyLWFjdGlvbi1pY29uXCIgbmFtZT1cImNoZXZyb24tbGVmdFwiIGljb25TZXQ9XCJjb3JlXCIgLz5cbjwvYnV0dG9uPlxuPGRpdiBjbGFzcz1cIm9keC10YWItYmFyX19pbm5lclwiICNzY3JvbGxDb250YWluZXIgdGFiaW5kZXg9XCItMVwiPlxuICA8ZGl2IGNsYXNzPVwib2R4LXRhYi1iYXJfX3BhbmVsXCIgcm9sZT1cInRhYmxpc3RcIiAjdGFiQmFyUGFuZWw+XG4gICAgPG5nLWNvbnRlbnQgLz5cbiAgICA8ZGl2IGNsYXNzPVwib2R4LXRhYi1iYXJfX2luZGljYXRvclwiIFtvZHhBY3RpdmVJbmRpY2F0b3JdPVwiYWN0aXZlSXRlbSgpPy5lbGVtZW50Py5uYXRpdmVFbGVtZW50XCIgb2R4QWN0aXZlSW5kaWNhdG9yUG9zaXRpb249XCJzdGFydFwiPjwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuPGJ1dHRvbiAjdGFiQWN0aW9uIGNsYXNzPVwib2R4LXRhYi1iYXJfX2FjdGlvbiBvZHgtdGFiLWJhcl9fYWN0aW9uLS1uZXh0XCIgW2NsYXNzLmlzLWFjdGl2ZV09XCIhIW5leHRUYWIoKVwiIChjbGljayk9XCJzY3JvbGxUYWJzKClcIiB0YWJpbmRleD1cIi0xXCI+XG4gIDxvZHgtaWNvbiBjbGFzcz1cInRhYi1iYXItYWN0aW9uLWljb25cIiBuYW1lPVwiY2hldnJvbi1yaWdodFwiIGljb25TZXQ9XCJjb3JlXCIgLz5cbjwvYnV0dG9uPlxuIl19
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy90YWItYmFyL3NyYy9saWIvdGFiLWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy90YWItYmFyL3NyYy9saWIvdGFiLWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixlQUFlLEVBQ2YsTUFBTSxFQUVOLFVBQVUsRUFDVixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDN0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxN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RUFBRSxtQkFBbUI7d0JBQ2hDLFNBQVMsRUFBRSxhQUFhO3FCQUN6QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBjb250ZW50Q2hpbGRyZW4sXG4gIGVmZmVjdCxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgaW5qZWN0LFxuICBJbmplY3RvcixcbiAgbW9kZWwsXG4gIG91dHB1dCxcbiAgdmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b09ic2VydmFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBBY3RpdmVJbmRpY2F0b3JEaXJlY3RpdmUgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY2RrL2FjdGl2ZS1pbmRpY2F0b3InO1xuaW1wb3J0IHsgU2Nyb2xsYWJsZVNlcnZpY2UgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY2RrL3Njcm9sbGFibGUnO1xuaW1wb3J0IHsgSWNvbkNvbXBvbmVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci9jb21wb25lbnRzL2ljb24nO1xuaW1wb3J0IHsgQ1NTQ29tcG9uZW50IH0gZnJvbSAnQG9keC9hbmd1bGFyL2ludGVybmFsJztcbmltcG9ydCB7IGZyb21FbGVtZW50UmVzaXplJCB9IGZyb20gJ0BvZHgvYW5ndWxhci9yeGpzJztcbmltcG9ydCB7IGluamVjdEVsZW1lbnQsIHVudGlsRGVzdHJveWVkIH0gZnJvbSAnQG9keC9hbmd1bGFyL3V0aWxzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1lcmdlLCBza2lwLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRhYkJhckl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgVGFiQ2hhbmdlRXZlbnQgfSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQgeyBUQUJfQkFSIH0gZnJvbSAnLi90YWItYmFyLmNvbmZpZyc7XG5cbi8qKlxuICogYFRhYkJhckNvbXBvbmVudGAgY3JlYXRlcyBhIGR5bmFtaWMgYW5kIGFjY2Vzc2libGUgdGFiIGJhciBpbnRlcmZhY2UsXG4gKiBmYWNpbGl0YXRpbmcgdGhlIG1hbmFnZW1lbnQgYW5kIGludGVyYWN0aW9uIHdpdGggYSBjb2xsZWN0aW9uIG9mIHRhYnMuXG4gKiBJdCBzdXBwb3J0cyBrZXlib2FyZCBuYXZpZ2F0aW9uLCBkeW5hbWljIHRhYiBtYW5hZ2VtZW50LCBhbmQgcmVzcG9uc2l2ZSBvdmVyZmxvdyBhY3Rpb25zLlxuICpcbiAqIFRoZSBjb21wb25lbnQgaW50ZWdyYXRlcyB3aXRoIEFuZ3VsYXIncyBDb250ZW50Q2hpbGRyZW4gdG8gZHluYW1pY2FsbHkgbWFuYWdlIHRoZSB0YWJzIGJhc2VkIG9uIHRoZWlyIGNvbnRlbnQuXG4gKiBJdCB1c2VzIEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyIGZyb20gQW5ndWxhciBDREsgZm9yIG1hbmFnaW5nIGZvY3VzIGFuZCBrZXlib2FyZCBuYXZpZ2F0aW9uLFxuICogbWFraW5nIGl0IGFjY2Vzc2libGUgYW5kIHVzZXItZnJpZW5kbHkuIEFkZGl0aW9uYWxseSwgaXQgaGFuZGxlcyBvdmVyZmxvdyB3aXRoIG5hdmlnYXRpb25hbCBhcnJvd3MsXG4gKiBhbGxvd2luZyBmb3IgYSBzbW9vdGggdXNlciBleHBlcmllbmNlIGV2ZW4gd2l0aCBhIGxhcmdlIG51bWJlciBvZiB0YWJzLlxuICovXG5AQ1NTQ29tcG9uZW50KCd0YWItYmFyJylcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29keC10YWItYmFyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSWNvbkNvbXBvbmVudCwgQWN0aXZlSW5kaWNhdG9yRGlyZWN0aXZlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYi1iYXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBUQUJfQkFSLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUYWJCYXJDb21wb25lbnQpIH0sIFNjcm9sbGFibGVTZXJ2aWNlXSxcbiAgaG9zdDoge1xuICAgIHJvbGU6ICd0YWJwYW5lbCcsXG4gICAgdGFiaW5kZXg6ICcwJyxcbiAgICAnW2NsYXNzLm9keC10YWItYmFyLS1vdmVyZmxvdy1sZWZ0XSc6ICchIXByZXZUYWIoKScsXG4gICAgJ1tjbGFzcy5vZHgtdGFiLWJhci0tb3ZlcmZsb3ctcmlnaHRdJzogJyEhbmV4dFRhYigpJyxcbiAgICAnKGtleWRvd24pJzogJ29uS2V5ZG93bigkZXZlbnQpJyxcbiAgICAnKGZvY3VzKSc6ICdvbkZvY3VzZWQoKScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIFRhYkJhckNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFrZVVudGlsRGVzdHJveWVkID0gdW50aWxEZXN0cm95ZWQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JvbGxhYmxlU2VydmljZSA9IGluamVjdChTY3JvbGxhYmxlU2VydmljZSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHRUYWIgPSB0aGlzLnNjcm9sbGFibGVTZXJ2aWNlLm5leHRJdGVtO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJldlRhYiA9IHRoaXMuc2Nyb2xsYWJsZVNlcnZpY2UucHJldkl0ZW07XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRhYnMgPSBjb250ZW50Q2hpbGRyZW48VGFiQmFySXRlbUNvbXBvbmVudD4oVGFiQmFySXRlbUNvbXBvbmVudCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBhY3RpdmVJdGVtID0gY29tcHV0ZWQoKCkgPT4gdGhpcy50YWJzKCkuYXQodGhpcy5zZWxlY3RlZEluZGV4KCkpID8/IG51bGwpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkga2V5TWFuYWdlcjogQWN0aXZlRGVzY2VuZGFudEtleU1hbmFnZXI8VGFiQmFySXRlbUNvbXBvbmVudD4gPSBuZXcgQWN0aXZlRGVzY2VuZGFudEtleU1hbmFnZXIodGhpcy50YWJzLCBpbmplY3QoSW5qZWN0b3IpKVxuICAgIC53aXRoV3JhcCgpXG4gICAgLndpdGhIb21lQW5kRW5kKClcbiAgICAud2l0aEhvcml6b250YWxPcmllbnRhdGlvbignbHRyJylcbiAgICAud2l0aFZlcnRpY2FsT3JpZW50YXRpb24oZmFsc2UpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzY3JvbGxDb250YWluZXJFbGVtZW50ID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+Pignc2Nyb2xsQ29udGFpbmVyJyk7XG4gIHB1YmxpYyByZWFkb25seSBlbGVtZW50ID0gaW5qZWN0RWxlbWVudCgpO1xuXG4gIC8qKlxuICAgKiBJbmRleCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRhYi4gVXNlIHRoaXMgcHJvcGVydHkgdG8gcHJvZ3JhbW1hdGljYWxseVxuICAgKiBjaGFuZ2UgdGhlIGFjdGl2ZSB0YWIuIEl0IHJlc3BvbmRzIHRvIGNoYW5nZXMgYnkgdXBkYXRpbmcgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgY29ycmVzcG9uZGluZ1xuICAgKiB0YWIgaXRlbSBhbmQgYWRqdXN0aW5nIHRoZSB2aWV3IGlmIG5lY2Vzc2FyeS5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGV4YW1wbGVcbiAgICogUHJvZ3JhbW1hdGljYWxseSBzZWxlY3QgdGhlIHNlY29uZCB0YWIgKGluZGV4IHN0YXJ0cyBmcm9tIDApOlxuICAgKiBgYGBodG1sXG4gICAqIDxvZHgtdGFiLWJhciBbc2VsZWN0ZWRJbmRleF09XCIxXCI+PC9vZHgtdGFiLWJhcj5cbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0ZWRJbmRleCA9IG1vZGVsPG51bWJlcj4oMCk7XG5cbiAgLyoqXG4gICAqIEFuIEV2ZW50RW1pdHRlciB0aGF0IGVtaXRzIHdoZW5ldmVyIGEgbmV3IHRhYiBpcyBzZWxlY3RlZC4gSXQgcHJvdmlkZXMgdGhlIGBUYWJDaGFuZ2VFdmVudGBcbiAgICogd2hpY2ggY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBuZXdseSBzZWxlY3RlZCB0YWIgYW5kIHRoZSBpbnN0YW5jZSBvZiB0aGUgY29ycmVzcG9uZGluZ1xuICAgKiBgVGFiQmFySXRlbUNvbXBvbmVudGAuIFN1YnNjcmliZSB0byB0aGlzIG91dHB1dCB0byBwZXJmb3JtIGFjdGlvbnMgd2hlbiB0aGUgYWN0aXZlIHRhYiBjaGFuZ2VzLlxuICAgKlxuICAgKiBAZW1pdHMge1RhYkNoYW5nZUV2ZW50fVxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBodG1sXG4gICAqIDxvZHgtdGFiLWJhciAoc2VsZWN0ZWRUYWJDaGFuZ2VkKT1cIm9uVGFiQ2hhbmdlKCRldmVudClcIj48L29keC10YWItYmFyPlxuICAgKiBgYGBcbiAgICpcbiAgICogYGBgdHNcbiAgICogb25UYWJDaGFuZ2UoZXZlbnQ6IFRhYkNoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAqICAgY29uc29sZS5sb2coYE5ldyBhY3RpdmUgdGFiIGluZGV4OiAke2V2ZW50LnNlbGVjdGVkSW5kZXh9YCk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0ZWRUYWJDaGFuZ2VkID0gb3V0cHV0PFRhYkNoYW5nZUV2ZW50PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGNvbnN0IHRhYlN0YXRlID0gY29tcHV0ZWQoKCkgPT4gKHtcbiAgICAgIHNlbGVjdGVkSW5kZXg6IHRoaXMuc2VsZWN0ZWRJbmRleCgpLFxuICAgICAgc2VsZWN0ZWRUYWI6IHRoaXMuYWN0aXZlSXRlbSgpLFxuICAgIH0pKTtcblxuICAgIG1lcmdlKFxuICAgICAgdGhpcy5rZXlNYW5hZ2VyLmNoYW5nZS5waXBlKHRhcCgoaW5kZXgpID0+IHRoaXMuc2VsZWN0ZWRJbmRleC5zZXQoaW5kZXggPz8gLTEpKSksXG4gICAgICBmcm9tRWxlbWVudFJlc2l6ZSQodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIDYwMCkucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuc2Nyb2xsYWJsZVNlcnZpY2Uuc2Nyb2xsQWN0aXZlSXRlbUludG9Ib3Jpem9udGFsVmlldyh0aGlzLmFjdGl2ZUl0ZW0oKT8uZWxlbWVudC5uYXRpdmVFbGVtZW50ID8/IG51bGwpKSxcbiAgICAgICksXG4gICAgICB0b09ic2VydmFibGUodGFiU3RhdGUpLnBpcGUoXG4gICAgICAgIHNraXAoMSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiBhLnNlbGVjdGVkSW5kZXggPT09IGIuc2VsZWN0ZWRJbmRleCksXG4gICAgICAgIGZpbHRlcigoeyBzZWxlY3RlZFRhYiB9KSA9PiAhc2VsZWN0ZWRUYWI/LmRpc2FibGVkKSxcbiAgICAgICAgdGFwKChzdGF0ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJDaGFuZ2VkLmVtaXQoc3RhdGUpO1xuICAgICAgICAgIHRoaXMuc2Nyb2xsYWJsZVNlcnZpY2Uuc2Nyb2xsQWN0aXZlSXRlbUludG9Ib3Jpem9udGFsVmlldyhzdGF0ZS5zZWxlY3RlZFRhYj8uZWxlbWVudC5uYXRpdmVFbGVtZW50ID8/IG51bGwpO1xuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKVxuICAgICAgLnBpcGUodGhpcy50YWtlVW50aWxEZXN0cm95ZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5rZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0odGhpcy5zZWxlY3RlZEluZGV4KCkpO1xuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSxcbiAgICApO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMuc2Nyb2xsYWJsZVNlcnZpY2Uub2JzZXJ2ZSh0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQoKSwgdGhpcy50YWJzKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlcyB0aGUgc3BlY2lmaWVkIHRhYiBpdGVtLCBtYWtpbmcgaXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0YWIuXG4gICAqIElmIHRoZSBpdGVtIGlzIGFscmVhZHkgYWN0aXZlLCBubyBhY3Rpb24gaXMgdGFrZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7VGFiQmFySXRlbUNvbXBvbmVudCB8IG51bGx9IGl0ZW0gLSBUaGUgdGFiIGl0ZW0gdG8gYWN0aXZhdGUuXG4gICAqL1xuICBwdWJsaWMgYWN0aXZhdGVJdGVtKGl0ZW0/OiBUYWJCYXJJdGVtQ29tcG9uZW50IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmIChpdGVtID09PSB0aGlzLmtleU1hbmFnZXI/LmFjdGl2ZUl0ZW0pIHJldHVybjtcbiAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gaXRlbSA/IHRoaXMudGFicygpLmluZGV4T2YoaXRlbSkgOiAtMTtcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXguc2V0KHNlbGVjdGVkSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIHNwZWNpZmllZCB0YWIgaXRlbSBpcyByZW1vdmVkIGZyb20gdGhlIHRhYiBiYXIuXG4gICAqIElmIHRoZSBpdGVtIGlzIGN1cnJlbnRseSBhY3RpdmUsIHRoZSBwcmV2aW91cyB0YWIgaXMgYWN0aXZhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge1RhYkJhckl0ZW1Db21wb25lbnR9IGl0ZW0gLSBUaGUgdGFiIGl0ZW0gdG8gcmVtb3ZlLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZUl0ZW0oaXRlbTogVGFiQmFySXRlbUNvbXBvbmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmtleU1hbmFnZXI/LmFjdGl2ZUl0ZW0gIT09IGl0ZW0pIHJldHVybjtcbiAgICB0aGlzLmtleU1hbmFnZXI/LnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMua2V5TWFuYWdlcj8ub25LZXlkb3duKGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkZvY3VzZWQoKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlSXRlbSA9IHRoaXMuYWN0aXZlSXRlbSgpPy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFhY3RpdmVJdGVtKSByZXR1cm47XG4gICAgaWYgKHRoaXMuc2Nyb2xsYWJsZVNlcnZpY2UudmlzaWJsZUl0ZW1zKCkuaW5jbHVkZXMoYWN0aXZlSXRlbSkpIHJldHVybjtcbiAgICB0aGlzLnNjcm9sbGFibGVTZXJ2aWNlLnNjcm9sbEFjdGl2ZUl0ZW1JbnRvSG9yaXpvbnRhbFZpZXcoYWN0aXZlSXRlbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVGFicyhkaXJlY3Rpb246IDEgfCAtMSA9IDEpOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbGFibGVTZXJ2aWNlLnNjcm9sbChkaXJlY3Rpb24pO1xuICB9XG59XG4iLCI8YnV0dG9uICN0YWJBY3Rpb24gY2xhc3M9XCJvZHgtdGFiLWJhcl9fYWN0aW9uIG9keC10YWItYmFyX19hY3Rpb24tLXByZXZcIiBbY2xhc3MuaXMtYWN0aXZlXT1cIiEhcHJldlRhYigpXCIgKGNsaWNrKT1cInNjcm9sbFRhYnMoLTEpXCIgdGFiaW5kZXg9XCItMVwiPlxuICA8b2R4LWljb24gY2xhc3M9XCJ0YWItYmFyLWFjdGlvbi1pY29uXCIgbmFtZT1cImNoZXZyb24tbGVmdFwiIGljb25TZXQ9XCJjb3JlXCIgLz5cbjwvYnV0dG9uPlxuPGRpdiBjbGFzcz1cIm9keC10YWItYmFyX19pbm5lclwiICNzY3JvbGxDb250YWluZXIgdGFiaW5kZXg9XCItMVwiPlxuICA8ZGl2IGNsYXNzPVwib2R4LXRhYi1iYXJfX3BhbmVsXCIgcm9sZT1cInRhYmxpc3RcIiAjdGFiQmFyUGFuZWw+XG4gICAgPG5nLWNvbnRlbnQgLz5cbiAgICA8ZGl2IGNsYXNzPVwib2R4LXRhYi1iYXJfX2luZGljYXRvclwiIFtvZHhBY3RpdmVJbmRpY2F0b3JdPVwiYWN0aXZlSXRlbSgpPy5lbGVtZW50Py5uYXRpdmVFbGVtZW50XCIgb2R4QWN0aXZlSW5kaWNhdG9yUG9zaXRpb249XCJzdGFydFwiPjwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuPGJ1dHRvbiAjdGFiQWN0aW9uIGNsYXNzPVwib2R4LXRhYi1iYXJfX2FjdGlvbiBvZHgtdGFiLWJhcl9fYWN0aW9uLS1uZXh0XCIgW2NsYXNzLmlzLWFjdGl2ZV09XCIhIW5leHRUYWIoKVwiIChjbGljayk9XCJzY3JvbGxUYWJzKClcIiB0YWJpbmRleD1cIi0xXCI+XG4gIDxvZHgtaWNvbiBjbGFzcz1cInRhYi1iYXItYWN0aW9uLWljb25cIiBuYW1lPVwiY2hldnJvbi1yaWdodFwiIGljb25TZXQ9XCJjb3JlXCIgLz5cbjwvYnV0dG9uPlxuIl19
@@ -78,10 +78,31 @@ class ScrollableService {
78
78
  *
79
79
  * @param {HTMLElement | null} activeItem - The currently active item to scroll into view.
80
80
  */
81
- scrollActiveItemIntoView(activeItem) {
82
- if (activeItem) {
83
- activeItem.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });
84
- }
81
+ scrollActiveItemIntoHorizontalView(activeItem) {
82
+ const container = this.scrollContainer?.nativeElement;
83
+ if (!container || !activeItem)
84
+ return;
85
+ // Use a small epsilon to avoid false positives from subpixel rounding.
86
+ const isHorizontallyScrollable = container.scrollWidth - container.clientWidth > 1;
87
+ // If there is no horizontal overflow, any attempt to "scroll into view" can only scroll ancestor containers
88
+ // (including the page). This is the root cause of the page jumping on load/resize.
89
+ if (!isHorizontallyScrollable)
90
+ return;
91
+ const containerRect = container.getBoundingClientRect();
92
+ const itemRect = activeItem.getBoundingClientRect();
93
+ const isFullyVisible = itemRect.left >= containerRect.left && itemRect.right <= containerRect.right;
94
+ if (isFullyVisible)
95
+ return;
96
+ const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);
97
+ let targetLeft = container.scrollLeft;
98
+ const itemLeft = itemRect.left - containerRect.left + container.scrollLeft;
99
+ const itemCenter = itemLeft + itemRect.width / 2;
100
+ targetLeft = itemCenter - container.clientWidth / 2;
101
+ targetLeft = Math.min(maxLeft, Math.max(0, targetLeft));
102
+ const leftChanged = Math.abs(targetLeft - container.scrollLeft) > 1;
103
+ if (!leftChanged)
104
+ return;
105
+ container.scrollTo({ left: targetLeft, behavior: 'smooth' });
85
106
  }
86
107
  observeVisibility(items, callback) {
87
108
  const visibleMap = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"odx-angular-cdk-scrollable.mjs","sources":["../../../../libs/angular/cdk/scrollable/src/lib/scrollable.service.ts","../../../../libs/angular/cdk/scrollable/src/odx-angular-cdk-scrollable.ts"],"sourcesContent":["import { ElementRef, Injectable, OnDestroy, signal } from '@angular/core';\n\nexport interface ScrollableItem {\n element: ElementRef<HTMLElement>;\n}\n\n/**\n * Service to manage scrollable items within a container, providing functionality to observe item visibility\n * and navigate through them.\n */\n@Injectable()\nexport class ScrollableService implements OnDestroy {\n private intersectionObserver?: IntersectionObserver;\n private scrollContainer?: ElementRef<HTMLElement>;\n\n /**\n * References to the next and previous scrollable items.\n *\n * @type {HTMLElement | null}\n */\n public readonly nextItem = signal<HTMLElement | null>(null);\n\n /**\n * References to the previous scrollable item.\n *\n * @type {HTMLElement | null}\n */\n public readonly prevItem = signal<HTMLElement | null>(null);\n\n /** List of currently visible items within the scroll container.\n *\n * @type {HTMLElement[]}\n */\n public readonly visibleItems = signal<HTMLElement[]>([]);\n\n public ngOnDestroy(): void {\n this.intersectionObserver?.disconnect();\n }\n\n /**\n * Starts observing the scrollable items within the specified container.\n *\n * @param {ElementRef<HTMLElement>} scrollContainer - The container element that holds the scrollable items.\n * @param {readonly ScrollableItem[]} items - The list of scrollable items to observe.\n */\n public observe(scrollContainer: ElementRef<HTMLElement>, items: readonly ScrollableItem[]): void {\n this.scrollContainer = scrollContainer;\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n }\n\n const allItems = items.map((item) => item.element.nativeElement);\n if (!this.scrollContainer || allItems.length === 0) {\n this.nextItem.set(null);\n this.prevItem.set(null);\n return;\n }\n\n this.intersectionObserver = this.observeVisibility(allItems, (visible) => {\n let prevItem: HTMLElement | null = null;\n let nextItem: HTMLElement | null = null;\n\n if (visible.length > 0 && allItems.length > visible.length) {\n const firstVisibleIndex = allItems.indexOf(visible[0]);\n if (firstVisibleIndex > 0) {\n prevItem = allItems[firstVisibleIndex - 1];\n }\n\n const lastVisibleIndex = allItems.indexOf(visible[visible.length - 1]);\n if (lastVisibleIndex < allItems.length - 1) {\n nextItem = allItems[lastVisibleIndex + 1];\n }\n }\n\n this.nextItem.set(nextItem);\n this.prevItem.set(prevItem);\n });\n }\n\n /**\n * Scrolls the container in the specified direction.\n *\n * @param {'next' | 'prev'} direction - The direction to scroll ('next' for right, 'prev' for left).\n */\n public scroll(direction: 1 | -1 = 1): void {\n const container = this.scrollContainer?.nativeElement;\n if (!container) return;\n\n container.scrollBy({ left: (container.clientWidth * direction) / 2 });\n }\n\n /**\n * Scrolls the active item into view within the scroll container.\n *\n * @param {HTMLElement | null} activeItem - The currently active item to scroll into view.\n */\n public scrollActiveItemIntoView(activeItem: HTMLElement | null): void {\n if (activeItem) {\n activeItem.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n }\n }\n\n private observeVisibility(items: HTMLElement[], callback: (visible: HTMLElement[]) => void): IntersectionObserver {\n const visibleMap = new Map<HTMLElement, boolean>();\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const isVisible = entry.isIntersecting && entry.intersectionRatio >= 0.75;\n visibleMap.set(entry.target as HTMLElement, isVisible);\n }\n const visible = items.filter((item) => visibleMap.get(item));\n this.visibleItems.set(visible);\n callback(visible);\n },\n {\n root: this.scrollContainer!.nativeElement,\n threshold: 1,\n },\n );\n\n items.forEach((item) => observer.observe(item));\n return observer;\n }\n}\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-cdk-scrollable.mjs","sources":["../../../../libs/angular/cdk/scrollable/src/lib/scrollable.service.ts","../../../../libs/angular/cdk/scrollable/src/odx-angular-cdk-scrollable.ts"],"sourcesContent":["import { ElementRef, Injectable, OnDestroy, signal } from '@angular/core';\n\nexport interface ScrollableItem {\n element: ElementRef<HTMLElement>;\n}\n\n/**\n * Service to manage scrollable items within a container, providing functionality to observe item visibility\n * and navigate through them.\n */\n@Injectable()\nexport class ScrollableService implements OnDestroy {\n private intersectionObserver?: IntersectionObserver;\n private scrollContainer?: ElementRef<HTMLElement>;\n\n /**\n * References to the next and previous scrollable items.\n *\n * @type {HTMLElement | null}\n */\n public readonly nextItem = signal<HTMLElement | null>(null);\n\n /**\n * References to the previous scrollable item.\n *\n * @type {HTMLElement | null}\n */\n public readonly prevItem = signal<HTMLElement | null>(null);\n\n /** List of currently visible items within the scroll container.\n *\n * @type {HTMLElement[]}\n */\n public readonly visibleItems = signal<HTMLElement[]>([]);\n\n public ngOnDestroy(): void {\n this.intersectionObserver?.disconnect();\n }\n\n /**\n * Starts observing the scrollable items within the specified container.\n *\n * @param {ElementRef<HTMLElement>} scrollContainer - The container element that holds the scrollable items.\n * @param {readonly ScrollableItem[]} items - The list of scrollable items to observe.\n */\n public observe(scrollContainer: ElementRef<HTMLElement>, items: readonly ScrollableItem[]): void {\n this.scrollContainer = scrollContainer;\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n }\n\n const allItems = items.map((item) => item.element.nativeElement);\n if (!this.scrollContainer || allItems.length === 0) {\n this.nextItem.set(null);\n this.prevItem.set(null);\n return;\n }\n\n this.intersectionObserver = this.observeVisibility(allItems, (visible) => {\n let prevItem: HTMLElement | null = null;\n let nextItem: HTMLElement | null = null;\n\n if (visible.length > 0 && allItems.length > visible.length) {\n const firstVisibleIndex = allItems.indexOf(visible[0]);\n if (firstVisibleIndex > 0) {\n prevItem = allItems[firstVisibleIndex - 1];\n }\n\n const lastVisibleIndex = allItems.indexOf(visible[visible.length - 1]);\n if (lastVisibleIndex < allItems.length - 1) {\n nextItem = allItems[lastVisibleIndex + 1];\n }\n }\n\n this.nextItem.set(nextItem);\n this.prevItem.set(prevItem);\n });\n }\n\n /**\n * Scrolls the container in the specified direction.\n *\n * @param {'next' | 'prev'} direction - The direction to scroll ('next' for right, 'prev' for left).\n */\n public scroll(direction: 1 | -1 = 1): void {\n const container = this.scrollContainer?.nativeElement;\n if (!container) return;\n\n container.scrollBy({ left: (container.clientWidth * direction) / 2 });\n }\n\n /**\n * Scrolls the active item into view within the scroll container.\n *\n * @param {HTMLElement | null} activeItem - The currently active item to scroll into view.\n */\n public scrollActiveItemIntoHorizontalView(activeItem: HTMLElement | null): void {\n const container = this.scrollContainer?.nativeElement;\n if (!container || !activeItem) return;\n\n // Use a small epsilon to avoid false positives from subpixel rounding.\n const isHorizontallyScrollable = container.scrollWidth - container.clientWidth > 1;\n // If there is no horizontal overflow, any attempt to \"scroll into view\" can only scroll ancestor containers\n // (including the page). This is the root cause of the page jumping on load/resize.\n if (!isHorizontallyScrollable) return;\n\n const containerRect = container.getBoundingClientRect();\n const itemRect = activeItem.getBoundingClientRect();\n\n const isFullyVisible = itemRect.left >= containerRect.left && itemRect.right <= containerRect.right;\n if (isFullyVisible) return;\n\n const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n let targetLeft = container.scrollLeft;\n const itemLeft = itemRect.left - containerRect.left + container.scrollLeft;\n const itemCenter = itemLeft + itemRect.width / 2;\n targetLeft = itemCenter - container.clientWidth / 2;\n targetLeft = Math.min(maxLeft, Math.max(0, targetLeft));\n\n const leftChanged = Math.abs(targetLeft - container.scrollLeft) > 1;\n if (!leftChanged) return;\n\n container.scrollTo({ left: targetLeft, behavior: 'smooth' });\n }\n\n private observeVisibility(items: HTMLElement[], callback: (visible: HTMLElement[]) => void): IntersectionObserver {\n const visibleMap = new Map<HTMLElement, boolean>();\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const isVisible = entry.isIntersecting && entry.intersectionRatio >= 0.75;\n visibleMap.set(entry.target as HTMLElement, isVisible);\n }\n const visible = items.filter((item) => visibleMap.get(item));\n this.visibleItems.set(visible);\n callback(visible);\n },\n {\n root: this.scrollContainer!.nativeElement,\n threshold: 1,\n },\n );\n\n items.forEach((item) => observer.observe(item));\n return observer;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -20,7 +20,7 @@ import { Logger, deepmerge, CSSComponent } from '@odx/angular/internal';
20
20
  import { TranslatePipe, provideTranslations } from '@odx/angular/internal/translate';
21
21
  import { isFunction, createConfigTokens, orderBy, Queue, getUniqueId, isString, injectElement, Position } from '@odx/angular/utils';
22
22
  import { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
23
- import { tap, map, shareReplay, filter, switchMap, of, isObservable, combineLatest, from, firstValueFrom, merge, startWith } from 'rxjs';
23
+ import { tap, map, shareReplay, filter, switchMap, isObservable, of, combineLatest, from, firstValueFrom, merge, startWith } from 'rxjs';
24
24
  import { LocalizationService } from '@odx/angular/localization';
25
25
  import { AvatarComponent } from '@odx/angular/components/avatar';
26
26
  import * as i2 from '@odx/angular';
@@ -21,7 +21,7 @@ import { CheckboxRequiredValidator, NG_VALIDATORS } from '@angular/forms';
21
21
  */
22
22
  let SwitchComponent = class SwitchComponent extends CheckBoxControl {
23
23
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SwitchComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
24
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: SwitchComponent, isStandalone: true, selector: "odx-switch", host: { properties: { "class.is-active": "checked" } }, providers: [ReadonlyController.connect()], usesInheritance: true, hostDirectives: [{ directive: i1.WithDisabledState }], ngImport: i0, template: "<label class=\"odx-switch__label\">\n <input\n odxControl\n class=\"odx-switch__input\"\n [attr.aria-checked]=\"ariaChecked\"\n [attr.aria-invalid]=\"hasError || null\"\n [attr.aria-readonly]=\"isReadonly || null\"\n [attr.aria-required]=\"isRequired || null\"\n [attr.tabindex]=\"tabindex || null\"\n [checked]=\"checked\"\n [disabled]=\"isDisabled || isReadonly\"\n [name]=\"name\"\n [readonly]=\"isReadonly\"\n [value]=\"value\"\n type=\"checkbox\"\n (blur)=\"onTouched()\"\n (change)=\"onChanged($event)\"\n />\n <div class=\"odx-switch__track\">\n <div class=\"odx-switch__thumb\">\n <odx-icon class=\"odx-switch__icon\" iconSet=\"core\" [name]=\"checked ? 'check' : 'close'\" />\n </div>\n </div>\n <div class=\"odx-switch__content\">\n <ng-content />\n @if (isRequired) {\n <span class=\"odx-switch__required\">*</span>\n }\n </div>\n</label>\n", dependencies: [{ kind: "directive", type: ControlDirective, selector: "[odxControl]", exportAs: ["odxControl"] }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
24
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: SwitchComponent, isStandalone: true, selector: "odx-switch", host: { properties: { "class.is-active": "checked" } }, providers: [ReadonlyController.connect()], usesInheritance: true, hostDirectives: [{ directive: i1.WithDisabledState }], ngImport: i0, template: "<label class=\"odx-switch__label\">\n <input\n odxControl\n class=\"odx-switch__input\"\n [attr.aria-checked]=\"ariaChecked\"\n [attr.aria-invalid]=\"hasError || null\"\n [attr.aria-readonly]=\"isReadonly || null\"\n [attr.aria-required]=\"isRequired || null\"\n [attr.tabindex]=\"tabindex || null\"\n [checked]=\"checked\"\n [disabled]=\"isDisabled || isReadonly\"\n [name]=\"name\"\n [readonly]=\"isReadonly\"\n [value]=\"value\"\n type=\"checkbox\"\n (blur)=\"onTouched()\"\n (change)=\"onChanged($event)\"\n />\n <div class=\"odx-switch__thumb-container\">\n <div class=\"odx-switch__track\"></div>\n <div class=\"odx-switch__thumb\">\n <odx-icon class=\"odx-switch__icon\" iconSet=\"core\" [name]=\"checked ? 'check' : 'close'\" />\n </div>\n </div>\n <div class=\"odx-switch__content\">\n <ng-content />\n @if (isRequired) {\n <span class=\"odx-switch__required\">*</span>\n }\n </div>\n</label>\n", dependencies: [{ kind: "directive", type: ControlDirective, selector: "[odxControl]", exportAs: ["odxControl"] }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
25
25
  };
26
26
  SwitchComponent = __decorate([
27
27
  CSSComponent('switch')
@@ -30,7 +30,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30
30
  type: Component,
31
31
  args: [{ standalone: true, selector: 'odx-switch', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [ControlDirective, IconComponent], providers: [ReadonlyController.connect()], hostDirectives: [WithDisabledState], host: {
32
32
  '[class.is-active]': 'checked',
33
- }, template: "<label class=\"odx-switch__label\">\n <input\n odxControl\n class=\"odx-switch__input\"\n [attr.aria-checked]=\"ariaChecked\"\n [attr.aria-invalid]=\"hasError || null\"\n [attr.aria-readonly]=\"isReadonly || null\"\n [attr.aria-required]=\"isRequired || null\"\n [attr.tabindex]=\"tabindex || null\"\n [checked]=\"checked\"\n [disabled]=\"isDisabled || isReadonly\"\n [name]=\"name\"\n [readonly]=\"isReadonly\"\n [value]=\"value\"\n type=\"checkbox\"\n (blur)=\"onTouched()\"\n (change)=\"onChanged($event)\"\n />\n <div class=\"odx-switch__track\">\n <div class=\"odx-switch__thumb\">\n <odx-icon class=\"odx-switch__icon\" iconSet=\"core\" [name]=\"checked ? 'check' : 'close'\" />\n </div>\n </div>\n <div class=\"odx-switch__content\">\n <ng-content />\n @if (isRequired) {\n <span class=\"odx-switch__required\">*</span>\n }\n </div>\n</label>\n" }]
33
+ }, template: "<label class=\"odx-switch__label\">\n <input\n odxControl\n class=\"odx-switch__input\"\n [attr.aria-checked]=\"ariaChecked\"\n [attr.aria-invalid]=\"hasError || null\"\n [attr.aria-readonly]=\"isReadonly || null\"\n [attr.aria-required]=\"isRequired || null\"\n [attr.tabindex]=\"tabindex || null\"\n [checked]=\"checked\"\n [disabled]=\"isDisabled || isReadonly\"\n [name]=\"name\"\n [readonly]=\"isReadonly\"\n [value]=\"value\"\n type=\"checkbox\"\n (blur)=\"onTouched()\"\n (change)=\"onChanged($event)\"\n />\n <div class=\"odx-switch__thumb-container\">\n <div class=\"odx-switch__track\"></div>\n <div class=\"odx-switch__thumb\">\n <odx-icon class=\"odx-switch__icon\" iconSet=\"core\" [name]=\"checked ? 'check' : 'close'\" />\n </div>\n </div>\n <div class=\"odx-switch__content\">\n <ng-content />\n @if (isRequired) {\n <span class=\"odx-switch__required\">*</span>\n }\n </div>\n</label>\n" }]
34
34
  }] });
35
35
 
36
36
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"odx-angular-components-switch.mjs","sources":["../../../../libs/angular/components/switch/src/lib/switch.component.ts","../../../../libs/angular/components/switch/src/lib/switch.component.html","../../../../libs/angular/components/switch/src/lib/switch.validator.ts","../../../../libs/angular/components/switch/src/lib/switch.module.ts","../../../../libs/angular/components/switch/src/odx-angular-components-switch.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { ReadonlyController, WithDisabledState } from '@odx/angular';\nimport { CheckBoxControl } from '@odx/angular/cdk/checkbox-control';\nimport { ControlDirective } from '@odx/angular/cdk/custom-form-control';\nimport { IconComponent } from '@odx/angular/components/icon';\nimport { CSSComponent } from '@odx/angular/internal';\n\n/**\n * SwitchComponent provides a custom switch (toggle) control that can be used within forms\n * or standalone for toggling a specific binary state. It supports readonly and disabled states,\n * and integrates seamlessly with Angular's form controls for data binding and state management.\n * Has host directives for disabled state handling.\n * Extends CheckBoxControl to provide additional behavior.\n *\n * @see {WithDisabledState}\n * @see {CheckBoxControl}\n */\n@CSSComponent('switch')\n@Component({\n standalone: true,\n selector: 'odx-switch',\n templateUrl: 'switch.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [ControlDirective, IconComponent],\n providers: [ReadonlyController.connect()],\n hostDirectives: [WithDisabledState],\n host: {\n '[class.is-active]': 'checked',\n },\n})\nexport class SwitchComponent extends CheckBoxControl {}\n","<label class=\"odx-switch__label\">\n <input\n odxControl\n class=\"odx-switch__input\"\n [attr.aria-checked]=\"ariaChecked\"\n [attr.aria-invalid]=\"hasError || null\"\n [attr.aria-readonly]=\"isReadonly || null\"\n [attr.aria-required]=\"isRequired || null\"\n [attr.tabindex]=\"tabindex || null\"\n [checked]=\"checked\"\n [disabled]=\"isDisabled || isReadonly\"\n [name]=\"name\"\n [readonly]=\"isReadonly\"\n [value]=\"value\"\n type=\"checkbox\"\n (blur)=\"onTouched()\"\n (change)=\"onChanged($event)\"\n />\n <div class=\"odx-switch__track\">\n <div class=\"odx-switch__thumb\">\n <odx-icon class=\"odx-switch__icon\" iconSet=\"core\" [name]=\"checked ? 'check' : 'close'\" />\n </div>\n </div>\n <div class=\"odx-switch__content\">\n <ng-content />\n @if (isRequired) {\n <span class=\"odx-switch__required\">*</span>\n }\n </div>\n</label>\n","import { Directive, forwardRef } from '@angular/core';\nimport { CheckboxRequiredValidator, NG_VALIDATORS } from '@angular/forms';\n\n/**\n * SwitchValidator extends CheckboxRequiredValidator to provide required field validation\n * for switch components used within Angular forms. It ensures that the switch is marked as required\n * and must be toggled (checked) to meet form validation criteria.\n *\n * This directive automatically attaches itself to any switch component with a 'required' attribute\n * and a form control binding (formControlName, formControl, or ngModel).\n *\n * Extends CheckboxRequiredValidator.\n *\n * @see {CheckboxRequiredValidator}\n */\n@Directive({\n standalone: true,\n selector: 'odx-switch[required][formControlName], odx-switch[required][formControl], odx-switch[required][ngModel]',\n providers: [\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => SwitchValidator),\n multi: true,\n },\n ],\n})\nexport class SwitchValidator extends CheckboxRequiredValidator {}\n","import { NgModule } from '@angular/core';\nimport { CoreModule } from '@odx/angular';\nimport { SwitchComponent } from './switch.component';\nimport { SwitchValidator } from './switch.validator';\n\nconst modules = [SwitchComponent, SwitchValidator];\n\n@NgModule({\n imports: modules,\n exports: [CoreModule, ...modules],\n})\nexport class SwitchModule {}\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-switch.mjs","sources":["../../../../libs/angular/components/switch/src/lib/switch.component.ts","../../../../libs/angular/components/switch/src/lib/switch.component.html","../../../../libs/angular/components/switch/src/lib/switch.validator.ts","../../../../libs/angular/components/switch/src/lib/switch.module.ts","../../../../libs/angular/components/switch/src/odx-angular-components-switch.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { ReadonlyController, WithDisabledState } from '@odx/angular';\nimport { CheckBoxControl } from '@odx/angular/cdk/checkbox-control';\nimport { ControlDirective } from '@odx/angular/cdk/custom-form-control';\nimport { IconComponent } from '@odx/angular/components/icon';\nimport { CSSComponent } from '@odx/angular/internal';\n\n/**\n * SwitchComponent provides a custom switch (toggle) control that can be used within forms\n * or standalone for toggling a specific binary state. It supports readonly and disabled states,\n * and integrates seamlessly with Angular's form controls for data binding and state management.\n * Has host directives for disabled state handling.\n * Extends CheckBoxControl to provide additional behavior.\n *\n * @see {WithDisabledState}\n * @see {CheckBoxControl}\n */\n@CSSComponent('switch')\n@Component({\n standalone: true,\n selector: 'odx-switch',\n templateUrl: 'switch.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [ControlDirective, IconComponent],\n providers: [ReadonlyController.connect()],\n hostDirectives: [WithDisabledState],\n host: {\n '[class.is-active]': 'checked',\n },\n})\nexport class SwitchComponent extends CheckBoxControl {}\n","<label class=\"odx-switch__label\">\n <input\n odxControl\n class=\"odx-switch__input\"\n [attr.aria-checked]=\"ariaChecked\"\n [attr.aria-invalid]=\"hasError || null\"\n [attr.aria-readonly]=\"isReadonly || null\"\n [attr.aria-required]=\"isRequired || null\"\n [attr.tabindex]=\"tabindex || null\"\n [checked]=\"checked\"\n [disabled]=\"isDisabled || isReadonly\"\n [name]=\"name\"\n [readonly]=\"isReadonly\"\n [value]=\"value\"\n type=\"checkbox\"\n (blur)=\"onTouched()\"\n (change)=\"onChanged($event)\"\n />\n <div class=\"odx-switch__thumb-container\">\n <div class=\"odx-switch__track\"></div>\n <div class=\"odx-switch__thumb\">\n <odx-icon class=\"odx-switch__icon\" iconSet=\"core\" [name]=\"checked ? 'check' : 'close'\" />\n </div>\n </div>\n <div class=\"odx-switch__content\">\n <ng-content />\n @if (isRequired) {\n <span class=\"odx-switch__required\">*</span>\n }\n </div>\n</label>\n","import { Directive, forwardRef } from '@angular/core';\nimport { CheckboxRequiredValidator, NG_VALIDATORS } from '@angular/forms';\n\n/**\n * SwitchValidator extends CheckboxRequiredValidator to provide required field validation\n * for switch components used within Angular forms. It ensures that the switch is marked as required\n * and must be toggled (checked) to meet form validation criteria.\n *\n * This directive automatically attaches itself to any switch component with a 'required' attribute\n * and a form control binding (formControlName, formControl, or ngModel).\n *\n * Extends CheckboxRequiredValidator.\n *\n * @see {CheckboxRequiredValidator}\n */\n@Directive({\n standalone: true,\n selector: 'odx-switch[required][formControlName], odx-switch[required][formControl], odx-switch[required][ngModel]',\n providers: [\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => SwitchValidator),\n multi: true,\n },\n ],\n})\nexport class SwitchValidator extends CheckboxRequiredValidator {}\n","import { NgModule } from '@angular/core';\nimport { CoreModule } from '@odx/angular';\nimport { SwitchComponent } from './switch.component';\nimport { SwitchValidator } from './switch.validator';\n\nconst modules = [SwitchComponent, SwitchValidator];\n\n@NgModule({\n imports: modules,\n exports: [CoreModule, ...modules],\n})\nexport class SwitchModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -162,9 +162,9 @@ let TabBarComponent = class TabBarComponent {
162
162
  selectedIndex: this.selectedIndex(),
163
163
  selectedTab: this.activeItem(),
164
164
  }));
165
- merge(this.keyManager.change.pipe(tap((index) => this.selectedIndex.set(index ?? -1))), fromElementResize$(this.element.nativeElement, 600).pipe(tap(() => this.scrollableService.scrollActiveItemIntoView(this.activeItem()?.element.nativeElement ?? null))), toObservable(tabState).pipe(skip(1), distinctUntilChanged((a, b) => a.selectedIndex === b.selectedIndex), filter(({ selectedTab }) => !selectedTab?.disabled), tap((state) => {
165
+ merge(this.keyManager.change.pipe(tap((index) => this.selectedIndex.set(index ?? -1))), fromElementResize$(this.element.nativeElement, 600).pipe(tap(() => this.scrollableService.scrollActiveItemIntoHorizontalView(this.activeItem()?.element.nativeElement ?? null))), toObservable(tabState).pipe(skip(1), distinctUntilChanged((a, b) => a.selectedIndex === b.selectedIndex), filter(({ selectedTab }) => !selectedTab?.disabled), tap((state) => {
166
166
  this.selectedTabChanged.emit(state);
167
- this.scrollableService.scrollActiveItemIntoView(state.selectedTab?.element.nativeElement ?? null);
167
+ this.scrollableService.scrollActiveItemIntoHorizontalView(state.selectedTab?.element.nativeElement ?? null);
168
168
  })))
169
169
  .pipe(this.takeUntilDestroyed())
170
170
  .subscribe();
@@ -207,7 +207,7 @@ let TabBarComponent = class TabBarComponent {
207
207
  return;
208
208
  if (this.scrollableService.visibleItems().includes(activeItem))
209
209
  return;
210
- this.scrollableService.scrollActiveItemIntoView(activeItem);
210
+ this.scrollableService.scrollActiveItemIntoHorizontalView(activeItem);
211
211
  }
212
212
  scrollTabs(direction = 1) {
213
213
  this.scrollableService.scroll(direction);
@@ -1 +1 @@
1
- {"version":3,"file":"odx-angular-components-tab-bar.mjs","sources":["../../../../libs/angular/components/tab-bar/src/lib/tab-bar.config.ts","../../../../libs/angular/components/tab-bar/src/lib/components/tab-bar-item/tab-bar-item.component.ts","../../../../libs/angular/components/tab-bar/src/lib/components/tab-bar-item/tab-bar-item.component.html","../../../../libs/angular/components/tab-bar/src/lib/tab-bar.component.ts","../../../../libs/angular/components/tab-bar/src/lib/tab-bar.component.html","../../../../libs/angular/components/tab-bar/src/lib/tab-bar.module.ts","../../../../libs/angular/components/tab-bar/src/odx-angular-components-tab-bar.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { TabBarComponent } from './tab-bar.component';\n\nexport const TAB_BAR = new InjectionToken<TabBarComponent>('tabBar');\n","import { Highlightable } from '@angular/cdk/a11y';\nimport { CommonModule } from '@angular/common';\nimport { booleanAttribute, ChangeDetectionStrategy, Component, ElementRef, inject, input, OnInit, output, ViewEncapsulation } from '@angular/core';\nimport { RouterLinkActive } from '@angular/router';\nimport { DisabledController } from '@odx/angular';\nimport { IconComponent } from '@odx/angular/components/icon';\nimport { CSSComponent } from '@odx/angular/internal';\nimport { deferFn, untilDestroyed } from '@odx/angular/utils';\nimport { filter } from 'rxjs';\nimport { TAB_BAR } from '../../tab-bar.config';\n\n/**\n * Represents an individual tab item in a tab bar interface, providing functionalities\n * for activation, deactivation, and optional closing of the tab. This component is designed\n * to be used within a `TabBarComponent` to create a complete tabbed interface.\n *\n * It supports disabled state management through `DisabledController`, allowing the tab to be\n * disabled based on parent component states or its own `disabled` input property.\n *\n * The component integrates with Angular's `RouterLinkActive` to automatically set active\n * styles based on the current router state, enhancing SPA navigation experiences.\n */\n@CSSComponent('tab-bar-item')\n@Component({\n selector: 'odx-tab-bar-item',\n standalone: true,\n imports: [CommonModule, IconComponent],\n templateUrl: './tab-bar-item.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [DisabledController.connect()],\n host: {\n '[class.is-disabled]': 'disabled',\n '[class.is-active]': 'isActive',\n '[attr.aria-selected]': 'isActive',\n '[class.is-closable]': 'closable()',\n role: 'tab',\n '(click)': 'onClick()',\n },\n})\nexport class TabBarItemComponent implements Highlightable, OnInit {\n private readonly disabledController = DisabledController.inject();\n private readonly tabBar = inject(TAB_BAR);\n private readonly routerLinkActive = inject(RouterLinkActive, { optional: true, self: true });\n private readonly takeUntilDestroyed = untilDestroyed();\n\n protected isActive = false;\n\n public readonly element: ElementRef<HTMLElement> = inject(ElementRef);\n\n public get disabled(): boolean {\n return !!this.disabledController?.disabled;\n }\n\n /**\n * Indicates if the tab can be closed. This controls the visibility of the close button\n * and enables the emission of the `tabClose` event when the tab is closed.\n *\n * @type {boolean}\n * @default false\n */\n public closable = input(false, { transform: booleanAttribute });\n\n /**\n * Event emitter that fires when the tab is closed. It emits the instance of the tab item component.\n *\n * @emits {TabBarItemComponent}\n */\n public tabClose = output<TabBarItemComponent>();\n\n public ngOnInit(): void {\n this.routerLinkActive?.isActiveChange.pipe(this.takeUntilDestroyed(), filter(Boolean)).subscribe(() => {\n this.onClick();\n });\n }\n\n /**\n * Sets the tab as active and applies corresponding styles. This method is part of the\n * `Highlightable` interface, allowing the tab bar to manage active states.\n */\n public setActiveStyles(): void {\n deferFn(() => (this.isActive = true));\n }\n\n /**\n * Sets the tab as inactive and removes corresponding active styles. This method is part of the\n * `Highlightable` interface.\n */\n public setInactiveStyles(): void {\n deferFn(() => (this.isActive = false));\n }\n\n protected onClick(): void {\n if (this.disabled) return;\n this.tabBar.activateItem(this);\n }\n\n protected handleClose(event: Event): void {\n event.stopPropagation();\n if (this.disabled || !this.closable()) return;\n this.tabBar.removeItem(this);\n this.tabClose.emit(this);\n }\n}\n","<ng-content select=\"odx-icon\" />\n<div class=\"odx-tab-bar-item__label\"><ng-content /></div>\n@if (closable()) {\n <odx-icon name=\"close\" iconSet=\"core\" size=\"small\" (click)=\"handleClose($event)\" />\n}\n","import { ActiveDescendantKeyManager } from '@angular/cdk/a11y';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n effect,\n ElementRef,\n forwardRef,\n inject,\n Injector,\n model,\n output,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { ActiveIndicatorDirective } from '@odx/angular/cdk/active-indicator';\nimport { ScrollableService } from '@odx/angular/cdk/scrollable';\nimport { IconComponent } from '@odx/angular/components/icon';\nimport { CSSComponent } from '@odx/angular/internal';\nimport { fromElementResize$ } from '@odx/angular/rxjs';\nimport { injectElement, untilDestroyed } from '@odx/angular/utils';\nimport { distinctUntilChanged, filter, merge, skip, tap } from 'rxjs';\nimport { TabBarItemComponent } from './components';\nimport { TabChangeEvent } from './models';\nimport { TAB_BAR } from './tab-bar.config';\n\n/**\n * `TabBarComponent` creates a dynamic and accessible tab bar interface,\n * facilitating the management and interaction with a collection of tabs.\n * It supports keyboard navigation, dynamic tab management, and responsive overflow actions.\n *\n * The component integrates with Angular's ContentChildren to dynamically manage the tabs based on their content.\n * It uses ActiveDescendantKeyManager from Angular CDK for managing focus and keyboard navigation,\n * making it accessible and user-friendly. Additionally, it handles overflow with navigational arrows,\n * allowing for a smooth user experience even with a large number of tabs.\n */\n@CSSComponent('tab-bar')\n@Component({\n selector: 'odx-tab-bar',\n standalone: true,\n imports: [CommonModule, IconComponent, ActiveIndicatorDirective],\n templateUrl: './tab-bar.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: TAB_BAR, useExisting: forwardRef(() => TabBarComponent) }, ScrollableService],\n host: {\n role: 'tabpanel',\n tabindex: '0',\n '[class.odx-tab-bar--overflow-left]': '!!prevTab()',\n '[class.odx-tab-bar--overflow-right]': '!!nextTab()',\n '(keydown)': 'onKeydown($event)',\n '(focus)': 'onFocused()',\n },\n})\nexport class TabBarComponent {\n private readonly takeUntilDestroyed = untilDestroyed();\n private readonly scrollableService = inject(ScrollableService);\n\n protected readonly nextTab = this.scrollableService.nextItem;\n protected readonly prevTab = this.scrollableService.prevItem;\n\n protected readonly tabs = contentChildren<TabBarItemComponent>(TabBarItemComponent);\n protected readonly activeItem = computed(() => this.tabs().at(this.selectedIndex()) ?? null);\n protected readonly keyManager: ActiveDescendantKeyManager<TabBarItemComponent> = new ActiveDescendantKeyManager(this.tabs, inject(Injector))\n .withWrap()\n .withHomeAndEnd()\n .withHorizontalOrientation('ltr')\n .withVerticalOrientation(false);\n\n protected readonly scrollContainerElement = viewChild.required<ElementRef<HTMLElement>>('scrollContainer');\n public readonly element = injectElement();\n\n /**\n * Index of the currently selected tab. Use this property to programmatically\n * change the active tab. It responds to changes by updating the active state of the corresponding\n * tab item and adjusting the view if necessary.\n *\n * @type {number}\n * @example\n * Programmatically select the second tab (index starts from 0):\n * ```html\n * <odx-tab-bar [selectedIndex]=\"1\"></odx-tab-bar>\n * ```\n */\n public selectedIndex = model<number>(0);\n\n /**\n * An EventEmitter that emits whenever a new tab is selected. It provides the `TabChangeEvent`\n * which contains the index of the newly selected tab and the instance of the corresponding\n * `TabBarItemComponent`. Subscribe to this output to perform actions when the active tab changes.\n *\n * @emits {TabChangeEvent}\n * @example\n * ```html\n * <odx-tab-bar (selectedTabChanged)=\"onTabChange($event)\"></odx-tab-bar>\n * ```\n *\n * ```ts\n * onTabChange(event: TabChangeEvent): void {\n * console.log(`New active tab index: ${event.selectedIndex}`);\n * }\n * ```\n */\n public selectedTabChanged = output<TabChangeEvent>();\n\n constructor() {\n const tabState = computed(() => ({\n selectedIndex: this.selectedIndex(),\n selectedTab: this.activeItem(),\n }));\n\n merge(\n this.keyManager.change.pipe(tap((index) => this.selectedIndex.set(index ?? -1))),\n fromElementResize$(this.element.nativeElement, 600).pipe(\n tap(() => this.scrollableService.scrollActiveItemIntoView(this.activeItem()?.element.nativeElement ?? null)),\n ),\n toObservable(tabState).pipe(\n skip(1),\n distinctUntilChanged((a, b) => a.selectedIndex === b.selectedIndex),\n filter(({ selectedTab }) => !selectedTab?.disabled),\n tap((state) => {\n this.selectedTabChanged.emit(state);\n this.scrollableService.scrollActiveItemIntoView(state.selectedTab?.element.nativeElement ?? null);\n }),\n ),\n )\n .pipe(this.takeUntilDestroyed())\n .subscribe();\n\n effect(\n () => {\n this.keyManager.setActiveItem(this.selectedIndex());\n },\n { allowSignalWrites: true },\n );\n\n effect(() => {\n this.scrollableService.observe(this.scrollContainerElement(), this.tabs());\n });\n }\n\n /**\n * Activates the specified tab item, making it the currently selected tab.\n * If the item is already active, no action is taken.\n *\n * @param {TabBarItemComponent | null} item - The tab item to activate.\n */\n public activateItem(item?: TabBarItemComponent | null): void {\n if (item === this.keyManager?.activeItem) return;\n const selectedIndex = item ? this.tabs().indexOf(item) : -1;\n this.selectedIndex.set(selectedIndex);\n }\n\n /**\n * Fires when the specified tab item is removed from the tab bar.\n * If the item is currently active, the previous tab is activated.\n *\n * @param {TabBarItemComponent} item - The tab item to remove.\n */\n public removeItem(item: TabBarItemComponent): void {\n if (this.keyManager?.activeItem !== item) return;\n this.keyManager?.setPreviousItemActive();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n this.keyManager?.onKeydown(event);\n }\n\n protected onFocused(): void {\n const activeItem = this.activeItem()?.element.nativeElement;\n if (!activeItem) return;\n if (this.scrollableService.visibleItems().includes(activeItem)) return;\n this.scrollableService.scrollActiveItemIntoView(activeItem);\n }\n\n protected scrollTabs(direction: 1 | -1 = 1): void {\n this.scrollableService.scroll(direction);\n }\n}\n","<button #tabAction class=\"odx-tab-bar__action odx-tab-bar__action--prev\" [class.is-active]=\"!!prevTab()\" (click)=\"scrollTabs(-1)\" tabindex=\"-1\">\n <odx-icon class=\"tab-bar-action-icon\" name=\"chevron-left\" iconSet=\"core\" />\n</button>\n<div class=\"odx-tab-bar__inner\" #scrollContainer tabindex=\"-1\">\n <div class=\"odx-tab-bar__panel\" role=\"tablist\" #tabBarPanel>\n <ng-content />\n <div class=\"odx-tab-bar__indicator\" [odxActiveIndicator]=\"activeItem()?.element?.nativeElement\" odxActiveIndicatorPosition=\"start\"></div>\n </div>\n</div>\n<button #tabAction class=\"odx-tab-bar__action odx-tab-bar__action--next\" [class.is-active]=\"!!nextTab()\" (click)=\"scrollTabs()\" tabindex=\"-1\">\n <odx-icon class=\"tab-bar-action-icon\" name=\"chevron-right\" iconSet=\"core\" />\n</button>\n","import { NgModule } from '@angular/core';\nimport { CoreModule } from '@odx/angular';\nimport { TabBarItemComponent } from './components';\nimport { TabBarComponent } from './tab-bar.component';\n\nconst modules = [TabBarComponent, TabBarItemComponent];\n\n@NgModule({\n imports: modules,\n exports: [CoreModule, ...modules],\n})\nexport class TabBarModule {}\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-tab-bar.mjs","sources":["../../../../libs/angular/components/tab-bar/src/lib/tab-bar.config.ts","../../../../libs/angular/components/tab-bar/src/lib/components/tab-bar-item/tab-bar-item.component.ts","../../../../libs/angular/components/tab-bar/src/lib/components/tab-bar-item/tab-bar-item.component.html","../../../../libs/angular/components/tab-bar/src/lib/tab-bar.component.ts","../../../../libs/angular/components/tab-bar/src/lib/tab-bar.component.html","../../../../libs/angular/components/tab-bar/src/lib/tab-bar.module.ts","../../../../libs/angular/components/tab-bar/src/odx-angular-components-tab-bar.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { TabBarComponent } from './tab-bar.component';\n\nexport const TAB_BAR = new InjectionToken<TabBarComponent>('tabBar');\n","import { Highlightable } from '@angular/cdk/a11y';\nimport { CommonModule } from '@angular/common';\nimport { booleanAttribute, ChangeDetectionStrategy, Component, ElementRef, inject, input, OnInit, output, ViewEncapsulation } from '@angular/core';\nimport { RouterLinkActive } from '@angular/router';\nimport { DisabledController } from '@odx/angular';\nimport { IconComponent } from '@odx/angular/components/icon';\nimport { CSSComponent } from '@odx/angular/internal';\nimport { deferFn, untilDestroyed } from '@odx/angular/utils';\nimport { filter } from 'rxjs';\nimport { TAB_BAR } from '../../tab-bar.config';\n\n/**\n * Represents an individual tab item in a tab bar interface, providing functionalities\n * for activation, deactivation, and optional closing of the tab. This component is designed\n * to be used within a `TabBarComponent` to create a complete tabbed interface.\n *\n * It supports disabled state management through `DisabledController`, allowing the tab to be\n * disabled based on parent component states or its own `disabled` input property.\n *\n * The component integrates with Angular's `RouterLinkActive` to automatically set active\n * styles based on the current router state, enhancing SPA navigation experiences.\n */\n@CSSComponent('tab-bar-item')\n@Component({\n selector: 'odx-tab-bar-item',\n standalone: true,\n imports: [CommonModule, IconComponent],\n templateUrl: './tab-bar-item.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [DisabledController.connect()],\n host: {\n '[class.is-disabled]': 'disabled',\n '[class.is-active]': 'isActive',\n '[attr.aria-selected]': 'isActive',\n '[class.is-closable]': 'closable()',\n role: 'tab',\n '(click)': 'onClick()',\n },\n})\nexport class TabBarItemComponent implements Highlightable, OnInit {\n private readonly disabledController = DisabledController.inject();\n private readonly tabBar = inject(TAB_BAR);\n private readonly routerLinkActive = inject(RouterLinkActive, { optional: true, self: true });\n private readonly takeUntilDestroyed = untilDestroyed();\n\n protected isActive = false;\n\n public readonly element: ElementRef<HTMLElement> = inject(ElementRef);\n\n public get disabled(): boolean {\n return !!this.disabledController?.disabled;\n }\n\n /**\n * Indicates if the tab can be closed. This controls the visibility of the close button\n * and enables the emission of the `tabClose` event when the tab is closed.\n *\n * @type {boolean}\n * @default false\n */\n public closable = input(false, { transform: booleanAttribute });\n\n /**\n * Event emitter that fires when the tab is closed. It emits the instance of the tab item component.\n *\n * @emits {TabBarItemComponent}\n */\n public tabClose = output<TabBarItemComponent>();\n\n public ngOnInit(): void {\n this.routerLinkActive?.isActiveChange.pipe(this.takeUntilDestroyed(), filter(Boolean)).subscribe(() => {\n this.onClick();\n });\n }\n\n /**\n * Sets the tab as active and applies corresponding styles. This method is part of the\n * `Highlightable` interface, allowing the tab bar to manage active states.\n */\n public setActiveStyles(): void {\n deferFn(() => (this.isActive = true));\n }\n\n /**\n * Sets the tab as inactive and removes corresponding active styles. This method is part of the\n * `Highlightable` interface.\n */\n public setInactiveStyles(): void {\n deferFn(() => (this.isActive = false));\n }\n\n protected onClick(): void {\n if (this.disabled) return;\n this.tabBar.activateItem(this);\n }\n\n protected handleClose(event: Event): void {\n event.stopPropagation();\n if (this.disabled || !this.closable()) return;\n this.tabBar.removeItem(this);\n this.tabClose.emit(this);\n }\n}\n","<ng-content select=\"odx-icon\" />\n<div class=\"odx-tab-bar-item__label\"><ng-content /></div>\n@if (closable()) {\n <odx-icon name=\"close\" iconSet=\"core\" size=\"small\" (click)=\"handleClose($event)\" />\n}\n","import { ActiveDescendantKeyManager } from '@angular/cdk/a11y';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n effect,\n ElementRef,\n forwardRef,\n inject,\n Injector,\n model,\n output,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { ActiveIndicatorDirective } from '@odx/angular/cdk/active-indicator';\nimport { ScrollableService } from '@odx/angular/cdk/scrollable';\nimport { IconComponent } from '@odx/angular/components/icon';\nimport { CSSComponent } from '@odx/angular/internal';\nimport { fromElementResize$ } from '@odx/angular/rxjs';\nimport { injectElement, untilDestroyed } from '@odx/angular/utils';\nimport { distinctUntilChanged, filter, merge, skip, tap } from 'rxjs';\nimport { TabBarItemComponent } from './components';\nimport { TabChangeEvent } from './models';\nimport { TAB_BAR } from './tab-bar.config';\n\n/**\n * `TabBarComponent` creates a dynamic and accessible tab bar interface,\n * facilitating the management and interaction with a collection of tabs.\n * It supports keyboard navigation, dynamic tab management, and responsive overflow actions.\n *\n * The component integrates with Angular's ContentChildren to dynamically manage the tabs based on their content.\n * It uses ActiveDescendantKeyManager from Angular CDK for managing focus and keyboard navigation,\n * making it accessible and user-friendly. Additionally, it handles overflow with navigational arrows,\n * allowing for a smooth user experience even with a large number of tabs.\n */\n@CSSComponent('tab-bar')\n@Component({\n selector: 'odx-tab-bar',\n standalone: true,\n imports: [CommonModule, IconComponent, ActiveIndicatorDirective],\n templateUrl: './tab-bar.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: TAB_BAR, useExisting: forwardRef(() => TabBarComponent) }, ScrollableService],\n host: {\n role: 'tabpanel',\n tabindex: '0',\n '[class.odx-tab-bar--overflow-left]': '!!prevTab()',\n '[class.odx-tab-bar--overflow-right]': '!!nextTab()',\n '(keydown)': 'onKeydown($event)',\n '(focus)': 'onFocused()',\n },\n})\nexport class TabBarComponent {\n private readonly takeUntilDestroyed = untilDestroyed();\n private readonly scrollableService = inject(ScrollableService);\n\n protected readonly nextTab = this.scrollableService.nextItem;\n protected readonly prevTab = this.scrollableService.prevItem;\n\n protected readonly tabs = contentChildren<TabBarItemComponent>(TabBarItemComponent);\n protected readonly activeItem = computed(() => this.tabs().at(this.selectedIndex()) ?? null);\n protected readonly keyManager: ActiveDescendantKeyManager<TabBarItemComponent> = new ActiveDescendantKeyManager(this.tabs, inject(Injector))\n .withWrap()\n .withHomeAndEnd()\n .withHorizontalOrientation('ltr')\n .withVerticalOrientation(false);\n\n protected readonly scrollContainerElement = viewChild.required<ElementRef<HTMLElement>>('scrollContainer');\n public readonly element = injectElement();\n\n /**\n * Index of the currently selected tab. Use this property to programmatically\n * change the active tab. It responds to changes by updating the active state of the corresponding\n * tab item and adjusting the view if necessary.\n *\n * @type {number}\n * @example\n * Programmatically select the second tab (index starts from 0):\n * ```html\n * <odx-tab-bar [selectedIndex]=\"1\"></odx-tab-bar>\n * ```\n */\n public selectedIndex = model<number>(0);\n\n /**\n * An EventEmitter that emits whenever a new tab is selected. It provides the `TabChangeEvent`\n * which contains the index of the newly selected tab and the instance of the corresponding\n * `TabBarItemComponent`. Subscribe to this output to perform actions when the active tab changes.\n *\n * @emits {TabChangeEvent}\n * @example\n * ```html\n * <odx-tab-bar (selectedTabChanged)=\"onTabChange($event)\"></odx-tab-bar>\n * ```\n *\n * ```ts\n * onTabChange(event: TabChangeEvent): void {\n * console.log(`New active tab index: ${event.selectedIndex}`);\n * }\n * ```\n */\n public selectedTabChanged = output<TabChangeEvent>();\n\n constructor() {\n const tabState = computed(() => ({\n selectedIndex: this.selectedIndex(),\n selectedTab: this.activeItem(),\n }));\n\n merge(\n this.keyManager.change.pipe(tap((index) => this.selectedIndex.set(index ?? -1))),\n fromElementResize$(this.element.nativeElement, 600).pipe(\n tap(() => this.scrollableService.scrollActiveItemIntoHorizontalView(this.activeItem()?.element.nativeElement ?? null)),\n ),\n toObservable(tabState).pipe(\n skip(1),\n distinctUntilChanged((a, b) => a.selectedIndex === b.selectedIndex),\n filter(({ selectedTab }) => !selectedTab?.disabled),\n tap((state) => {\n this.selectedTabChanged.emit(state);\n this.scrollableService.scrollActiveItemIntoHorizontalView(state.selectedTab?.element.nativeElement ?? null);\n }),\n ),\n )\n .pipe(this.takeUntilDestroyed())\n .subscribe();\n\n effect(\n () => {\n this.keyManager.setActiveItem(this.selectedIndex());\n },\n { allowSignalWrites: true },\n );\n\n effect(() => {\n this.scrollableService.observe(this.scrollContainerElement(), this.tabs());\n });\n }\n\n /**\n * Activates the specified tab item, making it the currently selected tab.\n * If the item is already active, no action is taken.\n *\n * @param {TabBarItemComponent | null} item - The tab item to activate.\n */\n public activateItem(item?: TabBarItemComponent | null): void {\n if (item === this.keyManager?.activeItem) return;\n const selectedIndex = item ? this.tabs().indexOf(item) : -1;\n this.selectedIndex.set(selectedIndex);\n }\n\n /**\n * Fires when the specified tab item is removed from the tab bar.\n * If the item is currently active, the previous tab is activated.\n *\n * @param {TabBarItemComponent} item - The tab item to remove.\n */\n public removeItem(item: TabBarItemComponent): void {\n if (this.keyManager?.activeItem !== item) return;\n this.keyManager?.setPreviousItemActive();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n this.keyManager?.onKeydown(event);\n }\n\n protected onFocused(): void {\n const activeItem = this.activeItem()?.element.nativeElement;\n if (!activeItem) return;\n if (this.scrollableService.visibleItems().includes(activeItem)) return;\n this.scrollableService.scrollActiveItemIntoHorizontalView(activeItem);\n }\n\n protected scrollTabs(direction: 1 | -1 = 1): void {\n this.scrollableService.scroll(direction);\n }\n}\n","<button #tabAction class=\"odx-tab-bar__action odx-tab-bar__action--prev\" [class.is-active]=\"!!prevTab()\" (click)=\"scrollTabs(-1)\" tabindex=\"-1\">\n <odx-icon class=\"tab-bar-action-icon\" name=\"chevron-left\" iconSet=\"core\" />\n</button>\n<div class=\"odx-tab-bar__inner\" #scrollContainer tabindex=\"-1\">\n <div class=\"odx-tab-bar__panel\" role=\"tablist\" #tabBarPanel>\n <ng-content />\n <div class=\"odx-tab-bar__indicator\" [odxActiveIndicator]=\"activeItem()?.element?.nativeElement\" odxActiveIndicatorPosition=\"start\"></div>\n </div>\n</div>\n<button #tabAction class=\"odx-tab-bar__action odx-tab-bar__action--next\" [class.is-active]=\"!!nextTab()\" (click)=\"scrollTabs()\" tabindex=\"-1\">\n <odx-icon class=\"tab-bar-action-icon\" name=\"chevron-right\" iconSet=\"core\" />\n</button>\n","import { NgModule } from '@angular/core';\nimport { CoreModule } from '@odx/angular';\nimport { TabBarItemComponent } from './components';\nimport { TabBarComponent } from './tab-bar.component';\n\nconst modules = [TabBarComponent, TabBarItemComponent];\n\n@NgModule({\n imports: modules,\n exports: [CoreModule, ...modules],\n})\nexport class TabBarModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, ChangeDetectorRef, Directive, InjectionToken, Optional, Host, forwardRef, booleanAttribute, Input, ElementRef, Renderer2, EventEmitter, Output, HostListener, signal, NgModule, reflectComponentType, Injectable } from '@angular/core';
3
3
  import { pluckFromArray, isPresent, injectElement, hasChanged, deferFn, booleanToOptionalAttributeString, reactiveAttributeBinding, getLanguageCode } from '@odx/angular/utils';
4
- import { merge, EMPTY, tap, Subject, shareReplay, map, distinctUntilChanged, switchMap, NEVER, debounceTime, Observable, of, startWith, combineLatest, filter } from 'rxjs';
4
+ import { EMPTY, merge, tap, Subject, shareReplay, map, distinctUntilChanged, switchMap, NEVER, debounceTime, Observable, startWith, of, combineLatest, filter } from 'rxjs';
5
5
  import { CommonModule, DOCUMENT } from '@angular/common';
6
6
  import { toObservable } from '@angular/core/rxjs-interop';
7
7
  import { Title } from '@angular/platform-browser';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@odx/angular",
3
- "version": "12.25.0",
3
+ "version": "12.25.1",
4
4
  "author": "Drägerwerk AG & Co.KGaA",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "peerDependencies": {
@@ -286,23 +286,17 @@
286
286
  "esm": "./esm2022/components/daterangepicker/odx-angular-components-daterangepicker.mjs",
287
287
  "default": "./fesm2022/odx-angular-components-daterangepicker.mjs"
288
288
  },
289
- "./components/error-page": {
290
- "types": "./components/error-page/index.d.ts",
291
- "esm2022": "./esm2022/components/error-page/odx-angular-components-error-page.mjs",
292
- "esm": "./esm2022/components/error-page/odx-angular-components-error-page.mjs",
293
- "default": "./fesm2022/odx-angular-components-error-page.mjs"
294
- },
295
289
  "./components/dropdown": {
296
290
  "types": "./components/dropdown/index.d.ts",
297
291
  "esm2022": "./esm2022/components/dropdown/odx-angular-components-dropdown.mjs",
298
292
  "esm": "./esm2022/components/dropdown/odx-angular-components-dropdown.mjs",
299
293
  "default": "./fesm2022/odx-angular-components-dropdown.mjs"
300
294
  },
301
- "./components/form-field": {
302
- "types": "./components/form-field/index.d.ts",
303
- "esm2022": "./esm2022/components/form-field/odx-angular-components-form-field.mjs",
304
- "esm": "./esm2022/components/form-field/odx-angular-components-form-field.mjs",
305
- "default": "./fesm2022/odx-angular-components-form-field.mjs"
295
+ "./components/error-page": {
296
+ "types": "./components/error-page/index.d.ts",
297
+ "esm2022": "./esm2022/components/error-page/odx-angular-components-error-page.mjs",
298
+ "esm": "./esm2022/components/error-page/odx-angular-components-error-page.mjs",
299
+ "default": "./fesm2022/odx-angular-components-error-page.mjs"
306
300
  },
307
301
  "./components/footer": {
308
302
  "types": "./components/footer/index.d.ts",
@@ -310,6 +304,12 @@
310
304
  "esm": "./esm2022/components/footer/odx-angular-components-footer.mjs",
311
305
  "default": "./fesm2022/odx-angular-components-footer.mjs"
312
306
  },
307
+ "./components/form-field": {
308
+ "types": "./components/form-field/index.d.ts",
309
+ "esm2022": "./esm2022/components/form-field/odx-angular-components-form-field.mjs",
310
+ "esm": "./esm2022/components/form-field/odx-angular-components-form-field.mjs",
311
+ "default": "./fesm2022/odx-angular-components-form-field.mjs"
312
+ },
313
313
  "./components/header": {
314
314
  "types": "./components/header/index.d.ts",
315
315
  "esm2022": "./esm2022/components/header/odx-angular-components-header.mjs",
@@ -328,36 +328,36 @@
328
328
  "esm": "./esm2022/components/icon/odx-angular-components-icon.mjs",
329
329
  "default": "./fesm2022/odx-angular-components-icon.mjs"
330
330
  },
331
- "./components/inline-message": {
332
- "types": "./components/inline-message/index.d.ts",
333
- "esm2022": "./esm2022/components/inline-message/odx-angular-components-inline-message.mjs",
334
- "esm": "./esm2022/components/inline-message/odx-angular-components-inline-message.mjs",
335
- "default": "./fesm2022/odx-angular-components-inline-message.mjs"
336
- },
337
331
  "./components/link": {
338
332
  "types": "./components/link/index.d.ts",
339
333
  "esm2022": "./esm2022/components/link/odx-angular-components-link.mjs",
340
334
  "esm": "./esm2022/components/link/odx-angular-components-link.mjs",
341
335
  "default": "./fesm2022/odx-angular-components-link.mjs"
342
336
  },
337
+ "./components/inline-message": {
338
+ "types": "./components/inline-message/index.d.ts",
339
+ "esm2022": "./esm2022/components/inline-message/odx-angular-components-inline-message.mjs",
340
+ "esm": "./esm2022/components/inline-message/odx-angular-components-inline-message.mjs",
341
+ "default": "./fesm2022/odx-angular-components-inline-message.mjs"
342
+ },
343
343
  "./components/list": {
344
344
  "types": "./components/list/index.d.ts",
345
345
  "esm2022": "./esm2022/components/list/odx-angular-components-list.mjs",
346
346
  "esm": "./esm2022/components/list/odx-angular-components-list.mjs",
347
347
  "default": "./fesm2022/odx-angular-components-list.mjs"
348
348
  },
349
- "./components/logo": {
350
- "types": "./components/logo/index.d.ts",
351
- "esm2022": "./esm2022/components/logo/odx-angular-components-logo.mjs",
352
- "esm": "./esm2022/components/logo/odx-angular-components-logo.mjs",
353
- "default": "./fesm2022/odx-angular-components-logo.mjs"
354
- },
355
349
  "./components/loading-spinner": {
356
350
  "types": "./components/loading-spinner/index.d.ts",
357
351
  "esm2022": "./esm2022/components/loading-spinner/odx-angular-components-loading-spinner.mjs",
358
352
  "esm": "./esm2022/components/loading-spinner/odx-angular-components-loading-spinner.mjs",
359
353
  "default": "./fesm2022/odx-angular-components-loading-spinner.mjs"
360
354
  },
355
+ "./components/logo": {
356
+ "types": "./components/logo/index.d.ts",
357
+ "esm2022": "./esm2022/components/logo/odx-angular-components-logo.mjs",
358
+ "esm": "./esm2022/components/logo/odx-angular-components-logo.mjs",
359
+ "default": "./fesm2022/odx-angular-components-logo.mjs"
360
+ },
361
361
  "./components/main-menu": {
362
362
  "types": "./components/main-menu/index.d.ts",
363
363
  "esm2022": "./esm2022/components/main-menu/odx-angular-components-main-menu.mjs",