@ethlete/core 0.2.0-next.6 → 0.2.0-next.8

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 (59) hide show
  1. package/esm2020/lib/directives/click-outside/click-outside.directive.mjs +3 -3
  2. package/esm2020/lib/directives/cursor-drag-scroll/cursor-drag-scroll.directive.mjs +45 -21
  3. package/esm2020/lib/directives/destroy/destroy.directive.mjs +22 -0
  4. package/esm2020/lib/directives/destroy/public-api.mjs +2 -0
  5. package/esm2020/lib/directives/let/let.directive.mjs +3 -3
  6. package/esm2020/lib/directives/observe-content/observe-content.directive.mjs +3 -3
  7. package/esm2020/lib/directives/observe-resize/observe-resize.directive.mjs +3 -3
  8. package/esm2020/lib/directives/observe-scroll-state/observe-scroll-state.directive.mjs +20 -5
  9. package/esm2020/lib/directives/public-api.mjs +9 -5
  10. package/esm2020/lib/directives/repeat/repeat.directive.mjs +3 -3
  11. package/esm2020/lib/directives/scroll-observer-first-element/index.mjs +2 -0
  12. package/esm2020/lib/directives/scroll-observer-first-element/public-api.mjs +2 -0
  13. package/esm2020/lib/directives/scroll-observer-first-element/scroll-observer-first-element.directive.mjs +31 -0
  14. package/esm2020/lib/directives/scroll-observer-ignore-target/scroll-observer-ignore-target.directive.mjs +3 -3
  15. package/esm2020/lib/directives/scroll-observer-last-element/index.mjs +2 -0
  16. package/esm2020/lib/directives/scroll-observer-last-element/public-api.mjs +2 -0
  17. package/esm2020/lib/directives/scroll-observer-last-element/scroll-observer-last-element.directive.mjs +34 -0
  18. package/esm2020/lib/directives/seo/public-api.mjs +5 -0
  19. package/esm2020/lib/directives/seo/seo.directive.constants.mjs +3 -0
  20. package/esm2020/lib/directives/seo/seo.directive.mjs +162 -0
  21. package/esm2020/lib/directives/seo/seo.directive.types.mjs +2 -0
  22. package/esm2020/lib/directives/seo/seo.directive.utils.mjs +7 -0
  23. package/esm2020/lib/pipes/to-array/to-array.pipe.mjs +3 -3
  24. package/esm2020/lib/services/click-observer.service.mjs +6 -6
  25. package/esm2020/lib/services/content-observer.service.mjs +6 -6
  26. package/esm2020/lib/services/destroy.service.mjs +6 -11
  27. package/esm2020/lib/services/focus-visible.service.mjs +3 -3
  28. package/esm2020/lib/services/public-api.mjs +6 -6
  29. package/esm2020/lib/services/resize-observer.service.mjs +6 -6
  30. package/esm2020/lib/services/viewport.service.mjs +3 -3
  31. package/fesm2015/ethlete-core.mjs +775 -499
  32. package/fesm2015/ethlete-core.mjs.map +1 -1
  33. package/fesm2020/ethlete-core.mjs +771 -496
  34. package/fesm2020/ethlete-core.mjs.map +1 -1
  35. package/lib/directives/click-outside/click-outside.directive.d.ts +1 -1
  36. package/lib/directives/cursor-drag-scroll/cursor-drag-scroll.directive.d.ts +8 -2
  37. package/lib/directives/destroy/destroy.directive.d.ts +9 -0
  38. package/lib/directives/destroy/public-api.d.ts +1 -0
  39. package/lib/directives/let/let.directive.d.ts +1 -1
  40. package/lib/directives/observe-content/observe-content.directive.d.ts +1 -1
  41. package/lib/directives/observe-resize/observe-resize.directive.d.ts +1 -1
  42. package/lib/directives/observe-scroll-state/observe-scroll-state.directive.d.ts +1 -1
  43. package/lib/directives/public-api.d.ts +8 -4
  44. package/lib/directives/repeat/repeat.directive.d.ts +1 -1
  45. package/lib/directives/scroll-observer-first-element/index.d.ts +1 -0
  46. package/lib/directives/scroll-observer-first-element/public-api.d.ts +1 -0
  47. package/lib/directives/scroll-observer-first-element/scroll-observer-first-element.directive.d.ts +10 -0
  48. package/lib/directives/scroll-observer-ignore-target/scroll-observer-ignore-target.directive.d.ts +1 -1
  49. package/lib/directives/scroll-observer-last-element/index.d.ts +1 -0
  50. package/lib/directives/scroll-observer-last-element/public-api.d.ts +1 -0
  51. package/lib/directives/scroll-observer-last-element/scroll-observer-last-element.directive.d.ts +10 -0
  52. package/lib/directives/seo/public-api.d.ts +4 -0
  53. package/lib/directives/seo/seo.directive.constants.d.ts +3 -0
  54. package/lib/directives/seo/seo.directive.d.ts +21 -0
  55. package/lib/directives/seo/seo.directive.types.d.ts +51 -0
  56. package/lib/directives/seo/seo.directive.utils.d.ts +2 -0
  57. package/lib/services/destroy.service.d.ts +1 -1
  58. package/lib/services/public-api.d.ts +5 -5
  59. package/package.json +5 -4
@@ -1,11 +1,12 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, Directive, Input, Injectable, Inject, Optional, inject, ElementRef, NgZone, EventEmitter, Output, Pipe } from '@angular/core';
3
- import { coerceNumberProperty, coerceElement, coerceBooleanProperty } from '@angular/cdk/coercion';
4
- import { BehaviorSubject, combineLatest, map, shareReplay, Observable, Subject, fromEvent, debounceTime, tap, takeUntil, take } from 'rxjs';
2
+ import { InjectionToken, Injectable, inject, Inject, Optional, ElementRef, EventEmitter, Directive, Output, Input, NgZone, HostBinding, Pipe } from '@angular/core';
3
+ import { coerceElement, coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';
4
+ import { fromEvent, Observable, Subject, BehaviorSubject, combineLatest, map, shareReplay, startWith, debounceTime, tap, takeUntil, take } from 'rxjs';
5
+ import { DOCUMENT } from '@angular/common';
5
6
  import { __decorate, __metadata } from 'tslib';
6
7
  import * as i1 from '@angular/cdk/layout';
7
- import { DOCUMENT } from '@angular/common';
8
8
  import { debounceTime as debounceTime$1 } from 'rxjs/operators';
9
+ import { Meta, Title } from '@angular/platform-browser';
9
10
 
10
11
  const VIEWPORT_CONFIG = new InjectionToken('ViewportConfig');
11
12
  /**
@@ -50,131 +51,313 @@ const Memo = (config = {}) => (_, __, descriptor) => {
50
51
  return descriptor;
51
52
  };
52
53
 
53
- class LetContext {
54
- constructor() {
55
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
56
- this.$implicit = null;
57
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
58
- this.etLet = null;
54
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
55
+ class ClickObserverFactory {
56
+ create() {
57
+ return fromEvent(document, 'click');
59
58
  }
60
59
  }
61
-
62
- class LetDirective {
63
- constructor(_viewContainer, templateRef) {
64
- this._viewContainer = _viewContainer;
65
- this._context = new LetContext();
66
- this._templateRef = null;
67
- this._viewRef = null;
68
- this._templateRef = templateRef;
60
+ ClickObserverFactory.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ClickObserverFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
61
+ ClickObserverFactory.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ClickObserverFactory, providedIn: 'root' });
62
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ClickObserverFactory, decorators: [{
63
+ type: Injectable,
64
+ args: [{ providedIn: 'root' }]
65
+ }] });
66
+ class ClickObserverService {
67
+ constructor(_clickObserverFactory) {
68
+ this._clickObserverFactory = _clickObserverFactory;
69
+ this._observedElements = new Map();
69
70
  }
70
- set etLet(value) {
71
- this._context.$implicit = this._context.etLet = value;
72
- this._updateView();
71
+ ngOnDestroy() {
72
+ this._observedElements.forEach((_, element) => this._cleanupObserver(element));
73
73
  }
74
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
75
- static ngTemplateContextGuard(dir, ctx) {
76
- return true;
74
+ observe(elementOrRef) {
75
+ const element = coerceElement(elementOrRef);
76
+ return new Observable((observer) => {
77
+ const stream = this._observeElement(element);
78
+ const subscription = stream.subscribe(observer);
79
+ return () => {
80
+ subscription.unsubscribe();
81
+ this._unobserveElement(element);
82
+ };
83
+ });
77
84
  }
78
- _updateView() {
79
- if (!this._viewRef) {
80
- this._viewContainer.clear();
81
- if (this._templateRef) {
82
- this._viewRef = this._viewContainer.createEmbeddedView(this._templateRef, this._context);
85
+ _observeElement(element) {
86
+ if (!this._observedElements.has(element)) {
87
+ const stream = new Subject();
88
+ const observer = this._clickObserverFactory.create();
89
+ const sub = observer.subscribe((event) => stream.next(event));
90
+ this._observedElements.set(element, { observer: sub, stream, count: 1 });
91
+ }
92
+ else {
93
+ this._observedElements.get(element).count++;
94
+ }
95
+ return this._observedElements.get(element).stream;
96
+ }
97
+ _unobserveElement(element) {
98
+ if (this._observedElements.has(element)) {
99
+ this._observedElements.get(element).count--;
100
+ if (!this._observedElements.get(element).count) {
101
+ this._cleanupObserver(element);
102
+ }
103
+ }
104
+ }
105
+ _cleanupObserver(element) {
106
+ if (this._observedElements.has(element)) {
107
+ const { observer, stream } = this._observedElements.get(element);
108
+ if (observer) {
109
+ observer.unsubscribe();
83
110
  }
111
+ stream.complete();
112
+ this._observedElements.delete(element);
84
113
  }
85
114
  }
86
115
  }
87
- LetDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: LetDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
88
- LetDirectivedir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.9", type: LetDirective, isStandalone: true, selector: "[etLet]", inputs: { etLet: "etLet" }, ngImport: i0 });
89
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: LetDirective, decorators: [{
90
- type: Directive,
91
- args: [{
92
- selector: '[etLet]',
93
- standalone: true,
94
- }]
95
- }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.TemplateRef }]; }, propDecorators: { etLet: [{
96
- type: Input
97
- }] } });
116
+ ClickObserverService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ClickObserverService, deps: [{ token: ClickObserverFactory }], target: i0.ɵɵFactoryTarget.Injectable });
117
+ ClickObserverServiceprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ClickObserverService, providedIn: 'root' });
118
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ClickObserverService, decorators: [{
119
+ type: Injectable,
120
+ args: [{ providedIn: 'root' }]
121
+ }], ctorParameters: function () { return [{ type: ClickObserverFactory }]; } });
98
122
 
99
- class RepeatDirective {
100
- constructor(_mainTemplateRef, _viewContainerRef) {
101
- this._mainTemplateRef = _mainTemplateRef;
102
- this._viewContainerRef = _viewContainerRef;
103
- this._repeatCount = 2;
123
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
124
+ class MutationObserverFactory {
125
+ create(callback) {
126
+ return typeof MutationObserver === 'undefined' ? null : new MutationObserver(callback);
104
127
  }
105
- get repeatCount() {
106
- return this._repeatCount;
128
+ }
129
+ MutationObserverFactory.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: MutationObserverFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
130
+ MutationObserverFactory.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: MutationObserverFactory, providedIn: 'root' });
131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: MutationObserverFactory, decorators: [{
132
+ type: Injectable,
133
+ args: [{ providedIn: 'root' }]
134
+ }] });
135
+ class ContentObserverService {
136
+ constructor(_mutationObserverFactory) {
137
+ this._mutationObserverFactory = _mutationObserverFactory;
138
+ this._observedElements = new Map();
107
139
  }
108
- set repeatCount(value) {
109
- this._repeatCount = coerceNumberProperty(value);
140
+ ngOnDestroy() {
141
+ this._observedElements.forEach((_, element) => this._cleanupObserver(element));
110
142
  }
111
- ngOnInit() {
112
- this._render();
143
+ observe(elementOrRef) {
144
+ const element = coerceElement(elementOrRef);
145
+ return new Observable((observer) => {
146
+ const stream = this._observeElement(element);
147
+ const subscription = stream.subscribe(observer);
148
+ return () => {
149
+ subscription.unsubscribe();
150
+ this._unobserveElement(element);
151
+ };
152
+ });
113
153
  }
114
- _render() {
115
- for (let i = 0; i < this.repeatCount; i++) {
116
- this._viewContainerRef.createEmbeddedView(this._mainTemplateRef);
154
+ _observeElement(element) {
155
+ if (!this._observedElements.has(element)) {
156
+ const stream = new Subject();
157
+ const observer = this._mutationObserverFactory.create((mutations) => stream.next(mutations));
158
+ if (observer) {
159
+ observer.observe(element, {
160
+ characterData: true,
161
+ childList: true,
162
+ subtree: true,
163
+ });
164
+ }
165
+ this._observedElements.set(element, { observer, stream, count: 1 });
117
166
  }
167
+ else {
168
+ this._observedElements.get(element).count++;
169
+ }
170
+ return this._observedElements.get(element).stream;
118
171
  }
119
- }
120
- RepeatDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: RepeatDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
121
- RepeatDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.9", type: RepeatDirective, isStandalone: true, selector: "[etRepeat]", inputs: { repeatCount: ["etRepeat", "repeatCount"] }, ngImport: i0 });
122
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: RepeatDirective, decorators: [{
123
- type: Directive,
124
- args: [{
125
- selector: '[etRepeat]',
126
- standalone: true,
127
- }]
128
- }], ctorParameters: function () { return [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }]; }, propDecorators: { repeatCount: [{
129
- type: Input,
130
- args: ['etRepeat']
131
- }] } });
132
-
133
- class ViewportService {
134
- constructor(_viewportConfig, _breakpointObserver) {
135
- this._breakpointObserver = _breakpointObserver;
136
- this._isXs$ = new BehaviorSubject(false);
137
- this._isSm$ = new BehaviorSubject(false);
138
- this._isMd$ = new BehaviorSubject(false);
139
- this._isLg$ = new BehaviorSubject(false);
140
- this._isXl$ = new BehaviorSubject(false);
141
- this._is2Xl$ = new BehaviorSubject(false);
142
- this.currentViewport$ = combineLatest([this.isXs$, this.isSm$, this.isMd$, this.isLg$, this.isXl$, this.is2Xl$]).pipe(map((val) => this.getCurrentViewport(val)), shareReplay());
143
- this._viewportConfig = _viewportConfig || DEFAULT_VIEWPORT_CONFIG;
144
- this._observeDefaultBreakpoints();
145
- }
146
- get isXs$() {
147
- return this._isXs$.asObservable();
172
+ _unobserveElement(element) {
173
+ if (this._observedElements.has(element)) {
174
+ this._observedElements.get(element).count--;
175
+ if (!this._observedElements.get(element).count) {
176
+ this._cleanupObserver(element);
177
+ }
178
+ }
148
179
  }
149
- get isXs() {
150
- return this._isXs$.value;
180
+ _cleanupObserver(element) {
181
+ if (this._observedElements.has(element)) {
182
+ const { observer, stream } = this._observedElements.get(element);
183
+ if (observer) {
184
+ observer.disconnect();
185
+ }
186
+ stream.complete();
187
+ this._observedElements.delete(element);
188
+ }
151
189
  }
152
- get isSm$() {
153
- return this._isSm$.asObservable();
190
+ }
191
+ ContentObserverService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ContentObserverService, deps: [{ token: MutationObserverFactory }], target: i0.ɵɵFactoryTarget.Injectable });
192
+ ContentObserverService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ContentObserverService, providedIn: 'root' });
193
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ContentObserverService, decorators: [{
194
+ type: Injectable,
195
+ args: [{ providedIn: 'root' }]
196
+ }], ctorParameters: function () { return [{ type: MutationObserverFactory }]; } });
197
+
198
+ class DestroyService {
199
+ constructor() {
200
+ this._destroy$ = new Subject();
201
+ this.destroy$ = this._destroy$.asObservable();
154
202
  }
155
- get isSm() {
156
- return this._isSm$.value;
203
+ ngOnDestroy() {
204
+ this._destroy$.next(true);
205
+ this._destroy$.unsubscribe();
157
206
  }
158
- get isMd$() {
159
- return this._isMd$.asObservable();
207
+ }
208
+ DestroyService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: DestroyService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
209
+ DestroyService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: DestroyService });
210
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: DestroyService, decorators: [{
211
+ type: Injectable
212
+ }] });
213
+
214
+ class FocusVisibleService {
215
+ constructor() {
216
+ this._document = inject(DOCUMENT);
217
+ this._hadKeyboardEvent = false;
218
+ this._document.addEventListener('keydown', this.onKeyDown.bind(this), true);
219
+ this._document.addEventListener('mousedown', this.onPointerDown.bind(this), true);
220
+ this._document.addEventListener('pointerdown', this.onPointerDown.bind(this), true);
221
+ this._document.addEventListener('touchstart', this.onPointerDown.bind(this), true);
160
222
  }
161
- get isMd() {
162
- return this._isMd$.value;
223
+ get isFocusVisible() {
224
+ return this._hadKeyboardEvent;
163
225
  }
164
- get isLg$() {
165
- return this._isLg$.asObservable();
226
+ onKeyDown(e) {
227
+ if (e.metaKey || e.altKey || e.ctrlKey) {
228
+ return;
229
+ }
230
+ this._hadKeyboardEvent = true;
166
231
  }
167
- get isLg() {
168
- return this._isLg$.value;
232
+ onPointerDown() {
233
+ this._hadKeyboardEvent = false;
169
234
  }
170
- get isXl$() {
171
- return this._isXl$.asObservable();
235
+ }
236
+ FocusVisibleService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: FocusVisibleService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
237
+ FocusVisibleService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: FocusVisibleService, providedIn: 'root' });
238
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: FocusVisibleService, decorators: [{
239
+ type: Injectable,
240
+ args: [{
241
+ providedIn: 'root',
242
+ }]
243
+ }], ctorParameters: function () { return []; } });
244
+
245
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
246
+ class ResizeObserverFactory {
247
+ create(callback) {
248
+ return typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(callback);
172
249
  }
173
- get isXl() {
174
- return this._isXl$.value;
250
+ }
251
+ ResizeObserverFactory.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ResizeObserverFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
252
+ ResizeObserverFactory.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ResizeObserverFactory, providedIn: 'root' });
253
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ResizeObserverFactory, decorators: [{
254
+ type: Injectable,
255
+ args: [{ providedIn: 'root' }]
256
+ }] });
257
+ class ResizeObserverService {
258
+ constructor(_mutationObserverFactory) {
259
+ this._mutationObserverFactory = _mutationObserverFactory;
260
+ this._observedElements = new Map();
175
261
  }
176
- get is2Xl$() {
177
- return this._is2Xl$.asObservable();
262
+ ngOnDestroy() {
263
+ this._observedElements.forEach((_, element) => this._cleanupObserver(element));
264
+ }
265
+ observe(elementOrRef) {
266
+ const element = coerceElement(elementOrRef);
267
+ return new Observable((observer) => {
268
+ const stream = this._observeElement(element);
269
+ const subscription = stream.subscribe(observer);
270
+ return () => {
271
+ subscription.unsubscribe();
272
+ this._unobserveElement(element);
273
+ };
274
+ });
275
+ }
276
+ _observeElement(element) {
277
+ if (!this._observedElements.has(element)) {
278
+ const stream = new Subject();
279
+ const observer = this._mutationObserverFactory.create((resizes) => stream.next(resizes));
280
+ if (observer) {
281
+ observer.observe(element);
282
+ }
283
+ this._observedElements.set(element, { observer, stream, count: 1 });
284
+ }
285
+ else {
286
+ this._observedElements.get(element).count++;
287
+ }
288
+ return this._observedElements.get(element).stream;
289
+ }
290
+ _unobserveElement(element) {
291
+ if (this._observedElements.has(element)) {
292
+ this._observedElements.get(element).count--;
293
+ if (!this._observedElements.get(element).count) {
294
+ this._cleanupObserver(element);
295
+ }
296
+ }
297
+ }
298
+ _cleanupObserver(element) {
299
+ if (this._observedElements.has(element)) {
300
+ const { observer, stream } = this._observedElements.get(element);
301
+ if (observer) {
302
+ observer.disconnect();
303
+ }
304
+ stream.complete();
305
+ this._observedElements.delete(element);
306
+ }
307
+ }
308
+ }
309
+ ResizeObserverService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ResizeObserverService, deps: [{ token: ResizeObserverFactory }], target: i0.ɵɵFactoryTarget.Injectable });
310
+ ResizeObserverService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ResizeObserverService, providedIn: 'root' });
311
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ResizeObserverService, decorators: [{
312
+ type: Injectable,
313
+ args: [{ providedIn: 'root' }]
314
+ }], ctorParameters: function () { return [{ type: ResizeObserverFactory }]; } });
315
+
316
+ class ViewportService {
317
+ constructor(_viewportConfig, _breakpointObserver) {
318
+ this._breakpointObserver = _breakpointObserver;
319
+ this._isXs$ = new BehaviorSubject(false);
320
+ this._isSm$ = new BehaviorSubject(false);
321
+ this._isMd$ = new BehaviorSubject(false);
322
+ this._isLg$ = new BehaviorSubject(false);
323
+ this._isXl$ = new BehaviorSubject(false);
324
+ this._is2Xl$ = new BehaviorSubject(false);
325
+ this.currentViewport$ = combineLatest([this.isXs$, this.isSm$, this.isMd$, this.isLg$, this.isXl$, this.is2Xl$]).pipe(map((val) => this.getCurrentViewport(val)), shareReplay());
326
+ this._viewportConfig = _viewportConfig || DEFAULT_VIEWPORT_CONFIG;
327
+ this._observeDefaultBreakpoints();
328
+ }
329
+ get isXs$() {
330
+ return this._isXs$.asObservable();
331
+ }
332
+ get isXs() {
333
+ return this._isXs$.value;
334
+ }
335
+ get isSm$() {
336
+ return this._isSm$.asObservable();
337
+ }
338
+ get isSm() {
339
+ return this._isSm$.value;
340
+ }
341
+ get isMd$() {
342
+ return this._isMd$.asObservable();
343
+ }
344
+ get isMd() {
345
+ return this._isMd$.value;
346
+ }
347
+ get isLg$() {
348
+ return this._isLg$.asObservable();
349
+ }
350
+ get isLg() {
351
+ return this._isLg$.value;
352
+ }
353
+ get isXl$() {
354
+ return this._isXl$.asObservable();
355
+ }
356
+ get isXl() {
357
+ return this._isXl$.value;
358
+ }
359
+ get is2Xl$() {
360
+ return this._is2Xl$.asObservable();
178
361
  }
179
362
  get is2Xl() {
180
363
  return this._is2Xl$.value;
@@ -260,8 +443,8 @@ class ViewportService {
260
443
  return 'xs';
261
444
  }
262
445
  }
263
- ViewportService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ViewportService, deps: [{ token: VIEWPORT_CONFIG, optional: true }, { token: i1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Injectable });
264
- ViewportService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ViewportService, providedIn: 'root' });
446
+ ViewportService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ViewportService, deps: [{ token: VIEWPORT_CONFIG, optional: true }, { token: i1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Injectable });
447
+ ViewportService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ViewportService, providedIn: 'root' });
265
448
  __decorate([
266
449
  Memo(),
267
450
  __metadata("design:type", Function),
@@ -279,7 +462,7 @@ __decorate([
279
462
  __metadata("design:paramtypes", [Object]),
280
463
  __metadata("design:returntype", void 0)
281
464
  ], ViewportService.prototype, "_buildMediaQuery", null);
282
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ViewportService, decorators: [{
465
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ViewportService, decorators: [{
283
466
  type: Injectable,
284
467
  args: [{
285
468
  providedIn: 'root',
@@ -293,276 +476,268 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImpor
293
476
  }] }, { type: i1.BreakpointObserver }];
294
477
  }, propDecorators: { _getViewportSize: [], _buildMediaQuery: [] } });
295
478
 
296
- class FocusVisibleService {
479
+ class ClickOutsideDirective {
297
480
  constructor() {
298
- this._document = inject(DOCUMENT);
299
- this._hadKeyboardEvent = false;
300
- this._document.addEventListener('keydown', this.onKeyDown.bind(this), true);
301
- this._document.addEventListener('mousedown', this.onPointerDown.bind(this), true);
302
- this._document.addEventListener('pointerdown', this.onPointerDown.bind(this), true);
303
- this._document.addEventListener('touchstart', this.onPointerDown.bind(this), true);
304
- }
305
- get isFocusVisible() {
306
- return this._hadKeyboardEvent;
481
+ this._elementRef = inject(ElementRef);
482
+ this._clickObserverService = inject(ClickObserverService);
483
+ this._subscription = null;
484
+ this.etClickOutside = new EventEmitter();
307
485
  }
308
- onKeyDown(e) {
309
- if (e.metaKey || e.altKey || e.ctrlKey) {
310
- return;
311
- }
312
- this._hadKeyboardEvent = true;
486
+ ngOnInit() {
487
+ setTimeout(() => {
488
+ this._subscription = this._clickObserverService.observe(this._elementRef.nativeElement).subscribe((event) => {
489
+ const activeElement = event.target;
490
+ const isInside = this._elementRef.nativeElement.contains(activeElement);
491
+ if (!isInside) {
492
+ this.etClickOutside.emit(event);
493
+ }
494
+ });
495
+ });
313
496
  }
314
- onPointerDown() {
315
- this._hadKeyboardEvent = false;
497
+ ngOnDestroy() {
498
+ var _a;
499
+ (_a = this._subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
316
500
  }
317
501
  }
318
- FocusVisibleService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: FocusVisibleService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
319
- FocusVisibleServiceprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: FocusVisibleService, providedIn: 'root' });
320
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: FocusVisibleService, decorators: [{
321
- type: Injectable,
502
+ ClickOutsideDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ClickOutsideDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
503
+ ClickOutsideDirectivedir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.0", type: ClickOutsideDirective, isStandalone: true, selector: "[etClickOutside]", outputs: { etClickOutside: "etClickOutside" }, ngImport: i0 });
504
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ClickOutsideDirective, decorators: [{
505
+ type: Directive,
322
506
  args: [{
323
- providedIn: 'root',
507
+ selector: '[etClickOutside]',
508
+ standalone: true,
324
509
  }]
325
- }], ctorParameters: function () { return []; } });
510
+ }], propDecorators: { etClickOutside: [{
511
+ type: Output
512
+ }] } });
326
513
 
327
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
328
- class ResizeObserverFactory {
329
- create(callback) {
330
- return typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(callback);
331
- }
332
- }
333
- ResizeObserverFactory.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ResizeObserverFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
334
- ResizeObserverFactory.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ResizeObserverFactory, providedIn: 'root' });
335
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ResizeObserverFactory, decorators: [{
336
- type: Injectable,
337
- args: [{ providedIn: 'root' }]
338
- }] });
339
- class ResizeObserverService {
340
- constructor(_mutationObserverFactory) {
341
- this._mutationObserverFactory = _mutationObserverFactory;
342
- this._observedElements = new Map();
343
- }
344
- ngOnDestroy() {
345
- this._observedElements.forEach((_, element) => this._cleanupObserver(element));
514
+ const provideViewportConfig = (viewportConfig) => {
515
+ return { provide: VIEWPORT_CONFIG, useValue: viewportConfig };
516
+ };
517
+
518
+ const clamp = (value, min = 0, max = 100) => {
519
+ return Math.max(min, Math.min(max, value));
520
+ };
521
+
522
+ const elementCanScroll = (element) => {
523
+ const { scrollHeight, clientHeight, scrollWidth, clientWidth } = element;
524
+ return scrollHeight > clientHeight || scrollWidth > clientWidth;
525
+ };
526
+
527
+ const CURSOR_DRAG_SCROLLING_CLASS = 'et-cursor-drag-scroll--scrolling';
528
+ const CURSOR_DRAG_SCROLLING_PREPARED_CLASS = 'et-cursor-drag-scroll--prepared';
529
+
530
+ class CursorDragScrollDirective {
531
+ constructor() {
532
+ this._subscriptions = [];
533
+ this._destroy$ = inject(DestroyService).destroy$;
534
+ this._elementRef = inject(ElementRef);
535
+ this._contentObserverService = inject(ContentObserverService);
536
+ this._resizeObserverService = inject(ResizeObserverService);
537
+ this._bufferUntilScroll = 5;
538
+ this._mouseUp$ = new Subject();
539
+ this._isScrolling = false;
540
+ this._canScroll = false;
541
+ this._currentScrollState = {
542
+ top: 0,
543
+ left: 0,
544
+ x: 0,
545
+ y: 0,
546
+ };
547
+ this._enabled = false;
346
548
  }
347
- observe(elementOrRef) {
348
- const element = coerceElement(elementOrRef);
349
- return new Observable((observer) => {
350
- const stream = this._observeElement(element);
351
- const subscription = stream.subscribe(observer);
352
- return () => {
353
- subscription.unsubscribe();
354
- this._unobserveElement(element);
355
- };
356
- });
549
+ get enabled() {
550
+ return this._enabled;
357
551
  }
358
- _observeElement(element) {
359
- if (!this._observedElements.has(element)) {
360
- const stream = new Subject();
361
- const observer = this._mutationObserverFactory.create((resizes) => stream.next(resizes));
362
- if (observer) {
363
- observer.observe(element);
364
- }
365
- this._observedElements.set(element, { observer, stream, count: 1 });
552
+ set enabled(value) {
553
+ this._enabled = coerceBooleanProperty(value);
554
+ if (this._enabled) {
555
+ this._enableCursorDragScroll();
366
556
  }
367
557
  else {
368
- this._observedElements.get(element).count++;
558
+ this._disableCursorDragScroll();
369
559
  }
370
- return this._observedElements.get(element).stream;
371
560
  }
372
- _unobserveElement(element) {
373
- if (this._observedElements.has(element)) {
374
- this._observedElements.get(element).count--;
375
- if (!this._observedElements.get(element).count) {
376
- this._cleanupObserver(element);
377
- }
561
+ ngAfterViewInit() {
562
+ if (this.enabled) {
563
+ this._enableCursorDragScroll();
378
564
  }
379
- }
380
- _cleanupObserver(element) {
381
- if (this._observedElements.has(element)) {
382
- const { observer, stream } = this._observedElements.get(element);
383
- if (observer) {
384
- observer.disconnect();
385
- }
386
- stream.complete();
387
- this._observedElements.delete(element);
565
+ else {
566
+ this._disableCursorDragScroll();
388
567
  }
389
568
  }
390
- }
391
- ResizeObserverService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ResizeObserverService, deps: [{ token: ResizeObserverFactory }], target: i0.ɵɵFactoryTarget.Injectable });
392
- ResizeObserverService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ResizeObserverService, providedIn: 'root' });
393
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ResizeObserverService, decorators: [{
394
- type: Injectable,
395
- args: [{ providedIn: 'root' }]
396
- }], ctorParameters: function () { return [{ type: ResizeObserverFactory }]; } });
397
-
398
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
399
- class MutationObserverFactory {
400
- create(callback) {
401
- return typeof MutationObserver === 'undefined' ? null : new MutationObserver(callback);
569
+ _enableCursorDragScroll() {
570
+ const contentResizeSub = combineLatest([
571
+ this._contentObserverService.observe(this._elementRef.nativeElement).pipe(startWith(null)),
572
+ this._resizeObserverService.observe(this._elementRef.nativeElement).pipe(startWith(null)),
573
+ ])
574
+ .pipe(debounceTime(25), tap(() => this._updateCanScrollState()), takeUntil(this._destroy$))
575
+ .subscribe();
576
+ const mousedownSub = fromEvent(this._elementRef.nativeElement, 'mousedown')
577
+ .pipe(tap((e) => this._onMouseDown(e)), takeUntil(this._destroy$))
578
+ .subscribe();
579
+ this._subscriptions.push(contentResizeSub, mousedownSub);
580
+ this._updateCanScrollState();
402
581
  }
403
- }
404
- MutationObserverFactory.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: MutationObserverFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
405
- MutationObserverFactory.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: MutationObserverFactory, providedIn: 'root' });
406
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: MutationObserverFactory, decorators: [{
407
- type: Injectable,
408
- args: [{ providedIn: 'root' }]
409
- }] });
410
- class ContentObserverService {
411
- constructor(_mutationObserverFactory) {
412
- this._mutationObserverFactory = _mutationObserverFactory;
413
- this._observedElements = new Map();
582
+ _disableCursorDragScroll() {
583
+ this._subscriptions.forEach((sub) => sub.unsubscribe());
584
+ this._subscriptions.length = 0;
585
+ this._elementRef.nativeElement.style.cursor = 'default';
414
586
  }
415
- ngOnDestroy() {
416
- this._observedElements.forEach((_, element) => this._cleanupObserver(element));
417
- }
418
- observe(elementOrRef) {
419
- const element = coerceElement(elementOrRef);
420
- return new Observable((observer) => {
421
- const stream = this._observeElement(element);
422
- const subscription = stream.subscribe(observer);
423
- return () => {
424
- subscription.unsubscribe();
425
- this._unobserveElement(element);
426
- };
427
- });
587
+ _onMouseDown(e) {
588
+ var _a;
589
+ if (!((_a = this._elementRef) === null || _a === void 0 ? void 0 : _a.nativeElement) || !this._canScroll) {
590
+ return;
591
+ }
592
+ const element = this._elementRef.nativeElement;
593
+ element.classList.add(CURSOR_DRAG_SCROLLING_PREPARED_CLASS);
594
+ this._elementRef.nativeElement.style.scrollSnapType = 'none';
595
+ this._elementRef.nativeElement.style.scrollBehavior = 'unset';
596
+ this._currentScrollState = {
597
+ left: this._elementRef.nativeElement.scrollLeft,
598
+ top: this._elementRef.nativeElement.scrollTop,
599
+ x: e.clientX,
600
+ y: e.clientY,
601
+ };
602
+ fromEvent(document, 'mousemove')
603
+ .pipe(tap((e) => this._mouseMoveHandler(e)), takeUntil(this._mouseUp$), takeUntil(this._destroy$))
604
+ .subscribe();
605
+ fromEvent(document, 'mouseup')
606
+ .pipe(tap(() => this._mouseUpHandler()), take(1), takeUntil(this._destroy$))
607
+ .subscribe();
428
608
  }
429
- _observeElement(element) {
430
- if (!this._observedElements.has(element)) {
431
- const stream = new Subject();
432
- const observer = this._mutationObserverFactory.create((mutations) => stream.next(mutations));
433
- if (observer) {
434
- observer.observe(element, {
435
- characterData: true,
436
- childList: true,
437
- subtree: true,
609
+ _mouseMoveHandler(e) {
610
+ var _a;
611
+ e.preventDefault();
612
+ if (!((_a = this._elementRef) === null || _a === void 0 ? void 0 : _a.nativeElement)) {
613
+ return;
614
+ }
615
+ const dx = e.clientX - this._currentScrollState.x;
616
+ const dy = e.clientY - this._currentScrollState.y;
617
+ if (Math.abs(dx) > this._bufferUntilScroll || Math.abs(dy) > this._bufferUntilScroll) {
618
+ const element = this._elementRef.nativeElement;
619
+ if (!this._isScrolling) {
620
+ this._isScrolling = true;
621
+ element.style.cursor = 'grabbing';
622
+ element.classList.add(CURSOR_DRAG_SCROLLING_CLASS);
623
+ element.scroll({
624
+ top: this._currentScrollState.top - dy,
625
+ left: this._currentScrollState.left - dx,
626
+ behavior: 'smooth',
438
627
  });
439
628
  }
440
- this._observedElements.set(element, { observer, stream, count: 1 });
441
- }
442
- else {
443
- this._observedElements.get(element).count++;
629
+ else {
630
+ element.scrollTop = this._currentScrollState.top - dy;
631
+ element.scrollLeft = this._currentScrollState.left - dx;
632
+ }
444
633
  }
445
- return this._observedElements.get(element).stream;
446
634
  }
447
- _unobserveElement(element) {
448
- if (this._observedElements.has(element)) {
449
- this._observedElements.get(element).count--;
450
- if (!this._observedElements.get(element).count) {
451
- this._cleanupObserver(element);
452
- }
635
+ _mouseUpHandler() {
636
+ var _a;
637
+ this._mouseUp$.next(true);
638
+ this._isScrolling = false;
639
+ if (!((_a = this._elementRef) === null || _a === void 0 ? void 0 : _a.nativeElement)) {
640
+ return;
453
641
  }
642
+ this._elementRef.nativeElement.style.scrollSnapType = '';
643
+ this._elementRef.nativeElement.style.scrollBehavior = '';
644
+ this._elementRef.nativeElement.style.cursor = 'grab';
645
+ this._elementRef.nativeElement.classList.remove(CURSOR_DRAG_SCROLLING_CLASS);
646
+ this._elementRef.nativeElement.classList.remove(CURSOR_DRAG_SCROLLING_PREPARED_CLASS);
454
647
  }
455
- _cleanupObserver(element) {
456
- if (this._observedElements.has(element)) {
457
- const { observer, stream } = this._observedElements.get(element);
458
- if (observer) {
459
- observer.disconnect();
460
- }
461
- stream.complete();
462
- this._observedElements.delete(element);
648
+ _updateCanScrollState() {
649
+ this._canScroll = elementCanScroll(this._elementRef.nativeElement);
650
+ if (this._canScroll) {
651
+ this._elementRef.nativeElement.style.cursor = 'grab';
652
+ }
653
+ else {
654
+ this._elementRef.nativeElement.style.cursor = 'default';
463
655
  }
464
656
  }
465
657
  }
466
- ContentObserverService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ContentObserverService, deps: [{ token: MutationObserverFactory }], target: i0.ɵɵFactoryTarget.Injectable });
467
- ContentObserverServiceprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ContentObserverService, providedIn: 'root' });
468
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ContentObserverService, decorators: [{
469
- type: Injectable,
470
- args: [{ providedIn: 'root' }]
471
- }], ctorParameters: function () { return [{ type: MutationObserverFactory }]; } });
658
+ CursorDragScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: CursorDragScrollDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
659
+ CursorDragScrollDirectivedir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.0", type: CursorDragScrollDirective, isStandalone: true, selector: "[etCursorDragScroll]", inputs: { enabled: ["etCursorDragScroll", "enabled"] }, providers: [DestroyService], exportAs: ["etCursorDragScroll"], ngImport: i0 });
660
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: CursorDragScrollDirective, decorators: [{
661
+ type: Directive,
662
+ args: [{
663
+ selector: '[etCursorDragScroll]',
664
+ exportAs: 'etCursorDragScroll',
665
+ standalone: true,
666
+ providers: [DestroyService],
667
+ }]
668
+ }], propDecorators: { enabled: [{
669
+ type: Input,
670
+ args: ['etCursorDragScroll']
671
+ }] } });
472
672
 
473
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
474
- class ClickObserverFactory {
475
- create() {
476
- return fromEvent(document, 'click');
477
- }
478
- }
479
- ClickObserverFactory.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ClickObserverFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
480
- ClickObserverFactory.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ClickObserverFactory, providedIn: 'root' });
481
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ClickObserverFactory, decorators: [{
482
- type: Injectable,
483
- args: [{ providedIn: 'root' }]
484
- }] });
485
- class ClickObserverService {
486
- constructor(_clickObserverFactory) {
487
- this._clickObserverFactory = _clickObserverFactory;
488
- this._observedElements = new Map();
673
+ class DestroyDirective {
674
+ constructor() {
675
+ this._destroy$ = new Subject();
676
+ this.destroy$ = this._destroy$.asObservable();
489
677
  }
490
678
  ngOnDestroy() {
491
- this._observedElements.forEach((_, element) => this._cleanupObserver(element));
492
- }
493
- observe(elementOrRef) {
494
- const element = coerceElement(elementOrRef);
495
- return new Observable((observer) => {
496
- const stream = this._observeElement(element);
497
- const subscription = stream.subscribe(observer);
498
- return () => {
499
- subscription.unsubscribe();
500
- this._unobserveElement(element);
501
- };
502
- });
503
- }
504
- _observeElement(element) {
505
- if (!this._observedElements.has(element)) {
506
- const stream = new Subject();
507
- const observer = this._clickObserverFactory.create();
508
- const sub = observer.subscribe((event) => stream.next(event));
509
- this._observedElements.set(element, { observer: sub, stream, count: 1 });
510
- }
511
- else {
512
- this._observedElements.get(element).count++;
513
- }
514
- return this._observedElements.get(element).stream;
679
+ this._destroy$.next(true);
680
+ this._destroy$.unsubscribe();
515
681
  }
516
- _unobserveElement(element) {
517
- if (this._observedElements.has(element)) {
518
- this._observedElements.get(element).count--;
519
- if (!this._observedElements.get(element).count) {
520
- this._cleanupObserver(element);
521
- }
522
- }
682
+ }
683
+ DestroyDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: DestroyDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
684
+ DestroyDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.0", type: DestroyDirective, isStandalone: true, ngImport: i0 });
685
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: DestroyDirective, decorators: [{
686
+ type: Directive,
687
+ args: [{
688
+ standalone: true,
689
+ }]
690
+ }] });
691
+
692
+ class LetContext {
693
+ constructor() {
694
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
695
+ this.$implicit = null;
696
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
697
+ this.etLet = null;
523
698
  }
524
- _cleanupObserver(element) {
525
- if (this._observedElements.has(element)) {
526
- const { observer, stream } = this._observedElements.get(element);
527
- if (observer) {
528
- observer.unsubscribe();
529
- }
530
- stream.complete();
531
- this._observedElements.delete(element);
532
- }
699
+ }
700
+
701
+ class LetDirective {
702
+ constructor(_viewContainer, templateRef) {
703
+ this._viewContainer = _viewContainer;
704
+ this._context = new LetContext();
705
+ this._templateRef = null;
706
+ this._viewRef = null;
707
+ this._templateRef = templateRef;
533
708
  }
534
- }
535
- ClickObserverService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ClickObserverService, deps: [{ token: ClickObserverFactory }], target: i0.ɵɵFactoryTarget.Injectable });
536
- ClickObserverService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ClickObserverService, providedIn: 'root' });
537
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ClickObserverService, decorators: [{
538
- type: Injectable,
539
- args: [{ providedIn: 'root' }]
540
- }], ctorParameters: function () { return [{ type: ClickObserverFactory }]; } });
541
-
542
- class DestroyService {
543
- constructor() {
544
- this._destroy$ = new Subject();
709
+ set etLet(value) {
710
+ this._context.$implicit = this._context.etLet = value;
711
+ this._updateView();
545
712
  }
546
- get destroy$() {
547
- return this._destroy$.asObservable();
713
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
714
+ static ngTemplateContextGuard(dir, ctx) {
715
+ return true;
548
716
  }
549
- ngOnDestroy() {
550
- this._destroy$.next(true);
551
- this._destroy$.unsubscribe();
717
+ _updateView() {
718
+ if (!this._viewRef) {
719
+ this._viewContainer.clear();
720
+ if (this._templateRef) {
721
+ this._viewRef = this._viewContainer.createEmbeddedView(this._templateRef, this._context);
722
+ }
723
+ }
552
724
  }
553
725
  }
554
- DestroyService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: DestroyService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
555
- DestroyServiceprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: DestroyService, providedIn: 'any' });
556
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: DestroyService, decorators: [{
557
- type: Injectable,
726
+ LetDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: LetDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
727
+ LetDirectivedir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.0", type: LetDirective, isStandalone: true, selector: "[etLet]", inputs: { etLet: "etLet" }, ngImport: i0 });
728
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: LetDirective, decorators: [{
729
+ type: Directive,
558
730
  args: [{
559
- providedIn: 'any',
731
+ selector: '[etLet]',
732
+ standalone: true,
560
733
  }]
561
- }] });
734
+ }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.TemplateRef }]; }, propDecorators: { etLet: [{
735
+ type: Input
736
+ }] } });
562
737
 
563
- class ObserveResizeDirective {
738
+ class ObserveContentDirective {
564
739
  constructor() {
565
- this._resizeObserver = inject(ResizeObserverService);
740
+ this._contentObserver = inject(ContentObserverService);
566
741
  this._elementRef = inject(ElementRef);
567
742
  this._ngZone = inject(NgZone);
568
743
  this.event = new EventEmitter();
@@ -594,9 +769,9 @@ class ObserveResizeDirective {
594
769
  }
595
770
  _subscribe() {
596
771
  this._unsubscribe();
597
- const stream = this._resizeObserver.observe(this._elementRef);
772
+ const stream = this._contentObserver.observe(this._elementRef);
598
773
  this._ngZone.runOutsideAngular(() => {
599
- this._currentSubscription = (this.debounce ? stream.pipe(debounceTime(this.debounce)) : stream).subscribe(this.event);
774
+ this._currentSubscription = (this.debounce ? stream.pipe(debounceTime$1(this.debounce)) : stream).subscribe(this.event);
600
775
  });
601
776
  }
602
777
  _unsubscribe() {
@@ -604,29 +779,29 @@ class ObserveResizeDirective {
604
779
  (_a = this._currentSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
605
780
  }
606
781
  }
607
- ObserveResizeDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ObserveResizeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
608
- ObserveResizeDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.9", type: ObserveResizeDirective, isStandalone: true, selector: "[etObserveResize]", inputs: { disabled: ["etObserveResizeDisabled", "disabled"], debounce: ["etObserveResizeDebounce", "debounce"] }, outputs: { event: "etObserveResize" }, exportAs: ["etObserveResize"], ngImport: i0 });
609
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ObserveResizeDirective, decorators: [{
782
+ ObserveContentDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ObserveContentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
783
+ ObserveContentDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.0", type: ObserveContentDirective, isStandalone: true, selector: "[etObserveContent]", inputs: { disabled: ["etObserveContentDisabled", "disabled"], debounce: ["etObserveContentDebounce", "debounce"] }, outputs: { event: "etObserveContent" }, exportAs: ["etObserveContent"], ngImport: i0 });
784
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ObserveContentDirective, decorators: [{
610
785
  type: Directive,
611
786
  args: [{
612
- selector: '[etObserveResize]',
613
- exportAs: 'etObserveResize',
787
+ selector: '[etObserveContent]',
788
+ exportAs: 'etObserveContent',
614
789
  standalone: true,
615
790
  }]
616
791
  }], propDecorators: { event: [{
617
792
  type: Output,
618
- args: ['etObserveResize']
793
+ args: ['etObserveContent']
619
794
  }], disabled: [{
620
795
  type: Input,
621
- args: ['etObserveResizeDisabled']
796
+ args: ['etObserveContentDisabled']
622
797
  }], debounce: [{
623
798
  type: Input,
624
- args: ['etObserveResizeDebounce']
799
+ args: ['etObserveContentDebounce']
625
800
  }] } });
626
801
 
627
- class ObserveContentDirective {
802
+ class ObserveResizeDirective {
628
803
  constructor() {
629
- this._contentObserver = inject(ContentObserverService);
804
+ this._resizeObserver = inject(ResizeObserverService);
630
805
  this._elementRef = inject(ElementRef);
631
806
  this._ngZone = inject(NgZone);
632
807
  this.event = new EventEmitter();
@@ -658,9 +833,9 @@ class ObserveContentDirective {
658
833
  }
659
834
  _subscribe() {
660
835
  this._unsubscribe();
661
- const stream = this._contentObserver.observe(this._elementRef);
836
+ const stream = this._resizeObserver.observe(this._elementRef);
662
837
  this._ngZone.runOutsideAngular(() => {
663
- this._currentSubscription = (this.debounce ? stream.pipe(debounceTime$1(this.debounce)) : stream).subscribe(this.event);
838
+ this._currentSubscription = (this.debounce ? stream.pipe(debounceTime(this.debounce)) : stream).subscribe(this.event);
664
839
  });
665
840
  }
666
841
  _unsubscribe() {
@@ -668,80 +843,60 @@ class ObserveContentDirective {
668
843
  (_a = this._currentSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
669
844
  }
670
845
  }
671
- ObserveContentDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ObserveContentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
672
- ObserveContentDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.9", type: ObserveContentDirective, isStandalone: true, selector: "[etObserveContent]", inputs: { disabled: ["etObserveContentDisabled", "disabled"], debounce: ["etObserveContentDebounce", "debounce"] }, outputs: { event: "etObserveContent" }, exportAs: ["etObserveContent"], ngImport: i0 });
673
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ObserveContentDirective, decorators: [{
846
+ ObserveResizeDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ObserveResizeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
847
+ ObserveResizeDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.0", type: ObserveResizeDirective, isStandalone: true, selector: "[etObserveResize]", inputs: { disabled: ["etObserveResizeDisabled", "disabled"], debounce: ["etObserveResizeDebounce", "debounce"] }, outputs: { event: "etObserveResize" }, exportAs: ["etObserveResize"], ngImport: i0 });
848
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ObserveResizeDirective, decorators: [{
674
849
  type: Directive,
675
850
  args: [{
676
- selector: '[etObserveContent]',
677
- exportAs: 'etObserveContent',
851
+ selector: '[etObserveResize]',
852
+ exportAs: 'etObserveResize',
678
853
  standalone: true,
679
854
  }]
680
855
  }], propDecorators: { event: [{
681
856
  type: Output,
682
- args: ['etObserveContent']
857
+ args: ['etObserveResize']
683
858
  }], disabled: [{
684
859
  type: Input,
685
- args: ['etObserveContentDisabled']
860
+ args: ['etObserveResizeDisabled']
686
861
  }], debounce: [{
687
862
  type: Input,
688
- args: ['etObserveContentDebounce']
863
+ args: ['etObserveResizeDebounce']
689
864
  }] } });
690
865
 
691
- class ClickOutsideDirective {
866
+ const SCROLL_OBSERVER_FIRST_ELEMENT_CLASS = 'et-scroll-observer-first-element';
867
+ class ScrollObserverFirstElementDirective {
692
868
  constructor() {
693
- this._elementRef = inject(ElementRef);
694
- this._clickObserverService = inject(ClickObserverService);
695
- this._subscription = null;
696
- this.etClickOutside = new EventEmitter();
869
+ this._isFirstElement = false;
697
870
  }
698
- ngOnInit() {
699
- setTimeout(() => {
700
- this._subscription = this._clickObserverService.observe(this._elementRef.nativeElement).subscribe((event) => {
701
- const activeElement = event.target;
702
- const isInside = this._elementRef.nativeElement.contains(activeElement);
703
- if (!isInside) {
704
- this.etClickOutside.emit(event);
705
- }
706
- });
707
- });
871
+ get isFirstElement() {
872
+ return this._isFirstElement;
708
873
  }
709
- ngOnDestroy() {
710
- var _a;
711
- (_a = this._subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
874
+ set isFirstElement(value) {
875
+ this._isFirstElement = coerceBooleanProperty(value);
712
876
  }
713
877
  }
714
- ClickOutsideDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ClickOutsideDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
715
- ClickOutsideDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.9", type: ClickOutsideDirective, isStandalone: true, selector: "[etClickOutside]", outputs: { etClickOutside: "etClickOutside" }, ngImport: i0 });
716
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ClickOutsideDirective, decorators: [{
878
+ ScrollObserverFirstElementDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ScrollObserverFirstElementDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
879
+ ScrollObserverFirstElementDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.0", type: ScrollObserverFirstElementDirective, isStandalone: true, selector: "[etScrollObserverFirstElement]", inputs: { isFirstElement: ["etScrollObserverFirstElement", "isFirstElement"] }, host: { properties: { "class.et-scroll-observer-first-element": "this.isFirstElement" } }, ngImport: i0 });
880
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ScrollObserverFirstElementDirective, decorators: [{
717
881
  type: Directive,
718
882
  args: [{
719
- selector: '[etClickOutside]',
883
+ selector: '[etScrollObserverFirstElement]',
720
884
  standalone: true,
721
885
  }]
722
- }], propDecorators: { etClickOutside: [{
723
- type: Output
886
+ }], propDecorators: { isFirstElement: [{
887
+ type: Input,
888
+ args: ['etScrollObserverFirstElement']
889
+ }, {
890
+ type: HostBinding,
891
+ args: [`class.${SCROLL_OBSERVER_FIRST_ELEMENT_CLASS}`]
724
892
  }] } });
725
893
 
726
- const provideViewportConfig = (viewportConfig) => {
727
- return { provide: VIEWPORT_CONFIG, useValue: viewportConfig };
728
- };
729
-
730
- const clamp = (value, min = 0, max = 100) => {
731
- return Math.max(min, Math.min(max, value));
732
- };
733
-
734
- const elementCanScroll = (element) => {
735
- const { scrollHeight, clientHeight, scrollWidth, clientWidth } = element;
736
- return scrollHeight > clientHeight || scrollWidth > clientWidth;
737
- };
738
-
739
894
  const SCROLL_OBSERVER_IGNORE_TARGET_CLASS = 'et-scroll-observer-ignore-target';
740
895
  class ScrollObserverIgnoreTargetDirective {
741
896
  }
742
- ScrollObserverIgnoreTargetDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ScrollObserverIgnoreTargetDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
743
- ScrollObserverIgnoreTargetDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.9", type: ScrollObserverIgnoreTargetDirective, isStandalone: true, selector: "[etScrollObserverIgnoreTarget]", host: { classAttribute: "et-scroll-observer-ignore-target" }, ngImport: i0 });
744
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ScrollObserverIgnoreTargetDirective, decorators: [{
897
+ ScrollObserverIgnoreTargetDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ScrollObserverIgnoreTargetDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
898
+ ScrollObserverIgnoreTargetDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.0", type: ScrollObserverIgnoreTargetDirective, isStandalone: true, selector: "[etScrollObserverIgnoreTarget]", host: { classAttribute: "et-scroll-observer-ignore-target" }, ngImport: i0 });
899
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ScrollObserverIgnoreTargetDirective, decorators: [{
745
900
  type: Directive,
746
901
  args: [{
747
902
  selector: '[etScrollObserverIgnoreTarget]',
@@ -752,6 +907,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImpor
752
907
  }]
753
908
  }] });
754
909
 
910
+ const SCROLL_OBSERVER_LAST_ELEMENT_CLASS = 'et-scroll-observer-last-element';
911
+ class ScrollObserverLastElementDirective {
912
+ constructor() {
913
+ this._isLastElement = false;
914
+ }
915
+ get isLastElement() {
916
+ return this._isLastElement;
917
+ }
918
+ set isLastElement(value) {
919
+ this._isLastElement = coerceBooleanProperty(value);
920
+ }
921
+ }
922
+ ScrollObserverLastElementDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ScrollObserverLastElementDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
923
+ ScrollObserverLastElementDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.0", type: ScrollObserverLastElementDirective, isStandalone: true, selector: "[etScrollObserverLastElement]", inputs: { isLastElement: ["etScrollObserverLastElement", "isLastElement"] }, host: { properties: { "class.et-scroll-observer-last-element": "this.isLastElement" }, classAttribute: "et-scroll-observer-last-element" }, ngImport: i0 });
924
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ScrollObserverLastElementDirective, decorators: [{
925
+ type: Directive,
926
+ args: [{
927
+ selector: '[etScrollObserverLastElement]',
928
+ standalone: true,
929
+ host: {
930
+ class: SCROLL_OBSERVER_LAST_ELEMENT_CLASS,
931
+ },
932
+ }]
933
+ }], propDecorators: { isLastElement: [{
934
+ type: Input,
935
+ args: ['etScrollObserverLastElement']
936
+ }, {
937
+ type: HostBinding,
938
+ args: [`class.${SCROLL_OBSERVER_LAST_ELEMENT_CLASS}`]
939
+ }] } });
940
+
755
941
  const OBSERVE_SCROLL_STATE = new InjectionToken('OBSERVE_SCROLL_STATE');
756
942
 
757
943
  class ObserveScrollStateDirective {
@@ -770,10 +956,18 @@ class ObserveScrollStateDirective {
770
956
  this.etObserveScrollState = new EventEmitter();
771
957
  }
772
958
  get _firstCurrentChild() {
959
+ const explicitFirstElement = this._elementRef.nativeElement.querySelector(`.${SCROLL_OBSERVER_FIRST_ELEMENT_CLASS}`);
960
+ if (explicitFirstElement) {
961
+ return explicitFirstElement;
962
+ }
773
963
  const element = this._elementRef.nativeElement.children[0];
774
964
  return this._getNonIgnoredChild(element, 'next');
775
965
  }
776
966
  get _lastCurrentChild() {
967
+ const explicitLastElement = this._elementRef.nativeElement.querySelector(`.${SCROLL_OBSERVER_LAST_ELEMENT_CLASS}`);
968
+ if (explicitLastElement) {
969
+ return explicitLastElement;
970
+ }
777
971
  const element = this._elementRef.nativeElement.children[this._elementRef.nativeElement.children.length - 1];
778
972
  return this._getNonIgnoredChild(element, 'previous');
779
973
  }
@@ -797,7 +991,8 @@ class ObserveScrollStateDirective {
797
991
  this._resizeObserverService
798
992
  .observe(this._elementRef.nativeElement)
799
993
  .pipe(debounceTime(25), tap(() => {
800
- if (!this._intersectionObserver && elementCanScroll(this._elementRef.nativeElement)) {
994
+ const canScroll = elementCanScroll(this._elementRef.nativeElement);
995
+ if ((!this._intersectionObserver && canScroll) || (this._intersectionObserver && !canScroll)) {
801
996
  this._checkChildren();
802
997
  }
803
998
  }), takeUntil(this._destroy$))
@@ -849,6 +1044,7 @@ class ObserveScrollStateDirective {
849
1044
  var _a;
850
1045
  (_a = this._intersectionObserver) === null || _a === void 0 ? void 0 : _a.observe(element);
851
1046
  this._observedChildren[child] = element;
1047
+ element.classList.add(`et-scroll-observer-observing-${child}-element`);
852
1048
  }
853
1049
  _unobserveChild(child) {
854
1050
  var _a;
@@ -856,6 +1052,7 @@ class ObserveScrollStateDirective {
856
1052
  if (!observedChild) {
857
1053
  return;
858
1054
  }
1055
+ observedChild.classList.remove('et-scroll-observer-observing-first-element', 'et-scroll-observer-observing-last-element');
859
1056
  (_a = this._intersectionObserver) === null || _a === void 0 ? void 0 : _a.unobserve(observedChild);
860
1057
  this._observedChildren[child] = null;
861
1058
  }
@@ -878,14 +1075,15 @@ class ObserveScrollStateDirective {
878
1075
  return element;
879
1076
  }
880
1077
  }
881
- ObserveScrollStateDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ObserveScrollStateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
882
- ObserveScrollStateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.9", type: ObserveScrollStateDirective, isStandalone: true, selector: "[etObserveScrollState]", inputs: { observerRootMargin: "observerRootMargin", observerThreshold: "observerThreshold" }, outputs: { etObserveScrollState: "etObserveScrollState" }, providers: [
1078
+ ObserveScrollStateDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ObserveScrollStateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1079
+ ObserveScrollStateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.0", type: ObserveScrollStateDirective, isStandalone: true, selector: "[etObserveScrollState]", inputs: { observerRootMargin: "observerRootMargin", observerThreshold: "observerThreshold" }, outputs: { etObserveScrollState: "etObserveScrollState" }, providers: [
883
1080
  {
884
1081
  provide: OBSERVE_SCROLL_STATE,
885
1082
  useExisting: ObserveScrollStateDirective,
886
1083
  },
1084
+ DestroyService,
887
1085
  ], exportAs: ["etObserveScrollState"], ngImport: i0 });
888
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ObserveScrollStateDirective, decorators: [{
1086
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ObserveScrollStateDirective, decorators: [{
889
1087
  type: Directive,
890
1088
  args: [{
891
1089
  selector: '[etObserveScrollState]',
@@ -896,6 +1094,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImpor
896
1094
  provide: OBSERVE_SCROLL_STATE,
897
1095
  useExisting: ObserveScrollStateDirective,
898
1096
  },
1097
+ DestroyService,
899
1098
  ],
900
1099
  }]
901
1100
  }], propDecorators: { observerRootMargin: [{
@@ -906,126 +1105,203 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImpor
906
1105
  type: Output
907
1106
  }] } });
908
1107
 
909
- const CURSOR_DRAG_SCROLLING_CLASS = 'et-cursor-drag-scroll--scrolling';
910
- const CURSOR_DRAG_SCROLLING_PREPARED_CLASS = 'et-cursor-drag-scroll--prepared';
1108
+ class RepeatDirective {
1109
+ constructor(_mainTemplateRef, _viewContainerRef) {
1110
+ this._mainTemplateRef = _mainTemplateRef;
1111
+ this._viewContainerRef = _viewContainerRef;
1112
+ this._repeatCount = 2;
1113
+ }
1114
+ get repeatCount() {
1115
+ return this._repeatCount;
1116
+ }
1117
+ set repeatCount(value) {
1118
+ this._repeatCount = coerceNumberProperty(value);
1119
+ }
1120
+ ngOnInit() {
1121
+ this._render();
1122
+ }
1123
+ _render() {
1124
+ for (let i = 0; i < this.repeatCount; i++) {
1125
+ this._viewContainerRef.createEmbeddedView(this._mainTemplateRef);
1126
+ }
1127
+ }
1128
+ }
1129
+ RepeatDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: RepeatDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
1130
+ RepeatDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.0", type: RepeatDirective, isStandalone: true, selector: "[etRepeat]", inputs: { repeatCount: ["etRepeat", "repeatCount"] }, ngImport: i0 });
1131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: RepeatDirective, decorators: [{
1132
+ type: Directive,
1133
+ args: [{
1134
+ selector: '[etRepeat]',
1135
+ standalone: true,
1136
+ }]
1137
+ }], ctorParameters: function () { return [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }]; }, propDecorators: { repeatCount: [{
1138
+ type: Input,
1139
+ args: ['etRepeat']
1140
+ }] } });
911
1141
 
912
- class CursorDragScrollDirective {
1142
+ const SEO_DIRECTIVE_TOKEN = new InjectionToken('SEO_DIRECTIVE_TOKEN');
1143
+
1144
+ const mergeSeoConfig = (config, parentConfig) => {
1145
+ return Object.assign(Object.assign({}, parentConfig), config);
1146
+ };
1147
+
1148
+ class SeoDirective {
913
1149
  constructor() {
914
- this._destroy$ = inject(DestroyService).destroy$;
915
- this._elementRef = inject(ElementRef);
916
- this._contentObserverService = inject(ContentObserverService);
917
- this._resizeObserverService = inject(ResizeObserverService);
918
- this._bufferUntilScroll = 5;
919
- this._mouseUp$ = new Subject();
920
- this._isScrolling = false;
921
- this._canScroll = false;
922
- this._currentScrollState = {
923
- top: 0,
924
- left: 0,
925
- x: 0,
926
- y: 0,
927
- };
1150
+ this._metaService = inject(Meta);
1151
+ this._titleService = inject(Title);
1152
+ this._onDeactivate$ = new Subject();
1153
+ this._isDeactivated = false;
1154
+ this.parent = inject(SEO_DIRECTIVE_TOKEN, { optional: true, skipSelf: true });
1155
+ this._config = {};
928
1156
  }
929
- ngAfterViewInit() {
930
- combineLatest([
931
- this._contentObserverService.observe(this._elementRef.nativeElement),
932
- this._resizeObserverService.observe(this._elementRef.nativeElement),
933
- ])
934
- .pipe(tap(() => this._updateCanScrollState()), takeUntil(this._destroy$))
935
- .subscribe();
936
- fromEvent(this._elementRef.nativeElement, 'mousedown')
937
- .pipe(tap((e) => this._onMouseDown(e)), takeUntil(this._destroy$))
938
- .subscribe();
939
- this._updateCanScrollState();
1157
+ get config() {
1158
+ return this._config;
940
1159
  }
941
- _onMouseDown(e) {
1160
+ ngOnInit() {
942
1161
  var _a;
943
- if (!((_a = this._elementRef) === null || _a === void 0 ? void 0 : _a.nativeElement) || !this._canScroll) {
944
- return;
945
- }
946
- const element = this._elementRef.nativeElement;
947
- element.classList.add(CURSOR_DRAG_SCROLLING_PREPARED_CLASS);
948
- this._elementRef.nativeElement.style.scrollSnapType = 'none';
949
- this._elementRef.nativeElement.style.scrollBehavior = 'unset';
950
- this._currentScrollState = {
951
- left: this._elementRef.nativeElement.scrollLeft,
952
- top: this._elementRef.nativeElement.scrollTop,
953
- x: e.clientX,
954
- y: e.clientY,
955
- };
956
- fromEvent(document, 'mousemove')
957
- .pipe(tap((e) => this._mouseMoveHandler(e)), takeUntil(this._mouseUp$), takeUntil(this._destroy$))
958
- .subscribe();
959
- fromEvent(document, 'mouseup')
960
- .pipe(tap(() => this._mouseUpHandler()), take(1), takeUntil(this._destroy$))
961
- .subscribe();
1162
+ (_a = this.parent) === null || _a === void 0 ? void 0 : _a._deactivate();
962
1163
  }
963
- _mouseMoveHandler(e) {
1164
+ ngOnDestroy() {
964
1165
  var _a;
965
- e.preventDefault();
966
- if (!((_a = this._elementRef) === null || _a === void 0 ? void 0 : _a.nativeElement)) {
1166
+ this._deactivate();
1167
+ this._cleanUp();
1168
+ (_a = this.parent) === null || _a === void 0 ? void 0 : _a._activate();
1169
+ }
1170
+ updateConfig(config) {
1171
+ var _a;
1172
+ this._config = mergeSeoConfig(config, ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.config) || {});
1173
+ if (this._isDeactivated) {
967
1174
  return;
968
1175
  }
969
- const dx = e.clientX - this._currentScrollState.x;
970
- const dy = e.clientY - this._currentScrollState.y;
971
- if (Math.abs(dx) > this._bufferUntilScroll || Math.abs(dy) > this._bufferUntilScroll) {
972
- const element = this._elementRef.nativeElement;
973
- if (!this._isScrolling) {
974
- this._isScrolling = true;
975
- element.style.cursor = 'grabbing';
976
- element.classList.add(CURSOR_DRAG_SCROLLING_CLASS);
977
- element.scroll({
978
- top: this._currentScrollState.top - dy,
979
- left: this._currentScrollState.left - dx,
980
- behavior: 'smooth',
1176
+ this._deactivate();
1177
+ this._activate();
1178
+ }
1179
+ _activate() {
1180
+ this._onDeactivate$.next(false);
1181
+ this._isDeactivated = false;
1182
+ for (const [key, value] of Object.entries(this._config)) {
1183
+ if (value instanceof Observable) {
1184
+ value.pipe(takeUntil(this._onDeactivate$)).subscribe((value) => this._update(key, value));
1185
+ }
1186
+ else if (Array.isArray(value)) {
1187
+ value.forEach((value) => {
1188
+ if (value instanceof Observable) {
1189
+ value.pipe(takeUntil(this._onDeactivate$)).subscribe((value) => this._update(key, value));
1190
+ }
1191
+ else {
1192
+ this._update(key, value);
1193
+ }
981
1194
  });
982
1195
  }
1196
+ else if (typeof value === 'object' && value !== null) {
1197
+ for (const [subKey, subValue] of Object.entries(value)) {
1198
+ if (subValue instanceof Observable) {
1199
+ subValue.pipe(takeUntil(this._onDeactivate$)).subscribe((value) => this._update(`${key}:${subKey}`, value));
1200
+ }
1201
+ else {
1202
+ this._update(`${key}:${subKey}`, subValue);
1203
+ }
1204
+ }
1205
+ }
983
1206
  else {
984
- element.scrollTop = this._currentScrollState.top - dy;
985
- element.scrollLeft = this._currentScrollState.left - dx;
1207
+ this._update(key, value);
986
1208
  }
987
1209
  }
988
1210
  }
989
- _mouseUpHandler() {
990
- var _a;
991
- this._mouseUp$.next(true);
992
- this._isScrolling = false;
993
- if (!((_a = this._elementRef) === null || _a === void 0 ? void 0 : _a.nativeElement)) {
994
- return;
995
- }
996
- this._elementRef.nativeElement.style.scrollSnapType = '';
997
- this._elementRef.nativeElement.style.scrollBehavior = '';
998
- this._elementRef.nativeElement.style.cursor = 'grab';
999
- this._elementRef.nativeElement.classList.remove(CURSOR_DRAG_SCROLLING_CLASS);
1000
- this._elementRef.nativeElement.classList.remove(CURSOR_DRAG_SCROLLING_PREPARED_CLASS);
1211
+ _deactivate() {
1212
+ this._onDeactivate$.next(true);
1213
+ this._isDeactivated = true;
1001
1214
  }
1002
- _updateCanScrollState() {
1003
- this._canScroll = elementCanScroll(this._elementRef.nativeElement);
1004
- if (this._canScroll) {
1005
- this._elementRef.nativeElement.style.cursor = 'grab';
1006
- }
1007
- else {
1008
- this._elementRef.nativeElement.style.cursor = 'default';
1215
+ _update(key, value) {
1216
+ switch (key) {
1217
+ case 'title':
1218
+ if (value && typeof value === 'string') {
1219
+ this._titleService.setTitle(value);
1220
+ }
1221
+ break;
1222
+ case 'canonical':
1223
+ {
1224
+ const link = document.querySelector(`link[rel="${key}"]`);
1225
+ if (link) {
1226
+ link.setAttribute('href', value);
1227
+ }
1228
+ else {
1229
+ const newLink = document.createElement('link');
1230
+ newLink.setAttribute('rel', key);
1231
+ newLink.setAttribute('href', value);
1232
+ document.head.appendChild(newLink);
1233
+ }
1234
+ }
1235
+ break;
1236
+ case 'alternate':
1237
+ {
1238
+ const link = document.querySelector(`link[rel="${key}"][hreflang="${value.hreflang}"]`);
1239
+ if (link) {
1240
+ link.setAttribute('href', value.href);
1241
+ }
1242
+ else {
1243
+ const newLink = document.createElement('link');
1244
+ newLink.setAttribute('rel', key);
1245
+ newLink.setAttribute('hreflang', value.hreflang);
1246
+ newLink.setAttribute('href', value.href);
1247
+ document.head.appendChild(newLink);
1248
+ }
1249
+ }
1250
+ break;
1251
+ default:
1252
+ if (value !== undefined && value !== null) {
1253
+ const val = Array.isArray(value) ? value.join(', ') : value;
1254
+ this._metaService.updateTag({ name: key, content: val });
1255
+ }
1256
+ else {
1257
+ this._metaService.removeTag(`name="${key}"`);
1258
+ }
1259
+ break;
1009
1260
  }
1010
1261
  }
1011
- _checkCanScroll() {
1012
- if (this._elementRef.nativeElement.scrollWidth > this._elementRef.nativeElement.clientWidth) {
1013
- return true;
1014
- }
1015
- if (this._elementRef.nativeElement.scrollHeight > this._elementRef.nativeElement.clientHeight) {
1016
- return true;
1262
+ _cleanUp() {
1263
+ var _a, _b, _c, _d, _e;
1264
+ for (const key in this._config) {
1265
+ if (key === 'alternate') {
1266
+ const links = document.querySelectorAll(`link[rel="${key}"]`);
1267
+ links.forEach((link) => {
1268
+ link.remove();
1269
+ });
1270
+ continue;
1271
+ }
1272
+ if (key === 'canonical') {
1273
+ const link = document.querySelector(`link[rel="${key}"]`);
1274
+ if (link) {
1275
+ link.remove();
1276
+ }
1277
+ continue;
1278
+ }
1279
+ if (typeof this._config[key] === 'object' &&
1280
+ this._config[key] !== null &&
1281
+ !(this._config[key] instanceof Observable)) {
1282
+ for (const subKey in this._config[key]) {
1283
+ const parentValue = (_c = (_b = (_a = this.parent) === null || _a === void 0 ? void 0 : _a.config) === null || _b === void 0 ? void 0 : _b[key]) === null || _c === void 0 ? void 0 : _c[subKey];
1284
+ if (parentValue === undefined) {
1285
+ this._update(`${key}:${subKey}`, undefined);
1286
+ }
1287
+ }
1288
+ }
1289
+ else {
1290
+ const parentValue = (_e = (_d = this.parent) === null || _d === void 0 ? void 0 : _d.config) === null || _e === void 0 ? void 0 : _e[key];
1291
+ if (parentValue === undefined) {
1292
+ this._update(key, null);
1293
+ }
1294
+ }
1017
1295
  }
1018
- return false;
1019
1296
  }
1020
1297
  }
1021
- CursorDragScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: CursorDragScrollDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1022
- CursorDragScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.9", type: CursorDragScrollDirective, isStandalone: true, selector: "[etCursorDragScroll]", exportAs: ["etCursorDragScroll"], ngImport: i0 });
1023
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: CursorDragScrollDirective, decorators: [{
1298
+ SeoDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: SeoDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1299
+ SeoDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.0", type: SeoDirective, isStandalone: true, providers: [{ provide: SEO_DIRECTIVE_TOKEN, useExisting: SeoDirective }], ngImport: i0 });
1300
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: SeoDirective, decorators: [{
1024
1301
  type: Directive,
1025
1302
  args: [{
1026
- selector: '[etCursorDragScroll]',
1027
- exportAs: 'etCursorDragScroll',
1028
1303
  standalone: true,
1304
+ providers: [{ provide: SEO_DIRECTIVE_TOKEN, useExisting: SeoDirective }],
1029
1305
  }]
1030
1306
  }] });
1031
1307
 
@@ -1039,9 +1315,9 @@ class ToArrayPipe {
1039
1315
  this.transform = toArray;
1040
1316
  }
1041
1317
  }
1042
- ToArrayPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ToArrayPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
1043
- ToArrayPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.2.9", ngImport: i0, type: ToArrayPipe, isStandalone: true, name: "toArray" });
1044
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ToArrayPipe, decorators: [{
1318
+ ToArrayPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ToArrayPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
1319
+ ToArrayPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.0.0", ngImport: i0, type: ToArrayPipe, isStandalone: true, name: "toArray" });
1320
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ToArrayPipe, decorators: [{
1045
1321
  type: Pipe,
1046
1322
  args: [{ name: 'toArray', standalone: true }]
1047
1323
  }] });
@@ -1050,5 +1326,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImpor
1050
1326
  * Generated bundle index. Do not edit.
1051
1327
  */
1052
1328
 
1053
- export { ClickObserverFactory, ClickObserverService, ClickOutsideDirective, ContentObserverService, CursorDragScrollDirective, DEFAULT_VIEWPORT_CONFIG, DestroyService, FocusVisibleService, LetContext, LetDirective, Memo, MutationObserverFactory, OBSERVE_SCROLL_STATE, ObserveContentDirective, ObserveResizeDirective, ObserveScrollStateDirective, RepeatDirective, ResizeObserverFactory, ResizeObserverService, SCROLL_OBSERVER_IGNORE_TARGET_CLASS, ScrollObserverIgnoreTargetDirective, ToArrayPipe, VIEWPORT_CONFIG, ViewportService, clamp, elementCanScroll, provideViewportConfig, toArray, toArrayTrackByFn };
1329
+ export { ClickObserverFactory, ClickObserverService, ClickOutsideDirective, ContentObserverService, CursorDragScrollDirective, DEFAULT_VIEWPORT_CONFIG, DestroyDirective, DestroyService, FocusVisibleService, LetContext, LetDirective, Memo, MutationObserverFactory, OBSERVE_SCROLL_STATE, ObserveContentDirective, ObserveResizeDirective, ObserveScrollStateDirective, RepeatDirective, ResizeObserverFactory, ResizeObserverService, SCROLL_OBSERVER_FIRST_ELEMENT_CLASS, SCROLL_OBSERVER_IGNORE_TARGET_CLASS, SCROLL_OBSERVER_LAST_ELEMENT_CLASS, SEO_DIRECTIVE_TOKEN, ScrollObserverFirstElementDirective, ScrollObserverIgnoreTargetDirective, ScrollObserverLastElementDirective, SeoDirective, ToArrayPipe, VIEWPORT_CONFIG, ViewportService, clamp, elementCanScroll, mergeSeoConfig, provideViewportConfig, toArray, toArrayTrackByFn };
1054
1330
  //# sourceMappingURL=ethlete-core.mjs.map