Source code for charted.utils.themes

import copy
from typing import Optional, TypedDict

from charted.utils.defaults import DEFAULT_COLORS, DEFAULT_FONT, DEFAULT_TITLE_FONT_SIZE


[docs] class LegendConfig(TypedDict): font_size: str | None legend_padding: float | None position: str | None
[docs] class MarkerConfig(TypedDict): marker_size: float | None
[docs] class PaddingConfig(TypedDict): h_padding: float | None v_padding: float | None
[docs] class TitleConfig(TypedDict): font_size: str | None font_family: str | None font_weight: str | None font_color: str | None
[docs] class GridConfig(TypedDict): stroke: str | None stroke_dasharray: str | None
[docs] class Theme(TypedDict): colors: list[str] | None v_grid: GridConfig | None h_grid: GridConfig | None
[docs] @classmethod def load(cls, theme: Optional["Theme"]) -> "Theme": if not theme: return copy.deepcopy(DEFAULT_THEME) def deep_merge(default, custom): for key in custom: if key in default: if isinstance(default[key], dict) and isinstance(custom[key], dict): deep_merge(default[key], custom[key]) else: default[key] = custom[key] else: default[key] = custom[key] return default return deep_merge(copy.deepcopy(DEFAULT_THEME), theme)
DEFAULT_THEME = Theme( legend=LegendConfig( font_size=11, legend_padding=0.25, position="topright", ), marker=MarkerConfig( marker_size=3, ), title=TitleConfig( font_size=DEFAULT_TITLE_FONT_SIZE, font_family=DEFAULT_FONT, font_weight="bold", font_color="#444444", ), colors=DEFAULT_COLORS, v_grid=GridConfig( stroke="#CCCCCC", stroke_dasharray=None, ), h_grid=GridConfig( stroke="#CCCCCC", stroke_dasharray=None, ), padding=PaddingConfig( h_padding=0.05, v_padding=0.05, ), )