@ethlete/cdk 5.0.0-next.4 → 5.0.0-next.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,15 +1,15 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, TemplateRef, ViewContainerRef, Directive, input, booleanAttribute, computed, isDevMode, model, contentChild, effect, untracked, ChangeDetectionStrategy, ViewEncapsulation, Component, contentChildren, ElementRef, Injector, Input, numberAttribute, DOCUMENT, Injectable, ChangeDetectorRef, signal, forwardRef, ViewChild, ContentChildren, assertInInjectionContext, createComponent, EnvironmentInjector, createEnvironmentInjector, runInInjectionContext, linkedSignal, viewChild, DestroyRef, isSignal, viewChildren, provideEnvironmentInitializer, ApplicationRef, output, ContentChild, ViewChildren, EventEmitter, Output, Optional, SkipSelf, IterableDiffers, ComponentFactoryResolver, NgZone, HostAttributeToken } from '@angular/core';
2
+ import { InjectionToken, inject, TemplateRef, ViewContainerRef, Directive, input, booleanAttribute, computed, isDevMode, model, contentChild, effect, untracked, ChangeDetectionStrategy, ViewEncapsulation, Component, contentChildren, ElementRef, Injector, Input, numberAttribute, DOCUMENT, Injectable, ChangeDetectorRef, signal, forwardRef, ViewChild, ContentChildren, assertInInjectionContext, createComponent, EnvironmentInjector, createEnvironmentInjector, runInInjectionContext, linkedSignal, DestroyRef, isSignal, viewChild, viewChildren, provideEnvironmentInitializer, ApplicationRef, output, ContentChild, ViewChildren, EventEmitter, Output, Optional, SkipSelf, PLATFORM_ID, inputBinding, afterRenderEffect, IterableDiffers, ComponentFactoryResolver, NgZone, HostAttributeToken } from '@angular/core';
3
3
  import * as i1 from '@angular/cdk/portal';
4
4
  import { CdkPortal, PortalModule, ComponentPortal, CdkPortalOutlet, TemplatePortal } from '@angular/cdk/portal';
5
5
  import { DomSanitizer, Title } from '@angular/platform-browser';
6
6
  import { trigger, state, style, transition, animate } from '@angular/animations';
7
- import { toObservable, takeUntilDestroyed, toSignal, outputFromObservable, outputToObservable } from '@angular/core/rxjs-interop';
8
- import { map, switchMap, combineLatest, pairwise, tap, BehaviorSubject, filter, Subject, Observable, of, takeUntil, startWith, debounceTime, withLatestFrom, take, merge, skipUntil, fromEvent, timer, distinctUntilChanged, from, finalize, skip, takeWhile, shareReplay, skipWhile, catchError, throwError, Subscription } from 'rxjs';
7
+ import { toObservable, takeUntilDestroyed, toSignal, outputFromObservable, outputToObservable, rxResource } from '@angular/core/rxjs-interop';
8
+ import { map, switchMap, combineLatest, pairwise, tap, BehaviorSubject, filter, Subject, Observable, of, takeUntil, startWith, debounceTime, withLatestFrom, take, merge, skipUntil, fromEvent, timer, distinctUntilChanged, EMPTY, from, finalize, skip, takeWhile, shareReplay, skipWhile, catchError, throwError, Subscription } from 'rxjs';
9
9
  import { __decorate, __metadata } from 'tslib';
10
- import { AsyncPipe, NgComponentOutlet, Location, NgTemplateOutlet, NgClass, DOCUMENT as DOCUMENT$1, NgStyle } from '@angular/common';
10
+ import { AsyncPipe, NgComponentOutlet, Location, NgTemplateOutlet, NgClass, DOCUMENT as DOCUMENT$1, isPlatformBrowser, NgStyle } from '@angular/common';
11
11
  import * as i1$1 from '@ethlete/core';
12
- import { createComponentId, injectRenderer, IS_EMAIL, MUST_MATCH, IS_ARRAY_NOT_EMPTY, AT_LEAST_ONE_REQUIRED, createDestroy, equal, signalHostClasses, signalAttributes, signalHostAttributes, switchQueryListChanges, controlValueSignal, fromNextFrame, elementCanScroll, AnimatedLifecycleDirective, forceReflow, nextFrame, createRootProvider, injectBreakpointObserver, THEME_PROVIDER, ProvideThemeDirective, BOUNDARY_ELEMENT_TOKEN, signalElementScrollState, signalElementIntersection, isElementVisible, provideBoundaryElement, applyHostListener, injectBoundaryElement, ANIMATED_LIFECYCLE_TOKEN, cloneFormGroup, getFormGroupValue, injectQueryParam, injectRoute, AnimatedIfDirective, injectObserveBreakpoint, syncSignal, createDocumentElementSignal, createStaticRootProvider, AnimatedOverlayDirective, setInputSignal, signalElementMutations, signalElementDimensions, createIsRenderedSignal, createCanAnimateSignal, useCursorDragScroll, signalElementChildren, signalClasses, signalHostStyles, signalStyles, getElementScrollCoordinates, injectTemplateRef, signalHostElementScrollState, signalHostElementDimensions, createProvider, previousSignalValue, injectHostElement, signalHostElementIntersection, createFlipAnimation, isObject, getObjectProperty, RuntimeError, KeyPressManager, scrollToElement, ClickOutsideDirective, clamp, injectFocusVisibleTracker, inferMimeType, applyHostListeners, TypedQueryList } from '@ethlete/core';
12
+ import { createComponentId, injectRenderer, IS_EMAIL, MUST_MATCH, IS_ARRAY_NOT_EMPTY, AT_LEAST_ONE_REQUIRED, createDestroy, equal, signalHostClasses, signalAttributes, signalHostAttributes, switchQueryListChanges, controlValueSignal, fromNextFrame, elementCanScroll, AnimatedLifecycleDirective, forceReflow, nextFrame, createRootProvider, injectBreakpointObserver, THEME_PROVIDER, ProvideThemeDirective, BOUNDARY_ELEMENT_TOKEN, ScrollObserverDirective, signalElementScrollState, ScrollObserverStartDirective, ScrollObserverEndDirective, provideBoundaryElement, applyHostListener, injectBoundaryElement, ANIMATED_LIFECYCLE_TOKEN, cloneFormGroup, getFormGroupValue, injectQueryParam, injectRoute, AnimatedIfDirective, injectObserveBreakpoint, syncSignal, createDocumentElementSignal, createStaticRootProvider, AnimatedOverlayDirective, setInputSignal, typedBreakpointTransform, boolBreakpointTransform, numberBreakpointTransform, signalElementDimensions, createCanAnimateSignal, useCursorDragScroll, signalElementChildren, signalElementIntersection, signalClasses, signalHostStyles, signalStyles, getScrollSnapTarget, getScrollContainerTarget, getScrollItemTarget, getElementScrollCoordinates, provideBreakpointInstance, injectTemplateRef, signalHostElementScrollState, signalHostElementDimensions, createProvider, previousSignalValue, signalHostElementIntersection, injectHostElement, createFlipAnimation, isObject, getObjectProperty, RuntimeError, KeyPressManager, scrollToElement, ClickOutsideDirective, clamp, injectFocusVisibleTracker, inferMimeType, applyHostListeners, TypedQueryList } from '@ethlete/core';
13
13
  import * as i1$5 from '@angular/cdk/a11y';
14
14
  import { FocusMonitor, FocusKeyManager, AriaDescriber, A11yModule } from '@angular/cdk/a11y';
15
15
  import { AutofillMonitor } from '@angular/cdk/text-field';
@@ -19,7 +19,7 @@ import { coerceCssPixelValue, coerceElement, _isNumberValue } from '@angular/cdk
19
19
  import { Dialog, DialogConfig, CdkDialogContainer } from '@angular/cdk/dialog';
20
20
  import { NoopScrollStrategy, OverlayRef as OverlayRef$1, Overlay } from '@angular/cdk/overlay';
21
21
  import * as i1$2 from '@angular/router';
22
- import { RouterLink, Router, isActive, RouterLinkActive, NavigationEnd } from '@angular/router';
22
+ import { Router, RouterLink, isActive, RouterLinkActive, NavigationEnd } from '@angular/router';
23
23
  import { isQueryStateLoading, isQueryStateFailure, queryComputed, switchQueryState, isQueryStateSuccess, extractQuery, QueryDirective, injectInfinityQueryResponseDelay, v2ShouldRetryRequest, parseHttpErrorCodeToTitleEn, parseHttpErrorCodeToTitleDe, parseHttpErrorCodeToMessageEn, parseHttpErrorCodeToMessageDe, isClassValidatorError, isSymfonyFormViolationListError, isSymfonyListError } from '@ethlete/query';
24
24
  import { format, parse } from 'date-fns';
25
25
  import { Platform } from '@angular/cdk/platform';
@@ -4154,7 +4154,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
4154
4154
  }] } });
4155
4155
 
4156
4156
  const INPUT_TOKEN = new InjectionToken('ET_INPUT_DIRECTIVE_TOKEN');
4157
- let nextUniqueId$6 = 0;
4157
+ let nextUniqueId$5 = 0;
4158
4158
  class InputDirective {
4159
4159
  get control() {
4160
4160
  if (!this._ngControl) {
@@ -4282,7 +4282,7 @@ class InputDirective {
4282
4282
  this._focusMonitor = inject(FocusMonitor);
4283
4283
  this._elementRef = inject(ElementRef);
4284
4284
  this._neverEmptyInputs = ['date', 'datetime', 'datetime-local', 'month', 'time', 'week'];
4285
- this._id = `et-input-${++nextUniqueId$6}`;
4285
+ this._id = `et-input-${++nextUniqueId$5}`;
4286
4286
  this.autocomplete = input(null, ...(ngDevMode ? [{ debugName: "autocomplete" }] : []));
4287
4287
  this.placeholder = input(null, ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
4288
4288
  this.min = input(null, ...(ngDevMode ? [{ debugName: "min" }] : []));
@@ -4699,11 +4699,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
4699
4699
  }] });
4700
4700
 
4701
4701
  const LABEL_TOKEN = new InjectionToken('ET_LABEL_COMPONENT_TOKEN');
4702
- let nextUniqueId$5 = 0;
4702
+ let nextUniqueId$4 = 0;
4703
4703
  class LabelComponent {
4704
4704
  constructor() {
4705
4705
  this.formFieldStateService = inject(FormFieldStateService);
4706
- this.id = `et-label-${++nextUniqueId$5}`;
4706
+ this.id = `et-label-${++nextUniqueId$4}`;
4707
4707
  }
4708
4708
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: LabelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4709
4709
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: LabelComponent, isStandalone: true, selector: "et-label", host: { classAttribute: "et-label" }, providers: [{ provide: LABEL_TOKEN, useExisting: LabelComponent }], exportAs: ["etLabel"], ngImport: i0, template: `
@@ -5265,7 +5265,131 @@ const mergeOverlayBreakpointConfigs = (...configs) => {
5265
5265
  return combinedConfig;
5266
5266
  };
5267
5267
 
5268
- const isTouchEvent$3 = (event) => {
5268
+ const FLOATING_UI_PLACEMENTS = [
5269
+ 'top',
5270
+ 'left',
5271
+ 'bottom',
5272
+ 'right',
5273
+ 'top-start',
5274
+ 'top-end',
5275
+ 'right-start',
5276
+ 'right-end',
5277
+ 'bottom-start',
5278
+ 'bottom-end',
5279
+ 'left-start',
5280
+ 'left-end',
5281
+ ];
5282
+
5283
+ /**
5284
+ * A utility function to enhance the ux of views containing forms.
5285
+ * It helps to prevent the user from accidentally losing unsaved form changes.
5286
+ */
5287
+ const createNavigationDismissChecker = (config) => {
5288
+ assertInInjectionContext(createNavigationDismissChecker);
5289
+ const { form, compareFn, dismissCheckFn } = config;
5290
+ const currentFormValue = controlValueSignal(form);
5291
+ const hasChanges = computed(() => {
5292
+ const formValue = currentFormValue();
5293
+ if (!formValue)
5294
+ return false;
5295
+ return !(compareFn ? compareFn(formValue, defaultFormValue()) : equal(formValue, defaultFormValue()));
5296
+ }, ...(ngDevMode ? [{ debugName: "hasChanges" }] : []));
5297
+ const defaultFormValue = signal(config.defaultValue ?? form.getRawValue(), ...(ngDevMode ? [{ debugName: "defaultFormValue" }] : []));
5298
+ const runCheck = () => {
5299
+ const isDefaultFormValue = !hasChanges();
5300
+ if (isDefaultFormValue)
5301
+ return of(true);
5302
+ return dismissCheckFn(form.getRawValue());
5303
+ };
5304
+ const refreshDefaultFormValue = () => {
5305
+ defaultFormValue.set(form.getRawValue());
5306
+ };
5307
+ const restoreDefaultFormValue = () => {
5308
+ form.setValue(defaultFormValue());
5309
+ refreshDefaultFormValue();
5310
+ };
5311
+ return {
5312
+ runCheck,
5313
+ refreshDefaultFormValue,
5314
+ restoreDefaultFormValue,
5315
+ hasChanges,
5316
+ defaultFormValue: defaultFormValue.asReadonly(),
5317
+ };
5318
+ };
5319
+
5320
+ const injectRouterNavigationState = () => {
5321
+ const router = inject(Router);
5322
+ const navState = router.getCurrentNavigation()?.extras.state;
5323
+ return (navState || null);
5324
+ };
5325
+
5326
+ const getClientXY = (event) => {
5327
+ if (event.type[0] === 't') {
5328
+ const touch = event.targetTouches[0] ?? event.changedTouches[0];
5329
+ return touch ? { clientX: touch.clientX, clientY: touch.clientY } : { clientX: 0, clientY: 0 };
5330
+ }
5331
+ return { clientX: event.clientX, clientY: event.clientY };
5332
+ };
5333
+ const createSwipeTracker = (startEvent) => {
5334
+ const { clientX: originClientX, clientY: originClientY } = getClientXY(startEvent);
5335
+ const startTime = Date.now();
5336
+ let movementX = 0;
5337
+ let movementY = 0;
5338
+ let isSwiping = false;
5339
+ let isScrolling = false;
5340
+ const update = (event) => {
5341
+ const { clientX, clientY } = getClientXY(event);
5342
+ movementX = clientX - originClientX;
5343
+ movementY = clientY - originClientY;
5344
+ const positiveMovementX = Math.abs(movementX);
5345
+ const positiveMovementY = Math.abs(movementY);
5346
+ if (!isSwiping && !isScrolling) {
5347
+ if (positiveMovementY > positiveMovementX) {
5348
+ isScrolling = true;
5349
+ }
5350
+ else {
5351
+ isSwiping = true;
5352
+ }
5353
+ }
5354
+ return {
5355
+ originClientX,
5356
+ originClientY,
5357
+ timestamp: startTime,
5358
+ movementX,
5359
+ movementY,
5360
+ positiveMovementX,
5361
+ positiveMovementY,
5362
+ isScrolling,
5363
+ isSwiping,
5364
+ };
5365
+ };
5366
+ const end = () => {
5367
+ const swipeTime = Math.max(1, Date.now() - startTime);
5368
+ const positiveMovementX = Math.abs(movementX);
5369
+ const positiveMovementY = Math.abs(movementY);
5370
+ const pixelPerSecondX = (movementX / swipeTime) * 1000;
5371
+ const pixelPerSecondY = (movementY / swipeTime) * 1000;
5372
+ return {
5373
+ movementX,
5374
+ movementY,
5375
+ positiveMovementX,
5376
+ positiveMovementY,
5377
+ pixelPerSecondX,
5378
+ pixelPerSecondY,
5379
+ positivePixelPerSecondX: Math.abs(pixelPerSecondX),
5380
+ positivePixelPerSecondY: Math.abs(pixelPerSecondY),
5381
+ originClientX,
5382
+ originClientY,
5383
+ };
5384
+ };
5385
+ const cancel = () => {
5386
+ movementX = 0;
5387
+ movementY = 0;
5388
+ };
5389
+ return { update, end, cancel };
5390
+ };
5391
+
5392
+ const isTouchEvent$2 = (event) => {
5269
5393
  return event.type[0] === 't';
5270
5394
  };
5271
5395
  const defaultSwipeMoveStyleInterpolator = (event, config) => {
@@ -5384,15 +5508,29 @@ const shouldCancelDragForScrollableElement = (scrollableElement, direction) => {
5384
5508
  * Returns a cleanup function to disable the feature.
5385
5509
  */
5386
5510
  const enableDragToDismiss = (context) => {
5387
- const { element: el, overlayRef, swipeHandlerService, config } = context;
5511
+ const { element: el, overlayRef, config } = context;
5388
5512
  const stop$ = new Subject();
5389
- let swipeId = null;
5513
+ let tracker = null;
5390
5514
  let isSelectionActive = false;
5515
+ let savedUserSelect = null;
5516
+ const unlockSelection = () => {
5517
+ if (savedUserSelect === null)
5518
+ return;
5519
+ document.body.style.userSelect = savedUserSelect;
5520
+ savedUserSelect = null;
5521
+ };
5522
+ const lockSelection = () => {
5523
+ if (savedUserSelect !== null)
5524
+ return;
5525
+ savedUserSelect = document.body.style.userSelect ?? '';
5526
+ document.body.style.userSelect = 'none';
5527
+ };
5391
5528
  const cancelDrag = () => {
5529
+ unlockSelection();
5392
5530
  el.style.setProperty('transition', 'transform 100ms var(--ease-out-1)');
5393
5531
  el.style.transform =
5394
5532
  config.direction === 'to-bottom' || config.direction === 'to-top' ? 'translateY(0)' : 'translateX(0)';
5395
- swipeId = null;
5533
+ tracker = null;
5396
5534
  setTimeout(() => {
5397
5535
  el.style.removeProperty('transition');
5398
5536
  el.style.removeProperty('transform');
@@ -5406,7 +5544,7 @@ const enableDragToDismiss = (context) => {
5406
5544
  const tag = target.tagName.toLowerCase();
5407
5545
  if (tag === 'input' || tag === 'textarea' || tag === 'select' || tag === 'button' || tag === 'a')
5408
5546
  return;
5409
- swipeId = swipeHandlerService.startSwipe(event);
5547
+ tracker = createSwipeTracker(event);
5410
5548
  }))
5411
5549
  .subscribe();
5412
5550
  fromEvent(document, 'selectionchange')
@@ -5420,21 +5558,35 @@ const enableDragToDismiss = (context) => {
5420
5558
  isSelectionActive = true;
5421
5559
  cancelDrag();
5422
5560
  });
5423
- merge(fromEvent(el, 'touchmove'), fromEvent(el, 'mousemove'))
5561
+ merge(fromEvent(el, 'touchmove', { passive: false }), fromEvent(el, 'mousemove'))
5424
5562
  .pipe(takeUntil(stop$), takeUntil(overlayRef.afterClosed()), tap((event) => {
5425
- if (swipeId === null || isSelectionActive)
5563
+ if (tracker === null || isSelectionActive)
5426
5564
  return;
5427
- if (isTouchEvent$3(event)) {
5565
+ if (isTouchEvent$2(event)) {
5428
5566
  const target = event.target;
5429
5567
  const scrollableElement = recursiveFindScrollableParent(target, config.direction);
5430
5568
  if (scrollableElement && shouldCancelDragForScrollableElement(scrollableElement, config.direction)) {
5431
5569
  cancelDrag();
5432
5570
  return;
5433
5571
  }
5572
+ event.preventDefault();
5573
+ }
5574
+ const swipeData = tracker.update(event);
5575
+ if (!isTouchEvent$2(event)) {
5576
+ if (savedUserSelect === null) {
5577
+ const { movementX, movementY } = swipeData;
5578
+ const committed = config.direction === 'to-bottom'
5579
+ ? movementY >= 8
5580
+ : config.direction === 'to-top'
5581
+ ? movementY <= -8
5582
+ : config.direction === 'to-left'
5583
+ ? movementX <= -8
5584
+ : movementX >= 8;
5585
+ if (!committed)
5586
+ return;
5587
+ lockSelection();
5588
+ }
5434
5589
  }
5435
- const swipeData = swipeHandlerService.updateSwipe(swipeId, event);
5436
- if (!swipeData)
5437
- return;
5438
5590
  const css = defaultSwipeMoveStyleInterpolator(swipeData, config);
5439
5591
  Object.entries(css).forEach(([key, value]) => {
5440
5592
  el.style.setProperty(key, value);
@@ -5442,13 +5594,17 @@ const enableDragToDismiss = (context) => {
5442
5594
  }))
5443
5595
  .subscribe();
5444
5596
  merge(fromEvent(el, 'touchend'), fromEvent(el, 'mouseup'))
5445
- .pipe(takeUntil(stop$), takeUntil(overlayRef.afterClosed()), tap(() => {
5446
- if (swipeId === null || isSelectionActive)
5597
+ .pipe(takeUntil(stop$), takeUntil(overlayRef.afterClosed()), tap((event) => {
5598
+ const wasMouseDrag = !isTouchEvent$2(event) && savedUserSelect !== null;
5599
+ unlockSelection();
5600
+ if (tracker === null || isSelectionActive)
5447
5601
  return;
5448
- const swipeData = swipeHandlerService.endSwipe(swipeId);
5449
- swipeId = null;
5450
- if (!swipeData)
5602
+ if (!isTouchEvent$2(event) && !wasMouseDrag) {
5603
+ tracker = null;
5451
5604
  return;
5605
+ }
5606
+ const swipeData = tracker.end();
5607
+ tracker = null;
5452
5608
  const css = defaultSwipeEndStyleInterpolator(swipeData, config);
5453
5609
  if (!css) {
5454
5610
  overlayRef._closeOverlayVia('touch');
@@ -5469,6 +5625,7 @@ const enableDragToDismiss = (context) => {
5469
5625
  .subscribe();
5470
5626
  return {
5471
5627
  unsubscribe: () => {
5628
+ unlockSelection();
5472
5629
  stop$.next();
5473
5630
  stop$.complete();
5474
5631
  },
@@ -5476,7 +5633,7 @@ const enableDragToDismiss = (context) => {
5476
5633
  };
5477
5634
 
5478
5635
  const isHtmlElement = (element) => element instanceof HTMLElement;
5479
- const isTouchEvent$2 = (event) => event.type[0] === 't';
5636
+ const isTouchEvent$1 = (event) => event.type[0] === 't';
5480
5637
  const isPointerEvent = (event) => event.type[0] === 'c';
5481
5638
  const findNextRelevantHtmlElement = (element, depth = 0) => {
5482
5639
  if (!element || depth === 10)
@@ -5499,7 +5656,7 @@ const getOriginCoordinatesAndDimensions = (origin) => {
5499
5656
  element: origin,
5500
5657
  };
5501
5658
  }
5502
- if (isTouchEvent$2(origin) || isPointerEvent(origin)) {
5659
+ if (isTouchEvent$1(origin) || isPointerEvent(origin)) {
5503
5660
  const target = origin.target;
5504
5661
  const relevantElement = findNextRelevantHtmlElement(target) ?? target;
5505
5662
  const rect = relevantElement.getBoundingClientRect();
@@ -6357,42 +6514,21 @@ class OverlayBodyComponent {
6357
6514
  this.overlayRef = inject(OverlayRef, { optional: true });
6358
6515
  this.elementRef = inject(ElementRef);
6359
6516
  this.overlayManager = injectOverlayManager();
6517
+ this.scrollObserver = inject(ScrollObserverDirective);
6360
6518
  this.dividers = input(false, ...(ngDevMode ? [{ debugName: "dividers" }] : []));
6361
- this.firstElement = viewChild('firstElement', ...(ngDevMode ? [{ debugName: "firstElement" }] : []));
6362
- this.lastElement = viewChild('lastElement', ...(ngDevMode ? [{ debugName: "lastElement" }] : []));
6363
6519
  this.dividersEnabled = computed(() => this.dividers() === 'dynamic' || this.dividers() === 'static', ...(ngDevMode ? [{ debugName: "dividersEnabled" }] : []));
6364
6520
  this.dynamicDividersEnabled = computed(() => this.dividers() === 'dynamic', ...(ngDevMode ? [{ debugName: "dynamicDividersEnabled" }] : []));
6365
6521
  this.containerScrollState = signalElementScrollState(this.elementRef);
6366
- this.firstElementIntersection = signalElementIntersection(this.firstElement, {
6367
- root: this.elementRef,
6368
- enabled: this.dynamicDividersEnabled,
6369
- });
6370
- this.firstElementVisibility = signal(null, ...(ngDevMode ? [{ debugName: "firstElementVisibility" }] : []));
6371
- this.lastElementIntersection = signalElementIntersection(this.lastElement, {
6372
- root: this.elementRef,
6373
- enabled: this.dynamicDividersEnabled,
6374
- });
6375
- this.lastElementVisibility = signal(null, ...(ngDevMode ? [{ debugName: "lastElementVisibility" }] : []));
6376
6522
  this.canScroll = computed(() => this.containerScrollState().canScroll, ...(ngDevMode ? [{ debugName: "canScroll" }] : []));
6377
6523
  this.isAtStart = computed(() => {
6378
- if (!this.canScroll()) {
6524
+ if (!this.canScroll())
6379
6525
  return true;
6380
- }
6381
- const intersection = this.firstElementIntersection()[0];
6382
- if (!intersection) {
6383
- return this.firstElementVisibility()?.inline ?? true;
6384
- }
6385
- return intersection.isIntersecting;
6526
+ return this.scrollObserver.isAtStart();
6386
6527
  }, ...(ngDevMode ? [{ debugName: "isAtStart" }] : []));
6387
6528
  this.isAtEnd = computed(() => {
6388
- if (!this.canScroll()) {
6529
+ if (!this.canScroll())
6389
6530
  return true;
6390
- }
6391
- const intersection = this.lastElementIntersection()[0];
6392
- if (!intersection) {
6393
- return this.lastElementVisibility()?.inline ?? true;
6394
- }
6395
- return intersection.isIntersecting;
6531
+ return this.scrollObserver.isAtEnd();
6396
6532
  }, ...(ngDevMode ? [{ debugName: "isAtEnd" }] : []));
6397
6533
  this.enableDividerAnimations = signal(false, ...(ngDevMode ? [{ debugName: "enableDividerAnimations" }] : []));
6398
6534
  this.hostClassBindings = signalHostClasses({
@@ -6403,24 +6539,8 @@ class OverlayBodyComponent {
6403
6539
  'et-scrollable-body--is-at-start': computed(() => (this.dynamicDividersEnabled() ? this.isAtStart() : false)),
6404
6540
  'et-scrollable-body--is-at-end': computed(() => (this.dynamicDividersEnabled() ? this.isAtEnd() : false)),
6405
6541
  });
6406
- effect(() => {
6407
- const scrollable = this.elementRef.nativeElement;
6408
- const firstElement = this.firstElement()?.nativeElement;
6409
- const lastElement = this.lastElement()?.nativeElement;
6410
- if (!scrollable || !firstElement || !lastElement) {
6411
- return;
6412
- }
6413
- this.firstElementVisibility.set(isElementVisible({
6414
- container: scrollable,
6415
- element: firstElement,
6416
- }));
6417
- this.lastElementVisibility.set(isElementVisible({
6418
- container: scrollable,
6419
- element: lastElement,
6420
- }));
6421
- // We need to wait one frame before enabling animations to prevent a animation from playing during initial render.
6422
- nextFrame(() => this.enableDividerAnimations.set(true));
6423
- });
6542
+ effect(() => this.scrollObserver.enabled.set(this.dynamicDividersEnabled()));
6543
+ nextFrame(() => this.enableDividerAnimations.set(true));
6424
6544
  }
6425
6545
  ngOnInit() {
6426
6546
  if (!this.overlayRef) {
@@ -6435,19 +6555,19 @@ class OverlayBodyComponent {
6435
6555
  this.elementRef.nativeElement.scrollTo({ top: 0, behavior });
6436
6556
  }
6437
6557
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: OverlayBodyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6438
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.1", type: OverlayBodyComponent, isStandalone: true, selector: "[et-overlay-body], et-overlay-body", inputs: { dividers: { classPropertyName: "dividers", publicName: "dividers", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "et-overlay-body" }, providers: [
6558
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.1", type: OverlayBodyComponent, isStandalone: true, selector: "[et-overlay-body], et-overlay-body", inputs: { dividers: { classPropertyName: "dividers", publicName: "dividers", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "et-overlay-body" }, providers: [
6439
6559
  {
6440
6560
  provide: OVERLAY_BODY_TOKEN,
6441
6561
  useExisting: OverlayBodyComponent,
6442
6562
  },
6443
6563
  provideBoundaryElement(),
6444
- ], viewQueries: [{ propertyName: "firstElement", first: true, predicate: ["firstElement"], descendants: true, isSignal: true }, { propertyName: "lastElement", first: true, predicate: ["lastElement"], descendants: true, isSignal: true }], ngImport: i0, template: `
6564
+ ], hostDirectives: [{ directive: i1$1.ScrollObserverDirective }], ngImport: i0, template: `
6445
6565
  <div class="et-overlay-body-container">
6446
- <div #firstElement class="et-overlay-body-start-element"></div>
6566
+ <div class="et-overlay-body-start-element" etScrollObserverStart></div>
6447
6567
  <ng-content />
6448
- <div #lastElement class="et-overlay-body-end-element"></div>
6568
+ <div class="et-overlay-body-end-element" etScrollObserverEnd></div>
6449
6569
  </div>
6450
- `, isInline: true }); }
6570
+ `, isInline: true, dependencies: [{ kind: "directive", type: ScrollObserverStartDirective, selector: "[etScrollObserverStart]" }, { kind: "directive", type: ScrollObserverEndDirective, selector: "[etScrollObserverEnd]" }] }); }
6451
6571
  }
6452
6572
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: OverlayBodyComponent, decorators: [{
6453
6573
  type: Component,
@@ -6455,11 +6575,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
6455
6575
  selector: '[et-overlay-body], et-overlay-body',
6456
6576
  template: `
6457
6577
  <div class="et-overlay-body-container">
6458
- <div #firstElement class="et-overlay-body-start-element"></div>
6578
+ <div class="et-overlay-body-start-element" etScrollObserverStart></div>
6459
6579
  <ng-content />
6460
- <div #lastElement class="et-overlay-body-end-element"></div>
6580
+ <div class="et-overlay-body-end-element" etScrollObserverEnd></div>
6461
6581
  </div>
6462
6582
  `,
6583
+ imports: [ScrollObserverStartDirective, ScrollObserverEndDirective],
6584
+ hostDirectives: [ScrollObserverDirective],
6463
6585
  providers: [
6464
6586
  {
6465
6587
  provide: OVERLAY_BODY_TOKEN,
@@ -6471,7 +6593,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
6471
6593
  class: 'et-overlay-body',
6472
6594
  },
6473
6595
  }]
6474
- }], ctorParameters: () => [], propDecorators: { dividers: [{ type: i0.Input, args: [{ isSignal: true, alias: "dividers", required: false }] }], firstElement: [{ type: i0.ViewChild, args: ['firstElement', { isSignal: true }] }], lastElement: [{ type: i0.ViewChild, args: ['lastElement', { isSignal: true }] }] } });
6596
+ }], ctorParameters: () => [], propDecorators: { dividers: [{ type: i0.Input, args: [{ isSignal: true, alias: "dividers", required: false }] }] } });
6475
6597
 
6476
6598
  class OverlayCloseDirective {
6477
6599
  constructor() {
@@ -7925,106 +8047,6 @@ const anchoredDialogOverlayStrategy = (config = {}) => {
7925
8047
  };
7926
8048
  };
7927
8049
 
7928
- let nextUniqueId$4 = 0;
7929
- const isTouchEvent$1 = (event) => {
7930
- return event.type[0] === 't';
7931
- };
7932
- class SwipeHandlerService {
7933
- constructor() {
7934
- this._handlerMap = {};
7935
- }
7936
- startSwipe(event) {
7937
- const handlerId = nextUniqueId$4++;
7938
- const originClientX = isTouchEvent$1(event) ? event.targetTouches[0].clientX : event.clientX;
7939
- const originClientY = isTouchEvent$1(event) ? event.targetTouches[0].clientY : event.clientY;
7940
- const timestamp = Date.now();
7941
- this._handlerMap[handlerId] = {
7942
- originClientX,
7943
- originClientY,
7944
- timestamp,
7945
- movementX: 0,
7946
- movementY: 0,
7947
- positiveMovementX: 0,
7948
- positiveMovementY: 0,
7949
- isScrolling: false,
7950
- isSwiping: false,
7951
- };
7952
- return handlerId;
7953
- }
7954
- updateSwipe(handlerId, event) {
7955
- const handler = this._getSwipeHandler(handlerId);
7956
- if (!handler)
7957
- return null;
7958
- const { originClientX, originClientY, isSwiping, isScrolling } = handler;
7959
- const currentClientX = isTouchEvent$1(event) ? event.targetTouches[0].clientX : event.clientX;
7960
- const currentClientY = isTouchEvent$1(event) ? event.targetTouches[0].clientY : event.clientY;
7961
- const movementX = (originClientX - currentClientX) * -1;
7962
- const movementY = (originClientY - currentClientY) * -1;
7963
- const positiveMovementX = Math.abs(movementX);
7964
- const positiveMovementY = Math.abs(movementY);
7965
- if (!isSwiping && !isScrolling) {
7966
- if (positiveMovementY > positiveMovementX) {
7967
- handler.isScrolling = true;
7968
- }
7969
- else {
7970
- handler.isSwiping = true;
7971
- }
7972
- }
7973
- handler.movementX = movementX;
7974
- handler.movementY = movementY;
7975
- handler.positiveMovementX = positiveMovementX;
7976
- handler.positiveMovementY = positiveMovementY;
7977
- return handler;
7978
- }
7979
- endSwipe(handlerId) {
7980
- const handler = this._getSwipeHandler(handlerId);
7981
- if (!handler)
7982
- return null;
7983
- const { movementX, movementY, timestamp, originClientX, originClientY, positiveMovementX, positiveMovementY } = handler;
7984
- const timestampStart = timestamp;
7985
- const timestampEnd = Date.now();
7986
- const swipeTime = timestampEnd - timestampStart;
7987
- const pixelPerMillisecondX = movementX ? movementX / swipeTime : 0;
7988
- const pixelPerSecondX = pixelPerMillisecondX * 1000;
7989
- const positivePixelPerSecondX = Math.abs(pixelPerSecondX);
7990
- const pixelPerMillisecondY = movementY ? movementY / swipeTime : 0;
7991
- const pixelPerSecondY = pixelPerMillisecondY * 1000;
7992
- const positivePixelPerSecondY = Math.abs(pixelPerSecondY);
7993
- delete this._handlerMap[handlerId];
7994
- const swipeEnd = {
7995
- positivePixelPerSecondX,
7996
- positivePixelPerSecondY,
7997
- pixelPerSecondX,
7998
- pixelPerSecondY,
7999
- movementX,
8000
- movementY,
8001
- originClientX,
8002
- originClientY,
8003
- positiveMovementX,
8004
- positiveMovementY,
8005
- };
8006
- return swipeEnd;
8007
- }
8008
- cancelSwipe(handlerId) {
8009
- delete this._handlerMap[handlerId];
8010
- }
8011
- _getSwipeHandler(handlerId) {
8012
- const handler = this._handlerMap[handlerId];
8013
- if (!handler) {
8014
- return null;
8015
- }
8016
- return handler;
8017
- }
8018
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SwipeHandlerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
8019
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SwipeHandlerService, providedIn: 'root' }); }
8020
- }
8021
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SwipeHandlerService, decorators: [{
8022
- type: Injectable,
8023
- args: [{
8024
- providedIn: 'root',
8025
- }]
8026
- }] });
8027
-
8028
8050
  const [provideBottomSheetStrategyDefaults, injectBottomSheetStrategyDefaults] = createStaticRootProvider({
8029
8051
  width: '100%',
8030
8052
  height: undefined,
@@ -8042,7 +8064,6 @@ const [provideBottomSheetStrategyDefaults, injectBottomSheetStrategyDefaults] =
8042
8064
  });
8043
8065
  const [provideBottomSheetStrategy, injectBottomSheetStrategy] = createRootProvider(() => {
8044
8066
  const defaults = injectBottomSheetStrategyDefaults();
8045
- const swipeHandlerService = inject(SwipeHandlerService);
8046
8067
  const build = (config = {}) => {
8047
8068
  const cfg = mergeOverlayBreakpointConfigs(defaults, config);
8048
8069
  let dragToDismissRef;
@@ -8053,7 +8074,6 @@ const [provideBottomSheetStrategy, injectBottomSheetStrategy] = createRootProvid
8053
8074
  config: cfg.dragToDismiss,
8054
8075
  element: context.containerEl,
8055
8076
  overlayRef: context.overlayRef,
8056
- swipeHandlerService,
8057
8077
  });
8058
8078
  };
8059
8079
  const detachDragToDismiss = () => {
@@ -8221,7 +8241,6 @@ const [provideLeftSheetStrategyDefaults, injectLeftSheetStrategyDefaults] = crea
8221
8241
  });
8222
8242
  const [provideLeftSheetStrategy, injectLeftSheetStrategy] = createRootProvider(() => {
8223
8243
  const defaults = injectLeftSheetStrategyDefaults();
8224
- const swipeHandlerService = inject(SwipeHandlerService);
8225
8244
  const build = (config = {}) => {
8226
8245
  const cfg = mergeOverlayBreakpointConfigs(defaults, config);
8227
8246
  let dragToDismissRef;
@@ -8232,7 +8251,6 @@ const [provideLeftSheetStrategy, injectLeftSheetStrategy] = createRootProvider((
8232
8251
  config: cfg.dragToDismiss,
8233
8252
  element: context.containerEl,
8234
8253
  overlayRef: context.overlayRef,
8235
- swipeHandlerService,
8236
8254
  });
8237
8255
  };
8238
8256
  const detachDragToDismiss = () => {
@@ -8287,7 +8305,6 @@ const [provideRightSheetStrategyDefaults, injectRightSheetStrategyDefaults] = cr
8287
8305
  });
8288
8306
  const [provideRightSheetStrategy, injectRightSheetStrategy] = createRootProvider(() => {
8289
8307
  const defaults = injectRightSheetStrategyDefaults();
8290
- const swipeHandlerService = inject(SwipeHandlerService);
8291
8308
  const build = (config = {}) => {
8292
8309
  const cfg = mergeOverlayBreakpointConfigs(defaults, config);
8293
8310
  let dragToDismissRef;
@@ -8298,7 +8315,6 @@ const [provideRightSheetStrategy, injectRightSheetStrategy] = createRootProvider
8298
8315
  config: cfg.dragToDismiss,
8299
8316
  element: context.containerEl,
8300
8317
  overlayRef: context.overlayRef,
8301
- swipeHandlerService,
8302
8318
  });
8303
8319
  };
8304
8320
  const detachDragToDismiss = () => {
@@ -8399,7 +8415,6 @@ const [provideTopSheetStrategyDefaults, injectTopSheetStrategyDefaults] = create
8399
8415
  });
8400
8416
  const [provideTopSheetStrategy, injectTopSheetStrategy] = createRootProvider(() => {
8401
8417
  const defaults = injectTopSheetStrategyDefaults();
8402
- const swipeHandlerService = inject(SwipeHandlerService);
8403
8418
  const build = (config = {}) => {
8404
8419
  const cfg = mergeOverlayBreakpointConfigs(defaults, config);
8405
8420
  let dragToDismissRef;
@@ -8410,7 +8425,6 @@ const [provideTopSheetStrategy, injectTopSheetStrategy] = createRootProvider(()
8410
8425
  config: cfg.dragToDismiss,
8411
8426
  element: context.containerEl,
8412
8427
  overlayRef: context.overlayRef,
8413
- swipeHandlerService,
8414
8428
  });
8415
8429
  };
8416
8430
  const detachDragToDismiss = () => {
@@ -9026,71 +9040,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
9026
9040
  }]
9027
9041
  }], propDecorators: { repeatContentCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "repeatContentCount", required: false }] }] } });
9028
9042
 
9029
- // TODO: This needs to be redone, it's a mess...
9030
- const getIntersectionInfo = (intersections) => {
9031
- const reverseIntersections = [...intersections].reverse();
9032
- const firstIntersecting = intersections.find((i) => i.intersectionRatio > 0);
9033
- const lastIntersecting = reverseIntersections.find((i) => i.intersectionRatio > 0);
9034
- const firstIntersectingIndex = intersections.findIndex((i) => i === firstIntersecting);
9035
- const lastIntersectingIndex = intersections.findIndex((i) => i === lastIntersecting);
9036
- if (!firstIntersecting || !lastIntersecting)
9037
- return null;
9038
- const greaterIntersecting = firstIntersecting.intersectionRatio > lastIntersecting.intersectionRatio ? firstIntersecting : lastIntersecting;
9039
- const greaterIntersectingIndex = firstIntersecting.intersectionRatio > lastIntersecting.intersectionRatio
9040
- ? firstIntersectingIndex
9041
- : lastIntersectingIndex;
9042
- const hasFullIntersection = intersections.some((i) => i.intersectionRatio === 1);
9043
- const hasMultipleFullIntersections = intersections.filter((i) => i.intersectionRatio === 1).length > 1;
9044
- const firstFullIntersectionIndex = intersections.findIndex((i) => i.intersectionRatio === 1);
9045
- const firstFullIntersection = intersections.find((i) => i.intersectionRatio === 1);
9046
- const lastFullIntersection = reverseIntersections.find((i) => i.intersectionRatio === 1);
9047
- const lastFullIntersectionIndex = intersections.findIndex((i) => i === lastFullIntersection);
9048
- const firstNonIntersectingIndex = intersections.findIndex((i) => i.intersectionRatio === 0);
9049
- const firstNonIntersection = intersections.find((i) => i.intersectionRatio === 0);
9050
- const lastNonIntersection = reverseIntersections.find((i) => i.intersectionRatio === 0);
9051
- const lastNonIntersectingIndex = intersections.findIndex((i) => i === lastNonIntersection);
9052
- return {
9053
- partial: {
9054
- hasAny: !!firstIntersecting || !!lastIntersecting,
9055
- hasMultiple: !!firstIntersecting || (!!lastIntersecting && firstIntersecting !== lastIntersecting),
9056
- first: {
9057
- intersection: firstIntersecting,
9058
- index: firstIntersectingIndex,
9059
- },
9060
- last: {
9061
- intersection: lastIntersecting,
9062
- index: lastIntersectingIndex,
9063
- },
9064
- biggest: {
9065
- intersection: greaterIntersecting,
9066
- index: greaterIntersectingIndex,
9067
- },
9068
- },
9069
- full: {
9070
- hasAny: hasFullIntersection,
9071
- hasMultiple: hasMultipleFullIntersections,
9072
- first: {
9073
- index: firstFullIntersectionIndex,
9074
- intersection: firstFullIntersection,
9075
- },
9076
- last: {
9077
- index: lastFullIntersectionIndex,
9078
- intersection: lastFullIntersection,
9079
- },
9080
- },
9081
- none: {
9082
- first: {
9083
- index: firstNonIntersectingIndex,
9084
- intersection: firstNonIntersection,
9085
- },
9086
- last: {
9087
- index: lastNonIntersectingIndex,
9088
- intersection: lastNonIntersection,
9089
- },
9090
- },
9091
- };
9092
- };
9093
-
9094
9043
  // Thresholds for the intersection observer.
9095
9044
  const ELEMENT_INTERSECTION_THRESHOLD = [
9096
9045
  // 5% steps
@@ -9105,56 +9054,47 @@ const ELEMENT_INTERSECTION_THRESHOLD = [
9105
9054
  ];
9106
9055
  class ScrollableComponent {
9107
9056
  constructor() {
9108
- this._disableSnapping$ = new Subject();
9109
- this._manualActiveNavigationIndex = signal(null, ...(ngDevMode ? [{ debugName: "_manualActiveNavigationIndex" }] : []));
9057
+ this.manualActiveNavigationIndex = signal(null, ...(ngDevMode ? [{ debugName: "manualActiveNavigationIndex" }] : []));
9110
9058
  this.elementRef = inject(ElementRef);
9111
- this.itemSize = input('auto', ...(ngDevMode ? [{ debugName: "itemSize" }] : []));
9112
- this.direction = input('horizontal', ...(ngDevMode ? [{ debugName: "direction" }] : []));
9059
+ this.itemSize = input('auto', { ...(ngDevMode ? { debugName: "itemSize" } : {}), transform: typedBreakpointTransform() });
9060
+ this.direction = input('horizontal', { ...(ngDevMode ? { debugName: "direction" } : {}), transform: typedBreakpointTransform() });
9113
9061
  this.scrollableRole = input(null, ...(ngDevMode ? [{ debugName: "scrollableRole" }] : []));
9114
9062
  this.scrollableClass = input(null, ...(ngDevMode ? [{ debugName: "scrollableClass" }] : []));
9115
- this.renderNavigation = input(false, { ...(ngDevMode ? { debugName: "renderNavigation" } : {}), transform: booleanAttribute });
9116
- this.renderMasks = input(true, { ...(ngDevMode ? { debugName: "renderMasks" } : {}), transform: booleanAttribute });
9117
- this.renderButtons = input(true, { ...(ngDevMode ? { debugName: "renderButtons" } : {}), transform: booleanAttribute });
9118
- this.buttonPosition = input('inside', ...(ngDevMode ? [{ debugName: "buttonPosition" }] : []));
9119
- this.renderScrollbars = input(false, { ...(ngDevMode ? { debugName: "renderScrollbars" } : {}), transform: booleanAttribute });
9120
- this.stickyButtons = input(false, { ...(ngDevMode ? { debugName: "stickyButtons" } : {}), transform: booleanAttribute });
9121
- this.cursorDragScroll = input(true, { ...(ngDevMode ? { debugName: "cursorDragScroll" } : {}), transform: booleanAttribute });
9122
- this.disableActiveElementScrolling = input(false, { ...(ngDevMode ? { debugName: "disableActiveElementScrolling" } : {}), transform: booleanAttribute });
9123
- this.scrollMode = input('container', ...(ngDevMode ? [{ debugName: "scrollMode" }] : []));
9124
- this.snap = input(false, { ...(ngDevMode ? { debugName: "snap" } : {}), transform: booleanAttribute });
9125
- this.scrollMargin = input(0, { ...(ngDevMode ? { debugName: "scrollMargin" } : {}), transform: numberAttribute });
9126
- this.scrollOrigin = input('auto', ...(ngDevMode ? [{ debugName: "scrollOrigin" }] : []));
9127
- this.darkenNonIntersectingItems = input(false, { ...(ngDevMode ? { debugName: "darkenNonIntersectingItems" } : {}), transform: booleanAttribute });
9128
- this.showLoadingTemplate = input(false, { ...(ngDevMode ? { debugName: "showLoadingTemplate" } : {}), transform: booleanAttribute });
9129
- this.loadingTemplatePosition = input('end', ...(ngDevMode ? [{ debugName: "loadingTemplatePosition" }] : []));
9063
+ this.renderNavigation = input(false, { ...(ngDevMode ? { debugName: "renderNavigation" } : {}), transform: boolBreakpointTransform() });
9064
+ this.renderMasks = input(true, { ...(ngDevMode ? { debugName: "renderMasks" } : {}), transform: boolBreakpointTransform() });
9065
+ this.renderButtons = input(true, { ...(ngDevMode ? { debugName: "renderButtons" } : {}), transform: boolBreakpointTransform() });
9066
+ this.buttonPosition = input('inside', { ...(ngDevMode ? { debugName: "buttonPosition" } : {}), transform: typedBreakpointTransform() });
9067
+ this.renderScrollbars = input(false, { ...(ngDevMode ? { debugName: "renderScrollbars" } : {}), transform: boolBreakpointTransform() });
9068
+ this.stickyButtons = input(false, { ...(ngDevMode ? { debugName: "stickyButtons" } : {}), transform: boolBreakpointTransform() });
9069
+ this.cursorDragScroll = input(true, { ...(ngDevMode ? { debugName: "cursorDragScroll" } : {}), transform: boolBreakpointTransform() });
9070
+ this.disableActiveElementScrolling = input(false, { ...(ngDevMode ? { debugName: "disableActiveElementScrolling" } : {}), transform: boolBreakpointTransform() });
9071
+ this.scrollMode = input('container', { ...(ngDevMode ? { debugName: "scrollMode" } : {}), transform: typedBreakpointTransform() });
9072
+ this.snap = input(false, { ...(ngDevMode ? { debugName: "snap" } : {}), transform: boolBreakpointTransform() });
9073
+ this.scrollMargin = input(0, { ...(ngDevMode ? { debugName: "scrollMargin" } : {}), transform: numberBreakpointTransform() });
9074
+ this.scrollOrigin = input('auto', { ...(ngDevMode ? { debugName: "scrollOrigin" } : {}), transform: typedBreakpointTransform() });
9075
+ this.darkenNonIntersectingItems = input(false, { ...(ngDevMode ? { debugName: "darkenNonIntersectingItems" } : {}), transform: boolBreakpointTransform() });
9076
+ this.showLoadingTemplate = input(false, { ...(ngDevMode ? { debugName: "showLoadingTemplate" } : {}), transform: boolBreakpointTransform() });
9077
+ this.loadingTemplatePosition = input('end', { ...(ngDevMode ? { debugName: "loadingTemplatePosition" } : {}), transform: typedBreakpointTransform() });
9130
9078
  this.scrollable = viewChild('scrollable', ...(ngDevMode ? [{ debugName: "scrollable" }] : []));
9131
- this.firstElement = viewChild('firstElement', ...(ngDevMode ? [{ debugName: "firstElement" }] : []));
9132
- this.lastElement = viewChild('lastElement', ...(ngDevMode ? [{ debugName: "lastElement" }] : []));
9079
+ this.scrollObserver = viewChild.required(ScrollObserverDirective);
9133
9080
  this.activeElementList = contentChildren(SCROLLABLE_IS_ACTIVE_CHILD_TOKEN, { ...(ngDevMode ? { debugName: "activeElementList" } : {}), descendants: true });
9134
9081
  this.navigationDotsContainer = viewChild('navigationDotsContainer', ...(ngDevMode ? [{ debugName: "navigationDotsContainer" }] : []));
9135
9082
  this.firstNavigationDot = viewChild('navigationDot', ...(ngDevMode ? [{ debugName: "firstNavigationDot" }] : []));
9136
9083
  this.loadingTemplate = contentChild(SCROLLABLE_LOADING_TEMPLATE_TOKEN, ...(ngDevMode ? [{ debugName: "loadingTemplate" }] : []));
9137
- this.scrollableAttributeMutations = signalElementMutations(this.scrollable, {
9138
- attributes: true,
9139
- childList: true,
9140
- subtree: true,
9141
- });
9142
9084
  this.scrollableDimensions = signalElementDimensions(this.scrollable);
9143
9085
  this.navigationDotDimensions = signalElementDimensions(this.firstNavigationDot);
9144
- this.isRendered = createIsRenderedSignal();
9145
9086
  this.canAnimate = createCanAnimateSignal();
9146
9087
  this.cursorDragScrollState = useCursorDragScroll(this.scrollable, {
9147
9088
  enabled: this.cursorDragScroll,
9148
9089
  allowedDirection: this.direction,
9149
9090
  });
9150
- this.isCursorDragging$ = toObservable(this.cursorDragScrollState.isDragging);
9151
9091
  this.renderButtonsInside = computed(() => this.buttonPosition() === 'inside' && this.renderButtons(), ...(ngDevMode ? [{ debugName: "renderButtonsInside" }] : []));
9152
9092
  this.renderButtonsInFooter = computed(() => this.buttonPosition() === 'footer' && this.renderButtons(), ...(ngDevMode ? [{ debugName: "renderButtonsInFooter" }] : []));
9153
9093
  this.containerScrollState = signalElementScrollState(this.scrollable, {
9154
9094
  initialScrollPosition: computed(() => {
9155
9095
  const scrollable = this.scrollable()?.nativeElement;
9156
9096
  const activeElementList = this.activeElementList();
9157
- if (!scrollable || !activeElementList.length || !this.isRendered.state())
9097
+ if (!scrollable || !activeElementList.length)
9158
9098
  return null;
9159
9099
  const firstActive = activeElementList.find((a) => a.isActiveChildEnabled());
9160
9100
  if (firstActive && !this.disableActiveElementScrolling()) {
@@ -9163,44 +9103,26 @@ class ScrollableComponent {
9163
9103
  return null;
9164
9104
  }),
9165
9105
  });
9166
- this.firstElementIntersection = signalElementIntersection(this.firstElement, {
9167
- root: this.scrollable,
9168
- enabled: this.isRendered.state,
9169
- });
9170
- this.lastElementIntersection = signalElementIntersection(this.lastElement, {
9171
- root: this.scrollable,
9172
- enabled: this.isRendered.state,
9173
- });
9174
9106
  this.allScrollableChildren = signalElementChildren(this.scrollable);
9175
9107
  this.scrollableChildren = computed(() => this.allScrollableChildren().filter((c) => !isScrollableChildIgnored(c)), ...(ngDevMode ? [{ debugName: "scrollableChildren" }] : []));
9176
9108
  this.scrollableContentIntersections = signalElementIntersection(this.scrollableChildren, {
9177
9109
  root: this.scrollable,
9178
9110
  threshold: ELEMENT_INTERSECTION_THRESHOLD,
9179
- enabled: this.isRendered.state,
9180
9111
  });
9181
9112
  this.scrollableContentIntersections$ = toObservable(this.scrollableContentIntersections);
9113
+ this.maxVisibleItemCount = toSignal(this.scrollableContentIntersections$.pipe(takeUntilDestroyed(), debounceTime(150), map((entries) => entries.filter((i) => i.intersectionRatio > 0).length)), { initialValue: 0 });
9182
9114
  this.nonScrollableIntersections = computed(() => {
9183
9115
  const allIntersections = this.scrollableContentIntersections();
9184
9116
  return allIntersections.filter((i) => i.intersectionRatio !== 1).map((i) => i.target);
9185
9117
  }, { ...(ngDevMode ? { debugName: "nonScrollableIntersections" } : {}), equal: (a, b) => a.length === b.length && a.every((v, i) => v === b[i]) });
9186
- this.isAtStart = computed(() => {
9187
- const intersection = this.firstElementIntersection()[0];
9188
- if (!intersection)
9189
- return false;
9190
- return intersection.isIntersecting;
9191
- }, ...(ngDevMode ? [{ debugName: "isAtStart" }] : []));
9192
- this.isAtEnd = computed(() => {
9193
- const intersection = this.lastElementIntersection()[0];
9194
- if (!intersection)
9195
- return false;
9196
- return intersection.isIntersecting;
9197
- }, ...(ngDevMode ? [{ debugName: "isAtEnd" }] : []));
9118
+ this.isAtStart = computed(() => this.scrollObserver().isAtStart(), ...(ngDevMode ? [{ debugName: "isAtStart" }] : []));
9119
+ this.isAtEnd = computed(() => this.scrollObserver().isAtEnd(), ...(ngDevMode ? [{ debugName: "isAtEnd" }] : []));
9198
9120
  this.canScroll = computed(() => this.direction() === 'horizontal'
9199
9121
  ? this.containerScrollState().canScrollHorizontally
9200
9122
  : this.containerScrollState().canScrollVertically, ...(ngDevMode ? [{ debugName: "canScroll" }] : []));
9201
9123
  this.scrollableNavigation = computed(() => {
9202
9124
  const allIntersections = this.scrollableContentIntersections();
9203
- const manualActiveNavigationIndex = this._manualActiveNavigationIndex();
9125
+ const manualActiveNavigationIndex = this.manualActiveNavigationIndex();
9204
9126
  const isAtStart = this.isAtStart();
9205
9127
  const isAtEnd = this.isAtEnd();
9206
9128
  const firstIntersection = allIntersections[0];
@@ -9216,26 +9138,24 @@ class ScrollableComponent {
9216
9138
  return curr;
9217
9139
  }, allIntersections[0]);
9218
9140
  if (!highestIntersection) {
9219
- return [];
9141
+ return { items: [], activeIndex: -1 };
9220
9142
  }
9221
9143
  const activeIndex = manualActiveNavigationIndex !== null
9222
9144
  ? manualActiveNavigationIndex
9223
9145
  : allIntersections.findIndex((i) => i === highestIntersection);
9224
- return allIntersections.map((i, index) => ({
9146
+ const items = allIntersections.map((i, index) => ({
9225
9147
  isActive: manualActiveNavigationIndex !== null
9226
9148
  ? manualActiveNavigationIndex === index
9227
9149
  : i === highestIntersection && highestIntersection.intersectionRatio > 0,
9228
9150
  activeOffset: index === activeIndex ? 0 : Math.abs(index - activeIndex),
9229
9151
  element: i.target,
9230
9152
  }));
9231
- }, { ...(ngDevMode ? { debugName: "scrollableNavigation" } : {}), equal: (a, b) => a.length === b.length && a.every((v, i) => v.activeOffset === b[i]?.activeOffset) });
9232
- this.activeIndex = computed(() => {
9233
- const scrollableNavigation = this.scrollableNavigation();
9234
- const activeIndex = scrollableNavigation.findIndex((element) => element.isActive);
9235
- return activeIndex;
9236
- }, ...(ngDevMode ? [{ debugName: "activeIndex" }] : []));
9153
+ return { items, activeIndex };
9154
+ }, { ...(ngDevMode ? { debugName: "scrollableNavigation" } : {}), equal: (a, b) => a.activeIndex === b.activeIndex &&
9155
+ a.items.length === b.items.length &&
9156
+ a.items.every((v, i) => v.isActive === b.items[i]?.isActive && v.activeOffset === b.items[i]?.activeOffset) });
9157
+ this.activeIndex = computed(() => this.scrollableNavigation().activeIndex, ...(ngDevMode ? [{ debugName: "activeIndex" }] : []));
9237
9158
  this.gapValue = computed(() => {
9238
- this.scrollableAttributeMutations();
9239
9159
  this.scrollableDimensions();
9240
9160
  const scrollable = this.scrollable()?.nativeElement;
9241
9161
  if (!scrollable)
@@ -9247,22 +9167,17 @@ class ScrollableComponent {
9247
9167
  return '0px';
9248
9168
  return gap;
9249
9169
  }, ...(ngDevMode ? [{ debugName: "gapValue" }] : []));
9250
- this.intersectionChange = outputFromObservable(this.scrollableContentIntersections$.pipe(takeUntilDestroyed(), debounceTime(50), map((entries) => entries.map((i, index) => ({
9170
+ this.intersectionChange = outputFromObservable(toObservable(this.scrollableContentIntersections).pipe(takeUntilDestroyed(), debounceTime(50), map((entries) => entries.map((i, index) => ({
9251
9171
  index,
9252
9172
  element: i.target,
9253
9173
  intersectionRatio: i.intersectionRatio,
9254
9174
  isIntersecting: i.isIntersecting,
9255
9175
  })))));
9256
- this.scrollStateChange = outputFromObservable(toObservable(computed(() => {
9257
- const isAtStart = this.isAtStart();
9258
- const isAtEnd = this.isAtEnd();
9259
- const canScroll = this.canScroll();
9260
- return {
9261
- canScroll,
9262
- isAtEnd: !!isAtEnd,
9263
- isAtStart: !!isAtStart,
9264
- };
9265
- })));
9176
+ this.scrollStateChange = outputFromObservable(toObservable(computed(() => ({
9177
+ canScroll: this.canScroll(),
9178
+ isAtEnd: this.isAtEnd(),
9179
+ isAtStart: this.isAtStart(),
9180
+ }))));
9266
9181
  this.allChildElementClassBindings = signalClasses(this.scrollableChildren, {
9267
9182
  'et-scrollable-item': signal(true),
9268
9183
  });
@@ -9280,7 +9195,8 @@ class ScrollableComponent {
9280
9195
  'et-scrollable--is-at-start': this.isAtStart,
9281
9196
  'et-scrollable--is-at-end': this.isAtEnd,
9282
9197
  'et-scrollable--can-animate': this.canAnimate.state,
9283
- 'et-scrollable--darken-non-intersecting-items': this.darkenNonIntersectingItems,
9198
+ 'et-scrollable--has-partial-items': computed(() => this.scrollableContentIntersections().some((i) => i.intersectionRatio > 0 && i.intersectionRatio < 1)),
9199
+ 'et-scrollable--darken-non-intersecting-items': computed(() => this.darkenNonIntersectingItems() && this.maxVisibleItemCount() > 1),
9284
9200
  });
9285
9201
  this.hostStyleBindings = signalHostStyles({
9286
9202
  '--item-count': computed(() => this.scrollableChildren().length),
@@ -9289,32 +9205,40 @@ class ScrollableComponent {
9289
9205
  this.scrollableDotsContainerStyleBindings = signalStyles(this.navigationDotsContainer, {
9290
9206
  // Responsible for centering the active dot in navigation bar by using 'translate'
9291
9207
  transform: computed(() => {
9292
- const activeIndex = this.activeIndex();
9293
- const childCount = this.scrollableChildren().length;
9208
+ const activeIndex = this.scrollableNavigation().activeIndex;
9209
+ const childCount = this.scrollableNavigation().items.length;
9294
9210
  const offset = this.getNavigationDotsContainerTranslate(childCount, activeIndex);
9295
9211
  const dir = this.direction() === 'horizontal' ? 'X' : 'Y';
9296
9212
  return `translate${dir}(${offset})`;
9297
9213
  }),
9298
9214
  });
9299
- effect(() => {
9300
- const enableSnapping = this.snap();
9301
- if (enableSnapping) {
9302
- this._enableSnapping();
9303
- }
9304
- else {
9305
- this._disableSnapping();
9306
- }
9307
- });
9308
- toObservable(this._manualActiveNavigationIndex)
9309
- .pipe(filter((i) => i !== null), takeUntilDestroyed(), switchMap(() => {
9310
- const scrollable = this.scrollable()?.nativeElement;
9311
- if (!scrollable) {
9312
- return of(null);
9313
- }
9314
- return fromEvent(scrollable, 'scroll');
9315
- }), debounceTime(50), tap(() => this._manualActiveNavigationIndex.set(null)))
9215
+ const isDragging$ = toObservable(this.cursorDragScrollState.isDragging);
9216
+ const scrollable$ = toObservable(this.scrollable);
9217
+ toObservable(this.snap)
9218
+ .pipe(takeUntilDestroyed(), switchMap((enabled) => {
9219
+ if (!enabled)
9220
+ return EMPTY;
9221
+ return combineLatest([this.scrollableContentIntersections$, isDragging$]).pipe(filter(([, isDragging]) => !isDragging), map(([intersections]) => intersections), debounceTime(150), tap((allIntersections) => {
9222
+ const scrollElement = this.scrollable()?.nativeElement;
9223
+ if (!scrollElement)
9224
+ return;
9225
+ const visibleItems = allIntersections
9226
+ .filter((i) => i.intersectionRatio > 0)
9227
+ .map((i) => i.target);
9228
+ const target = getScrollSnapTarget(visibleItems, scrollElement, this.direction(), this.scrollOrigin(), this.scrollMargin());
9229
+ if (target) {
9230
+ this.scrollToElement({ element: target.element, origin: target.origin, ignoreForcedOrigin: true });
9231
+ }
9232
+ }));
9233
+ }))
9234
+ .subscribe();
9235
+ toObservable(this.manualActiveNavigationIndex)
9236
+ .pipe(takeUntilDestroyed(), filter((i) => i !== null), switchMap(() => scrollable$.pipe(switchMap((ref) => {
9237
+ if (!ref)
9238
+ return EMPTY;
9239
+ return fromEvent(ref.nativeElement, 'scroll');
9240
+ }))), debounceTime(50), tap(() => this.manualActiveNavigationIndex.set(null)))
9316
9241
  .subscribe();
9317
- this.isRendered.bind();
9318
9242
  }
9319
9243
  getNavigationDotsContainerTranslate(navigationDotCount, activeIndex) {
9320
9244
  if (navigationDotCount <= 5) {
@@ -9337,30 +9261,16 @@ class ScrollableComponent {
9337
9261
  if (!scrollElement) {
9338
9262
  return;
9339
9263
  }
9340
- const parent = this.elementRef.nativeElement;
9341
9264
  const isSnappingEnabled = this.snap();
9342
9265
  if (isSnappingEnabled) {
9343
- // If snapping is enabled we want to scroll to a position where no further snapping will happen after the scroll.
9344
- const allIntersections = this.scrollableContentIntersections();
9345
- const intersections = getIntersectionInfo(allIntersections);
9346
- const relevantIntersection = direction === 'start' ? intersections?.partial.first : intersections?.partial.last;
9347
- if (!relevantIntersection)
9348
- return;
9349
- const nextIndex = relevantIntersection.intersection.intersectionRatio !== 1
9350
- ? relevantIntersection.index
9351
- : direction === 'start'
9352
- ? relevantIntersection.index - 1
9353
- : relevantIntersection.index + 1;
9354
- const element = allIntersections[nextIndex]?.target ||
9355
- relevantIntersection.intersection.target;
9356
- this.scrollToElement({
9357
- element: element,
9358
- origin: direction === 'end' ? 'start' : 'end',
9359
- });
9266
+ const target = getScrollContainerTarget(this.scrollableContentIntersections(), direction);
9267
+ if (target)
9268
+ this.scrollToElement(target);
9360
9269
  }
9361
9270
  else {
9362
9271
  // Just scroll one size of the scrollable container.
9363
- const scrollableSize = this.direction() === 'horizontal' ? parent.clientWidth : parent.clientHeight;
9272
+ const dimensions = this.scrollableDimensions().client;
9273
+ const scrollableSize = this.direction() === 'horizontal' ? (dimensions?.width ?? 0) : (dimensions?.height ?? 0);
9364
9274
  const currentScroll = this.direction() === 'horizontal' ? scrollElement.scrollLeft : scrollElement.scrollTop;
9365
9275
  scrollElement.scrollTo({
9366
9276
  [this.direction() === 'horizontal' ? 'left' : 'top']: currentScroll + (direction === 'start' ? -scrollableSize : scrollableSize),
@@ -9377,101 +9287,13 @@ class ScrollableComponent {
9377
9287
  }
9378
9288
  return;
9379
9289
  }
9380
- const intersections = getIntersectionInfo(allIntersections);
9381
- if (!intersections || !scrollElement)
9290
+ if (!scrollElement)
9382
9291
  return;
9383
- // Means the current element is bigger than the scrollable container.
9384
- // In this case we should scroll to the start of the current element. If we are already there we should scroll to the end of the previous element.
9385
- // This applies to the other direction as well.
9386
- const isFirstAndLastIntersectionEqual = intersections.partial.first.intersection === intersections.partial.last.intersection;
9387
- const scrollableRect = scrollElement.getBoundingClientRect();
9388
- if (isFirstAndLastIntersectionEqual) {
9389
- const intersection = intersections.partial.first.intersection.target.getBoundingClientRect();
9390
- const isStartOfElementVisible = this.direction() === 'horizontal'
9391
- ? Math.round(intersection.left) >= Math.round(scrollableRect.left)
9392
- : Math.round(intersection.top) >= Math.round(scrollableRect.top);
9393
- const isEndOfElementVisible = this.direction() === 'horizontal'
9394
- ? Math.round(intersection.right) <= Math.round(scrollableRect.right)
9395
- : Math.round(intersection.bottom) <= Math.round(scrollableRect.bottom);
9396
- if (!isStartOfElementVisible || !isEndOfElementVisible) {
9397
- if (direction === 'start') {
9398
- if (isStartOfElementVisible) {
9399
- // to the end of the previous element
9400
- const previousIndex = intersections.partial.first.index - 1;
9401
- const elementToScrollTo = allIntersections[previousIndex]?.target;
9402
- if (!elementToScrollTo)
9403
- return;
9404
- this.scrollToElement({
9405
- element: elementToScrollTo,
9406
- origin: 'end',
9407
- });
9408
- this._manualActiveNavigationIndex.set(previousIndex);
9409
- }
9410
- else {
9411
- // to the start of the current element
9412
- this.scrollToElement({
9413
- element: intersections.partial.first.intersection.target,
9414
- origin: 'start',
9415
- });
9416
- this._manualActiveNavigationIndex.set(intersections.partial.first.index);
9417
- }
9418
- }
9419
- else {
9420
- if (isEndOfElementVisible) {
9421
- // to the start of the next element
9422
- const nextIndex = intersections.partial.last.index + 1;
9423
- const elementToScrollTo = allIntersections[nextIndex]?.target;
9424
- if (!elementToScrollTo)
9425
- return;
9426
- this.scrollToElement({
9427
- element: elementToScrollTo,
9428
- origin: 'start',
9429
- });
9430
- this._manualActiveNavigationIndex.set(nextIndex);
9431
- }
9432
- else {
9433
- // to the end of the current element
9434
- this.scrollToElement({
9435
- element: intersections.partial.last.intersection.target,
9436
- origin: 'end',
9437
- });
9438
- this._manualActiveNavigationIndex.set(intersections.partial.last.index);
9439
- }
9440
- }
9441
- return;
9442
- }
9443
- }
9444
- else if (this.scrollOrigin() === 'center') {
9445
- // If the scroll origin is forced to be center we should always snap to the center of the next partial intersection in the scroll direction.
9446
- const nextPartialIntersection = direction === 'start' ? intersections.partial.first : intersections.partial.last;
9447
- const nextIndex = nextPartialIntersection.index;
9448
- this.scrollToElement({
9449
- element: nextPartialIntersection.intersection.target,
9450
- origin: 'center',
9451
- });
9452
- this._manualActiveNavigationIndex.set(nextIndex);
9292
+ const target = getScrollItemTarget(allIntersections, scrollElement, direction, this.scrollOrigin(), this.direction());
9293
+ if (!target)
9453
9294
  return;
9454
- }
9455
- const data = direction === 'start' ? intersections.partial.first : intersections.partial.last;
9456
- let elementToScrollTo = data.intersection.target;
9457
- let nextIndex = data.index;
9458
- if (Math.round(data.intersection.intersectionRatio) === 1) {
9459
- if (direction === 'start' && data.index === 0) {
9460
- return;
9461
- }
9462
- if (direction === 'end' && data.index === allIntersections.length - 1) {
9463
- return;
9464
- }
9465
- nextIndex = direction === 'start' ? data.index - 1 : data.index + 1;
9466
- elementToScrollTo = allIntersections[nextIndex]?.target;
9467
- if (!elementToScrollTo)
9468
- return;
9469
- }
9470
- this.scrollToElement({
9471
- element: elementToScrollTo,
9472
- origin: direction,
9473
- });
9474
- this._manualActiveNavigationIndex.set(nextIndex);
9295
+ this.scrollToElement(target);
9296
+ this.manualActiveNavigationIndex.set(target.index);
9475
9297
  }
9476
9298
  getElementScrollCoordinates(options) {
9477
9299
  const scrollElement = this.scrollable()?.nativeElement;
@@ -9502,7 +9324,7 @@ class ScrollableComponent {
9502
9324
  }
9503
9325
  scrollToElementViaNavigation(elementIndex) {
9504
9326
  const element = this.scrollableChildren()[elementIndex];
9505
- this._manualActiveNavigationIndex.set(elementIndex);
9327
+ this.manualActiveNavigationIndex.set(elementIndex);
9506
9328
  this.scrollToElement({
9507
9329
  element,
9508
9330
  });
@@ -9523,92 +9345,23 @@ class ScrollableComponent {
9523
9345
  this.scrollOneItemSize('end');
9524
9346
  }
9525
9347
  }
9526
- _enableSnapping() {
9527
- combineLatest([this.scrollableContentIntersections$, this.isCursorDragging$])
9528
- .pipe(filter(([, isDragging]) => !isDragging), map(([intersections]) => intersections), debounceTime(150), tap((allIntersections) => {
9529
- const scrollElement = this.scrollable()?.nativeElement;
9530
- if (!scrollElement)
9531
- return;
9532
- const intersections = getIntersectionInfo(allIntersections);
9533
- if (!intersections)
9534
- return;
9535
- const isFirstAndLastIntersectionEqual = intersections.partial.first.intersection === intersections.partial.last.intersection;
9536
- const scrollableRect = scrollElement.getBoundingClientRect();
9537
- if (this.scrollOrigin() === 'center' && intersections.full.hasMultiple) {
9538
- // If there is more than one fully visible element we should not snap at all.
9539
- return;
9540
- }
9541
- else if (this.scrollOrigin() === 'center' && intersections.full.first.intersection) {
9542
- // If there is already a fully visible element we should snap it to the center.
9543
- this.scrollToElement({
9544
- element: intersections.full.first.intersection.target,
9545
- origin: 'center',
9546
- });
9547
- return;
9548
- }
9549
- else if (isFirstAndLastIntersectionEqual) {
9550
- const intersection = intersections.partial.first.intersection.target.getBoundingClientRect();
9551
- const isStartOfElementVisible = this.direction() === 'horizontal'
9552
- ? intersection.left >= scrollableRect.left
9553
- : intersection.top >= scrollableRect.top;
9554
- const isEndOfElementVisible = this.direction() === 'horizontal'
9555
- ? intersection.right <= scrollableRect.right
9556
- : intersection.bottom <= scrollableRect.bottom;
9557
- // Don't snap if neither the start nor the end of the current element is visible.
9558
- // Otherwise this would result in parts of the element being inaccessible.
9559
- if (!isStartOfElementVisible && !isEndOfElementVisible)
9560
- return;
9561
- // If the start of the element is visible we should snap to the start.
9562
- if (isStartOfElementVisible) {
9563
- this.scrollToElement({
9564
- element: intersections.partial.first.intersection.target,
9565
- origin: 'start',
9566
- });
9567
- return;
9568
- }
9569
- // If the end of the element is visible we should snap to the end.
9570
- if (isEndOfElementVisible) {
9571
- this.scrollToElement({
9572
- element: intersections.partial.last.intersection.target,
9573
- origin: 'end',
9574
- });
9575
- return;
9576
- }
9577
- }
9578
- else if ((this.direction() === 'horizontal' &&
9579
- intersections.partial.biggest.intersection.boundingClientRect.width > scrollableRect.width) ||
9580
- (this.direction() === 'vertical' &&
9581
- intersections.partial.biggest.intersection.boundingClientRect.height > scrollableRect.height)) {
9582
- // If the current element is bigger than the scrollable container we should snap to the start of the current element if the scroll direction is forward
9583
- // and to the end of the current element if the scroll direction is backwards.
9584
- const origin = intersections.partial.biggest.index === intersections.partial.first.index ? 'end' : 'start';
9585
- this.scrollToElement({
9586
- element: intersections.partial.biggest.intersection.target,
9587
- origin,
9588
- ignoreForcedOrigin: true,
9589
- });
9590
- }
9591
- else {
9592
- // No special case. Just snap to the biggest intersection.
9593
- this.scrollToElement({
9594
- element: intersections.partial.biggest.intersection.target,
9595
- });
9596
- }
9597
- }), takeUntil(this._disableSnapping$))
9598
- .subscribe();
9599
- }
9600
- _disableSnapping() {
9601
- this._disableSnapping$.next();
9602
- }
9603
9348
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: ScrollableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9604
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: ScrollableComponent, isStandalone: true, selector: "et-scrollable", inputs: { itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, scrollableRole: { classPropertyName: "scrollableRole", publicName: "scrollableRole", isSignal: true, isRequired: false, transformFunction: null }, scrollableClass: { classPropertyName: "scrollableClass", publicName: "scrollableClass", isSignal: true, isRequired: false, transformFunction: null }, renderNavigation: { classPropertyName: "renderNavigation", publicName: "renderNavigation", isSignal: true, isRequired: false, transformFunction: null }, renderMasks: { classPropertyName: "renderMasks", publicName: "renderMasks", isSignal: true, isRequired: false, transformFunction: null }, renderButtons: { classPropertyName: "renderButtons", publicName: "renderButtons", isSignal: true, isRequired: false, transformFunction: null }, buttonPosition: { classPropertyName: "buttonPosition", publicName: "buttonPosition", isSignal: true, isRequired: false, transformFunction: null }, renderScrollbars: { classPropertyName: "renderScrollbars", publicName: "renderScrollbars", isSignal: true, isRequired: false, transformFunction: null }, stickyButtons: { classPropertyName: "stickyButtons", publicName: "stickyButtons", isSignal: true, isRequired: false, transformFunction: null }, cursorDragScroll: { classPropertyName: "cursorDragScroll", publicName: "cursorDragScroll", isSignal: true, isRequired: false, transformFunction: null }, disableActiveElementScrolling: { classPropertyName: "disableActiveElementScrolling", publicName: "disableActiveElementScrolling", isSignal: true, isRequired: false, transformFunction: null }, scrollMode: { classPropertyName: "scrollMode", publicName: "scrollMode", isSignal: true, isRequired: false, transformFunction: null }, snap: { classPropertyName: "snap", publicName: "snap", isSignal: true, isRequired: false, transformFunction: null }, scrollMargin: { classPropertyName: "scrollMargin", publicName: "scrollMargin", isSignal: true, isRequired: false, transformFunction: null }, scrollOrigin: { classPropertyName: "scrollOrigin", publicName: "scrollOrigin", isSignal: true, isRequired: false, transformFunction: null }, darkenNonIntersectingItems: { classPropertyName: "darkenNonIntersectingItems", publicName: "darkenNonIntersectingItems", isSignal: true, isRequired: false, transformFunction: null }, showLoadingTemplate: { classPropertyName: "showLoadingTemplate", publicName: "showLoadingTemplate", isSignal: true, isRequired: false, transformFunction: null }, loadingTemplatePosition: { classPropertyName: "loadingTemplatePosition", publicName: "loadingTemplatePosition", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { intersectionChange: "intersectionChange", scrollStateChange: "scrollStateChange" }, host: { classAttribute: "et-scrollable" }, providers: [provideIcons(CHEVRON_ICON)], queries: [{ propertyName: "activeElementList", predicate: SCROLLABLE_IS_ACTIVE_CHILD_TOKEN, descendants: true, isSignal: true }, { propertyName: "loadingTemplate", first: true, predicate: SCROLLABLE_LOADING_TEMPLATE_TOKEN, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "scrollable", first: true, predicate: ["scrollable"], descendants: true, isSignal: true }, { propertyName: "firstElement", first: true, predicate: ["firstElement"], descendants: true, isSignal: true }, { propertyName: "lastElement", first: true, predicate: ["lastElement"], descendants: true, isSignal: true }, { propertyName: "navigationDotsContainer", first: true, predicate: ["navigationDotsContainer"], descendants: true, isSignal: true }, { propertyName: "firstNavigationDot", first: true, predicate: ["navigationDot"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"et-scrollable-wrapper\">\n <div\n #scrollable\n [attr.role]=\"scrollableRole() ?? undefined\"\n [ngClass]=\"scrollableClass()\"\n class=\"et-scrollable-container\"\n >\n <div #firstElement class=\"et-scroll-observer-first-element\" etScrollableIgnoreChild></div>\n @if (loadingTemplatePosition() === 'start' && showLoadingTemplate()) {\n <ng-container *ngTemplateOutlet=\"loadingTpl\" />\n }\n <ng-content />\n @if (loadingTemplatePosition() === 'end' && showLoadingTemplate()) {\n <ng-container *ngTemplateOutlet=\"loadingTpl\" />\n }\n\n <div #lastElement class=\"et-scroll-observer-last-element\" etScrollableIgnoreChild></div>\n </div>\n\n @if (renderMasks()) {\n <div 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\n @if (renderButtonsInside()) {\n <div class=\"et-scrollable-buttons\">\n <ng-container *ngTemplateOutlet=\"forwardButtonTpl\" />\n <ng-container *ngTemplateOutlet=\"backwardButtonTpl\" />\n </div>\n }\n</div>\n\n@if ((renderButtonsInFooter() || (renderNavigation() && scrollableNavigation().length > 1)) && canScroll()) {\n <div\n [ngClass]=\"{\n 'et-scrollable-footer--with-navigation': renderNavigation(),\n 'et-scrollable-footer--with-buttons': renderButtonsInFooter(),\n }\"\n class=\"et-scrollable-footer\"\n aria-hidden=\"true\"\n >\n @if (renderButtonsInFooter()) {\n <ng-container *ngTemplateOutlet=\"forwardButtonTpl\" />\n }\n\n @if (renderNavigation()) {\n <div class=\"et-scrollable-progress-bar\">\n <div #navigationDotsContainer class=\"et-scrollable-dots-container\">\n @for (item of scrollableNavigation(); track i; let i = $index) {\n <button\n #navigationDot\n [class.et-scrollable-navigation-item--active]=\"item.isActive\"\n [class.et-scrollable-navigation-item--close]=\"\n scrollableNavigation()[i + 1]?.isActive || scrollableNavigation()[i - 1]?.isActive\n \"\n [class.et-scrollable-navigation-item--far]=\"\n !scrollableNavigation()[i + 1]?.isActive && !scrollableNavigation()[i - 1]?.isActive && !item.isActive\n \"\n [attr.active-offset]=\"item.activeOffset\"\n (click)=\"scrollToElementViaNavigation(i)\"\n class=\"et-scrollable-navigation-item\"\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n ></button>\n }\n </div>\n </div>\n }\n\n @if (renderButtonsInFooter()) {\n <ng-container *ngTemplateOutlet=\"backwardButtonTpl\" />\n }\n </div>\n}\n\n<ng-template #forwardButtonTpl>\n <button\n [disabled]=\"isAtStart()\"\n (click)=\"scrollToStartDirection()\"\n class=\"et-scrollable-button et-scrollable-button--start\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n</ng-template>\n\n<ng-template #backwardButtonTpl>\n <button\n [disabled]=\"isAtEnd()\"\n (click)=\"scrollToEndDirection()\"\n class=\"et-scrollable-button et-scrollable-button--end\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n</ng-template>\n\n<ng-template #loadingTpl>\n @if (loadingTemplate(); as tpl) {\n @for (\n _ of tpl.repeat();\n track index;\n let index = $index;\n let even = $even;\n let odd = $odd;\n let first = $first;\n let last = $last\n ) {\n <ng-container *ngTemplateOutlet=\"tpl.templateRef; context: { index, even, odd, first, last }\" />\n }\n }\n</ng-template>\n", styles: [":where(.et-scrollable){--mask: #121212 0, transparent 100%;--mask-size: 25px;--darken-non-intersecting-items-amount: .75;--_auto-size: min-content;display:block}.et-scrollable .et-scrollable-wrapper{display:grid;position:relative;block-size:100%;inline-size:100%}.et-scrollable[item-size=same]{--_auto-size: 1fr}.et-scrollable[item-size=half]{--_auto-size: calc((100% - var(--item-gap)) / 2)}.et-scrollable[item-size=third]{--_auto-size: calc((100% - (var(--item-gap) * 2)) / 3)}.et-scrollable[item-size=quarter]{--_auto-size: calc((100% - (var(--item-gap) * 3)) / 4)}.et-scrollable[item-size=full]{--_auto-size: 100%}.et-scrollable[render-scrollbars=false] .et-scrollable-container,.et-scrollable:not([render-scrollbars]) .et-scrollable-container{scrollbar-width:none}.et-scrollable[render-scrollbars=false] .et-scrollable-container::-webkit-scrollbar,.et-scrollable:not([render-scrollbars]) .et-scrollable-container::-webkit-scrollbar{display:none}.et-scrollable .et-scrollable-button .et-icon--et-chevron{display:block}.et-scrollable[direction=horizontal] .et-scrollable-container,.et-scrollable:not([direction]) .et-scrollable-container{grid-auto-flow:column;grid-auto-columns:var(--_auto-size);overflow-x:auto;overflow-y:hidden}.et-scrollable[direction=horizontal] .et-scrollable-container>:nth-child(2),.et-scrollable:not([direction]) .et-scrollable-container>:nth-child(2){grid-column:1/1;grid-row:1/1}.et-scrollable[direction=horizontal] .et-scrollable-container>:nth-last-child(2),.et-scrollable:not([direction]) .et-scrollable-container>:nth-last-child(2){grid-column:var(--item-count)/var(--item-count);grid-row:1/1}.et-scrollable[direction=horizontal] .et-scrollable-mask,.et-scrollable[direction=horizontal] .et-scrollable-button,.et-scrollable:not([direction]) .et-scrollable-mask,.et-scrollable:not([direction]) .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,.et-scrollable:not([direction]) .et-scrollable-mask--start,.et-scrollable:not([direction]) .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,.et-scrollable:not([direction]) .et-scrollable-mask--end,.et-scrollable:not([direction]) .et-scrollable-button--end{inset-block-start:0;inset-inline:calc(100% - 40px) 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--start,.et-scrollable:not([direction]) .et-scrollable-mask--start{background:linear-gradient(to right,var(--mask))}.et-scrollable[direction=horizontal] .et-scrollable-mask--end,.et-scrollable:not([direction]) .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,.et-scrollable:not([direction]) .et-scrollable-button--start{inset-block-start:calc(50% - 20px);transform:translate(-10px)}.et-scrollable[direction=horizontal] .et-scrollable-button--start .et-icon--et-chevron,.et-scrollable:not([direction]) .et-scrollable-button--start .et-icon--et-chevron{transform:rotate(-90deg)}.et-scrollable[direction=horizontal] .et-scrollable-button--end,.et-scrollable:not([direction]) .et-scrollable-button--end{inset-block-start:calc(50% - 20px);transform:translate(10px)}.et-scrollable[direction=horizontal] .et-scrollable-button--end .et-icon--et-chevron,.et-scrollable:not([direction]) .et-scrollable-button--end .et-icon--et-chevron{transform:rotate(90deg)}.et-scrollable[direction=horizontal] .et-scroll-observer-first-element,.et-scrollable[direction=horizontal] .et-scroll-observer-last-element,.et-scrollable:not([direction]) .et-scroll-observer-first-element,.et-scrollable:not([direction]) .et-scroll-observer-last-element{block-size:100%;inline-size:1px}.et-scrollable[direction=horizontal] .et-scroll-observer-first-element,.et-scrollable:not([direction]) .et-scroll-observer-first-element{margin-inline-start:3px;grid-column:1/1;grid-row:1/1}.et-scrollable[direction=horizontal] .et-scroll-observer-last-element,.et-scrollable:not([direction]) .et-scroll-observer-last-element{margin-inline-end:3px;grid-column:var(--item-count)/var(--item-count);grid-row:1/1;justify-self:end}.et-scrollable[direction=vertical] .et-scrollable-container{grid-auto-flow:row;grid-auto-rows:var(--_auto-size);overflow-x:hidden;overflow-y:auto}.et-scrollable[direction=vertical] .et-scrollable-container>:nth-child(2){grid-row:1/1;grid-column:1/1}.et-scrollable[direction=vertical] .et-scrollable-container>:nth-last-child(2){grid-row:var(--item-count)/var(--item-count);grid-column:1/1}.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[direction=vertical] .et-scrollable-button--start{inset-inline-start:calc(50% - 20px);transform:translateY(-10px)}.et-scrollable[direction=vertical] .et-scrollable-button--start .et-icon--et-chevron{transform:rotate(0)}.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-inline-start:calc(50% - 20px);transform:translateY(10px)}.et-scrollable[direction=vertical] .et-scrollable-button--end .et-icon--et-chevron{transform:rotate(180deg)}.et-scrollable[direction=vertical] .et-scroll-observer-first-element,.et-scrollable[direction=vertical] .et-scroll-observer-last-element{inline-size:100%;block-size:1px}.et-scrollable[direction=vertical] .et-scroll-observer-first-element{margin-block-start:3px;grid-row:1/1;grid-column:1/1}.et-scrollable[direction=vertical] .et-scroll-observer-last-element{margin-block-end:3px;grid-row:var(--item-count)/var(--item-count);grid-column:1/1;align-self:end}.et-scrollable[direction=vertical]:has(.et-scrollable-footer){display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-rows:minmax(0,1fr);gap:10px}.et-scrollable[direction=vertical] .et-scrollable-footer{flex-direction:column;margin-block-start:0}.et-scrollable[direction=vertical] .et-scrollable-progress-bar{flex-direction:column;max-block-size:100px}.et-scrollable[direction=vertical] .et-scrollable-dots-container{flex-direction:column}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-masks .et-scrollable-mask--start,.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{opacity:1;transform:translate(0)}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{pointer-events:all}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-masks .et-scrollable-mask--end,.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{opacity:1;transform:translate(0)}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{pointer-events:all}.et-scrollable .et-scroll-observer-first-element,.et-scrollable .et-scroll-observer-last-element{pointer-events:none}.et-scrollable .et-scrollable-container{display:grid;position:relative;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}.et-scrollable.et-scrollable--can-animate .et-scrollable-dots-container{transition:transform .3s var(--ease-5)}.et-scrollable.et-scrollable--can-animate .et-scrollable-navigation-item:after{transition:background-color .2s linear,transform .2s linear}.et-scrollable.et-scrollable--can-animate.et-scrollable--can-scroll .et-scrollable-mask{transition:opacity .3s var(--ease-5)}.et-scrollable.et-scrollable--can-animate.et-scrollable--can-scroll .et-scrollable-button{transition:opacity .3s var(--ease-5),transform .3s var(--ease-5)}.et-scrollable.et-scrollable--can-animate.et-scrollable--darken-non-intersecting-items .et-scrollable-item{transition:opacity .3s var(--ease-5)}.et-scrollable.et-scrollable--darken-non-intersecting-items .et-scrollable-item--not-intersecting{opacity:var(--darken-non-intersecting-items-amount)}.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-icon--et-chevron{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]{--_sticky-margin: 10%}.et-scrollable[sticky-buttons=true] .et-scrollable-button{position:sticky}.et-scrollable[sticky-buttons=true][direction=horizontal] .et-scrollable-buttons{margin-block:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons{margin-inline:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons .et-scrollable-button--end{inset-block-start:100%}.et-scrollable .et-scrollable-footer{display:flex;justify-content:center;align-items:center;gap:10px;margin-block-start:10px}.et-scrollable .et-scrollable-footer.et-scrollable-footer--with-buttons .et-scrollable-button{transform:none}.et-scrollable .et-scrollable-footer .et-scrollable-button{width:30px;height:30px}.et-scrollable .et-scrollable-navigation-item{display:flex;justify-content:center;align-items:center;border:none;padding:0;inline-size:20px;block-size:20px;border-radius:50%;cursor:pointer;background-color:transparent}.et-scrollable .et-scrollable-navigation-item.et-scrollable-navigation-item--active:after{background-color:#c6c6c6}.et-scrollable .et-scrollable-navigation-item:after{content:\"\";display:block;inline-size:50%;block-size:50%;border-radius:50%;background-color:#4b4b4b;transform:scale(0)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"0\"]:after{transform:scale(1)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"1\"]:after{transform:scale(.75)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"2\"]:after{transform:scale(.6)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"3\"]:after{transform:scale(.5)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"4\"]:after{transform:scale(.4)}.et-scrollable .et-scrollable-progress-bar{overflow:hidden;max-inline-size:100px;display:flex;align-items:center}.et-scrollable .et-scrollable-progress-bar .et-scrollable-dots-container{display:flex;flex-wrap:nowrap}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: ScrollableIgnoreChildDirective, selector: "[etScrollableIgnoreChild]", inputs: ["etScrollableIgnoreChild"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "allowHardcodedColor"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
9349
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: ScrollableComponent, isStandalone: true, selector: "et-scrollable", inputs: { itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, scrollableRole: { classPropertyName: "scrollableRole", publicName: "scrollableRole", isSignal: true, isRequired: false, transformFunction: null }, scrollableClass: { classPropertyName: "scrollableClass", publicName: "scrollableClass", isSignal: true, isRequired: false, transformFunction: null }, renderNavigation: { classPropertyName: "renderNavigation", publicName: "renderNavigation", isSignal: true, isRequired: false, transformFunction: null }, renderMasks: { classPropertyName: "renderMasks", publicName: "renderMasks", isSignal: true, isRequired: false, transformFunction: null }, renderButtons: { classPropertyName: "renderButtons", publicName: "renderButtons", isSignal: true, isRequired: false, transformFunction: null }, buttonPosition: { classPropertyName: "buttonPosition", publicName: "buttonPosition", isSignal: true, isRequired: false, transformFunction: null }, renderScrollbars: { classPropertyName: "renderScrollbars", publicName: "renderScrollbars", isSignal: true, isRequired: false, transformFunction: null }, stickyButtons: { classPropertyName: "stickyButtons", publicName: "stickyButtons", isSignal: true, isRequired: false, transformFunction: null }, cursorDragScroll: { classPropertyName: "cursorDragScroll", publicName: "cursorDragScroll", isSignal: true, isRequired: false, transformFunction: null }, disableActiveElementScrolling: { classPropertyName: "disableActiveElementScrolling", publicName: "disableActiveElementScrolling", isSignal: true, isRequired: false, transformFunction: null }, scrollMode: { classPropertyName: "scrollMode", publicName: "scrollMode", isSignal: true, isRequired: false, transformFunction: null }, snap: { classPropertyName: "snap", publicName: "snap", isSignal: true, isRequired: false, transformFunction: null }, scrollMargin: { classPropertyName: "scrollMargin", publicName: "scrollMargin", isSignal: true, isRequired: false, transformFunction: null }, scrollOrigin: { classPropertyName: "scrollOrigin", publicName: "scrollOrigin", isSignal: true, isRequired: false, transformFunction: null }, darkenNonIntersectingItems: { classPropertyName: "darkenNonIntersectingItems", publicName: "darkenNonIntersectingItems", isSignal: true, isRequired: false, transformFunction: null }, showLoadingTemplate: { classPropertyName: "showLoadingTemplate", publicName: "showLoadingTemplate", isSignal: true, isRequired: false, transformFunction: null }, loadingTemplatePosition: { classPropertyName: "loadingTemplatePosition", publicName: "loadingTemplatePosition", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { intersectionChange: "intersectionChange", scrollStateChange: "scrollStateChange" }, host: { classAttribute: "et-scrollable" }, providers: [provideIcons(CHEVRON_ICON), provideBreakpointInstance(ScrollableComponent)], queries: [{ propertyName: "activeElementList", predicate: SCROLLABLE_IS_ACTIVE_CHILD_TOKEN, descendants: true, isSignal: true }, { propertyName: "loadingTemplate", first: true, predicate: SCROLLABLE_LOADING_TEMPLATE_TOKEN, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "scrollable", first: true, predicate: ["scrollable"], descendants: true, isSignal: true }, { propertyName: "scrollObserver", first: true, predicate: ScrollObserverDirective, descendants: true, isSignal: true }, { propertyName: "navigationDotsContainer", first: true, predicate: ["navigationDotsContainer"], descendants: true, isSignal: true }, { propertyName: "firstNavigationDot", first: true, predicate: ["navigationDot"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"et-scrollable-wrapper\">\n <div\n #scrollable\n [attr.role]=\"scrollableRole() ?? undefined\"\n [ngClass]=\"scrollableClass()\"\n class=\"et-scrollable-container\"\n etScrollObserver\n >\n <div #firstElement class=\"et-scroll-observer-first-element\" etScrollObserverStart etScrollableIgnoreChild></div>\n @if (loadingTemplatePosition() === 'start' && showLoadingTemplate()) {\n <ng-container *ngTemplateOutlet=\"loadingTpl\" />\n }\n <ng-content />\n @if (loadingTemplatePosition() === 'end' && showLoadingTemplate()) {\n <ng-container *ngTemplateOutlet=\"loadingTpl\" />\n }\n\n <div #lastElement class=\"et-scroll-observer-last-element\" etScrollObserverEnd etScrollableIgnoreChild></div>\n </div>\n\n @if (renderMasks()) {\n <div 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\n @if (renderButtonsInside()) {\n <div class=\"et-scrollable-buttons\">\n <ng-container *ngTemplateOutlet=\"forwardButtonTpl\" />\n <ng-container *ngTemplateOutlet=\"backwardButtonTpl\" />\n </div>\n }\n</div>\n\n@if ((renderButtonsInFooter() || (renderNavigation() && scrollableNavigation().items.length > 1)) && canScroll()) {\n <div\n [ngClass]=\"{\n 'et-scrollable-footer--with-navigation': renderNavigation(),\n 'et-scrollable-footer--with-buttons': renderButtonsInFooter(),\n }\"\n class=\"et-scrollable-footer\"\n aria-hidden=\"true\"\n >\n @if (renderButtonsInFooter()) {\n <ng-container *ngTemplateOutlet=\"forwardButtonTpl\" />\n }\n\n @if (renderNavigation()) {\n <div class=\"et-scrollable-progress-bar\">\n <div #navigationDotsContainer class=\"et-scrollable-dots-container\">\n @for (item of scrollableNavigation().items; track i; let i = $index) {\n <button\n #navigationDot\n [class.et-scrollable-navigation-item--active]=\"item.isActive\"\n [class.et-scrollable-navigation-item--close]=\"\n scrollableNavigation().items[i + 1]?.isActive || scrollableNavigation().items[i - 1]?.isActive\n \"\n [class.et-scrollable-navigation-item--far]=\"\n !scrollableNavigation().items[i + 1]?.isActive &&\n !scrollableNavigation().items[i - 1]?.isActive &&\n !item.isActive\n \"\n [attr.active-offset]=\"item.activeOffset\"\n (click)=\"scrollToElementViaNavigation(i)\"\n class=\"et-scrollable-navigation-item\"\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n ></button>\n }\n </div>\n </div>\n }\n\n @if (renderButtonsInFooter()) {\n <ng-container *ngTemplateOutlet=\"backwardButtonTpl\" />\n }\n </div>\n}\n\n<ng-template #forwardButtonTpl>\n <button\n [disabled]=\"isAtStart()\"\n (click)=\"scrollToStartDirection()\"\n class=\"et-scrollable-button et-scrollable-button--start\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n</ng-template>\n\n<ng-template #backwardButtonTpl>\n <button\n [disabled]=\"isAtEnd()\"\n (click)=\"scrollToEndDirection()\"\n class=\"et-scrollable-button et-scrollable-button--end\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n</ng-template>\n\n<ng-template #loadingTpl>\n @if (loadingTemplate(); as tpl) {\n @for (\n _ of tpl.repeat();\n track index;\n let index = $index;\n let even = $even;\n let odd = $odd;\n let first = $first;\n let last = $last\n ) {\n <ng-container *ngTemplateOutlet=\"tpl.templateRef; context: { index, even, odd, first, last }\" />\n }\n }\n</ng-template>\n", styles: [":where(.et-scrollable){--mask: #121212 0, transparent 100%;--mask-size: 25px;--darken-non-intersecting-items-amount: .75;--_auto-size: min-content;display:block;position:relative}.et-scrollable .et-scrollable-wrapper{display:grid;position:relative;block-size:100%;inline-size:100%}.et-scrollable[item-size=same]{--_auto-size: 1fr}.et-scrollable[item-size=half]{--_auto-size: calc((100% - var(--item-gap)) / 2)}.et-scrollable[item-size=third]{--_auto-size: calc((100% - (var(--item-gap) * 2)) / 3)}.et-scrollable[item-size=quarter]{--_auto-size: calc((100% - (var(--item-gap) * 3)) / 4)}.et-scrollable[item-size=full]{--_auto-size: 100%}.et-scrollable[render-scrollbars=false] .et-scrollable-container,.et-scrollable:not([render-scrollbars]) .et-scrollable-container{scrollbar-width:none}.et-scrollable[render-scrollbars=false] .et-scrollable-container::-webkit-scrollbar,.et-scrollable:not([render-scrollbars]) .et-scrollable-container::-webkit-scrollbar{display:none}.et-scrollable .et-scrollable-button .et-icon--et-chevron{display:block}.et-scrollable[direction=horizontal] .et-scrollable-container,.et-scrollable:not([direction]) .et-scrollable-container{grid-auto-flow:column;grid-auto-columns:var(--_auto-size);overflow-x:auto;overflow-y:hidden}.et-scrollable[direction=horizontal] .et-scrollable-container>:nth-child(2),.et-scrollable:not([direction]) .et-scrollable-container>:nth-child(2){grid-column:1/1;grid-row:1/1}.et-scrollable[direction=horizontal] .et-scrollable-container>:nth-last-child(2),.et-scrollable:not([direction]) .et-scrollable-container>:nth-last-child(2){grid-column:var(--item-count)/var(--item-count);grid-row:1/1}.et-scrollable[direction=horizontal] .et-scrollable-mask,.et-scrollable[direction=horizontal] .et-scrollable-button,.et-scrollable:not([direction]) .et-scrollable-mask,.et-scrollable:not([direction]) .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,.et-scrollable:not([direction]) .et-scrollable-mask--start,.et-scrollable:not([direction]) .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,.et-scrollable:not([direction]) .et-scrollable-mask--end,.et-scrollable:not([direction]) .et-scrollable-button--end{inset-block-start:0;inset-inline:calc(100% - 40px) 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--start,.et-scrollable:not([direction]) .et-scrollable-mask--start{background:linear-gradient(to right,var(--mask))}.et-scrollable[direction=horizontal] .et-scrollable-mask--end,.et-scrollable:not([direction]) .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,.et-scrollable:not([direction]) .et-scrollable-button--start{inset-block-start:calc(50% - 20px);transform:translate(-10px)}.et-scrollable[direction=horizontal] .et-scrollable-button--start .et-icon--et-chevron,.et-scrollable:not([direction]) .et-scrollable-button--start .et-icon--et-chevron{transform:rotate(-90deg)}.et-scrollable[direction=horizontal] .et-scrollable-button--end,.et-scrollable:not([direction]) .et-scrollable-button--end{inset-block-start:calc(50% - 20px);transform:translate(10px)}.et-scrollable[direction=horizontal] .et-scrollable-button--end .et-icon--et-chevron,.et-scrollable:not([direction]) .et-scrollable-button--end .et-icon--et-chevron{transform:rotate(90deg)}.et-scrollable[direction=horizontal] .et-scroll-observer-first-element,.et-scrollable[direction=horizontal] .et-scroll-observer-last-element,.et-scrollable:not([direction]) .et-scroll-observer-first-element,.et-scrollable:not([direction]) .et-scroll-observer-last-element{block-size:100%;inline-size:1px}.et-scrollable[direction=horizontal] .et-scroll-observer-first-element,.et-scrollable:not([direction]) .et-scroll-observer-first-element{margin-inline-start:3px;grid-column:1/1;grid-row:1/1}.et-scrollable[direction=horizontal] .et-scroll-observer-last-element,.et-scrollable:not([direction]) .et-scroll-observer-last-element{margin-inline-end:3px;grid-column:var(--item-count)/var(--item-count);grid-row:1/1;justify-self:end}.et-scrollable[direction=vertical] .et-scrollable-container{grid-auto-flow:row;grid-auto-rows:var(--_auto-size);overflow-x:hidden;overflow-y:auto}.et-scrollable[direction=vertical] .et-scrollable-container>:nth-child(2){grid-row:1/1;grid-column:1/1}.et-scrollable[direction=vertical] .et-scrollable-container>:nth-last-child(2){grid-row:var(--item-count)/var(--item-count);grid-column:1/1}.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[direction=vertical] .et-scrollable-button--start{inset-inline-start:calc(50% - 20px);transform:translateY(-10px)}.et-scrollable[direction=vertical] .et-scrollable-button--start .et-icon--et-chevron{transform:rotate(0)}.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-inline-start:calc(50% - 20px);transform:translateY(10px)}.et-scrollable[direction=vertical] .et-scrollable-button--end .et-icon--et-chevron{transform:rotate(180deg)}.et-scrollable[direction=vertical] .et-scroll-observer-first-element,.et-scrollable[direction=vertical] .et-scroll-observer-last-element{inline-size:100%;block-size:1px}.et-scrollable[direction=vertical] .et-scroll-observer-first-element{margin-block-start:3px;grid-row:1/1;grid-column:1/1}.et-scrollable[direction=vertical] .et-scroll-observer-last-element{margin-block-end:3px;grid-row:var(--item-count)/var(--item-count);grid-column:1/1;align-self:end}.et-scrollable[direction=vertical]:has(.et-scrollable-footer){display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-rows:minmax(0,1fr);gap:10px}.et-scrollable[direction=vertical] .et-scrollable-footer{flex-direction:column;margin-block-start:0}.et-scrollable[direction=vertical] .et-scrollable-progress-bar{flex-direction:column;max-block-size:100px}.et-scrollable[direction=vertical] .et-scrollable-dots-container{flex-direction:column}.et-scrollable.et-scrollable--can-scroll:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{opacity:1;transform:translate(0);pointer-events:all}.et-scrollable.et-scrollable--can-scroll.et-scrollable--has-partial-items:not(.et-scrollable--is-at-start) .et-scrollable-masks .et-scrollable-mask--start{opacity:1;transform:translate(0)}.et-scrollable.et-scrollable--can-scroll:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{opacity:1;transform:translate(0);pointer-events:all}.et-scrollable.et-scrollable--can-scroll.et-scrollable--has-partial-items:not(.et-scrollable--is-at-end) .et-scrollable-masks .et-scrollable-mask--end{opacity:1;transform:translate(0)}.et-scrollable .et-scroll-observer-first-element,.et-scrollable .et-scroll-observer-last-element{pointer-events:none}.et-scrollable .et-scrollable-container{display:grid;position:relative;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}.et-scrollable.et-scrollable--can-animate .et-scrollable-dots-container{transition:transform .3s var(--ease-5)}.et-scrollable.et-scrollable--can-animate .et-scrollable-navigation-item:after{transition:background-color .2s linear,transform .2s linear}.et-scrollable.et-scrollable--can-animate.et-scrollable--can-scroll .et-scrollable-mask{transition:opacity .3s var(--ease-5)}.et-scrollable.et-scrollable--can-animate.et-scrollable--can-scroll .et-scrollable-button{transition:opacity .3s var(--ease-5),transform .3s var(--ease-5)}.et-scrollable.et-scrollable--can-animate.et-scrollable--darken-non-intersecting-items .et-scrollable-item{transition:opacity .3s var(--ease-5)}.et-scrollable.et-scrollable--darken-non-intersecting-items .et-scrollable-item--not-intersecting{opacity:var(--darken-non-intersecting-items-amount)}.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-icon--et-chevron{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]{--_sticky-margin: 10%}.et-scrollable[sticky-buttons=true] .et-scrollable-button{position:sticky}.et-scrollable[sticky-buttons=true][direction=horizontal] .et-scrollable-buttons{margin-block:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons{margin-inline:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons .et-scrollable-button--end{inset-block-start:100%}.et-scrollable .et-scrollable-footer{display:flex;justify-content:center;align-items:center;gap:10px;margin-block-start:10px}.et-scrollable .et-scrollable-footer.et-scrollable-footer--with-buttons .et-scrollable-button{transform:none}.et-scrollable .et-scrollable-footer .et-scrollable-button{width:30px;height:30px}.et-scrollable .et-scrollable-navigation-item{display:flex;justify-content:center;align-items:center;border:none;padding:0;inline-size:20px;block-size:20px;border-radius:50%;cursor:pointer;background-color:transparent}.et-scrollable .et-scrollable-navigation-item.et-scrollable-navigation-item--active:after{background-color:#c6c6c6}.et-scrollable .et-scrollable-navigation-item:after{content:\"\";display:block;inline-size:50%;block-size:50%;border-radius:50%;background-color:#4b4b4b;transform:scale(0)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"0\"]:after{transform:scale(1)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"1\"]:after{transform:scale(.75)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"2\"]:after{transform:scale(.6)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"3\"]:after{transform:scale(.5)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"4\"]:after{transform:scale(.4)}.et-scrollable .et-scrollable-progress-bar{overflow:hidden;max-inline-size:100px;display:flex;align-items:center}.et-scrollable .et-scrollable-progress-bar .et-scrollable-dots-container{display:flex;flex-wrap:nowrap}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: ScrollableIgnoreChildDirective, selector: "[etScrollableIgnoreChild]", inputs: ["etScrollableIgnoreChild"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "allowHardcodedColor"] }, { kind: "directive", type: ScrollObserverDirective, selector: "[etScrollObserver]", inputs: ["enabled"], outputs: ["enabledChange"], exportAs: ["etScrollObserver"] }, { kind: "directive", type: ScrollObserverStartDirective, selector: "[etScrollObserverStart]" }, { kind: "directive", type: ScrollObserverEndDirective, selector: "[etScrollObserverEnd]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
9605
9350
  }
9606
9351
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: ScrollableComponent, decorators: [{
9607
9352
  type: Component,
9608
- args: [{ selector: 'et-scrollable', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgClass, ScrollableIgnoreChildDirective, NgTemplateOutlet, IconDirective], host: {
9353
+ args: [{ selector: 'et-scrollable', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
9354
+ NgClass,
9355
+ ScrollableIgnoreChildDirective,
9356
+ NgTemplateOutlet,
9357
+ IconDirective,
9358
+ ScrollObserverDirective,
9359
+ ScrollObserverStartDirective,
9360
+ ScrollObserverEndDirective,
9361
+ ], host: {
9609
9362
  class: 'et-scrollable',
9610
- }, providers: [provideIcons(CHEVRON_ICON)], template: "<div class=\"et-scrollable-wrapper\">\n <div\n #scrollable\n [attr.role]=\"scrollableRole() ?? undefined\"\n [ngClass]=\"scrollableClass()\"\n class=\"et-scrollable-container\"\n >\n <div #firstElement class=\"et-scroll-observer-first-element\" etScrollableIgnoreChild></div>\n @if (loadingTemplatePosition() === 'start' && showLoadingTemplate()) {\n <ng-container *ngTemplateOutlet=\"loadingTpl\" />\n }\n <ng-content />\n @if (loadingTemplatePosition() === 'end' && showLoadingTemplate()) {\n <ng-container *ngTemplateOutlet=\"loadingTpl\" />\n }\n\n <div #lastElement class=\"et-scroll-observer-last-element\" etScrollableIgnoreChild></div>\n </div>\n\n @if (renderMasks()) {\n <div 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\n @if (renderButtonsInside()) {\n <div class=\"et-scrollable-buttons\">\n <ng-container *ngTemplateOutlet=\"forwardButtonTpl\" />\n <ng-container *ngTemplateOutlet=\"backwardButtonTpl\" />\n </div>\n }\n</div>\n\n@if ((renderButtonsInFooter() || (renderNavigation() && scrollableNavigation().length > 1)) && canScroll()) {\n <div\n [ngClass]=\"{\n 'et-scrollable-footer--with-navigation': renderNavigation(),\n 'et-scrollable-footer--with-buttons': renderButtonsInFooter(),\n }\"\n class=\"et-scrollable-footer\"\n aria-hidden=\"true\"\n >\n @if (renderButtonsInFooter()) {\n <ng-container *ngTemplateOutlet=\"forwardButtonTpl\" />\n }\n\n @if (renderNavigation()) {\n <div class=\"et-scrollable-progress-bar\">\n <div #navigationDotsContainer class=\"et-scrollable-dots-container\">\n @for (item of scrollableNavigation(); track i; let i = $index) {\n <button\n #navigationDot\n [class.et-scrollable-navigation-item--active]=\"item.isActive\"\n [class.et-scrollable-navigation-item--close]=\"\n scrollableNavigation()[i + 1]?.isActive || scrollableNavigation()[i - 1]?.isActive\n \"\n [class.et-scrollable-navigation-item--far]=\"\n !scrollableNavigation()[i + 1]?.isActive && !scrollableNavigation()[i - 1]?.isActive && !item.isActive\n \"\n [attr.active-offset]=\"item.activeOffset\"\n (click)=\"scrollToElementViaNavigation(i)\"\n class=\"et-scrollable-navigation-item\"\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n ></button>\n }\n </div>\n </div>\n }\n\n @if (renderButtonsInFooter()) {\n <ng-container *ngTemplateOutlet=\"backwardButtonTpl\" />\n }\n </div>\n}\n\n<ng-template #forwardButtonTpl>\n <button\n [disabled]=\"isAtStart()\"\n (click)=\"scrollToStartDirection()\"\n class=\"et-scrollable-button et-scrollable-button--start\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n</ng-template>\n\n<ng-template #backwardButtonTpl>\n <button\n [disabled]=\"isAtEnd()\"\n (click)=\"scrollToEndDirection()\"\n class=\"et-scrollable-button et-scrollable-button--end\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n</ng-template>\n\n<ng-template #loadingTpl>\n @if (loadingTemplate(); as tpl) {\n @for (\n _ of tpl.repeat();\n track index;\n let index = $index;\n let even = $even;\n let odd = $odd;\n let first = $first;\n let last = $last\n ) {\n <ng-container *ngTemplateOutlet=\"tpl.templateRef; context: { index, even, odd, first, last }\" />\n }\n }\n</ng-template>\n", styles: [":where(.et-scrollable){--mask: #121212 0, transparent 100%;--mask-size: 25px;--darken-non-intersecting-items-amount: .75;--_auto-size: min-content;display:block}.et-scrollable .et-scrollable-wrapper{display:grid;position:relative;block-size:100%;inline-size:100%}.et-scrollable[item-size=same]{--_auto-size: 1fr}.et-scrollable[item-size=half]{--_auto-size: calc((100% - var(--item-gap)) / 2)}.et-scrollable[item-size=third]{--_auto-size: calc((100% - (var(--item-gap) * 2)) / 3)}.et-scrollable[item-size=quarter]{--_auto-size: calc((100% - (var(--item-gap) * 3)) / 4)}.et-scrollable[item-size=full]{--_auto-size: 100%}.et-scrollable[render-scrollbars=false] .et-scrollable-container,.et-scrollable:not([render-scrollbars]) .et-scrollable-container{scrollbar-width:none}.et-scrollable[render-scrollbars=false] .et-scrollable-container::-webkit-scrollbar,.et-scrollable:not([render-scrollbars]) .et-scrollable-container::-webkit-scrollbar{display:none}.et-scrollable .et-scrollable-button .et-icon--et-chevron{display:block}.et-scrollable[direction=horizontal] .et-scrollable-container,.et-scrollable:not([direction]) .et-scrollable-container{grid-auto-flow:column;grid-auto-columns:var(--_auto-size);overflow-x:auto;overflow-y:hidden}.et-scrollable[direction=horizontal] .et-scrollable-container>:nth-child(2),.et-scrollable:not([direction]) .et-scrollable-container>:nth-child(2){grid-column:1/1;grid-row:1/1}.et-scrollable[direction=horizontal] .et-scrollable-container>:nth-last-child(2),.et-scrollable:not([direction]) .et-scrollable-container>:nth-last-child(2){grid-column:var(--item-count)/var(--item-count);grid-row:1/1}.et-scrollable[direction=horizontal] .et-scrollable-mask,.et-scrollable[direction=horizontal] .et-scrollable-button,.et-scrollable:not([direction]) .et-scrollable-mask,.et-scrollable:not([direction]) .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,.et-scrollable:not([direction]) .et-scrollable-mask--start,.et-scrollable:not([direction]) .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,.et-scrollable:not([direction]) .et-scrollable-mask--end,.et-scrollable:not([direction]) .et-scrollable-button--end{inset-block-start:0;inset-inline:calc(100% - 40px) 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--start,.et-scrollable:not([direction]) .et-scrollable-mask--start{background:linear-gradient(to right,var(--mask))}.et-scrollable[direction=horizontal] .et-scrollable-mask--end,.et-scrollable:not([direction]) .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,.et-scrollable:not([direction]) .et-scrollable-button--start{inset-block-start:calc(50% - 20px);transform:translate(-10px)}.et-scrollable[direction=horizontal] .et-scrollable-button--start .et-icon--et-chevron,.et-scrollable:not([direction]) .et-scrollable-button--start .et-icon--et-chevron{transform:rotate(-90deg)}.et-scrollable[direction=horizontal] .et-scrollable-button--end,.et-scrollable:not([direction]) .et-scrollable-button--end{inset-block-start:calc(50% - 20px);transform:translate(10px)}.et-scrollable[direction=horizontal] .et-scrollable-button--end .et-icon--et-chevron,.et-scrollable:not([direction]) .et-scrollable-button--end .et-icon--et-chevron{transform:rotate(90deg)}.et-scrollable[direction=horizontal] .et-scroll-observer-first-element,.et-scrollable[direction=horizontal] .et-scroll-observer-last-element,.et-scrollable:not([direction]) .et-scroll-observer-first-element,.et-scrollable:not([direction]) .et-scroll-observer-last-element{block-size:100%;inline-size:1px}.et-scrollable[direction=horizontal] .et-scroll-observer-first-element,.et-scrollable:not([direction]) .et-scroll-observer-first-element{margin-inline-start:3px;grid-column:1/1;grid-row:1/1}.et-scrollable[direction=horizontal] .et-scroll-observer-last-element,.et-scrollable:not([direction]) .et-scroll-observer-last-element{margin-inline-end:3px;grid-column:var(--item-count)/var(--item-count);grid-row:1/1;justify-self:end}.et-scrollable[direction=vertical] .et-scrollable-container{grid-auto-flow:row;grid-auto-rows:var(--_auto-size);overflow-x:hidden;overflow-y:auto}.et-scrollable[direction=vertical] .et-scrollable-container>:nth-child(2){grid-row:1/1;grid-column:1/1}.et-scrollable[direction=vertical] .et-scrollable-container>:nth-last-child(2){grid-row:var(--item-count)/var(--item-count);grid-column:1/1}.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[direction=vertical] .et-scrollable-button--start{inset-inline-start:calc(50% - 20px);transform:translateY(-10px)}.et-scrollable[direction=vertical] .et-scrollable-button--start .et-icon--et-chevron{transform:rotate(0)}.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-inline-start:calc(50% - 20px);transform:translateY(10px)}.et-scrollable[direction=vertical] .et-scrollable-button--end .et-icon--et-chevron{transform:rotate(180deg)}.et-scrollable[direction=vertical] .et-scroll-observer-first-element,.et-scrollable[direction=vertical] .et-scroll-observer-last-element{inline-size:100%;block-size:1px}.et-scrollable[direction=vertical] .et-scroll-observer-first-element{margin-block-start:3px;grid-row:1/1;grid-column:1/1}.et-scrollable[direction=vertical] .et-scroll-observer-last-element{margin-block-end:3px;grid-row:var(--item-count)/var(--item-count);grid-column:1/1;align-self:end}.et-scrollable[direction=vertical]:has(.et-scrollable-footer){display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-rows:minmax(0,1fr);gap:10px}.et-scrollable[direction=vertical] .et-scrollable-footer{flex-direction:column;margin-block-start:0}.et-scrollable[direction=vertical] .et-scrollable-progress-bar{flex-direction:column;max-block-size:100px}.et-scrollable[direction=vertical] .et-scrollable-dots-container{flex-direction:column}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-masks .et-scrollable-mask--start,.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{opacity:1;transform:translate(0)}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{pointer-events:all}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-masks .et-scrollable-mask--end,.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{opacity:1;transform:translate(0)}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{pointer-events:all}.et-scrollable .et-scroll-observer-first-element,.et-scrollable .et-scroll-observer-last-element{pointer-events:none}.et-scrollable .et-scrollable-container{display:grid;position:relative;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}.et-scrollable.et-scrollable--can-animate .et-scrollable-dots-container{transition:transform .3s var(--ease-5)}.et-scrollable.et-scrollable--can-animate .et-scrollable-navigation-item:after{transition:background-color .2s linear,transform .2s linear}.et-scrollable.et-scrollable--can-animate.et-scrollable--can-scroll .et-scrollable-mask{transition:opacity .3s var(--ease-5)}.et-scrollable.et-scrollable--can-animate.et-scrollable--can-scroll .et-scrollable-button{transition:opacity .3s var(--ease-5),transform .3s var(--ease-5)}.et-scrollable.et-scrollable--can-animate.et-scrollable--darken-non-intersecting-items .et-scrollable-item{transition:opacity .3s var(--ease-5)}.et-scrollable.et-scrollable--darken-non-intersecting-items .et-scrollable-item--not-intersecting{opacity:var(--darken-non-intersecting-items-amount)}.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-icon--et-chevron{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]{--_sticky-margin: 10%}.et-scrollable[sticky-buttons=true] .et-scrollable-button{position:sticky}.et-scrollable[sticky-buttons=true][direction=horizontal] .et-scrollable-buttons{margin-block:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons{margin-inline:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons .et-scrollable-button--end{inset-block-start:100%}.et-scrollable .et-scrollable-footer{display:flex;justify-content:center;align-items:center;gap:10px;margin-block-start:10px}.et-scrollable .et-scrollable-footer.et-scrollable-footer--with-buttons .et-scrollable-button{transform:none}.et-scrollable .et-scrollable-footer .et-scrollable-button{width:30px;height:30px}.et-scrollable .et-scrollable-navigation-item{display:flex;justify-content:center;align-items:center;border:none;padding:0;inline-size:20px;block-size:20px;border-radius:50%;cursor:pointer;background-color:transparent}.et-scrollable .et-scrollable-navigation-item.et-scrollable-navigation-item--active:after{background-color:#c6c6c6}.et-scrollable .et-scrollable-navigation-item:after{content:\"\";display:block;inline-size:50%;block-size:50%;border-radius:50%;background-color:#4b4b4b;transform:scale(0)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"0\"]:after{transform:scale(1)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"1\"]:after{transform:scale(.75)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"2\"]:after{transform:scale(.6)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"3\"]:after{transform:scale(.5)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"4\"]:after{transform:scale(.4)}.et-scrollable .et-scrollable-progress-bar{overflow:hidden;max-inline-size:100px;display:flex;align-items:center}.et-scrollable .et-scrollable-progress-bar .et-scrollable-dots-container{display:flex;flex-wrap:nowrap}\n"] }]
9611
- }], ctorParameters: () => [], propDecorators: { itemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemSize", required: false }] }], direction: [{ type: i0.Input, args: [{ isSignal: true, alias: "direction", required: false }] }], scrollableRole: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollableRole", required: false }] }], scrollableClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollableClass", required: false }] }], renderNavigation: [{ type: i0.Input, args: [{ isSignal: true, alias: "renderNavigation", required: false }] }], renderMasks: [{ type: i0.Input, args: [{ isSignal: true, alias: "renderMasks", required: false }] }], renderButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "renderButtons", required: false }] }], buttonPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "buttonPosition", required: false }] }], renderScrollbars: [{ type: i0.Input, args: [{ isSignal: true, alias: "renderScrollbars", required: false }] }], stickyButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "stickyButtons", required: false }] }], cursorDragScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "cursorDragScroll", required: false }] }], disableActiveElementScrolling: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableActiveElementScrolling", required: false }] }], scrollMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollMode", required: false }] }], snap: [{ type: i0.Input, args: [{ isSignal: true, alias: "snap", required: false }] }], scrollMargin: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollMargin", required: false }] }], scrollOrigin: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollOrigin", required: false }] }], darkenNonIntersectingItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "darkenNonIntersectingItems", required: false }] }], showLoadingTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLoadingTemplate", required: false }] }], loadingTemplatePosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingTemplatePosition", required: false }] }], scrollable: [{ type: i0.ViewChild, args: ['scrollable', { isSignal: true }] }], firstElement: [{ type: i0.ViewChild, args: ['firstElement', { isSignal: true }] }], lastElement: [{ type: i0.ViewChild, args: ['lastElement', { isSignal: true }] }], activeElementList: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SCROLLABLE_IS_ACTIVE_CHILD_TOKEN), { ...{ descendants: true }, isSignal: true }] }], navigationDotsContainer: [{ type: i0.ViewChild, args: ['navigationDotsContainer', { isSignal: true }] }], firstNavigationDot: [{ type: i0.ViewChild, args: ['navigationDot', { isSignal: true }] }], loadingTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SCROLLABLE_LOADING_TEMPLATE_TOKEN), { isSignal: true }] }], intersectionChange: [{ type: i0.Output, args: ["intersectionChange"] }], scrollStateChange: [{ type: i0.Output, args: ["scrollStateChange"] }] } });
9363
+ }, providers: [provideIcons(CHEVRON_ICON), provideBreakpointInstance(ScrollableComponent)], template: "<div class=\"et-scrollable-wrapper\">\n <div\n #scrollable\n [attr.role]=\"scrollableRole() ?? undefined\"\n [ngClass]=\"scrollableClass()\"\n class=\"et-scrollable-container\"\n etScrollObserver\n >\n <div #firstElement class=\"et-scroll-observer-first-element\" etScrollObserverStart etScrollableIgnoreChild></div>\n @if (loadingTemplatePosition() === 'start' && showLoadingTemplate()) {\n <ng-container *ngTemplateOutlet=\"loadingTpl\" />\n }\n <ng-content />\n @if (loadingTemplatePosition() === 'end' && showLoadingTemplate()) {\n <ng-container *ngTemplateOutlet=\"loadingTpl\" />\n }\n\n <div #lastElement class=\"et-scroll-observer-last-element\" etScrollObserverEnd etScrollableIgnoreChild></div>\n </div>\n\n @if (renderMasks()) {\n <div 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\n @if (renderButtonsInside()) {\n <div class=\"et-scrollable-buttons\">\n <ng-container *ngTemplateOutlet=\"forwardButtonTpl\" />\n <ng-container *ngTemplateOutlet=\"backwardButtonTpl\" />\n </div>\n }\n</div>\n\n@if ((renderButtonsInFooter() || (renderNavigation() && scrollableNavigation().items.length > 1)) && canScroll()) {\n <div\n [ngClass]=\"{\n 'et-scrollable-footer--with-navigation': renderNavigation(),\n 'et-scrollable-footer--with-buttons': renderButtonsInFooter(),\n }\"\n class=\"et-scrollable-footer\"\n aria-hidden=\"true\"\n >\n @if (renderButtonsInFooter()) {\n <ng-container *ngTemplateOutlet=\"forwardButtonTpl\" />\n }\n\n @if (renderNavigation()) {\n <div class=\"et-scrollable-progress-bar\">\n <div #navigationDotsContainer class=\"et-scrollable-dots-container\">\n @for (item of scrollableNavigation().items; track i; let i = $index) {\n <button\n #navigationDot\n [class.et-scrollable-navigation-item--active]=\"item.isActive\"\n [class.et-scrollable-navigation-item--close]=\"\n scrollableNavigation().items[i + 1]?.isActive || scrollableNavigation().items[i - 1]?.isActive\n \"\n [class.et-scrollable-navigation-item--far]=\"\n !scrollableNavigation().items[i + 1]?.isActive &&\n !scrollableNavigation().items[i - 1]?.isActive &&\n !item.isActive\n \"\n [attr.active-offset]=\"item.activeOffset\"\n (click)=\"scrollToElementViaNavigation(i)\"\n class=\"et-scrollable-navigation-item\"\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n ></button>\n }\n </div>\n </div>\n }\n\n @if (renderButtonsInFooter()) {\n <ng-container *ngTemplateOutlet=\"backwardButtonTpl\" />\n }\n </div>\n}\n\n<ng-template #forwardButtonTpl>\n <button\n [disabled]=\"isAtStart()\"\n (click)=\"scrollToStartDirection()\"\n class=\"et-scrollable-button et-scrollable-button--start\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n</ng-template>\n\n<ng-template #backwardButtonTpl>\n <button\n [disabled]=\"isAtEnd()\"\n (click)=\"scrollToEndDirection()\"\n class=\"et-scrollable-button et-scrollable-button--end\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n</ng-template>\n\n<ng-template #loadingTpl>\n @if (loadingTemplate(); as tpl) {\n @for (\n _ of tpl.repeat();\n track index;\n let index = $index;\n let even = $even;\n let odd = $odd;\n let first = $first;\n let last = $last\n ) {\n <ng-container *ngTemplateOutlet=\"tpl.templateRef; context: { index, even, odd, first, last }\" />\n }\n }\n</ng-template>\n", styles: [":where(.et-scrollable){--mask: #121212 0, transparent 100%;--mask-size: 25px;--darken-non-intersecting-items-amount: .75;--_auto-size: min-content;display:block;position:relative}.et-scrollable .et-scrollable-wrapper{display:grid;position:relative;block-size:100%;inline-size:100%}.et-scrollable[item-size=same]{--_auto-size: 1fr}.et-scrollable[item-size=half]{--_auto-size: calc((100% - var(--item-gap)) / 2)}.et-scrollable[item-size=third]{--_auto-size: calc((100% - (var(--item-gap) * 2)) / 3)}.et-scrollable[item-size=quarter]{--_auto-size: calc((100% - (var(--item-gap) * 3)) / 4)}.et-scrollable[item-size=full]{--_auto-size: 100%}.et-scrollable[render-scrollbars=false] .et-scrollable-container,.et-scrollable:not([render-scrollbars]) .et-scrollable-container{scrollbar-width:none}.et-scrollable[render-scrollbars=false] .et-scrollable-container::-webkit-scrollbar,.et-scrollable:not([render-scrollbars]) .et-scrollable-container::-webkit-scrollbar{display:none}.et-scrollable .et-scrollable-button .et-icon--et-chevron{display:block}.et-scrollable[direction=horizontal] .et-scrollable-container,.et-scrollable:not([direction]) .et-scrollable-container{grid-auto-flow:column;grid-auto-columns:var(--_auto-size);overflow-x:auto;overflow-y:hidden}.et-scrollable[direction=horizontal] .et-scrollable-container>:nth-child(2),.et-scrollable:not([direction]) .et-scrollable-container>:nth-child(2){grid-column:1/1;grid-row:1/1}.et-scrollable[direction=horizontal] .et-scrollable-container>:nth-last-child(2),.et-scrollable:not([direction]) .et-scrollable-container>:nth-last-child(2){grid-column:var(--item-count)/var(--item-count);grid-row:1/1}.et-scrollable[direction=horizontal] .et-scrollable-mask,.et-scrollable[direction=horizontal] .et-scrollable-button,.et-scrollable:not([direction]) .et-scrollable-mask,.et-scrollable:not([direction]) .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,.et-scrollable:not([direction]) .et-scrollable-mask--start,.et-scrollable:not([direction]) .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,.et-scrollable:not([direction]) .et-scrollable-mask--end,.et-scrollable:not([direction]) .et-scrollable-button--end{inset-block-start:0;inset-inline:calc(100% - 40px) 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--start,.et-scrollable:not([direction]) .et-scrollable-mask--start{background:linear-gradient(to right,var(--mask))}.et-scrollable[direction=horizontal] .et-scrollable-mask--end,.et-scrollable:not([direction]) .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,.et-scrollable:not([direction]) .et-scrollable-button--start{inset-block-start:calc(50% - 20px);transform:translate(-10px)}.et-scrollable[direction=horizontal] .et-scrollable-button--start .et-icon--et-chevron,.et-scrollable:not([direction]) .et-scrollable-button--start .et-icon--et-chevron{transform:rotate(-90deg)}.et-scrollable[direction=horizontal] .et-scrollable-button--end,.et-scrollable:not([direction]) .et-scrollable-button--end{inset-block-start:calc(50% - 20px);transform:translate(10px)}.et-scrollable[direction=horizontal] .et-scrollable-button--end .et-icon--et-chevron,.et-scrollable:not([direction]) .et-scrollable-button--end .et-icon--et-chevron{transform:rotate(90deg)}.et-scrollable[direction=horizontal] .et-scroll-observer-first-element,.et-scrollable[direction=horizontal] .et-scroll-observer-last-element,.et-scrollable:not([direction]) .et-scroll-observer-first-element,.et-scrollable:not([direction]) .et-scroll-observer-last-element{block-size:100%;inline-size:1px}.et-scrollable[direction=horizontal] .et-scroll-observer-first-element,.et-scrollable:not([direction]) .et-scroll-observer-first-element{margin-inline-start:3px;grid-column:1/1;grid-row:1/1}.et-scrollable[direction=horizontal] .et-scroll-observer-last-element,.et-scrollable:not([direction]) .et-scroll-observer-last-element{margin-inline-end:3px;grid-column:var(--item-count)/var(--item-count);grid-row:1/1;justify-self:end}.et-scrollable[direction=vertical] .et-scrollable-container{grid-auto-flow:row;grid-auto-rows:var(--_auto-size);overflow-x:hidden;overflow-y:auto}.et-scrollable[direction=vertical] .et-scrollable-container>:nth-child(2){grid-row:1/1;grid-column:1/1}.et-scrollable[direction=vertical] .et-scrollable-container>:nth-last-child(2){grid-row:var(--item-count)/var(--item-count);grid-column:1/1}.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[direction=vertical] .et-scrollable-button--start{inset-inline-start:calc(50% - 20px);transform:translateY(-10px)}.et-scrollable[direction=vertical] .et-scrollable-button--start .et-icon--et-chevron{transform:rotate(0)}.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-inline-start:calc(50% - 20px);transform:translateY(10px)}.et-scrollable[direction=vertical] .et-scrollable-button--end .et-icon--et-chevron{transform:rotate(180deg)}.et-scrollable[direction=vertical] .et-scroll-observer-first-element,.et-scrollable[direction=vertical] .et-scroll-observer-last-element{inline-size:100%;block-size:1px}.et-scrollable[direction=vertical] .et-scroll-observer-first-element{margin-block-start:3px;grid-row:1/1;grid-column:1/1}.et-scrollable[direction=vertical] .et-scroll-observer-last-element{margin-block-end:3px;grid-row:var(--item-count)/var(--item-count);grid-column:1/1;align-self:end}.et-scrollable[direction=vertical]:has(.et-scrollable-footer){display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-rows:minmax(0,1fr);gap:10px}.et-scrollable[direction=vertical] .et-scrollable-footer{flex-direction:column;margin-block-start:0}.et-scrollable[direction=vertical] .et-scrollable-progress-bar{flex-direction:column;max-block-size:100px}.et-scrollable[direction=vertical] .et-scrollable-dots-container{flex-direction:column}.et-scrollable.et-scrollable--can-scroll:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{opacity:1;transform:translate(0);pointer-events:all}.et-scrollable.et-scrollable--can-scroll.et-scrollable--has-partial-items:not(.et-scrollable--is-at-start) .et-scrollable-masks .et-scrollable-mask--start{opacity:1;transform:translate(0)}.et-scrollable.et-scrollable--can-scroll:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{opacity:1;transform:translate(0);pointer-events:all}.et-scrollable.et-scrollable--can-scroll.et-scrollable--has-partial-items:not(.et-scrollable--is-at-end) .et-scrollable-masks .et-scrollable-mask--end{opacity:1;transform:translate(0)}.et-scrollable .et-scroll-observer-first-element,.et-scrollable .et-scroll-observer-last-element{pointer-events:none}.et-scrollable .et-scrollable-container{display:grid;position:relative;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}.et-scrollable.et-scrollable--can-animate .et-scrollable-dots-container{transition:transform .3s var(--ease-5)}.et-scrollable.et-scrollable--can-animate .et-scrollable-navigation-item:after{transition:background-color .2s linear,transform .2s linear}.et-scrollable.et-scrollable--can-animate.et-scrollable--can-scroll .et-scrollable-mask{transition:opacity .3s var(--ease-5)}.et-scrollable.et-scrollable--can-animate.et-scrollable--can-scroll .et-scrollable-button{transition:opacity .3s var(--ease-5),transform .3s var(--ease-5)}.et-scrollable.et-scrollable--can-animate.et-scrollable--darken-non-intersecting-items .et-scrollable-item{transition:opacity .3s var(--ease-5)}.et-scrollable.et-scrollable--darken-non-intersecting-items .et-scrollable-item--not-intersecting{opacity:var(--darken-non-intersecting-items-amount)}.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-icon--et-chevron{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]{--_sticky-margin: 10%}.et-scrollable[sticky-buttons=true] .et-scrollable-button{position:sticky}.et-scrollable[sticky-buttons=true][direction=horizontal] .et-scrollable-buttons{margin-block:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons{margin-inline:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons .et-scrollable-button--end{inset-block-start:100%}.et-scrollable .et-scrollable-footer{display:flex;justify-content:center;align-items:center;gap:10px;margin-block-start:10px}.et-scrollable .et-scrollable-footer.et-scrollable-footer--with-buttons .et-scrollable-button{transform:none}.et-scrollable .et-scrollable-footer .et-scrollable-button{width:30px;height:30px}.et-scrollable .et-scrollable-navigation-item{display:flex;justify-content:center;align-items:center;border:none;padding:0;inline-size:20px;block-size:20px;border-radius:50%;cursor:pointer;background-color:transparent}.et-scrollable .et-scrollable-navigation-item.et-scrollable-navigation-item--active:after{background-color:#c6c6c6}.et-scrollable .et-scrollable-navigation-item:after{content:\"\";display:block;inline-size:50%;block-size:50%;border-radius:50%;background-color:#4b4b4b;transform:scale(0)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"0\"]:after{transform:scale(1)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"1\"]:after{transform:scale(.75)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"2\"]:after{transform:scale(.6)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"3\"]:after{transform:scale(.5)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"4\"]:after{transform:scale(.4)}.et-scrollable .et-scrollable-progress-bar{overflow:hidden;max-inline-size:100px;display:flex;align-items:center}.et-scrollable .et-scrollable-progress-bar .et-scrollable-dots-container{display:flex;flex-wrap:nowrap}\n"] }]
9364
+ }], ctorParameters: () => [], propDecorators: { itemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemSize", required: false }] }], direction: [{ type: i0.Input, args: [{ isSignal: true, alias: "direction", required: false }] }], scrollableRole: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollableRole", required: false }] }], scrollableClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollableClass", required: false }] }], renderNavigation: [{ type: i0.Input, args: [{ isSignal: true, alias: "renderNavigation", required: false }] }], renderMasks: [{ type: i0.Input, args: [{ isSignal: true, alias: "renderMasks", required: false }] }], renderButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "renderButtons", required: false }] }], buttonPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "buttonPosition", required: false }] }], renderScrollbars: [{ type: i0.Input, args: [{ isSignal: true, alias: "renderScrollbars", required: false }] }], stickyButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "stickyButtons", required: false }] }], cursorDragScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "cursorDragScroll", required: false }] }], disableActiveElementScrolling: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableActiveElementScrolling", required: false }] }], scrollMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollMode", required: false }] }], snap: [{ type: i0.Input, args: [{ isSignal: true, alias: "snap", required: false }] }], scrollMargin: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollMargin", required: false }] }], scrollOrigin: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollOrigin", required: false }] }], darkenNonIntersectingItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "darkenNonIntersectingItems", required: false }] }], showLoadingTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLoadingTemplate", required: false }] }], loadingTemplatePosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingTemplatePosition", required: false }] }], scrollable: [{ type: i0.ViewChild, args: ['scrollable', { isSignal: true }] }], scrollObserver: [{ type: i0.ViewChild, args: [i0.forwardRef(() => ScrollObserverDirective), { isSignal: true }] }], activeElementList: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SCROLLABLE_IS_ACTIVE_CHILD_TOKEN), { ...{ descendants: true }, isSignal: true }] }], navigationDotsContainer: [{ type: i0.ViewChild, args: ['navigationDotsContainer', { isSignal: true }] }], firstNavigationDot: [{ type: i0.ViewChild, args: ['navigationDot', { isSignal: true }] }], loadingTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SCROLLABLE_LOADING_TEMPLATE_TOKEN), { isSignal: true }] }], intersectionChange: [{ type: i0.Output, args: ["intersectionChange"] }], scrollStateChange: [{ type: i0.Output, args: ["scrollStateChange"] }] } });
9612
9365
 
9613
9366
  const [provideFocusRegistry, injectFocusRegistry] = createRootProvider(() => {
9614
9367
  const registry = signal({}, ...(ngDevMode ? [{ debugName: "registry" }] : []));
@@ -10776,6 +10529,7 @@ class CarouselDirective {
10776
10529
  this.autoPlayTime = input(5000, { ...(ngDevMode ? { debugName: "autoPlayTime" } : {}), transform: numberAttribute });
10777
10530
  this.pauseAutoPlayOnHover = input(true, { ...(ngDevMode ? { debugName: "pauseAutoPlayOnHover" } : {}), transform: booleanAttribute });
10778
10531
  this.pauseAutoPlayOnFocus = input(true, { ...(ngDevMode ? { debugName: "pauseAutoPlayOnFocus" } : {}), transform: booleanAttribute });
10532
+ this.pauseAutoPlayOnHidden = input(true, { ...(ngDevMode ? { debugName: "pauseAutoPlayOnHidden" } : {}), transform: booleanAttribute });
10779
10533
  this.transitionType = input('mask-slide', ...(ngDevMode ? [{ debugName: "transitionType" }] : []));
10780
10534
  this.transitionDuration = input(450, { ...(ngDevMode ? { debugName: "transitionDuration" } : {}), transform: numberAttribute });
10781
10535
  this.activeIndex = signal(0, ...(ngDevMode ? [{ debugName: "activeIndex" }] : []));
@@ -10785,6 +10539,8 @@ class CarouselDirective {
10785
10539
  this.isAutoPlayPaused = signal(false, ...(ngDevMode ? [{ debugName: "isAutoPlayPaused" }] : []));
10786
10540
  this.isAutoPlayPausedByInternalHover = signal(false, ...(ngDevMode ? [{ debugName: "isAutoPlayPausedByInternalHover" }] : []));
10787
10541
  this.isAutoPlayPausedByInternalFocus = signal(false, ...(ngDevMode ? [{ debugName: "isAutoPlayPausedByInternalFocus" }] : []));
10542
+ this.isAutoPlayPausedByInternalVisibility = signal(false, ...(ngDevMode ? [{ debugName: "isAutoPlayPausedByInternalVisibility" }] : []));
10543
+ this.hostElementIntersection = signalHostElementIntersection();
10788
10544
  this.isNavigationLocked = toSignal(toObservable(this.activeIndex).pipe(switchMap(() => merge(of(true), timer(this.transitionDuration()).pipe(map(() => false))))), {
10789
10545
  initialValue: false,
10790
10546
  });
@@ -10815,8 +10571,12 @@ class CarouselDirective {
10815
10571
  toObservable(this.isAutoPlayPaused, { injector: this.injector }),
10816
10572
  toObservable(this.isAutoPlayPausedByInternalHover, { injector: this.injector }),
10817
10573
  toObservable(this.isAutoPlayPausedByInternalFocus, { injector: this.injector }),
10818
- ]).pipe(switchMap(([isPaused, internalIsPausedDueToHover, internalIsPausedDueToFocus]) => {
10819
- if (isPaused || internalIsPausedDueToHover || internalIsPausedDueToFocus)
10574
+ toObservable(this.isAutoPlayPausedByInternalVisibility, { injector: this.injector }),
10575
+ ]).pipe(switchMap(([isPaused, internalIsPausedDueToHover, internalIsPausedDueToFocus, internalIsPausedDueToVisibility]) => {
10576
+ if (isPaused ||
10577
+ internalIsPausedDueToHover ||
10578
+ internalIsPausedDueToFocus ||
10579
+ internalIsPausedDueToVisibility)
10820
10580
  return of(elapsed / duration);
10821
10581
  return timer(0, 100).pipe(tap(() => (elapsed += 100)), map(() => elapsed / duration), takeWhile((progress) => progress < 1, true));
10822
10582
  }));
@@ -10826,6 +10586,16 @@ class CarouselDirective {
10826
10586
  return false;
10827
10587
  return this.activeItemAutoPlayProgress() === 1;
10828
10588
  }, ...(ngDevMode ? [{ debugName: "shouldPlayNextItem" }] : []));
10589
+ effect(() => {
10590
+ const entries = this.hostElementIntersection();
10591
+ if (!this.pauseAutoPlayOnHidden()) {
10592
+ this.isAutoPlayPausedByInternalVisibility.set(false);
10593
+ return;
10594
+ }
10595
+ if (entries.length === 0)
10596
+ return;
10597
+ this.isAutoPlayPausedByInternalVisibility.set(!(entries[0]?.isVisible ?? true));
10598
+ });
10829
10599
  combineLatest([toObservable(this.activeItemAutoPlayProgress), toObservable(this.autoPlay)])
10830
10600
  .pipe(filter(([progress, autoPlay]) => progress === 1 && autoPlay), tap(() => this.next()), takeUntilDestroyed())
10831
10601
  .subscribe();
@@ -10891,7 +10661,7 @@ class CarouselDirective {
10891
10661
  this.isAutoPlayPaused.set(false);
10892
10662
  }
10893
10663
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CarouselDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
10894
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.2.1", type: CarouselDirective, isStandalone: true, inputs: { loop: { classPropertyName: "loop", publicName: "loop", isSignal: true, isRequired: false, transformFunction: null }, autoPlay: { classPropertyName: "autoPlay", publicName: "autoPlay", isSignal: true, isRequired: false, transformFunction: null }, autoPlayTime: { classPropertyName: "autoPlayTime", publicName: "autoPlayTime", isSignal: true, isRequired: false, transformFunction: null }, pauseAutoPlayOnHover: { classPropertyName: "pauseAutoPlayOnHover", publicName: "pauseAutoPlayOnHover", isSignal: true, isRequired: false, transformFunction: null }, pauseAutoPlayOnFocus: { classPropertyName: "pauseAutoPlayOnFocus", publicName: "pauseAutoPlayOnFocus", isSignal: true, isRequired: false, transformFunction: null }, transitionType: { classPropertyName: "transitionType", publicName: "transitionType", isSignal: true, isRequired: false, transformFunction: null }, transitionDuration: { classPropertyName: "transitionDuration", publicName: "transitionDuration", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
10664
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.2.1", type: CarouselDirective, isStandalone: true, inputs: { loop: { classPropertyName: "loop", publicName: "loop", isSignal: true, isRequired: false, transformFunction: null }, autoPlay: { classPropertyName: "autoPlay", publicName: "autoPlay", isSignal: true, isRequired: false, transformFunction: null }, autoPlayTime: { classPropertyName: "autoPlayTime", publicName: "autoPlayTime", isSignal: true, isRequired: false, transformFunction: null }, pauseAutoPlayOnHover: { classPropertyName: "pauseAutoPlayOnHover", publicName: "pauseAutoPlayOnHover", isSignal: true, isRequired: false, transformFunction: null }, pauseAutoPlayOnFocus: { classPropertyName: "pauseAutoPlayOnFocus", publicName: "pauseAutoPlayOnFocus", isSignal: true, isRequired: false, transformFunction: null }, pauseAutoPlayOnHidden: { classPropertyName: "pauseAutoPlayOnHidden", publicName: "pauseAutoPlayOnHidden", isSignal: true, isRequired: false, transformFunction: null }, transitionType: { classPropertyName: "transitionType", publicName: "transitionType", isSignal: true, isRequired: false, transformFunction: null }, transitionDuration: { classPropertyName: "transitionDuration", publicName: "transitionDuration", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
10895
10665
  {
10896
10666
  provide: CAROUSEL_TOKEN,
10897
10667
  useExisting: CarouselDirective,
@@ -10908,7 +10678,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
10908
10678
  },
10909
10679
  ],
10910
10680
  }]
10911
- }], ctorParameters: () => [], propDecorators: { loop: [{ type: i0.Input, args: [{ isSignal: true, alias: "loop", required: false }] }], autoPlay: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoPlay", required: false }] }], autoPlayTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoPlayTime", required: false }] }], pauseAutoPlayOnHover: [{ type: i0.Input, args: [{ isSignal: true, alias: "pauseAutoPlayOnHover", required: false }] }], pauseAutoPlayOnFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "pauseAutoPlayOnFocus", required: false }] }], transitionType: [{ type: i0.Input, args: [{ isSignal: true, alias: "transitionType", required: false }] }], transitionDuration: [{ type: i0.Input, args: [{ isSignal: true, alias: "transitionDuration", required: false }] }], items: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => CAROUSEL_ITEM_TOKEN), { isSignal: true }] }] } });
10681
+ }], ctorParameters: () => [], propDecorators: { loop: [{ type: i0.Input, args: [{ isSignal: true, alias: "loop", required: false }] }], autoPlay: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoPlay", required: false }] }], autoPlayTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoPlayTime", required: false }] }], pauseAutoPlayOnHover: [{ type: i0.Input, args: [{ isSignal: true, alias: "pauseAutoPlayOnHover", required: false }] }], pauseAutoPlayOnFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "pauseAutoPlayOnFocus", required: false }] }], pauseAutoPlayOnHidden: [{ type: i0.Input, args: [{ isSignal: true, alias: "pauseAutoPlayOnHidden", required: false }] }], transitionType: [{ type: i0.Input, args: [{ isSignal: true, alias: "transitionType", required: false }] }], transitionDuration: [{ type: i0.Input, args: [{ isSignal: true, alias: "transitionDuration", required: false }] }], items: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => CAROUSEL_ITEM_TOKEN), { isSignal: true }] }] } });
10912
10682
 
10913
10683
  class CarouselComponent {
10914
10684
  constructor() {
@@ -10917,7 +10687,7 @@ class CarouselComponent {
10917
10687
  syncSignal(this.carouselItemsWrapper, this.carousel.carouselItemsWrapper, { skipSyncRead: true });
10918
10688
  }
10919
10689
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CarouselComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10920
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.1", type: CarouselComponent, isStandalone: true, selector: "et-carousel", host: { classAttribute: "et-carousel-host" }, viewQueries: [{ propertyName: "carouselItemsWrapper", first: true, predicate: ["carouselItemsWrapper"], descendants: true, isSignal: true }], hostDirectives: [{ directive: CarouselDirective, inputs: ["loop", "loop", "autoPlay", "autoPlay", "autoPlayTime", "autoPlayTime", "pauseAutoPlayOnHover", "pauseAutoPlayOnHover", "pauseAutoPlayOnFocus", "pauseAutoPlayOnFocus", "transitionType", "transitionType", "transitionDuration", "transitionDuration"] }], ngImport: i0, template: `
10690
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.1", type: CarouselComponent, isStandalone: true, selector: "et-carousel", host: { classAttribute: "et-carousel-host" }, viewQueries: [{ propertyName: "carouselItemsWrapper", first: true, predicate: ["carouselItemsWrapper"], descendants: true, isSignal: true }], hostDirectives: [{ directive: CarouselDirective, inputs: ["loop", "loop", "autoPlay", "autoPlay", "autoPlayTime", "autoPlayTime", "pauseAutoPlayOnHover", "pauseAutoPlayOnHover", "pauseAutoPlayOnFocus", "pauseAutoPlayOnFocus", "pauseAutoPlayOnHidden", "pauseAutoPlayOnHidden", "transitionType", "transitionType", "transitionDuration", "transitionDuration"] }], ngImport: i0, template: `
10921
10691
  <div class="et-carousel">
10922
10692
  <div #carouselItemsWrapper class="et-carousel-items">
10923
10693
  <ng-content select="et-carousel-item, [etCarouselItem]" />
@@ -10948,6 +10718,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
10948
10718
  'autoPlayTime',
10949
10719
  'pauseAutoPlayOnHover',
10950
10720
  'pauseAutoPlayOnFocus',
10721
+ 'pauseAutoPlayOnHidden',
10951
10722
  'transitionType',
10952
10723
  'transitionDuration',
10953
10724
  ],
@@ -14960,6 +14731,7 @@ class SelectDirective {
14960
14731
  }
14961
14732
  removeOptionFromSelection(option) {
14962
14733
  this._selectionModel.removeSelectedOption(option);
14734
+ this.input._markAsTouched();
14963
14735
  }
14964
14736
  _controlTouched() {
14965
14737
  this.input._markAsTouched();
@@ -17805,237 +17577,2149 @@ const provideSort = () => {
17805
17577
  return [SORT_HEADER_INTL_PROVIDER];
17806
17578
  };
17807
17579
 
17808
- class TableBusyDirective {
17580
+ const STREAM_CONSENT_TOKEN = new InjectionToken('STREAM_CONSENT_TOKEN');
17581
+ const STREAM_USER_CONSENT_PROVIDER_TOKEN = new InjectionToken('STREAM_USER_CONSENT_PROVIDER_TOKEN');
17582
+ const injectStreamUserConsentProvider = () => inject(STREAM_USER_CONSENT_PROVIDER_TOKEN, { optional: true });
17583
+ class StreamConsentDirective {
17809
17584
  constructor() {
17810
- this.templateRef = inject(TemplateRef);
17811
- this._contentClassName = 'et-table-busy';
17585
+ this._handler = injectStreamUserConsentProvider();
17586
+ this._localGranted = signal(false, ...(ngDevMode ? [{ debugName: "_localGranted" }] : []));
17587
+ this.isGranted = this._handler
17588
+ ? computed(() => this._handler.isGranted())
17589
+ : this._localGranted;
17812
17590
  }
17813
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TableBusyDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
17814
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: TableBusyDirective, isStandalone: true, selector: "ng-template[etTableBusy]", ngImport: i0 }); }
17591
+ grant() {
17592
+ if (this._handler) {
17593
+ this._handler.grant();
17594
+ }
17595
+ else {
17596
+ this._localGranted.set(true);
17597
+ }
17598
+ }
17599
+ revoke() {
17600
+ if (this._handler) {
17601
+ this._handler.revoke?.();
17602
+ }
17603
+ else {
17604
+ this._localGranted.set(false);
17605
+ }
17606
+ }
17607
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: StreamConsentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
17608
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: StreamConsentDirective, isStandalone: true, providers: [{ provide: STREAM_CONSENT_TOKEN, useExisting: StreamConsentDirective }], ngImport: i0 }); }
17815
17609
  }
17816
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TableBusyDirective, decorators: [{
17610
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: StreamConsentDirective, decorators: [{
17817
17611
  type: Directive,
17818
17612
  args: [{
17819
- selector: 'ng-template[etTableBusy]',
17613
+ providers: [{ provide: STREAM_CONSENT_TOKEN, useExisting: StreamConsentDirective }],
17820
17614
  }]
17821
17615
  }] });
17822
17616
 
17823
- // eslint-disable-next-line @angular-eslint/directive-selector
17824
- class TableBusyOutletDirective {
17617
+ class StreamConsentAcceptDirective {
17825
17618
  constructor() {
17826
- this.viewContainer = inject(ViewContainerRef);
17827
- this.elementRef = inject(ElementRef);
17619
+ this.consent = inject(STREAM_CONSENT_TOKEN);
17828
17620
  }
17829
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TableBusyOutletDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
17830
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: TableBusyOutletDirective, isStandalone: true, selector: "[tableBusyOutlet]", ngImport: i0 }); }
17621
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: StreamConsentAcceptDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
17622
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: StreamConsentAcceptDirective, isStandalone: true, selector: "[etStreamConsentAccept]", host: { listeners: { "click": "consent.grant()" } }, ngImport: i0 }); }
17831
17623
  }
17832
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TableBusyOutletDirective, decorators: [{
17624
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: StreamConsentAcceptDirective, decorators: [{
17833
17625
  type: Directive,
17834
- args: [{ selector: '[tableBusyOutlet]' }]
17626
+ args: [{
17627
+ selector: '[etStreamConsentAccept]',
17628
+ host: {
17629
+ '(click)': 'consent.grant()',
17630
+ },
17631
+ }]
17835
17632
  }] });
17836
17633
 
17837
- class TableComponent extends CdkTable {
17634
+ const STREAM_CONSENT_CONTENT_TOKEN = new InjectionToken('STREAM_CONSENT_CONTENT_TOKEN');
17635
+ class StreamConsentContentDirective {
17838
17636
  constructor() {
17839
- super(...arguments);
17840
- this._cdr = inject(ChangeDetectorRef);
17841
- this.stickyCssClass = 'et-table-sticky';
17842
- this.needsPositionStickyOnElement = false;
17843
- this._tableBusyOutlet = viewChild(TableBusyOutletDirective, ...(ngDevMode ? [{ debugName: "_tableBusyOutlet" }] : []));
17844
- this._tableBusyComponent = contentChild(TableBusyDirective, ...(ngDevMode ? [{ debugName: "_tableBusyComponent" }] : []));
17845
- this._busy = false;
17846
- this._isShowingTableBusy = false;
17847
- }
17848
- // TODO: Skipped for migration because:
17849
- // Accessor inputs cannot be migrated as they are too complex.
17850
- get busy() {
17851
- return this._busy;
17852
- }
17853
- set busy(value) {
17854
- this._busy = booleanAttribute(value);
17855
- this._updateTableBusy();
17856
- }
17857
- ngAfterContentInit() {
17858
- super.ngAfterContentInit();
17859
- this._updateTableBusy();
17860
- }
17861
- _updateTableBusy() {
17862
- const tableBusyComponent = this._tableBusyComponent();
17863
- if (!tableBusyComponent) {
17864
- return;
17865
- }
17866
- const shouldShow = this.busy;
17867
- if (shouldShow === this._isShowingTableBusy) {
17868
- return;
17869
- }
17870
- const container = this._tableBusyOutlet()?.viewContainer;
17871
- if (!container) {
17872
- return;
17873
- }
17874
- if (shouldShow) {
17875
- const view = container.createEmbeddedView(tableBusyComponent.templateRef);
17876
- const rootNode = view.rootNodes[0];
17877
- if (view.rootNodes.length === 1 && rootNode?.nodeType === document.ELEMENT_NODE) {
17878
- rootNode.classList.add(tableBusyComponent._contentClassName);
17879
- }
17880
- }
17881
- else {
17882
- container.clear();
17883
- }
17884
- this._isShowingTableBusy = shouldShow;
17885
- this._cdr.markForCheck();
17886
- }
17887
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
17888
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: TableComponent, isStandalone: true, selector: "et-table, table[et-table]", inputs: { busy: "busy" }, host: { properties: { "class.et-table-fixed-layout": "fixedLayout", "attr.aria-busy": "busy ? true : null" }, classAttribute: "et-table et-data-table__table" }, providers: [
17889
- { provide: CdkTable, useExisting: TableComponent },
17890
- { provide: CDK_TABLE, useExisting: TableComponent },
17891
- { provide: STICKY_POSITIONING_LISTENER, useValue: null },
17892
- ], queries: [{ propertyName: "_tableBusyComponent", first: true, predicate: TableBusyDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "_tableBusyOutlet", first: true, predicate: TableBusyOutletDirective, descendants: true, isSignal: true }], exportAs: ["etTable"], usesInheritance: true, ngImport: i0, template: `
17893
- <ng-content select="caption" />
17894
- <ng-content select="colgroup, col" />
17895
-
17896
- @if (_isServer) {
17897
- <ng-content />
17898
- }
17899
-
17900
- @if (_isNativeHtmlTable) {
17901
- <thead role="rowgroup">
17902
- <ng-container headerRowOutlet />
17903
- </thead>
17904
- <tbody class="mdc-data-table__content" role="rowgroup">
17905
- <ng-container rowOutlet />
17906
- <ng-container noDataRowOutlet />
17907
- </tbody>
17908
- <tfoot role="rowgroup">
17909
- <ng-container footerRowOutlet />
17910
- </tfoot>
17911
- } @else {
17912
- <ng-container headerRowOutlet />
17913
- <div class="et-table-body">
17914
- <ng-container rowOutlet />
17915
- <ng-container tableBusyOutlet />
17916
- </div>
17917
- <ng-container noDataRowOutlet />
17918
- <ng-container footerRowOutlet />
17919
- }
17920
- `, isInline: true, styles: [":where(.et-table){--et-table-separator-color: #4c4c4c;--et-table-separator-width: 1px;--et-table-separator-style: solid;--et-table-header-row-min-height: 56px;--et-table-row-display: flex;--et-table-row-min-height: 48px;--et-table-row-inline-padding: 24px;--et-table-cell-display: flex;--et-table-cell-inline-padding: 0;--et-table-cell-block-padding: 0}.et-table{display:block;position:relative}.et-header-row{min-height:var(--et-table-header-row-min-height)}.et-row,.et-footer-row{min-height:var(--et-table-row-min-height)}.et-row,.et-header-row,.et-footer-row{display:var(--et-table-row-display);border-width:0;border-bottom-width:var(--et-table-separator-width);border-style:var(--et-table-separator-style);border-color:var(--et-table-separator-color);align-items:center;box-sizing:border-box}.et-cell,.et-header-cell,.et-footer-cell{padding-inline:var(--et-table-cell-inline-padding);padding-block:var(--et-table-cell-block-padding)}.et-cell:first-of-type,.et-header-cell:first-of-type,.et-footer-cell:first-of-type{padding-inline-start:var(--et-table-row-inline-padding)}.et-cell:last-of-type,.et-header-cell:last-of-type,.et-footer-cell:last-of-type{padding-inline-end:var(--et-table-row-inline-padding)}.et-cell,.et-header-cell,.et-footer-cell{flex:1;display:var(--et-table-cell-display);align-items:center;overflow:hidden;word-wrap:break-word;min-height:inherit;box-sizing:border-box}.et-table-sticky{position:sticky!important}.et-table{table-layout:auto;white-space:normal}.et-table tbody,.et-table tfoot,.et-table thead,.et-cell,.et-footer-cell,.et-header-row,.et-row,.et-footer-row,.et-table .et-header-cell{background:inherit}.et-table et-header-row.et-header-row,.et-table et-row.et-row,.et-table et-footer-row.et-footer-cell{height:unset}et-header-cell.et-header-cell,et-cell.et-cell,et-footer-cell.et-footer-cell{align-self:stretch}\n"], dependencies: [{ kind: "directive", type: HeaderRowOutlet, selector: "[headerRowOutlet]" }, { kind: "directive", type: DataRowOutlet, selector: "[rowOutlet]" }, { kind: "directive", type: NoDataRowOutlet, selector: "[noDataRowOutlet]" }, { kind: "directive", type: FooterRowOutlet, selector: "[footerRowOutlet]" }, { kind: "directive", type: TableBusyOutletDirective, selector: "[tableBusyOutlet]" }], changeDetection: i0.ChangeDetectionStrategy.Eager, encapsulation: i0.ViewEncapsulation.None }); }
17921
- }
17922
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TableComponent, decorators: [{
17923
- type: Component,
17924
- args: [{ selector: 'et-table, table[et-table]', exportAs: 'etTable', template: `
17925
- <ng-content select="caption" />
17926
- <ng-content select="colgroup, col" />
17927
-
17928
- @if (_isServer) {
17929
- <ng-content />
17930
- }
17931
-
17932
- @if (_isNativeHtmlTable) {
17933
- <thead role="rowgroup">
17934
- <ng-container headerRowOutlet />
17935
- </thead>
17936
- <tbody class="mdc-data-table__content" role="rowgroup">
17937
- <ng-container rowOutlet />
17938
- <ng-container noDataRowOutlet />
17939
- </tbody>
17940
- <tfoot role="rowgroup">
17941
- <ng-container footerRowOutlet />
17942
- </tfoot>
17943
- } @else {
17944
- <ng-container headerRowOutlet />
17945
- <div class="et-table-body">
17946
- <ng-container rowOutlet />
17947
- <ng-container tableBusyOutlet />
17948
- </div>
17949
- <ng-container noDataRowOutlet />
17950
- <ng-container footerRowOutlet />
17637
+ this.templateRef = inject(TemplateRef);
17951
17638
  }
17952
- `, host: {
17953
- class: 'et-table et-data-table__table',
17954
- '[class.et-table-fixed-layout]': 'fixedLayout',
17955
- '[attr.aria-busy]': 'busy ? true : null',
17956
- }, providers: [
17957
- { provide: CdkTable, useExisting: TableComponent },
17958
- { provide: CDK_TABLE, useExisting: TableComponent },
17959
- { provide: STICKY_POSITIONING_LISTENER, useValue: null },
17960
- ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.Default, imports: [HeaderRowOutlet, DataRowOutlet, NoDataRowOutlet, FooterRowOutlet, TableBusyOutletDirective], styles: [":where(.et-table){--et-table-separator-color: #4c4c4c;--et-table-separator-width: 1px;--et-table-separator-style: solid;--et-table-header-row-min-height: 56px;--et-table-row-display: flex;--et-table-row-min-height: 48px;--et-table-row-inline-padding: 24px;--et-table-cell-display: flex;--et-table-cell-inline-padding: 0;--et-table-cell-block-padding: 0}.et-table{display:block;position:relative}.et-header-row{min-height:var(--et-table-header-row-min-height)}.et-row,.et-footer-row{min-height:var(--et-table-row-min-height)}.et-row,.et-header-row,.et-footer-row{display:var(--et-table-row-display);border-width:0;border-bottom-width:var(--et-table-separator-width);border-style:var(--et-table-separator-style);border-color:var(--et-table-separator-color);align-items:center;box-sizing:border-box}.et-cell,.et-header-cell,.et-footer-cell{padding-inline:var(--et-table-cell-inline-padding);padding-block:var(--et-table-cell-block-padding)}.et-cell:first-of-type,.et-header-cell:first-of-type,.et-footer-cell:first-of-type{padding-inline-start:var(--et-table-row-inline-padding)}.et-cell:last-of-type,.et-header-cell:last-of-type,.et-footer-cell:last-of-type{padding-inline-end:var(--et-table-row-inline-padding)}.et-cell,.et-header-cell,.et-footer-cell{flex:1;display:var(--et-table-cell-display);align-items:center;overflow:hidden;word-wrap:break-word;min-height:inherit;box-sizing:border-box}.et-table-sticky{position:sticky!important}.et-table{table-layout:auto;white-space:normal}.et-table tbody,.et-table tfoot,.et-table thead,.et-cell,.et-footer-cell,.et-header-row,.et-row,.et-footer-row,.et-table .et-header-cell{background:inherit}.et-table et-header-row.et-header-row,.et-table et-row.et-row,.et-table et-footer-row.et-footer-cell{height:unset}et-header-cell.et-header-cell,et-cell.et-cell,et-footer-cell.et-footer-cell{align-self:stretch}\n"] }]
17961
- }], propDecorators: { _tableBusyOutlet: [{ type: i0.ViewChild, args: [i0.forwardRef(() => TableBusyOutletDirective), { isSignal: true }] }], _tableBusyComponent: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TableBusyDirective), { isSignal: true }] }], busy: [{
17962
- type: Input
17963
- }] } });
17964
-
17965
- const MAX_SAFE_INTEGER = 9007199254740991;
17966
-
17967
- class CellDirective extends CdkCell {
17968
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CellDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
17969
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: CellDirective, isStandalone: true, selector: "et-cell, td[et-cell]", host: { classAttribute: "et-cell et-data-table__cell" }, usesInheritance: true, ngImport: i0 }); }
17639
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: StreamConsentContentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
17640
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: StreamConsentContentDirective, isStandalone: true, selector: "[etStreamConsentContent]", providers: [{ provide: STREAM_CONSENT_CONTENT_TOKEN, useExisting: StreamConsentContentDirective }], ngImport: i0 }); }
17970
17641
  }
17971
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CellDirective, decorators: [{
17642
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: StreamConsentContentDirective, decorators: [{
17972
17643
  type: Directive,
17973
17644
  args: [{
17974
- // eslint-disable-next-line @angular-eslint/directive-selector
17975
- selector: 'et-cell, td[et-cell]',
17976
- host: {
17977
- class: 'et-cell et-data-table__cell',
17978
- },
17645
+ selector: '[etStreamConsentContent]',
17646
+ providers: [{ provide: STREAM_CONSENT_CONTENT_TOKEN, useExisting: StreamConsentContentDirective }],
17979
17647
  }]
17980
17648
  }] });
17981
17649
 
17982
- class CellDefDirective extends CdkCellDef {
17983
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CellDefDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
17984
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: CellDefDirective, isStandalone: true, selector: "[etCellDef]", providers: [{ provide: CdkCellDef, useExisting: CellDefDirective }], usesInheritance: true, ngImport: i0 }); }
17650
+ const STREAM_CONSENT_PLACEHOLDER_TOKEN = new InjectionToken('STREAM_CONSENT_PLACEHOLDER_TOKEN');
17651
+ class StreamConsentPlaceholderDirective {
17652
+ constructor() {
17653
+ this.templateRef = inject(TemplateRef);
17654
+ }
17655
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: StreamConsentPlaceholderDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
17656
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: StreamConsentPlaceholderDirective, isStandalone: true, selector: "[etStreamConsentPlaceholder]", providers: [{ provide: STREAM_CONSENT_PLACEHOLDER_TOKEN, useExisting: StreamConsentPlaceholderDirective }], ngImport: i0 }); }
17985
17657
  }
17986
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CellDefDirective, decorators: [{
17658
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: StreamConsentPlaceholderDirective, decorators: [{
17987
17659
  type: Directive,
17988
17660
  args: [{
17989
- selector: '[etCellDef]',
17990
- providers: [{ provide: CdkCellDef, useExisting: CellDefDirective }],
17661
+ selector: '[etStreamConsentPlaceholder]',
17662
+ providers: [{ provide: STREAM_CONSENT_PLACEHOLDER_TOKEN, useExisting: StreamConsentPlaceholderDirective }],
17991
17663
  }]
17992
17664
  }] });
17993
17665
 
17994
- class FooterCellDirective extends CdkFooterCell {
17995
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: FooterCellDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
17996
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: FooterCellDirective, isStandalone: true, selector: "et-footer-cell, td[et-footer-cell]", host: { classAttribute: "et-footer-cell et-data-table__cell" }, usesInheritance: true, ngImport: i0 }); }
17666
+ class StreamConsentComponent {
17667
+ constructor() {
17668
+ this.consent = inject(STREAM_CONSENT_TOKEN);
17669
+ this.contentSlot = contentChild(StreamConsentContentDirective, ...(ngDevMode ? [{ debugName: "contentSlot" }] : []));
17670
+ this.placeholderSlot = contentChild(StreamConsentPlaceholderDirective, ...(ngDevMode ? [{ debugName: "placeholderSlot" }] : []));
17671
+ }
17672
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: StreamConsentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
17673
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: StreamConsentComponent, isStandalone: true, selector: "et-stream-consent", host: { classAttribute: "et-stream-consent" }, queries: [{ propertyName: "contentSlot", first: true, predicate: StreamConsentContentDirective, descendants: true, isSignal: true }, { propertyName: "placeholderSlot", first: true, predicate: StreamConsentPlaceholderDirective, descendants: true, isSignal: true }], hostDirectives: [{ directive: StreamConsentDirective }], ngImport: i0, template: `
17674
+ @if (consent.isGranted()) {
17675
+ <ng-container [ngTemplateOutlet]="contentSlot()?.templateRef ?? null" />
17676
+ } @else {
17677
+ <ng-container [ngTemplateOutlet]="placeholderSlot()?.templateRef ?? null" />
17678
+ }
17679
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
17997
17680
  }
17998
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: FooterCellDirective, decorators: [{
17999
- type: Directive,
17681
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: StreamConsentComponent, decorators: [{
17682
+ type: Component,
18000
17683
  args: [{
18001
- // eslint-disable-next-line @angular-eslint/directive-selector
18002
- selector: 'et-footer-cell, td[et-footer-cell]',
17684
+ selector: 'et-stream-consent',
17685
+ template: `
17686
+ @if (consent.isGranted()) {
17687
+ <ng-container [ngTemplateOutlet]="contentSlot()?.templateRef ?? null" />
17688
+ } @else {
17689
+ <ng-container [ngTemplateOutlet]="placeholderSlot()?.templateRef ?? null" />
17690
+ }
17691
+ `,
17692
+ changeDetection: ChangeDetectionStrategy.OnPush,
17693
+ encapsulation: ViewEncapsulation.None,
17694
+ hostDirectives: [{ directive: StreamConsentDirective }],
17695
+ imports: [NgTemplateOutlet],
18003
17696
  host: {
18004
- class: 'et-footer-cell et-data-table__cell',
17697
+ class: 'et-stream-consent',
18005
17698
  },
18006
17699
  }]
18007
- }] });
18008
-
18009
- class FooterCellDefDirective extends CdkFooterCellDef {
18010
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: FooterCellDefDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
18011
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: FooterCellDefDirective, isStandalone: true, selector: "[etFooterCellDef]", providers: [{ provide: CdkFooterCellDef, useExisting: FooterCellDefDirective }], usesInheritance: true, ngImport: i0 }); }
17700
+ }], propDecorators: { contentSlot: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StreamConsentContentDirective), { isSignal: true }] }], placeholderSlot: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StreamConsentPlaceholderDirective), { isSignal: true }] }] } });
17701
+
17702
+ const STREAM_PLAYER_TOKEN = new InjectionToken('STREAM_PLAYER_TOKEN');
17703
+
17704
+ const DAILYMOTION_PLAYER_TOKEN = new InjectionToken('DAILYMOTION_PLAYER_TOKEN');
17705
+ const DEFAULT_STATE$7 = {
17706
+ isReady: false,
17707
+ isPlaying: false,
17708
+ isMuted: false,
17709
+ isEnded: false,
17710
+ duration: null,
17711
+ currentTime: null,
17712
+ };
17713
+ class DailymotionPlayerDirective {
17714
+ constructor() {
17715
+ this.el = injectHostElement();
17716
+ this.platformId = inject(PLATFORM_ID);
17717
+ this.CAPABILITIES = {
17718
+ canPlay: false,
17719
+ canPause: false,
17720
+ canMute: false,
17721
+ canSeek: false,
17722
+ canGetDuration: false,
17723
+ isLiveCapable: true,
17724
+ };
17725
+ this.state = signal({ ...DEFAULT_STATE$7 }, ...(ngDevMode ? [{ debugName: "state" }] : []));
17726
+ this.videoId = input.required(...(ngDevMode ? [{ debugName: "videoId" }] : []));
17727
+ this.startTime = input(0, { ...(ngDevMode ? { debugName: "startTime" } : {}), transform: numberAttribute });
17728
+ this.width = input('100%', ...(ngDevMode ? [{ debugName: "width" }] : []));
17729
+ this.height = input('100%', ...(ngDevMode ? [{ debugName: "height" }] : []));
17730
+ this.playerResource = rxResource({
17731
+ params: () => (isPlatformBrowser(this.platformId) ? this.videoId() : null),
17732
+ stream: ({ params: videoId }) => {
17733
+ if (!videoId)
17734
+ return EMPTY;
17735
+ return new Observable((subscriber) => {
17736
+ const iframe = document.createElement('iframe');
17737
+ const qs = new URLSearchParams({ autoplay: '0' });
17738
+ const startTime = this.startTime();
17739
+ if (startTime > 0)
17740
+ qs.set('start', String(startTime));
17741
+ const w = this.width();
17742
+ const h = this.height();
17743
+ iframe.src = `https://www.dailymotion.com/embed/video/${videoId}?${qs}`;
17744
+ iframe.width = typeof w === 'number' ? String(w) : w;
17745
+ iframe.height = typeof h === 'number' ? String(h) : h;
17746
+ iframe.style.border = 'none';
17747
+ iframe.allow = 'autoplay; encrypted-media';
17748
+ iframe.allowFullscreen = true;
17749
+ iframe.scrolling = 'no';
17750
+ iframe.addEventListener('load', () => {
17751
+ this.state.set({ ...DEFAULT_STATE$7, isReady: true });
17752
+ subscriber.next();
17753
+ });
17754
+ this.el.appendChild(iframe);
17755
+ return () => {
17756
+ if (this.el.contains(iframe))
17757
+ this.el.removeChild(iframe);
17758
+ this.state.set({ ...DEFAULT_STATE$7 });
17759
+ };
17760
+ });
17761
+ },
17762
+ });
17763
+ this.error = computed(() => (this.playerResource.isLoading() ? undefined : this.playerResource.error()), ...(ngDevMode ? [{ debugName: "error" }] : []));
17764
+ }
17765
+ // Dailymotion embeds have no programmatic control API without a dashboard-created player ID
17766
+ play() {
17767
+ // no-op
17768
+ }
17769
+ pause() {
17770
+ // no-op
17771
+ }
17772
+ mute() {
17773
+ // no-op
17774
+ }
17775
+ unmute() {
17776
+ // no-op
17777
+ }
17778
+ seek() {
17779
+ // no-op
17780
+ }
17781
+ retry() {
17782
+ this.playerResource.reload();
17783
+ }
17784
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DailymotionPlayerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
17785
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.1", type: DailymotionPlayerDirective, isStandalone: true, inputs: { videoId: { classPropertyName: "videoId", publicName: "videoId", isSignal: true, isRequired: true, transformFunction: null }, startTime: { classPropertyName: "startTime", publicName: "startTime", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
17786
+ { provide: DAILYMOTION_PLAYER_TOKEN, useExisting: DailymotionPlayerDirective },
17787
+ { provide: STREAM_PLAYER_TOKEN, useExisting: DailymotionPlayerDirective },
17788
+ ], ngImport: i0 }); }
18012
17789
  }
18013
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: FooterCellDefDirective, decorators: [{
17790
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DailymotionPlayerDirective, decorators: [{
18014
17791
  type: Directive,
18015
17792
  args: [{
18016
- selector: '[etFooterCellDef]',
18017
- providers: [{ provide: CdkFooterCellDef, useExisting: FooterCellDefDirective }],
17793
+ providers: [
17794
+ { provide: DAILYMOTION_PLAYER_TOKEN, useExisting: DailymotionPlayerDirective },
17795
+ { provide: STREAM_PLAYER_TOKEN, useExisting: DailymotionPlayerDirective },
17796
+ ],
18018
17797
  }]
18019
- }] });
17798
+ }], propDecorators: { videoId: [{ type: i0.Input, args: [{ isSignal: true, alias: "videoId", required: true }] }], startTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "startTime", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }] } });
18020
17799
 
18021
- class HeaderCellDirective extends CdkHeaderCell {
18022
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: HeaderCellDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
18023
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: HeaderCellDirective, isStandalone: true, selector: "et-header-cell, th[et-header-cell]", host: { attributes: { "role": "columnheader" }, classAttribute: "et-header-cell et-data-table__header-cell" }, usesInheritance: true, ngImport: i0 }); }
17800
+ class DailymotionPlayerComponent {
17801
+ constructor() {
17802
+ this.player = inject(DAILYMOTION_PLAYER_TOKEN);
17803
+ this.state = this.player.state;
17804
+ this.error = this.player.error;
17805
+ }
17806
+ retry() {
17807
+ this.player.retry();
17808
+ }
17809
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DailymotionPlayerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
17810
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: DailymotionPlayerComponent, isStandalone: true, selector: "et-dailymotion-player", host: { classAttribute: "et-dailymotion-player" }, hostDirectives: [{ directive: DailymotionPlayerDirective, inputs: ["videoId", "videoId", "startTime", "startTime", "width", "width", "height", "height"] }], ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
18024
17811
  }
18025
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: HeaderCellDirective, decorators: [{
18026
- type: Directive,
17812
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DailymotionPlayerComponent, decorators: [{
17813
+ type: Component,
18027
17814
  args: [{
18028
- // eslint-disable-next-line @angular-eslint/directive-selector
18029
- selector: 'et-header-cell, th[et-header-cell]',
17815
+ selector: 'et-dailymotion-player',
17816
+ template: '',
17817
+ changeDetection: ChangeDetectionStrategy.OnPush,
17818
+ encapsulation: ViewEncapsulation.None,
17819
+ hostDirectives: [
17820
+ {
17821
+ directive: DailymotionPlayerDirective,
17822
+ inputs: ['videoId', 'startTime', 'width', 'height'],
17823
+ },
17824
+ ],
18030
17825
  host: {
18031
- class: 'et-header-cell et-data-table__header-cell',
18032
- role: 'columnheader',
17826
+ class: 'et-dailymotion-player',
18033
17827
  },
18034
17828
  }]
18035
17829
  }] });
18036
17830
 
18037
- class HeaderCellDefDirective extends CdkHeaderCellDef {
18038
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: HeaderCellDefDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
17831
+ const [, injectStreamScriptLoader] = createRootProvider(() => {
17832
+ const document = inject(DOCUMENT);
17833
+ const cache = new Map();
17834
+ const mountedScripts = new Set();
17835
+ const renderer = injectRenderer();
17836
+ const load = (src) => {
17837
+ const cached = cache.get(src);
17838
+ if (cached)
17839
+ return cached;
17840
+ const obs = new Observable((subscriber) => {
17841
+ const isMounted = mountedScripts.has(src);
17842
+ if (isMounted) {
17843
+ subscriber.next();
17844
+ subscriber.complete();
17845
+ return;
17846
+ }
17847
+ const script = renderer.createElement('script');
17848
+ script.src = src;
17849
+ script.async = true;
17850
+ renderer.listen(script, 'load', () => {
17851
+ subscriber.next();
17852
+ subscriber.complete();
17853
+ mountedScripts.add(src);
17854
+ });
17855
+ renderer.listen(script, 'error', () => {
17856
+ cache.delete(src);
17857
+ script.remove();
17858
+ mountedScripts.delete(src);
17859
+ subscriber.error(new Error(`Failed to load script: ${src}`));
17860
+ });
17861
+ renderer.appendChild(document.head, script);
17862
+ }).pipe(shareReplay(1));
17863
+ cache.set(src, obs);
17864
+ return obs;
17865
+ };
17866
+ return { load };
17867
+ }, { name: 'Stream Script Loader' });
17868
+
17869
+ const FB_SDK_URL = 'https://connect.facebook.net/de_DE/sdk.js#xfbml=1&version=v3.2';
17870
+ const FACEBOOK_PLAYER_TOKEN = new InjectionToken('FACEBOOK_PLAYER_TOKEN');
17871
+ const DEFAULT_STATE$6 = {
17872
+ isReady: false,
17873
+ isPlaying: false,
17874
+ isMuted: false,
17875
+ isEnded: false,
17876
+ duration: null,
17877
+ currentTime: null,
17878
+ };
17879
+ class FacebookPlayerDirective {
17880
+ constructor() {
17881
+ this.el = injectHostElement();
17882
+ this.scriptLoader = injectStreamScriptLoader();
17883
+ this.platformId = inject(PLATFORM_ID);
17884
+ this.CAPABILITIES = {
17885
+ canPlay: true,
17886
+ canPause: true,
17887
+ canMute: true,
17888
+ canSeek: true,
17889
+ canGetDuration: true,
17890
+ isLiveCapable: false,
17891
+ };
17892
+ this.state = signal({ ...DEFAULT_STATE$6 }, ...(ngDevMode ? [{ debugName: "state" }] : []));
17893
+ /** Numeric Facebook video ID from the video URL. */
17894
+ this.videoId = input.required(...(ngDevMode ? [{ debugName: "videoId" }] : []));
17895
+ this.width = input('100%', ...(ngDevMode ? [{ debugName: "width" }] : []));
17896
+ this.height = input('100%', ...(ngDevMode ? [{ debugName: "height" }] : []));
17897
+ this.playerResource = rxResource({
17898
+ params: () => (isPlatformBrowser(this.platformId) ? this.videoId() : null),
17899
+ stream: ({ params: videoId }) => {
17900
+ if (!videoId)
17901
+ return EMPTY;
17902
+ const videoUrl = `https://www.facebook.com/video/${videoId}`;
17903
+ return new Observable((subscriber) => {
17904
+ const win = window;
17905
+ const playerSubscriptions = [];
17906
+ let active = true;
17907
+ let loaderSub = null;
17908
+ let xfbmlReadyHandler = null;
17909
+ const createEmbed = () => {
17910
+ if (!active)
17911
+ return;
17912
+ const containerId = `et-fb-${Math.random().toString(36).slice(2)}`;
17913
+ xfbmlReadyHandler = (rawMsg) => {
17914
+ const msg = rawMsg;
17915
+ if (msg.type !== 'video' || msg.id !== containerId)
17916
+ return;
17917
+ const player = msg.instance;
17918
+ this.state.update((s) => ({ ...s, isReady: true }));
17919
+ subscriber.next(player);
17920
+ playerSubscriptions.push(player.subscribe('startedPlaying', () => {
17921
+ this.state.update((s) => ({ ...s, isPlaying: true, isEnded: false }));
17922
+ }));
17923
+ playerSubscriptions.push(player.subscribe('paused', () => {
17924
+ this.state.update((s) => ({ ...s, isPlaying: false }));
17925
+ }));
17926
+ playerSubscriptions.push(player.subscribe('finishedPlaying', () => {
17927
+ this.state.update((s) => ({ ...s, isPlaying: false, isEnded: true }));
17928
+ }));
17929
+ };
17930
+ win.FB.Event.subscribe('xfbml.ready', xfbmlReadyHandler);
17931
+ const w = this.width();
17932
+ const h = this.height();
17933
+ const container = document.createElement('div');
17934
+ container.id = containerId;
17935
+ container.className = 'fb-video';
17936
+ container.dataset['href'] = videoUrl;
17937
+ container.dataset['width'] = typeof w === 'number' ? String(w) : 'auto';
17938
+ container.dataset['showText'] = 'false';
17939
+ this.el.style.display = 'block';
17940
+ this.el.style.width = typeof w === 'number' ? `${w}px` : w;
17941
+ if (typeof h === 'number')
17942
+ this.el.style.height = `${h}px`;
17943
+ this.el.appendChild(container);
17944
+ win.FB.XFBML.parse(this.el);
17945
+ };
17946
+ if (win.FB) {
17947
+ createEmbed();
17948
+ }
17949
+ else {
17950
+ const prev = win.fbAsyncInit;
17951
+ win.fbAsyncInit = () => {
17952
+ prev?.();
17953
+ createEmbed();
17954
+ };
17955
+ loaderSub = this.scriptLoader.load(FB_SDK_URL).subscribe({
17956
+ error: (e) => subscriber.error(e),
17957
+ });
17958
+ }
17959
+ return () => {
17960
+ active = false;
17961
+ loaderSub?.unsubscribe();
17962
+ if (xfbmlReadyHandler)
17963
+ win.FB?.Event.unsubscribe('xfbml.ready', xfbmlReadyHandler);
17964
+ for (const sub of playerSubscriptions)
17965
+ sub.release();
17966
+ this.el.innerHTML = '';
17967
+ this.state.set({ ...DEFAULT_STATE$6 });
17968
+ };
17969
+ });
17970
+ },
17971
+ });
17972
+ this.error = computed(() => (this.playerResource.isLoading() ? undefined : this.playerResource.error()), ...(ngDevMode ? [{ debugName: "error" }] : []));
17973
+ }
17974
+ play() {
17975
+ this.playerResource.value()?.play();
17976
+ }
17977
+ pause() {
17978
+ this.playerResource.value()?.pause();
17979
+ }
17980
+ mute() {
17981
+ this.playerResource.value()?.mute();
17982
+ this.state.update((s) => ({ ...s, isMuted: true }));
17983
+ }
17984
+ unmute() {
17985
+ this.playerResource.value()?.unmute();
17986
+ this.state.update((s) => ({ ...s, isMuted: false }));
17987
+ }
17988
+ seek(seconds) {
17989
+ this.playerResource.value()?.seek(seconds);
17990
+ }
17991
+ retry() {
17992
+ this.playerResource.reload();
17993
+ }
17994
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: FacebookPlayerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
17995
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.1", type: FacebookPlayerDirective, isStandalone: true, inputs: { videoId: { classPropertyName: "videoId", publicName: "videoId", isSignal: true, isRequired: true, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
17996
+ { provide: FACEBOOK_PLAYER_TOKEN, useExisting: FacebookPlayerDirective },
17997
+ { provide: STREAM_PLAYER_TOKEN, useExisting: FacebookPlayerDirective },
17998
+ ], ngImport: i0 }); }
17999
+ }
18000
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: FacebookPlayerDirective, decorators: [{
18001
+ type: Directive,
18002
+ args: [{
18003
+ providers: [
18004
+ { provide: FACEBOOK_PLAYER_TOKEN, useExisting: FacebookPlayerDirective },
18005
+ { provide: STREAM_PLAYER_TOKEN, useExisting: FacebookPlayerDirective },
18006
+ ],
18007
+ }]
18008
+ }], propDecorators: { videoId: [{ type: i0.Input, args: [{ isSignal: true, alias: "videoId", required: true }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }] } });
18009
+
18010
+ class FacebookPlayerComponent {
18011
+ constructor() {
18012
+ this.player = inject(FACEBOOK_PLAYER_TOKEN);
18013
+ this.state = this.player.state;
18014
+ this.error = this.player.error;
18015
+ }
18016
+ retry() {
18017
+ this.player.retry();
18018
+ }
18019
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: FacebookPlayerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18020
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: FacebookPlayerComponent, isStandalone: true, selector: "et-facebook-player", host: { classAttribute: "et-facebook-player" }, hostDirectives: [{ directive: FacebookPlayerDirective, inputs: ["videoId", "videoId", "width", "width", "height", "height"] }], ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
18021
+ }
18022
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: FacebookPlayerComponent, decorators: [{
18023
+ type: Component,
18024
+ args: [{
18025
+ selector: 'et-facebook-player',
18026
+ template: '',
18027
+ changeDetection: ChangeDetectionStrategy.OnPush,
18028
+ encapsulation: ViewEncapsulation.None,
18029
+ hostDirectives: [
18030
+ {
18031
+ directive: FacebookPlayerDirective,
18032
+ inputs: ['videoId', 'width', 'height'],
18033
+ },
18034
+ ],
18035
+ host: {
18036
+ class: 'et-facebook-player',
18037
+ },
18038
+ }]
18039
+ }] });
18040
+
18041
+ const KICK_PLAYER_TOKEN = new InjectionToken('KICK_PLAYER_TOKEN');
18042
+ const DEFAULT_STATE$5 = {
18043
+ isReady: false,
18044
+ isPlaying: false,
18045
+ isMuted: false,
18046
+ isEnded: false,
18047
+ duration: null,
18048
+ currentTime: null,
18049
+ };
18050
+ class KickPlayerDirective {
18051
+ constructor() {
18052
+ this.el = injectHostElement();
18053
+ this.platformId = inject(PLATFORM_ID);
18054
+ this.CAPABILITIES = {
18055
+ canPlay: false,
18056
+ canPause: false,
18057
+ canMute: false,
18058
+ canSeek: false,
18059
+ canGetDuration: false,
18060
+ isLiveCapable: true,
18061
+ };
18062
+ this.state = signal({ ...DEFAULT_STATE$5 }, ...(ngDevMode ? [{ debugName: "state" }] : []));
18063
+ this.channel = input.required(...(ngDevMode ? [{ debugName: "channel" }] : []));
18064
+ this.width = input('100%', ...(ngDevMode ? [{ debugName: "width" }] : []));
18065
+ this.height = input('100%', ...(ngDevMode ? [{ debugName: "height" }] : []));
18066
+ this.muted = input(false, { ...(ngDevMode ? { debugName: "muted" } : {}), transform: booleanAttribute });
18067
+ this.playerResource = rxResource({
18068
+ params: () => (isPlatformBrowser(this.platformId) ? this.channel() : null),
18069
+ stream: ({ params: channel }) => {
18070
+ if (!channel)
18071
+ return EMPTY;
18072
+ return new Observable((subscriber) => {
18073
+ const iframe = document.createElement('iframe');
18074
+ const qs = new URLSearchParams({ parent: window.location.hostname });
18075
+ if (this.muted())
18076
+ qs.set('muted', 'true');
18077
+ iframe.src = `https://player.kick.com/${channel}?${qs}`;
18078
+ iframe.width = String(this.width());
18079
+ iframe.height = String(this.height());
18080
+ iframe.style.border = 'none';
18081
+ iframe.scrolling = 'no';
18082
+ iframe.allowFullscreen = true;
18083
+ iframe.allow = 'autoplay; encrypted-media';
18084
+ iframe.addEventListener('load', () => {
18085
+ this.state.set({ ...DEFAULT_STATE$5, isReady: true });
18086
+ subscriber.next();
18087
+ });
18088
+ this.el.appendChild(iframe);
18089
+ return () => {
18090
+ if (this.el.contains(iframe)) {
18091
+ this.el.removeChild(iframe);
18092
+ }
18093
+ this.state.set({ ...DEFAULT_STATE$5 });
18094
+ };
18095
+ });
18096
+ },
18097
+ });
18098
+ this.error = computed(() => (this.playerResource.isLoading() ? undefined : this.playerResource.error()), ...(ngDevMode ? [{ debugName: "error" }] : []));
18099
+ }
18100
+ // Kick embeds have no programmatic control API — these are intentional no-ops.
18101
+ play() {
18102
+ // no-op
18103
+ }
18104
+ pause() {
18105
+ // no-op
18106
+ }
18107
+ mute() {
18108
+ // no-op
18109
+ }
18110
+ unmute() {
18111
+ // no-op
18112
+ }
18113
+ seek() {
18114
+ // no-op
18115
+ }
18116
+ retry() {
18117
+ this.playerResource.reload();
18118
+ }
18119
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: KickPlayerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
18120
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.1", type: KickPlayerDirective, isStandalone: true, inputs: { channel: { classPropertyName: "channel", publicName: "channel", isSignal: true, isRequired: true, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, muted: { classPropertyName: "muted", publicName: "muted", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
18121
+ { provide: KICK_PLAYER_TOKEN, useExisting: KickPlayerDirective },
18122
+ { provide: STREAM_PLAYER_TOKEN, useExisting: KickPlayerDirective },
18123
+ ], ngImport: i0 }); }
18124
+ }
18125
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: KickPlayerDirective, decorators: [{
18126
+ type: Directive,
18127
+ args: [{
18128
+ providers: [
18129
+ { provide: KICK_PLAYER_TOKEN, useExisting: KickPlayerDirective },
18130
+ { provide: STREAM_PLAYER_TOKEN, useExisting: KickPlayerDirective },
18131
+ ],
18132
+ }]
18133
+ }], propDecorators: { channel: [{ type: i0.Input, args: [{ isSignal: true, alias: "channel", required: true }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], muted: [{ type: i0.Input, args: [{ isSignal: true, alias: "muted", required: false }] }] } });
18134
+
18135
+ class KickPlayerComponent {
18136
+ constructor() {
18137
+ this.player = inject(KICK_PLAYER_TOKEN);
18138
+ this.state = this.player.state;
18139
+ this.error = this.player.error;
18140
+ }
18141
+ retry() {
18142
+ this.player.retry();
18143
+ }
18144
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: KickPlayerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18145
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: KickPlayerComponent, isStandalone: true, selector: "et-kick-player", host: { classAttribute: "et-kick-player" }, hostDirectives: [{ directive: KickPlayerDirective, inputs: ["channel", "channel", "width", "width", "height", "height", "muted", "muted"] }], ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
18146
+ }
18147
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: KickPlayerComponent, decorators: [{
18148
+ type: Component,
18149
+ args: [{
18150
+ selector: 'et-kick-player',
18151
+ template: '',
18152
+ changeDetection: ChangeDetectionStrategy.OnPush,
18153
+ encapsulation: ViewEncapsulation.None,
18154
+ hostDirectives: [
18155
+ {
18156
+ directive: KickPlayerDirective,
18157
+ inputs: ['channel', 'width', 'height', 'muted'],
18158
+ },
18159
+ ],
18160
+ host: {
18161
+ class: 'et-kick-player',
18162
+ },
18163
+ }]
18164
+ }] });
18165
+
18166
+ const SOOP_PLAYER_TOKEN = new InjectionToken('SOOP_PLAYER_TOKEN');
18167
+ const DEFAULT_STATE$4 = {
18168
+ isReady: false,
18169
+ isPlaying: false,
18170
+ isMuted: false,
18171
+ isEnded: false,
18172
+ duration: null,
18173
+ currentTime: null,
18174
+ };
18175
+ class SoopPlayerDirective {
18176
+ constructor() {
18177
+ this.el = injectHostElement();
18178
+ this.platformId = inject(PLATFORM_ID);
18179
+ this.CAPABILITIES = {
18180
+ canPlay: false,
18181
+ canPause: false,
18182
+ canMute: false,
18183
+ canSeek: false,
18184
+ canGetDuration: false,
18185
+ isLiveCapable: true,
18186
+ };
18187
+ this.state = signal({ ...DEFAULT_STATE$4 }, ...(ngDevMode ? [{ debugName: "state" }] : []));
18188
+ /** Streamer user ID — used for live streams (play.afreecatv.com/{userId}/embed). */
18189
+ this.userId = input(null, ...(ngDevMode ? [{ debugName: "userId" }] : []));
18190
+ /** VOD number — used for recorded broadcasts (vod.afreecatv.com/player/{videoId}). */
18191
+ this.videoId = input(null, ...(ngDevMode ? [{ debugName: "videoId" }] : []));
18192
+ this.width = input('100%', ...(ngDevMode ? [{ debugName: "width" }] : []));
18193
+ this.height = input('100%', ...(ngDevMode ? [{ debugName: "height" }] : []));
18194
+ this.playerResource = rxResource({
18195
+ params: () => {
18196
+ if (!isPlatformBrowser(this.platformId))
18197
+ return null;
18198
+ const userId = this.userId();
18199
+ const videoId = this.videoId();
18200
+ if (!userId && !videoId)
18201
+ return null;
18202
+ return { userId, videoId };
18203
+ },
18204
+ stream: ({ params }) => {
18205
+ if (!params)
18206
+ return EMPTY;
18207
+ return new Observable((subscriber) => {
18208
+ const iframe = document.createElement('iframe');
18209
+ const w = this.width();
18210
+ const h = this.height();
18211
+ if (params.userId) {
18212
+ iframe.src = `https://play.afreecatv.com/${params.userId}/embed`;
18213
+ }
18214
+ else {
18215
+ iframe.src = `https://vod.afreecatv.com/player/${params.videoId}`;
18216
+ }
18217
+ iframe.width = typeof w === 'number' ? String(w) : w;
18218
+ iframe.height = typeof h === 'number' ? String(h) : h;
18219
+ iframe.style.border = 'none';
18220
+ iframe.scrolling = 'no';
18221
+ iframe.allowFullscreen = true;
18222
+ iframe.allow = 'autoplay; encrypted-media';
18223
+ iframe.addEventListener('load', () => {
18224
+ this.state.set({ ...DEFAULT_STATE$4, isReady: true });
18225
+ subscriber.next();
18226
+ });
18227
+ this.el.appendChild(iframe);
18228
+ return () => {
18229
+ if (this.el.contains(iframe)) {
18230
+ this.el.removeChild(iframe);
18231
+ }
18232
+ this.state.set({ ...DEFAULT_STATE$4 });
18233
+ };
18234
+ });
18235
+ },
18236
+ });
18237
+ this.error = computed(() => (this.playerResource.isLoading() ? undefined : this.playerResource.error()), ...(ngDevMode ? [{ debugName: "error" }] : []));
18238
+ }
18239
+ // SOOP embeds have no programmatic control API — these are intentional no-ops.
18240
+ play() {
18241
+ // no-op
18242
+ }
18243
+ pause() {
18244
+ // no-op
18245
+ }
18246
+ mute() {
18247
+ // no-op
18248
+ }
18249
+ unmute() {
18250
+ // no-op
18251
+ }
18252
+ seek() {
18253
+ // no-op
18254
+ }
18255
+ retry() {
18256
+ this.playerResource.reload();
18257
+ }
18258
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SoopPlayerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
18259
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.1", type: SoopPlayerDirective, isStandalone: true, inputs: { userId: { classPropertyName: "userId", publicName: "userId", isSignal: true, isRequired: false, transformFunction: null }, videoId: { classPropertyName: "videoId", publicName: "videoId", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
18260
+ { provide: SOOP_PLAYER_TOKEN, useExisting: SoopPlayerDirective },
18261
+ { provide: STREAM_PLAYER_TOKEN, useExisting: SoopPlayerDirective },
18262
+ ], ngImport: i0 }); }
18263
+ }
18264
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SoopPlayerDirective, decorators: [{
18265
+ type: Directive,
18266
+ args: [{
18267
+ providers: [
18268
+ { provide: SOOP_PLAYER_TOKEN, useExisting: SoopPlayerDirective },
18269
+ { provide: STREAM_PLAYER_TOKEN, useExisting: SoopPlayerDirective },
18270
+ ],
18271
+ }]
18272
+ }], propDecorators: { userId: [{ type: i0.Input, args: [{ isSignal: true, alias: "userId", required: false }] }], videoId: [{ type: i0.Input, args: [{ isSignal: true, alias: "videoId", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }] } });
18273
+
18274
+ class SoopPlayerComponent {
18275
+ constructor() {
18276
+ this.player = inject(SOOP_PLAYER_TOKEN);
18277
+ this.state = this.player.state;
18278
+ this.error = this.player.error;
18279
+ }
18280
+ retry() {
18281
+ this.player.retry();
18282
+ }
18283
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SoopPlayerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18284
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: SoopPlayerComponent, isStandalone: true, selector: "et-soop-player", host: { classAttribute: "et-soop-player" }, hostDirectives: [{ directive: SoopPlayerDirective, inputs: ["userId", "userId", "videoId", "videoId", "width", "width", "height", "height"] }], ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
18285
+ }
18286
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SoopPlayerComponent, decorators: [{
18287
+ type: Component,
18288
+ args: [{
18289
+ selector: 'et-soop-player',
18290
+ template: '',
18291
+ changeDetection: ChangeDetectionStrategy.OnPush,
18292
+ encapsulation: ViewEncapsulation.None,
18293
+ hostDirectives: [
18294
+ {
18295
+ directive: SoopPlayerDirective,
18296
+ inputs: ['userId', 'videoId', 'width', 'height'],
18297
+ },
18298
+ ],
18299
+ host: {
18300
+ class: 'et-soop-player',
18301
+ },
18302
+ }]
18303
+ }] });
18304
+
18305
+ const TIKTOK_PLAYER_TOKEN = new InjectionToken('TIKTOK_PLAYER_TOKEN');
18306
+ const DEFAULT_STATE$3 = {
18307
+ isReady: false,
18308
+ isPlaying: false,
18309
+ isMuted: false,
18310
+ isEnded: false,
18311
+ duration: null,
18312
+ currentTime: null,
18313
+ };
18314
+ class TikTokPlayerDirective {
18315
+ constructor() {
18316
+ this.el = injectHostElement();
18317
+ this.platformId = inject(PLATFORM_ID);
18318
+ this.CAPABILITIES = {
18319
+ canPlay: false,
18320
+ canPause: false,
18321
+ canMute: false,
18322
+ canSeek: false,
18323
+ canGetDuration: false,
18324
+ isLiveCapable: false,
18325
+ };
18326
+ this.state = signal({ ...DEFAULT_STATE$3 }, ...(ngDevMode ? [{ debugName: "state" }] : []));
18327
+ /** Numeric TikTok video ID from the post URL. */
18328
+ this.videoId = input.required(...(ngDevMode ? [{ debugName: "videoId" }] : []));
18329
+ this.width = input('100%', ...(ngDevMode ? [{ debugName: "width" }] : []));
18330
+ this.height = input('100%', ...(ngDevMode ? [{ debugName: "height" }] : []));
18331
+ this.playerResource = rxResource({
18332
+ params: () => (isPlatformBrowser(this.platformId) ? this.videoId() : null),
18333
+ stream: ({ params: videoId }) => {
18334
+ if (!videoId)
18335
+ return EMPTY;
18336
+ return new Observable((subscriber) => {
18337
+ const iframe = document.createElement('iframe');
18338
+ const w = this.width();
18339
+ const h = this.height();
18340
+ iframe.src = `https://www.tiktok.com/embed/v2/${videoId}`;
18341
+ iframe.width = typeof w === 'number' ? String(w) : w;
18342
+ iframe.height = typeof h === 'number' ? String(h) : h;
18343
+ iframe.style.border = 'none';
18344
+ iframe.scrolling = 'no';
18345
+ iframe.allowFullscreen = true;
18346
+ iframe.allow = 'autoplay; encrypted-media';
18347
+ iframe.addEventListener('load', () => {
18348
+ this.state.set({ ...DEFAULT_STATE$3, isReady: true });
18349
+ subscriber.next();
18350
+ });
18351
+ this.el.appendChild(iframe);
18352
+ return () => {
18353
+ if (this.el.contains(iframe)) {
18354
+ this.el.removeChild(iframe);
18355
+ }
18356
+ this.state.set({ ...DEFAULT_STATE$3 });
18357
+ };
18358
+ });
18359
+ },
18360
+ });
18361
+ this.error = computed(() => (this.playerResource.isLoading() ? undefined : this.playerResource.error()), ...(ngDevMode ? [{ debugName: "error" }] : []));
18362
+ }
18363
+ // TikTok embeds have no programmatic control API — these are intentional no-ops.
18364
+ play() {
18365
+ // no-op
18366
+ }
18367
+ pause() {
18368
+ // no-op
18369
+ }
18370
+ mute() {
18371
+ // no-op
18372
+ }
18373
+ unmute() {
18374
+ // no-op
18375
+ }
18376
+ seek() {
18377
+ // no-op
18378
+ }
18379
+ retry() {
18380
+ this.playerResource.reload();
18381
+ }
18382
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TikTokPlayerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
18383
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.1", type: TikTokPlayerDirective, isStandalone: true, inputs: { videoId: { classPropertyName: "videoId", publicName: "videoId", isSignal: true, isRequired: true, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
18384
+ { provide: TIKTOK_PLAYER_TOKEN, useExisting: TikTokPlayerDirective },
18385
+ { provide: STREAM_PLAYER_TOKEN, useExisting: TikTokPlayerDirective },
18386
+ ], ngImport: i0 }); }
18387
+ }
18388
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TikTokPlayerDirective, decorators: [{
18389
+ type: Directive,
18390
+ args: [{
18391
+ providers: [
18392
+ { provide: TIKTOK_PLAYER_TOKEN, useExisting: TikTokPlayerDirective },
18393
+ { provide: STREAM_PLAYER_TOKEN, useExisting: TikTokPlayerDirective },
18394
+ ],
18395
+ }]
18396
+ }], propDecorators: { videoId: [{ type: i0.Input, args: [{ isSignal: true, alias: "videoId", required: true }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }] } });
18397
+
18398
+ class TikTokPlayerComponent {
18399
+ constructor() {
18400
+ this.player = inject(TIKTOK_PLAYER_TOKEN);
18401
+ this.state = this.player.state;
18402
+ this.error = this.player.error;
18403
+ }
18404
+ retry() {
18405
+ this.player.retry();
18406
+ }
18407
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TikTokPlayerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18408
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: TikTokPlayerComponent, isStandalone: true, selector: "et-tiktok-player", host: { classAttribute: "et-tiktok-player" }, hostDirectives: [{ directive: TikTokPlayerDirective, inputs: ["videoId", "videoId", "width", "width", "height", "height"] }], ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
18409
+ }
18410
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TikTokPlayerComponent, decorators: [{
18411
+ type: Component,
18412
+ args: [{
18413
+ selector: 'et-tiktok-player',
18414
+ template: '',
18415
+ changeDetection: ChangeDetectionStrategy.OnPush,
18416
+ encapsulation: ViewEncapsulation.None,
18417
+ hostDirectives: [
18418
+ {
18419
+ directive: TikTokPlayerDirective,
18420
+ inputs: ['videoId', 'width', 'height'],
18421
+ },
18422
+ ],
18423
+ host: {
18424
+ class: 'et-tiktok-player',
18425
+ },
18426
+ }]
18427
+ }] });
18428
+
18429
+ const TWITCH_EMBED_URL = 'https://embed.twitch.tv/embed/v1.js';
18430
+ const TWITCH_PLAYER_TOKEN = new InjectionToken('TWITCH_PLAYER_TOKEN');
18431
+ const DEFAULT_STATE$2 = {
18432
+ isReady: false,
18433
+ isPlaying: false,
18434
+ isMuted: false,
18435
+ isEnded: false,
18436
+ duration: null,
18437
+ currentTime: null,
18438
+ };
18439
+ class TwitchPlayerDirective {
18440
+ constructor() {
18441
+ this.el = injectHostElement();
18442
+ this.scriptLoader = injectStreamScriptLoader();
18443
+ this.platformId = inject(PLATFORM_ID);
18444
+ this.CAPABILITIES = {
18445
+ canPlay: true,
18446
+ canPause: true,
18447
+ canMute: true,
18448
+ canSeek: true,
18449
+ canGetDuration: true,
18450
+ isLiveCapable: true,
18451
+ };
18452
+ this.state = signal({ ...DEFAULT_STATE$2 }, ...(ngDevMode ? [{ debugName: "state" }] : []));
18453
+ /** Live channel name. Use either `channel` (live) or `video` (VOD), not both. */
18454
+ this.channel = input(null, ...(ngDevMode ? [{ debugName: "channel" }] : []));
18455
+ /** VOD video ID. Use either `channel` (live) or `video` (VOD), not both. */
18456
+ this.video = input(null, ...(ngDevMode ? [{ debugName: "video" }] : []));
18457
+ this.width = input('100%', ...(ngDevMode ? [{ debugName: "width" }] : []));
18458
+ this.height = input('100%', ...(ngDevMode ? [{ debugName: "height" }] : []));
18459
+ this.autoplay = input(false, { ...(ngDevMode ? { debugName: "autoplay" } : {}), transform: booleanAttribute });
18460
+ this.startTime = input(0, { ...(ngDevMode ? { debugName: "startTime" } : {}), transform: numberAttribute });
18461
+ this.playerResource = rxResource({
18462
+ params: () => {
18463
+ if (!isPlatformBrowser(this.platformId))
18464
+ return null;
18465
+ const channel = this.channel();
18466
+ const video = this.video();
18467
+ if (!channel && !video) {
18468
+ if (isDevMode())
18469
+ console.warn('[et-twitch-player] Either `channel` or `video` input is required.');
18470
+ return null;
18471
+ }
18472
+ return { channel, video };
18473
+ },
18474
+ stream: ({ params }) => {
18475
+ if (!params)
18476
+ return EMPTY;
18477
+ return this.scriptLoader.load(TWITCH_EMBED_URL).pipe(switchMap(() => new Observable((subscriber) => {
18478
+ const win = window;
18479
+ const TwitchEmbed = win.Twitch?.Embed;
18480
+ if (!TwitchEmbed) {
18481
+ if (isDevMode())
18482
+ console.error('[et-twitch-player] Twitch Embed SDK not available after script load.');
18483
+ subscriber.error(new Error('Twitch Embed SDK not available'));
18484
+ return;
18485
+ }
18486
+ let active = true;
18487
+ const startSeconds = this.startTime();
18488
+ const embed = new TwitchEmbed(this.el, {
18489
+ width: this.width(),
18490
+ height: this.height(),
18491
+ parent: [window.location.hostname],
18492
+ autoplay: this.autoplay(),
18493
+ ...(params.channel ? { channel: params.channel } : {}),
18494
+ ...(params.video ? { video: params.video } : {}),
18495
+ ...(startSeconds ? { time: secondsToTimestamp(startSeconds) } : {}),
18496
+ });
18497
+ embed.addEventListener(TwitchEmbed.READY, () => {
18498
+ if (!active)
18499
+ return;
18500
+ const player = embed.getPlayer();
18501
+ this.state.set({ ...DEFAULT_STATE$2, isReady: true });
18502
+ subscriber.next(player);
18503
+ });
18504
+ embed.addEventListener(TwitchEmbed.PLAY, () => {
18505
+ if (!active)
18506
+ return;
18507
+ const player = embed.getPlayer();
18508
+ this.state.update((s) => ({
18509
+ ...s,
18510
+ isPlaying: true,
18511
+ isEnded: false,
18512
+ duration: player.getDuration(),
18513
+ currentTime: player.getCurrentTime(),
18514
+ }));
18515
+ });
18516
+ embed.addEventListener(TwitchEmbed.PAUSE, () => {
18517
+ if (!active)
18518
+ return;
18519
+ this.state.update((s) => ({ ...s, isPlaying: false }));
18520
+ });
18521
+ embed.addEventListener(TwitchEmbed.ENDED, () => {
18522
+ if (!active)
18523
+ return;
18524
+ this.state.update((s) => ({ ...s, isPlaying: false, isEnded: true }));
18525
+ });
18526
+ return () => {
18527
+ active = false;
18528
+ this.el.innerHTML = '';
18529
+ this.state.set({ ...DEFAULT_STATE$2 });
18530
+ };
18531
+ })));
18532
+ },
18533
+ });
18534
+ this.error = computed(() => (this.playerResource.isLoading() ? undefined : this.playerResource.error()), ...(ngDevMode ? [{ debugName: "error" }] : []));
18535
+ }
18536
+ play() {
18537
+ this.playerResource.value()?.play();
18538
+ }
18539
+ pause() {
18540
+ this.playerResource.value()?.pause();
18541
+ }
18542
+ mute() {
18543
+ this.playerResource.value()?.setMuted(true);
18544
+ this.state.update((s) => ({ ...s, isMuted: true }));
18545
+ }
18546
+ unmute() {
18547
+ this.playerResource.value()?.setMuted(false);
18548
+ this.state.update((s) => ({ ...s, isMuted: false }));
18549
+ }
18550
+ seek(seconds) {
18551
+ this.playerResource.value()?.seek(seconds);
18552
+ }
18553
+ retry() {
18554
+ this.playerResource.reload();
18555
+ }
18556
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TwitchPlayerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
18557
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.1", type: TwitchPlayerDirective, isStandalone: true, inputs: { channel: { classPropertyName: "channel", publicName: "channel", isSignal: true, isRequired: false, transformFunction: null }, video: { classPropertyName: "video", publicName: "video", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, autoplay: { classPropertyName: "autoplay", publicName: "autoplay", isSignal: true, isRequired: false, transformFunction: null }, startTime: { classPropertyName: "startTime", publicName: "startTime", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
18558
+ { provide: TWITCH_PLAYER_TOKEN, useExisting: TwitchPlayerDirective },
18559
+ { provide: STREAM_PLAYER_TOKEN, useExisting: TwitchPlayerDirective },
18560
+ ], ngImport: i0 }); }
18561
+ }
18562
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TwitchPlayerDirective, decorators: [{
18563
+ type: Directive,
18564
+ args: [{
18565
+ providers: [
18566
+ { provide: TWITCH_PLAYER_TOKEN, useExisting: TwitchPlayerDirective },
18567
+ { provide: STREAM_PLAYER_TOKEN, useExisting: TwitchPlayerDirective },
18568
+ ],
18569
+ }]
18570
+ }], propDecorators: { channel: [{ type: i0.Input, args: [{ isSignal: true, alias: "channel", required: false }] }], video: [{ type: i0.Input, args: [{ isSignal: true, alias: "video", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], autoplay: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoplay", required: false }] }], startTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "startTime", required: false }] }] } });
18571
+ const secondsToTimestamp = (seconds) => {
18572
+ const h = Math.floor(seconds / 3600);
18573
+ const m = Math.floor((seconds % 3600) / 60);
18574
+ const s = Math.floor(seconds % 60);
18575
+ return `${h}h${m}m${s}s`;
18576
+ };
18577
+
18578
+ class TwitchPlayerComponent {
18579
+ constructor() {
18580
+ this.player = inject(TWITCH_PLAYER_TOKEN);
18581
+ this.state = this.player.state;
18582
+ this.error = this.player.error;
18583
+ }
18584
+ retry() {
18585
+ this.player.retry();
18586
+ }
18587
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TwitchPlayerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18588
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: TwitchPlayerComponent, isStandalone: true, selector: "et-twitch-player", host: { classAttribute: "et-twitch-player" }, hostDirectives: [{ directive: TwitchPlayerDirective, inputs: ["channel", "channel", "video", "video", "width", "width", "height", "height", "autoplay", "autoplay", "startTime", "startTime"] }], ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
18589
+ }
18590
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TwitchPlayerComponent, decorators: [{
18591
+ type: Component,
18592
+ args: [{
18593
+ selector: 'et-twitch-player',
18594
+ template: '',
18595
+ changeDetection: ChangeDetectionStrategy.OnPush,
18596
+ encapsulation: ViewEncapsulation.None,
18597
+ hostDirectives: [
18598
+ {
18599
+ directive: TwitchPlayerDirective,
18600
+ inputs: ['channel', 'video', 'width', 'height', 'autoplay', 'startTime'],
18601
+ },
18602
+ ],
18603
+ host: {
18604
+ class: 'et-twitch-player',
18605
+ },
18606
+ }]
18607
+ }] });
18608
+
18609
+ const VIMEO_SDK_URL = 'https://player.vimeo.com/api/player.js';
18610
+ const VIMEO_PLAYER_TOKEN = new InjectionToken('VIMEO_PLAYER_TOKEN');
18611
+ const DEFAULT_STATE$1 = {
18612
+ isReady: false,
18613
+ isPlaying: false,
18614
+ isMuted: false,
18615
+ isEnded: false,
18616
+ duration: null,
18617
+ currentTime: null,
18618
+ };
18619
+ class VimeoPlayerDirective {
18620
+ constructor() {
18621
+ this.el = injectHostElement();
18622
+ this.scriptLoader = injectStreamScriptLoader();
18623
+ this.platformId = inject(PLATFORM_ID);
18624
+ this.CAPABILITIES = {
18625
+ canPlay: true,
18626
+ canPause: true,
18627
+ canMute: true,
18628
+ canSeek: true,
18629
+ canGetDuration: true,
18630
+ isLiveCapable: true,
18631
+ };
18632
+ this.state = signal({ ...DEFAULT_STATE$1 }, ...(ngDevMode ? [{ debugName: "state" }] : []));
18633
+ this.videoId = input.required(...(ngDevMode ? [{ debugName: "videoId" }] : []));
18634
+ this.startTime = input(0, { ...(ngDevMode ? { debugName: "startTime" } : {}), transform: numberAttribute });
18635
+ this.width = input('100%', ...(ngDevMode ? [{ debugName: "width" }] : []));
18636
+ this.height = input('100%', ...(ngDevMode ? [{ debugName: "height" }] : []));
18637
+ this.playerResource = rxResource({
18638
+ params: () => (isPlatformBrowser(this.platformId) ? this.videoId() : null),
18639
+ stream: ({ params: videoId }) => {
18640
+ if (!videoId)
18641
+ return EMPTY;
18642
+ return this.scriptLoader.load(VIMEO_SDK_URL).pipe(switchMap(() => new Observable((subscriber) => {
18643
+ const win = window;
18644
+ const startTime = this.startTime();
18645
+ let active = true;
18646
+ // Vimeo width/height options only accept numbers (pixels).
18647
+ // Apply %/px sizing to the host element and let the iframe fill it.
18648
+ const w = this.width();
18649
+ const h = this.height();
18650
+ this.el.style.display = 'block';
18651
+ this.el.style.width = typeof w === 'number' ? `${w}px` : w;
18652
+ this.el.style.height = typeof h === 'number' ? `${h}px` : h;
18653
+ // responsive: true makes the iframe fill 100% of the host element.
18654
+ // Dimensions are applied to the host element via CSS above.
18655
+ const player = new win.Vimeo.Player(this.el, { id: videoId, responsive: true });
18656
+ const onPlay = (data) => {
18657
+ const e = data;
18658
+ this.state.update((s) => ({
18659
+ ...s,
18660
+ isPlaying: true,
18661
+ isEnded: false,
18662
+ duration: e.duration,
18663
+ currentTime: e.seconds,
18664
+ }));
18665
+ };
18666
+ const onPause = (data) => {
18667
+ const e = data;
18668
+ this.state.update((s) => ({ ...s, isPlaying: false, currentTime: e.seconds }));
18669
+ };
18670
+ const onEnded = (data) => {
18671
+ const e = data;
18672
+ this.state.update((s) => ({ ...s, isPlaying: false, isEnded: true, currentTime: e.seconds }));
18673
+ };
18674
+ const onTimeUpdate = (data) => {
18675
+ const e = data;
18676
+ this.state.update((s) => ({ ...s, duration: e.duration, currentTime: e.seconds }));
18677
+ };
18678
+ player.on('play', onPlay);
18679
+ player.on('pause', onPause);
18680
+ player.on('ended', onEnded);
18681
+ player.on('timeupdate', onTimeUpdate);
18682
+ player
18683
+ .ready()
18684
+ .then(() => player.getMuted())
18685
+ .then((isMuted) => {
18686
+ if (!active)
18687
+ return;
18688
+ this.state.set({ ...DEFAULT_STATE$1, isReady: true, isMuted });
18689
+ if (startTime > 0)
18690
+ player.setCurrentTime(startTime);
18691
+ subscriber.next(player);
18692
+ });
18693
+ return () => {
18694
+ active = false;
18695
+ player.off('play', onPlay);
18696
+ player.off('pause', onPause);
18697
+ player.off('ended', onEnded);
18698
+ player.off('timeupdate', onTimeUpdate);
18699
+ player.destroy();
18700
+ this.state.set({ ...DEFAULT_STATE$1 });
18701
+ };
18702
+ })));
18703
+ },
18704
+ });
18705
+ this.error = computed(() => (this.playerResource.isLoading() ? undefined : this.playerResource.error()), ...(ngDevMode ? [{ debugName: "error" }] : []));
18706
+ }
18707
+ play() {
18708
+ this.playerResource.value()?.play();
18709
+ }
18710
+ pause() {
18711
+ this.playerResource.value()?.pause();
18712
+ }
18713
+ mute() {
18714
+ this.playerResource
18715
+ .value()
18716
+ ?.setMuted(true)
18717
+ .then(() => this.state.update((s) => ({ ...s, isMuted: true })));
18718
+ }
18719
+ unmute() {
18720
+ this.playerResource
18721
+ .value()
18722
+ ?.setMuted(false)
18723
+ .then(() => this.state.update((s) => ({ ...s, isMuted: false })));
18724
+ }
18725
+ seek(seconds) {
18726
+ this.playerResource.value()?.setCurrentTime(seconds);
18727
+ }
18728
+ retry() {
18729
+ this.playerResource.reload();
18730
+ }
18731
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: VimeoPlayerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
18732
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.1", type: VimeoPlayerDirective, isStandalone: true, inputs: { videoId: { classPropertyName: "videoId", publicName: "videoId", isSignal: true, isRequired: true, transformFunction: null }, startTime: { classPropertyName: "startTime", publicName: "startTime", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
18733
+ { provide: VIMEO_PLAYER_TOKEN, useExisting: VimeoPlayerDirective },
18734
+ { provide: STREAM_PLAYER_TOKEN, useExisting: VimeoPlayerDirective },
18735
+ ], ngImport: i0 }); }
18736
+ }
18737
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: VimeoPlayerDirective, decorators: [{
18738
+ type: Directive,
18739
+ args: [{
18740
+ providers: [
18741
+ { provide: VIMEO_PLAYER_TOKEN, useExisting: VimeoPlayerDirective },
18742
+ { provide: STREAM_PLAYER_TOKEN, useExisting: VimeoPlayerDirective },
18743
+ ],
18744
+ }]
18745
+ }], propDecorators: { videoId: [{ type: i0.Input, args: [{ isSignal: true, alias: "videoId", required: true }] }], startTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "startTime", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }] } });
18746
+
18747
+ class VimeoPlayerComponent {
18748
+ constructor() {
18749
+ this.player = inject(VIMEO_PLAYER_TOKEN);
18750
+ this.state = this.player.state;
18751
+ this.error = this.player.error;
18752
+ }
18753
+ retry() {
18754
+ this.player.retry();
18755
+ }
18756
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: VimeoPlayerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18757
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: VimeoPlayerComponent, isStandalone: true, selector: "et-vimeo-player", host: { classAttribute: "et-vimeo-player" }, hostDirectives: [{ directive: VimeoPlayerDirective, inputs: ["videoId", "videoId", "startTime", "startTime", "width", "width", "height", "height"] }], ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
18758
+ }
18759
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: VimeoPlayerComponent, decorators: [{
18760
+ type: Component,
18761
+ args: [{
18762
+ selector: 'et-vimeo-player',
18763
+ template: '',
18764
+ changeDetection: ChangeDetectionStrategy.OnPush,
18765
+ encapsulation: ViewEncapsulation.None,
18766
+ hostDirectives: [
18767
+ {
18768
+ directive: VimeoPlayerDirective,
18769
+ inputs: ['videoId', 'startTime', 'width', 'height'],
18770
+ },
18771
+ ],
18772
+ host: {
18773
+ class: 'et-vimeo-player',
18774
+ },
18775
+ }]
18776
+ }] });
18777
+
18778
+ class YoutubePlayerParamsDirective {
18779
+ constructor() {
18780
+ this.videoId = input.required(...(ngDevMode ? [{ debugName: "videoId" }] : []));
18781
+ this.startTime = input(0, { ...(ngDevMode ? { debugName: "startTime" } : {}), transform: numberAttribute });
18782
+ this.width = input('100%', ...(ngDevMode ? [{ debugName: "width" }] : []));
18783
+ this.height = input('100%', ...(ngDevMode ? [{ debugName: "height" }] : []));
18784
+ }
18785
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: YoutubePlayerParamsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
18786
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.1", type: YoutubePlayerParamsDirective, isStandalone: true, inputs: { videoId: { classPropertyName: "videoId", publicName: "videoId", isSignal: true, isRequired: true, transformFunction: null }, startTime: { classPropertyName: "startTime", publicName: "startTime", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
18787
+ }
18788
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: YoutubePlayerParamsDirective, decorators: [{
18789
+ type: Directive,
18790
+ args: [{}]
18791
+ }], propDecorators: { videoId: [{ type: i0.Input, args: [{ isSignal: true, alias: "videoId", required: true }] }], startTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "startTime", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }] } });
18792
+
18793
+ const pipMoveBefore = (newParent, child, before = null) => {
18794
+ if ('moveBefore' in newParent) {
18795
+ try {
18796
+ newParent.moveBefore(child, before);
18797
+ }
18798
+ catch {
18799
+ newParent.insertBefore(child, before);
18800
+ }
18801
+ }
18802
+ else {
18803
+ newParent.insertBefore(child, before);
18804
+ }
18805
+ };
18806
+ const animateWithFixedWrapper = (config) => {
18807
+ const { playerEl, fromRect, toRect, document, onFinish, duration = 250, easing = 'cubic-bezier(0.4, 0, 0.2, 1)', } = config;
18808
+ const wrapper = document.createElement('div');
18809
+ wrapper.style.cssText = `
18810
+ position: fixed;
18811
+ left: ${fromRect.left}px;
18812
+ top: ${fromRect.top}px;
18813
+ width: ${fromRect.width}px;
18814
+ height: ${fromRect.height}px;
18815
+ overflow: visible;
18816
+ pointer-events: none;
18817
+ z-index: 2147483647;
18818
+ `;
18819
+ document.body.appendChild(wrapper);
18820
+ pipMoveBefore(wrapper, playerEl);
18821
+ const dx = toRect.left - fromRect.left;
18822
+ const dy = toRect.top - fromRect.top;
18823
+ const sx = fromRect.width > 0 ? toRect.width / fromRect.width : 1;
18824
+ const sy = fromRect.height > 0 ? toRect.height / fromRect.height : 1;
18825
+ const anim = wrapper.animate([
18826
+ { transformOrigin: 'top left', transform: 'none' },
18827
+ { transformOrigin: 'top left', transform: `translate(${dx}px, ${dy}px) scale(${sx}, ${sy})` },
18828
+ ], { duration, easing, fill: 'both' });
18829
+ const cleanup = () => {
18830
+ onFinish();
18831
+ wrapper.remove();
18832
+ };
18833
+ anim.addEventListener('finish', cleanup, { once: true });
18834
+ anim.addEventListener('cancel', cleanup, { once: true });
18835
+ };
18836
+ const [provideStreamPipManager, injectStreamPipManager] = createRootProvider(() => {
18837
+ const document = inject(DOCUMENT);
18838
+ const container = document.createElement('div');
18839
+ container.className = 'et-stream-pip';
18840
+ document.body.appendChild(container);
18841
+ const _entry = signal(null, ...(ngDevMode ? [{ debugName: "_entry" }] : []));
18842
+ const isActive = computed(() => _entry() !== null, ...(ngDevMode ? [{ debugName: "isActive" }] : []));
18843
+ const activate = (element) => {
18844
+ if (_entry())
18845
+ return;
18846
+ const originalParent = element.parentElement;
18847
+ if (!originalParent) {
18848
+ console.warn('[StreamPipManager] activate() called on a detached element.');
18849
+ return;
18850
+ }
18851
+ const originalNextSibling = element.nextSibling;
18852
+ pipMoveBefore(container, element);
18853
+ _entry.set({ element, originalParent, originalNextSibling });
18854
+ };
18855
+ const deactivate = () => {
18856
+ const entry = _entry();
18857
+ if (!entry)
18858
+ return;
18859
+ const { element, originalParent, originalNextSibling } = entry;
18860
+ if (originalParent.isConnected) {
18861
+ pipMoveBefore(originalParent, element, originalNextSibling);
18862
+ }
18863
+ else {
18864
+ element.remove();
18865
+ }
18866
+ _entry.set(null);
18867
+ };
18868
+ return { activate, deactivate, isActive, container };
18869
+ }, { name: 'Stream PIP Manager' });
18870
+
18871
+ const [provideStreamManager, injectStreamManager] = createRootProvider(() => {
18872
+ const document = inject(DOCUMENT);
18873
+ const renderer = injectRenderer();
18874
+ const container = renderer.createElement('div');
18875
+ renderer.addClass(container, 'et-stream-manager');
18876
+ renderer.appendChild(document.body, container);
18877
+ const players = new Map();
18878
+ const slots = new Map();
18879
+ const pips = signal([], ...(ngDevMode ? [{ debugName: "pips" }] : []));
18880
+ const pipInitialRects = new Map();
18881
+ const resolveBestSlot = (playerId) => {
18882
+ let best = null;
18883
+ for (const slot of slots.values()) {
18884
+ if (slot.playerId !== playerId)
18885
+ continue;
18886
+ if (!best) {
18887
+ best = slot;
18888
+ continue;
18889
+ }
18890
+ if (!best.priority) {
18891
+ best = slot;
18892
+ continue;
18893
+ }
18894
+ if (slot.priority) {
18895
+ best = slot;
18896
+ }
18897
+ }
18898
+ return best;
18899
+ };
18900
+ const moveWithFlip = (element, targetParent) => {
18901
+ const initialRect = element.getBoundingClientRect();
18902
+ if (initialRect.width === 0 && initialRect.height === 0) {
18903
+ pipMoveBefore(targetParent, element);
18904
+ return;
18905
+ }
18906
+ const flip = createFlipAnimation({ element });
18907
+ flip.updateInit();
18908
+ pipMoveBefore(targetParent, element);
18909
+ flip.play();
18910
+ };
18911
+ const hasSlotFor = (playerId) => {
18912
+ for (const slot of slots.values()) {
18913
+ if (slot.playerId === playerId)
18914
+ return true;
18915
+ }
18916
+ return false;
18917
+ };
18918
+ const isInPip = (playerId) => pips().some((p) => p.playerId === playerId);
18919
+ const reassignPlayer = (playerId) => {
18920
+ const player = players.get(playerId);
18921
+ if (!player || isInPip(playerId))
18922
+ return;
18923
+ const bestSlot = resolveBestSlot(playerId);
18924
+ const targetParent = bestSlot?.element ?? container;
18925
+ if (player.element.parentElement !== targetParent) {
18926
+ moveWithFlip(player.element, targetParent);
18927
+ player.currentSlotElement = bestSlot?.element ?? null;
18928
+ }
18929
+ };
18930
+ const registerPlayer = (entry) => {
18931
+ const internal = {
18932
+ ...entry,
18933
+ currentSlotElement: null,
18934
+ isOrphaned: false,
18935
+ isAnimatingOut: false,
18936
+ };
18937
+ players.set(entry.id, internal);
18938
+ renderer.appendChild(container, entry.element);
18939
+ reassignPlayer(entry.id);
18940
+ };
18941
+ const unregisterPlayer = (playerId) => {
18942
+ const entry = players.get(playerId);
18943
+ if (!entry)
18944
+ return;
18945
+ entry.element.remove();
18946
+ players.delete(playerId);
18947
+ pips.update((pips) => pips.filter((p) => p.playerId !== playerId));
18948
+ entry.onDestroy?.();
18949
+ };
18950
+ const registerSlot = (entry) => {
18951
+ slots.set(entry.element, entry);
18952
+ const player = players.get(entry.playerId);
18953
+ if (player?.isOrphaned)
18954
+ player.isOrphaned = false;
18955
+ reassignPlayer(entry.playerId);
18956
+ };
18957
+ const unregisterSlot = (element) => {
18958
+ const slot = slots.get(element);
18959
+ if (!slot)
18960
+ return;
18961
+ slots.delete(element);
18962
+ const player = players.get(slot.playerId);
18963
+ if (!player)
18964
+ return;
18965
+ const hasOtherSlot = hasSlotFor(slot.playerId);
18966
+ if (isInPip(slot.playerId)) {
18967
+ if (!hasOtherSlot)
18968
+ player.isOrphaned = true;
18969
+ return;
18970
+ }
18971
+ if (player.currentSlotElement === element) {
18972
+ if (hasOtherSlot) {
18973
+ reassignPlayer(slot.playerId);
18974
+ }
18975
+ else {
18976
+ unregisterPlayer(slot.playerId);
18977
+ }
18978
+ }
18979
+ };
18980
+ const pipActivate = (element, onBack) => {
18981
+ const slot = slots.get(element);
18982
+ if (!slot)
18983
+ return;
18984
+ const player = players.get(slot.playerId);
18985
+ if (!player || isInPip(slot.playerId))
18986
+ return;
18987
+ const initialRect = player.element.getBoundingClientRect();
18988
+ if (initialRect.width > 0 || initialRect.height > 0) {
18989
+ pipInitialRects.set(slot.playerId, initialRect);
18990
+ }
18991
+ pipMoveBefore(container, player.element);
18992
+ player.currentSlotElement = null;
18993
+ pips.update((pips) => [...pips, { playerId: slot.playerId, onBack: onBack ?? slot.onPipBack }]);
18994
+ };
18995
+ const pipDeactivate = (playerId) => {
18996
+ if (!isInPip(playerId))
18997
+ return;
18998
+ pipInitialRects.delete(playerId);
18999
+ const player = players.get(playerId);
19000
+ if (!player) {
19001
+ pips.update((pips) => pips.filter((p) => p.playerId !== playerId));
19002
+ return;
19003
+ }
19004
+ if (player.isOrphaned) {
19005
+ pips.update((pips) => pips.filter((p) => p.playerId !== playerId));
19006
+ unregisterPlayer(playerId);
19007
+ return;
19008
+ }
19009
+ const fromRect = player.element.getBoundingClientRect();
19010
+ const bestSlot = resolveBestSlot(playerId);
19011
+ const targetParent = bestSlot?.element ?? container;
19012
+ const toRect = targetParent.getBoundingClientRect();
19013
+ if (fromRect.width > 0 && fromRect.height > 0 && toRect.width > 0 && toRect.height > 0) {
19014
+ player.isAnimatingOut = true;
19015
+ animateWithFixedWrapper({
19016
+ playerEl: player.element,
19017
+ fromRect,
19018
+ toRect,
19019
+ document,
19020
+ onFinish: () => {
19021
+ player.isAnimatingOut = false;
19022
+ pipMoveBefore(targetParent, player.element);
19023
+ player.currentSlotElement = bestSlot?.element ?? null;
19024
+ },
19025
+ });
19026
+ }
19027
+ else {
19028
+ pipMoveBefore(targetParent, player.element);
19029
+ player.currentSlotElement = bestSlot?.element ?? null;
19030
+ }
19031
+ pips.update((pips) => pips.filter((p) => p.playerId !== playerId));
19032
+ };
19033
+ const transferPlayer = (oldId, newId) => {
19034
+ const entry = players.get(oldId);
19035
+ if (!entry || oldId === newId)
19036
+ return;
19037
+ players.delete(oldId);
19038
+ players.set(newId, { ...entry, id: newId });
19039
+ pips.update((pips) => pips.map((p) => (p.playerId === oldId ? { ...p, playerId: newId } : p)));
19040
+ };
19041
+ const getPlayerElement = (playerId) => players.get(playerId)?.element ?? null;
19042
+ const getInitialRect = (playerId) => {
19043
+ const rect = pipInitialRects.get(playerId) ?? null;
19044
+ pipInitialRects.delete(playerId);
19045
+ return rect;
19046
+ };
19047
+ const parkPlayerElement = (playerId) => {
19048
+ const player = players.get(playerId);
19049
+ if (!player)
19050
+ return;
19051
+ if (player.isAnimatingOut)
19052
+ return;
19053
+ if (player.element.parentElement === container)
19054
+ return;
19055
+ pipMoveBefore(container, player.element);
19056
+ };
19057
+ return {
19058
+ pips: pips.asReadonly(),
19059
+ registerPlayer,
19060
+ unregisterPlayer,
19061
+ registerSlot,
19062
+ unregisterSlot,
19063
+ pipActivate,
19064
+ pipDeactivate,
19065
+ transferPlayer,
19066
+ getPlayerElement,
19067
+ getInitialRect,
19068
+ parkPlayerElement,
19069
+ };
19070
+ }, { name: 'Stream Manager' });
19071
+
19072
+ const YT_API_URL = 'https://www.youtube.com/iframe_api';
19073
+ const YOUTUBE_PLAYER_TOKEN = new InjectionToken('YOUTUBE_PLAYER_TOKEN');
19074
+ const DEFAULT_STATE = {
19075
+ isReady: false,
19076
+ isPlaying: false,
19077
+ isMuted: false,
19078
+ isEnded: false,
19079
+ duration: null,
19080
+ currentTime: null,
19081
+ };
19082
+ const waitForYtReady = () => {
19083
+ const win = window;
19084
+ if (win.YT?.Player)
19085
+ return of(undefined);
19086
+ return new Observable((subscriber) => {
19087
+ const prev = win.onYouTubeIframeAPIReady;
19088
+ win.onYouTubeIframeAPIReady = () => {
19089
+ prev?.();
19090
+ subscriber.next();
19091
+ subscriber.complete();
19092
+ };
19093
+ });
19094
+ };
19095
+ class YoutubePlayerDirective {
19096
+ constructor() {
19097
+ this.el = injectHostElement();
19098
+ this.scriptLoader = injectStreamScriptLoader();
19099
+ this.platformId = inject(PLATFORM_ID);
19100
+ this.renderer = injectRenderer();
19101
+ this.params = inject(YoutubePlayerParamsDirective);
19102
+ this.CAPABILITIES = {
19103
+ canPlay: true,
19104
+ canPause: true,
19105
+ canMute: true,
19106
+ canSeek: true,
19107
+ canGetDuration: true,
19108
+ isLiveCapable: true,
19109
+ };
19110
+ this.state = signal({ ...DEFAULT_STATE }, ...(ngDevMode ? [{ debugName: "state" }] : []));
19111
+ this.playerResource = rxResource({
19112
+ params: () => (isPlatformBrowser(this.platformId) ? this.params.videoId() : null),
19113
+ stream: ({ params: videoId }) => {
19114
+ if (!videoId)
19115
+ return EMPTY;
19116
+ return this.scriptLoader.load(YT_API_URL).pipe(switchMap(() => waitForYtReady()), switchMap(() => new Observable((subscriber) => {
19117
+ const win = window;
19118
+ if (isDevMode() && !win.YT?.Player) {
19119
+ console.error('[et-youtube-player] YT.Player not available after SDK load.');
19120
+ }
19121
+ let currentTimeInterval = null;
19122
+ const clearCurrentTimeInterval = () => {
19123
+ if (currentTimeInterval !== null) {
19124
+ clearInterval(currentTimeInterval);
19125
+ currentTimeInterval = null;
19126
+ }
19127
+ };
19128
+ const placeholder = this.renderer.createElement('div');
19129
+ this.renderer.appendChild(this.el, placeholder);
19130
+ const player = new win.YT.Player(placeholder, {
19131
+ videoId,
19132
+ width: this.params.width(),
19133
+ height: this.params.height(),
19134
+ playerVars: {
19135
+ enablejsapi: 1,
19136
+ origin: window.location.origin,
19137
+ start: this.params.startTime() || undefined,
19138
+ rel: 0,
19139
+ },
19140
+ events: {
19141
+ onReady: () => {
19142
+ this.state.set({ ...DEFAULT_STATE, isReady: true });
19143
+ subscriber.next(player);
19144
+ },
19145
+ onStateChange: (event) => {
19146
+ const YT = win.YT;
19147
+ const s = event.data;
19148
+ const isPlaying = s === YT.PlayerState.PLAYING;
19149
+ clearCurrentTimeInterval();
19150
+ if (isPlaying) {
19151
+ currentTimeInterval = setInterval(() => {
19152
+ this.state.update((prev) => ({
19153
+ ...prev,
19154
+ currentTime: player.getCurrentTime() ?? null,
19155
+ }));
19156
+ }, 250);
19157
+ }
19158
+ this.state.update((prev) => ({
19159
+ ...prev,
19160
+ isPlaying,
19161
+ isEnded: s === YT.PlayerState.ENDED,
19162
+ duration: player.getDuration() ?? null,
19163
+ currentTime: player.getCurrentTime() ?? null,
19164
+ isMuted: player.isMuted(),
19165
+ }));
19166
+ },
19167
+ },
19168
+ });
19169
+ return () => {
19170
+ clearCurrentTimeInterval();
19171
+ player.destroy();
19172
+ this.state.set({ ...DEFAULT_STATE });
19173
+ };
19174
+ })));
19175
+ },
19176
+ });
19177
+ this.error = computed(() => (this.playerResource.isLoading() ? undefined : this.playerResource.error()), ...(ngDevMode ? [{ debugName: "error" }] : []));
19178
+ }
19179
+ play() {
19180
+ this.playerResource.value()?.playVideo();
19181
+ }
19182
+ pause() {
19183
+ this.playerResource.value()?.pauseVideo();
19184
+ }
19185
+ mute() {
19186
+ this.playerResource.value()?.mute();
19187
+ this.state.update((s) => ({ ...s, isMuted: true }));
19188
+ }
19189
+ unmute() {
19190
+ this.playerResource.value()?.unMute();
19191
+ this.state.update((s) => ({ ...s, isMuted: false }));
19192
+ }
19193
+ seek(seconds) {
19194
+ this.playerResource.value()?.seekTo(seconds, true);
19195
+ }
19196
+ retry() {
19197
+ this.playerResource.reload();
19198
+ }
19199
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: YoutubePlayerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
19200
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: YoutubePlayerDirective, isStandalone: true, providers: [
19201
+ { provide: YOUTUBE_PLAYER_TOKEN, useExisting: YoutubePlayerDirective },
19202
+ { provide: STREAM_PLAYER_TOKEN, useExisting: YoutubePlayerDirective },
19203
+ ], ngImport: i0 }); }
19204
+ }
19205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: YoutubePlayerDirective, decorators: [{
19206
+ type: Directive,
19207
+ args: [{
19208
+ providers: [
19209
+ { provide: YOUTUBE_PLAYER_TOKEN, useExisting: YoutubePlayerDirective },
19210
+ { provide: STREAM_PLAYER_TOKEN, useExisting: YoutubePlayerDirective },
19211
+ ],
19212
+ }]
19213
+ }] });
19214
+
19215
+ class YoutubePlayerComponent {
19216
+ constructor() {
19217
+ this.player = inject(YOUTUBE_PLAYER_TOKEN);
19218
+ this.state = this.player.state;
19219
+ this.error = this.player.error;
19220
+ }
19221
+ retry() {
19222
+ this.player.retry();
19223
+ }
19224
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: YoutubePlayerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
19225
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: YoutubePlayerComponent, isStandalone: true, selector: "et-youtube-player", host: { styleAttribute: "display: block; width: 100%; height: 100%", classAttribute: "et-youtube-player" }, hostDirectives: [{ directive: YoutubePlayerParamsDirective, inputs: ["videoId", "videoId", "startTime", "startTime", "width", "width", "height", "height"] }, { directive: YoutubePlayerDirective }], ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
19226
+ }
19227
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: YoutubePlayerComponent, decorators: [{
19228
+ type: Component,
19229
+ args: [{
19230
+ selector: 'et-youtube-player',
19231
+ template: '',
19232
+ changeDetection: ChangeDetectionStrategy.OnPush,
19233
+ encapsulation: ViewEncapsulation.None,
19234
+ hostDirectives: [
19235
+ {
19236
+ directive: YoutubePlayerParamsDirective,
19237
+ inputs: ['videoId', 'startTime', 'width', 'height'],
19238
+ },
19239
+ YoutubePlayerDirective,
19240
+ ],
19241
+ host: {
19242
+ class: 'et-youtube-player',
19243
+ style: 'display: block; width: 100%; height: 100%',
19244
+ },
19245
+ }]
19246
+ }] });
19247
+
19248
+ const YOUTUBE_PLAYER_SLOT_TOKEN = new InjectionToken('YOUTUBE_PLAYER_SLOT_TOKEN');
19249
+ class YoutubePlayerSlotDirective {
19250
+ constructor() {
19251
+ this.manager = injectStreamManager();
19252
+ this.el = injectHostElement();
19253
+ this.appRef = inject(ApplicationRef);
19254
+ this.envInjector = inject(EnvironmentInjector);
19255
+ this.params = inject(YoutubePlayerParamsDirective);
19256
+ this.streamSlotPriority = input(false, { ...(ngDevMode ? { debugName: "streamSlotPriority" } : {}), transform: booleanAttribute });
19257
+ this.streamSlotOnPipBack = input(...(ngDevMode ? [undefined, { debugName: "streamSlotOnPipBack" }] : []));
19258
+ this.currentPlayerId = null;
19259
+ effect(() => {
19260
+ const newPlayerId = `youtube-${this.params.videoId()}`;
19261
+ const oldPlayerId = this.currentPlayerId;
19262
+ if (!oldPlayerId || oldPlayerId === newPlayerId)
19263
+ return;
19264
+ this.manager.transferPlayer(oldPlayerId, newPlayerId);
19265
+ this.manager.unregisterSlot(this.el);
19266
+ this.manager.registerSlot({
19267
+ playerId: newPlayerId,
19268
+ priority: this.streamSlotPriority(),
19269
+ element: this.el,
19270
+ onPipBack: this.streamSlotOnPipBack(),
19271
+ });
19272
+ this.currentPlayerId = newPlayerId;
19273
+ });
19274
+ }
19275
+ ngOnInit() {
19276
+ const videoId = this.params.videoId();
19277
+ this.currentPlayerId = `youtube-${videoId}`;
19278
+ if (this.manager.getPlayerElement(this.currentPlayerId)) {
19279
+ this.manager.registerSlot({
19280
+ playerId: this.currentPlayerId,
19281
+ priority: this.streamSlotPriority(),
19282
+ element: this.el,
19283
+ onPipBack: this.streamSlotOnPipBack(),
19284
+ });
19285
+ return;
19286
+ }
19287
+ const componentRef = createComponent(YoutubePlayerComponent, {
19288
+ environmentInjector: this.envInjector,
19289
+ bindings: [
19290
+ inputBinding('videoId', () => this.params.videoId()),
19291
+ inputBinding('startTime', () => this.params.startTime()),
19292
+ inputBinding('width', () => this.params.width()),
19293
+ inputBinding('height', () => this.params.height()),
19294
+ ],
19295
+ });
19296
+ this.appRef.attachView(componentRef.hostView);
19297
+ const playerElement = componentRef.location.nativeElement;
19298
+ this.manager.registerPlayer({
19299
+ id: this.currentPlayerId,
19300
+ element: playerElement,
19301
+ onDestroy: () => {
19302
+ this.appRef.detachView(componentRef.hostView);
19303
+ componentRef.destroy();
19304
+ },
19305
+ });
19306
+ this.manager.registerSlot({
19307
+ playerId: this.currentPlayerId,
19308
+ priority: this.streamSlotPriority(),
19309
+ element: this.el,
19310
+ onPipBack: this.streamSlotOnPipBack(),
19311
+ });
19312
+ }
19313
+ ngOnDestroy() {
19314
+ if (this.currentPlayerId) {
19315
+ this.manager.unregisterSlot(this.el);
19316
+ }
19317
+ }
19318
+ pipActivate(onBack) {
19319
+ this.manager.pipActivate(this.el, onBack);
19320
+ }
19321
+ pipDeactivate() {
19322
+ if (this.currentPlayerId) {
19323
+ this.manager.pipDeactivate(this.currentPlayerId);
19324
+ }
19325
+ }
19326
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: YoutubePlayerSlotDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
19327
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.1", type: YoutubePlayerSlotDirective, isStandalone: true, inputs: { streamSlotPriority: { classPropertyName: "streamSlotPriority", publicName: "streamSlotPriority", isSignal: true, isRequired: false, transformFunction: null }, streamSlotOnPipBack: { classPropertyName: "streamSlotOnPipBack", publicName: "streamSlotOnPipBack", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: YOUTUBE_PLAYER_SLOT_TOKEN, useExisting: YoutubePlayerSlotDirective }], ngImport: i0 }); }
19328
+ }
19329
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: YoutubePlayerSlotDirective, decorators: [{
19330
+ type: Directive,
19331
+ args: [{
19332
+ providers: [{ provide: YOUTUBE_PLAYER_SLOT_TOKEN, useExisting: YoutubePlayerSlotDirective }],
19333
+ }]
19334
+ }], ctorParameters: () => [], propDecorators: { streamSlotPriority: [{ type: i0.Input, args: [{ isSignal: true, alias: "streamSlotPriority", required: false }] }], streamSlotOnPipBack: [{ type: i0.Input, args: [{ isSignal: true, alias: "streamSlotOnPipBack", required: false }] }] } });
19335
+
19336
+ class YoutubePlayerSlotComponent {
19337
+ constructor() {
19338
+ this.slot = inject(YOUTUBE_PLAYER_SLOT_TOKEN);
19339
+ }
19340
+ pipActivate(onBack) {
19341
+ this.slot.pipActivate(onBack);
19342
+ }
19343
+ pipDeactivate() {
19344
+ this.slot.pipDeactivate();
19345
+ }
19346
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: YoutubePlayerSlotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
19347
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: YoutubePlayerSlotComponent, isStandalone: true, selector: "et-youtube-player-slot", host: { classAttribute: "et-youtube-player-slot" }, hostDirectives: [{ directive: YoutubePlayerParamsDirective, inputs: ["videoId", "videoId", "startTime", "startTime", "width", "width", "height", "height"] }, { directive: YoutubePlayerSlotDirective, inputs: ["streamSlotPriority", "streamSlotPriority", "streamSlotOnPipBack", "streamSlotOnPipBack"] }], ngImport: i0, template: '<ng-content />', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
19348
+ }
19349
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: YoutubePlayerSlotComponent, decorators: [{
19350
+ type: Component,
19351
+ args: [{
19352
+ selector: 'et-youtube-player-slot',
19353
+ template: '<ng-content />',
19354
+ changeDetection: ChangeDetectionStrategy.OnPush,
19355
+ encapsulation: ViewEncapsulation.None,
19356
+ hostDirectives: [
19357
+ {
19358
+ directive: YoutubePlayerParamsDirective,
19359
+ inputs: ['videoId', 'startTime', 'width', 'height'],
19360
+ },
19361
+ {
19362
+ directive: YoutubePlayerSlotDirective,
19363
+ inputs: ['streamSlotPriority', 'streamSlotOnPipBack'],
19364
+ },
19365
+ ],
19366
+ host: {
19367
+ class: 'et-youtube-player-slot',
19368
+ },
19369
+ }]
19370
+ }] });
19371
+
19372
+ class StreamPipChromeComponent {
19373
+ constructor() {
19374
+ this.document = inject(DOCUMENT);
19375
+ this.pipEntries = viewChildren('pipEntry', ...(ngDevMode ? [{ debugName: "pipEntries" }] : []));
19376
+ this.manager = injectStreamManager();
19377
+ afterRenderEffect(() => {
19378
+ for (const { nativeElement: entryEl } of this.pipEntries()) {
19379
+ const playerId = entryEl.dataset['playerId'];
19380
+ if (!playerId)
19381
+ continue;
19382
+ const playerEl = this.manager.getPlayerElement(playerId);
19383
+ if (!playerEl || playerEl.parentElement === entryEl)
19384
+ continue;
19385
+ const controlsEl = entryEl.querySelector('.et-stream-pip-chrome__controls');
19386
+ const fromRect = this.manager.getInitialRect(playerId);
19387
+ const toRect = entryEl.getBoundingClientRect();
19388
+ if (fromRect && fromRect.width > 0 && fromRect.height > 0 && toRect.width > 0 && toRect.height > 0) {
19389
+ entryEl.style.visibility = 'hidden';
19390
+ animateWithFixedWrapper({
19391
+ playerEl,
19392
+ fromRect,
19393
+ toRect,
19394
+ document: this.document,
19395
+ onFinish: () => {
19396
+ pipMoveBefore(entryEl, playerEl, controlsEl);
19397
+ entryEl.style.visibility = '';
19398
+ },
19399
+ });
19400
+ }
19401
+ else {
19402
+ pipMoveBefore(entryEl, playerEl, controlsEl);
19403
+ }
19404
+ }
19405
+ });
19406
+ }
19407
+ onBack(pip) {
19408
+ pip.onBack?.();
19409
+ }
19410
+ onClose(pip) {
19411
+ this.manager.pipDeactivate(pip.playerId);
19412
+ }
19413
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: StreamPipChromeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
19414
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: StreamPipChromeComponent, isStandalone: true, selector: "et-stream-pip-chrome", host: { classAttribute: "et-stream-pip-chrome" }, viewQueries: [{ propertyName: "pipEntries", predicate: ["pipEntry"], descendants: true, isSignal: true }], ngImport: i0, template: `
19415
+ @for (pip of manager.pips(); track pip.playerId) {
19416
+ <div #pipEntry [attr.data-player-id]="pip.playerId" class="et-stream-pip-chrome__entry">
19417
+ <div class="et-stream-pip-chrome__controls">
19418
+ @if (pip.onBack) {
19419
+ <button (click)="onBack(pip)" class="et-stream-pip-chrome__back" type="button" aria-label="Back">‹</button>
19420
+ }
19421
+ <button
19422
+ (click)="onClose(pip)"
19423
+ class="et-stream-pip-chrome__close"
19424
+ type="button"
19425
+ aria-label="Close picture-in-picture"
19426
+ >
19427
+
19428
+ </button>
19429
+ </div>
19430
+ </div>
19431
+ }
19432
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
19433
+ }
19434
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: StreamPipChromeComponent, decorators: [{
19435
+ type: Component,
19436
+ args: [{
19437
+ selector: 'et-stream-pip-chrome',
19438
+ template: `
19439
+ @for (pip of manager.pips(); track pip.playerId) {
19440
+ <div #pipEntry [attr.data-player-id]="pip.playerId" class="et-stream-pip-chrome__entry">
19441
+ <div class="et-stream-pip-chrome__controls">
19442
+ @if (pip.onBack) {
19443
+ <button (click)="onBack(pip)" class="et-stream-pip-chrome__back" type="button" aria-label="Back">‹</button>
19444
+ }
19445
+ <button
19446
+ (click)="onClose(pip)"
19447
+ class="et-stream-pip-chrome__close"
19448
+ type="button"
19449
+ aria-label="Close picture-in-picture"
19450
+ >
19451
+
19452
+ </button>
19453
+ </div>
19454
+ </div>
19455
+ }
19456
+ `,
19457
+ changeDetection: ChangeDetectionStrategy.OnPush,
19458
+ encapsulation: ViewEncapsulation.None,
19459
+ host: {
19460
+ class: 'et-stream-pip-chrome',
19461
+ },
19462
+ }]
19463
+ }], ctorParameters: () => [], propDecorators: { pipEntries: [{ type: i0.ViewChildren, args: ['pipEntry', { isSignal: true }] }] } });
19464
+
19465
+ const StreamImports = [
19466
+ StreamConsentComponent,
19467
+ StreamConsentContentDirective,
19468
+ StreamConsentPlaceholderDirective,
19469
+ StreamConsentAcceptDirective,
19470
+ YoutubePlayerComponent,
19471
+ YoutubePlayerDirective,
19472
+ YoutubePlayerParamsDirective,
19473
+ YoutubePlayerSlotComponent,
19474
+ YoutubePlayerSlotDirective,
19475
+ TwitchPlayerComponent,
19476
+ TwitchPlayerDirective,
19477
+ VimeoPlayerComponent,
19478
+ VimeoPlayerDirective,
19479
+ DailymotionPlayerComponent,
19480
+ DailymotionPlayerDirective,
19481
+ KickPlayerComponent,
19482
+ KickPlayerDirective,
19483
+ FacebookPlayerComponent,
19484
+ FacebookPlayerDirective,
19485
+ TikTokPlayerComponent,
19486
+ TikTokPlayerDirective,
19487
+ SoopPlayerComponent,
19488
+ SoopPlayerDirective,
19489
+ StreamPipChromeComponent,
19490
+ ];
19491
+
19492
+ class TableBusyDirective {
19493
+ constructor() {
19494
+ this.templateRef = inject(TemplateRef);
19495
+ this._contentClassName = 'et-table-busy';
19496
+ }
19497
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TableBusyDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
19498
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: TableBusyDirective, isStandalone: true, selector: "ng-template[etTableBusy]", ngImport: i0 }); }
19499
+ }
19500
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TableBusyDirective, decorators: [{
19501
+ type: Directive,
19502
+ args: [{
19503
+ selector: 'ng-template[etTableBusy]',
19504
+ }]
19505
+ }] });
19506
+
19507
+ // eslint-disable-next-line @angular-eslint/directive-selector
19508
+ class TableBusyOutletDirective {
19509
+ constructor() {
19510
+ this.viewContainer = inject(ViewContainerRef);
19511
+ this.elementRef = inject(ElementRef);
19512
+ }
19513
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TableBusyOutletDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
19514
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: TableBusyOutletDirective, isStandalone: true, selector: "[tableBusyOutlet]", ngImport: i0 }); }
19515
+ }
19516
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TableBusyOutletDirective, decorators: [{
19517
+ type: Directive,
19518
+ args: [{ selector: '[tableBusyOutlet]' }]
19519
+ }] });
19520
+
19521
+ class TableComponent extends CdkTable {
19522
+ constructor() {
19523
+ super(...arguments);
19524
+ this._cdr = inject(ChangeDetectorRef);
19525
+ this.stickyCssClass = 'et-table-sticky';
19526
+ this.needsPositionStickyOnElement = false;
19527
+ this._tableBusyOutlet = viewChild(TableBusyOutletDirective, ...(ngDevMode ? [{ debugName: "_tableBusyOutlet" }] : []));
19528
+ this._tableBusyComponent = contentChild(TableBusyDirective, ...(ngDevMode ? [{ debugName: "_tableBusyComponent" }] : []));
19529
+ this._busy = false;
19530
+ this._isShowingTableBusy = false;
19531
+ }
19532
+ // TODO: Skipped for migration because:
19533
+ // Accessor inputs cannot be migrated as they are too complex.
19534
+ get busy() {
19535
+ return this._busy;
19536
+ }
19537
+ set busy(value) {
19538
+ this._busy = booleanAttribute(value);
19539
+ this._updateTableBusy();
19540
+ }
19541
+ ngAfterContentInit() {
19542
+ super.ngAfterContentInit();
19543
+ this._updateTableBusy();
19544
+ }
19545
+ _updateTableBusy() {
19546
+ const tableBusyComponent = this._tableBusyComponent();
19547
+ if (!tableBusyComponent) {
19548
+ return;
19549
+ }
19550
+ const shouldShow = this.busy;
19551
+ if (shouldShow === this._isShowingTableBusy) {
19552
+ return;
19553
+ }
19554
+ const container = this._tableBusyOutlet()?.viewContainer;
19555
+ if (!container) {
19556
+ return;
19557
+ }
19558
+ if (shouldShow) {
19559
+ const view = container.createEmbeddedView(tableBusyComponent.templateRef);
19560
+ const rootNode = view.rootNodes[0];
19561
+ if (view.rootNodes.length === 1 && rootNode?.nodeType === document.ELEMENT_NODE) {
19562
+ rootNode.classList.add(tableBusyComponent._contentClassName);
19563
+ }
19564
+ }
19565
+ else {
19566
+ container.clear();
19567
+ }
19568
+ this._isShowingTableBusy = shouldShow;
19569
+ this._cdr.markForCheck();
19570
+ }
19571
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
19572
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: TableComponent, isStandalone: true, selector: "et-table, table[et-table]", inputs: { busy: "busy" }, host: { properties: { "class.et-table-fixed-layout": "fixedLayout", "attr.aria-busy": "busy ? true : null" }, classAttribute: "et-table et-data-table__table" }, providers: [
19573
+ { provide: CdkTable, useExisting: TableComponent },
19574
+ { provide: CDK_TABLE, useExisting: TableComponent },
19575
+ { provide: STICKY_POSITIONING_LISTENER, useValue: null },
19576
+ ], queries: [{ propertyName: "_tableBusyComponent", first: true, predicate: TableBusyDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "_tableBusyOutlet", first: true, predicate: TableBusyOutletDirective, descendants: true, isSignal: true }], exportAs: ["etTable"], usesInheritance: true, ngImport: i0, template: `
19577
+ <ng-content select="caption" />
19578
+ <ng-content select="colgroup, col" />
19579
+
19580
+ @if (_isServer) {
19581
+ <ng-content />
19582
+ }
19583
+
19584
+ @if (_isNativeHtmlTable) {
19585
+ <thead role="rowgroup">
19586
+ <ng-container headerRowOutlet />
19587
+ </thead>
19588
+ <tbody class="mdc-data-table__content" role="rowgroup">
19589
+ <ng-container rowOutlet />
19590
+ <ng-container noDataRowOutlet />
19591
+ </tbody>
19592
+ <tfoot role="rowgroup">
19593
+ <ng-container footerRowOutlet />
19594
+ </tfoot>
19595
+ } @else {
19596
+ <ng-container headerRowOutlet />
19597
+ <div class="et-table-body">
19598
+ <ng-container rowOutlet />
19599
+ <ng-container tableBusyOutlet />
19600
+ </div>
19601
+ <ng-container noDataRowOutlet />
19602
+ <ng-container footerRowOutlet />
19603
+ }
19604
+ `, isInline: true, styles: [":where(.et-table){--et-table-separator-color: #4c4c4c;--et-table-separator-width: 1px;--et-table-separator-style: solid;--et-table-header-row-min-height: 56px;--et-table-row-display: flex;--et-table-row-min-height: 48px;--et-table-row-inline-padding: 24px;--et-table-cell-display: flex;--et-table-cell-inline-padding: 0;--et-table-cell-block-padding: 0}.et-table{display:block;position:relative}.et-header-row{min-height:var(--et-table-header-row-min-height)}.et-row,.et-footer-row{min-height:var(--et-table-row-min-height)}.et-row,.et-header-row,.et-footer-row{display:var(--et-table-row-display);border-width:0;border-bottom-width:var(--et-table-separator-width);border-style:var(--et-table-separator-style);border-color:var(--et-table-separator-color);align-items:center;box-sizing:border-box}.et-cell,.et-header-cell,.et-footer-cell{padding-inline:var(--et-table-cell-inline-padding);padding-block:var(--et-table-cell-block-padding)}.et-cell:first-of-type,.et-header-cell:first-of-type,.et-footer-cell:first-of-type{padding-inline-start:var(--et-table-row-inline-padding)}.et-cell:last-of-type,.et-header-cell:last-of-type,.et-footer-cell:last-of-type{padding-inline-end:var(--et-table-row-inline-padding)}.et-cell,.et-header-cell,.et-footer-cell{flex:1;display:var(--et-table-cell-display);align-items:center;overflow:hidden;word-wrap:break-word;min-height:inherit;box-sizing:border-box}.et-table-sticky{position:sticky!important}.et-table{table-layout:auto;white-space:normal}.et-table tbody,.et-table tfoot,.et-table thead,.et-cell,.et-footer-cell,.et-header-row,.et-row,.et-footer-row,.et-table .et-header-cell{background:inherit}.et-table et-header-row.et-header-row,.et-table et-row.et-row,.et-table et-footer-row.et-footer-cell{height:unset}et-header-cell.et-header-cell,et-cell.et-cell,et-footer-cell.et-footer-cell{align-self:stretch}\n"], dependencies: [{ kind: "directive", type: HeaderRowOutlet, selector: "[headerRowOutlet]" }, { kind: "directive", type: DataRowOutlet, selector: "[rowOutlet]" }, { kind: "directive", type: NoDataRowOutlet, selector: "[noDataRowOutlet]" }, { kind: "directive", type: FooterRowOutlet, selector: "[footerRowOutlet]" }, { kind: "directive", type: TableBusyOutletDirective, selector: "[tableBusyOutlet]" }], changeDetection: i0.ChangeDetectionStrategy.Eager, encapsulation: i0.ViewEncapsulation.None }); }
19605
+ }
19606
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TableComponent, decorators: [{
19607
+ type: Component,
19608
+ args: [{ selector: 'et-table, table[et-table]', exportAs: 'etTable', template: `
19609
+ <ng-content select="caption" />
19610
+ <ng-content select="colgroup, col" />
19611
+
19612
+ @if (_isServer) {
19613
+ <ng-content />
19614
+ }
19615
+
19616
+ @if (_isNativeHtmlTable) {
19617
+ <thead role="rowgroup">
19618
+ <ng-container headerRowOutlet />
19619
+ </thead>
19620
+ <tbody class="mdc-data-table__content" role="rowgroup">
19621
+ <ng-container rowOutlet />
19622
+ <ng-container noDataRowOutlet />
19623
+ </tbody>
19624
+ <tfoot role="rowgroup">
19625
+ <ng-container footerRowOutlet />
19626
+ </tfoot>
19627
+ } @else {
19628
+ <ng-container headerRowOutlet />
19629
+ <div class="et-table-body">
19630
+ <ng-container rowOutlet />
19631
+ <ng-container tableBusyOutlet />
19632
+ </div>
19633
+ <ng-container noDataRowOutlet />
19634
+ <ng-container footerRowOutlet />
19635
+ }
19636
+ `, host: {
19637
+ class: 'et-table et-data-table__table',
19638
+ '[class.et-table-fixed-layout]': 'fixedLayout',
19639
+ '[attr.aria-busy]': 'busy ? true : null',
19640
+ }, providers: [
19641
+ { provide: CdkTable, useExisting: TableComponent },
19642
+ { provide: CDK_TABLE, useExisting: TableComponent },
19643
+ { provide: STICKY_POSITIONING_LISTENER, useValue: null },
19644
+ ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.Default, imports: [HeaderRowOutlet, DataRowOutlet, NoDataRowOutlet, FooterRowOutlet, TableBusyOutletDirective], styles: [":where(.et-table){--et-table-separator-color: #4c4c4c;--et-table-separator-width: 1px;--et-table-separator-style: solid;--et-table-header-row-min-height: 56px;--et-table-row-display: flex;--et-table-row-min-height: 48px;--et-table-row-inline-padding: 24px;--et-table-cell-display: flex;--et-table-cell-inline-padding: 0;--et-table-cell-block-padding: 0}.et-table{display:block;position:relative}.et-header-row{min-height:var(--et-table-header-row-min-height)}.et-row,.et-footer-row{min-height:var(--et-table-row-min-height)}.et-row,.et-header-row,.et-footer-row{display:var(--et-table-row-display);border-width:0;border-bottom-width:var(--et-table-separator-width);border-style:var(--et-table-separator-style);border-color:var(--et-table-separator-color);align-items:center;box-sizing:border-box}.et-cell,.et-header-cell,.et-footer-cell{padding-inline:var(--et-table-cell-inline-padding);padding-block:var(--et-table-cell-block-padding)}.et-cell:first-of-type,.et-header-cell:first-of-type,.et-footer-cell:first-of-type{padding-inline-start:var(--et-table-row-inline-padding)}.et-cell:last-of-type,.et-header-cell:last-of-type,.et-footer-cell:last-of-type{padding-inline-end:var(--et-table-row-inline-padding)}.et-cell,.et-header-cell,.et-footer-cell{flex:1;display:var(--et-table-cell-display);align-items:center;overflow:hidden;word-wrap:break-word;min-height:inherit;box-sizing:border-box}.et-table-sticky{position:sticky!important}.et-table{table-layout:auto;white-space:normal}.et-table tbody,.et-table tfoot,.et-table thead,.et-cell,.et-footer-cell,.et-header-row,.et-row,.et-footer-row,.et-table .et-header-cell{background:inherit}.et-table et-header-row.et-header-row,.et-table et-row.et-row,.et-table et-footer-row.et-footer-cell{height:unset}et-header-cell.et-header-cell,et-cell.et-cell,et-footer-cell.et-footer-cell{align-self:stretch}\n"] }]
19645
+ }], propDecorators: { _tableBusyOutlet: [{ type: i0.ViewChild, args: [i0.forwardRef(() => TableBusyOutletDirective), { isSignal: true }] }], _tableBusyComponent: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TableBusyDirective), { isSignal: true }] }], busy: [{
19646
+ type: Input
19647
+ }] } });
19648
+
19649
+ const MAX_SAFE_INTEGER = 9007199254740991;
19650
+
19651
+ class CellDirective extends CdkCell {
19652
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CellDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
19653
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: CellDirective, isStandalone: true, selector: "et-cell, td[et-cell]", host: { classAttribute: "et-cell et-data-table__cell" }, usesInheritance: true, ngImport: i0 }); }
19654
+ }
19655
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CellDirective, decorators: [{
19656
+ type: Directive,
19657
+ args: [{
19658
+ // eslint-disable-next-line @angular-eslint/directive-selector
19659
+ selector: 'et-cell, td[et-cell]',
19660
+ host: {
19661
+ class: 'et-cell et-data-table__cell',
19662
+ },
19663
+ }]
19664
+ }] });
19665
+
19666
+ class CellDefDirective extends CdkCellDef {
19667
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CellDefDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
19668
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: CellDefDirective, isStandalone: true, selector: "[etCellDef]", providers: [{ provide: CdkCellDef, useExisting: CellDefDirective }], usesInheritance: true, ngImport: i0 }); }
19669
+ }
19670
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CellDefDirective, decorators: [{
19671
+ type: Directive,
19672
+ args: [{
19673
+ selector: '[etCellDef]',
19674
+ providers: [{ provide: CdkCellDef, useExisting: CellDefDirective }],
19675
+ }]
19676
+ }] });
19677
+
19678
+ class FooterCellDirective extends CdkFooterCell {
19679
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: FooterCellDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
19680
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: FooterCellDirective, isStandalone: true, selector: "et-footer-cell, td[et-footer-cell]", host: { classAttribute: "et-footer-cell et-data-table__cell" }, usesInheritance: true, ngImport: i0 }); }
19681
+ }
19682
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: FooterCellDirective, decorators: [{
19683
+ type: Directive,
19684
+ args: [{
19685
+ // eslint-disable-next-line @angular-eslint/directive-selector
19686
+ selector: 'et-footer-cell, td[et-footer-cell]',
19687
+ host: {
19688
+ class: 'et-footer-cell et-data-table__cell',
19689
+ },
19690
+ }]
19691
+ }] });
19692
+
19693
+ class FooterCellDefDirective extends CdkFooterCellDef {
19694
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: FooterCellDefDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
19695
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: FooterCellDefDirective, isStandalone: true, selector: "[etFooterCellDef]", providers: [{ provide: CdkFooterCellDef, useExisting: FooterCellDefDirective }], usesInheritance: true, ngImport: i0 }); }
19696
+ }
19697
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: FooterCellDefDirective, decorators: [{
19698
+ type: Directive,
19699
+ args: [{
19700
+ selector: '[etFooterCellDef]',
19701
+ providers: [{ provide: CdkFooterCellDef, useExisting: FooterCellDefDirective }],
19702
+ }]
19703
+ }] });
19704
+
19705
+ class HeaderCellDirective extends CdkHeaderCell {
19706
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: HeaderCellDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
19707
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: HeaderCellDirective, isStandalone: true, selector: "et-header-cell, th[et-header-cell]", host: { attributes: { "role": "columnheader" }, classAttribute: "et-header-cell et-data-table__header-cell" }, usesInheritance: true, ngImport: i0 }); }
19708
+ }
19709
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: HeaderCellDirective, decorators: [{
19710
+ type: Directive,
19711
+ args: [{
19712
+ // eslint-disable-next-line @angular-eslint/directive-selector
19713
+ selector: 'et-header-cell, th[et-header-cell]',
19714
+ host: {
19715
+ class: 'et-header-cell et-data-table__header-cell',
19716
+ role: 'columnheader',
19717
+ },
19718
+ }]
19719
+ }] });
19720
+
19721
+ class HeaderCellDefDirective extends CdkHeaderCellDef {
19722
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: HeaderCellDefDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
18039
19723
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: HeaderCellDefDirective, isStandalone: true, selector: "[etHeaderCellDef]", providers: [{ provide: CdkHeaderCellDef, useExisting: HeaderCellDefDirective }], usesInheritance: true, ngImport: i0 }); }
18040
19724
  }
18041
19725
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: HeaderCellDefDirective, decorators: [{
@@ -19626,69 +21310,9 @@ const TabImports = [
19626
21310
 
19627
21311
  const TABS_CONFIG = new InjectionToken('TABS_CONFIG');
19628
21312
 
19629
- const FLOATING_UI_PLACEMENTS = [
19630
- 'top',
19631
- 'left',
19632
- 'bottom',
19633
- 'right',
19634
- 'top-start',
19635
- 'top-end',
19636
- 'right-start',
19637
- 'right-end',
19638
- 'bottom-start',
19639
- 'bottom-end',
19640
- 'left-start',
19641
- 'left-end',
19642
- ];
19643
-
19644
- /**
19645
- * A utility function to enhance the ux of views containing forms.
19646
- * It helps to prevent the user from accidentally losing unsaved form changes.
19647
- */
19648
- const createNavigationDismissChecker = (config) => {
19649
- assertInInjectionContext(createNavigationDismissChecker);
19650
- const { form, compareFn, dismissCheckFn } = config;
19651
- const currentFormValue = controlValueSignal(form);
19652
- const hasChanges = computed(() => {
19653
- const formValue = currentFormValue();
19654
- if (!formValue)
19655
- return false;
19656
- return !(compareFn ? compareFn(formValue, defaultFormValue()) : equal(formValue, defaultFormValue()));
19657
- }, ...(ngDevMode ? [{ debugName: "hasChanges" }] : []));
19658
- const defaultFormValue = signal(config.defaultValue ?? form.getRawValue(), ...(ngDevMode ? [{ debugName: "defaultFormValue" }] : []));
19659
- const runCheck = () => {
19660
- const isDefaultFormValue = !hasChanges();
19661
- if (isDefaultFormValue)
19662
- return of(true);
19663
- return dismissCheckFn(form.getRawValue());
19664
- };
19665
- const refreshDefaultFormValue = () => {
19666
- defaultFormValue.set(form.getRawValue());
19667
- };
19668
- const restoreDefaultFormValue = () => {
19669
- form.setValue(defaultFormValue());
19670
- refreshDefaultFormValue();
19671
- };
19672
- return {
19673
- runCheck,
19674
- refreshDefaultFormValue,
19675
- restoreDefaultFormValue,
19676
- hasChanges,
19677
- defaultFormValue: defaultFormValue.asReadonly(),
19678
- };
19679
- };
19680
-
19681
- const injectRouterNavigationState = () => {
19682
- const router = inject(Router);
19683
- const navState = router.getCurrentNavigation()?.extras.state;
19684
- return (navState || null);
19685
- };
19686
-
19687
- // Burst cache
19688
-
19689
21313
  /**
19690
21314
  * Generated bundle index. Do not edit.
19691
21315
  */
19692
21316
 
19693
- export { ACCORDION_COMPONENT, ACCORDION_HINT_WRAPPER_DIRECTIVE, ACCORDION_LABEL_WRAPPER_DIRECTIVE, AccordionComponent, AccordionGroupComponent, AccordionHintDirective, AccordionHintWrapperDirective, AccordionImports, AccordionLabelDirective, AccordionLabelWrapperDirective, ActiveTabUnderlineBarManager, ActiveTabUnderlineDirective, AutosizeTextareaDirective, BRACKET_CONFIG_TOKEN, BRACKET_DEFAULT_CONFIG, BRACKET_MATCH_ID_TOKEN, BRACKET_ROUND_ID_TOKEN, BRACKET_TOKEN, Bracket, BracketComponent, BracketImports, BracketMatchComponent, BracketMatchDirective, index as BracketNew, BracketRoundDirective, BracketRoundHeaderComponent, BreadcrumbComponent, BreadcrumbImports, BreadcrumbItemDirective, BreadcrumbItemTemplateDirective, BreadcrumbOutletComponent, BreadcrumbTemplateDirective, ButtonComponent, ButtonDirective, ButtonImports, CAROUSEL_ITEM_NAV_TOKEN, CAROUSEL_ITEM_TOKEN, CAROUSEL_NEXT_BUTTON_TOKEN, CAROUSEL_PREVIOUS_BUTTON_TOKEN, CAROUSEL_TOGGLE_AUTO_PLAY_BUTTON_TOKEN, CAROUSEL_TOKEN, CHECKBOX_FIELD_TOKEN, CHECKBOX_GROUP_CONTROL_TOKEN, CHECKBOX_GROUP_TOKEN, CHECKBOX_TOKEN, CHEVRON_ICON, COLOR_INPUT_TOKEN, COMBOBOX_BODY_EMPTY_TEMPLATE_TOKEN, COMBOBOX_BODY_ERROR_TEMPLATE_TOKEN, COMBOBOX_BODY_LOADING_TEMPLATE_TOKEN, COMBOBOX_BODY_MORE_ITEMS_HINT_TEMPLATE_TOKEN, COMBOBOX_BODY_TOKEN, COMBOBOX_CONFIG_TOKEN, COMBOBOX_DEFAULT_CONFIG, COMBOBOX_OPTION_TEMPLATE_TOKEN, COMBOBOX_OPTION_TOKEN, COMBOBOX_SELECTED_OPTION_TEMPLATE_TOKEN, COMBOBOX_TOKEN, CarouselComponent, CarouselDirective, CarouselImports, CarouselItemComponent, CarouselItemDirective, CarouselItemNavComponent, CarouselItemNavDirective, CarouselNextButtonDirective, CarouselPreviousButtonDirective, CarouselToggleAutoPlayButtonDirective, CellDefDirective, CellDirective, CheckboxComponent, CheckboxDirective, CheckboxFieldComponent, CheckboxFieldDirective, CheckboxGroupComponent, CheckboxGroupControlDirective, CheckboxGroupDirective, CheckboxImports, ColorInputComponent, ColorInputDirective, ColumnDefDirective, ComboboxBodyComponent, ComboboxBodyEmptyTemplateDirective, ComboboxBodyErrorTemplateDirective, ComboboxBodyLoadingTemplateDirective, ComboboxBodyMoreItemsHintTemplateDirective, ComboboxComponent, ComboboxDirective, ComboboxImports, ComboboxOptionComponent, ComboboxOptionTemplateDirective, ComboboxSelectedOptionTemplateDirective, DATE_INPUT_FORMAT_TOKEN, DATE_INPUT_TOKEN, DATE_TIME_INPUT_FORMAT_TOKEN, DATE_TIME_INPUT_TOKEN, DEFAULT_DATE_INPUT_FORMAT, DEFAULT_DATE_TIME_INPUT_FORMAT, DEFAULT_TIME_INPUT_FORMAT, DYNAMIC_FORM_FIELD_TOKEN, DYNAMIC_FORM_GROUP_TOKEN, DateInputComponent, DateInputDirective, DateTimeInputComponent, DateTimeInputDirective, DecoratedFormFieldBase, DecoratedInputBase, DefaultValidatorErrorsService, DynamicFormFieldDirective, DynamicFormGroupDirective, EMAIL_INPUT_TOKEN, ET_OVERLAY_CONFIG_CLASS_KEYS, EXPOSE_INPUT_VARS_TOKEN, EmailInputComponent, EmailInputDirective, ErrorComponent, ExposeInputVarsDirective, FILTER_OVERLAY_CONFIG, FLOATING_UI_PLACEMENTS, FilterOverlayService, FooterCellDefDirective, FooterCellDirective, FooterRowComponent, FooterRowDefDirective, FormFieldStateService, FormGroupStateService, HeaderCellDefDirective, HeaderCellDirective, HeaderRowComponent, HeaderRowDefDirective, ICONS_TOKEN, ICON_DIRECTIVE_TOKEN, IMAGE_CONFIG_TOKEN, INPUT_PREFIX_TOKEN, INPUT_SUFFIX_TOKEN, INPUT_TOKEN, IconDirective, IconImports, IfInputEmptyDirective, IfInputFilledDirective, IfSupportsShowPickerDirective, InlineTabBodyComponent, InlineTabBodyHostDirective, InlineTabChangeEvent, InlineTabComponent, InlineTabContentDirective, InlineTabHeaderComponent, InlineTabLabelDirective, InlineTabLabelWrapperDirective, InlineTabsComponent, InputBase, InputDirective, InputFieldComponent, InputImports, InputPrefixDirective, InputStateService, InputSuffixDirective, LABEL_TOKEN, LabelComponent, LabelImports, LabelSuffixDirective, MASONRY_ITEM_TOKEN, MAX_SAFE_INTEGER, MENU, MENU_CHECKBOX_GROUP_TOKEN, MENU_CONTAINER, MENU_GROUP_TITLE_TOKEN, MENU_GROUP_TOKEN, MENU_ITEM_TOKEN, MENU_RADIO_GROUP_TOKEN, MENU_SEARCH_TEMPLATE_TOKEN, MENU_TEMPLATE, MENU_TRIGGER_TOKEN, MasonryComponent, MasonryImports, MasonryItemComponent, MenuCheckboxGroupDirective, MenuCheckboxItemComponent, MenuComponent, MenuContainerComponent, MenuGroupDirective, MenuGroupTitleDirective, MenuImports, MenuItemDirective, MenuRadioGroupDirective, MenuRadioItemComponent, MenuSearchTemplateDirective, MenuTriggerDirective, NATIVE_INPUT_REF_TOKEN, NATIVE_SELECT_INPUT_TOKEN, NATIVE_SELECT_OPTION_TOKEN, NUMBER_INPUT_TOKEN, NativeInputRefDirective, NativeSelectImports, NativeSelectInputComponent, NativeSelectInputDirective, NativeSelectOptionComponent, NativeSelectOptionDirective, NavTabLinkComponent, NavTabsComponent, NavTabsOutletComponent, NewBracketComponent, NewBracketDefaultMatchComponent, NewBracketDefaultRoundHeaderComponent, NoDataRowDirective, NumberInputComponent, NumberInputDirective, OVERLAY_BACK_OR_CLOSE_TOKEN, OVERLAY_BODY_TOKEN, OVERLAY_CLOSE_BLOCKER_TOKEN, OVERLAY_CONFIG, OVERLAY_DATA, OVERLAY_FOOTER_TOKEN, OVERLAY_HEADER_TEMPLATE_TOKEN, OVERLAY_HEADER_TOKEN, OVERLAY_MAIN_TOKEN, OVERLAY_QUERY_PARAM_INPUT_NAME, OVERLAY_ROUTER_CONFIG_TOKEN, OVERLAY_ROUTER_LINK_TOKEN, OVERLAY_ROUTER_OUTLET_DISABLED_TEMPLATE_TOKEN, OVERLAY_ROUTER_OUTLET_TOKEN, OVERLAY_SHARED_ROUTE_TEMPLATE_TOKEN, OverlayBackOrCloseDirective, OverlayBodyComponent, OverlayCloseBlockerDirective, OverlayCloseDirective, OverlayContainerComponent, OverlayFooterDirective, OverlayHandlerLinkDirective, OverlayHeaderDirective, OverlayHeaderTemplateDirective, OverlayImports, OverlayMainDirective, OverlayOriginCloneComponent, OverlayRef, OverlayRouteHeaderTemplateOutletComponent, OverlayRouterLinkDirective, OverlayRouterOutletComponent, OverlayRouterOutletDisabledTemplateDirective, OverlayRouterService, OverlaySharedRouteTemplateDirective, OverlaySharedRouteTemplateOutletComponent, OverlaySidebarComponent, OverlaySidebarPageComponent, OverlayTitleDirective, OverlayWithRoutingImports, OverlayWithSidebarImports, PASSWORD_INPUT_TOKEN, PROGRESS_SPINNER_DEFAULT_OPTIONS, PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY, PaginatedTabHeaderDirective, PaginationComponent, PaginationHeadService, PaginationImports, PaginationLinkDirective, PasswordInputComponent, PasswordInputDirective, PasswordInputToggleComponent, PictureComponent, ProgressSpinnerComponent, QUERY_ERROR_TOKEN, QueryButtonComponent, QueryButtonDirective, QueryErrorComponent, QueryErrorDirective, RADIO_FIELD_TOKEN, RADIO_GROUP_TOKEN, RADIO_TOKEN, RICH_FILTER_BUTTON_SLOT_TOKEN, RICH_FILTER_BUTTON_TOKEN, RICH_FILTER_CONTENT_TOKEN, RICH_FILTER_TOP_TOKEN, RadioComponent, RadioDirective, RadioFieldComponent, RadioFieldDirective, RadioGroupComponent, RadioGroupDirective, RadioImports, RichFilterButtonDirective, RichFilterButtonSlotDirective, RichFilterContentDirective, RichFilterHostComponent, RichFilterImports, RichFilterTopDirective, RowComponent, RowDefDirective, SCROLLABLE_IGNORE_CHILD_ATTRIBUTE, SCROLLABLE_IGNORE_CHILD_TOKEN, SCROLLABLE_IS_ACTIVE_CHILD_ATTRIBUTE, SCROLLABLE_IS_ACTIVE_CHILD_TOKEN, SCROLLABLE_LOADING_TEMPLATE_TOKEN, SCROLLABLE_PLACEHOLDER_ITEM_TEMPLATE_TOKEN, SCROLLABLE_PLACEHOLDER_OVERLAY_TEMPLATE_TOKEN, SEARCH_INPUT_TOKEN, SEGMENTED_BUTTON_FIELD_TOKEN, SEGMENTED_BUTTON_GROUP_TOKEN, SEGMENTED_BUTTON_TOKEN, SELECTION_LIST_FIELD, SELECTION_LIST_OPTION, SELECT_BODY_TOKEN, SELECT_FIELD_TOKEN, SELECT_OPTION_TOKEN, SELECT_TOKEN, SHOW_PICKER_TRIGGER_TOKEN, SIDEBAR_OVERLAY_CONFIG, SLIDER_THUMB_CONTENT_TEMPLATE_TOKEN, SLIDE_TOGGLE_TOKEN, SORT_DEFAULT_OPTIONS, SORT_HEADER_COLUMN_DEF, SORT_HEADER_INTL_PROVIDER, SORT_HEADER_INTL_PROVIDER_FACTORY, STATIC_FORM_FIELD_TOKEN, STATIC_FORM_GROUP_TOKEN, ScrollableComponent, ScrollableIgnoreChildDirective, ScrollableImports, ScrollableIsActiveChildDirective, ScrollableLoadingTemplateDirective, ScrollablePlaceholderComponent, ScrollablePlaceholderItemTemplateDirective, ScrollablePlaceholderOverlayTemplateDirective, SearchInputClearComponent, SearchInputComponent, SearchInputDirective, SegmentedButtonComponent, SegmentedButtonDirective, SegmentedButtonFieldComponent, SegmentedButtonFieldDirective, SegmentedButtonGroupComponent, SegmentedButtonGroupDirective, SegmentedButtonImports, SelectBodyComponent, SelectBodyDirective, SelectComponent, SelectDirective, SelectFieldComponent, SelectFieldDirective, SelectImports, SelectOptionComponent, SelectOptionDirective, SelectionListFieldComponent, SelectionListFieldDirective, SelectionListImports, SelectionListOptionComponent, SelectionListOptionDirective, ShowPickerTriggerDirective, SidebarOverlayService, SkeletonComponent, SkeletonImports, SkeletonItemComponent, SlideToggleComponent, SlideToggleDirective, SlideToggleFieldComponent, SlideToggleImports, SliderComponent, SliderFieldComponent, SliderImports, SliderThumbContentTemplateDirective, SortDirective, SortHeaderComponent, SortHeaderIntl, SortImports, StaticFormFieldDirective, StaticFormGroupDirective, SwipeHandlerService, TAB, TABS_CONFIG, TAB_CONTENT, TAB_GROUP, TAB_LABEL, TEL_INPUT_TOKEN, TEXTAREA_INPUT_TOKEN, TEXT_INPUT_TOKEN, TIMES_ICON, TIME_INPUT_FORMAT_TOKEN, TIME_INPUT_TOKEN, TOGGLETIP, TOGGLETIP_CONFIG, TOGGLETIP_DEFAULT_CONFIG, TOGGLETIP_DIRECTIVE, TOGGLETIP_TEMPLATE, TOGGLETIP_TEXT, TOOLTIP, TOOLTIP_CONFIG, TOOLTIP_DEFAULT_CONFIG, TOOLTIP_DIRECTIVE, TOOLTIP_TEMPLATE, TOOLTIP_TEXT, TabImports, TableBusyDirective, TableBusyOutletDirective, TableComponent, TableDataSource, TableImports, TelInputComponent, TelInputDirective, TextColumnComponent, TextInputComponent, TextInputDirective, TextareaInputComponent, TextareaInputDirective, TimeInputComponent, TimeInputDirective, ToggletipCloseDirective, ToggletipComponent, ToggletipDirective, ToggletipImports, TooltipComponent, TooltipDirective, TooltipImports, VALIDATOR_ERROR_SERVICE_TOKEN, WRITEABLE_INPUT_TOKEN, WRITEABLE_INPUT_VALUE_ACCESSOR, WriteableInputDirective, _MAT_INK_BAR_POSITIONER, _MAT_INK_BAR_POSITIONER_FACTORY, abortFullscreenAnimation, accordionAnimations, anchoredDialogOverlayStrategy, bottomSheetOverlayStrategy, cleanupFullscreenAnimation, cleanupFullscreenAnimationStyles, createBracketConfig, createComboboxConfig, createFormChangesTracker, createNavigationDismissChecker, createOverlayDismissChecker, createOverlayHandler, createOverlayHandlerWithQueryParamLifecycle, createToggletipConfig, createTooltipConfig, defaultSubmitButtonConfigFn, dialogOverlayStrategy, enableDragToDismiss, exactMatchOptions, extractFirstImageUrl, findNextRelevantHtmlElement, fullScreenDialogOverlayStrategy, getClosestOverlay, getIntersectionInfo, getOriginCoordinatesAndDimensions, injectAnchoredDialogStrategy, injectAnchoredDialogStrategyDefaults, injectBottomSheetStrategy, injectBottomSheetStrategyDefaults, injectBreadcrumbManager, injectDialogStrategy, injectDialogStrategyDefaults, injectFocusRegistry, injectFullscreenDialogStrategy, injectFullscreenDialogStrategyDefaults, injectLeftSheetStrategy, injectLeftSheetStrategyDefaults, injectOverlayManager, injectOverlayScrollBlocker, injectRightSheetStrategy, injectRightSheetStrategyDefaults, injectRouterNavigationState, injectTopSheetStrategy, injectTopSheetStrategyDefaults, isEmptyArray, isHtmlElement, isObjectArray, isPointerEvent, isPrimitiveArray, isScrollableChildActive, isScrollableChildIgnored, isTouchEvent$2 as isTouchEvent, isUpperBracketMatch, leftSheetOverlayStrategy, mergeOverlayBreakpointConfigs, normalizePictureSizes, normalizePictureSource, normalizeRoundType, orderRounds, orderRoundsByRoundNumber, paginate, provideAnchoredDialogStrategy, provideAnchoredDialogStrategyDefaults, provideBottomSheetStrategy, provideBottomSheetStrategyDefaults, provideBracketConfig, provideBreadcrumbManager, provideComboboxConfig, provideDateFormat, provideDateTimeFormat, provideDialogStrategy, provideDialogStrategyDefaults, provideFilterOverlayConfig, provideFocusRegistry, provideFullscreenDialogStrategy, provideFullscreenDialogStrategyDefaults, provideIcons, provideImageConfig, provideLeftSheetStrategy, provideLeftSheetStrategyDefaults, provideOverlay, provideOverlayManager, provideOverlayRouterConfig, provideOverlayScrollBlocker, provideRightSheetStrategy, provideRightSheetStrategyDefaults, provideSidebarOverlayConfig, provideSort, provideTimeFormat, provideToggletipConfig, provideTooltipConfig, provideTopSheetStrategy, provideTopSheetStrategyDefaults, provideValidatorErrorsService, rightSheetOverlayStrategy, signalVisibilityChangeClasses, startFullscreenEnterAnimation, startFullscreenLeaveAnimation, subsetMatchOptions, tabAnimations, topSheetOverlayStrategy, transformingBottomSheetToDialogOverlayStrategy, transformingFullScreenDialogToDialogOverlayStrategy, transformingFullScreenDialogToRightSheetOverlayStrategy };
21317
+ export { ACCORDION_COMPONENT, ACCORDION_HINT_WRAPPER_DIRECTIVE, ACCORDION_LABEL_WRAPPER_DIRECTIVE, AccordionComponent, AccordionGroupComponent, AccordionHintDirective, AccordionHintWrapperDirective, AccordionImports, AccordionLabelDirective, AccordionLabelWrapperDirective, ActiveTabUnderlineBarManager, ActiveTabUnderlineDirective, AutosizeTextareaDirective, BRACKET_CONFIG_TOKEN, BRACKET_DEFAULT_CONFIG, BRACKET_MATCH_ID_TOKEN, BRACKET_ROUND_ID_TOKEN, BRACKET_TOKEN, Bracket, BracketComponent, BracketImports, BracketMatchComponent, BracketMatchDirective, index as BracketNew, BracketRoundDirective, BracketRoundHeaderComponent, BreadcrumbComponent, BreadcrumbImports, BreadcrumbItemDirective, BreadcrumbItemTemplateDirective, BreadcrumbOutletComponent, BreadcrumbTemplateDirective, ButtonComponent, ButtonDirective, ButtonImports, CAROUSEL_ITEM_NAV_TOKEN, CAROUSEL_ITEM_TOKEN, CAROUSEL_NEXT_BUTTON_TOKEN, CAROUSEL_PREVIOUS_BUTTON_TOKEN, CAROUSEL_TOGGLE_AUTO_PLAY_BUTTON_TOKEN, CAROUSEL_TOKEN, CHECKBOX_FIELD_TOKEN, CHECKBOX_GROUP_CONTROL_TOKEN, CHECKBOX_GROUP_TOKEN, CHECKBOX_TOKEN, CHEVRON_ICON, COLOR_INPUT_TOKEN, COMBOBOX_BODY_EMPTY_TEMPLATE_TOKEN, COMBOBOX_BODY_ERROR_TEMPLATE_TOKEN, COMBOBOX_BODY_LOADING_TEMPLATE_TOKEN, COMBOBOX_BODY_MORE_ITEMS_HINT_TEMPLATE_TOKEN, COMBOBOX_BODY_TOKEN, COMBOBOX_CONFIG_TOKEN, COMBOBOX_DEFAULT_CONFIG, COMBOBOX_OPTION_TEMPLATE_TOKEN, COMBOBOX_OPTION_TOKEN, COMBOBOX_SELECTED_OPTION_TEMPLATE_TOKEN, COMBOBOX_TOKEN, CarouselComponent, CarouselDirective, CarouselImports, CarouselItemComponent, CarouselItemDirective, CarouselItemNavComponent, CarouselItemNavDirective, CarouselNextButtonDirective, CarouselPreviousButtonDirective, CarouselToggleAutoPlayButtonDirective, CellDefDirective, CellDirective, CheckboxComponent, CheckboxDirective, CheckboxFieldComponent, CheckboxFieldDirective, CheckboxGroupComponent, CheckboxGroupControlDirective, CheckboxGroupDirective, CheckboxImports, ColorInputComponent, ColorInputDirective, ColumnDefDirective, ComboboxBodyComponent, ComboboxBodyEmptyTemplateDirective, ComboboxBodyErrorTemplateDirective, ComboboxBodyLoadingTemplateDirective, ComboboxBodyMoreItemsHintTemplateDirective, ComboboxComponent, ComboboxDirective, ComboboxImports, ComboboxOptionComponent, ComboboxOptionTemplateDirective, ComboboxSelectedOptionTemplateDirective, DAILYMOTION_PLAYER_TOKEN, DATE_INPUT_FORMAT_TOKEN, DATE_INPUT_TOKEN, DATE_TIME_INPUT_FORMAT_TOKEN, DATE_TIME_INPUT_TOKEN, DEFAULT_DATE_INPUT_FORMAT, DEFAULT_DATE_TIME_INPUT_FORMAT, DEFAULT_TIME_INPUT_FORMAT, DYNAMIC_FORM_FIELD_TOKEN, DYNAMIC_FORM_GROUP_TOKEN, DailymotionPlayerComponent, DailymotionPlayerDirective, DateInputComponent, DateInputDirective, DateTimeInputComponent, DateTimeInputDirective, DecoratedFormFieldBase, DecoratedInputBase, DefaultValidatorErrorsService, DynamicFormFieldDirective, DynamicFormGroupDirective, EMAIL_INPUT_TOKEN, ET_OVERLAY_CONFIG_CLASS_KEYS, EXPOSE_INPUT_VARS_TOKEN, EmailInputComponent, EmailInputDirective, ErrorComponent, ExposeInputVarsDirective, FACEBOOK_PLAYER_TOKEN, FILTER_OVERLAY_CONFIG, FLOATING_UI_PLACEMENTS, FacebookPlayerComponent, FacebookPlayerDirective, FilterOverlayService, FooterCellDefDirective, FooterCellDirective, FooterRowComponent, FooterRowDefDirective, FormFieldStateService, FormGroupStateService, HeaderCellDefDirective, HeaderCellDirective, HeaderRowComponent, HeaderRowDefDirective, ICONS_TOKEN, ICON_DIRECTIVE_TOKEN, IMAGE_CONFIG_TOKEN, INPUT_PREFIX_TOKEN, INPUT_SUFFIX_TOKEN, INPUT_TOKEN, IconDirective, IconImports, IfInputEmptyDirective, IfInputFilledDirective, IfSupportsShowPickerDirective, InlineTabBodyComponent, InlineTabBodyHostDirective, InlineTabChangeEvent, InlineTabComponent, InlineTabContentDirective, InlineTabHeaderComponent, InlineTabLabelDirective, InlineTabLabelWrapperDirective, InlineTabsComponent, InputBase, InputDirective, InputFieldComponent, InputImports, InputPrefixDirective, InputStateService, InputSuffixDirective, KICK_PLAYER_TOKEN, KickPlayerComponent, KickPlayerDirective, LABEL_TOKEN, LabelComponent, LabelImports, LabelSuffixDirective, MASONRY_ITEM_TOKEN, MAX_SAFE_INTEGER, MENU, MENU_CHECKBOX_GROUP_TOKEN, MENU_CONTAINER, MENU_GROUP_TITLE_TOKEN, MENU_GROUP_TOKEN, MENU_ITEM_TOKEN, MENU_RADIO_GROUP_TOKEN, MENU_SEARCH_TEMPLATE_TOKEN, MENU_TEMPLATE, MENU_TRIGGER_TOKEN, MasonryComponent, MasonryImports, MasonryItemComponent, MenuCheckboxGroupDirective, MenuCheckboxItemComponent, MenuComponent, MenuContainerComponent, MenuGroupDirective, MenuGroupTitleDirective, MenuImports, MenuItemDirective, MenuRadioGroupDirective, MenuRadioItemComponent, MenuSearchTemplateDirective, MenuTriggerDirective, NATIVE_INPUT_REF_TOKEN, NATIVE_SELECT_INPUT_TOKEN, NATIVE_SELECT_OPTION_TOKEN, NUMBER_INPUT_TOKEN, NativeInputRefDirective, NativeSelectImports, NativeSelectInputComponent, NativeSelectInputDirective, NativeSelectOptionComponent, NativeSelectOptionDirective, NavTabLinkComponent, NavTabsComponent, NavTabsOutletComponent, NewBracketComponent, NewBracketDefaultMatchComponent, NewBracketDefaultRoundHeaderComponent, NoDataRowDirective, NumberInputComponent, NumberInputDirective, OVERLAY_BACK_OR_CLOSE_TOKEN, OVERLAY_BODY_TOKEN, OVERLAY_CLOSE_BLOCKER_TOKEN, OVERLAY_CONFIG, OVERLAY_DATA, OVERLAY_FOOTER_TOKEN, OVERLAY_HEADER_TEMPLATE_TOKEN, OVERLAY_HEADER_TOKEN, OVERLAY_MAIN_TOKEN, OVERLAY_QUERY_PARAM_INPUT_NAME, OVERLAY_ROUTER_CONFIG_TOKEN, OVERLAY_ROUTER_LINK_TOKEN, OVERLAY_ROUTER_OUTLET_DISABLED_TEMPLATE_TOKEN, OVERLAY_ROUTER_OUTLET_TOKEN, OVERLAY_SHARED_ROUTE_TEMPLATE_TOKEN, OverlayBackOrCloseDirective, OverlayBodyComponent, OverlayCloseBlockerDirective, OverlayCloseDirective, OverlayContainerComponent, OverlayFooterDirective, OverlayHandlerLinkDirective, OverlayHeaderDirective, OverlayHeaderTemplateDirective, OverlayImports, OverlayMainDirective, OverlayOriginCloneComponent, OverlayRef, OverlayRouteHeaderTemplateOutletComponent, OverlayRouterLinkDirective, OverlayRouterOutletComponent, OverlayRouterOutletDisabledTemplateDirective, OverlayRouterService, OverlaySharedRouteTemplateDirective, OverlaySharedRouteTemplateOutletComponent, OverlaySidebarComponent, OverlaySidebarPageComponent, OverlayTitleDirective, OverlayWithRoutingImports, OverlayWithSidebarImports, PASSWORD_INPUT_TOKEN, PROGRESS_SPINNER_DEFAULT_OPTIONS, PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY, PaginatedTabHeaderDirective, PaginationComponent, PaginationHeadService, PaginationImports, PaginationLinkDirective, PasswordInputComponent, PasswordInputDirective, PasswordInputToggleComponent, PictureComponent, ProgressSpinnerComponent, QUERY_ERROR_TOKEN, QueryButtonComponent, QueryButtonDirective, QueryErrorComponent, QueryErrorDirective, RADIO_FIELD_TOKEN, RADIO_GROUP_TOKEN, RADIO_TOKEN, RICH_FILTER_BUTTON_SLOT_TOKEN, RICH_FILTER_BUTTON_TOKEN, RICH_FILTER_CONTENT_TOKEN, RICH_FILTER_TOP_TOKEN, RadioComponent, RadioDirective, RadioFieldComponent, RadioFieldDirective, RadioGroupComponent, RadioGroupDirective, RadioImports, RichFilterButtonDirective, RichFilterButtonSlotDirective, RichFilterContentDirective, RichFilterHostComponent, RichFilterImports, RichFilterTopDirective, RowComponent, RowDefDirective, SCROLLABLE_IGNORE_CHILD_ATTRIBUTE, SCROLLABLE_IGNORE_CHILD_TOKEN, SCROLLABLE_IS_ACTIVE_CHILD_ATTRIBUTE, SCROLLABLE_IS_ACTIVE_CHILD_TOKEN, SCROLLABLE_LOADING_TEMPLATE_TOKEN, SCROLLABLE_PLACEHOLDER_ITEM_TEMPLATE_TOKEN, SCROLLABLE_PLACEHOLDER_OVERLAY_TEMPLATE_TOKEN, SEARCH_INPUT_TOKEN, SEGMENTED_BUTTON_FIELD_TOKEN, SEGMENTED_BUTTON_GROUP_TOKEN, SEGMENTED_BUTTON_TOKEN, SELECTION_LIST_FIELD, SELECTION_LIST_OPTION, SELECT_BODY_TOKEN, SELECT_FIELD_TOKEN, SELECT_OPTION_TOKEN, SELECT_TOKEN, SHOW_PICKER_TRIGGER_TOKEN, SIDEBAR_OVERLAY_CONFIG, SLIDER_THUMB_CONTENT_TEMPLATE_TOKEN, SLIDE_TOGGLE_TOKEN, SOOP_PLAYER_TOKEN, SORT_DEFAULT_OPTIONS, SORT_HEADER_COLUMN_DEF, SORT_HEADER_INTL_PROVIDER, SORT_HEADER_INTL_PROVIDER_FACTORY, STATIC_FORM_FIELD_TOKEN, STATIC_FORM_GROUP_TOKEN, STREAM_CONSENT_CONTENT_TOKEN, STREAM_CONSENT_PLACEHOLDER_TOKEN, STREAM_CONSENT_TOKEN, STREAM_PLAYER_TOKEN, STREAM_USER_CONSENT_PROVIDER_TOKEN, ScrollableComponent, ScrollableIgnoreChildDirective, ScrollableImports, ScrollableIsActiveChildDirective, ScrollableLoadingTemplateDirective, ScrollablePlaceholderComponent, ScrollablePlaceholderItemTemplateDirective, ScrollablePlaceholderOverlayTemplateDirective, SearchInputClearComponent, SearchInputComponent, SearchInputDirective, SegmentedButtonComponent, SegmentedButtonDirective, SegmentedButtonFieldComponent, SegmentedButtonFieldDirective, SegmentedButtonGroupComponent, SegmentedButtonGroupDirective, SegmentedButtonImports, SelectBodyComponent, SelectBodyDirective, SelectComponent, SelectDirective, SelectFieldComponent, SelectFieldDirective, SelectImports, SelectOptionComponent, SelectOptionDirective, SelectionListFieldComponent, SelectionListFieldDirective, SelectionListImports, SelectionListOptionComponent, SelectionListOptionDirective, ShowPickerTriggerDirective, SidebarOverlayService, SkeletonComponent, SkeletonImports, SkeletonItemComponent, SlideToggleComponent, SlideToggleDirective, SlideToggleFieldComponent, SlideToggleImports, SliderComponent, SliderFieldComponent, SliderImports, SliderThumbContentTemplateDirective, SoopPlayerComponent, SoopPlayerDirective, SortDirective, SortHeaderComponent, SortHeaderIntl, SortImports, StaticFormFieldDirective, StaticFormGroupDirective, StreamConsentAcceptDirective, StreamConsentComponent, StreamConsentContentDirective, StreamConsentDirective, StreamConsentPlaceholderDirective, StreamImports, StreamPipChromeComponent, TAB, TABS_CONFIG, TAB_CONTENT, TAB_GROUP, TAB_LABEL, TEL_INPUT_TOKEN, TEXTAREA_INPUT_TOKEN, TEXT_INPUT_TOKEN, TIKTOK_PLAYER_TOKEN, TIMES_ICON, TIME_INPUT_FORMAT_TOKEN, TIME_INPUT_TOKEN, TOGGLETIP, TOGGLETIP_CONFIG, TOGGLETIP_DEFAULT_CONFIG, TOGGLETIP_DIRECTIVE, TOGGLETIP_TEMPLATE, TOGGLETIP_TEXT, TOOLTIP, TOOLTIP_CONFIG, TOOLTIP_DEFAULT_CONFIG, TOOLTIP_DIRECTIVE, TOOLTIP_TEMPLATE, TOOLTIP_TEXT, TWITCH_PLAYER_TOKEN, TabImports, TableBusyDirective, TableBusyOutletDirective, TableComponent, TableDataSource, TableImports, TelInputComponent, TelInputDirective, TextColumnComponent, TextInputComponent, TextInputDirective, TextareaInputComponent, TextareaInputDirective, TikTokPlayerComponent, TikTokPlayerDirective, TimeInputComponent, TimeInputDirective, ToggletipCloseDirective, ToggletipComponent, ToggletipDirective, ToggletipImports, TooltipComponent, TooltipDirective, TooltipImports, TwitchPlayerComponent, TwitchPlayerDirective, VALIDATOR_ERROR_SERVICE_TOKEN, VIMEO_PLAYER_TOKEN, VimeoPlayerComponent, VimeoPlayerDirective, WRITEABLE_INPUT_TOKEN, WRITEABLE_INPUT_VALUE_ACCESSOR, WriteableInputDirective, YOUTUBE_PLAYER_SLOT_TOKEN, YOUTUBE_PLAYER_TOKEN, YoutubePlayerComponent, YoutubePlayerDirective, YoutubePlayerParamsDirective, YoutubePlayerSlotComponent, YoutubePlayerSlotDirective, _MAT_INK_BAR_POSITIONER, _MAT_INK_BAR_POSITIONER_FACTORY, abortFullscreenAnimation, accordionAnimations, anchoredDialogOverlayStrategy, animateWithFixedWrapper, bottomSheetOverlayStrategy, cleanupFullscreenAnimation, cleanupFullscreenAnimationStyles, createBracketConfig, createComboboxConfig, createFormChangesTracker, createNavigationDismissChecker, createOverlayDismissChecker, createOverlayHandler, createOverlayHandlerWithQueryParamLifecycle, createSwipeTracker, createToggletipConfig, createTooltipConfig, defaultSubmitButtonConfigFn, dialogOverlayStrategy, enableDragToDismiss, exactMatchOptions, extractFirstImageUrl, findNextRelevantHtmlElement, fullScreenDialogOverlayStrategy, getClosestOverlay, getOriginCoordinatesAndDimensions, injectAnchoredDialogStrategy, injectAnchoredDialogStrategyDefaults, injectBottomSheetStrategy, injectBottomSheetStrategyDefaults, injectBreadcrumbManager, injectDialogStrategy, injectDialogStrategyDefaults, injectFocusRegistry, injectFullscreenDialogStrategy, injectFullscreenDialogStrategyDefaults, injectLeftSheetStrategy, injectLeftSheetStrategyDefaults, injectOverlayManager, injectOverlayScrollBlocker, injectRightSheetStrategy, injectRightSheetStrategyDefaults, injectRouterNavigationState, injectStreamManager, injectStreamPipManager, injectStreamScriptLoader, injectStreamUserConsentProvider, injectTopSheetStrategy, injectTopSheetStrategyDefaults, isEmptyArray, isHtmlElement, isObjectArray, isPointerEvent, isPrimitiveArray, isScrollableChildActive, isScrollableChildIgnored, isTouchEvent$1 as isTouchEvent, isUpperBracketMatch, leftSheetOverlayStrategy, mergeOverlayBreakpointConfigs, normalizePictureSizes, normalizePictureSource, normalizeRoundType, orderRounds, orderRoundsByRoundNumber, paginate, pipMoveBefore, provideAnchoredDialogStrategy, provideAnchoredDialogStrategyDefaults, provideBottomSheetStrategy, provideBottomSheetStrategyDefaults, provideBracketConfig, provideBreadcrumbManager, provideComboboxConfig, provideDateFormat, provideDateTimeFormat, provideDialogStrategy, provideDialogStrategyDefaults, provideFilterOverlayConfig, provideFocusRegistry, provideFullscreenDialogStrategy, provideFullscreenDialogStrategyDefaults, provideIcons, provideImageConfig, provideLeftSheetStrategy, provideLeftSheetStrategyDefaults, provideOverlay, provideOverlayManager, provideOverlayRouterConfig, provideOverlayScrollBlocker, provideRightSheetStrategy, provideRightSheetStrategyDefaults, provideSidebarOverlayConfig, provideSort, provideStreamManager, provideStreamPipManager, provideTimeFormat, provideToggletipConfig, provideTooltipConfig, provideTopSheetStrategy, provideTopSheetStrategyDefaults, provideValidatorErrorsService, rightSheetOverlayStrategy, signalVisibilityChangeClasses, startFullscreenEnterAnimation, startFullscreenLeaveAnimation, subsetMatchOptions, tabAnimations, topSheetOverlayStrategy, transformingBottomSheetToDialogOverlayStrategy, transformingFullScreenDialogToDialogOverlayStrategy, transformingFullScreenDialogToRightSheetOverlayStrategy };
19694
21318
  //# sourceMappingURL=ethlete-cdk.mjs.map