'use client'; import { useTranslations } from 'next-intl'; import { BRAND_OLIVE, BRAND_OLIVE_FILL, BRAND_PLATE, BRAND_YELLOW } from './brand'; export type TesseraLogoVariant = 'mark' | 'horizontal'; export interface TesseraLogoProps { /** Welche Bausteine gerendert werden. Vorgabe: `'horizontal'`. */ variant?: TesseraLogoVariant; /** Kantenlaenge der Bildmarke in Pixeln. Vorgabe: 32. */ size?: number; /** * Optionaler Untertitel unter dem Schriftzug, rechts neben der Bildmarke — * die Anordnung der gelieferten Datei `tessera-logo-schriftzug.svg`. Ohne * Angabe steht rechts nur der Name. Nur fuer `variant="horizontal"`. */ tagline?: string; /** * Schaltet die halbtransparente helle Kontur der Grundplatte im dunklen * Erscheinungsbild ein. Auf Flaechen, die unabhaengig vom * Erscheinungsbild immer hell sind (etwa das gelbe Anmelde-Panel), muss * dies auf `false` gesetzt werden. Vorgabe: `true`. */ plateOutline?: boolean; /** Zusaetzliche Klassen fuer das aeusserste Element der gewaehlten Variante. */ className?: string; /** Zusaetzliche Klassen fuer den Schriftzug (nur `horizontal`). */ wordmarkClassName?: string; /** Zusaetzliche Klassen fuer den Untertitel (nur zusammen mit `tagline`). */ taglineClassName?: string; } function LogoMark({ size, plateOutline, className, ariaLabel, }: { size: number; plateOutline: boolean; className?: string; ariaLabel: string; }) { return ( {/* Alle fuenf Kacheln folgen `--primary`: die gedrehte Signalkachel direkt, die vier anderen als abgeleiteter dunklerer Ton (BRAND_OLIVE_FILL, Kalibrierung in brand.ts). `var()`/`color-mix()` sind in SVG-Praesentationsattributen nicht zuverlaessig, im Inline-Style schon -- deshalb tragen alle fuenf Kacheln ihre Akzentfarben-Fuellung als Inline-Style. Der feste Olivton bleibt an den vier Kacheln zusaetzlich als Praesentationsattribut stehen: ein Browser ohne `color-mix()`-Unterstuetzung verwirft die Inline-Deklaration, und ohne dieses Attribut waere die Kachel schwarz (SVG-Standardfuellung). `--primary` wird von applyAccentColor() in auth-store.ts gesetzt und hat in globals.css immer einen Standardwert (oklch(0.91 0.19 102), Markengelb). */} ); } /** * Zentrale Bildmarken-Komponente von Tessera. Buendelt die Bildmarke, den * Schriftzug und deren Anordnung an einer einzigen Stelle -- eine spaetere * mandantenspezifische Gestaltung setzt hier an, nicht an den einzelnen * Verwendungsstellen. * * Die gesamte Bildmarke folgt der persoenlichen Akzentfarbe (CSS-Token * `--primary`, siehe LogoMark): die gedrehte Signalkachel direkt, die vier * anderen als daraus abgeleiteter dunklerer Ton (siehe brand.ts). */ export function TesseraLogo({ variant = 'horizontal', size = 32, tagline, plateOutline = true, className, wordmarkClassName, taglineClassName, }: TesseraLogoProps) { const t = useTranslations('common'); const ariaLabel = t('brand.logoAlt'); if (variant === 'mark') { return ( ); } // Bildmarke links, Schriftzug rechts daneben. Traegt die Komponente einen // Untertitel, steht er unter dem Namen — dieselbe Anordnung wie in der // gelieferten Datei `tessera-logo-schriftzug.svg`. return ( {t('appName')} {tagline ? ( {tagline} ) : null} ); }