瀏覽代碼

ref: comment

Sv443 1 年之前
父節點
當前提交
52f65431c9
共有 2 個文件被更改,包括 81 次插入93 次删除
  1. 80 93
      dist/BetterYTM.user.js
  2. 1 0
      src/config.ts

+ 80 - 93
dist/BetterYTM.user.js

@@ -17,7 +17,7 @@
 // @license           AGPL-3.0-only
 // @author            Sv443
 // @copyright         Sv443 (https://github.com/Sv443)
-// @icon              https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/logo/logo_48.png?b=1935fb7
+// @icon              http://localhost:8710/assets/images/logo/logo_48.png?b=8230de17-5e78-46d3-a0a0-68380f953b2b
 // @match             https://music.youtube.com/*
 // @match             https://www.youtube.com/*
 // @run-at            document-start
@@ -34,35 +34,35 @@
 // @grant             GM.xmlHttpRequest
 // @grant             unsafeWindow
 // @noframes
-// @resource          css-anchor_improvements https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/style/anchorImprovements.css?b=1935fb7
-// @resource          css-fix_spacing         https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/style/fixSpacing.css?b=1935fb7
-// @resource          doc-changelog           https://raw.githubusercontent.com/Sv443/BetterYTM/develop/changelog.md?b=1935fb7
-// @resource          icon-advanced_mode      https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/plus_circle_small.svg?b=1935fb7
-// @resource          icon-arrow_down         https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/arrow_down.svg?b=1935fb7
-// @resource          icon-delete             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/delete.svg?b=1935fb7
-// @resource          icon-error              https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/error.svg?b=1935fb7
-// @resource          icon-experimental       https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/beaker_small.svg?b=1935fb7
-// @resource          icon-globe              https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/globe.svg?b=1935fb7
-// @resource          icon-help               https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/help.svg?b=1935fb7
-// @resource          icon-lock               https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/lock.svg?b=1935fb7
-// @resource          icon-lyrics             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/lyrics.svg?b=1935fb7
-// @resource          icon-skip_to            https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/skip_to.svg?b=1935fb7
-// @resource          icon-spinner            https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/spinner.svg?b=1935fb7
-// @resource          img-logo                https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/logo/logo_48.png?b=1935fb7
-// @resource          img-close               https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/close.png?b=1935fb7
-// @resource          img-discord             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/external/discord.png?b=1935fb7
-// @resource          img-github              https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/external/github.png?b=1935fb7
-// @resource          img-greasyfork          https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/external/greasyfork.png?b=1935fb7
-// @resource          img-openuserjs          https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/external/openuserjs.png?b=1935fb7
-// @resource          trans-de_DE             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/de_DE.json?b=1935fb7
-// @resource          trans-en_US             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/en_US.json?b=1935fb7
-// @resource          trans-en_UK             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/en_UK.json?b=1935fb7
-// @resource          trans-es_ES             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/es_ES.json?b=1935fb7
-// @resource          trans-fr_FR             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/fr_FR.json?b=1935fb7
-// @resource          trans-hi_IN             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/hi_IN.json?b=1935fb7
-// @resource          trans-ja_JA             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/ja_JA.json?b=1935fb7
-// @resource          trans-pt_BR             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/pt_BR.json?b=1935fb7
-// @resource          trans-zh_CN             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/zh_CN.json?b=1935fb7
+// @resource          css-anchor_improvements http://localhost:8710/assets/style/anchorImprovements.css?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          css-fix_spacing         http://localhost:8710/assets/style/fixSpacing.css?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          doc-changelog           http://localhost:8710/changelog.md?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          icon-advanced_mode      http://localhost:8710/assets/icons/plus_circle_small.svg?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          icon-arrow_down         http://localhost:8710/assets/icons/arrow_down.svg?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          icon-delete             http://localhost:8710/assets/icons/delete.svg?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          icon-error              http://localhost:8710/assets/icons/error.svg?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          icon-experimental       http://localhost:8710/assets/icons/beaker_small.svg?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          icon-globe              http://localhost:8710/assets/icons/globe.svg?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          icon-help               http://localhost:8710/assets/icons/help.svg?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          icon-lock               http://localhost:8710/assets/icons/lock.svg?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          icon-lyrics             http://localhost:8710/assets/icons/lyrics.svg?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          icon-skip_to            http://localhost:8710/assets/icons/skip_to.svg?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          icon-spinner            http://localhost:8710/assets/icons/spinner.svg?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          img-logo                http://localhost:8710/assets/images/logo/logo_48.png?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          img-close               http://localhost:8710/assets/images/close.png?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          img-discord             http://localhost:8710/assets/images/external/discord.png?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          img-github              http://localhost:8710/assets/images/external/github.png?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          img-greasyfork          http://localhost:8710/assets/images/external/greasyfork.png?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          img-openuserjs          http://localhost:8710/assets/images/external/openuserjs.png?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          trans-de_DE             http://localhost:8710/assets/translations/de_DE.json?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          trans-en_US             http://localhost:8710/assets/translations/en_US.json?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          trans-en_UK             http://localhost:8710/assets/translations/en_UK.json?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          trans-es_ES             http://localhost:8710/assets/translations/es_ES.json?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          trans-fr_FR             http://localhost:8710/assets/translations/fr_FR.json?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          trans-hi_IN             http://localhost:8710/assets/translations/hi_IN.json?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          trans-ja_JA             http://localhost:8710/assets/translations/ja_JA.json?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          trans-pt_BR             http://localhost:8710/assets/translations/pt_BR.json?b=8230de17-5e78-46d3-a0a0-68380f953b2b
+// @resource          trans-zh_CN             http://localhost:8710/assets/translations/zh_CN.json?b=8230de17-5e78-46d3-a0a0-68380f953b2b
 // @require           https://cdn.jsdelivr.net/npm/@sv443-network/[email protected]/dist/index.global.js
 // @require           https://cdn.jsdelivr.net/npm/[email protected]/dist/fuse.basic.js
 // @require           https://cdn.jsdelivr.net/npm/[email protected]/lib/marked.umd.js
@@ -231,6 +231,19 @@ function clearNode(element) {
     while (element.hasChildNodes())
         clearNode(element.firstChild);
     element.parentNode.removeChild(element);
+}
+/** Adds interaction listeners to the passed element in an accessible way - set {@linkcode once} to true to remove the listeners after the first interaction */
+function onInteraction(elem, listener, once = false) {
+    const proxListener = (e) => {
+        if (e instanceof KeyboardEvent && !["Enter", " ", "Space", "Spacebar"].includes(e.key))
+            return;
+        e.stopPropagation();
+        once && elem.removeEventListener("click", proxListener);
+        once && elem.removeEventListener("keydown", proxListener);
+        listener(e);
+    };
+    elem.addEventListener("click", proxListener);
+    elem.addEventListener("keydown", proxListener);
 }// I know TS enums are impure but it doesn't really matter here, plus they look cooler
 var LogLevel;
 (function (LogLevel) {
@@ -239,7 +252,7 @@ var LogLevel;
 })(LogLevel || (LogLevel = {}));const modeRaw = "development";
 const branchRaw = "develop";
 const hostRaw = "github";
-const buildNumberRaw = "1935fb7";
+const buildNumberRaw = "a816936";
 /** The mode in which the script was built (production or development) */
 const mode = (modeRaw.match(/^#{{.+}}$/) ? "production" : modeRaw);
 /** The branch to use in various URLs that point to the GitHub repo */
@@ -993,8 +1006,7 @@ function createHotkeyInput({ initialValue, onChange }) {
         infoElem.innerHTML = getHotkeyInfoHtml(initialValue);
         resetElem.classList.add("bytm-hidden");
     };
-    resetElem.addEventListener("click", resetClicked);
-    resetElem.addEventListener("keydown", (e) => ["Enter", " ", "Space"].includes(e.key) && resetClicked(e));
+    onInteraction(resetElem, resetClicked);
     if (initialValue)
         infoElem.innerHTML = getHotkeyInfoHtml(initialValue);
     let lastKeyDown;
@@ -1363,18 +1375,15 @@ function renderBody({ latestTag, changelogHtml, }) {
         btnUpdate.className = "bytm-btn";
         btnUpdate.tabIndex = 0;
         btnUpdate.textContent = t("open_update_page_install_manually", hostPlatformNames[host]);
-        const btnUpdateClicked = () => {
+        onInteraction(btnUpdate, () => {
             window.open(pkg.updates[host]);
             verNotifDialog === null || verNotifDialog === void 0 ? void 0 : verNotifDialog.close();
-        };
-        btnUpdate.addEventListener("click", btnUpdateClicked);
-        btnUpdate.addEventListener("keydown", (e) => e.key === "Enter" && btnUpdateClicked());
+        });
         const btnClose = document.createElement("button");
         btnClose.className = "bytm-btn";
         btnClose.tabIndex = 0;
         btnClose.textContent = t("close_and_ignore_for_24h");
-        btnClose.addEventListener("click", () => verNotifDialog === null || verNotifDialog === void 0 ? void 0 : verNotifDialog.close());
-        btnClose.addEventListener("keydown", (e) => e.key === "Enter" && (verNotifDialog === null || verNotifDialog === void 0 ? void 0 : verNotifDialog.close()));
+        onInteraction(btnClose, () => verNotifDialog === null || verNotifDialog === void 0 ? void 0 : verNotifDialog.close());
         btnWrapper.appendChild(btnUpdate);
         btnWrapper.appendChild(btnClose);
         wrapperEl.appendChild(btnWrapper);
@@ -1499,10 +1508,10 @@ function addCfgMenu() {
         linksCont.id = "bytm-menu-linkscont";
         linksCont.role = "navigation";
         const linkTitlesShort = {
-            discord: "Discord",
             github: "GitHub",
             greasyfork: "GreasyFork",
             openuserjs: "OpenUserJS",
+            discord: "Discord",
         };
         const addLink = (imgSrc, href, title, titleKey) => {
             const anchorElem = document.createElement("a");
@@ -1528,7 +1537,6 @@ function addCfgMenu() {
             anchorElem.appendChild(extendedAnchorEl);
             linksCont.appendChild(anchorElem);
         };
-        addLink(yield getResourceUrl("img-discord"), "https://dc.sv443.net/", t("open_discord"), "discord");
         const links = [
             ["github", yield getResourceUrl("img-github"), scriptInfo.namespace, t("open_github", scriptInfo.name), "github"],
             ["greasyfork", yield getResourceUrl("img-greasyfork"), pkg.hosts.greasyfork, t("open_greasyfork", scriptInfo.name), "greasyfork"],
@@ -1539,14 +1547,14 @@ function addCfgMenu() {
         const reorderedLinks = hostLink ? [hostLink, ...otherLinks] : links;
         for (const [, ...args] of reorderedLinks)
             addLink(...args);
+        addLink(yield getResourceUrl("img-discord"), "https://dc.sv443.net/", t("open_discord"), "discord");
         const closeElem = document.createElement("img");
         closeElem.classList.add("bytm-menu-close");
         closeElem.role = "button";
         closeElem.tabIndex = 0;
         closeElem.src = yield getResourceUrl("img-close");
         closeElem.ariaLabel = closeElem.title = t("close_menu_tooltip");
-        closeElem.addEventListener("click", closeCfgMenu);
-        closeElem.addEventListener("keydown", ({ key }) => key === "Enter" && closeCfgMenu());
+        onInteraction(closeElem, closeCfgMenu);
         titleCont.appendChild(titleElem);
         titleCont.appendChild(linksCont);
         headerElem.appendChild(titleCont);
@@ -1707,13 +1715,11 @@ function addCfgMenu() {
                             helpElem.role = "button";
                             helpElem.tabIndex = 0;
                             helpElem.innerHTML = helpElemImgHtml;
-                            const helpElemClicked = (e) => {
+                            onInteraction(helpElem, (e) => {
                                 e.preventDefault();
                                 e.stopPropagation();
                                 openHelpDialog(featKey);
-                            };
-                            helpElem.addEventListener("click", helpElemClicked);
-                            helpElem.addEventListener("keydown", (e) => e.key === "Enter" && helpElemClicked(e));
+                            });
                         }
                         else {
                             error(`Couldn't create help button SVG element for feature '${featKey}'`);
@@ -1768,7 +1774,7 @@ function addCfgMenu() {
                         advCopyHiddenBtn.tabIndex = 0;
                         advCopyHiddenBtn.textContent = t("copy_hidden_value");
                         advCopyHiddenBtn.ariaLabel = advCopyHiddenBtn.title = t("copy_hidden_tooltip");
-                        const copyHiddenClicked = (e) => {
+                        const copyHiddenInteraction = (e) => {
                             e.preventDefault();
                             e.stopPropagation();
                             GM.setClipboard(String(getFeatures()[featKey]));
@@ -1780,8 +1786,7 @@ function addCfgMenu() {
                                 }, 3000);
                             }
                         };
-                        advCopyHiddenBtn.addEventListener("click", copyHiddenClicked);
-                        advCopyHiddenBtn.addEventListener("keydown", (e) => ["Enter", " ", "Space"].includes(e.key) && copyHiddenClicked(e));
+                        onInteraction(advCopyHiddenBtn, copyHiddenInteraction);
                         advCopyHiddenCont = document.createElement("span");
                         advCopyHiddenCont.appendChild(advCopyHintElem);
                         advCopyHiddenCont.appendChild(advCopyHiddenBtn);
@@ -1975,14 +1980,12 @@ function addCfgMenu() {
         versionEl.tabIndex = 0;
         versionEl.ariaLabel = versionEl.title = t("version_tooltip", scriptInfo.version, buildNumber);
         versionEl.textContent = `v${scriptInfo.version} (#${buildNumber})`;
-        const versionElemClicked = (e) => __awaiter(this, void 0, void 0, function* () {
+        onInteraction(versionEl, (e) => __awaiter(this, void 0, void 0, function* () {
             e.preventDefault();
             e.stopPropagation();
             yield openChangelogMenu("cfgMenu");
             closeCfgMenu(undefined, false);
-        });
-        versionEl.addEventListener("click", versionElemClicked);
-        versionEl.addEventListener("keydown", (e) => e.key === "Enter" && versionElemClicked(e));
+        }));
         subtitleElemCont.appendChild(versionEl);
         titleElem.appendChild(subtitleElemCont);
         const modeItems = [];
@@ -2095,8 +2098,7 @@ function openHelpDialog(featureKey) {
             closeElem.tabIndex = 0;
             closeElem.src = yield getResourceUrl("img-close");
             closeElem.ariaLabel = closeElem.title = t("close_menu_tooltip");
-            closeElem.addEventListener("click", (e) => closeHelpDialog(e));
-            closeElem.addEventListener("keydown", (e) => e.key === "Enter" && closeHelpDialog(e));
+            onInteraction(closeElem, closeHelpDialog);
             headerElem.appendChild(titleCont);
             headerElem.appendChild(closeElem);
             menuBgElem = document.createElement("div");
@@ -2210,12 +2212,10 @@ function addExportMenu() {
         closeElem.tabIndex = 0;
         closeElem.src = yield getResourceUrl("img-close");
         closeElem.ariaLabel = closeElem.title = t("close_menu_tooltip");
-        const closeExportMenuClicked = (e) => {
+        onInteraction(closeElem, (e) => {
             closeExportMenu(e);
             openCfgMenu();
-        };
-        closeElem.addEventListener("click", (e) => closeExportMenuClicked(e));
-        closeElem.addEventListener("keydown", (e) => e.key === "Enter" && closeExportMenuClicked(e));
+        });
         titleCont.appendChild(titleElem);
         headerElem.appendChild(titleCont);
         headerElem.appendChild(closeElem);
@@ -2231,14 +2231,13 @@ function addExportMenu() {
         lastUncompressedCfgString = JSON.stringify({ formatVersion, data: getFeatures() }, undefined, 2);
         textAreaElem.value = t("click_to_reveal_sensitive_info");
         textAreaElem.setAttribute("revealed", "false");
-        const textAreaClicked = () => __awaiter(this, void 0, void 0, function* () {
+        const textAreaInteraction = () => __awaiter(this, void 0, void 0, function* () {
             const cfgString = JSON.stringify({ formatVersion, data: getFeatures() });
             lastUncompressedCfgString = JSON.stringify({ formatVersion, data: getFeatures() }, undefined, 2);
             textAreaElem.value = canCompress ? yield UserUtils.compress(cfgString, compressionFormat, "string") : cfgString;
             textAreaElem.setAttribute("revealed", "true");
         });
-        textAreaElem.addEventListener("click", textAreaClicked);
-        textAreaElem.addEventListener("keydown", (e) => ["Enter", " ", "Space"].includes(e.key) && textAreaClicked());
+        onInteraction(textAreaElem, textAreaInteraction);
         siteEvents.on("configChanged", (data) => __awaiter(this, void 0, void 0, function* () {
             const textAreaElem = document.querySelector("#bytm-export-menu-textarea");
             const cfgString = JSON.stringify({ formatVersion, data });
@@ -2261,7 +2260,7 @@ function addExportMenu() {
         copiedTextElem.classList.add("bytm-menu-footer-copied");
         copiedTextElem.textContent = t("copied");
         copiedTextElem.style.display = "none";
-        const copyBtnClicked = (evt) => __awaiter(this, void 0, void 0, function* () {
+        onInteraction(copyBtnElem, (evt) => __awaiter(this, void 0, void 0, function* () {
             (evt === null || evt === void 0 ? void 0 : evt.bubbles) && evt.stopPropagation();
             GM.setClipboard(String((evt === null || evt === void 0 ? void 0 : evt.shiftKey) || (evt === null || evt === void 0 ? void 0 : evt.ctrlKey) ? lastUncompressedCfgString : yield UserUtils.compress(JSON.stringify({ formatVersion, data: getFeatures() }), compressionFormat, "string")));
             copiedTextElem.style.display = "inline-block";
@@ -2271,9 +2270,7 @@ function addExportMenu() {
                     copiedTxtTimeout = undefined;
                 }, 3000);
             }
-        });
-        copyBtnElem.addEventListener("click", copyBtnClicked);
-        copyBtnElem.addEventListener("keydown", (e) => e.key === "Enter" && copyBtnClicked(e));
+        }));
         // flex-direction is row-reverse
         footerElem.appendChild(copyBtnElem);
         footerElem.appendChild(copiedTextElem);
@@ -2376,12 +2373,10 @@ function addImportMenu() {
         closeElem.tabIndex = 0;
         closeElem.src = yield getResourceUrl("img-close");
         closeElem.ariaLabel = closeElem.title = t("close_menu_tooltip");
-        const closeImportMenuClicked = (e) => {
+        onInteraction(closeElem, (e) => {
             closeImportMenu(e);
             openCfgMenu();
-        };
-        closeElem.addEventListener("click", closeImportMenuClicked);
-        closeElem.addEventListener("keydown", (e) => e.key === "Enter" && closeImportMenuClicked(e));
+        });
         titleCont.appendChild(titleElem);
         headerElem.appendChild(titleCont);
         headerElem.appendChild(closeElem);
@@ -2557,13 +2552,11 @@ function addChangelogMenu() {
         closeElem.tabIndex = 0;
         closeElem.src = yield getResourceUrl("img-close");
         closeElem.ariaLabel = closeElem.title = t("close_menu_tooltip");
-        const closeChangelogMenuClicked = (e) => {
+        onInteraction(closeElem, (e) => {
             closeChangelogMenu(e);
             if (menuBgElem.dataset.returnTo === "cfgMenu")
                 openCfgMenu();
-        };
-        closeElem.addEventListener("click", closeChangelogMenuClicked);
-        closeElem.addEventListener("keydown", (e) => e.key === "Enter" && closeChangelogMenuClicked(e));
+        });
         titleCont.appendChild(titleElem);
         headerElem.appendChild(titleCont);
         headerElem.appendChild(closeElem);
@@ -2649,8 +2642,7 @@ function addWatermark() {
             if (!logoExchanged && (e.shiftKey || e.ctrlKey))
                 exchangeLogo();
         };
-        watermark.addEventListener("click", watermarkOpenMenu);
-        watermark.addEventListener("keydown", (e) => e.key === "Enter" && watermarkOpenMenu(e));
+        onInteraction(watermark, watermarkOpenMenu);
         onSelectorOld("ytmusic-nav-bar #left-content", {
             listener: (logoElem) => UserUtils.insertAfter(logoElem, watermark),
         });
@@ -2716,7 +2708,7 @@ function addConfigMenuOption(container) {
         cfgOptItemElem.role = "button";
         cfgOptItemElem.tabIndex = 0;
         cfgOptItemElem.ariaLabel = cfgOptItemElem.title = t("open_menu_tooltip", scriptInfo.name);
-        const cfgOptItemClicked = (e) => __awaiter(this, void 0, void 0, function* () {
+        onInteraction(cfgOptItemElem, (e) => __awaiter(this, void 0, void 0, function* () {
             const settingsBtnElem = document.querySelector("ytmusic-nav-bar ytmusic-settings-button tp-yt-paper-icon-button");
             settingsBtnElem === null || settingsBtnElem === void 0 ? void 0 : settingsBtnElem.click();
             yield UserUtils.pauseFor(20);
@@ -2724,9 +2716,7 @@ function addConfigMenuOption(container) {
                 openCfgMenu();
             if (!logoExchanged && (e.shiftKey || e.ctrlKey))
                 exchangeLogo();
-        });
-        cfgOptItemElem.addEventListener("click", cfgOptItemClicked);
-        cfgOptItemElem.addEventListener("keydown", (e) => e.key === "Enter" && cfgOptItemClicked(e));
+        }));
         const cfgOptIconElem = document.createElement("img");
         cfgOptIconElem.className = "bytm-cfg-menu-option-icon";
         cfgOptIconElem.src = yield getResourceUrl("img-logo");
@@ -3050,24 +3040,24 @@ function addScrollToActiveBtn() {
                 containerElem.id = "bytm-scroll-to-active-btn-cont";
                 const linkElem = document.createElement("div");
                 linkElem.id = "bytm-scroll-to-active-btn";
+                linkElem.tabIndex = 0;
                 linkElem.className = "ytmusic-player-bar bytm-generic-btn";
                 linkElem.ariaLabel = linkElem.title = t("scroll_to_playing");
                 linkElem.role = "button";
                 const imgElem = document.createElement("img");
                 imgElem.className = "bytm-generic-btn-img";
                 imgElem.src = yield getResourceUrl("icon-skip_to");
-                linkElem.addEventListener("click", (e) => {
+                const scrollToActiveInteraction = () => {
                     const activeItem = document.querySelector("#side-panel .ytmusic-player-queue ytmusic-player-queue-item[play-button-state=\"loading\"], #side-panel .ytmusic-player-queue ytmusic-player-queue-item[play-button-state=\"playing\"], #side-panel .ytmusic-player-queue ytmusic-player-queue-item[play-button-state=\"paused\"]");
                     if (!activeItem)
                         return;
-                    e.preventDefault();
-                    e.stopImmediatePropagation();
                     activeItem.scrollIntoView({
                         behavior: "smooth",
                         block: "center",
                         inline: "center",
                     });
-                });
+                };
+                onInteraction(linkElem, scrollToActiveInteraction);
                 linkElem.appendChild(imgElem);
                 containerElem.appendChild(linkElem);
                 tabElem.appendChild(containerElem);
@@ -3829,7 +3819,7 @@ function addQueueButtons(queueItem, containerParentSelector = ".song-info", list
             lyricsBtnElem.style.pointerEvents = "initial";
             lyricsBtnElem.role = "link";
             lyricsBtnElem.tabIndex = 0;
-            const lyricsBtnClicked = (e) => __awaiter(this, void 0, void 0, function* () {
+            onInteraction(lyricsBtnElem, (e) => __awaiter(this, void 0, void 0, function* () {
                 var _b;
                 e.preventDefault();
                 e.stopImmediatePropagation();
@@ -3900,9 +3890,7 @@ function addQueueButtons(queueItem, containerParentSelector = ".song-info", list
                     }
                 }
                 lyricsUrl && UserUtils.openInNewTab(lyricsUrl);
-            });
-            lyricsBtnElem.addEventListener("click", lyricsBtnClicked);
-            lyricsBtnElem.addEventListener("keydown", (e) => e.key === "Enter" && lyricsBtnClicked(e));
+            }));
         }
         //#SECTION delete from queue btn
         let deleteBtnElem;
@@ -3916,7 +3904,7 @@ function addQueueButtons(queueItem, containerParentSelector = ".song-info", list
             const imgElem = document.createElement("img");
             imgElem.classList.add("bytm-generic-btn-img");
             imgElem.src = deleteIconUrl;
-            const deleteBtnClicked = (e) => __awaiter(this, void 0, void 0, function* () {
+            onInteraction(deleteBtnElem, (e) => __awaiter(this, void 0, void 0, function* () {
                 e.preventDefault();
                 e.stopImmediatePropagation();
                 // container of the queue item popup menu - element gets reused for every queue item
@@ -3956,9 +3944,7 @@ function addQueueButtons(queueItem, containerParentSelector = ".song-info", list
                 finally {
                     queuePopupCont === null || queuePopupCont === void 0 ? void 0 : queuePopupCont.removeAttribute("data-bytm-hidden");
                 }
-            });
-            deleteBtnElem.addEventListener("click", deleteBtnClicked);
-            deleteBtnElem.addEventListener("keydown", (e) => e.key === "Enter" && deleteBtnClicked(e));
+            }));
             deleteBtnElem.appendChild(imgElem);
         }
         //#SECTION append elements to DOM
@@ -4432,6 +4418,7 @@ const migrations = {
         "rememberSongTimeMinPlayTime",
     ], oldData),
 };
+// TODO: once advanced filtering is fully implemented, clear cache on migration (to v6)
 /** Uses the passed {@linkcode oldData} as the base (if given) and sets all passed {@linkcode keys} to their feature default - returns a copy of the object */
 function useDefaultConfig(keys, oldData) {
     const newData = Object.assign({}, (oldData !== null && oldData !== void 0 ? oldData : {}));

+ 1 - 0
src/config.ts

@@ -54,6 +54,7 @@ export const migrations: ConfigMigrationsDict = {
     "rememberSongTimeMinPlayTime",
   ], oldData),
 };
+// TODO: once advanced filtering is fully implemented, clear cache on migration (to v6)
 
 /** Uses the passed {@linkcode oldData} as the base (if given) and sets all passed {@linkcode keys} to their feature default - returns a copy of the object */
 function useDefaultConfig(keys: (keyof typeof featInfo)[], oldData?: FeatureConfig): Partial<FeatureConfig> {