feat(web): theme import/export, more themable colors, hideable local/ical calendars

Theme:
- Export/import themes via UI as <date>_<time>.theme (JSON, readable keys,
  link to THEME.md). Import is partial-aware: only present params are written
  (server accepts partial); prompts before importing files with unknown params.
- Dynamic favicon + theme-color tinted to the primary colour on load/save.
- New themable colours: general hover-highlight, day hover/selected/bg,
  today background, plus two unified sidebar action-icon colours
  (inactive/active) covering bell, hide, delete and read-only icons.
- All new colours are per-setting syncable; documented in THEME.md.

UX:
- Styled confirm dialog (#modal-confirm) replaces window.confirm() for
  calendar delete and account disconnect.
- Birthday/local calendars and iCal subscriptions can now be hidden from the
  sidebar via Settings (new sidebar_hidden column + hide toggle).

Backend: additive nullable columns + idempotent migrations for user_settings
colours and local_calendars/ical_subscriptions.sidebar_hidden.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-20 13:20:30 +02:00
parent 12c869451b
commit 6316ed3a6b
15 changed files with 475 additions and 47 deletions

View File

@@ -78,6 +78,27 @@ const translations = {
settings_line_color: 'Linienfarbe',
settings_bg_color: 'Hintergrundfarbe',
settings_surface_color: 'Seitenleisten-/Oberflächenfarbe',
settings_hover_highlight_color: 'Hover-Highlight (Buttons, Menüs)',
settings_icon_inactive_color: 'Sidebar-Icons inaktiv (Ruhe/aus)',
settings_icon_active_color: 'Sidebar-Icons aktiv (Hover/an)',
settings_day_hover_color: 'Kalendertag Hover',
settings_day_selected_color: 'Ausgewählter Tag',
settings_day_bg_color: 'Tag-Hintergrund',
settings_today_bg_color: 'Heutiger Tag Hintergrund',
theme_export: 'Theme exportieren',
theme_import: 'Theme importieren',
theme_imported: 'Theme importiert zum Übernehmen speichern',
theme_imported_saved: '{count} Parameter importiert & gespeichert',
theme_import_invalid: 'Ungültige Theme-Datei',
theme_docs_hint: 'Erklärung der Theme-Parameter',
theme_unknown_title: 'Unbekannte Parameter',
theme_unknown_params: 'Diese Theme-Datei enthält {count} Parameter, die diese Version nicht kennt ({names}). Den Rest trotzdem importieren?',
theme_import_rest: 'Rest importieren',
confirm_generic_title: 'Bestätigen',
confirm: 'OK',
confirm_delete_cal_title: 'Kalender löschen',
confirm_remove_ical_title: 'Abo entfernen',
confirm_ha_disconnect: 'Home Assistant Konto wirklich trennen?',
reset: 'Reset',
settings_text_contrast: 'Schriftkontrast',
settings_text_contrast_desc: 'Helligkeit der Beschriftungen und Texte',
@@ -435,6 +456,27 @@ const translations = {
settings_line_color: 'Line color',
settings_bg_color: 'Background color',
settings_surface_color: 'Sidebar / surface color',
settings_hover_highlight_color: 'Hover highlight (buttons, menus)',
settings_icon_inactive_color: 'Sidebar icons inactive (resting/off)',
settings_icon_active_color: 'Sidebar icons active (hover/on)',
settings_day_hover_color: 'Calendar day hover',
settings_day_selected_color: 'Selected day',
settings_day_bg_color: 'Day background',
settings_today_bg_color: 'Today background',
theme_export: 'Export theme',
theme_import: 'Import theme',
theme_imported: 'Theme imported click Save to apply',
theme_imported_saved: '{count} parameters imported & saved',
theme_import_invalid: 'Invalid theme file',
theme_docs_hint: 'Explanation of theme parameters',
theme_unknown_title: 'Unknown parameters',
theme_unknown_params: 'This theme file contains {count} parameters this version does not know ({names}). Import the rest anyway?',
theme_import_rest: 'Import the rest',
confirm_generic_title: 'Confirm',
confirm: 'OK',
confirm_delete_cal_title: 'Delete calendar',
confirm_remove_ical_title: 'Remove subscription',
confirm_ha_disconnect: 'Really disconnect the Home Assistant account?',
reset: 'Reset',
settings_text_contrast: 'Text contrast',
settings_text_contrast_desc: 'Brightness of labels and text',