5.5 KiB
Theme Selection v1
1. Doel
Theme-selectie voegt nu waarde toe omdat de UI al een nette light/dark basis heeft, maar nog geen expliciet onderscheid maakt tussen:
theme: de stijlsetmode: light of dark binnen die stijlset
Dat onderscheid maakt de UI uitbreidbaar zonder de dagelijkse snelle UX kwijt te raken. Dit past logisch in de bestaande Settings-structuur:
Generalvoor functionele voorkeurenInterfacevoor theme-keuzeLogsvoor recente acties
2. Scope
Theme Selection v1 omvat:
- nieuw Settings-tabblad:
Interface - daarin alleen een pulldown/select:
Theme - bestaande snelle dark/light toggle blijft in de hoofdinterface bestaan
- beide keuzes worden opgeslagen in bestaande SQLite settings-opslag
- app leest beide waarden bij startup via backend en past die direct toe
Niet in scope:
- vrije CSS-bestandskeuze
- padinvoer
- upload van themes
- custom theme editor
- theme packs van externe bron
3. Theme-model
Aanbevolen model voor v1:
- werk met een whitelist van toegestane theme keys
- werk daarnaast met een aparte whitelist van toegestane color modes
- sla beide als strings op in settings
Aanbevolen settings voor v1:
selected_theme: string | nullselected_color_mode: string | null
Whitelist v1:
selected_themedefault
selected_color_modedarklight
Waarom dit veiliger en eenvoudiger is dan bestandsselectie:
- geen vrije filesystemtoegang nodig
- geen risico op ongeldige of kwaadaardige CSS-inhoud
- geen extra upload- of assetbeheer
- duidelijke validatie in backend mogelijk
- stabiel contract tussen backend setting en frontend rendering
4. Settings-opslag
Nieuwe settings in bestaande settings-opslag:
selected_themeselected_color_mode
Semantiek:
selected_theme = nullbetekent: fallback naar veilige defaultdefaultselected_color_mode = nullbetekent: fallback naar veilige defaultdark- onbekende opgeslagen waarden betekenen: negeren en fallback toepassen
Aanbevolen effectieve defaults:
- theme ->
default - mode ->
dark
5. Settings UI
Tabs in Settings worden:
GeneralInterfaceLogs
Interface bevat in v1 alleen:
- label:
Theme - een select/pulldown met toegestane themes
Belangrijk:
- geen dark/light selector in
Settings > Interface - dark/light blijft een snelle hoofdinterface-actie
Aanbevolen v1-UX:
- select toont huidige theme-keuze
- gebruiker kiest andere waarde
- opslaan gebeurt via bestaande settings-saveflow
- keuze wordt direct toegepast in de UI na succesvolle backend-save
6. Frontend-impact
Frontend moet bij startup vroeg settings laden en daaruit beide waarden ophalen:
selected_themeselected_color_mode
Daarna bepaalt frontend het effectieve UI-theme. Aanbevolen intern model:
data-theme="default-dark"data-theme="default-light"
Aanbevolen volgorde:
GET /api/settings- bepaal effectief theme + mode
- zet
document.documentElement.dataset.theme - initialiseer de rest van de UI
Relatie met bestaande light/dark toggle:
- toggle blijft bestaan in de hoofdinterface
- toggle wijzigt alleen
selected_color_mode - toggle schrijft dus naar backend, niet naar localStorage
Reden:
- snelle dagelijkse UX blijft behouden
Settings > Interfaceblijft schoon en beperkt tot theme-keuze- theme en mode blijven conceptueel gescheiden
7. Backend-impact
Bestaande settings-API wordt uitgebreid met:
selected_themeselected_color_mode
Benodigd:
- whitelistvalidatie op backend
- onbekende waarden blokkeren bij write
- bestaande settings repository/service/API uitbreiden
Niet nodig:
- nieuwe dependency
- vrije filesystemtoegang
- nieuwe asset-uploadroute
8. Regressierisico
Belangrijkste risico's:
- startup-volgorde: theme moet vroeg genoeg worden toegepast om flicker te beperken
- bestaande theme-toggle logica conflicteert nu nog met localStorage
- onbekende opgeslagen theme/mode-waarden moeten veilig terugvallen
- Settings-tabcomplexiteit mag niet onnodig toenemen
Belangrijkste mitigaties:
- één centrale frontendfunctie die theme en mode uit backend toepast
- localStorage volledig verwijderen als leidende theme-bron
- backend whitelistvalidatie
- fallback naar
default-dark
9. Teststrategie
Backend golden tests:
- default
selected_theme - default
selected_color_mode - geldige theme save (
default) - geldige color mode save (
dark,light) - ongeldige theme key wordt geblokkeerd
- ongeldige color mode wordt geblokkeerd
- settings response bevat beide velden
UI smoke/regressietests:
Settingsbevat tabsGeneral,Interface,LogsInterfacetab bevat alleen theme select- hoofdinterface bevat nog steeds dark/light toggle
- app leest beide settings via backend
- fallback bij ontbrekende/ongeldige waarde breekt startup niet
Handmatige validatie:
- theme wijzigen in
Settings > Interface - mode wisselen via toggle in de hoofdinterface
- app herladen en controleren dat beide keuzes behouden blijven
- controle dat light/dark correct doorwerken in modals, panelen en editor/viewers
10. Aanbeveling
Aanbevolen v1-richting met laag regressierisico:
- voeg
Interfacetab toe - voeg
selected_themeenselected_color_modetoe aan bestaande settings-opslag - werk alleen met veilige whitelists
- houd v1 beperkt tot:
- theme:
default - mode:
dark|light
- theme:
- laat startup en toggle beide backendpersistente settings gebruiken
- fallback altijd veilig naar
default-dark
Deze richting is:
- simpel
- veilig
- onderhoudbaar
- duidelijk uitbreidbaar naar extra themes, zonder de dagelijkse dark/light UX opnieuw te moeten ontwerpen