diff --git a/docs/STATUS.md b/docs/STATUS.md
index 62d3681..90280e2 100644
--- a/docs/STATUS.md
+++ b/docs/STATUS.md
@@ -71,16 +71,28 @@ als bereits implementiert verstanden werden.
Verwendungshistorie; gesendet bedeutet erledigt in abgeschlossener Sendung
- standardmäßig ausgeblendete Pieces, die in mindestens einer noch nicht
abgeschlossenen Sendung eingeplant sind, mit unabhängigem Sofortfilter
-- der eigenständige Piece-Editor ist als redaktionelles Arbeitsblatt aufgebaut:
- Titel, Fundstück, private Recherche und die getrennt gespeicherten
- Sendungstexte stehen im Schreibfluss; Quellen, Einordnung, Präsentation und
- Bilder begleiten ihn als Desktop-Kontextleiste oder mobile Werkzeuge
-- Markdown-Felder wechseln einzeln zwischen Lesen und Bearbeiten, sodass mehrere
- Textbereiche gleichzeitig offen bleiben; Autosave, Konfliktschutz und
- sichtbare Speicherfehler verwenden unverändert die Piece-Revision
-- die Schnellaufnahme „Aufnehmen und öffnen“ leitet nach erfolgreicher Anlage
- direkt zum neuen Piece weiter, statt den SvelteKit-Redirect als
- Validierungsfehler abzufangen
+- Fundus-Originale und sendungsspezifische Verwendungen nutzen denselben
+ großzügigen Dialograhmen mit den Bereichen „Sendungstext“, „Recherche &
+ Quellen“ und „Präsentation“; der jeweilige Speicherkontext ist sichtbar und
+ Original sowie Verwendung bleiben getrennte Revisionsgrenzen
+- Titel, Einleitung, Moderationsstichpunkte und Überleitung sind ohne
+ vorgeschaltete Lese-/Bearbeitungsschalter direkt beschreibbar; eine kleine
+ Markdown-Leiste ergänzt Formatierung ohne Änderung des Speicherformats
+- Recherche, Quellen, verwendungseigene Notizen und Material sind in einem
+ Bereich gebündelt; öffentliche Texte, Darstellungswahl und tatsächliche
+ Vorschau stehen gemeinsam im Präsentationsbereich
+- der Dialog bleibt innerhalb der Desktop-Fensterhöhe, hält Kopf,
+ Bereichsnavigation und Aktionen sichtbar und nutzt mobil die volle
+ Bildschirmfläche; Bereichswechsel hängen Eingaben nicht aus und merken die
+ jeweilige Scrollposition
+- die Schnellaufnahme akzeptiert Gedanke oder URL, bleibt nach dem Ablegen im
+ Eingang und öffnet die Ausarbeitung erst über eine bewusste Aktion
+
+Für diese gezielte Überarbeitung wurden `npm run check` sowie kurze
+Chromium-Sichtkontrollen des Original- und Verwendungseditors bei 1440 × 1000
+und 390 × 844 Pixeln ausgeführt. Dabei waren Dialoggrenzen, feste Bedienbereiche,
+alle drei Arbeitsbereiche und horizontaler Überlauf unauffällig. Die vollständige
+Unit-, E2E- und Build-Matrix ist gemäß Auftrag noch offen.
## Umgesetzter Stand Etappe 4
diff --git a/package-lock.json b/package-lock.json
index 749232c..d36d868 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "sendewerk",
- "version": "0.5.2",
+ "version": "0.5.3",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "sendewerk",
- "version": "0.5.2",
+ "version": "0.5.3",
"dependencies": {
"@node-rs/argon2": "^2.2.2",
"better-sqlite3": "^13.0.3",
diff --git a/package.json b/package.json
index 61bcac6..80fd4db 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "sendewerk",
"private": true,
- "version": "0.5.2",
+ "version": "0.5.3",
"type": "module",
"engines": {
"node": ">=22.17 <25"
diff --git a/src/app.css b/src/app.css
index 5a238f4..aa51b3d 100644
--- a/src/app.css
+++ b/src/app.css
@@ -3231,6 +3231,430 @@ a {
color: var(--accent);
}
+.piece-editor-route {
+ min-height: calc(100dvh - 2rem);
+}
+
+.piece-editor-dialog {
+ display: none;
+ width: min(76rem, calc(100vw - 2rem));
+ height: min(54rem, calc(100dvh - 2rem));
+ max-width: none;
+ max-height: none;
+ grid-template-columns: minmax(0, 1fr);
+ grid-template-rows: auto auto minmax(0, 1fr) auto;
+ padding: 0;
+ overflow: hidden;
+ border: 1px solid var(--line-strong);
+ border-radius: var(--radius-large);
+ background: var(--panel-strong);
+ box-shadow: var(--shadow-large);
+ color: var(--text);
+}
+
+.piece-editor-dialog[open] {
+ display: grid;
+}
+
+.piece-editor-dialog::backdrop {
+ background: color-mix(in srgb, #07110e 62%, transparent);
+ backdrop-filter: blur(6px);
+}
+
+.piece-dialog-header {
+ display: flex;
+ min-width: 0;
+ align-items: flex-start;
+ justify-content: space-between;
+ gap: 1rem;
+ padding: 0.9rem 1rem 0.75rem;
+ border-bottom: 1px solid var(--line);
+ background: var(--panel-strong);
+}
+
+.piece-dialog-heading {
+ min-width: 0;
+ flex: 1;
+}
+
+.piece-dialog-heading > .eyebrow {
+ margin-bottom: 0.18rem;
+}
+
+.piece-dialog-heading > small {
+ display: block;
+ margin-top: 0.25rem;
+ color: var(--text-faint);
+ font-size: 0.65rem;
+}
+
+.piece-dialog-title {
+ display: block;
+}
+
+.piece-dialog-title textarea {
+ width: 100%;
+ min-width: 0;
+ height: 1.2em;
+ padding: 0;
+ resize: none;
+ overflow: hidden;
+ border: 0;
+ outline-offset: 0.2rem;
+ background: transparent;
+ color: var(--text);
+ font: inherit;
+ font-size: clamp(1.25rem, 2.5vw, 1.85rem);
+ font-weight: 760;
+ letter-spacing: -0.035em;
+}
+
+.piece-dialog-tabs {
+ display: flex;
+ min-width: 0;
+ gap: 0.25rem;
+ padding: 0.45rem 1rem;
+ border-bottom: 1px solid var(--line);
+ background: var(--panel-strong);
+}
+
+.piece-dialog-tabs button {
+ padding: 0.48rem 0.72rem;
+ border: 0;
+ border-radius: var(--radius-small);
+ background: transparent;
+ color: var(--text-muted);
+ font-size: 0.72rem;
+ font-weight: 740;
+ cursor: pointer;
+}
+
+.piece-dialog-tabs button.active {
+ background: var(--accent-soft);
+ color: var(--accent);
+}
+
+.piece-dialog-workspace {
+ min-width: 0;
+ min-height: 0;
+ padding: clamp(0.85rem, 2vw, 1.4rem);
+ overflow: auto;
+ overscroll-behavior: contain;
+}
+
+.piece-dialog-form {
+ display: block;
+}
+
+.piece-editor-panel {
+ width: min(100%, 66rem);
+ margin: 0 auto;
+}
+
+.piece-editor-panel[hidden] {
+ display: none;
+}
+
+.piece-panel-heading,
+.piece-subsection-heading {
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-between;
+ gap: 1rem;
+ margin-bottom: 0.85rem;
+}
+
+.piece-panel-heading h2,
+.piece-panel-heading h3,
+.piece-subsection-heading h3 {
+ margin: 0.12rem 0 0;
+ font-size: 1.05rem;
+}
+
+.piece-panel-heading small,
+.piece-subsection-heading small {
+ color: var(--text-faint);
+ font-size: 0.65rem;
+}
+
+.piece-writing-stack {
+ display: grid;
+ gap: 0.8rem;
+}
+
+.markdown-editor-field {
+ display: block;
+ padding: 0.8rem;
+ border: 1px solid var(--line);
+ border-radius: var(--radius-medium);
+ background: var(--panel);
+}
+
+.markdown-editor-field.private-field {
+ border-color: color-mix(in srgb, var(--gold) 38%, var(--line));
+ background: color-mix(in srgb, var(--gold) 5%, var(--panel));
+}
+
+.markdown-editor-heading {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 0.7rem;
+ margin-bottom: 0.45rem;
+}
+
+.markdown-editor-heading > span:first-child {
+ font-size: 0.76rem;
+ font-weight: 760;
+}
+
+.markdown-editor-heading small {
+ margin-left: 0.4rem;
+ color: var(--gold-strong);
+ font-size: 0.58rem;
+ letter-spacing: 0.04em;
+ text-transform: uppercase;
+}
+
+.markdown-toolbar {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.2rem;
+}
+
+.markdown-toolbar button {
+ min-width: 1.8rem;
+ padding: 0.22rem 0.4rem;
+ border: 1px solid var(--line);
+ border-radius: 0.45rem;
+ background: var(--panel-soft);
+ color: var(--text-muted);
+ font-size: 0.65rem;
+ cursor: pointer;
+}
+
+.markdown-editor-field textarea {
+ display: block;
+ width: 100%;
+ min-height: 7.5rem;
+ padding: 0.65rem;
+ resize: vertical;
+ border: 1px solid var(--line-strong);
+ border-radius: var(--radius-small);
+ background: var(--panel-strong);
+ color: var(--text);
+ font: inherit;
+ font-size: 0.82rem;
+ line-height: 1.55;
+}
+
+.piece-meta-details,
+.piece-source-editor,
+.piece-media-panel {
+ margin-top: 0.9rem;
+ padding: 0.85rem;
+ border: 1px solid var(--line);
+ border-radius: var(--radius-medium);
+ background: var(--panel);
+}
+
+.piece-meta-details summary {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 1rem;
+ cursor: pointer;
+ font-size: 0.75rem;
+ font-weight: 740;
+}
+
+.piece-meta-details summary small {
+ color: var(--text-faint);
+ font-size: 0.64rem;
+ font-weight: 600;
+}
+
+.piece-meta-grid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 0.65rem;
+ margin-top: 0.8rem;
+}
+
+.piece-meta-grid > label,
+.piece-meta-grid fieldset,
+.piece-source-editor label,
+.piece-presentation-controls .presentation-settings > label {
+ display: grid;
+ gap: 0.25rem;
+ margin: 0;
+ color: var(--text-muted);
+ font-size: 0.66rem;
+ font-weight: 700;
+}
+
+.piece-meta-grid input:not([type='checkbox']),
+.piece-meta-grid select,
+.piece-meta-grid textarea,
+.piece-source-editor input,
+.piece-presentation-controls input:not([type='radio']),
+.piece-presentation-controls select,
+.piece-presentation-controls textarea,
+.piece-dialog-secondary-actions select {
+ width: 100%;
+ min-width: 0;
+ padding: 0.55rem 0.62rem;
+ border: 1px solid var(--line-strong);
+ border-radius: var(--radius-small);
+ background: var(--panel-strong);
+ color: var(--text);
+}
+
+.piece-meta-grid .wide-field,
+.piece-meta-grid fieldset {
+ grid-column: 1 / -1;
+}
+
+.piece-meta-grid fieldset {
+ padding: 0;
+ border: 0;
+}
+
+.piece-source-editor .source-row {
+ display: grid;
+ grid-template-columns: minmax(8rem, 0.8fr) minmax(14rem, 1.5fr) minmax(8rem, 0.6fr) auto;
+ align-items: end;
+ gap: 0.5rem;
+ padding: 0.6rem 0;
+ border-top: 1px solid var(--line);
+}
+
+.piece-source-summary {
+ margin-top: 0.9rem;
+ padding: 0.85rem;
+ border: 1px solid var(--line);
+ border-radius: var(--radius-medium);
+ background: var(--panel);
+}
+
+.piece-source-summary strong,
+.piece-source-summary small {
+ display: block;
+ margin-top: 0.3rem;
+ overflow-wrap: anywhere;
+}
+
+.piece-source-summary small,
+.piece-source-summary p:not(.eyebrow) {
+ color: var(--text-muted);
+ font-size: 0.7rem;
+}
+
+.piece-presentation-layout {
+ display: grid;
+ grid-template-columns: minmax(0, 1fr) minmax(18rem, 0.8fr);
+ align-items: start;
+ gap: 1rem;
+}
+
+.piece-presentation-controls,
+.piece-presentation-controls .presentation-settings {
+ display: grid;
+ gap: 0.7rem;
+}
+
+.piece-presentation-preview {
+ min-width: 0;
+ overflow: hidden;
+ border: 1px solid var(--line);
+ border-radius: var(--radius-medium);
+ background: var(--presentation-bg, #0b1220);
+ color: #fff7e8;
+}
+
+.piece-presentation-preview > .output-content {
+ min-height: 20rem;
+ padding: 1rem;
+}
+
+.piece-presentation-preview .output-content h1 {
+ max-width: none;
+ margin: 0.35rem 0 0.75rem;
+ font-size: clamp(1.55rem, 3vw, 2.4rem);
+ line-height: 1;
+}
+
+.piece-presentation-preview .output-copy,
+.piece-presentation-preview .output-link-copy > p:not(.output-kicker) {
+ font-size: 0.9rem;
+}
+
+.piece-presentation-preview .output-link-card {
+ grid-template-columns: 1fr;
+ gap: 0.8rem;
+}
+
+.piece-presentation-preview .output-link-image {
+ min-height: 10rem;
+}
+
+.piece-presentation-preview .output-sources {
+ margin-top: 1rem;
+}
+
+.piece-presentation-preview > p,
+.piece-presentation-preview > h4,
+.piece-presentation-preview > img {
+ margin: 0.8rem;
+}
+
+.piece-presentation-preview > img {
+ max-width: calc(100% - 1.6rem);
+ max-height: 12rem;
+ object-fit: contain;
+}
+
+.preview-markdown-source {
+ white-space: pre-wrap;
+}
+
+.piece-dialog-footer {
+ display: flex;
+ min-width: 0;
+ align-items: center;
+ justify-content: space-between;
+ gap: 0.8rem;
+ padding: 0.65rem 1rem;
+ border-top: 1px solid var(--line);
+ background: var(--panel-strong);
+}
+
+.piece-dialog-secondary-actions,
+.piece-dialog-primary-action {
+ display: flex;
+ align-items: center;
+ gap: 0.55rem;
+}
+
+.piece-dialog-secondary-actions form {
+ display: flex;
+ align-items: center;
+ gap: 0.3rem;
+}
+
+.piece-dialog-primary-action span {
+ color: var(--text-muted);
+ font-size: 0.66rem;
+}
+
+.route-editor-error {
+ position: fixed;
+ z-index: 100;
+ top: 1rem;
+ left: 50%;
+ transform: translateX(-50%);
+}
+
.usage-editor-dialog {
width: min(60rem, calc(100vw - 2rem));
max-width: none;
@@ -4041,6 +4465,93 @@ a {
.usage-dialog-actions button {
width: 100%;
}
+ .piece-editor-dialog {
+ width: 100vw;
+ height: 100dvh;
+ border: 0;
+ border-radius: 0;
+ }
+ .piece-dialog-header {
+ padding: 0.75rem 0.8rem 0.6rem;
+ }
+ .piece-dialog-heading > small {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ .piece-dialog-title textarea {
+ height: 2.35em;
+ font-size: 1.3rem;
+ line-height: 1.12;
+ }
+ .piece-dialog-tabs {
+ overflow-x: auto;
+ padding: 0.4rem 0.6rem;
+ }
+ .piece-dialog-tabs button {
+ flex: 1 0 auto;
+ padding-inline: 0.55rem;
+ }
+ .piece-dialog-workspace {
+ padding: 0.7rem;
+ }
+ .piece-panel-heading,
+ .piece-subsection-heading,
+ .markdown-editor-heading {
+ align-items: flex-start;
+ flex-direction: column;
+ gap: 0.4rem;
+ }
+ .markdown-toolbar {
+ width: 100%;
+ }
+ .markdown-toolbar button {
+ min-height: 2rem;
+ }
+ .piece-meta-details summary {
+ align-items: flex-start;
+ flex-direction: column;
+ gap: 0.2rem;
+ }
+ .piece-meta-grid,
+ .piece-source-editor .source-row,
+ .piece-presentation-layout {
+ grid-template-columns: 1fr;
+ }
+ .piece-source-editor .source-row {
+ align-items: stretch;
+ }
+ .piece-source-editor .source-row > button {
+ justify-self: start;
+ }
+ .piece-presentation-preview > .output-content {
+ min-height: 16rem;
+ }
+ .piece-dialog-footer {
+ align-items: center;
+ padding: 0.5rem 0.65rem calc(0.5rem + env(safe-area-inset-bottom));
+ }
+ .piece-dialog-secondary-actions {
+ display: grid;
+ min-width: 0;
+ max-width: calc(100% - 11rem);
+ grid-auto-columns: max-content;
+ grid-auto-flow: column;
+ align-items: center;
+ overflow-x: auto;
+ }
+ .piece-dialog-secondary-actions form {
+ flex: 0 0 auto;
+ }
+ .piece-dialog-secondary-actions .text-button {
+ white-space: nowrap;
+ }
+ .piece-dialog-primary-action {
+ margin-left: auto;
+ }
+ .piece-dialog-primary-action span {
+ display: none;
+ }
.library-toolbar {
align-items: stretch;
flex-direction: column;
diff --git a/src/lib/components/EditorialMarkdownField.svelte b/src/lib/components/EditorialMarkdownField.svelte
deleted file mode 100644
index df600c2..0000000
--- a/src/lib/components/EditorialMarkdownField.svelte
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
- {hint}{label}
- {#if hint}