first publish
This commit is contained in:
88
README.md
Normal file
88
README.md
Normal file
@@ -0,0 +1,88 @@
|
||||
# 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 `<html lang="de">` |
|
||||
| `src/app/en/` | englische Routen und ihr Wurzel-Layout mit `<html lang="en">` |
|
||||
| `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 `<WolfMark/>`-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 `<script>`,
|
||||
**bricht der Build ab** – dann eine Export-Variante ohne Interaktivität liefern.
|
||||
|
||||
## Flags (`src/lib/site.ts`)
|
||||
|
||||
| Flag | Bedeutung |
|
||||
|---|---|
|
||||
| `showPlaceholders` | `true` bis zum Launch: offene Angaben stehen sichtbar als „[…]“ in Gold |
|
||||
| `hostOutsideEu` | nur `true`, wenn Hoster/Office-Anbieter außerhalb EU/EWR sitzen (Drittland-Absatz) |
|
||||
| `showFaq`, `showStimmen`, `showSpeakerPdf`, `showSecondTalk`, `show24hPromise`, `showIndustry`, `showTwins` | schalten einzelne Blöcke frei, sobald die Inhalte freigegeben sind |
|
||||
|
||||
## Vor dem Livegang
|
||||
|
||||
1. `LEGAL_TODO` und `CONTENT_TODO` in `src/lib/legal.ts` abarbeiten – Anschrift,
|
||||
USt-IdNr., Hoster, Aufsichtsbehörde, Bildnachweise, Dauer-/Paketangaben.
|
||||
2. Erst dann `flags.showPlaceholders` auf `false` setzen.
|
||||
Steht danach irgendwo noch ein „[…]“ in einer Pflichtangabe, **bricht der Build
|
||||
mit einer Fundstelle ab** – der Flip geht nicht ungelesen live.
|
||||
3. `npm run build` und den Inhalt von `out/` hochladen.
|
||||
Reference in New Issue
Block a user