Design System
Hallo, ich bin Sophie! 👋 Hier finden Sie unser Design System für Partner-Integrationen. Damit stellst Sie sicher, dass Ihre Status-Anzeigen konsistent mit BuchhaltGenie aussehen - in Light und Dark Mode!
Für Partner-Integrationen stellt BuchhaltGenie ein konsistentes Design System bereit, das semantische Farben für Status-Anzeigen verwendet. Diese Farben passen sich automatisch an Light und Dark Mode an und erfüllen die WCAG 2.1 AA Kontrast-Anforderungen.
Barrierefreiheit: Alle Farben erfüllen WCAG 2.1 AA Kontrast-Anforderungen (4.5:1 Minimum für Text, 3:1 für UI-Komponenten).
Status-Kategorien
BuchhaltGenie verwendet 5 semantische Status-Kategorien, die konsistent in allen UI-Komponenten eingesetzt werden.
| Kategorie | Farbe | CSS-Token | Verwendung |
|---|---|---|---|
success | Grün | --success | Erfolgreich, Bezahlt, Aktiv, Angenommen |
warning | Orange | --warning | Warnung, Ausstehend, Abgelaufen |
error | Rot | --destructive | Fehler, Überfällig, Abgelehnt |
info | Blau | --primary | Information, Versendet, Konvertiert |
neutral | Grau | --muted | Entwurf, Inaktiv, Storniert |
Farbwerte (HSL)
Die semantischen Token werden als CSS-Variablen definiert und passen sich automatisch an den Farbmodus an:
Light Mode
:root {
--success: 142 71% 45%; /* Grün */
--warning: 38 92% 50%; /* Orange */
--destructive: 0 84% 60%; /* Rot */
--primary: 221 83% 53%; /* Blau */
--muted: 210 40% 96%; /* Grau */
}Domain-Mappings
Für häufig verwendete Status-Typen stellt BuchhaltGenie vordefinierte Mappings bereit, die Domain-spezifische Status automatisch auf die semantischen Kategorien abbilden.
Rechnungs-Status (Invoice)
| API-Status | Kategorie | Farbe | Beschreibung |
|---|---|---|---|
draft | neutral | Grau | Entwurf, noch nicht finalisiert |
sent | info | Blau | Rechnung versendet |
paid | success | Grün | Rechnung bezahlt |
overdue | error | Rot | Zahlung überfällig |
cancelled | neutral | Grau | Rechnung storniert |
Angebots-Status (Quote)
| API-Status | Kategorie | Farbe | Beschreibung |
|---|---|---|---|
draft | neutral | Grau | Entwurf, noch nicht versendet |
sent | info | Blau | Versendet, wartet auf Antwort |
accepted | success | Grün | Angebot angenommen |
rejected | error | Rot | Angebot abgelehnt |
expired | warning | Orange | Angebot abgelaufen |
converted | info | Blau | In Rechnung konvertiert |
Team-Einladungen (Invitation)
| API-Status | Kategorie | Farbe | Beschreibung |
|---|---|---|---|
pending | warning | Orange | Wartet auf Antwort |
accepted | success | Grün | Einladung angenommen |
declined | error | Rot | Einladung abgelehnt |
expired | neutral | Grau | Einladung abgelaufen |
revoked | neutral | Grau | Einladung widerrufen |
System-Alerts (Severity)
| API-Status | Kategorie | Farbe | Beschreibung |
|---|---|---|---|
critical | error | Rot | Sofortige Aktion erforderlich |
warning | warning | Orange | Aufmerksamkeit erforderlich |
info | info | Blau | Informative Meldung |
CRUD-Aktionen (Activity Log)
| API-Status | Kategorie | Farbe | Beschreibung |
|---|---|---|---|
CREATE | success | Grün | Neue Ressource erstellt |
READ | info | Blau | Ressource gelesen |
UPDATE | warning | Orange | Ressource aktualisiert |
DELETE | error | Rot | Ressource gelöscht |
FAILED | error | Rot | Aktion fehlgeschlagen |
System-Health
| API-Status | Kategorie | Farbe | Beschreibung |
|---|---|---|---|
healthy | success | Grün | System läuft normal |
degraded | warning | Orange | Eingeschränkte Verfügbarkeit |
critical | error | Rot | Kritischer Systemzustand |
CSS-Klassen-Referenz
Für Partner, die eigene UI-Komponenten entwickeln, stellt BuchhaltGenie folgende CSS-Klassen bereit:
Text-Farben
| Kategorie | CSS-Klasse | Verwendung |
|---|---|---|
success | text-success | Erfolgs-Text |
warning | text-warning | Warnungs-Text |
error | text-destructive | Fehler-Text |
info | text-primary | Info-Text |
neutral | text-muted-foreground | Neutraler Text |
Hintergrund-Farben
| Kategorie | CSS-Klasse (10% Opacity) | CSS-Klasse (Solid) |
|---|---|---|
success | bg-success/10 | bg-success |
warning | bg-warning/10 | bg-warning |
error | bg-destructive/10 | bg-destructive |
info | bg-primary/10 | bg-primary |
neutral | bg-muted | bg-secondary |
Border-Farben
| Kategorie | CSS-Klasse (30% Opacity) |
|---|---|
success | border-success/30 |
warning | border-warning/30 |
error | border-destructive/30 |
info | border-primary/30 |
neutral | border-border |
Code-Beispiele
Status-Badge (TypeScript/React)
import type { StatusCategory } from '@/lib/design-system/status-color-config';
// Mapping von API-Status zu semantischer Kategorie
const INVOICE_STATUS_TO_CATEGORY: Record<string, StatusCategory> = {
draft: 'neutral',
sent: 'info',
paid: 'success',
overdue: 'error',
cancelled: 'neutral',
};
// Badge-Varianten basierend auf Kategorie
const STATUS_TO_BADGE_VARIANT: Record<StatusCategory, string> = {
success: 'success',
warning: 'warning',
error: 'destructive',
info: 'default',
neutral: 'secondary',
};
function InvoiceStatusBadge({ status }: { status: string }) {
const category = INVOICE_STATUS_TO_CATEGORY[status] || 'neutral';
const variant = STATUS_TO_BADGE_VARIANT[category];
return (
<Badge variant={variant}>
{status === 'paid' ? 'Bezahlt' : status}
</Badge>
);
}Status-Indikator mit CSS-Klassen
// Status-Klassen für eigene Komponenten
const STATUS_CLASSES = {
success: {
text: 'text-success',
bg: 'bg-success/10',
bgSolid: 'bg-success',
border: 'border-success/30',
},
warning: {
text: 'text-warning',
bg: 'bg-warning/10',
bgSolid: 'bg-warning',
border: 'border-warning/30',
},
error: {
text: 'text-destructive',
bg: 'bg-destructive/10',
bgSolid: 'bg-destructive',
border: 'border-destructive/30',
},
info: {
text: 'text-primary',
bg: 'bg-primary/10',
bgSolid: 'bg-primary',
border: 'border-primary/30',
},
neutral: {
text: 'text-muted-foreground',
bg: 'bg-muted',
bgSolid: 'bg-secondary',
border: 'border-border',
},
};
function HealthIndicator({ status }: { status: 'healthy' | 'degraded' | 'critical' }) {
const categoryMap = {
healthy: 'success',
degraded: 'warning',
critical: 'error',
};
const category = categoryMap[status];
const classes = STATUS_CLASSES[category];
return (
<div className={`flex items-center gap-2 ${classes.text}`}>
<span className={`h-2 w-2 rounded-full ${classes.bgSolid}`} />
<span>{status === 'healthy' ? 'Gesund' : status}</span>
</div>
);
}Status-Card mit Border und Background
function StatusCard({ category, title, description }: {
category: StatusCategory;
title: string;
description: string;
}) {
const classes = STATUS_CLASSES[category];
return (
<div className={`rounded-lg border p-4 ${classes.bg} ${classes.border}`}>
<h3 className={`font-semibold ${classes.text}`}>{title}</h3>
<p className="text-muted-foreground">{description}</p>
</div>
);
}WCAG 2.1 AA Konformität
Wichtig: Die Verwendung von hardcodierten Farben (wie text-green-500) anstelle der semantischen Token kann zu Kontrast-Problemen im Dark Mode führen.
Kontrast-Anforderungen
| Element-Typ | Minimum Kontrast | WCAG Kriterium |
|---|---|---|
| Normaler Text | 4.5:1 | 1.4.3 (AA) |
| Großer Text (>18px) | 3:1 | 1.4.3 (AA) |
| UI-Komponenten | 3:1 | 1.4.11 (AA) |
| Icons (informativ) | 3:1 | 1.4.11 (AA) |
Warum semantische Token?
Die semantischen Farb-Token (--success, --warning, etc.) sind so kalibriert, dass sie:
- Light Mode: Ausreichend Kontrast auf hellem Hintergrund bieten
- Dark Mode: Automatisch angepasste Werte für dunklen Hintergrund verwenden
- System-Präferenz: Auf
prefers-color-schemereagieren
Anti-Pattern: Hardcodierte Farben
// ❌ FALSCH: Hardcodierte Farben (bricht im Dark Mode)
<span className="text-green-600 dark:text-green-400">Erfolgreich</span>
// ✅ RICHTIG: Semantische Token (funktioniert in beiden Modi)
<span className="text-success">Erfolgreich</span>Automatische Dark Mode Unterstützung
/* Die semantischen Token passen sich automatisch an */
.status-badge {
color: hsl(var(--success)); /* Passt sich automatisch an */
background: hsl(var(--success) / 0.1); /* 10% Opacity */
border-color: hsl(var(--success) / 0.3); /* 30% Opacity */
}Best Practices für Partner
1. Verwende semantische Kategorien
Anstatt Farben direkt zu definieren, mappe Ihre Status auf die 5 Kategorien:
// Dein eigener Status-Typ
type MyStatus = 'active' | 'pending' | 'failed';
// Mapping zu BuchhaltGenie Kategorien
const statusToCategory: Record<MyStatus, StatusCategory> = {
active: 'success',
pending: 'warning',
failed: 'error',
};2. Teste beide Farbmodi
Stelle sicher, dass Ihre Integration sowohl im Light als auch im Dark Mode korrekt dargestellt wird.
3. Verwende die CSS-Variablen
Für eigene Styling-Anpassungen nutze die CSS-Variablen:
.my-custom-badge {
color: hsl(var(--success));
background-color: hsl(var(--success) / 0.1);
}4. Prüfe den Kontrast
Verwende Tools wie den WebAIM Contrast Checker um sicherzustellen, dass Ihre Farben WCAG 2.1 AA erfüllen.
API-Referenz
StatusCategory Type
type StatusCategory = 'success' | 'warning' | 'error' | 'info' | 'neutral';Verfügbare Mappings
| Export-Name | Domain | API-Dokumentation |
|---|---|---|
INVOICE_STATUS_TO_CATEGORY | Rechnungen | Rechnungen API |
QUOTE_STATUS_TO_CATEGORY | Angebote | — |
INVITATION_STATUS_TO_CATEGORY | Team-Einladungen | — |
ALERT_SEVERITY_TO_CATEGORY | System-Alerts | Webhooks API |
ACTION_TYPE_TO_CATEGORY | Activity Logs | — |
HEALTH_STATUS_TO_CATEGORY | System-Health | — |
Weitere Ressourcen
- WCAG 2.1 Guidelines - Offizielle W3C Richtlinien
- WebAIM Contrast Checker - Kontrast-Prüftool
- Tailwind CSS Dark Mode - Tailwind Dokumentation