58 lines
1.9 KiB
Python
58 lines
1.9 KiB
Python
from textual.theme import Theme
|
|
|
|
import site_themes
|
|
|
|
|
|
def to_textual_theme(theme: dict) -> Theme:
|
|
colors = theme["colors"]
|
|
border_start, border_end = theme.get("activeBorder") or (colors["accent"], colors["accent"])
|
|
return Theme(
|
|
name=theme["id"],
|
|
primary=border_start,
|
|
secondary=colors["blue"],
|
|
accent=border_end,
|
|
foreground=colors["foreground"],
|
|
background=colors["dark_background"],
|
|
surface=colors["background"],
|
|
panel=colors["lighter_background"],
|
|
boost=colors["selection"],
|
|
warning=colors["yellow"],
|
|
error=colors["red"],
|
|
success=colors["green"],
|
|
dark=theme.get("mode") != "light",
|
|
variables={
|
|
"text-muted": colors["muted"],
|
|
"border": border_start,
|
|
"border-blurred": colors["selection"],
|
|
"block-cursor-background": colors["accent"],
|
|
"block-cursor-foreground": colors["dark_background"],
|
|
"block-cursor-text-style": "bold",
|
|
"block-cursor-blurred-background": colors["selection"],
|
|
"block-hover-background": colors["selection"],
|
|
"footer-key-foreground": colors["accent"],
|
|
"input-selection-background": f"{colors['accent']} 35%",
|
|
"input-cursor-background": colors["foreground"],
|
|
"scrollbar": colors["selection"],
|
|
"scrollbar-hover": colors["muted"],
|
|
"scrollbar-active": colors["accent"],
|
|
},
|
|
)
|
|
|
|
|
|
def load_site_themes() -> list[Theme]:
|
|
try:
|
|
themes = site_themes.load_themes()
|
|
except (OSError, ValueError):
|
|
return []
|
|
textual_themes = []
|
|
for theme in themes:
|
|
try:
|
|
textual_themes.append(to_textual_theme(theme))
|
|
except (KeyError, ValueError):
|
|
continue
|
|
return textual_themes
|
|
|
|
|
|
def default_theme_id() -> str | None:
|
|
return site_themes.default_theme_id()
|