diff --git a/CLAUDE.md b/CLAUDE.md
index 6cbe5ed..af679b4 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -434,8 +434,13 @@ Besucher laden alle Matchcenter-Inhalte ausschließlich von unserer Domain.
## Stadionzeitung (Ausgaben-Archiv)
-Digitale Fassung der Stadionzeitung zu jedem Heimspiel — Archiv-Übersicht (`/stadionzeitung`) mit
-Vorschau-Karten, pro Ausgabe ein Swipe-Viewer (`/stadionzeitung/`, dynamische Route,
+Digitale Fassung der Stadionzeitung zu jedem Heimspiel — Archiv-Übersicht (`/stadionzeitung`) als
+**Liste über die volle Breite, Cover links und die Angaben rechts daneben** (dasselbe Muster wie
+`.veranstaltung-card`, und aus demselben Grund: der Bestand ist klein). Vorher war das ein
+horizontales Regal mit 280px-Karten; bei **einer** veröffentlichten Ausgabe stand die Karte allein
+links auf einer 1280px breiten Seite (geändert 31.07.2026). Die Zeile trägt als Teaser die
+**Coverzeile des Interviews** (`interview.teaser`, dieselbe Quelle wie „Im Heft" auf dem Cover) —
+ohne Interview entfällt sie. Pro Ausgabe ein Swipe-Viewer (`/stadionzeitung/`, dynamische Route,
siehe „Architektur-Muster"). **Bewusst kein PDF auf der Website** — die Ausgabe entsteht ohnehin in
Canva, jede Seite wird dort direkt als Bild (PNG/JPG) statt als PDF exportiert. Ein PDF-Export der
Muster-Datei war ~80 MB (hochauflösende Druck-Scans) und hätte serverseitig Ghostscript/Imagick
diff --git a/app/components/stadionzeitung-cards.php b/app/components/stadionzeitung-cards.php
index dd71fa3..cf5a74d 100644
--- a/app/components/stadionzeitung-cards.php
+++ b/app/components/stadionzeitung-cards.php
@@ -36,6 +36,14 @@ $issues = $issues ?? [];
· = (int) $issue['pages'] ?> Seiten
+
+
+
= e($kartenTeaser) ?>
+
Ausgabe lesen = icon('arrow-right', 'stadionzeitung-card__arrow') ?>
diff --git a/public/assets/css/components.css b/public/assets/css/components.css
index 8954bb3..c5cbd86 100644
--- a/public/assets/css/components.css
+++ b/public/assets/css/components.css
@@ -3341,44 +3341,49 @@
}
/* === stadionzeitung-cards (Ausgaben-Archiv) === */
-/* Regal statt Grid: 7-10 Ausgaben pro Saison sind zu wenig für ein Raster, das
- nicht bei 1-3 Karten wie eine leere Fläche mit einer verlorenen Karte
- wirkt. Dasselbe Muster wie .instagram__grid (dort nur mobil, hier immer,
- weil die Kartenzahl selbst auf Desktop-Breite selten eine Zeile füllt) —
- angeschnittene Folgekarte als Wisch-Affordance, kein eigener JS-Code nötig
- (natives Scrollen reicht, Buttons gäbe es sonst nirgends im Projekt für
- dieses Muster). */
+/* Liste über die volle Breite, Cover links und die Angaben rechts daneben —
+ dasselbe Muster wie .veranstaltung-card, und aus demselben Grund: der Bestand
+ ist klein (eine Handvoll Ausgaben pro Saison).
+
+ Hier stand vorher ein horizontales Regal (grid-auto-flow: column, 280px-Spalten,
+ Scroll-Snap). Der Kommentar dazu nannte genau die richtige Gefahr — „bei 1-3
+ Karten wie eine leere Fläche mit einer verlorenen Karte" — löste sie aber nicht:
+ mit EINER veröffentlichten Ausgabe stand eine 280px-Karte allein links auf einer
+ 1280px breiten Seite (31.07.2026). Eine Zeile über die volle Breite füllt die
+ Fläche bei jeder Anzahl, von einer Ausgabe bis zwanzig.
+
+ Unterschied zu .veranstaltung-card, der die Maße erklärt: dort ist das Medium ein
+ , das per object-fit beschnitten wird. Hier ist es die live gerenderte
+ Cover-Seite mit festem A5-Verhältnis — die lässt sich nicht beschneiden, sie
+ bestimmt die Zeilenhöhe. Die Medienspalte ist deshalb schmaler als die 26% dort:
+ 230px Cover ergeben 326px Zeilenhöhe. */
.stadionzeitung-cards__grid {
display: grid;
- grid-auto-flow: column;
- grid-auto-columns: min(66vw, 280px);
gap: var(--space-l);
margin: var(--space-l) 0 0;
- padding: 0 0 var(--space-2xs);
+ padding: 0;
list-style: none;
- overflow-x: auto;
- scroll-snap-type: x mandatory;
- scrollbar-width: none;
-}
-
-.stadionzeitung-cards__grid::-webkit-scrollbar {
- display: none;
}
.stadionzeitung-card {
- display: grid;
- grid-template-rows: auto 1fr;
- height: 100%;
+ display: flex;
+ align-items: stretch;
color: var(--clr-text);
text-decoration: none;
background: var(--clr-glass-bg);
border: 1px solid var(--clr-glass-border);
border-radius: var(--radius-card);
overflow: hidden;
- scroll-snap-align: start;
transition: transform var(--transition), box-shadow var(--transition);
}
+/* clamp statt fester Breite: unter ~700px Kartenbreite wären 230px Cover mehr als
+ ein Drittel der Zeile und der Text bekäme zu wenig. */
+.stadionzeitung-card__media {
+ flex: 0 0 clamp(140px, 18%, 230px);
+ overflow: hidden;
+}
+
.stadionzeitung-card:hover,
.stadionzeitung-card:focus-visible {
transform: translateY(-4px);
@@ -3417,8 +3422,9 @@
.stadionzeitung-card__body {
display: flex;
flex-direction: column;
+ justify-content: center;
gap: var(--space-3xs);
- padding: var(--space-l);
+ padding: var(--space-2xl);
}
.stadionzeitung-card__name {
@@ -3435,14 +3441,26 @@
color: var(--clr-text-muted);
}
+/* Teaser wie .veranstaltung-card__text: Lesespalte begrenzt, damit die Zeile auf
+ breiten Bildschirmen nicht über die halbe Seite läuft. */
+.stadionzeitung-card__text {
+ max-width: 60ch;
+ margin-top: var(--space-2xs);
+ color: var(--clr-text-muted);
+}
+
.stadionzeitung-card__cta {
display: inline-flex;
align-items: center;
gap: var(--space-2xs);
- margin-top: auto;
padding-top: var(--space-s);
font-size: var(--fs-500);
color: var(--clr-accent);
+ /* KEIN margin-top: auto. Das stammte aus der hochformatigen Karte, wo der
+ Link an den Kartenfuß gehörte. In der breiten Zeile riss es die drei
+ kurzen Zeilen auseinander: Titel oben, Link unten, dazwischen 150px
+ Leere. Jetzt stehen sie als Gruppe zusammen, mittig zur Cover-Höhe
+ (justify-content: center am __body). */
}
.stadionzeitung-card__arrow {
@@ -3453,6 +3471,22 @@
transform: translateX(3px);
}
+@media (max-width: 768px) {
+ /* Am Handy steht das Cover über den Angaben — nebeneinander bliebe für keines
+ von beidem genug Breite. Gleiche Entscheidung wie bei .veranstaltung-card. */
+ .stadionzeitung-card {
+ flex-direction: column;
+ }
+
+ .stadionzeitung-card__media {
+ flex: none;
+ }
+
+ .stadionzeitung-card__body {
+ padding: var(--space-l);
+ }
+}
+
/* === team-roster (Kader + Trainerstab) === */
.team-roster > .container {
text-align: center;