from typing import Literal, Optional class ThemeManager: def __init__(self, theme: Literal["dark", "light"] = "dark"): self.use_theme(theme) def use_theme(self, theme: str): if theme == "dark": self.ACCENT = "#ed7d3a" self.ACCENT_HOVER = "rgb(236, 194, 169)" self.BACKGROUND = "#0e0e0e" self.FOREGROUND = "#f0f0f0" self.BORDER = "#3a9bed" self.SURFACE_MUTED = "#8b8b8b" self.SUCCESS = "#4cd964" self.ERROR = "red" self.DISABLED = "#999999" self.DISABLED_BG = "#444444" self.DISABLED_BORDER = "#666666" else: self.ACCENT = "#004488" self.ACCENT_HOVER = "#0077cc" self.BACKGROUND = "#ffffff" self.FOREGROUND = "#000000" self.BORDER = "#003366" self.SURFACE_MUTED = "#dddddd" self.SUCCESS = "#007f00" self.ERROR = "#cc0000" self.DISABLED = "#cccccc" self.DISABLED_BG = "#f0f0f0" self.DISABLED_BORDER = "#aaaaaa" # Shared base + primary + tonal self.DARK = "#000000" self.LIGHT = "#ffffff" self.PRIMARY_0 = "#6e1106" self.PRIMARY_10 = "#812f1f" self.PRIMARY_20 = "#934937" self.PRIMARY_30 = "#a46251" self.PRIMARY_40 = "#b57b6b" self.PRIMARY_50 = "#c59487" self.SURFACE_0 = "#121212" self.SURFACE_10 = "#282828" self.SURFACE_20 = "#3f3f3f" self.SURFACE_30 = "#575757" self.SURFACE_40 = "#717171" self.SURFACE_50 = "#8b8b8b" self.TONAL_0 = "#1d1411" self.TONAL_10 = "#322927" self.TONAL_20 = "#48403e" self.TONAL_30 = "#605856" self.TONAL_40 = "#787270" self.TONAL_50 = "#928c8b" self.COMPONENT_CLASSES = { "palette--foreground", "palette--background", "palette--accent", "palette--accent-hover", "palette--border", "palette--surface-muted", "palette--primary-0", "palette--primary-10", "palette--primary-20", "palette--primary-30", "palette--primary-40", "palette--primary-50", "palette--surface-0", "palette--surface-10", "palette--surface-20", "palette--surface-30", "palette--surface-40", "palette--surface-50", "palette--success", "palette--error", "palette--disabled", "palette-bg--accent", "palette-bg--background", "palette-bg--surface", } # === Singleton-style global instance === _theme_instance: Optional[ThemeManager] = None def get_theme(theme: Literal["dark", "light"] = "dark") -> ThemeManager: global _theme_instance if _theme_instance is None: _theme_instance = ThemeManager(theme) return _theme_instance