diff --git a/CloudronManifest.json b/CloudronManifest.json index a17e851..d4cb3a9 100644 --- a/CloudronManifest.json +++ b/CloudronManifest.json @@ -3,7 +3,7 @@ "title": "Sendewerk", "description": "Redaktionelle Planung und Durchführung von heinzlive-Sendungen.", "tagline": "Vom Fundstück bis zur Livesendung", - "version": "0.5.0", + "version": "0.5.12", "healthCheckPath": "/healthz", "httpPort": 3000, "addons": { diff --git a/docs/ACCEPTANCE.md b/docs/ACCEPTANCE.md index 805afd7..1e9a829 100644 --- a/docs/ACCEPTANCE.md +++ b/docs/ACCEPTANCE.md @@ -413,16 +413,22 @@ - reale OBS-Browserquelle, echte YouTube-/TikTok-Wiedergabe und Safari auf einem iOS-Gerät nicht ausgeführt; Anbieterrequests wurden lokal abgefangen -## Kompakte Live-Regie und Verwaltungskorrektur 0.5.11 +## Verwaltungskorrektur 0.5.11 + +| Kriterium | Nachweis | Stand | +| ------------------------------------------ | ---------------------------------------------------------------------------------------- | --------------------- | +| Werkzeugdialog ist initial geschlossen | Chromium prüft den Dialog vor jeder Bedienaktion bei 390 und 1280 Pixeln | erfüllt am 23.10.2026 | +| Dialog öffnet nur nach bewusster Aktion | Browser legt ein Werkzeug an und öffnet ein bestehendes Werkzeug anschließend zum Ändern | erfüllt am 23.10.2026 | +| Bestehender Werkzeugablauf bleibt erhalten | Browser prüft Icon, Format, Deaktivierung und Piece-Zuordnung nach erneutem Laden | erfüllt am 23.10.2026 | +| Themen-Iconpicker bleibt im Viewport | Chromium prüft Öffnen und Auswahl bei 390, 960 und 1280 Pixeln | erfüllt am 23.10.2026 | + +## Kompakte Live-Regie 0.5.12 | Kriterium | Nachweis | Stand | | ------------------------------------------- | ------------------------------------------------------------------------------------------------ | --------------------- | -| Werkzeugdialog ist initial geschlossen | Chromium prüft den Dialog vor jeder Bedienaktion bei 390 und 1280 Pixeln | erfüllt am 24.10.2026 | -| Dialog öffnet nur nach bewusster Aktion | Browser legt ein Werkzeug an und öffnet ein bestehendes Werkzeug anschließend zum Ändern | erfüllt am 24.10.2026 | -| Bestehender Werkzeugablauf bleibt erhalten | Browser prüft Icon, Format, Deaktivierung und Piece-Zuordnung nach erneutem Laden | erfüllt am 24.10.2026 | -| Themen-Iconpicker bleibt im Viewport | Chromium prüft Öffnen und Auswahl bei 390, 960 und 1280 Pixeln | erfüllt am 24.10.2026 | | Globale Navigation bleibt aus der Regie | Chromium findet weder Seitenleiste noch mobilen App-Header oder Bottomnavigation | erfüllt am 24.10.2026 | | Kleines Desktopfenster bleibt zweispaltig | Chromium prüft Moderation, Ablauf und feste Aktionen bei 900 × 450 Pixeln | erfüllt am 24.10.2026 | +| Niedrige Desktophöhe wird berücksichtigt | 900 × 450 aktiviert kompakte Abstände ohne Transform oder CSS-Zoom | erfüllt am 24.10.2026 | | Lange Inhalte scrollen innerhalb der Fläche | Synthetischer Langtext und zusätzliche Ablaufabschnitte erzeugen zwei unabhängige Scroller | erfüllt am 24.10.2026 | | Mobile Regie verwendet ein Ablauf-Sheet | 390 × 700 prüft Endlage, Fokus, Escape, Aktionsschließen und Wechsel auf 900 Pixel | erfüllt am 24.10.2026 | | Leseposition bleibt am Piece | Nach tiefem Scrollen beginnt ein direkt gewähltes anderes Piece am oberen Rand | erfüllt am 24.10.2026 | @@ -430,14 +436,20 @@ | Erstes und letztes Piece direkt wählbar | Browser wechselt per stabiler Usage-ID auf Desktop und aus dem mobilen Sheet in beide Richtungen | erfüllt am 24.10.2026 | | Navigation veröffentlicht nicht automatisch | Öffentliche Ausgabe bleibt bei direkter Auswahl unverändert | erfüllt am 24.10.2026 | | Timer und Livezustand überleben Reload | Aktuelles Piece und laufender Abschnittscountdown bleiben nach Neuladen erhalten | erfüllt am 24.10.2026 | +| Wiederaufnahme nur bei Unterbrechung | Während eines aktiven Pieces fehlt die Aktion; nach unterbrochenem Stand ist sie prominent | erfüllt am 24.10.2026 | | Sendungsende ist eindeutig | Letztes Piece zeigt Endaktion ohne horizontalen Überlauf; danach fehlen Weiter-Aktionen | erfüllt am 24.10.2026 | -## Ausgeführte Prüfungen 0.5.11 +## Ausgeführte Prüfungen 0.5.12 -- gezielter Chromium-Test des Werkzeugablaufs: 1 von 1 erfolgreich - `npm run lint`: erfolgreich - `npm run check`: 0 Fehler und 0 Warnungen - `npm test`: 40 Tests in 7 Dateien erfolgreich +- gezielter Live-Regie-Lauf: 1 von 1 Chromium-Test erfolgreich - `npm run test:e2e`: 16 von 16 Chromium-Browsertests erfolgreich +- Screenshots der Live-Regie bei 1440 × 900, 900 × 450 und 390 × 700 Pixeln + einschließlich mobilem Ablauf-Sheet visuell kontrolliert - `npm run build`: erfolgreich mit `@sveltejs/adapter-node` +- Versionsgleichheit `0.5.12` in Paket, Lockdatei und Cloudron-Manifest geprüft - `bash -n start.sh` und `git diff --check`: erfolgreich +- reale OBS-Browserquelle, echte YouTube-/TikTok-Wiedergabe und Safari auf einem + iOS-Gerät nicht ausgeführt; Anbieterrequests wurden lokal abgefangen diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 68abc5d..4a75508 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -287,12 +287,14 @@ Die private Route `/live` verwendet ebenfalls einen eigenen authentifizierten Layoutmodus ohne allgemeine Seitenleiste, mobilen App-Header oder Bottomnavigation. Ihre Regiefläche belegt die verfügbare Viewporthöhe als Raster aus fester Statuszeile, unabhängig scrollender Piece- und Ablaufspalte sowie -fester Aktionszeile. Unterhalb des schmalen Breakpoints wird ausschließlich die -Ablaufspalte als modales Sheet mit Fokusbegrenzung eingeblendet; beim Wechsel -auf einen breiteren Viewport wird dieser Modalzustand aufgehoben. Dieser -Layoutmodus ändert weder die Live-Actions noch die getrennte öffentliche -`/heinzlive`-Projektion. Lokale Lesepositionen sind an die jeweilige Verwendung -gebunden und werden nicht zwischen Pieces übertragen. +fester Aktionszeile. Die Breite entscheidet über zwei Spalten oder das mobile +Sheet; eine geringe Desktophöhe verdichtet zusätzlich Abstände und Leisten, +ohne Schrift oder Oberfläche zu skalieren. Unterhalb des schmalen Breakpoints +wird ausschließlich die Ablaufspalte als modales Sheet mit Fokusbegrenzung +eingeblendet; beim Wechsel auf einen breiteren Viewport wird dieser Modalzustand +aufgehoben. Dieser Layoutmodus ändert weder die Live-Actions noch die getrennte +öffentliche `/heinzlive`-Projektion. Lokale Lesepositionen sind an die jeweilige +Verwendung gebunden und werden nicht zwischen Pieces übertragen. Icons werden aus dem lokalen Font-Awesome-Classic-Regular-Sprite unter `static/icons` gerendert. Die Verwaltung lädt zusätzlich die durchsuchbaren diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index 57a8fa1..dad3946 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -366,8 +366,10 @@ Lizenz stehen in `THIRD_PARTY_NOTICES.md`. Die authentifizierte Live-Steuerung nutzt einen eigenen Root-Layoutmodus und rendert die allgemeine App-Navigation nicht. Kopf- und Aktionszeile bleiben fest; Moderation und Ablauf sind die einzigen unabhängig scrollenden Arbeitsflächen. -Die Umschaltung zum mobilen Sheet hängt ausschließlich von der Fensterbreite ab, -damit ein breites, niedriges Desktopfenster weiterhin zwei Spalten verwendet. +Die Umschaltung zum mobilen Sheet hängt von der Fensterbreite ab, damit ein +breites, niedriges Desktopfenster weiterhin zwei Spalten verwendet. Die Höhe +steuert dort unabhängig die Dichte von Abständen und Bedienleisten. Textgröße +und Gesamtoberfläche werden nicht skaliert. Diese Darstellung ist keine neue Live-Zustandsgrenze. Start, direkte Auswahl, Erledigen, Überspringen, Reserveeinfügung und Präsentation bleiben unveränderte diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index 1f04f82..c77f4bf 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -1,10 +1,10 @@ # Release Notes -## 0.5.11 - Kompakte Live-Regie +## 0.5.12 - Kompakte Live-Regie -Veröffentlicht am 23. Oktober 2026 +Veröffentlicht am 24. Oktober 2026 -Sendewerk 0.5.11 macht aus der privaten Live-Steuerung eine kompakte Regieansicht +Sendewerk 0.5.12 macht aus der privaten Live-Steuerung eine kompakte Regieansicht für Vollbild, Smartphone und kleine Desktopfenster neben OBS oder Firebot. Das aktuelle Piece, die Position im Ablauf, der Abschnittscountdown und die wichtigsten Aktionen bleiben gleichzeitig erreichbar. Die öffentliche @@ -19,6 +19,8 @@ heinzlive-Ausgabe und die gespeicherten Livezustände bleiben technisch getrennt - Moderation und Ablauf bleiben auch bei einem nur 900 × 450 Pixel großen Desktopfenster nebeneinander. Lange Inhalte scrollen innerhalb ihrer Arbeitsfläche; Kopf- und Aktionszeile bleiben sichtbar. +- Niedrige Desktopfenster verdichten Abstände und Bedienleisten anhand der + verfügbaren Höhe, ohne Text oder die gesamte Oberfläche zu skalieren. - Die feste Fußleiste bündelt nächstes Piece, „Präsentieren“, „Überspringen“ und „Erledigen & weiter“. Beim letzten offenen Piece wird das Sendungsende eindeutig benannt. @@ -51,15 +53,13 @@ heinzlive-Ausgabe und die gespeicherten Livezustände bleiben technisch getrennt Ausgabe. - Abschnittstimer, tatsächliche Laufzeiten, Livefortschritt und Wiederaufnahme verwenden unverändert die vorhandenen persistenten Zustände. +- „Live-Stand wiederaufnehmen“ erscheint nur bei einem tatsächlich + unterbrochenen Ablauf, nicht während eines aktiven Pieces. -### Einstellungen und Verwaltung +### Einstellungen - Ausgabekanal verbinden, Schlüssel erneuern, Kanal trennen, Theme wechseln, Zeiten ein-/ausblenden und „Zur Planung“ bleiben im Regiemenü erreichbar. -- Der Dialog „Werkzeug hinzufügen“ bleibt beim Aufruf der Verwaltungsseite - zuverlässig geschlossen und erscheint erst nach einer bewussten Aktion. -- Die Iconauswahl unter „Inhaltliche Zuordnung“ bleibt auf Desktop und - Smartphone vollständig im sichtbaren Browserbereich. ### Update und Kompatibilität @@ -67,6 +67,29 @@ heinzlive-Ausgabe und die gespeicherten Livezustände bleiben technisch getrennt Konfiguration. - Bestehende Sendungen, Livezustände, Timer, Ausgabekanäle und Präsentationssnapshots bleiben erhalten. +- Paket, Lockdatei und Cloudron-Manifest tragen gemeinsam Version `0.5.12`. + +### Prüfung + +- 40 Unit- und Verhaltenstests sowie 16 Chromium-E2E-Abläufe sind erfolgreich. +- Die Live-Regie wurde bei 1440 × 900, 900 × 450 und 390 × 700 Pixeln mit + langen Inhalten, unabhängigen Scrollflächen und mobilem Ablauf-Sheet geprüft; + die erzeugten Screenshots wurden visuell kontrolliert. +- Reales OBS, echte YouTube-/TikTok-Wiedergabe und Safari auf einem iOS-Gerät + standen nicht zur Verfügung. + +## 0.5.11 - Verwaltungskorrektur + +Veröffentlicht am 23. Oktober 2026 + +- Der Dialog „Werkzeug hinzufügen“ bleibt beim Aufruf der Verwaltungsseite + wieder zuverlässig geschlossen. +- Der Dialog erscheint erst, wenn ein neues Werkzeug angelegt oder ein + bestehendes Werkzeug bearbeitet wird. +- Die Iconauswahl unter „Inhaltliche Zuordnung“ bleibt auf Desktop und + Smartphone vollständig im sichtbaren Browserbereich. +- Die Korrektur gilt gleichermaßen für Desktop- und Smartphone-Ansichten und + verändert keine vorhandenen Werkzeuge oder Zuordnungen. ## 0.5.10 - Editor-Erlebnis diff --git a/docs/STATUS.md b/docs/STATUS.md index 3042530..e16083c 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -7,7 +7,7 @@ Anmeldung, Rollen, persistente Inhaltsbearbeitung, Sendungsplanung, Live-Steuerung, Präsentationsausgabe und lokaler Betriebsweg sind dokumentiert. Etappe 6 wurde nicht begonnen. -## Kompakte Live-Regie 0.5.11 +## Kompakte Live-Regie 0.5.12 - fokussierte private Liveansicht ohne normale App-Seitenleiste oder mobile Bottomnavigation; Planung, Theme, Schriftgröße, Zeitdarstellung und @@ -18,6 +18,8 @@ Etappe 6 wurde nicht begonnen. - aktuelle Moderation und schmale Ablaufspalte bleiben auch bei 900 × 450 Pixeln nebeneinander; beide Arbeitsflächen scrollen unabhängig, ohne die ganze Seite oder einzelne Textblöcke zu verschachtelten Scrollcontainern zu machen +- bei niedrigen Desktopfenstern werden Abstände und Bedienleisten anhand der + verfügbaren Höhe verdichtet, ohne Text oder Gesamtoberfläche zu skalieren - auf schmalen Ansichten bleibt das Piece die Hauptfläche und der Ablauf öffnet als separates, safe-area-fähiges Sheet mit Fokusführung und Escape-Schließen - kompakter aufklappbarer Ablauf mit ausgeschriebenen Zuständen, direkter @@ -30,11 +32,22 @@ Etappe 6 wurde nicht begonnen. leere Moderationsbereiche werden nicht dargestellt - Livefortschritt, direkte Auswahl, Abschnittstimer und öffentliche Präsentation verwenden unverändert ihre getrennten persistenten Zustände -- der Werkzeugdialog bleibt nach dem Laden der Verwaltungsseite geschlossen; - die Themen-Iconauswahl bleibt vollständig innerhalb des Viewports +- die Wiederaufnahmeaktion erscheint nur bei tatsächlich unterbrochenem + Live-Stand statt während eines laufenden Pieces Etappe 6 bleibt unverändert unbegonnen. +Die lokale Prüfmatrix umfasst 40 Verhaltenstests und 16 Chromium-Abläufe. +Reales OBS, echte YouTube-/TikTok-Wiedergabe sowie Safari auf einem iOS-Gerät +bleiben mangels verfügbarer Umgebung offen. + +## Verwaltungskorrektur 0.5.11 + +- der Werkzeugdialog bleibt beim Laden geschlossen und öffnet erst nach einer + bewussten Aktion +- die Themen-Iconauswahl bleibt bei mobilen und breiten Ansichten vollständig + innerhalb des Viewports + ## Editor-Erlebnis 0.5.10 - direkte, tastaturbedienbare Titelbearbeitung in Fundus- und Sendungsfassungen diff --git a/package-lock.json b/package-lock.json index a1140e5..125d290 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sendewerk", - "version": "0.5.11", + "version": "0.5.12", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sendewerk", - "version": "0.5.11", + "version": "0.5.12", "dependencies": { "@node-rs/argon2": "^2.2.2", "better-sqlite3": "^13.0.3", diff --git a/package.json b/package.json index d269a4d..75cf458 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "sendewerk", "private": true, - "version": "0.5.11", + "version": "0.5.12", "type": "module", "engines": { "node": ">=22.17 <25" diff --git a/src/app.css b/src/app.css index f68da99..22d4d6d 100644 --- a/src/app.css +++ b/src/app.css @@ -1723,6 +1723,39 @@ textarea:focus { font-size: 0.75rem; } +@media (min-width: 46.001rem) and (max-height: 36rem) { + .live-page { + gap: 0.35rem; + padding: max(0.4rem, env(safe-area-inset-top)) max(0.4rem, env(safe-area-inset-right)) + max(0.4rem, env(safe-area-inset-bottom)) max(0.4rem, env(safe-area-inset-left)); + } + + .live-command-header, + .live-action-bar { + padding: 0.4rem 0.55rem; + } + + .section-countdown { + padding: 0.25rem 0.45rem; + } + + .live-workspace { + gap: 0.45rem; + } + + .live-current-scroll { + padding: clamp(0.75rem, 1.7vw, 1.25rem); + } + + .live-piece-heading { + padding-bottom: 0.55rem; + } + + .live-script-section { + padding: 0.7rem 0; + } +} + @media (max-width: 46rem) { .live-page { gap: 0.4rem; diff --git a/src/routes/live/+page.svelte b/src/routes/live/+page.svelte index 23c769a..74f2e65 100644 --- a/src/routes/live/+page.svelte +++ b/src/routes/live/+page.svelte @@ -358,7 +358,7 @@
Sendung - {#if data.live.startedAtUtc}
current.x + current.width - 1), footerVisible: Boolean(footer && footer.bottom <= innerHeight && footer.top >= 0), + shortViewportDensity: parseFloat(pageStyle.gap) < 8, + unscaled: pageStyle.transform === 'none', + unzoomed: ['', '1', 'normal'].includes(pageStyle.getPropertyValue('zoom')), pieceScrolls: Boolean(pieceScroll && pieceScroll.scrollHeight > pieceScroll.clientHeight), railScrolls: Boolean(railScroll && railScroll.scrollHeight > railScroll.clientHeight) }; @@ -1252,6 +1259,9 @@ test('live control persists state and exposes only explicit presentation data', pageFits: true, twoColumns: true, footerVisible: true, + shortViewportDensity: true, + unscaled: true, + unzoomed: true, pieceScrolls: true, railScrolls: true });