Neubau Fundament + Startseite: Designsystem, PHP-Komponenten, Brevo-Formular, Instagram-Sync
- Ordnerstruktur mit public/-Docroot, Deny-.htaccess für app/bin/config/data/storage
- CLAUDE.md mit Leitplanken (self-hosted only, Single Source of Truth, Component-first)
- Design-Tokens aus alter Seite extrahiert (Akzent #e20612, Coolvetica/Abel als woff2)
- Front Controller mit Routen-Register, Sitemap, Canonical, JSON-LD (SportsClub)
- Startseite: Hero, Instagram-Feed (lokaler Cache), Historie/Sportheim, Stats, Partner, Kontakt
- Kontaktformular via PHPMailer/Brevo mit Honeypot + HMAC-Time-Trap (kein reCAPTCHA)
- bin/instagram-sync.php: Scraper mit Strategie-Kette, flock, atomarem Cache, lokalen Bildern
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 21:16:25 +02:00
|
|
|
{
|
|
|
|
|
"main": [
|
|
|
|
|
{ "label": "Startseite", "slug": "" },
|
2026-06-19 08:13:10 +02:00
|
|
|
{
|
|
|
|
|
"label": "Fußball",
|
|
|
|
|
"slug": "fussball",
|
|
|
|
|
"children": [
|
|
|
|
|
{ "label": "Übersicht", "slug": "fussball" },
|
|
|
|
|
{ "label": "1. Mannschaft", "slug": "fussball/erste-mannschaft" },
|
|
|
|
|
{ "label": "2. Mannschaft", "slug": "fussball/zweite-mannschaft" },
|
2026-07-27 00:41:02 +02:00
|
|
|
{ "label": "Frauenmannschaft", "slug": "fussball/damen" },
|
2026-06-20 20:49:46 +02:00
|
|
|
{ "label": "Jugendfußball", "slug": "jugendfussball" },
|
2026-07-31 14:54:37 +02:00
|
|
|
{ "label": "Matchcenter", "slug": "matchcenter" },
|
|
|
|
|
{ "label": "Stadionzeitung", "slug": "stadionzeitung", "separator": true }
|
2026-06-19 08:13:10 +02:00
|
|
|
]
|
|
|
|
|
},
|
2026-06-19 10:33:03 +02:00
|
|
|
{
|
|
|
|
|
"label": "Turnen",
|
|
|
|
|
"slug": "turnen",
|
|
|
|
|
"children": [
|
|
|
|
|
{ "label": "Übersicht", "slug": "turnen" },
|
|
|
|
|
{ "label": "Erwachsenenturnen", "slug": "turnen/erwachsenenturnen" },
|
Nav-Labels an die Seitentitel angeglichen, Dropdown-Breite nachgerechnet
Im Menü stand „Eltern-Kind-Turnen", die Seite heißt „Eltern-Kind- &
Kinderturnen" — das Kinderturnen fehlte also im Menü, obwohl Eltern genau
danach suchen. Beim Prüfen fielen zwei weitere Abweichungen auf, alle drei
sind jetzt gleich:
Eltern-Kind-Turnen → Eltern-Kind- & Kinderturnen
Fitness und Pilates → Fitness & Pilates
Trampolin → Trampolinturnen
Punkte („…") braucht es dafür nicht: das Dropdown hat min-width und
white-space: nowrap, das Panel wächst also mit dem längsten Punkt statt zu
beschneiden. Ein abgeschnittener Menüpunkt wäre auch die schlechtere Lösung,
weil man dann nicht mehr liest, wohin der Link führt.
Es war aber knapper als es aussah. Gemessen mit dem längsten Punkt (187,6px):
ruhend 190,0px Platz, im Hover UND auf der aktiven Seite nur 186,0px, weil
padding-left dort von --space-s (16px) auf --space-m (20px) wächst. Das Panel
wäre beim Rübergehen um zwei Pixel gewachsen und auf dieser Seite dauerhaft
breiter gewesen — sichtbar als Flackern, weil es mittig sitzt und sich nach
beiden Seiten schiebt.
Behoben mit einem Wert: min-width 15rem → 15,5rem. Alle drei Panels bleiben
jetzt in jedem Zustand bei 248px, mit 8,4px Luft statt 1,6px Fehlbetrag. Auch
bei 1250px Viewport (der schmalsten Breite mit Desktop-Menü) liegt kein Panel
am Rand. Die Rechnung steht als Kommentar über der Regel, damit der nächste
längere Menüpunkt nachgemessen wird.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NzeVVgMCrzCDJAKeLEdKr7
2026-07-31 22:31:58 +02:00
|
|
|
{ "label": "Eltern-Kind- & Kinderturnen", "slug": "turnen/eltern-kind-turnen" },
|
|
|
|
|
{ "label": "Fitness & Pilates", "slug": "turnen/fitness-pilates" },
|
|
|
|
|
{ "label": "Trampolinturnen", "slug": "turnen/trampolin" },
|
2026-06-19 10:33:03 +02:00
|
|
|
{ "label": "Wettkampfturnen", "slug": "turnen/wettkampfturnen" }
|
|
|
|
|
]
|
|
|
|
|
},
|
2026-06-19 08:13:10 +02:00
|
|
|
{
|
|
|
|
|
"label": "Der Verein",
|
|
|
|
|
"slug": "verein",
|
|
|
|
|
"children": [
|
|
|
|
|
{ "label": "Übersicht", "slug": "verein" },
|
2026-07-31 14:54:37 +02:00
|
|
|
{ "label": "News", "slug": "news" },
|
|
|
|
|
{ "label": "Termine", "slug": "termine" },
|
|
|
|
|
{ "label": "Veranstaltungen", "slug": "veranstaltungen" },
|
Neue Seiten: Mitglied/Partner werden, Sportheimbuchung & Ansprechpartner
Mitglied werden: Hub-Seite mit Online-Anmeldung (membership-form +
membership-submit-Action, Honeypot + Time-Trap), Abteilungswahl
(department-choice), Beitragstabelle (fee-table) und Turn-Aufnahmeantrag
als PDF-Download. Daten in data/mitglied-werden.json.
Partner werden & Sportheimbuchung: neue Seiten samt Routing und Navigation.
Ansprechpartner: echter Hero (Vereinsgelände), Bereiche aus dem group-Feld
der Single Source (Fußball / Turnen) zu zwei Sektionen gebündelt, Disziplin
als Karten-Überschrift. Fehlende Turn-Disziplin-Leads (Frisque, Lorz,
Kornatz, Trotzke) aus den Turnen-Unterseiten extrahiert und in
data/ansprechpartner.json ergänzt (allgemeine Turnabteilungs-Mail als
Kontakt). WhatsApp für alle Personen mit Telefonnummer. person-grid:
kompaktere Karten, Hairline unter der Bereichsüberschrift, 5 Spalten am
Desktop. Startseite auf die Haupt-Ansprechpartner je Bereich begrenzt.
Dazu: neue Icons (check-circle, download, file-earmark-text, whatsapp),
Anpassungen an Header/Footer/CTA/age-groups sowie tokens/layout/utilities.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RZsKTL5kRSG4KkK8w2LKkE
2026-06-19 11:16:10 +02:00
|
|
|
{ "label": "Ansprechpartner", "slug": "ansprechpartner" },
|
2026-06-20 21:14:28 +02:00
|
|
|
{ "label": "Kontakt", "slug": "kontakt" },
|
2026-06-20 20:49:46 +02:00
|
|
|
{ "label": "Historie", "slug": "historie" },
|
|
|
|
|
{ "label": "Sportheimbuchung", "slug": "sportheimbuchung", "separator": true },
|
Neue Seiten: Mitglied/Partner werden, Sportheimbuchung & Ansprechpartner
Mitglied werden: Hub-Seite mit Online-Anmeldung (membership-form +
membership-submit-Action, Honeypot + Time-Trap), Abteilungswahl
(department-choice), Beitragstabelle (fee-table) und Turn-Aufnahmeantrag
als PDF-Download. Daten in data/mitglied-werden.json.
Partner werden & Sportheimbuchung: neue Seiten samt Routing und Navigation.
Ansprechpartner: echter Hero (Vereinsgelände), Bereiche aus dem group-Feld
der Single Source (Fußball / Turnen) zu zwei Sektionen gebündelt, Disziplin
als Karten-Überschrift. Fehlende Turn-Disziplin-Leads (Frisque, Lorz,
Kornatz, Trotzke) aus den Turnen-Unterseiten extrahiert und in
data/ansprechpartner.json ergänzt (allgemeine Turnabteilungs-Mail als
Kontakt). WhatsApp für alle Personen mit Telefonnummer. person-grid:
kompaktere Karten, Hairline unter der Bereichsüberschrift, 5 Spalten am
Desktop. Startseite auf die Haupt-Ansprechpartner je Bereich begrenzt.
Dazu: neue Icons (check-circle, download, file-earmark-text, whatsapp),
Anpassungen an Header/Footer/CTA/age-groups sowie tokens/layout/utilities.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RZsKTL5kRSG4KkK8w2LKkE
2026-06-19 11:16:10 +02:00
|
|
|
{ "label": "Partner werden", "slug": "partner-werden" }
|
2026-06-19 08:13:10 +02:00
|
|
|
]
|
2026-07-31 14:54:37 +02:00
|
|
|
},
|
|
|
|
|
{ "label": "Mitmachen", "slug": "mitmachen" }
|
2026-06-11 21:45:28 +02:00
|
|
|
],
|
|
|
|
|
"ctas": [
|
|
|
|
|
{ "label": "Mitglied werden", "slug": "mitglied-werden", "style": "primary" }
|
Neubau Fundament + Startseite: Designsystem, PHP-Komponenten, Brevo-Formular, Instagram-Sync
- Ordnerstruktur mit public/-Docroot, Deny-.htaccess für app/bin/config/data/storage
- CLAUDE.md mit Leitplanken (self-hosted only, Single Source of Truth, Component-first)
- Design-Tokens aus alter Seite extrahiert (Akzent #e20612, Coolvetica/Abel als woff2)
- Front Controller mit Routen-Register, Sitemap, Canonical, JSON-LD (SportsClub)
- Startseite: Hero, Instagram-Feed (lokaler Cache), Historie/Sportheim, Stats, Partner, Kontakt
- Kontaktformular via PHPMailer/Brevo mit Honeypot + HMAC-Time-Trap (kein reCAPTCHA)
- bin/instagram-sync.php: Scraper mit Strategie-Kette, flock, atomarem Cache, lokalen Bildern
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 21:16:25 +02:00
|
|
|
],
|
|
|
|
|
"legal": [
|
2026-06-20 21:14:28 +02:00
|
|
|
{ "label": "Kontakt", "slug": "kontakt" },
|
Neubau Fundament + Startseite: Designsystem, PHP-Komponenten, Brevo-Formular, Instagram-Sync
- Ordnerstruktur mit public/-Docroot, Deny-.htaccess für app/bin/config/data/storage
- CLAUDE.md mit Leitplanken (self-hosted only, Single Source of Truth, Component-first)
- Design-Tokens aus alter Seite extrahiert (Akzent #e20612, Coolvetica/Abel als woff2)
- Front Controller mit Routen-Register, Sitemap, Canonical, JSON-LD (SportsClub)
- Startseite: Hero, Instagram-Feed (lokaler Cache), Historie/Sportheim, Stats, Partner, Kontakt
- Kontaktformular via PHPMailer/Brevo mit Honeypot + HMAC-Time-Trap (kein reCAPTCHA)
- bin/instagram-sync.php: Scraper mit Strategie-Kette, flock, atomarem Cache, lokalen Bildern
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 21:16:25 +02:00
|
|
|
{ "label": "Impressum", "slug": "impressum" },
|
|
|
|
|
{ "label": "Datenschutz", "slug": "datenschutz" }
|
|
|
|
|
]
|
|
|
|
|
}
|