Context. book.css currently has one fixed palette + page-stack texture,
entirely driven by CSS custom properties (README: "no hard-coded colours
elsewhere").
Scope
- Introduce a
data-theme attribute on the app root with 2–3 named skins
(e.g. parchment [current default], night, linen), each just
redefining the existing CSS custom properties — no new component logic.
If implementing this surfaces a component that hardcodes a color instead of
using the token system, fix that component as part of this task (it's a
pre-existing violation of the stated CSS convention, not scope creep).
- Settings view: a theme picker next to font family/size, applied live
without restart — same pattern as the other "live settings."
- Persisted in
settingsStore/userData/settings.json.
Out of scope v1: a free-form/custom color picker — fixed curated skins only.
Acceptance criteria
Context.
book.csscurrently has one fixed palette + page-stack texture,entirely driven by CSS custom properties (README: "no hard-coded colours
elsewhere").
Scope
data-themeattribute on the app root with 2–3 named skins(e.g.
parchment[current default],night,linen), each justredefining the existing CSS custom properties — no new component logic.
If implementing this surfaces a component that hardcodes a color instead of
using the token system, fix that component as part of this task (it's a
pre-existing violation of the stated CSS convention, not scope creep).
without restart — same pattern as the other "live settings."
settingsStore/userData/settings.json.Out of scope v1: a free-form/custom color picker — fixed curated skins only.
Acceptance criteria