Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dfa236390d | ||
|
|
b2467b87f5 | ||
|
|
4fed048843 |
No files matched your search
@@ -215,3 +215,69 @@
|
|||||||
Präsentationswerkzeug visuell kontrolliert; langer Titel bricht vollständig um,
|
Präsentationswerkzeug visuell kontrolliert; langer Titel bricht vollständig um,
|
||||||
Werkzeugfläche ist opak und die Speicherleiste überdeckt mobil keine Eingaben
|
Werkzeugfläche ist opak und die Speicherleiste überdeckt mobil keine Eingaben
|
||||||
- `bash -n start.sh` und `git diff --check`: erfolgreich
|
- `bash -n start.sh` und `git diff --check`: erfolgreich
|
||||||
|
|
||||||
|
## Oberflächenrelease 0.5.4
|
||||||
|
|
||||||
|
| Kriterium | Nachweis | Stand |
|
||||||
|
| ------------------------------------------ | ---------------------------------------------------------------------------------------------- | --------------------- |
|
||||||
|
| Klare Hierarchie in beiden Themes | Eingang, Fundus, Editor, Sendungsplan und Live-Steuerung in Light/Dark visuell kontrolliert | erfüllt am 22.10.2026 |
|
||||||
|
| Exakte heinzlive-Darkmode-Farben | berechnete Theme-Tokens und Screenshots der dunklen Arbeitsansichten geprüft | erfüllt am 22.10.2026 |
|
||||||
|
| Responsive Darstellung ohne Seitenüberlauf | Chromium-Messung bei 1440 × 1000 und 390 × 844 Pixeln auf allen gezielt geprüften Ansichten | erfüllt am 22.10.2026 |
|
||||||
|
| Sendungsplan-Aktionen bleiben erreichbar | drei sichtbare Aktionen einer Planzeile liegen waagerecht auf gleicher Höhe; Mobilbild geprüft | erfüllt am 22.10.2026 |
|
||||||
|
| Fokus und reduzierte Bewegung | sichtbarer Cyan-Fokusring und bestehende `prefers-reduced-motion`-Regeln im Stylesheet geprüft | erfüllt am 22.10.2026 |
|
||||||
|
|
||||||
|
## Ausgeführte Prüfungen Oberflächenrelease 0.5.4
|
||||||
|
|
||||||
|
- `npm run check`: 0 Fehler und 0 Warnungen
|
||||||
|
- `npm run build`: erfolgreich mit `@sveltejs/adapter-node`
|
||||||
|
- gezielter Chromium-Lauf für Eingang, Fundus, Piece-Editor, Sendungsplan und
|
||||||
|
Live-Steuerung bei 1440 × 1000 und 390 × 844 Pixeln in Light/Dark ohne
|
||||||
|
Konsolenfehler oder horizontalen Seitenüberlauf
|
||||||
|
- Desktop- und Mobilaufnahmen aller genannten Ansichten visuell kontrolliert
|
||||||
|
- vollständige Unit- und E2E-Matrix nicht erneut ausgeführt, weil dieser Release
|
||||||
|
ausschließlich Darstellung und redaktionelle Kurztexte verändert
|
||||||
|
- `git diff --check`: erfolgreich
|
||||||
|
|
||||||
|
## Oberflächenkorrektur 0.5.5
|
||||||
|
|
||||||
|
| Kriterium | Nachweis | Stand |
|
||||||
|
| ------------------------------------- | ------------------------------------------------------------------------------------------- | --------------------- |
|
||||||
|
| Nachtblau und Glaswirkung erkennbar | berechnete Transparenz/Unschärfe und Desktop-/Mobilaufnahmen in Darkmode geprüft | erfüllt am 22.10.2026 |
|
||||||
|
| Schreibfelder im Ruhezustand sichtbar | deckende Feldfarbe, feine Kontur, Innenabstand und Textcursor im Piece-Editor geprüft | erfüllt am 22.10.2026 |
|
||||||
|
| Goldener Tastaturfokus | berechnete Fokusfarbe und Fokus-Schatten am Titelfeld geprüft; Cyanrahmen nicht mehr aktiv | erfüllt am 22.10.2026 |
|
||||||
|
| Inhaltsgerechte Feldhöhen | kurze Einleitung ist niedriger als ausführliche Moderationsfläche; beide bleiben skalierbar | erfüllt am 22.10.2026 |
|
||||||
|
| Lightmode und Smartphone erhalten | fünf Arbeitsansichten bei 1440 × 1000 und 390 × 844 Pixeln ohne Seitenüberlauf geprüft | erfüllt am 22.10.2026 |
|
||||||
|
|
||||||
|
## Ausgeführte Prüfungen Oberflächenkorrektur 0.5.5
|
||||||
|
|
||||||
|
- `npm run check`: 0 Fehler und 0 Warnungen
|
||||||
|
- `npm run build`: erfolgreich mit `@sveltejs/adapter-node`
|
||||||
|
- gezielter Chromium-Lauf in Light/Dark und Desktop/Mobil ohne Konsolenfehler
|
||||||
|
oder horizontalen Seitenüberlauf; Glas-, Feld- und Fokuswerte zusätzlich
|
||||||
|
programmatisch geprüft
|
||||||
|
- vollständige Unit- und E2E-Matrix gemäß Auftrag nicht erneut ausgeführt
|
||||||
|
- `git diff --check`: erfolgreich
|
||||||
|
|
||||||
|
## Oberflächenkorrektur 0.5.6
|
||||||
|
|
||||||
|
| Kriterium | Nachweis | Stand |
|
||||||
|
| --------------------------------------------- | ------------------------------------------------------------------------------------------------- | --------------------- |
|
||||||
|
| Gold-/Violettlicht und Glasflächen sichtbar | Fundus und Editor in Light/Dark auf Desktop und Mobil visuell sowie über berechnete Werte geprüft | erfüllt am 22.10.2026 |
|
||||||
|
| Schreibflächen ruhig und eindeutig abgegrenzt | deckende Feldfarbe, Kontur und goldener Fokus im geöffneten Piece-Editor geprüft | erfüllt am 22.10.2026 |
|
||||||
|
| Neuanlage und Suche unmittelbar erreichbar | sichtbare Fundusaktionen sowie geöffnete Vorlagenauswahl auf Desktop und Mobil geprüft | erfüllt am 22.10.2026 |
|
||||||
|
| Zusatzfilter und Zeilenaktionen zugänglich | native Aufklappelemente für Filter und Aktionen per Browserinteraktion geprüft | erfüllt am 22.10.2026 |
|
||||||
|
| Funduszeilen per Tastatur zu öffnen | erster Titeleintrag fokussiert, mit Eingabetaste geöffnet und Editoraufruf geprüft | erfüllt am 22.10.2026 |
|
||||||
|
| Lightmode und Smartphone ohne Seitenüberlauf | Chromium-Messung bei 1440 × 1000 und 390 × 844 Pixeln in beiden Themes | erfüllt am 22.10.2026 |
|
||||||
|
|
||||||
|
## Ausgeführte Prüfungen Oberflächenkorrektur 0.5.6
|
||||||
|
|
||||||
|
- `npm run check`: 0 Fehler und 0 Warnungen
|
||||||
|
- gezielter Chromium-Lauf für Fundus und geöffneten Piece-Editor bei
|
||||||
|
1440 × 1000 und 390 × 844 Pixeln in Light/Dark ohne Konsolenfehler oder
|
||||||
|
horizontalen Seitenüberlauf
|
||||||
|
- Neuanlage, Zusatzfilter, Aktionsmenü, Tastaturöffnung, Glaswerte und goldener
|
||||||
|
Fokus automatisiert kontrolliert; alle erzeugten Desktop-/Mobilaufnahmen
|
||||||
|
visuell geprüft
|
||||||
|
- Produktionsbuild sowie vollständige Unit- und E2E-Matrix gemäß Auftrag nicht
|
||||||
|
ausgeführt
|
||||||
|
- `git diff --check`: erfolgreich
|
||||||
@@ -7,6 +7,66 @@ Anmeldung, Rollen, persistente Inhaltsbearbeitung, Sendungsplanung,
|
|||||||
Live-Steuerung, Präsentationsausgabe und lokaler Betriebsweg sind dokumentiert.
|
Live-Steuerung, Präsentationsausgabe und lokaler Betriebsweg sind dokumentiert.
|
||||||
Etappe 6 wurde nicht begonnen.
|
Etappe 6 wurde nicht begonnen.
|
||||||
|
|
||||||
|
## Oberflächenkorrektur 0.5.6
|
||||||
|
|
||||||
|
- sichtbare statische Gold- und Blauviolettlichter hinter den halbtransparenten
|
||||||
|
Navigations- und Editorflächen
|
||||||
|
- klarere Glaswirkung in Navigation sowie Kopf, Tabs und Fuß des Piece-Editors;
|
||||||
|
Schreibflächen bleiben deckend, ruhig und goldfokussiert
|
||||||
|
- Fundus mit dauerhaft sichtbarer Suche und Neuanlage, aufklappbaren Zusatzfiltern
|
||||||
|
und inhaltsorientierten, vollständig anklickbaren Zeilen
|
||||||
|
- vorhandene Vorschaubilder beziehungsweise kleine Symbolplatzhalter sowie
|
||||||
|
gebündelte Menüs für Duplizieren und Archivieren
|
||||||
|
- bestehende Server-Actions, Filterlogik und Editor-Bereiche unverändert
|
||||||
|
|
||||||
|
Geprüft wurden `npm run check` sowie Fundus und geöffneter Piece-Editor in
|
||||||
|
Chromium bei 1440 × 1000 und 390 × 844 Pixeln in Light/Dark. Die gezielte
|
||||||
|
Kontrolle umfasste Tastaturöffnung, Menüs, Fokus, Glaswerte, Seitenüberlauf und
|
||||||
|
visuell geprüfte Screenshots. Produktionsbuild und vollständige Testmatrix wurden
|
||||||
|
gemäß Auftrag nicht ausgeführt.
|
||||||
|
|
||||||
|
## Oberflächenkorrektur 0.5.5
|
||||||
|
|
||||||
|
- dunkle Grundfläche mit sehr zurückhaltenden Gold-/Cyan-Lichtfeldern innerhalb
|
||||||
|
der Anwendung statt gleichmäßig deckender Blauflächen
|
||||||
|
- Navigation, große Arbeitsflächen und Piece-Dialog als dunkles beziehungsweise
|
||||||
|
helles Glas mit feiner Lichtkante, Unschärfe und ruhigem Schatten
|
||||||
|
- Gold für Dialogkontur, Fokus, aktive Zustände und Hauptaktionen; Cyan nur noch
|
||||||
|
für ergänzende redaktionelle Hinweise und Links
|
||||||
|
- klar abgegrenzte, weitgehend deckende Schreibfelder mit Goldfokus, Platzhaltern
|
||||||
|
und nach Textrolle abgestuften Höhen
|
||||||
|
- bestehende nachträgliche CSS-Override-Schicht entfernt und die Gestaltung in
|
||||||
|
gemeinsame Tokens und ursprüngliche Komponentenregeln zurückgeführt
|
||||||
|
|
||||||
|
Geprüft wurden Typen, Produktionsbuild sowie gezielte Chromium-Ansichten von
|
||||||
|
Eingang, Fundus, Piece-Editor, Sendungsplanung und Live-Steuerung bei 1440 × 1000
|
||||||
|
und 390 × 844 Pixeln in beiden Themes. Die vollständige Unit- und E2E-Matrix
|
||||||
|
bleibt wie beauftragt Schritt 3 vorbehalten.
|
||||||
|
|
||||||
|
## Oberflächenrelease 0.5.4
|
||||||
|
|
||||||
|
- gemeinsame Light-/Dark-Tokens für ruhige Arbeitsflächen, Cyan als
|
||||||
|
Interaktionsfarbe und Gold für die jeweilige Hauptaktion
|
||||||
|
- Darkmode im heinzlive-Farbraum mit Hintergrund `#0B1220`, Flächen `#152238`,
|
||||||
|
Text `#FFF7E8`, Sekundärtext `#A9B6C8`, Gold `#E7B957`, Cyan `#67DDE8` und
|
||||||
|
Grenzen `#30435C`
|
||||||
|
- vereinheitlichte Navigation, Formulare, Meldungen, Listen, Sendungsplan,
|
||||||
|
Live-Steuerung und Piece-Dialoge ohne Änderung der Bedienlogik
|
||||||
|
- kompaktere Planzeilen mit sichtbarem Drag-Griff und waagerechter Aktionsgruppe;
|
||||||
|
Klick-, Touch- und Tastaturalternativen bleiben erhalten
|
||||||
|
- verständliche Kontextnamen „Fundusfassung“ und „Sendungsfassung“ sowie weniger
|
||||||
|
technische Erläuterungen im redaktionellen Arbeitsfluss
|
||||||
|
- dezente Speicheraktion im gespeicherten Zustand und hervorgehobene Aktion bei
|
||||||
|
ungespeicherten Änderungen, Fehlern oder Konflikten
|
||||||
|
|
||||||
|
Für diesen Design-Release wurden `npm run check`, `npm run build` und gezielte
|
||||||
|
Chromium-Sichtkontrollen auf Eingang, Fundus, Piece-Editor, Sendungsplan und
|
||||||
|
Live-Steuerung bei 1440 × 1000 sowie 390 × 844 Pixeln in Light/Dark ausgeführt.
|
||||||
|
Konsolenfehler und horizontaler Seitenüberlauf traten dabei nicht auf. Die
|
||||||
|
vollständige Unit- und E2E-Matrix wurde für die rein visuelle Änderung bewusst
|
||||||
|
nicht erneut ausgeführt; die fachlichen Nachweise der Etappen 1 bis 5 bleiben
|
||||||
|
unverändert.
|
||||||
|
|
||||||
## Umgesetzter Stand Etappe 1
|
## Umgesetzter Stand Etappe 1
|
||||||
|
|
||||||
- SvelteKit-/TypeScript-Monolith mit Node-Adapter
|
- SvelteKit-/TypeScript-Monolith mit Node-Adapter
|
||||||
|
|||||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "sendewerk",
|
"name": "sendewerk",
|
||||||
"version": "0.5.3",
|
"version": "0.5.6",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "sendewerk",
|
"name": "sendewerk",
|
||||||
"version": "0.5.3",
|
"version": "0.5.6",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@node-rs/argon2": "^2.2.2",
|
"@node-rs/argon2": "^2.2.2",
|
||||||
"better-sqlite3": "^13.0.3",
|
"better-sqlite3": "^13.0.3",
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "sendewerk",
|
"name": "sendewerk",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.5.3",
|
"version": "0.5.6",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=22.17 <25"
|
"node": ">=22.17 <25"
|
||||||
|
|||||||
+577
-173
File diff suppressed because it is too large.
Load diff
@@ -5,7 +5,7 @@
|
|||||||
name,
|
name,
|
||||||
label,
|
label,
|
||||||
value = $bindable(),
|
value = $bindable(),
|
||||||
rows = 7,
|
rows = 4,
|
||||||
placeholder = '',
|
placeholder = '',
|
||||||
privateField = false,
|
privateField = false,
|
||||||
form
|
form
|
||||||
|
|||||||
@@ -64,7 +64,7 @@
|
|||||||
onrequestclose={requestClose}
|
onrequestclose={requestClose}
|
||||||
>
|
>
|
||||||
{#snippet header()}
|
{#snippet header()}
|
||||||
<p class="eyebrow">Verwendung in dieser Sendung</p>
|
<p class="eyebrow">Sendungsfassung</p>
|
||||||
<label class="piece-dialog-title">
|
<label class="piece-dialog-title">
|
||||||
<span class="sr-only">Titel</span>
|
<span class="sr-only">Titel</span>
|
||||||
<textarea
|
<textarea
|
||||||
@@ -78,7 +78,6 @@
|
|||||||
oninput={() => (dirty = true)}></textarea>
|
oninput={() => (dirty = true)}></textarea>
|
||||||
</label>
|
</label>
|
||||||
<h2 class="sr-only" id={`usage-editor-title-${usage.id}`}>{draft.title}</h2>
|
<h2 class="sr-only" id={`usage-editor-title-${usage.id}`}>{draft.title}</h2>
|
||||||
<small>Änderungen gelten nur für diese Einplanung.</small>
|
|
||||||
{/snippet}
|
{/snippet}
|
||||||
|
|
||||||
<form
|
<form
|
||||||
@@ -99,7 +98,6 @@
|
|||||||
<p class="eyebrow">Für die Moderation</p>
|
<p class="eyebrow">Für die Moderation</p>
|
||||||
<h3>Sendungstext</h3>
|
<h3>Sendungstext</h3>
|
||||||
</div>
|
</div>
|
||||||
<small>Die drei Teile bleiben getrennt gespeichert.</small>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="piece-writing-stack">
|
<div class="piece-writing-stack">
|
||||||
<MarkdownEditorField
|
<MarkdownEditorField
|
||||||
@@ -230,6 +228,7 @@
|
|||||||
>Titel<input
|
>Titel<input
|
||||||
name="presentationTitle"
|
name="presentationTitle"
|
||||||
maxlength="300"
|
maxlength="300"
|
||||||
|
placeholder="Optionaler Anzeigetitel"
|
||||||
bind:value={draft.presentationTitle}
|
bind:value={draft.presentationTitle}
|
||||||
/></label
|
/></label
|
||||||
>
|
>
|
||||||
@@ -238,6 +237,7 @@
|
|||||||
name="presentationImageUrl"
|
name="presentationImageUrl"
|
||||||
type="url"
|
type="url"
|
||||||
maxlength="2000"
|
maxlength="2000"
|
||||||
|
placeholder="https://…"
|
||||||
bind:value={draft.presentationImageUrl}
|
bind:value={draft.presentationImageUrl}
|
||||||
/></label
|
/></label
|
||||||
>
|
>
|
||||||
@@ -246,6 +246,7 @@
|
|||||||
name="presentationDescription"
|
name="presentationDescription"
|
||||||
rows="3"
|
rows="3"
|
||||||
maxlength="1000"
|
maxlength="1000"
|
||||||
|
placeholder="Kurzer Text zur Vorschau"
|
||||||
bind:value={draft.presentationDescription}></textarea></label
|
bind:value={draft.presentationDescription}></textarea></label
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -59,15 +59,12 @@
|
|||||||
<h1>Fundus</h1>
|
<h1>Fundus</h1>
|
||||||
<p class="page-intro">Vorbereitete Inhalte für kommende Sendungen.</p>
|
<p class="page-intro">Vorbereitete Inhalte für kommende Sendungen.</p>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="fundus-heading-actions">
|
||||||
<div class="heading-stat" aria-label={`${visiblePieces.length} gefundene Inhalte`}>
|
<div class="heading-stat" aria-label={`${visiblePieces.length} gefundene Inhalte`}>
|
||||||
<strong>{visiblePieces.length}</strong><span>Inhalte</span>
|
<strong>{visiblePieces.length}</strong><span>Inhalte</span>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
|
||||||
{#if form?.error}<div class="form-message error" role="alert">{form.error}</div>{/if}
|
|
||||||
{#if form?.success}<div class="form-message success" role="status">{form.success}</div>{/if}
|
|
||||||
|
|
||||||
<details class="template-picker">
|
<details class="template-picker">
|
||||||
<summary>Neues Piece anlegen</summary>
|
<summary><span aria-hidden="true">+</span> Neues Piece</summary>
|
||||||
<div class="template-grid">
|
<div class="template-grid">
|
||||||
{#each data.templates as template (template.id)}
|
{#each data.templates as template (template.id)}
|
||||||
<form method="POST" action="?/create">
|
<form method="POST" action="?/create">
|
||||||
@@ -79,6 +76,10 @@
|
|||||||
{/each}
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
{#if form?.error}<div class="form-message error" role="alert">{form.error}</div>{/if}
|
||||||
|
{#if form?.success}<div class="form-message success" role="status">{form.success}</div>{/if}
|
||||||
|
|
||||||
<form
|
<form
|
||||||
id="library-filters"
|
id="library-filters"
|
||||||
@@ -86,6 +87,7 @@
|
|||||||
method="GET"
|
method="GET"
|
||||||
aria-label="Fundus durchsuchen und filtern"
|
aria-label="Fundus durchsuchen und filtern"
|
||||||
>
|
>
|
||||||
|
<div class="fundus-search-row">
|
||||||
<label class="search-field"
|
<label class="search-field"
|
||||||
><span aria-hidden="true">⌕</span><span class="sr-only">Fundus durchsuchen</span><input
|
><span aria-hidden="true">⌕</span><span class="sr-only">Fundus durchsuchen</span><input
|
||||||
name="q"
|
name="q"
|
||||||
@@ -94,12 +96,17 @@
|
|||||||
placeholder="Titel, Quelle oder Thema suchen"
|
placeholder="Titel, Quelle oder Thema suchen"
|
||||||
/></label
|
/></label
|
||||||
>
|
>
|
||||||
|
<button class="secondary-button" type="submit">Suchen</button>
|
||||||
|
<details class="filter-picker">
|
||||||
|
<summary><span aria-hidden="true">≡</span> Weitere Filter</summary>
|
||||||
|
<div class="filter-panel">
|
||||||
<label
|
<label
|
||||||
><span>Status</span><select name="status"
|
><span>Status</span><select name="status"
|
||||||
><option value="">Alle</option><option
|
><option value="">Alle</option><option
|
||||||
value="ready"
|
value="ready"
|
||||||
selected={data.filters.status === 'ready'}>Sendefertig</option
|
selected={data.filters.status === 'ready'}>Sendefertig</option
|
||||||
><option value="preparing" selected={data.filters.status === 'preparing'}>In Arbeit</option
|
><option value="preparing" selected={data.filters.status === 'preparing'}
|
||||||
|
>In Arbeit</option
|
||||||
></select
|
></select
|
||||||
></label
|
></label
|
||||||
>
|
>
|
||||||
@@ -121,22 +128,19 @@
|
|||||||
>
|
>
|
||||||
<label
|
<label
|
||||||
><span>Abschnitt</span><select name="category"
|
><span>Abschnitt</span><select name="category"
|
||||||
><option value="">Alle</option>{#each data.taxonomy.categories as item (item.id)}<option
|
><option value="">Alle</option
|
||||||
|
>{#each data.taxonomy.categories as item (item.id)}<option
|
||||||
value={item.id}
|
value={item.id}
|
||||||
selected={data.filters.categoryId === item.id}>{item.name}</option
|
selected={data.filters.categoryId === item.id}>{item.name}</option
|
||||||
>{/each}</select
|
>{/each}</select
|
||||||
></label
|
></label
|
||||||
>
|
>
|
||||||
<button class="secondary-button" type="submit">Anwenden</button>
|
|
||||||
<button class="text-button" type="button" onclick={resetFilters}>Zurücksetzen</button>
|
|
||||||
</form>
|
|
||||||
<div class="library-filter-options" aria-label="Fundusauswahl erweitern">
|
<div class="library-filter-options" aria-label="Fundusauswahl erweitern">
|
||||||
<label class="filter-checkbox">
|
<label class="filter-checkbox">
|
||||||
<input
|
<input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
name="includeUsed"
|
name="includeUsed"
|
||||||
value="1"
|
value="1"
|
||||||
form="library-filters"
|
|
||||||
checked={showUsedPieces}
|
checked={showUsedPieces}
|
||||||
onchange={(event) => setSourceFilter('includeUsed', event.currentTarget.checked)}
|
onchange={(event) => setSourceFilter('includeUsed', event.currentTarget.checked)}
|
||||||
/>
|
/>
|
||||||
@@ -147,13 +151,20 @@
|
|||||||
type="checkbox"
|
type="checkbox"
|
||||||
name="includePlanned"
|
name="includePlanned"
|
||||||
value="1"
|
value="1"
|
||||||
form="library-filters"
|
|
||||||
checked={showPlannedPieces}
|
checked={showPlannedPieces}
|
||||||
onchange={(event) => setSourceFilter('includePlanned', event.currentTarget.checked)}
|
onchange={(event) => setSourceFilter('includePlanned', event.currentTarget.checked)}
|
||||||
/>
|
/>
|
||||||
<span>Auch eingeplante Inhalte zeigen</span>
|
<span>Auch eingeplante Inhalte zeigen</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="filter-actions">
|
||||||
|
<button class="secondary-button" type="submit">Filter anwenden</button>
|
||||||
|
<button class="text-button" type="button" onclick={resetFilters}>Zurücksetzen</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</details>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
{#if visiblePieces.length}
|
{#if visiblePieces.length}
|
||||||
<div class="piece-grid">
|
<div class="piece-grid">
|
||||||
@@ -166,9 +177,12 @@
|
|||||||
class="piece-thumbnail"
|
class="piece-thumbnail"
|
||||||
src={`/media/${piece.mediaId}`}
|
src={`/media/${piece.mediaId}`}
|
||||||
alt=""
|
alt=""
|
||||||
/>{:else}<span class="piece-thumbnail piece-thumbnail-placeholder" aria-hidden="true"
|
/>{:else}<span class="piece-thumbnail piece-thumbnail-placeholder" aria-hidden="true">
|
||||||
>S</span
|
<svg viewBox="0 0 24 24" fill="none">
|
||||||
>{/if}
|
<path d="M4.5 6.5h15v11h-15zM7.5 14l3-3 2.2 2.2 1.8-1.7 2.5 2.5" />
|
||||||
|
<circle cx="15.8" cy="9.2" r="1.2" />
|
||||||
|
</svg>
|
||||||
|
</span>{/if}
|
||||||
<div class="piece-primary">
|
<div class="piece-primary">
|
||||||
<h2><a href={resolve('/fundus/[id]', { id: piece.id })}>{piece.title}</a></h2>
|
<h2><a href={resolve('/fundus/[id]', { id: piece.id })}>{piece.title}</a></h2>
|
||||||
<p>{piece.summary || 'Noch keine Kurzbeschreibung.'}</p>
|
<p>{piece.summary || 'Noch keine Kurzbeschreibung.'}</p>
|
||||||
@@ -193,8 +207,11 @@
|
|||||||
></span
|
></span
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<div class="piece-actions">
|
<details class="piece-actions">
|
||||||
<a class="text-link" href={resolve('/fundus/[id]', { id: piece.id })}>Bearbeiten</a>
|
<summary aria-label={`Aktionen für ${piece.title}`}
|
||||||
|
><span aria-hidden="true">•••</span></summary
|
||||||
|
>
|
||||||
|
<div class="piece-actions-popover">
|
||||||
<form method="POST" action="?/duplicate">
|
<form method="POST" action="?/duplicate">
|
||||||
<input type="hidden" name="pieceId" value={piece.id} /><button
|
<input type="hidden" name="pieceId" value={piece.id} /><button
|
||||||
class="text-button"
|
class="text-button"
|
||||||
@@ -209,6 +226,7 @@
|
|||||||
/><button class="text-button danger-text" type="submit">Archivieren</button>
|
/><button class="text-button danger-text" type="submit">Archivieren</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
</details>
|
||||||
</article>
|
</article>
|
||||||
{/each}
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -209,7 +209,7 @@
|
|||||||
onrequestclose={requestClose}
|
onrequestclose={requestClose}
|
||||||
>
|
>
|
||||||
{#snippet header()}
|
{#snippet header()}
|
||||||
<p class="eyebrow">Fundus-Original</p>
|
<p class="eyebrow">Fundusfassung</p>
|
||||||
<label class="piece-dialog-title">
|
<label class="piece-dialog-title">
|
||||||
<span class="sr-only">Titel</span>
|
<span class="sr-only">Titel</span>
|
||||||
<textarea
|
<textarea
|
||||||
@@ -223,7 +223,6 @@
|
|||||||
oninput={scheduleSave}></textarea>
|
oninput={scheduleSave}></textarea>
|
||||||
</label>
|
</label>
|
||||||
<h1 class="sr-only" id="piece-editor-title">{draft.title}</h1>
|
<h1 class="sr-only" id="piece-editor-title">{draft.title}</h1>
|
||||||
<small>Original im Fundus · Änderungen wirken nicht rückwirkend auf Einplanungen.</small>
|
|
||||||
{/snippet}
|
{/snippet}
|
||||||
|
|
||||||
<form
|
<form
|
||||||
@@ -244,7 +243,6 @@
|
|||||||
<p class="eyebrow">Für die Moderation</p>
|
<p class="eyebrow">Für die Moderation</p>
|
||||||
<h2>Sendungstext</h2>
|
<h2>Sendungstext</h2>
|
||||||
</div>
|
</div>
|
||||||
<small>Die drei Teile bleiben getrennt gespeichert.</small>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="piece-writing-stack">
|
<div class="piece-writing-stack">
|
||||||
<MarkdownEditorField
|
<MarkdownEditorField
|
||||||
@@ -305,6 +303,7 @@
|
|||||||
name="summary"
|
name="summary"
|
||||||
rows="3"
|
rows="3"
|
||||||
maxlength="2000"
|
maxlength="2000"
|
||||||
|
placeholder="Worum geht es in wenigen Sätzen?"
|
||||||
bind:value={draft.summary}></textarea></label
|
bind:value={draft.summary}></textarea></label
|
||||||
>
|
>
|
||||||
<fieldset>
|
<fieldset>
|
||||||
@@ -369,6 +368,7 @@
|
|||||||
>Name<input
|
>Name<input
|
||||||
name="sourceLabel"
|
name="sourceLabel"
|
||||||
maxlength="200"
|
maxlength="200"
|
||||||
|
placeholder="Name der Quelle"
|
||||||
bind:value={source.label}
|
bind:value={source.label}
|
||||||
/></label
|
/></label
|
||||||
><label
|
><label
|
||||||
@@ -376,6 +376,7 @@
|
|||||||
name="sourceUrl"
|
name="sourceUrl"
|
||||||
type="url"
|
type="url"
|
||||||
maxlength="2000"
|
maxlength="2000"
|
||||||
|
placeholder="https://…"
|
||||||
bind:value={source.url}
|
bind:value={source.url}
|
||||||
/></label
|
/></label
|
||||||
><label
|
><label
|
||||||
@@ -384,6 +385,7 @@
|
|||||||
type="number"
|
type="number"
|
||||||
min="0"
|
min="0"
|
||||||
max="86400"
|
max="86400"
|
||||||
|
placeholder="Optional"
|
||||||
bind:value={source.timecodeSeconds}
|
bind:value={source.timecodeSeconds}
|
||||||
/></label
|
/></label
|
||||||
><button
|
><button
|
||||||
@@ -444,6 +446,7 @@
|
|||||||
>Titel<input
|
>Titel<input
|
||||||
name="presentationTitle"
|
name="presentationTitle"
|
||||||
maxlength="300"
|
maxlength="300"
|
||||||
|
placeholder="Optionaler Anzeigetitel"
|
||||||
bind:value={draft.presentationTitle}
|
bind:value={draft.presentationTitle}
|
||||||
oninput={() => (draft.presentationTitleManual = true)}
|
oninput={() => (draft.presentationTitleManual = true)}
|
||||||
/></label
|
/></label
|
||||||
@@ -453,6 +456,7 @@
|
|||||||
name="presentationImageUrl"
|
name="presentationImageUrl"
|
||||||
type="url"
|
type="url"
|
||||||
maxlength="2000"
|
maxlength="2000"
|
||||||
|
placeholder="https://…"
|
||||||
bind:value={draft.presentationImageUrl}
|
bind:value={draft.presentationImageUrl}
|
||||||
oninput={() => (draft.presentationImageManual = true)}
|
oninput={() => (draft.presentationImageManual = true)}
|
||||||
/></label
|
/></label
|
||||||
@@ -462,6 +466,7 @@
|
|||||||
name="presentationDescription"
|
name="presentationDescription"
|
||||||
rows="3"
|
rows="3"
|
||||||
maxlength="1000"
|
maxlength="1000"
|
||||||
|
placeholder="Kurzer Text zur Vorschau"
|
||||||
bind:value={draft.presentationDescription}
|
bind:value={draft.presentationDescription}
|
||||||
oninput={() => (draft.presentationDescriptionManual = true)}></textarea></label
|
oninput={() => (draft.presentationDescriptionManual = true)}></textarea></label
|
||||||
>
|
>
|
||||||
@@ -581,10 +586,18 @@
|
|||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
bind:this={saveButton}
|
bind:this={saveButton}
|
||||||
class="primary-button"
|
class:primary-button={saveState === 'dirty' ||
|
||||||
|
saveState === 'error' ||
|
||||||
|
saveState === 'conflict'}
|
||||||
|
class:secondary-button={saveState === 'idle' ||
|
||||||
|
saveState === 'saved' ||
|
||||||
|
saveState === 'saving'}
|
||||||
type="submit"
|
type="submit"
|
||||||
form="piece-editor-form"
|
form="piece-editor-form"
|
||||||
disabled={saving}>Jetzt speichern</button
|
disabled={saving}
|
||||||
|
>{saveState === 'error' || saveState === 'conflict'
|
||||||
|
? 'Erneut speichern'
|
||||||
|
: 'Speichern'}</button
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
{/snippet}
|
{/snippet}
|
||||||
|
|||||||
@@ -533,7 +533,7 @@
|
|||||||
ondragend={finishDrag}
|
ondragend={finishDrag}
|
||||||
>
|
>
|
||||||
<strong>{usage.title}</strong><small
|
<strong>{usage.title}</strong><small
|
||||||
>{formatClock(usage.durationSeconds)} · sendungsspezifische Kopie</small
|
>{formatClock(usage.durationSeconds)}</small
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<div class="row-actions">
|
<div class="row-actions">
|
||||||
|
|||||||
Reference in new issue
Block a user