v5.1.4-beta.1

This commit is contained in:
2026-04-02 14:17:18 -04:00
6 changed files with 113 additions and 8 deletions
+11 -1
View File
@@ -121,7 +121,7 @@ var controllerButtonDefs = {
faster: { label: "", className: "" }, faster: { label: "", className: "" },
advance: { label: "", className: "rw" }, advance: { label: "", className: "rw" },
display: { label: "", className: "hideButton" }, display: { label: "", className: "hideButton" },
reset: { label: "", className: "" }, reset: { label: "\u21BB", className: "" },
fast: { label: "", className: "" }, fast: { label: "", className: "" },
settings: { label: "", className: "" }, settings: { label: "", className: "" },
pause: { label: "", className: "" }, pause: { label: "", className: "" },
@@ -778,6 +778,15 @@ function setSubtitleNudgeEnabledForVideo(video, enabled) {
function subtitleNudgeIconMarkup(isEnabled) { function subtitleNudgeIconMarkup(isEnabled) {
var action = isEnabled ? "subtitleNudgeOn" : "subtitleNudgeOff"; var action = isEnabled ? "subtitleNudgeOn" : "subtitleNudgeOff";
var custom =
tc.settings.customButtonIcons &&
tc.settings.customButtonIcons[action] &&
tc.settings.customButtonIcons[action].svg;
if (custom) {
return (
'<span class="vsc-btn-icon" aria-hidden="true">' + custom + "</span>"
);
}
if (typeof vscIconSvgString !== "function") { if (typeof vscIconSvgString !== "function") {
return isEnabled ? "✓" : "×"; return isEnabled ? "✓" : "×";
} }
@@ -1367,6 +1376,7 @@ chrome.storage.sync.get(tc.settings, function (storage) {
btn.textContent = (cdf2 && cdf2.label) || "?"; btn.textContent = (cdf2 && cdf2.label) || "?";
} }
}); });
updateSubtitleNudgeIndicator(video);
}); });
} }
}); });
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "Speeder", "name": "Speeder",
"short_name": "Speeder", "short_name": "Speeder",
"version": "5.1.3", "version": "5.1.4",
"manifest_version": 2, "manifest_version": 2,
"description": "Speed up, slow down, advance and rewind HTML5 audio/video with shortcuts (New and improved version of \"Video Speed Controller\")", "description": "Speed up, slow down, advance and rewind HTML5 audio/video with shortcuts (New and improved version of \"Video Speed Controller\")",
"homepage_url": "https://github.com/SoPat712/speeder", "homepage_url": "https://github.com/SoPat712/speeder",
+45
View File
@@ -545,6 +545,51 @@ label em {
flex-shrink: 0; flex-shrink: 0;
} }
.cb-icon.cb-icon-nudge-pair {
width: auto;
min-width: 0;
padding: 0 4px;
gap: 4px;
background: transparent;
border: none;
}
.cb-nudge-chip {
display: inline-flex;
align-items: center;
justify-content: center;
width: 22px;
height: 22px;
border-radius: 6px;
flex-shrink: 0;
color: #fff;
}
.cb-nudge-chip[data-nudge-state="on"] {
background: #4b9135;
border: 1px solid #6ec754;
}
.cb-nudge-chip[data-nudge-state="off"] {
background: #943e3e;
border: 1px solid #c06060;
}
.cb-nudge-chip .vsc-btn-icon svg,
.cb-nudge-chip svg {
width: 14px;
height: 14px;
flex-shrink: 0;
}
.cb-nudge-sep {
font-size: 11px;
font-weight: 600;
opacity: 0.45;
color: var(--text);
flex-shrink: 0;
}
.row-lucide-pair select { .row-lucide-pair select {
justify-self: end; justify-self: end;
} }
+5 -3
View File
@@ -382,9 +382,11 @@
rel="noopener noreferrer" rel="noopener noreferrer"
>Lucide</a >Lucide</a
> >
set (fetched from jsDelivr). Chosen SVGs are cached in local set (fetched from jsDelivr). Custom icons are cached in local
storage and included in settings export. storage and included when you export settings. Subtitle nudge
<strong>Reset speed</strong> stays numeric text only. icons use two menu entries (enabled and disabled), not the bar
block id
<code>nudge</code>.
</p> </p>
</div> </div>
<div class="row row-lucide-pair"> <div class="row row-lucide-pair">
+50 -2
View File
@@ -138,7 +138,7 @@ var controllerButtonDefs = {
faster: { icon: "+", name: "Increase speed" }, faster: { icon: "+", name: "Increase speed" },
advance: { icon: "\u00BB", name: "Advance" }, advance: { icon: "\u00BB", name: "Advance" },
display: { icon: "\u00D7", name: "Close controller" }, display: { icon: "\u00D7", name: "Close controller" },
reset: { icon: "", name: "Reset speed" }, reset: { icon: "\u21BB", name: "Reset speed" },
fast: { icon: "\u2605", name: "Preferred speed" }, fast: { icon: "\u2605", name: "Preferred speed" },
nudge: { icon: "\u2713", name: "Subtitle nudge" }, nudge: { icon: "\u2713", name: "Subtitle nudge" },
settings: { icon: "\u2699", name: "Settings" }, settings: { icon: "\u2699", name: "Settings" },
@@ -149,6 +149,12 @@ var controllerButtonDefs = {
}; };
var popupExcludedButtonIds = new Set(["settings"]); var popupExcludedButtonIds = new Set(["settings"]);
/** Lucide picker only — not control-bar blocks (chip uses subtitleNudgeOn/Off). */
var lucideSubtitleNudgeActionLabels = {
subtitleNudgeOn: "Subtitle nudge — enabled",
subtitleNudgeOff: "Subtitle nudge — disabled"
};
function sanitizePopupButtonOrder(buttonIds) { function sanitizePopupButtonOrder(buttonIds) {
if (!Array.isArray(buttonIds)) return []; if (!Array.isArray(buttonIds)) return [];
var seen = new Set(); var seen = new Set();
@@ -166,6 +172,39 @@ var customButtonIconsLive = {};
function fillControlBarIconElement(icon, buttonId) { function fillControlBarIconElement(icon, buttonId) {
if (!icon || !buttonId) return; if (!icon || !buttonId) return;
if (buttonId === "nudge") {
icon.innerHTML = "";
icon.className = "cb-icon cb-icon-nudge-pair";
function nudgeChipMarkup(action) {
var c = customButtonIconsLive[action];
if (c && c.svg) return c.svg;
if (typeof vscIconSvgString === "function") {
return vscIconSvgString(action, 14) || "";
}
return "";
}
function appendChip(action, stateKey) {
var sp = document.createElement("span");
sp.className = "cb-nudge-chip";
sp.setAttribute("data-nudge-state", stateKey);
var inner = nudgeChipMarkup(action);
if (inner) {
var wrap = document.createElement("span");
wrap.className = "vsc-btn-icon";
wrap.innerHTML = inner;
sp.appendChild(wrap);
}
icon.appendChild(sp);
}
appendChip("subtitleNudgeOn", "on");
var sep = document.createElement("span");
sep.className = "cb-nudge-sep";
sep.textContent = "/";
icon.appendChild(sep);
appendChip("subtitleNudgeOff", "off");
return;
}
icon.className = "cb-icon";
var custom = customButtonIconsLive[buttonId]; var custom = customButtonIconsLive[buttonId];
if (custom && custom.svg) { if (custom && custom.svg) {
icon.innerHTML = custom.svg; icon.innerHTML = custom.svg;
@@ -1357,7 +1396,16 @@ function initLucideButtonIconsUI() {
actionSel.dataset.lucideInit = "1"; actionSel.dataset.lucideInit = "1";
actionSel.innerHTML = ""; actionSel.innerHTML = "";
Object.keys(controllerButtonDefs).forEach(function (aid) { Object.keys(controllerButtonDefs).forEach(function (aid) {
if (aid === "reset") return; if (aid === "nudge") {
Object.keys(lucideSubtitleNudgeActionLabels).forEach(function (subId) {
var o2 = document.createElement("option");
o2.value = subId;
o2.textContent =
lucideSubtitleNudgeActionLabels[subId] + " (" + subId + ")";
actionSel.appendChild(o2);
});
return;
}
var o = document.createElement("option"); var o = document.createElement("option");
o.value = aid; o.value = aid;
o.textContent = o.textContent =
+1 -1
View File
@@ -8,7 +8,7 @@ document.addEventListener("DOMContentLoaded", function () {
faster: { label: "", className: "" }, faster: { label: "", className: "" },
advance: { label: "", className: "rw" }, advance: { label: "", className: "rw" },
display: { label: "", className: "hideButton" }, display: { label: "", className: "hideButton" },
reset: { label: "", className: "" }, reset: { label: "\u21BB", className: "" },
fast: { label: "", className: "" }, fast: { label: "", className: "" },
nudge: { label: "", className: "" }, nudge: { label: "", className: "" },
settings: { label: "", className: "" }, settings: { label: "", className: "" },