# Anelia Wolf – Website Statische Website für Anelia Wolf (Keynote Speakerin, Trainerin, Coach). Zwölf Routen in zwei Sprachen: Startseite, drei Leistungsseiten, Impressum und Datenschutz – deutsch auf `/`, englisch unter `/en/` – plus die 404. Next.js 16 (App Router) im **Static Export**, Tailwind v4, GSAP + Lenis, TypeScript. Kein Backend, keine Datenbank, keine Formulare. ## Entwickeln und bauen ```bash npm install npm run dev # http://localhost:3000 npm run build # erzeugt out/ npm run lint npx tsc --noEmit ``` `next.config.ts` setzt `output: "export"` und `trailingSlash: true`. Der Build schreibt den fertigen Ordner **`out/`** – das ist das komplette Deployment: rein statische Dateien für einen beliebigen Webhoster (Apache, nginx, Uberspace, Netlify, …). Kein Node-Prozess auf dem Server, kein `next start`. ## Was diese Seite bewusst nicht tut Diese Regeln sind nicht kosmetisch – die Datenschutzerklärung sagt sie zu: - **keine externen Requests**: keine Google Fonts, keine CDNs, keine Videos, keine Karten, keine Social-Plugins, keine Analytics. Schriften werden über `next/font` zur Build-Zeit selbst gehostet. - **kein Storage**: kein localStorage, kein sessionStorage, keine Cookies – deshalb auch kein Cookie-Banner. - **kein Kontaktformular**, kein Newsletter. Kontakt läuft über `mailto:` und Telefon. Wer eine dieser Zusagen ändert, muss `src/content/legal.ts` (Ziffer 2, 3 und 6) mit ändern. ## Wo was liegt | Pfad | Inhalt | |---|---| | `src/app/(de)/` | deutsche Routen (`page.tsx` je Seite) und ihr Wurzel-Layout mit `` | | `src/app/en/` | englische Routen und ihr Wurzel-Layout mit `` | | `src/app/global-not-found.tsx` | 404 für unbekannte Adressen – wird zu `out/404.html` | | `src/components/pages/` | Der Aufbau jeder Seite, einmal für beide Sprachen | | `src/content/en/` | die englischen Texte, Datei für Datei dieselbe Struktur | | `src/lib/i18n.ts` | Pfade beider Sprachen, Sprachumschalter, hreflang | | `src/content/*.ts` | **Sämtliche Texte.** Wer Copy ändert, ändert nur hier – nie im JSX. | | `src/lib/site.ts` | Stammdaten (Name, E-Mail, Telefon, LinkedIn), Navigation, Routen, **Flags** | | `src/lib/legal.ts` | Platzhalter-Logik, Build-Guard, `LEGAL_TODO` / `CONTENT_TODO` | | `src/lib/assets.ts` | Build-Zeit-Prüfung der Drop-in-Dateien (fehlt eine, rendert die dokumentierte Variante B) | | `src/components/` | `layout/`, `motion/` (GSAP-Primitiven), `ui/`, `brand/`, `home/`, `services/` | | `public/brand/`, `public/photos/` | Drop-in-Slots für Logo und Fotos (je eigene README) | | `docs/superpowers/` | Spec und Build-Plan | ## Drop-in-Assets Fehlt eine Datei, bricht nichts – die Seite rendert die dokumentierte Alternative: | Datei | Fehlt sie, dann … | |---|---| | `public/brand/logo-mark.svg` | typografisches ``-Monogramm statt des echten Logos | | `public/brand/logo-full.png` | kein Social-Preview-Bild in den OpenGraph-Daten | | `public/photos/anelia-hero.jpg` | Hero ohne Foto (Monogramm trägt die Fläche) | | `public/photos/anelia-portrait.jpg` | „Über Anelia“ ohne Foto | | `public/photos/anelia-stage.jpg` | Keynotes-Seite ohne Bühnenfoto | | `public/speaker-profil.pdf` | Speaker-Profil-Zeile entfällt (zusätzlich `flags.showSpeakerPdf`) | Das gelieferte Logo-SVG wird inline eingebettet. Enthält es ein `