Grundgeruest der Anwendung: Next.js 15 (App Router), TypeScript im strict-Modus, Tailwind mit shadcn/ui-Farbtokens. Bewusste Festlegungen: - Nur Systemschriften, keine externen Fonts, kein CDN. - Grundschrift eine Stufe groesser, Fokusring immer sichtbar, Touchziele mindestens 44px. - Ampelfarben fuer Fristen als eigene Design-Tokens. - Betraege werden als Cent-Ganzzahl gefuehrt, damit die Rechnungslegung keine Rundungsfehler erbt. - .env.example dokumentiert alle Geheimnisse; npm run schluessel erzeugt sie. Etappe: 1 Phase: Fundament
37 lines
1.1 KiB
JavaScript
37 lines
1.1 KiB
JavaScript
/** @type {import('next').NextConfig} */
|
|
const nextConfig = {
|
|
// Standalone-Build fuer ein schlankes Docker-Image.
|
|
output: 'standalone',
|
|
reactStrictMode: true,
|
|
poweredByHeader: false,
|
|
// Argon2 ist eine native Bibliothek und darf nicht gebundelt werden.
|
|
serverExternalPackages: ['@node-rs/argon2'],
|
|
eslint: {
|
|
ignoreDuringBuilds: false,
|
|
},
|
|
async headers() {
|
|
return [
|
|
{
|
|
source: '/:path*',
|
|
headers: [
|
|
{ key: 'X-Content-Type-Options', value: 'nosniff' },
|
|
{ key: 'X-Frame-Options', value: 'DENY' },
|
|
{ key: 'Referrer-Policy', value: 'no-referrer' },
|
|
{ key: 'X-DNS-Prefetch-Control', value: 'off' },
|
|
{
|
|
key: 'Permissions-Policy',
|
|
// Kamera bleibt erlaubt: Belege werden am Handy fotografiert.
|
|
value: 'camera=(self), microphone=(self), geolocation=(), interest-cohort=()',
|
|
},
|
|
{
|
|
key: 'Strict-Transport-Security',
|
|
value: 'max-age=63072000; includeSubDomains; preload',
|
|
},
|
|
],
|
|
},
|
|
]
|
|
},
|
|
}
|
|
|
|
export default nextConfig
|