Refine live controls and compact show cards

This commit is contained in:
hnzio committed 2026-10-24 19:09:44 +02:00
1 parent 01b5606a3b
commit fd47910d09
5 files changed
+211 -64

No files matched your search

+28 -13
View File
@@ -466,20 +466,21 @@
## Erweiterte Live-Steuerung 0.5.12 ## Erweiterte Live-Steuerung 0.5.12
| Kriterium | Stand | | Kriterium | Stand |
| ---------------------------------------------- | ----------------------------- | | ---------------------------------------------- | ---------------------------- |
| Gemeinsame persistente Pause | implementiert, nicht geprüft | | Gemeinsame persistente Pause | implementiert, nicht geprüft |
| Abschnitts- und Gesamtreset bleiben unabhängig | implementiert, nicht geprüft | | Abschnitts- und Gesamtreset bleiben unabhängig | implementiert, nicht geprüft |
| Gesamt-/Restzeit ohne Doppelerfassung | implementiert, nicht geprüft | | Gesamt-/Restzeit ohne Doppelerfassung | implementiert, nicht geprüft |
| Ende, Wiederaufnahme und neuer Lauf getrennt | implementiert, nicht geprüft | | Ende, Wiederaufnahme und neuer Lauf getrennt | implementiert, nicht geprüft |
| Privates Feld „Interaktion“ durch alle Kopien | implementiert, nicht geprüft | | Privates Feld „Interaktion“ durch alle Kopien | implementiert, nicht geprüft |
| Öffentliche Positivliste unverändert | implementiert, nicht geprüft | | Öffentliche Positivliste unverändert | implementiert, nicht geprüft |
| Classic-Regular-Icons und Drawer-Schließen | implementiert, nicht geprüft | | Classic-Regular-Icons und Drawer-Schließen | gezielt im Browser geprüft |
Für diese Erweiterung wurden auf ausdrücklichen Auftrag keine Tests erstellt und Für die ursprüngliche Erweiterung wurden auf ausdrücklichen Auftrag zunächst
keine Typ-, Test-, Build-, Migrations- oder Browserläufe ausgeführt. Die oben keine Prüfungen ausgeführt. Die nachfolgenden Korrekturen weisen inzwischen
dokumentierten früheren Prüfungen von 0.5.12 wurden nicht als Nachweis für die Migration, Typen, Build, bestehendes Liveverhalten und die betroffenen
neuen Funktionen wiederverwendet. Oberflächen gezielt nach; die übrigen neuen Timer- und Statusfälle bleiben ohne
vollständige erneute Matrix.
## Live-500-Korrektur 0.5.12 ## Live-500-Korrektur 0.5.12
@@ -491,3 +492,17 @@ neuen Funktionen wiederverwendet.
- `npm run check`: 0 Fehler und 0 Warnungen. - `npm run check`: 0 Fehler und 0 Warnungen.
- `npm run test:unit -- --run src/lib/server/live.spec.ts`: 6 Tests erfolgreich. - `npm run test:unit -- --run src/lib/server/live.spec.ts`: 6 Tests erfolgreich.
- `npm run build`: erfolgreich mit `@sveltejs/adapter-node`. - `npm run build`: erfolgreich mit `@sveltejs/adapter-node`.
## Live-Icons und kompakte Sendungskarten 0.5.12
- `npm run check`: 0 Fehler und 0 Warnungen.
- `npm run test:unit -- --run src/lib/server/live.spec.ts`: 6 Tests erfolgreich.
- `npm run build`: erfolgreich mit `@sveltejs/adapter-node`.
- Gezielter Chromium-Ablauf der Sendungsübersicht mit Desktopkalender, mobiler
Agenda und Rückkehr zur Liste: erfolgreich.
- Vollständiger bestehender Live-Regie-Ablauf einschließlich 900 × 450,
670 × 450 und 390 × 700 Pixeln: erfolgreich; Iconleiste, Kopfhöhe,
Viewportgrenzen und horizontaler Überlauf geprüft.
- Zusätzliche visuelle Chromium-Prüfung bei 656 × 400 und 390 × 700 Pixeln:
Sendungskarte unter 130 Pixel hoch, Menü-/Ausgabe-/Timericons sichtbar und
Pausebutton wechselt bedienbar zu Fortsetzen.
+12 -5
View File
@@ -12,6 +12,10 @@ Livezustände bleiben technisch getrennt.
### Highlights ### Highlights
- Ausgabe, Gesamtzeit, Abschnittszeit und Menü tragen in der Live-Kopfleiste
jetzt die passenden lokalen Classic-Regular-Icons. Pause beziehungsweise
Fortsetzen ist zusätzlich als direkter Iconbutton neben der Abschnittszeit
erreichbar.
- Die Live-Regie verwendet die gesamte Fensterfläche ohne normale - Die Live-Regie verwendet die gesamte Fensterfläche ohne normale
App-Seitenleiste, mobilen App-Header oder Bottomnavigation. App-Seitenleiste, mobilen App-Header oder Bottomnavigation.
- Zwei kompakte Kopfzeilen halten Abschnitt, „Danach“, Menü, Ausgabe, - Zwei kompakte Kopfzeilen halten Abschnitt, „Danach“, Menü, Ausgabe,
@@ -94,6 +98,9 @@ Livezustände bleiben technisch getrennt.
### Sendungsübersicht ### Sendungsübersicht
- Sendungskarten bleiben auf kleinen Bildschirmen kompakt: Status, Titel und
Termin stehen neben den horizontal angeordneten Abschnitts- und Zeitangaben,
statt die Karte durch vollständiges Stapeln unnötig zu erhöhen.
- „Liste | Kalender“ schaltet zwischen der bekannten Sendungsliste und einer - „Liste | Kalender“ schaltet zwischen der bekannten Sendungsliste und einer
Monatsansicht um; die Auswahl bleibt am angemeldeten Konto gespeichert. Monatsansicht um; die Auswahl bleibt am angemeldeten Konto gespeichert.
- Auf dem Desktop zeigt ein vollständiges Montag-bis-Sonntag-Raster alle Termine - Auf dem Desktop zeigt ein vollständiges Montag-bis-Sonntag-Raster alle Termine
@@ -121,11 +128,11 @@ Livezustände bleiben technisch getrennt.
### Prüfung ### Prüfung
- Für die Timer-, Sendungssteuerungs- und Interaktionserweiterung wurden auf - Die ergänzte Iconleiste, Pause/Fortsetzen und die kompakte Sendungskarte wurden
ausdrücklichen Auftrag keine Tests, Builds, Migrationen oder Browserprüfungen gezielt in Chromium bei 670 × 450, 390 × 700 und 656 × 400 Pixeln geprüft.
ausgeführt. Typprüfung, sechs Live-Verhaltenstests und Produktionsbuild sind erfolgreich.
- Die folgenden Nachweise stammen vom vorherigen 0.5.12-Stand und decken diese - Die vollständige Matrix wurde für diese Ergänzung nicht erneut ausgeführt; die
Ergänzungen nicht ab. folgenden Gesamtnachweise stammen vom vorherigen 0.5.12-Stand.
- 44 Unit- und Verhaltenstests sowie 17 Chromium-E2E-Abläufe sind erfolgreich. - 44 Unit- und Verhaltenstests sowie 17 Chromium-E2E-Abläufe sind erfolgreich.
- Die Live-Regie wurde bei 1440 × 900, 900 × 450, 670 × 450 und 390 × 700 Pixeln - Die Live-Regie wurde bei 1440 × 900, 900 × 450, 670 × 450 und 390 × 700 Pixeln
mit langen Titeln, sichtbarem Regiemenü, unabhängigen Scrollflächen und mit langen Titeln, sichtbarem Regiemenü, unabhängigen Scrollflächen und
+9 -3
View File
@@ -9,6 +9,11 @@ Etappe 6 wurde nicht begonnen.
## Live-Regie und Sendungskalender 0.5.12 ## Live-Regie und Sendungskalender 0.5.12
- die Live-Kopfleiste zeigt Classic-Regular-Icons für Ausgabe, Gesamtzeit,
Abschnitt, Menü und Ablauf; Pause/Fortsetzen liegt zusätzlich als direkter,
beschrifteter Iconbutton neben der Abschnittszeit
- Sendungskarten ordnen Fakten auf kleinen Bildschirmen wieder horizontal an und
vermeiden dadurch die zuvor unnötig hohe Kartenfläche
- Reparaturmigration `0014_live_show_timer_repair.sql` ergänzt fehlende - Reparaturmigration `0014_live_show_timer_repair.sql` ergänzt fehlende
Gesamttimertabellen auch dann, wenn `0013` bereits in einem früheren Gesamttimertabellen auch dann, wenn `0013` bereits in einem früheren
Zwischenstand protokolliert wurde; der 500-Fehler beim Laden von `/live` ist Zwischenstand protokolliert wurde; der 500-Fehler beim Laden von `/live` ist
@@ -72,9 +77,10 @@ Etappe 6 wurde nicht begonnen.
Etappe 6 bleibt unverändert unbegonnen. Etappe 6 bleibt unverändert unbegonnen.
Die bestehende lokale Prüfmatrix umfasst 44 Verhaltenstests und 17 Die bestehende lokale Prüfmatrix umfasst 44 Verhaltenstests und 17
Chromium-Abläufe. Für die Timer-, Sendungssteuerungs- und Interaktionserweiterung Chromium-Abläufe. Die nachträgliche Icon-, Pause- und Kartenkorrektur wurde
wurden auf ausdrücklichen Auftrag keine Tests, Builds oder Browserprüfungen zusätzlich mit Typprüfung, sechs Live-Verhaltenstests, Produktionsbuild und
ausgeführt; dieser neue Stand ist daher noch nicht verifiziert. gezielten Chromium-Abläufen bei 670 × 450, 390 × 700 und 656 × 400 Pixeln
geprüft. Die vollständige Matrix wurde dafür nicht erneut ausgeführt.
Reales OBS, echte YouTube-/TikTok-Wiedergabe sowie Safari auf einem iOS-Gerät Reales OBS, echte YouTube-/TikTok-Wiedergabe sowie Safari auf einem iOS-Gerät
bleiben mangels verfügbarer Umgebung offen. bleiben mangels verfügbarer Umgebung offen.
+72 -11
View File
@@ -1057,6 +1057,13 @@ textarea:focus {
text-transform: uppercase; text-transform: uppercase;
} }
.timer-label {
display: flex;
align-items: center;
justify-content: center;
gap: 0.25rem;
}
.live-output-state strong { .live-output-state strong {
overflow: hidden; overflow: hidden;
font-size: 0.75rem; font-size: 0.75rem;
@@ -1151,6 +1158,39 @@ textarea:focus {
text-align: center; text-align: center;
} }
.section-timer-control {
display: flex;
align-items: stretch;
gap: 0.3rem;
}
.section-timer-control form {
display: flex;
}
.live-timer-toggle {
display: grid;
width: 2.15rem;
padding: 0;
place-items: center;
border: 1px solid var(--line);
border-radius: 0.65rem;
background: color-mix(in srgb, #d65c55 12%, var(--panel-soft));
color: #d65c55;
cursor: pointer;
font-size: 0.85rem;
}
.live-timer-toggle.paused {
background: color-mix(in srgb, var(--accent) 10%, var(--panel-soft));
color: var(--accent-strong);
}
.live-timer-toggle:hover,
.live-timer-toggle:focus-visible {
border-color: currentColor;
}
.total-countdown { .total-countdown {
color: var(--text); color: var(--text);
cursor: pointer; cursor: pointer;
@@ -1185,17 +1225,20 @@ textarea:focus {
color: #d24d45; color: #d24d45;
} }
.live-output-state > span { .live-output-state > .live-output-icon {
width: 0.5rem; display: grid;
height: 0.5rem; width: 1.5rem;
height: 1.5rem;
flex: 0 0 auto; flex: 0 0 auto;
border-radius: 50%; place-items: center;
background: var(--text-faint); border-radius: 0.45rem;
background: var(--panel-soft);
color: var(--text-faint);
} }
.live-output-control.active .live-output-state > span { .live-output-control.active .live-output-icon {
background: var(--accent); background: color-mix(in srgb, var(--accent) 12%, var(--panel-soft));
box-shadow: 0 0 0 0.2rem color-mix(in srgb, var(--accent) 12%, transparent); color: var(--accent-strong);
} }
.live-output-control { .live-output-control {
@@ -1256,7 +1299,10 @@ textarea:focus {
} }
.live-menu-trigger { .live-menu-trigger {
display: flex;
width: fit-content; width: fit-content;
align-items: center;
gap: 0.32rem;
padding: 0.48rem 0.65rem; padding: 0.48rem 0.65rem;
border: 1px solid var(--line); border: 1px solid var(--line);
border-radius: 0.65rem; border-radius: 0.65rem;
@@ -2093,6 +2139,16 @@ textarea:focus {
} }
} }
@media (max-width: 30rem) {
.live-status-row {
grid-template-columns: minmax(0, 1fr) auto auto;
}
.live-output-control {
grid-column: 1 / -1;
}
}
@media (max-width: 23rem) { @media (max-width: 23rem) {
.live-context-summary { .live-context-summary {
display: grid; display: grid;
@@ -6296,11 +6352,16 @@ textarea:focus {
.show-card, .show-card,
.show-card-facts { .show-card-facts {
align-items: flex-start; align-items: flex-start;
flex-direction: column;
} }
.show-card-facts { .show-card-facts {
width: 100%; flex-direction: row;
gap: 0.4rem; align-items: center;
gap: 0.7rem;
}
.show-card-facts span {
display: flex;
align-items: baseline;
gap: 0.25rem;
} }
.show-settings-form .wide-field, .show-settings-form .wide-field,
.usage-edit-form .wide-field { .usage-edit-form .wide-field {
+90 -32
View File
@@ -431,14 +431,15 @@
aria-expanded={menuOpen} aria-expanded={menuOpen}
onclick={toggleLiveMenu} onclick={toggleLiveMenu}
> >
Menü <AppIcon name="bars" />
<span>Menü</span>
</button> </button>
</div> </div>
<div class="live-status-row"> <div class="live-status-row">
<div class:active={Boolean(presentedUsage)} class="live-output-control"> <div class:active={Boolean(presentedUsage)} class="live-output-control">
<div class="live-output-state" aria-live="polite"> <div class="live-output-state" aria-live="polite">
<span aria-hidden="true"></span> <span class="live-output-icon" aria-hidden="true"><AppIcon name="display" /></span>
<div> <div>
<small>Ausgabe</small> <small>Ausgabe</small>
<strong title={presentedUsage?.title ?? undefined} <strong title={presentedUsage?.title ?? undefined}
@@ -455,7 +456,9 @@
<input type="hidden" name="usageId" value="" /> <input type="hidden" name="usageId" value="" />
<input type="hidden" name="revision" value={data.live.liveRevision} /> <input type="hidden" name="revision" value={data.live.liveRevision} />
<input type="hidden" name="commandId" value={data.commandId} /> <input type="hidden" name="commandId" value={data.commandId} />
<button class="text-button" type="submit" disabled={Boolean(data.live.endedAtUtc)}>Präsentation leeren</button> <button class="text-button" type="submit" disabled={Boolean(data.live.endedAtUtc)}
>Präsentation leeren</button
>
</form>{/if} </form>{/if}
</div> </div>
@@ -467,8 +470,14 @@
? 'Gelaufene Gesamtzeit, zu Restzeit wechseln' ? 'Gelaufene Gesamtzeit, zu Restzeit wechseln'
: 'Geschätzte Restzeit, zu gelaufener Zeit wechseln'} : 'Geschätzte Restzeit, zu gelaufener Zeit wechseln'}
> >
<span>{timerDisplay === 'elapsed' ? 'Gelaufen' : 'Restzeit'}</span> <span class="timer-label"
<strong>{formatCountdown(timerDisplay === 'elapsed' ? totalElapsedSeconds : remainingSeconds)}</strong> ><AppIcon name="timer" /> {timerDisplay === 'elapsed' ? 'Gelaufen' : 'Restzeit'}</span
>
<strong
>{formatCountdown(
timerDisplay === 'elapsed' ? totalElapsedSeconds : remainingSeconds
)}</strong
>
{#if timerDisplay === 'remaining' && data.live.remainingEstimate.unplannedSectionCount} {#if timerDisplay === 'remaining' && data.live.remainingEstimate.unplannedSectionCount}
<small title="Verbleibende Abschnitte ohne geplante Abschnittsdauer" <small title="Verbleibende Abschnitte ohne geplante Abschnittsdauer"
>+ {data.live.remainingEstimate.unplannedSectionCount} ungeplant</small >+ {data.live.remainingEstimate.unplannedSectionCount} ungeplant</small
@@ -476,22 +485,42 @@
{/if} {/if}
</button> </button>
<div <div class="section-timer-control">
class:warning={hasActiveSectionTimer && <div
sectionRemainingSeconds <= 120 && class:warning={hasActiveSectionTimer &&
sectionRemainingSeconds >= 0} sectionRemainingSeconds <= 120 &&
class:overrun={hasActiveSectionTimer && sectionRemainingSeconds < 0} sectionRemainingSeconds >= 0}
class="section-countdown" class:overrun={hasActiveSectionTimer && sectionRemainingSeconds < 0}
aria-live="off" class="section-countdown"
> aria-live="off"
<span>Abschnitt</span> >
<strong> <span class="timer-label"><AppIcon name="timer" /> Abschnitt</span>
{#if hasActiveSectionTimer} <strong>
{sectionRemainingSeconds < 0 {#if hasActiveSectionTimer}
? `+${formatCountdown(Math.abs(sectionRemainingSeconds))}` {sectionRemainingSeconds < 0
: formatCountdown(sectionRemainingSeconds)} ? `+${formatCountdown(Math.abs(sectionRemainingSeconds))}`
{:else}Kein Countdown{/if} : formatCountdown(sectionRemainingSeconds)}
</strong> {:else}Kein Countdown{/if}
</strong>
</div>
{#if data.live.startedAtUtc && !data.live.endedAtUtc}<form
method="POST"
action={liveAction(data.live.isPaused ? 'resume' : 'pause')}
use:enhance={enhanceCommand}
>
<input type="hidden" name="showId" value={data.live.show.id} />
<input type="hidden" name="revision" value={data.live.liveRevision} />
<input type="hidden" name="commandId" value={data.commandId} />
<button
class:paused={data.live.isPaused}
class="live-timer-toggle"
type="submit"
aria-label={data.live.isPaused ? 'Sendung fortsetzen' : 'Sendung pausieren'}
title={data.live.isPaused ? 'Sendung fortsetzen' : 'Sendung pausieren'}
>
<AppIcon name={data.live.isPaused ? 'play' : 'pause'} />
</button>
</form>{/if}
</div> </div>
<button <button
@@ -561,7 +590,11 @@
{#if !data.live.startedAtUtc} {#if !data.live.startedAtUtc}
<form method="POST" action={liveAction('setStatus')} use:enhance={enhanceCommand}> <form method="POST" action={liveAction('setStatus')} use:enhance={enhanceCommand}>
<input type="hidden" name="showId" value={data.live.show.id} /> <input type="hidden" name="showId" value={data.live.show.id} />
<input type="hidden" name="status" value={data.live.show.status === 'ready' ? 'draft' : 'ready'} /> <input
type="hidden"
name="status"
value={data.live.show.status === 'ready' ? 'draft' : 'ready'}
/>
<input type="hidden" name="revision" value={data.live.liveRevision} /> <input type="hidden" name="revision" value={data.live.liveRevision} />
<input type="hidden" name="showRevision" value={data.live.show.revision} /> <input type="hidden" name="showRevision" value={data.live.show.revision} />
<input type="hidden" name="commandId" value={data.commandId} /> <input type="hidden" name="commandId" value={data.commandId} />
@@ -573,30 +606,45 @@
<input type="hidden" name="showId" value={data.live.show.id} /> <input type="hidden" name="showId" value={data.live.show.id} />
<input type="hidden" name="revision" value={data.live.liveRevision} /> <input type="hidden" name="revision" value={data.live.liveRevision} />
<input type="hidden" name="commandId" value={data.commandId} /> <input type="hidden" name="commandId" value={data.commandId} />
<button class="secondary-button" type="submit"><AppIcon name="play" /> Sendung starten</button> <button class="secondary-button" type="submit"
><AppIcon name="play" /> Sendung starten</button
>
</form> </form>
{:else if data.live.endedAtUtc} {:else if data.live.endedAtUtc}
<form method="POST" action={liveAction('resumeEnded')} use:enhance={enhanceCommand}> <form method="POST" action={liveAction('resumeEnded')} use:enhance={enhanceCommand}>
<input type="hidden" name="showId" value={data.live.show.id} /> <input type="hidden" name="showId" value={data.live.show.id} />
<input type="hidden" name="revision" value={data.live.liveRevision} /> <input type="hidden" name="revision" value={data.live.liveRevision} />
<input type="hidden" name="commandId" value={data.commandId} /> <input type="hidden" name="commandId" value={data.commandId} />
<button class="secondary-button" type="submit"><AppIcon name="play" /> Lauf fortsetzen</button> <button class="secondary-button" type="submit"
><AppIcon name="play" /> Lauf fortsetzen</button
>
</form> </form>
<form <form
method="POST" method="POST"
action={liveAction('startNewRun')} action={liveAction('startNewRun')}
use:enhance={enhanceCommand} use:enhance={enhanceCommand}
onsubmit={(event) => { onsubmit={(event) => {
if (!confirm('Neuen Durchlauf starten? Fortschritt und Zeitmessungen werden zurückgesetzt.')) event.preventDefault(); if (
!confirm(
'Neuen Durchlauf starten? Fortschritt und Zeitmessungen werden zurückgesetzt.'
)
)
event.preventDefault();
}} }}
> >
<input type="hidden" name="showId" value={data.live.show.id} /> <input type="hidden" name="showId" value={data.live.show.id} />
<input type="hidden" name="revision" value={data.live.liveRevision} /> <input type="hidden" name="revision" value={data.live.liveRevision} />
<input type="hidden" name="commandId" value={data.commandId} /> <input type="hidden" name="commandId" value={data.commandId} />
<button class="text-button" type="submit"><AppIcon name="arrow-rotate-left" /> Neuer Durchlauf</button> <button class="text-button" type="submit"
><AppIcon name="arrow-rotate-left" /> Neuer Durchlauf</button
>
</form> </form>
{:else} {:else}
<form method="POST" action={liveAction(data.live.isPaused ? 'resume' : 'pause')} use:enhance={enhanceCommand}> <form
method="POST"
action={liveAction(data.live.isPaused ? 'resume' : 'pause')}
use:enhance={enhanceCommand}
>
<input type="hidden" name="showId" value={data.live.show.id} /> <input type="hidden" name="showId" value={data.live.show.id} />
<input type="hidden" name="revision" value={data.live.liveRevision} /> <input type="hidden" name="revision" value={data.live.liveRevision} />
<input type="hidden" name="commandId" value={data.commandId} /> <input type="hidden" name="commandId" value={data.commandId} />
@@ -616,7 +664,9 @@
<input type="hidden" name="showId" value={data.live.show.id} /> <input type="hidden" name="showId" value={data.live.show.id} />
<input type="hidden" name="revision" value={data.live.liveRevision} /> <input type="hidden" name="revision" value={data.live.liveRevision} />
<input type="hidden" name="commandId" value={data.commandId} /> <input type="hidden" name="commandId" value={data.commandId} />
<button class="text-button" type="submit"><AppIcon name="arrow-rotate-left" /> Abschnittszeit zurücksetzen</button> <button class="text-button" type="submit"
><AppIcon name="arrow-rotate-left" /> Abschnittszeit zurücksetzen</button
>
</form>{/if} </form>{/if}
<form <form
method="POST" method="POST"
@@ -629,20 +679,25 @@
<input type="hidden" name="showId" value={data.live.show.id} /> <input type="hidden" name="showId" value={data.live.show.id} />
<input type="hidden" name="revision" value={data.live.liveRevision} /> <input type="hidden" name="revision" value={data.live.liveRevision} />
<input type="hidden" name="commandId" value={data.commandId} /> <input type="hidden" name="commandId" value={data.commandId} />
<button class="text-button" type="submit"><AppIcon name="timer" /> Gesamtzeit zurücksetzen</button> <button class="text-button" type="submit"
><AppIcon name="timer" /> Gesamtzeit zurücksetzen</button
>
</form> </form>
<form <form
method="POST" method="POST"
action={liveAction('end')} action={liveAction('end')}
use:enhance={enhanceCommand} use:enhance={enhanceCommand}
onsubmit={(event) => { onsubmit={(event) => {
if (!confirm('Sendung wirklich beenden? Offene Pieces bleiben offen.')) event.preventDefault(); if (!confirm('Sendung wirklich beenden? Offene Pieces bleiben offen.'))
event.preventDefault();
}} }}
> >
<input type="hidden" name="showId" value={data.live.show.id} /> <input type="hidden" name="showId" value={data.live.show.id} />
<input type="hidden" name="revision" value={data.live.liveRevision} /> <input type="hidden" name="revision" value={data.live.liveRevision} />
<input type="hidden" name="commandId" value={data.commandId} /> <input type="hidden" name="commandId" value={data.commandId} />
<button class="text-button danger-text" type="submit"><AppIcon name="stop" /> Sendung beenden</button> <button class="text-button danger-text" type="submit"
><AppIcon name="stop" /> Sendung beenden</button
>
</form> </form>
{/if} {/if}
{#if needsResume && !data.live.endedAtUtc}<form {#if needsResume && !data.live.endedAtUtc}<form
@@ -924,7 +979,10 @@
<input type="hidden" name="usageId" value={usage.id} /> <input type="hidden" name="usageId" value={usage.id} />
<input type="hidden" name="revision" value={data.live.liveRevision} /> <input type="hidden" name="revision" value={data.live.liveRevision} />
<input type="hidden" name="commandId" value={data.commandId} /> <input type="hidden" name="commandId" value={data.commandId} />
<button type="submit" disabled={Boolean(data.live.endedAtUtc)} aria-label={`${usage.title} präsentieren`} <button
type="submit"
disabled={Boolean(data.live.endedAtUtc)}
aria-label={`${usage.title} präsentieren`}
><AppIcon name="display" /></button ><AppIcon name="display" /></button
> >
</form> </form>