diff --git a/shine-UI/js/components/palette-editor.js b/shine-UI/js/components/palette-editor.js index 9b73c546..b7a43a80 100644 --- a/shine-UI/js/components/palette-editor.js +++ b/shine-UI/js/components/palette-editor.js @@ -1,4 +1,4 @@ -// Скрытый редактор палитры: открывается долгим нажатием на «День» или «Ночь» в настройках. +// Редактор точной настройки палитры. import { PALETTE_PRESETS, PALETTE_ROLES, @@ -24,7 +24,8 @@ export function openPaletteEditor({ theme = resolveThemeMode(), onClose } = {})
Основа -
+ +
Настраиваемая тема @@ -59,13 +60,10 @@ export function openPaletteEditor({ theme = resolveThemeMode(), onClose } = {}) const errorEl = modal.querySelector('.palette-editor__error'); for (const [id, preset] of Object.entries(PALETTE_PRESETS)) { - const btn = document.createElement('button'); - btn.type = 'button'; - btn.className = 'tab-btn'; - btn.setAttribute('role', 'radio'); - btn.dataset.preset = id; - btn.textContent = preset.label; - presetsEl.append(btn); + const option = document.createElement('option'); + option.value = id; + option.textContent = preset.label; + presetsEl.append(option); } const update = (mutate) => { @@ -80,8 +78,9 @@ export function openPaletteEditor({ theme = resolveThemeMode(), onClose } = {}) const settings = getPaletteSettings(); const colors = resolvePalette(editTheme, settings); const custom = settings.custom[editTheme]; - modal.querySelectorAll('[data-preset]').forEach((btn) => { - btn.setAttribute('aria-checked', String(btn.dataset.preset === settings.preset)); + presetsEl.value = settings.preset; + modal.querySelectorAll('.palette-editor__preview span').forEach((swatch, index) => { + swatch.style.backgroundColor = [colors.background, colors.surface, colors.accent, colors['surface-selected']][index]; }); modal.querySelectorAll('[data-edit-theme]').forEach((btn) => { btn.setAttribute('aria-checked', String(btn.dataset.editTheme === editTheme)); @@ -117,8 +116,6 @@ export function openPaletteEditor({ theme = resolveThemeMode(), onClose } = {}) modal.addEventListener('click', async (event) => { if (event.target === modal) { close(); return; } - const presetBtn = event.target.closest('[data-preset]'); - if (presetBtn) { update((next) => { next.preset = presetBtn.dataset.preset; }); return; } // data-edit-theme, а не data-theme: data-theme стоит на , и closest() находил бы его при любом клике. const themeBtn = event.target.closest('[data-edit-theme]'); if (themeBtn) { editTheme = themeBtn.dataset.editTheme; render(); return; } @@ -143,6 +140,10 @@ export function openPaletteEditor({ theme = resolveThemeMode(), onClose } = {}) } } }); + presetsEl.addEventListener('change', () => update((next) => { + next.preset = presetsEl.value; + next.custom = { dark: {}, light: {} }; + })); document.addEventListener('keydown', onKeydown); render(); diff --git a/shine-UI/js/pages/settings-view.js b/shine-UI/js/pages/settings-view.js index 614160b4..8b10f964 100644 --- a/shine-UI/js/pages/settings-view.js +++ b/shine-UI/js/pages/settings-view.js @@ -2,7 +2,7 @@ import { confirmDialog } from '../components/confirm-dialog.js'; import { createTopBar } from '../components/topbar.js'; import { addAppLogEntry, authService, closeSavedProfile, state } from '../state.js'; import { isDeveloperToolsEnabled } from '../services/feature-settings.js'; -import { getThemeMode, setThemeMode } from '../services/theme-service.js'; +import { getThemeMode, resolveThemeMode, setThemeMode } from '../services/theme-service.js'; import { openPaletteEditor } from '../components/palette-editor.js'; export const pageMeta = { id: 'settings-view', title: 'Настройки' }; @@ -69,6 +69,7 @@ export function render({navigate, chrome}) {
«Авто» — как на устройстве. +