@ethlete/cdk 2.3.2 → 2.4.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.
Files changed (57) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/esm2022/lib/components/accordion/components/accordion-group/accordion-group.component.mjs +6 -6
  3. package/esm2022/lib/components/button/directives/button/button.directive.mjs +4 -5
  4. package/esm2022/lib/components/button/directives/query-button/query-button.directive.mjs +4 -5
  5. package/esm2022/lib/components/forms/components/checkbox/components/checkbox-group/checkbox-group.component.mjs +3 -4
  6. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox/checkbox.directive.mjs +4 -4
  7. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-field/checkbox-field.directive.mjs +4 -4
  8. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-group/checkbox-group.directive.mjs +6 -6
  9. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-group-control/checkbox-group-control.directive.mjs +4 -4
  10. package/esm2022/lib/components/forms/components/error/components/error/error.component.mjs +5 -5
  11. package/esm2022/lib/components/forms/components/input/components/email-input/email-input.component.mjs +3 -4
  12. package/esm2022/lib/components/forms/components/input/components/number-input/number-input.component.mjs +4 -5
  13. package/esm2022/lib/components/forms/components/input/components/password-input/password-input.component.mjs +4 -5
  14. package/esm2022/lib/components/forms/components/input/components/search-input/search-input.component.mjs +4 -5
  15. package/esm2022/lib/components/forms/components/input/components/text-input/text-input.component.mjs +4 -5
  16. package/esm2022/lib/components/forms/components/input/components/textarea-input/textarea-input.component.mjs +4 -5
  17. package/esm2022/lib/components/forms/components/input/directives/autosize-textarea/autosize-textarea.directive.mjs +4 -5
  18. package/esm2022/lib/components/forms/components/input/directives/email-input/email-input.directive.mjs +5 -5
  19. package/esm2022/lib/components/forms/components/input/directives/number-input/number-input.directive.mjs +5 -5
  20. package/esm2022/lib/components/forms/components/input/directives/password-input/password-input.directive.mjs +5 -5
  21. package/esm2022/lib/components/forms/components/input/directives/search-input/search-input.directive.mjs +5 -5
  22. package/esm2022/lib/components/forms/components/input/directives/text-input/text-input.directive.mjs +5 -5
  23. package/esm2022/lib/components/forms/components/input/directives/textarea-input/textarea-input.directive.mjs +5 -5
  24. package/esm2022/lib/components/forms/components/radio/directives/radio/radio.directive.mjs +5 -5
  25. package/esm2022/lib/components/forms/components/radio/directives/radio-field/radio-field.directive.mjs +4 -4
  26. package/esm2022/lib/components/forms/components/radio/directives/radio-group/radio-group.directive.mjs +4 -4
  27. package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button/segmented-button.directive.mjs +4 -4
  28. package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button-field/segmented-button-field.directive.mjs +4 -4
  29. package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button-group/segmented-button-group.directive.mjs +5 -5
  30. package/esm2022/lib/components/forms/components/select/components/native-select/components/native-select/native-select.component.mjs +3 -4
  31. package/esm2022/lib/components/forms/components/select/components/native-select/directives/native-select-input/native-select-input.directive.mjs +5 -5
  32. package/esm2022/lib/components/forms/components/select/components/select/components/select/select.component.mjs +24 -12
  33. package/esm2022/lib/components/forms/components/select/components/select/partials/select-body/select-body.component.mjs +11 -16
  34. package/esm2022/lib/components/forms/components/slider/components/slider/slider.component.mjs +6 -6
  35. package/esm2022/lib/components/forms/directives/if-input-empty/if-input-empty.directive.mjs +4 -5
  36. package/esm2022/lib/components/forms/directives/if-input-filled/if-input-filled.directive.mjs +4 -5
  37. package/esm2022/lib/components/forms/directives/input/input.directive.mjs +6 -6
  38. package/esm2022/lib/components/forms/directives/static-form-field/static-form-field.directive.mjs +3 -5
  39. package/esm2022/lib/components/forms/directives/writeable-input/writeable-input.directive.mjs +2 -4
  40. package/esm2022/lib/components/forms/utils/decorated-input.base.mjs +3 -3
  41. package/esm2022/lib/components/masonry/components/masonry/masonry.component.mjs +5 -5
  42. package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-drag-handle/bottom-sheet-drag-handle.component.mjs +5 -5
  43. package/esm2022/lib/components/overlay/components/toggletip/directives/toggletip/toggletip.directive.mjs +41 -107
  44. package/esm2022/lib/components/overlay/components/tooltip/directives/tooltip/tooltip.directive.mjs +41 -117
  45. package/esm2022/lib/components/scrollable/components/scrollable/scrollable.component.mjs +55 -8
  46. package/esm2022/lib/components/tabs/components/nav-tabs/nav-tabs.component.mjs +1 -1
  47. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-header/inline-tab-header.component.mjs +1 -1
  48. package/esm2022/lib/components/tabs/utils/paginated-tab-header.directive.mjs +3 -4
  49. package/fesm2022/ethlete-cdk.mjs +290 -389
  50. package/fesm2022/ethlete-cdk.mjs.map +1 -1
  51. package/lib/components/forms/components/select/components/select/components/select/select.component.d.ts +5 -1
  52. package/lib/components/forms/components/select/components/select/partials/select-body/select-body.component.d.ts +2 -0
  53. package/lib/components/overlay/components/toggletip/directives/toggletip/toggletip.directive.d.ts +11 -18
  54. package/lib/components/overlay/components/tooltip/directives/tooltip/tooltip.directive.d.ts +6 -17
  55. package/lib/components/scrollable/components/scrollable/scrollable.component.d.ts +13 -5
  56. package/lib/components/tabs/utils/paginated-tab-header.directive.d.ts +1 -2
  57. package/package.json +3 -4
@@ -1,38 +1,14 @@
1
1
  import { AriaDescriber } from '@angular/cdk/a11y';
2
- import { Overlay } from '@angular/cdk/overlay';
3
- import { ComponentPortal } from '@angular/cdk/portal';
4
- import { Directive, ElementRef, inject, InjectionToken, Injector, Input, NgZone, ViewContainerRef, } from '@angular/core';
5
- import { FocusVisibleService, nextFrame } from '@ethlete/core';
6
- import { createPopper } from '@popperjs/core';
7
- import { debounceTime, filter, fromEvent, take, tap } from 'rxjs';
2
+ import { Directive, ElementRef, InjectionToken, Input, inject } from '@angular/core';
3
+ import { AnimatedOverlayDirective, FocusVisibleService } from '@ethlete/core';
4
+ import { debounceTime, filter, fromEvent, tap } from 'rxjs';
8
5
  import { TooltipComponent } from '../../components';
9
6
  import { TOOLTIP_CONFIG, TOOLTIP_TEMPLATE, TOOLTIP_TEXT } from '../../constants';
10
7
  import { createTooltipConfig } from '../../utils';
11
8
  import * as i0 from "@angular/core";
9
+ import * as i1 from "@ethlete/core";
12
10
  export const TOOLTIP_DIRECTIVE = new InjectionToken('TOOLTIP_DIRECTIVE');
13
11
  class TooltipDirective {
14
- constructor() {
15
- this._defaultConfig = inject(TOOLTIP_CONFIG, { optional: true }) ?? createTooltipConfig();
16
- this._tooltip = null;
17
- this.placement = this._defaultConfig.placement;
18
- this._tooltipAriaDescription = null;
19
- this._lastTooltipText = null;
20
- this._hostElementRef = inject(ElementRef);
21
- this._viewContainerRef = inject(ViewContainerRef);
22
- this._overlayService = inject(Overlay);
23
- this._ariaDescriberService = inject(AriaDescriber);
24
- this._focusVisibleService = inject(FocusVisibleService);
25
- this._injector = inject(Injector);
26
- this._zone = inject(NgZone);
27
- this._overlayRef = null;
28
- this._portal = null;
29
- this._tooltipRef = null;
30
- this._popper = null;
31
- this._willMount = true;
32
- this._hasFocus = false;
33
- this._hasHover = false;
34
- this._listenerSubscriptions = [];
35
- }
36
12
  get tooltip() {
37
13
  return this._tooltip;
38
14
  }
@@ -53,61 +29,75 @@ class TooltipDirective {
53
29
  this._tooltipAriaDescription = v;
54
30
  this._updateAriaDescription();
55
31
  }
56
- get _isMounted() {
57
- return this._overlayRef !== null;
32
+ constructor() {
33
+ this._defaultConfig = inject(TOOLTIP_CONFIG, { optional: true }) ?? createTooltipConfig();
34
+ this._animatedOverlay = inject(AnimatedOverlayDirective);
35
+ this._tooltip = null;
36
+ this._tooltipAriaDescription = null;
37
+ this._lastTooltipText = null;
38
+ this._elementRef = inject(ElementRef);
39
+ this._ariaDescriberService = inject(AriaDescriber);
40
+ this._focusVisibleService = inject(FocusVisibleService);
41
+ this._willMount = true;
42
+ this._hasFocus = false;
43
+ this._hasHover = false;
44
+ this._listenerSubscriptions = [];
45
+ this._animatedOverlay.placement = this._defaultConfig.placement;
46
+ this._animatedOverlay.offset = this._defaultConfig.offset;
47
+ this._animatedOverlay.arrowPadding = this._defaultConfig.arrowPadding;
58
48
  }
59
49
  ngOnDestroy() {
60
- this._unmountTooltip();
50
+ this._animatedOverlay._destroy();
61
51
  this._removeListeners();
62
52
  }
63
53
  _updateAriaDescription() {
64
54
  const tooltipText = this._getTooltipText();
65
55
  if (tooltipText) {
66
- this._ariaDescriberService.describe(this._hostElementRef.nativeElement, tooltipText);
56
+ this._ariaDescriberService.describe(this._elementRef.nativeElement, tooltipText);
67
57
  }
68
58
  else if (this._lastTooltipText) {
69
- this._ariaDescriberService.removeDescription(this._hostElementRef.nativeElement, this._lastTooltipText);
59
+ this._ariaDescriberService.removeDescription(this._elementRef.nativeElement, this._lastTooltipText);
70
60
  }
71
61
  this._lastTooltipText = tooltipText;
72
62
  }
73
63
  _addListeners() {
74
- const mouseEnterSub = fromEvent(this._hostElementRef.nativeElement, 'mouseenter')
64
+ const mouseEnterSub = fromEvent(this._elementRef.nativeElement, 'mouseenter')
75
65
  .pipe(tap(() => {
76
66
  this._willMount = true;
77
67
  this._hasHover = true;
78
68
  }), debounceTime(200))
79
69
  .subscribe(() => {
80
- if (!this._willMount || this._isMounted) {
70
+ if (!this._willMount || this._animatedOverlay.isMounted) {
81
71
  return;
82
72
  }
83
73
  this._mountTooltip();
84
74
  });
85
- const focusSub = fromEvent(this._hostElementRef.nativeElement, 'focus').subscribe(() => {
75
+ const focusSub = fromEvent(this._elementRef.nativeElement, 'focus').subscribe(() => {
86
76
  if (!this._focusVisibleService.isFocusVisible) {
87
77
  return;
88
78
  }
89
79
  this._hasFocus = true;
90
- if (this._isMounted) {
80
+ if (this._animatedOverlay.isMounted) {
91
81
  return;
92
82
  }
93
83
  this._mountTooltip();
94
84
  });
95
- const mouseLeaveSub = fromEvent(this._hostElementRef.nativeElement, 'mouseleave').subscribe(() => {
85
+ const mouseLeaveSub = fromEvent(this._elementRef.nativeElement, 'mouseleave').subscribe(() => {
96
86
  this._hasHover = false;
97
87
  this._willMount = false;
98
- if (this._isMounted && !this._hasFocus) {
99
- this._animateUnmount();
88
+ if (this._animatedOverlay.isMounted && !this._hasFocus) {
89
+ this._animatedOverlay.unmount();
100
90
  }
101
91
  });
102
- const blurSub = fromEvent(this._hostElementRef.nativeElement, 'blur').subscribe(() => {
92
+ const blurSub = fromEvent(this._elementRef.nativeElement, 'blur').subscribe(() => {
103
93
  this._hasFocus = false;
104
94
  this._willMount = false;
105
- if (this._isMounted && !this._hasHover) {
106
- this._animateUnmount();
95
+ if (this._animatedOverlay.isMounted && !this._hasHover) {
96
+ this._animatedOverlay.unmount();
107
97
  }
108
98
  });
109
99
  const keyupEscSub = fromEvent(document, 'keyup')
110
- .pipe(filter((e) => e.key === 'Escape'), filter(() => this._isMounted), tap(() => this._animateUnmount()))
100
+ .pipe(filter((e) => e.key === 'Escape'), filter(() => this._animatedOverlay.isMounted), tap(() => this._animatedOverlay.unmount()))
111
101
  .subscribe();
112
102
  this._listenerSubscriptions.push(mouseEnterSub, mouseLeaveSub, focusSub, blurSub, keyupEscSub);
113
103
  }
@@ -116,9 +106,8 @@ class TooltipDirective {
116
106
  this._listenerSubscriptions.length = 0;
117
107
  }
118
108
  _mountTooltip() {
119
- this._overlayRef = this._createOverlay();
120
- const injector = Injector.create({
121
- parent: this._injector,
109
+ this._animatedOverlay.mount({
110
+ component: TooltipComponent,
122
111
  providers: [
123
112
  {
124
113
  provide: TOOLTIP_CONFIG,
@@ -137,70 +126,6 @@ class TooltipDirective {
137
126
  ],
138
127
  ],
139
128
  });
140
- this._portal = this._portal ?? new ComponentPortal(TooltipComponent, this._viewContainerRef, injector);
141
- this._tooltipRef = this._overlayRef.attach(this._portal);
142
- this._tooltipRef.instance._markForCheck();
143
- this._zone.runOutsideAngular(() => {
144
- if (!this._tooltipRef) {
145
- return;
146
- }
147
- this._popper = createPopper(this._hostElementRef.nativeElement, this._tooltipRef.location.nativeElement, {
148
- placement: this.placement,
149
- modifiers: [
150
- ...(this._defaultConfig.offset
151
- ? [
152
- {
153
- name: 'offset',
154
- options: {
155
- offset: this._defaultConfig.offset,
156
- },
157
- },
158
- ]
159
- : []),
160
- ...(this._defaultConfig.arrowPadding
161
- ? [
162
- {
163
- name: 'arrow',
164
- options: {
165
- padding: this._defaultConfig.arrowPadding,
166
- },
167
- },
168
- ]
169
- : []),
170
- ],
171
- });
172
- // We need to wait for the tooltip content to be rendered
173
- nextFrame(() => {
174
- if (!this._tooltipRef) {
175
- return;
176
- }
177
- this._popper?.update();
178
- this._tooltipRef.instance._animatedLifecycle?.enter();
179
- });
180
- });
181
- }
182
- _animateUnmount() {
183
- if (!this._tooltipRef) {
184
- return;
185
- }
186
- this._tooltipRef.instance._animatedLifecycle?.leave();
187
- this._tooltipRef.instance._animatedLifecycle?.state$
188
- .pipe(filter((s) => s === 'left'), take(1))
189
- .subscribe(() => this._unmountTooltip());
190
- }
191
- _unmountTooltip() {
192
- this._zone.runOutsideAngular(() => {
193
- this._popper?.destroy();
194
- this._popper = null;
195
- });
196
- if (this._overlayRef) {
197
- this._overlayRef.dispose();
198
- this._overlayRef = null;
199
- }
200
- }
201
- _createOverlay() {
202
- const overlay = this._overlayService.create();
203
- return overlay;
204
129
  }
205
130
  _getTooltipText() {
206
131
  return this._tooltipAriaDescription
@@ -210,12 +135,12 @@ class TooltipDirective {
210
135
  : null;
211
136
  }
212
137
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: TooltipDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
213
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: TooltipDirective, isStandalone: true, selector: "[etTooltip]", inputs: { tooltip: ["etTooltip", "tooltip"], placement: "placement", tooltipAriaDescription: "tooltipAriaDescription" }, providers: [
138
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: TooltipDirective, isStandalone: true, selector: "[etTooltip]", inputs: { tooltip: ["etTooltip", "tooltip"], tooltipAriaDescription: "tooltipAriaDescription" }, providers: [
214
139
  {
215
140
  provide: TOOLTIP_DIRECTIVE,
216
141
  useExisting: TooltipDirective,
217
142
  },
218
- ], ngImport: i0 }); }
143
+ ], hostDirectives: [{ directive: i1.AnimatedOverlayDirective, inputs: ["placement", "placement"] }], ngImport: i0 }); }
219
144
  }
220
145
  export { TooltipDirective };
221
146
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: TooltipDirective, decorators: [{
@@ -229,13 +154,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImpor
229
154
  useExisting: TooltipDirective,
230
155
  },
231
156
  ],
157
+ hostDirectives: [{ directive: AnimatedOverlayDirective, inputs: ['placement'] }],
232
158
  }]
233
- }], propDecorators: { tooltip: [{
159
+ }], ctorParameters: function () { return []; }, propDecorators: { tooltip: [{
234
160
  type: Input,
235
161
  args: ['etTooltip']
236
- }], placement: [{
237
- type: Input
238
162
  }], tooltipAriaDescription: [{
239
163
  type: Input
240
164
  }] } });
241
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvb3ZlcmxheS9jb21wb25lbnRzL3Rvb2x0aXAvZGlyZWN0aXZlcy90b29sdGlwL3Rvb2x0aXAuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixjQUFjLEVBQ2QsUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBR04sZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBNEQsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQWdCLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7O0FBSWxELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLElBQUksY0FBYyxDQUFtQixtQkFBbUIsQ0FBQyxDQUFDO0FBRTNGLE1BVWEsZ0JBQWdCO0lBVjdCO1FBV1UsbUJBQWMs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bnQiOlsiaW1wb3J0IHsgQXJpYURlc2NyaWJlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IE92ZXJsYXksIE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIENvbXBvbmVudFJlZixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBpbmplY3QsXG4gIEluamVjdGlvblRva2VuLFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb2N1c1Zpc2libGVTZXJ2aWNlLCBuZXh0RnJhbWUgfSBmcm9tICdAZXRobGV0ZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVBvcHBlciwgSW5zdGFuY2UgYXMgUG9wcGVySW5zdGFuY2UsIFBsYWNlbWVudCBhcyBQb3BwZXJQbGFjZW1lbnQgfSBmcm9tICdAcG9wcGVyanMvY29yZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciwgZnJvbUV2ZW50LCBTdWJzY3JpcHRpb24sIHRha2UsIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVG9vbHRpcENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgVE9PTFRJUF9DT05GSUcsIFRPT0xUSVBfVEVNUExBVEUsIFRPT0xUSVBfVEVYVCB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBUb29sdGlwQ29uZmlnIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlVG9vbHRpcENvbmZpZyB9IGZyb20gJy4uLy4uL3V0aWxzJztcblxudHlwZSBUb29sdGlwVGVtcGxhdGUgPSBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuZXhwb3J0IGNvbnN0IFRPT0xUSVBfRElSRUNUSVZFID0gbmV3IEluamVjdGlvblRva2VuPFRvb2x0aXBEaXJlY3RpdmU+KCdUT09MVElQX0RJUkVDVElWRScpO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZXRUb29sdGlwXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IFRPT0xUSVBfRElSRUNUSVZFLFxuICAgICAgdXNlRXhpc3Rpbmc6IFRvb2x0aXBEaXJlY3RpdmUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVG9vbHRpcERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgX2RlZmF1bHRDb25maWcgPSBpbmplY3Q8VG9vbHRpcENvbmZpZz4oVE9PTFRJUF9DT05GSUcsIHsgb3B0aW9uYWw6IHRydWUgfSkgPz8gY3JlYXRlVG9vbHRpcENvbmZpZygpO1xuXG4gIEBJbnB1dCgnZXRUb29sdGlwJylcbiAgZ2V0IHRvb2x0aXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rvb2x0aXA7XG4gIH1cbiAgc2V0IHRvb2x0aXAodjogVG9vbHRpcFRlbXBsYXRlIHwgbnVsbCkge1xuICAgIHRoaXMuX3Rvb2x0aXAgPSB2O1xuXG4gICAgdGhpcy5fdXBkYXRlQXJpYURlc2NyaXB0aW9uKCk7XG5cbiAgICBpZiAodikge1xuICAgICAgdGhpcy5fYWRkTGlzdGVuZXJzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF90b29sdGlwOiBUb29sdGlwVGVtcGxhdGUgfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKVxuICBwbGFjZW1lbnQ6IFBvcHBlclBsYWNlbWVudCA9IHRoaXMuX2RlZmF1bHRDb25maWcucGxhY2VtZW50O1xuXG4gIEBJbnB1dCgpXG4gIGdldCB0b29sdGlwQXJpYURlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl90b29sdGlwQXJpYURlc2NyaXB0aW9uO1xuICB9XG4gIHNldCB0b29sdGlwQXJpYURlc2NyaXB0aW9uKHY6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLl90b29sdGlwQXJpYURlc2NyaXB0aW9uID0gdjtcbiAgICB0aGlzLl91cGRhdGVBcmlhRGVzY3JpcHRpb24oKTtcbiAgfVxuICBwcml2YXRlIF90b29sdGlwQXJpYURlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfbGFzdFRvb2x0aXBUZXh0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIF9ob3N0RWxlbWVudFJlZiA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gIHByaXZhdGUgX3ZpZXdDb250YWluZXJSZWYgPSBpbmplY3QoVmlld0NvbnRhaW5lclJlZik7XG4gIHByaXZhdGUgX292ZXJsYXlTZXJ2aWNlID0gaW5qZWN0KE92ZXJsYXkpO1xuICBwcml2YXRlIF9hcmlhRGVzY3JpYmVyU2VydmljZSA9IGluamVjdChBcmlhRGVzY3JpYmVyKTtcbiAgcHJpdmF0ZSBfZm9jdXNWaXNpYmxlU2VydmljZSA9IGluamVjdChGb2N1c1Zpc2libGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICBwcml2YXRlIF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgcHJpdmF0ZSBfb3ZlcmxheVJlZjogT3ZlcmxheVJlZiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9wb3J0YWw6IENvbXBvbmVudFBvcnRhbDxUb29sdGlwQ29tcG9uZW50PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF90b29sdGlwUmVmOiBDb21wb25lbnRSZWY8VG9vbHRpcENvbXBvbmVudD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfcG9wcGVyOiBQb3BwZXJJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX3dpbGxNb3VudCA9IHRydWU7XG4gIHByaXZhdGUgX2hhc0ZvY3VzID0gZmFsc2U7XG4gIHByaXZhdGUgX2hhc0hvdmVyID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBnZXQgX2lzTW91bnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVJlZiAhPT0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2xpc3RlbmVyU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl91bm1vdW50VG9vbHRpcCgpO1xuICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlQXJpYURlc2NyaXB0aW9uKCkge1xuICAgIGNvbnN0IHRvb2x0aXBUZXh0ID0gdGhpcy5fZ2V0VG9vbHRpcFRleHQoKTtcblxuICAgIGlmICh0b29sdGlwVGV4dCkge1xuICAgICAgdGhpcy5fYXJpYURlc2NyaWJlclNlcnZpY2UuZGVzY3JpYmUodGhpcy5faG9zdEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdG9vbHRpcFRleHQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fbGFzdFRvb2x0aXBUZXh0KSB7XG4gICAgICB0aGlzLl9hcmlhRGVzY3JpYmVyU2VydmljZS5yZW1vdmVEZXNjcmlwdGlvbih0aGlzLl9ob3N0RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLl9sYXN0VG9vbHRpcFRleHQpO1xuICAgIH1cblxuICAgIHRoaXMuX2xhc3RUb29sdGlwVGV4dCA9IHRvb2x0aXBUZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBfYWRkTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IG1vdXNlRW50ZXJTdWIgPSBmcm9tRXZlbnQodGhpcy5faG9zdEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ21vdXNlZW50ZXInKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fd2lsbE1vdW50ID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9oYXNIb3ZlciA9IHRydWU7XG4gICAgICAgIH0pLFxuICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX3dpbGxNb3VudCB8fCB0aGlzLl9pc01vdW50ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tb3VudFRvb2x0aXAoKTtcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgZm9jdXNTdWIgPSBmcm9tRXZlbnQodGhpcy5faG9zdEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2ZvY3VzJykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5fZm9jdXNWaXNpYmxlU2VydmljZS5pc0ZvY3VzVmlzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2hhc0ZvY3VzID0gdHJ1ZTtcblxuICAgICAgaWYgKHRoaXMuX2lzTW91bnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX21vdW50VG9vbHRpcCgpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgbW91c2VMZWF2ZVN1YiA9IGZyb21FdmVudCh0aGlzLl9ob3N0RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnbW91c2VsZWF2ZScpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLl9oYXNIb3ZlciA9IGZhbHNlO1xuICAgICAgdGhpcy5fd2lsbE1vdW50ID0gZmFsc2U7XG5cbiAgICAgIGlmICh0aGlzLl9pc01vdW50ZWQgJiYgIXRoaXMuX2hhc0ZvY3VzKSB7XG4gICAgICAgIHRoaXMuX2FuaW1hdGVVbm1vdW50KCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBibHVyU3ViID0gZnJvbUV2ZW50KHRoaXMuX2hvc3RFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdibHVyJykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuX2hhc0ZvY3VzID0gZmFsc2U7XG4gICAgICB0aGlzLl93aWxsTW91bnQgPSBmYWxzZTtcblxuICAgICAgaWYgKHRoaXMuX2lzTW91bnRlZCAmJiAhdGhpcy5faGFzSG92ZXIpIHtcbiAgICAgICAgdGhpcy5fYW5pbWF0ZVVubW91bnQoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGtleXVwRXNjU3ViID0gZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRvY3VtZW50LCAna2V5dXAnKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoZSkgPT4gZS5rZXkgPT09ICdFc2NhcGUnKSxcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuX2lzTW91bnRlZCksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLl9hbmltYXRlVW5tb3VudCgpKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMuX2xpc3RlbmVyU3Vic2NyaXB0aW9ucy5wdXNoKG1vdXNlRW50ZXJTdWIsIG1vdXNlTGVhdmVTdWIsIGZvY3VzU3ViLCBibHVyU3ViLCBrZXl1cEVzY1N1Yik7XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5fbGlzdGVuZXJTdWJzY3JpcHRpb25zLmZvckVhY2goKHMpID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgdGhpcy5fbGlzdGVuZXJTdWJzY3JpcHRpb25zLmxlbmd0aCA9IDA7XG4gIH1cblxuICBwcml2YXRlIF9tb3VudFRvb2x0aXAoKSB7XG4gICAgdGhpcy5fb3ZlcmxheVJlZiA9IHRoaXMuX2NyZWF0ZU92ZXJsYXkoKTtcblxuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHBhcmVudDogdGhpcy5faW5qZWN0b3IsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IFRPT0xUSVBfQ09ORklHLFxuICAgICAgICAgIHVzZVZhbHVlOiB0aGlzLl9kZWZhdWx0Q29uZmlnLFxuICAgICAgICB9LFxuICAgICAgICAuLi5bXG4gICAgICAgICAgdHlwZW9mIHRoaXMudG9vbHRpcCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHByb3ZpZGU6IFRPT0xUSVBfVEVYVCxcbiAgICAgICAgICAgICAgICB1c2VWYWx1ZTogdGhpcy50b29sdGlwLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBwcm92aWRlOiBUT09MVElQX1RFTVBMQVRFLFxuICAgICAgICAgICAgICAgIHVzZVZhbHVlOiB0aGlzLnRvb2x0aXAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fcG9ydGFsID0gdGhpcy5fcG9ydGFsID8/IG5ldyBDb21wb25lbnRQb3J0YWwoVG9vbHRpcENvbXBvbmVudCwgdGhpcy5fdmlld0NvbnRhaW5lclJlZiwgaW5qZWN0b3IpO1xuICAgIHRoaXMuX3Rvb2x0aXBSZWYgPSB0aGlzLl9vdmVybGF5UmVmLmF0dGFjaCh0aGlzLl9wb3J0YWwpO1xuXG4gICAgdGhpcy5fdG9vbHRpcFJlZi5pbnN0YW5jZS5fbWFya0ZvckNoZWNrKCk7XG5cbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5fdG9vbHRpcFJlZikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9wb3BwZXIgPSBjcmVhdGVQb3BwZXIodGhpcy5faG9zdEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5fdG9vbHRpcFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LCB7XG4gICAgICAgIHBsYWNlbWVudDogdGhpcy5wbGFjZW1lbnQsXG4gICAgICAgIG1vZGlmaWVyczogW1xuICAgICAgICAgIC4uLih0aGlzLl9kZWZhdWx0Q29uZmlnLm9mZnNldFxuICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5fZGVmYXVsdENvbmZpZy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgIC4uLih0aGlzLl9kZWZhdWx0Q29uZmlnLmFycm93UGFkZGluZ1xuICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbmFtZTogJ2Fycm93JyxcbiAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogdGhpcy5fZGVmYXVsdENvbmZpZy5hcnJvd1BhZGRpbmcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW10pLFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHRvb2x0aXAgY29udGVudCB0byBiZSByZW5kZXJlZFxuICAgICAgbmV4dEZyYW1lKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLl90b29sdGlwUmVmKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcG9wcGVyPy51cGRhdGUoKTtcbiAgICAgICAgdGhpcy5fdG9vbHRpcFJlZi5pbnN0YW5jZS5fYW5pbWF0ZWRMaWZlY3ljbGU/LmVudGVyKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2FuaW1hdGVVbm1vdW50KCkge1xuICAgIGlmICghdGhpcy5fdG9vbHRpcFJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Rvb2x0aXBSZWYuaW5zdGFuY2UuX2FuaW1hdGVkTGlmZWN5Y2xlPy5sZWF2ZSgpO1xuXG4gICAgdGhpcy5fdG9vbHRpcFJlZi5pbnN0YW5jZS5fYW5pbWF0ZWRMaWZlY3ljbGU/LnN0YXRlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigocykgPT4gcyA9PT0gJ2xlZnQnKSxcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fdW5tb3VudFRvb2x0aXAoKSk7XG4gIH1cblxuICBwcml2YXRlIF91bm1vdW50VG9vbHRpcCgpIHtcbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuX3BvcHBlcj8uZGVzdHJveSgpO1xuICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbDtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLl9vdmVybGF5UmVmKSB7XG4gICAgICB0aGlzLl9vdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuX292ZXJsYXlSZWYgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZU92ZXJsYXkoKSB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMuX292ZXJsYXlTZXJ2aWNlLmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIG92ZXJsYXk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRUb29sdGlwVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdG9vbHRpcEFyaWFEZXNjcmlwdGlvblxuICAgICAgPyB0aGlzLl90b29sdGlwQXJpYURlc2NyaXB0aW9uXG4gICAgICA6IHR5cGVvZiB0aGlzLnRvb2x0aXAgPT09ICdzdHJpbmcnXG4gICAgICA/IHRoaXMudG9vbHRpcFxuICAgICAgOiBudWxsO1xuICB9XG59XG4iXX0=
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvb3ZlcmxheS9jb21wb25lbnRzL3Rvb2x0aXAvZGlyZWN0aXZlcy90b29sdGlwL3Rvb2x0aXAuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUEwQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0csT0FBTyxFQUFFLHdCQUF3QixFQUFFLG1CQUFtQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlFLE9BQU8sRUFBZ0IsWUFBWSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7QUFJbEQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxjQUFjLENBQW1CLG1CQUFtQixDQUFDLENBQUM7QUFFM0YsTUFXYSxnQkFBZ0I7SUFJM0IsSUFDSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxDQUF5QjtRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUVsQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUU5QixJQUFJLENBQUMsRUFBRTtZQUNMLElBQUksQ0FB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O2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sZUFBZTtRQUNyQixPQUFPLElBQUksQ0FBQyx1QkFBdUI7WUFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUI7WUFDOUIsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxRQUFRO2dCQUNsQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU87Z0JBQ2QsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNYLENBQUM7OEdBL0pVLGdCQUFnQjtrR0FBaEIsZ0JBQWdCLDJKQVJoQjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxnQkFBZ0I7YUFDOUI7U0FDRjs7U0FHVSxnQkFBZ0I7MkZBQWhCLGdCQUFnQjtrQkFYNUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsYUFBYTtvQkFDdkIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLGtCQUFrQjt5QkFDOUI7cUJBQ0Y7b0JBQ0QsY0FBYyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztpQkFDakY7MEVBTUssT0FBTztzQkFEVixLQUFLO3VCQUFDLFdBQVc7Z0JBa0JkLHNCQUFzQjtzQkFEekIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFyaWFEZXNjcmliZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEluamVjdGlvblRva2VuLCBJbnB1dCwgT25EZXN0cm95LCBUZW1wbGF0ZVJlZiwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBbmltYXRlZE92ZXJsYXlEaXJlY3RpdmUsIEZvY3VzVmlzaWJsZVNlcnZpY2UgfSBmcm9tICdAZXRobGV0ZS9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIGZyb21FdmVudCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUb29sdGlwQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cyc7XG5pbXBvcnQgeyBUT09MVElQX0NPTkZJRywgVE9PTFRJUF9URU1QTEFURSwgVE9PTFRJUF9URVhUIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFRvb2x0aXBDb25maWcgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVUb29sdGlwQ29uZmlnIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG50eXBlIFRvb2x0aXBUZW1wbGF0ZSA9IHN0cmluZyB8IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG5leHBvcnQgY29uc3QgVE9PTFRJUF9ESVJFQ1RJVkUgPSBuZXcgSW5qZWN0aW9uVG9rZW48VG9vbHRpcERpcmVjdGl2ZT4oJ1RPT0xUSVBfRElSRUNUSVZFJyk7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tldFRvb2x0aXBdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogVE9PTFRJUF9ESVJFQ1RJVkUsXG4gICAgICB1c2VFeGlzdGluZzogVG9vbHRpcERpcmVjdGl2ZSxcbiAgICB9LFxuICBdLFxuICBob3N0RGlyZWN0aXZlczogW3sgZGlyZWN0aXZlOiBBbmltYXRlZE92ZXJsYXlEaXJlY3RpdmUsIGlucHV0czogWydwbGFjZW1lbnQnXSB9XSxcbn0pXG5leHBvcnQgY2xhc3MgVG9vbHRpcERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RlZmF1bHRDb25maWcgPSBpbmplY3Q8VG9vbHRpcENvbmZpZz4oVE9PTFRJUF9DT05GSUcsIHsgb3B0aW9uYWw6IHRydWUgfSkgPz8gY3JlYXRlVG9vbHRpcENvbmZpZygpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hbmltYXRlZE92ZXJsYXkgPSBpbmplY3Q8QW5pbWF0ZWRPdmVybGF5RGlyZWN0aXZlPFRvb2x0aXBDb21wb25lbnQ+PihBbmltYXRlZE92ZXJsYXlEaXJlY3RpdmUpO1xuXG4gIEBJbnB1dCgnZXRUb29sdGlwJylcbiAgZ2V0IHRvb2x0aXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rvb2x0aXA7XG4gIH1cbiAgc2V0IHRvb2x0aXAodjogVG9vbHRpcFRlbXBsYXRlIHwgbnVsbCkge1xuICAgIHRoaXMuX3Rvb2x0aXAgPSB2O1xuXG4gICAgdGhpcy5fdXBkYXRlQXJpYURlc2NyaXB0aW9uKCk7XG5cbiAgICBpZiAodikge1xuICAgICAgdGhpcy5fYWRkTGlzdGVuZXJzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF90b29sdGlwOiBUb29sdGlwVGVtcGxhdGUgfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKVxuICBnZXQgdG9vbHRpcEFyaWFEZXNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fdG9vbHRpcEFyaWFEZXNjcmlwdGlvbjtcbiAgfVxuICBzZXQgdG9vbHRpcEFyaWFEZXNjcmlwdGlvbih2OiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5fdG9vbHRpcEFyaWFEZXNjcmlwdGlvbiA9IHY7XG4gICAgdGhpcy5fdXBkYXRlQXJpYURlc2NyaXB0aW9uKCk7XG4gIH1cbiAgcHJpdmF0ZSBfdG9vbHRpcEFyaWFEZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2xhc3RUb29sdGlwVGV4dDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBfZWxlbWVudFJlZiA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gIHByaXZhdGUgX2FyaWFEZXNjcmliZXJTZXJ2aWNlID0gaW5qZWN0KEFyaWFEZXNjcmliZXIpO1xuICBwcml2YXRlIF9mb2N1c1Zpc2libGVTZXJ2aWNlID0gaW5qZWN0KEZvY3VzVmlzaWJsZVNlcnZpY2UpO1xuXG4gIHByaXZhdGUgX3dpbGxNb3VudCA9IHRydWU7XG4gIHByaXZhdGUgX2hhc0ZvY3VzID0gZmFsc2U7XG4gIHByaXZhdGUgX2hhc0hvdmVyID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbGlzdGVuZXJTdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5wbGFjZW1lbnQgPSB0aGlzLl9kZWZhdWx0Q29uZmlnLnBsYWNlbWVudDtcbiAgICB0aGlzLl9hbmltYXRlZE92ZXJsYXkub2Zmc2V0ID0gdGhpcy5fZGVmYXVsdENvbmZpZy5vZmZzZXQ7XG4gICAgdGhpcy5fYW5pbWF0ZWRPdmVybGF5LmFycm93UGFkZGluZyA9IHRoaXMuX2RlZmF1bHRDb25maWcuYXJyb3dQYWRkaW5nO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fYW5pbWF0ZWRPdmVybGF5Ll9kZXN0cm95KCk7XG4gICAgdGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVBcmlhRGVzY3JpcHRpb24oKSB7XG4gICAgY29uc3QgdG9vbHRpcFRleHQgPSB0aGlzLl9nZXRUb29sdGlwVGV4dCgpO1xuXG4gICAgaWYgKHRvb2x0aXBUZXh0KSB7XG4gICAgICB0aGlzLl9hcmlhRGVzY3JpYmVyU2VydmljZS5kZXNjcmliZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRvb2x0aXBUZXh0KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2xhc3RUb29sdGlwVGV4dCkge1xuICAgICAgdGhpcy5fYXJpYURlc2NyaWJlclNlcnZpY2UucmVtb3ZlRGVzY3JpcHRpb24odGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLl9sYXN0VG9vbHRpcFRleHQpO1xuICAgIH1cblxuICAgIHRoaXMuX2xhc3RUb29sdGlwVGV4dCA9IHRvb2x0aXBUZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBfYWRkTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IG1vdXNlRW50ZXJTdWIgPSBmcm9tRXZlbnQodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnbW91c2VlbnRlcicpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl93aWxsTW91bnQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX2hhc0hvdmVyID0gdHJ1ZTtcbiAgICAgICAgfSksXG4gICAgICAgIGRlYm91bmNlVGltZSgyMDApLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5fd2lsbE1vdW50IHx8IHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5pc01vdW50ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tb3VudFRvb2x0aXAoKTtcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgZm9jdXNTdWIgPSBmcm9tRXZlbnQodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZm9jdXMnKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9mb2N1c1Zpc2libGVTZXJ2aWNlLmlzRm9jdXNWaXNpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faGFzRm9jdXMgPSB0cnVlO1xuXG4gICAgICBpZiAodGhpcy5fYW5pbWF0ZWRPdmVybGF5LmlzTW91bnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX21vdW50VG9vbHRpcCgpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgbW91c2VMZWF2ZVN1YiA9IGZyb21FdmVudCh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuX2hhc0hvdmVyID0gZmFsc2U7XG4gICAgICB0aGlzLl93aWxsTW91bnQgPSBmYWxzZTtcblxuICAgICAgaWYgKHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5pc01vdW50ZWQgJiYgIXRoaXMuX2hhc0ZvY3VzKSB7XG4gICAgICAgIHRoaXMuX2FuaW1hdGVkT3ZlcmxheS51bm1vdW50KCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBibHVyU3ViID0gZnJvbUV2ZW50KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2JsdXInKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5faGFzRm9jdXMgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3dpbGxNb3VudCA9IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5fYW5pbWF0ZWRPdmVybGF5LmlzTW91bnRlZCAmJiAhdGhpcy5faGFzSG92ZXIpIHtcbiAgICAgICAgdGhpcy5fYW5pbWF0ZWRPdmVybGF5LnVubW91bnQoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGtleXVwRXNjU3ViID0gZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRvY3VtZW50LCAna2V5dXAnKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoZSkgPT4gZS5rZXkgPT09ICdFc2NhcGUnKSxcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5pc01vdW50ZWQpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fYW5pbWF0ZWRPdmVybGF5LnVubW91bnQoKSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLl9saXN0ZW5lclN1YnNjcmlwdGlvbnMucHVzaChtb3VzZUVudGVyU3ViLCBtb3VzZUxlYXZlU3ViLCBmb2N1c1N1YiwgYmx1clN1Yiwga2V5dXBFc2NTdWIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlTGlzdGVuZXJzKCkge1xuICAgIHRoaXMuX2xpc3RlbmVyU3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMuX2xpc3RlbmVyU3Vic2NyaXB0aW9ucy5sZW5ndGggPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfbW91bnRUb29sdGlwKCkge1xuICAgIHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5tb3VudCh7XG4gICAgICBjb21wb25lbnQ6IFRvb2x0aXBDb21wb25lbnQsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IFRPT0xUSVBfQ09ORklHLFxuICAgICAgICAgIHVzZVZhbHVlOiB0aGlzLl9kZWZhdWx0Q29uZmlnLFxuICAgICAgICB9LFxuICAgICAgICAuLi5bXG4gICAgICAgICAgdHlwZW9mIHRoaXMudG9vbHRpcCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHByb3ZpZGU6IFRPT0xUSVBfVEVYVCxcbiAgICAgICAgICAgICAgICB1c2VWYWx1ZTogdGhpcy50b29sdGlwLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBwcm92aWRlOiBUT09MVElQX1RFTVBMQVRFLFxuICAgICAgICAgICAgICAgIHVzZVZhbHVlOiB0aGlzLnRvb2x0aXAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VG9vbHRpcFRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rvb2x0aXBBcmlhRGVzY3JpcHRpb25cbiAgICAgID8gdGhpcy5fdG9vbHRpcEFyaWFEZXNjcmlwdGlvblxuICAgICAgOiB0eXBlb2YgdGhpcy50b29sdGlwID09PSAnc3RyaW5nJ1xuICAgICAgPyB0aGlzLnRvb2x0aXBcbiAgICAgIDogbnVsbDtcbiAgfVxufVxuIl19
@@ -1,13 +1,13 @@
1
- import { coerceBooleanProperty } from '@angular/cdk/coercion';
1
+ import { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';
2
2
  import { NgClass, NgIf } from '@angular/common';
3
- import { ChangeDetectionStrategy, Component, ElementRef, HostBinding, inject, Input, Renderer2, ViewChild, ViewEncapsulation, } from '@angular/core';
4
- import { CursorDragScrollDirective, DestroyService, equal, LetDirective, ObserveScrollStateDirective, } from '@ethlete/core';
5
- import { BehaviorSubject, takeUntil, tap } from 'rxjs';
3
+ import { ChangeDetectionStrategy, Component, ContentChildren, ElementRef, HostBinding, Input, Renderer2, ViewChild, ViewEncapsulation, inject, } from '@angular/core';
4
+ import { CursorDragScrollDirective, IS_ACTIVE_ELEMENT, LetDirective, ObserveScrollStateDirective, createDestroy, equal, scrollToElement, } from '@ethlete/core';
5
+ import { BehaviorSubject, startWith, takeUntil, tap } from 'rxjs';
6
6
  import { ChevronIconComponent } from '../../../icons';
7
7
  import * as i0 from "@angular/core";
8
8
  class ScrollableComponent {
9
9
  constructor() {
10
- this._destroy$ = inject(DestroyService, { host: true }).destroy$;
10
+ this._destroy$ = createDestroy();
11
11
  this._renderer = inject(Renderer2);
12
12
  this._elementRef = inject(ElementRef);
13
13
  this.itemSize = 'auto';
@@ -17,6 +17,9 @@ class ScrollableComponent {
17
17
  this._renderScrollbars = false;
18
18
  this._stickyButtons = false;
19
19
  this._cursorDragScroll = true;
20
+ this._activeElementScrollMargin = 40;
21
+ this._disableActiveElementScrolling = false;
22
+ this.activeElements = null;
20
23
  this.scrollState$ = new BehaviorSubject(null);
21
24
  }
22
25
  get renderMasks() {
@@ -49,6 +52,18 @@ class ScrollableComponent {
49
52
  set cursorDragScroll(value) {
50
53
  this._cursorDragScroll = coerceBooleanProperty(value);
51
54
  }
55
+ get activeElementScrollMargin() {
56
+ return this._activeElementScrollMargin;
57
+ }
58
+ set activeElementScrollMargin(value) {
59
+ this._activeElementScrollMargin = coerceNumberProperty(value);
60
+ }
61
+ get disableActiveElementScrolling() {
62
+ return this._disableActiveElementScrolling;
63
+ }
64
+ set disableActiveElementScrolling(value) {
65
+ this._disableActiveElementScrolling = coerceBooleanProperty(value);
66
+ }
52
67
  ngOnInit() {
53
68
  this.scrollState$
54
69
  .pipe(tap((state) => {
@@ -62,6 +77,31 @@ class ScrollableComponent {
62
77
  }), takeUntil(this._destroy$))
63
78
  .subscribe();
64
79
  }
80
+ ngAfterContentInit() {
81
+ if (!this.activeElements) {
82
+ return;
83
+ }
84
+ this.activeElements.changes
85
+ .pipe(startWith(this.activeElements), tap((activeElements) => {
86
+ if (this.disableActiveElementScrolling) {
87
+ return;
88
+ }
89
+ const firstActive = activeElements
90
+ .filter((a) => !!a)
91
+ .find((a) => a.isActiveElement);
92
+ if (!firstActive) {
93
+ return;
94
+ }
95
+ scrollToElement({
96
+ behavior: 'auto',
97
+ container: this.scrollable.nativeElement,
98
+ element: firstActive.elementRef.nativeElement,
99
+ scrollInlineMargin: this.direction === 'horizontal' ? this.activeElementScrollMargin : 0,
100
+ scrollBlockMargin: this.direction === 'horizontal' ? 0 : this.activeElementScrollMargin,
101
+ });
102
+ }), takeUntil(this._destroy$))
103
+ .subscribe();
104
+ }
65
105
  _scrollStateChanged(scrollState) {
66
106
  if (equal(this.scrollState$.value, scrollState)) {
67
107
  return;
@@ -85,14 +125,14 @@ class ScrollableComponent {
85
125
  });
86
126
  }
87
127
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ScrollableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
88
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: ScrollableComponent, isStandalone: true, selector: "et-scrollable", inputs: { itemSize: "itemSize", direction: "direction", scrollableRole: "scrollableRole", scrollableClass: "scrollableClass", renderMasks: "renderMasks", renderButtons: "renderButtons", renderScrollbars: "renderScrollbars", stickyButtons: "stickyButtons", cursorDragScroll: "cursorDragScroll" }, host: { properties: { "attr.item-size": "this.itemSize", "attr.direction": "this.direction", "attr.render-scrollbars": "this.renderScrollbars", "attr.sticky-buttons": "this.stickyButtons" }, classAttribute: "et-scrollable" }, providers: [DestroyService], viewQueries: [{ propertyName: "scrollable", first: true, predicate: ["scrollable"], descendants: true, static: true }], ngImport: i0, template: "<div\n #scrollable\n [attr.role]=\"scrollableRole ?? undefined\"\n [ngClass]=\"scrollableClass\"\n [etCursorDragScroll]=\"cursorDragScroll\"\n (etObserveScrollState)=\"_scrollStateChanged($event)\"\n class=\"et-scrollable-container\"\n>\n <ng-content />\n</div>\n\n<div *ngIf=\"renderMasks\" class=\"et-scrollable-masks\">\n <div class=\"et-scrollable-mask et-scrollable-mask--start\"></div>\n <div class=\"et-scrollable-mask et-scrollable-mask--end\"></div>\n</div>\n\n<div *ngIf=\"renderButtons\" class=\"et-scrollable-buttons\">\n <button\n (click)=\"scrollOneContainerSizeToStart()\"\n class=\"et-scrollable-button et-scrollable-button--start\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n <button\n (click)=\"scrollOneContainerSizeToEnd()\"\n class=\"et-scrollable-button et-scrollable-button--end\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n</div>\n", styles: [".et-scrollable{--mask: #121212 0, transparent 100%;--mask-size: 25px;--_auto-size: min-content;--_flow: column;display:grid;position:relative}.et-scrollable[item-size=same]{--auto-size: 1fr}.et-scrollable[render-scrollbars=false] .et-scrollable-container{scrollbar-width:none}.et-scrollable[render-scrollbars=false] .et-scrollable-container::-webkit-scrollbar{display:none}.et-scrollable[direction=horizontal] .et-scrollable-container{grid-auto-columns:var(--_auto-size)}.et-scrollable[direction=horizontal] .et-scrollable-mask,.et-scrollable[direction=horizontal] .et-scrollable-button{inline-size:var(--mask-size);block-size:100%}.et-scrollable[direction=horizontal] .et-scrollable-mask--start,.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:0;inset-inline:0 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--end,.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:0;inset-inline:calc(100% - 40px) 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--start{background:linear-gradient(to right,var(--mask))}.et-scrollable[direction=horizontal] .et-scrollable-mask--end{background:linear-gradient(to left,var(--mask));inset-inline:calc(100% - var(--mask-size)) 100%}.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:calc(50% - 20px);transform:rotate(-90deg)}.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:calc(50% - 20px);transform:rotate(90deg)}.et-scrollable[direction=vertical]{--_flow: row}.et-scrollable[direction=vertical] .et-scrollable-container{grid-auto-rows:var(--_auto-size)}.et-scrollable[direction=vertical] .et-scrollable-mask,.et-scrollable[direction=vertical] .et-scrollable-button{block-size:var(--mask-size);inline-size:100%}.et-scrollable[direction=vertical] .et-scrollable-mask--start,.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-block-start:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--end,.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-block-end:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--start{background:linear-gradient(to bottom,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-mask--end{background:linear-gradient(to top,var(--mask))}.et-scrollable[at-start=false] .et-scrollable-masks .et-scrollable-mask--start,.et-scrollable[at-start=false] .et-scrollable-buttons .et-scrollable-button--start{opacity:1}.et-scrollable[at-start=false] .et-scrollable-buttons .et-scrollable-button--start{pointer-events:all}.et-scrollable[at-end=false] .et-scrollable-masks .et-scrollable-mask--end,.et-scrollable[at-end=false] .et-scrollable-buttons .et-scrollable-button--end{opacity:1}.et-scrollable[at-end=false] .et-scrollable-buttons .et-scrollable-button--end{pointer-events:all}.et-scrollable .et-scrollable-container{display:grid;grid-auto-flow:var(--_flow);overflow:auto;grid-row:1/1;grid-column:1/1}.et-scrollable .et-scrollable-masks,.et-scrollable .et-scrollable-buttons{grid-row:1/1;grid-column:1/1;pointer-events:none}.et-scrollable .et-scrollable-masks .et-scrollable-mask,.et-scrollable .et-scrollable-masks .et-scrollable-button,.et-scrollable .et-scrollable-buttons .et-scrollable-mask,.et-scrollable .et-scrollable-buttons .et-scrollable-button{position:absolute;opacity:0;transition:opacity .3s var(--ease-5)}.et-scrollable .et-scrollable-buttons .et-scrollable-button{background:transparent;border:none;padding:12px;inline-size:40px;block-size:40px;border-radius:4px;cursor:pointer}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-chevron-icon{pointer-events:none}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--start{inset-inline:0 0}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--end{inset-inline:calc(100% - 40px) 0}.et-scrollable[sticky-buttons=true] .et-scrollable-buttons{margin-block:10%}.et-scrollable[sticky-buttons=true] .et-scrollable-buttons .et-scrollable-button{position:sticky}\n"], dependencies: [{ kind: "directive", type: CursorDragScrollDirective, selector: "[etCursorDragScroll]", inputs: ["etCursorDragScroll"], exportAs: ["etCursorDragScroll"] }, { kind: "directive", type: ObserveScrollStateDirective, selector: "[etObserveScrollState]", inputs: ["observerRootMargin", "observerThreshold"], outputs: ["etObserveScrollState"], exportAs: ["etObserveScrollState"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ChevronIconComponent, selector: "et-chevron-icon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
128
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: ScrollableComponent, isStandalone: true, selector: "et-scrollable", inputs: { itemSize: "itemSize", direction: "direction", scrollableRole: "scrollableRole", scrollableClass: "scrollableClass", renderMasks: "renderMasks", renderButtons: "renderButtons", renderScrollbars: "renderScrollbars", stickyButtons: "stickyButtons", cursorDragScroll: "cursorDragScroll", activeElementScrollMargin: "activeElementScrollMargin", disableActiveElementScrolling: "disableActiveElementScrolling" }, host: { properties: { "attr.item-size": "this.itemSize", "attr.direction": "this.direction", "attr.render-scrollbars": "this.renderScrollbars", "attr.sticky-buttons": "this.stickyButtons" }, classAttribute: "et-scrollable" }, queries: [{ propertyName: "activeElements", predicate: IS_ACTIVE_ELEMENT, descendants: true }], viewQueries: [{ propertyName: "scrollable", first: true, predicate: ["scrollable"], descendants: true, static: true }], ngImport: i0, template: "<div\n #scrollable\n [attr.role]=\"scrollableRole ?? undefined\"\n [ngClass]=\"scrollableClass\"\n [etCursorDragScroll]=\"cursorDragScroll\"\n (etObserveScrollState)=\"_scrollStateChanged($event)\"\n class=\"et-scrollable-container\"\n>\n <ng-content />\n</div>\n\n<div *ngIf=\"renderMasks\" class=\"et-scrollable-masks\">\n <div class=\"et-scrollable-mask et-scrollable-mask--start\"></div>\n <div class=\"et-scrollable-mask et-scrollable-mask--end\"></div>\n</div>\n\n<div *ngIf=\"renderButtons\" class=\"et-scrollable-buttons\">\n <button\n (click)=\"scrollOneContainerSizeToStart()\"\n class=\"et-scrollable-button et-scrollable-button--start\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n <button\n (click)=\"scrollOneContainerSizeToEnd()\"\n class=\"et-scrollable-button et-scrollable-button--end\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n</div>\n", styles: [".et-scrollable{--mask: #121212 0, transparent 100%;--mask-size: 25px;--_auto-size: min-content;--_flow: column;display:grid;position:relative}.et-scrollable[item-size=same]{--auto-size: 1fr}.et-scrollable[render-scrollbars=false] .et-scrollable-container{scrollbar-width:none}.et-scrollable[render-scrollbars=false] .et-scrollable-container::-webkit-scrollbar{display:none}.et-scrollable[direction=horizontal] .et-scrollable-container{grid-auto-columns:var(--_auto-size)}.et-scrollable[direction=horizontal] .et-scrollable-mask,.et-scrollable[direction=horizontal] .et-scrollable-button{inline-size:var(--mask-size);block-size:100%}.et-scrollable[direction=horizontal] .et-scrollable-mask--start,.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:0;inset-inline:0 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--end,.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:0;inset-inline:calc(100% - 40px) 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--start{background:linear-gradient(to right,var(--mask))}.et-scrollable[direction=horizontal] .et-scrollable-mask--end{background:linear-gradient(to left,var(--mask));inset-inline:calc(100% - var(--mask-size)) 100%}.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:calc(50% - 20px);transform:rotate(-90deg)}.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:calc(50% - 20px);transform:rotate(90deg)}.et-scrollable[direction=vertical]{--_flow: row}.et-scrollable[direction=vertical] .et-scrollable-container{grid-auto-rows:var(--_auto-size)}.et-scrollable[direction=vertical] .et-scrollable-mask,.et-scrollable[direction=vertical] .et-scrollable-button{block-size:var(--mask-size);inline-size:100%}.et-scrollable[direction=vertical] .et-scrollable-mask--start,.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-block-start:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--end,.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-block-end:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--start{background:linear-gradient(to bottom,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-mask--end{background:linear-gradient(to top,var(--mask))}.et-scrollable[at-start=false] .et-scrollable-masks .et-scrollable-mask--start,.et-scrollable[at-start=false] .et-scrollable-buttons .et-scrollable-button--start{opacity:1}.et-scrollable[at-start=false] .et-scrollable-buttons .et-scrollable-button--start{pointer-events:all}.et-scrollable[at-end=false] .et-scrollable-masks .et-scrollable-mask--end,.et-scrollable[at-end=false] .et-scrollable-buttons .et-scrollable-button--end{opacity:1}.et-scrollable[at-end=false] .et-scrollable-buttons .et-scrollable-button--end{pointer-events:all}.et-scrollable .et-scrollable-container{display:grid;grid-auto-flow:var(--_flow);overflow:auto;grid-row:1/1;grid-column:1/1}.et-scrollable .et-scrollable-masks,.et-scrollable .et-scrollable-buttons{grid-row:1/1;grid-column:1/1;pointer-events:none}.et-scrollable .et-scrollable-masks .et-scrollable-mask,.et-scrollable .et-scrollable-masks .et-scrollable-button,.et-scrollable .et-scrollable-buttons .et-scrollable-mask,.et-scrollable .et-scrollable-buttons .et-scrollable-button{position:absolute;opacity:0;transition:opacity .3s var(--ease-5)}.et-scrollable .et-scrollable-buttons .et-scrollable-button{background:transparent;border:none;padding:12px;inline-size:40px;block-size:40px;border-radius:4px;cursor:pointer}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-chevron-icon{pointer-events:none}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--start{inset-inline:0 0}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--end{inset-inline:calc(100% - 40px) 0}.et-scrollable[sticky-buttons=true] .et-scrollable-buttons{margin-block:10%}.et-scrollable[sticky-buttons=true] .et-scrollable-buttons .et-scrollable-button{position:sticky}\n"], dependencies: [{ kind: "directive", type: CursorDragScrollDirective, selector: "[etCursorDragScroll]", inputs: ["etCursorDragScroll"], exportAs: ["etCursorDragScroll"] }, { kind: "directive", type: ObserveScrollStateDirective, selector: "[etObserveScrollState]", inputs: ["observerRootMargin", "observerThreshold"], outputs: ["etObserveScrollState"], exportAs: ["etObserveScrollState"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ChevronIconComponent, selector: "et-chevron-icon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
89
129
  }
90
130
  export { ScrollableComponent };
91
131
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ScrollableComponent, decorators: [{
92
132
  type: Component,
93
133
  args: [{ selector: 'et-scrollable', standalone: true, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CursorDragScrollDirective, ObserveScrollStateDirective, NgClass, NgIf, LetDirective, ChevronIconComponent], host: {
94
134
  class: 'et-scrollable',
95
- }, providers: [DestroyService], template: "<div\n #scrollable\n [attr.role]=\"scrollableRole ?? undefined\"\n [ngClass]=\"scrollableClass\"\n [etCursorDragScroll]=\"cursorDragScroll\"\n (etObserveScrollState)=\"_scrollStateChanged($event)\"\n class=\"et-scrollable-container\"\n>\n <ng-content />\n</div>\n\n<div *ngIf=\"renderMasks\" class=\"et-scrollable-masks\">\n <div class=\"et-scrollable-mask et-scrollable-mask--start\"></div>\n <div class=\"et-scrollable-mask et-scrollable-mask--end\"></div>\n</div>\n\n<div *ngIf=\"renderButtons\" class=\"et-scrollable-buttons\">\n <button\n (click)=\"scrollOneContainerSizeToStart()\"\n class=\"et-scrollable-button et-scrollable-button--start\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n <button\n (click)=\"scrollOneContainerSizeToEnd()\"\n class=\"et-scrollable-button et-scrollable-button--end\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n</div>\n", styles: [".et-scrollable{--mask: #121212 0, transparent 100%;--mask-size: 25px;--_auto-size: min-content;--_flow: column;display:grid;position:relative}.et-scrollable[item-size=same]{--auto-size: 1fr}.et-scrollable[render-scrollbars=false] .et-scrollable-container{scrollbar-width:none}.et-scrollable[render-scrollbars=false] .et-scrollable-container::-webkit-scrollbar{display:none}.et-scrollable[direction=horizontal] .et-scrollable-container{grid-auto-columns:var(--_auto-size)}.et-scrollable[direction=horizontal] .et-scrollable-mask,.et-scrollable[direction=horizontal] .et-scrollable-button{inline-size:var(--mask-size);block-size:100%}.et-scrollable[direction=horizontal] .et-scrollable-mask--start,.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:0;inset-inline:0 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--end,.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:0;inset-inline:calc(100% - 40px) 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--start{background:linear-gradient(to right,var(--mask))}.et-scrollable[direction=horizontal] .et-scrollable-mask--end{background:linear-gradient(to left,var(--mask));inset-inline:calc(100% - var(--mask-size)) 100%}.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:calc(50% - 20px);transform:rotate(-90deg)}.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:calc(50% - 20px);transform:rotate(90deg)}.et-scrollable[direction=vertical]{--_flow: row}.et-scrollable[direction=vertical] .et-scrollable-container{grid-auto-rows:var(--_auto-size)}.et-scrollable[direction=vertical] .et-scrollable-mask,.et-scrollable[direction=vertical] .et-scrollable-button{block-size:var(--mask-size);inline-size:100%}.et-scrollable[direction=vertical] .et-scrollable-mask--start,.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-block-start:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--end,.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-block-end:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--start{background:linear-gradient(to bottom,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-mask--end{background:linear-gradient(to top,var(--mask))}.et-scrollable[at-start=false] .et-scrollable-masks .et-scrollable-mask--start,.et-scrollable[at-start=false] .et-scrollable-buttons .et-scrollable-button--start{opacity:1}.et-scrollable[at-start=false] .et-scrollable-buttons .et-scrollable-button--start{pointer-events:all}.et-scrollable[at-end=false] .et-scrollable-masks .et-scrollable-mask--end,.et-scrollable[at-end=false] .et-scrollable-buttons .et-scrollable-button--end{opacity:1}.et-scrollable[at-end=false] .et-scrollable-buttons .et-scrollable-button--end{pointer-events:all}.et-scrollable .et-scrollable-container{display:grid;grid-auto-flow:var(--_flow);overflow:auto;grid-row:1/1;grid-column:1/1}.et-scrollable .et-scrollable-masks,.et-scrollable .et-scrollable-buttons{grid-row:1/1;grid-column:1/1;pointer-events:none}.et-scrollable .et-scrollable-masks .et-scrollable-mask,.et-scrollable .et-scrollable-masks .et-scrollable-button,.et-scrollable .et-scrollable-buttons .et-scrollable-mask,.et-scrollable .et-scrollable-buttons .et-scrollable-button{position:absolute;opacity:0;transition:opacity .3s var(--ease-5)}.et-scrollable .et-scrollable-buttons .et-scrollable-button{background:transparent;border:none;padding:12px;inline-size:40px;block-size:40px;border-radius:4px;cursor:pointer}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-chevron-icon{pointer-events:none}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--start{inset-inline:0 0}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--end{inset-inline:calc(100% - 40px) 0}.et-scrollable[sticky-buttons=true] .et-scrollable-buttons{margin-block:10%}.et-scrollable[sticky-buttons=true] .et-scrollable-buttons .et-scrollable-button{position:sticky}\n"] }]
135
+ }, template: "<div\n #scrollable\n [attr.role]=\"scrollableRole ?? undefined\"\n [ngClass]=\"scrollableClass\"\n [etCursorDragScroll]=\"cursorDragScroll\"\n (etObserveScrollState)=\"_scrollStateChanged($event)\"\n class=\"et-scrollable-container\"\n>\n <ng-content />\n</div>\n\n<div *ngIf=\"renderMasks\" class=\"et-scrollable-masks\">\n <div class=\"et-scrollable-mask et-scrollable-mask--start\"></div>\n <div class=\"et-scrollable-mask et-scrollable-mask--end\"></div>\n</div>\n\n<div *ngIf=\"renderButtons\" class=\"et-scrollable-buttons\">\n <button\n (click)=\"scrollOneContainerSizeToStart()\"\n class=\"et-scrollable-button et-scrollable-button--start\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n <button\n (click)=\"scrollOneContainerSizeToEnd()\"\n class=\"et-scrollable-button et-scrollable-button--end\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n</div>\n", styles: [".et-scrollable{--mask: #121212 0, transparent 100%;--mask-size: 25px;--_auto-size: min-content;--_flow: column;display:grid;position:relative}.et-scrollable[item-size=same]{--auto-size: 1fr}.et-scrollable[render-scrollbars=false] .et-scrollable-container{scrollbar-width:none}.et-scrollable[render-scrollbars=false] .et-scrollable-container::-webkit-scrollbar{display:none}.et-scrollable[direction=horizontal] .et-scrollable-container{grid-auto-columns:var(--_auto-size)}.et-scrollable[direction=horizontal] .et-scrollable-mask,.et-scrollable[direction=horizontal] .et-scrollable-button{inline-size:var(--mask-size);block-size:100%}.et-scrollable[direction=horizontal] .et-scrollable-mask--start,.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:0;inset-inline:0 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--end,.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:0;inset-inline:calc(100% - 40px) 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--start{background:linear-gradient(to right,var(--mask))}.et-scrollable[direction=horizontal] .et-scrollable-mask--end{background:linear-gradient(to left,var(--mask));inset-inline:calc(100% - var(--mask-size)) 100%}.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:calc(50% - 20px);transform:rotate(-90deg)}.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:calc(50% - 20px);transform:rotate(90deg)}.et-scrollable[direction=vertical]{--_flow: row}.et-scrollable[direction=vertical] .et-scrollable-container{grid-auto-rows:var(--_auto-size)}.et-scrollable[direction=vertical] .et-scrollable-mask,.et-scrollable[direction=vertical] .et-scrollable-button{block-size:var(--mask-size);inline-size:100%}.et-scrollable[direction=vertical] .et-scrollable-mask--start,.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-block-start:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--end,.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-block-end:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--start{background:linear-gradient(to bottom,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-mask--end{background:linear-gradient(to top,var(--mask))}.et-scrollable[at-start=false] .et-scrollable-masks .et-scrollable-mask--start,.et-scrollable[at-start=false] .et-scrollable-buttons .et-scrollable-button--start{opacity:1}.et-scrollable[at-start=false] .et-scrollable-buttons .et-scrollable-button--start{pointer-events:all}.et-scrollable[at-end=false] .et-scrollable-masks .et-scrollable-mask--end,.et-scrollable[at-end=false] .et-scrollable-buttons .et-scrollable-button--end{opacity:1}.et-scrollable[at-end=false] .et-scrollable-buttons .et-scrollable-button--end{pointer-events:all}.et-scrollable .et-scrollable-container{display:grid;grid-auto-flow:var(--_flow);overflow:auto;grid-row:1/1;grid-column:1/1}.et-scrollable .et-scrollable-masks,.et-scrollable .et-scrollable-buttons{grid-row:1/1;grid-column:1/1;pointer-events:none}.et-scrollable .et-scrollable-masks .et-scrollable-mask,.et-scrollable .et-scrollable-masks .et-scrollable-button,.et-scrollable .et-scrollable-buttons .et-scrollable-mask,.et-scrollable .et-scrollable-buttons .et-scrollable-button{position:absolute;opacity:0;transition:opacity .3s var(--ease-5)}.et-scrollable .et-scrollable-buttons .et-scrollable-button{background:transparent;border:none;padding:12px;inline-size:40px;block-size:40px;border-radius:4px;cursor:pointer}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-chevron-icon{pointer-events:none}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--start{inset-inline:0 0}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--end{inset-inline:calc(100% - 40px) 0}.et-scrollable[sticky-buttons=true] .et-scrollable-buttons{margin-block:10%}.et-scrollable[sticky-buttons=true] .et-scrollable-buttons .et-scrollable-button{position:sticky}\n"] }]
96
136
  }], propDecorators: { itemSize: [{
97
137
  type: Input
98
138
  }, {
@@ -123,8 +163,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImpor
123
163
  args: ['attr.sticky-buttons']
124
164
  }], cursorDragScroll: [{
125
165
  type: Input
166
+ }], activeElementScrollMargin: [{
167
+ type: Input
168
+ }], disableActiveElementScrolling: [{
169
+ type: Input
126
170
  }], scrollable: [{
127
171
  type: ViewChild,
128
172
  args: ['scrollable', { static: true }]
173
+ }], activeElements: [{
174
+ type: ContentChildren,
175
+ args: [IS_ACTIVE_ELEMENT, { descendants: true }]
129
176
  }] } });
130
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBRUwsU0FBUyxFQUNULFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixjQUFjLEVBQ2QsS0FBSyxFQUNMLFlBQVksRUFFWiwyQkFBMkIsR0FFNUIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUV0RCxNQWFhLG1CQUFtQjtJQWJoQztRQWNtQixjQUFTLEdBQUcsTUFBTSxDQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUM1RCxjQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlCLGdC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Q0FBQyx5QkFBeUIsRUFBRSwyQkFBMkIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsQ0FBQyxRQUM5Rzt3QkFDSixLQUFLLEVBQUUsZUFBZTtxQkFDdkIsYUFDVSxDQUFDLGNBQWMsQ0FBQzs4QkFTM0IsUUFBUTtzQkFGUCxLQUFLOztzQkFDTCxXQUFXO3VCQUFDLGdCQUFnQjtnQkFLN0IsU0FBUztzQkFGUixLQUFLOztzQkFDTCxXQUFXO3VCQUFDLGdCQUFnQjtnQkFJN0IsY0FBYztzQkFEYixLQUFLO2dCQUlOLGVBQWU7c0JBRGQsS0FBSztnQkFJRixXQUFXO3NCQURkLEtBQUs7Z0JBVUYsYUFBYTtzQkFEaEIsS0FBSztnQkFXRixnQkFBZ0I7c0JBRm5CLEtBQUs7O3NCQUNMLFdBQVc7dUJBQUMsd0JBQXdCO2dCQVdqQyxhQUFhO3NCQUZoQixLQUFLOztzQkFDTCxXQUFXO3VCQUFDLHFCQUFxQjtnQkFVOUIsZ0JBQWdCO3NCQURuQixLQUFLO2dCQVVOLFVBQVU7c0JBRFQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgTmdDbGFzcywgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBIb3N0QmluZGluZyxcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ3Vyc29yRHJhZ1Njcm9sbERpcmVjdGl2ZSxcbiAgRGVzdHJveVNlcnZpY2UsXG4gIGVxdWFsLFxuICBMZXREaXJlY3RpdmUsXG4gIE5nQ2xhc3NUeXBlLFxuICBPYnNlcnZlU2Nyb2xsU3RhdGVEaXJlY3RpdmUsXG4gIFNjcm9sbE9ic2VydmVyU2Nyb2xsU3RhdGUsXG59IGZyb20gJ0BldGhsZXRlL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2hldnJvbkljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9pY29ucyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2V0LXNjcm9sbGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2Nyb2xsYWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Njcm9sbGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtDdXJzb3JEcmFnU2Nyb2xsRGlyZWN0aXZlLCBPYnNlcnZlU2Nyb2xsU3RhdGVEaXJlY3RpdmUsIE5nQ2xhc3MsIE5nSWYsIExldERpcmVjdGl2ZSwgQ2hldnJvbkljb25Db21wb25lbnRdLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdldC1zY3JvbGxhYmxlJyxcbiAgfSxcbiAgcHJvdmlkZXJzOiBbRGVzdHJveVNlcnZpY2VdLFxufSlcbmV4cG9ydCBjbGFzcyBTY3JvbGxhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSQgPSBpbmplY3QoRGVzdHJveVNlcnZpY2UsIHsgaG9zdDogdHJ1ZSB9KS5kZXN0cm95JDtcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudFJlZiA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG5cbiAgQElucHV0KClcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLml0ZW0tc2l6ZScpXG4gIGl0ZW1TaXplOiAnYXV0bycgfCAnc2FtZScgPSAnYXV0byc7XG5cbiAgQElucHV0KClcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmRpcmVjdGlvbicpXG4gIGRpcmVjdGlvbjogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJyA9ICdob3Jpem9udGFsJztcblxuICBASW5wdXQoKVxuICBzY3JvbGxhYmxlUm9sZT86IHN0cmluZztcblxuICBASW5wdXQoKVxuICBzY3JvbGxhYmxlQ2xhc3M/OiBOZ0NsYXNzVHlwZTtcblxuICBASW5wdXQoKVxuICBnZXQgcmVuZGVyTWFza3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbmRlck1hc2tzO1xuICB9XG4gIHNldCByZW5kZXJNYXNrcyh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fcmVuZGVyTWFza3MgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX3JlbmRlck1hc2tzID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBnZXQgcmVuZGVyQnV0dG9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVuZGVyQnV0dG9ucztcbiAgfVxuICBzZXQgcmVuZGVyQnV0dG9ucyh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fcmVuZGVyQnV0dG9ucyA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfcmVuZGVyQnV0dG9ucyA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnJlbmRlci1zY3JvbGxiYXJzJylcbiAgZ2V0IHJlbmRlclNjcm9sbGJhcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbmRlclNjcm9sbGJhcnM7XG4gIH1cbiAgc2V0IHJlbmRlclNjcm9sbGJhcnModmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3JlbmRlclNjcm9sbGJhcnMgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX3JlbmRlclNjcm9sbGJhcnMgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ2F0dHIuc3RpY2t5LWJ1dHRvbnMnKVxuICBnZXQgc3RpY2t5QnV0dG9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RpY2t5QnV0dG9ucztcbiAgfVxuICBzZXQgc3RpY2t5QnV0dG9ucyh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fc3RpY2t5QnV0dG9ucyA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfc3RpY2t5QnV0dG9ucyA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBjdXJzb3JEcmFnU2Nyb2xsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jdXJzb3JEcmFnU2Nyb2xsO1xuICB9XG4gIHNldCBjdXJzb3JEcmFnU2Nyb2xsKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9jdXJzb3JEcmFnU2Nyb2xsID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9jdXJzb3JEcmFnU2Nyb2xsID0gdHJ1ZTtcblxuICBAVmlld0NoaWxkKCdzY3JvbGxhYmxlJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgc2Nyb2xsYWJsZSE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzY3JvbGxTdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNjcm9sbE9ic2VydmVyU2Nyb2xsU3RhdGUgfCBudWxsPihudWxsKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbFN0YXRlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoc3RhdGUpID0+IHtcbiAgICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldEF0dHJpYnV0ZShlbGVtZW50LCAnYXQtc3RhcnQnLCBzdGF0ZS5pc0F0U3RhcnQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsZW1lbnQsICdhdC1lbmQnLCBzdGF0ZS5pc0F0RW5kLnRvU3RyaW5nKCkpO1xuICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldEF0dHJpYnV0ZShlbGVtZW50LCAnY2FuLXNjcm9sbCcsIHN0YXRlLmNhblNjcm9sbC50b1N0cmluZygpKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3Njcm9sbFN0YXRlQ2hhbmdlZChzY3JvbGxTdGF0ZTogU2Nyb2xsT2JzZXJ2ZXJTY3JvbGxTdGF0ZSkge1xuICAgIGlmIChlcXVhbCh0aGlzLnNjcm9sbFN0YXRlJC52YWx1ZSwgc2Nyb2xsU3RhdGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zY3JvbGxTdGF0ZSQubmV4dChzY3JvbGxTdGF0ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsT25lQ29udGFpbmVyU2l6ZVRvU3RhcnQoKSB7XG4gICAgdGhpcy5zY3JvbGxPbmVDb250YWluZXJTaXplKCdzdGFydCcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNjcm9sbE9uZUNvbnRhaW5lclNpemVUb0VuZCgpIHtcbiAgICB0aGlzLnNjcm9sbE9uZUNvbnRhaW5lclNpemUoJ2VuZCcpO1xuICB9XG5cbiAgc2Nyb2xsT25lQ29udGFpbmVyU2l6ZShkaXJlY3Rpb246ICdzdGFydCcgfCAnZW5kJykge1xuICAgIGNvbnN0IHNjcm9sbEVsZW1lbnQgPSB0aGlzLnNjcm9sbGFibGUubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBjb25zdCBzY3JvbGxhYmxlU2l6ZSA9IHRoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyBwYXJlbnQuY2xpZW50V2lkdGggOiBwYXJlbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IGN1cnJlbnRTY3JvbGwgPSB0aGlzLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnID8gc2Nyb2xsRWxlbWVudC5zY3JvbGxMZWZ0IDogc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3A7XG5cbiAgICBzY3JvbGxFbGVtZW50LnNjcm9sbFRvKHtcbiAgICAgIFt0aGlzLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnID8gJ2xlZnQnIDogJ3RvcCddOlxuICAgICAgICBjdXJyZW50U2Nyb2xsICsgKGRpcmVjdGlvbiA9PT0gJ3N0YXJ0JyA/IC1zY3JvbGxhYmxlU2l6ZSA6IHNjcm9sbGFibGVTaXplKSxcbiAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdlxuICAjc2Nyb2xsYWJsZVxuICBbYXR0ci5yb2xlXT1cInNjcm9sbGFibGVSb2xlID8/IHVuZGVmaW5lZFwiXG4gIFtuZ0NsYXNzXT1cInNjcm9sbGFibGVDbGFzc1wiXG4gIFtldEN1cnNvckRyYWdTY3JvbGxdPVwiY3Vyc29yRHJhZ1Njcm9sbFwiXG4gIChldE9ic2VydmVTY3JvbGxTdGF0ZSk9XCJfc2Nyb2xsU3RhdGVDaGFuZ2VkKCRldmVudClcIlxuICBjbGFzcz1cImV0LXNjcm9sbGFibGUtY29udGFpbmVyXCJcbj5cbiAgPG5nLWNvbnRlbnQgLz5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwicmVuZGVyTWFza3NcIiBjbGFzcz1cImV0LXNjcm9sbGFibGUtbWFza3NcIj5cbiAgPGRpdiBjbGFzcz1cImV0LXNjcm9sbGFibGUtbWFzayBldC1zY3JvbGxhYmxlLW1hc2stLXN0YXJ0XCI+PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJldC1zY3JvbGxhYmxlLW1hc2sgZXQtc2Nyb2xsYWJsZS1tYXNrLS1lbmRcIj48L2Rpdj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwicmVuZGVyQnV0dG9uc1wiIGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1idXR0b25zXCI+XG4gIDxidXR0b25cbiAgICAoY2xpY2spPVwic2Nyb2xsT25lQ29udGFpbmVyU2l6ZVRvU3RhcnQoKVwiXG4gICAgY2xhc3M9XCJldC1zY3JvbGxhYmxlLWJ1dHRvbiBldC1zY3JvbGxhYmxlLWJ1dHRvbi0tc3RhcnRcIlxuICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgdGFiaW5kZXg9XCItMVwiXG4gID5cbiAgICA8ZXQtY2hldnJvbi1pY29uIC8+XG4gIDwvYnV0dG9uPlxuICA8YnV0dG9uXG4gICAgKGNsaWNrKT1cInNjcm9sbE9uZUNvbnRhaW5lclNpemVUb0VuZCgpXCJcbiAgICBjbGFzcz1cImV0LXNjcm9sbGFibGUtYnV0dG9uIGV0LXNjcm9sbGFibGUtYnV0dG9uLS1lbmRcIlxuICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgdGFiaW5kZXg9XCItMVwiXG4gID5cbiAgICA8ZXQtY2hldnJvbi1pY29uIC8+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTZCLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0csT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFdBQVcsRUFDWCxLQUFLLEVBRUwsU0FBUyxFQUNULFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsaUJBQWlCLEVBRWpCLFlBQVksRUFFWiwyQkFBMkIsRUFHM0IsYUFBYSxFQUNiLEtBQUssRUFDTCxlQUFlLEdBQ2hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBRXRELE1BWWEsbUJBQW1CO0lBWmhDO1FBYW1CLGNBQVMsR0FBRyxhQUFhLEVBQUUsQ0FBQztRQUM1QixjQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FB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LEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJvb2xlYW5JbnB1dCwgTnVtYmVySW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgTmdDbGFzcywgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDdXJzb3JEcmFnU2Nyb2xsRGlyZWN0aXZlLFxuICBJU19BQ1RJVkVfRUxFTUVOVCxcbiAgSXNBY3RpdmVFbGVtZW50RGlyZWN0aXZlLFxuICBMZXREaXJlY3RpdmUsXG4gIE5nQ2xhc3NUeXBlLFxuICBPYnNlcnZlU2Nyb2xsU3RhdGVEaXJlY3RpdmUsXG4gIFNjcm9sbE9ic2VydmVyU2Nyb2xsU3RhdGUsXG4gIFR5cGVkUXVlcnlMaXN0LFxuICBjcmVhdGVEZXN0cm95LFxuICBlcXVhbCxcbiAgc2Nyb2xsVG9FbGVtZW50LFxufSBmcm9tICdAZXRobGV0ZS9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgc3RhcnRXaXRoLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2hldnJvbkljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9pY29ucyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2V0LXNjcm9sbGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2Nyb2xsYWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Njcm9sbGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtDdXJzb3JEcmFnU2Nyb2xsRGlyZWN0aXZlLCBPYnNlcnZlU2Nyb2xsU3RhdGVEaXJlY3RpdmUsIE5nQ2xhc3MsIE5nSWYsIExldERpcmVjdGl2ZSwgQ2hldnJvbkljb25Db21wb25lbnRdLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdldC1zY3JvbGxhYmxlJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgU2Nyb2xsYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3kkID0gY3JlYXRlRGVzdHJveSgpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcblxuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ2F0dHIuaXRlbS1zaXplJylcbiAgaXRlbVNpemU6ICdhdXRvJyB8ICdzYW1lJyA9ICdhdXRvJztcblxuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZGlyZWN0aW9uJylcbiAgZGlyZWN0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnID0gJ2hvcml6b250YWwnO1xuXG4gIEBJbnB1dCgpXG4gIHNjcm9sbGFibGVSb2xlPzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHNjcm9sbGFibGVDbGFzcz86IE5nQ2xhc3NUeXBlO1xuXG4gIEBJbnB1dCgpXG4gIGdldCByZW5kZXJNYXNrcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVuZGVyTWFza3M7XG4gIH1cbiAgc2V0IHJlbmRlck1hc2tzKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9yZW5kZXJNYXNrcyA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfcmVuZGVyTWFza3MgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIGdldCByZW5kZXJCdXR0b25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXJCdXR0b25zO1xuICB9XG4gIHNldCByZW5kZXJCdXR0b25zKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9yZW5kZXJCdXR0b25zID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9yZW5kZXJCdXR0b25zID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ2F0dHIucmVuZGVyLXNjcm9sbGJhcnMnKVxuICBnZXQgcmVuZGVyU2Nyb2xsYmFycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVuZGVyU2Nyb2xsYmFycztcbiAgfVxuICBzZXQgcmVuZGVyU2Nyb2xsYmFycyh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fcmVuZGVyU2Nyb2xsYmFycyA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfcmVuZGVyU2Nyb2xsYmFycyA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIEBIb3N0QmluZGluZygnYXR0ci5zdGlja3ktYnV0dG9ucycpXG4gIGdldCBzdGlja3lCdXR0b25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdGlja3lCdXR0b25zO1xuICB9XG4gIHNldCBzdGlja3lCdXR0b25zKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9zdGlja3lCdXR0b25zID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9zdGlja3lCdXR0b25zID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgZ2V0IGN1cnNvckRyYWdTY3JvbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvckRyYWdTY3JvbGw7XG4gIH1cbiAgc2V0IGN1cnNvckRyYWdTY3JvbGwodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2N1cnNvckRyYWdTY3JvbGwgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX2N1cnNvckRyYWdTY3JvbGwgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBhY3RpdmVFbGVtZW50U2Nyb2xsTWFyZ2luKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUVsZW1lbnRTY3JvbGxNYXJnaW47XG4gIH1cbiAgc2V0IGFjdGl2ZUVsZW1lbnRTY3JvbGxNYXJnaW4odmFsdWU6IE51bWJlcklucHV0KSB7XG4gICAgdGhpcy5fYWN0aXZlRWxlbWVudFNjcm9sbE1hcmdpbiA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9hY3RpdmVFbGVtZW50U2Nyb2xsTWFyZ2luID0gNDA7XG5cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVBY3RpdmVFbGVtZW50U2Nyb2xsaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlQWN0aXZlRWxlbWVudFNjcm9sbGluZztcbiAgfVxuICBzZXQgZGlzYWJsZUFjdGl2ZUVsZW1lbnRTY3JvbGxpbmcodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2Rpc2FibGVBY3RpdmVFbGVtZW50U2Nyb2xsaW5nID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9kaXNhYmxlQWN0aXZlRWxlbWVudFNjcm9sbGluZyA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbGFibGUnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBzY3JvbGxhYmxlITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgQENvbnRlbnRDaGlsZHJlbihJU19BQ1RJVkVfRUxFTUVOVCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBhY3RpdmVFbGVtZW50czogVHlwZWRRdWVyeUxpc3Q8SXNBY3RpdmVFbGVtZW50RGlyZWN0aXZlPiB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzY3JvbGxTdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNjcm9sbE9ic2VydmVyU2Nyb2xsU3RhdGUgfCBudWxsPihudWxsKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbFN0YXRlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoc3RhdGUpID0+IHtcbiAgICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldEF0dHJpYnV0ZShlbGVtZW50LCAnYXQtc3RhcnQnLCBzdGF0ZS5pc0F0U3RhcnQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsZW1lbnQsICdhdC1lbmQnLCBzdGF0ZS5pc0F0RW5kLnRvU3RyaW5nKCkpO1xuICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldEF0dHJpYnV0ZShlbGVtZW50LCAnY2FuLXNjcm9sbCcsIHN0YXRlLmNhblNjcm9sbC50b1N0cmluZygpKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZUVsZW1lbnRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hY3RpdmVFbGVtZW50cy5jaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKHRoaXMuYWN0aXZlRWxlbWVudHMpLFxuICAgICAgICB0YXAoKGFjdGl2ZUVsZW1lbnRzKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZUFjdGl2ZUVsZW1lbnRTY3JvbGxpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBmaXJzdEFjdGl2ZSA9IGFjdGl2ZUVsZW1lbnRzXG4gICAgICAgICAgICAuZmlsdGVyKChhKTogYSBpcyBJc0FjdGl2ZUVsZW1lbnREaXJlY3RpdmUgPT4gISFhKVxuICAgICAgICAgICAgLmZpbmQoKGEpID0+IGEuaXNBY3RpdmVFbGVtZW50KTtcblxuICAgICAgICAgIGlmICghZmlyc3RBY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzY3JvbGxUb0VsZW1lbnQoe1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdhdXRvJyxcbiAgICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy5zY3JvbGxhYmxlLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICBlbGVtZW50OiBmaXJzdEFjdGl2ZS5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICBzY3JvbGxJbmxpbmVNYXJnaW46IHRoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyB0aGlzLmFjdGl2ZUVsZW1lbnRTY3JvbGxNYXJnaW4gOiAwLFxuICAgICAgICAgICAgc2Nyb2xsQmxvY2tNYXJnaW46IHRoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyAwIDogdGhpcy5hY3RpdmVFbGVtZW50U2Nyb2xsTWFyZ2luLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfc2Nyb2xsU3RhdGVDaGFuZ2VkKHNjcm9sbFN0YXRlOiBTY3JvbGxPYnNlcnZlclNjcm9sbFN0YXRlKSB7XG4gICAgaWYgKGVxdWFsKHRoaXMuc2Nyb2xsU3RhdGUkLnZhbHVlLCBzY3JvbGxTdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNjcm9sbFN0YXRlJC5uZXh0KHNjcm9sbFN0YXRlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzY3JvbGxPbmVDb250YWluZXJTaXplVG9TdGFydCgpIHtcbiAgICB0aGlzLnNjcm9sbE9uZUNvbnRhaW5lclNpemUoJ3N0YXJ0Jyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsT25lQ29udGFpbmVyU2l6ZVRvRW5kKCkge1xuICAgIHRoaXMuc2Nyb2xsT25lQ29udGFpbmVyU2l6ZSgnZW5kJyk7XG4gIH1cblxuICBzY3JvbGxPbmVDb250YWluZXJTaXplKGRpcmVjdGlvbjogJ3N0YXJ0JyB8ICdlbmQnKSB7XG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IHRoaXMuc2Nyb2xsYWJsZS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgIGNvbnN0IHNjcm9sbGFibGVTaXplID0gdGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyA/IHBhcmVudC5jbGllbnRXaWR0aCA6IHBhcmVudC5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3QgY3VycmVudFNjcm9sbCA9IHRoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyBzY3JvbGxFbGVtZW50LnNjcm9sbExlZnQgOiBzY3JvbGxFbGVtZW50LnNjcm9sbFRvcDtcblxuICAgIHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG8oe1xuICAgICAgW3RoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyAnbGVmdCcgOiAndG9wJ106XG4gICAgICAgIGN1cnJlbnRTY3JvbGwgKyAoZGlyZWN0aW9uID09PSAnc3RhcnQnID8gLXNjcm9sbGFibGVTaXplIDogc2Nyb2xsYWJsZVNpemUpLFxuICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2XG4gICNzY3JvbGxhYmxlXG4gIFthdHRyLnJvbGVdPVwic2Nyb2xsYWJsZVJvbGUgPz8gdW5kZWZpbmVkXCJcbiAgW25nQ2xhc3NdPVwic2Nyb2xsYWJsZUNsYXNzXCJcbiAgW2V0Q3Vyc29yRHJhZ1Njcm9sbF09XCJjdXJzb3JEcmFnU2Nyb2xsXCJcbiAgKGV0T2JzZXJ2ZVNjcm9sbFN0YXRlKT1cIl9zY3JvbGxTdGF0ZUNoYW5nZWQoJGV2ZW50KVwiXG4gIGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1jb250YWluZXJcIlxuPlxuICA8bmctY29udGVudCAvPlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCJyZW5kZXJNYXNrc1wiIGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1tYXNrc1wiPlxuICA8ZGl2IGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1tYXNrIGV0LXNjcm9sbGFibGUtbWFzay0tc3RhcnRcIj48L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImV0LXNjcm9sbGFibGUtbWFzayBldC1zY3JvbGxhYmxlLW1hc2stLWVuZFwiPjwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCJyZW5kZXJCdXR0b25zXCIgY2xhc3M9XCJldC1zY3JvbGxhYmxlLWJ1dHRvbnNcIj5cbiAgPGJ1dHRvblxuICAgIChjbGljayk9XCJzY3JvbGxPbmVDb250YWluZXJTaXplVG9TdGFydCgpXCJcbiAgICBjbGFzcz1cImV0LXNjcm9sbGFibGUtYnV0dG9uIGV0LXNjcm9sbGFibGUtYnV0dG9uLS1zdGFydFwiXG4gICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICB0YWJpbmRleD1cIi0xXCJcbiAgPlxuICAgIDxldC1jaGV2cm9uLWljb24gLz5cbiAgPC9idXR0b24+XG4gIDxidXR0b25cbiAgICAoY2xpY2spPVwic2Nyb2xsT25lQ29udGFpbmVyU2l6ZVRvRW5kKClcIlxuICAgIGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1idXR0b24gZXQtc2Nyb2xsYWJsZS1idXR0b24tLWVuZFwiXG4gICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICB0YWJpbmRleD1cIi0xXCJcbiAgPlxuICAgIDxldC1jaGV2cm9uLWljb24gLz5cbiAgPC9idXR0b24+XG48L2Rpdj5cbiJdfQ==
@@ -63,7 +63,7 @@ class NavTabsComponent extends PaginatedTabHeaderDirective {
63
63
  return this.tabOutlet ? 'tablist' : this._elementRef.nativeElement.getAttribute('role');
64
64
  }
65
65
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NavTabsComponent, deps: [{ token: i0.ElementRef }, { token: i1.Directionality, optional: true }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i2.ViewportRuler }, { token: i3.Router }], target: i0.ɵɵFactoryTarget.Component }); }
66
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NavTabsComponent, isStandalone: true, selector: "[et-nav-tabs]", inputs: { tabOutlet: "tabOutlet" }, host: { properties: { "attr.role": "this._attrRole" }, classAttribute: "et-nav-tabs" }, queries: [{ propertyName: "_items", predicate: i0.forwardRef(function () { return NavTabLinkComponent; }), descendants: true }, { propertyName: "_inkBars", predicate: i0.forwardRef(function () { return ActiveTabUnderlineDirective; }), descendants: true }], viewQueries: [{ propertyName: "_scrollable", first: true, predicate: ScrollableComponent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<et-scrollable\n [itemSize]=\"itemSize\"\n [renderButtons]=\"renderButtons\"\n [scrollableClass]=\"scrollableClass\"\n [renderMasks]=\"renderMasks\"\n [renderScrollbars]=\"renderScrollbars\"\n (keydown)=\"_handleKeydown($event)\"\n (contentChanged)=\"_onContentChanges()\"\n>\n <ng-content />\n</et-scrollable>\n", dependencies: [{ kind: "component", type: ScrollableComponent, selector: "et-scrollable", inputs: ["itemSize", "direction", "scrollableRole", "scrollableClass", "renderMasks", "renderButtons", "renderScrollbars", "stickyButtons", "cursorDragScroll"] }], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None }); }
66
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NavTabsComponent, isStandalone: true, selector: "[et-nav-tabs]", inputs: { tabOutlet: "tabOutlet" }, host: { properties: { "attr.role": "this._attrRole" }, classAttribute: "et-nav-tabs" }, queries: [{ propertyName: "_items", predicate: i0.forwardRef(function () { return NavTabLinkComponent; }), descendants: true }, { propertyName: "_inkBars", predicate: i0.forwardRef(function () { return ActiveTabUnderlineDirective; }), descendants: true }], viewQueries: [{ propertyName: "_scrollable", first: true, predicate: ScrollableComponent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<et-scrollable\n [itemSize]=\"itemSize\"\n [renderButtons]=\"renderButtons\"\n [scrollableClass]=\"scrollableClass\"\n [renderMasks]=\"renderMasks\"\n [renderScrollbars]=\"renderScrollbars\"\n (keydown)=\"_handleKeydown($event)\"\n (contentChanged)=\"_onContentChanges()\"\n>\n <ng-content />\n</et-scrollable>\n", dependencies: [{ kind: "component", type: ScrollableComponent, selector: "et-scrollable", inputs: ["itemSize", "direction", "scrollableRole", "scrollableClass", "renderMasks", "renderButtons", "renderScrollbars", "stickyButtons", "cursorDragScroll", "activeElementScrollMargin", "disableActiveElementScrolling"] }], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None }); }
67
67
  }
68
68
  export { NavTabsComponent };
69
69
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NavTabsComponent, decorators: [{
@@ -21,7 +21,7 @@ class InlineTabHeaderComponent extends PaginatedTabHeaderDirective {
21
21
  event.preventDefault();
22
22
  }
23
23
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: InlineTabHeaderComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.ViewportRuler }, { token: i2.Directionality, optional: true }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
24
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: InlineTabHeaderComponent, isStandalone: true, selector: "et-inline-tab-header", host: { classAttribute: "et-inline-tab-header" }, queries: [{ propertyName: "_items", predicate: InlineTabLabelWrapperDirective }, { propertyName: "_inkBars", predicate: i0.forwardRef(function () { return ActiveTabUnderlineDirective; }), descendants: true }], viewQueries: [{ propertyName: "_scrollable", first: true, predicate: ScrollableComponent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<et-scrollable\n [itemSize]=\"itemSize\"\n [renderButtons]=\"renderButtons\"\n [scrollableClass]=\"scrollableClass\"\n [renderMasks]=\"renderMasks\"\n [renderScrollbars]=\"renderScrollbars\"\n (keydown)=\"_handleKeydown($event)\"\n (contentChanged)=\"_onContentChanges()\"\n>\n <ng-content />\n</et-scrollable>\n", dependencies: [{ kind: "component", type: ScrollableComponent, selector: "et-scrollable", inputs: ["itemSize", "direction", "scrollableRole", "scrollableClass", "renderMasks", "renderButtons", "renderScrollbars", "stickyButtons", "cursorDragScroll"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
24
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: InlineTabHeaderComponent, isStandalone: true, selector: "et-inline-tab-header", host: { classAttribute: "et-inline-tab-header" }, queries: [{ propertyName: "_items", predicate: InlineTabLabelWrapperDirective }, { propertyName: "_inkBars", predicate: i0.forwardRef(function () { return ActiveTabUnderlineDirective; }), descendants: true }], viewQueries: [{ propertyName: "_scrollable", first: true, predicate: ScrollableComponent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<et-scrollable\n [itemSize]=\"itemSize\"\n [renderButtons]=\"renderButtons\"\n [scrollableClass]=\"scrollableClass\"\n [renderMasks]=\"renderMasks\"\n [renderScrollbars]=\"renderScrollbars\"\n (keydown)=\"_handleKeydown($event)\"\n (contentChanged)=\"_onContentChanges()\"\n>\n <ng-content />\n</et-scrollable>\n", dependencies: [{ kind: "component", type: ScrollableComponent, selector: "et-scrollable", inputs: ["itemSize", "direction", "scrollableRole", "scrollableClass", "renderMasks", "renderButtons", "renderScrollbars", "stickyButtons", "cursorDragScroll", "activeElementScrollMargin", "disableActiveElementScrolling"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
25
25
  }
26
26
  export { InlineTabHeaderComponent };
27
27
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: InlineTabHeaderComponent, decorators: [{