@odx/angular 12.19.1 → 12.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import { __decorate } from "tslib";
2
2
  import { CommonModule } from '@angular/common';
3
- import { booleanAttribute, ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostListener, inject, Input, Output, ViewEncapsulation, } from '@angular/core';
3
+ import { booleanAttribute, ChangeDetectionStrategy, Component, ElementRef, inject, input, output, ViewEncapsulation } from '@angular/core';
4
4
  import { RouterLinkActive } from '@angular/router';
5
5
  import { DisabledController } from '@odx/angular';
6
6
  import { IconComponent } from '@odx/angular/components/icon';
@@ -35,13 +35,13 @@ let TabBarItemComponent = class TabBarItemComponent {
35
35
  * @type {boolean}
36
36
  * @default false
37
37
  */
38
- this.closable = false;
38
+ this.closable = input(false, { transform: booleanAttribute });
39
39
  /**
40
40
  * Event emitter that fires when the tab is closed. It emits the instance of the tab item component.
41
41
  *
42
42
  * @emits {TabBarItemComponent}
43
43
  */
44
- this.tabClose = new EventEmitter();
44
+ this.tabClose = output();
45
45
  }
46
46
  get disabled() {
47
47
  return !!this.disabledController?.disabled;
@@ -72,13 +72,13 @@ let TabBarItemComponent = class TabBarItemComponent {
72
72
  }
73
73
  handleClose(event) {
74
74
  event.stopPropagation();
75
- if (this.disabled || !this.closable)
75
+ if (this.disabled || !this.closable())
76
76
  return;
77
77
  this.tabBar.removeItem(this);
78
78
  this.tabClose.emit(this);
79
79
  }
80
80
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TabBarItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
81
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: TabBarItemComponent, isStandalone: true, selector: "odx-tab-bar-item", inputs: { closable: ["closable", "closable", booleanAttribute] }, outputs: { tabClose: "tabClose" }, host: { attributes: { "role": "tab" }, listeners: { "click": "onClick()" }, properties: { "class.is-disabled": "disabled", "class.is-active": "isActive", "attr.aria-selected": "isActive", "class.is-closable": "closable" } }, providers: [DisabledController.connect()], ngImport: i0, template: "<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", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
81
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: TabBarItemComponent, isStandalone: true, selector: "odx-tab-bar-item", inputs: { closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { tabClose: "tabClose" }, host: { attributes: { "role": "tab" }, listeners: { "click": "onClick()" }, properties: { "class.is-disabled": "disabled", "class.is-active": "isActive", "attr.aria-selected": "isActive", "class.is-closable": "closable()" } }, providers: [DisabledController.connect()], ngImport: i0, template: "<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", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
82
82
  };
83
83
  TabBarItemComponent = __decorate([
84
84
  CSSComponent('tab-bar-item')
@@ -90,16 +90,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
90
90
  '[class.is-disabled]': 'disabled',
91
91
  '[class.is-active]': 'isActive',
92
92
  '[attr.aria-selected]': 'isActive',
93
- '[class.is-closable]': 'closable',
93
+ '[class.is-closable]': 'closable()',
94
94
  role: 'tab',
95
- }, template: "<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" }]
96
- }], propDecorators: { closable: [{
97
- type: Input,
98
- args: [{ transform: booleanAttribute }]
99
- }], tabClose: [{
100
- type: Output
101
- }], onClick: [{
102
- type: HostListener,
103
- args: ['click']
104
- }] } });
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWJhci1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL3RhYi1iYXIvc3JjL2xpYi9jb21wb25lbnRzL3RhYi1iYXItaXRlbS90YWItYmFyLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvdGFiLWJhci9zcmMvbGliL2NvbXBvbmVudHMvdGFiLWJhci1pdGVtL3RhYi1iYXItaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFFL0M7Ozs7Ozs7Ozs7R0FVRztBQWtCSSxJQUFNLG1CQUFtQixHQUF6QixNQUFNLG1CQUFtQjtJQUF6QjtRQUNZ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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSGlnaGxpZ2h0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlckxpbmtBY3RpdmUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRGlzYWJsZWRDb250cm9sbGVyIH0gZnJvbSAnQG9keC9hbmd1bGFyJztcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9pY29uJztcbmltcG9ydCB7IENTU0NvbXBvbmVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci9pbnRlcm5hbCc7XG5pbXBvcnQgeyBkZWZlckZuLCB1bnRpbERlc3Ryb3llZCB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRBQl9CQVIgfSBmcm9tICcuLi8uLi90YWItYmFyLmNvbmZpZyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIHRhYiBpdGVtIGluIGEgdGFiIGJhciBpbnRlcmZhY2UsIHByb3ZpZGluZyBmdW5jdGlvbmFsaXRpZXNcbiAqIGZvciBhY3RpdmF0aW9uLCBkZWFjdGl2YXRpb24sIGFuZCBvcHRpb25hbCBjbG9zaW5nIG9mIHRoZSB0YWIuIFRoaXMgY29tcG9uZW50IGlzIGRlc2lnbmVkXG4gKiB0byBiZSB1c2VkIHdpdGhpbiBhIGBUYWJCYXJDb21wb25lbnRgIHRvIGNyZWF0ZSBhIGNvbXBsZXRlIHRhYmJlZCBpbnRlcmZhY2UuXG4gKlxuICogSXQgc3VwcG9ydHMgZGlzYWJsZWQgc3RhdGUgbWFuYWdlbWVudCB0aHJvdWdoIGBEaXNhYmxlZENvbnRyb2xsZXJgLCBhbGxvd2luZyB0aGUgdGFiIHRvIGJlXG4gKiBkaXNhYmxlZCBiYXNlZCBvbiBwYXJlbnQgY29tcG9uZW50IHN0YXRlcyBvciBpdHMgb3duIGBkaXNhYmxlZGAgaW5wdXQgcHJvcGVydHkuXG4gKlxuICogVGhlIGNvbXBvbmVudCBpbnRlZ3JhdGVzIHdpdGggQW5ndWxhcidzIGBSb3V0ZXJMaW5rQWN0aXZlYCB0byBhdXRvbWF0aWNhbGx5IHNldCBhY3RpdmVcbiAqIHN0eWxlcyBiYXNlZCBvbiB0aGUgY3VycmVudCByb3V0ZXIgc3RhdGUsIGVuaGFuY2luZyBTUEEgbmF2aWdhdGlvbiBleHBlcmllbmNlcy5cbiAqL1xuQENTU0NvbXBvbmVudCgndGFiLWJhci1pdGVtJylcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29keC10YWItYmFyLWl0ZW0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJY29uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYi1iYXItaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtEaXNhYmxlZENvbnRyb2xsZXIuY29ubmVjdCgpXSxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuaXMtZGlzYWJsZWRdJzogJ2Rpc2FibGVkJyxcbiAgICAnW2NsYXNzLmlzLWFjdGl2ZV0nOiAnaXNBY3RpdmUnLFxuICAgICdbYXR0ci5hcmlhLXNlbGVjdGVkXSc6ICdpc0FjdGl2ZScsXG4gICAgJ1tjbGFzcy5pcy1jbG9zYWJsZV0nOiAnY2xvc2FibGUnLFxuICAgIHJvbGU6ICd0YWInLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBUYWJCYXJJdGVtQ29tcG9uZW50IGltcGxlbWVudHMgSGlnaGxpZ2h0YWJsZSwgT25Jbml0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNhYmxlZENvbnRyb2xsZXIgPSBEaXNhYmxlZENvbnRyb2xsZXIuaW5qZWN0KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFiQmFyID0gaW5qZWN0KFRBQl9CQVIpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlckxpbmtBY3RpdmUgPSBpbmplY3QoUm91dGVyTGlua0FjdGl2ZSwgeyBvcHRpb25hbDogdHJ1ZSwgc2VsZjogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSB0YWtlVW50aWxEZXN0cm95ZWQgPSB1bnRpbERlc3Ryb3llZCgpO1xuXG4gIHByb3RlY3RlZCBpc0FjdGl2ZSA9IGZhbHNlO1xuXG4gIHB1YmxpYyByZWFkb25seSBlbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiA9IGluamVjdChFbGVtZW50UmVmKTtcblxuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZGlzYWJsZWRDb250cm9sbGVyPy5kaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHRhYiBjYW4gYmUgY2xvc2VkLiBUaGlzIGNvbnRyb2xzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjbG9zZSBidXR0b25cbiAgICogYW5kIGVuYWJsZXMgdGhlIGVtaXNzaW9uIG9mIHRoZSBgdGFiQ2xvc2VgIGV2ZW50IHdoZW4gdGhlIHRhYiBpcyBjbG9zZWQuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBjbG9zYWJsZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVyIHRoYXQgZmlyZXMgd2hlbiB0aGUgdGFiIGlzIGNsb3NlZC4gSXQgZW1pdHMgdGhlIGluc3RhbmNlIG9mIHRoZSB0YWIgaXRlbSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBlbWl0cyB7VGFiQmFySXRlbUNvbXBvbmVudH1cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgdGFiQ2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYkJhckl0ZW1Db21wb25lbnQ+KCk7XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMucm91dGVyTGlua0FjdGl2ZT8uaXNBY3RpdmVDaGFuZ2UucGlwZSh0aGlzLnRha2VVbnRpbERlc3Ryb3llZCgpLCBmaWx0ZXIoQm9vbGVhbikpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLm9uQ2xpY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB0YWIgYXMgYWN0aXZlIGFuZCBhcHBsaWVzIGNvcnJlc3BvbmRpbmcgc3R5bGVzLiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZVxuICAgKiBgSGlnaGxpZ2h0YWJsZWAgaW50ZXJmYWNlLCBhbGxvd2luZyB0aGUgdGFiIGJhciB0byBtYW5hZ2UgYWN0aXZlIHN0YXRlcy5cbiAgICovXG4gIHB1YmxpYyBzZXRBY3RpdmVTdHlsZXMoKTogdm9pZCB7XG4gICAgZGVmZXJGbigoKSA9PiAodGhpcy5pc0FjdGl2ZSA9IHRydWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB0YWIgYXMgaW5hY3RpdmUgYW5kIHJlbW92ZXMgY29ycmVzcG9uZGluZyBhY3RpdmUgc3R5bGVzLiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZVxuICAgKiBgSGlnaGxpZ2h0YWJsZWAgaW50ZXJmYWNlLlxuICAgKi9cbiAgcHVibGljIHNldEluYWN0aXZlU3R5bGVzKCk6IHZvaWQge1xuICAgIGRlZmVyRm4oKCkgPT4gKHRoaXMuaXNBY3RpdmUgPSBmYWxzZSkpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICBwcm90ZWN0ZWQgb25DbGljaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuICAgIHRoaXMudGFiQmFyLmFjdGl2YXRlSXRlbSh0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVDbG9zZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAhdGhpcy5jbG9zYWJsZSkgcmV0dXJuO1xuICAgIHRoaXMudGFiQmFyLnJlbW92ZUl0ZW0odGhpcyk7XG4gICAgdGhpcy50YWJDbG9zZS5lbWl0KHRoaXMpO1xuICB9XG59XG4iLCI8bmctY29udGVudCBzZWxlY3Q9XCJvZHgtaWNvblwiIC8+XG48ZGl2IGNsYXNzPVwib2R4LXRhYi1iYXItaXRlbV9fbGFiZWxcIj48bmctY29udGVudCAvPjwvZGl2PlxuQGlmIChjbG9zYWJsZSkge1xuICA8b2R4LWljb24gbmFtZT1cImNsb3NlXCIgaWNvblNldD1cImNvcmVcIiBzaXplPVwic21hbGxcIiAoY2xpY2spPVwiaGFuZGxlQ2xvc2UoJGV2ZW50KVwiIC8+XG59XG4iXX0=
95
+ '(click)': 'onClick()',
96
+ }, template: "<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" }]
97
+ }] });
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWJhci1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL3RhYi1iYXIvc3JjL2xpYi9jb21wb25lbnRzL3RhYi1iYXItaXRlbS90YWItYmFyLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvdGFiLWJhci9zcmMvbGliL2NvbXBvbmVudHMvdGFiLWJhci1pdGVtL3RhYi1iYXItaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25KLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7O0FBRS9DOzs7Ozs7Ozs7O0dBVUc7QUFtQkksSUFBTSxtQkFBbUIsR0FBekIsTUFBTSxtQkFBbUI7SUFBekI7UUFDWSx1QkFBa0IsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqRCxXQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pCLHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUUsdUJBQWtCLEdBQUcsY0FBYyxFQUFFLENBQUM7UUFFN0MsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVYLFlBQU8sR0FBNEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBTXRFOzs7Ozs7V0FNRztRQUNJLGFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUVoRTs7OztXQUlHO1FBQ0ksYUFBUSxHQUFHLE1BQU0sRUFBdUIsQ0FBQztLQW1DakQ7SUFyREMsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUM7SUFDN0MsQ0FBQztJQWtCTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNwRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksZUFBZTtRQUNwQixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGlCQUFpQjtRQUN0QixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVTLE9BQU87UUFDZixJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRVMsV0FBVyxDQUFDLEtBQVk7UUFDaEMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFBRSxPQUFPO1FBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLENBQUM7K0dBOURVLG1CQUFtQjttR0FBbkIsbUJBQW1CLGtkQVZuQixDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDLDBCQzlCM0MseU5BS0EsMkNEcUJZLFlBQVksK0JBQUUsYUFBYTs7QUFjMUIsbUJBQW1CO0lBbEIvQixZQUFZLENBQUMsY0FBYyxDQUFDO0dBa0JoQixtQkFBbUIsQ0ErRC9COzs0RkEvRFksbUJBQW1CO2tCQWpCL0IsU0FBUzsrQkFDRSxrQkFBa0IsY0FDaEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxpQkFFdkIsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTSxhQUNwQyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQ25DO3dCQUNKLHFCQUFxQixFQUFFLFVBQVU7d0JBQ2pDLG1CQUFtQixFQUFFLFVBQVU7d0JBQy9CLHNCQUFzQixFQUFFLFVBQVU7d0JBQ2xDLHFCQUFxQixFQUFFLFlBQVk7d0JBQ25DLElBQUksRUFBRSxLQUFLO3dCQUNYLFNBQVMsRUFBRSxXQUFXO3FCQUN2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEhpZ2hsaWdodGFibGUgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgYm9vbGVhbkF0dHJpYnV0ZSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgT25Jbml0LCBvdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXJMaW5rQWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IERpc2FibGVkQ29udHJvbGxlciB9IGZyb20gJ0BvZHgvYW5ndWxhcic7XG5pbXBvcnQgeyBJY29uQ29tcG9uZW50IH0gZnJvbSAnQG9keC9hbmd1bGFyL2NvbXBvbmVudHMvaWNvbic7XG5pbXBvcnQgeyBDU1NDb21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvaW50ZXJuYWwnO1xuaW1wb3J0IHsgZGVmZXJGbiwgdW50aWxEZXN0cm95ZWQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvdXRpbHMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUQUJfQkFSIH0gZnJvbSAnLi4vLi4vdGFiLWJhci5jb25maWcnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCB0YWIgaXRlbSBpbiBhIHRhYiBiYXIgaW50ZXJmYWNlLCBwcm92aWRpbmcgZnVuY3Rpb25hbGl0aWVzXG4gKiBmb3IgYWN0aXZhdGlvbiwgZGVhY3RpdmF0aW9uLCBhbmQgb3B0aW9uYWwgY2xvc2luZyBvZiB0aGUgdGFiLiBUaGlzIGNvbXBvbmVudCBpcyBkZXNpZ25lZFxuICogdG8gYmUgdXNlZCB3aXRoaW4gYSBgVGFiQmFyQ29tcG9uZW50YCB0byBjcmVhdGUgYSBjb21wbGV0ZSB0YWJiZWQgaW50ZXJmYWNlLlxuICpcbiAqIEl0IHN1cHBvcnRzIGRpc2FibGVkIHN0YXRlIG1hbmFnZW1lbnQgdGhyb3VnaCBgRGlzYWJsZWRDb250cm9sbGVyYCwgYWxsb3dpbmcgdGhlIHRhYiB0byBiZVxuICogZGlzYWJsZWQgYmFzZWQgb24gcGFyZW50IGNvbXBvbmVudCBzdGF0ZXMgb3IgaXRzIG93biBgZGlzYWJsZWRgIGlucHV0IHByb3BlcnR5LlxuICpcbiAqIFRoZSBjb21wb25lbnQgaW50ZWdyYXRlcyB3aXRoIEFuZ3VsYXIncyBgUm91dGVyTGlua0FjdGl2ZWAgdG8gYXV0b21hdGljYWxseSBzZXQgYWN0aXZlXG4gKiBzdHlsZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgcm91dGVyIHN0YXRlLCBlbmhhbmNpbmcgU1BBIG5hdmlnYXRpb24gZXhwZXJpZW5jZXMuXG4gKi9cbkBDU1NDb21wb25lbnQoJ3RhYi1iYXItaXRlbScpXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvZHgtdGFiLWJhci1pdGVtJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSWNvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi90YWItYmFyLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbRGlzYWJsZWRDb250cm9sbGVyLmNvbm5lY3QoKV0sXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmlzLWRpc2FibGVkXSc6ICdkaXNhYmxlZCcsXG4gICAgJ1tjbGFzcy5pcy1hY3RpdmVdJzogJ2lzQWN0aXZlJyxcbiAgICAnW2F0dHIuYXJpYS1zZWxlY3RlZF0nOiAnaXNBY3RpdmUnLFxuICAgICdbY2xhc3MuaXMtY2xvc2FibGVdJzogJ2Nsb3NhYmxlKCknLFxuICAgIHJvbGU6ICd0YWInLFxuICAgICcoY2xpY2spJzogJ29uQ2xpY2soKScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIFRhYkJhckl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBIaWdobGlnaHRhYmxlLCBPbkluaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc2FibGVkQ29udHJvbGxlciA9IERpc2FibGVkQ29udHJvbGxlci5pbmplY3QoKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0YWJCYXIgPSBpbmplY3QoVEFCX0JBUik7XG4gIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyTGlua0FjdGl2ZSA9IGluamVjdChSb3V0ZXJMaW5rQWN0aXZlLCB7IG9wdGlvbmFsOiB0cnVlLCBzZWxmOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IHRha2VVbnRpbERlc3Ryb3llZCA9IHVudGlsRGVzdHJveWVkKCk7XG5cbiAgcHJvdGVjdGVkIGlzQWN0aXZlID0gZmFsc2U7XG5cbiAgcHVibGljIHJlYWRvbmx5IGVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5kaXNhYmxlZENvbnRyb2xsZXI/LmRpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgdGFiIGNhbiBiZSBjbG9zZWQuIFRoaXMgY29udHJvbHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGNsb3NlIGJ1dHRvblxuICAgKiBhbmQgZW5hYmxlcyB0aGUgZW1pc3Npb24gb2YgdGhlIGB0YWJDbG9zZWAgZXZlbnQgd2hlbiB0aGUgdGFiIGlzIGNsb3NlZC5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBwdWJsaWMgY2xvc2FibGUgPSBpbnB1dChmYWxzZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSk7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGVtaXR0ZXIgdGhhdCBmaXJlcyB3aGVuIHRoZSB0YWIgaXMgY2xvc2VkLiBJdCBlbWl0cyB0aGUgaW5zdGFuY2Ugb2YgdGhlIHRhYiBpdGVtIGNvbXBvbmVudC5cbiAgICpcbiAgICogQGVtaXRzIHtUYWJCYXJJdGVtQ29tcG9uZW50fVxuICAgKi9cbiAgcHVibGljIHRhYkNsb3NlID0gb3V0cHV0PFRhYkJhckl0ZW1Db21wb25lbnQ+KCk7XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMucm91dGVyTGlua0FjdGl2ZT8uaXNBY3RpdmVDaGFuZ2UucGlwZSh0aGlzLnRha2VVbnRpbERlc3Ryb3llZCgpLCBmaWx0ZXIoQm9vbGVhbikpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLm9uQ2xpY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB0YWIgYXMgYWN0aXZlIGFuZCBhcHBsaWVzIGNvcnJlc3BvbmRpbmcgc3R5bGVzLiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZVxuICAgKiBgSGlnaGxpZ2h0YWJsZWAgaW50ZXJmYWNlLCBhbGxvd2luZyB0aGUgdGFiIGJhciB0byBtYW5hZ2UgYWN0aXZlIHN0YXRlcy5cbiAgICovXG4gIHB1YmxpYyBzZXRBY3RpdmVTdHlsZXMoKTogdm9pZCB7XG4gICAgZGVmZXJGbigoKSA9PiAodGhpcy5pc0FjdGl2ZSA9IHRydWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB0YWIgYXMgaW5hY3RpdmUgYW5kIHJlbW92ZXMgY29ycmVzcG9uZGluZyBhY3RpdmUgc3R5bGVzLiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZVxuICAgKiBgSGlnaGxpZ2h0YWJsZWAgaW50ZXJmYWNlLlxuICAgKi9cbiAgcHVibGljIHNldEluYWN0aXZlU3R5bGVzKCk6IHZvaWQge1xuICAgIGRlZmVyRm4oKCkgPT4gKHRoaXMuaXNBY3RpdmUgPSBmYWxzZSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICB0aGlzLnRhYkJhci5hY3RpdmF0ZUl0ZW0odGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlQ2xvc2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgIXRoaXMuY2xvc2FibGUoKSkgcmV0dXJuO1xuICAgIHRoaXMudGFiQmFyLnJlbW92ZUl0ZW0odGhpcyk7XG4gICAgdGhpcy50YWJDbG9zZS5lbWl0KHRoaXMpO1xuICB9XG59XG4iLCI8bmctY29udGVudCBzZWxlY3Q9XCJvZHgtaWNvblwiIC8+XG48ZGl2IGNsYXNzPVwib2R4LXRhYi1iYXItaXRlbV9fbGFiZWxcIj48bmctY29udGVudCAvPjwvZGl2PlxuQGlmIChjbG9zYWJsZSgpKSB7XG4gIDxvZHgtaWNvbiBuYW1lPVwiY2xvc2VcIiBpY29uU2V0PVwiY29yZVwiIHNpemU9XCJzbWFsbFwiIChjbGljayk9XCJoYW5kbGVDbG9zZSgkZXZlbnQpXCIgLz5cbn1cbiJdfQ==
@@ -1,13 +1,15 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
2
  import { ActiveDescendantKeyManager } from '@angular/cdk/a11y';
3
3
  import { CommonModule } from '@angular/common';
4
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, forwardRef, HostListener, inject, Input, numberAttribute, Output, QueryList, ViewChild, ViewChildren, ViewEncapsulation, } from '@angular/core';
4
+ import { ChangeDetectionStrategy, Component, computed, contentChildren, effect, forwardRef, inject, Injector, model, output, viewChild, ViewEncapsulation, } from '@angular/core';
5
+ import { toObservable } from '@angular/core/rxjs-interop';
5
6
  import { ActiveIndicatorDirective } from '@odx/angular/cdk/active-indicator';
7
+ import { ScrollableService } from '@odx/angular/cdk/scrollable';
6
8
  import { IconComponent } from '@odx/angular/components/icon';
7
- import { CSSComponent, CSSModifier } from '@odx/angular/internal';
8
- import { fromElementResize$, fromQueryList } from '@odx/angular/rxjs';
9
- import { applyStyles, cssTranslate, deferFn, injectElement, px, untilDestroyed } from '@odx/angular/utils';
10
- import { BehaviorSubject, debounceTime, fromEvent, merge, tap } from 'rxjs';
9
+ import { CSSComponent } from '@odx/angular/internal';
10
+ import { fromElementResize$ } from '@odx/angular/rxjs';
11
+ import { injectElement, untilDestroyed } from '@odx/angular/utils';
12
+ import { distinctUntilChanged, filter, merge, skip, tap } from 'rxjs';
11
13
  import { TabBarItemComponent } from './components';
12
14
  import { TAB_BAR } from './tab-bar.config';
13
15
  import * as i0 from "@angular/core";
@@ -23,23 +25,32 @@ import * as i0 from "@angular/core";
23
25
  */
24
26
  let TabBarComponent = class TabBarComponent {
25
27
  constructor() {
26
- this.changeDetector = inject(ChangeDetectorRef);
27
28
  this.takeUntilDestroyed = untilDestroyed();
28
- this.selectedIndex$$ = new BehaviorSubject(0);
29
- this.activeItem = null;
29
+ this.scrollableService = inject(ScrollableService);
30
+ this.nextTab = this.scrollableService.nextItem;
31
+ this.prevTab = this.scrollableService.prevItem;
32
+ this.tabs = contentChildren(TabBarItemComponent);
33
+ this.activeItem = computed(() => this.tabs().at(this.selectedIndex()) ?? null);
34
+ this.keyManager = new ActiveDescendantKeyManager(this.tabs, inject(Injector))
35
+ .withWrap()
36
+ .withHomeAndEnd()
37
+ .withHorizontalOrientation('ltr')
38
+ .withVerticalOrientation(false);
39
+ this.scrollContainerElement = viewChild.required('scrollContainer');
30
40
  this.element = injectElement();
31
41
  /**
32
- * Indicates whether the tab bar has overflowed to the left.
42
+ * Index of the currently selected tab. Use this property to programmatically
43
+ * change the active tab. It responds to changes by updating the active state of the corresponding
44
+ * tab item and adjusting the view if necessary.
33
45
  *
34
- * @type {boolean}
35
- */
36
- this.overflowLeft = false;
37
- /**
38
- * Indicates whether the tab bar has overflowed to the right.
39
- *
40
- * @type {boolean}
46
+ * @type {number}
47
+ * @example
48
+ * Programmatically select the second tab (index starts from 0):
49
+ * ```html
50
+ * <odx-tab-bar [selectedIndex]="1"></odx-tab-bar>
51
+ * ```
41
52
  */
42
- this.overflowRight = false;
53
+ this.selectedIndex = model(0);
43
54
  /**
44
55
  * An EventEmitter that emits whenever a new tab is selected. It provides the `TabChangeEvent`
45
56
  * which contains the index of the newly selected tab and the instance of the corresponding
@@ -57,128 +68,78 @@ let TabBarComponent = class TabBarComponent {
57
68
  * }
58
69
  * ```
59
70
  */
60
- this.selectedTabChanged = new EventEmitter();
61
- }
62
- /**
63
- * Gets or sets the index of the currently selected tab. Use this property to programmatically
64
- * change the active tab. It responds to changes by updating the active state of the corresponding
65
- * tab item and adjusting the view if necessary.
66
- *
67
- * @type {number}
68
- * @example
69
- * Programmatically select the second tab (index starts from 0):
70
- * ```html
71
- * <odx-tab-bar [selectedIndex]="1"></odx-tab-bar>
72
- * ```
73
- */
74
- set selectedIndex(value) {
75
- this.selectedIndex$$.next(value);
76
- }
77
- ngAfterViewInit() {
78
- this.keyManager = new ActiveDescendantKeyManager(this.tabs).withWrap().withHomeAndEnd().withHorizontalOrientation('ltr').withVerticalOrientation(false);
79
- const updatePanelPosition$ = merge(this.selectedTabChanged, fromQueryList(this.tabs), fromElementResize$(this.element.nativeElement)).pipe(debounceTime(0), tap(() => this.updatePanelPosition()));
80
- const updateActionVisibility$ = fromEvent(this.tabBarPanelElement.nativeElement, 'transitionend').pipe(tap(({ target }) => target === this.tabBarPanelElement.nativeElement && this.updateActionVisbility()));
81
- const activeItemChange$ = merge(this.keyManager.change.pipe(tap(() => this.activeItemChange())), this.selectedIndex$$.pipe(tap((index) => this.keyManager?.setActiveItem(index))));
82
- merge(activeItemChange$, updatePanelPosition$, updateActionVisibility$).pipe(this.takeUntilDestroyed()).subscribe();
83
- this.tabs.changes.pipe(this.takeUntilDestroyed()).subscribe(() => this.selectedIndex$$.next(this.selectedIndex$$.value));
71
+ this.selectedTabChanged = output();
72
+ const tabState = computed(() => ({
73
+ selectedIndex: this.selectedIndex(),
74
+ selectedTab: this.activeItem(),
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) => {
77
+ this.selectedTabChanged.emit(state);
78
+ this.scrollableService.scrollActiveItemIntoView(state.selectedTab?.element.nativeElement ?? null);
79
+ })))
80
+ .pipe(this.takeUntilDestroyed())
81
+ .subscribe();
82
+ effect(() => {
83
+ this.keyManager.setActiveItem(this.selectedIndex());
84
+ }, { allowSignalWrites: true });
85
+ effect(() => {
86
+ this.scrollableService.observe(this.scrollContainerElement(), this.tabs());
87
+ });
84
88
  }
85
89
  /**
86
- * Activates the specified tab item.
87
- *
88
- * @param {TabBarItemComponent | null} item - The tab item to activate. If not provided or null, the active item will be cleared.
90
+ * Activates the specified tab item, making it the currently selected tab.
91
+ * If the item is already active, no action is taken.
89
92
  *
90
- * @example
91
- * ```ts
92
- * // Activate the first tab item
93
- * tabBar.activateItem(tabItems[0]);
94
- *
95
- * // Clear the active item
96
- * tabBar.activateItem(null);
97
- * ```
93
+ * @param {TabBarItemComponent | null} item - The tab item to activate.
98
94
  */
99
95
  activateItem(item) {
100
- if (item === this.activeItem)
96
+ if (item === this.keyManager?.activeItem)
101
97
  return;
102
- const selectedIndex = item ? this.tabs.toArray().indexOf(item) : -1;
103
- this.keyManager?.setActiveItem(selectedIndex);
98
+ const selectedIndex = item ? this.tabs().indexOf(item) : -1;
99
+ this.selectedIndex.set(selectedIndex);
104
100
  }
105
101
  /**
106
- * Removes the specified item from the tab bar.
107
- * If the removed item is the active item, it sets the previous item as the new active item.
102
+ * Fires when the specified tab item is removed from the tab bar.
103
+ * If the item is currently active, the previous tab is activated.
108
104
  *
109
- * @param {TabBarItemComponent} item - The item to be removed from the tab bar.
105
+ * @param {TabBarItemComponent} item - The tab item to remove.
110
106
  */
111
107
  removeItem(item) {
112
- if (this.activeItem !== item)
108
+ if (this.keyManager?.activeItem !== item)
113
109
  return;
114
- deferFn(() => this.keyManager?.setPreviousItemActive());
110
+ this.keyManager?.setPreviousItemActive();
115
111
  }
116
112
  onKeydown(event) {
117
113
  this.keyManager?.onKeydown(event);
118
114
  }
119
- updatePanelPosition() {
120
- const activeElement = this.activeItem?.element.nativeElement;
121
- if (!activeElement)
115
+ onFocused() {
116
+ const activeItem = this.activeItem()?.element.nativeElement;
117
+ if (!activeItem)
122
118
  return;
123
- const panelRect = this.tabBarPanelElement.nativeElement.getBoundingClientRect();
124
- const tabBarRect = this.element.nativeElement.getBoundingClientRect();
125
- const maxPanelPositionX = Math.floor(tabBarRect.width - panelRect.width);
126
- const panelPositionX = tabBarRect.width / 2 - activeElement.offsetLeft - activeElement.offsetWidth / 2;
127
- const positionX = Math.min(0, Math.max(panelPositionX, maxPanelPositionX));
128
- applyStyles(this.tabBarPanelElement.nativeElement, {
129
- transform: cssTranslate(px(positionX), 0),
130
- });
131
- this.updateActionVisbility();
132
- }
133
- updateActionVisbility() {
134
- const panelRect = this.tabBarPanelElement.nativeElement.getBoundingClientRect();
135
- const tabBarRect = this.element.nativeElement.getBoundingClientRect();
136
- this.overflowLeft = panelRect.left < tabBarRect.left;
137
- this.overflowRight = panelRect.right > tabBarRect.right;
138
- this.changeDetector.detectChanges();
119
+ if (this.scrollableService.visibleItems().includes(activeItem))
120
+ return;
121
+ this.scrollableService.scrollActiveItemIntoView(activeItem);
139
122
  }
140
- activeItemChange() {
141
- const { activeItemIndex, activeItem } = this.keyManager ?? {};
142
- this.activeItem = activeItem ?? null;
143
- this.selectedTabChanged.emit({ selectedIndex: activeItemIndex ?? -1, selectedTab: this.keyManager?.activeItem ?? null });
123
+ scrollTabs(direction = 1) {
124
+ this.scrollableService.scroll(direction);
144
125
  }
145
126
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TabBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
146
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.13", type: TabBarComponent, isStandalone: true, selector: "odx-tab-bar", inputs: { selectedIndex: ["selectedIndex", "selectedIndex", numberAttribute] }, outputs: { selectedTabChanged: "selectedTabChanged" }, host: { attributes: { "role": "tabpanel", "tabindex": "0" }, listeners: { "keydown": "onKeydown($event)" } }, providers: [{ provide: TAB_BAR, useExisting: forwardRef(() => TabBarComponent) }], queries: [{ propertyName: "tabs", predicate: TabBarItemComponent }], viewQueries: [{ propertyName: "tabBarPanelElement", first: true, predicate: ["tabBarPanel"], descendants: true }, { propertyName: "tabActionElements", predicate: ["tabAction"], descendants: true }], ngImport: i0, template: "<button\n #tabAction\n class=\"odx-tab-bar__action odx-tab-bar__action--prev\"\n [class.is-active]=\"overflowLeft\"\n (click)=\"keyManager?.setPreviousItemActive()\"\n tabindex=\"-1\"\n>\n <odx-icon class=\"tab-bar-action-icon\" name=\"chevron-left\" iconSet=\"core\" />\n</button>\n<div class=\"odx-tab-bar__inner\">\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\n #tabAction\n class=\"odx-tab-bar__action odx-tab-bar__action--next\"\n [class.is-active]=\"overflowRight\"\n (click)=\"keyManager?.setNextItemActive()\"\n tabindex=\"-1\"\n>\n <odx-icon class=\"tab-bar-action-icon\" name=\"chevron-right\" iconSet=\"core\" />\n</button>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }, { kind: "directive", type: ActiveIndicatorDirective, selector: "[odxActiveIndicator]", inputs: ["odxActiveIndicator", "odxActiveIndicatorParent", "odxActiveIndicatorDirection", "odxActiveIndicatorPosition"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
127
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.13", type: TabBarComponent, isStandalone: true, selector: "odx-tab-bar", inputs: { selectedIndex: { classPropertyName: "selectedIndex", publicName: "selectedIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedIndex: "selectedIndexChange", selectedTabChanged: "selectedTabChanged" }, host: { attributes: { "role": "tabpanel", "tabindex": "0" }, listeners: { "keydown": "onKeydown($event)", "focus": "onFocused()" }, properties: { "class.odx-tab-bar--overflow-left": "!!prevTab()", "class.odx-tab-bar--overflow-right": "!!nextTab()" } }, providers: [{ provide: TAB_BAR, useExisting: forwardRef(() => TabBarComponent) }, ScrollableService], queries: [{ propertyName: "tabs", predicate: TabBarItemComponent, isSignal: true }], viewQueries: [{ propertyName: "scrollContainerElement", first: true, predicate: ["scrollContainer"], descendants: true, isSignal: true }], ngImport: i0, 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", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }, { kind: "directive", type: ActiveIndicatorDirective, selector: "[odxActiveIndicator]", inputs: ["odxActiveIndicator", "odxActiveIndicatorParent", "odxActiveIndicatorDirection", "odxActiveIndicatorPosition"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
147
128
  };
148
- __decorate([
149
- CSSModifier(),
150
- __metadata("design:type", Object)
151
- ], TabBarComponent.prototype, "overflowLeft", void 0);
152
- __decorate([
153
- CSSModifier(),
154
- __metadata("design:type", Object)
155
- ], TabBarComponent.prototype, "overflowRight", void 0);
156
129
  TabBarComponent = __decorate([
157
- CSSComponent('tab-bar')
130
+ CSSComponent('tab-bar'),
131
+ __metadata("design:paramtypes", [])
158
132
  ], TabBarComponent);
159
133
  export { TabBarComponent };
160
134
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TabBarComponent, decorators: [{
161
135
  type: Component,
162
- args: [{ selector: 'odx-tab-bar', standalone: true, imports: [CommonModule, IconComponent, ActiveIndicatorDirective], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: TAB_BAR, useExisting: forwardRef(() => TabBarComponent) }], host: {
136
+ args: [{ selector: 'odx-tab-bar', standalone: true, imports: [CommonModule, IconComponent, ActiveIndicatorDirective], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: TAB_BAR, useExisting: forwardRef(() => TabBarComponent) }, ScrollableService], host: {
163
137
  role: 'tabpanel',
164
138
  tabindex: '0',
165
- }, template: "<button\n #tabAction\n class=\"odx-tab-bar__action odx-tab-bar__action--prev\"\n [class.is-active]=\"overflowLeft\"\n (click)=\"keyManager?.setPreviousItemActive()\"\n tabindex=\"-1\"\n>\n <odx-icon class=\"tab-bar-action-icon\" name=\"chevron-left\" iconSet=\"core\" />\n</button>\n<div class=\"odx-tab-bar__inner\">\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\n #tabAction\n class=\"odx-tab-bar__action odx-tab-bar__action--next\"\n [class.is-active]=\"overflowRight\"\n (click)=\"keyManager?.setNextItemActive()\"\n tabindex=\"-1\"\n>\n <odx-icon class=\"tab-bar-action-icon\" name=\"chevron-right\" iconSet=\"core\" />\n</button>\n" }]
166
- }], propDecorators: { tabBarPanelElement: [{
167
- type: ViewChild,
168
- args: ['tabBarPanel']
169
- }], tabActionElements: [{
170
- type: ViewChildren,
171
- args: ['tabAction']
172
- }], tabs: [{
173
- type: ContentChildren,
174
- args: [TabBarItemComponent]
175
- }], overflowLeft: [], overflowRight: [], selectedIndex: [{
176
- type: Input,
177
- args: [{ transform: numberAttribute }]
178
- }], selectedTabChanged: [{
179
- type: Output
180
- }], onKeydown: [{
181
- type: HostListener,
182
- args: ['keydown', ['$event']]
183
- }] } });
184
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy90YWItYmFyL3NyYy9saWIvdGFiLWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy90YWItYmFyL3NyYy9saWIvdGFiLWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsZUFBZSxFQUNmLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDN0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNHLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsR0FB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dCB7IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBudW1iZXJBdHRyaWJ1dGUsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZlSW5kaWNhdG9yRGlyZWN0aXZlIH0gZnJvbSAnQG9keC9hbmd1bGFyL2Nkay9hY3RpdmUtaW5kaWNhdG9yJztcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9pY29uJztcbmltcG9ydCB7IENTU0NvbXBvbmVudCwgQ1NTTW9kaWZpZXIgfSBmcm9tICdAb2R4L2FuZ3VsYXIvaW50ZXJuYWwnO1xuaW1wb3J0IHsgZnJvbUVsZW1lbnRSZXNpemUkLCBmcm9tUXVlcnlMaXN0IH0gZnJvbSAnQG9keC9hbmd1bGFyL3J4anMnO1xuaW1wb3J0IHsgYXBwbHlTdHlsZXMsIGNzc1RyYW5zbGF0ZSwgZGVmZXJGbiwgaW5qZWN0RWxlbWVudCwgcHgsIHVudGlsRGVzdHJveWVkIH0gZnJvbSAnQG9keC9hbmd1bGFyL3V0aWxzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZGVib3VuY2VUaW1lLCBmcm9tRXZlbnQsIG1lcmdlLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRhYkJhckl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgVGFiQ2hhbmdlRXZlbnQgfSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQgeyBUQUJfQkFSIH0gZnJvbSAnLi90YWItYmFyLmNvbmZpZyc7XG5cbi8qKlxuICogYFRhYkJhckNvbXBvbmVudGAgY3JlYXRlcyBhIGR5bmFtaWMgYW5kIGFjY2Vzc2libGUgdGFiIGJhciBpbnRlcmZhY2UsXG4gKiBmYWNpbGl0YXRpbmcgdGhlIG1hbmFnZW1lbnQgYW5kIGludGVyYWN0aW9uIHdpdGggYSBjb2xsZWN0aW9uIG9mIHRhYnMuXG4gKiBJdCBzdXBwb3J0cyBrZXlib2FyZCBuYXZpZ2F0aW9uLCBkeW5hbWljIHRhYiBtYW5hZ2VtZW50LCBhbmQgcmVzcG9uc2l2ZSBvdmVyZmxvdyBhY3Rpb25zLlxuICpcbiAqIFRoZSBjb21wb25lbnQgaW50ZWdyYXRlcyB3aXRoIEFuZ3VsYXIncyBDb250ZW50Q2hpbGRyZW4gdG8gZHluYW1pY2FsbHkgbWFuYWdlIHRoZSB0YWJzIGJhc2VkIG9uIHRoZWlyIGNvbnRlbnQuXG4gKiBJdCB1c2VzIEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyIGZyb20gQW5ndWxhciBDREsgZm9yIG1hbmFnaW5nIGZvY3VzIGFuZCBrZXlib2FyZCBuYXZpZ2F0aW9uLFxuICogbWFraW5nIGl0IGFjY2Vzc2libGUgYW5kIHVzZXItZnJpZW5kbHkuIEFkZGl0aW9uYWxseSwgaXQgaGFuZGxlcyBvdmVyZmxvdyB3aXRoIG5hdmlnYXRpb25hbCBhcnJvd3MsXG4gKiBhbGxvd2luZyBmb3IgYSBzbW9vdGggdXNlciBleHBlcmllbmNlIGV2ZW4gd2l0aCBhIGxhcmdlIG51bWJlciBvZiB0YWJzLlxuICovXG5AQ1NTQ29tcG9uZW50KCd0YWItYmFyJylcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29keC10YWItYmFyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSWNvbkNvbXBvbmVudCwgQWN0aXZlSW5kaWNhdG9yRGlyZWN0aXZlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYi1iYXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBUQUJfQkFSLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUYWJCYXJDb21wb25lbnQpIH1dLFxuICBob3N0OiB7XG4gICAgcm9sZTogJ3RhYnBhbmVsJyxcbiAgICB0YWJpbmRleDogJzAnLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBUYWJCYXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGFuZ2VEZXRlY3RvciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFrZVVudGlsRGVzdHJveWVkID0gdW50aWxEZXN0cm95ZWQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3RlZEluZGV4JCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KDApO1xuXG4gIHByb3RlY3RlZCBhY3RpdmVJdGVtOiBUYWJCYXJJdGVtQ29tcG9uZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIGtleU1hbmFnZXI/OiBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlcjxUYWJCYXJJdGVtQ29tcG9uZW50PjtcblxuICBAVmlld0NoaWxkKCd0YWJCYXJQYW5lbCcpXG4gIHByb3RlY3RlZCB0YWJCYXJQYW5lbEVsZW1lbnQhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBAVmlld0NoaWxkcmVuKCd0YWJBY3Rpb24nKVxuICBwcm90ZWN0ZWQgdGFiQWN0aW9uRWxlbWVudHMhOiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oVGFiQmFySXRlbUNvbXBvbmVudClcbiAgcHJvdGVjdGVkIHRhYnMhOiBRdWVyeUxpc3Q8VGFiQmFySXRlbUNvbXBvbmVudD47XG5cbiAgcHVibGljIHJlYWRvbmx5IGVsZW1lbnQgPSBpbmplY3RFbGVtZW50KCk7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0YWIgYmFyIGhhcyBvdmVyZmxvd2VkIHRvIHRoZSBsZWZ0LlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIEBDU1NNb2RpZmllcigpXG4gIHB1YmxpYyBvdmVyZmxvd0xlZnQgPSBmYWxzZTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRhYiBiYXIgaGFzIG92ZXJmbG93ZWQgdG8gdGhlIHJpZ2h0LlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIEBDU1NNb2RpZmllcigpXG4gIHB1YmxpYyBvdmVyZmxvd1JpZ2h0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0YWIuIFVzZSB0aGlzIHByb3BlcnR5IHRvIHByb2dyYW1tYXRpY2FsbHlcbiAgICogY2hhbmdlIHRoZSBhY3RpdmUgdGFiLiBJdCByZXNwb25kcyB0byBjaGFuZ2VzIGJ5IHVwZGF0aW5nIHRoZSBhY3RpdmUgc3RhdGUgb2YgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICogdGFiIGl0ZW0gYW5kIGFkanVzdGluZyB0aGUgdmlldyBpZiBuZWNlc3NhcnkuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBleGFtcGxlXG4gICAqIFByb2dyYW1tYXRpY2FsbHkgc2VsZWN0IHRoZSBzZWNvbmQgdGFiIChpbmRleCBzdGFydHMgZnJvbSAwKTpcbiAgICogYGBgaHRtbFxuICAgKiA8b2R4LXRhYi1iYXIgW3NlbGVjdGVkSW5kZXhdPVwiMVwiPjwvb2R4LXRhYi1iYXI+XG4gICAqIGBgYFxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSlcbiAgcHVibGljIHNldCBzZWxlY3RlZEluZGV4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXgkJC5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBFdmVudEVtaXR0ZXIgdGhhdCBlbWl0cyB3aGVuZXZlciBhIG5ldyB0YWIgaXMgc2VsZWN0ZWQuIEl0IHByb3ZpZGVzIHRoZSBgVGFiQ2hhbmdlRXZlbnRgXG4gICAqIHdoaWNoIGNvbnRhaW5zIHRoZSBpbmRleCBvZiB0aGUgbmV3bHkgc2VsZWN0ZWQgdGFiIGFuZCB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICogYFRhYkJhckl0ZW1Db21wb25lbnRgLiBTdWJzY3JpYmUgdG8gdGhpcyBvdXRwdXQgdG8gcGVyZm9ybSBhY3Rpb25zIHdoZW4gdGhlIGFjdGl2ZSB0YWIgY2hhbmdlcy5cbiAgICpcbiAgICogQGVtaXRzIHtUYWJDaGFuZ2VFdmVudH1cbiAgICogQGV4YW1wbGVcbiAgICogYGBgaHRtbFxuICAgKiA8b2R4LXRhYi1iYXIgKHNlbGVjdGVkVGFiQ2hhbmdlZCk9XCJvblRhYkNoYW5nZSgkZXZlbnQpXCI+PC9vZHgtdGFiLWJhcj5cbiAgICogYGBgXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIG9uVGFiQ2hhbmdlKGV2ZW50OiBUYWJDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgKiAgIGNvbnNvbGUubG9nKGBOZXcgYWN0aXZlIHRhYiBpbmRleDogJHtldmVudC5zZWxlY3RlZEluZGV4fWApO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzZWxlY3RlZFRhYkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYkNoYW5nZUV2ZW50PigpO1xuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5rZXlNYW5hZ2VyID0gbmV3IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyKHRoaXMudGFicykud2l0aFdyYXAoKS53aXRoSG9tZUFuZEVuZCgpLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24oJ2x0cicpLndpdGhWZXJ0aWNhbE9yaWVudGF0aW9uKGZhbHNlKTtcbiAgICBjb25zdCB1cGRhdGVQYW5lbFBvc2l0aW9uJCA9IG1lcmdlKHRoaXMuc2VsZWN0ZWRUYWJDaGFuZ2VkLCBmcm9tUXVlcnlMaXN0KHRoaXMudGFicyksIGZyb21FbGVtZW50UmVzaXplJCh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCkpLnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUoMCksXG4gICAgICB0YXAoKCkgPT4gdGhpcy51cGRhdGVQYW5lbFBvc2l0aW9uKCkpLFxuICAgICk7XG4gICAgY29uc3QgdXBkYXRlQWN0aW9uVmlzaWJpbGl0eSQgPSBmcm9tRXZlbnQodGhpcy50YWJCYXJQYW5lbEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3RyYW5zaXRpb25lbmQnKS5waXBlKFxuICAgICAgdGFwKCh7IHRhcmdldCB9KSA9PiB0YXJnZXQgPT09IHRoaXMudGFiQmFyUGFuZWxFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy51cGRhdGVBY3Rpb25WaXNiaWxpdHkoKSksXG4gICAgKTtcbiAgICBjb25zdCBhY3RpdmVJdGVtQ2hhbmdlJCA9IG1lcmdlKFxuICAgICAgdGhpcy5rZXlNYW5hZ2VyLmNoYW5nZS5waXBlKHRhcCgoKSA9PiB0aGlzLmFjdGl2ZUl0ZW1DaGFuZ2UoKSkpLFxuICAgICAgdGhpcy5zZWxlY3RlZEluZGV4JCQucGlwZSh0YXAoKGluZGV4KSA9PiB0aGlzLmtleU1hbmFnZXI/LnNldEFjdGl2ZUl0ZW0oaW5kZXgpKSksXG4gICAgKTtcbiAgICBtZXJnZShhY3RpdmVJdGVtQ2hhbmdlJCwgdXBkYXRlUGFuZWxQb3NpdGlvbiQsIHVwZGF0ZUFjdGlvblZpc2liaWxpdHkkKS5waXBlKHRoaXMudGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSgpO1xuICAgIHRoaXMudGFicy5jaGFuZ2VzLnBpcGUodGhpcy50YWtlVW50aWxEZXN0cm95ZWQoKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VsZWN0ZWRJbmRleCQkLm5leHQodGhpcy5zZWxlY3RlZEluZGV4JCQudmFsdWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZXMgdGhlIHNwZWNpZmllZCB0YWIgaXRlbS5cbiAgICpcbiAgICogQHBhcmFtIHtUYWJCYXJJdGVtQ29tcG9uZW50IHwgbnVsbH0gaXRlbSAtIFRoZSB0YWIgaXRlbSB0byBhY3RpdmF0ZS4gSWYgbm90IHByb3ZpZGVkIG9yIG51bGwsIHRoZSBhY3RpdmUgaXRlbSB3aWxsIGJlIGNsZWFyZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIC8vIEFjdGl2YXRlIHRoZSBmaXJzdCB0YWIgaXRlbVxuICAgKiB0YWJCYXIuYWN0aXZhdGVJdGVtKHRhYkl0ZW1zWzBdKTtcbiAgICpcbiAgICogLy8gQ2xlYXIgdGhlIGFjdGl2ZSBpdGVtXG4gICAqIHRhYkJhci5hY3RpdmF0ZUl0ZW0obnVsbCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFjdGl2YXRlSXRlbShpdGVtPzogVGFiQmFySXRlbUNvbXBvbmVudCB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoaXRlbSA9PT0gdGhpcy5hY3RpdmVJdGVtKSByZXR1cm47XG4gICAgY29uc3Qgc2VsZWN0ZWRJbmRleCA9IGl0ZW0gPyB0aGlzLnRhYnMudG9BcnJheSgpLmluZGV4T2YoaXRlbSkgOiAtMTtcbiAgICB0aGlzLmtleU1hbmFnZXI/LnNldEFjdGl2ZUl0ZW0oc2VsZWN0ZWRJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGl0ZW0gZnJvbSB0aGUgdGFiIGJhci5cbiAgICogSWYgdGhlIHJlbW92ZWQgaXRlbSBpcyB0aGUgYWN0aXZlIGl0ZW0sIGl0IHNldHMgdGhlIHByZXZpb3VzIGl0ZW0gYXMgdGhlIG5ldyBhY3RpdmUgaXRlbS5cbiAgICpcbiAgICogQHBhcmFtIHtUYWJCYXJJdGVtQ29tcG9uZW50fSBpdGVtIC0gVGhlIGl0ZW0gdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSB0YWIgYmFyLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZUl0ZW0oaXRlbTogVGFiQmFySXRlbUNvbXBvbmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZUl0ZW0gIT09IGl0ZW0pIHJldHVybjtcbiAgICBkZWZlckZuKCgpID0+IHRoaXMua2V5TWFuYWdlcj8uc2V0UHJldmlvdXNJdGVtQWN0aXZlKCkpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIHByb3RlY3RlZCBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmtleU1hbmFnZXI/Lm9uS2V5ZG93bihldmVudCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhbmVsUG9zaXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IHRoaXMuYWN0aXZlSXRlbT8uZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghYWN0aXZlRWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IHBhbmVsUmVjdCA9IHRoaXMudGFiQmFyUGFuZWxFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgdGFiQmFyUmVjdCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IG1heFBhbmVsUG9zaXRpb25YID0gTWF0aC5mbG9vcih0YWJCYXJSZWN0LndpZHRoIC0gcGFuZWxSZWN0LndpZHRoKTtcbiAgICBjb25zdCBwYW5lbFBvc2l0aW9uWCA9IHRhYkJhclJlY3Qud2lkdGggLyAyIC0gYWN0aXZlRWxlbWVudC5vZmZzZXRMZWZ0IC0gYWN0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCAvIDI7XG4gICAgY29uc3QgcG9zaXRpb25YID0gTWF0aC5taW4oMCwgTWF0aC5tYXgocGFuZWxQb3NpdGlvblgsIG1heFBhbmVsUG9zaXRpb25YKSk7XG4gICAgYXBwbHlTdHlsZXModGhpcy50YWJCYXJQYW5lbEVsZW1lbnQubmF0aXZlRWxlbWVudCwge1xuICAgICAgdHJhbnNmb3JtOiBjc3NUcmFuc2xhdGUocHgocG9zaXRpb25YKSwgMCksXG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVBY3Rpb25WaXNiaWxpdHkoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQWN0aW9uVmlzYmlsaXR5KCk6IHZvaWQge1xuICAgIGNvbnN0IHBhbmVsUmVjdCA9IHRoaXMudGFiQmFyUGFuZWxFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgdGFiQmFyUmVjdCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMub3ZlcmZsb3dMZWZ0ID0gcGFuZWxSZWN0LmxlZnQgPCB0YWJCYXJSZWN0LmxlZnQ7XG4gICAgdGhpcy5vdmVyZmxvd1JpZ2h0ID0gcGFuZWxSZWN0LnJpZ2h0ID4gdGFiQmFyUmVjdC5yaWdodDtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgYWN0aXZlSXRlbUNoYW5nZSgpOiB2b2lkIHtcbiAgICBjb25zdCB7IGFjdGl2ZUl0ZW1JbmRleCwgYWN0aXZlSXRlbSB9ID0gdGhpcy5rZXlNYW5hZ2VyID8/IHt9O1xuICAgIHRoaXMuYWN0aXZlSXRlbSA9IGFjdGl2ZUl0ZW0gPz8gbnVsbDtcbiAgICB0aGlzLnNlbGVjdGVkVGFiQ2hhbmdlZC5lbWl0KHsgc2VsZWN0ZWRJbmRleDogYWN0aXZlSXRlbUluZGV4ID8/IC0xLCBzZWxlY3RlZFRhYjogdGhpcy5rZXlNYW5hZ2VyPy5hY3RpdmVJdGVtID8/IG51bGwgfSk7XG4gIH1cbn1cbiIsIjxidXR0b25cbiAgI3RhYkFjdGlvblxuICBjbGFzcz1cIm9keC10YWItYmFyX19hY3Rpb24gb2R4LXRhYi1iYXJfX2FjdGlvbi0tcHJldlwiXG4gIFtjbGFzcy5pcy1hY3RpdmVdPVwib3ZlcmZsb3dMZWZ0XCJcbiAgKGNsaWNrKT1cImtleU1hbmFnZXI/LnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpXCJcbiAgdGFiaW5kZXg9XCItMVwiXG4+XG4gIDxvZHgtaWNvbiBjbGFzcz1cInRhYi1iYXItYWN0aW9uLWljb25cIiBuYW1lPVwiY2hldnJvbi1sZWZ0XCIgaWNvblNldD1cImNvcmVcIiAvPlxuPC9idXR0b24+XG48ZGl2IGNsYXNzPVwib2R4LXRhYi1iYXJfX2lubmVyXCI+XG4gIDxkaXYgY2xhc3M9XCJvZHgtdGFiLWJhcl9fcGFuZWxcIiByb2xlPVwidGFibGlzdFwiICN0YWJCYXJQYW5lbD5cbiAgICA8bmctY29udGVudCAvPlxuICAgIDxkaXYgY2xhc3M9XCJvZHgtdGFiLWJhcl9faW5kaWNhdG9yXCIgW29keEFjdGl2ZUluZGljYXRvcl09XCJhY3RpdmVJdGVtPy5lbGVtZW50Py5uYXRpdmVFbGVtZW50XCIgb2R4QWN0aXZlSW5kaWNhdG9yUG9zaXRpb249XCJzdGFydFwiPjwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuPGJ1dHRvblxuICAjdGFiQWN0aW9uXG4gIGNsYXNzPVwib2R4LXRhYi1iYXJfX2FjdGlvbiBvZHgtdGFiLWJhcl9fYWN0aW9uLS1uZXh0XCJcbiAgW2NsYXNzLmlzLWFjdGl2ZV09XCJvdmVyZmxvd1JpZ2h0XCJcbiAgKGNsaWNrKT1cImtleU1hbmFnZXI/LnNldE5leHRJdGVtQWN0aXZlKClcIlxuICB0YWJpbmRleD1cIi0xXCJcbj5cbiAgPG9keC1pY29uIGNsYXNzPVwidGFiLWJhci1hY3Rpb24taWNvblwiIG5hbWU9XCJjaGV2cm9uLXJpZ2h0XCIgaWNvblNldD1cImNvcmVcIiAvPlxuPC9idXR0b24+XG4iXX0=
139
+ '[class.odx-tab-bar--overflow-left]': '!!prevTab()',
140
+ '[class.odx-tab-bar--overflow-right]': '!!nextTab()',
141
+ '(keydown)': 'onKeydown($event)',
142
+ '(focus)': 'onFocused()',
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
+ }], 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
@@ -0,0 +1,115 @@
1
+ import * as i0 from '@angular/core';
2
+ import { signal, Injectable } from '@angular/core';
3
+
4
+ /**
5
+ * Service to manage scrollable items within a container, providing functionality to observe item visibility
6
+ * and navigate through them.
7
+ */
8
+ class ScrollableService {
9
+ constructor() {
10
+ /**
11
+ * References to the next and previous scrollable items.
12
+ *
13
+ * @type {HTMLElement | null}
14
+ */
15
+ this.nextItem = signal(null);
16
+ /**
17
+ * References to the previous scrollable item.
18
+ *
19
+ * @type {HTMLElement | null}
20
+ */
21
+ this.prevItem = signal(null);
22
+ /** List of currently visible items within the scroll container.
23
+ *
24
+ * @type {HTMLElement[]}
25
+ */
26
+ this.visibleItems = signal([]);
27
+ }
28
+ ngOnDestroy() {
29
+ this.intersectionObserver?.disconnect();
30
+ }
31
+ /**
32
+ * Starts observing the scrollable items within the specified container.
33
+ *
34
+ * @param {ElementRef<HTMLElement>} scrollContainer - The container element that holds the scrollable items.
35
+ * @param {readonly ScrollableItem[]} items - The list of scrollable items to observe.
36
+ */
37
+ observe(scrollContainer, items) {
38
+ this.scrollContainer = scrollContainer;
39
+ if (this.intersectionObserver) {
40
+ this.intersectionObserver.disconnect();
41
+ }
42
+ const allItems = items.map((item) => item.element.nativeElement);
43
+ if (!this.scrollContainer || allItems.length === 0) {
44
+ this.nextItem.set(null);
45
+ this.prevItem.set(null);
46
+ return;
47
+ }
48
+ this.intersectionObserver = this.observeVisibility(allItems, (visible) => {
49
+ let prevItem = null;
50
+ let nextItem = null;
51
+ if (visible.length > 0 && allItems.length > visible.length) {
52
+ const firstVisibleIndex = allItems.indexOf(visible[0]);
53
+ if (firstVisibleIndex > 0) {
54
+ prevItem = allItems[firstVisibleIndex - 1];
55
+ }
56
+ const lastVisibleIndex = allItems.indexOf(visible[visible.length - 1]);
57
+ if (lastVisibleIndex < allItems.length - 1) {
58
+ nextItem = allItems[lastVisibleIndex + 1];
59
+ }
60
+ }
61
+ this.nextItem.set(nextItem);
62
+ this.prevItem.set(prevItem);
63
+ });
64
+ }
65
+ /**
66
+ * Scrolls the container in the specified direction.
67
+ *
68
+ * @param {'next' | 'prev'} direction - The direction to scroll ('next' for right, 'prev' for left).
69
+ */
70
+ scroll(direction = 1) {
71
+ const container = this.scrollContainer?.nativeElement;
72
+ if (!container)
73
+ return;
74
+ container.scrollBy({ left: (container.clientWidth * direction) / 2 });
75
+ }
76
+ /**
77
+ * Scrolls the active item into view within the scroll container.
78
+ *
79
+ * @param {HTMLElement | null} activeItem - The currently active item to scroll into view.
80
+ */
81
+ scrollActiveItemIntoView(activeItem) {
82
+ if (activeItem) {
83
+ activeItem.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });
84
+ }
85
+ }
86
+ observeVisibility(items, callback) {
87
+ const visibleMap = new Map();
88
+ const observer = new IntersectionObserver((entries) => {
89
+ for (const entry of entries) {
90
+ const isVisible = entry.isIntersecting && entry.intersectionRatio >= 0.75;
91
+ visibleMap.set(entry.target, isVisible);
92
+ }
93
+ const visible = items.filter((item) => visibleMap.get(item));
94
+ this.visibleItems.set(visible);
95
+ callback(visible);
96
+ }, {
97
+ root: this.scrollContainer.nativeElement,
98
+ threshold: 1,
99
+ });
100
+ items.forEach((item) => observer.observe(item));
101
+ return observer;
102
+ }
103
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScrollableService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
104
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScrollableService }); }
105
+ }
106
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScrollableService, decorators: [{
107
+ type: Injectable
108
+ }] });
109
+
110
+ /**
111
+ * Generated bundle index. Do not edit.
112
+ */
113
+
114
+ export { ScrollableService };
115
+ //# sourceMappingURL=odx-angular-cdk-scrollable.mjs.map
@@ -0,0 +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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"}