Neuaufbau: Astro 5, Anfrage statt Buchung, Kundenkarte, Design-Tokens, SEO/GEO, Security-Header

This commit is contained in:
till committed 2026-10-09 07:21:38 +02:00
1 parent 49afd192ef
commit 0aa72718a0
86 files changed
+9743 -1079

No files matched your search

+68
View File
@@ -0,0 +1,68 @@
# CLAUDE.md · Website Friseur-Team VK
Architekturfakten für Agenten und Entwickler. Gestaltung: `DESIGN.md`. Entscheidungen: `DECISIONS.md`.
## Überblick
- Statische Website für Friseur-Team VK (Kastanienallee 1, 21255 Tostedt), gebaut von Heidrich Digital.
- **Astro 5**, `output: 'static'`, Vanilla CSS, kein Framework, kein Tailwind. Zwei kleine Skripte (Menü-Escape, Anfrageformular, Vorher/Nachher-Regler).
- Vorschau: https://vk-friseur.heidrich-digital.de (noindex). Repo: `till/vk-friseur` auf git.heidrich-digital.de.
- Deployment: Coolify-App `n101smck3800u4ajngvm2yjg`, Build über `Dockerfile` (node:22-alpine baut, nginx:1.27-alpine liefert auf Port 80).
## Befehle
```bash
npm ci
npm run dev # http://localhost:4321
npm run build # nach dist/
```
## Struktur
```
src/
data/site.ts EINZIGE Quelle für Adresse, Telefon, Öffnungszeiten, Team, Preise, Anliegen, Endpunkte
styles/tokens.css Farben (OKLCH), Schrift, Skala, Abstände, Bewegung
styles/global.css Grundlage, Typo, Knöpfe, Layout-Helfer, Scroll-Einblendung
styles/form.css Formular-Bausteine (nur Anfrage-Seite)
layouts/Base.astro <head>, Meta, noindex, JSON-LD (HairSalon + Breadcrumb + seiteneigene), Header/Footer/Leiste
components/ Header, Footer, MobileBar, Shot (Fotofläche), Reels, Rating, CtaBand, PageHero,
Steps, Faq, PriceList, LoyaltyCard, BeforeAfter, Hours, Pic, Icon, Logo, DraftNote
scripts/anfrage.ts Formularlogik (schrittweise, Prüfung, fetch, Bestätigung)
pages/ index, brautservice, balayage-farbe, haarverlaengerung, team, leistungen-preise,
kundenkarte, anfrage/index, anfrage/danke, kontakt, impressum, datenschutz, 404
assets/img, assets/logo Ausgangsbilder, werden von astro:assets zu AVIF/WebP/JPG in mehreren Breiten
public/
fonts/ Bodoni Moda + Archivo, selbst gehostet, beschnitten (LICENSE-FONTS.txt)
robots.txt, llms.txt, og.jpg, favicon.svg, favicon-32.png, apple-touch-icon.png, logo-vk.png
deploy/security-headers.conf CSP, HSTS, nosniff, Referrer-Policy, X-Robots-Tag
nginx.conf Caching, 301 alter Adressen, ohne Schrägstrich am Ende, 404
```
## Regeln
- Fakten nur in `src/data/site.ts` ändern. Footer, Kontakt, Impressum, Schema und Formular lesen von dort.
- Preise sind „ab“-Richtwerte (Platzhalter). Ein Wert in `priceGroups` ändert Preisliste und Premium-Seiten. Die Hinweise im Formular stehen in `anliegen[].hint` und müssen mitgezogen werden.
- Keine Inline-Styles und keine Inline-Skripte: Die CSP erlaubt nur `'self'`. Werte zur Laufzeit per `el.style.setProperty()` (CSSOM ist erlaubt). `build.inlineStylesheets: 'never'`, CSS als eine Datei (`cssCodeSplit: false`).
- Keine Fremdanfragen. Karten, Instagram, Google-Bewertungen sind nur Links. Neue Fremdquellen erfordern CSP- und Datenschutz-Änderung.
- Bilder immer über `Pic.astro` (astro:assets) mit `sizes`; Hero mit `eager`.
- Fehlende Arbeitsfotos über `Shot.astro` mit Motiv und Bildidee. Wenn Fotos kommen: Datei nach `src/assets/img/`, `Shot` durch `Pic` in `.frame` ersetzen (Bogen: Klasse `arch`).
- Texte: Stimme des Salons („wir“, „Sie“), konkret, keine Superlative, keine erfundenen Zahlen oder Zitate, keine Gedankenstriche.
## Anfrageformular
- `POST https://vk-karte.heidrich-digital.de/api/anfrage`, `multipart/form-data`. Feldnamen exakt wie im Backend: `anliegen, kundenstatus, haarlaenge, ausgangslage, wunsch, zeitraum, hochzeitsdatum, ort, personen, warteliste, preis_ok, name*, telefon*, email, rueckruf, datenschutz*, fotos (0 bis 3, je ≤ 6 MB), website (Honeypot)`.
- Ohne JS: normaler Submit, Backend antwortet mit 303 auf `/anfrage/danke`.
- Mit JS: Prüfung im Browser, `fetch` mit `Accept: application/json`, Antwort `{ok:true,id}` oder `{ok:false,error}`. Honeypot gefüllt: nichts senden, Bestätigung zeigen.
- Vorauswahl per `?anliegen=braut|balayage|verlaengerung|typveraenderung|schnitt|sonstiges`.
- Backend muss CORS für `https://vk-friseur.heidrich-digital.de` erlauben (und später für die Live-Domain).
## Livegang (Checkliste)
1. In `src/layouts/Base.astro` die Zeile `<meta name="robots" content="noindex, nofollow" />` löschen.
2. In `deploy/security-headers.conf` die Zeile `add_header X-Robots-Tag ...` löschen.
3. `site` in `astro.config.mjs` und `SITE_URL` in `src/data/site.ts` auf die Live-Domain setzen; `robots.txt` und `llms.txt` anpassen.
4. CORS und CSP (`connect-src`, `form-action`) für die Live-Domain prüfen.
5. Footer-Hinweis „Vorschau der neuen Website …“ in `Footer.astro` entfernen, Entwurfshinweise in Impressum und Datenschutz durch geprüfte Texte ersetzen.
6. 301-Weiterleitungen in `nginx.conf` mit der URL-Liste der Altseite abgleichen.
7. Preise, Öffnungszeiten, Team, WhatsApp-Nummer und Bildrechte vom Salon bestätigen lassen.