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. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
20 lines
583 B
TypeScript
20 lines
583 B
TypeScript
'use client'
|
|
|
|
import { de } from '@/lib/i18n/de'
|
|
|
|
export default function Error({ reset }: { error: Error; reset: () => void }) {
|
|
return (
|
|
<main id="inhalt" className="mx-auto max-w-(--container-measure) px-6 py-12">
|
|
<h1 className="font-condensed">{de.errors.unexpected.title}</h1>
|
|
<p className="mt-2 text-text-dim">{de.errors.unexpected.body}</p>
|
|
<button
|
|
type="button"
|
|
onClick={reset}
|
|
className="mt-4 border border-line bg-raised px-3 py-1.5 font-condensed text-xs"
|
|
>
|
|
{de.common.retry}
|
|
</button>
|
|
</main>
|
|
)
|
|
}
|