File size: 1,748 Bytes
fa8df4c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4a3d0a5
fa8df4c
 
4a3d0a5
 
 
fa8df4c
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
"""The two deck themes. Both are space themes in the app's own palette (black, #217cff, white): one on a night sky, one
on a pale daylight sky. Colours are plain hex so the HTML and the PowerPoint use exactly the same values."""

from dataclasses import dataclass

W, H = 1920, 1080  # every slide is drawn at this size


@dataclass(frozen=True)
class Palette:
    bg1: str  # sky at the edges
    bg2: str  # sky at its brightest point
    ink: str  # headings and body text
    mute: str  # secondary text
    accent: str  # kickers, numbers, markers
    accent2: str  # second accent (planets, rings)
    card: str  # card and panel fill
    cardline: str  # card and panel border
    line: str  # rules and dividers
    band: str  # the closing band
    bandink: str  # text on the band
    star: str  # star colour


@dataclass(frozen=True)
class Theme:
    id: str
    name: str
    dark: bool
    pal: Palette


THEMES: dict[str, Theme] = {t.id: t for t in (
    Theme("dark-space", "Night stellar", True, Palette(
        bg1="#000000", bg2="#0a1736", ink="#ffffff", mute="#b4bccc", accent="#4d94ff", accent2="#217cff",
        card="#0b1326", cardline="#1f3156", line="#26385c", band="#0e1c3d", bandink="#ffffff", star="#ffffff")),
    Theme("light-space", "Moon light", False, Palette(
        bg1="#c3cddf", bg2="#dfe5ef", ink="#0b1a3a", mute="#36435f", accent="#1858c4", accent2="#0b3d91",
        card="#e9eef6", cardline="#b3bfd5", line="#a7b4cc", band="#0b1a3a", bandink="#ffffff", star="#0b1a3a")),
)}
DEFAULT_THEME = "dark-space"

FONTS = {"display": "Space Grotesk", "body": "Inter", "mono": "JetBrains Mono"}


def theme_id(value: object) -> str:
    return value if isinstance(value, str) and value in THEMES else DEFAULT_THEME