- WhatsApp-Webhook: Neue Nachrichten mit #out setzen category='ausverkauft',
Spieltitel wird nach #out extrahiert (abgeschnitten an Satzzeichen/Trennern)
- Thread-Append: #out in Folgenachrichten aktualisiert category + spiel_titel
- Web-Form-Submit: #out im Text setzt category='ausverkauft' + extrahiert Titel
- Fix: lokales 'import re' in api_submit entfernt (globale 're' reicht)
- Frontend: Filter-Dropdown zeigt 'ausverkauft' dynamisch, Badge auf Karten +
Detailseite
- story-time-overlay: right:0 hinzugefügt → durchgängige Bar von links nach rechts
- Halle-Badge sitzt mit z-index:5 auf dem Milchglas
- Kein abgesetzter Rand mehr — einheitliche Top-Leiste
- story-time-overlay: top/left auf 0, border-radius zur Karte hin
- story-halle-badge: top/right auf 0
- story-ausverkauft-badge: top/left auf 0
- Alle drei Badges sitzen jetzt auf einer Linie am oberen Kartenrand
- chatBackdrop div mit backdrop-filter:blur(4px) hinter dem Chat-Overlay
- Rest der Seite wird unscharf wenn Chat geöffnet ist
- Klick auf Backdrop schließt den Chat
- Öffnen/Schließen synchron mit ChatOverlay via JS
- Detailseite: 👍 als interaktiver Button (statt statischer Text)
- JS-Fetch-Handler auf /api/like/<id>, Cookie-Dedup
- CSS: .detail-like-btn mit Hover/Liked-Styles (BSN-Blau)
- Gleiche Logik wie Übersichtskarten (1 Like pro Browser)
- Neuer /api/speak Endpunkt: Text → Piper TTS → WAV-Audio
- Frontend speak() ruft jetzt Server-Endpunkt statt Web Speech API
- Browser-TTS nur als Fallback wenn Server nicht erreichbar
- 🔊 Button prominenter: BSN-blauer Hintergrund + sichtbarer Rand
- Fix: SVG-Icons auf Beitrags-Detailseite statt Emojis
- Fix: Datum bei Text-Only-Karten unten rechts (top:auto)
- .mov-Dateien werden beim Upload automatisch per ffmpeg in .mp4 (H.264) konvertiert
- .mov in allen drei mime_maps ergänzt (api_submit, Frontend, Detail-Seite)
- Existierende .mov-Datei (Beitrag #49) konvertiert + DB aktualisiert
- Logo: Flood-Fill-basierte Hintergrund-Transparenz (nur außen, Schrift-Innenraum bleibt weiß)
- JPEG-Logo mit PIL in transparentes PNG konvertiert (Weiß→Alpha)
- LOGO_B64 als Modul-Level-Konstante (PNG, ~83KB base64)
- Logo in public_frontend(), public_detail(), admin_dashboard(), test_page()
- .replace()-Methode für Nicht-f-String-Kontexte (Frontend, Test)
- Logo (993x217) als Base64 in public_frontend() und public_detail()
- Ersetzt 🎲 BSN Community Text-Logo durch Brettspiel News Bild-Logo
- PROJEKT-BRIEFING.md: Vollständige Projektdokumentation für AGB/Datenschutz
- Architektur, Datenflüsse, DSGVO-Relevanz, Feature-Stand
- /api/submit gibt jetzt submission_id + delete_hint zurück
- Frontend zeigt nach erfolgreichem Submit eine Erfolgsmeldung mit ID
- '📋 Kopieren'-Button speichert die ID in die Zwischenablage
- Hinweis, dass die ID für spätere Löschung notiert werden soll
- Overlay schließt nach 8s (statt 2.5s) — Zeit zum Kopieren
- Text-only cards now use .story-time-overlay like media cards
- Overlay positioned top-right within .card-content (position:relative)
- Cards wrapped in <a> link → klick öffnet /beitrag/ID
- .card-link styles mit hover-Effekt (gleicher Lift wie .story-card)
- left:auto für Text-Overlay (resetet left:8px der Basis-Regel)
- Runde Buttons (68×68px, border-radius:50%) statt rechteckig
- Monochrome SVG-Icons in BSN-Blau (#20228a) statt bunter Emojis
- Alle drei gleich groß, zentriert in der Reihe
- Datei-Vorschau-Balken unter den Buttons:
'🖼️ foto.jpg (2.3 MB) — wird mitgesendet'
erscheint sofort nach Auswahl/Aufnahme, verschwindet beim Absenden
- onchange-Listener auf allen 4 Inputs
- Drei große Touch-Buttons (min 64px, flex-row) statt einem Dateifeld
- capture='environment' für Foto/Video → Kamera-App öffnet direkt
- capture (ohne Wert) für Audio → Sprachrekorder öffnet direkt
- 'Choose File' als Galerie-Fallback für bestehende Dateien
- Overlay max-height erhöht (85vh Desktop, 90vh Mobile)
damit alle Buttons ohne Scrollen sichtbar sind
- JavaScript prüft alle 4 Inputs auf Dateien
- Zeit („heute 12:27 Uhr") wandert aus card-content nach oben
über das Bild/Thumbnail als absolutes Overlay
- Milchglas-Effekt: rgba(255,255,255,0.28) + backdrop-filter blur(10px)
- Rote Schrift (#dc3545) für gute Lesbarkeit auf hellem Grund
- Abgerundete Ecken (10px), dezenter Schatten
- Spart Platz in der Karte, sieht edler aus
- Text-only-Karten behalten die Zeit inline im card-content
Der erste <script>-Block (Submit-IIFE) wurde nie mit </script>
geschlossen. Das zweite <script> wurde als Teil des ersten JS-Blocks
interpretiert → Syntax-Fehler → addEventListener nie registriert.