Sync theme registries and support webterm-theme key in landing YAML

Two issues prevented themes from being applied:

1. Three server-side themes (miasma, github, gotham) were missing from
   the frontend THEMES map in terminal.ts, causing the browser to
   silently ignore them when set via data-theme attribute.

2. Landing YAML only recognized the 'theme' key, but users writing
   'webterm-theme' (matching the Docker label convention) got no theme.
   Now LoadLandingYAML accepts both 'theme' and 'webterm-theme' keys.

All 16 themes are now consistent across ThemeBackgrounds, ThemePalettes,
and the frontend THEMES map.
This commit is contained in:
GitHub Copilot
2026-02-17 20:53:47 +00:00
parent edfa239c3e
commit 5031bd5e7c
4 changed files with 115 additions and 2 deletions
+10 -1
View File
@@ -61,7 +61,7 @@ func LoadLandingYAML(manifestPath string) ([]App, error) {
Path: path, Path: path,
Color: asString(entry["color"]), Color: asString(entry["color"]),
Terminal: terminal, Terminal: terminal,
Theme: asString(entry["theme"]), Theme: firstNonEmpty(asString(entry["theme"]), asString(entry["webterm-theme"])),
}) })
} }
return apps, nil return apps, nil
@@ -144,3 +144,12 @@ func asString(value any) string {
} }
return "" return ""
} }
func firstNonEmpty(values ...string) string {
for _, v := range values {
if v != "" {
return v
}
}
return ""
}
+29
View File
@@ -30,6 +30,35 @@ func TestLoadLandingYAML(t *testing.T) {
} }
} }
func TestLoadLandingYAMLWebtermThemeKey(t *testing.T) {
dir := t.TempDir()
path := filepath.Join(dir, "landing.yaml")
content := `
- name: Pro
command: /bin/sh
webterm-theme: monokai-pro
- name: Classic
command: /bin/sh
theme: dracula
`
if err := os.WriteFile(path, []byte(content), 0o644); err != nil {
t.Fatal(err)
}
apps, err := LoadLandingYAML(path)
if err != nil {
t.Fatalf("LoadLandingYAML() error = %v", err)
}
if len(apps) != 2 {
t.Fatalf("expected 2 apps, got %d", len(apps))
}
if apps[0].Theme != "monokai-pro" {
t.Fatalf("expected monokai-pro from webterm-theme key, got %q", apps[0].Theme)
}
if apps[1].Theme != "dracula" {
t.Fatalf("expected dracula from theme key, got %q", apps[1].Theme)
}
}
func TestLoadComposeManifestReadsLabels(t *testing.T) { func TestLoadComposeManifestReadsLabels(t *testing.T) {
dir := t.TempDir() dir := t.TempDir()
path := filepath.Join(dir, "compose.yaml") path := filepath.Join(dir, "compose.yaml")
File diff suppressed because one or more lines are too long
+75
View File
@@ -352,6 +352,81 @@ const THEMES: Record<string, ITheme> = {
brightCyan: "#7dcfff", brightCyan: "#7dcfff",
brightWhite: "#c0caf5", brightWhite: "#c0caf5",
}, },
// Miasma - earthy warm tones
miasma: {
background: "#222222",
foreground: "#c2c2b0",
cursor: "#c2c2b0",
cursorAccent: "#222222",
selectionBackground: "#c2c2b0",
selectionForeground: "#222222",
black: "#000000",
red: "#685742",
green: "#5f875f",
yellow: "#b36d43",
blue: "#78824b",
magenta: "#bb7744",
cyan: "#c9a554",
white: "#d7c483",
brightBlack: "#666666",
brightRed: "#685742",
brightGreen: "#5f875f",
brightYellow: "#b36d43",
brightBlue: "#78824b",
brightMagenta: "#bb7744",
brightCyan: "#c9a554",
brightWhite: "#d7c483",
},
// GitHub Dark Dimmed
github: {
background: "#1c2128",
foreground: "#adbac7",
cursor: "#adbac7",
cursorAccent: "#1c2128",
selectionBackground: "#adbac7",
selectionForeground: "#1c2128",
black: "#545d68",
red: "#f47067",
green: "#57ab5a",
yellow: "#c69026",
blue: "#539bf5",
magenta: "#b083f0",
cyan: "#39c5cf",
white: "#909dab",
brightBlack: "#636e7b",
brightRed: "#ff938a",
brightGreen: "#6bc46d",
brightYellow: "#daaa3f",
brightBlue: "#6cb6ff",
brightMagenta: "#dcbdfb",
brightCyan: "#56d4dd",
brightWhite: "#cdd9e5",
},
// Gotham - dark blue-cyan
gotham: {
background: "#0c1014",
foreground: "#99d1ce",
cursor: "#99d1ce",
cursorAccent: "#0c1014",
selectionBackground: "#99d1ce",
selectionForeground: "#0c1014",
black: "#0c1014",
red: "#c23127",
green: "#2aa889",
yellow: "#edb443",
blue: "#195466",
magenta: "#4e5166",
cyan: "#33859e",
white: "#99d1ce",
brightBlack: "#0c1014",
brightRed: "#c23127",
brightGreen: "#2aa889",
brightYellow: "#edb443",
brightBlue: "#195466",
brightMagenta: "#4e5166",
brightCyan: "#33859e",
brightWhite: "#99d1ce",
},
}; };