@ethlete/cdk 5.0.0-next.5 → 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,13 +1,13 @@
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, DestroyRef, isSignal, viewChild, 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';
7
+ import { toObservable, takeUntilDestroyed, toSignal, outputFromObservable, outputToObservable, rxResource } from '@angular/core/rxjs-interop';
8
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
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';
@@ -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();
@@ -7890,106 +8047,6 @@ const anchoredDialogOverlayStrategy = (config = {}) => {
7890
8047
  };
7891
8048
  };
7892
8049
 
7893
- let nextUniqueId$4 = 0;
7894
- const isTouchEvent$1 = (event) => {
7895
- return event.type[0] === 't';
7896
- };
7897
- class SwipeHandlerService {
7898
- constructor() {
7899
- this._handlerMap = {};
7900
- }
7901
- startSwipe(event) {
7902
- const handlerId = nextUniqueId$4++;
7903
- const originClientX = isTouchEvent$1(event) ? event.targetTouches[0].clientX : event.clientX;
7904
- const originClientY = isTouchEvent$1(event) ? event.targetTouches[0].clientY : event.clientY;
7905
- const timestamp = Date.now();
7906
- this._handlerMap[handlerId] = {
7907
- originClientX,
7908
- originClientY,
7909
- timestamp,
7910
- movementX: 0,
7911
- movementY: 0,
7912
- positiveMovementX: 0,
7913
- positiveMovementY: 0,
7914
- isScrolling: false,
7915
- isSwiping: false,
7916
- };
7917
- return handlerId;
7918
- }
7919
- updateSwipe(handlerId, event) {
7920
- const handler = this._getSwipeHandler(handlerId);
7921
- if (!handler)
7922
- return null;
7923
- const { originClientX, originClientY, isSwiping, isScrolling } = handler;
7924
- const currentClientX = isTouchEvent$1(event) ? event.targetTouches[0].clientX : event.clientX;
7925
- const currentClientY = isTouchEvent$1(event) ? event.targetTouches[0].clientY : event.clientY;
7926
- const movementX = (originClientX - currentClientX) * -1;
7927
- const movementY = (originClientY - currentClientY) * -1;
7928
- const positiveMovementX = Math.abs(movementX);
7929
- const positiveMovementY = Math.abs(movementY);
7930
- if (!isSwiping && !isScrolling) {
7931
- if (positiveMovementY > positiveMovementX) {
7932
- handler.isScrolling = true;
7933
- }
7934
- else {
7935
- handler.isSwiping = true;
7936
- }
7937
- }
7938
- handler.movementX = movementX;
7939
- handler.movementY = movementY;
7940
- handler.positiveMovementX = positiveMovementX;
7941
- handler.positiveMovementY = positiveMovementY;
7942
- return handler;
7943
- }
7944
- endSwipe(handlerId) {
7945
- const handler = this._getSwipeHandler(handlerId);
7946
- if (!handler)
7947
- return null;
7948
- const { movementX, movementY, timestamp, originClientX, originClientY, positiveMovementX, positiveMovementY } = handler;
7949
- const timestampStart = timestamp;
7950
- const timestampEnd = Date.now();
7951
- const swipeTime = timestampEnd - timestampStart;
7952
- const pixelPerMillisecondX = movementX ? movementX / swipeTime : 0;
7953
- const pixelPerSecondX = pixelPerMillisecondX * 1000;
7954
- const positivePixelPerSecondX = Math.abs(pixelPerSecondX);
7955
- const pixelPerMillisecondY = movementY ? movementY / swipeTime : 0;
7956
- const pixelPerSecondY = pixelPerMillisecondY * 1000;
7957
- const positivePixelPerSecondY = Math.abs(pixelPerSecondY);
7958
- delete this._handlerMap[handlerId];
7959
- const swipeEnd = {
7960
- positivePixelPerSecondX,
7961
- positivePixelPerSecondY,
7962
- pixelPerSecondX,
7963
- pixelPerSecondY,
7964
- movementX,
7965
- movementY,
7966
- originClientX,
7967
- originClientY,
7968
- positiveMovementX,
7969
- positiveMovementY,
7970
- };
7971
- return swipeEnd;
7972
- }
7973
- cancelSwipe(handlerId) {
7974
- delete this._handlerMap[handlerId];
7975
- }
7976
- _getSwipeHandler(handlerId) {
7977
- const handler = this._handlerMap[handlerId];
7978
- if (!handler) {
7979
- return null;
7980
- }
7981
- return handler;
7982
- }
7983
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SwipeHandlerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
7984
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SwipeHandlerService, providedIn: 'root' }); }
7985
- }
7986
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SwipeHandlerService, decorators: [{
7987
- type: Injectable,
7988
- args: [{
7989
- providedIn: 'root',
7990
- }]
7991
- }] });
7992
-
7993
8050
  const [provideBottomSheetStrategyDefaults, injectBottomSheetStrategyDefaults] = createStaticRootProvider({
7994
8051
  width: '100%',
7995
8052
  height: undefined,
@@ -8007,7 +8064,6 @@ const [provideBottomSheetStrategyDefaults, injectBottomSheetStrategyDefaults] =
8007
8064
  });
8008
8065
  const [provideBottomSheetStrategy, injectBottomSheetStrategy] = createRootProvider(() => {
8009
8066
  const defaults = injectBottomSheetStrategyDefaults();
8010
- const swipeHandlerService = inject(SwipeHandlerService);
8011
8067
  const build = (config = {}) => {
8012
8068
  const cfg = mergeOverlayBreakpointConfigs(defaults, config);
8013
8069
  let dragToDismissRef;
@@ -8018,7 +8074,6 @@ const [provideBottomSheetStrategy, injectBottomSheetStrategy] = createRootProvid
8018
8074
  config: cfg.dragToDismiss,
8019
8075
  element: context.containerEl,
8020
8076
  overlayRef: context.overlayRef,
8021
- swipeHandlerService,
8022
8077
  });
8023
8078
  };
8024
8079
  const detachDragToDismiss = () => {
@@ -8186,7 +8241,6 @@ const [provideLeftSheetStrategyDefaults, injectLeftSheetStrategyDefaults] = crea
8186
8241
  });
8187
8242
  const [provideLeftSheetStrategy, injectLeftSheetStrategy] = createRootProvider(() => {
8188
8243
  const defaults = injectLeftSheetStrategyDefaults();
8189
- const swipeHandlerService = inject(SwipeHandlerService);
8190
8244
  const build = (config = {}) => {
8191
8245
  const cfg = mergeOverlayBreakpointConfigs(defaults, config);
8192
8246
  let dragToDismissRef;
@@ -8197,7 +8251,6 @@ const [provideLeftSheetStrategy, injectLeftSheetStrategy] = createRootProvider((
8197
8251
  config: cfg.dragToDismiss,
8198
8252
  element: context.containerEl,
8199
8253
  overlayRef: context.overlayRef,
8200
- swipeHandlerService,
8201
8254
  });
8202
8255
  };
8203
8256
  const detachDragToDismiss = () => {
@@ -8252,7 +8305,6 @@ const [provideRightSheetStrategyDefaults, injectRightSheetStrategyDefaults] = cr
8252
8305
  });
8253
8306
  const [provideRightSheetStrategy, injectRightSheetStrategy] = createRootProvider(() => {
8254
8307
  const defaults = injectRightSheetStrategyDefaults();
8255
- const swipeHandlerService = inject(SwipeHandlerService);
8256
8308
  const build = (config = {}) => {
8257
8309
  const cfg = mergeOverlayBreakpointConfigs(defaults, config);
8258
8310
  let dragToDismissRef;
@@ -8263,7 +8315,6 @@ const [provideRightSheetStrategy, injectRightSheetStrategy] = createRootProvider
8263
8315
  config: cfg.dragToDismiss,
8264
8316
  element: context.containerEl,
8265
8317
  overlayRef: context.overlayRef,
8266
- swipeHandlerService,
8267
8318
  });
8268
8319
  };
8269
8320
  const detachDragToDismiss = () => {
@@ -8364,7 +8415,6 @@ const [provideTopSheetStrategyDefaults, injectTopSheetStrategyDefaults] = create
8364
8415
  });
8365
8416
  const [provideTopSheetStrategy, injectTopSheetStrategy] = createRootProvider(() => {
8366
8417
  const defaults = injectTopSheetStrategyDefaults();
8367
- const swipeHandlerService = inject(SwipeHandlerService);
8368
8418
  const build = (config = {}) => {
8369
8419
  const cfg = mergeOverlayBreakpointConfigs(defaults, config);
8370
8420
  let dragToDismissRef;
@@ -8375,7 +8425,6 @@ const [provideTopSheetStrategy, injectTopSheetStrategy] = createRootProvider(()
8375
8425
  config: cfg.dragToDismiss,
8376
8426
  element: context.containerEl,
8377
8427
  overlayRef: context.overlayRef,
8378
- swipeHandlerService,
8379
8428
  });
8380
8429
  };
8381
8430
  const detachDragToDismiss = () => {
@@ -14682,6 +14731,7 @@ class SelectDirective {
14682
14731
  }
14683
14732
  removeOptionFromSelection(option) {
14684
14733
  this._selectionModel.removeSelectedOption(option);
14734
+ this.input._markAsTouched();
14685
14735
  }
14686
14736
  _controlTouched() {
14687
14737
  this.input._markAsTouched();
@@ -17527,82 +17577,1994 @@ const provideSort = () => {
17527
17577
  return [SORT_HEADER_INTL_PROVIDER];
17528
17578
  };
17529
17579
 
17530
- 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 {
17584
+ constructor() {
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;
17590
+ }
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 }); }
17609
+ }
17610
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: StreamConsentDirective, decorators: [{
17611
+ type: Directive,
17612
+ args: [{
17613
+ providers: [{ provide: STREAM_CONSENT_TOKEN, useExisting: StreamConsentDirective }],
17614
+ }]
17615
+ }] });
17616
+
17617
+ class StreamConsentAcceptDirective {
17618
+ constructor() {
17619
+ this.consent = inject(STREAM_CONSENT_TOKEN);
17620
+ }
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 }); }
17623
+ }
17624
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: StreamConsentAcceptDirective, decorators: [{
17625
+ type: Directive,
17626
+ args: [{
17627
+ selector: '[etStreamConsentAccept]',
17628
+ host: {
17629
+ '(click)': 'consent.grant()',
17630
+ },
17631
+ }]
17632
+ }] });
17633
+
17634
+ const STREAM_CONSENT_CONTENT_TOKEN = new InjectionToken('STREAM_CONSENT_CONTENT_TOKEN');
17635
+ class StreamConsentContentDirective {
17531
17636
  constructor() {
17532
17637
  this.templateRef = inject(TemplateRef);
17533
- this._contentClassName = 'et-table-busy';
17534
17638
  }
17535
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TableBusyDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
17536
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: TableBusyDirective, isStandalone: true, selector: "ng-template[etTableBusy]", 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 }); }
17537
17641
  }
17538
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TableBusyDirective, decorators: [{
17642
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: StreamConsentContentDirective, decorators: [{
17539
17643
  type: Directive,
17540
17644
  args: [{
17541
- selector: 'ng-template[etTableBusy]',
17645
+ selector: '[etStreamConsentContent]',
17646
+ providers: [{ provide: STREAM_CONSENT_CONTENT_TOKEN, useExisting: StreamConsentContentDirective }],
17542
17647
  }]
17543
17648
  }] });
17544
17649
 
17545
- // eslint-disable-next-line @angular-eslint/directive-selector
17546
- class TableBusyOutletDirective {
17650
+ const STREAM_CONSENT_PLACEHOLDER_TOKEN = new InjectionToken('STREAM_CONSENT_PLACEHOLDER_TOKEN');
17651
+ class StreamConsentPlaceholderDirective {
17547
17652
  constructor() {
17548
- this.viewContainer = inject(ViewContainerRef);
17549
- this.elementRef = inject(ElementRef);
17653
+ this.templateRef = inject(TemplateRef);
17550
17654
  }
17551
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TableBusyOutletDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
17552
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type: TableBusyOutletDirective, isStandalone: true, selector: "[tableBusyOutlet]", ngImport: i0 }); }
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 }); }
17553
17657
  }
17554
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TableBusyOutletDirective, decorators: [{
17658
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: StreamConsentPlaceholderDirective, decorators: [{
17555
17659
  type: Directive,
17556
- args: [{ selector: '[tableBusyOutlet]' }]
17660
+ args: [{
17661
+ selector: '[etStreamConsentPlaceholder]',
17662
+ providers: [{ provide: STREAM_CONSENT_PLACEHOLDER_TOKEN, useExisting: StreamConsentPlaceholderDirective }],
17663
+ }]
17557
17664
  }] });
17558
17665
 
17559
- class TableComponent extends CdkTable {
17666
+ class StreamConsentComponent {
17560
17667
  constructor() {
17561
- super(...arguments);
17562
- this._cdr = inject(ChangeDetectorRef);
17563
- this.stickyCssClass = 'et-table-sticky';
17564
- this.needsPositionStickyOnElement = false;
17565
- this._tableBusyOutlet = viewChild(TableBusyOutletDirective, ...(ngDevMode ? [{ debugName: "_tableBusyOutlet" }] : []));
17566
- this._tableBusyComponent = contentChild(TableBusyDirective, ...(ngDevMode ? [{ debugName: "_tableBusyComponent" }] : []));
17567
- this._busy = false;
17568
- this._isShowingTableBusy = false;
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" />
17569
17678
  }
17570
- // TODO: Skipped for migration because:
17571
- // Accessor inputs cannot be migrated as they are too complex.
17572
- get busy() {
17573
- return this._busy;
17679
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
17680
+ }
17681
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: StreamConsentComponent, decorators: [{
17682
+ type: Component,
17683
+ args: [{
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" />
17574
17690
  }
17575
- set busy(value) {
17576
- this._busy = booleanAttribute(value);
17577
- this._updateTableBusy();
17691
+ `,
17692
+ changeDetection: ChangeDetectionStrategy.OnPush,
17693
+ encapsulation: ViewEncapsulation.None,
17694
+ hostDirectives: [{ directive: StreamConsentDirective }],
17695
+ imports: [NgTemplateOutlet],
17696
+ host: {
17697
+ class: 'et-stream-consent',
17698
+ },
17699
+ }]
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" }] : []));
17578
17764
  }
17579
- ngAfterContentInit() {
17580
- super.ngAfterContentInit();
17581
- this._updateTableBusy();
17765
+ // Dailymotion embeds have no programmatic control API without a dashboard-created player ID
17766
+ play() {
17767
+ // no-op
17582
17768
  }
17583
- _updateTableBusy() {
17584
- const tableBusyComponent = this._tableBusyComponent();
17585
- if (!tableBusyComponent) {
17586
- return;
17587
- }
17588
- const shouldShow = this.busy;
17589
- if (shouldShow === this._isShowingTableBusy) {
17590
- return;
17591
- }
17592
- const container = this._tableBusyOutlet()?.viewContainer;
17593
- if (!container) {
17594
- return;
17595
- }
17596
- if (shouldShow) {
17597
- const view = container.createEmbeddedView(tableBusyComponent.templateRef);
17598
- const rootNode = view.rootNodes[0];
17599
- if (view.rootNodes.length === 1 && rootNode?.nodeType === document.ELEMENT_NODE) {
17600
- rootNode.classList.add(tableBusyComponent._contentClassName);
17601
- }
17602
- }
17603
- else {
17604
- container.clear();
17605
- }
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 }); }
17789
+ }
17790
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DailymotionPlayerDirective, decorators: [{
17791
+ type: Directive,
17792
+ args: [{
17793
+ providers: [
17794
+ { provide: DAILYMOTION_PLAYER_TOKEN, useExisting: DailymotionPlayerDirective },
17795
+ { provide: STREAM_PLAYER_TOKEN, useExisting: DailymotionPlayerDirective },
17796
+ ],
17797
+ }]
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 }] }] } });
17799
+
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 }); }
17811
+ }
17812
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DailymotionPlayerComponent, decorators: [{
17813
+ type: Component,
17814
+ args: [{
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
+ ],
17825
+ host: {
17826
+ class: 'et-dailymotion-player',
17827
+ },
17828
+ }]
17829
+ }] });
17830
+
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
+ }
17606
19568
  this._isShowingTableBusy = shouldShow;
17607
19569
  this._cdr.markForCheck();
17608
19570
  }
@@ -19348,69 +21310,9 @@ const TabImports = [
19348
21310
 
19349
21311
  const TABS_CONFIG = new InjectionToken('TABS_CONFIG');
19350
21312
 
19351
- const FLOATING_UI_PLACEMENTS = [
19352
- 'top',
19353
- 'left',
19354
- 'bottom',
19355
- 'right',
19356
- 'top-start',
19357
- 'top-end',
19358
- 'right-start',
19359
- 'right-end',
19360
- 'bottom-start',
19361
- 'bottom-end',
19362
- 'left-start',
19363
- 'left-end',
19364
- ];
19365
-
19366
- /**
19367
- * A utility function to enhance the ux of views containing forms.
19368
- * It helps to prevent the user from accidentally losing unsaved form changes.
19369
- */
19370
- const createNavigationDismissChecker = (config) => {
19371
- assertInInjectionContext(createNavigationDismissChecker);
19372
- const { form, compareFn, dismissCheckFn } = config;
19373
- const currentFormValue = controlValueSignal(form);
19374
- const hasChanges = computed(() => {
19375
- const formValue = currentFormValue();
19376
- if (!formValue)
19377
- return false;
19378
- return !(compareFn ? compareFn(formValue, defaultFormValue()) : equal(formValue, defaultFormValue()));
19379
- }, ...(ngDevMode ? [{ debugName: "hasChanges" }] : []));
19380
- const defaultFormValue = signal(config.defaultValue ?? form.getRawValue(), ...(ngDevMode ? [{ debugName: "defaultFormValue" }] : []));
19381
- const runCheck = () => {
19382
- const isDefaultFormValue = !hasChanges();
19383
- if (isDefaultFormValue)
19384
- return of(true);
19385
- return dismissCheckFn(form.getRawValue());
19386
- };
19387
- const refreshDefaultFormValue = () => {
19388
- defaultFormValue.set(form.getRawValue());
19389
- };
19390
- const restoreDefaultFormValue = () => {
19391
- form.setValue(defaultFormValue());
19392
- refreshDefaultFormValue();
19393
- };
19394
- return {
19395
- runCheck,
19396
- refreshDefaultFormValue,
19397
- restoreDefaultFormValue,
19398
- hasChanges,
19399
- defaultFormValue: defaultFormValue.asReadonly(),
19400
- };
19401
- };
19402
-
19403
- const injectRouterNavigationState = () => {
19404
- const router = inject(Router);
19405
- const navState = router.getCurrentNavigation()?.extras.state;
19406
- return (navState || null);
19407
- };
19408
-
19409
- // Burst cache
19410
-
19411
21313
  /**
19412
21314
  * Generated bundle index. Do not edit.
19413
21315
  */
19414
21316
 
19415
- 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, 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 };
19416
21318
  //# sourceMappingURL=ethlete-cdk.mjs.map