python/catppuccin/models.py
2025-03-17 20:44:52 +00:00

192 lines
4.7 KiB
Python

"""Dataclass definitions for the Catppuccin palette data structure."""
from collections.abc import Iterator
from dataclasses import dataclass
__all__ = ["Palette", "Flavor", "FlavorColors", "Color", "RGB", "HSL"]
@dataclass(frozen=True)
class RGB:
"""Color represented as red, green, and blue (all 0-255)."""
r: int
"""@public"""
g: int
"""@public"""
b: int
"""@public"""
@dataclass(frozen=True)
class HSL:
"""Color represented as hue (0-359), saturation (0-1), and lightness (0-1)."""
h: float
"""@public"""
s: float
"""@public"""
l: float # noqa: E741
"""@public"""
@dataclass(frozen=True)
class Color:
"""A single color in the Catppuccin palette."""
name: str
"""A human-readable name such as `Pink` or `Surface0`."""
identifier: str
"""The lowercase key used to identify the color. This differs from `name` in
that it's intended for machine usage rather than presentation."""
accent: bool
"""Whether the color is considered an accent color. Accent colors are the
first 14 colors in the palette, also called the analogous colours. The
remaining 12 non-accent colors are also referred to as the monochromatic
colors."""
order: int
"""Order of the color in the palette spec."""
hex: str
"""The color represented as a six-digit hex string with a leading hash (#)."""
rgb: RGB
"""The color represented as individual red, green, and blue channels. (0-255)"""
hsl: HSL
"""The color represented as individual hue (0-359), saturation (0-1), and
lightness (0-1) channels."""
@dataclass(frozen=True)
class FlavorColors:
"""All of the colors for a particular flavor of Catppuccin.
Can be iterated over, in which case the colors are yielded in order.
"""
rosewater: Color
"""@public"""
flamingo: Color
"""@public"""
pink: Color
"""@public"""
mauve: Color
"""@public"""
red: Color
"""@public"""
maroon: Color
"""@public"""
peach: Color
"""@public"""
yellow: Color
"""@public"""
green: Color
"""@public"""
teal: Color
"""@public"""
sky: Color
"""@public"""
sapphire: Color
"""@public"""
blue: Color
"""@public"""
lavender: Color
"""@public"""
text: Color
"""@public"""
subtext1: Color
"""@public"""
subtext0: Color
"""@public"""
overlay2: Color
"""@public"""
overlay1: Color
"""@public"""
overlay0: Color
"""@public"""
surface2: Color
"""@public"""
surface1: Color
"""@public"""
surface0: Color
"""@public"""
base: Color
"""@public"""
mantle: Color
"""@public"""
crust: Color
"""@public"""
def __iter__(self) -> Iterator[Color]:
"""Iterate over colors in the flavor."""
yield from [
self.rosewater,
self.flamingo,
self.pink,
self.mauve,
self.red,
self.maroon,
self.peach,
self.yellow,
self.green,
self.teal,
self.sky,
self.sapphire,
self.blue,
self.lavender,
self.text,
self.subtext1,
self.subtext0,
self.overlay2,
self.overlay1,
self.overlay0,
self.surface2,
self.surface1,
self.surface0,
self.base,
self.mantle,
self.crust,
]
@dataclass(frozen=True)
class Flavor:
"""A flavor is a collection of colors.
Catppuccin has four flavors; Latte, Frappé, Macchiato, and Mocha.
"""
name: str
"""A human-readable name such as `Latte` or `Mocha`."""
identifier: str
"""The lowercase key used to identify the flavor. This differs from `name`
in that it's intended for machine usage rather than presentation"""
order: int
"""Order of the flavor in the palette spec."""
dark: bool
"""Whether this flavor is dark or light oriented. Latte is light, the other
three flavors are dark."""
colors: FlavorColors
"""@public"""
@dataclass(frozen=True)
class Palette:
"""The top-level type that encompasses the Catppuccin palette data structure.
Primarily used via the `PALETTE` constant.
Can be iterated over, in which case the flavors are yielded in the canonical
order: Latte, Frappé, Macchiato, Mocha.
"""
latte: Flavor
"""The light flavor."""
frappe: Flavor
"""The lightest dark flavor."""
macchiato: Flavor
"""The medium dark flavor."""
mocha: Flavor
"""The darkest dark flavor."""
def __iter__(self) -> Iterator[Flavor]:
"""Iterate over flavors in the palette."""
yield from [self.latte, self.frappe, self.macchiato, self.mocha]