Files
2026-06-24 14:40:43 +00:00

197 lines
8.2 KiB
Python

from __future__ import annotations
from copy import deepcopy
from typing import Any
def _theme(
theme_id: str,
name: str,
layout: str,
category: str,
description: str,
primary: str,
secondary: str,
accent: str,
text: str,
muted: str,
surface: str,
font: str = "Arial",
*,
custom_palette_default: bool = False,
) -> dict[str, Any]:
return {
"id": theme_id,
"name": name,
"layout": layout,
"category": category,
"description": description,
"custom_palette_default": custom_palette_default,
"palette": {
"primary_color": primary,
"secondary_color": secondary,
"accent_color": accent,
"text_color": text,
"muted_color": muted,
"surface_color": surface,
"font_family": font,
},
}
THEMES: dict[str, dict[str, Any]] = {
"modern": _theme(
"modern", "Modern Custom", "modern", "Flexibel",
"Abgerundete Karten, Verlaufskopf und frei definierbare Kundenfarben.",
"#1F5D66", "#2C7C82", "#DBA25D", "#24343A", "#718087", "#F2F6F5",
custom_palette_default=True,
),
"classic": _theme(
"classic", "Classic Custom", "classic", "Flexibel",
"Serifentypografie, feine Linien und frei definierbare Kundenfarben.",
"#243B53", "#486581", "#C3913C", "#25313A", "#76838C", "#F4F1EA", "Georgia",
custom_palette_default=True,
),
"nordic-light": _theme(
"nordic-light", "Nordic Light", "minimal", "Minimal",
"Helles, luftiges Layout mit kuehlen Blautoenen und viel Weissraum.",
"#294C60", "#6D98A6", "#E7B45A", "#1F2D33", "#75858B", "#F1F5F5", "Arial",
),
"nordic-night": _theme(
"nordic-night", "Nordic Night", "minimal", "Minimal",
"Dunkle skandinavische Farbwelt mit eisblauem Akzent.",
"#182B36", "#2F5668", "#8FD3E6", "#162329", "#6E7F86", "#EDF3F4", "Arial",
),
"alpine-sage": _theme(
"alpine-sage", "Alpine Sage", "minimal", "Minimal",
"Ruhige Salbei- und Steinfarben fuer naturnahe Marken.",
"#49665B", "#718C7D", "#C99C64", "#26332E", "#78827D", "#F2F3ED", "Georgia",
),
"executive-blue": _theme(
"executive-blue", "Executive Blue", "dashboard", "Business",
"Klares Management-Dashboard in serioesem Marineblau.",
"#173B67", "#2A6298", "#37A6B8", "#182632", "#6B7A86", "#EEF3F7", "Arial",
),
"executive-charcoal": _theme(
"executive-charcoal", "Executive Charcoal", "dashboard", "Business",
"Anthrazit, Silber und Signalblau fuer technische Reports.",
"#252B31", "#48525B", "#4FA3D1", "#20272D", "#727C84", "#F0F2F3", "Arial",
),
"executive-burgundy": _theme(
"executive-burgundy", "Executive Burgundy", "dashboard", "Business",
"Zurueckhaltendes Bordeaux mit warmem Kupferakzent.",
"#662E3A", "#8B4654", "#C08B5C", "#2E2527", "#7D7375", "#F5F0EF", "Arial",
),
"ocean-breeze": _theme(
"ocean-breeze", "Ocean Breeze", "sidebar", "Sidebar",
"Breite Seitenleiste, maritime Blautoene und frischer Aqua-Akzent.",
"#075B6C", "#18859A", "#58C6C7", "#17353B", "#69858A", "#EDF8F8", "Arial",
),
"forest-lodge": _theme(
"forest-lodge", "Forest Lodge", "sidebar", "Sidebar",
"Tannengruen, Moos und Holzton fuer Ferien- und Naturmarken.",
"#284E3C", "#47715A", "#B78B55", "#243129", "#728079", "#F1F4EF", "Georgia",
),
"sunset-coral": _theme(
"sunset-coral", "Sunset Coral", "sidebar", "Sidebar",
"Warme Koralle mit tiefem Pflaumenton und freundlicher Flaechenwirkung.",
"#A9474E", "#D06B62", "#F0B66D", "#382B30", "#82747A", "#FBF1ED", "Arial",
),
"editorial-ivory": _theme(
"editorial-ivory", "Editorial Ivory", "editorial", "Editorial",
"Magazinartige Serifengestaltung auf warmem Elfenbein.",
"#33312E", "#6D655C", "#A77D45", "#282725", "#77716A", "#F7F2E8", "Georgia",
),
"editorial-ink": _theme(
"editorial-ink", "Editorial Ink", "editorial", "Editorial",
"Schwarz, Tinte und klares Blau fuer einen publizistischen Look.",
"#17222D", "#2E485F", "#3E88A8", "#171D22", "#68747E", "#F0F3F5", "Georgia",
),
"editorial-rose": _theme(
"editorial-rose", "Editorial Rose", "editorial", "Editorial",
"Staubiges Rosa und dunkles Aubergine mit hochwertiger Anmutung.",
"#5E3548", "#8A576B", "#D59AA7", "#33272C", "#7C6E74", "#F8EFF1", "Georgia",
),
"magazine-cobalt": _theme(
"magazine-cobalt", "Magazine Cobalt", "magazine", "Magazin",
"Kräftiges Kobaltblau, grosse Typografie und asymmetrische Module.",
"#1749A3", "#2F72D6", "#F3C342", "#172438", "#66758A", "#EEF3FA", "Arial",
),
"magazine-citrus": _theme(
"magazine-citrus", "Magazine Citrus", "magazine", "Magazin",
"Dunkles Gruen mit Zitrusgelb fuer einen lebendigen Auftritt.",
"#245443", "#3E8063", "#E6C84A", "#20312A", "#6E7C75", "#F2F6E9", "Arial",
),
"magazine-plum": _theme(
"magazine-plum", "Magazine Plum", "magazine", "Magazin",
"Pflaume, Violett und Apricot fuer kreative Kundenreports.",
"#5A2D67", "#814696", "#E8A875", "#302536", "#796D7E", "#F7F0F8", "Arial",
),
"ledger-green": _theme(
"ledger-green", "Ledger Green", "ledger", "Tabellarisch",
"Praezises Tabellenlayout in klassischem Buchhaltungsgruen.",
"#275F4B", "#467A66", "#A4864D", "#26322D", "#748078", "#F1F4F0", "Courier New",
),
"ledger-blue": _theme(
"ledger-blue", "Ledger Blue", "ledger", "Tabellarisch",
"Dichtes Zahlenlayout in Blau und Schiefergrau.",
"#294D73", "#4B7198", "#8AAAC2", "#25313C", "#71808D", "#EFF3F6", "Courier New",
),
"ledger-sepia": _theme(
"ledger-sepia", "Ledger Sepia", "ledger", "Tabellarisch",
"Warmer Papiercharakter mit Sepia und Rostakzent.",
"#664B38", "#8A6A51", "#B5784E", "#382E28", "#7F746C", "#F6F0E7", "Courier New",
),
"split-teal": _theme(
"split-teal", "Split Teal", "split", "Split",
"Geteilte Titelflaeche mit Petrol und hellem Tuerkis.",
"#095B61", "#2E8E8B", "#9ED8CB", "#183334", "#698281", "#EEF7F5", "Arial",
),
"split-violet": _theme(
"split-violet", "Split Violet", "split", "Split",
"Vertikal geteiltes Layout in Violett und Lavendel.",
"#513A75", "#7557A0", "#BFA8E2", "#302A38", "#787080", "#F4F0FA", "Arial",
),
"split-terracotta": _theme(
"split-terracotta", "Split Terracotta", "split", "Split",
"Terrakotta, Lehm und Sand fuer warme Markenwelten.",
"#8B4938", "#B26950", "#E3B68F", "#3B2D29", "#84756F", "#FAF1EA", "Georgia",
),
"poster-red": _theme(
"poster-red", "Poster Red", "poster", "Statement",
"Plakatives Rot-Schwarz-Layout mit sehr grossen Kennzahlen.",
"#B3202A", "#D53B42", "#F2B84B", "#1F1D1D", "#6D6767", "#F7F2F0", "Arial",
),
"poster-yellow": _theme(
"poster-yellow", "Poster Yellow", "poster", "Statement",
"Schwarz und Signalgelb fuer maximale visuelle Klarheit.",
"#171717", "#3B3B3B", "#F1C928", "#181818", "#707070", "#F7F5E8", "Arial",
),
"poster-mono": _theme(
"poster-mono", "Poster Mono", "poster", "Statement",
"Konsequentes Schwarz-Weiss-Design mit typografischem Fokus.",
"#111111", "#444444", "#A3A3A3", "#171717", "#737373", "#F3F3F3", "Arial",
),
"soft-lavender": _theme(
"soft-lavender", "Soft Lavender", "modern", "Soft",
"Sanftes Kartenlayout in Lavendel, Flieder und warmem Rosa.",
"#67558B", "#8B76B3", "#D5A6B8", "#302B38", "#7D7485", "#F5F0F8", "Arial",
),
"midnight-gold": _theme(
"midnight-gold", "Midnight Gold", "modern", "Premium",
"Tiefes Nachtblau mit Goldakzent fuer einen hochwertigen Auftritt.",
"#172A42", "#284967", "#D2A64C", "#1B2733", "#6F7C87", "#EFF2F4", "Georgia",
),
}
def get_theme(theme_id: str) -> dict[str, Any]:
try:
return deepcopy(THEMES[theme_id])
except KeyError as exc:
raise ValueError(f"Unknown theme: {theme_id}") from exc
def public_theme_catalog() -> list[dict[str, Any]]:
return [deepcopy(THEMES[key]) for key in sorted(THEMES)]