v0.2 Phase 3: additive semantic tokens + KI-05 resolution
Additive token grammar (no renames, no replacements):
- --color-caution (dark #e8be4a, light #a08a1f) becomes the canonical
name for tuned-amber notice surfaces in the new wrapper grammar
- --color-warning is kept as a CSS var() alias of --color-caution so
every existing text-warning / bg-warning call site stays valid
- --color-info (dark #7a9ec0, light #3d6a8a) is the soft blue-grey
signal for the new LumotiaNotice info variant
- --color-accent-environment (dark #8fae9a, light #4a7058) is an
optional sage/moss support token for empty-state illustrations
and environment-neutral status dots. NOT a brand swap — amber/
copper --color-accent stays primary
Mirrored in src/design-system/colors_and_type.css (the buildless
preview pages bypass Tailwind so the duplication is intentional).
KI-05 resolved in the same commit, per the plan:
- src/lib/types/app.ts: drop `theme` from SettingsState
- src/lib/stores/page.svelte.ts: drop `theme: "Dark"` from defaults
- src/routes/+layout.svelte: drop the migration $effect, add a
one-shot migrateLegacyTheme() on mount that copies any historical
lumotia_settings.theme into preferences.theme and strips the
legacy field. Idempotent — subsequent loads short-circuit
- src/routes/{float,viewer,preview}/+layout@.svelte: drop the same
$effect; secondary windows inherit theme via PREFERENCES_CHANGED_EVENT
- src/lib/pages/SettingsPage.svelte: both SegmentedButton bindings
(quick-settings row at :1272, Appearance group at :2606) now use
Svelte 5 function bindings ({ get, set }) backed by prefs.theme
and updatePreferences. No SegmentedButton API change
Phase 3 per-page gate green: npm run check (0/0/4129 files),
npm test (13/13), npm run test:e2e (16/16). No regressions in
the Phase 1 smoke baseline.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -56,16 +56,28 @@
|
||||
$sveltePage.url.pathname.startsWith("/viewer")
|
||||
);
|
||||
|
||||
// Theme — migrate from old class-based to new data-attribute system
|
||||
// The preferences store handles DOM application via data-theme attribute
|
||||
$effect(() => {
|
||||
// Sync legacy settings.theme → preferences store
|
||||
const legacyTheme = settings.theme;
|
||||
const mapped = legacyTheme === "Light" ? "light" : legacyTheme === "Dark" ? "dark" : "system";
|
||||
if (prefs.theme !== mapped) {
|
||||
updatePreferences({ theme: mapped });
|
||||
}
|
||||
});
|
||||
// KI-05 resolution (v0.2 Phase 3) — preferences.theme is canonical.
|
||||
// The legacy settings.theme field is gone from SettingsState; a
|
||||
// one-shot localStorage migration (migrateLegacyTheme below) runs
|
||||
// once on mount to copy any historical "Dark"/"Light"/"System"
|
||||
// value into preferences, then strips the field so subsequent
|
||||
// loads short-circuit.
|
||||
function migrateLegacyTheme() {
|
||||
if (typeof localStorage === "undefined") return;
|
||||
const raw = localStorage.getItem("lumotia_settings");
|
||||
if (!raw) return;
|
||||
let parsed;
|
||||
try { parsed = JSON.parse(raw); } catch { return; }
|
||||
const data = parsed?.data ?? parsed;
|
||||
if (!data || typeof data !== "object" || !("theme" in data)) return;
|
||||
const legacy = data.theme;
|
||||
const mapped = legacy === "Light" ? "light" : legacy === "System" ? "system" : "dark";
|
||||
if (mapped !== prefs.theme) updatePreferences({ theme: mapped });
|
||||
delete data.theme;
|
||||
if (parsed && typeof parsed === "object" && "data" in parsed) parsed.data = data;
|
||||
else parsed = data;
|
||||
try { localStorage.setItem("lumotia_settings", JSON.stringify(parsed)); } catch {}
|
||||
}
|
||||
|
||||
// Global hotkey registration — dual backend
|
||||
// Wayland: evdev via lumotia-hotkey crate (works without display server)
|
||||
@@ -340,6 +352,12 @@
|
||||
}
|
||||
|
||||
onMount(async () => {
|
||||
// KI-05 v0.2 one-shot: copy any legacy settings.theme into
|
||||
// preferences.theme, then strip it from localStorage. Runs first
|
||||
// so the DOM picks up the right data-theme attribute before any
|
||||
// theme-sensitive rendering.
|
||||
migrateLegacyTheme();
|
||||
|
||||
// Auto-collapse if window is already narrow on first load
|
||||
handleResize();
|
||||
window.addEventListener("resize", handleResize);
|
||||
|
||||
Reference in New Issue
Block a user