Files
tsv08kulmbach-website/app/components/faq.php
fs 592acf02b0 Turn-Anmeldung als eigene FAQ-Frage, Knöpfe in FAQ-Antworten möglich
Der Anmelde-Vorgang der Abteilung (erst Platz anfragen, dann Aufnahmeantrag)
stand nirgends auf der Seite. Auf der alten Seite gab es dafür einen Block
„ANMELDUNG" mit zwei Knöpfen.

Erst als eigene Sektion unter den Beiträgen gebaut (cta-band), auf Wunsch von
Felix wieder entfernt und stattdessen als eigene FAQ-Frage umgesetzt. Zwei
Sektionen mit denselben Knöpfen auf einer Seite schwächen beide Stellen, und
man weiß nicht mehr, welcher der richtige Weg ist. Deshalb ist auch
overview.cta ganz aus data/turnen.json raus statt unbenutzt liegen zu bleiben —
genau so ein toter Block hat heute schon einmal in die Irre geführt (die Notiz
„NOCH unbenutzt" stand monatelang im Docblock von turnen.php).

faq.php bekommt dafür ein optionales ctas-Feld pro Eintrag, gerendert über die
bestehende cta-Komponente, also keine neue Knopf-Variante. .faq__actions
bricht um, weil zwei Knöpfe auf einem schmalen Handy nicht nebeneinander passen.

Die Antwort nennt beide Wege bewusst AUCH in Worten: faq_schema() liest nur q
und a, Knöpfe landen nie im FAQPage-Schema. Stünde in der Antwort nur „so
geht's" plus zwei Knöpfe, hätte Google eine Antwort ohne Ziel. Nachgeprüft:
sechs Fragen im Schema, der neue Antworttext ist HTML- und Markup-frei.

Gemessen bei 390px: kein Überlauf, Knöpfe 130x44 und 193x44 (Trefferfläche
erfüllt). Die fünf Turn-Unterseiten hatten als einzige von 105 PHP-Dateien
keinen Zeilenumbruch am Dateiende, das ist mitkorrigiert.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NzeVVgMCrzCDJAKeLEdKr7
2026-07-31 22:31:57 +02:00

50 lines
1.9 KiB
PHP

<?php
declare(strict_types=1);
/**
* FAQ-Accordion. Props:
* $faq array [{q, a, ctas?: [{label, slug, hash?, style?}]}, …]
* ctas ist optional und rendert Knöpfe unter der Antwort (über die cta-Komponente),
* für Antworten, an deren Ende ein Handgriff steht — etwa „so meldest du dich an".
* Das FAQPage-Schema ist davon unberührt: faq_schema() liest nur q und a. Die
* Antwort muss den Weg deshalb IN WORTEN nennen, sonst steht bei Google eine
* Antwort ohne Ziel.
* $title string (optional, Default 'Häufige Fragen')
* $anchor string (optional, Default 'faq')
* Natives <details>/<summary> → 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;
}
?>
<section class="section faq" id="<?= e($anchor) ?>">
<div class="container faq__inner">
<h2><?= e($title) ?></h2>
<div class="faq__list">
<?php foreach ($faq as $item): ?>
<details class="faq__item">
<summary class="faq__q"><span><?= e($item['q']) ?></span><?= icon('chevron-down', 'faq__chevron') ?></summary>
<div class="faq__a">
<p><?= inline_links_html($item['a']) ?></p>
<?php if (!empty($item['ctas'])): ?>
<div class="faq__actions">
<?php foreach ($item['ctas'] as $cta): ?>
<?php component('cta', ['cta' => $cta]); ?>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>
</details>
<?php endforeach; ?>
</div>
</div>
</section>