from textual.containers import Vertical from textual.message import Message from textual.widget import Widget from textual.widgets import Button, Static class ThemeSelector(Widget): """Widget for selecting and applying Textual themes.""" class ThemeSelected(Message): """Message posted when a theme is selected.""" def __init__(self, theme_name: str): super().__init__() self.theme_name = theme_name AVAILABLE_THEMES = [ ("textual-dark", "textual-dark"), ("textual-light", "textual-light"), ("nord", "nord"), ("gruvbox", "gruvbox"), ("catppuccin-mocha", "catppuccin-mocha"), ("dracula", "dracula"), ("tokyo-night", "tokyo-night"), ("monokai", "monokai"), ("flexoki", "flexoki"), ("catppuccin-latte", "catppuccin-latte"), ("solarized-light", "solarized-light"), ] def compose(self): yield Static("Theme Options", id="theme_title") with Vertical() as column: column.styles.width = "1fr" column.styles.height = "auto" for label, btn_id in self.AVAILABLE_THEMES: yield Button(label, id=f"set_theme_{btn_id}", compact=True) def on_button_pressed(self, event: Button.Pressed) -> None: button_id = event.button.id if button_id and button_id.startswith("set_theme_"): theme_name = button_id.replace("set_theme_", "") self.post_message(self.ThemeSelected(theme_name))