feat: add color presets + fix badge hover effect
- Add global color presets: save/apply/delete sets of {bg, border, text}
colors as reusable presets, shown as mini badges in their own colors.
- Popover: preset badges under preview with + to save, click to apply,
× on hover to delete.
- Popup: dedicated Color Presets section with same functionality,
applying to light subreddit badge colors.
- Storage: colorPresets array added to settings defaults.
- Fix badge hover: change brightness(0.9) to brightness(1.1) so hover
brightens (activates) instead of dimming.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -210,6 +210,80 @@ fieldset input[type="text"] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* --- Preset badges --- */
|
||||
.rt-preset-bar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
flex-wrap: wrap;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.rt-preset-list {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.rt-preset-badge {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
border: 1px solid;
|
||||
border-radius: 3px;
|
||||
padding: 2px 6px;
|
||||
font-size: 10px;
|
||||
font-weight: bold;
|
||||
cursor: pointer;
|
||||
line-height: 1.4;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.rt-preset-badge:hover {
|
||||
filter: brightness(1.1);
|
||||
}
|
||||
|
||||
.rt-preset-delete {
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: -6px;
|
||||
right: -6px;
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
background: #d9534f;
|
||||
color: white;
|
||||
border-radius: 50%;
|
||||
font-size: 10px;
|
||||
line-height: 14px;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.rt-preset-badge:hover .rt-preset-delete {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.rt-preset-add {
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
border: 1px dashed #ccc;
|
||||
border-radius: 3px;
|
||||
background: none;
|
||||
color: #999;
|
||||
font-size: 14px;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-shrink: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.rt-preset-add:hover {
|
||||
border-color: #999;
|
||||
color: #666;
|
||||
background: #f5f5f5;
|
||||
}
|
||||
|
||||
/* --- Color Picker Widget --- */
|
||||
.rt-color-picker {
|
||||
margin: 8px 0;
|
||||
|
||||
@@ -58,6 +58,15 @@
|
||||
<button id="resetDark" class="btn-secondary">Reset Dark Defaults</button>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h2>Color Presets</h2>
|
||||
<p class="section-hint">Saved color sets. Click to apply to light subreddit badge.</p>
|
||||
<div class="rt-preset-bar">
|
||||
<div id="presetList" class="rt-preset-list"></div>
|
||||
<button id="addPreset" class="rt-preset-add" type="button" title="Save light subreddit colors as preset">+</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h2>Per-Subreddit Overrides</h2>
|
||||
<p class="section-hint">Set custom subreddit badge colors per mode.</p>
|
||||
|
||||
@@ -220,6 +220,63 @@
|
||||
return overrides;
|
||||
}
|
||||
|
||||
function renderPopupPresets(presets) {
|
||||
var list = document.getElementById("presetList");
|
||||
list.innerHTML = "";
|
||||
for (var i = 0; i < presets.length; i++) {
|
||||
(function (index) {
|
||||
var p = presets[index];
|
||||
var badge = document.createElement("span");
|
||||
badge.className = "rt-preset-badge";
|
||||
badge.style.background = p.bg;
|
||||
badge.style.borderColor = p.border;
|
||||
badge.style.color = p.text;
|
||||
badge.textContent = "Aa";
|
||||
badge.title = "Click to apply to light subreddit colors";
|
||||
badge.addEventListener("click", function () {
|
||||
setColorValue(document.getElementById("light.subredditBgColor"), p.bg);
|
||||
setColorValue(document.getElementById("light.subredditBorderColor"), p.border);
|
||||
setColorValue(document.getElementById("light.subredditTextColor"), p.text);
|
||||
closePicker();
|
||||
saveFromControls();
|
||||
});
|
||||
|
||||
var del = document.createElement("span");
|
||||
del.className = "rt-preset-delete";
|
||||
del.textContent = "\u00d7";
|
||||
del.addEventListener("click", function (e) {
|
||||
e.stopPropagation();
|
||||
deletePopupPreset(index);
|
||||
});
|
||||
badge.appendChild(del);
|
||||
list.appendChild(badge);
|
||||
})(i);
|
||||
}
|
||||
}
|
||||
|
||||
async function addPopupPreset() {
|
||||
var preset = {
|
||||
bg: getColorValue(document.getElementById("light.subredditBgColor")),
|
||||
border: getColorValue(document.getElementById("light.subredditBorderColor")),
|
||||
text: getColorValue(document.getElementById("light.subredditTextColor")),
|
||||
};
|
||||
var settings = await window.RedditTweaks.loadSettings();
|
||||
var presets = settings.colorPresets || [];
|
||||
presets.push(preset);
|
||||
settings.colorPresets = presets;
|
||||
await window.RedditTweaks.saveSettings(settings);
|
||||
renderPopupPresets(presets);
|
||||
}
|
||||
|
||||
async function deletePopupPreset(index) {
|
||||
var settings = await window.RedditTweaks.loadSettings();
|
||||
var presets = settings.colorPresets || [];
|
||||
presets.splice(index, 1);
|
||||
settings.colorPresets = presets;
|
||||
await window.RedditTweaks.saveSettings(settings);
|
||||
renderPopupPresets(presets);
|
||||
}
|
||||
|
||||
async function saveFromControls() {
|
||||
var settings = {
|
||||
enabled: document.getElementById("enabled").checked,
|
||||
@@ -255,6 +312,9 @@
|
||||
}
|
||||
});
|
||||
|
||||
renderPopupPresets(settings.colorPresets || []);
|
||||
document.getElementById("addPreset").addEventListener("click", addPopupPreset);
|
||||
|
||||
document.getElementById("addSubreddit").addEventListener("click", function () {
|
||||
closePicker();
|
||||
addSubredditEntry("", {});
|
||||
|
||||
Reference in New Issue
Block a user