Files
AfiS-Aktensystem/web/components/StampMark.tsx
T
HarlekinandClaude Opus 5 6b0cd331bb Web-Anwendung: Design-Tokens, Texte, Gesundheitsendpunkt
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>
2026-09-01 00:01:41 +02:00

39 lines
1.2 KiB
TypeScript

import { de } from '@/lib/i18n/de'
const STAMP_COLOR: Record<number, string> = {
0: 'var(--color-stamp-0)',
1: 'var(--color-stamp-1)',
2: 'var(--color-stamp-2)',
3: 'var(--color-stamp-3)',
4: 'var(--color-stamp-4)',
5: 'var(--color-stamp-5)',
}
export function stampColor(level: number): string {
return STAMP_COLOR[level] ?? STAMP_COLOR[0]!
}
/**
* Stempelmarke oben rechts am Objekt. Der Stempelcharakter kommt aus dem
* schmalen Schnitt, der Rahmenlinie und der Farbe, nicht aus Grossbuchstaben.
* Die Stufe steht zusaetzlich als Text, nicht nur als Farbe.
*/
export function StampMark({ level }: { level: number }) {
return (
<span
className="inline-flex items-center gap-1.5 border px-1.5 py-0.5 font-condensed text-2xs"
style={{ borderColor: stampColor(level), color: stampColor(level) }}
>
<span aria-hidden className="font-mono">
{level}
</span>
{de.clearance.names[level] ?? de.common.unknown}
</span>
)
}
/** Die 3 px breite Klassifizierungskante links am Objekt. */
export function classificationEdgeStyle(level: number): React.CSSProperties {
return { borderLeft: `var(--spacing-edge) solid ${stampColor(level)}` }
}