@rslsp1/fa-app-tools 5.0.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/szenen.js CHANGED
@@ -310,15 +310,15 @@ function resolveRef(ref, baseId, schemas) {
310
310
  const target = hash === -1 ? ref : ref.slice(0, hash);
311
311
  const pointer = hash === -1 ? "" : ref.slice(hash + 1);
312
312
  const documentId = target === "" ? baseId : new URL(target, baseId).href;
313
- const document = schemas.byId.get(documentId);
314
- if (!document) {
313
+ const document2 = schemas.byId.get(documentId);
314
+ if (!document2) {
315
315
  throw new UnsupportedSchemaError(`Referenz "${ref}" zeigt auf unbekanntes Schema ${documentId}.`);
316
316
  }
317
- if (pointer === "" || pointer === "/") return { schema: document, baseId: documentId };
317
+ if (pointer === "" || pointer === "/") return { schema: document2, baseId: documentId };
318
318
  if (!pointer.startsWith("/")) {
319
319
  throw new UnsupportedSchemaError(`Referenz "${ref}": nur JSON-Pointer werden aufgeloest.`);
320
320
  }
321
- let node = document;
321
+ let node = document2;
322
322
  for (const rawSegment of pointer.slice(1).split("/")) {
323
323
  const segment = unescapePointer(rawSegment);
324
324
  if (!isObject(node) || !(segment in node)) {
@@ -10459,6 +10459,7 @@ async function ladeVorschauen(port, mediaRefs, fertig, optionen = {}) {
10459
10459
  const ergebnis = await laden.call(port, ref);
10460
10460
  if (lauf?.abgebrochen) return;
10461
10461
  if (ergebnis.kind === "ok") fertig(ref, ergebnis.value);
10462
+ else optionen.gescheitert?.(ref, ergebnis.message);
10462
10463
  }
10463
10464
  }
10464
10465
  await Promise.all(
@@ -13440,7 +13441,7 @@ function checkSceneDerivationRecoveryRecord(candidate) {
13440
13441
  }
13441
13442
 
13442
13443
  // src/features/szenen/SzenenView.tsx
13443
- var import_react16 = require("react");
13444
+ var import_react17 = require("react");
13444
13445
 
13445
13446
  // src/features/szenen/szenenViewModel.ts
13446
13447
  var KEINE_BAUSTEINE = [
@@ -13533,7 +13534,7 @@ function noticeFor(ergebnis, was) {
13533
13534
  }
13534
13535
 
13535
13536
  // src/features/szenen/areas/ElementsArea.tsx
13536
- var import_react11 = require("react");
13537
+ var import_react12 = require("react");
13537
13538
 
13538
13539
  // src/features/szenen/areas/usePortQuery.ts
13539
13540
  var import_react = require("react");
@@ -13565,7 +13566,7 @@ function usePortQuery(frage, abhaengigkeiten) {
13565
13566
  }
13566
13567
 
13567
13568
  // src/features/szenen/areas/ElementDetail.tsx
13568
- var import_react9 = require("react");
13569
+ var import_react10 = require("react");
13569
13570
 
13570
13571
  // src/features/szenen/elementLabels.ts
13571
13572
  var LABELS = {
@@ -13925,6 +13926,9 @@ var LABELS2 = {
13925
13926
  user_instruction: "Nutzeranweisung",
13926
13927
  prompt_render_settings: "Prompt-Erzeugung",
13927
13928
  blender_render_settings: "Blender-Ausgabe",
13929
+ // Nur Darstellung, keine Schemaaenderung (A4): Der Schluessel bleibt
13930
+ // `overrides`, und er steht als `<code>` weiterhin daneben.
13931
+ overrides: "Render-Abweichungen",
13928
13932
  camera_rig: "Kamera-Rig",
13929
13933
  media_refs: "Medien",
13930
13934
  external_refs: "Externe Referenzen",
@@ -14903,41 +14907,91 @@ var FeldControl = (props) => {
14903
14907
  );
14904
14908
  }
14905
14909
  };
14910
+ var LANGE_ERKLAERUNG = 120;
14911
+ function ersterSatz(text) {
14912
+ const ende = /[.!?](\s|$)/.exec(text);
14913
+ return ende ? text.slice(0, ende.index + 1) : text;
14914
+ }
14915
+ var Erklaerung = ({ text, testId }) => {
14916
+ const ganz = text.trim();
14917
+ const kern = ersterSatz(ganz);
14918
+ const rest = ganz.slice(kern.length).trim();
14919
+ if (ganz.length <= LANGE_ERKLAERUNG || !rest) {
14920
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { "data-testid": `erklaerung-${testId}`, children: ganz });
14921
+ }
14922
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
14923
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { "data-testid": `erklaerung-${testId}`, children: kern }),
14924
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("details", { className: "szenen-detail__warum", "data-testid": `warum-${testId}`, children: [
14925
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("summary", { children: "Warum?" }),
14926
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: rest })
14927
+ ] })
14928
+ ] });
14929
+ };
14930
+ function gruppeKonfiguriert(feld, formular) {
14931
+ return Object.keys(payloadFromForm([feld], formular)).length > 0;
14932
+ }
14906
14933
  var SchemaFieldRow = (props) => {
14907
14934
  const { feld, elementType, formular } = props;
14908
14935
  const label = feldLabel(elementType, feld.path, feld.name);
14909
14936
  if (feld.kind === "group") {
14910
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("fieldset", { className: "szenen-detail__group", "data-testid": `gruppe-${feld.path}`, children: [
14911
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("legend", { children: [
14912
- label,
14913
- feld.required && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { title: "Pflichtfeld", children: " *" })
14914
- ] }),
14915
- feld.description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: feld.description }),
14916
- (feld.children ?? []).map((kind) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SchemaFieldRow, { ...props, feld: kind }, kind.path))
14917
- ] });
14937
+ const konfiguriert = gruppeKonfiguriert(feld, formular);
14938
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
14939
+ "details",
14940
+ {
14941
+ className: "szenen-detail__group",
14942
+ "data-testid": `gruppe-${feld.path}`,
14943
+ "data-konfiguriert": konfiguriert ? "ja" : "nein",
14944
+ open: feld.required,
14945
+ children: [
14946
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("summary", { children: [
14947
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "szenen-detail__group-titel", children: label }),
14948
+ feld.required ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { title: "Pflichtfeld", children: " *" }) : (
14949
+ // A2: Dass hier schon etwas steht, muss man im
14950
+ // geschlossenen Zustand sehen — sonst übersieht man
14951
+ // eine gesetzte Blender-Ausgabe genau so lange, bis
14952
+ // sie im Ergebnis auftaucht.
14953
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
14954
+ "span",
14955
+ {
14956
+ className: "szenen-detail__group-status",
14957
+ "data-testid": `gruppe-${feld.path}-status`,
14958
+ children: konfiguriert ? "konfiguriert" : "optional"
14959
+ }
14960
+ )
14961
+ )
14962
+ ] }),
14963
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "szenen-detail__group-inhalt", children: [
14964
+ feld.description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Erklaerung, { text: feld.description, testId: `gruppe-${feld.path}` }),
14965
+ (feld.children ?? []).map((kind) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SchemaFieldRow, { ...props, feld: kind }, kind.path))
14966
+ ] })
14967
+ ]
14968
+ }
14969
+ );
14918
14970
  }
14919
14971
  const wert = formular[feld.path] ?? "";
14920
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", { className: "szenen-detail__field", "data-feld": feld.path, children: [
14921
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
14922
- label,
14923
- feld.required && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { title: "Pflichtfeld", children: " *" }),
14924
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", { className: "szenen-detail__field-key", children: feld.name }),
14925
- feld.complexHint && !hatFachlicheBedienung(elementType, feld) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("em", { children: [
14926
- " \u2014 ",
14927
- feld.complexHint
14928
- ] })
14972
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "szenen-detail__fieldrow", "data-feld": feld.path, children: [
14973
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", { className: "szenen-detail__field", children: [
14974
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
14975
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "szenen-detail__field-label", children: label }),
14976
+ feld.required && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { title: "Pflichtfeld", children: " *" }),
14977
+ label !== feld.name && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", { className: "szenen-detail__field-key", children: feld.name }),
14978
+ feld.complexHint && !hatFachlicheBedienung(elementType, feld) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("em", { children: [
14979
+ " \u2014 ",
14980
+ feld.complexHint
14981
+ ] })
14982
+ ] }),
14983
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FeldControl, { ...props, wert }),
14984
+ feld.nullable && feld.kind !== "complex" && !hatFachlicheBedienung(elementType, feld) && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
14985
+ NullSchalter,
14986
+ {
14987
+ feld,
14988
+ wert,
14989
+ onChange: props.onChange,
14990
+ readOnly: props.readOnly
14991
+ }
14992
+ )
14929
14993
  ] }),
14930
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FeldControl, { ...props, wert }),
14931
- feld.nullable && feld.kind !== "complex" && !hatFachlicheBedienung(elementType, feld) && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
14932
- NullSchalter,
14933
- {
14934
- feld,
14935
- wert,
14936
- onChange: props.onChange,
14937
- readOnly: props.readOnly
14938
- }
14939
- ),
14940
- feld.description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: feld.description })
14994
+ feld.description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Erklaerung, { text: feld.description, testId: feld.path })
14941
14995
  ] });
14942
14996
  };
14943
14997
 
@@ -15604,11 +15658,162 @@ var VersionNavigator = ({
15604
15658
  };
15605
15659
 
15606
15660
  // src/features/szenen/areas/RunsPanel.tsx
15607
- var import_react8 = require("react");
15661
+ var import_react9 = require("react");
15608
15662
 
15609
15663
  // src/features/szenen/areas/RunImagesPanel.tsx
15664
+ var import_react8 = require("react");
15665
+
15666
+ // src/features/szenen/areas/Bildbausteine.tsx
15610
15667
  var import_react7 = require("react");
15611
15668
  var import_jsx_runtime7 = require("react/jsx-runtime");
15669
+ var Kachel = ({
15670
+ quelle,
15671
+ alt,
15672
+ leerText
15673
+ }) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "szenen-bildkachel", children: quelle ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("img", { src: quelle, alt, loading: "lazy" }) : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "szenen-bildkachel__leer", title: leerText ?? alt, children: leerText ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "szenen-bildkachel__zeichen", children: "?" }) : null }) });
15674
+ var BildViewer = ({
15675
+ bilder,
15676
+ position,
15677
+ onWechseln,
15678
+ onSchliessen,
15679
+ satzTitel,
15680
+ testId
15681
+ }) => {
15682
+ const anzahl = bilder.length;
15683
+ const bild = bilder[position];
15684
+ const blaettern = (0, import_react7.useCallback)((schritt) => {
15685
+ if (anzahl === 0) return;
15686
+ onWechseln((position + schritt + anzahl) % anzahl);
15687
+ }, [anzahl, position, onWechseln]);
15688
+ (0, import_react7.useEffect)(() => {
15689
+ const taste = (e) => {
15690
+ if (e.key === "Escape") onSchliessen();
15691
+ else if (e.key === "ArrowLeft") blaettern(-1);
15692
+ else if (e.key === "ArrowRight") blaettern(1);
15693
+ };
15694
+ document.addEventListener("keydown", taste);
15695
+ return () => document.removeEventListener("keydown", taste);
15696
+ }, [blaettern, onSchliessen]);
15697
+ if (!bild) return null;
15698
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
15699
+ "div",
15700
+ {
15701
+ className: "szenen-bildviewer",
15702
+ "data-testid": testId,
15703
+ role: "dialog",
15704
+ "aria-modal": "true",
15705
+ "aria-label": satzTitel ? `${satzTitel} \u2014 ${bild.titel}` : bild.titel,
15706
+ children: [
15707
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("header", { className: "szenen-bildviewer__kopf", children: [
15708
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { className: "szenen-bildviewer__titel", children: [
15709
+ satzTitel ? `${satzTitel} \xB7 ` : "",
15710
+ bild.titel
15711
+ ] }),
15712
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { className: "szenen-bildviewer__zaehler", "data-testid": `${testId}-zaehler`, children: [
15713
+ position + 1,
15714
+ " / ",
15715
+ anzahl
15716
+ ] }),
15717
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
15718
+ "button",
15719
+ {
15720
+ type: "button",
15721
+ className: "szenen-bildviewer__schliessen",
15722
+ onClick: onSchliessen,
15723
+ "data-testid": `${testId}-schliessen`,
15724
+ children: "Schliessen"
15725
+ }
15726
+ )
15727
+ ] }),
15728
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "szenen-bildviewer__buehne", children: [
15729
+ anzahl > 1 && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
15730
+ "button",
15731
+ {
15732
+ type: "button",
15733
+ className: "szenen-bildviewer__blaettern",
15734
+ onClick: () => blaettern(-1),
15735
+ "aria-label": "Vorheriges Bild",
15736
+ "data-testid": `${testId}-zurueck`,
15737
+ children: "\u2039"
15738
+ }
15739
+ ),
15740
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "szenen-bildviewer__rahmen", children: bild.quelle ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
15741
+ "img",
15742
+ {
15743
+ className: "szenen-bildviewer__bild",
15744
+ src: bild.quelle,
15745
+ alt: bild.titel,
15746
+ "data-testid": `${testId}-bild`
15747
+ }
15748
+ ) : (
15749
+ // Auch gross bleibt eine fehlende Quelle eine Auskunft
15750
+ // und kein Textblock (R12.3).
15751
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "szenen-bildviewer__leer", "data-testid": `${testId}-leer`, children: bild.leerText ?? "F\xFCr dieses Bild gibt es keine anzeigbare Quelle." })
15752
+ ) }),
15753
+ anzahl > 1 && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
15754
+ "button",
15755
+ {
15756
+ type: "button",
15757
+ className: "szenen-bildviewer__blaettern",
15758
+ onClick: () => blaettern(1),
15759
+ "aria-label": "N\xE4chstes Bild",
15760
+ "data-testid": `${testId}-weiter`,
15761
+ children: "\u203A"
15762
+ }
15763
+ )
15764
+ ] }),
15765
+ bild.details && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "szenen-bildviewer__details", "data-testid": `${testId}-details`, children: bild.details })
15766
+ ]
15767
+ }
15768
+ );
15769
+ };
15770
+ var BildGalerie = ({ bilder, testId, satzTitel }) => {
15771
+ const [offen, setOffen] = (0, import_react7.useState)(null);
15772
+ (0, import_react7.useEffect)(() => {
15773
+ setOffen((vorher) => vorher !== null && vorher >= bilder.length ? null : vorher);
15774
+ }, [bilder.length]);
15775
+ if (bilder.length === 0) return null;
15776
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
15777
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("ul", { className: "szenen-bildgalerie", "data-testid": testId, children: bilder.map((bild, position) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
15778
+ "button",
15779
+ {
15780
+ type: "button",
15781
+ className: "szenen-bildgalerie__kachel",
15782
+ onClick: () => setOffen(position),
15783
+ "data-testid": `${testId}-oeffnen-${bild.id}`,
15784
+ title: bild.titel,
15785
+ children: [
15786
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
15787
+ Kachel,
15788
+ {
15789
+ quelle: bild.quelle,
15790
+ alt: bild.titel,
15791
+ ...bild.leerText ? { leerText: bild.leerText } : {}
15792
+ }
15793
+ ),
15794
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { className: "szenen-bildgalerie__nummer", children: [
15795
+ "#",
15796
+ position + 1
15797
+ ] })
15798
+ ]
15799
+ }
15800
+ ) }, bild.id)) }),
15801
+ offen !== null && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
15802
+ BildViewer,
15803
+ {
15804
+ bilder,
15805
+ position: offen,
15806
+ onWechseln: setOffen,
15807
+ onSchliessen: () => setOffen(null),
15808
+ testId: `${testId}-viewer`,
15809
+ ...satzTitel ? { satzTitel } : {}
15810
+ }
15811
+ )
15812
+ ] });
15813
+ };
15814
+
15815
+ // src/features/szenen/areas/RunImagesPanel.tsx
15816
+ var import_jsx_runtime8 = require("react/jsx-runtime");
15612
15817
  var AUFTRAG_TEXT = {
15613
15818
  // „gestartet/unterbrochen" in einem: Aus dem Log allein ist beides nicht
15614
15819
  // unterscheidbar, und genau das ist beabsichtigt — es gibt keinen
@@ -15620,8 +15825,10 @@ var AUFTRAG_TEXT = {
15620
15825
  };
15621
15826
  var RunImagesPanel = ({ port, lauf }) => {
15622
15827
  const faehig = capabilitiesOf(port);
15623
- const [nachladen, setNachladen] = (0, import_react7.useState)(0);
15828
+ const [nachladen, setNachladen] = (0, import_react8.useState)(0);
15624
15829
  const neuLesen = () => setNachladen((n) => n + 1);
15830
+ const [erzeugenOffen, setErzeugenOffen] = (0, import_react8.useState)(null);
15831
+ const [zuordnenOffen, setZuordnenOffen] = (0, import_react8.useState)(null);
15625
15832
  const quelle = sourceOf(lauf);
15626
15833
  const [wahlPhase] = usePortQuery(
15627
15834
  () => port.imageGeneration ? port.imageGeneration.imageModelChoiceForRun(lauf.run_id) : Promise.resolve({ kind: "ok", value: null }),
@@ -15638,38 +15845,40 @@ var RunImagesPanel = ({ port, lauf }) => {
15638
15845
  );
15639
15846
  const auftraege = auftraegePhase.status === "ready" ? auftraegePhase.value : [];
15640
15847
  const batches = batchesPhase.status === "ready" ? batchesPhase.value : [];
15641
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "szenen-bilder", "data-testid": `bilder-${lauf.run_id}`, children: [
15642
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("section", { className: "szenen-bilder__eingang", "data-testid": `eingang-${lauf.run_id}`, children: [
15643
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h5", { children: "Eingang \u2014 woraus dieser Prompt entstand" }),
15644
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { className: "szenen-bilder__ids", children: [
15645
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { children: [
15848
+ const auffaellige = auftraege.filter((a) => a.status !== "succeeded");
15849
+ const erzeugenAuf = erzeugenOffen ?? batches.length === 0;
15850
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "szenen-bilder", "data-testid": `bilder-${lauf.run_id}`, children: [
15851
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("section", { className: "szenen-bilder__eingang", "data-testid": `eingang-${lauf.run_id}`, children: [
15852
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h5", { children: "Eingang \u2014 woraus dieser Prompt entstand" }),
15853
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { className: "szenen-bilder__ids", children: [
15854
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
15646
15855
  "Lauf ",
15647
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { "data-testid": `eingang-lauf-${lauf.run_id}`, children: lauf.run_id })
15856
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { "data-testid": `eingang-lauf-${lauf.run_id}`, children: lauf.run_id })
15648
15857
  ] }),
15649
- quelle.kind === "published" && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { "data-testid": `eingang-herkunft-${lauf.run_id}`, children: [
15858
+ quelle.kind === "published" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { "data-testid": `eingang-herkunft-${lauf.run_id}`, children: [
15650
15859
  "ver\xF6ffentlichte Shot-Version ",
15651
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { children: quelle.shot_version_id })
15860
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { children: quelle.shot_version_id })
15652
15861
  ] }),
15653
- quelle.kind === "draft_chain" && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { "data-testid": `eingang-herkunft-${lauf.run_id}`, children: [
15862
+ quelle.kind === "draft_chain" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { "data-testid": `eingang-herkunft-${lauf.run_id}`, children: [
15654
15863
  "Draft-Kette ",
15655
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { children: quelle.chain_id })
15864
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { children: quelle.chain_id })
15656
15865
  ] }),
15657
- quelle.kind === "scene_direct" && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { "data-testid": `eingang-herkunft-${lauf.run_id}`, children: [
15866
+ quelle.kind === "scene_direct" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { "data-testid": `eingang-herkunft-${lauf.run_id}`, children: [
15658
15867
  "Szene ",
15659
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { children: quelle.scene.element_id }),
15660
- quelle.scene.draft_id ? /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
15868
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { children: quelle.scene.element_id }),
15869
+ quelle.scene.draft_id ? /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
15661
15870
  " \xB7 Entwurf ",
15662
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { children: quelle.scene.draft_id }),
15871
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { children: quelle.scene.draft_id }),
15663
15872
  " (Revision ",
15664
15873
  quelle.scene.revision,
15665
15874
  ")"
15666
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
15875
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
15667
15876
  " \xB7 Version ",
15668
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { children: quelle.scene.version_id })
15877
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { children: quelle.scene.version_id })
15669
15878
  ] })
15670
15879
  ] })
15671
15880
  ] }),
15672
- quelle.kind === "draft_chain" && quelle.derivation_run_id ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
15881
+ quelle.kind === "draft_chain" && quelle.derivation_run_id ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
15673
15882
  InputBilder,
15674
15883
  {
15675
15884
  port,
@@ -15680,67 +15889,148 @@ var RunImagesPanel = ({ port, lauf }) => {
15680
15889
  // Nichts raten: Ein Lauf vor 6.7 trägt die
15681
15890
  // Rekonstruktionsherkunft nicht, und ein veröffentlichter
15682
15891
  // Lauf hat keine (D-123).
15683
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { "data-testid": `eingang-ohne-bilder-${lauf.run_id}`, children: "Zu diesem Lauf ist kein Rekonstruktionslauf hinterlegt \u2014 die Eingangsbilder sind darum nicht sicher aufl\xF6sbar und werden nicht geraten." })
15892
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { "data-testid": `eingang-ohne-bilder-${lauf.run_id}`, children: "Zu diesem Lauf ist kein Rekonstruktionslauf hinterlegt \u2014 die Eingangsbilder sind darum nicht sicher aufl\xF6sbar und werden nicht geraten." })
15684
15893
  )
15685
15894
  ] }),
15686
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("section", { className: "szenen-bilder__ausgang", "data-testid": `ausgang-${lauf.run_id}`, children: [
15687
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h5", { children: "Ausgang \u2014 die Bilder aus diesem Prompt" }),
15688
- !faehig.imageOrderHistory && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { "data-testid": `auftraege-unsupported-${lauf.run_id}`, children: "Dieser Host liest keine Bildgenerierungsauftr\xE4ge. Bereits gespeicherte Batches sind unten trotzdem sichtbar." }),
15689
- auftraegePhase.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { "data-testid": `auftraege-fehler-${lauf.run_id}`, role: "alert", children: [
15895
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("section", { className: "szenen-bilder__ausgang", "data-testid": `ausgang-${lauf.run_id}`, children: [
15896
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h5", { children: "Ausgang \u2014 die Bilder aus diesem Prompt" }),
15897
+ !faehig.imageBatchHistory && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { "data-testid": `batches-unsupported-${lauf.run_id}`, children: "Dieser Host liest keine Bild-Batches. Das ist kein Fehler und kein vor\xFCbergehender Zustand." }),
15898
+ batchesPhase.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { "data-testid": `batches-fehler-${lauf.run_id}`, role: "alert", children: [
15899
+ "Batches konnten nicht geladen werden: ",
15900
+ batchesPhase.message
15901
+ ] }),
15902
+ faehig.imageBatchHistory && batchesPhase.status === "ready" && batches.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { "data-testid": `keine-batches-${lauf.run_id}`, children: "Zu diesem Lauf ist noch kein Bild gespeichert." }),
15903
+ batches.map((batch) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(BatchKachel, { port, batch }, batch.item_id)),
15904
+ !faehig.imageOrderHistory && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { "data-testid": `auftraege-unsupported-${lauf.run_id}`, children: "Dieser Host liest keine Bildgenerierungsauftr\xE4ge. Bereits gespeicherte Batches sind oben trotzdem sichtbar." }),
15905
+ auftraegePhase.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { "data-testid": `auftraege-fehler-${lauf.run_id}`, role: "alert", children: [
15690
15906
  "Auftr\xE4ge konnten nicht geladen werden: ",
15691
15907
  auftraegePhase.message
15692
15908
  ] }),
15693
- faehig.imageOrderHistory && auftraegePhase.status === "ready" && auftraege.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { "data-testid": `keine-auftraege-${lauf.run_id}`, children: "F\xFCr diesen Lauf wurde noch kein Bildauftrag gestartet." }),
15694
- auftraege.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("ul", { className: "szenen-bilder__auftraege", "data-testid": `auftraege-${lauf.run_id}`, children: auftraege.map((auftrag) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
15695
- "li",
15909
+ faehig.imageOrderHistory && auftraegePhase.status === "ready" && auftraege.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { "data-testid": `keine-auftraege-${lauf.run_id}`, children: "F\xFCr diesen Lauf wurde noch kein Bildauftrag gestartet." }),
15910
+ auffaellige.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
15911
+ "p",
15696
15912
  {
15697
- "data-testid": `auftrag-${auftrag.generation_batch_id}`,
15698
- "data-status": auftrag.status,
15913
+ className: "szenen-bilder__auffaellig",
15914
+ "data-testid": `auftraege-auffaellig-${lauf.run_id}`,
15915
+ role: "alert",
15699
15916
  children: [
15700
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("strong", { children: AUFTRAG_TEXT[auftrag.status] }),
15701
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { children: auftrag.generation_batch_id }),
15702
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { "data-testid": `auftrag-modell-${auftrag.generation_batch_id}`, children: [
15703
- auftrag.request?.image_count ?? "?",
15704
- " Bild(er) \xB7",
15705
- " ",
15706
- auftrag.request?.callable_model_id ?? "Modell unbekannt",
15707
- auftrag.request?.provider ? ` bei ${auftrag.request.provider}` : ""
15708
- ] }),
15709
- auftrag.request?.prompt_target_model_key && auftrag.request.target_model_matched === false && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { "data-testid": `auftrag-abweichung-${auftrag.generation_batch_id}`, children: [
15710
- "abweichend \u2014 Prompt optimiert f\xFCr",
15711
- " ",
15712
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { children: auftrag.request.prompt_target_model_key })
15713
- ] }),
15714
- auftrag.request?.negative_prompt_transmitted === false && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { "data-testid": `auftrag-negativ-${auftrag.generation_batch_id}`, children: "Ein negativer Prompt lief \xFCber dieses Profil nicht mit." }),
15715
- auftrag.item_id && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { "data-testid": `auftrag-item-${auftrag.generation_batch_id}`, children: [
15716
- "Item ",
15717
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { children: auftrag.item_id })
15917
+ auffaellige.length === 1 ? `Ein Bildauftrag ist ${AUFTRAG_TEXT[auffaellige[0].status]}.` : `${auffaellige.length} Bildauftr\xE4ge sind nicht sauber durchgelaufen.`,
15918
+ " ",
15919
+ "Einzelheiten im Verlauf."
15920
+ ]
15921
+ }
15922
+ ),
15923
+ auftraege.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
15924
+ "details",
15925
+ {
15926
+ className: "szenen-bilder__verlauf",
15927
+ "data-testid": `auftraege-verlauf-${lauf.run_id}`,
15928
+ open: auffaellige.length > 0,
15929
+ children: [
15930
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("summary", { children: [
15931
+ "Bildauftr\xE4ge / Verlauf (",
15932
+ auftraege.length,
15933
+ ")"
15718
15934
  ] }),
15719
- auftrag.status === "started" && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { "data-testid": `auftrag-hinweis-${auftrag.generation_batch_id}`, children: "Kein automatischer neuer Versuch \u2014 ob noch einmal erzeugt wird, entscheiden Sie." }),
15720
- auftrag.diagnostic && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { "data-testid": `auftrag-diagnose-${auftrag.generation_batch_id}`, children: auftrag.diagnostic })
15935
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("ul", { className: "szenen-bilder__auftraege", "data-testid": `auftraege-${lauf.run_id}`, children: auftraege.map((auftrag) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
15936
+ "li",
15937
+ {
15938
+ "data-testid": `auftrag-${auftrag.generation_batch_id}`,
15939
+ "data-status": auftrag.status,
15940
+ children: [
15941
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("strong", { children: AUFTRAG_TEXT[auftrag.status] }),
15942
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { "data-testid": `auftrag-modell-${auftrag.generation_batch_id}`, children: [
15943
+ auftrag.request?.image_count ?? "?",
15944
+ " Bild(er) \xB7",
15945
+ " ",
15946
+ auftrag.request?.callable_model_id ?? "Modell unbekannt",
15947
+ auftrag.request?.provider ? ` bei ${auftrag.request.provider}` : ""
15948
+ ] }),
15949
+ auftrag.request?.prompt_target_model_key && auftrag.request.target_model_matched === false && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { "data-testid": `auftrag-abweichung-${auftrag.generation_batch_id}`, children: [
15950
+ "abweichend \u2014 Prompt optimiert f\xFCr",
15951
+ " ",
15952
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { children: auftrag.request.prompt_target_model_key })
15953
+ ] }),
15954
+ auftrag.request?.negative_prompt_transmitted === false && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { "data-testid": `auftrag-negativ-${auftrag.generation_batch_id}`, children: "Ein negativer Prompt lief \xFCber dieses Profil nicht mit." }),
15955
+ auftrag.item_id && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { "data-testid": `auftrag-item-${auftrag.generation_batch_id}`, children: [
15956
+ "Item ",
15957
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { children: auftrag.item_id })
15958
+ ] }),
15959
+ auftrag.status === "started" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { "data-testid": `auftrag-hinweis-${auftrag.generation_batch_id}`, children: "Kein automatischer neuer Versuch \u2014 ob noch einmal erzeugt wird, entscheiden Sie." }),
15960
+ auftrag.diagnostic && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { "data-testid": `auftrag-diagnose-${auftrag.generation_batch_id}`, children: auftrag.diagnostic }),
15961
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { className: "szenen-bilder__auftragskennung", children: auftrag.generation_batch_id })
15962
+ ]
15963
+ },
15964
+ auftrag.generation_batch_id
15965
+ )) })
15721
15966
  ]
15722
- },
15723
- auftrag.generation_batch_id
15724
- )) }),
15725
- !faehig.imageBatchHistory && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { "data-testid": `batches-unsupported-${lauf.run_id}`, children: "Dieser Host liest keine Bild-Batches. Das ist kein Fehler und kein vor\xFCbergehender Zustand." }),
15726
- batchesPhase.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { "data-testid": `batches-fehler-${lauf.run_id}`, role: "alert", children: [
15727
- "Batches konnten nicht geladen werden: ",
15728
- batchesPhase.message
15729
- ] }),
15730
- faehig.imageBatchHistory && batchesPhase.status === "ready" && batches.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { "data-testid": `keine-batches-${lauf.run_id}`, children: "Zu diesem Lauf ist noch kein Bild gespeichert." }),
15731
- batches.map((batch) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(BatchKachel, { port, batch }, batch.item_id))
15967
+ }
15968
+ )
15732
15969
  ] }),
15733
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
15734
- ErzeugenAktion,
15970
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
15971
+ "details",
15735
15972
  {
15736
- port,
15737
- lauf,
15738
- wahl,
15739
- wahlFehler: wahlPhase.status === "error" ? wahlPhase.message : null,
15740
- onFertig: neuLesen
15973
+ className: "szenen-bilder__aktion",
15974
+ "data-testid": `erzeugen-bereich-${lauf.run_id}`,
15975
+ open: erzeugenAuf,
15976
+ children: [
15977
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
15978
+ "summary",
15979
+ {
15980
+ onClick: (e) => {
15981
+ e.preventDefault();
15982
+ setErzeugenOffen(!erzeugenAuf);
15983
+ },
15984
+ children: "Bilder aus diesem Prompt erzeugen"
15985
+ }
15986
+ ),
15987
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
15988
+ ErzeugenAktion,
15989
+ {
15990
+ port,
15991
+ lauf,
15992
+ wahl,
15993
+ wahlFehler: wahlPhase.status === "error" ? wahlPhase.message : null,
15994
+ onFertig: () => {
15995
+ setErzeugenOffen(true);
15996
+ neuLesen();
15997
+ }
15998
+ }
15999
+ )
16000
+ ]
15741
16001
  }
15742
16002
  ),
15743
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ZuordnenAktion, { port, lauf, onFertig: neuLesen })
16003
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
16004
+ "details",
16005
+ {
16006
+ className: "szenen-bilder__aktion",
16007
+ "data-testid": `zuordnen-bereich-${lauf.run_id}`,
16008
+ open: zuordnenOffen ?? false,
16009
+ children: [
16010
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16011
+ "summary",
16012
+ {
16013
+ onClick: (e) => {
16014
+ e.preventDefault();
16015
+ setZuordnenOffen(!(zuordnenOffen ?? false));
16016
+ },
16017
+ children: "Externe Bilder diesem Lauf zuordnen"
16018
+ }
16019
+ ),
16020
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16021
+ ZuordnenAktion,
16022
+ {
16023
+ port,
16024
+ lauf,
16025
+ onFertig: () => {
16026
+ setZuordnenOffen(true);
16027
+ neuLesen();
16028
+ }
16029
+ }
16030
+ )
16031
+ ]
16032
+ }
16033
+ )
15744
16034
  ] });
15745
16035
  };
15746
16036
  var InputBilder = ({ port, runId, derivationRunId }) => {
@@ -15748,9 +16038,9 @@ var InputBilder = ({ port, runId, derivationRunId }) => {
15748
16038
  () => port.derivation ? port.derivation.getDerivation(derivationRunId) : Promise.resolve({ kind: "ok", value: null }),
15749
16039
  [port, derivationRunId]
15750
16040
  );
15751
- if (phase.status === "loading") return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { children: "Rekonstruktionslauf wird geladen \u2026" });
16041
+ if (phase.status === "loading") return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { children: "Rekonstruktionslauf wird geladen \u2026" });
15752
16042
  if (phase.status === "error") {
15753
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { "data-testid": `eingang-fehler-${runId}`, role: "alert", children: [
16043
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { "data-testid": `eingang-fehler-${runId}`, role: "alert", children: [
15754
16044
  "Der Rekonstruktionslauf ",
15755
16045
  derivationRunId,
15756
16046
  " konnte nicht geladen werden: ",
@@ -15758,22 +16048,22 @@ var InputBilder = ({ port, runId, derivationRunId }) => {
15758
16048
  ] });
15759
16049
  }
15760
16050
  if (!phase.value) {
15761
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { "data-testid": `eingang-unbekannt-${runId}`, children: [
16051
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { "data-testid": `eingang-unbekannt-${runId}`, children: [
15762
16052
  "Der Rekonstruktionslauf ",
15763
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { children: derivationRunId }),
16053
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { children: derivationRunId }),
15764
16054
  " ist in diesem Host nicht auffindbar."
15765
16055
  ] });
15766
16056
  }
15767
16057
  const bilder = phase.value.input.images;
15768
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { "data-testid": `eingang-bilder-${runId}`, children: [
15769
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { children: [
16058
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { "data-testid": `eingang-bilder-${runId}`, children: [
16059
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { children: [
15770
16060
  "aus Rekonstruktionslauf ",
15771
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { children: derivationRunId }),
16061
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { children: derivationRunId }),
15772
16062
  phase.value.input.prompt_text ? " \xB7 mit Referenzprompt" : ""
15773
16063
  ] }),
15774
- bilder.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { children: "Der Rekonstruktionslauf lief ohne Eingangsbild." }) : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("ul", { className: "szenen-bilder__eingangsliste", children: bilder.map((bild, index) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("li", { "data-kind": bild.kind, children: bild.kind === "library" ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(BestandsBild, { port, mediaRef: bild.media_ref }) : /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { children: [
16064
+ bilder.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { children: "Der Rekonstruktionslauf lief ohne Eingangsbild." }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("ul", { className: "szenen-bilder__eingangsliste", children: bilder.map((bild, index) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("li", { "data-kind": bild.kind, children: bild.kind === "library" ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(BestandsBild, { port, mediaRef: bild.media_ref }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
15775
16065
  "Upload, nur \xFCber seinen Digest belegt (",
15776
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("code", { children: [
16066
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("code", { children: [
15777
16067
  bild.sha256.slice(0, 12),
15778
16068
  "\u2026"
15779
16069
  ] }),
@@ -15791,113 +16081,177 @@ var BestandsBild = ({ port, mediaRef }) => {
15791
16081
  () => port.imageLibrary ? port.imageLibrary.resolveImage(mediaRef) : Promise.resolve({ kind: "ok", value: null }),
15792
16082
  [port, mediaRef]
15793
16083
  );
15794
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { "data-testid": `eingangsbild-${mediaRef}`, children: [
15795
- phase.status === "ready" && phase.value && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
15796
- "img",
16084
+ const quelle = phase.status === "ready" && phase.value ? `data:${phase.value.mime_type};base64,${phase.value.data}` : null;
16085
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { "data-testid": `eingangsbild-${mediaRef}`, children: [
16086
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16087
+ Kachel,
15797
16088
  {
15798
- src: `data:${phase.value.mime_type};base64,${phase.value.data}`,
15799
- alt: `Eingangsbild ${mediaRef}`
16089
+ quelle,
16090
+ alt: `Eingangsbild ${mediaRef}`,
16091
+ ...phase.status === "error" ? { leerText: "Nicht ladbar" } : {}
15800
16092
  }
15801
16093
  ),
15802
16094
  phase.status === "error" && // Verzeichnet, aber nicht lesbar ist etwas anderes als
15803
16095
  // unbekannt — der Unterschied gehoert sichtbar.
15804
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("em", { "data-testid": `eingangsbild-fehler-${mediaRef}`, children: phase.message }),
15805
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { children: mediaRef })
16096
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("em", { "data-testid": `eingangsbild-fehler-${mediaRef}`, children: phase.message }),
16097
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { children: mediaRef })
15806
16098
  ] });
15807
16099
  };
15808
- var BatchBild = ({ port, bild }) => {
15809
- const [phase] = usePortQuery(
15810
- () => port.imageLibrary ? port.imageLibrary.resolveImage(bild.media_ref, bild.mime_type ?? null) : Promise.resolve({ kind: "ok", value: null }),
15811
- [port, bild.media_ref, bild.mime_type]
15812
- );
15813
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("li", { "data-testid": `batchbild-${bild.media_ref}`, children: [
15814
- phase.status === "ready" && phase.value && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
15815
- "img",
16100
+ function useBildQuellen(port, bilder) {
16101
+ const [stand, setStand] = (0, import_react8.useState)(() => ({ quellen: /* @__PURE__ */ new Map(), fehler: /* @__PURE__ */ new Map() }));
16102
+ const gehalten = (0, import_react8.useRef)(/* @__PURE__ */ new Map());
16103
+ const gescheitert = (0, import_react8.useRef)(/* @__PURE__ */ new Map());
16104
+ const schluessel = bilder.map((b) => `${b.media_ref}|${b.mime_type ?? ""}`).join(" ");
16105
+ (0, import_react8.useEffect)(() => {
16106
+ const bestand = port.imageLibrary;
16107
+ if (!bestand) return void 0;
16108
+ let abgebrochen = false;
16109
+ void (async () => {
16110
+ for (const bild of bilder) {
16111
+ if (abgebrochen) return;
16112
+ if (gehalten.current.has(bild.media_ref) || gescheitert.current.has(bild.media_ref)) continue;
16113
+ const ergebnis = await bestand.resolveImage(bild.media_ref, bild.mime_type ?? null);
16114
+ if (abgebrochen) return;
16115
+ if (ergebnis.kind === "ok" && ergebnis.value) {
16116
+ gehalten.current.set(
16117
+ bild.media_ref,
16118
+ `data:${ergebnis.value.mime_type};base64,${ergebnis.value.data}`
16119
+ );
16120
+ } else if (ergebnis.kind === "error") {
16121
+ gescheitert.current.set(bild.media_ref, ergebnis.message);
16122
+ }
16123
+ setStand({
16124
+ quellen: new Map(gehalten.current),
16125
+ fehler: new Map(gescheitert.current)
16126
+ });
16127
+ }
16128
+ })();
16129
+ return () => {
16130
+ abgebrochen = true;
16131
+ };
16132
+ }, [port, schluessel]);
16133
+ return stand;
16134
+ }
16135
+ var BildDetails = ({ bild, fehler: fehler4, aufloesbar }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { className: "szenen-bilder__meta", "data-testid": `batchbild-${bild.media_ref}`, children: [
16136
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { children: bild.media_ref }),
16137
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
16138
+ "Position ",
16139
+ bild.position
16140
+ ] }),
16141
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { children: bild.model || "Modell unbekannt" }),
16142
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { children: bild.seed === null || bild.seed === void 0 || bild.seed === -1 ? "ohne Seed" : `Seed ${bild.seed}` }),
16143
+ bild.width && bild.height ? /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
16144
+ bild.width,
16145
+ "\xD7",
16146
+ bild.height
16147
+ ] }) : null,
16148
+ fehler4 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("em", { "data-testid": `batchbild-fehler-${bild.media_ref}`, children: fehler4 }),
16149
+ !aufloesbar && // Capability-Grenze, kein Fehler: Dieser Host kann Batches lesen,
16150
+ // aber keine Bilder auflösen (E). Kein erfundener Fallback auf eine
16151
+ // Serverroute (A6).
16152
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("em", { "data-testid": `batchbild-unsupported-${bild.media_ref}`, children: "Dieser Host l\xF6st keine Bilder auf \u2014 nur die Metadaten sind bekannt." })
16153
+ ] });
16154
+ var BatchKachel = ({ port, batch }) => {
16155
+ const { quellen, fehler: fehler4 } = useBildQuellen(port, batch.images);
16156
+ const aufloesbar = Boolean(port.imageLibrary);
16157
+ const bilder = batch.images.map((bild) => ({
16158
+ id: bild.media_ref,
16159
+ quelle: quellen.get(bild.media_ref) ?? null,
16160
+ titel: `Bild ${bild.position + 1}`,
16161
+ ...fehler4.get(bild.media_ref) ? { leerText: "Nicht ladbar" } : {},
16162
+ details: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16163
+ BildDetails,
15816
16164
  {
15817
- src: `data:${phase.value.mime_type};base64,${phase.value.data}`,
15818
- alt: `Ausgabebild ${bild.media_ref}, Position ${bild.position}`
16165
+ bild,
16166
+ fehler: fehler4.get(bild.media_ref) ?? null,
16167
+ aufloesbar
15819
16168
  }
15820
- ),
15821
- phase.status === "error" && // Verzeichnet, aber nicht lesbar ist etwas anderes als
15822
- // unbekannt — der Unterschied gehört sichtbar dran, nicht in
15823
- // ein stilles Weglassen (A5).
15824
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("em", { "data-testid": `batchbild-fehler-${bild.media_ref}`, children: phase.message }),
15825
- !port.imageLibrary && // Capability-Grenze, kein Fehler: Dieser Host kann Batches
15826
- // lesen, aber keine Bilder auflösen (E). Kein erfundener
15827
- // Fallback auf eine Serverroute (A6).
15828
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("em", { "data-testid": `batchbild-unsupported-${bild.media_ref}`, children: "Dieser Host l\xF6st keine Bilder auf \u2014 nur die Metadaten sind bekannt." }),
15829
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { children: bild.media_ref }),
15830
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { children: [
15831
- "Position ",
15832
- bild.position
15833
- ] }),
15834
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { children: bild.model || "Modell unbekannt" }),
15835
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { children: bild.seed === null || bild.seed === void 0 || bild.seed === -1 ? "ohne Seed" : `Seed ${bild.seed}` }),
15836
- bild.width && bild.height ? /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { children: [
15837
- bild.width,
15838
- "\xD7",
15839
- bild.height
15840
- ] }) : null
15841
- ] });
15842
- };
15843
- var BatchKachel = ({ port, batch }) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
15844
- "div",
15845
- {
15846
- className: "szenen-bilder__batch",
15847
- "data-testid": `batch-${batch.item_id}`,
15848
- "data-source-kind": batch.source_kind,
15849
- children: [
15850
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { className: "szenen-bilder__ids", children: [
15851
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("strong", { children: batch.title }),
15852
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { children: batch.source_kind === "generated_in_app" ? "in der App erzeugt" : "extern importiert" }),
15853
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { children: [
15854
- "Item ",
15855
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { "data-testid": `batch-item-${batch.item_id}`, children: batch.item_id })
16169
+ )
16170
+ }));
16171
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
16172
+ "section",
16173
+ {
16174
+ className: "szenen-bilder__batch",
16175
+ "data-testid": `batch-${batch.item_id}`,
16176
+ "data-source-kind": batch.source_kind,
16177
+ children: [
16178
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("header", { className: "szenen-bilder__batchkopf", children: [
16179
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("strong", { children: batch.title }),
16180
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { className: "szenen-bilder__herkunft", children: [
16181
+ batch.source_kind === "generated_in_app" ? "in der App erzeugt" : "extern importiert",
16182
+ " \xB7 ",
16183
+ batch.images.length,
16184
+ " Bild(er)"
16185
+ ] })
15856
16186
  ] }),
15857
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { children: [
15858
- "Batches ",
15859
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { children: batch.generation_batch_ids.join(", ") })
16187
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16188
+ BildGalerie,
16189
+ {
16190
+ bilder,
16191
+ testId: `batchgalerie-${batch.item_id}`,
16192
+ satzTitel: batch.title
16193
+ }
16194
+ ),
16195
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("details", { className: "szenen-bilder__technik", "data-testid": `batch-technik-${batch.item_id}`, children: [
16196
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("summary", { children: "Technische Details" }),
16197
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { className: "szenen-bilder__ids", children: [
16198
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
16199
+ "Item ",
16200
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { "data-testid": `batch-item-${batch.item_id}`, children: batch.item_id })
16201
+ ] }),
16202
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
16203
+ "Batches ",
16204
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { children: batch.generation_batch_ids.join(", ") })
16205
+ ] })
16206
+ ] }),
16207
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("ul", { className: "szenen-bilder__batchliste", children: batch.images.map((bild) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16208
+ BildDetails,
16209
+ {
16210
+ bild,
16211
+ fehler: fehler4.get(bild.media_ref) ?? null,
16212
+ aufloesbar
16213
+ }
16214
+ ) }, bild.media_ref)) })
15860
16215
  ] })
15861
- ] }),
15862
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("ul", { className: "szenen-bilder__batchliste", children: batch.images.map((bild) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(BatchBild, { port, bild }, bild.media_ref)) })
15863
- ]
15864
- }
15865
- );
16216
+ ]
16217
+ }
16218
+ );
16219
+ };
15866
16220
  var ProfilBefunde = ({ wahl, runId }) => {
15867
16221
  if (wahl.invalid_profiles.length === 0) return null;
15868
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { "data-testid": `erzeugen-profilbefunde-${runId}`, role: "alert", children: [
16222
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { "data-testid": `erzeugen-profilbefunde-${runId}`, role: "alert", children: [
15869
16223
  "Nicht angeboten, weil das Profil unvollst\xE4ndig ist:",
15870
16224
  " ",
15871
16225
  wahl.invalid_profiles.join(" \xB7 ")
15872
16226
  ] });
15873
16227
  };
15874
16228
  var ErzeugenAktion = ({ port, lauf, wahl, wahlFehler, onFertig }) => {
15875
- const [modellWahl, setModellWahl] = (0, import_react7.useState)(null);
15876
- const [anzahlText, setAnzahlText] = (0, import_react7.useState)("1");
15877
- const [seitenverhaeltnis, setSeitenverhaeltnis] = (0, import_react7.useState)("");
15878
- const [laeuft, setLaeuft] = (0, import_react7.useState)(false);
15879
- const [notiz, setNotiz] = (0, import_react7.useState)(null);
16229
+ const [modellWahl, setModellWahl] = (0, import_react8.useState)(null);
16230
+ const [anzahlText, setAnzahlText] = (0, import_react8.useState)("1");
16231
+ const [seitenverhaeltnis, setSeitenverhaeltnis] = (0, import_react8.useState)("");
16232
+ const [laeuft, setLaeuft] = (0, import_react8.useState)(false);
16233
+ const [notiz, setNotiz] = (0, import_react8.useState)(null);
15880
16234
  if (!port.imageGeneration) {
15881
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { "data-testid": `erzeugen-unsupported-${lauf.run_id}`, children: "Dieser Host erzeugt keine Bilder \u2014 entweder fehlt der Providerzugang oder der gesicherte Speicherweg. Externe Bilder lassen sich trotzdem zuordnen." });
16235
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { "data-testid": `erzeugen-unsupported-${lauf.run_id}`, children: "Dieser Host erzeugt keine Bilder \u2014 entweder fehlt der Providerzugang oder der gesicherte Speicherweg. Externe Bilder lassen sich trotzdem zuordnen." });
15882
16236
  }
15883
16237
  if (wahlFehler) {
15884
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { "data-testid": `erzeugen-fehler-${lauf.run_id}`, role: "alert", children: [
16238
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { "data-testid": `erzeugen-fehler-${lauf.run_id}`, role: "alert", children: [
15885
16239
  "Die F\xE4higkeitsauskunft schlug fehl: ",
15886
16240
  wahlFehler
15887
16241
  ] });
15888
16242
  }
15889
- if (!wahl) return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { children: "Bildf\xE4higkeit wird gepr\xFCft \u2026" });
16243
+ if (!wahl) return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { children: "Bildf\xE4higkeit wird gepr\xFCft \u2026" });
15890
16244
  if (wahl.models.length === 0) {
15891
16245
  return (
15892
16246
  // Kein Fehler und kein Grund, den Lauf zu sperren: Der externe
15893
16247
  // Importweg bleibt daneben stehen (D-104.5).
15894
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
15895
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { "data-testid": `erzeugen-unsupported-modell-${lauf.run_id}`, children: [
16248
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
16249
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { "data-testid": `erzeugen-unsupported-modell-${lauf.run_id}`, children: [
15896
16250
  "Hier kann derzeit kein Bild erzeugt werden:",
15897
16251
  " ",
15898
16252
  wahl.reason ?? "Kein sichtbares Zielmodell tr\xE4gt ein ausf\xFChrbares Profil."
15899
16253
  ] }),
15900
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ProfilBefunde, { wahl, runId: lauf.run_id })
16254
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ProfilBefunde, { wahl, runId: lauf.run_id })
15901
16255
  ] })
15902
16256
  );
15903
16257
  }
@@ -15946,22 +16300,21 @@ var ErzeugenAktion = ({ port, lauf, wahl, wahlFehler, onFertig }) => {
15946
16300
  onFertig();
15947
16301
  };
15948
16302
  const negativVorhanden = Boolean(lauf.output?.negative && lauf.output.negative.trim());
15949
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "szenen-bilder__aktion", "data-testid": `erzeugen-${lauf.run_id}`, children: [
15950
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h5", { children: "Bilder aus diesem Prompt erzeugen" }),
15951
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ProfilBefunde, { wahl, runId: lauf.run_id }),
15952
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { "data-testid": `erzeugen-zielmodell-${lauf.run_id}`, children: wahl.prompt_target_model_key ? /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
16303
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "szenen-bilder__aktion-inhalt", "data-testid": `erzeugen-${lauf.run_id}`, children: [
16304
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ProfilBefunde, { wahl, runId: lauf.run_id }),
16305
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { "data-testid": `erzeugen-zielmodell-${lauf.run_id}`, children: wahl.prompt_target_model_key ? /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
15953
16306
  "Prompt optimiert f\xFCr ",
15954
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { children: wahl.prompt_target_model_key })
16307
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { children: wahl.prompt_target_model_key })
15955
16308
  ] }) : "Dieser Lauf tr\xE4gt keine Optimierungsabsicht (kein target_model)." }),
15956
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("label", { children: [
16309
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("label", { children: [
15957
16310
  "Bildmodell",
15958
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16311
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
15959
16312
  "select",
15960
16313
  {
15961
16314
  value: aktiv.selection_id,
15962
16315
  "data-testid": `erzeugen-modellwahl-${lauf.run_id}`,
15963
16316
  onChange: (e) => modellWechseln(e.target.value),
15964
- children: wahl.models.map((m) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("option", { value: m.selection_id, children: [
16317
+ children: wahl.models.map((m) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("option", { value: m.selection_id, children: [
15965
16318
  m.display_name,
15966
16319
  " (",
15967
16320
  m.provider,
@@ -15971,7 +16324,7 @@ var ErzeugenAktion = ({ port, lauf, wahl, wahlFehler, onFertig }) => {
15971
16324
  }
15972
16325
  )
15973
16326
  ] }),
15974
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { "data-testid": `erzeugen-modell-${lauf.run_id}`, children: [
16327
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { "data-testid": `erzeugen-modell-${lauf.run_id}`, children: [
15975
16328
  aktiv.display_name,
15976
16329
  " bei ",
15977
16330
  aktiv.provider,
@@ -15980,26 +16333,26 @@ var ErzeugenAktion = ({ port, lauf, wahl, wahlFehler, onFertig }) => {
15980
16333
  aktiv.max_images,
15981
16334
  " Bilder je Auftrag"
15982
16335
  ] }),
15983
- wahl.prompt_target_model_key && !aktiv.is_prompt_target && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { "data-testid": `erzeugen-abweichung-${lauf.run_id}`, children: [
16336
+ wahl.prompt_target_model_key && !aktiv.is_prompt_target && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { "data-testid": `erzeugen-abweichung-${lauf.run_id}`, children: [
15984
16337
  "Hinweis: Prompt optimiert f\xFCr ",
15985
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { children: wahl.prompt_target_model_key }),
16338
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { children: wahl.prompt_target_model_key }),
15986
16339
  ", Bilder werden mit ",
15987
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { children: aktiv.display_name }),
16340
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { children: aktiv.display_name }),
15988
16341
  " erzeugt. Das ist zul\xE4ssig \u2014 ein abweichendes Ergebnis liegt dann nicht zwingend am Prompt."
15989
16342
  ] }),
15990
16343
  negativVorhanden && !aktiv.accepts_negative_prompt && // Nicht still verlieren: Der eingefrorene Lauf trägt einen
15991
16344
  // negativen Prompt, den dieser Modellweg nicht führt. Wer das
15992
16345
  // weiß, kann ihn in den positiven Prompt einarbeiten — wer es
15993
16346
  // nicht weiß, wundert sich über das Bild.
15994
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { "data-testid": `erzeugen-negativ-hinweis-${lauf.run_id}`, children: [
16347
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { "data-testid": `erzeugen-negativ-hinweis-${lauf.run_id}`, children: [
15995
16348
  "Achtung: Dieser Lauf tr\xE4gt einen negativen Prompt.",
15996
16349
  " ",
15997
16350
  aktiv.display_name,
15998
16351
  " f\xFChrt diesen Promptkanal nicht \u2014 der negative Prompt l\xE4uft nicht mit."
15999
16352
  ] }),
16000
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("label", { children: [
16353
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("label", { children: [
16001
16354
  "Anzahl",
16002
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16355
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16003
16356
  "input",
16004
16357
  {
16005
16358
  type: "number",
@@ -16011,27 +16364,27 @@ var ErzeugenAktion = ({ port, lauf, wahl, wahlFehler, onFertig }) => {
16011
16364
  }
16012
16365
  )
16013
16366
  ] }),
16014
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("label", { children: [
16367
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("label", { children: [
16015
16368
  "Seitenverh\xE4ltnis",
16016
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
16369
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
16017
16370
  "select",
16018
16371
  {
16019
16372
  value: seitenverhaeltnis,
16020
16373
  "data-testid": `erzeugen-format-${lauf.run_id}`,
16021
16374
  onChange: (e) => setSeitenverhaeltnis(e.target.value),
16022
16375
  children: [
16023
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("option", { value: "", children: "(Vorgabe des Modells)" }),
16024
- aktiv.aspect_ratios.map((v) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("option", { value: v, children: v }, v))
16376
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "", children: "(Vorgabe des Modells)" }),
16377
+ aktiv.aspect_ratios.map((v) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: v, children: v }, v))
16025
16378
  ]
16026
16379
  }
16027
16380
  )
16028
16381
  ] }),
16029
- !aktiv.accepts_seed && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { "data-testid": `erzeugen-ohne-seed-${lauf.run_id}`, children: [
16382
+ !aktiv.accepts_seed && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { "data-testid": `erzeugen-ohne-seed-${lauf.run_id}`, children: [
16030
16383
  aktiv.display_name,
16031
16384
  " kennt keinen Seed \u2014 er wird deshalb weder angeboten noch protokolliert."
16032
16385
  ] }),
16033
- parameterBefunde.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { "data-testid": `erzeugen-parameterbefund-${lauf.run_id}`, role: "alert", children: parameterBefunde.join(" ") }),
16034
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16386
+ parameterBefunde.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { "data-testid": `erzeugen-parameterbefund-${lauf.run_id}`, role: "alert", children: parameterBefunde.join(" ") }),
16387
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16035
16388
  "button",
16036
16389
  {
16037
16390
  type: "button",
@@ -16041,7 +16394,7 @@ var ErzeugenAktion = ({ port, lauf, wahl, wahlFehler, onFertig }) => {
16041
16394
  children: laeuft ? "Bilder werden erzeugt \u2026" : "Bilder erzeugen"
16042
16395
  }
16043
16396
  ),
16044
- notiz && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16397
+ notiz && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16045
16398
  "p",
16046
16399
  {
16047
16400
  "data-testid": `erzeugen-notiz-${lauf.run_id}`,
@@ -16053,14 +16406,14 @@ var ErzeugenAktion = ({ port, lauf, wahl, wahlFehler, onFertig }) => {
16053
16406
  ] });
16054
16407
  };
16055
16408
  var ZuordnenAktion = ({ port, lauf, onFertig }) => {
16056
- const [dateien, setDateien] = (0, import_react7.useState)([]);
16057
- const [seeds, setSeeds] = (0, import_react7.useState)({});
16058
- const [modell, setModell] = (0, import_react7.useState)("");
16059
- const [itemId, setItemId] = (0, import_react7.useState)("");
16060
- const [laeuft, setLaeuft] = (0, import_react7.useState)(false);
16061
- const [notiz, setNotiz] = (0, import_react7.useState)(null);
16409
+ const [dateien, setDateien] = (0, import_react8.useState)([]);
16410
+ const [seeds, setSeeds] = (0, import_react8.useState)({});
16411
+ const [modell, setModell] = (0, import_react8.useState)("");
16412
+ const [itemId, setItemId] = (0, import_react8.useState)("");
16413
+ const [laeuft, setLaeuft] = (0, import_react8.useState)(false);
16414
+ const [notiz, setNotiz] = (0, import_react8.useState)(null);
16062
16415
  if (!port.imageBatchWrite) {
16063
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { "data-testid": `zuordnen-unsupported-${lauf.run_id}`, children: "Dieser Host ordnet keine externen Bilder zu \u2014 er hat keinen gesicherten Batch-Schreibweg. Die Historie oben bleibt trotzdem sichtbar." });
16416
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { "data-testid": `zuordnen-unsupported-${lauf.run_id}`, children: "Dieser Host ordnet keine externen Bilder zu \u2014 er hat keinen gesicherten Batch-Schreibweg. Die Historie oben bleibt trotzdem sichtbar." });
16064
16417
  }
16065
16418
  const importieren = async () => {
16066
16419
  setLaeuft(true);
@@ -16115,11 +16468,10 @@ var ZuordnenAktion = ({ port, lauf, onFertig }) => {
16115
16468
  setLaeuft(false);
16116
16469
  onFertig();
16117
16470
  };
16118
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "szenen-bilder__aktion", "data-testid": `zuordnen-${lauf.run_id}`, children: [
16119
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h5", { children: "Externe Bilder diesem Lauf zuordnen" }),
16120
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("label", { children: [
16471
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "szenen-bilder__aktion-inhalt", "data-testid": `zuordnen-${lauf.run_id}`, children: [
16472
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("label", { children: [
16121
16473
  "Bilddateien",
16122
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16474
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16123
16475
  "input",
16124
16476
  {
16125
16477
  type: "file",
@@ -16133,10 +16485,10 @@ var ZuordnenAktion = ({ port, lauf, onFertig }) => {
16133
16485
  }
16134
16486
  )
16135
16487
  ] }),
16136
- dateien.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
16137
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("label", { children: [
16488
+ dateien.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
16489
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("label", { children: [
16138
16490
  "Modell (f\xFCr alle Bilder, leer = unbekannt)",
16139
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16491
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16140
16492
  "input",
16141
16493
  {
16142
16494
  value: modell,
@@ -16145,16 +16497,16 @@ var ZuordnenAktion = ({ port, lauf, onFertig }) => {
16145
16497
  }
16146
16498
  )
16147
16499
  ] }),
16148
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("ol", { "data-testid": `zuordnen-vorschau-${lauf.run_id}`, children: dateien.map((datei, index) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("li", { children: [
16149
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { children: [
16500
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("ol", { "data-testid": `zuordnen-vorschau-${lauf.run_id}`, children: dateien.map((datei, index) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("li", { children: [
16501
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
16150
16502
  "Position ",
16151
16503
  index,
16152
16504
  ": ",
16153
16505
  datei.name
16154
16506
  ] }),
16155
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("label", { children: [
16507
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("label", { children: [
16156
16508
  "Seed (leer = unbekannt)",
16157
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16509
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16158
16510
  "input",
16159
16511
  {
16160
16512
  "data-testid": `zuordnen-seed-${lauf.run_id}-${index}`,
@@ -16164,7 +16516,7 @@ var ZuordnenAktion = ({ port, lauf, onFertig }) => {
16164
16516
  )
16165
16517
  ] })
16166
16518
  ] }, `${datei.name}-${index}`)) }),
16167
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
16519
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
16168
16520
  "button",
16169
16521
  {
16170
16522
  type: "button",
@@ -16178,9 +16530,9 @@ var ZuordnenAktion = ({ port, lauf, onFertig }) => {
16178
16530
  }
16179
16531
  )
16180
16532
  ] }),
16181
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("label", { children: [
16533
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("label", { children: [
16182
16534
  "Oder ein bestehendes Library-Item",
16183
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16535
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16184
16536
  "input",
16185
16537
  {
16186
16538
  value: itemId,
@@ -16190,7 +16542,7 @@ var ZuordnenAktion = ({ port, lauf, onFertig }) => {
16190
16542
  }
16191
16543
  )
16192
16544
  ] }),
16193
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16545
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16194
16546
  "button",
16195
16547
  {
16196
16548
  type: "button",
@@ -16200,7 +16552,7 @@ var ZuordnenAktion = ({ port, lauf, onFertig }) => {
16200
16552
  children: "Bestehendes Item zuordnen"
16201
16553
  }
16202
16554
  ),
16203
- notiz && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16555
+ notiz && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16204
16556
  "p",
16205
16557
  {
16206
16558
  "data-testid": `zuordnen-notiz-${lauf.run_id}`,
@@ -16225,12 +16577,12 @@ function readAsBase64(datei) {
16225
16577
  }
16226
16578
 
16227
16579
  // src/features/szenen/areas/RunsPanel.tsx
16228
- var import_jsx_runtime8 = require("react/jsx-runtime");
16580
+ var import_jsx_runtime9 = require("react/jsx-runtime");
16229
16581
  var RunsPanel = ({ port, source, contextId }) => {
16230
- const [anweisung, setAnweisung] = (0, import_react8.useState)("");
16231
- const [laeuft, setLaeuft] = (0, import_react8.useState)(false);
16232
- const [notiz, setNotiz] = (0, import_react8.useState)(null);
16233
- const [nachladen, setNachladen] = (0, import_react8.useState)(0);
16582
+ const [anweisung, setAnweisung] = (0, import_react9.useState)("");
16583
+ const [laeuft, setLaeuft] = (0, import_react9.useState)(false);
16584
+ const [notiz, setNotiz] = (0, import_react9.useState)(null);
16585
+ const [nachladen, setNachladen] = (0, import_react9.useState)(0);
16234
16586
  const faehig = capabilitiesOf(port);
16235
16587
  const quellSchluessel = source.kind === "published" ? source.shotVersionId : source.kind === "draft_chain" ? source.chainId : source.sceneElementId;
16236
16588
  const [phase, neuLaden] = usePortQuery(
@@ -16255,12 +16607,15 @@ var RunsPanel = ({ port, source, contextId }) => {
16255
16607
  neuLaden();
16256
16608
  };
16257
16609
  const laeufe = phase.status === "ready" ? phase.value : [];
16258
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "szenen-runs", "data-testid": "laeufe-bereich", "data-shot-version": quellSchluessel, children: [
16259
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h4", { children: "Prompt-L\xE4ufe" }),
16260
- source.kind === "published" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "szenen-runs__start", children: [
16261
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("label", { children: [
16610
+ const [gewaehlteRunde, setGewaehlteRunde] = (0, import_react9.useState)(void 0);
16611
+ const neueste = laeufe.length > 0 ? laeufe[laeufe.length - 1].run_id : null;
16612
+ const offeneRunde = gewaehlteRunde === void 0 ? neueste : gewaehlteRunde;
16613
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "szenen-runs", "data-testid": "laeufe-bereich", "data-shot-version": quellSchluessel, children: [
16614
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h4", { children: "Prompt-L\xE4ufe" }),
16615
+ source.kind === "published" && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "szenen-runs__start", children: [
16616
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("label", { children: [
16262
16617
  "Anweisung (optional)",
16263
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16618
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
16264
16619
  "input",
16265
16620
  {
16266
16621
  "data-testid": "lauf-anweisung",
@@ -16269,21 +16624,25 @@ var RunsPanel = ({ port, source, contextId }) => {
16269
16624
  }
16270
16625
  )
16271
16626
  ] }),
16272
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { type: "button", "data-testid": "lauf-starten", disabled: laeuft, onClick: starten, children: "Prompt-Lauf starten" })
16627
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", "data-testid": "lauf-starten", disabled: laeuft, onClick: starten, children: "Prompt-Lauf starten" })
16273
16628
  ] }),
16274
- notiz && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { "data-testid": "lauf-notiz", "data-tone": notiz.tone, role: notiz.tone === "error" ? "alert" : "status", children: notiz.text }),
16275
- phase.status === "loading" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { "data-testid": "laeufe-laden", children: "L\xE4ufe werden geladen \u2026" }),
16276
- phase.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { "data-testid": "laeufe-fehler", role: "alert", children: [
16629
+ notiz && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { "data-testid": "lauf-notiz", "data-tone": notiz.tone, role: notiz.tone === "error" ? "alert" : "status", children: notiz.text }),
16630
+ phase.status === "loading" && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { "data-testid": "laeufe-laden", children: "L\xE4ufe werden geladen \u2026" }),
16631
+ phase.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { "data-testid": "laeufe-fehler", role: "alert", children: [
16277
16632
  "L\xE4ufe konnten nicht geladen werden: ",
16278
16633
  phase.message
16279
16634
  ] }),
16280
- phase.status === "ready" && laeufe.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { "data-testid": "keine-laeufe", children: source.kind === "published" ? "F\xFCr diese Shot-Version gibt es noch keinen Lauf." : source.kind === "draft_chain" ? "F\xFCr diese Draft-Kette gibt es noch keinen Lauf." : "F\xFCr diese Szene gibt es noch keinen direkten Lauf." }),
16281
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("ol", { "data-testid": "runden-liste", children: laeufe.map((lauf) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16635
+ phase.status === "ready" && laeufe.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { "data-testid": "keine-laeufe", children: source.kind === "published" ? "F\xFCr diese Shot-Version gibt es noch keinen Lauf." : source.kind === "draft_chain" ? "F\xFCr diese Draft-Kette gibt es noch keinen Lauf." : "F\xFCr diese Szene gibt es noch keinen direkten Lauf." }),
16636
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("ol", { "data-testid": "runden-liste", children: laeufe.map((lauf) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
16282
16637
  RundenEintrag,
16283
16638
  {
16284
16639
  port,
16285
16640
  lauf,
16286
16641
  runde: roundOfRun(lauf, laeufe),
16642
+ offen: lauf.run_id === offeneRunde,
16643
+ onUmschalten: () => setGewaehlteRunde(
16644
+ lauf.run_id === offeneRunde ? null : lauf.run_id
16645
+ ),
16287
16646
  itemMoeglich: faehig.saveRunAsItem,
16288
16647
  onItemGespeichert: () => setNachladen((n) => n + 1)
16289
16648
  },
@@ -16291,13 +16650,43 @@ var RunsPanel = ({ port, source, contextId }) => {
16291
16650
  )) })
16292
16651
  ] });
16293
16652
  };
16294
- var RundenEintrag = ({ port, lauf, runde, itemMoeglich, onItemGespeichert }) => {
16295
- const [notiz, setNotiz] = (0, import_react8.useState)(null);
16296
- const [laeuft, setLaeuft] = (0, import_react8.useState)(false);
16297
- const [nachladen, setNachladen] = (0, import_react8.useState)(0);
16653
+ var AUSZUG = 90;
16654
+ function auszug(text, laenge = AUSZUG) {
16655
+ const sauber = text.replace(/\s+/g, " ").trim();
16656
+ if (sauber.length <= laenge) return sauber;
16657
+ const schnitt = sauber.lastIndexOf(" ", laenge);
16658
+ return `${sauber.slice(0, schnitt > laenge / 2 ? schnitt : laenge)} \u2026`;
16659
+ }
16660
+ var STATUS_TEXT = {
16661
+ succeeded: "erfolgreich",
16662
+ failed: "fehlgeschlagen"
16663
+ };
16664
+ var LANGER_TEXT = 240;
16665
+ var Sekundaertext = ({ titel, text, testId }) => {
16666
+ const [ganz, setGanz] = (0, import_react9.useState)(false);
16667
+ const lang = text.length > LANGER_TEXT;
16668
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("section", { className: "szenen-runs__sekundaer", children: [
16669
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h5", { children: titel }),
16670
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { "data-testid": testId, children: lang && !ganz ? auszug(text, LANGER_TEXT) : text }),
16671
+ lang && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
16672
+ "button",
16673
+ {
16674
+ type: "button",
16675
+ className: "szenen-runs__mehr",
16676
+ onClick: () => setGanz(!ganz),
16677
+ "data-testid": `${testId}-mehr`,
16678
+ children: ganz ? "weniger anzeigen" : "vollst\xE4ndig anzeigen"
16679
+ }
16680
+ )
16681
+ ] });
16682
+ };
16683
+ var RundenEintrag = ({ port, lauf, runde, offen, onUmschalten, itemMoeglich, onItemGespeichert }) => {
16684
+ const [notiz, setNotiz] = (0, import_react9.useState)(null);
16685
+ const [laeuft, setLaeuft] = (0, import_react9.useState)(false);
16686
+ const [nachladen, setNachladen] = (0, import_react9.useState)(0);
16298
16687
  const [itemPhase] = usePortQuery(
16299
- () => port.items ? port.items.getItemForRun(lauf.run_id) : Promise.resolve({ kind: "ok", value: null }),
16300
- [port, lauf.run_id, nachladen]
16688
+ () => offen && port.items ? port.items.getItemForRun(lauf.run_id) : Promise.resolve({ kind: "ok", value: null }),
16689
+ [port, lauf.run_id, nachladen, offen]
16301
16690
  );
16302
16691
  const item = itemPhase.status === "ready" ? itemPhase.value : null;
16303
16692
  const speichern = async () => {
@@ -16311,75 +16700,121 @@ var RundenEintrag = ({ port, lauf, runde, itemMoeglich, onItemGespeichert }) =>
16311
16700
  setNachladen((n) => n + 1);
16312
16701
  onItemGespeichert();
16313
16702
  };
16314
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("li", { "data-testid": `runde-${lauf.run_id}`, "data-runde": runde, "data-status": lauf.status, children: [
16315
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("header", { children: [
16316
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("strong", { children: [
16317
- "Runde ",
16318
- runde
16703
+ const zusammenfassung = lauf.status === "succeeded" && lauf.output ? auszug(lauf.output.positive) : null;
16704
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("li", { "data-testid": `runde-${lauf.run_id}`, "data-runde": runde, "data-status": lauf.status, children: [
16705
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
16706
+ "button",
16707
+ {
16708
+ type: "button",
16709
+ className: "szenen-runs__kopf",
16710
+ onClick: onUmschalten,
16711
+ "aria-expanded": offen,
16712
+ "data-testid": `runde-umschalten-${lauf.run_id}`,
16713
+ children: [
16714
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { className: "szenen-runs__marke", children: [
16715
+ "Runde ",
16716
+ runde
16717
+ ] }),
16718
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
16719
+ "span",
16720
+ {
16721
+ className: "szenen-runs__status",
16722
+ "data-status": lauf.status,
16723
+ "data-testid": `status-${lauf.run_id}`,
16724
+ children: STATUS_TEXT[lauf.status]
16725
+ }
16726
+ ),
16727
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { className: "szenen-runs__modell", "data-testid": `provider-${lauf.run_id}`, children: [
16728
+ lauf.provider,
16729
+ " \xB7 ",
16730
+ lauf.model_id
16731
+ ] }),
16732
+ zusammenfassung && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
16733
+ "span",
16734
+ {
16735
+ className: "szenen-runs__auszug",
16736
+ "data-testid": `auszug-${lauf.run_id}`,
16737
+ children: zusammenfassung
16738
+ }
16739
+ )
16740
+ ]
16741
+ }
16742
+ ),
16743
+ lauf.status === "failed" && lauf.failure && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "szenen-runs__fehler", "data-testid": `fehler-${lauf.run_id}`, role: "alert", children: [
16744
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("strong", { children: [
16745
+ "Fehlgeschlagen \u2014 ",
16746
+ lauf.failure.class
16319
16747
  ] }),
16320
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { children: lauf.run_id }),
16321
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { "data-testid": `status-${lauf.run_id}`, children: lauf.status }),
16322
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { "data-testid": `provider-${lauf.run_id}`, children: [
16323
- lauf.provider,
16324
- " \xB7 ",
16325
- lauf.model_id
16326
- ] })
16748
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { children: lauf.failure.message })
16327
16749
  ] }),
16328
- lauf.status === "succeeded" && lauf.output && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { "data-testid": `ausgabe-${lauf.run_id}`, children: [
16329
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("section", { children: [
16330
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h5", { children: "Positiver Prompt" }),
16331
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { "data-testid": `positiv-${lauf.run_id}`, children: lauf.output.positive })
16332
- ] }),
16333
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("section", { children: [
16334
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h5", { children: "Negativer Prompt" }),
16335
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { "data-testid": `negativ-${lauf.run_id}`, children: lauf.output.negative ?? "(keiner)" })
16750
+ offen && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "szenen-runs__inhalt", "data-testid": `runde-inhalt-${lauf.run_id}`, children: [
16751
+ lauf.status === "succeeded" && lauf.output && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { "data-testid": `ausgabe-${lauf.run_id}`, children: [
16752
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("section", { className: "szenen-runs__prompt", children: [
16753
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h5", { children: "Positiver Prompt" }),
16754
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { "data-testid": `positiv-${lauf.run_id}`, children: lauf.output.positive })
16755
+ ] }),
16756
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("section", { className: "szenen-runs__prompt szenen-runs__prompt--negativ", children: [
16757
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h5", { children: "Negativer Prompt" }),
16758
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { "data-testid": `negativ-${lauf.run_id}`, children: lauf.output.negative ?? "(keiner)" })
16759
+ ] }),
16760
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
16761
+ Sekundaertext,
16762
+ {
16763
+ titel: "Erl\xE4uterung",
16764
+ text: lauf.output.feedback,
16765
+ testId: `feedback-${lauf.run_id}`
16766
+ }
16767
+ ),
16768
+ lauf.output.visibility.assumptions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("section", { className: "szenen-runs__sekundaer", children: [
16769
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h5", { children: "Annahmen" }),
16770
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("ul", { "data-testid": `annahmen-${lauf.run_id}`, children: lauf.output.visibility.assumptions.map((a, i) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("li", { children: a }, i)) })
16771
+ ] }),
16772
+ lauf.output.notes.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("ul", { className: "szenen-runs__notizen", "data-testid": `notizen-${lauf.run_id}`, children: lauf.output.notes.map((n, i) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("li", { children: n }, i)) })
16336
16773
  ] }),
16337
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("section", { children: [
16338
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h5", { children: "Erl\xE4uterung" }),
16339
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { "data-testid": `feedback-${lauf.run_id}`, children: lauf.output.feedback })
16774
+ lauf.raw_output && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("details", { "data-testid": `diagnose-${lauf.run_id}`, children: [
16775
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("summary", { children: "Rohantwort (Diagnose)" }),
16776
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("pre", { children: lauf.raw_output })
16340
16777
  ] }),
16341
- lauf.output.visibility.assumptions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("section", { children: [
16342
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h5", { children: "Annahmen" }),
16343
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("ul", { "data-testid": `annahmen-${lauf.run_id}`, children: lauf.output.visibility.assumptions.map((a, i) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("li", { children: a }, i)) })
16778
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("details", { className: "szenen-runs__technisch", "data-testid": `technisch-${lauf.run_id}`, children: [
16779
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("summary", { children: "Technische Informationen" }),
16780
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { children: [
16781
+ "Lauf-ID: ",
16782
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("code", { "data-testid": `run-id-${lauf.run_id}`, children: lauf.run_id })
16783
+ ] }),
16784
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { children: [
16785
+ "Modell: ",
16786
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("code", { children: lauf.model_id }),
16787
+ " bei ",
16788
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("code", { children: lauf.provider })
16789
+ ] }),
16790
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { children: [
16791
+ "erzeugt: ",
16792
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("code", { children: lauf.created_at })
16793
+ ] })
16344
16794
  ] }),
16345
- lauf.output.notes.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("ul", { "data-testid": `notizen-${lauf.run_id}`, children: lauf.output.notes.map((n, i) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("li", { children: n }, i)) })
16346
- ] }),
16347
- lauf.status === "failed" && lauf.failure && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { "data-testid": `fehler-${lauf.run_id}`, role: "alert", children: [
16348
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("h5", { children: [
16349
- "Fehlgeschlagen \u2014 ",
16350
- lauf.failure.class
16795
+ lauf.status === "succeeded" && itemMoeglich && !item && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", "data-testid": `als-item-${lauf.run_id}`, disabled: laeuft, onClick: speichern, children: "als Item speichern" }),
16796
+ item && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { "data-testid": `item-${lauf.run_id}`, children: [
16797
+ "Bereits als Item gespeichert: ",
16798
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("code", { children: item.itemId })
16351
16799
  ] }),
16352
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { children: lauf.failure.message })
16353
- ] }),
16354
- lauf.raw_output && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("details", { "data-testid": `diagnose-${lauf.run_id}`, children: [
16355
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("summary", { children: "Rohantwort (Diagnose)" }),
16356
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("pre", { children: lauf.raw_output })
16357
- ] }),
16358
- lauf.status === "succeeded" && itemMoeglich && !item && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { type: "button", "data-testid": `als-item-${lauf.run_id}`, disabled: laeuft, onClick: speichern, children: "als Item speichern" }),
16359
- item && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { "data-testid": `item-${lauf.run_id}`, children: [
16360
- "Bereits als Item gespeichert: ",
16361
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { children: item.itemId })
16362
- ] }),
16363
- lauf.status === "succeeded" && !itemMoeglich && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { "data-testid": `item-unsupported-${lauf.run_id}`, children: "Dieser Host speichert keine Runden als Item. Das ist kein Fehler und kein vor\xFCbergehender Zustand." }),
16364
- notiz && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { "data-testid": `item-notiz-${lauf.run_id}`, "data-tone": notiz.tone, children: notiz.text }),
16365
- lauf.status === "succeeded" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("details", { "data-testid": `bilder-bereich-${lauf.run_id}`, children: [
16366
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("summary", { children: "Bilder zu diesem Lauf" }),
16367
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(RunImagesPanel, { port, lauf })
16800
+ lauf.status === "succeeded" && !itemMoeglich && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { "data-testid": `item-unsupported-${lauf.run_id}`, children: "Dieser Host speichert keine Runden als Item. Das ist kein Fehler und kein vor\xFCbergehender Zustand." }),
16801
+ notiz && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { "data-testid": `item-notiz-${lauf.run_id}`, "data-tone": notiz.tone, children: notiz.text }),
16802
+ lauf.status === "succeeded" && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(RunImagesPanel, { port, lauf })
16368
16803
  ] })
16369
16804
  ] });
16370
16805
  };
16371
16806
 
16372
16807
  // src/features/szenen/areas/ElementDetail.tsx
16373
- var import_jsx_runtime9 = require("react/jsx-runtime");
16808
+ var import_jsx_runtime10 = require("react/jsx-runtime");
16374
16809
  var STRUKTURELL_BEDIENT = {
16375
16810
  scene: ["nodes", "relations"]
16376
16811
  };
16377
16812
  var AbgeleitetesBildmodell = ({ schluessel }) => {
16378
16813
  if (!schluessel) return null;
16379
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("section", { className: "szenen-detail__derived", "data-testid": "abgeleitetes-bildmodell", children: [
16380
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h4", { children: "Bildgenerierung \u2014 wo das Modell entschieden wird" }),
16381
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { "data-testid": "bildmodell-hinweis", children: [
16382
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("code", { children: schluessel }),
16814
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("section", { className: "szenen-detail__derived", "data-testid": "abgeleitetes-bildmodell", children: [
16815
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h4", { children: "Bildgenerierung \u2014 wo das Modell entschieden wird" }),
16816
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("p", { "data-testid": "bildmodell-hinweis", children: [
16817
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("code", { children: schluessel }),
16383
16818
  " beschreibt, wof\xFCr dieser Prompt optimiert wird \u2014 nicht, mit welchem Bildmodell er ausgef\xFChrt wird. Welche Bildmodelle wirklich ausf\xFChrbar sind, ist Konfiguration der jeweiligen Umgebung und wird an der Bildaktion eines Laufs gew\xE4hlt (D-129)."
16384
16819
  ] })
16385
16820
  ] });
@@ -16391,43 +16826,43 @@ var ElementDetail = ({
16391
16826
  author,
16392
16827
  onChanged
16393
16828
  }) => {
16394
- const [nachladen, setNachladen] = (0, import_react9.useState)(0);
16829
+ const [nachladen, setNachladen] = (0, import_react10.useState)(0);
16395
16830
  const [phase] = usePortQuery(
16396
16831
  () => port.elements.getElement(elementId),
16397
16832
  [port, elementId, nachladen]
16398
16833
  );
16399
- const [entwurf, setEntwurf] = (0, import_react9.useState)({});
16400
- const [notiz, setNotiz] = (0, import_react9.useState)(null);
16401
- const [laeuft, setLaeuft] = (0, import_react9.useState)(false);
16402
- const [wahl, setWahl] = (0, import_react9.useState)(null);
16403
- const [basiswechsel, setBasiswechsel] = (0, import_react9.useState)(null);
16834
+ const [entwurf, setEntwurf] = (0, import_react10.useState)({});
16835
+ const [notiz, setNotiz] = (0, import_react10.useState)(null);
16836
+ const [laeuft, setLaeuft] = (0, import_react10.useState)(false);
16837
+ const [wahl, setWahl] = (0, import_react10.useState)(null);
16838
+ const [basiswechsel, setBasiswechsel] = (0, import_react10.useState)(null);
16404
16839
  const [kettenPhase] = usePortQuery(
16405
16840
  () => port.context.chainFor(contextId),
16406
16841
  [port, contextId]
16407
16842
  );
16408
- const kontextkette = (0, import_react9.useMemo)(() => {
16843
+ const kontextkette = (0, import_react10.useMemo)(() => {
16409
16844
  if (kettenPhase.status === "ready") return { status: "ready", chain: kettenPhase.value };
16410
16845
  if (kettenPhase.status === "error") return { status: "error", message: kettenPhase.message };
16411
16846
  return { status: "loading" };
16412
16847
  }, [kettenPhase]);
16413
16848
  const kette = kontextkette.status === "ready" ? kontextkette.chain : null;
16414
16849
  const schnappschuss = phase.status === "ready" ? phase.value : null;
16415
- const kopfErgebnis = (0, import_react9.useMemo)(
16850
+ const kopfErgebnis = (0, import_react10.useMemo)(
16416
16851
  () => schnappschuss && kette ? effectivePreferredHeadSafe(schnappschuss, kette) : null,
16417
16852
  [schnappschuss, kette]
16418
16853
  );
16419
16854
  const kopfAufloesung = resolutionOf(kopfErgebnis);
16420
16855
  const bevorzugteVersion = selectedHeadVersionId(kopfAufloesung);
16421
- const felder = (0, import_react9.useMemo)(
16856
+ const felder = (0, import_react10.useMemo)(
16422
16857
  () => schnappschuss ? fieldsForType(schnappschuss.element.type) : [],
16423
16858
  [schnappschuss?.element.type]
16424
16859
  );
16425
- (0, import_react9.useEffect)(() => {
16860
+ (0, import_react10.useEffect)(() => {
16426
16861
  setWahl(null);
16427
16862
  setBasiswechsel(null);
16428
16863
  setNotiz(null);
16429
16864
  }, [elementId]);
16430
- const automatisch = (0, import_react9.useMemo)(() => {
16865
+ const automatisch = (0, import_react10.useMemo)(() => {
16431
16866
  if (!schnappschuss) return { kind: "keiner" };
16432
16867
  if (schnappschuss.draft) return { kind: "draft" };
16433
16868
  if (bevorzugteVersion) return { kind: "version", versionId: bevorzugteVersion };
@@ -16437,14 +16872,14 @@ var ElementDetail = ({
16437
16872
  if (schnappschuss.versions.length === 0) return { kind: "draft" };
16438
16873
  return { kind: "keiner" };
16439
16874
  }, [schnappschuss, bevorzugteVersion]);
16440
- const angezeigt = (0, import_react9.useMemo)(() => {
16875
+ const angezeigt = (0, import_react10.useMemo)(() => {
16441
16876
  if (!wahl) return automatisch;
16442
16877
  if (wahl.kind === "version" && !schnappschuss?.versions.some((v) => v.version_id === wahl.versionId)) {
16443
16878
  return automatisch;
16444
16879
  }
16445
16880
  return wahl;
16446
16881
  }, [wahl, automatisch, schnappschuss]);
16447
- const angezeigtePayload = (0, import_react9.useMemo)(() => {
16882
+ const angezeigtePayload = (0, import_react10.useMemo)(() => {
16448
16883
  if (!schnappschuss) return {};
16449
16884
  if (angezeigt.kind === "draft") return schnappschuss.draft?.payload ?? {};
16450
16885
  if (angezeigt.kind === "version") {
@@ -16453,7 +16888,7 @@ var ElementDetail = ({
16453
16888
  return {};
16454
16889
  }, [schnappschuss, angezeigt]);
16455
16890
  const anzeigeSchluessel = angezeigt.kind === "version" ? `v:${angezeigt.versionId}` : angezeigt.kind;
16456
- (0, import_react9.useEffect)(() => {
16891
+ (0, import_react10.useEffect)(() => {
16457
16892
  if (!schnappschuss) return;
16458
16893
  setEntwurf(formFromPayload(felder, angezeigtePayload));
16459
16894
  }, [
@@ -16466,7 +16901,7 @@ var ElementDetail = ({
16466
16901
  const bearbeitbar = angezeigt.kind === "draft";
16467
16902
  const setzeFeld = (pfad, wert) => setEntwurf((vorher) => ({ ...vorher, [pfad]: wert }));
16468
16903
  const payloadAusFormular = () => payloadFromForm(felder, entwurf);
16469
- const strukturPayload = (0, import_react9.useMemo)(() => {
16904
+ const strukturPayload = (0, import_react10.useMemo)(() => {
16470
16905
  const lies = (name) => {
16471
16906
  try {
16472
16907
  const roh = JSON.parse(entwurf[name] || "[]");
@@ -16477,19 +16912,19 @@ var ElementDetail = ({
16477
16912
  };
16478
16913
  return { nodes: lies("nodes"), relations: lies("relations") };
16479
16914
  }, [entwurf.nodes, entwurf.relations]);
16480
- const kettenfeld = (0, import_react9.useMemo)(() => {
16915
+ const kettenfeld = (0, import_react10.useMemo)(() => {
16481
16916
  const kette2 = schnappschuss?.draft?.chain;
16482
16917
  if (!kette2) return null;
16483
16918
  return kette2.links[0]?.field ?? null;
16484
16919
  }, [schnappschuss?.draft?.chain]);
16485
- const laufStand = (0, import_react9.useMemo)(() => {
16920
+ const laufStand = (0, import_react10.useMemo)(() => {
16486
16921
  if (!schnappschuss || schnappschuss.element.type !== "scene") return null;
16487
16922
  if (schnappschuss.draft) return schnappschuss.draft.payload;
16488
16923
  const kopf = usableHeadVersionId(kopfAufloesung);
16489
16924
  if (!kopf) return null;
16490
16925
  return schnappschuss.versions.find((v) => v.version_id === kopf)?.payload ?? null;
16491
16926
  }, [schnappschuss, kopfAufloesung]);
16492
- const szenenBlocker = (0, import_react9.useMemo)(() => {
16927
+ const szenenBlocker = (0, import_react10.useMemo)(() => {
16493
16928
  if (!schnappschuss || schnappschuss.element.type !== "scene") return null;
16494
16929
  if (laufStand === null) {
16495
16930
  return schnappschuss.versions.length > 0 ? "Diese Szene hat keinen Entwurf und in diesem Kontext keinen bevorzugten Kopf. Welcher Stand gilt, entscheidet keine Reihenfolge (D-36) \u2014 bitte oben eine Version als bevorzugt setzen." : "Diese Szene hat noch keinen gespeicherten Stand. Ein Lauf friert ein, was gespeichert ist \u2014 bitte zuerst den Entwurf speichern.";
@@ -16499,7 +16934,7 @@ var ElementDetail = ({
16499
16934
  const grund = flag.reasons[0];
16500
16935
  return grund && "message" in grund ? grund.message : "Kein Lauf moeglich.";
16501
16936
  }, [schnappschuss, laufStand]);
16502
- const vorschau = (0, import_react9.useMemo)(() => {
16937
+ const vorschau = (0, import_react10.useMemo)(() => {
16503
16938
  if (!schnappschuss) return null;
16504
16939
  try {
16505
16940
  const roh = validatePayload(schnappschuss.element.type, payloadAusFormular());
@@ -16512,9 +16947,9 @@ var ElementDetail = ({
16512
16947
  return { valid: false, errors: [{ instancePath: "", message: String(e) }] };
16513
16948
  }
16514
16949
  }, [entwurf, felder, schnappschuss?.element.type, kettenfeld]);
16515
- if (phase.status === "loading") return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { "data-testid": "element-laden", children: "Element wird geladen \u2026" });
16950
+ if (phase.status === "loading") return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { "data-testid": "element-laden", children: "Element wird geladen \u2026" });
16516
16951
  if (phase.status === "error") {
16517
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { "data-testid": "element-fehler", role: "alert", children: [
16952
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("p", { "data-testid": "element-fehler", role: "alert", children: [
16518
16953
  "Element ",
16519
16954
  elementId,
16520
16955
  " konnte nicht geladen werden: ",
@@ -16522,7 +16957,7 @@ var ElementDetail = ({
16522
16957
  ] });
16523
16958
  }
16524
16959
  if (!schnappschuss) {
16525
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { "data-testid": "element-unbekannt", children: [
16960
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("p", { "data-testid": "element-unbekannt", children: [
16526
16961
  "Element ",
16527
16962
  elementId,
16528
16963
  " ist unbekannt."
@@ -16628,28 +17063,28 @@ var ElementDetail = ({
16628
17063
  formular: entwurf
16629
17064
  };
16630
17065
  const laufVersionId = angezeigt.kind === "version" ? angezeigt.versionId : usableHeadVersionId(kopfAufloesung);
16631
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "szenen-detail", "data-testid": "element-detail", "data-element-id": elementId, children: [
16632
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("header", { children: [
16633
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h3", { children: schnappschuss.metadata?.title ?? "(ohne Titel)" }),
16634
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { className: "szenen-detail__ids", children: [
16635
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { "data-testid": "element-typ", children: elementTypLabel(typ) }),
16636
- schnappschuss.element.retired && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { "data-testid": "ist-stillgelegt", children: "stillgelegt" })
17066
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "szenen-detail", "data-testid": "element-detail", "data-element-id": elementId, children: [
17067
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("header", { children: [
17068
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h3", { children: schnappschuss.metadata?.title ?? "(ohne Titel)" }),
17069
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("p", { className: "szenen-detail__ids", children: [
17070
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { "data-testid": "element-typ", children: elementTypLabel(typ) }),
17071
+ schnappschuss.element.retired && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { "data-testid": "ist-stillgelegt", children: "stillgelegt" })
16637
17072
  ] })
16638
17073
  ] }),
16639
- kontextkette.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { role: "alert", "data-testid": "kontextkette-fehler", className: "szenen-detail__hint", children: [
17074
+ kontextkette.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("p", { role: "alert", "data-testid": "kontextkette-fehler", className: "szenen-detail__hint", children: [
16640
17075
  "Die Kontextkette konnte nicht gelesen werden: ",
16641
17076
  kontextkette.message,
16642
17077
  ". Solange das so ist, lassen sich weder der bevorzugte Kopf noch die ausw\xE4hlbaren Referenzen bestimmen \u2014 sie sind ",
16643
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("strong", { children: "unbekannt" }),
17078
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("strong", { children: "unbekannt" }),
16644
17079
  ", nicht leer."
16645
17080
  ] }),
16646
- kopfErgebnis?.kind === "dag_fehler" && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { role: "alert", "data-testid": "versionsgraph-fehler", className: "szenen-detail__hint", children: [
17081
+ kopfErgebnis?.kind === "dag_fehler" && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("p", { role: "alert", "data-testid": "versionsgraph-fehler", className: "szenen-detail__hint", children: [
16647
17082
  "Der Versionsgraph dieses Elements ist nicht aufbaubar:",
16648
17083
  " ",
16649
17084
  kopfErgebnis.message,
16650
17085
  ". Die Versionen bleiben einzeln anzeigbar; ein bevorzugter Kopf l\xE4sst sich daraus nicht ableiten."
16651
17086
  ] }),
16652
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
17087
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
16653
17088
  VersionNavigator,
16654
17089
  {
16655
17090
  versions: schnappschuss.versions,
@@ -16672,22 +17107,22 @@ var ElementDetail = ({
16672
17107
  }
16673
17108
  }
16674
17109
  ),
16675
- basiswechsel && draft && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "szenen-detail__confirm", "data-testid": "basiswechsel-bestaetigung", role: "alertdialog", children: [
16676
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { children: [
17110
+ basiswechsel && draft && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "szenen-detail__confirm", "data-testid": "basiswechsel-bestaetigung", role: "alertdialog", children: [
17111
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("p", { children: [
16677
17112
  "Es gibt bereits einen Entwurf (Revision ",
16678
17113
  draft.revision,
16679
- draft.base_version_id ? /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
17114
+ draft.base_version_id ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
16680
17115
  " auf Basis ",
16681
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("code", { children: draft.base_version_id })
16682
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_jsx_runtime9.Fragment, { children: " ohne Basis" }),
17116
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("code", { children: draft.base_version_id })
17117
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_jsx_runtime10.Fragment, { children: " ohne Basis" }),
16683
17118
  "). Ihn auf Version ",
16684
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("code", { children: basiswechsel }),
17119
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("code", { children: basiswechsel }),
16685
17120
  " neu aufzusetzen",
16686
17121
  " ",
16687
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("strong", { children: "ersetzt seinen Inhalt" }),
17122
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("strong", { children: "ersetzt seinen Inhalt" }),
16688
17123
  " durch die Payload dieser Version."
16689
17124
  ] }),
16690
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
17125
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
16691
17126
  "button",
16692
17127
  {
16693
17128
  type: "button",
@@ -16699,7 +17134,7 @@ var ElementDetail = ({
16699
17134
  children: "Entwurf auf diese Version neu aufsetzen"
16700
17135
  }
16701
17136
  ),
16702
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
17137
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
16703
17138
  "button",
16704
17139
  {
16705
17140
  type: "button",
@@ -16710,26 +17145,26 @@ var ElementDetail = ({
16710
17145
  }
16711
17146
  )
16712
17147
  ] }),
16713
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("section", { className: "szenen-detail__draft", "data-testid": "draft-bereich", children: [
16714
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h4", { children: bearbeitbar ? /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
17148
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("section", { className: "szenen-detail__draft", "data-testid": "draft-bereich", children: [
17149
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h4", { children: bearbeitbar ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
16715
17150
  "Entwurf",
16716
- draft && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
17151
+ draft && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { children: [
16717
17152
  " \xB7 Revision ",
16718
17153
  draft.revision
16719
17154
  ] })
16720
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_jsx_runtime9.Fragment, { children: "Ver\xF6ffentlichte Version \u2014 nur Ansicht" }) }),
16721
- angezeigt.kind === "keiner" && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { "data-testid": "nichts-angezeigt", children: [
17155
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_jsx_runtime10.Fragment, { children: "Ver\xF6ffentlichte Version \u2014 nur Ansicht" }) }),
17156
+ angezeigt.kind === "keiner" && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("p", { "data-testid": "nichts-angezeigt", children: [
16722
17157
  "Es ist kein Stand ausgew\xE4hlt. Oben eine Version anzeigen oder \xFCber ",
16723
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("strong", { children: "als Grundlage bearbeiten" }),
17158
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("strong", { children: "als Grundlage bearbeiten" }),
16724
17159
  " einen Entwurf beginnen."
16725
17160
  ] }),
16726
- !bearbeitbar && angezeigt.kind === "version" && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { "data-testid": "nur-ansicht", className: "szenen-detail__hint", children: [
17161
+ !bearbeitbar && angezeigt.kind === "version" && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("p", { "data-testid": "nur-ansicht", className: "szenen-detail__hint", children: [
16727
17162
  "Ver\xF6ffentlichte Versionen sind unver\xE4nderlich (D-02). Zum Bearbeiten oben ",
16728
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("strong", { children: "als Grundlage bearbeiten" }),
17163
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("strong", { children: "als Grundlage bearbeiten" }),
16729
17164
  " w\xE4hlen \u2014 das erzeugt einen Entwurf mit genau dieser Version als Basis."
16730
17165
  ] }),
16731
- angezeigt.kind !== "keiner" && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
16732
- typ === "scene" && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
17166
+ angezeigt.kind !== "keiner" && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
17167
+ typ === "scene" && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
16733
17168
  SceneEditor,
16734
17169
  {
16735
17170
  port,
@@ -16743,57 +17178,57 @@ var ElementDetail = ({
16743
17178
  }))
16744
17179
  }
16745
17180
  ),
16746
- felder.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { "data-testid": "kein-schema", children: [
17181
+ felder.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("p", { "data-testid": "kein-schema", children: [
16747
17182
  "F\xFCr den Typ ",
16748
17183
  typ,
16749
17184
  " liegt kein Payload-Schema vor."
16750
17185
  ] }),
16751
- primaer.map((feld) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(SchemaFieldRow, { ...feldProps, feld }, feld.path)),
16752
- advanced.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("details", { className: "szenen-detail__technical", "data-testid": "technische-felder", children: [
16753
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("summary", { children: [
17186
+ primaer.map((feld) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SchemaFieldRow, { ...feldProps, feld }, feld.path)),
17187
+ advanced.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("details", { className: "szenen-detail__technical", "data-testid": "technische-felder", children: [
17188
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("summary", { children: [
16754
17189
  "Technische Felder / JSON (",
16755
17190
  advanced.length,
16756
17191
  ")"
16757
17192
  ] }),
16758
- advanced.map((feld) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(SchemaFieldRow, { ...feldProps, feld }, feld.path))
17193
+ advanced.map((feld) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SchemaFieldRow, { ...feldProps, feld }, feld.path))
16759
17194
  ] }),
16760
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("details", { className: "szenen-detail__technical", "data-testid": "technische-informationen", children: [
16761
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("summary", { children: "Technische Informationen" }),
16762
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { children: [
17195
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("details", { className: "szenen-detail__technical", "data-testid": "technische-informationen", children: [
17196
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("summary", { children: "Technische Informationen" }),
17197
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("p", { children: [
16763
17198
  "Element-ID: ",
16764
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("code", { children: schnappschuss.element.element_id })
17199
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("code", { children: schnappschuss.element.element_id })
16765
17200
  ] }),
16766
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { children: [
17201
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("p", { children: [
16767
17202
  "angezeigter Stand:",
16768
17203
  " ",
16769
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("code", { "data-testid": "angezeigter-stand", children: angezeigt.kind === "version" ? angezeigt.versionId : "Entwurf" })
17204
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("code", { "data-testid": "angezeigter-stand", children: angezeigt.kind === "version" ? angezeigt.versionId : "Entwurf" })
16770
17205
  ] }),
16771
- draft && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { children: [
17206
+ draft && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("p", { children: [
16772
17207
  "Basis des Entwurfs:",
16773
17208
  " ",
16774
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("code", { children: draft.base_version_id ?? "(keine)" })
17209
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("code", { children: draft.base_version_id ?? "(keine)" })
16775
17210
  ] })
16776
17211
  ] })
16777
17212
  ] }),
16778
- bearbeitbar && vorschau && !vorschau.valid && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("ul", { "data-testid": "vorschau-befunde", className: "szenen-detail__preview-errors", children: vorschau.errors.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("li", { children: [
17213
+ bearbeitbar && vorschau && !vorschau.valid && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("ul", { "data-testid": "vorschau-befunde", className: "szenen-detail__preview-errors", children: vorschau.errors.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("li", { children: [
16779
17214
  f.instancePath || "/",
16780
17215
  ": ",
16781
17216
  f.message
16782
17217
  ] }, i)) }),
16783
- kettenfeld && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("p", { "data-testid": "kettenfeld-hinweis", className: "szenen-detail__hint", children: [
17218
+ kettenfeld && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("p", { "data-testid": "kettenfeld-hinweis", className: "szenen-detail__hint", children: [
16784
17219
  "Der Verweis ",
16785
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("code", { children: kettenfeld }),
17220
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("code", { children: kettenfeld }),
16786
17221
  " steht in den Kettenmetadaten, nicht in der Payload (D-96) \u2014 f\xFCr den Prompt-Lauf aus der Kette gen\xFCgt das. Zum",
16787
17222
  " ",
16788
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("strong", { children: "Ver\xF6ffentlichen" }),
17223
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("strong", { children: "Ver\xF6ffentlichen" }),
16789
17224
  " muss er als regul\xE4re Referenz auf eine ver\xF6ffentlichte Version gesetzt werden."
16790
17225
  ] }),
16791
- bearbeitbar && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "szenen-detail__actions", children: [
16792
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", "data-testid": "draft-speichern", disabled: laeuft, onClick: speichern, children: "Entwurf speichern" }),
16793
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", "data-testid": "veroeffentlichen", disabled: laeuft, onClick: veroeffentlichen, children: "ver\xF6ffentlichen" })
17226
+ bearbeitbar && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "szenen-detail__actions", children: [
17227
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("button", { type: "button", "data-testid": "draft-speichern", disabled: laeuft, onClick: speichern, children: "Entwurf speichern" }),
17228
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("button", { type: "button", "data-testid": "veroeffentlichen", disabled: laeuft, onClick: veroeffentlichen, children: "ver\xF6ffentlichen" })
16794
17229
  ] })
16795
17230
  ] }),
16796
- typ === "target_model" && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
17231
+ typ === "target_model" && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
16797
17232
  AbgeleitetesBildmodell,
16798
17233
  {
16799
17234
  schluessel: (() => {
@@ -16808,8 +17243,8 @@ var ElementDetail = ({
16808
17243
  // einer Draft-Kette, fuehrt der Weg ueber das Einfrieren —
16809
17244
  // der alte Satz „setzen eine veroeffentlichte Version
16810
17245
  // voraus" gilt nur noch fuer den Einzel-Shot.
16811
- draft?.chain ? /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
16812
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
17246
+ draft?.chain ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
17247
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
16813
17248
  PromptStartAction,
16814
17249
  {
16815
17250
  port,
@@ -16819,7 +17254,7 @@ var ElementDetail = ({
16819
17254
  }
16820
17255
  }
16821
17256
  ),
16822
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
17257
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
16823
17258
  RunsPanel,
16824
17259
  {
16825
17260
  port,
@@ -16827,17 +17262,17 @@ var ElementDetail = ({
16827
17262
  source: { kind: "draft_chain", chainId: draft.chain.chain_id }
16828
17263
  }
16829
17264
  )
16830
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { "data-testid": "shot-ohne-version", children: "Dieser Shot ist noch nicht ver\xF6ffentlicht und geh\xF6rt zu keiner Draft-Kette. Ein Prompt-Lauf braucht hier eine ver\xF6ffentlichte Version \u2014 oder einen Shot, der aus einer Rekonstruktion als Kette entstanden ist." })
16831
- ) : laufVersionId ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
17265
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { "data-testid": "shot-ohne-version", children: "Dieser Shot ist noch nicht ver\xF6ffentlicht und geh\xF6rt zu keiner Draft-Kette. Ein Prompt-Lauf braucht hier eine ver\xF6ffentlichte Version \u2014 oder einen Shot, der aus einer Rekonstruktion als Kette entstanden ist." })
17266
+ ) : laufVersionId ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
16832
17267
  RunsPanel,
16833
17268
  {
16834
17269
  port,
16835
17270
  contextId,
16836
17271
  source: { kind: "published", shotVersionId: laufVersionId }
16837
17272
  }
16838
- ) : /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { "data-testid": "laufquelle-unklar", children: "Dieser Shot hat mehrere ver\xF6ffentlichte Versionen und keinen bevorzugten Kopf in diesem Kontext. Welche davon einen Lauf tr\xE4gt, entscheidet keine Reihenfolge \u2014 bitte oben eine Version anzeigen oder als bevorzugt setzen." })),
16839
- typ === "scene" && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
16840
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
17273
+ ) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { "data-testid": "laufquelle-unklar", children: "Dieser Shot hat mehrere ver\xF6ffentlichte Versionen und keinen bevorzugten Kopf in diesem Kontext. Welche davon einen Lauf tr\xE4gt, entscheidet keine Reihenfolge \u2014 bitte oben eine Version anzeigen oder als bevorzugt setzen." })),
17274
+ typ === "scene" && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
17275
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
16841
17276
  PromptStartAction,
16842
17277
  {
16843
17278
  port,
@@ -16851,7 +17286,7 @@ var ElementDetail = ({
16851
17286
  onLauf: () => setNachladen((n) => n + 1)
16852
17287
  }
16853
17288
  ),
16854
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
17289
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
16855
17290
  RunsPanel,
16856
17291
  {
16857
17292
  port,
@@ -16860,7 +17295,7 @@ var ElementDetail = ({
16860
17295
  }
16861
17296
  )
16862
17297
  ] }),
16863
- typ === "scene_setup" && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
17298
+ typ === "scene_setup" && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
16864
17299
  CapabilityPanel,
16865
17300
  {
16866
17301
  port,
@@ -16868,7 +17303,7 @@ var ElementDetail = ({
16868
17303
  setupPayload: payloadAusFormular()
16869
17304
  }
16870
17305
  ),
16871
- notiz && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
17306
+ notiz && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
16872
17307
  "div",
16873
17308
  {
16874
17309
  className: `szenen-detail__notice szenen-detail__notice--${notiz.tone}`,
@@ -16876,8 +17311,8 @@ var ElementDetail = ({
16876
17311
  "data-tone": notiz.tone,
16877
17312
  role: notiz.tone === "error" ? "alert" : "status",
16878
17313
  children: [
16879
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { children: notiz.text }),
16880
- notiz.details && notiz.details.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("ul", { "data-testid": "notiz-befunde", children: notiz.details.map((d, i) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("li", { children: d }, i)) })
17314
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { children: notiz.text }),
17315
+ notiz.details && notiz.details.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("ul", { "data-testid": "notiz-befunde", children: notiz.details.map((d, i) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: d }, i)) })
16881
17316
  ]
16882
17317
  }
16883
17318
  )
@@ -16885,15 +17320,15 @@ var ElementDetail = ({
16885
17320
  };
16886
17321
 
16887
17322
  // src/features/szenen/areas/useSchmalesDisplay.ts
16888
- var import_react10 = require("react");
17323
+ var import_react11 = require("react");
16889
17324
  var SCHMALE_ANSICHT = "(max-width: 760px)";
16890
17325
  function messen(abfrage) {
16891
17326
  if (typeof window === "undefined" || typeof window.matchMedia !== "function") return false;
16892
17327
  return window.matchMedia(abfrage).matches;
16893
17328
  }
16894
17329
  function useSchmalesDisplay(abfrage = SCHMALE_ANSICHT) {
16895
- const [schmal, setSchmal] = (0, import_react10.useState)(() => messen(abfrage));
16896
- (0, import_react10.useEffect)(() => {
17330
+ const [schmal, setSchmal] = (0, import_react11.useState)(() => messen(abfrage));
17331
+ (0, import_react11.useEffect)(() => {
16897
17332
  if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
16898
17333
  const liste = window.matchMedia(abfrage);
16899
17334
  const aktualisieren = () => setSchmal(liste.matches);
@@ -16905,7 +17340,7 @@ function useSchmalesDisplay(abfrage = SCHMALE_ANSICHT) {
16905
17340
  }
16906
17341
 
16907
17342
  // src/features/szenen/areas/ElementsArea.tsx
16908
- var import_jsx_runtime10 = require("react/jsx-runtime");
17343
+ var import_jsx_runtime11 = require("react/jsx-runtime");
16909
17344
  var ElementsArea = ({
16910
17345
  port,
16911
17346
  contextId,
@@ -16920,16 +17355,16 @@ var ElementsArea = ({
16920
17355
  const gemischt = auswahlTypen.length > 1;
16921
17356
  const ueberschrift = listTitle ?? (einzelTyp ? elementTypPlural(einzelTyp) : "Bausteine");
16922
17357
  const einzahl = einzelTyp ? elementTypLabel(einzelTyp) : "Objekt";
16923
- const [typ, setTyp] = (0, import_react11.useState)(einzelTyp ?? "");
16924
- const [zeigeStillgelegte, setZeigeStillgelegte] = (0, import_react11.useState)(false);
16925
- const [gewaehlt, setGewaehlt] = (0, import_react11.useState)(null);
16926
- const [neuerTitel, setNeuerTitel] = (0, import_react11.useState)("");
16927
- const [neuerTyp, setNeuerTyp] = (0, import_react11.useState)(auswahlTypen[0]);
16928
- const [notiz, setNotiz] = (0, import_react11.useState)(null);
16929
- const [anlegend, setAnlegend] = (0, import_react11.useState)(false);
16930
- const [anlageOffen, setAnlageOffen] = (0, import_react11.useState)(false);
17358
+ const [typ, setTyp] = (0, import_react12.useState)(einzelTyp ?? "");
17359
+ const [zeigeStillgelegte, setZeigeStillgelegte] = (0, import_react12.useState)(false);
17360
+ const [gewaehlt, setGewaehlt] = (0, import_react12.useState)(null);
17361
+ const [neuerTitel, setNeuerTitel] = (0, import_react12.useState)("");
17362
+ const [neuerTyp, setNeuerTyp] = (0, import_react12.useState)(auswahlTypen[0]);
17363
+ const [notiz, setNotiz] = (0, import_react12.useState)(null);
17364
+ const [anlegend, setAnlegend] = (0, import_react12.useState)(false);
17365
+ const [anlageOffen, setAnlageOffen] = (0, import_react12.useState)(false);
16931
17366
  const schmal = useSchmalesDisplay();
16932
- const [ansicht, setAnsicht] = (0, import_react11.useState)("liste");
17367
+ const [ansicht, setAnsicht] = (0, import_react12.useState)("liste");
16933
17368
  const zeigeListe = !schmal || ansicht === "liste";
16934
17369
  const zeigeDetail = !schmal || ansicht === "detail";
16935
17370
  const waehle = (elementId) => {
@@ -16949,17 +17384,17 @@ var ElementsArea = ({
16949
17384
  setAnlageOffen(false);
16950
17385
  setNeuerTitel("");
16951
17386
  };
16952
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
17387
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
16953
17388
  "div",
16954
17389
  {
16955
17390
  className: "szenen-elements",
16956
17391
  "data-testid": "bereich-elemente",
16957
17392
  "data-ansicht": schmal ? ansicht : "beide",
16958
17393
  children: [
16959
- zeigeListe && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "szenen-elements__master", "data-testid": "elemente-master", children: [
16960
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "szenen-elements__toolbar", children: [
16961
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h3", { className: "szenen-elements__heading", children: ueberschrift }),
16962
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
17394
+ zeigeListe && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "szenen-elements__master", "data-testid": "elemente-master", children: [
17395
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "szenen-elements__toolbar", children: [
17396
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("h3", { className: "szenen-elements__heading", children: ueberschrift }),
17397
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
16963
17398
  "button",
16964
17399
  {
16965
17400
  type: "button",
@@ -16975,22 +17410,22 @@ var ElementsArea = ({
16975
17410
  }
16976
17411
  )
16977
17412
  ] }),
16978
- gemischt && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("label", { className: "szenen-elements__scope", children: [
17413
+ gemischt && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("label", { className: "szenen-elements__scope", children: [
16979
17414
  "Art",
16980
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
17415
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
16981
17416
  "select",
16982
17417
  {
16983
17418
  "data-testid": "filter-typ",
16984
17419
  value: typ,
16985
17420
  onChange: (e) => setTyp(e.target.value),
16986
17421
  children: [
16987
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("option", { value: "", children: allTypesLabel ?? "alle Typen" }),
16988
- auswahlTypen.map((t) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("option", { value: t, children: elementTypPlural(t) }, t))
17422
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("option", { value: "", children: allTypesLabel ?? "alle Typen" }),
17423
+ auswahlTypen.map((t) => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("option", { value: t, children: elementTypPlural(t) }, t))
16989
17424
  ]
16990
17425
  }
16991
17426
  )
16992
17427
  ] }),
16993
- anlageOffen && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
17428
+ anlageOffen && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
16994
17429
  "form",
16995
17430
  {
16996
17431
  className: "szenen-elements__create",
@@ -17018,9 +17453,9 @@ var ElementsArea = ({
17018
17453
  }
17019
17454
  },
17020
17455
  children: [
17021
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("label", { className: "szenen-elements__create-title", children: [
17456
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("label", { className: "szenen-elements__create-title", children: [
17022
17457
  einzelTyp ? `Neue ${einzahl}` : "Titel",
17023
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
17458
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
17024
17459
  "input",
17025
17460
  {
17026
17461
  "data-testid": "neuer-titel",
@@ -17031,20 +17466,20 @@ var ElementsArea = ({
17031
17466
  }
17032
17467
  )
17033
17468
  ] }),
17034
- gemischt && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("label", { className: "szenen-elements__create-type", children: [
17469
+ gemischt && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("label", { className: "szenen-elements__create-type", children: [
17035
17470
  "Art",
17036
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
17471
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
17037
17472
  "select",
17038
17473
  {
17039
17474
  "data-testid": "neuer-typ",
17040
17475
  value: neuerTyp,
17041
17476
  onChange: (e) => setNeuerTyp(e.target.value),
17042
- children: auswahlTypen.map((t) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("option", { value: t, children: elementTypLabel(t) }, t))
17477
+ children: auswahlTypen.map((t) => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("option", { value: t, children: elementTypLabel(t) }, t))
17043
17478
  }
17044
17479
  )
17045
17480
  ] }),
17046
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "szenen-elements__create-actions", children: [
17047
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
17481
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "szenen-elements__create-actions", children: [
17482
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
17048
17483
  "button",
17049
17484
  {
17050
17485
  type: "submit",
@@ -17053,7 +17488,7 @@ var ElementsArea = ({
17053
17488
  children: "anlegen"
17054
17489
  }
17055
17490
  ),
17056
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
17491
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
17057
17492
  "button",
17058
17493
  {
17059
17494
  type: "button",
@@ -17066,19 +17501,19 @@ var ElementsArea = ({
17066
17501
  ]
17067
17502
  }
17068
17503
  ),
17069
- notiz && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { "data-testid": "anlegen-notiz", "data-tone": notiz.tone, children: notiz.text }),
17070
- phase.status === "loading" && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { "data-testid": "elemente-laden", children: "Elemente werden geladen \u2026" }),
17071
- phase.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("p", { "data-testid": "elemente-fehler", role: "alert", children: [
17504
+ notiz && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { "data-testid": "anlegen-notiz", "data-tone": notiz.tone, children: notiz.text }),
17505
+ phase.status === "loading" && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { "data-testid": "elemente-laden", children: "Elemente werden geladen \u2026" }),
17506
+ phase.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("p", { "data-testid": "elemente-fehler", role: "alert", children: [
17072
17507
  "Elemente konnten nicht geladen werden: ",
17073
17508
  phase.message,
17074
17509
  phase.retryable && " \u2014 ein erneuter Versuch kann helfen."
17075
17510
  ] }),
17076
- phase.status === "ready" && phase.value.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("p", { "data-testid": "elemente-leer", children: [
17511
+ phase.status === "ready" && phase.value.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("p", { "data-testid": "elemente-leer", children: [
17077
17512
  typ ? `Keine ${elementTypPlural(typ)} in diesem Kontext.` : "Nichts in diesem Kontext.",
17078
17513
  " ",
17079
17514
  'Mit \u201E+ Neu" anlegen.'
17080
17515
  ] }),
17081
- phase.status === "ready" && phase.value.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("ul", { className: "szenen-elements__list", "data-testid": "elemente-liste", children: phase.value.map((element) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { "data-element-id": element.element_id, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
17516
+ phase.status === "ready" && phase.value.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("ul", { className: "szenen-elements__list", "data-testid": "elemente-liste", children: phase.value.map((element) => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("li", { "data-element-id": element.element_id, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
17082
17517
  "button",
17083
17518
  {
17084
17519
  type: "button",
@@ -17087,18 +17522,18 @@ var ElementsArea = ({
17087
17522
  className: element.element_id === gewaehlt ? "is-selected" : void 0,
17088
17523
  onClick: () => waehle(element.element_id),
17089
17524
  children: [
17090
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("strong", { className: "szenen-elements__title", children: element.title || "Unbenanntes Element" }),
17091
- gemischt && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "szenen-elements__type", children: elementTypLabel(element.type) }),
17092
- element.subtype && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "szenen-elements__subtype", children: element.subtype }),
17093
- element.retired && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "szenen-elements__retired", children: "stillgelegt" })
17525
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("strong", { className: "szenen-elements__title", children: element.title || "Unbenanntes Element" }),
17526
+ gemischt && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "szenen-elements__type", children: elementTypLabel(element.type) }),
17527
+ element.subtype && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "szenen-elements__subtype", children: element.subtype }),
17528
+ element.retired && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "szenen-elements__retired", children: "stillgelegt" })
17094
17529
  ]
17095
17530
  }
17096
17531
  ) }, element.element_id)) }),
17097
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("details", { className: "szenen-elements__options", "data-testid": "listen-optionen", children: [
17098
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("summary", { children: "Listenoptionen" }),
17099
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "szenen-elements__filter", children: [
17100
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("label", { children: [
17101
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
17532
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("details", { className: "szenen-elements__options", "data-testid": "listen-optionen", children: [
17533
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("summary", { children: "Listenoptionen" }),
17534
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "szenen-elements__filter", children: [
17535
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("label", { children: [
17536
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
17102
17537
  "input",
17103
17538
  {
17104
17539
  type: "checkbox",
@@ -17109,12 +17544,12 @@ var ElementsArea = ({
17109
17544
  ),
17110
17545
  "stillgelegte Elemente einblenden"
17111
17546
  ] }),
17112
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("button", { type: "button", "data-testid": "neu-laden", onClick: neuLaden, children: "neu laden" })
17547
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("button", { type: "button", "data-testid": "neu-laden", onClick: neuLaden, children: "neu laden" })
17113
17548
  ] })
17114
17549
  ] })
17115
17550
  ] }),
17116
- zeigeDetail && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "szenen-elements__detail", "data-testid": "elemente-detail-spalte", children: [
17117
- schmal && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
17551
+ zeigeDetail && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "szenen-elements__detail", "data-testid": "elemente-detail-spalte", children: [
17552
+ schmal && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
17118
17553
  "button",
17119
17554
  {
17120
17555
  type: "button",
@@ -17124,7 +17559,7 @@ var ElementsArea = ({
17124
17559
  children: "\u2190 Zur\xFCck zur Liste"
17125
17560
  }
17126
17561
  ),
17127
- gewaehlt ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
17562
+ gewaehlt ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
17128
17563
  ElementDetail,
17129
17564
  {
17130
17565
  port,
@@ -17133,7 +17568,7 @@ var ElementsArea = ({
17133
17568
  author,
17134
17569
  onChanged: neuLaden
17135
17570
  }
17136
- ) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "szenen-elements__empty-detail", "data-testid": "keine-auswahl", children: "Nichts ausgew\xE4hlt. Ein Eintrag aus der Liste \xF6ffnet die Bearbeitung." })
17571
+ ) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: "szenen-elements__empty-detail", "data-testid": "keine-auswahl", children: "Nichts ausgew\xE4hlt. Ein Eintrag aus der Liste \xF6ffnet die Bearbeitung." })
17137
17572
  ] })
17138
17573
  ]
17139
17574
  }
@@ -17141,17 +17576,17 @@ var ElementsArea = ({
17141
17576
  };
17142
17577
 
17143
17578
  // src/features/szenen/areas/SceneArea.tsx
17144
- var import_jsx_runtime11 = require("react/jsx-runtime");
17145
- var SceneArea = ({ port, contextId }) => /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "szenen-scene", "data-testid": "bereich-szene", children: [
17146
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: "szenen-area__lead", children: "Szenen dieses Kontexts. Auswahl \xF6ffnet die Bearbeitung der Nodes und Beziehungen." }),
17147
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(ElementsArea, { port, contextId, restrictToTypes: ["scene"] })
17579
+ var import_jsx_runtime12 = require("react/jsx-runtime");
17580
+ var SceneArea = ({ port, contextId }) => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "szenen-scene", "data-testid": "bereich-szene", children: [
17581
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "szenen-area__lead", children: "Szenen dieses Kontexts. Auswahl \xF6ffnet die Bearbeitung der Nodes und Beziehungen." }),
17582
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ElementsArea, { port, contextId, restrictToTypes: ["scene"] })
17148
17583
  ] });
17149
17584
 
17150
17585
  // src/features/szenen/areas/SetupArea.tsx
17151
- var import_jsx_runtime12 = require("react/jsx-runtime");
17152
- var SetupArea = ({ port, contextId }) => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "szenen-setup", "data-testid": "bereich-setup", children: [
17153
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "szenen-area__lead", children: "Bildaufbauten, Kameras und Stile dieses Kontexts." }),
17154
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
17586
+ var import_jsx_runtime13 = require("react/jsx-runtime");
17587
+ var SetupArea = ({ port, contextId }) => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "szenen-setup", "data-testid": "bereich-setup", children: [
17588
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "szenen-area__lead", children: "Bildaufbauten, Kameras und Stile dieses Kontexts." }),
17589
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
17155
17590
  ElementsArea,
17156
17591
  {
17157
17592
  port,
@@ -17164,10 +17599,10 @@ var SetupArea = ({ port, contextId }) => /* @__PURE__ */ (0, import_jsx_runtime1
17164
17599
  ] });
17165
17600
 
17166
17601
  // src/features/szenen/areas/ShotArea.tsx
17167
- var import_jsx_runtime13 = require("react/jsx-runtime");
17168
- var ShotArea = ({ port, contextId }) => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "szenen-shot", "data-testid": "bereich-shot", children: [
17169
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "szenen-area__lead", children: "Prompts dieses Kontexts. Auswahl zeigt Runden und startet Prompt-L\xE4ufe." }),
17170
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
17602
+ var import_jsx_runtime14 = require("react/jsx-runtime");
17603
+ var ShotArea = ({ port, contextId }) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "szenen-shot", "data-testid": "bereich-shot", children: [
17604
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "szenen-area__lead", children: "Prompts dieses Kontexts. Auswahl zeigt Runden und startet Prompt-L\xE4ufe." }),
17605
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
17171
17606
  ElementsArea,
17172
17607
  {
17173
17608
  port,
@@ -17180,21 +17615,21 @@ var ShotArea = ({ port, contextId }) => /* @__PURE__ */ (0, import_jsx_runtime13
17180
17615
  ] });
17181
17616
 
17182
17617
  // src/features/szenen/areas/MediaArea.tsx
17183
- var import_react12 = require("react");
17184
- var import_jsx_runtime14 = require("react/jsx-runtime");
17618
+ var import_react13 = require("react");
17619
+ var import_jsx_runtime15 = require("react/jsx-runtime");
17185
17620
  var leer = async () => ({ kind: "ok", value: [] });
17186
17621
  var MediaArea = ({ port }) => {
17187
17622
  const media = port.media;
17188
- const [versionInput, setVersionInput] = (0, import_react12.useState)("");
17189
- const [versionId, setVersionId] = (0, import_react12.useState)("");
17190
- const [itemInput, setItemInput] = (0, import_react12.useState)("");
17191
- const [itemId, setItemId] = (0, import_react12.useState)("");
17192
- const [assetId, setAssetId] = (0, import_react12.useState)("");
17193
- const [role, setRole] = (0, import_react12.useState)("reference");
17194
- const [position, setPosition] = (0, import_react12.useState)("0");
17195
- const [notiz, setNotiz] = (0, import_react12.useState)(null);
17196
- const [busy, setBusy] = (0, import_react12.useState)(false);
17197
- const [refresh, setRefresh] = (0, import_react12.useState)(0);
17623
+ const [versionInput, setVersionInput] = (0, import_react13.useState)("");
17624
+ const [versionId, setVersionId] = (0, import_react13.useState)("");
17625
+ const [itemInput, setItemInput] = (0, import_react13.useState)("");
17626
+ const [itemId, setItemId] = (0, import_react13.useState)("");
17627
+ const [assetId, setAssetId] = (0, import_react13.useState)("");
17628
+ const [role, setRole] = (0, import_react13.useState)("reference");
17629
+ const [position, setPosition] = (0, import_react13.useState)("0");
17630
+ const [notiz, setNotiz] = (0, import_react13.useState)(null);
17631
+ const [busy, setBusy] = (0, import_react13.useState)(false);
17632
+ const [refresh, setRefresh] = (0, import_react13.useState)(0);
17198
17633
  const [versionPhase] = usePortQuery(
17199
17634
  () => versionId ? media.listVersionMedia(versionId) : leer(),
17200
17635
  [media, versionId, refresh]
@@ -17240,145 +17675,145 @@ var MediaArea = ({ port }) => {
17240
17675
  };
17241
17676
  const versionMedien = versionPhase.status === "ready" ? versionPhase.value : [];
17242
17677
  const itemMedien = itemPhase.status === "ready" ? itemPhase.value : [];
17243
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "szenen-media", "data-testid": "bereich-medien", children: [
17244
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "szenen-area__lead", children: "Bereits vorhandene Medien-Assets einer Elementversion zuordnen. Hochgeladen wird hier nichts \u2014 Medien entstehen \xFCber den bestehenden Speicherweg aus Stufe 5." }),
17245
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("section", { children: [
17246
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("h3", { children: "Version" }),
17247
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "szenen-media__lookup", children: [
17248
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("label", { children: [
17678
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "szenen-media", "data-testid": "bereich-medien", children: [
17679
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "szenen-area__lead", children: "Bereits vorhandene Medien-Assets einer Elementversion zuordnen. Hochgeladen wird hier nichts \u2014 Medien entstehen \xFCber den bestehenden Speicherweg aus Stufe 5." }),
17680
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("section", { children: [
17681
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("h3", { children: "Version" }),
17682
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "szenen-media__lookup", children: [
17683
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("label", { children: [
17249
17684
  "Version-ID",
17250
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("input", { value: versionInput, onChange: (event) => setVersionInput(event.target.value) })
17685
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("input", { value: versionInput, onChange: (event) => setVersionInput(event.target.value) })
17251
17686
  ] }),
17252
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("button", { type: "button", onClick: () => setVersionId(versionInput.trim()), children: "Medien laden" })
17687
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("button", { type: "button", onClick: () => setVersionId(versionInput.trim()), children: "Medien laden" })
17253
17688
  ] }),
17254
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "szenen-media__attach", children: [
17255
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("label", { children: [
17689
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "szenen-media__attach", children: [
17690
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("label", { children: [
17256
17691
  "Asset-ID",
17257
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("input", { value: assetId, onChange: (event) => setAssetId(event.target.value) })
17692
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("input", { value: assetId, onChange: (event) => setAssetId(event.target.value) })
17258
17693
  ] }),
17259
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("label", { children: [
17694
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("label", { children: [
17260
17695
  "Rolle",
17261
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("select", { value: role, onChange: (event) => setRole(event.target.value), children: [
17262
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("option", { value: "reference", children: "reference" }),
17263
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("option", { value: "mask", children: "mask" }),
17264
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("option", { value: "palette", children: "palette" }),
17265
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("option", { value: "example", children: "example" })
17696
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("select", { value: role, onChange: (event) => setRole(event.target.value), children: [
17697
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("option", { value: "reference", children: "reference" }),
17698
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("option", { value: "mask", children: "mask" }),
17699
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("option", { value: "palette", children: "palette" }),
17700
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("option", { value: "example", children: "example" })
17266
17701
  ] })
17267
17702
  ] }),
17268
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("label", { children: [
17703
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("label", { children: [
17269
17704
  "Position",
17270
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("input", { type: "number", min: "0", value: position, onChange: (event) => setPosition(event.target.value) })
17705
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("input", { type: "number", min: "0", value: position, onChange: (event) => setPosition(event.target.value) })
17271
17706
  ] }),
17272
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("button", { type: "button", disabled: busy, onClick: zuordnen, children: "zuordnen" })
17707
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("button", { type: "button", disabled: busy, onClick: zuordnen, children: "zuordnen" })
17273
17708
  ] }),
17274
- versionPhase.status === "loading" && versionId && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { children: "Versionsmedien werden geladen \u2026" }),
17275
- versionPhase.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("p", { role: "alert", children: [
17709
+ versionPhase.status === "loading" && versionId && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { children: "Versionsmedien werden geladen \u2026" }),
17710
+ versionPhase.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("p", { role: "alert", children: [
17276
17711
  "Versionsmedien konnten nicht geladen werden: ",
17277
17712
  versionPhase.message
17278
17713
  ] }),
17279
- versionPhase.status === "ready" && versionId && versionMedien.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("p", { children: [
17714
+ versionPhase.status === "ready" && versionId && versionMedien.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("p", { children: [
17280
17715
  "Version ",
17281
17716
  versionId,
17282
17717
  " hat keine Medien."
17283
17718
  ] }),
17284
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("ul", { className: "szenen-media__list", children: versionMedien.map((medium) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("li", { children: [
17285
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("code", { children: medium.assetId }),
17286
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("span", { children: [
17719
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("ul", { className: "szenen-media__list", children: versionMedien.map((medium) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("li", { children: [
17720
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("code", { children: medium.assetId }),
17721
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { children: [
17287
17722
  medium.role,
17288
17723
  " \xB7 Position ",
17289
17724
  medium.position
17290
17725
  ] }),
17291
- medium.url && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("a", { href: medium.url, target: "_blank", rel: "noreferrer", children: "\xF6ffnen" }),
17292
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("button", { type: "button", disabled: busy, onClick: () => entfernen(medium), children: "entfernen" })
17726
+ medium.url && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("a", { href: medium.url, target: "_blank", rel: "noreferrer", children: "\xF6ffnen" }),
17727
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("button", { type: "button", disabled: busy, onClick: () => entfernen(medium), children: "entfernen" })
17293
17728
  ] }, `${medium.assetId}:${medium.role}`)) })
17294
17729
  ] }),
17295
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("section", { children: [
17296
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("h3", { children: "Item-Medien" }),
17297
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "szenen-media__lookup", children: [
17298
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("label", { children: [
17730
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("section", { children: [
17731
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("h3", { children: "Item-Medien" }),
17732
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "szenen-media__lookup", children: [
17733
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("label", { children: [
17299
17734
  "Item-ID",
17300
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("input", { value: itemInput, onChange: (event) => setItemInput(event.target.value) })
17735
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("input", { value: itemInput, onChange: (event) => setItemInput(event.target.value) })
17301
17736
  ] }),
17302
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("button", { type: "button", onClick: () => setItemId(itemInput.trim()), children: "Item-Medien laden" })
17737
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("button", { type: "button", onClick: () => setItemId(itemInput.trim()), children: "Item-Medien laden" })
17303
17738
  ] }),
17304
- itemPhase.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("p", { role: "alert", children: [
17739
+ itemPhase.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("p", { role: "alert", children: [
17305
17740
  "Item-Medien konnten nicht geladen werden: ",
17306
17741
  itemPhase.message
17307
17742
  ] }),
17308
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("ul", { className: "szenen-media__list", children: itemMedien.map((medium) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("li", { children: [
17309
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("code", { children: medium.assetId }),
17310
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("span", { children: [
17743
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("ul", { className: "szenen-media__list", children: itemMedien.map((medium) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("li", { children: [
17744
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("code", { children: medium.assetId }),
17745
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { children: [
17311
17746
  medium.role,
17312
17747
  " \xB7 Position ",
17313
17748
  medium.position
17314
17749
  ] }),
17315
- medium.url && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("a", { href: medium.url, target: "_blank", rel: "noreferrer", children: "\xF6ffnen" })
17750
+ medium.url && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("a", { href: medium.url, target: "_blank", rel: "noreferrer", children: "\xF6ffnen" })
17316
17751
  ] }, `${medium.assetId}:${medium.role}:${medium.position}`)) })
17317
17752
  ] }),
17318
- notiz && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { role: notiz.tone === "error" ? "alert" : "status", "data-tone": notiz.tone, children: notiz.text })
17753
+ notiz && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { role: notiz.tone === "error" ? "alert" : "status", "data-tone": notiz.tone, children: notiz.text })
17319
17754
  ] });
17320
17755
  };
17321
17756
 
17322
17757
  // src/features/szenen/areas/DeriveArea.tsx
17323
- var import_react15 = require("react");
17758
+ var import_react16 = require("react");
17324
17759
 
17325
17760
  // src/features/szenen/areas/RecoveryPanel.tsx
17326
- var import_react13 = require("react");
17327
- var import_jsx_runtime15 = require("react/jsx-runtime");
17761
+ var import_react14 = require("react");
17762
+ var import_jsx_runtime16 = require("react/jsx-runtime");
17328
17763
  var Diagnosen = ({ befunde, testId }) => {
17329
17764
  if (befunde.length === 0) return null;
17330
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("ul", { className: "szenen-diagnose__liste", "data-testid": testId, children: befunde.map((d, i) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("li", { "data-severity": d.severity, children: [
17331
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("code", { children: d.code }),
17332
- d.proposal_type && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
17765
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("ul", { className: "szenen-diagnose__liste", "data-testid": testId, children: befunde.map((d, i) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("li", { "data-severity": d.severity, children: [
17766
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("code", { children: d.code }),
17767
+ d.proposal_type && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
17333
17768
  " \xB7 ",
17334
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("strong", { children: d.proposal_type })
17769
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("strong", { children: d.proposal_type })
17335
17770
  ] }),
17336
- d.pointer && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
17771
+ d.pointer && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
17337
17772
  " \xB7 ",
17338
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("code", { children: d.pointer })
17773
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("code", { children: d.pointer })
17339
17774
  ] }),
17340
- typeof d.line === "number" && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
17775
+ typeof d.line === "number" && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
17341
17776
  " \xB7 Zeile ",
17342
17777
  d.line,
17343
17778
  ", Spalte ",
17344
17779
  d.column
17345
17780
  ] }),
17346
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { children: d.message })
17781
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { children: d.message })
17347
17782
  ] }, i)) });
17348
17783
  };
17349
- var Ausbeute = ({ bewertung }) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "szenen-diagnose", "data-testid": "rettung-ergebnis", children: [
17350
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("p", { "data-testid": "rettung-status", children: [
17784
+ var Ausbeute = ({ bewertung }) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "szenen-diagnose", "data-testid": "rettung-ergebnis", children: [
17785
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("p", { "data-testid": "rettung-status", children: [
17351
17786
  bewertung.status === "usable" && "Diese Fassung ist vollst\xE4ndig verwertbar.",
17352
17787
  bewertung.status === "partial" && "Diese Fassung ist teilweise verwertbar \u2014 nicht alles kommt durch.",
17353
17788
  bewertung.status === "invalid" && "Aus dieser Fassung ist nichts zu \xFCbernehmen."
17354
17789
  ] }),
17355
- bewertung.proposals.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
17356
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("h5", { children: "Verwertbar" }),
17357
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("ul", { "data-testid": "rettung-verwertbar", children: bewertung.proposals.map((p) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("li", { "data-testid": `rettung-verwertbar-${p.type}`, children: [
17358
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("strong", { children: p.type }),
17790
+ bewertung.proposals.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
17791
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("h5", { children: "Verwertbar" }),
17792
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("ul", { "data-testid": "rettung-verwertbar", children: bewertung.proposals.map((p) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("li", { "data-testid": `rettung-verwertbar-${p.type}`, children: [
17793
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("strong", { children: p.type }),
17359
17794
  " \u2014 ",
17360
17795
  p.status === "complete" ? "vollst\xE4ndig" : "teilweise; vor dem Ver\xF6ffentlichen zu erg\xE4nzen",
17361
- p.status === "partial" && p.gaps && p.gaps.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("ul", { children: p.gaps.map((l, i) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("li", { children: [
17362
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("code", { children: l.pointer }),
17796
+ p.status === "partial" && p.gaps && p.gaps.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("ul", { children: p.gaps.map((l, i) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("li", { children: [
17797
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("code", { children: l.pointer }),
17363
17798
  ": ",
17364
17799
  l.reason
17365
17800
  ] }, i)) })
17366
17801
  ] }, p.type)) })
17367
17802
  ] }),
17368
- bewertung.rejected.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
17369
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("h5", { children: "Nicht verwertbar" }),
17370
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("ul", { "data-testid": "rettung-abgelehnt", children: bewertung.rejected.map((r) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("li", { "data-testid": `rettung-abgelehnt-${r.type}`, children: [
17371
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("strong", { children: r.type }),
17372
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Diagnosen, { befunde: r.diagnostics, testId: `rettung-grund-${r.type}` })
17803
+ bewertung.rejected.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
17804
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("h5", { children: "Nicht verwertbar" }),
17805
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("ul", { "data-testid": "rettung-abgelehnt", children: bewertung.rejected.map((r) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("li", { "data-testid": `rettung-abgelehnt-${r.type}`, children: [
17806
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("strong", { children: r.type }),
17807
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Diagnosen, { befunde: r.diagnostics, testId: `rettung-grund-${r.type}` })
17373
17808
  ] }, r.type)) })
17374
17809
  ] })
17375
17810
  ] });
17376
17811
  var RecoveryPanel = ({ port, lauf }) => {
17377
- const [arbeitskopie, setArbeitskopie] = (0, import_react13.useState)(null);
17378
- const [bewertung, setBewertung] = (0, import_react13.useState)(null);
17379
- const [gesichert, setGesichert] = (0, import_react13.useState)(null);
17380
- const [meldung, setMeldung] = (0, import_react13.useState)(null);
17381
- const [laeuft, setLaeuft] = (0, import_react13.useState)(false);
17812
+ const [arbeitskopie, setArbeitskopie] = (0, import_react14.useState)(null);
17813
+ const [bewertung, setBewertung] = (0, import_react14.useState)(null);
17814
+ const [gesichert, setGesichert] = (0, import_react14.useState)(null);
17815
+ const [meldung, setMeldung] = (0, import_react14.useState)(null);
17816
+ const [laeuft, setLaeuft] = (0, import_react14.useState)(false);
17382
17817
  if (!port.derivation) return null;
17383
17818
  if (typeof lauf.raw_output !== "string" || lauf.raw_output.length === 0) return null;
17384
17819
  const derivation = port.derivation;
@@ -17414,16 +17849,16 @@ var RecoveryPanel = ({ port, lauf }) => {
17414
17849
  setLaeuft(false);
17415
17850
  }
17416
17851
  }
17417
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("section", { className: "szenen-rettung", "data-testid": "rettung", children: [
17418
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("h4", { children: "Antwort retten" }),
17419
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("p", { className: "szenen-area__lead", children: [
17852
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("section", { className: "szenen-rettung", "data-testid": "rettung", children: [
17853
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("h4", { children: "Antwort retten" }),
17854
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("p", { className: "szenen-area__lead", children: [
17420
17855
  "Der Lauf ist bezahlt und seine Antwort liegt vor. Sie l\xE4sst sich hier pr\xFCfen und korrigieren \u2014 ",
17421
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("strong", { children: "ohne" }),
17856
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("strong", { children: "ohne" }),
17422
17857
  " einen weiteren Modellaufruf. Das Original bleibt unver\xE4ndert."
17423
17858
  ] }),
17424
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("label", { className: "szenen-field", children: [
17425
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: "Original der Modellantwort (unver\xE4nderlich)" }),
17426
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
17859
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("label", { className: "szenen-field", children: [
17860
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { children: "Original der Modellantwort (unver\xE4nderlich)" }),
17861
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
17427
17862
  "textarea",
17428
17863
  {
17429
17864
  readOnly: true,
@@ -17434,12 +17869,12 @@ var RecoveryPanel = ({ port, lauf }) => {
17434
17869
  }
17435
17870
  )
17436
17871
  ] }),
17437
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("label", { className: "szenen-field", children: [
17438
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { children: [
17872
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("label", { className: "szenen-field", children: [
17873
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("span", { children: [
17439
17874
  "Arbeitskopie",
17440
17875
  bearbeitet ? " (bearbeitet)" : ""
17441
17876
  ] }),
17442
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
17877
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
17443
17878
  "textarea",
17444
17879
  {
17445
17880
  rows: 8,
@@ -17449,8 +17884,8 @@ var RecoveryPanel = ({ port, lauf }) => {
17449
17884
  }
17450
17885
  )
17451
17886
  ] }),
17452
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "szenen-rettung__aktionen", children: [
17453
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
17887
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "szenen-rettung__aktionen", children: [
17888
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
17454
17889
  "button",
17455
17890
  {
17456
17891
  type: "button",
@@ -17460,7 +17895,7 @@ var RecoveryPanel = ({ port, lauf }) => {
17460
17895
  children: "Arbeitskopie pr\xFCfen (kein Modellaufruf)"
17461
17896
  }
17462
17897
  ),
17463
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
17898
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
17464
17899
  "button",
17465
17900
  {
17466
17901
  type: "button",
@@ -17470,7 +17905,7 @@ var RecoveryPanel = ({ port, lauf }) => {
17470
17905
  children: "Arbeitsfassung speichern"
17471
17906
  }
17472
17907
  ),
17473
- arbeitskopie !== null && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
17908
+ arbeitskopie !== null && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
17474
17909
  "button",
17475
17910
  {
17476
17911
  type: "button",
@@ -17485,15 +17920,15 @@ var RecoveryPanel = ({ port, lauf }) => {
17485
17920
  }
17486
17921
  )
17487
17922
  ] }),
17488
- meldung && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "szenen-error", role: "alert", "data-testid": "rettung-meldung", children: meldung }),
17489
- bewertung && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Ausbeute, { bewertung }),
17490
- bewertung && bewertung.diagnostics.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "szenen-diagnose", children: [
17491
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("h5", { children: "Befunde an dieser Fassung" }),
17492
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Diagnosen, { befunde: bewertung.diagnostics, testId: "rettung-befunde" })
17923
+ meldung && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "szenen-error", role: "alert", "data-testid": "rettung-meldung", children: meldung }),
17924
+ bewertung && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Ausbeute, { bewertung }),
17925
+ bewertung && bewertung.diagnostics.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "szenen-diagnose", children: [
17926
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("h5", { children: "Befunde an dieser Fassung" }),
17927
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Diagnosen, { befunde: bewertung.diagnostics, testId: "rettung-befunde" })
17493
17928
  ] }),
17494
- gesichert && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("p", { "data-testid": "rettung-gesichert", children: [
17929
+ gesichert && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("p", { "data-testid": "rettung-gesichert", children: [
17495
17930
  "Gespeichert als Arbeitsfassung ",
17496
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("code", { children: gesichert.recovery_id }),
17931
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("code", { children: gesichert.recovery_id }),
17497
17932
  gesichert.edited ? " (bearbeitet)" : " (unver\xE4ndert)",
17498
17933
  ". Das Original des Laufs ist davon unber\xFChrt."
17499
17934
  ] })
@@ -17501,12 +17936,12 @@ var RecoveryPanel = ({ port, lauf }) => {
17501
17936
  };
17502
17937
 
17503
17938
  // src/features/szenen/areas/ChainActions.tsx
17504
- var import_react14 = require("react");
17505
- var import_jsx_runtime16 = require("react/jsx-runtime");
17939
+ var import_react15 = require("react");
17940
+ var import_jsx_runtime17 = require("react/jsx-runtime");
17506
17941
  var ChainActions = ({ port, runId, recoveryId }) => {
17507
- const [graph, setGraph] = (0, import_react14.useState)(null);
17508
- const [meldung, setMeldung] = (0, import_react14.useState)(null);
17509
- const [laeuft, setLaeuft] = (0, import_react14.useState)(false);
17942
+ const [graph, setGraph] = (0, import_react15.useState)(null);
17943
+ const [meldung, setMeldung] = (0, import_react15.useState)(null);
17944
+ const [laeuft, setLaeuft] = (0, import_react15.useState)(false);
17510
17945
  if (!port.derivation) return null;
17511
17946
  const derivation = port.derivation;
17512
17947
  const runs = port.runs;
@@ -17528,14 +17963,14 @@ var ChainActions = ({ port, runId, recoveryId }) => {
17528
17963
  setLaeuft(false);
17529
17964
  }
17530
17965
  }
17531
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("section", { className: "szenen-kette", "data-testid": "kette", children: [
17532
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("h4", { children: "Draft-Kette" }),
17533
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("p", { className: "szenen-area__lead", children: [
17966
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("section", { className: "szenen-kette", "data-testid": "kette", children: [
17967
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h4", { children: "Draft-Kette" }),
17968
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("p", { className: "szenen-area__lead", children: [
17534
17969
  "Szene, Aufbau und Shot entstehen als zusammenh\xE4ngende Entw\xFCrfe. Daraus l\xE4sst sich sofort ein Prompt erzeugen \u2014 ",
17535
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("strong", { children: "ohne" }),
17970
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("strong", { children: "ohne" }),
17536
17971
  " vorher etwas zu ver\xF6ffentlichen."
17537
17972
  ] }),
17538
- !graph && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
17973
+ !graph && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
17539
17974
  "button",
17540
17975
  {
17541
17976
  type: "button",
@@ -17545,34 +17980,34 @@ var ChainActions = ({ port, runId, recoveryId }) => {
17545
17980
  children: "Als Draft-Kette \xFCbernehmen"
17546
17981
  }
17547
17982
  ),
17548
- graph && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { "data-testid": "kette-ergebnis", children: [
17549
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("p", { children: [
17983
+ graph && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { "data-testid": "kette-ergebnis", children: [
17984
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("p", { children: [
17550
17985
  "Kette ",
17551
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("code", { children: graph.chainId }),
17986
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("code", { children: graph.chainId }),
17552
17987
  " angelegt. Kein Knoten ist ver\xF6ffentlicht."
17553
17988
  ] }),
17554
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("ul", { "data-testid": "kette-knoten", children: graph.created.map((k) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("li", { "data-testid": `kette-knoten-${k.type}`, children: [
17555
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("strong", { children: k.type }),
17989
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("ul", { "data-testid": "kette-knoten", children: graph.created.map((k) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("li", { "data-testid": `kette-knoten-${k.type}`, children: [
17990
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("strong", { children: k.type }),
17556
17991
  " \u2014 Element ",
17557
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("code", { children: k.elementId }),
17992
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("code", { children: k.elementId }),
17558
17993
  ", Entwurf ",
17559
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("code", { children: k.draftId }),
17994
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("code", { children: k.draftId }),
17560
17995
  " (Revision ",
17561
17996
  k.revision,
17562
17997
  ")"
17563
17998
  ] }, k.type)) }),
17564
- graph.missing.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "szenen-diagnose", "data-testid": "kette-fehlend", children: [
17565
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("h5", { children: "Unvollst\xE4ndig erzeugt" }),
17566
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("ul", { children: graph.missing.map((m) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("li", { children: [
17567
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("strong", { children: m.type }),
17999
+ graph.missing.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "szenen-diagnose", "data-testid": "kette-fehlend", children: [
18000
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h5", { children: "Unvollst\xE4ndig erzeugt" }),
18001
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("ul", { children: graph.missing.map((m) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("li", { children: [
18002
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("strong", { children: m.type }),
17568
18003
  ": ",
17569
18004
  m.reason
17570
18005
  ] }, m.type)) })
17571
18006
  ] })
17572
18007
  ] }),
17573
- shotKnoten && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
17574
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { children: 'Die Entw\xFCrfe lassen sich jetzt unter \u201E1 \xB7 Bausteine" \xE4ndern. Der Prompt-Lauf friert den Stand ein, den er dabei vorfindet \u2014 dieselbe Aktion steht auch am Shot selbst, unter \u201E4 \xB7 Prompt".' }),
17575
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
18008
+ shotKnoten && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [
18009
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { children: 'Die Entw\xFCrfe lassen sich jetzt unter \u201E1 \xB7 Bausteine" \xE4ndern. Der Prompt-Lauf friert den Stand ein, den er dabei vorfindet \u2014 dieselbe Aktion steht auch am Shot selbst, unter \u201E4 \xB7 Prompt".' }),
18010
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
17576
18011
  PromptStartAction,
17577
18012
  {
17578
18013
  port,
@@ -17580,20 +18015,20 @@ var ChainActions = ({ port, runId, recoveryId }) => {
17580
18015
  }
17581
18016
  )
17582
18017
  ] }),
17583
- meldung && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "szenen-error", role: "alert", "data-testid": "kette-meldung", children: meldung })
18018
+ meldung && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "szenen-error", role: "alert", "data-testid": "kette-meldung", children: meldung })
17584
18019
  ] });
17585
18020
  };
17586
18021
 
17587
18022
  // src/features/szenen/areas/DeriveArea.tsx
17588
- var import_jsx_runtime17 = require("react/jsx-runtime");
18023
+ var import_jsx_runtime18 = require("react/jsx-runtime");
17589
18024
  var MODUS_TEXT = {
17590
18025
  prompt: "Nur Prompt",
17591
18026
  image: "Nur Bild",
17592
18027
  image_prompt: "Bild und Prompt"
17593
18028
  };
17594
18029
  var BelegFeld = ({ titel, text, testId, offen }) => {
17595
- const [kopiert, setKopiert] = (0, import_react15.useState)(false);
17596
- const feld = (0, import_react15.useRef)(null);
18030
+ const [kopiert, setKopiert] = (0, import_react16.useState)(false);
18031
+ const feld = (0, import_react16.useRef)(null);
17597
18032
  async function kopieren() {
17598
18033
  try {
17599
18034
  await navigator.clipboard.writeText(text);
@@ -17603,15 +18038,15 @@ var BelegFeld = ({ titel, text, testId, offen }) => {
17603
18038
  setKopiert(false);
17604
18039
  }
17605
18040
  }
17606
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("details", { open: offen, "data-testid": `belege-${testId}`, children: [
17607
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("summary", { children: [
18041
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("details", { open: offen, "data-testid": `belege-${testId}`, children: [
18042
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("summary", { children: [
17608
18043
  titel,
17609
18044
  " (",
17610
18045
  text.length,
17611
18046
  " Zeichen)"
17612
18047
  ] }),
17613
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "szenen-beleg__kopf", children: [
17614
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
18048
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "szenen-beleg__kopf", children: [
18049
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
17615
18050
  "button",
17616
18051
  {
17617
18052
  type: "button",
@@ -17620,9 +18055,9 @@ var BelegFeld = ({ titel, text, testId, offen }) => {
17620
18055
  children: "Kopieren"
17621
18056
  }
17622
18057
  ),
17623
- kopiert && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { "data-testid": `kopiert-${testId}`, children: "Kopiert." })
18058
+ kopiert && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { "data-testid": `kopiert-${testId}`, children: "Kopiert." })
17624
18059
  ] }),
17625
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
18060
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
17626
18061
  "textarea",
17627
18062
  {
17628
18063
  ref: feld,
@@ -17636,8 +18071,8 @@ var BelegFeld = ({ titel, text, testId, offen }) => {
17636
18071
  )
17637
18072
  ] });
17638
18073
  };
17639
- var Belege = ({ lauf }) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "szenen-diagnose", "data-testid": "belege", children: [
17640
- lauf.raw_output ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
18074
+ var Belege = ({ lauf }) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "szenen-diagnose", "data-testid": "belege", children: [
18075
+ lauf.raw_output ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
17641
18076
  BelegFeld,
17642
18077
  {
17643
18078
  titel: "Rohantwort des Modells",
@@ -17648,9 +18083,9 @@ var Belege = ({ lauf }) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div",
17648
18083
  ) : (
17649
18084
  /* Kein Text ist auch eine Auskunft: Der Provider hat nichts geliefert,
17650
18085
  das Modell hat also nicht „falsch geantwortet". */
17651
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { "data-testid": "roh-antwort-fehlt", children: "Es gibt keine Rohantwort \u2014 der Lauf ist gescheitert, bevor ein Text ankam (etwa Netz, Sperre oder Providerfehler)." })
18086
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { "data-testid": "roh-antwort-fehlt", children: "Es gibt keine Rohantwort \u2014 der Lauf ist gescheitert, bevor ein Text ankam (etwa Netz, Sperre oder Providerfehler)." })
17652
18087
  ),
17653
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
18088
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
17654
18089
  BelegFeld,
17655
18090
  {
17656
18091
  titel: "Systemprompt dieses Laufs",
@@ -17662,18 +18097,18 @@ var Belege = ({ lauf }) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div",
17662
18097
  ] });
17663
18098
  var Herkunft = ({ lauf }) => {
17664
18099
  if (!lauf.follows) return null;
17665
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("p", { className: "szenen-run__herkunft", "data-testid": "folgt-auf", children: [
18100
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("p", { className: "szenen-run__herkunft", "data-testid": "folgt-auf", children: [
17666
18101
  "Folgt auf Lauf ",
17667
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("code", { children: lauf.follows.run_id }),
18102
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("code", { children: lauf.follows.run_id }),
17668
18103
  ".",
17669
18104
  lauf.status === "succeeded" && " Im Folgelauf gelungen."
17670
18105
  ] });
17671
18106
  };
17672
18107
  var Widerspruch = ({ lauf }) => {
17673
18108
  if (!lauf.reply) return null;
17674
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "szenen-diagnose szenen-diagnose--antwort", "data-testid": "modell-antwort", children: [
17675
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h4", { children: "Das Modell antwortet auf die Beanstandung" }),
17676
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { children: lauf.reply })
18109
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "szenen-diagnose szenen-diagnose--antwort", "data-testid": "modell-antwort", children: [
18110
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h4", { children: "Das Modell antwortet auf die Beanstandung" }),
18111
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { children: lauf.reply })
17677
18112
  ] });
17678
18113
  };
17679
18114
  function readAsBase642(datei) {
@@ -17688,11 +18123,33 @@ function readAsBase642(datei) {
17688
18123
  leser.readAsDataURL(datei);
17689
18124
  });
17690
18125
  }
18126
+ var ERSTE_KACHELN = 12;
18127
+ function useSichtbareKacheln(alle, wurzel) {
18128
+ const [gesehen, setGesehen] = (0, import_react16.useState)([]);
18129
+ const schluessel = alle.join(" ");
18130
+ (0, import_react16.useEffect)(() => {
18131
+ const ziel = wurzel.current;
18132
+ if (!ziel || typeof IntersectionObserver === "undefined") return void 0;
18133
+ const beobachter = new IntersectionObserver((eintraege) => {
18134
+ const neue = eintraege.filter((e) => e.isIntersecting).map((e) => e.target.dataset.mediaRef).filter((r) => Boolean(r));
18135
+ if (neue.length === 0) return;
18136
+ setGesehen((bisher) => [.../* @__PURE__ */ new Set([...bisher, ...neue])]);
18137
+ for (const e of eintraege) if (e.isIntersecting) beobachter.unobserve(e.target);
18138
+ }, { root: ziel, rootMargin: "200px" });
18139
+ ziel.querySelectorAll("[data-media-ref]").forEach((el) => beobachter.observe(el));
18140
+ return () => beobachter.disconnect();
18141
+ }, [wurzel, schluessel]);
18142
+ return (0, import_react16.useMemo)(
18143
+ () => [.../* @__PURE__ */ new Set([...alle.slice(0, ERSTE_KACHELN), ...gesehen])],
18144
+ [schluessel, gesehen]
18145
+ );
18146
+ }
17691
18147
  function useVorschauen(port, mediaRefs) {
17692
- const [quellen, setQuellen] = (0, import_react15.useState)(() => /* @__PURE__ */ new Map());
17693
- const gehalten = (0, import_react15.useRef)(/* @__PURE__ */ new Map());
18148
+ const [stand, setStand] = (0, import_react16.useState)(() => ({ quellen: /* @__PURE__ */ new Map(), gescheitert: /* @__PURE__ */ new Set() }));
18149
+ const gehalten = (0, import_react16.useRef)(/* @__PURE__ */ new Map());
18150
+ const ohneBild = (0, import_react16.useRef)(/* @__PURE__ */ new Set());
17694
18151
  const schluessel = mediaRefs.join(" ");
17695
- (0, import_react15.useEffect)(() => {
18152
+ (0, import_react16.useEffect)(() => {
17696
18153
  const bestand = port.imageLibrary;
17697
18154
  if (!bestand?.loadPreview) return void 0;
17698
18155
  const refs = schluessel ? schluessel.split(" ") : [];
@@ -17701,53 +18158,67 @@ function useVorschauen(port, mediaRefs) {
17701
18158
  bestand,
17702
18159
  refs,
17703
18160
  (mediaRef, quelle) => {
17704
- gehalten.current.set(mediaRef, quelle);
17705
- setQuellen(new Map(gehalten.current));
18161
+ if (quelle) gehalten.current.set(mediaRef, quelle);
18162
+ else ohneBild.current.add(mediaRef);
18163
+ setStand({
18164
+ quellen: new Map(gehalten.current),
18165
+ gescheitert: new Set(ohneBild.current)
18166
+ });
17706
18167
  },
17707
- { parallel: 4, hat: (ref) => gehalten.current.has(ref), lauf }
18168
+ {
18169
+ parallel: 4,
18170
+ hat: (ref) => gehalten.current.has(ref) || ohneBild.current.has(ref),
18171
+ lauf,
18172
+ // Ein Fehlschlag ist eine Auskunft, kein Grund weiterzuprobieren:
18173
+ // Die Kachel bekommt einen Platzhalter, das Werk bleibt wählbar.
18174
+ gescheitert: (ref) => {
18175
+ ohneBild.current.add(ref);
18176
+ setStand({
18177
+ quellen: new Map(gehalten.current),
18178
+ gescheitert: new Set(ohneBild.current)
18179
+ });
18180
+ }
18181
+ }
17708
18182
  );
17709
18183
  return () => {
17710
18184
  lauf.abgebrochen = true;
17711
18185
  };
17712
18186
  }, [port, schluessel]);
17713
- return quellen;
18187
+ return stand;
17714
18188
  }
17715
- var Kachel = ({ quelle, alt }) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "szenen-bildkachel", children: quelle ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("img", { src: quelle, alt, loading: "lazy" }) : /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "szenen-bildkachel__leer", "aria-hidden": "true" }) });
17716
18189
  var BildWaehler = ({ port, gewaehlt, onWaehlen, onEntfernen }) => {
17717
- const [suche, setSuche] = (0, import_react15.useState)("");
17718
- const [offenesWerk, setOffenesWerk] = (0, import_react15.useState)(null);
18190
+ const [suche, setSuche] = (0, import_react16.useState)("");
18191
+ const [fokus, setFokus] = (0, import_react16.useState)(null);
18192
+ const browser = (0, import_react16.useRef)(null);
17719
18193
  const [items] = usePortQuery(
17720
18194
  () => port.imageLibrary.listItems({ search: suche.trim() || void 0, limit: 60 }),
17721
18195
  [port, suche]
17722
18196
  );
17723
- const werk = items.status === "ready" ? items.value.find((i) => i.itemRef === offenesWerk) ?? null : null;
17724
- const sichtbar = (0, import_react15.useMemo)(() => {
17725
- const refs = werk ? werk.images.map((b) => b.mediaRef) : items.status === "ready" ? items.value.map((i) => i.images[0]?.mediaRef).filter((r) => Boolean(r)) : [];
17726
- return [.../* @__PURE__ */ new Set([...refs, ...gewaehlt.map((b) => b.mediaRef)])];
17727
- }, [items, werk, gewaehlt]);
17728
- const quellen = useVorschauen(port, sichtbar);
18197
+ const werke = items.status === "ready" ? items.value : [];
18198
+ const werk = werke.find((i) => i.itemRef === fokus) ?? null;
18199
+ const deckbilder = (0, import_react16.useMemo)(
18200
+ () => werke.map((i) => i.images[0]?.mediaRef).filter((r) => Boolean(r)),
18201
+ [werke]
18202
+ );
18203
+ const sichtbareDeckbilder = useSichtbareKacheln(deckbilder, browser);
18204
+ const anzufordern = (0, import_react16.useMemo)(() => [.../* @__PURE__ */ new Set([
18205
+ ...sichtbareDeckbilder,
18206
+ ...werk ? werk.images.map((b) => b.mediaRef) : [],
18207
+ ...gewaehlt.map((b) => b.mediaRef)
18208
+ ])], [sichtbareDeckbilder, werk, gewaehlt]);
18209
+ const { quellen, gescheitert } = useVorschauen(port, anzufordern);
17729
18210
  const quelleVon = (bild) => bild.thumbUrl || quellen.get(bild.mediaRef) || null;
17730
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "szenen-bildwahl", "data-testid": "bildwahl", children: [
17731
- werk ? /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "szenen-bildwahl__kopf", children: [
17732
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
17733
- "button",
17734
- {
17735
- type: "button",
17736
- className: "szenen-bildwahl__zurueck",
17737
- onClick: () => setOffenesWerk(null),
17738
- "data-testid": "bildwahl-zurueck",
17739
- children: "Zurueck zur Auswahl"
17740
- }
17741
- ),
17742
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "szenen-bildwahl__werktitel", "data-testid": "bildwahl-werktitel", children: [
17743
- werk.title,
17744
- " \xB7 ",
17745
- werk.images.length,
17746
- " Bilder"
17747
- ] })
17748
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("label", { className: "szenen-field", children: [
17749
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: "Bild aus dem Bestand" }),
17750
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
18211
+ const istGewaehlt = (mediaRef) => gewaehlt.some((b) => b.mediaRef === mediaRef);
18212
+ function werkAntippen(item) {
18213
+ const deckbild = item.images[0];
18214
+ if (!deckbild) return;
18215
+ if (item.images.length === 1) onWaehlen(deckbild);
18216
+ else setFokus(item.itemRef === fokus ? null : item.itemRef);
18217
+ }
18218
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "szenen-bildwahl", "data-testid": "bildwahl", children: [
18219
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("label", { className: "szenen-field", children: [
18220
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: "Bild aus dem Bestand" }),
18221
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
17751
18222
  "input",
17752
18223
  {
17753
18224
  type: "search",
@@ -17761,63 +18232,107 @@ var BildWaehler = ({ port, gewaehlt, onWaehlen, onEntfernen }) => {
17761
18232
  }
17762
18233
  )
17763
18234
  ] }),
17764
- items.status === "loading" && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { children: "Bilder werden geladen \u2026" }),
17765
- items.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("p", { className: "szenen-error", role: "alert", children: [
18235
+ items.status === "loading" && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { children: "Bilder werden geladen \u2026" }),
18236
+ items.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("p", { className: "szenen-error", role: "alert", children: [
17766
18237
  "Der Bildbestand ist nicht lesbar: ",
17767
18238
  items.message
17768
18239
  ] }),
17769
- items.status === "ready" && items.value.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "szenen-empty", "data-testid": "bildwahl-leer", children: "Zu dieser Suche gibt es kein Bild. Ohne Treffer bleibt der Upload." }),
17770
- werk && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("ul", { className: "szenen-bildwahl__raster", "data-testid": "bildwahl-galerie", children: werk.images.map((bild, position) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
17771
- "button",
18240
+ items.status === "ready" && werke.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "szenen-empty", "data-testid": "bildwahl-leer", children: "Zu dieser Suche gibt es kein Bild. Ohne Treffer bleibt der Upload." }),
18241
+ werke.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
18242
+ "div",
17772
18243
  {
17773
- type: "button",
17774
- onClick: () => {
17775
- onWaehlen(bild);
17776
- setOffenesWerk(null);
17777
- },
17778
- "data-testid": `bild-waehlen-${bild.mediaRef}`,
17779
- title: bild.title,
17780
- children: [
17781
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Kachel, { quelle: quelleVon(bild), alt: bild.title }),
17782
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "szenen-bildwahl__nummer", children: [
17783
- "#",
17784
- position + 1
17785
- ] })
17786
- ]
18244
+ className: "szenen-bildwahl__browser",
18245
+ ref: browser,
18246
+ "data-testid": "bildwahl-werke",
18247
+ children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("ul", { className: "szenen-bildwahl__raster", children: werke.map((item) => {
18248
+ const deckbild = item.images[0];
18249
+ if (!deckbild) return null;
18250
+ const fokussiert = item.itemRef === fokus;
18251
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("li", { "data-media-ref": deckbild.mediaRef, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
18252
+ "button",
18253
+ {
18254
+ type: "button",
18255
+ className: `szenen-bildwahl__karte${fokussiert ? " is-fokus" : ""}`,
18256
+ onClick: () => werkAntippen(item),
18257
+ "aria-pressed": fokussiert,
18258
+ "data-testid": `item-waehlen-${item.itemRef}`,
18259
+ title: item.title,
18260
+ children: [
18261
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
18262
+ Kachel,
18263
+ {
18264
+ quelle: quelleVon(deckbild),
18265
+ alt: item.title,
18266
+ ...gescheitert.has(deckbild.mediaRef) ? { leerText: "Vorschau fehlt" } : {}
18267
+ }
18268
+ ),
18269
+ item.images.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
18270
+ "span",
18271
+ {
18272
+ className: "szenen-bildwahl__anzahl",
18273
+ "data-testid": `item-anzahl-${item.itemRef}`,
18274
+ children: [
18275
+ item.images.length,
18276
+ "x"
18277
+ ]
18278
+ }
18279
+ ),
18280
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "szenen-bildwahl__kacheltitel", children: item.title })
18281
+ ]
18282
+ }
18283
+ ) }, item.itemRef);
18284
+ }) })
17787
18285
  }
17788
- ) }, bild.mediaRef)) }),
17789
- !werk && items.status === "ready" && items.value.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("ul", { className: "szenen-bildwahl__raster", "data-testid": "bildwahl-werke", children: items.value.map((item) => {
17790
- const deckbild = item.images[0];
17791
- if (!deckbild) return null;
17792
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
18286
+ ),
18287
+ werk && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("section", { className: "szenen-bildwahl__inspector", "data-testid": "bildwahl-galerie", children: [
18288
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("header", { className: "szenen-bildwahl__inspektorkopf", children: [
18289
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("span", { className: "szenen-bildwahl__werktitel", "data-testid": "bildwahl-werktitel", children: [
18290
+ werk.title,
18291
+ " \xB7 ",
18292
+ werk.images.length,
18293
+ " Bilder"
18294
+ ] }),
18295
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
18296
+ "button",
18297
+ {
18298
+ type: "button",
18299
+ className: "szenen-bildwahl__zurueck",
18300
+ onClick: () => setFokus(null),
18301
+ "data-testid": "bildwahl-zurueck",
18302
+ children: "Schliessen"
18303
+ }
18304
+ )
18305
+ ] }),
18306
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("ul", { className: "szenen-bildwahl__streifen", children: werk.images.map((bild, position) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
17793
18307
  "button",
17794
18308
  {
17795
18309
  type: "button",
17796
- onClick: () => item.images.length === 1 ? onWaehlen(deckbild) : setOffenesWerk(item.itemRef),
17797
- "data-testid": `item-waehlen-${item.itemRef}`,
17798
- title: item.title,
18310
+ className: `szenen-bildwahl__variante${istGewaehlt(bild.mediaRef) ? " is-gewaehlt" : ""}`,
18311
+ onClick: () => onWaehlen(bild),
18312
+ "aria-pressed": istGewaehlt(bild.mediaRef),
18313
+ "data-testid": `bild-waehlen-${bild.mediaRef}`,
18314
+ title: bild.title,
17799
18315
  children: [
17800
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Kachel, { quelle: quelleVon(deckbild), alt: item.title }),
17801
- item.images.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
17802
- "span",
18316
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
18317
+ Kachel,
17803
18318
  {
17804
- className: "szenen-bildwahl__anzahl",
17805
- "data-testid": `item-anzahl-${item.itemRef}`,
17806
- children: [
17807
- item.images.length,
17808
- "x"
17809
- ]
18319
+ quelle: quelleVon(bild),
18320
+ alt: bild.title,
18321
+ ...gescheitert.has(bild.mediaRef) ? { leerText: "Vorschau fehlt" } : {}
17810
18322
  }
17811
18323
  ),
17812
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "szenen-bildwahl__titel", children: item.title })
18324
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("span", { className: "szenen-bildwahl__nummer", children: [
18325
+ "#",
18326
+ position + 1
18327
+ ] })
17813
18328
  ]
17814
18329
  }
17815
- ) }, item.itemRef);
17816
- }) }),
17817
- gewaehlt.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("ul", { className: "szenen-bildwahl__gewaehlt", "data-testid": "bilder-gewaehlt", children: gewaehlt.map((bild) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("li", { children: [
17818
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Kachel, { quelle: quelleVon(bild), alt: bild.title }),
17819
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "szenen-bildwahl__titel", children: bild.title }),
17820
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
18330
+ ) }, bild.mediaRef)) })
18331
+ ] }),
18332
+ gewaehlt.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("ul", { className: "szenen-bildwahl__gewaehlt", "data-testid": "bilder-gewaehlt", children: gewaehlt.map((bild) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("li", { children: [
18333
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Kachel, { quelle: quelleVon(bild), alt: bild.title }),
18334
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "szenen-bildwahl__kacheltitel", children: bild.title }),
18335
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
17821
18336
  "button",
17822
18337
  {
17823
18338
  type: "button",
@@ -17836,19 +18351,19 @@ async function digestOf(datei) {
17836
18351
  return [...new Uint8Array(hash)].map((b) => b.toString(16).padStart(2, "0")).join("");
17837
18352
  }
17838
18353
  var DeriveArea = ({ port, contextId }) => {
17839
- const [policyVersionId, setPolicyVersionId] = (0, import_react15.useState)("");
17840
- const [modus, setModus] = (0, import_react15.useState)("prompt");
17841
- const [promptText, setPromptText] = (0, import_react15.useState)("");
17842
- const [dateien, setDateien] = (0, import_react15.useState)([]);
17843
- const [bestandsbilder, setBestandsbilder] = (0, import_react15.useState)([]);
17844
- const [laeuft, setLaeuft] = (0, import_react15.useState)(false);
17845
- const [lauf, setLauf] = (0, import_react15.useState)(null);
17846
- const [meldung, setMeldung] = (0, import_react15.useState)(null);
17847
- const [uebernommen, setUebernommen] = (0, import_react15.useState)({});
17848
- const [titel, setTitel] = (0, import_react15.useState)({});
17849
- const [referenzen, setReferenzen] = (0, import_react15.useState)({});
17850
- const [beanstandung, setBeanstandung] = (0, import_react15.useState)(null);
17851
- const [zusatz, setZusatz] = (0, import_react15.useState)("");
18354
+ const [policyVersionId, setPolicyVersionId] = (0, import_react16.useState)("");
18355
+ const [modus, setModus] = (0, import_react16.useState)("prompt");
18356
+ const [promptText, setPromptText] = (0, import_react16.useState)("");
18357
+ const [dateien, setDateien] = (0, import_react16.useState)([]);
18358
+ const [bestandsbilder, setBestandsbilder] = (0, import_react16.useState)([]);
18359
+ const [laeuft, setLaeuft] = (0, import_react16.useState)(false);
18360
+ const [lauf, setLauf] = (0, import_react16.useState)(null);
18361
+ const [meldung, setMeldung] = (0, import_react16.useState)(null);
18362
+ const [uebernommen, setUebernommen] = (0, import_react16.useState)({});
18363
+ const [titel, setTitel] = (0, import_react16.useState)({});
18364
+ const [referenzen, setReferenzen] = (0, import_react16.useState)({});
18365
+ const [beanstandung, setBeanstandung] = (0, import_react16.useState)(null);
18366
+ const [zusatz, setZusatz] = (0, import_react16.useState)("");
17852
18367
  const [regeln] = usePortQuery(
17853
18368
  () => port.derivation.listPolicies(contextId),
17854
18369
  [port, contextId]
@@ -17929,12 +18444,12 @@ ${teile.map((t) => `- ${t}`).join("\n")}`;
17929
18444
  const text = beanstandung ?? vorgabeBeanstandung(satz);
17930
18445
  const bilderFehlen = satz.input.images.some((bild) => bild.kind !== "library");
17931
18446
  const bereit = Boolean(text.trim()) && !bilderFehlen && !laeuft;
17932
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "szenen-folgelauf", "data-testid": "folgelauf", children: [
17933
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h4", { children: "Korrektur- oder Erg\xE4nzungslauf" }),
17934
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "szenen-area__lead", children: satz.status === "failed" ? "Das Modell bekommt seine Antwort und die Beanstandung noch einmal vorgelegt." : "Das Ergebnis steht. Wenn etwas offen blieb, kann das Modell nachbessern." }),
17935
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("label", { className: "szenen-field", children: [
17936
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: "Beanstandung" }),
17937
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
18447
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "szenen-folgelauf", "data-testid": "folgelauf", children: [
18448
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h4", { children: "Korrektur- oder Erg\xE4nzungslauf" }),
18449
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "szenen-area__lead", children: satz.status === "failed" ? "Das Modell bekommt seine Antwort und die Beanstandung noch einmal vorgelegt." : "Das Ergebnis steht. Wenn etwas offen blieb, kann das Modell nachbessern." }),
18450
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("label", { className: "szenen-field", children: [
18451
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: "Beanstandung" }),
18452
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
17938
18453
  "textarea",
17939
18454
  {
17940
18455
  rows: 4,
@@ -17944,9 +18459,9 @@ ${teile.map((t) => `- ${t}`).join("\n")}`;
17944
18459
  }
17945
18460
  )
17946
18461
  ] }),
17947
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("label", { className: "szenen-field", children: [
17948
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: "Zus\xE4tzliche Anweisung (optional)" }),
17949
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
18462
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("label", { className: "szenen-field", children: [
18463
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: "Zus\xE4tzliche Anweisung (optional)" }),
18464
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
17950
18465
  "textarea",
17951
18466
  {
17952
18467
  rows: 2,
@@ -17957,8 +18472,8 @@ ${teile.map((t) => `- ${t}`).join("\n")}`;
17957
18472
  }
17958
18473
  )
17959
18474
  ] }),
17960
- bilderFehlen && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "szenen-error", "data-testid": "folgelauf-ohne-bild", children: "Die Bilder dieses Laufs wurden nicht im Bestand abgelegt \u2014 er ist \xE4lter als diese M\xF6glichkeit. Ein Folgelauf ohne sie k\xF6nnte ein fehlendes Pflichtfeld nur erfinden. Starten Sie einen neuen Lauf mit dem Referenzbild; dessen Bilder bleiben dann erhalten." }),
17961
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
18475
+ bilderFehlen && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "szenen-error", "data-testid": "folgelauf-ohne-bild", children: "Die Bilder dieses Laufs wurden nicht im Bestand abgelegt \u2014 er ist \xE4lter als diese M\xF6glichkeit. Ein Folgelauf ohne sie k\xF6nnte ein fehlendes Pflichtfeld nur erfinden. Starten Sie einen neuen Lauf mit dem Referenzbild; dessen Bilder bleiben dann erhalten." }),
18476
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
17962
18477
  "button",
17963
18478
  {
17964
18479
  type: "button",
@@ -18000,19 +18515,19 @@ ${teile.map((t) => `- ${t}`).join("\n")}`;
18000
18515
  setMeldung(ergebnis.message);
18001
18516
  }
18002
18517
  }
18003
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "szenen-derive", "data-testid": "bereich-rekonstruktion", children: [
18004
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "szenen-area__lead", children: "Aus einem Referenzbild, einem Prompt oder beidem einen Szenenentwurf vorschlagen lassen. Der Vorschlag wird nie ver\xF6ffentlicht \u2014 er wird ein Entwurf, den Sie pr\xFCfen und \xE4ndern." }),
18005
- regeln.status === "loading" && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { children: "Regeln werden geladen \u2026" }),
18006
- regeln.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("p", { className: "szenen-error", role: "alert", children: [
18518
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "szenen-derive", "data-testid": "bereich-rekonstruktion", children: [
18519
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "szenen-area__lead", children: "Aus einem Referenzbild, einem Prompt oder beidem einen Szenenentwurf vorschlagen lassen. Der Vorschlag wird nie ver\xF6ffentlicht \u2014 er wird ein Entwurf, den Sie pr\xFCfen und \xE4ndern." }),
18520
+ regeln.status === "loading" && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { children: "Regeln werden geladen \u2026" }),
18521
+ regeln.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("p", { className: "szenen-error", role: "alert", children: [
18007
18522
  "Die Regeln konnten nicht gelesen werden: ",
18008
18523
  regeln.message
18009
18524
  ] }),
18010
- regeln.status === "ready" && regeln.value.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("p", { className: "szenen-empty", children: [
18525
+ regeln.status === "ready" && regeln.value.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("p", { className: "szenen-empty", children: [
18011
18526
  "In diesem Kontext ist keine Rekonstruktionsregel (",
18012
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("code", { children: "scene_derivation_policy" }),
18527
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("code", { children: "scene_derivation_policy" }),
18013
18528
  ') ver\xF6ffentlicht. Ohne sie ist kein Lauf reproduzierbar \u2014 legen Sie hier eine unter \u201E1 \xB7 Bausteine" an, oder wechseln Sie in den Kontext, in dem Ihre Regel liegt. Regeln aus anderen Kontexten stehen hier bewusst nicht zur Auswahl.'
18014
18529
  ] }),
18015
- regeln.status === "ready" && regeln.value.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
18530
+ regeln.status === "ready" && regeln.value.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
18016
18531
  "form",
18017
18532
  {
18018
18533
  className: "szenen-form",
@@ -18021,17 +18536,17 @@ ${teile.map((t) => `- ${t}`).join("\n")}`;
18021
18536
  void starten();
18022
18537
  },
18023
18538
  children: [
18024
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("label", { className: "szenen-field", children: [
18025
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: "Regel" }),
18026
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
18539
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("label", { className: "szenen-field", children: [
18540
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: "Regel" }),
18541
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
18027
18542
  "select",
18028
18543
  {
18029
18544
  value: policyVersionId,
18030
18545
  onChange: (e) => setPolicyVersionId(e.target.value),
18031
18546
  "data-testid": "regel-auswahl",
18032
18547
  children: [
18033
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("option", { value: "", children: "\u2014 bitte w\xE4hlen \u2014" }),
18034
- regeln.value.map((regel) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("option", { value: regel.versionId, children: [
18548
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("option", { value: "", children: "\u2014 bitte w\xE4hlen \u2014" }),
18549
+ regeln.value.map((regel) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("option", { value: regel.versionId, children: [
18035
18550
  regel.title,
18036
18551
  " (",
18037
18552
  regel.produces.join(", "),
@@ -18041,21 +18556,21 @@ ${teile.map((t) => `- ${t}`).join("\n")}`;
18041
18556
  }
18042
18557
  )
18043
18558
  ] }),
18044
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("label", { className: "szenen-field", children: [
18045
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: "Eingang" }),
18046
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
18559
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("label", { className: "szenen-field", children: [
18560
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: "Eingang" }),
18561
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
18047
18562
  "select",
18048
18563
  {
18049
18564
  value: modus,
18050
18565
  onChange: (e) => setModus(e.target.value),
18051
18566
  "data-testid": "modus-auswahl",
18052
- children: (gewaehlt ? gewaehlt.inputModes : ["prompt", "image", "image_prompt"]).map((m) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("option", { value: m, children: MODUS_TEXT[m] }, m))
18567
+ children: (gewaehlt ? gewaehlt.inputModes : ["prompt", "image", "image_prompt"]).map((m) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("option", { value: m, children: MODUS_TEXT[m] }, m))
18053
18568
  }
18054
18569
  )
18055
18570
  ] }),
18056
- modus !== "image" && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("label", { className: "szenen-field", children: [
18057
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: "Referenzprompt" }),
18058
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
18571
+ modus !== "image" && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("label", { className: "szenen-field", children: [
18572
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: "Referenzprompt" }),
18573
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
18059
18574
  "textarea",
18060
18575
  {
18061
18576
  value: promptText,
@@ -18065,8 +18580,8 @@ ${teile.map((t) => `- ${t}`).join("\n")}`;
18065
18580
  }
18066
18581
  )
18067
18582
  ] }),
18068
- modus !== "prompt" && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [
18069
- port.imageLibrary && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
18583
+ modus !== "prompt" && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [
18584
+ port.imageLibrary && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
18070
18585
  BildWaehler,
18071
18586
  {
18072
18587
  port,
@@ -18075,9 +18590,9 @@ ${teile.map((t) => `- ${t}`).join("\n")}`;
18075
18590
  onEntfernen: (ref) => setBestandsbilder((v) => v.filter((b) => b.mediaRef !== ref))
18076
18591
  }
18077
18592
  ),
18078
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("label", { className: "szenen-field", children: [
18079
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: port.imageLibrary ? "Oder hochladen" : "Referenzbild" }),
18080
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
18593
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("label", { className: "szenen-field", children: [
18594
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: port.imageLibrary ? "Oder hochladen" : "Referenzbild" }),
18595
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
18081
18596
  "input",
18082
18597
  {
18083
18598
  type: "file",
@@ -18087,40 +18602,40 @@ ${teile.map((t) => `- ${t}`).join("\n")}`;
18087
18602
  "data-testid": "bild-eingabe"
18088
18603
  }
18089
18604
  ),
18090
- port.imageLibrary && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("small", { "data-testid": "upload-hinweis", children: "Hochgeladene Bilder werden im Bestand abgelegt \u2014 nur so ist sp\xE4ter ein Folgelauf damit m\xF6glich." })
18605
+ port.imageLibrary && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("small", { "data-testid": "upload-hinweis", children: "Hochgeladene Bilder werden im Bestand abgelegt \u2014 nur so ist sp\xE4ter ein Folgelauf damit m\xF6glich." })
18091
18606
  ] })
18092
18607
  ] }),
18093
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("button", { type: "submit", disabled: !gewaehlt || laeuft, "data-testid": "lauf-starten", children: laeuft ? "Rekonstruiert \u2026" : "Rekonstruieren" })
18608
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("button", { type: "submit", disabled: !gewaehlt || laeuft, "data-testid": "lauf-starten", children: laeuft ? "Rekonstruiert \u2026" : "Rekonstruieren" })
18094
18609
  ]
18095
18610
  }
18096
18611
  ),
18097
- meldung && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "szenen-error", role: "alert", "data-testid": "derive-meldung", children: meldung }),
18098
- lauf && lauf.status === "failed" && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("section", { className: "szenen-run szenen-run--failed", "data-testid": "lauf-fehler", children: [
18099
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h3", { children: "Der Lauf ist gescheitert" }),
18100
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("p", { children: [
18101
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("strong", { children: lauf.failure?.class }),
18612
+ meldung && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "szenen-error", role: "alert", "data-testid": "derive-meldung", children: meldung }),
18613
+ lauf && lauf.status === "failed" && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("section", { className: "szenen-run szenen-run--failed", "data-testid": "lauf-fehler", children: [
18614
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h3", { children: "Der Lauf ist gescheitert" }),
18615
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("p", { children: [
18616
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("strong", { children: lauf.failure?.class }),
18102
18617
  " \u2014 ",
18103
18618
  lauf.failure?.message
18104
18619
  ] }),
18105
- lauf.failure?.diagnostics && lauf.failure.diagnostics.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "szenen-diagnose", "data-testid": "lauf-diagnosen", children: [
18106
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h4", { children: "Befunde" }),
18107
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Diagnosen, { befunde: lauf.failure.diagnostics, testId: "lauf-befunde" })
18620
+ lauf.failure?.diagnostics && lauf.failure.diagnostics.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "szenen-diagnose", "data-testid": "lauf-diagnosen", children: [
18621
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h4", { children: "Befunde" }),
18622
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Diagnosen, { befunde: lauf.failure.diagnostics, testId: "lauf-befunde" })
18108
18623
  ] }),
18109
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Herkunft, { lauf }),
18110
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Widerspruch, { lauf }),
18111
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Belege, { lauf }),
18112
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(RecoveryPanel, { port, lauf }),
18624
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Herkunft, { lauf }),
18625
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Widerspruch, { lauf }),
18626
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Belege, { lauf }),
18627
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(RecoveryPanel, { port, lauf }),
18113
18628
  folgeblock(lauf)
18114
18629
  ] }),
18115
- lauf && lauf.status === "succeeded" && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("section", { className: "szenen-run", "data-testid": "lauf-ergebnis", children: [
18116
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h3", { children: "Vorschlag" }),
18117
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Herkunft, { lauf }),
18118
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Widerspruch, { lauf }),
18119
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "szenen-run__feedback", children: lauf.feedback }),
18120
- lauf.conflicts.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "szenen-diagnose szenen-diagnose--konflikt", "data-testid": "konflikte", children: [
18121
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h4", { children: "Widerspr\xFCche zwischen Bild und Prompt" }),
18122
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("ul", { children: lauf.conflicts.map((k, i) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("li", { children: [
18123
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("code", { children: k.field }),
18630
+ lauf && lauf.status === "succeeded" && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("section", { className: "szenen-run", "data-testid": "lauf-ergebnis", children: [
18631
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h3", { children: "Vorschlag" }),
18632
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Herkunft, { lauf }),
18633
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Widerspruch, { lauf }),
18634
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "szenen-run__feedback", children: lauf.feedback }),
18635
+ lauf.conflicts.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "szenen-diagnose szenen-diagnose--konflikt", "data-testid": "konflikte", children: [
18636
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h4", { children: "Widerspr\xFCche zwischen Bild und Prompt" }),
18637
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("ul", { children: lauf.conflicts.map((k, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("li", { children: [
18638
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("code", { children: k.field }),
18124
18639
  ": Bild sagt \u201E",
18125
18640
  k.from_image,
18126
18641
  '", Prompt sagt \u201E',
@@ -18128,31 +18643,31 @@ ${teile.map((t) => `- ${t}`).join("\n")}`;
18128
18643
  '". Nichts davon wurde \xFCbernommen.'
18129
18644
  ] }, i)) })
18130
18645
  ] }),
18131
- lauf.not_derivable.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "szenen-diagnose", "data-testid": "nicht-ableitbar", children: [
18132
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h4", { children: "Nicht ableitbar" }),
18133
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("ul", { children: lauf.not_derivable.map((n, i) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("li", { children: [
18134
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("code", { children: n.field }),
18646
+ lauf.not_derivable.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "szenen-diagnose", "data-testid": "nicht-ableitbar", children: [
18647
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h4", { children: "Nicht ableitbar" }),
18648
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("ul", { children: lauf.not_derivable.map((n, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("li", { children: [
18649
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("code", { children: n.field }),
18135
18650
  ": ",
18136
18651
  n.reason
18137
18652
  ] }, i)) })
18138
18653
  ] }),
18139
- lauf.assumptions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "szenen-diagnose", "data-testid": "annahmen", children: [
18140
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h4", { children: "Erschlossen, nicht belegt" }),
18141
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("ul", { children: lauf.assumptions.map((a, i) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("li", { children: a }, i)) })
18654
+ lauf.assumptions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "szenen-diagnose", "data-testid": "annahmen", children: [
18655
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h4", { children: "Erschlossen, nicht belegt" }),
18656
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("ul", { children: lauf.assumptions.map((a, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("li", { children: a }, i)) })
18142
18657
  ] }),
18143
18658
  lauf.proposals.map((vorschlag) => {
18144
18659
  const bezug = REFERENCE_FIELD[vorschlag.type];
18145
18660
  const fertig = uebernommen[vorschlag.type];
18146
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
18661
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
18147
18662
  "article",
18148
18663
  {
18149
18664
  className: "szenen-proposal",
18150
18665
  "data-testid": `vorschlag-${vorschlag.type}`,
18151
18666
  children: [
18152
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h4", { children: vorschlag.type }),
18153
- !fertig && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("label", { className: "szenen-field", children: [
18154
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: "Titel" }),
18155
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
18667
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h4", { children: vorschlag.type }),
18668
+ !fertig && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("label", { className: "szenen-field", children: [
18669
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: "Titel" }),
18670
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
18156
18671
  "input",
18157
18672
  {
18158
18673
  type: "text",
@@ -18166,9 +18681,9 @@ ${teile.map((t) => `- ${t}`).join("\n")}`;
18166
18681
  }
18167
18682
  )
18168
18683
  ] }),
18169
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("pre", { className: "szenen-proposal__payload", children: JSON.stringify(vorschlag.payload, null, 2) }),
18170
- bezug && !fertig && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [
18171
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
18684
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("pre", { className: "szenen-proposal__payload", children: JSON.stringify(vorschlag.payload, null, 2) }),
18685
+ bezug && !fertig && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [
18686
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
18172
18687
  ReferencePicker,
18173
18688
  {
18174
18689
  port,
@@ -18182,30 +18697,30 @@ ${teile.map((t) => `- ${t}`).join("\n")}`;
18182
18697
  }))
18183
18698
  }
18184
18699
  ),
18185
- referenzen[vorschlag.type] ? /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("p", { "data-testid": `referenz-gewaehlt-${vorschlag.type}`, children: [
18700
+ referenzen[vorschlag.type] ? /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("p", { "data-testid": `referenz-gewaehlt-${vorschlag.type}`, children: [
18186
18701
  "Zeigt auf Version ",
18187
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("code", { children: referenzen[vorschlag.type] }),
18702
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("code", { children: referenzen[vorschlag.type] }),
18188
18703
  "."
18189
18704
  ] }) : (
18190
18705
  /* Der Grund steht **vor** der Handlung. Den Nutzer erst
18191
18706
  auf einen Knopf drücken zu lassen, um ihm dann eine
18192
18707
  Ablehnung zu zeigen, ist keine Auskunft. */
18193
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("p", { "data-testid": `referenz-fehlt-${vorschlag.type}`, children: [
18708
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("p", { "data-testid": `referenz-fehlt-${vorschlag.type}`, children: [
18194
18709
  "Diese ",
18195
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("strong", { children: "Einzel\xFCbernahme" }),
18710
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("strong", { children: "Einzel\xFCbernahme" }),
18196
18711
  " braucht eine ver\xF6ffentlichte ",
18197
18712
  bezug.refersTo,
18198
18713
  "-Version, auf die der Entwurf zeigt (D-03) \u2014 sie ist der Weg in einen bestehenden, l\xE4ngst ver\xF6ffentlichten Zusammenhang. Wollen Sie aus diesem Lauf erst einmal einen Prompt ausprobieren, nehmen Sie unten die ",
18199
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("strong", { children: "Draft-Kette" }),
18714
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("strong", { children: "Draft-Kette" }),
18200
18715
  ": Dort entstehen Szene, Aufbau und Shot zusammenh\xE4ngend, und es muss nichts ver\xF6ffentlicht werden."
18201
18716
  ] })
18202
18717
  )
18203
18718
  ] }),
18204
- fertig ? /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("p", { className: "szenen-proposal__done", children: [
18719
+ fertig ? /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("p", { className: "szenen-proposal__done", children: [
18205
18720
  "Als Entwurf \xFCbernommen: ",
18206
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("code", { children: fertig }),
18721
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("code", { children: fertig }),
18207
18722
  ". Er ist noch nicht ver\xF6ffentlicht."
18208
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
18723
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
18209
18724
  "button",
18210
18725
  {
18211
18726
  type: "button",
@@ -18220,39 +18735,39 @@ ${teile.map((t) => `- ${t}`).join("\n")}`;
18220
18735
  vorschlag.type
18221
18736
  );
18222
18737
  }),
18223
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ChainActions, { port, runId: lauf.run_id }),
18224
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Belege, { lauf }),
18738
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ChainActions, { port, runId: lauf.run_id }),
18739
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Belege, { lauf }),
18225
18740
  folgeblock(lauf)
18226
18741
  ] })
18227
18742
  ] });
18228
18743
  };
18229
18744
 
18230
18745
  // src/features/szenen/SzenenView.tsx
18231
- var import_jsx_runtime18 = require("react/jsx-runtime");
18746
+ var import_jsx_runtime19 = require("react/jsx-runtime");
18232
18747
  var SzenenView = ({
18233
18748
  port,
18234
18749
  contextId = null,
18235
18750
  initialArea,
18236
18751
  onAreaChange
18237
18752
  }) => {
18238
- const bereiche = (0, import_react16.useMemo)(() => areasFor(port), [port]);
18239
- const faehig = (0, import_react16.useMemo)(() => capabilitiesOf(port), [port]);
18240
- const [aktiv, setAktiv] = (0, import_react16.useState)(() => resolveArea(port, initialArea));
18753
+ const bereiche = (0, import_react17.useMemo)(() => areasFor(port), [port]);
18754
+ const faehig = (0, import_react17.useMemo)(() => capabilitiesOf(port), [port]);
18755
+ const [aktiv, setAktiv] = (0, import_react17.useState)(() => resolveArea(port, initialArea));
18241
18756
  const wechsle = (id) => {
18242
18757
  setAktiv(id);
18243
18758
  onAreaChange?.(id);
18244
18759
  };
18245
18760
  const aktuellerBereich = bereiche.find((b) => b.id === aktiv) ?? bereiche[0];
18246
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "szenen-view", "data-testid": "szenen-view", children: [
18247
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("header", { className: "szenen-view__intro", children: [
18248
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { children: [
18249
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "szenen-view__eyebrow", children: "Vom Motiv zum Bild" }),
18250
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h2", { children: "Bildprompt aus einer Szene" }),
18251
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { children: "Bausteine w\xE4hlen, Szene und Bildaufbau festlegen und daraus einen wiederholbaren Prompt erzeugen." })
18761
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "szenen-view", "data-testid": "szenen-view", children: [
18762
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("header", { className: "szenen-view__intro", children: [
18763
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { children: [
18764
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "szenen-view__eyebrow", children: "Vom Motiv zum Bild" }),
18765
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("h2", { children: "Bildprompt aus einer Szene" }),
18766
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { children: "Bausteine w\xE4hlen, Szene und Bildaufbau festlegen und daraus einen wiederholbaren Prompt erzeugen." })
18252
18767
  ] }),
18253
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "szenen-view__step", children: aktuellerBereich.title })
18768
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "szenen-view__step", children: aktuellerBereich.title })
18254
18769
  ] }),
18255
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("nav", { className: "szenen-view__nav", "aria-label": "Szenen-Bereiche", children: bereiche.map((bereich) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
18770
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("nav", { className: "szenen-view__nav", "aria-label": "Szenen-Bereiche", children: bereiche.map((bereich) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
18256
18771
  "button",
18257
18772
  {
18258
18773
  type: "button",
@@ -18266,9 +18781,9 @@ var SzenenView = ({
18266
18781
  },
18267
18782
  bereich.id
18268
18783
  )) }),
18269
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("section", { className: "szenen-view__area", "aria-label": aktuellerBereich.title, children: [
18270
- aktiv === "derive" && port.derivation && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(DeriveArea, { port, contextId }),
18271
- aktiv === "elements" && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
18784
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("section", { className: "szenen-view__area", "aria-label": aktuellerBereich.title, children: [
18785
+ aktiv === "derive" && port.derivation && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(DeriveArea, { port, contextId }),
18786
+ aktiv === "elements" && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
18272
18787
  ElementsArea,
18273
18788
  {
18274
18789
  port,
@@ -18278,15 +18793,15 @@ var SzenenView = ({
18278
18793
  listTitle: "Bausteine"
18279
18794
  }
18280
18795
  ),
18281
- aktiv === "scene" && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SceneArea, { port, contextId }),
18282
- aktiv === "setup" && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SetupArea, { port, contextId }),
18283
- aktiv === "shot" && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ShotArea, { port, contextId }),
18284
- aktiv === "media" && port.media && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(MediaArea, { port, contextId })
18796
+ aktiv === "scene" && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SceneArea, { port, contextId }),
18797
+ aktiv === "setup" && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SetupArea, { port, contextId }),
18798
+ aktiv === "shot" && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(ShotArea, { port, contextId }),
18799
+ aktiv === "media" && port.media && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(MediaArea, { port, contextId })
18285
18800
  ] }),
18286
- (!faehig.saveRunAsItem || !faehig.media) && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("details", { className: "szenen-view__host-notes", children: [
18287
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("summary", { children: "Funktionen dieses Hosts" }),
18288
- !faehig.saveRunAsItem && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "szenen-view__capability-note", "data-testid": "hinweis-kein-item", children: "Runden k\xF6nnen hier nicht als Library-Item gespeichert werden." }),
18289
- !faehig.media && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "szenen-view__capability-note", "data-testid": "hinweis-keine-medien", children: "Referenzmedien werden in diesem Host nicht verwaltet." })
18801
+ (!faehig.saveRunAsItem || !faehig.media) && /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("details", { className: "szenen-view__host-notes", children: [
18802
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("summary", { children: "Funktionen dieses Hosts" }),
18803
+ !faehig.saveRunAsItem && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "szenen-view__capability-note", "data-testid": "hinweis-kein-item", children: "Runden k\xF6nnen hier nicht als Library-Item gespeichert werden." }),
18804
+ !faehig.media && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "szenen-view__capability-note", "data-testid": "hinweis-keine-medien", children: "Referenzmedien werden in diesem Host nicht verwaltet." })
18290
18805
  ] })
18291
18806
  ] });
18292
18807
  };