"use client" import type { ReactNode } from "react" import { ChevronDownIcon, ChevronUpIcon } from "lucide-react" import { Button } from "@/components/ui/button" import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible" import { cn } from "@/lib/utils" import { fontLibrary, paletteLibrary, themeColors } from "../../../lib/theme" import type { ColorOverrides, Palette, TemplateContent, TemplateDefinition, TemplateStyle } from "../../../lib/types" import { Toggle } from "./toggle" type ThemePatch = Partial> const colorFields: { key: keyof ColorOverrides; label: string }[] = [ { key: "bg", label: "Hintergrund" }, { key: "fg", label: "Text" }, { key: "muted", label: "Nebentext" }, { key: "surface", label: "Flächen" }, { key: "accent", label: "Akzent" }, ] const imageOptions: { key: TemplateStyle["images"]; label: string }[] = [ { key: "original", label: "Original" }, { key: "mono", label: "Schwarzweiß" }, { key: "warm", label: "Warm" }, { key: "soft", label: "Sanft" }, { key: "contrast", label: "Kontrast" }, ] const choice = (active: boolean) => cn("cursor-pointer rounded-lg border text-left text-sm transition-shadow", active ? "ring-2 ring-ring" : "hover:border-foreground/30") function Heading({ title, text }: { title: string; text?: string }) { return (

{title}

{text &&

{text}

}
) } function Swatch({ palette, active, label, onClick, small }: { palette: Palette; active: boolean; label: string; onClick: () => void; small?: boolean }) { return ( ) } function More({ label, children }: { label: string; children: ReactNode }) { return ( {label}
{children}
) } export function DesignPanel({ def, content, onChange }: { def: TemplateDefinition; content: TemplateContent; onChange: (patch: ThemePatch) => void }) { const theme = themeColors(def, content) const ownPalettes = new Set(def.palettes.map((p) => `${def.key}:${p.key}`)) const ownFonts = new Set(def.fonts.map((f) => `${def.key}:${f.key}`)) const customized = Object.values(content.colors).some(Boolean) const optional = content.order .map((key) => def.sections.find((section) => section.key === key)) .filter((section) => section !== undefined) function setPalette(key: string) { // Neue Palette: eigene Farben zurücksetzen, sonst sieht man den Wechsel nicht onChange({ palette: key, colors: { bg: "", fg: "", muted: "", surface: "", accent: "" } }) } function move(index: number, offset: number) { const keys = optional.map((section) => section.key) const [key] = keys.splice(index, 1) keys.splice(index + offset, 0, key) onChange({ order: keys }) } return (
{def.palettes.map((p) => ( setPalette(p.key)} /> ))}
{paletteLibrary .filter((entry) => !ownPalettes.has(entry.key)) .map((entry) => ( setPalette(entry.key)} /> ))}
{colorFields.map((field) => ( ))}
{customized && ( )}
{def.fonts.map((pair) => ( ))}
{fontLibrary .filter((entry) => !ownFonts.has(entry.key)) .map((entry) => ( ))}
{imageOptions.map((option) => ( ))}
{(["full", "subtle"] as const).map((motion) => ( ))}
{optional.map((section, index) => (
onChange({ hidden: visible ? content.hidden.filter((key) => key !== section.key) : [...content.hidden, section.key] }) } > {section.label}
))}
) }