theme: persist active design preset across settings reopen

The <select> element survives settings open/close, so its lingering value
masked the otherwise-empty restore path on the second open and the
dropdown always reverted to whatever was last picked in the *current*
session. Track the active preset in localStorage on every change /
save, restore from localStorage first (it's the source of truth), and
clear the entry on delete.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
thandClaude Opus 4.6 committed 2026-04-11 18:50:07 +02:00
1 parent ff3e0e8736
commit ccd0477841
1 file changed
+11 -2
+11 -2
View File
@@ -232,7 +232,10 @@ function saveUserPresets(p) {
function refreshPresetSelect() { function refreshPresetSelect() {
const sel = $('design-preset-select'); const sel = $('design-preset-select');
if (!sel) return; if (!sel) return;
const cur = sel.value; // localStorage wins over sel.value: the <select> survives settings
// close/reopen, so its lingering value would otherwise mask the
// persisted selection on the next refresh.
const cur = localStorage.getItem('hyprcrd-design-active-preset') || sel.value || '';
sel.innerHTML = ''; sel.innerHTML = '';
const builtinGroup = document.createElement('optgroup'); const builtinGroup = document.createElement('optgroup');
builtinGroup.label = 'built-in'; builtinGroup.label = 'built-in';
@@ -254,7 +257,7 @@ function refreshPresetSelect() {
} }
sel.appendChild(userGroup); sel.appendChild(userGroup);
} }
if (cur) sel.value = cur; if (cur && sel.querySelector(`option[value="${CSS.escape(cur)}"]`)) sel.value = cur;
} }
function getSelectedPreset() { function getSelectedPreset() {
@@ -274,6 +277,8 @@ function loadSelectedPreset() {
syncControlsFromPending(); syncControlsFromPending();
commitDesign(); commitDesign();
renderThemes(); renderThemes();
const sel = $('design-preset-select');
if (sel?.value) localStorage.setItem('hyprcrd-design-active-preset', sel.value);
} }
$('design-preset-select')?.addEventListener('change', loadSelectedPreset); $('design-preset-select')?.addEventListener('change', loadSelectedPreset);
@@ -288,6 +293,7 @@ $('design-preset-save')?.addEventListener('click', () => {
refreshPresetSelect(); refreshPresetSelect();
const sel = $('design-preset-select'); const sel = $('design-preset-select');
if (sel) sel.value = 'user:' + name; if (sel) sel.value = 'user:' + name;
localStorage.setItem('hyprcrd-design-active-preset', 'user:' + name);
const status = $('design-status'); const status = $('design-status');
if (status) { status.textContent = `preset "${name}" saved`; status.style.color = 'var(--t-accent)'; } if (status) { status.textContent = `preset "${name}" saved`; status.style.color = 'var(--t-accent)'; }
}); });
@@ -299,6 +305,9 @@ $('design-preset-delete')?.addEventListener('click', () => {
const presets = loadUserPresets(); const presets = loadUserPresets();
delete presets[name]; delete presets[name];
saveUserPresets(presets); saveUserPresets(presets);
if (localStorage.getItem('hyprcrd-design-active-preset') === 'user:' + name) {
localStorage.removeItem('hyprcrd-design-active-preset');
}
refreshPresetSelect(); refreshPresetSelect();
}); });