Design-Tokens aus docs/10-design-system.md als CSS-Variablen: Grundpalette, die sechs Klassifizierungsfarben, Eckenradius durchgehend 2 px, keine Schatten ausser dem Fokusring. Der Schwärzungsbalken mit dem einmaligen Durchwischen respektiert prefers-reduced-motion. Vier Tests halten die Tokens gegen das Dokument. IBM Plex selbst gehostet als woff2, latin und latin-ext getrennt über unicode-range, font-display: swap, immutable-Cache. Alle Oberflächentexte in lib/i18n/de.ts. Ein Test durchsucht app/ und components/ nach Umlauten im JSX und schlägt fehl, wenn dort deutscher Text steht. Er hat beim ersten Lauf gleich einen Verstoss gefunden. /api/health prüft Datenbank, Discord-Gateway und ClamAV. Die Gesamtbewertung fällt nur auf "down", wenn die Datenbank weg ist: die anderen Dienste haben eigene Healthchecks im Stack, und ein ausgefallener Virenscanner soll nicht den Web-Container als tot markieren. Strikte CSP mit Nonce, kein unsafe-inline für Skripte. Die erste Route liegt bei 100 kB JavaScript nach Kompression, Budget sind 120 kB.
25 lines
652 B
TypeScript
25 lines
652 B
TypeScript
/**
|
|
* Platzhalterflaeche fuer Ladezustaende. Das Skelett bildet die spaetere
|
|
* Struktur exakt nach (gleiche Hoehen, gleiche Spaltenbreiten), damit beim
|
|
* Eintreffen der Daten nichts springt. Siehe docs/09-performance-und-ux.md.
|
|
*/
|
|
export function Skeleton({
|
|
className = '',
|
|
width,
|
|
}: {
|
|
className?: string
|
|
width?: string | number
|
|
}) {
|
|
return (
|
|
<span
|
|
aria-hidden
|
|
className={`block bg-raised ${className}`}
|
|
style={width === undefined ? undefined : { width }}
|
|
/>
|
|
)
|
|
}
|
|
|
|
export function SkeletonLine({ width = '100%' }: { width?: string | number }) {
|
|
return <Skeleton className="h-[0.9rem] my-2" width={width} />
|
|
}
|