diff --git a/content/styles/badges.css b/content/styles/badges.css
index 40abbeb..7a15f61 100644
--- a/content/styles/badges.css
+++ b/content/styles/badges.css
@@ -182,13 +182,14 @@ html.rt-enabled .thing.link .flat-list li:has(> .comments) {
gap: 4px;
}
-.rt-popover-row input[type="color"] {
+.rt-popover-row .rt-color-swatch {
width: 28px;
height: 20px;
border: 1px solid #ccc;
border-radius: 3px;
- padding: 1px;
cursor: pointer;
+ display: inline-block;
+ vertical-align: middle;
}
.rt-popover-row input[type="text"] {
@@ -298,7 +299,7 @@ html.rt-enabled .thing.link .flat-list li:has(> .comments) {
color: #e0e0e0;
}
-.rt-color-popover.rt-dark .rt-popover-row input[type="color"] {
+.rt-color-popover.rt-dark .rt-popover-row .rt-color-swatch {
border-color: #555;
}
diff --git a/content/tweaks/color-popover.js b/content/tweaks/color-popover.js
index 9fb30b3..f74094f 100644
--- a/content/tweaks/color-popover.js
+++ b/content/tweaks/color-popover.js
@@ -8,6 +8,8 @@
var selectedMode = "light";
var dirtyModes = { light: false, dark: false };
var hadOverride = { light: false, dark: false };
+ var picker = null;
+ var activeProp = null;
var els = {};
@@ -46,21 +48,21 @@
'
",
' ",
' ",
@@ -99,6 +101,10 @@
};
}
+ picker = window.RedditTweaks.colorPicker.create();
+ var previewSection = el.querySelector(".rt-popover-preview");
+ el.insertBefore(picker.el, previewSection);
+
els.closeBtn.addEventListener("click", close);
els.cancelBtn.addEventListener("click", close);
els.saveBtn.addEventListener("click", save);
@@ -108,6 +114,7 @@
markModeDirty(selectedMode);
storeCurrentEdits();
selectedMode = els.modeSelect.value;
+ closePicker();
loadModeIntoInputs();
updatePreview();
});
@@ -116,17 +123,17 @@
for (var p = 0; p < props.length; p++) {
(function (prop) {
var row = els.rows[prop];
- row.swatch.addEventListener("input", function () {
- markModeDirty(selectedMode);
- row.hex.value = row.swatch.value;
- row.hex.classList.remove("rt-input-error");
- updatePreview();
+ row.swatch.addEventListener("click", function () {
+ onSwatchClick(prop);
});
row.hex.addEventListener("input", function () {
markModeDirty(selectedMode);
if (hexValid(row.hex.value)) {
- row.swatch.value = row.hex.value;
+ row.swatch.style.backgroundColor = row.hex.value;
row.hex.classList.remove("rt-input-error");
+ if (picker.isOpen() && activeProp === prop) {
+ picker.setColor(row.hex.value);
+ }
updatePreview();
} else {
row.hex.classList.add("rt-input-error");
@@ -139,13 +146,31 @@
document.addEventListener("keydown", onDocumentKeyDown, true);
}
+ function onSwatchClick(prop) {
+ if (picker.isOpen() && activeProp === prop) {
+ closePicker();
+ return;
+ }
+ closePicker();
+ activeProp = prop;
+ var row = els.rows[prop];
+ picker.open(row.hex.value, function (hex) {
+ markModeDirty(selectedMode);
+ row.swatch.style.backgroundColor = hex;
+ row.hex.value = hex;
+ row.hex.classList.remove("rt-input-error");
+ updatePreview();
+ });
+ }
+
+ function closePicker() {
+ if (picker && picker.isOpen()) picker.close();
+ activeProp = null;
+ }
+
function onDocumentMouseDown(e) {
if (!popoverEl || !popoverEl.classList.contains("rt-popover-visible")) return;
if (popoverEl.contains(e.target)) return;
-
- var active = document.activeElement;
- if (active && active.type === "color" && popoverEl.contains(active)) return;
-
close();
}
@@ -182,9 +207,9 @@
function storeCurrentEdits() {
editState[selectedMode] = {
- bg: els.rows.bg.swatch.value,
- border: els.rows.border.swatch.value,
- text: els.rows.text.swatch.value,
+ bg: els.rows.bg.hex.value,
+ border: els.rows.border.hex.value,
+ text: els.rows.text.hex.value,
};
}
@@ -194,16 +219,16 @@
for (var i = 0; i < props.length; i++) {
var prop = props[i];
var val = colorToHex(colors[prop]);
- els.rows[prop].swatch.value = val;
+ els.rows[prop].swatch.style.backgroundColor = val;
els.rows[prop].hex.value = val;
els.rows[prop].hex.classList.remove("rt-input-error");
}
}
function updatePreview() {
- var bg = els.rows.bg.swatch.value;
- var border = els.rows.border.swatch.value;
- var text = els.rows.text.swatch.value;
+ var bg = els.rows.bg.hex.value;
+ var border = els.rows.border.hex.value;
+ var text = els.rows.text.hex.value;
els.preview.style.background = bg;
els.preview.style.borderColor = border;
els.preview.style.color = text;
@@ -268,6 +293,7 @@
els.modeSelect.value = selectedMode;
els.preview.textContent = "r/" + subredditName;
+ closePicker();
applyDarkModeToPopover(settings);
loadModeIntoInputs();
updatePreview();
@@ -276,6 +302,7 @@
function close() {
if (!popoverEl) return;
+ closePicker();
popoverEl.classList.remove("rt-popover-visible");
currentSubreddit = null;
currentAnchor = null;
@@ -317,6 +344,7 @@
resetTracking();
editState.light = getDefaultsForMode(settings, "light");
editState.dark = getDefaultsForMode(settings, "dark");
+ closePicker();
loadModeIntoInputs();
updatePreview();
}