Source code for charted.themes.registry

"""Theme registration and management for charted."""

from charted.themes.core import Theme

# Registered themes storage
_registered_themes: dict[str, Theme] = {}

# Default theme name
_default_theme_name: str = "light"


def register_theme(name: str, theme: Theme) -> None:
    """Register a custom theme by name.

    Registered themes can be used like presets:

    ```python
    from charted import register_theme, Theme

    register_theme("corporate", Theme(colors=["#1a365d", "#2b6cb0"]))
    chart = BarChart(data=[1, 2, 3], labels=["a", "b", "c"], theme="corporate")
    ```

    Args:
        name: Unique identifier for the theme.
        theme: Theme instance to register.
    """
    if not name or not name.strip():
        raise ValueError("Theme name cannot be empty")
    _registered_themes[name] = theme


def list_themes() -> list[str]:
    """List all available theme names.

    Returns:
        List of registered theme names (presets + custom).
    """
    return sorted(list(_registered_themes.keys()))


[docs] def get_theme(name: str) -> Theme: """Get a theme by name. Args: name: Theme name (preset or registered). Returns: Theme instance. Raises: ValueError: If theme is not found. """ if name in _registered_themes: return _registered_themes[name].__copy__() raise ValueError(f"Theme not found: {name!r}")
def get_default_theme() -> str: """Get the current default theme name. Returns: Default theme name (e.g., "light"). """ return _default_theme_name def set_default_theme(name: str) -> None: """Set the default theme for new charts. Args: name: Theme name to use as default. """ if name not in _registered_themes: # Allow preset names even if not registered from charted.themes.core import Theme Theme.from_preset(name) # Validate it exists global _default_theme_name _default_theme_name = name