ez-vid-ang 22.0.0 → 22.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, signal, Injectable, inject, input, ChangeDetectionStrategy, Component, output, computed, Pipe, ElementRef, NgZone, Renderer2, viewChild, effect, Directive, SecurityContext } from '@angular/core';
2
+ import { EventEmitter, signal, Injectable, inject, input, ChangeDetectionStrategy, Component, output, computed, Pipe, ElementRef, NgZone, Renderer2, viewChild, effect, Directive, SecurityContext, DestroyRef } from '@angular/core';
3
3
  import { BehaviorSubject, Subject, fromEvent, throttleTime, merge, takeUntil } from 'rxjs';
4
4
  import { DomSanitizer } from '@angular/platform-browser';
5
+ import { DOCUMENT } from '@angular/common';
5
6
 
6
7
  /**
7
8
  * Enum of all possible playback states the Eva player can be in.
@@ -48,6 +49,7 @@ var EvaVideoEvent;
48
49
  EvaVideoEvent["STALLED"] = "stalled";
49
50
  EvaVideoEvent["SUSPEND"] = "suspend";
50
51
  EvaVideoEvent["TIME_UPDATE"] = "timeupdate";
52
+ EvaVideoEvent["DOUBLE_CLICK"] = "dblclick";
51
53
  EvaVideoEvent["VOLUME_CHANGE"] = "volumechange";
52
54
  EvaVideoEvent["WAITING"] = "waiting";
53
55
  EvaVideoEvent["WAITING_FOR_KEY"] = "waitingforkey";
@@ -104,7 +106,7 @@ class EvaApi {
104
106
  *
105
107
  * **Important:** Do not access this before `isPlayerReady` is `true`.
106
108
  */
107
- assignedVideoElement;
109
+ assignedVideoElement = null;
108
110
  /**
109
111
  * Emits this `EvaApi` instance when the player is fully initialized and the
110
112
  * video element has been assigned. Components that need to defer setup until
@@ -348,6 +350,29 @@ class EvaApi {
348
350
  this.assignedVideoElement.currentTime = newTime;
349
351
  this.time.update(a => ({ ...a, current: newTime, remaining: a.total - newTime }));
350
352
  }
353
+ /**
354
+ * Jumps to a percentage of total duration based on a digit key.
355
+ * `"0"` seeks to 0%, `"5"` to 50%, `"9"` to 90%, etc.
356
+ * Ignored for live streams (duration is `Infinity`).
357
+ * Updates `time` signal immediately for responsive UI feedback.
358
+ *
359
+ * @param key - A single digit character (`"0"`–`"9"`).
360
+ */
361
+ jumpToVideoPercentage(key) {
362
+ if (!this.validateVideoAndPlayerBeforeAction()) {
363
+ return;
364
+ }
365
+ if (this.isLive()) {
366
+ return;
367
+ }
368
+ const digit = parseInt(key, 10);
369
+ if (isNaN(digit) || digit < 0 || digit > 9) {
370
+ return;
371
+ }
372
+ const newTime = (digit / 10) * this.time().total;
373
+ this.assignedVideoElement.currentTime = newTime;
374
+ this.time.update(a => ({ ...a, current: newTime, remaining: a.total - newTime }));
375
+ }
351
376
  /**
352
377
  * Sets the video playback rate.
353
378
  * Called from `EvaPlaybackSpeed` when the user selects a speed.
@@ -910,10 +935,10 @@ class EvaApi {
910
935
  }
911
936
  return parsed;
912
937
  }
913
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaApi, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
914
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaApi });
938
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaApi, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
939
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaApi });
915
940
  }
916
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaApi, decorators: [{
941
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaApi, decorators: [{
917
942
  type: Injectable
918
943
  }] });
919
944
 
@@ -947,10 +972,10 @@ class EvaBuffering {
947
972
  */
948
973
  defaultSpinner = input(true, /* @ts-ignore */
949
974
  ...(ngDevMode ? [{ debugName: "defaultSpinner" }] : /* istanbul ignore next */ []));
950
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaBuffering, deps: [], target: i0.ɵɵFactoryTarget.Component });
951
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: EvaBuffering, isStandalone: true, selector: "eva-buffering", inputs: { defaultSpinner: { classPropertyName: "defaultSpinner", publicName: "defaultSpinner", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.eva-display-buffering": "evaAPI.isBuffering()" } }, ngImport: i0, template: "@if(defaultSpinner()) {\n<div class=\"eva-loader-meteor\"></div>\n}\n@else {\n<ng-content></ng-content>\n}", styles: [":host{display:flex;align-items:center;justify-content:center;width:100%;height:100%;position:absolute;top:0;left:0;transition:visibility var(--eva-transition-duration) linear,opacity var(--eva-transition-duration) linear;background-color:var(--eva-buffering-background-color);z-index:302;visibility:hidden;opacity:0}:host(.eva-display-buffering){visibility:visible!important;opacity:1!important}.eva-loader-meteor{width:var(--eva-buffering-default-spinner-size);height:var(--eva-buffering-default-spinner-size);border-radius:50%;display:inline-block;border-top:3px solid #fff;border-right:3px solid transparent;box-sizing:border-box;animation:eva-loader-meteor-rotation var(--eva-buffering-spinner-animation-speed) linear infinite}@keyframes eva-loader-meteor-rotation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
975
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaBuffering, deps: [], target: i0.ɵɵFactoryTarget.Component });
976
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: EvaBuffering, isStandalone: true, selector: "eva-buffering", inputs: { defaultSpinner: { classPropertyName: "defaultSpinner", publicName: "defaultSpinner", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.eva-display-buffering": "evaAPI.isBuffering()" } }, ngImport: i0, template: "@if(defaultSpinner()) {\n<div class=\"eva-loader-meteor\"></div>\n}\n@else {\n<ng-content></ng-content>\n}", styles: [":host{display:flex;align-items:center;justify-content:center;width:100%;height:100%;position:absolute;top:0;left:0;transition:visibility var(--eva-transition-duration) linear,opacity var(--eva-transition-duration) linear;background-color:var(--eva-buffering-background-color);z-index:302;visibility:hidden;opacity:0}:host(.eva-display-buffering){visibility:visible!important;opacity:1!important}.eva-loader-meteor{width:var(--eva-buffering-default-spinner-size);height:var(--eva-buffering-default-spinner-size);border-radius:50%;display:inline-block;border-top:3px solid #fff;border-right:3px solid transparent;box-sizing:border-box;animation:eva-loader-meteor-rotation var(--eva-buffering-spinner-animation-speed) linear infinite}@keyframes eva-loader-meteor-rotation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
952
977
  }
953
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaBuffering, decorators: [{
978
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaBuffering, decorators: [{
954
979
  type: Component,
955
980
  args: [{ selector: 'eva-buffering', changeDetection: ChangeDetectionStrategy.OnPush, host: {
956
981
  "[class.eva-display-buffering]": "evaAPI.isBuffering()"
@@ -1253,10 +1278,10 @@ class EvaActiveChapter {
1253
1278
  this.activeChapterClicked();
1254
1279
  }
1255
1280
  }
1256
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaActiveChapter, deps: [], target: i0.ɵɵFactoryTarget.Component });
1257
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: EvaActiveChapter, isStandalone: true, selector: "eva-active-chapter", inputs: { evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null }, evaCustomIcon: { classPropertyName: "evaCustomIcon", publicName: "evaCustomIcon", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { evaChapterClicked: "evaChapterClicked" }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "activeChapterClicked()", "keydown": "activeChapterClickedKeyboard($event)" }, properties: { "attr.aria-label": "evaAria().ariaLabel" } }, ngImport: i0, template: "@if(activeChapter()){\n<span>{{activeChapter()!.title ? activeChapter()!.title : \"\"}}</span>\n\n@if(evaCustomIcon()){\n<ng-content />\n}\n@else {\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"var(--eva-active-chapter-icon-color)\"\n\tviewBox=\"0 0 16 16\">\n\t<path fill-rule=\"evenodd\"\n\t\td=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708\" />\n</svg>\n}\n}", styles: [":host{position:relative;display:flex;justify-content:space-between;align-items:center;height:var(--eva-control-element-height);min-width:var(--eva-active-chapter-min-width);width:var(--eva-active-chapter-width);max-width:var(--eva-active-chapter-max-width);cursor:pointer;color:var(--eva-icon-color);font-family:var(--eva-font-family);outline:none;user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;padding:var(--eva-active-chapter-padding)}:host:hover{background-color:var(--eva-active-chapter-hover-background);border-radius:4px}:host>span{padding-right:8px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1281
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaActiveChapter, deps: [], target: i0.ɵɵFactoryTarget.Component });
1282
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: EvaActiveChapter, isStandalone: true, selector: "eva-active-chapter", inputs: { evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null }, evaCustomIcon: { classPropertyName: "evaCustomIcon", publicName: "evaCustomIcon", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { evaChapterClicked: "evaChapterClicked" }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "activeChapterClicked()", "keydown": "activeChapterClickedKeyboard($event)" }, properties: { "attr.aria-label": "evaAria().ariaLabel" } }, ngImport: i0, template: "@if(activeChapter()){\n<span>{{activeChapter()!.title ? activeChapter()!.title : \"\"}}</span>\n\n@if(evaCustomIcon()){\n<ng-content />\n}\n@else {\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"var(--eva-active-chapter-icon-color)\"\n\tviewBox=\"0 0 16 16\">\n\t<path fill-rule=\"evenodd\"\n\t\td=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708\" />\n</svg>\n}\n}", styles: [":host{position:relative;display:flex;justify-content:space-between;align-items:center;height:var(--eva-control-element-height);min-width:var(--eva-active-chapter-min-width);width:var(--eva-active-chapter-width);max-width:var(--eva-active-chapter-max-width);cursor:pointer;color:var(--eva-icon-color);font-family:var(--eva-font-family);outline:none;user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;padding:var(--eva-active-chapter-padding)}:host:hover{background-color:var(--eva-active-chapter-hover-background);border-radius:4px}:host>span{padding-right:8px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1258
1283
  }
1259
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaActiveChapter, decorators: [{
1284
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaActiveChapter, decorators: [{
1260
1285
  type: Component,
1261
1286
  args: [{ selector: 'eva-active-chapter', changeDetection: ChangeDetectionStrategy.OnPush, host: {
1262
1287
  "tabindex": "0",
@@ -1337,10 +1362,10 @@ class EvaBackward {
1337
1362
  this.backwardClicked();
1338
1363
  }
1339
1364
  }
1340
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaBackward, deps: [], target: i0.ɵɵFactoryTarget.Component });
1341
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: EvaBackward, isStandalone: true, selector: "eva-backward", inputs: { evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null }, evaCustomIcon: { classPropertyName: "evaCustomIcon", publicName: "evaCustomIcon", isSignal: true, isRequired: false, transformFunction: null }, evaBackwardSeconds: { classPropertyName: "evaBackwardSeconds", publicName: "evaBackwardSeconds", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "backwardClicked()", "keydown": "backwardClickedKeyboard($event)" }, properties: { "attr.aria-label": "evaAria().ariaLabel", "class.eva-icon": "!evaCustomIcon()", "class.eva-icon-replay_10": "!evaCustomIcon() && evaBackwardSeconds() === 10", "class.eva-icon-replay_30": "!evaCustomIcon() && evaBackwardSeconds() === 30" } }, ngImport: i0, template: "@if(evaCustomIcon()){\n<ng-content></ng-content>\n}", styles: [":host{display:flex;justify-content:center;align-items:center;height:var(--eva-control-element-height);width:50px;cursor:pointer;color:var(--eva-icon-color);user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none}:host>img{pointer-events:none!important;-webkit-user-select:none!important;user-select:none!important}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1365
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaBackward, deps: [], target: i0.ɵɵFactoryTarget.Component });
1366
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: EvaBackward, isStandalone: true, selector: "eva-backward", inputs: { evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null }, evaCustomIcon: { classPropertyName: "evaCustomIcon", publicName: "evaCustomIcon", isSignal: true, isRequired: false, transformFunction: null }, evaBackwardSeconds: { classPropertyName: "evaBackwardSeconds", publicName: "evaBackwardSeconds", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "backwardClicked()", "keydown": "backwardClickedKeyboard($event)" }, properties: { "attr.aria-label": "evaAria().ariaLabel", "class.eva-icon": "!evaCustomIcon()", "class.eva-icon-replay_10": "!evaCustomIcon() && evaBackwardSeconds() === 10", "class.eva-icon-replay_30": "!evaCustomIcon() && evaBackwardSeconds() === 30" } }, ngImport: i0, template: "@if(evaCustomIcon()){\n<ng-content></ng-content>\n}", styles: [":host{display:flex;justify-content:center;align-items:center;height:var(--eva-control-element-height);width:50px;cursor:pointer;color:var(--eva-icon-color);user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none}:host>img{pointer-events:none!important;-webkit-user-select:none!important;user-select:none!important}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1342
1367
  }
1343
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaBackward, decorators: [{
1368
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaBackward, decorators: [{
1344
1369
  type: Component,
1345
1370
  args: [{ selector: 'eva-backward', changeDetection: ChangeDetectionStrategy.OnPush, host: {
1346
1371
  "tabindex": "0",
@@ -1385,10 +1410,10 @@ class EvaControlsDivider {
1385
1410
  * - `ariaLabel` → `"Controls divider"`
1386
1411
  */
1387
1412
  evaAria = input(transformEvaControlsDividerAria(undefined), { ...(ngDevMode ? { debugName: "evaAria" } : /* istanbul ignore next */ {}), transform: transformEvaControlsDividerAria });
1388
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaControlsDivider, deps: [], target: i0.ɵɵFactoryTarget.Component });
1389
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.0", type: EvaControlsDivider, isStandalone: true, selector: "eva-controls-divider", inputs: { evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "separator", "aria-orientation": "horizontal", "aria-valuemin": "0", "aria-valuemax": "100" }, properties: { "attr.aria-label": "evaAria().ariaLabel" } }, ngImport: i0, template: "", styles: [":host{display:flex;align-items:center;justify-content:center;height:var(--eva-scrub-bar-heights);flex-grow:1;flex-basis:0;margin:0;padding:0;border:0;user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1413
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaControlsDivider, deps: [], target: i0.ɵɵFactoryTarget.Component });
1414
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: EvaControlsDivider, isStandalone: true, selector: "eva-controls-divider", inputs: { evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "separator", "aria-orientation": "horizontal", "aria-valuemin": "0", "aria-valuemax": "100" }, properties: { "attr.aria-label": "evaAria().ariaLabel" } }, ngImport: i0, template: "", styles: [":host{display:flex;align-items:center;justify-content:center;height:var(--eva-scrub-bar-heights);flex-grow:1;flex-basis:0;margin:0;padding:0;border:0;user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1390
1415
  }
1391
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaControlsDivider, decorators: [{
1416
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaControlsDivider, decorators: [{
1392
1417
  type: Component,
1393
1418
  args: [{ selector: 'eva-controls-divider', changeDetection: ChangeDetectionStrategy.OnPush, host: {
1394
1419
  "tabindex": "0",
@@ -1482,6 +1507,41 @@ function validateTracks(tracks) {
1482
1507
  });
1483
1508
  return uniqueTracks;
1484
1509
  }
1510
+ /** Returns a fully populated `EvaKeyboardShortcutsConfiguration` with all default key bindings. */
1511
+ function prepareDefaultKeyboardShortcutsConfiguration() {
1512
+ return {
1513
+ backwardSeconds: 10,
1514
+ forwardSeconds: 10,
1515
+ backwardsKeyOne: "J",
1516
+ forwardKeyOne: "L",
1517
+ backwardsKeyTwo: "ARROWLEFT",
1518
+ forwardKeyTwo: "ARROWRIGHT",
1519
+ muteKey: "M",
1520
+ fullscreen: "F",
1521
+ playPause: "SPACE",
1522
+ oneFrameBackward: ",",
1523
+ oneFrameForward: ".",
1524
+ };
1525
+ }
1526
+ /** Input transform that fills missing keys with defaults. `backwardSeconds` and `forwardSeconds` are clamped to a minimum of `1` (values `<= 0` fall back to `10`). Returns the full default config when `conf` is `null`/`undefined`. */
1527
+ function validateAndTransformEvaKeyboardShortcutsConfiguration(conf) {
1528
+ if (!conf) {
1529
+ return prepareDefaultKeyboardShortcutsConfiguration();
1530
+ }
1531
+ return {
1532
+ backwardSeconds: (conf.backwardSeconds && conf.backwardSeconds > 0) ? conf.backwardSeconds : 10,
1533
+ forwardSeconds: (conf.forwardSeconds && conf.forwardSeconds > 0) ? conf.forwardSeconds : 10,
1534
+ backwardsKeyOne: conf.backwardsKeyOne ?? "J",
1535
+ forwardKeyOne: conf.forwardKeyOne ?? "L",
1536
+ backwardsKeyTwo: conf.backwardsKeyTwo ?? "ARROWLEFT",
1537
+ forwardKeyTwo: conf.forwardKeyTwo ?? "ARROWRIGHT",
1538
+ muteKey: conf.muteKey ?? "M",
1539
+ fullscreen: conf.fullscreen ?? "F",
1540
+ playPause: conf.playPause ?? "SPACE",
1541
+ oneFrameBackward: conf.oneFrameBackward ?? ",",
1542
+ oneFrameForward: conf.oneFrameForward ?? ".",
1543
+ };
1544
+ }
1485
1545
 
1486
1546
  /**
1487
1547
  * Controls container component for the Eva video player.
@@ -1629,10 +1689,10 @@ class EvaControlsContainer {
1629
1689
  this.evaAPI.componentsContainerVisibilityStateSubject.next(true);
1630
1690
  }, this.evaAutohideTime());
1631
1691
  }
1632
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaControlsContainer, deps: [], target: i0.ɵɵFactoryTarget.Component });
1633
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.0", type: EvaControlsContainer, isStandalone: true, selector: "eva-controls-container", inputs: { evaAutohide: { classPropertyName: "evaAutohide", publicName: "evaAutohide", isSignal: true, isRequired: false, transformFunction: null }, evaAutohideTime: { classPropertyName: "evaAutohideTime", publicName: "evaAutohideTime", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.hide": "hideControls()" } }, usesOnChanges: true, ngImport: i0, template: "<ng-content></ng-content>", styles: [":host{position:absolute;bottom:0;left:0;display:flex;align-items:center;column-gap:var(--eva-controls-container-controls-spacing);width:100%;height:var(--eva-control-element-height);z-index:302;background-color:var(--eva-controls-container-background-color);opacity:1;transition:bottom var(--eva-transition-duration) ease-in-out,opacity var(--eva-transition-duration) ease-in-out}:host(.hide){bottom:calc(-1 * var(--eva-control-element-height))!important;opacity:0!important}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1692
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaControlsContainer, deps: [], target: i0.ɵɵFactoryTarget.Component });
1693
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: EvaControlsContainer, isStandalone: true, selector: "eva-controls-container", inputs: { evaAutohide: { classPropertyName: "evaAutohide", publicName: "evaAutohide", isSignal: true, isRequired: false, transformFunction: null }, evaAutohideTime: { classPropertyName: "evaAutohideTime", publicName: "evaAutohideTime", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.hide": "hideControls()" } }, usesOnChanges: true, ngImport: i0, template: "<ng-content></ng-content>", styles: [":host{position:absolute;bottom:0;left:0;display:flex;align-items:center;column-gap:var(--eva-controls-container-controls-spacing);width:100%;height:var(--eva-control-element-height);z-index:302;background-color:var(--eva-controls-container-background-color);opacity:1;transition:bottom var(--eva-transition-duration) ease-in-out,opacity var(--eva-transition-duration) ease-in-out}:host(.hide){bottom:calc(-1 * var(--eva-control-element-height))!important;opacity:0!important}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1634
1694
  }
1635
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaControlsContainer, decorators: [{
1695
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaControlsContainer, decorators: [{
1636
1696
  type: Component,
1637
1697
  args: [{ selector: 'eva-controls-container', changeDetection: ChangeDetectionStrategy.OnPush, host: {
1638
1698
  "[class.hide]": "hideControls()"
@@ -1709,10 +1769,10 @@ class EvaForward {
1709
1769
  this.forwardClicked();
1710
1770
  }
1711
1771
  }
1712
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaForward, deps: [], target: i0.ɵɵFactoryTarget.Component });
1713
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: EvaForward, isStandalone: true, selector: "eva-forward", inputs: { evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null }, evaCustomIcon: { classPropertyName: "evaCustomIcon", publicName: "evaCustomIcon", isSignal: true, isRequired: false, transformFunction: null }, evaForwardSeconds: { classPropertyName: "evaForwardSeconds", publicName: "evaForwardSeconds", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "forwardClicked()", "keydown": "forwardClickedKeyboard($event)" }, properties: { "attr.aria-label": "evaAria().ariaLabel", "class.eva-icon": "!evaCustomIcon()", "class.eva-icon-forward_10": "!evaCustomIcon() && evaForwardSeconds() === 10", "class.eva-icon-forward_30": "!evaCustomIcon() && evaForwardSeconds() === 30" } }, ngImport: i0, template: "@if(evaCustomIcon()){\n<ng-content></ng-content>\n}", styles: [":host{display:flex;justify-content:center;align-items:center;height:var(--eva-control-element-height);width:50px;cursor:pointer;color:var(--eva-icon-color);user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none}:host>img{pointer-events:none!important;-webkit-user-select:none!important;user-select:none!important}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1772
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaForward, deps: [], target: i0.ɵɵFactoryTarget.Component });
1773
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: EvaForward, isStandalone: true, selector: "eva-forward", inputs: { evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null }, evaCustomIcon: { classPropertyName: "evaCustomIcon", publicName: "evaCustomIcon", isSignal: true, isRequired: false, transformFunction: null }, evaForwardSeconds: { classPropertyName: "evaForwardSeconds", publicName: "evaForwardSeconds", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "forwardClicked()", "keydown": "forwardClickedKeyboard($event)" }, properties: { "attr.aria-label": "evaAria().ariaLabel", "class.eva-icon": "!evaCustomIcon()", "class.eva-icon-forward_10": "!evaCustomIcon() && evaForwardSeconds() === 10", "class.eva-icon-forward_30": "!evaCustomIcon() && evaForwardSeconds() === 30" } }, ngImport: i0, template: "@if(evaCustomIcon()){\n<ng-content></ng-content>\n}", styles: [":host{display:flex;justify-content:center;align-items:center;height:var(--eva-control-element-height);width:50px;cursor:pointer;color:var(--eva-icon-color);user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none}:host>img{pointer-events:none!important;-webkit-user-select:none!important;user-select:none!important}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1714
1774
  }
1715
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaForward, decorators: [{
1775
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaForward, decorators: [{
1716
1776
  type: Component,
1717
1777
  args: [{ selector: 'eva-forward', changeDetection: ChangeDetectionStrategy.OnPush, host: {
1718
1778
  "tabindex": "0",
@@ -1756,6 +1816,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
1756
1816
  * await this.fullscreenService.toggleFullscreen(playerContainer, videoElement);
1757
1817
  */
1758
1818
  class EvaFullscreenAPI {
1819
+ evaAPI = inject(EvaApi);
1759
1820
  /** Internal subject tracking whether the player is currently in fullscreen mode. */
1760
1821
  isFullscreenSubject = new BehaviorSubject(false);
1761
1822
  /** Observable stream of fullscreen state changes. Subscribe to react to enter/exit events. */
@@ -1961,12 +2022,22 @@ class EvaFullscreenAPI {
1961
2022
  * @param element - The player container element to make fullscreen.
1962
2023
  * @param videoElement - The native `<video>` element, used as a fallback on mobile/iOS.
1963
2024
  */
1964
- async toggleFullscreen(element, videoElement) {
2025
+ async toggleFullscreen() {
2026
+ const videoElement = this.evaAPI.assignedVideoElement;
2027
+ if (!videoElement) {
2028
+ console.warn('Video element not assigned');
2029
+ return;
2030
+ }
2031
+ const playerContainer = videoElement.closest('eva-player');
2032
+ if (!playerContainer) {
2033
+ console.warn('Player container not found');
2034
+ return;
2035
+ }
1965
2036
  if (this.isFullscreen()) {
1966
2037
  await this.exitFullscreen();
1967
2038
  }
1968
2039
  else {
1969
- await this.enterFullscreen(element, videoElement);
2040
+ await this.enterFullscreen(playerContainer, videoElement);
1970
2041
  }
1971
2042
  }
1972
2043
  /**
@@ -1997,10 +2068,10 @@ class EvaFullscreenAPI {
1997
2068
  this.fullscreenSub?.unsubscribe();
1998
2069
  this.isFullscreenSubject.complete();
1999
2070
  }
2000
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaFullscreenAPI, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2001
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaFullscreenAPI });
2071
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaFullscreenAPI, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2072
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaFullscreenAPI });
2002
2073
  }
2003
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaFullscreenAPI, decorators: [{
2074
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaFullscreenAPI, decorators: [{
2004
2075
  type: Injectable
2005
2076
  }], ctorParameters: () => [] });
2006
2077
 
@@ -2035,7 +2106,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
2035
2106
  * </eva-fullscreen>
2036
2107
  */
2037
2108
  class EvaFullscreen {
2038
- evaAPI = inject(EvaApi);
2039
2109
  fullscreenService = inject(EvaFullscreenAPI);
2040
2110
  /**
2041
2111
  * When `true`, suppresses all built-in icon classes (`eva-icon`, `eva-icon-fullscreen`)
@@ -2091,17 +2161,7 @@ class EvaFullscreen {
2091
2161
  */
2092
2162
  async fullscreenClicked() {
2093
2163
  try {
2094
- const videoElement = this.evaAPI.assignedVideoElement;
2095
- if (!videoElement) {
2096
- console.warn('Video element not assigned');
2097
- return;
2098
- }
2099
- const playerContainer = videoElement.closest('eva-player');
2100
- if (!playerContainer) {
2101
- console.warn('Player container not found');
2102
- return;
2103
- }
2104
- await this.fullscreenService.toggleFullscreen(playerContainer, videoElement);
2164
+ await this.fullscreenService.toggleFullscreen();
2105
2165
  }
2106
2166
  catch (error) {
2107
2167
  console.error('Failed to toggle fullscreen:', error);
@@ -2117,10 +2177,10 @@ class EvaFullscreen {
2117
2177
  this.fullscreenClicked();
2118
2178
  }
2119
2179
  }
2120
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaFullscreen, deps: [], target: i0.ɵɵFactoryTarget.Component });
2121
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.0", type: EvaFullscreen, isStandalone: true, selector: "eva-fullscreen", inputs: { evaCustomIcon: { classPropertyName: "evaCustomIcon", publicName: "evaCustomIcon", isSignal: true, isRequired: false, transformFunction: null }, evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "fullscreenClicked()", "keydown": "fullscreenClickedKeyboard($event)" }, properties: { "attr.aria-label": "ariaLabel()", "class.eva-icon": "!evaCustomIcon()", "class.eva-icon-fullscreen": "!evaCustomIcon()" } }, ngImport: i0, template: "<ng-content></ng-content>", styles: [":host{display:flex;justify-content:center;height:var(--eva-control-element-height);width:50px;cursor:pointer;color:var(--eva-icon-color);user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none}:host>img{pointer-events:none!important;-webkit-user-select:none!important;user-select:none!important}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2180
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaFullscreen, deps: [], target: i0.ɵɵFactoryTarget.Component });
2181
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: EvaFullscreen, isStandalone: true, selector: "eva-fullscreen", inputs: { evaCustomIcon: { classPropertyName: "evaCustomIcon", publicName: "evaCustomIcon", isSignal: true, isRequired: false, transformFunction: null }, evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "fullscreenClicked()", "keydown": "fullscreenClickedKeyboard($event)" }, properties: { "attr.aria-label": "ariaLabel()", "class.eva-icon": "!evaCustomIcon()", "class.eva-icon-fullscreen": "!evaCustomIcon()" } }, ngImport: i0, template: "<ng-content></ng-content>", styles: [":host{display:flex;justify-content:center;height:var(--eva-control-element-height);width:50px;cursor:pointer;color:var(--eva-icon-color);user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none}:host>img{pointer-events:none!important;-webkit-user-select:none!important;user-select:none!important}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2122
2182
  }
2123
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaFullscreen, decorators: [{
2183
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaFullscreen, decorators: [{
2124
2184
  type: Component,
2125
2185
  args: [{ selector: 'eva-fullscreen', changeDetection: ChangeDetectionStrategy.OnPush, host: {
2126
2186
  "tabindex": "0",
@@ -2266,10 +2326,10 @@ class EvaMute {
2266
2326
  this.muteClicked();
2267
2327
  }
2268
2328
  }
2269
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaMute, deps: [], target: i0.ɵɵFactoryTarget.Component });
2270
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: EvaMute, isStandalone: true, selector: "eva-mute", inputs: { evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null }, evaCustomIcon: { classPropertyName: "evaCustomIcon", publicName: "evaCustomIcon", isSignal: true, isRequired: false, transformFunction: null }, evaLowVolume: { classPropertyName: "evaLowVolume", publicName: "evaLowVolume", isSignal: true, isRequired: false, transformFunction: null }, evaMiddleVolume: { classPropertyName: "evaMiddleVolume", publicName: "evaMiddleVolume", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "muteClicked()", "keydown": "muteClickKeyboard($event)" }, properties: { "attr.aria-label": "muteAriaLabel()", "attr.aria-valuetext": "muteAriaValueText()", "class.eva-icon": "!evaCustomIcon()", "class.eva-icon-volume_up": "!evaCustomIcon() && evaIconVolumeUp()", "class.eva-icon-volume_middle": "!evaCustomIcon() && evaIconVolumeMiddle()", "class.eva-icon-volume_low": "!evaCustomIcon() && evaIconVolumeLow()", "class.eva-icon-volume_off": "!evaCustomIcon() && evaIconVolumeOff()" } }, ngImport: i0, template: "@if (evaCustomIcon() && evaIconVolumeOff()) {\n<ng-content select=\"[evaVolumeOff]\"></ng-content>\n}\n@if (evaCustomIcon() && evaIconVolumeLow()) {\n<ng-content select=\"[evaVolumeLow]\"></ng-content>\n}\n@if (evaCustomIcon() && evaIconVolumeMiddle()) {\n<ng-content select=\"[evaVolumeMiddle]\"></ng-content>\n}\n@if (evaCustomIcon() && evaIconVolumeUp()) {\n<ng-content select=\"[evaVolumeUp]\"></ng-content>\n}", styles: [":host{display:flex;justify-content:center;width:50px;height:var(--eva-control-element-height);color:var(--eva-icon-color);cursor:pointer;user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2329
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaMute, deps: [], target: i0.ɵɵFactoryTarget.Component });
2330
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: EvaMute, isStandalone: true, selector: "eva-mute", inputs: { evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null }, evaCustomIcon: { classPropertyName: "evaCustomIcon", publicName: "evaCustomIcon", isSignal: true, isRequired: false, transformFunction: null }, evaLowVolume: { classPropertyName: "evaLowVolume", publicName: "evaLowVolume", isSignal: true, isRequired: false, transformFunction: null }, evaMiddleVolume: { classPropertyName: "evaMiddleVolume", publicName: "evaMiddleVolume", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "muteClicked()", "keydown": "muteClickKeyboard($event)" }, properties: { "attr.aria-label": "muteAriaLabel()", "attr.aria-valuetext": "muteAriaValueText()", "class.eva-icon": "!evaCustomIcon()", "class.eva-icon-volume_up": "!evaCustomIcon() && evaIconVolumeUp()", "class.eva-icon-volume_middle": "!evaCustomIcon() && evaIconVolumeMiddle()", "class.eva-icon-volume_low": "!evaCustomIcon() && evaIconVolumeLow()", "class.eva-icon-volume_off": "!evaCustomIcon() && evaIconVolumeOff()" } }, ngImport: i0, template: "@if (evaCustomIcon() && evaIconVolumeOff()) {\n<ng-content select=\"[evaVolumeOff]\"></ng-content>\n}\n@if (evaCustomIcon() && evaIconVolumeLow()) {\n<ng-content select=\"[evaVolumeLow]\"></ng-content>\n}\n@if (evaCustomIcon() && evaIconVolumeMiddle()) {\n<ng-content select=\"[evaVolumeMiddle]\"></ng-content>\n}\n@if (evaCustomIcon() && evaIconVolumeUp()) {\n<ng-content select=\"[evaVolumeUp]\"></ng-content>\n}", styles: [":host{display:flex;justify-content:center;width:50px;height:var(--eva-control-element-height);color:var(--eva-icon-color);cursor:pointer;user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2271
2331
  }
2272
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaMute, decorators: [{
2332
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaMute, decorators: [{
2273
2333
  type: Component,
2274
2334
  args: [{ selector: 'eva-mute', changeDetection: ChangeDetectionStrategy.OnPush, host: {
2275
2335
  "tabindex": "0",
@@ -2367,30 +2427,20 @@ class EvaOverlayPlay {
2367
2427
  playClicked() {
2368
2428
  this.evaAPI.playOrPauseVideo();
2369
2429
  }
2370
- /**
2371
- * Handles keyboard events on the host element.
2372
- * Triggers play/pause on `Enter` or `Space` keypress.
2373
- */
2374
- playClickedKeyboard(k) {
2375
- if (k.key === 'Enter' || k.key === ' ') {
2376
- k.preventDefault();
2377
- this.playClicked();
2378
- }
2379
- }
2380
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaOverlayPlay, deps: [], target: i0.ɵɵFactoryTarget.Component });
2381
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.0", type: EvaOverlayPlay, isStandalone: true, selector: "eva-overlay-play", inputs: { evaOvelayPlayAria: { classPropertyName: "evaOvelayPlayAria", publicName: "evaOvelayPlayAria", isSignal: true, isRequired: false, transformFunction: null }, evaCustomIcon: { classPropertyName: "evaCustomIcon", publicName: "evaCustomIcon", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0" }, listeners: { "click": "playClicked()", "keydown": "playClickedKeyboard($event)" }, properties: { "attr.aria-label": "ariaLabel()", "class.eva-icon": "!evaCustomIcon()", "class.eva-icon-play_arrow": "!evaCustomIcon() && evaIconPlay()", "class.eva-display-overlay-play": "evaIconPlay() && !evaAPI.isBuffering()" } }, ngImport: i0, template: "<ng-content></ng-content>", styles: [":host{display:flex;align-items:center;justify-content:center;width:100%;height:calc(100% - var(--eva-control-element-height));cursor:pointer;color:var(--eva-icon-color);user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;position:absolute;top:0;left:0;transition:visibility var(--eva-transition-duration) linear,background-color var(--eva-transition-duration) linear,opacity var(--eva-transition-duration) linear;background-color:#0000;z-index:301;visibility:hidden;opacity:0}:host(.eva-display-overlay-play){background-color:var(--eva-overlay-play-background-color)!important;opacity:1!important;visibility:visible!important}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2430
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaOverlayPlay, deps: [], target: i0.ɵɵFactoryTarget.Component });
2431
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: EvaOverlayPlay, isStandalone: true, selector: "eva-overlay-play", inputs: { evaOvelayPlayAria: { classPropertyName: "evaOvelayPlayAria", publicName: "evaOvelayPlayAria", isSignal: true, isRequired: false, transformFunction: null }, evaCustomIcon: { classPropertyName: "evaCustomIcon", publicName: "evaCustomIcon", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "playClicked()" }, properties: { "attr.aria-label": "ariaLabel()", "class.eva-icon": "!evaCustomIcon()", "class.eva-icon-play_arrow": "!evaCustomIcon() && evaIconPlay()", "class.eva-display-overlay-play": "evaIconPlay() && !evaAPI.isBuffering()" } }, ngImport: i0, template: "<ng-content></ng-content>", styles: [":host{display:flex;align-items:center;justify-content:center;width:100%;height:calc(100% - var(--eva-control-element-height));cursor:pointer;color:var(--eva-icon-color);user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;position:absolute;top:0;left:0;transition:visibility var(--eva-transition-duration) linear,background-color var(--eva-transition-duration) linear,opacity var(--eva-transition-duration) linear;background-color:#0000;z-index:301;opacity:0}:host(.eva-display-overlay-play){background-color:var(--eva-overlay-play-background-color)!important;opacity:1!important}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2382
2432
  }
2383
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaOverlayPlay, decorators: [{
2433
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaOverlayPlay, decorators: [{
2384
2434
  type: Component,
2385
2435
  args: [{ selector: 'eva-overlay-play', changeDetection: ChangeDetectionStrategy.OnPush, host: {
2386
2436
  "tabindex": "0",
2437
+ "role": "button",
2387
2438
  "[attr.aria-label]": "ariaLabel()",
2388
2439
  "[class.eva-icon]": "!evaCustomIcon()",
2389
2440
  "[class.eva-icon-play_arrow]": "!evaCustomIcon() && evaIconPlay()",
2390
2441
  "[class.eva-display-overlay-play]": "evaIconPlay() && !evaAPI.isBuffering()",
2391
- "(click)": "playClicked()",
2392
- "(keydown)": "playClickedKeyboard($event)"
2393
- }, template: "<ng-content></ng-content>", styles: [":host{display:flex;align-items:center;justify-content:center;width:100%;height:calc(100% - var(--eva-control-element-height));cursor:pointer;color:var(--eva-icon-color);user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;position:absolute;top:0;left:0;transition:visibility var(--eva-transition-duration) linear,background-color var(--eva-transition-duration) linear,opacity var(--eva-transition-duration) linear;background-color:#0000;z-index:301;visibility:hidden;opacity:0}:host(.eva-display-overlay-play){background-color:var(--eva-overlay-play-background-color)!important;opacity:1!important;visibility:visible!important}\n"] }]
2442
+ "(click)": "playClicked()"
2443
+ }, template: "<ng-content></ng-content>", styles: [":host{display:flex;align-items:center;justify-content:center;width:100%;height:calc(100% - var(--eva-control-element-height));cursor:pointer;color:var(--eva-icon-color);user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;position:absolute;top:0;left:0;transition:visibility var(--eva-transition-duration) linear,background-color var(--eva-transition-duration) linear,opacity var(--eva-transition-duration) linear;background-color:#0000;z-index:301;opacity:0}:host(.eva-display-overlay-play){background-color:var(--eva-overlay-play-background-color)!important;opacity:1!important}\n"] }]
2394
2444
  }], propDecorators: { evaOvelayPlayAria: [{ type: i0.Input, args: [{ isSignal: true, alias: "evaOvelayPlayAria", required: false }] }], evaCustomIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "evaCustomIcon", required: false }] }] } });
2395
2445
 
2396
2446
  /**
@@ -2511,10 +2561,10 @@ class EvaPictureInPicture {
2511
2561
  this.pipClicked();
2512
2562
  }
2513
2563
  }
2514
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaPictureInPicture, deps: [], target: i0.ɵɵFactoryTarget.Component });
2515
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: EvaPictureInPicture, isStandalone: true, selector: "eva-picture-in-picture", inputs: { evaCustomIcon: { classPropertyName: "evaCustomIcon", publicName: "evaCustomIcon", isSignal: true, isRequired: false, transformFunction: null }, evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "pipClicked()", "keydown": "pipClickedKeyboard($event)" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-valuetext": "ariaValueText()" } }, ngImport: i0, template: "@if(evaCustomIcon()){\n<ng-content></ng-content>\n}\n@else {\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"var(--eva-icon-color)\"\n\tstyle=\"width: 50%; height: 50%\">\n\t<path\n\t\td=\"M19,11H11V17H19V11M23,19V5C23,3.88 22.1,3 21,3H3A2,2 0 0,0 1,5V19A2,2 0 0,0 3,21H21A2,2 0 0,0 23,19M21,19H3V4.97H21V19Z\" />\n</svg>\n}", styles: [":host{display:flex;justify-content:center;align-items:center;height:var(--eva-control-element-height);width:50px;cursor:pointer;color:var(--eva-icon-color);user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none}:host>svg{pointer-events:none!important;user-select:none!important;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2564
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaPictureInPicture, deps: [], target: i0.ɵɵFactoryTarget.Component });
2565
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: EvaPictureInPicture, isStandalone: true, selector: "eva-picture-in-picture", inputs: { evaCustomIcon: { classPropertyName: "evaCustomIcon", publicName: "evaCustomIcon", isSignal: true, isRequired: false, transformFunction: null }, evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "pipClicked()", "keydown": "pipClickedKeyboard($event)" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-valuetext": "ariaValueText()" } }, ngImport: i0, template: "@if(evaCustomIcon()){\n<ng-content></ng-content>\n}\n@else {\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"var(--eva-icon-color)\"\n\tstyle=\"width: 50%; height: 50%\">\n\t<path\n\t\td=\"M19,11H11V17H19V11M23,19V5C23,3.88 22.1,3 21,3H3A2,2 0 0,0 1,5V19A2,2 0 0,0 3,21H21A2,2 0 0,0 23,19M21,19H3V4.97H21V19Z\" />\n</svg>\n}", styles: [":host{display:flex;justify-content:center;align-items:center;height:var(--eva-control-element-height);width:50px;cursor:pointer;color:var(--eva-icon-color);user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none}:host>svg{pointer-events:none!important;user-select:none!important;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2516
2566
  }
2517
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaPictureInPicture, decorators: [{
2567
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaPictureInPicture, decorators: [{
2518
2568
  type: Component,
2519
2569
  args: [{ selector: 'eva-picture-in-picture', changeDetection: ChangeDetectionStrategy.OnPush, host: {
2520
2570
  "tabindex": "0",
@@ -2586,10 +2636,10 @@ class EvaTimeDisplayPipe {
2586
2636
  pad(num) {
2587
2637
  return num.toString().padStart(2, '0');
2588
2638
  }
2589
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaTimeDisplayPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
2590
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.0", ngImport: i0, type: EvaTimeDisplayPipe, isStandalone: true, name: "evaTimeDisplay" });
2639
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaTimeDisplayPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
2640
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.2", ngImport: i0, type: EvaTimeDisplayPipe, isStandalone: true, name: "evaTimeDisplay" });
2591
2641
  }
2592
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaTimeDisplayPipe, decorators: [{
2642
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaTimeDisplayPipe, decorators: [{
2593
2643
  type: Pipe,
2594
2644
  args: [{
2595
2645
  name: 'evaTimeDisplay',
@@ -2741,10 +2791,10 @@ class EvaPlayPause {
2741
2791
  this.playPauseClicked();
2742
2792
  }
2743
2793
  }
2744
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaPlayPause, deps: [], target: i0.ɵɵFactoryTarget.Component });
2745
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: EvaPlayPause, isStandalone: true, selector: "eva-play-pause", inputs: { evaPlayPauseAria: { classPropertyName: "evaPlayPauseAria", publicName: "evaPlayPauseAria", isSignal: true, isRequired: false, transformFunction: null }, evaCustomIcon: { classPropertyName: "evaCustomIcon", publicName: "evaCustomIcon", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { playingStateChanged: "playingStateChanged" }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "playPauseClicked()", "keydown": "playPauseClickedKeyboard($event)" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-valuetext": "ariaValueText()", "class.eva-icon": "!evaCustomIcon()", "class.eva-icon-pause": "!evaCustomIcon() && evaIconPause()", "class.eva-icon-play_arrow": "!evaCustomIcon() && evaIconPlay()" } }, ngImport: i0, template: "@if(evaCustomIcon()){\n@if(evaIconPause()){\n<ng-content select=\"[evaPause]\"></ng-content>\n}\n@if(evaIconPlay()){\n<ng-content select=\"[evaPlay]\"></ng-content>\n}\n}", styles: [":host{display:flex;justify-content:center;height:var(--eva-control-element-height);width:50px;color:var(--eva-icon-color);user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;cursor:pointer}:host>img{pointer-events:none;-webkit-user-select:none;user-select:none;width:32px;height:32px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2794
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaPlayPause, deps: [], target: i0.ɵɵFactoryTarget.Component });
2795
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: EvaPlayPause, isStandalone: true, selector: "eva-play-pause", inputs: { evaPlayPauseAria: { classPropertyName: "evaPlayPauseAria", publicName: "evaPlayPauseAria", isSignal: true, isRequired: false, transformFunction: null }, evaCustomIcon: { classPropertyName: "evaCustomIcon", publicName: "evaCustomIcon", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { playingStateChanged: "playingStateChanged" }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "playPauseClicked()", "keydown": "playPauseClickedKeyboard($event)" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-valuetext": "ariaValueText()", "class.eva-icon": "!evaCustomIcon()", "class.eva-icon-pause": "!evaCustomIcon() && evaIconPause()", "class.eva-icon-play_arrow": "!evaCustomIcon() && evaIconPlay()" } }, ngImport: i0, template: "@if(evaCustomIcon()){\n@if(evaIconPause()){\n<ng-content select=\"[evaPause]\"></ng-content>\n}\n@if(evaIconPlay()){\n<ng-content select=\"[evaPlay]\"></ng-content>\n}\n}", styles: [":host{display:flex;justify-content:center;height:var(--eva-control-element-height);width:50px;color:var(--eva-icon-color);user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;cursor:pointer}:host>img{pointer-events:none;-webkit-user-select:none;user-select:none;width:32px;height:32px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2746
2796
  }
2747
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaPlayPause, decorators: [{
2797
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaPlayPause, decorators: [{
2748
2798
  type: Component,
2749
2799
  args: [{ selector: 'eva-play-pause', changeDetection: ChangeDetectionStrategy.OnPush, host: {
2750
2800
  "tabindex": "0",
@@ -2987,10 +3037,10 @@ class EvaPlaybackSpeed {
2987
3037
  this.evaAPI.controlsSelectorComponentActive.next(false);
2988
3038
  }
2989
3039
  }
2990
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaPlaybackSpeed, deps: [], target: i0.ɵɵFactoryTarget.Component });
2991
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: EvaPlaybackSpeed, isStandalone: true, selector: "eva-playback-speed", inputs: { evaPlaybackSpeeds: { classPropertyName: "evaPlaybackSpeeds", publicName: "evaPlaybackSpeeds", isSignal: true, isRequired: true, transformFunction: null }, evaDefaultPlaybackSpeed: { classPropertyName: "evaDefaultPlaybackSpeed", publicName: "evaDefaultPlaybackSpeed", isSignal: true, isRequired: false, transformFunction: null }, evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "playbackClicked()", "keydown": "playbackClickedKeyboard($event)", "blur": "handleBlur($event)" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-valuetext": "currentSpeed() + 'x'", "class.open": "isOpen()" } }, ngImport: i0, template: "<div class=\"eva-playback-speed-container\">\n\t<!-- Current Speed Display Button -->\n\t<div class=\"eva-playback-speed-button\">\n\t\t<span class=\"speed-icon\">\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n\t\t\t\tstroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t<path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n\t\t\t</svg>\n\t\t</span>\n\t\t<span class=\"speed-label\">{{ formatSpeed(currentSpeed()) }}</span>\n\t\t<span class=\"dropdown-arrow\" [class.rotated]=\"isOpen()\">\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n\t\t\t\tstroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t<polyline points=\"6 9 12 15 18 9\"></polyline>\n\t\t\t</svg>\n\t\t</span>\n\t</div>\n\n\t<!-- Dropdown Menu -->\n\t<div class=\"eva-playback-speed-dropdown\" [class.show]=\"isOpen()\">\n\t\t<div class=\"dropdown-content\">\n\t\t\t<div class=\"dropdown-header\">{{evaAria().ariaLabel}}</div>\n\t\t\t<div class=\"speed-options\">\n\t\t\t\t@for (speed of evaPlaybackSpeeds(); track speed) {\n\t\t\t\t<button type=\"button\" class=\"speed-option\" [class.active]=\"speed === currentSpeed()\"\n\t\t\t\t\t(click)=\"selectSpeed(speed, $index)\" [attr.aria-selected]=\"speed === currentSpeed()\" role=\"option\">\n\t\t\t\t\t<span class=\"speed-text\">{{ formatSpeed(speed) }}</span>\n\t\t\t\t\t@if (speed === currentSpeed()) {\n\t\t\t\t\t<span class=\"checkmark\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t\t\t<polyline points=\"20 6 9 17 4 12\"></polyline>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>", styles: [":host{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;height:var(--eva-control-element-height);width:80px;cursor:pointer;color:#fff;position:relative;outline:none}:host:focus-visible{outline:2px solid rgba(255,255,255,.8);outline-offset:2px;border-radius:4px}:host:hover{background-color:var(--eva-playback-speed-hover-background);border-radius:4px}:host.open{background-color:var(--eva-playback-speed-opened-background);border-radius:4px}.eva-playback-speed-container{position:relative;display:flex;align-items:center;justify-content:center}.eva-playback-speed-button{display:flex;align-items:center;justify-content:center;width:100%;height:100%;gap:2px}.eva-playback-speed-button .speed-icon{display:none}.eva-playback-speed-button .speed-label{font-family:var(--eva-font-family);font-size:var(--eva-playback-speed-label-font-size);color:var(--eva-playback-speed-label-color);white-space:nowrap;line-height:1}.eva-playback-speed-button .dropdown-arrow{display:flex;align-items:center;width:var(--eva-playback-speed-dropdown-arrow-size);height:var(--eva-playback-speed-dropdown-arrow-size);color:var(--eva-playback-speed-dropdown-arrow-color);transition:transform var(--eva-transition-duration) cubic-bezier(.4,0,.2,1)}.eva-playback-speed-button .dropdown-arrow svg{width:100%;height:100%}.eva-playback-speed-button .dropdown-arrow.rotated{transform:rotate(180deg)}.eva-playback-speed-dropdown{position:absolute;bottom:100%;left:50%;transform:translate(-50%) translateY(-12px);margin-bottom:4px;z-index:1000;opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--eva-transition-duration) cubic-bezier(.4,0,.2,1),visibility var(--eva-transition-duration) cubic-bezier(.4,0,.2,1),transform var(--eva-transition-duration) cubic-bezier(.4,0,.2,1);transform:translate(-50%) translateY(0) scale(.95);transform-origin:bottom center}.eva-playback-speed-dropdown.show{opacity:1;visibility:visible;pointer-events:auto;transform:translate(-50%) translateY(calc(-12px - var(--eva-scrub-bar-heights))) scale(1)}@media(max-width:768px){.eva-playback-speed-dropdown{left:auto;right:0;transform:translateY(-8px)}.eva-playback-speed-dropdown.show{transform:translateY(-8px) scale(1)}}:host-context(.controls-left) .eva-playback-speed-dropdown{left:0;transform:translateY(-8px)}:host-context(.controls-left) .eva-playback-speed-dropdown.show{transform:translateY(-8px) scale(1)}:host-context(.controls-right) .eva-playback-speed-dropdown{left:auto;right:0;transform:translateY(-8px)}:host-context(.controls-right) .eva-playback-speed-dropdown.show{transform:translateY(-8px) scale(1)}.dropdown-content{background:var(--eva-playback-speed-dropdown-content-background);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);border-radius:8px;box-shadow:var(--eva-playback-speed-dropdown-content-box-shadow);overflow:hidden;min-width:180px;animation:slideIn var(--eva-transition-duration) cubic-bezier(.4,0,.2,1)}@media(max-width:768px){.dropdown-content{min-width:150px}}@keyframes slideIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.dropdown-header{padding:10px 14px 8px;font-family:var(--eva-font-family);font-size:var(--eva-playback-speed-dropdown-content-header-font-size);font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--eva-playback-speed-dropdown-content-header-font-color);border-bottom:var(--eva-playback-speed-dropdown-content-header-bottom-border)}.speed-options{padding:4px;max-height:280px;overflow-y:auto}.speed-options::-webkit-scrollbar{width:6px}.speed-options::-webkit-scrollbar-track{background:#ffffff0d;border-radius:3px}.speed-options::-webkit-scrollbar-thumb{background:#fff3;border-radius:3px}.speed-options::-webkit-scrollbar-thumb:hover{background:#ffffff4d}.speed-option{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px 14px;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color var(--eva-transition-durations) ease,transform var(--eva-transition-duration) ease;outline:none}.speed-option:hover{background-color:var(--eva-playback-speed-dropdown-content-speed-option-bacground-hover)}.speed-option:active{transform:scale(.98)}.speed-option:focus-visible{outline:2px solid rgba(255,255,255,.5);outline-offset:-2px}.speed-option.active{background-color:var(--eva-playback-speed-dropdown-content-speed-option-icon-active)}.speed-option .speed-text{font-family:var(--eva-font-family);font-size:var(--eva-playback-speed-dropdown-content-speed-option-font-size);font-weight:500;color:var(--eva-playback-speed-dropdown-content-speed-option-font-color);transition:color var(--eva-transition-duration) ease}.speed-option .checkmark{display:flex;align-items:center;width:var(--eva-playback-speed-dropdown-content-speed-option-checkmark-size);height:var(--eva-playback-speed-dropdown-content-speed-option-checkmark-size);color:var(--eva-playback-speed-dropdown-content-speed-option-checkmark-color);animation:checkmarkAppear var(--eva-transition-duration) cubic-bezier(.4,0,.2,1)}.speed-option .checkmark svg{width:100%;height:100%}@keyframes checkmarkAppear{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3040
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaPlaybackSpeed, deps: [], target: i0.ɵɵFactoryTarget.Component });
3041
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: EvaPlaybackSpeed, isStandalone: true, selector: "eva-playback-speed", inputs: { evaPlaybackSpeeds: { classPropertyName: "evaPlaybackSpeeds", publicName: "evaPlaybackSpeeds", isSignal: true, isRequired: true, transformFunction: null }, evaDefaultPlaybackSpeed: { classPropertyName: "evaDefaultPlaybackSpeed", publicName: "evaDefaultPlaybackSpeed", isSignal: true, isRequired: false, transformFunction: null }, evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "playbackClicked()", "keydown": "playbackClickedKeyboard($event)", "blur": "handleBlur($event)" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-valuetext": "currentSpeed() + 'x'", "class.open": "isOpen()" } }, ngImport: i0, template: "<div class=\"eva-playback-speed-container\">\n\t<!-- Current Speed Display Button -->\n\t<div class=\"eva-playback-speed-button\">\n\t\t<span class=\"speed-icon\">\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n\t\t\t\tstroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t<path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n\t\t\t</svg>\n\t\t</span>\n\t\t<span class=\"speed-label\">{{ formatSpeed(currentSpeed()) }}</span>\n\t\t<span class=\"dropdown-arrow\" [class.rotated]=\"isOpen()\">\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n\t\t\t\tstroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t<polyline points=\"6 9 12 15 18 9\"></polyline>\n\t\t\t</svg>\n\t\t</span>\n\t</div>\n\n\t<!-- Dropdown Menu -->\n\t<div class=\"eva-playback-speed-dropdown\" [class.show]=\"isOpen()\">\n\t\t<div class=\"dropdown-content\">\n\t\t\t<div class=\"dropdown-header\">{{evaAria().ariaLabel}}</div>\n\t\t\t<div class=\"speed-options\">\n\t\t\t\t@for (speed of evaPlaybackSpeeds(); track speed) {\n\t\t\t\t<button type=\"button\" class=\"speed-option\" [class.active]=\"speed === currentSpeed()\"\n\t\t\t\t\t(click)=\"selectSpeed(speed, $index)\" [attr.aria-selected]=\"speed === currentSpeed()\" role=\"option\">\n\t\t\t\t\t<span class=\"speed-text\">{{ formatSpeed(speed) }}</span>\n\t\t\t\t\t@if (speed === currentSpeed()) {\n\t\t\t\t\t<span class=\"checkmark\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t\t\t<polyline points=\"20 6 9 17 4 12\"></polyline>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>", styles: [":host{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;height:var(--eva-control-element-height);width:80px;cursor:pointer;color:#fff;position:relative;outline:none}:host:focus-visible{outline:2px solid rgba(255,255,255,.8);outline-offset:2px;border-radius:4px}:host:hover{background-color:var(--eva-playback-speed-hover-background);border-radius:4px}:host.open{background-color:var(--eva-playback-speed-opened-background);border-radius:4px}.eva-playback-speed-container{position:relative;display:flex;align-items:center;justify-content:center}.eva-playback-speed-button{display:flex;align-items:center;justify-content:center;width:100%;height:100%;gap:2px}.eva-playback-speed-button .speed-icon{display:none}.eva-playback-speed-button .speed-label{font-family:var(--eva-font-family);font-size:var(--eva-playback-speed-label-font-size);color:var(--eva-playback-speed-label-color);white-space:nowrap;line-height:1}.eva-playback-speed-button .dropdown-arrow{display:flex;align-items:center;width:var(--eva-playback-speed-dropdown-arrow-size);height:var(--eva-playback-speed-dropdown-arrow-size);color:var(--eva-playback-speed-dropdown-arrow-color);transition:transform var(--eva-transition-duration) cubic-bezier(.4,0,.2,1)}.eva-playback-speed-button .dropdown-arrow svg{width:100%;height:100%}.eva-playback-speed-button .dropdown-arrow.rotated{transform:rotate(180deg)}.eva-playback-speed-dropdown{position:absolute;bottom:100%;left:50%;transform:translate(-50%) translateY(-12px);margin-bottom:4px;z-index:1000;opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--eva-transition-duration) cubic-bezier(.4,0,.2,1),visibility var(--eva-transition-duration) cubic-bezier(.4,0,.2,1),transform var(--eva-transition-duration) cubic-bezier(.4,0,.2,1);transform:translate(-50%) translateY(0) scale(.95);transform-origin:bottom center}.eva-playback-speed-dropdown.show{opacity:1;visibility:visible;pointer-events:auto;transform:translate(-50%) translateY(calc(-12px - var(--eva-scrub-bar-heights))) scale(1)}@media(max-width:768px){.eva-playback-speed-dropdown{left:auto;right:0;transform:translateY(-8px)}.eva-playback-speed-dropdown.show{transform:translateY(-8px) scale(1)}}:host-context(.controls-left) .eva-playback-speed-dropdown{left:0;transform:translateY(-8px)}:host-context(.controls-left) .eva-playback-speed-dropdown.show{transform:translateY(-8px) scale(1)}:host-context(.controls-right) .eva-playback-speed-dropdown{left:auto;right:0;transform:translateY(-8px)}:host-context(.controls-right) .eva-playback-speed-dropdown.show{transform:translateY(-8px) scale(1)}.dropdown-content{background:var(--eva-playback-speed-dropdown-content-background);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);border-radius:8px;box-shadow:var(--eva-playback-speed-dropdown-content-box-shadow);overflow:hidden;min-width:180px;animation:slideIn var(--eva-transition-duration) cubic-bezier(.4,0,.2,1)}@media(max-width:768px){.dropdown-content{min-width:150px}}@keyframes slideIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.dropdown-header{padding:10px 14px 8px;font-family:var(--eva-font-family);font-size:var(--eva-playback-speed-dropdown-content-header-font-size);font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--eva-playback-speed-dropdown-content-header-font-color);border-bottom:var(--eva-playback-speed-dropdown-content-header-bottom-border)}.speed-options{padding:4px;max-height:280px;overflow-y:auto}.speed-options::-webkit-scrollbar{width:6px}.speed-options::-webkit-scrollbar-track{background:#ffffff0d;border-radius:3px}.speed-options::-webkit-scrollbar-thumb{background:#fff3;border-radius:3px}.speed-options::-webkit-scrollbar-thumb:hover{background:#ffffff4d}.speed-option{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px 14px;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color var(--eva-transition-durations) ease,transform var(--eva-transition-duration) ease;outline:none}.speed-option:hover{background-color:var(--eva-playback-speed-dropdown-content-speed-option-bacground-hover)}.speed-option:active{transform:scale(.98)}.speed-option:focus-visible{outline:2px solid rgba(255,255,255,.5);outline-offset:-2px}.speed-option.active{background-color:var(--eva-playback-speed-dropdown-content-speed-option-icon-active)}.speed-option .speed-text{font-family:var(--eva-font-family);font-size:var(--eva-playback-speed-dropdown-content-speed-option-font-size);font-weight:500;color:var(--eva-playback-speed-dropdown-content-speed-option-font-color);transition:color var(--eva-transition-duration) ease}.speed-option .checkmark{display:flex;align-items:center;width:var(--eva-playback-speed-dropdown-content-speed-option-checkmark-size);height:var(--eva-playback-speed-dropdown-content-speed-option-checkmark-size);color:var(--eva-playback-speed-dropdown-content-speed-option-checkmark-color);animation:checkmarkAppear var(--eva-transition-duration) cubic-bezier(.4,0,.2,1)}.speed-option .checkmark svg{width:100%;height:100%}@keyframes checkmarkAppear{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2992
3042
  }
2993
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaPlaybackSpeed, decorators: [{
3043
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaPlaybackSpeed, decorators: [{
2994
3044
  type: Component,
2995
3045
  args: [{ selector: 'eva-playback-speed', changeDetection: ChangeDetectionStrategy.OnPush, host: {
2996
3046
  "tabindex": "0",
@@ -3214,10 +3264,10 @@ class EvaQualitySelector {
3214
3264
  this.evaAPI.controlsSelectorComponentActive.next(false);
3215
3265
  }
3216
3266
  }
3217
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaQualitySelector, deps: [], target: i0.ɵɵFactoryTarget.Component });
3218
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: EvaQualitySelector, isStandalone: true, selector: "eva-quality-selector", inputs: { evaQualitySelectorText: { classPropertyName: "evaQualitySelectorText", publicName: "evaQualitySelectorText", isSignal: true, isRequired: false, transformFunction: null }, evaQualityAutoText: { classPropertyName: "evaQualityAutoText", publicName: "evaQualityAutoText", isSignal: true, isRequired: false, transformFunction: null }, evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "onClicked()", "keydown": "onKeyDown($event)", "blur": "onBlur($event)" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-valuetext": "currentQuality()?.label ?? evaQualityAutoText()", "class.open": "isOpen()" } }, ngImport: i0, template: "<div class=\"eva-quality-selector-container\">\n\t<!-- Current Quality Display Button -->\n\t<div class=\"eva-quality-selector-button\">\n\t\t<span class=\"speed-icon\">\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n\t\t\t\tstroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t<path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n\t\t\t</svg>\n\t\t</span>\n\t\t<span class=\"speed-label\">\n\t\t\t{{ currentQuality() ? formatQuality(currentQuality()!) : evaQualityAutoText() }}\n\t\t</span>\n\t\t<span class=\"dropdown-arrow\" [class.rotated]=\"isOpen()\">\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n\t\t\t\tstroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t<polyline points=\"6 9 12 15 18 9\"></polyline>\n\t\t\t</svg>\n\t\t</span>\n\t</div>\n\n\t<!-- Dropdown Menu -->\n\t<div class=\"eva-quality-selector-dropdown\" [class.show]=\"isOpen()\">\n\t\t<div class=\"dropdown-content\">\n\t\t\t<div class=\"dropdown-header\">{{ evaQualitySelectorText() }}</div>\n\t\t\t<div class=\"quality-options\">\n\t\t\t\t@for (quality of qualities(); track quality.qualityIndex) {\n\t\t\t\t<button type=\"button\" class=\"quality-option\"\n\t\t\t\t\t[class.active]=\"quality.qualityIndex === currentQuality()?.qualityIndex\"\n\t\t\t\t\t(click)=\"selectQuality(quality, $index)\"\n\t\t\t\t\t[attr.aria-selected]=\"quality.qualityIndex === currentQuality()?.qualityIndex\" role=\"option\">\n\t\t\t\t\t<span class=\"speed-text\">{{ formatQuality(quality) }}</span>\n\t\t\t\t\t@if (quality.qualityIndex === currentQuality()?.qualityIndex) {\n\t\t\t\t\t<span class=\"checkmark\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t\t\t<polyline points=\"20 6 9 17 4 12\"></polyline>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>", styles: [":host{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;height:var(--eva-control-element-height);width:80px;cursor:pointer;color:#fff;position:relative;outline:none}:host:focus-visible{outline:2px solid rgba(255,255,255,.8);outline-offset:2px;border-radius:4px}:host:hover{background-color:var(--eva-quality-selector-hover-background);border-radius:4px}:host.open{background-color:var(--eva-quality-selector-opened-background);border-radius:4px}.eva-quality-selector-container{position:relative;display:flex;align-items:center;justify-content:center}.eva-quality-selector-button{display:flex;align-items:center;justify-content:center;width:100%;height:100%;gap:2px}.eva-quality-selector-button .speed-icon{display:none}.eva-quality-selector-button .speed-label{font-family:var(--eva-font-family);font-size:var(--eva-quality-selector-label-font-size);color:var(--eva-quality-selector-label-color);white-space:nowrap;line-height:1}.eva-quality-selector-button .dropdown-arrow{display:flex;align-items:center;width:var(--eva-quality-selector-dropdown-arrow-size);height:var(--eva-quality-selector-dropdown-arrow-size);color:var(--eva-quality-selector-dropdown-arrow-color);transition:transform var(--eva-transition-duration) cubic-bezier(.4,0,.2,1)}.eva-quality-selector-button .dropdown-arrow svg{width:100%;height:100%}.eva-quality-selector-button .dropdown-arrow.rotated{transform:rotate(180deg)}.eva-quality-selector-dropdown{position:absolute;bottom:100%;left:50%;transform:translate(-50%) translateY(-12px);margin-bottom:4px;z-index:1000;opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--eva-transition-duration) cubic-bezier(.4,0,.2,1),visibility var(--eva-transition-duration) cubic-bezier(.4,0,.2,1),transform var(--eva-transition-duration) cubic-bezier(.4,0,.2,1);transform:translate(-50%) translateY(0) scale(.95);transform-origin:bottom center}.eva-quality-selector-dropdown.show{opacity:1;visibility:visible;pointer-events:auto;transform:translate(-50%) translateY(calc(-12px - var(--eva-scrub-bar-heights))) scale(1)}@media(max-width:768px){.eva-quality-selector-dropdown{left:auto;right:0;transform:translateY(-8px)}.eva-quality-selector-dropdown.show{transform:translateY(-8px) scale(1)}}:host-context(.controls-left) .eva-quality-selector-dropdown{left:0;transform:translateY(-8px)}:host-context(.controls-left) .eva-quality-selector-dropdown.show{transform:translateY(-8px) scale(1)}:host-context(.controls-right) .eva-quality-selector-dropdown{left:auto;right:0;transform:translateY(-8px)}:host-context(.controls-right) .eva-quality-selector-dropdown.show{transform:translateY(-8px) scale(1)}.dropdown-content{background:var(--eva-quality-selector-dropdown-content-background);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);border-radius:8px;box-shadow:var(--eva-quality-selector-dropdown-content-box-shadow);overflow:hidden;min-width:180px;animation:slideIn var(--eva-transition-duration) cubic-bezier(.4,0,.2,1)}@media(max-width:768px){.dropdown-content{min-width:150px}}@keyframes slideIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.dropdown-header{padding:10px 14px 8px;font-family:var(--eva-font-family);font-size:var(--eva-quality-selector-dropdown-content-header-font-size);font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--eva-quality-selector-dropdown-content-header-font-color);border-bottom:var(--eva-quality-selector-dropdown-content-header-bottom-border)}.quality-options{padding:4px;max-height:280px;overflow-y:auto}.quality-options::-webkit-scrollbar{width:6px}.quality-options::-webkit-scrollbar-track{background:#ffffff0d;border-radius:3px}.quality-options::-webkit-scrollbar-thumb{background:#fff3;border-radius:3px}.quality-options::-webkit-scrollbar-thumb:hover{background:#ffffff4d}.quality-option{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px 14px;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color var(--eva-transition-durations) ease,transform var(--eva-transition-duration) ease;outline:none}.quality-option:hover{background-color:var(--eva-quality-selector-dropdown-content-quality-option-bacground-hover)}.quality-option:active{transform:scale(.98)}.quality-option:focus-visible{outline:2px solid rgba(255,255,255,.5);outline-offset:-2px}.quality-option.active{background-color:var(--eva-quality-selector-dropdown-content-quality-option-icon-active)}.quality-option .speed-text{font-family:var(--eva-font-family);font-size:var(--eva-quality-selector-dropdown-content-quality-option-font-size);font-weight:500;color:var(--eva-quality-selector-dropdown-content-quality-option-font-color);transition:color var(--eva-transition-duration) ease}.quality-option .checkmark{display:flex;align-items:center;width:var(--eva-quality-selector-dropdown-content-quality-option-checkmark-size);height:var(--eva-quality-selector-dropdown-content-quality-option-checkmark-size);color:var(--eva-quality-selector-dropdown-content-quality-option-checkmark-color);animation:checkmarkAppear var(--eva-transition-duration) cubic-bezier(.4,0,.2,1)}.quality-option .checkmark svg{width:100%;height:100%}@keyframes checkmarkAppear{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3267
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaQualitySelector, deps: [], target: i0.ɵɵFactoryTarget.Component });
3268
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: EvaQualitySelector, isStandalone: true, selector: "eva-quality-selector", inputs: { evaQualitySelectorText: { classPropertyName: "evaQualitySelectorText", publicName: "evaQualitySelectorText", isSignal: true, isRequired: false, transformFunction: null }, evaQualityAutoText: { classPropertyName: "evaQualityAutoText", publicName: "evaQualityAutoText", isSignal: true, isRequired: false, transformFunction: null }, evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "button" }, listeners: { "click": "onClicked()", "keydown": "onKeyDown($event)", "blur": "onBlur($event)" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-valuetext": "currentQuality()?.label ?? evaQualityAutoText()", "class.open": "isOpen()" } }, ngImport: i0, template: "<div class=\"eva-quality-selector-container\">\n\t<!-- Current Quality Display Button -->\n\t<div class=\"eva-quality-selector-button\">\n\t\t<span class=\"speed-icon\">\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n\t\t\t\tstroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t<path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n\t\t\t</svg>\n\t\t</span>\n\t\t<span class=\"speed-label\">\n\t\t\t{{ currentQuality() ? formatQuality(currentQuality()!) : evaQualityAutoText() }}\n\t\t</span>\n\t\t<span class=\"dropdown-arrow\" [class.rotated]=\"isOpen()\">\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n\t\t\t\tstroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t<polyline points=\"6 9 12 15 18 9\"></polyline>\n\t\t\t</svg>\n\t\t</span>\n\t</div>\n\n\t<!-- Dropdown Menu -->\n\t<div class=\"eva-quality-selector-dropdown\" [class.show]=\"isOpen()\">\n\t\t<div class=\"dropdown-content\">\n\t\t\t<div class=\"dropdown-header\">{{ evaQualitySelectorText() }}</div>\n\t\t\t<div class=\"quality-options\">\n\t\t\t\t@for (quality of qualities(); track quality.qualityIndex) {\n\t\t\t\t<button type=\"button\" class=\"quality-option\"\n\t\t\t\t\t[class.active]=\"quality.qualityIndex === currentQuality()?.qualityIndex\"\n\t\t\t\t\t(click)=\"selectQuality(quality, $index)\"\n\t\t\t\t\t[attr.aria-selected]=\"quality.qualityIndex === currentQuality()?.qualityIndex\" role=\"option\">\n\t\t\t\t\t<span class=\"speed-text\">{{ formatQuality(quality) }}</span>\n\t\t\t\t\t@if (quality.qualityIndex === currentQuality()?.qualityIndex) {\n\t\t\t\t\t<span class=\"checkmark\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t\t\t<polyline points=\"20 6 9 17 4 12\"></polyline>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>", styles: [":host{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;height:var(--eva-control-element-height);width:80px;cursor:pointer;color:#fff;position:relative;outline:none}:host:focus-visible{outline:2px solid rgba(255,255,255,.8);outline-offset:2px;border-radius:4px}:host:hover{background-color:var(--eva-quality-selector-hover-background);border-radius:4px}:host.open{background-color:var(--eva-quality-selector-opened-background);border-radius:4px}.eva-quality-selector-container{position:relative;display:flex;align-items:center;justify-content:center}.eva-quality-selector-button{display:flex;align-items:center;justify-content:center;width:100%;height:100%;gap:2px}.eva-quality-selector-button .speed-icon{display:none}.eva-quality-selector-button .speed-label{font-family:var(--eva-font-family);font-size:var(--eva-quality-selector-label-font-size);color:var(--eva-quality-selector-label-color);white-space:nowrap;line-height:1}.eva-quality-selector-button .dropdown-arrow{display:flex;align-items:center;width:var(--eva-quality-selector-dropdown-arrow-size);height:var(--eva-quality-selector-dropdown-arrow-size);color:var(--eva-quality-selector-dropdown-arrow-color);transition:transform var(--eva-transition-duration) cubic-bezier(.4,0,.2,1)}.eva-quality-selector-button .dropdown-arrow svg{width:100%;height:100%}.eva-quality-selector-button .dropdown-arrow.rotated{transform:rotate(180deg)}.eva-quality-selector-dropdown{position:absolute;bottom:100%;left:50%;transform:translate(-50%) translateY(-12px);margin-bottom:4px;z-index:1000;opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--eva-transition-duration) cubic-bezier(.4,0,.2,1),visibility var(--eva-transition-duration) cubic-bezier(.4,0,.2,1),transform var(--eva-transition-duration) cubic-bezier(.4,0,.2,1);transform:translate(-50%) translateY(0) scale(.95);transform-origin:bottom center}.eva-quality-selector-dropdown.show{opacity:1;visibility:visible;pointer-events:auto;transform:translate(-50%) translateY(calc(-12px - var(--eva-scrub-bar-heights))) scale(1)}@media(max-width:768px){.eva-quality-selector-dropdown{left:auto;right:0;transform:translateY(-8px)}.eva-quality-selector-dropdown.show{transform:translateY(-8px) scale(1)}}:host-context(.controls-left) .eva-quality-selector-dropdown{left:0;transform:translateY(-8px)}:host-context(.controls-left) .eva-quality-selector-dropdown.show{transform:translateY(-8px) scale(1)}:host-context(.controls-right) .eva-quality-selector-dropdown{left:auto;right:0;transform:translateY(-8px)}:host-context(.controls-right) .eva-quality-selector-dropdown.show{transform:translateY(-8px) scale(1)}.dropdown-content{background:var(--eva-quality-selector-dropdown-content-background);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);border-radius:8px;box-shadow:var(--eva-quality-selector-dropdown-content-box-shadow);overflow:hidden;min-width:180px;animation:slideIn var(--eva-transition-duration) cubic-bezier(.4,0,.2,1)}@media(max-width:768px){.dropdown-content{min-width:150px}}@keyframes slideIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.dropdown-header{padding:10px 14px 8px;font-family:var(--eva-font-family);font-size:var(--eva-quality-selector-dropdown-content-header-font-size);font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--eva-quality-selector-dropdown-content-header-font-color);border-bottom:var(--eva-quality-selector-dropdown-content-header-bottom-border)}.quality-options{padding:4px;max-height:280px;overflow-y:auto}.quality-options::-webkit-scrollbar{width:6px}.quality-options::-webkit-scrollbar-track{background:#ffffff0d;border-radius:3px}.quality-options::-webkit-scrollbar-thumb{background:#fff3;border-radius:3px}.quality-options::-webkit-scrollbar-thumb:hover{background:#ffffff4d}.quality-option{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px 14px;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color var(--eva-transition-durations) ease,transform var(--eva-transition-duration) ease;outline:none}.quality-option:hover{background-color:var(--eva-quality-selector-dropdown-content-quality-option-bacground-hover)}.quality-option:active{transform:scale(.98)}.quality-option:focus-visible{outline:2px solid rgba(255,255,255,.5);outline-offset:-2px}.quality-option.active{background-color:var(--eva-quality-selector-dropdown-content-quality-option-icon-active)}.quality-option .speed-text{font-family:var(--eva-font-family);font-size:var(--eva-quality-selector-dropdown-content-quality-option-font-size);font-weight:500;color:var(--eva-quality-selector-dropdown-content-quality-option-font-color);transition:color var(--eva-transition-duration) ease}.quality-option .checkmark{display:flex;align-items:center;width:var(--eva-quality-selector-dropdown-content-quality-option-checkmark-size);height:var(--eva-quality-selector-dropdown-content-quality-option-checkmark-size);color:var(--eva-quality-selector-dropdown-content-quality-option-checkmark-color);animation:checkmarkAppear var(--eva-transition-duration) cubic-bezier(.4,0,.2,1)}.quality-option .checkmark svg{width:100%;height:100%}@keyframes checkmarkAppear{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3219
3269
  }
3220
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaQualitySelector, decorators: [{
3270
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaQualitySelector, decorators: [{
3221
3271
  type: Component,
3222
3272
  args: [{ selector: 'eva-quality-selector', changeDetection: ChangeDetectionStrategy.OnPush, host: {
3223
3273
  'tabindex': '0',
@@ -3333,10 +3383,10 @@ class EvaScrubBarBufferingTime {
3333
3383
  }
3334
3384
  this.bufferedPercentage.set(bufferTime);
3335
3385
  }
3336
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaScrubBarBufferingTime, deps: [], target: i0.ɵɵFactoryTarget.Component });
3337
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.0", type: EvaScrubBarBufferingTime, isStandalone: true, selector: "eva-scrub-bar-buffering-time", ngImport: i0, template: "<div class=\"buffer-container\" [style.width]=\"bufferedPercentage()\">\n</div>", styles: [":host{display:flex;width:100%;height:var(--eva-scrub-bar-heights);pointer-events:none;position:absolute;left:0;top:0;border-radius:2px}div.buffer-container{height:var(--eva-scrub-bar-heights);background-color:var(--eva-scrub-bar-buffering-background)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3386
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaScrubBarBufferingTime, deps: [], target: i0.ɵɵFactoryTarget.Component });
3387
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.2", type: EvaScrubBarBufferingTime, isStandalone: true, selector: "eva-scrub-bar-buffering-time", ngImport: i0, template: "<div class=\"buffer-container\" [style.width]=\"bufferedPercentage()\">\n</div>", styles: [":host{display:flex;width:100%;height:var(--eva-scrub-bar-heights);pointer-events:none;position:absolute;left:0;top:0;border-radius:2px}div.buffer-container{height:var(--eva-scrub-bar-heights);background-color:var(--eva-scrub-bar-buffering-background)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3338
3388
  }
3339
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaScrubBarBufferingTime, decorators: [{
3389
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaScrubBarBufferingTime, decorators: [{
3340
3390
  type: Component,
3341
3391
  args: [{ selector: 'eva-scrub-bar-buffering-time', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"buffer-container\" [style.width]=\"bufferedPercentage()\">\n</div>", styles: [":host{display:flex;width:100%;height:var(--eva-scrub-bar-heights);pointer-events:none;position:absolute;left:0;top:0;border-radius:2px}div.buffer-container{height:var(--eva-scrub-bar-heights);background-color:var(--eva-scrub-bar-buffering-background)}\n"] }]
3342
3392
  }] });
@@ -3378,10 +3428,10 @@ class EvaScrubBarCurrentTime {
3378
3428
  return Math.round(time.current * 100) / time.total + "%";
3379
3429
  }, /* @ts-ignore */
3380
3430
  ...(ngDevMode ? [{ debugName: "currentTimePercentage" }] : /* istanbul ignore next */ []));
3381
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaScrubBarCurrentTime, deps: [], target: i0.ɵɵFactoryTarget.Component });
3382
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.0", type: EvaScrubBarCurrentTime, isStandalone: true, selector: "eva-scrub-bar-current-time", ngImport: i0, template: "<div class=\"current-time-container\" [style.width]=\"currentTimePercentage()\">\n</div>", styles: [":host{display:flex;width:100%;height:var(--eva-scrub-bar-heights);pointer-events:none;position:absolute;left:0;top:0;border-radius:2px}div.current-time-container{height:var(--eva-scrub-bar-heights);background-color:var(--eva-scrub-bar-current-time-background)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3431
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaScrubBarCurrentTime, deps: [], target: i0.ɵɵFactoryTarget.Component });
3432
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.2", type: EvaScrubBarCurrentTime, isStandalone: true, selector: "eva-scrub-bar-current-time", ngImport: i0, template: "<div class=\"current-time-container\" [style.width]=\"currentTimePercentage()\">\n</div>", styles: [":host{display:flex;width:100%;height:var(--eva-scrub-bar-heights);pointer-events:none;position:absolute;left:0;top:0;border-radius:2px}div.current-time-container{height:var(--eva-scrub-bar-heights);background-color:var(--eva-scrub-bar-current-time-background)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3383
3433
  }
3384
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaScrubBarCurrentTime, decorators: [{
3434
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaScrubBarCurrentTime, decorators: [{
3385
3435
  type: Component,
3386
3436
  args: [{ selector: 'eva-scrub-bar-current-time', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"current-time-container\" [style.width]=\"currentTimePercentage()\">\n</div>", styles: [":host{display:flex;width:100%;height:var(--eva-scrub-bar-heights);pointer-events:none;position:absolute;left:0;top:0;border-radius:2px}div.current-time-container{height:var(--eva-scrub-bar-heights);background-color:var(--eva-scrub-bar-current-time-background)}\n"] }]
3387
3437
  }] });
@@ -3997,10 +4047,10 @@ class EvaScrubBar {
3997
4047
  this.hideControls.set(true);
3998
4048
  }, this.evaAutohideTime());
3999
4049
  }
4000
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaScrubBar, deps: [], target: i0.ɵɵFactoryTarget.Component });
4001
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: EvaScrubBar, isStandalone: true, selector: "eva-scrub-bar", inputs: { evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null }, hideWithControlsContainer: { classPropertyName: "hideWithControlsContainer", publicName: "hideWithControlsContainer", isSignal: true, isRequired: false, transformFunction: null }, evaSlidingEnabled: { classPropertyName: "evaSlidingEnabled", publicName: "evaSlidingEnabled", isSignal: true, isRequired: false, transformFunction: null }, evaAutohideTime: { classPropertyName: "evaAutohideTime", publicName: "evaAutohideTime", isSignal: true, isRequired: false, transformFunction: null }, evaShowTimeOnHover: { classPropertyName: "evaShowTimeOnHover", publicName: "evaShowTimeOnHover", isSignal: true, isRequired: false, transformFunction: null }, evaTimeFormat: { classPropertyName: "evaTimeFormat", publicName: "evaTimeFormat", isSignal: true, isRequired: false, transformFunction: null }, evaShowChapters: { classPropertyName: "evaShowChapters", publicName: "evaShowChapters", isSignal: true, isRequired: false, transformFunction: null }, evaChapters: { classPropertyName: "evaChapters", publicName: "evaChapters", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "slider", "aria-valuemin": "0", "aria-valuemax": "100" }, listeners: { "mousedown": "mouseDownScrub($event)", "document:mouseup": "mouseUpScrubBar($event)", "touchstart": "touchStartScrub($event)", "document:touchcancel": "touchCancelScrub($event)", "document:touchend": "touchEndScrub($event)", "keydown": "arrowAdjustTime($event)" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-valuenow": "getPercentage()", "attr.aria-valuetext": "getPercentage()", "class.hide": "hideControls()" } }, ngImport: i0, template: "<ng-content></ng-content>\n\n@if (evaShowChapters() && chapters().length > 0) {\n<div class=\"eva-chapter-markers\">\n\t@for (chapter of chapters(); track chapter.startTime) {\n\t<div class=\"eva-chapter-marker\" [style.left]=\"getChapterLeftPercent(chapter)\"\n\t\t[style.width]=\"getChapterWidthPercent(chapter)\">\n\t</div>\n\t}\n</div>\n}\n\n@if (hoverTime() !== null) {\n<div class=\"eva-hover-tooltip\" [style.left.px]=\"hoverLeft()\">\n\t<span class=\"eva-hover-time\">{{ hoverTime() }} @if(hoverChapter()) { {{hoverChapter()}}}</span>\n</div>\n}", styles: [":host{user-select:none;position:absolute;width:100%;height:var(--eva-scrub-bar-heights);bottom:var(--eva-control-element-height);margin:0;cursor:pointer;display:flex;align-items:center;background:var(--eva-scrub-bar-background);z-index:303;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;transition:bottom var(--eva-transition-duration) ease-in-out,opacity var(--eva-transition-duration) ease-in-out}:host-context(eva-controls-container){position:relative;bottom:0;background:var(--eva-scrub-bar-background);height:var(--eva-scrub-bar-heights);flex-grow:1;flex-basis:0;margin:0 10px;-webkit-transition:initial;-khtml-transition:initial;-moz-transition:initial;-ms-transition:initial;transition:initial}:host(.hide){bottom:0!important;opacity:1}.eva-chapter-markers{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.eva-chapter-marker{position:absolute;top:0;height:100%;border-right:var(--eva-scrub-bar-chapter-marker-width) solid var(--eva-scrub-bar-chapter-marker-color);box-sizing:border-box}.eva-chapter-marker:last-child{border-right:none}.eva-hover-tooltip{position:absolute;bottom:calc(100% + 8px);transform:translate(-50%);display:flex;flex-direction:column;align-items:center;gap:2px;pointer-events:none;z-index:400;will-change:left}.eva-hover-chapter{background-color:var(--eva-scrub-bar-chapter-hover-background-color);color:var(--eva-scrub-bar-chapter-hover-text-color);padding:3px 8px;border-radius:4px;font-size:var(--eva-scrub-bar-chapter-hover-font-size);white-space:nowrap;text-align:center;max-width:160px;overflow:hidden;text-overflow:ellipsis}.eva-hover-time{background-color:var(--eva-scrub-bar-chapter-hover-tooltip-background-color);color:var(--eva-scrub-bar-chapter-hover-tooltip-text-color);padding:4px 8px;border-radius:4px;font-size:var(--eva-scrub-bar-chapter-hover-tooltip-font-size);font-family:var(--eva-font-family);white-space:nowrap;text-align:center}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4050
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaScrubBar, deps: [], target: i0.ɵɵFactoryTarget.Component });
4051
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: EvaScrubBar, isStandalone: true, selector: "eva-scrub-bar", inputs: { evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null }, hideWithControlsContainer: { classPropertyName: "hideWithControlsContainer", publicName: "hideWithControlsContainer", isSignal: true, isRequired: false, transformFunction: null }, evaSlidingEnabled: { classPropertyName: "evaSlidingEnabled", publicName: "evaSlidingEnabled", isSignal: true, isRequired: false, transformFunction: null }, evaAutohideTime: { classPropertyName: "evaAutohideTime", publicName: "evaAutohideTime", isSignal: true, isRequired: false, transformFunction: null }, evaShowTimeOnHover: { classPropertyName: "evaShowTimeOnHover", publicName: "evaShowTimeOnHover", isSignal: true, isRequired: false, transformFunction: null }, evaTimeFormat: { classPropertyName: "evaTimeFormat", publicName: "evaTimeFormat", isSignal: true, isRequired: false, transformFunction: null }, evaShowChapters: { classPropertyName: "evaShowChapters", publicName: "evaShowChapters", isSignal: true, isRequired: false, transformFunction: null }, evaChapters: { classPropertyName: "evaChapters", publicName: "evaChapters", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "slider", "aria-valuemin": "0", "aria-valuemax": "100" }, listeners: { "mousedown": "mouseDownScrub($event)", "document:mouseup": "mouseUpScrubBar($event)", "touchstart": "touchStartScrub($event)", "document:touchcancel": "touchCancelScrub($event)", "document:touchend": "touchEndScrub($event)", "keydown": "arrowAdjustTime($event)" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-valuenow": "getPercentage()", "attr.aria-valuetext": "getPercentage()", "class.hide": "hideControls()" } }, ngImport: i0, template: "<ng-content></ng-content>\n\n@if (evaShowChapters() && chapters().length > 0) {\n<div class=\"eva-chapter-markers\">\n\t@for (chapter of chapters(); track chapter.startTime) {\n\t<div class=\"eva-chapter-marker\" [style.left]=\"getChapterLeftPercent(chapter)\"\n\t\t[style.width]=\"getChapterWidthPercent(chapter)\">\n\t</div>\n\t}\n</div>\n}\n\n@if (hoverTime() !== null) {\n<div class=\"eva-hover-tooltip\" [style.left.px]=\"hoverLeft()\">\n\t<span class=\"eva-hover-time\">{{ hoverTime() }} @if(hoverChapter()) { {{hoverChapter()}}}</span>\n</div>\n}", styles: [":host{user-select:none;position:absolute;width:100%;height:var(--eva-scrub-bar-heights);bottom:var(--eva-control-element-height);margin:0;cursor:pointer;display:flex;align-items:center;background:var(--eva-scrub-bar-background);z-index:303;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;transition:bottom var(--eva-transition-duration) ease-in-out,opacity var(--eva-transition-duration) ease-in-out}:host-context(eva-controls-container){position:relative;bottom:0;background:var(--eva-scrub-bar-background);height:var(--eva-scrub-bar-heights);flex-grow:1;flex-basis:0;margin:0 10px;-webkit-transition:initial;-khtml-transition:initial;-moz-transition:initial;-ms-transition:initial;transition:initial}:host(.hide){bottom:0!important;opacity:1}.eva-chapter-markers{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.eva-chapter-marker{position:absolute;top:0;height:100%;border-right:var(--eva-scrub-bar-chapter-marker-width) solid var(--eva-scrub-bar-chapter-marker-color);box-sizing:border-box}.eva-chapter-marker:last-child{border-right:none}.eva-hover-tooltip{position:absolute;bottom:calc(100% + 8px);transform:translate(-50%);display:flex;flex-direction:column;align-items:center;gap:2px;pointer-events:none;z-index:400;will-change:left}.eva-hover-chapter{background-color:var(--eva-scrub-bar-chapter-hover-background-color);color:var(--eva-scrub-bar-chapter-hover-text-color);padding:3px 8px;border-radius:4px;font-size:var(--eva-scrub-bar-chapter-hover-font-size);white-space:nowrap;text-align:center;max-width:160px;overflow:hidden;text-overflow:ellipsis}.eva-hover-time{background-color:var(--eva-scrub-bar-chapter-hover-tooltip-background-color);color:var(--eva-scrub-bar-chapter-hover-tooltip-text-color);padding:4px 8px;border-radius:4px;font-size:var(--eva-scrub-bar-chapter-hover-tooltip-font-size);font-family:var(--eva-font-family);white-space:nowrap;text-align:center}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4002
4052
  }
4003
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaScrubBar, decorators: [{
4053
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaScrubBar, decorators: [{
4004
4054
  type: Component,
4005
4055
  args: [{ selector: 'eva-scrub-bar', changeDetection: ChangeDetectionStrategy.OnPush, host: {
4006
4056
  "tabindex": "0",
@@ -4097,10 +4147,10 @@ class EvaSubtitleDisplay {
4097
4147
  this.controlsVisibility$?.unsubscribe();
4098
4148
  this.pipWindowActive$?.unsubscribe();
4099
4149
  }
4100
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaSubtitleDisplay, deps: [], target: i0.ɵɵFactoryTarget.Component });
4101
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: EvaSubtitleDisplay, isStandalone: true, selector: "eva-subtitle-display", host: { properties: { "class.eva-subtitle-display--visible": "cue() !== null && !pipWindowActive()", "style.padding-bottom": "controlsCointainerNotVisible() ? '8px' : 'calc(var(--eva-control-element-height) + var(--eva-scrub-bar-heights) + 12px)'" } }, ngImport: i0, template: "@if (cue() && !pipWindowActive()) {\n<span class=\"eva-subtitle-cue\" [innerHTML]=\"cue()\"></span>\n}", styles: [":host{display:none;visibility:hidden;position:absolute;inset-inline:0;bottom:0;pointer-events:none;text-align:center;z-index:10;transition:padding-bottom var(--eva-transition-duration) ease-in-out}:host(.eva-subtitle-display--visible){display:block!important;visibility:visible!important}.eva-subtitle-cue{display:inline-block;font-size:var(--eva-subtitle-font-size);line-height:1.4;font-family:var(--eva-subtitle-font-family);color:var(--eva-subtitle-color, #ffffff);background-color:var(--eva-subtitle-background, rgba(0, 0, 0, .72));padding:var(--eva-subtitle-padding);border-radius:3px;white-space:pre-line}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4150
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaSubtitleDisplay, deps: [], target: i0.ɵɵFactoryTarget.Component });
4151
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: EvaSubtitleDisplay, isStandalone: true, selector: "eva-subtitle-display", host: { properties: { "class.eva-subtitle-display--visible": "cue() !== null && !pipWindowActive()", "style.padding-bottom": "controlsCointainerNotVisible() ? '8px' : 'calc(var(--eva-control-element-height) + var(--eva-scrub-bar-heights) + 12px)'" } }, ngImport: i0, template: "@if (cue() && !pipWindowActive()) {\n<span class=\"eva-subtitle-cue\" [innerHTML]=\"cue()\"></span>\n}", styles: [":host{display:none;visibility:hidden;position:absolute;inset-inline:0;bottom:0;pointer-events:none;text-align:center;z-index:10;transition:padding-bottom var(--eva-transition-duration) ease-in-out}:host(.eva-subtitle-display--visible){display:block!important;visibility:visible!important}.eva-subtitle-cue{display:inline-block;font-size:var(--eva-subtitle-font-size);line-height:1.4;font-family:var(--eva-subtitle-font-family);color:var(--eva-subtitle-color, #ffffff);background-color:var(--eva-subtitle-background, rgba(0, 0, 0, .72));padding:var(--eva-subtitle-padding);border-radius:3px;white-space:pre-line}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4102
4152
  }
4103
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaSubtitleDisplay, decorators: [{
4153
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaSubtitleDisplay, decorators: [{
4104
4154
  type: Component,
4105
4155
  args: [{ selector: "eva-subtitle-display", changeDetection: ChangeDetectionStrategy.OnPush, host: {
4106
4156
  // Suppressed during PiP — the browser renders subtitles natively inside the PiP window
@@ -4247,10 +4297,10 @@ class EvaTimeDisplay {
4247
4297
  return `${minutes}:${secs.toString().padStart(2, '0')}`;
4248
4298
  }
4249
4299
  }
4250
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaTimeDisplay, deps: [], target: i0.ɵɵFactoryTarget.Component });
4251
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: EvaTimeDisplay, isStandalone: true, selector: "eva-time-display", inputs: { evaTimeProperty: { classPropertyName: "evaTimeProperty", publicName: "evaTimeProperty", isSignal: true, isRequired: true, transformFunction: null }, evaTimeFormating: { classPropertyName: "evaTimeFormating", publicName: "evaTimeFormating", isSignal: true, isRequired: true, transformFunction: null }, evaLiveText: { classPropertyName: "evaLiveText", publicName: "evaLiveText", isSignal: true, isRequired: false, transformFunction: null }, evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "timer" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-live": "'off'", "attr.aria-atomic": "'true'", "attr.aria-valuetext": "displayText()" } }, ngImport: i0, template: "@if(evaAPI.isLive()){\n<span>{{evaLiveText()}}</span>\n}\n@else {\n<span>{{evaAPI.time()[evaTimeProperty()] | evaTimeDisplay: evaTimeFormating(): evaTimeProperty()}}</span>\n}", styles: [":host{display:flex;align-items:center;justify-content:center;height:var(--eva-control-element-height);min-width:30px;cursor:pointer;color:var(--eva-time-display-text-color);pointer-events:none;padding:0 6px;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}:host>span{font-family:var(--eva-font-family)}\n"], dependencies: [{ kind: "pipe", type: EvaTimeDisplayPipe, name: "evaTimeDisplay" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4300
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaTimeDisplay, deps: [], target: i0.ɵɵFactoryTarget.Component });
4301
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: EvaTimeDisplay, isStandalone: true, selector: "eva-time-display", inputs: { evaTimeProperty: { classPropertyName: "evaTimeProperty", publicName: "evaTimeProperty", isSignal: true, isRequired: true, transformFunction: null }, evaTimeFormating: { classPropertyName: "evaTimeFormating", publicName: "evaTimeFormating", isSignal: true, isRequired: true, transformFunction: null }, evaLiveText: { classPropertyName: "evaLiveText", publicName: "evaLiveText", isSignal: true, isRequired: false, transformFunction: null }, evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "timer" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-live": "'off'", "attr.aria-atomic": "'true'", "attr.aria-valuetext": "displayText()" } }, ngImport: i0, template: "@if(evaAPI.isLive()){\n<span>{{evaLiveText()}}</span>\n}\n@else {\n<span>{{evaAPI.time()[evaTimeProperty()] | evaTimeDisplay: evaTimeFormating(): evaTimeProperty()}}</span>\n}", styles: [":host{display:flex;align-items:center;justify-content:center;height:var(--eva-control-element-height);min-width:30px;cursor:pointer;color:var(--eva-time-display-text-color);pointer-events:none;padding:0 6px;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}:host>span{font-family:var(--eva-font-family)}\n"], dependencies: [{ kind: "pipe", type: EvaTimeDisplayPipe, name: "evaTimeDisplay" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4252
4302
  }
4253
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaTimeDisplay, decorators: [{
4303
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaTimeDisplay, decorators: [{
4254
4304
  type: Component,
4255
4305
  args: [{ selector: 'eva-time-display', changeDetection: ChangeDetectionStrategy.OnPush, host: {
4256
4306
  "tabindex": "0",
@@ -4602,10 +4652,10 @@ class EvaTrackSelector {
4602
4652
  let t = this.localTracks().find(a => a.selected === true);
4603
4653
  this.evaAPI.subtitlesChanged(t ? t : null);
4604
4654
  }
4605
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaTrackSelector, deps: [], target: i0.ɵɵFactoryTarget.Component });
4606
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: EvaTrackSelector, isStandalone: true, selector: "eva-track-selector", inputs: { evaTrackSelectorText: { classPropertyName: "evaTrackSelectorText", publicName: "evaTrackSelectorText", isSignal: true, isRequired: false, transformFunction: null }, evaTrackOffText: { classPropertyName: "evaTrackOffText", publicName: "evaTrackOffText", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.eva-icon": "true", "class.open": "isOpen()", "attr.aria-label": "evaTrackSelectorText()" } }, ngImport: i0, template: "<div class=\"eva-track-selector-container\">\n\t<!-- Current Track Display Button -->\n\t<button type=\"button\" class=\"eva-track-selector-button\"\n\t\t[attr.aria-label]=\"evaTrackSelectorText() + ': ' + (currentTrack() || evaTrackOffText())\"\n\t\t[attr.aria-expanded]=\"isOpen()\" [attr.aria-haspopup]=\"'listbox'\"\n\t\t[attr.aria-controls]=\"'track-dropdown-' + uniqueId\" (click)=\"trackSelectorClicked()\"\n\t\t(keydown)=\"playbackClickedKeyboard($event)\">\n\t\t<span class=\"speed-icon\" aria-hidden=\"true\">\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n\t\t\t\tstroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t<path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n\t\t\t</svg>\n\t\t</span>\n\t\t<span class=\"speed-label\">{{ currentTrack() || evaTrackOffText() }}</span>\n\t\t<span class=\"dropdown-arrow\" [class.rotated]=\"isOpen()\" aria-hidden=\"true\">\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n\t\t\t\tstroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t<polyline points=\"6 9 12 15 18 9\"></polyline>\n\t\t\t</svg>\n\t\t</span>\n\t</button>\n\n\t<!-- Dropdown Menu -->\n\t<div class=\"eva-track-selector-dropdown\" [class.show]=\"isOpen()\" [attr.id]=\"'track-dropdown-' + uniqueId\"\n\t\trole=\"listbox\" [attr.aria-label]=\"evaTrackSelectorText()\"\n\t\t[attr.aria-activedescendant]=\"isOpen() ? 'track-option-' + uniqueId + '-' + getActiveIndex() : null\">\n\t\t<div class=\"dropdown-content\">\n\t\t\t<div class=\"dropdown-header\" id=\"track-header-{{uniqueId}}\" role=\"presentation\">\n\t\t\t\t{{evaTrackSelectorText()}}\n\t\t\t</div>\n\t\t\t<div class=\"speed-options\" role=\"presentation\">\n\t\t\t\t@for (tr of localTracks(); track tr.id; let i = $index) {\n\t\t\t\t<button type=\"button\" class=\"speed-option\" [class.active]=\"tr.selected\"\n\t\t\t\t\t[attr.id]=\"'track-option-' + uniqueId + '-' + i\" (click)=\"selectTrack(tr, i)\"\n\t\t\t\t\t[attr.aria-selected]=\"tr.selected\" role=\"option\" [attr.tabindex]=\"isOpen() ? 0 : -1\">\n\t\t\t\t\t<span class=\"speed-text\">{{ tr.label }}</span>\n\t\t\t\t\t@if (tr.selected) {\n\t\t\t\t\t<span class=\"checkmark\" aria-hidden=\"true\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t\t\t<polyline points=\"20 6 9 17 4 12\"></polyline>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>", styles: [":host{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;height:var(--eva-control-element-height);width:50px;cursor:pointer;color:#fff;position:relative;outline:none}:host:focus-visible{outline:2px solid rgba(255,255,255,.8);outline-offset:2px;border-radius:4px}:host:hover{background-color:var(--eva-track-selector-hover-background);border-radius:4px}:host.open{background-color:var(--eva-track-selector-opened-background);border-radius:4px}.eva-track-selector-container{position:relative;display:flex;align-items:center;justify-content:center}.eva-track-selector-button{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;height:100%;gap:2px}.eva-track-selector-button .speed-icon{display:none}.eva-track-selector-button .speed-label{font-family:var(--eva-font-family);font-size:var(--eva-track-selector-label-font-size);font-weight:600;color:var(--eva-track-selector-label-color);white-space:nowrap;line-height:1}.eva-track-selector-button .dropdown-arrow{display:flex;align-items:center;width:var(--eva-track-selector-dropdown-arrow-size);height:var(--eva-track-selector-dropdown-arrow-size);color:var(--eva-track-selector-dropdown-arrow-color);transition:transform var(--eva-transition-duration) cubic-bezier(.4,0,.2,1)}.eva-track-selector-button .dropdown-arrow svg{width:100%;height:100%}.eva-track-selector-button .dropdown-arrow.rotated{transform:rotate(180deg)}.eva-track-selector-dropdown{position:absolute;bottom:100%;left:50%;transform:translate(-50%) translateY(-8px);margin-bottom:4px;z-index:1000;opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--eva-transition-duration) cubic-bezier(.4,0,.2,1),visibility var(--eva-transition-duration) cubic-bezier(.4,0,.2,1),transform var(--eva-transition-duration) cubic-bezier(.4,0,.2,1);transform:translate(-50%) translateY(0) scale(.95);transform-origin:bottom center}.eva-track-selector-dropdown.show{opacity:1;visibility:visible;pointer-events:auto;transform:translate(-50%) translateY(-8px) scale(1)}@media(max-width:768px){.eva-track-selector-dropdown{left:auto;right:0;transform:translateY(-8px)}.eva-track-selector-dropdown.show{transform:translateY(-8px) scale(1)}}:host-context(.controls-left) .eva-track-selector-dropdown{left:0;transform:translateY(-8px)}:host-context(.controls-left) .eva-track-selector-dropdown.show{transform:translateY(-8px) scale(1)}:host-context(.controls-right) .eva-track-selector-dropdown{left:auto;right:0;transform:translateY(-8px)}:host-context(.controls-right) .eva-track-selector-dropdown.show{transform:translateY(-8px) scale(1)}.dropdown-content{background:var(--eva-track-selector-dropdown-content-background);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);border-radius:8px;box-shadow:var(--eva-track-selector-dropdown-content-box-shadow);overflow:hidden;min-width:180px;animation:slideIn var(--eva-transition-duration) cubic-bezier(.4,0,.2,1)}@media(max-width:768px){.dropdown-content{min-width:150px}}@keyframes slideIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.dropdown-header{padding:10px 14px 8px;font-family:var(--eva-font-family);font-size:var(--eva-track-selector-dropdown-content-header-font-size);font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--eva-track-selector-dropdown-content-header-font-color);border-bottom:var(--eva-track-selector-dropdown-content-header-bottom-border)}.speed-options{padding:4px;max-height:280px;overflow-y:auto}.speed-options::-webkit-scrollbar{width:6px}.speed-options::-webkit-scrollbar-track{background:#ffffff0d;border-radius:3px}.speed-options::-webkit-scrollbar-thumb{background:#fff3;border-radius:3px}.speed-options::-webkit-scrollbar-thumb:hover{background:#ffffff4d}.speed-option{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px 14px;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color var(--eva-transition-duration) ease,transform var(--eva-transition-duration) ease;outline:none}.speed-option:hover{background-color:var(--eva-track-selector-dropdown-content-speed-option-bacground-hover)}.speed-option:active{transform:scale(.98)}.speed-option.active{background-color:#3b82f64d}.speed-option.active:hover{background-color:#3b82f666}.speed-option .speed-text{font-family:var(--eva-font-family);font-size:var(--eva-track-selector-dropdown-content-speed-option-font-size);font-weight:500;color:var(--eva-track-selector-dropdown-content-speed-option-font-color);transition:color var(--eva-transition-duration) ease}.speed-option .checkmark{display:flex;align-items:center;width:var(--eva-track-selector-dropdown-content-speed-option-checkmark-size);height:var(--eva-track-selector-dropdown-content-speed-option-checkmark-size);color:var(--eva-track-selector-dropdown-content-speed-option-checkmark-color);animation:checkmarkAppear var(--eva-transition-duration) cubic-bezier(.4,0,.2,1)}.speed-option .checkmark svg{width:100%;height:100%}@keyframes checkmarkAppear{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}.eva-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.speed-option:focus{outline:2px solid rgba(255,255,255,.5);outline-offset:-2px}.speed-option:focus-visible{outline:2px solid rgba(255,255,255,.5);outline-offset:-2px}.eva-track-selector-dropdown:not(.show){display:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4655
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaTrackSelector, deps: [], target: i0.ɵɵFactoryTarget.Component });
4656
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: EvaTrackSelector, isStandalone: true, selector: "eva-track-selector", inputs: { evaTrackSelectorText: { classPropertyName: "evaTrackSelectorText", publicName: "evaTrackSelectorText", isSignal: true, isRequired: false, transformFunction: null }, evaTrackOffText: { classPropertyName: "evaTrackOffText", publicName: "evaTrackOffText", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.eva-icon": "true", "class.open": "isOpen()", "attr.aria-label": "evaTrackSelectorText()" } }, ngImport: i0, template: "<div class=\"eva-track-selector-container\">\n\t<!-- Current Track Display Button -->\n\t<button type=\"button\" class=\"eva-track-selector-button\"\n\t\t[attr.aria-label]=\"evaTrackSelectorText() + ': ' + (currentTrack() || evaTrackOffText())\"\n\t\t[attr.aria-expanded]=\"isOpen()\" [attr.aria-haspopup]=\"'listbox'\"\n\t\t[attr.aria-controls]=\"'track-dropdown-' + uniqueId\" (click)=\"trackSelectorClicked()\"\n\t\t(keydown)=\"playbackClickedKeyboard($event)\">\n\t\t<span class=\"speed-icon\" aria-hidden=\"true\">\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n\t\t\t\tstroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t<path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n\t\t\t</svg>\n\t\t</span>\n\t\t<span class=\"speed-label\">{{ currentTrack() || evaTrackOffText() }}</span>\n\t\t<span class=\"dropdown-arrow\" [class.rotated]=\"isOpen()\" aria-hidden=\"true\">\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n\t\t\t\tstroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t<polyline points=\"6 9 12 15 18 9\"></polyline>\n\t\t\t</svg>\n\t\t</span>\n\t</button>\n\n\t<!-- Dropdown Menu -->\n\t<div class=\"eva-track-selector-dropdown\" [class.show]=\"isOpen()\" [attr.id]=\"'track-dropdown-' + uniqueId\"\n\t\trole=\"listbox\" [attr.aria-label]=\"evaTrackSelectorText()\"\n\t\t[attr.aria-activedescendant]=\"isOpen() ? 'track-option-' + uniqueId + '-' + getActiveIndex() : null\">\n\t\t<div class=\"dropdown-content\">\n\t\t\t<div class=\"dropdown-header\" id=\"track-header-{{uniqueId}}\" role=\"presentation\">\n\t\t\t\t{{evaTrackSelectorText()}}\n\t\t\t</div>\n\t\t\t<div class=\"speed-options\" role=\"presentation\">\n\t\t\t\t@for (tr of localTracks(); track tr.id; let i = $index) {\n\t\t\t\t<button type=\"button\" class=\"speed-option\" [class.active]=\"tr.selected\"\n\t\t\t\t\t[attr.id]=\"'track-option-' + uniqueId + '-' + i\" (click)=\"selectTrack(tr, i)\"\n\t\t\t\t\t[attr.aria-selected]=\"tr.selected\" role=\"option\" [attr.tabindex]=\"isOpen() ? 0 : -1\">\n\t\t\t\t\t<span class=\"speed-text\">{{ tr.label }}</span>\n\t\t\t\t\t@if (tr.selected) {\n\t\t\t\t\t<span class=\"checkmark\" aria-hidden=\"true\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t\t\t<polyline points=\"20 6 9 17 4 12\"></polyline>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>", styles: [":host{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;height:var(--eva-control-element-height);width:50px;cursor:pointer;color:#fff;position:relative;outline:none}:host:focus-visible{outline:2px solid rgba(255,255,255,.8);outline-offset:2px;border-radius:4px}:host:hover{background-color:var(--eva-track-selector-hover-background);border-radius:4px}:host.open{background-color:var(--eva-track-selector-opened-background);border-radius:4px}.eva-track-selector-container{position:relative;display:flex;align-items:center;justify-content:center}.eva-track-selector-button{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;height:100%;gap:2px}.eva-track-selector-button .speed-icon{display:none}.eva-track-selector-button .speed-label{font-family:var(--eva-font-family);font-size:var(--eva-track-selector-label-font-size);font-weight:600;color:var(--eva-track-selector-label-color);white-space:nowrap;line-height:1}.eva-track-selector-button .dropdown-arrow{display:flex;align-items:center;width:var(--eva-track-selector-dropdown-arrow-size);height:var(--eva-track-selector-dropdown-arrow-size);color:var(--eva-track-selector-dropdown-arrow-color);transition:transform var(--eva-transition-duration) cubic-bezier(.4,0,.2,1)}.eva-track-selector-button .dropdown-arrow svg{width:100%;height:100%}.eva-track-selector-button .dropdown-arrow.rotated{transform:rotate(180deg)}.eva-track-selector-dropdown{position:absolute;bottom:100%;left:50%;transform:translate(-50%) translateY(-8px);margin-bottom:4px;z-index:1000;opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--eva-transition-duration) cubic-bezier(.4,0,.2,1),visibility var(--eva-transition-duration) cubic-bezier(.4,0,.2,1),transform var(--eva-transition-duration) cubic-bezier(.4,0,.2,1);transform:translate(-50%) translateY(0) scale(.95);transform-origin:bottom center}.eva-track-selector-dropdown.show{opacity:1;visibility:visible;pointer-events:auto;transform:translate(-50%) translateY(-8px) scale(1)}@media(max-width:768px){.eva-track-selector-dropdown{left:auto;right:0;transform:translateY(-8px)}.eva-track-selector-dropdown.show{transform:translateY(-8px) scale(1)}}:host-context(.controls-left) .eva-track-selector-dropdown{left:0;transform:translateY(-8px)}:host-context(.controls-left) .eva-track-selector-dropdown.show{transform:translateY(-8px) scale(1)}:host-context(.controls-right) .eva-track-selector-dropdown{left:auto;right:0;transform:translateY(-8px)}:host-context(.controls-right) .eva-track-selector-dropdown.show{transform:translateY(-8px) scale(1)}.dropdown-content{background:var(--eva-track-selector-dropdown-content-background);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);border-radius:8px;box-shadow:var(--eva-track-selector-dropdown-content-box-shadow);overflow:hidden;min-width:180px;animation:slideIn var(--eva-transition-duration) cubic-bezier(.4,0,.2,1)}@media(max-width:768px){.dropdown-content{min-width:150px}}@keyframes slideIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.dropdown-header{padding:10px 14px 8px;font-family:var(--eva-font-family);font-size:var(--eva-track-selector-dropdown-content-header-font-size);font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--eva-track-selector-dropdown-content-header-font-color);border-bottom:var(--eva-track-selector-dropdown-content-header-bottom-border)}.speed-options{padding:4px;max-height:280px;overflow-y:auto}.speed-options::-webkit-scrollbar{width:6px}.speed-options::-webkit-scrollbar-track{background:#ffffff0d;border-radius:3px}.speed-options::-webkit-scrollbar-thumb{background:#fff3;border-radius:3px}.speed-options::-webkit-scrollbar-thumb:hover{background:#ffffff4d}.speed-option{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px 14px;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color var(--eva-transition-duration) ease,transform var(--eva-transition-duration) ease;outline:none}.speed-option:hover{background-color:var(--eva-track-selector-dropdown-content-speed-option-bacground-hover)}.speed-option:active{transform:scale(.98)}.speed-option.active{background-color:#3b82f64d}.speed-option.active:hover{background-color:#3b82f666}.speed-option .speed-text{font-family:var(--eva-font-family);font-size:var(--eva-track-selector-dropdown-content-speed-option-font-size);font-weight:500;color:var(--eva-track-selector-dropdown-content-speed-option-font-color);transition:color var(--eva-transition-duration) ease}.speed-option .checkmark{display:flex;align-items:center;width:var(--eva-track-selector-dropdown-content-speed-option-checkmark-size);height:var(--eva-track-selector-dropdown-content-speed-option-checkmark-size);color:var(--eva-track-selector-dropdown-content-speed-option-checkmark-color);animation:checkmarkAppear var(--eva-transition-duration) cubic-bezier(.4,0,.2,1)}.speed-option .checkmark svg{width:100%;height:100%}@keyframes checkmarkAppear{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}.eva-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.speed-option:focus{outline:2px solid rgba(255,255,255,.5);outline-offset:-2px}.speed-option:focus-visible{outline:2px solid rgba(255,255,255,.5);outline-offset:-2px}.eva-track-selector-dropdown:not(.show){display:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4607
4657
  }
4608
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaTrackSelector, decorators: [{
4658
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaTrackSelector, decorators: [{
4609
4659
  type: Component,
4610
4660
  args: [{ selector: 'eva-track-selector', changeDetection: ChangeDetectionStrategy.OnPush, host: {
4611
4661
  "[class.eva-icon]": "true",
@@ -4970,10 +5020,10 @@ class EvaVolume {
4970
5020
  onBlur() {
4971
5021
  this.isFocused.set(false);
4972
5022
  }
4973
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaVolume, deps: [], target: i0.ɵɵFactoryTarget.Component });
4974
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: EvaVolume, isStandalone: true, selector: "eva-volume", inputs: { evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "slider", "aria-orientation": "horizontal", "aria-valuemin": "0", "aria-valuemax": "100" }, listeners: { "click": "onClick($event)", "mousedown": "onMouseDown($event)", "keydown": "onKeyDown($event)", "touchstart": "onTouchStart($event)", "focus": "onFocus()", "blur": "onBlur()" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-valuenow": "ariaValue()", "attr.aria-valuetext": "ariaValue() + ' percent'", "class.eva-volume-focused": "isFocused()" } }, viewQueries: [{ propertyName: "volumeBar", first: true, predicate: ["volumeBar"], descendants: true, isSignal: true }], ngImport: i0, template: "<div #volumeBar class=\"volumeBar\">\n\t<div class=\"volumeBackground\" [class.dragging]=\"isDragging()\">\n\t\t<div class=\"volumeValue\" [style.width]=\"videoVolume() * (100 - 15) + '%'\" aria-hidden=\"true\"></div>\n\t\t<div class=\"volumeKnob\" [style.left]=\"videoVolume() * (100 - 15) + '%'\" aria-hidden=\"true\"></div>\n\t</div>\n</div>\n\n<!-- Screen reader announcements for volume changes -->\n<div class=\"eva-sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n\t@if (shouldAnnounceVolume()) {\n\t<span>Volume {{ ariaValue() }} percent</span>\n\t}\n</div>\n", styles: [":host{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;justify-content:center;height:var(--eva-control-element-height);width:var(--eva-volume-width);cursor:pointer;position:relative;padding:0 8px}.volumeBar{position:relative;display:flex;flex-grow:1;align-items:center;outline:none;border-radius:4px;transition:background-color var(--eva-transition-duration) ease}.volumeBar:focus{outline:none}.volumeBar:focus-visible{outline:2px solid rgba(255,255,255,.8);outline-offset:2px;background-color:#ffffff0d}.volumeBar:active .volumeKnob{transform:translateY(-50%) scale(1.1)}.volumeBackground{display:flex;flex-grow:1;height:var(--eva-volume-track-height);pointer-events:none;background-color:var(--eva-volume-background-color);border-radius:3px;position:relative;transition:height var(--eva-transition-duration) ease}.volumeBackground.dragging{height:var(--eva-volume-track-height-dragging)}.volumeValue{display:flex;height:100%;pointer-events:none;background-color:var(--eva-volume-track-background-color);transition:width var(--eva-transition-duration) ease-out;border-radius:3px;position:relative}.volumeKnob{position:absolute;width:var(--eva-volume-knob-size);height:var(--eva-volume-knob-size);left:0;top:50%;transform:translateY(-50%);border-radius:50%;pointer-events:none;background-color:var(--eva-volume-knob-background-color);box-shadow:var(--eva-volume-knob-box-shadow);transition:all var(--eva-transition-duration) ease-out;z-index:1}.volumeKnob:before{content:\"\";position:absolute;inset:2px;border-radius:50%;background:radial-gradient(circle at 30% 30%,rgba(255,255,255,.4),transparent)}.volumeBackground.dragging .volumeValue,.volumeBackground.dragging .volumeKnob{transition:none}.eva-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@media(prefers-contrast:high){.volumeBar:focus-visible{outline-width:3px}.volumeBackground{background-color:#fff6}}@media(prefers-reduced-motion:reduce){.volumeBar,.volumeBackground,.volumeValue,.volumeKnob{transition:none!important}}@media(pointer:coarse){.volumeBar{padding:8px 0}.volumeKnob{width:18px;height:18px}}:host.eva-volume-focused .volumeBackground{background-color:#ffffff40}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5023
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaVolume, deps: [], target: i0.ɵɵFactoryTarget.Component });
5024
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: EvaVolume, isStandalone: true, selector: "eva-volume", inputs: { evaAria: { classPropertyName: "evaAria", publicName: "evaAria", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0", "role": "slider", "aria-orientation": "horizontal", "aria-valuemin": "0", "aria-valuemax": "100" }, listeners: { "click": "onClick($event)", "mousedown": "onMouseDown($event)", "keydown": "onKeyDown($event)", "touchstart": "onTouchStart($event)", "focus": "onFocus()", "blur": "onBlur()" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-valuenow": "ariaValue()", "attr.aria-valuetext": "ariaValue() + ' percent'", "class.eva-volume-focused": "isFocused()" } }, viewQueries: [{ propertyName: "volumeBar", first: true, predicate: ["volumeBar"], descendants: true, isSignal: true }], ngImport: i0, template: "<div #volumeBar class=\"volumeBar\">\n\t<div class=\"volumeBackground\" [class.dragging]=\"isDragging()\">\n\t\t<div class=\"volumeValue\" [style.width]=\"videoVolume() * (100 - 15) + '%'\" aria-hidden=\"true\"></div>\n\t\t<div class=\"volumeKnob\" [style.left]=\"videoVolume() * (100 - 15) + '%'\" aria-hidden=\"true\"></div>\n\t</div>\n</div>\n\n<!-- Screen reader announcements for volume changes -->\n<div class=\"eva-sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n\t@if (shouldAnnounceVolume()) {\n\t<span>Volume {{ ariaValue() }} percent</span>\n\t}\n</div>\n", styles: [":host{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;justify-content:center;height:var(--eva-control-element-height);width:var(--eva-volume-width);cursor:pointer;position:relative;padding:0 8px}.volumeBar{position:relative;display:flex;flex-grow:1;align-items:center;outline:none;border-radius:4px;transition:background-color var(--eva-transition-duration) ease}.volumeBar:focus{outline:none}.volumeBar:focus-visible{outline:2px solid rgba(255,255,255,.8);outline-offset:2px;background-color:#ffffff0d}.volumeBar:active .volumeKnob{transform:translateY(-50%) scale(1.1)}.volumeBackground{display:flex;flex-grow:1;height:var(--eva-volume-track-height);pointer-events:none;background-color:var(--eva-volume-background-color);border-radius:3px;position:relative;transition:height var(--eva-transition-duration) ease}.volumeBackground.dragging{height:var(--eva-volume-track-height-dragging)}.volumeValue{display:flex;height:100%;pointer-events:none;background-color:var(--eva-volume-track-background-color);transition:width var(--eva-transition-duration) ease-out;border-radius:3px;position:relative}.volumeKnob{position:absolute;width:var(--eva-volume-knob-size);height:var(--eva-volume-knob-size);left:0;top:50%;transform:translateY(-50%);border-radius:50%;pointer-events:none;background-color:var(--eva-volume-knob-background-color);box-shadow:var(--eva-volume-knob-box-shadow);transition:all var(--eva-transition-duration) ease-out;z-index:1}.volumeKnob:before{content:\"\";position:absolute;inset:2px;border-radius:50%;background:radial-gradient(circle at 30% 30%,rgba(255,255,255,.4),transparent)}.volumeBackground.dragging .volumeValue,.volumeBackground.dragging .volumeKnob{transition:none}.eva-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@media(prefers-contrast:high){.volumeBar:focus-visible{outline-width:3px}.volumeBackground{background-color:#fff6}}@media(prefers-reduced-motion:reduce){.volumeBar,.volumeBackground,.volumeValue,.volumeKnob{transition:none!important}}@media(pointer:coarse){.volumeBar{padding:8px 0}.volumeKnob{width:18px;height:18px}}:host.eva-volume-focused .volumeBackground{background-color:#ffffff40}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4975
5025
  }
4976
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaVolume, decorators: [{
5026
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaVolume, decorators: [{
4977
5027
  type: Component,
4978
5028
  args: [{ selector: 'eva-volume', changeDetection: ChangeDetectionStrategy.OnPush, host: {
4979
5029
  "tabindex": "0",
@@ -5080,10 +5130,10 @@ class EvaCueChangeDirective {
5080
5130
  this.evaAPI.onCueChange(null);
5081
5131
  }
5082
5132
  }
5083
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaCueChangeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5084
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.0", type: EvaCueChangeDirective, isStandalone: true, selector: "track[evaCueChange]", inputs: { evaCueChangeActive: { classPropertyName: "evaCueChangeActive", publicName: "evaCueChangeActive", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
5133
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaCueChangeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5134
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: EvaCueChangeDirective, isStandalone: true, selector: "track[evaCueChange]", inputs: { evaCueChangeActive: { classPropertyName: "evaCueChangeActive", publicName: "evaCueChangeActive", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
5085
5135
  }
5086
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaCueChangeDirective, decorators: [{
5136
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaCueChangeDirective, decorators: [{
5087
5137
  type: Directive,
5088
5138
  args: [{
5089
5139
  selector: 'track[evaCueChange]'
@@ -5125,8 +5175,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
5125
5175
  */
5126
5176
  class EvaMediaEventListenersDirective {
5127
5177
  evaAPI = inject(EvaApi);
5178
+ fullscreenService = inject(EvaFullscreenAPI);
5128
5179
  elementRef = inject((ElementRef));
5129
5180
  subs = [];
5181
+ // private lastTapTime: number = 0;
5130
5182
  ngOnInit() {
5131
5183
  const el = this.elementRef.nativeElement;
5132
5184
  const on = (event, handler) => {
@@ -5138,6 +5190,7 @@ class EvaMediaEventListenersDirective {
5138
5190
  on(EvaVideoEvent.LOADED_METADATA, e => this.evaAPI.loadedVideoMetadata(e));
5139
5191
  on(EvaVideoEvent.PAUSE, () => this.evaAPI.pauseVideo());
5140
5192
  on(EvaVideoEvent.PLAY, () => this.evaAPI.playVideo());
5193
+ on(EvaVideoEvent.DOUBLE_CLICK, () => this.fullscreenService.toggleFullscreen());
5141
5194
  on(EvaVideoEvent.PLAYING, () => this.evaAPI.playingVideo());
5142
5195
  on(EvaVideoEvent.PROGRESS, () => this.evaAPI.checkBufferStatus());
5143
5196
  on(EvaVideoEvent.RATECHANGE, e => this.evaAPI.playbackRateVideoChanged(e));
@@ -5149,14 +5202,32 @@ class EvaMediaEventListenersDirective {
5149
5202
  on(EvaVideoEvent.WAITING, () => this.evaAPI.videoWaiting());
5150
5203
  on(EvaVideoEvent.ENTERED_PICTURE_IN_PICTURE, e => this.evaAPI.assignPictureInPictureWindow(e));
5151
5204
  on(EvaVideoEvent.LEFT_PICTURE_IN_PICTURE, e => this.evaAPI.removePictureInPictureWindow(e));
5205
+ // this.subs.push(
5206
+ // fromEvent<TouchEvent>(el, 'touchend')
5207
+ // .subscribe((e) => {
5208
+ // console.log(e);
5209
+ // const now = e.timeStamp;
5210
+ // if (now - this.lastTapTime <= 300) {
5211
+ // const rect = el.getBoundingClientRect();
5212
+ // const tapX = e.changedTouches[0].clientX;
5213
+ // if (tapX < rect.left + rect.width / 2) {
5214
+ // this.evaAPI.seekBack(10);
5215
+ // } else {
5216
+ // this.evaAPI.seekForward(10);
5217
+ // }
5218
+ // this.lastTapTime = 0;
5219
+ // } else {
5220
+ // this.lastTapTime = now;
5221
+ // }
5222
+ // }));
5152
5223
  }
5153
5224
  ngOnDestroy() {
5154
5225
  this.subs.forEach(s => s.unsubscribe());
5155
5226
  }
5156
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaMediaEventListenersDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5157
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: EvaMediaEventListenersDirective, isStandalone: true, selector: "video[evaMediaEventListeners]", ngImport: i0 });
5227
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaMediaEventListenersDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5228
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.2", type: EvaMediaEventListenersDirective, isStandalone: true, selector: "video[evaMediaEventListeners]", ngImport: i0 });
5158
5229
  }
5159
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaMediaEventListenersDirective, decorators: [{
5230
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaMediaEventListenersDirective, decorators: [{
5160
5231
  type: Directive,
5161
5232
  args: [{
5162
5233
  selector: 'video[evaMediaEventListeners]'
@@ -5233,21 +5304,18 @@ class EvaUserInteractionEventsDirective {
5233
5304
  * - All streams are automatically torn down when `destroy$` emits via `takeUntil`.
5234
5305
  */
5235
5306
  prepareListeners() {
5236
- const mousemove$ = fromEvent(this.evaAPI.assignedVideoElement, 'mousemove')
5237
- .pipe(throttleTime(100));
5238
- const touchstart$ = fromEvent(this.evaAPI.assignedVideoElement, 'touchstart');
5239
- const click$ = fromEvent(this.evaAPI.assignedVideoElement, 'click');
5240
- // Merge all user interaction events
5307
+ const videoEl = this.evaAPI.assignedVideoElement;
5308
+ const mousemove$ = fromEvent(videoEl, 'mousemove').pipe(throttleTime(100));
5309
+ const touchstart$ = fromEvent(videoEl, 'touchstart');
5310
+ const click$ = fromEvent(videoEl, 'click');
5241
5311
  merge(mousemove$, touchstart$, click$)
5242
5312
  .pipe(takeUntil(this.destroy$))
5243
- .subscribe((t) => {
5244
- this.evaAPI.triggerUserInteraction.next(t);
5245
- });
5313
+ .subscribe((t) => this.evaAPI.triggerUserInteraction.next(t));
5246
5314
  }
5247
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaUserInteractionEventsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5248
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: EvaUserInteractionEventsDirective, isStandalone: true, selector: "eva-controls-container[evaUserInteractionEvents]", ngImport: i0 });
5315
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaUserInteractionEventsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5316
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.2", type: EvaUserInteractionEventsDirective, isStandalone: true, selector: "eva-controls-container[evaUserInteractionEvents]", ngImport: i0 });
5249
5317
  }
5250
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaUserInteractionEventsDirective, decorators: [{
5318
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaUserInteractionEventsDirective, decorators: [{
5251
5319
  type: Directive,
5252
5320
  args: [{
5253
5321
  selector: 'eva-controls-container[evaUserInteractionEvents]'
@@ -5408,16 +5476,129 @@ class EvaVideoConfigurationDirective {
5408
5476
  this.elementRef.nativeElement.poster = this.sanitizer.sanitize(SecurityContext.URL, config.poster) ?? '';
5409
5477
  }
5410
5478
  }
5411
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaVideoConfigurationDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5412
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.0", type: EvaVideoConfigurationDirective, isStandalone: true, selector: "video[evaVideoConfiguration]", inputs: { evaVideoConfig: { classPropertyName: "evaVideoConfig", publicName: "evaVideoConfig", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { videoConfigurationDone: "videoConfigurationDone" }, usesOnChanges: true, ngImport: i0 });
5479
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaVideoConfigurationDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5480
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: EvaVideoConfigurationDirective, isStandalone: true, selector: "video[evaVideoConfiguration]", inputs: { evaVideoConfig: { classPropertyName: "evaVideoConfig", publicName: "evaVideoConfig", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { videoConfigurationDone: "videoConfigurationDone" }, usesOnChanges: true, ngImport: i0 });
5413
5481
  }
5414
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaVideoConfigurationDirective, decorators: [{
5482
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaVideoConfigurationDirective, decorators: [{
5415
5483
  type: Directive,
5416
5484
  args: [{
5417
5485
  selector: 'video[evaVideoConfiguration]'
5418
5486
  }]
5419
5487
  }], propDecorators: { videoConfigurationDone: [{ type: i0.Output, args: ["videoConfigurationDone"] }], evaVideoConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "evaVideoConfig", required: true }] }] } });
5420
5488
 
5489
+ /** Duration of a single frame at 30fps, used for frame-step shortcuts. */
5490
+ const FRAME_DURATION_SECONDS = 1 / 30;
5491
+ /**
5492
+ * Directive that enables configurable keyboard shortcuts on the video player.
5493
+ *
5494
+ * Listens on the `document` for `keydown` events and delegates to `EvaApi`
5495
+ * and `EvaFullscreenAPI` methods. The listener is dynamically added/removed
5496
+ * via an `effect()` based on `evaKeyboardShortcutsEnabled`.
5497
+ *
5498
+ * Applied as a host directive on `EvaPlayer` — consumers configure it
5499
+ * via inputs on `<eva-player>` directly.
5500
+ *
5501
+ * Shortcuts are suppressed when focus is inside an `<input>`, `<textarea>`,
5502
+ * or `contenteditable` element to avoid interfering with text entry.
5503
+ *
5504
+ * @example
5505
+ * <eva-player
5506
+ * [evaKeyboardShortcutsEnabled]="true"
5507
+ * [evaKeyboardShortcutsConfiguration]="{ backwardsKeyOne: 'ArrowLeft', forwardKeyOne: 'ArrowRight' }"
5508
+ * />
5509
+ */
5510
+ class EvaKeyboardShortcuts {
5511
+ /** Whether keyboard shortcuts are active. Dynamically adds/removes the document listener. */
5512
+ evaKeyboardShortcutsEnabled = input.required(/* @ts-ignore */
5513
+ ...(ngDevMode ? [{ debugName: "evaKeyboardShortcutsEnabled" }] : /* istanbul ignore next */ []));
5514
+ /** Key binding configuration. All keys are guaranteed present via the transform on `EvaPlayer`. */
5515
+ evaKeyboardShortcutsConfiguration = input.required(/* @ts-ignore */
5516
+ ...(ngDevMode ? [{ debugName: "evaKeyboardShortcutsConfiguration" }] : /* istanbul ignore next */ []));
5517
+ api = inject(EvaApi);
5518
+ fullscreenService = inject(EvaFullscreenAPI);
5519
+ document = inject(DOCUMENT);
5520
+ destroyRef = inject(DestroyRef);
5521
+ constructor() {
5522
+ effect(() => {
5523
+ if (this.evaKeyboardShortcutsEnabled()) {
5524
+ this.document.addEventListener('keydown', this.onKeydown);
5525
+ }
5526
+ else {
5527
+ this.document.removeEventListener('keydown', this.onKeydown);
5528
+ }
5529
+ });
5530
+ this.destroyRef.onDestroy(() => {
5531
+ this.document.removeEventListener('keydown', this.onKeydown);
5532
+ });
5533
+ }
5534
+ /**
5535
+ * Handles `keydown` events. Matches `e.key` (case-insensitive) against the
5536
+ * configured shortcuts. `playPause` uses `e.code` to reliably detect Space.
5537
+ * Number keys `0`–`9` jump to the corresponding percentage of total duration.
5538
+ */
5539
+ onKeydown = (e) => {
5540
+ const config = this.evaKeyboardShortcutsConfiguration();
5541
+ const key = e.key.toUpperCase();
5542
+ const code = e.code.toUpperCase();
5543
+ const target = e.target;
5544
+ if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {
5545
+ return;
5546
+ }
5547
+ if (config.backwardsKeyOne && key === config.backwardsKeyOne.toUpperCase()) {
5548
+ e.preventDefault();
5549
+ this.api.seekBack(config.backwardSeconds);
5550
+ }
5551
+ else if (config.forwardKeyOne && key === config.forwardKeyOne.toUpperCase()) {
5552
+ e.preventDefault();
5553
+ this.api.seekForward(config.forwardSeconds);
5554
+ }
5555
+ else if (config.backwardsKeyTwo && key === config.backwardsKeyTwo.toUpperCase()) {
5556
+ e.preventDefault();
5557
+ this.api.seekBack(config.backwardSeconds);
5558
+ }
5559
+ else if (config.forwardKeyTwo && key === config.forwardKeyTwo.toUpperCase()) {
5560
+ e.preventDefault();
5561
+ this.api.seekForward(config.forwardSeconds);
5562
+ }
5563
+ else if (config.fullscreen && key === config.fullscreen.toUpperCase()) {
5564
+ e.preventDefault();
5565
+ this.fullscreenService.toggleFullscreen();
5566
+ }
5567
+ else if (config.muteKey && key === config.muteKey.toUpperCase()) {
5568
+ e.preventDefault();
5569
+ this.api.muteOrUnmuteVideo();
5570
+ }
5571
+ else if (config.playPause && code === config.playPause.toUpperCase()) {
5572
+ e.preventDefault();
5573
+ this.api.playOrPauseVideo();
5574
+ }
5575
+ else if (config.oneFrameBackward && key === config.oneFrameBackward.toUpperCase()) {
5576
+ e.preventDefault();
5577
+ this.api.seekBack(FRAME_DURATION_SECONDS);
5578
+ }
5579
+ else if (config.oneFrameForward && key === config.oneFrameForward.toUpperCase()) {
5580
+ e.preventDefault();
5581
+ this.api.seekForward(FRAME_DURATION_SECONDS);
5582
+ }
5583
+ else if (this.isNumberPressed(key)) {
5584
+ e.preventDefault();
5585
+ this.api.jumpToVideoPercentage(key);
5586
+ }
5587
+ };
5588
+ /** Returns `true` if the key is a digit `0`–`9`. */
5589
+ isNumberPressed(key) {
5590
+ return key === "0" || key === "1" || key === "2" || key === "3" || key === "4" || key === "5" || key === "6" || key === "7" || key === "8" || key === "9";
5591
+ }
5592
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaKeyboardShortcuts, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5593
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: EvaKeyboardShortcuts, isStandalone: true, selector: "[evaKeyboardShortcuts]", inputs: { evaKeyboardShortcutsEnabled: { classPropertyName: "evaKeyboardShortcutsEnabled", publicName: "evaKeyboardShortcutsEnabled", isSignal: true, isRequired: true, transformFunction: null }, evaKeyboardShortcutsConfiguration: { classPropertyName: "evaKeyboardShortcutsConfiguration", publicName: "evaKeyboardShortcutsConfiguration", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
5594
+ }
5595
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaKeyboardShortcuts, decorators: [{
5596
+ type: Directive,
5597
+ args: [{
5598
+ selector: '[evaKeyboardShortcuts]',
5599
+ }]
5600
+ }], ctorParameters: () => [], propDecorators: { evaKeyboardShortcutsEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "evaKeyboardShortcutsEnabled", required: true }] }], evaKeyboardShortcutsConfiguration: [{ type: i0.Input, args: [{ isSignal: true, alias: "evaKeyboardShortcutsConfiguration", required: true }] }] } });
5601
+
5421
5602
  /**
5422
5603
  * Root player component for the Eva video player.
5423
5604
  *
@@ -5469,6 +5650,21 @@ class EvaPlayer {
5469
5650
  */
5470
5651
  evaVideoConfiguration = input({}, /* @ts-ignore */
5471
5652
  ...(ngDevMode ? [{ debugName: "evaVideoConfiguration" }] : /* istanbul ignore next */ []));
5653
+ /**
5654
+ * Enables keyboard shortcuts on the player.
5655
+ * When `true`, the `EvaKeyboardShortcuts` directive listens for `keydown` events on the document.
5656
+ *
5657
+ * @default false
5658
+ */
5659
+ evaKeyboardShortcutsEnabled = input(false, /* @ts-ignore */
5660
+ ...(ngDevMode ? [{ debugName: "evaKeyboardShortcutsEnabled" }] : /* istanbul ignore next */ []));
5661
+ /**
5662
+ * Key binding configuration for keyboard shortcuts.
5663
+ * Partial configs are merged with defaults via `validateAndTransformEvaKeyboardShortcutsConfiguration`.
5664
+ *
5665
+ * @default prepareDefaultKeyboardShortcutsConfiguration()
5666
+ */
5667
+ evaKeyboardShortcutsConfiguration = input(prepareDefaultKeyboardShortcutsConfiguration(), { ...(ngDevMode ? { debugName: "evaKeyboardShortcutsConfiguration" } : /* istanbul ignore next */ {}), transform: validateAndTransformEvaKeyboardShortcutsConfiguration });
5472
5668
  /**
5473
5669
  * List of subtitle/text tracks to attach to the video element.
5474
5670
  * Validated and transformed via `validateTracks`.
@@ -5536,13 +5732,13 @@ class EvaPlayer {
5536
5732
  videoConfigReady() {
5537
5733
  this.playerMainAPI.onPlayerReady();
5538
5734
  }
5539
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaPlayer, deps: [], target: i0.ɵɵFactoryTarget.Component });
5540
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: EvaPlayer, isStandalone: true, selector: "eva-player", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null }, evaVideoSources: { classPropertyName: "evaVideoSources", publicName: "evaVideoSources", isSignal: true, isRequired: true, transformFunction: null }, evaVideoConfiguration: { classPropertyName: "evaVideoConfiguration", publicName: "evaVideoConfiguration", isSignal: true, isRequired: false, transformFunction: null }, evaVideoTracks: { classPropertyName: "evaVideoTracks", publicName: "evaVideoTracks", isSignal: true, isRequired: false, transformFunction: null }, evaNotSupportedText: { classPropertyName: "evaNotSupportedText", publicName: "evaNotSupportedText", isSignal: true, isRequired: false, transformFunction: null } }, providers: [EvaApi, EvaFullscreenAPI], viewQueries: [{ propertyName: "evaVideoElement", first: true, predicate: ["evaVideoElement"], descendants: true, isSignal: true }], usesOnChanges: true, ngImport: i0, template: "<video #evaVideoElement [id]=\"id()\" evaMediaEventListeners evaVideoConfiguration\n\t[evaVideoConfig]=\"evaVideoConfiguration()\" (videoConfigurationDone)=\"videoConfigReady()\">\n\t@for (vs of evaVideoSources(); track $index) {\n\t<source #evaVideoSources [type]=\"vs.type\" [src]=\"vs.src\" />\n\t}\n\t@if(evaNotSupportedText()){\n\t<p>{{evaNotSupportedText()}}</p>\n\t}\n\n\t@for (t of evaVideoTracks(); track $index) {\n\t<track #evaVideoTracks [default]=\"t.default\" [kind]=\"t.kind\" [label]=\"t.label\" [src]=\"t.src\" [srclang]=\"t.srclang\"\n\t\t[ariaLabel]=\"t.label\" evaCueChange\n\t\t[evaCueChangeActive]=\"t.kind === 'subtitles' && activeSubtitleLabel() === t.label\" />\n\t}\n</video>\n\n<ng-content></ng-content>", styles: [":host{display:block;position:relative;padding:0;margin:0;border:0;border-radius:0;overflow:hidden}:host>video{display:block;width:100%;object-fit:contain;object-position:0 0;transition:padding-bottom var(--eva-transition-duration) ease-in-out}:host(video::cue){font-family:var(--eva-font-family);color:unset;background-color:transparent;font-size:0px;text-decoration:none;text-shadow:none}\n"], dependencies: [{ kind: "directive", type: EvaMediaEventListenersDirective, selector: "video[evaMediaEventListeners]" }, { kind: "directive", type: EvaVideoConfigurationDirective, selector: "video[evaVideoConfiguration]", inputs: ["evaVideoConfig"], outputs: ["videoConfigurationDone"] }, { kind: "directive", type: EvaCueChangeDirective, selector: "track[evaCueChange]", inputs: ["evaCueChangeActive"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5735
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaPlayer, deps: [], target: i0.ɵɵFactoryTarget.Component });
5736
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: EvaPlayer, isStandalone: true, selector: "eva-player", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null }, evaVideoSources: { classPropertyName: "evaVideoSources", publicName: "evaVideoSources", isSignal: true, isRequired: true, transformFunction: null }, evaVideoConfiguration: { classPropertyName: "evaVideoConfiguration", publicName: "evaVideoConfiguration", isSignal: true, isRequired: false, transformFunction: null }, evaKeyboardShortcutsEnabled: { classPropertyName: "evaKeyboardShortcutsEnabled", publicName: "evaKeyboardShortcutsEnabled", isSignal: true, isRequired: false, transformFunction: null }, evaKeyboardShortcutsConfiguration: { classPropertyName: "evaKeyboardShortcutsConfiguration", publicName: "evaKeyboardShortcutsConfiguration", isSignal: true, isRequired: false, transformFunction: null }, evaVideoTracks: { classPropertyName: "evaVideoTracks", publicName: "evaVideoTracks", isSignal: true, isRequired: false, transformFunction: null }, evaNotSupportedText: { classPropertyName: "evaNotSupportedText", publicName: "evaNotSupportedText", isSignal: true, isRequired: false, transformFunction: null } }, providers: [EvaApi, EvaFullscreenAPI], viewQueries: [{ propertyName: "evaVideoElement", first: true, predicate: ["evaVideoElement"], descendants: true, isSignal: true }], usesOnChanges: true, ngImport: i0, template: "<video #evaVideoElement [id]=\"id()\" evaMediaEventListeners evaVideoConfiguration evaKeyboardShortcuts\n\t[evaKeyboardShortcutsEnabled]=\"evaKeyboardShortcutsEnabled()\"\n\t[evaKeyboardShortcutsConfiguration]=\"evaKeyboardShortcutsConfiguration()\" [evaVideoConfig]=\"evaVideoConfiguration()\"\n\t(videoConfigurationDone)=\"videoConfigReady()\">\n\t@for (vs of evaVideoSources(); track $index) {\n\t<source #evaVideoSources [type]=\"vs.type\" [src]=\"vs.src\" />\n\t}\n\t@if(evaNotSupportedText()){\n\t<p>{{evaNotSupportedText()}}</p>\n\t}\n\n\t@for (t of evaVideoTracks(); track $index) {\n\t<track #evaVideoTracks [default]=\"t.default\" [kind]=\"t.kind\" [label]=\"t.label\" [src]=\"t.src\" [srclang]=\"t.srclang\"\n\t\t[ariaLabel]=\"t.label\" evaCueChange\n\t\t[evaCueChangeActive]=\"t.kind === 'subtitles' && activeSubtitleLabel() === t.label\" />\n\t}\n</video>\n\n<ng-content></ng-content>", styles: [":host{display:block;position:relative;padding:0;margin:0;border:0;border-radius:0;overflow:hidden}:host>video{display:block;width:100%;object-fit:contain;object-position:0 0;transition:padding-bottom var(--eva-transition-duration) ease-in-out}:host(video::cue){font-family:var(--eva-font-family);color:unset;background-color:transparent;font-size:0px;text-decoration:none;text-shadow:none}\n"], dependencies: [{ kind: "directive", type: EvaMediaEventListenersDirective, selector: "video[evaMediaEventListeners]" }, { kind: "directive", type: EvaVideoConfigurationDirective, selector: "video[evaVideoConfiguration]", inputs: ["evaVideoConfig"], outputs: ["videoConfigurationDone"] }, { kind: "directive", type: EvaCueChangeDirective, selector: "track[evaCueChange]", inputs: ["evaCueChangeActive"] }, { kind: "directive", type: EvaKeyboardShortcuts, selector: "[evaKeyboardShortcuts]", inputs: ["evaKeyboardShortcutsEnabled", "evaKeyboardShortcutsConfiguration"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5541
5737
  }
5542
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaPlayer, decorators: [{
5738
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaPlayer, decorators: [{
5543
5739
  type: Component,
5544
- args: [{ selector: 'eva-player', imports: [EvaMediaEventListenersDirective, EvaVideoConfigurationDirective, EvaCueChangeDirective], changeDetection: ChangeDetectionStrategy.OnPush, providers: [EvaApi, EvaFullscreenAPI], template: "<video #evaVideoElement [id]=\"id()\" evaMediaEventListeners evaVideoConfiguration\n\t[evaVideoConfig]=\"evaVideoConfiguration()\" (videoConfigurationDone)=\"videoConfigReady()\">\n\t@for (vs of evaVideoSources(); track $index) {\n\t<source #evaVideoSources [type]=\"vs.type\" [src]=\"vs.src\" />\n\t}\n\t@if(evaNotSupportedText()){\n\t<p>{{evaNotSupportedText()}}</p>\n\t}\n\n\t@for (t of evaVideoTracks(); track $index) {\n\t<track #evaVideoTracks [default]=\"t.default\" [kind]=\"t.kind\" [label]=\"t.label\" [src]=\"t.src\" [srclang]=\"t.srclang\"\n\t\t[ariaLabel]=\"t.label\" evaCueChange\n\t\t[evaCueChangeActive]=\"t.kind === 'subtitles' && activeSubtitleLabel() === t.label\" />\n\t}\n</video>\n\n<ng-content></ng-content>", styles: [":host{display:block;position:relative;padding:0;margin:0;border:0;border-radius:0;overflow:hidden}:host>video{display:block;width:100%;object-fit:contain;object-position:0 0;transition:padding-bottom var(--eva-transition-duration) ease-in-out}:host(video::cue){font-family:var(--eva-font-family);color:unset;background-color:transparent;font-size:0px;text-decoration:none;text-shadow:none}\n"] }]
5545
- }], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: true }] }], evaVideoSources: [{ type: i0.Input, args: [{ isSignal: true, alias: "evaVideoSources", required: true }] }], evaVideoConfiguration: [{ type: i0.Input, args: [{ isSignal: true, alias: "evaVideoConfiguration", required: false }] }], evaVideoTracks: [{ type: i0.Input, args: [{ isSignal: true, alias: "evaVideoTracks", required: false }] }], evaNotSupportedText: [{ type: i0.Input, args: [{ isSignal: true, alias: "evaNotSupportedText", required: false }] }], evaVideoElement: [{ type: i0.ViewChild, args: ['evaVideoElement', { isSignal: true }] }] } });
5740
+ args: [{ selector: 'eva-player', imports: [EvaMediaEventListenersDirective, EvaVideoConfigurationDirective, EvaCueChangeDirective, EvaKeyboardShortcuts], changeDetection: ChangeDetectionStrategy.OnPush, providers: [EvaApi, EvaFullscreenAPI], template: "<video #evaVideoElement [id]=\"id()\" evaMediaEventListeners evaVideoConfiguration evaKeyboardShortcuts\n\t[evaKeyboardShortcutsEnabled]=\"evaKeyboardShortcutsEnabled()\"\n\t[evaKeyboardShortcutsConfiguration]=\"evaKeyboardShortcutsConfiguration()\" [evaVideoConfig]=\"evaVideoConfiguration()\"\n\t(videoConfigurationDone)=\"videoConfigReady()\">\n\t@for (vs of evaVideoSources(); track $index) {\n\t<source #evaVideoSources [type]=\"vs.type\" [src]=\"vs.src\" />\n\t}\n\t@if(evaNotSupportedText()){\n\t<p>{{evaNotSupportedText()}}</p>\n\t}\n\n\t@for (t of evaVideoTracks(); track $index) {\n\t<track #evaVideoTracks [default]=\"t.default\" [kind]=\"t.kind\" [label]=\"t.label\" [src]=\"t.src\" [srclang]=\"t.srclang\"\n\t\t[ariaLabel]=\"t.label\" evaCueChange\n\t\t[evaCueChangeActive]=\"t.kind === 'subtitles' && activeSubtitleLabel() === t.label\" />\n\t}\n</video>\n\n<ng-content></ng-content>", styles: [":host{display:block;position:relative;padding:0;margin:0;border:0;border-radius:0;overflow:hidden}:host>video{display:block;width:100%;object-fit:contain;object-position:0 0;transition:padding-bottom var(--eva-transition-duration) ease-in-out}:host(video::cue){font-family:var(--eva-font-family);color:unset;background-color:transparent;font-size:0px;text-decoration:none;text-shadow:none}\n"] }]
5741
+ }], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: true }] }], evaVideoSources: [{ type: i0.Input, args: [{ isSignal: true, alias: "evaVideoSources", required: true }] }], evaVideoConfiguration: [{ type: i0.Input, args: [{ isSignal: true, alias: "evaVideoConfiguration", required: false }] }], evaKeyboardShortcutsEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "evaKeyboardShortcutsEnabled", required: false }] }], evaKeyboardShortcutsConfiguration: [{ type: i0.Input, args: [{ isSignal: true, alias: "evaKeyboardShortcutsConfiguration", required: false }] }], evaVideoTracks: [{ type: i0.Input, args: [{ isSignal: true, alias: "evaVideoTracks", required: false }] }], evaNotSupportedText: [{ type: i0.Input, args: [{ isSignal: true, alias: "evaNotSupportedText", required: false }] }], evaVideoElement: [{ type: i0.ViewChild, args: ['evaVideoElement', { isSignal: true }] }] } });
5546
5742
 
5547
5743
  /**
5548
5744
  * DASH streaming directive for the Eva video player.
@@ -5759,10 +5955,10 @@ class EvaDashDirective {
5759
5955
  getDashInstance() {
5760
5956
  return this.dash;
5761
5957
  }
5762
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaDashDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5763
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.0", type: EvaDashDirective, isStandalone: true, selector: "eva-player[evaDash]", inputs: { evaDashSrc: { classPropertyName: "evaDashSrc", publicName: "evaDashSrc", isSignal: true, isRequired: true, transformFunction: null }, evaDashDRMToken: { classPropertyName: "evaDashDRMToken", publicName: "evaDashDRMToken", isSignal: true, isRequired: false, transformFunction: null }, evaDashDRMLicenseServer: { classPropertyName: "evaDashDRMLicenseServer", publicName: "evaDashDRMLicenseServer", isSignal: true, isRequired: false, transformFunction: null }, evaDashConfig: { classPropertyName: "evaDashConfig", publicName: "evaDashConfig", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["evaDash"], usesOnChanges: true, ngImport: i0 });
5958
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaDashDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5959
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: EvaDashDirective, isStandalone: true, selector: "eva-player[evaDash]", inputs: { evaDashSrc: { classPropertyName: "evaDashSrc", publicName: "evaDashSrc", isSignal: true, isRequired: true, transformFunction: null }, evaDashDRMToken: { classPropertyName: "evaDashDRMToken", publicName: "evaDashDRMToken", isSignal: true, isRequired: false, transformFunction: null }, evaDashDRMLicenseServer: { classPropertyName: "evaDashDRMLicenseServer", publicName: "evaDashDRMLicenseServer", isSignal: true, isRequired: false, transformFunction: null }, evaDashConfig: { classPropertyName: "evaDashConfig", publicName: "evaDashConfig", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["evaDash"], usesOnChanges: true, ngImport: i0 });
5764
5960
  }
5765
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaDashDirective, decorators: [{
5961
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaDashDirective, decorators: [{
5766
5962
  type: Directive,
5767
5963
  args: [{
5768
5964
  selector: 'eva-player[evaDash]',
@@ -5963,10 +6159,10 @@ class EvaHlsDirective {
5963
6159
  getHlsInstance() {
5964
6160
  return this.hls;
5965
6161
  }
5966
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaHlsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5967
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.0", type: EvaHlsDirective, isStandalone: true, selector: "eva-player[evaHls]", inputs: { evaHlsSrc: { classPropertyName: "evaHlsSrc", publicName: "evaHlsSrc", isSignal: true, isRequired: true, transformFunction: null }, evaHlsHeaders: { classPropertyName: "evaHlsHeaders", publicName: "evaHlsHeaders", isSignal: true, isRequired: false, transformFunction: null }, evaHlsConfig: { classPropertyName: "evaHlsConfig", publicName: "evaHlsConfig", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["evaHls"], usesOnChanges: true, ngImport: i0 });
6162
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaHlsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6163
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: EvaHlsDirective, isStandalone: true, selector: "eva-player[evaHls]", inputs: { evaHlsSrc: { classPropertyName: "evaHlsSrc", publicName: "evaHlsSrc", isSignal: true, isRequired: true, transformFunction: null }, evaHlsHeaders: { classPropertyName: "evaHlsHeaders", publicName: "evaHlsHeaders", isSignal: true, isRequired: false, transformFunction: null }, evaHlsConfig: { classPropertyName: "evaHlsConfig", publicName: "evaHlsConfig", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["evaHls"], usesOnChanges: true, ngImport: i0 });
5968
6164
  }
5969
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: EvaHlsDirective, decorators: [{
6165
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: EvaHlsDirective, decorators: [{
5970
6166
  type: Directive,
5971
6167
  args: [{
5972
6168
  selector: 'eva-player[evaHls]',
@@ -5978,5 +6174,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
5978
6174
  * Generated bundle index. Do not edit.
5979
6175
  */
5980
6176
 
5981
- export { EvaActiveChapter, EvaBackward, EvaBuffering, EvaControlsContainer, EvaControlsDivider, EvaCueChangeDirective, EvaDashDirective, EvaForward, EvaFullscreen, EvaHlsDirective, EvaMediaEventListenersDirective, EvaMute, EvaOverlayPlay, EvaPictureInPicture, EvaPlayPause, EvaPlaybackSpeed, EvaPlayer, EvaQualitySelector, EvaScrubBar, EvaScrubBarBufferingTime, EvaScrubBarCurrentTime, EvaState, EvaSubtitleDisplay, EvaTimeDisplay, EvaTimeDisplayPipe, EvaTrackSelector, EvaUserInteractionEventsDirective, EvaVideoConfigurationDirective, EvaVideoEvent, EvaVolume, isValidTrackKind, isValidVideoEvent, transformEvaActiveChapterAria, transformEvaBackwardAria, transformEvaControlsDividerAria, transformEvaForwardAria, transformEvaFullscreenAria, transformEvaMuteAria, transformEvaOverlayPlayAria, transformEvaPictureInPictureAria, transformEvaPlayPauseAria, transformEvaPlaybackSpeedAria, transformEvaScrubBarAria, transformEvaTimeDisplayAria, transformEvaVolumeAria, validateAndTransformEvaForwardAndBackwardSeconds, validateAndTransformVolumeRange };
6177
+ export { EvaActiveChapter, EvaBackward, EvaBuffering, EvaControlsContainer, EvaControlsDivider, EvaCueChangeDirective, EvaDashDirective, EvaForward, EvaFullscreen, EvaHlsDirective, EvaKeyboardShortcuts, EvaMediaEventListenersDirective, EvaMute, EvaOverlayPlay, EvaPictureInPicture, EvaPlayPause, EvaPlaybackSpeed, EvaPlayer, EvaQualitySelector, EvaScrubBar, EvaScrubBarBufferingTime, EvaScrubBarCurrentTime, EvaState, EvaSubtitleDisplay, EvaTimeDisplay, EvaTimeDisplayPipe, EvaTrackSelector, EvaUserInteractionEventsDirective, EvaVideoConfigurationDirective, EvaVideoEvent, EvaVolume, isValidTrackKind, isValidVideoEvent, transformEvaActiveChapterAria, transformEvaBackwardAria, transformEvaControlsDividerAria, transformEvaForwardAria, transformEvaFullscreenAria, transformEvaMuteAria, transformEvaOverlayPlayAria, transformEvaPictureInPictureAria, transformEvaPlayPauseAria, transformEvaPlaybackSpeedAria, transformEvaScrubBarAria, transformEvaTimeDisplayAria, transformEvaVolumeAria, validateAndTransformEvaForwardAndBackwardSeconds, validateAndTransformVolumeRange };
5982
6178
  //# sourceMappingURL=ez-vid-ang.mjs.map