Sportfest-Ausgabe der Stadionzeitung zum Heimspiel gegen ATS Wartenfels

Neue Live-Seiten, geschaltet vom chat-gepflegten Feld `veranstaltung` (Slug aus
data/veranstaltungen.json) — Programm und Turnierpläne kommen damit aus derselben
Quelle wie die Website, nicht als Kopie ins Heft:

- Programm-Seite (programm[], rendert zugleich auf /veranstaltungen/sportfest-2026)
- vier Turnierplan-Seiten (turniere[]) mit leerer Ergebnisspalte und leerer
  Abschlusstabelle zum Eintragen am Platz
- Gegnerseite je Mannschaft mit Heimspiel am Fest statt nur der tragenden:
  stadionzeitung_gegner_fixtures() ist die einzige Stelle, die das entscheidet,
  Seitenplanung und Snapshot lesen beide dort. `gegner` ist deshalb eine Map je
  Team-Key; die Vorschau überspringt jedes Spiel mit eigener Gegnerseite
- Danke-Seite mit Partner-Logo-Wand aus data/partners.json und QR auf
  /partner-werden, dazu das Anzeigen-Feld `platzierung` für Motive mit festem
  Platz auf einer Live-Seite (Emons über der Logo-Wand). Vorher klebte der Dank
  als leere Fläche unten an einem Anzeigen-Bild
- Cover einer Sonderausgabe: das Fest als Titelgeschichte statt einer der drei
  Begegnungen, dazu das Hauptplakat schräg gelegt an Stelle des Spielerfotos

Ausgabe 2026-09-04-ats-wartenfels als ENTWURF angelegt, 48 Seiten (12 Bögen),
Tabellen auf gerader Seite, längster Anzeigenblock zwei. Veröffentlicht wird auf
dem Server, dort liegt der frische Matchcenter-Stand.

Nebenbei behoben: bin/anzeige-add.php räumte beim Anlegen alle Motive weg, deren
Slug mit demselben Text beginnt (`emons` löschte `emons-partnerdank` und
`emons-stuebinger`). Muster jetzt auf die Breiten-Endung eingeschränkt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KubsajzuV6N6QsSd3xKNjC
This commit is contained in:
2026-09-03 10:57:52 +02:00
parent b4d2cde149
commit f2f193b223
40 changed files with 2273 additions and 77 deletions

View File

@@ -6097,6 +6097,25 @@ body.is-sz-full .back-to-top {
}
/* Titelgeschichte einer Sonderausgabe: das Fest statt der Begegnung. Coolvetica
in Versalien wie der Masthead, aber kleiner — es soll die zweite Stimme auf
dem Cover sein, nicht mit der Wortmarke konkurrieren. */
.stadionzeitung-cover__feature {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 1.7cqi;
text-align: left;
}
.stadionzeitung-cover__feature-title {
font-family: var(--ff-heading);
font-size: 13cqi;
line-height: 0.88;
text-transform: uppercase;
text-shadow: 0 2px 10px rgb(0 0 0 / 0.5);
}
/* Vereins-Hero-Bild als Hintergrund (dieselbe Quelle wie die Startseite). */
.stadionzeitung-cover__bg {
position: absolute;
@@ -6135,6 +6154,63 @@ body.is-sz-full .back-to-top {
width: auto;
}
/* Hauptplakat einer Sonderausgabe an der Stelle des Spielerfotos: rechts
randabfallend, leicht schräg gelegt und an zwei gegenüberliegenden Ecken
gerundet (links oben, rechts unten) — wie ein aufs Cover gelegter Aushang,
nicht wie ein eingesetztes Bild (Felix, 03.09.2026).
Warum kleiner als das Spielerfoto (98cqi hoch): ein Freisteller ist schmal,
ein Plakat im Hochformat ist bei gleicher Höhe knapp 60cqi breit und läge damit
über der Typografie unten links. Bei 66cqi Höhe belegt es die rechte Bildhälfte
und lässt Masthead und Fest-Titel frei — die Textspalte wird dafür schmaler
(siehe --poster .stadionzeitung-cover__corner).
Schatten statt Rahmen, damit das Plakat auf dem Foto-Hintergrund abhebt:
box-shadow ist unbedenklich, die Druck-Falle im Projekt betrifft text-shadow
auf umbrechendem Text (siehe .stadionzeitung-cover__corner). */
.stadionzeitung-cover__poster {
position: absolute;
z-index: 1;
/* VOLLSTÄNDIG im Bild, nicht randabfallend wie das Spielerfoto: ein Plakat
trägt Text (Datum, Ort), und angeschnitten fehlte rechts genau der. Die
Rotation lässt die Ecken trotzdem über die Passepartout-Linie laufen, das
Plakat liegt also sichtbar „auf" der Seite. */
/* Unten rechts randabfallend („angeschnitten", Felix 03.09.2026): das Plakat
läuft über zwei Kanten hinaus und wirkt dadurch aufgelegt statt eingesetzt.
Angeschnitten wird nur die untere rechte Ecke, nicht die Kopfzeile mit den
Terminen — die bleibt lesbar. */
right: -1.5cqi;
/* bottom: 0 statt negativ — die Box endet an der Blattkante, angeschnitten
wird nur noch die gedrehte Ecke (4 Grad auf 53cqi Breite = knapp 4cqi
Überhang). Das hält den Anschnitt-Look und rückt das Plakat gleichzeitig
aus dem unteren Bereich nach oben (Felix, 03.09.2026). */
bottom: 0;
/* Höhe ist NICHT frei wählbar: das Plakat darf die Textspalte links nicht
berühren. Rechnung bei 4 Grad Drehung — belegte Breite = Höhe / 1,414
(Hochformat) + sin(4°) × Höhe (Überhang der gedrehten Ecken) ≈ 0,78 × Höhe.
Bei 72cqi sind das 56,2cqi; mit 1,5cqi Überhang rechts liegt die linke Kante
bei 45,3% und die Textspalte endet bei 44%. Der Überhang ist bewusst winzig:
vom Plakat bleiben so 97% sichtbar und seine Schlagzeile „Sportfest" steht
ganz im Bild (Felix, 03.09.2026) — bei 9cqi Überhang fehlte rechts ein
Siebtel und das Wort lief aus dem Bild. Angeschnitten wirkt es trotzdem,
das macht die gedrehte Ecke unten. Höhe und Überhang hängen also
zusammen: weiter nach links (kleinerer Überhang) heißt kleiner, größer
heißt weiter nach rechts — oder die Textspalte muss schmaler
(--poster .stadionzeitung-cover__corner). Nicht nur eine Zahl drehen. */
height: 72cqi;
width: auto;
border-radius: 5cqi 0 5cqi 0;
transform: rotate(4deg);
box-shadow: 0 3cqi 6cqi rgb(0 0 0 / 0.45);
}
/* Schmaler als das Standard-Cover (56cqi): das Plakat belegt die rechte Hälfte.
„Sportfest 2026" bricht dadurch zweizeilig — auf einem Cover trägt das eher,
als es schadet. */
.stadionzeitung-cover--poster .stadionzeitung-cover__corner {
max-width: 38cqi;
}
.stadionzeitung-cover__inner {
position: relative;
z-index: 2;
@@ -7452,6 +7528,225 @@ a.news-feature__link:hover .news-feature__more {
color: var(--clr-accent);
}
/* === stadionzeitung-programm (Live-Seite, Sportfest-Ausgabe) === */
/* Tagesprogramm aus data/veranstaltungen.json → programm[] (dieselbe Liste wie
die Website-Detailseite, hier fürs A5-Blatt gesetzt): je Tag ein Abel-Caps-
Tagestitel, darunter Zeit | Titel. Die Zeit trägt links den roten Strich wie
.veranstaltung-programm__zeit auf der Website — gleiche Sprache, andere
Skala. Maße in cqi (Selbst-Containment, siehe .stadionzeitung-page). */
/* Abstände bewusst straff: ein dreitägiges Fest bringt gut zwölf Punkte plus
drei Tagestitel auf EIN A5-Blatt (gemessen: mit den üblichen 3.3cqi lief die
Seite 59px über die Blattkante). Wer hier lockerer setzt, misst die
Seitenhöhe nach. */
.stadionzeitung-programm__tag {
margin-bottom: 2.2cqi;
}
.stadionzeitung-programm__tag:last-child {
margin-bottom: 0;
}
.stadionzeitung-programm__tag-titel {
margin-bottom: 0.9cqi;
padding-bottom: 0.6cqi;
border-bottom: 1px solid var(--clr-glass-border);
font-family: var(--ff-body);
font-weight: var(--fw-bold);
font-size: 2.9cqi;
text-transform: uppercase;
letter-spacing: var(--ls-caps);
color: var(--clr-text-muted);
}
.stadionzeitung-programm__liste {
margin: 0;
padding: 0;
list-style: none;
}
.stadionzeitung-programm__punkt {
display: grid;
grid-template-columns: 11cqi minmax(0, 1fr);
gap: 2.2cqi;
align-items: baseline;
padding-block: 0.5cqi;
}
.stadionzeitung-programm__zeit {
padding-left: 1.4cqi;
border-left: 2px solid var(--clr-accent);
font-family: var(--ff-body);
font-weight: var(--fw-bold);
font-size: 3.3cqi;
font-variant-numeric: tabular-nums;
white-space: nowrap;
}
.stadionzeitung-programm__titel {
display: block;
font-size: 3.3cqi;
line-height: 1.3;
}
.stadionzeitung-programm__text {
display: block;
margin-top: 0.3cqi;
font-size: 2.7cqi;
line-height: 1.3;
color: var(--clr-text-muted);
}
/* === stadionzeitung-turnier (Live-Seite, Sportfest-Ausgabe) === */
/* Ein Jugendturnier pro Blatt: Spielplan mit LEERER Ergebnisspalte
(Schreiblinien) und leere Abschlusstabelle — das Blatt ist zum Eintragen am
Platz gedacht, deshalb echte Schreibhöhe in den leeren Zellen. Eigenes Team
wie league-table tr.is-own (rote Tönung + Abel-Fett). Tabellenmaße an
.stadionzeitung-page .league-table angelehnt (2.7/2.3cqi). Der Modifier
--dicht (ab neun Spielen, E-Jugend) rückt die Zeilen enger, sonst läuft die
Abschlusstabelle über die Blattkante. */
.stadionzeitung-turnier__label {
caption-side: top;
text-align: left;
margin: 3.3cqi 0 1.2cqi;
font-family: var(--ff-body);
font-weight: var(--fw-bold);
font-size: 2.9cqi;
text-transform: uppercase;
letter-spacing: var(--ls-caps);
color: var(--clr-text-muted);
}
p.stadionzeitung-turnier__label:first-of-type {
margin-top: 0;
}
.stadionzeitung-turnier__teams {
font-size: 3.1cqi;
line-height: 1.5;
}
.stadionzeitung-turnier__spiele,
.stadionzeitung-turnier__tabelle {
width: 100%;
border-collapse: collapse;
font-size: 2.9cqi;
font-variant-numeric: tabular-nums;
}
.stadionzeitung-turnier__spiele thead th,
.stadionzeitung-turnier__tabelle thead th {
padding: 0.8cqi 0.9cqi;
border-bottom: 1px solid var(--clr-glass-border-strong);
font-family: var(--ff-body);
font-weight: var(--fw-bold);
font-size: 2.3cqi;
text-transform: uppercase;
letter-spacing: var(--ls-caps);
color: var(--clr-text-muted);
text-align: left;
}
.stadionzeitung-turnier__spiele td,
.stadionzeitung-turnier__tabelle td {
padding: 1cqi 0.9cqi;
border-bottom: 1px solid var(--clr-glass-border);
vertical-align: middle;
line-height: 1.25;
}
/* Dichte Variante ab neun Spielen: die E-Jugend spielt zehn Partien auf zwei
Feldern und braucht darunter noch eine Tabelle mit fünf Zeilen. Mit den
normalen Abständen lief das Blatt 69px über. Alle vier Stellen unten gehören
zusammen — eine allein reicht nicht. */
.stadionzeitung-turnier--dicht .stadionzeitung-turnier__spiele td {
padding-block: 0.3cqi;
}
/* Die Zeilenhöhe des Spielplans macht NICHT die Schriftgröße, sondern die
Schreiblinie: sie ist das höchste Element in der Zeile. Bei zehn Spielen
zählt deshalb nur diese Stelle (eine kleinere Schrift brachte gemessen
einen einzigen Pixel). 2.8cqi sind auf A5 gut 4mm über der Linie, genug
für zwei Ziffern mit dem Stift. */
.stadionzeitung-turnier--dicht .stadionzeitung-turnier__blank {
height: 2.8cqi;
}
.stadionzeitung-turnier--dicht .stadionzeitung-turnier__tabelle td {
padding-block: 0.6cqi;
}
/* 4cqi Zellhöhe sind auf A5 knapp 6mm plus Innenabstand — genug, um Tore und
Punkte mit dem Stift einzutragen, und es passt neben zehn Spielzeilen. */
.stadionzeitung-turnier--dicht .stadionzeitung-turnier__tabelle td:empty {
height: 4cqi;
}
.stadionzeitung-turnier--dicht .stadionzeitung-turnier__label {
margin: 1.8cqi 0 0.7cqi;
}
.stadionzeitung-turnier--dicht .stadionzeitung-turnier__teams {
font-size: 2.9cqi;
line-height: 1.35;
}
.stadionzeitung-turnier__nr {
width: 6cqi;
color: var(--clr-text-muted);
}
.stadionzeitung-turnier__zeit {
width: 9cqi;
white-space: nowrap;
}
.stadionzeitung-turnier__paarung {
width: 100%;
}
.stadionzeitung-turnier__vs {
color: var(--clr-text-muted);
}
.stadionzeitung-turnier__team.is-own {
padding-inline: 0.6cqi;
border-radius: 0.6cqi;
background: rgb(var(--clr-accent-rgb) / 0.16);
font-weight: var(--fw-bold);
}
/* Leere Ergebnisspalte: zwei Schreiblinien um den Doppelpunkt, unten
ausgerichtet wie eine Zeile zum Ausfüllen. */
.stadionzeitung-turnier__ergebnis {
white-space: nowrap;
text-align: center;
}
.stadionzeitung-turnier__blank {
display: inline-block;
width: 6cqi;
height: 3.4cqi;
border-bottom: 1px solid var(--clr-text-faint);
vertical-align: baseline;
}
.stadionzeitung-turnier__colon {
display: inline-block;
padding-inline: 0.8cqi;
font-weight: var(--fw-bold);
}
/* Schreibhöhe der leeren Tabellenzellen (Platzierung wird von Hand eingetragen). */
.stadionzeitung-turnier__tabelle td:empty {
height: 5.6cqi;
}
.stadionzeitung-turnier__tabelle th:nth-child(n + 3),
.stadionzeitung-turnier__tabelle td:nth-child(n + 3) {
width: 9cqi;
text-align: center;
}
/* === stadionzeitung-news (Live-Seite) === */
/* Eigene Liste statt des geteilten news-feed von /news: feste Medienspalte
(Wappen/Foto/Icon-Badge in EINER Größe), damit alle Titel bündig stehen —
@@ -7864,6 +8159,57 @@ a.news-feature__link:hover .news-feature__more {
color: var(--clr-text);
}
/* === stadionzeitung-danke (Live-Seite) === */
/* Dank an die Partner: oben die platzierte Anzeige (Motiv aus dem Seiteneintrag,
siehe stadionzeitung-danke.php), darunter Kopf, Logo-Wand und der QR auf
/partner-werden. Vier Logos pro Reihe in EINER festen Zellhöhe, damit
unterschiedlich hohe Logos auf einer Linie sitzen — dieselbe Idee wie die
feste Medienspalte auf der News-Seite. Maße in cqi (Selbst-Containment). */
.stadionzeitung-danke {
display: flex;
flex-direction: column;
min-height: 100%;
}
.stadionzeitung-danke__anzeige {
width: 100%;
height: auto;
margin-bottom: 5cqi;
border: 1px solid var(--clr-glass-border);
}
.stadionzeitung-danke__head {
margin-bottom: 3.3cqi;
}
.stadionzeitung-danke__logos {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 3.3cqi 2.5cqi;
margin: 0 0 auto;
padding: 0;
list-style: none;
}
.stadionzeitung-danke__logo {
display: flex;
align-items: center;
justify-content: center;
/* Feste Zellhöhe: Logos sind teils quer, teils hoch — ohne sie tanzt die Reihe. */
height: 11cqi;
}
/* Logos liegen hier auf Weiß statt auf dem dunklen Website-Grund: contain statt
cover, damit nichts beschnitten wird, und keine Tönung — ein Sponsorenlogo
wird nicht umgefärbt. */
.stadionzeitung-danke__logo img {
max-width: 100%;
max-height: 100%;
width: auto;
height: auto;
object-fit: contain;
}
/* === stadionzeitung-momente (Live-Seite, Heft-Abschluss) === */
/* 2×2-Galerie der neuesten Instagram-Fotos + Folge-uns-Ticket — quadratische
Kacheln wie im Instagram-Raster, bewusst ohne Bildunterschriften: die