eb-player 2.4.0 → 2.4.2

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.
@@ -3342,12 +3342,18 @@
3342
3342
  here — it cancels the native mirroring. Only elements positioned with a
3343
3343
  physical inline style (chapter markers use right: N% under RTL) need an
3344
3344
  explicit override.
3345
+
3346
+ Both overrides below MUST stay anchored to .eb-player[dir="rtl"]. As bare
3347
+ [dir="rtl"] descendant selectors they also matched through an ancestor —
3348
+ inside an RTL document (<html dir="rtl">) they fired even when the player
3349
+ itself was LTR, mirroring the markers and volume thumb while Seekbar and
3350
+ VolumeControl used their LTR pointer maths. Never widen these back.
3345
3351
  ============================================================ */
3346
- [dir="rtl"] .eb-chapter-marker {
3352
+ .eb-player[dir="rtl"] .eb-chapter-marker {
3347
3353
  --eb-chapter-marker-x: 50%;
3348
3354
  }
3349
3355
 
3350
- [dir="rtl"] .eb-volume-thumb {
3356
+ .eb-player[dir="rtl"] .eb-volume-thumb {
3351
3357
  --eb-volume-thumb-x: 50%;
3352
3358
  }
3353
3359
 
@@ -4,7 +4,7 @@
4
4
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.EBPlayer = {}));
5
5
  })(this, (function (exports) { 'use strict';
6
6
 
7
- var __EB_PLAYER_VERSION__ = "2.4.0";
7
+ var __EB_PLAYER_VERSION__ = "2.4.2";
8
8
 
9
9
  /**
10
10
  * Finite State Machine for player playback state transitions.
@@ -3122,7 +3122,7 @@
3122
3122
  return b `
3123
3123
  <div
3124
3124
  class="eb-player${isIOS ? ' eb-ios-native' : ''}"
3125
- dir="${isRtl ? 'rtl' : ''}"
3125
+ dir="${isRtl ? 'rtl' : 'ltr'}"
3126
3126
  >
3127
3127
  <video
3128
3128
  class="eb-video"
@@ -3434,20 +3434,20 @@
3434
3434
  inner.classList.toggle('eb-ad-playing', this.state.adPlaying);
3435
3435
  }
3436
3436
  /**
3437
- * Applies or removes the dir=rtl attribute without full re-render.
3437
+ * Writes a concrete dir attribute without full re-render.
3438
3438
  * More efficient than re-rendering the entire template for a simple attribute change.
3439
+ *
3440
+ * Always asserts a direction — never removes the attribute. `dir` is an enumerated
3441
+ * attribute: absent and `""` both mean "inherit from the ancestor", so removing it
3442
+ * inside an RTL document (`<html dir="rtl">`) left the player mirrored by inheritance
3443
+ * while Seekbar/VolumeControl had already switched to their LTR pointer maths. The
3444
+ * player element is the authoritative direction root in BOTH states.
3439
3445
  */
3440
3446
  applyRtl() {
3441
3447
  const inner = this.el?.firstElementChild;
3442
3448
  if (inner == null)
3443
3449
  return;
3444
- const isRtl = this.state.isRtl;
3445
- if (isRtl) {
3446
- inner.setAttribute('dir', 'rtl');
3447
- }
3448
- else {
3449
- inner.removeAttribute('dir');
3450
- }
3450
+ inner.setAttribute('dir', this.state.isRtl ? 'rtl' : 'ltr');
3451
3451
  }
3452
3452
  invokeExtensions() {
3453
3453
  const config = this.config;
@@ -6651,7 +6651,7 @@
6651
6651
  return;
6652
6652
  this.eventState = state;
6653
6653
  const { Events } = Hls;
6654
- driver.on(Events.MANIFEST_LOADED, this._onManifestLoaded.bind(this));
6654
+ driver.on(Events.MANIFEST_PARSED, this._onManifestParsed.bind(this));
6655
6655
  driver.on(Events.LEVEL_LOADED, this._onLevelLoaded.bind(this));
6656
6656
  driver.on(Events.LEVEL_SWITCHED, this._onLevelSwitched.bind(this));
6657
6657
  driver.on(Events.AUDIO_TRACKS_UPDATED, this._onAudioTracksUpdated.bind(this));
@@ -6696,7 +6696,19 @@
6696
6696
  }
6697
6697
  this.bus?.emit('load-never-started', { src });
6698
6698
  }
6699
- _onManifestLoaded(_event, data) {
6699
+ /**
6700
+ * Populates the quality menu from MANIFEST_PARSED — never MANIFEST_LOADED.
6701
+ *
6702
+ * MANIFEST_LOADED carries the levels in raw manifest order. hls.js then
6703
+ * builds a separate array (filtering audio-only and redundant variants) and
6704
+ * sorts it lowest-to-highest; that sorted array becomes `hls.levels`, and it
6705
+ * is the index space of `driver.currentLevel` (see setQuality) and of
6706
+ * LEVEL_SWITCHED.level. Labelling from manifest order while selecting in
6707
+ * sorted order silently inverts the menu on any manifest that lists its
6708
+ * variants highest-first. MANIFEST_PARSED carries that same sorted array, so
6709
+ * label and index always agree.
6710
+ */
6711
+ _onManifestParsed(_event, data) {
6700
6712
  const state = this.eventState;
6701
6713
  const driver = this.driver;
6702
6714
  if (!state)