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>
22 lines
721 B
JavaScript
22 lines
721 B
JavaScript
import { dirname } from 'node:path'
|
|
import { fileURLToPath } from 'node:url'
|
|
import { FlatCompat } from '@eslint/eslintrc'
|
|
|
|
const compat = new FlatCompat({ baseDirectory: dirname(fileURLToPath(import.meta.url)) })
|
|
|
|
export default [
|
|
{ ignores: ['.next/**', 'node_modules/**', 'next-env.d.ts', 'playwright-report/**'] },
|
|
...compat.extends('next/core-web-vitals', 'next/typescript'),
|
|
{
|
|
rules: {
|
|
// Sprachkonvention: Oberflaechentexte gehoeren nach lib/i18n/de.ts,
|
|
// nie hart ins JSX. Siehe CLAUDE.md.
|
|
'@typescript-eslint/no-unused-vars': [
|
|
'error',
|
|
{ argsIgnorePattern: '^_', varsIgnorePattern: '^_' },
|
|
],
|
|
'@typescript-eslint/no-explicit-any': 'error',
|
|
},
|
|
},
|
|
]
|