From 3b6f630a72e9107e84e7199426502eed930409bb Mon Sep 17 00:00:00 2001 From: fs Date: Fri, 19 Jun 2026 08:13:04 +0200 Subject: [PATCH] =?UTF-8?q?Unterseiten:=20Fu=C3=9Fball-=C3=9Cbersicht,=20M?= =?UTF-8?q?annschaften,=20Jugend,=20Verein,=20Rechtliches?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Neue Seiten + Routen: fussball, fussball/{erste-mannschaft,zweite-mannschaft, damen}, jugendfussball, verein, impressum, datenschutz. Dazu die Komponenten team, team-cards/-roster/-photo/-bento, faq/faq-contact, key-facts, age-groups, cta-band, training-location und der contact-slider. Daten in teams/fussball/jugend/verein.json; club.json um Vorstand, Bankdaten, Datenschutz-Kontakt erweitert. person-grid bekommt $names-Filter, partner-grid einen Intro-Stil. Seiten setzen $meta['schema'] via team_/page_schema. Styles für alle neuen Komponenten in components.css. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_01KDQZ6FuchNUh2bxSW9PeNv --- app/components/age-groups.php | 47 + app/components/cta-band.php | 30 + app/components/faq-contact.php | 76 ++ app/components/faq.php | 35 + app/components/key-facts.php | 41 + app/components/partner-grid.php | 2 +- app/components/person-grid.php | 7 + app/components/team-bento.php | 82 ++ app/components/team-cards.php | 55 ++ app/components/team-photo.php | 27 + app/components/team-roster.php | 78 ++ app/components/team.php | 46 + app/components/training-location.php | 73 ++ app/pages/datenschutz.php | 261 +++++ app/pages/fussball.php | 53 ++ app/pages/home.php | 1 + app/pages/impressum.php | 139 +++ app/pages/jugendfussball.php | 80 ++ app/pages/team-damen.php | 18 + app/pages/team-erste.php | 18 + app/pages/team-zwei.php | 19 + app/pages/verein.php | 84 ++ app/routes.php | 15 +- data/ansprechpartner.json | 5 + data/club.json | 16 + data/fussball.json | 23 + data/jugend.json | 32 + data/teams.json | 209 ++++ data/verein.json | 49 + public/assets/css/components.css | 895 ++++++++++++++++-- .../assets/img/pages/fussball-hero-1000.jpg | Bin 0 -> 127077 bytes .../assets/img/pages/fussball-hero-1600.jpg | Bin 0 -> 306586 bytes public/assets/img/pages/fussball-hero-640.jpg | Bin 0 -> 59686 bytes .../img/pages/fussball-mannschaften-1000.jpg | Bin 0 -> 138321 bytes .../img/pages/fussball-mannschaften-640.jpg | Bin 0 -> 57724 bytes .../img/pages/jugendfussball-hero-1000.jpg | Bin 0 -> 150129 bytes .../img/pages/jugendfussball-hero-1440.jpg | Bin 0 -> 273218 bytes .../img/pages/jugendfussball-hero-640.jpg | Bin 0 -> 70877 bytes public/assets/img/pages/turnen-1000.jpg | Bin 0 -> 20830 bytes public/assets/img/pages/turnen-640.jpg | Bin 0 -> 11853 bytes public/assets/img/persons/alex-schuetz.jpg | Bin 0 -> 84566 bytes .../assets/img/persons/alexander-hatter.jpg | Bin 0 -> 99014 bytes public/assets/img/persons/alexander-vogel.jpg | Bin 0 -> 85078 bytes .../assets/img/persons/ali-kilic-spieler.jpg | Bin 0 -> 93280 bytes public/assets/img/persons/ali-kilic.jpg | Bin 0 -> 46245 bytes public/assets/img/persons/bastian-werner.jpg | Bin 0 -> 76988 bytes .../assets/img/persons/christian-kaestner.jpg | Bin 0 -> 85521 bytes .../img/persons/christian-ohnemueller.jpg | Bin 0 -> 80862 bytes public/assets/img/persons/dominik-schulz.jpg | Bin 0 -> 50662 bytes public/assets/img/persons/felix-schneider.jpg | Bin 0 -> 81104 bytes public/assets/img/persons/hakan-yilmaz.jpg | Bin 0 -> 46233 bytes public/assets/img/persons/janick-martin.jpg | Bin 0 -> 110143 bytes public/assets/img/persons/marek-szabelski.jpg | Bin 0 -> 44272 bytes .../img/persons/platzhalter-spieler.jpg | Bin 0 -> 80124 bytes public/assets/img/persons/rustem-hajzeraj.jpg | Bin 0 -> 46736 bytes public/assets/img/persons/sascha-zimmerer.jpg | Bin 0 -> 53693 bytes .../assets/img/persons/sebastiano-gross.jpg | Bin 0 -> 96658 bytes public/assets/img/persons/tim-hofmann.jpg | Bin 0 -> 95201 bytes public/assets/img/teams/damen-1000.jpg | Bin 0 -> 144568 bytes public/assets/img/teams/damen-1600.jpg | Bin 0 -> 320189 bytes public/assets/img/teams/damen-640.jpg | Bin 0 -> 65275 bytes public/assets/img/teams/herren-1-1000.jpg | Bin 0 -> 95936 bytes public/assets/img/teams/herren-1-1600.jpg | Bin 0 -> 241771 bytes public/assets/img/teams/herren-1-640.jpg | Bin 0 -> 40181 bytes .../assets/img/teams/herren-1-team-1000.jpg | Bin 0 -> 269192 bytes .../assets/img/teams/herren-1-team-1600.jpg | Bin 0 -> 574009 bytes public/assets/img/teams/herren-1-team-640.jpg | Bin 0 -> 127055 bytes public/assets/img/teams/herren-2-1000.jpg | Bin 0 -> 150295 bytes public/assets/img/teams/herren-2-1600.jpg | Bin 0 -> 319307 bytes public/assets/img/teams/herren-2-640.jpg | Bin 0 -> 70125 bytes public/assets/img/teams/jugend-c-400.jpg | Bin 0 -> 25577 bytes public/assets/img/teams/jugend-c-800.jpg | Bin 0 -> 92674 bytes public/assets/img/teams/jugend-d-400.jpg | Bin 0 -> 28715 bytes public/assets/img/teams/jugend-d-800.jpg | Bin 0 -> 97374 bytes public/assets/img/teams/jugend-e-400.jpg | Bin 0 -> 28187 bytes public/assets/img/teams/jugend-e-800.jpg | Bin 0 -> 96654 bytes public/assets/img/teams/jugend-f-400.jpg | Bin 0 -> 34868 bytes public/assets/img/teams/jugend-f-800.jpg | Bin 0 -> 126246 bytes public/assets/img/teams/jugend-g-400.jpg | Bin 0 -> 49702 bytes public/assets/img/teams/jugend-g-800.jpg | Bin 0 -> 179075 bytes public/assets/js/contact-slider.js | 75 ++ 81 files changed, 2513 insertions(+), 78 deletions(-) create mode 100644 app/components/age-groups.php create mode 100644 app/components/cta-band.php create mode 100644 app/components/faq-contact.php create mode 100644 app/components/faq.php create mode 100644 app/components/key-facts.php create mode 100644 app/components/team-bento.php create mode 100644 app/components/team-cards.php create mode 100644 app/components/team-photo.php create mode 100644 app/components/team-roster.php create mode 100644 app/components/team.php create mode 100644 app/components/training-location.php create mode 100644 app/pages/datenschutz.php create mode 100644 app/pages/fussball.php create mode 100644 app/pages/impressum.php create mode 100644 app/pages/jugendfussball.php create mode 100644 app/pages/team-damen.php create mode 100644 app/pages/team-erste.php create mode 100644 app/pages/team-zwei.php create mode 100644 app/pages/verein.php create mode 100644 data/fussball.json create mode 100644 data/jugend.json create mode 100644 data/teams.json create mode 100644 data/verein.json create mode 100644 public/assets/img/pages/fussball-hero-1000.jpg create mode 100644 public/assets/img/pages/fussball-hero-1600.jpg create mode 100644 public/assets/img/pages/fussball-hero-640.jpg create mode 100644 public/assets/img/pages/fussball-mannschaften-1000.jpg create mode 100644 public/assets/img/pages/fussball-mannschaften-640.jpg create mode 100644 public/assets/img/pages/jugendfussball-hero-1000.jpg create mode 100644 public/assets/img/pages/jugendfussball-hero-1440.jpg create mode 100644 public/assets/img/pages/jugendfussball-hero-640.jpg create mode 100644 public/assets/img/pages/turnen-1000.jpg create mode 100644 public/assets/img/pages/turnen-640.jpg create mode 100644 public/assets/img/persons/alex-schuetz.jpg create mode 100644 public/assets/img/persons/alexander-hatter.jpg create mode 100644 public/assets/img/persons/alexander-vogel.jpg create mode 100644 public/assets/img/persons/ali-kilic-spieler.jpg create mode 100644 public/assets/img/persons/ali-kilic.jpg create mode 100644 public/assets/img/persons/bastian-werner.jpg create mode 100644 public/assets/img/persons/christian-kaestner.jpg create mode 100644 public/assets/img/persons/christian-ohnemueller.jpg create mode 100644 public/assets/img/persons/dominik-schulz.jpg create mode 100644 public/assets/img/persons/felix-schneider.jpg create mode 100644 public/assets/img/persons/hakan-yilmaz.jpg create mode 100644 public/assets/img/persons/janick-martin.jpg create mode 100644 public/assets/img/persons/marek-szabelski.jpg create mode 100644 public/assets/img/persons/platzhalter-spieler.jpg create mode 100644 public/assets/img/persons/rustem-hajzeraj.jpg create mode 100644 public/assets/img/persons/sascha-zimmerer.jpg create mode 100644 public/assets/img/persons/sebastiano-gross.jpg create mode 100644 public/assets/img/persons/tim-hofmann.jpg create mode 100644 public/assets/img/teams/damen-1000.jpg create mode 100644 public/assets/img/teams/damen-1600.jpg create mode 100644 public/assets/img/teams/damen-640.jpg create mode 100644 public/assets/img/teams/herren-1-1000.jpg create mode 100644 public/assets/img/teams/herren-1-1600.jpg create mode 100644 public/assets/img/teams/herren-1-640.jpg create mode 100644 public/assets/img/teams/herren-1-team-1000.jpg create mode 100644 public/assets/img/teams/herren-1-team-1600.jpg create mode 100644 public/assets/img/teams/herren-1-team-640.jpg create mode 100644 public/assets/img/teams/herren-2-1000.jpg create mode 100644 public/assets/img/teams/herren-2-1600.jpg create mode 100644 public/assets/img/teams/herren-2-640.jpg create mode 100644 public/assets/img/teams/jugend-c-400.jpg create mode 100644 public/assets/img/teams/jugend-c-800.jpg create mode 100644 public/assets/img/teams/jugend-d-400.jpg create mode 100644 public/assets/img/teams/jugend-d-800.jpg create mode 100644 public/assets/img/teams/jugend-e-400.jpg create mode 100644 public/assets/img/teams/jugend-e-800.jpg create mode 100644 public/assets/img/teams/jugend-f-400.jpg create mode 100644 public/assets/img/teams/jugend-f-800.jpg create mode 100644 public/assets/img/teams/jugend-g-400.jpg create mode 100644 public/assets/img/teams/jugend-g-800.jpg create mode 100644 public/assets/js/contact-slider.js diff --git a/app/components/age-groups.php b/app/components/age-groups.php new file mode 100644 index 0000000..4c1f033 --- /dev/null +++ b/app/components/age-groups.php @@ -0,0 +1,47 @@ + +
+
+

+
    + +
  • +
    + + $g['photo'], 'sizes' => '(max-width: 600px) 100vw, 320px', 'class' => 'age-group__img']); ?> + + + + + + +
    +
    +

    + +

    + +

    + +
    +
  • + +
+
+
diff --git a/app/components/cta-band.php b/app/components/cta-band.php new file mode 100644 index 0000000..d374936 --- /dev/null +++ b/app/components/cta-band.php @@ -0,0 +1,30 @@ + +
> +
+ +

+ + +

+ +
+ + $cta]); ?> + +
+
+
diff --git a/app/components/faq-contact.php b/app/components/faq-contact.php new file mode 100644 index 0000000..2d3a286 --- /dev/null +++ b/app/components/faq-contact.php @@ -0,0 +1,76 @@ +/ (ohne JS bedienbar); FAQPage-Schema liefert die Seite. + */ +$faqTitle = $faqTitle ?? 'Häufige Fragen'; +$faqIntro = $faqIntro ?? ''; +$contactTitle = $contactTitle ?? 'Dein Ansprechpartner'; +$anchor = $anchor ?? 'kontakt'; +$faq = array_values(array_filter( + $faq ?? [], + static fn (array $i): bool => !empty($i['q']) && !empty($i['a']) +)); +$persons = array_values(array_filter($persons ?? [], static fn ($p): bool => !empty($p))); +$hasPerson = $persons !== []; +$isSlider = count($persons) > 1; +if ($faq === [] && !$hasPerson) { + return; +} +?> +
+
+

+ +

+ +
+
+
+ +
+ +

+
+ +
+
+ + + +
+
+
diff --git a/app/components/faq.php b/app/components/faq.php new file mode 100644 index 0000000..64d7af5 --- /dev/null +++ b/app/components/faq.php @@ -0,0 +1,35 @@ +/ → ohne JS bedienbar. Das FAQPage-Schema liefert + * die Seite über $meta['schema'] (helpers: faq_schema/team_schema), nicht diese Komponente. + */ +$title = $title ?? 'Häufige Fragen'; +$anchor = $anchor ?? 'faq'; +$faq = array_values(array_filter( + $faq ?? [], + static fn (array $i): bool => !empty($i['q']) && !empty($i['a']) +)); +if ($faq === []) { + return; +} +?> +
+
+

+
+ +
+ +

+
+ +
+
+
diff --git a/app/components/key-facts.php b/app/components/key-facts.php new file mode 100644 index 0000000..13de6fd --- /dev/null +++ b/app/components/key-facts.php @@ -0,0 +1,41 @@ + isset($f['value']) && $f['value'] !== '' +)); +if ($facts === []) { + return; +} +?> +
> +
+
    + +
  • + + + + + + + + + +
  • + +
+
+
diff --git a/app/components/partner-grid.php b/app/components/partner-grid.php index c42f674..169eba7 100644 --- a/app/components/partner-grid.php +++ b/app/components/partner-grid.php @@ -12,7 +12,7 @@ $partners = json_load('partners')['partners'] ?? [];

-

+