95 lines
2.9 KiB
Python
95 lines
2.9 KiB
Python
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
|