avbridge 2.8.1 → 2.8.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.
package/dist/player.d.cts CHANGED
@@ -300,7 +300,7 @@ interface AvbridgeVideoElementEventMap {
300
300
  */
301
301
 
302
302
  declare class AvbridgePlayerElement extends HTMLElement {
303
- static readonly observedAttributes: ("src" | "muted" | "autoplay" | "loop" | "preload" | "poster" | "playsinline" | "crossorigin" | "disableremoteplayback" | "preferstrategy" | "fit")[];
303
+ static readonly observedAttributes: ("src" | "muted" | "autoplay" | "loop" | "preload" | "poster" | "playsinline" | "crossorigin" | "disableremoteplayback" | "preferstrategy" | "fit" | "show-fit")[];
304
304
  private _video;
305
305
  private _playBtn;
306
306
  private _overlayBtn;
@@ -332,6 +332,7 @@ declare class AvbridgePlayerElement extends HTMLElement {
332
332
  private _statsInterval;
333
333
  private _eventCleanup;
334
334
  private _updateToolbarEmpty;
335
+ private _toolbarTop;
335
336
  constructor();
336
337
  private _template;
337
338
  private _bindEvents;
package/dist/player.d.ts CHANGED
@@ -300,7 +300,7 @@ interface AvbridgeVideoElementEventMap {
300
300
  */
301
301
 
302
302
  declare class AvbridgePlayerElement extends HTMLElement {
303
- static readonly observedAttributes: ("src" | "muted" | "autoplay" | "loop" | "preload" | "poster" | "playsinline" | "crossorigin" | "disableremoteplayback" | "preferstrategy" | "fit")[];
303
+ static readonly observedAttributes: ("src" | "muted" | "autoplay" | "loop" | "preload" | "poster" | "playsinline" | "crossorigin" | "disableremoteplayback" | "preferstrategy" | "fit" | "show-fit")[];
304
304
  private _video;
305
305
  private _playBtn;
306
306
  private _overlayBtn;
@@ -332,6 +332,7 @@ declare class AvbridgePlayerElement extends HTMLElement {
332
332
  private _statsInterval;
333
333
  private _eventCleanup;
334
334
  private _updateToolbarEmpty;
335
+ private _toolbarTop;
335
336
  constructor();
336
337
  private _template;
337
338
  private _bindEvents;
package/dist/player.js CHANGED
@@ -5142,8 +5142,10 @@ var PROXY_ATTRIBUTES = [
5142
5142
  "preferstrategy",
5143
5143
  "fit"
5144
5144
  ];
5145
+ var PLAYER_ATTRIBUTES = ["show-fit"];
5146
+ var FIT_MODES = ["contain", "cover", "fill"];
5145
5147
  var AvbridgePlayerElement = class extends HTMLElement {
5146
- static observedAttributes = [...PROXY_ATTRIBUTES];
5148
+ static observedAttributes = [...PROXY_ATTRIBUTES, ...PLAYER_ATTRIBUTES];
5147
5149
  // ── Internal DOM refs ──────────────────────────────────────────────────
5148
5150
  _video;
5149
5151
  _playBtn;
@@ -5180,6 +5182,7 @@ var AvbridgePlayerElement = class extends HTMLElement {
5180
5182
  _eventCleanup = [];
5181
5183
  _updateToolbarEmpty = () => {
5182
5184
  };
5185
+ _toolbarTop;
5183
5186
  // ── Constructor ────────────────────────────────────────────────────────
5184
5187
  constructor() {
5185
5188
  super();
@@ -5203,6 +5206,8 @@ var AvbridgePlayerElement = class extends HTMLElement {
5203
5206
  this._statsEl = shadow.querySelector(".avp-stats");
5204
5207
  this._rippleLeft = shadow.querySelector(".avp-ripple-left");
5205
5208
  this._rippleRight = shadow.querySelector(".avp-ripple-right");
5209
+ this._toolbarTop = shadow.querySelector('[part="toolbar-top"]');
5210
+ this._toolbarTop.setAttribute("data-visible", "true");
5206
5211
  const slots = shadow.querySelectorAll('slot[name="top-left"], slot[name="top-right"]');
5207
5212
  this._updateToolbarEmpty = () => {
5208
5213
  const hasContent = Array.from(slots).some((s) => s.assignedNodes({ flatten: true }).length > 0);
@@ -5386,6 +5391,12 @@ var AvbridgePlayerElement = class extends HTMLElement {
5386
5391
  }
5387
5392
  attributeChangedCallback(name, _old, value) {
5388
5393
  if (!this._video) return;
5394
+ if (PLAYER_ATTRIBUTES.includes(name)) {
5395
+ if (name === "show-fit" && this._settingsOpen) {
5396
+ this._buildSettingsMenu();
5397
+ }
5398
+ return;
5399
+ }
5389
5400
  if (value == null) this._video.removeAttribute(name);
5390
5401
  else this._video.setAttribute(name, value);
5391
5402
  }
@@ -5508,6 +5519,16 @@ var AvbridgePlayerElement = class extends HTMLElement {
5508
5519
  }
5509
5520
  _buildSettingsMenu() {
5510
5521
  const sections = [];
5522
+ if (this.hasAttribute("show-fit")) {
5523
+ const currentFit = this._video.fit ?? "contain";
5524
+ let fitItems = "";
5525
+ for (const mode of FIT_MODES) {
5526
+ const active = mode === currentFit;
5527
+ const label = mode[0].toUpperCase() + mode.slice(1);
5528
+ fitItems += `<div class="avp-settings-item${active ? " active" : ""}" data-fit="${mode}">${label}</div>`;
5529
+ }
5530
+ sections.push(`<div class="avp-settings-section"><div class="avp-settings-label">Fit</div>${fitItems}</div>`);
5531
+ }
5511
5532
  const currentRate = this._video.playbackRate ?? 1;
5512
5533
  let speedItems = "";
5513
5534
  for (const spd of PLAYBACK_SPEEDS) {
@@ -5534,6 +5555,14 @@ var AvbridgePlayerElement = class extends HTMLElement {
5534
5555
  }
5535
5556
  sections.push(`<div class="avp-settings-section"><div class="avp-settings-item" data-stats>Stats for nerds</div></div>`);
5536
5557
  this._settingsMenu.innerHTML = sections.join("");
5558
+ for (const item of this._settingsMenu.querySelectorAll("[data-fit]")) {
5559
+ item.addEventListener("click", (e) => {
5560
+ e.stopPropagation();
5561
+ const mode = item.dataset.fit;
5562
+ this.setAttribute("fit", mode);
5563
+ this._buildSettingsMenu();
5564
+ });
5565
+ }
5537
5566
  for (const item of this._settingsMenu.querySelectorAll("[data-speed]")) {
5538
5567
  item.addEventListener("click", (e) => {
5539
5568
  e.stopPropagation();
@@ -5619,6 +5648,7 @@ var AvbridgePlayerElement = class extends HTMLElement {
5619
5648
  // ── Controls: auto-hide ────────────────────────────────────────────────
5620
5649
  _showControls() {
5621
5650
  this.removeAttribute("data-controls-hidden");
5651
+ this._toolbarTop.setAttribute("data-visible", "true");
5622
5652
  this._scheduleHide();
5623
5653
  }
5624
5654
  _scheduleHide() {
@@ -5628,6 +5658,7 @@ var AvbridgePlayerElement = class extends HTMLElement {
5628
5658
  this._controlsTimer = setTimeout(() => {
5629
5659
  if (this._state === "playing") {
5630
5660
  this.setAttribute("data-controls-hidden", "");
5661
+ this._toolbarTop.setAttribute("data-visible", "false");
5631
5662
  }
5632
5663
  }, CONTROLS_HIDE_MS);
5633
5664
  }