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>
This commit is contained in:
co-authored by
Claude Opus 5
parent
51984f17d4
commit
6b0cd331bb
@@ -0,0 +1,24 @@
|
||||
/**
|
||||
* 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} />
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
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)}` }
|
||||
}
|
||||
Reference in New Issue
Block a user