Stadionzeitung, Veranstaltungen, News-Artikel, Lightbox und Anzeigen-Verteilung

Stadionzeitung: Live-Seiten (Tabellen, Ergebnisse, Vorschau, Termine, News,
Kontakt, Historie, Sportheim, Partner, Momente, Impressum), automatisches Cover,
Swipe-Viewer mit Vollbildmodus und die Druckfassung als Falt-Heft. Anzeigen
kommen jetzt aus dem Bestand und werden gleichmäßig verteilt, nie mehr als zwei
hintereinander (vorher vier Blöcke à fünf). Die Doppelseiten-Regel rechnet das
Skript selbst, statt sie von Hand zu prüfen.

Veranstaltungen: Bereich /veranstaltungen mit Detailseite pro Fest, Lebenszyklus
über das Datum (Ankündigung vor dem Fest, Rückblick danach), Galerie mit
Lightbox. veranstaltungen.json ist dritte Termin-Quelle, damit ein Fest nie
doppelt gepflegt wird.

News-Artikel als dritte dynamische Prefix-Route, gemeinsamer detail-head.

Behobene Fehler:
- Wappen-Kontexte setzten Zeilen-Layout auf .crest statt auf die Zeile; das
  Wappen wurde zum Grid, Vereinsname und Tore rutschten darunter zusammen
  (Ergebnis-Rückblick, Vorschau, Cover).
- --header-h (60px) unterschätzt die Kopfleiste um 32px (Logo 72px + 20px
  Versatz): neues abgeleitetes --header-space, sonst klebten Zurück-Links
  unter dem Logo.
- base_url in der Produktions-Config ohne www, während .htaccess auf www
  umleitet; preflight prüft das jetzt.
- .lightbox brauchte display:none mit (0,2,0), sonst lag das Overlay offen.

Neue Werkzeuge: bin/anzeige-add.php (Anzeigen-Bestand), bin/veranstaltung-bilder.php
(Plakate und Galerien, Alt-Texte folgen der Quelldatei), bin/qr.php (Druck-QR mit
Warnung, wenn base_url nicht auf die echte Domain zeigt).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NzeVVgMCrzCDJAKeLEdKr7
This commit is contained in:
2026-07-31 14:55:27 +02:00
parent 3fb480dd78
commit a101b0c3ec
861 changed files with 75244 additions and 487 deletions

View File

@@ -0,0 +1,20 @@
<?php
/**
* Wird von Files Gallery unten in den <body> eingebunden (index.php:3604) — nur im
* eingeloggten Zustand, der Login-Screen rendert seine eigene, knappe Seite.
*
* Bewusst nur Wappen und Link zurück zur Website: die Ablage soll aussehen wie ein
* Werkzeug des Vereins, nicht wie eine Hinweistafel. Regeln zur Ordner-Benennung und
* zu Bildrechten gehören in die mündliche/schriftliche Ansage an die Hochladenden;
* die datenschutzrechtliche Seite steht in app/pages/datenschutz.php.
*
* .custom-footer-fixed ist der dafür vorgesehene Hook der App (fest am unteren Rand);
* das Aussehen kommt aus public/assets/css/dateien.css.
*/
?>
<footer class="custom-footer-fixed tsv-footer">
<a href="/">
<img src="<?php echo e(asset('img/logo.svg')); ?>" alt="" width="24" height="31">
tsv08kulmbach.de
</a>
</footer>

View File

@@ -0,0 +1,13 @@
<?php
/**
* Wird von Files Gallery in den <head> eingebunden (index.php:945) — auch auf dem
* Login-Screen, weil beide Seiten U::html_header() nutzen. Trotz .html-Endung ein
* include, PHP läuft hier also (index.php:716).
*
* Nur der Marken-Skin: die eigentlichen Werte kommen aus tokens.css (einzige
* Farbquelle), die Zuordnung zu den App-Variablen aus dateien.css. Beide stehen
* nach der files.css der App und gewinnen deshalb.
*/
?>
<link rel="stylesheet" href="<?php echo e(asset('css/tokens.css')); ?>">
<link rel="stylesheet" href="<?php echo e(asset('css/dateien.css')); ?>">

View File

@@ -1,20 +0,0 @@
<?php
/**
* Zugang „verein" — das gemeinsame Konto zum Hochladen (Passwort im Verein weitergeben).
*
* Der Verzeichnisname ist der Benutzername (index.php:348-357). Nur die Abweichungen zur
* Hauptconfig stehen hier; alles andere erbt aus public/dateien/_filesconfig.php.
*
* Bewusst KEIN Löschen, Umbenennen oder Verschieben: an einem gemeinsamen Konto darf ein
* Fehlklick nicht die Fotos anderer treffen. Aufräumen macht der Admin.
*
* Ohne Hash in config/config.php bleibt das Passwort leer und die App verweigert den
* Zugang (index.php:490) — fehlende Config heißt also „kein Login", nie „offen".
*/
return [
'password' => (string) config('dateien.users.verein.password_hash', ''),
'allow_upload' => true,
'allow_new_folder' => true,
'allow_download' => true,
];