@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.
- package/CHANGELOG.md +10 -0
- package/fesm2022/ethlete-cdk.mjs +2153 -251
- package/fesm2022/ethlete-cdk.mjs.map +1 -1
- package/package.json +1 -1
- package/types/ethlete-cdk.d.ts +735 -39
package/fesm2022/ethlete-cdk.mjs
CHANGED
|
@@ -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 {
|
|
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$
|
|
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$
|
|
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$
|
|
4702
|
+
let nextUniqueId$4 = 0;
|
|
4703
4703
|
class LabelComponent {
|
|
4704
4704
|
constructor() {
|
|
4705
4705
|
this.formFieldStateService = inject(FormFieldStateService);
|
|
4706
|
-
this.id = `et-label-${++nextUniqueId$
|
|
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
|
|
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,
|
|
5511
|
+
const { element: el, overlayRef, config } = context;
|
|
5388
5512
|
const stop$ = new Subject();
|
|
5389
|
-
let
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
5563
|
+
if (tracker === null || isSelectionActive)
|
|
5426
5564
|
return;
|
|
5427
|
-
if (isTouchEvent$
|
|
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
|
-
|
|
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
|
-
|
|
5449
|
-
|
|
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$
|
|
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$
|
|
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
|
-
|
|
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:
|
|
17536
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type:
|
|
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:
|
|
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: '
|
|
17645
|
+
selector: '[etStreamConsentContent]',
|
|
17646
|
+
providers: [{ provide: STREAM_CONSENT_CONTENT_TOKEN, useExisting: StreamConsentContentDirective }],
|
|
17542
17647
|
}]
|
|
17543
17648
|
}] });
|
|
17544
17649
|
|
|
17545
|
-
|
|
17546
|
-
class
|
|
17650
|
+
const STREAM_CONSENT_PLACEHOLDER_TOKEN = new InjectionToken('STREAM_CONSENT_PLACEHOLDER_TOKEN');
|
|
17651
|
+
class StreamConsentPlaceholderDirective {
|
|
17547
17652
|
constructor() {
|
|
17548
|
-
this.
|
|
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:
|
|
17552
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.1", type:
|
|
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:
|
|
17658
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: StreamConsentPlaceholderDirective, decorators: [{
|
|
17555
17659
|
type: Directive,
|
|
17556
|
-
args: [{
|
|
17660
|
+
args: [{
|
|
17661
|
+
selector: '[etStreamConsentPlaceholder]',
|
|
17662
|
+
providers: [{ provide: STREAM_CONSENT_PLACEHOLDER_TOKEN, useExisting: StreamConsentPlaceholderDirective }],
|
|
17663
|
+
}]
|
|
17557
17664
|
}] });
|
|
17558
17665
|
|
|
17559
|
-
class
|
|
17666
|
+
class StreamConsentComponent {
|
|
17560
17667
|
constructor() {
|
|
17561
|
-
|
|
17562
|
-
this.
|
|
17563
|
-
this.
|
|
17564
|
-
|
|
17565
|
-
|
|
17566
|
-
|
|
17567
|
-
|
|
17568
|
-
|
|
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
|
-
|
|
17571
|
-
|
|
17572
|
-
|
|
17573
|
-
|
|
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
|
-
|
|
17576
|
-
|
|
17577
|
-
|
|
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
|
-
|
|
17580
|
-
|
|
17581
|
-
|
|
17765
|
+
// Dailymotion embeds have no programmatic control API without a dashboard-created player ID
|
|
17766
|
+
play() {
|
|
17767
|
+
// no-op
|
|
17582
17768
|
}
|
|
17583
|
-
|
|
17584
|
-
|
|
17585
|
-
|
|
17586
|
-
|
|
17587
|
-
|
|
17588
|
-
|
|
17589
|
-
|
|
17590
|
-
|
|
17591
|
-
|
|
17592
|
-
|
|
17593
|
-
|
|
17594
|
-
|
|
17595
|
-
|
|
17596
|
-
|
|
17597
|
-
|
|
17598
|
-
|
|
17599
|
-
|
|
17600
|
-
|
|
17601
|
-
}
|
|
17602
|
-
}
|
|
17603
|
-
|
|
17604
|
-
|
|
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
|