- Collapse the 10 theme cards into 5 pairs: light swatches top row, dark bottom row - Dark mode toggle in settings and topbar (sun/moon inline SVG) - Toggling dark mode switches to the other variant of the selected pair - Persist pair id in localStorage palette-theme, dark flag in palette-dark - Head script resolves base+dark to variant; URL ?theme= accepts both ids and wins - Settings gear highlights like nav tabs on /settings - PALETTE_DEFAULT_DARK env var sets server default dark state (default on) - Server-side resolution helpers + tests
49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
package web
|
|
|
|
import "testing"
|
|
|
|
func TestResolvePreset(t *testing.T) {
|
|
cases := []struct {
|
|
pair string
|
|
dark bool
|
|
want string
|
|
}{
|
|
{"", false, "midnight-light"},
|
|
{"", true, "midnight"},
|
|
{"midnight", false, "midnight-light"},
|
|
{"midnight", true, "midnight"},
|
|
{"smooth", false, "smooth"},
|
|
{"smooth", true, "smooth-dark"},
|
|
{"pastel-lavender", true, "pastel-lavender-dark"},
|
|
{"pastel-peach", false, "pastel-peach"},
|
|
{"pastel-cloud", true, "pastel-cloud-dark"},
|
|
{"bogus", true, "midnight"},
|
|
{"bogus", false, "midnight-light"},
|
|
// explicit variant ids also resolve (URL ?theme= may pass them)
|
|
{"smooth-dark", true, "midnight"},
|
|
}
|
|
for _, c := range cases {
|
|
if got := ResolvePreset(c.pair, c.dark); got != c.want {
|
|
t.Errorf("ResolvePreset(%q, %v) = %q, want %q", c.pair, c.dark, got, c.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestSetDefaultDark(t *testing.T) {
|
|
for _, off := range []string{"false", "0", "off", "OFF", " false "} {
|
|
DefaultDark = true
|
|
SetDefaultDark(off)
|
|
if DefaultDark {
|
|
t.Errorf("SetDefaultDark(%q): want dark off", off)
|
|
}
|
|
}
|
|
for _, on := range []string{"true", "1", "on", "anything"} {
|
|
DefaultDark = false
|
|
SetDefaultDark(on)
|
|
if !DefaultDark {
|
|
t.Errorf("SetDefaultDark(%q): want dark on", on)
|
|
}
|
|
}
|
|
DefaultDark = true
|
|
}
|