saltfish 0.3.74 → 0.3.75

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.
@@ -5272,6 +5272,19 @@ function createDevicePlaybackHandler(deviceInfo) {
5272
5272
  return new DesktopPlaybackHandler(deviceInfo);
5273
5273
  }
5274
5274
  }
5275
+ const ICON_CLOSE = `<svg width="18" height="18" viewBox="0 0 256 256" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"/></svg>`;
5276
+ const ICON_PLUS = `<svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12 5v14M5 12h14" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`;
5277
+ const ICON_PLAY = `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8 5v14l11-7z" fill="currentColor"/></svg>`;
5278
+ const ICON_SPEAKER = `<svg width="18" height="18" viewBox="0 0 256 256" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M155.51,24.81a8,8,0,0,0-8.42.88L77.25,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V32A8,8,0,0,0,155.51,24.81ZM32,96H72v64H32ZM144,207.64,88,164.09V91.91l56-43.55Zm54-106.08a40,40,0,0,1,0,52.88,8,8,0,0,1-12-10.58,24,24,0,0,0,0-31.72,8,8,0,0,1,12-10.58ZM248,128a79.9,79.9,0,0,1-20.37,53.34,8,8,0,0,1-11.92-10.67,64,64,0,0,0,0-85.33,8,8,0,1,1,11.92-10.67A79.83,79.83,0,0,1,248,128Z"/></svg>`;
5279
+ const ICON_SPEAKER_MUTED = `<svg width="18" height="18" viewBox="0 0 256 256" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M155.51,24.81a8,8,0,0,0-8.42.88L77.25,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V32A8,8,0,0,0,155.51,24.81ZM32,96H72v64H32ZM144,207.64,88,164.09V91.91l56-43.55Zm101.66-61.3a8,8,0,0,1-11.32,11.32L216,139.31l-18.34,18.35a8,8,0,0,1-11.32-11.32L204.69,128l-18.35-18.34a8,8,0,0,1,11.32-11.32L216,116.69l18.34-18.35a8,8,0,0,1,11.32,11.32L227.31,128Z"/></svg>`;
5280
+ const ICON_CC = `<svg width="18" height="18" viewBox="0 0 256 256" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48Zm0,144H32V64H224V192ZM118.92,151.71A8,8,0,0,1,116,162.64a40,40,0,1,1,0-69.28,8,8,0,1,1-8,13.85,24,24,0,1,0,0,41.58A8,8,0,0,1,118.92,151.71Zm80,0A8,8,0,0,1,196,162.64a40,40,0,1,1,0-69.28,8,8,0,1,1-8,13.85,24,24,0,1,0,0,41.58A8,8,0,0,1,198.92,151.71Z"/></svg>`;
5281
+ const ICON_CC_DISABLED = `<svg width="18" height="18" viewBox="0 0 256 256" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48Zm0,144H32V64H224V192ZM118.92,151.71A8,8,0,0,1,116,162.64a40,40,0,1,1,0-69.28,8,8,0,1,1-8,13.85,24,24,0,1,0,0,41.58A8,8,0,0,1,118.92,151.71Zm80,0A8,8,0,0,1,196,162.64a40,40,0,1,1,0-69.28,8,8,0,1,1-8,13.85,24,24,0,1,0,0,41.58A8,8,0,0,1,198.92,151.71Z"/><line x1="48" y1="48" x2="208" y2="208" stroke="currentColor" stroke-width="16" stroke-linecap="round"/></svg>`;
5282
+ const ICON_CURSOR = `<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 24 24" fill="none"><defs><filter id="cursor-shadow" x="-50%" y="-50%" width="200%" height="200%"><feDropShadow dx="0" dy="1" stdDeviation="1.2" flood-color="rgba(0, 0, 0, 0.22)"/></filter></defs><path d="M3.5 3.5L10.5 20.5L13.3 13.3L20.5 10.5L3.5 3.5Z" fill="#ff7614" stroke="white" stroke-width="0.7" stroke-linejoin="round" stroke-linecap="round" filter="url(#cursor-shadow)"/></svg>`;
5283
+ const ICON_LOADING_SPINNER = `<svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg"><g transform="translate(10, 10) scale(0.656)"><g clip-path="url(#saltfish-clip)"><path d="M61.0002 30.1906C61.0002 46.8644 47.4834 60.3812 30.8097 60.3812C14.136 60.3812 27.1659 46.8644 27.1659 30.1906C27.1659 13.5168 14.136 0 30.8097 0C47.4834 0 61.0002 13.5168 61.0002 30.1906Z" fill="black" fill-opacity="0.9"/><path d="M24.13 29.8618C24.13 40.3565 15.6978 48.8642 5.29602 48.8642C-5.10576 48.8642 3.02294 40.3565 3.02294 29.8618C3.02294 19.3671 -5.10576 10.8594 5.29602 10.8594C15.6978 10.8594 24.13 19.3671 24.13 29.8618Z" fill="black" fill-opacity="0.9"/></g><defs><clipPath id="saltfish-clip"><rect width="61" height="61" fill="white"/></clipPath></defs></g><circle cx="30" cy="30" r="28" stroke="black" stroke-width="2" fill="none" stroke-linecap="round" stroke-dasharray="8 6" stroke-opacity="0.3"><animateTransform attributeName="transform" type="rotate" values="0 30 30;360 30 30" dur="2s" repeatCount="indefinite"/></circle></svg>`;
5284
+ const ICON_SPEAKER_OUTLINE = `<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5" fill="none"/><path d="M15 9c0.8 0.8 1.5 1.9 1.5 3s-0.7 2.2-1.5 3" stroke="currentColor"/><path d="M19 7c1.6 1.6 2.5 3.8 2.5 6s-0.9 4.4-2.5 6" stroke="currentColor"/></svg>`;
5285
+ function createCloseIcon(size = 18) {
5286
+ return `<svg width="${size}" height="${size}" viewBox="0 0 256 256" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"/></svg>`;
5287
+ }
5275
5288
  class VideoControlsUI {
5276
5289
  constructor(container, deviceHandler, callbacks) {
5277
5290
  // Container and control elements
@@ -5368,13 +5381,7 @@ class VideoControlsUI {
5368
5381
  this.muteButton = document.createElement("button");
5369
5382
  this.muteButton.className = "sf-video-container__mute-button";
5370
5383
  this.deviceHandler.configureControlElement(this.muteButton);
5371
- this.muteButton.innerHTML = `
5372
- <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
5373
- <polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5" fill="none"></polygon>
5374
- <path d="M15 9c0.8 0.8 1.5 1.9 1.5 3s-0.7 2.2-1.5 3" stroke="currentColor"></path>
5375
- <path d="M19 7c1.6 1.6 2.5 3.8 2.5 6s-0.9 4.4-2.5 6" stroke="currentColor"></path>
5376
- </svg>
5377
- `;
5384
+ this.muteButton.innerHTML = ICON_SPEAKER_OUTLINE;
5378
5385
  if (controlsConfig.useTouch) {
5379
5386
  this.muteButton.addEventListener("touchend", (event) => {
5380
5387
  event.preventDefault();
@@ -5565,17 +5572,9 @@ class VideoControlsUI {
5565
5572
  const store = getSaltfishStore();
5566
5573
  const isMuted = store.isMuted;
5567
5574
  if (isMuted) {
5568
- this.muteButton.innerHTML = `
5569
- <svg width="18" height="18" viewBox="0 0 256 256" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
5570
- <path d="M155.51,24.81a8,8,0,0,0-8.42.88L77.25,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V32A8,8,0,0,0,155.51,24.81ZM32,96H72v64H32ZM144,207.64,88,164.09V91.91l56-43.55Zm101.66-61.3a8,8,0,0,1-11.32,11.32L216,139.31l-18.34,18.35a8,8,0,0,1-11.32-11.32L204.69,128l-18.35-18.34a8,8,0,0,1,11.32-11.32L216,116.69l18.34-18.35a8,8,0,0,1,11.32,11.32L227.31,128Z"></path>
5571
- </svg>
5572
- `;
5575
+ this.muteButton.innerHTML = ICON_SPEAKER_MUTED;
5573
5576
  } else {
5574
- this.muteButton.innerHTML = `
5575
- <svg width="18" height="18" viewBox="0 0 256 256" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
5576
- <path d="M155.51,24.81a8,8,0,0,0-8.42.88L77.25,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V32A8,8,0,0,0,155.51,24.81ZM32,96H72v64H32ZM144,207.64,88,164.09V91.91l56-43.55Zm54-106.08a40,40,0,0,1,0,52.88,8,8,0,0,1-12-10.58,24,24,0,0,0,0-31.72,8,8,0,0,1,12-10.58ZM248,128a79.9,79.9,0,0,1-20.37,53.34,8,8,0,0,1-11.92-10.67,64,64,0,0,0,0-85.33,8,8,0,1,1,11.92-10.67A79.83,79.83,0,0,1,248,128Z"></path>
5577
- </svg>
5578
- `;
5577
+ this.muteButton.innerHTML = ICON_SPEAKER;
5579
5578
  }
5580
5579
  }
5581
5580
  /**
@@ -5584,18 +5583,9 @@ class VideoControlsUI {
5584
5583
  updateCCButtonIcon(isEnabled) {
5585
5584
  if (!this.ccButton) return;
5586
5585
  if (isEnabled) {
5587
- this.ccButton.innerHTML = `
5588
- <svg width="18" height="18" viewBox="0 0 256 256" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
5589
- <path d="M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48Zm0,144H32V64H224V192ZM118.92,151.71A8,8,0,0,1,116,162.64a40,40,0,1,1,0-69.28,8,8,0,1,1-8,13.85,24,24,0,1,0,0,41.58A8,8,0,0,1,118.92,151.71Zm80,0A8,8,0,0,1,196,162.64a40,40,0,1,1,0-69.28,8,8,0,1,1-8,13.85,24,24,0,1,0,0,41.58A8,8,0,0,1,198.92,151.71Z"></path>
5590
- </svg>
5591
- `;
5586
+ this.ccButton.innerHTML = ICON_CC;
5592
5587
  } else {
5593
- this.ccButton.innerHTML = `
5594
- <svg width="18" height="18" viewBox="0 0 256 256" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
5595
- <path d="M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48Zm0,144H32V64H224V192ZM118.92,151.71A8,8,0,0,1,116,162.64a40,40,0,1,1,0-69.28,8,8,0,1,1-8,13.85,24,24,0,1,0,0,41.58A8,8,0,0,1,118.92,151.71Zm80,0A8,8,0,0,1,196,162.64a40,40,0,1,1,0-69.28,8,8,0,1,1-8,13.85,24,24,0,1,0,0,41.58A8,8,0,0,1,198.92,151.71Z"></path>
5596
- <line x1="48" y1="48" x2="208" y2="208" stroke="currentColor" stroke-width="16" stroke-linecap="round"/>
5597
- </svg>
5598
- `;
5588
+ this.ccButton.innerHTML = ICON_CC_DISABLED;
5599
5589
  }
5600
5590
  }
5601
5591
  /**
@@ -7097,6 +7087,25 @@ function reportElementError(playlistId, stepId, selector, expectedElement, expec
7097
7087
  }
7098
7088
  })();
7099
7089
  }
7090
+ function parseColorToRgb(color) {
7091
+ const el = document.createElement("div");
7092
+ el.style.color = color;
7093
+ document.body.appendChild(el);
7094
+ const computed = window.getComputedStyle(el).color;
7095
+ document.body.removeChild(el);
7096
+ const match = computed.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);
7097
+ return match ? { r: +match[1], g: +match[2], b: +match[3] } : null;
7098
+ }
7099
+ function colorToRgba(color, opacity) {
7100
+ const rgb = parseColorToRgb(color);
7101
+ return rgb ? `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${opacity})` : color;
7102
+ }
7103
+ function getContrastingTextColor(bgColor) {
7104
+ const rgb = parseColorToRgb(bgColor);
7105
+ if (!rgb) return "#fff";
7106
+ const luminance = (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1e3;
7107
+ return luminance > 150 ? "#333" : "#fff";
7108
+ }
7100
7109
  class CursorManager {
7101
7110
  constructor() {
7102
7111
  __publicField(this, "cursor", null);
@@ -7585,16 +7594,7 @@ class CursorManager {
7585
7594
  this.injectCursorStyles();
7586
7595
  this.cursor = document.createElement("div");
7587
7596
  this.cursor.className = "sf-cursor";
7588
- this.cursor.innerHTML = `
7589
- <svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 24 24" fill="none">
7590
- <defs>
7591
- <filter id="cursor-shadow" x="-50%" y="-50%" width="200%" height="200%">
7592
- <feDropShadow dx="0" dy="1" stdDeviation="1.2" flood-color="rgba(0, 0, 0, 0.22)"/>
7593
- </filter>
7594
- </defs>
7595
- <path d="M3.5 3.5L10.5 20.5L13.3 13.3L20.5 10.5L3.5 3.5Z" fill="#ff7614" stroke="white" stroke-width="0.7" stroke-linejoin="round" stroke-linecap="round" filter="url(#cursor-shadow)" />
7596
- </svg>
7597
- `;
7597
+ this.cursor.innerHTML = ICON_CURSOR;
7598
7598
  this.labelElement = document.createElement("div");
7599
7599
  this.labelElement.className = "sf-cursor-label";
7600
7600
  this.selectionElement = document.createElement("div");
@@ -8466,81 +8466,17 @@ class CursorManager {
8466
8466
  const path = svg.querySelector("path");
8467
8467
  if (path) {
8468
8468
  path.setAttribute("fill", color);
8469
- } else {
8470
- console.warn("[CursorManager.setColor] No path found in SVG");
8471
8469
  }
8472
- } else {
8473
- console.warn("[CursorManager.setColor] No SVG found in cursor");
8474
8470
  }
8475
- } else {
8476
- console.warn("[CursorManager.setColor] No cursor element");
8477
8471
  }
8478
8472
  if (this.selectionElement) {
8479
8473
  this.selectionElement.style.setProperty("--sf-selection-color", color);
8480
- const rgbaBackground = this.colorToRgba(color, 0);
8481
- this.selectionElement.style.setProperty("--sf-selection-bg-color", rgbaBackground);
8474
+ this.selectionElement.style.setProperty("--sf-selection-bg-color", colorToRgba(color, 0));
8482
8475
  }
8483
8476
  if (this.labelElement) {
8484
8477
  this.labelElement.style.setProperty("--sf-cursor-label-bg", color);
8485
- const textColor = this.getContrastingTextColor(color);
8486
- this.labelElement.style.setProperty("--sf-cursor-label-text", textColor);
8487
- }
8488
- }
8489
- /**
8490
- * Calculates whether white or black text provides better contrast against a background color
8491
- * Uses relative luminance calculation for accessibility
8492
- * @param bgColor - The background color (hex, rgb, etc)
8493
- * @returns '#fff' for dark backgrounds, '#333' for light backgrounds
8494
- */
8495
- getContrastingTextColor(bgColor) {
8496
- const rgb = this.parseColorToRgb(bgColor);
8497
- if (!rgb) {
8498
- return "#fff";
8478
+ this.labelElement.style.setProperty("--sf-cursor-label-text", getContrastingTextColor(color));
8499
8479
  }
8500
- const luminance = (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1e3;
8501
- return luminance > 150 ? "#333" : "#fff";
8502
- }
8503
- /**
8504
- * Parses a color string to RGB values
8505
- * @param color - The color to parse (hex, rgb, rgba)
8506
- * @returns RGB object or null if parsing fails
8507
- */
8508
- parseColorToRgb(color) {
8509
- const tempElement = document.createElement("div");
8510
- tempElement.style.color = color;
8511
- document.body.appendChild(tempElement);
8512
- const computedColor = window.getComputedStyle(tempElement).color;
8513
- document.body.removeChild(tempElement);
8514
- const rgbMatch = computedColor.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);
8515
- if (rgbMatch) {
8516
- return {
8517
- r: parseInt(rgbMatch[1], 10),
8518
- g: parseInt(rgbMatch[2], 10),
8519
- b: parseInt(rgbMatch[3], 10)
8520
- };
8521
- }
8522
- return null;
8523
- }
8524
- /**
8525
- * Converts a color string (hex, rgb, rgba) to rgba format with specified opacity
8526
- * @param color - The color to convert
8527
- * @param opacity - The opacity value (0-1)
8528
- * @returns rgba color string
8529
- */
8530
- colorToRgba(color, opacity) {
8531
- const tempElement = document.createElement("div");
8532
- tempElement.style.color = color;
8533
- document.body.appendChild(tempElement);
8534
- const computedColor = window.getComputedStyle(tempElement).color;
8535
- document.body.removeChild(tempElement);
8536
- const rgbMatch = computedColor.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);
8537
- if (rgbMatch) {
8538
- const r = rgbMatch[1];
8539
- const g = rgbMatch[2];
8540
- const b = rgbMatch[3];
8541
- return `rgba(${r}, ${g}, ${b}, ${opacity})`;
8542
- }
8543
- return color;
8544
8480
  }
8545
8481
  /**
8546
8482
  * Sets the label text to display beside the cursor
@@ -11527,11 +11463,7 @@ class MinimizeButton {
11527
11463
  this.playerElement = playerElement;
11528
11464
  this.button = document.createElement("button");
11529
11465
  this.button.className = "sf-player__minimize-button";
11530
- this.button.innerHTML = `
11531
- <svg width="20" height="20" viewBox="0 0 256 256" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
11532
- <path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"></path>
11533
- </svg>
11534
- `;
11466
+ this.button.innerHTML = createCloseIcon(20);
11535
11467
  this.button.addEventListener("click", this.handleClick.bind(this));
11536
11468
  this.playerElement.appendChild(this.button);
11537
11469
  this.updateVisibility(getSaltfishStore().isMinimized);
@@ -11551,18 +11483,10 @@ class MinimizeButton {
11551
11483
  }
11552
11484
  }
11553
11485
  minimize() {
11554
- this.button.innerHTML = `
11555
- <svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
11556
- <path d="M12 5v14M5 12h14" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
11557
- </svg>
11558
- `;
11486
+ this.button.innerHTML = ICON_PLUS;
11559
11487
  }
11560
11488
  maximize() {
11561
- this.button.innerHTML = `
11562
- <svg width="20" height="20" viewBox="0 0 256 256" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
11563
- <path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"></path>
11564
- </svg>
11565
- `;
11489
+ this.button.innerHTML = createCloseIcon(20);
11566
11490
  }
11567
11491
  updateVisibility(isMinimized) {
11568
11492
  if (isMinimized) {
@@ -11588,11 +11512,7 @@ class PlayPauseButton {
11588
11512
  createButton() {
11589
11513
  this.playButton = document.createElement("button");
11590
11514
  this.playButton.className = "sf-controls-container__play-button";
11591
- this.playButton.innerHTML = `
11592
- <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
11593
- <path d="M8 5v14l11-7z" fill="currentColor"/>
11594
- </svg>
11595
- `;
11515
+ this.playButton.innerHTML = ICON_PLAY;
11596
11516
  this.playButton.addEventListener("click", this.handlePlayClick.bind(this));
11597
11517
  this.container.appendChild(this.playButton);
11598
11518
  }
@@ -11644,11 +11564,7 @@ class ExitButton {
11644
11564
  this.playerElement = playerElement;
11645
11565
  this.button = document.createElement("button");
11646
11566
  this.button.className = "sf-player__exit-button";
11647
- this.button.innerHTML = `
11648
- <svg width="18" height="18" viewBox="0 0 256 256" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
11649
- <path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"></path>
11650
- </svg>
11651
- `;
11567
+ this.button.innerHTML = ICON_CLOSE;
11652
11568
  this.button.addEventListener("click", this.handleClick.bind(this));
11653
11569
  this.playerElement.appendChild(this.button);
11654
11570
  this.updateVisibility(getSaltfishStore().isMinimized);
@@ -11790,34 +11706,7 @@ class LoadingSpinner {
11790
11706
  this.spinnerElement.className = `${CSS_CLASSES.LOADING_SPINNER}`;
11791
11707
  this.spinnerElement.innerHTML = `
11792
11708
  <div class="sf-loading-spinner__content">
11793
- <div class="sf-loading-spinner__icon">
11794
- <svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
11795
- <!-- Static Saltfish logo in center -->
11796
- <g transform="translate(10, 10) scale(0.656)">
11797
- <g clip-path="url(#saltfish-clip)">
11798
- <path d="M61.0002 30.1906C61.0002 46.8644 47.4834 60.3812 30.8097 60.3812C14.136 60.3812 27.1659 46.8644 27.1659 30.1906C27.1659 13.5168 14.136 0 30.8097 0C47.4834 0 61.0002 13.5168 61.0002 30.1906Z" fill="black" fill-opacity="0.9"/>
11799
- <path d="M24.13 29.8618C24.13 40.3565 15.6978 48.8642 5.29602 48.8642C-5.10576 48.8642 3.02294 40.3565 3.02294 29.8618C3.02294 19.3671 -5.10576 10.8594 5.29602 10.8594C15.6978 10.8594 24.13 19.3671 24.13 29.8618Z" fill="black" fill-opacity="0.9"/>
11800
- </g>
11801
- <defs>
11802
- <clipPath id="saltfish-clip">
11803
- <rect width="61" height="61" fill="white"/>
11804
- </clipPath>
11805
- </defs>
11806
- </g>
11807
-
11808
- <!-- Animated circular ring around logo -->
11809
- <circle cx="30" cy="30" r="28"
11810
- stroke="black" stroke-width="2"
11811
- fill="none" stroke-linecap="round"
11812
- stroke-dasharray="8 6" stroke-opacity="0.3">
11813
- <animateTransform attributeName="transform"
11814
- type="rotate"
11815
- values="0 30 30;360 30 30"
11816
- dur="2s"
11817
- repeatCount="indefinite"/>
11818
- </circle>
11819
- </svg>
11820
- </div>
11709
+ <div class="sf-loading-spinner__icon">${ICON_LOADING_SPINNER}</div>
11821
11710
  <div class="sf-loading-spinner__text">Loading playlist...</div>
11822
11711
  </div>
11823
11712
  `;
@@ -12743,7 +12632,7 @@ const SaltfishPlayer$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.de
12743
12632
  __proto__: null,
12744
12633
  SaltfishPlayer
12745
12634
  }, Symbol.toStringTag, { value: "Module" }));
12746
- const version = "0.3.74";
12635
+ const version = "0.3.75";
12747
12636
  const packageJson = {
12748
12637
  version
12749
12638
  };