From b8e41b4d5509dc9c748a160120b6a39ee9f938dc Mon Sep 17 00:00:00 2001 From: Kenso Grimm Date: Sun, 6 Sep 2026 17:21:52 +0200 Subject: [PATCH] first publish --- .claude/launch.json | 11 + .gitignore | 41 + AGENTS.md | 44 + CLAUDE.md | 1 + README.md | 88 + docs/HANDOVER.md | 555 ++ .../2026-09-02-anelia-wolf-build-plan.md | 178 + .../2026-09-02-anelia-wolf-website-design.md | 701 ++ docs/superpowers/specs/legal-templates.md | 141 + eslint.config.mjs | 18 + next.config.ts | 22 + package-lock.json | 6855 +++++++++++++++++ package.json | 30 + postcss.config.mjs | 7 + public/brand/README.md | 44 + public/brand/logo-full.png | Bin 0 -> 92730 bytes public/brand/logo-mark.svg | 10 + public/photos/README.md | 10 + src/app/(de)/datenschutz/page.tsx | 15 + src/app/(de)/impressum/page.tsx | 15 + src/app/(de)/layout.tsx | 25 + src/app/(de)/leistungen/coaching/page.tsx | 22 + src/app/(de)/leistungen/keynotes/page.tsx | 22 + src/app/(de)/leistungen/trainings/page.tsx | 23 + src/app/(de)/not-found.tsx | 20 + src/app/(de)/page.tsx | 16 + src/app/(de)/schrift-test/TypeNav.tsx | 69 + src/app/(de)/schrift-test/fonts.ts | 274 + src/app/(de)/schrift-test/page.tsx | 140 + .../(de)/schrift-test/seite/FontCompare.tsx | 117 + src/app/(de)/schrift-test/seite/fonts.ts | 53 + src/app/(de)/schrift-test/seite/page.tsx | 67 + src/app/(de)/template.tsx | 6 + src/app/apple-icon.png | Bin 0 -> 3937 bytes src/app/en/imprint/page.tsx | 15 + src/app/en/layout.tsx | 24 + src/app/en/page.tsx | 16 + src/app/en/privacy/page.tsx | 15 + src/app/en/services/coaching/page.tsx | 22 + src/app/en/services/keynotes/page.tsx | 22 + src/app/en/services/trainings/page.tsx | 23 + src/app/en/template.tsx | 6 + src/app/global-not-found.tsx | 35 + src/app/globals.css | 272 + src/app/icon.svg | 10 + src/app/robots.ts | 13 + src/app/sitemap.ts | 42 + src/components/brand/BrandMark.tsx | 130 + src/components/brand/DrawMark.tsx | 220 + src/components/brand/WolfMark.tsx | 125 + src/components/brand/Wordmark.tsx | 73 + src/components/home/About.tsx | 105 + src/components/home/Audience.tsx | 57 + src/components/home/Hero.tsx | 320 + src/components/home/Positioning.tsx | 81 + src/components/home/ProcessContact.tsx | 75 + src/components/home/ServicesIndex.tsx | 60 + src/components/home/WolfPrinciple.tsx | 52 + src/components/layout/Container.tsx | 14 + src/components/layout/Folio.tsx | 44 + src/components/layout/Footer.tsx | 111 + src/components/layout/Header.tsx | 169 + src/components/layout/LangSwitch.tsx | 70 + src/components/layout/Masthead.tsx | 56 + src/components/layout/OverlayMenu.tsx | 235 + src/components/layout/Section.tsx | 80 + src/components/layout/SectionGutter.tsx | 54 + src/components/layout/Shell.tsx | 69 + src/components/legal/LegalPage.tsx | 209 + src/components/motion/Curtain.tsx | 107 + src/components/motion/Door.tsx | 111 + src/components/motion/Draw.tsx | 106 + src/components/motion/Lines.tsx | 79 + src/components/motion/Magnet.tsx | 84 + src/components/motion/PageTemplate.tsx | 147 + src/components/motion/Reveal.tsx | 150 + src/components/motion/Rule.tsx | 61 + src/components/motion/ScrollProgress.tsx | 43 + src/components/motion/TransitionLink.tsx | 91 + src/components/motion/transition-store.ts | 55 + src/components/pages/CoachingBody.tsx | 168 + src/components/pages/HomeBody.tsx | 89 + src/components/pages/KeynotesBody.tsx | 124 + src/components/pages/NotFoundBody.tsx | 57 + src/components/pages/TrainingsBody.tsx | 64 + src/components/providers/SmoothScroll.tsx | 52 + src/components/services/SectionHeading.tsx | 50 + src/components/services/ServiceHero.tsx | 117 + src/components/services/ServiceLayout.tsx | 26 + .../services/coaching/ThreeQuestions.tsx | 100 + .../services/keynotes/Occasions.tsx | 45 + .../services/keynotes/SignatureTalk.tsx | 56 + .../services/keynotes/SpeakerProfile.tsx | 40 + .../services/trainings/TrainingsAblauf.tsx | 29 + .../services/trainings/TrainingsBand.tsx | 15 + .../services/trainings/TrainingsFaq.tsx | 19 + .../services/trainings/TrainingsGoals.tsx | 18 + .../services/trainings/TrainingsMethod.tsx | 62 + .../services/trainings/TrainingsModules.tsx | 45 + .../services/trainings/TrainingsRahmen.tsx | 29 + .../trainings/TrainingsSituations.tsx | 18 + src/components/ui/Button.tsx | 73 + src/components/ui/Columns.tsx | 50 + src/components/ui/ContactForm.tsx | 109 + src/components/ui/ContactLinks.tsx | 52 + src/components/ui/CtaBand.tsx | 66 + src/components/ui/Eyebrow.tsx | 38 + src/components/ui/Facts.tsx | 102 + src/components/ui/FactsStrip.tsx | 39 + src/components/ui/Faq.tsx | 38 + src/components/ui/Formula.tsx | 273 + src/components/ui/Interruption.tsx | 50 + src/components/ui/Ledger.tsx | 186 + src/components/ui/Marginalia.tsx | 66 + src/components/ui/MetaLines.tsx | 28 + src/components/ui/ModuleTable.tsx | 79 + src/components/ui/Numeral.tsx | 47 + src/components/ui/Portrait.tsx | 79 + src/components/ui/Quote.tsx | 29 + src/components/ui/SpecTable.tsx | 92 + src/components/ui/Steps.tsx | 49 + src/components/ui/TextLink.tsx | 64 + src/content/chrome-by-lang.ts | 39 + src/content/chrome.ts | 67 + src/content/coaching.ts | 178 + src/content/en/chrome.ts | 64 + src/content/en/coaching.ts | 159 + src/content/en/home.ts | 239 + src/content/en/keynotes.ts | 146 + src/content/en/legal.ts | 285 + src/content/en/not-found.ts | 20 + src/content/en/trainings.ts | 154 + src/content/home.ts | 316 + src/content/keynotes.ts | 173 + src/content/legal.ts | 294 + src/content/not-found.ts | 27 + src/content/trainings.ts | 174 + src/content/widen.ts | 21 + src/lib/assets.ts | 58 + src/lib/fonts.ts | 49 + src/lib/gsap.ts | 80 + src/lib/i18n.ts | 107 + src/lib/legal.ts | 109 + src/lib/metadata.ts | 62 + src/lib/site.ts | 76 + src/lib/utils.ts | 6 + tsconfig.json | 34 + 147 files changed, 19367 insertions(+) create mode 100644 .claude/launch.json create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 CLAUDE.md create mode 100644 README.md create mode 100644 docs/HANDOVER.md create mode 100644 docs/superpowers/plans/2026-09-02-anelia-wolf-build-plan.md create mode 100644 docs/superpowers/specs/2026-09-02-anelia-wolf-website-design.md create mode 100644 docs/superpowers/specs/legal-templates.md create mode 100644 eslint.config.mjs create mode 100644 next.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 public/brand/README.md create mode 100644 public/brand/logo-full.png create mode 100644 public/brand/logo-mark.svg create mode 100644 public/photos/README.md create mode 100644 src/app/(de)/datenschutz/page.tsx create mode 100644 src/app/(de)/impressum/page.tsx create mode 100644 src/app/(de)/layout.tsx create mode 100644 src/app/(de)/leistungen/coaching/page.tsx create mode 100644 src/app/(de)/leistungen/keynotes/page.tsx create mode 100644 src/app/(de)/leistungen/trainings/page.tsx create mode 100644 src/app/(de)/not-found.tsx create mode 100644 src/app/(de)/page.tsx create mode 100644 src/app/(de)/schrift-test/TypeNav.tsx create mode 100644 src/app/(de)/schrift-test/fonts.ts create mode 100644 src/app/(de)/schrift-test/page.tsx create mode 100644 src/app/(de)/schrift-test/seite/FontCompare.tsx create mode 100644 src/app/(de)/schrift-test/seite/fonts.ts create mode 100644 src/app/(de)/schrift-test/seite/page.tsx create mode 100644 src/app/(de)/template.tsx create mode 100644 src/app/apple-icon.png create mode 100644 src/app/en/imprint/page.tsx create mode 100644 src/app/en/layout.tsx create mode 100644 src/app/en/page.tsx create mode 100644 src/app/en/privacy/page.tsx create mode 100644 src/app/en/services/coaching/page.tsx create mode 100644 src/app/en/services/keynotes/page.tsx create mode 100644 src/app/en/services/trainings/page.tsx create mode 100644 src/app/en/template.tsx create mode 100644 src/app/global-not-found.tsx create mode 100644 src/app/globals.css create mode 100644 src/app/icon.svg create mode 100644 src/app/robots.ts create mode 100644 src/app/sitemap.ts create mode 100644 src/components/brand/BrandMark.tsx create mode 100644 src/components/brand/DrawMark.tsx create mode 100644 src/components/brand/WolfMark.tsx create mode 100644 src/components/brand/Wordmark.tsx create mode 100644 src/components/home/About.tsx create mode 100644 src/components/home/Audience.tsx create mode 100644 src/components/home/Hero.tsx create mode 100644 src/components/home/Positioning.tsx create mode 100644 src/components/home/ProcessContact.tsx create mode 100644 src/components/home/ServicesIndex.tsx create mode 100644 src/components/home/WolfPrinciple.tsx create mode 100644 src/components/layout/Container.tsx create mode 100644 src/components/layout/Folio.tsx create mode 100644 src/components/layout/Footer.tsx create mode 100644 src/components/layout/Header.tsx create mode 100644 src/components/layout/LangSwitch.tsx create mode 100644 src/components/layout/Masthead.tsx create mode 100644 src/components/layout/OverlayMenu.tsx create mode 100644 src/components/layout/Section.tsx create mode 100644 src/components/layout/SectionGutter.tsx create mode 100644 src/components/layout/Shell.tsx create mode 100644 src/components/legal/LegalPage.tsx create mode 100644 src/components/motion/Curtain.tsx create mode 100644 src/components/motion/Door.tsx create mode 100644 src/components/motion/Draw.tsx create mode 100644 src/components/motion/Lines.tsx create mode 100644 src/components/motion/Magnet.tsx create mode 100644 src/components/motion/PageTemplate.tsx create mode 100644 src/components/motion/Reveal.tsx create mode 100644 src/components/motion/Rule.tsx create mode 100644 src/components/motion/ScrollProgress.tsx create mode 100644 src/components/motion/TransitionLink.tsx create mode 100644 src/components/motion/transition-store.ts create mode 100644 src/components/pages/CoachingBody.tsx create mode 100644 src/components/pages/HomeBody.tsx create mode 100644 src/components/pages/KeynotesBody.tsx create mode 100644 src/components/pages/NotFoundBody.tsx create mode 100644 src/components/pages/TrainingsBody.tsx create mode 100644 src/components/providers/SmoothScroll.tsx create mode 100644 src/components/services/SectionHeading.tsx create mode 100644 src/components/services/ServiceHero.tsx create mode 100644 src/components/services/ServiceLayout.tsx create mode 100644 src/components/services/coaching/ThreeQuestions.tsx create mode 100644 src/components/services/keynotes/Occasions.tsx create mode 100644 src/components/services/keynotes/SignatureTalk.tsx create mode 100644 src/components/services/keynotes/SpeakerProfile.tsx create mode 100644 src/components/services/trainings/TrainingsAblauf.tsx create mode 100644 src/components/services/trainings/TrainingsBand.tsx create mode 100644 src/components/services/trainings/TrainingsFaq.tsx create mode 100644 src/components/services/trainings/TrainingsGoals.tsx create mode 100644 src/components/services/trainings/TrainingsMethod.tsx create mode 100644 src/components/services/trainings/TrainingsModules.tsx create mode 100644 src/components/services/trainings/TrainingsRahmen.tsx create mode 100644 src/components/services/trainings/TrainingsSituations.tsx create mode 100644 src/components/ui/Button.tsx create mode 100644 src/components/ui/Columns.tsx create mode 100644 src/components/ui/ContactForm.tsx create mode 100644 src/components/ui/ContactLinks.tsx create mode 100644 src/components/ui/CtaBand.tsx create mode 100644 src/components/ui/Eyebrow.tsx create mode 100644 src/components/ui/Facts.tsx create mode 100644 src/components/ui/FactsStrip.tsx create mode 100644 src/components/ui/Faq.tsx create mode 100644 src/components/ui/Formula.tsx create mode 100644 src/components/ui/Interruption.tsx create mode 100644 src/components/ui/Ledger.tsx create mode 100644 src/components/ui/Marginalia.tsx create mode 100644 src/components/ui/MetaLines.tsx create mode 100644 src/components/ui/ModuleTable.tsx create mode 100644 src/components/ui/Numeral.tsx create mode 100644 src/components/ui/Portrait.tsx create mode 100644 src/components/ui/Quote.tsx create mode 100644 src/components/ui/SpecTable.tsx create mode 100644 src/components/ui/Steps.tsx create mode 100644 src/components/ui/TextLink.tsx create mode 100644 src/content/chrome-by-lang.ts create mode 100644 src/content/chrome.ts create mode 100644 src/content/coaching.ts create mode 100644 src/content/en/chrome.ts create mode 100644 src/content/en/coaching.ts create mode 100644 src/content/en/home.ts create mode 100644 src/content/en/keynotes.ts create mode 100644 src/content/en/legal.ts create mode 100644 src/content/en/not-found.ts create mode 100644 src/content/en/trainings.ts create mode 100644 src/content/home.ts create mode 100644 src/content/keynotes.ts create mode 100644 src/content/legal.ts create mode 100644 src/content/not-found.ts create mode 100644 src/content/trainings.ts create mode 100644 src/content/widen.ts create mode 100644 src/lib/assets.ts create mode 100644 src/lib/fonts.ts create mode 100644 src/lib/gsap.ts create mode 100644 src/lib/i18n.ts create mode 100644 src/lib/legal.ts create mode 100644 src/lib/metadata.ts create mode 100644 src/lib/site.ts create mode 100644 src/lib/utils.ts create mode 100644 tsconfig.json diff --git a/.claude/launch.json b/.claude/launch.json new file mode 100644 index 0000000..d644607 --- /dev/null +++ b/.claude/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.0.1", + "configurations": [ + { + "name": "anelia-dev", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev", "--", "--port", "3000"], + "port": 3000 + } + ] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ef6a52 --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..078a9f5 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,44 @@ + + +# This is NOT the Next.js you know + +This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices. + +This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean. + + + +# Anelia Wolf – Projektregeln + +Dieser Abschnitt steht bewusst UNTER dem generierten Block oben (`next dev` +schreibt den Block neu, dieser Teil bleibt). + +## Harte Regeln + +- `src/components/brand/WolfMark.tsx` wird **nie** bearbeitet. +- Kein `localStorage`, kein `sessionStorage`, keine Cookies. +- Keine externen Requests, Skripte, Schriften oder iframes – die + Datenschutzerklärung sagt das zu (`src/content/legal.ts`, Ziffer 2/3/6). +- Radius 0, keine Schatten, kein Fettdruck. +- Playfair Display (`font-display`) nie unter 28 px. Unter `lg` weicht Text auf + `font-sans` (Source Sans 3) aus, statt die Display-Schrift zu verkleinern. +- Betonungswort einer Headline: genau ein ``. Kursiv, und auf `data-theme="dark"` + zusätzlich golden – das macht eine Regel in `globals.css`, nicht die Komponente. + Auf hellem Grund bleibt es rein typografisch (Gold-Verlauf auf Elfenbein = 2,4:1). +- Goldene Schrift nur auf `[data-theme="dark"]`; auf Ivory gilt `--gold-deep`. +- Sichtbare Copy lebt ausschließlich in `src/content/*.ts`, nie im JSX. + +## Konventionen + +- Jeder Top-Level-Block malt seinen eigenen Grund (`data-theme` + Regel in + `globals.css`); die Naht zwischen zwei Gründen ist die goldene Haarlinie. +- Scroll-Reveals animieren **nur** `opacity` (+ `y`) – nie `autoAlpha` oder + `visibility`, sonst fallen Links aus der Tab-Reihenfolge. +- Alle Animationen laufen über `gsap.matchMedia` mit `MM.reduce`/`MM.ok`; + GSAP ist die einzige Animations-Runtime im Bundle. +- Ein Ankersprung nutzt genau einen Offset: `anchorOffset()` in + `TransitionLink.tsx` bzw. `scroll-margin-top` in `globals.css`. +- `ScrollTrigger.refresh()` nur über `refreshSoon()` aus `@/lib/gsap`. +- Jede `
` braucht eine Überschrift (notfalls das Eyebrow als `

`). +- Platzhalter immer über `ph()`; der Build-Guard in `src/lib/legal.ts` stoppt + den Launch-Flip, solange irgendwo noch ein „[…]“ steht. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..43c994c --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..188ab8c --- /dev/null +++ b/README.md @@ -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 `` | +| `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 `