feat: add persistent responsive color themes

This commit is contained in:
donghyeon-ka
2026-07-26 00:06:49 +09:00
parent bee5c158c6
commit 4cfbe5a29e
9 changed files with 372 additions and 51 deletions
+44
View File
@@ -0,0 +1,44 @@
// @vitest-environment jsdom
import { describe, expect, it } from "vitest";
import {
normalizeColorSchemePreference,
resolveColorScheme,
} from "../../src/application/policies/color-scheme.js";
import { initializeColorScheme } from "../../src/bootstrap/initialize-color-scheme.js";
describe("color scheme policy", () => {
it("normalizes unknown persisted values to the safe system default", () => {
expect(normalizeColorSchemePreference("sepia")).toBe("system");
expect(normalizeColorSchemePreference("dark")).toBe("dark");
});
it("resolves system and explicit preferences deterministically", () => {
expect(resolveColorScheme("system", true)).toBe("dark");
expect(resolveColorScheme("system", false)).toBe("light");
expect(resolveColorScheme("light", true)).toBe("light");
});
it("applies a persisted preference before application paint", () => {
const storage = {
read: () => ({ ok: true, value: "system" }),
write: () => ({ ok: true }),
remove: () => ({ ok: true }),
};
const result = initializeColorScheme(storage, {
documentElement: document.documentElement,
matchMedia: () =>
/** @type {MediaQueryList} */ ({ matches: true }),
});
expect(result).toEqual({ preference: "system", resolved: "dark" });
expect(document.documentElement).toHaveAttribute("data-theme", "dark");
expect(document.documentElement).toHaveAttribute(
"data-theme-preference",
"system",
);
expect(document.documentElement.style.colorScheme).toBe("dark");
});
});