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)]