|
"""Tools for enabling and registering chart themes.""" |
|
|
|
from __future__ import annotations |
|
|
|
from typing import TYPE_CHECKING, Final, Literal, get_args |
|
|
|
from altair.utils.theme import ThemeRegistry |
|
from altair.vegalite.v5.schema._typing import VegaThemes |
|
|
|
if TYPE_CHECKING: |
|
import sys |
|
|
|
if sys.version_info >= (3, 10): |
|
from typing import TypeAlias |
|
else: |
|
from typing_extensions import TypeAlias |
|
|
|
AltairThemes: TypeAlias = Literal["default", "opaque"] |
|
VEGA_THEMES: list[str] = list(get_args(VegaThemes)) |
|
|
|
|
|
class VegaTheme: |
|
"""Implementation of a builtin vega theme.""" |
|
|
|
def __init__(self, theme: str) -> None: |
|
self.theme = theme |
|
|
|
def __call__(self) -> dict[str, dict[str, dict[str, str | int]]]: |
|
return { |
|
"usermeta": {"embedOptions": {"theme": self.theme}}, |
|
"config": {"view": {"continuousWidth": 300, "continuousHeight": 300}}, |
|
} |
|
|
|
def __repr__(self) -> str: |
|
return f"VegaTheme({self.theme!r})" |
|
|
|
|
|
|
|
|
|
|
|
ENTRY_POINT_GROUP: Final = "altair.vegalite.v5.theme" |
|
themes = ThemeRegistry(entry_point_group=ENTRY_POINT_GROUP) |
|
|
|
themes.register( |
|
"default", |
|
lambda: {"config": {"view": {"continuousWidth": 300, "continuousHeight": 300}}}, |
|
) |
|
themes.register( |
|
"opaque", |
|
lambda: { |
|
"config": { |
|
"background": "white", |
|
"view": {"continuousWidth": 300, "continuousHeight": 300}, |
|
} |
|
}, |
|
) |
|
themes.register("none", dict) |
|
|
|
for theme in VEGA_THEMES: |
|
themes.register(theme, VegaTheme(theme)) |
|
|
|
themes.enable("default") |
|
|