"""The premade themes: one HTML template each (templates/.html.j2), all space themed with muted palettes."""
from dataclasses import dataclass
@dataclass(frozen=True)
class Theme:
id: str
name: str
blurb: str
swatch: tuple[str, str, str] # background, accent, second accent: for the picker card
THEMES: dict[str, Theme] = {t.id: t for t in (
Theme("launch", "Launch", "A rocket, stage by stage, with a countdown", ("#1d2a34", "#cfa24d", "#c8745f")),
Theme("galaxy", "Galaxy", "Spiral arms and glowing orbit rings", ("#241f33", "#b79ad6", "#7fa3b8")),
Theme("solar", "Solar System", "Planets in a row and a route between them", ("#1b2433", "#d9a441", "#7fa3b8")),
Theme("station", "Space Station", "A blueprint of modules and solar wings", ("#16283a", "#8fb8c9", "#d9a441")),
Theme("moonbase", "Moon Base", "A lunar surface, a dome and a flag", ("#2b2b30", "#d8d2c4", "#c8745f")),
Theme("observatory", "Observatory", "A telescope under a chart of stars", ("#14282b", "#8fc2b4", "#d6b66a")),
)}
DEFAULT_THEME = "midnight" # the look new infographics start with (the six above are the older fixed themes)
def theme_id(value: object) -> str:
"""A look (design.LOOKS) or one of the older themes; the default when unknown."""
from app.infographics.design import LOOKS
return value if isinstance(value, str) and (value in LOOKS or value in THEMES) else DEFAULT_THEME