From 565f039bc5ed1f295dde7786b15d31919485fe56 Mon Sep 17 00:00:00 2001 From: cottongin Date: Wed, 26 Aug 2026 16:07:07 -0400 Subject: [PATCH] feat: popup per-subreddit overrides with mode-aware light/dark toggle Co-authored-by: Cursor --- popup/popup.css | 43 ++++++++++++++++ popup/popup.html | 1 + popup/popup.js | 128 ++++++++++++++++++++++++++++++++--------------- 3 files changed, 132 insertions(+), 40 deletions(-) diff --git a/popup/popup.css b/popup/popup.css index 4001275..0f7ff49 100644 --- a/popup/popup.css +++ b/popup/popup.css @@ -157,3 +157,46 @@ fieldset input[type="text"] { .subreddit-entry .btn-remove:hover { color: #d9534f; } + +.section-hint { + font-size: 11px; + color: #888; + margin-bottom: 8px; +} + +.subreddit-entry-header { + display: flex; + gap: 4px; + align-items: center; + margin-bottom: 4px; +} + +.subreddit-entry-header input[type="text"] { + flex: 1; + min-width: 0; + padding: 2px 6px; + border: 1px solid #ccc; + border-radius: 3px; + font-size: 12px; + font-family: monospace; +} + +.subreddit-entry-mode { + display: flex; + gap: 4px; + align-items: center; + margin-bottom: 4px; +} + +.subreddit-entry-mode select { + width: auto; + padding: 2px 6px; + font-size: 11px; + margin-top: 0; +} + +.subreddit-entry-colors { + display: flex; + gap: 4px; + align-items: center; +} diff --git a/popup/popup.html b/popup/popup.html index 16c11c0..64132c0 100644 --- a/popup/popup.html +++ b/popup/popup.html @@ -60,6 +60,7 @@

Per-Subreddit Overrides

+

Set custom subreddit badge colors per mode.

diff --git a/popup/popup.js b/popup/popup.js index dc2f250..08ed774 100644 --- a/popup/popup.js +++ b/popup/popup.js @@ -34,72 +34,120 @@ } function renderSubredditOverrides(overrides) { - const list = document.getElementById("subredditList"); + var list = document.getElementById("subredditList"); list.innerHTML = ""; - Object.entries(overrides).forEach(function ([name, colors]) { - addSubredditEntry(name, colors); + Object.entries(overrides).forEach(function (pair) { + addSubredditEntry(pair[0], pair[1]); }); } - function addSubredditEntry(name, colors) { - const list = document.getElementById("subredditList"); - const entry = document.createElement("div"); + function addSubredditEntry(name, modeColors) { + var list = document.getElementById("subredditList"); + var entry = document.createElement("div"); entry.className = "subreddit-entry"; - const nameInput = document.createElement("input"); + var header = document.createElement("div"); + header.className = "subreddit-entry-header"; + + var nameInput = document.createElement("input"); nameInput.type = "text"; nameInput.placeholder = "subreddit"; nameInput.value = name || ""; - const bgInput = document.createElement("input"); - bgInput.type = "color"; - bgInput.value = colorToHex(colors?.bg); - bgInput.title = "Background"; - - const borderInput = document.createElement("input"); - borderInput.type = "color"; - borderInput.value = colorToHex(colors?.border); - borderInput.title = "Border"; - - const textInput = document.createElement("input"); - textInput.type = "color"; - textInput.value = colorToHex(colors?.text); - textInput.title = "Text"; - - const removeBtn = document.createElement("button"); + var removeBtn = document.createElement("button"); removeBtn.className = "btn-remove"; - removeBtn.textContent = "×"; + removeBtn.textContent = "\u00d7"; removeBtn.addEventListener("click", function () { entry.remove(); saveFromControls(); }); + header.appendChild(nameInput); + header.appendChild(removeBtn); + + var modeRow = document.createElement("div"); + modeRow.className = "subreddit-entry-mode"; + + var modeSelect = document.createElement("select"); + modeSelect.innerHTML = ''; + modeSelect.value = "light"; + modeRow.appendChild(modeSelect); + + var colorsDiv = document.createElement("div"); + colorsDiv.className = "subreddit-entry-colors"; + + var lightColors = modeColors && modeColors.light ? modeColors.light : {}; + var darkColors = modeColors && modeColors.dark ? modeColors.dark : {}; + + var bgInput = document.createElement("input"); + bgInput.type = "color"; + bgInput.value = colorToHex(lightColors.bg); + bgInput.title = "Background"; + + var borderInput = document.createElement("input"); + borderInput.type = "color"; + borderInput.value = colorToHex(lightColors.border); + borderInput.title = "Border"; + + var textInput = document.createElement("input"); + textInput.type = "color"; + textInput.value = colorToHex(lightColors.text); + textInput.title = "Text"; + + colorsDiv.appendChild(bgInput); + colorsDiv.appendChild(borderInput); + colorsDiv.appendChild(textInput); + + entry._colorState = { + light: { bg: bgInput.value, border: borderInput.value, text: textInput.value }, + dark: { bg: colorToHex(darkColors.bg), border: colorToHex(darkColors.border), text: colorToHex(darkColors.text) }, + }; + + modeSelect.addEventListener("change", function () { + var prev = modeSelect.value === "dark" ? "light" : "dark"; + entry._colorState[prev] = { bg: bgInput.value, border: borderInput.value, text: textInput.value }; + var next = entry._colorState[modeSelect.value]; + bgInput.value = next.bg; + borderInput.value = next.border; + textInput.value = next.text; + }); + [nameInput, bgInput, borderInput, textInput].forEach(function (input) { input.addEventListener("change", saveFromControls); }); - entry.appendChild(nameInput); - entry.appendChild(bgInput); - entry.appendChild(borderInput); - entry.appendChild(textInput); - entry.appendChild(removeBtn); + entry.appendChild(header); + entry.appendChild(modeRow); + entry.appendChild(colorsDiv); + + entry._nameInput = nameInput; + entry._bgInput = bgInput; + entry._borderInput = borderInput; + entry._textInput = textInput; + entry._modeSelect = modeSelect; + list.appendChild(entry); } function collectSubredditOverrides() { - const overrides = {}; - const entries = document.querySelectorAll(".subreddit-entry"); + var overrides = {}; + var entries = document.querySelectorAll(".subreddit-entry"); entries.forEach(function (entry) { - const inputs = entry.querySelectorAll("input"); - const name = inputs[0].value.trim().replace(/^r\//, ""); - if (name) { - overrides[name] = { - bg: inputs[1].value, - border: inputs[2].value, - text: inputs[3].value, - }; - } + var name = entry._nameInput.value.trim().replace(/^r\//, ""); + if (!name) return; + + var currentMode = entry._modeSelect.value; + entry._colorState[currentMode] = { + bg: entry._bgInput.value, + border: entry._borderInput.value, + text: entry._textInput.value, + }; + + overrides[name] = { + light: entry._colorState.light, + dark: entry._colorState.dark, + }; }); return overrides; }