@elytracms/studio 0.0.80 → 0.0.81

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.
Files changed (97) hide show
  1. package/convex/contract-parity.test.ts +1 -1
  2. package/convex/functions.ts +13 -3
  3. package/convex/http-routes.test.ts +143 -0
  4. package/convex/http.ts +19 -9
  5. package/convex/schema.ts +0 -19
  6. package/convex/users.ts +1 -1
  7. package/dist/components/app-views/default-modules.d.ts +141 -44
  8. package/dist/components/app-views/default-modules.js +229 -65
  9. package/dist/components/app-views/default-modules.js.map +1 -1
  10. package/dist/components/app-views/module.d.ts +38 -0
  11. package/dist/components/app-views/module.js.map +1 -1
  12. package/dist/components/app-views/sidebar.d.ts +5 -2
  13. package/dist/components/app-views/sidebar.js +16 -5
  14. package/dist/components/app-views/sidebar.js.map +1 -1
  15. package/dist/components/app-views/studio-config.d.ts +27 -0
  16. package/dist/components/app-views/studio-config.js.map +1 -1
  17. package/dist/components/builder/canvas-render-context.js +7 -1
  18. package/dist/components/builder/canvas-render-context.js.map +1 -1
  19. package/dist/components/builder/reuse-context.js +7 -1
  20. package/dist/components/builder/reuse-context.js.map +1 -1
  21. package/dist/components/builder/reuse.d.ts +94 -16
  22. package/dist/components/builder/reuse.js +201 -19
  23. package/dist/components/builder/reuse.js.map +1 -1
  24. package/dist/components/cms/bulk-actions.js +3 -1
  25. package/dist/components/cms/bulk-actions.js.map +1 -1
  26. package/dist/components/cms/cell-edit.js +6 -2
  27. package/dist/components/cms/cell-edit.js.map +1 -1
  28. package/dist/components/cms/cms-store.d.ts +40 -13
  29. package/dist/components/cms/cms-store.js +50 -22
  30. package/dist/components/cms/cms-store.js.map +1 -1
  31. package/dist/components/cms/collection-table.js +2 -2
  32. package/dist/components/cms/collection-table.js.map +1 -1
  33. package/dist/components/cms/detail-editor.js +11 -5
  34. package/dist/components/cms/detail-editor.js.map +1 -1
  35. package/dist/components/cms/field-control.js +2 -1
  36. package/dist/components/cms/field-control.js.map +1 -1
  37. package/dist/components/cms/field-renderer.js +8 -1
  38. package/dist/components/cms/field-renderer.js.map +1 -1
  39. package/dist/components/cms/import-export.js +2 -1
  40. package/dist/components/cms/import-export.js.map +1 -1
  41. package/dist/components/cms/issues-pane.d.ts +4 -2
  42. package/dist/components/cms/issues-pane.js +6 -4
  43. package/dist/components/cms/issues-pane.js.map +1 -1
  44. package/dist/components/components/transfer-dialog.js +10 -12
  45. package/dist/components/components/transfer-dialog.js.map +1 -1
  46. package/dist/components/project-list.d.ts +9 -3
  47. package/dist/components/project-list.js +11 -5
  48. package/dist/components/project-list.js.map +1 -1
  49. package/dist/components/project-switcher.d.ts +3 -1
  50. package/dist/components/project-switcher.js +4 -2
  51. package/dist/components/project-switcher.js.map +1 -1
  52. package/dist/components/redirects/redirects-store.d.ts +21 -0
  53. package/dist/components/redirects/redirects-store.js +17 -4
  54. package/dist/components/redirects/redirects-store.js.map +1 -1
  55. package/dist/components/section-nav.js +102 -4
  56. package/dist/components/section-nav.js.map +1 -1
  57. package/dist/customization.d.ts +7 -0
  58. package/dist/customization.js.map +1 -1
  59. package/dist/lib/data/collection-content.d.ts +6 -1
  60. package/dist/lib/data/collection-content.js +50 -12
  61. package/dist/lib/data/collection-content.js.map +1 -1
  62. package/dist/lib/i18n/messages.de.js +132 -0
  63. package/dist/lib/i18n/messages.de.js.map +1 -1
  64. package/dist/lib/i18n/messages.en.d.ts +103 -0
  65. package/dist/lib/i18n/messages.en.js +146 -0
  66. package/dist/lib/i18n/messages.en.js.map +1 -1
  67. package/dist/lib/locale/binding-fallback.d.ts +8 -1
  68. package/dist/lib/locale/binding-fallback.js +8 -1
  69. package/dist/lib/locale/binding-fallback.js.map +1 -1
  70. package/dist/lib/locale/locale-store.d.ts +41 -9
  71. package/dist/lib/locale/locale-store.js +34 -15
  72. package/dist/lib/locale/locale-store.js.map +1 -1
  73. package/dist/lib/locale/locale-switcher.d.ts +3 -1
  74. package/dist/lib/locale/locale-switcher.js +4 -2
  75. package/dist/lib/locale/locale-switcher.js.map +1 -1
  76. package/dist/lib/locale/use-studio-locale.d.ts +9 -4
  77. package/dist/lib/locale/use-studio-locale.js.map +1 -1
  78. package/dist/lib/persistence/convex-adapter.d.ts +1 -3
  79. package/dist/lib/persistence/convex-adapter.js +0 -55
  80. package/dist/lib/persistence/convex-adapter.js.map +1 -1
  81. package/dist/lib/persona/labels.d.ts +42 -1
  82. package/dist/lib/persona/labels.js +57 -0
  83. package/dist/lib/persona/labels.js.map +1 -1
  84. package/dist/lib/routes/route-issues.d.ts +9 -0
  85. package/dist/lib/routes/route-issues.js +117 -0
  86. package/dist/lib/routes/route-issues.js.map +1 -0
  87. package/dist/lib/workspace/config-issues.d.ts +54 -0
  88. package/dist/lib/workspace/config-issues.js +70 -0
  89. package/dist/lib/workspace/config-issues.js.map +1 -0
  90. package/dist/lib/workspace/index.d.ts +9 -0
  91. package/dist/lib/workspace/index.js +11 -0
  92. package/dist/lib/workspace/index.js.map +1 -1
  93. package/dist/lib/workspace/switcher-source.d.ts +20 -3
  94. package/dist/lib/workspace/switcher-source.js.map +1 -1
  95. package/package.json +2 -2
  96. package/convex/cliTokens.ts +0 -63
  97. package/convex/sync.ts +0 -297
@@ -146,6 +146,32 @@ export const deMessages = {
146
146
  'shell.playground.hint': 'Playground-Modus: Daten liegen im Arbeitsspeicher dieses Geräts und werden beim Neuladen zurückgesetzt. Es wird nichts in einem Backend gespeichert.',
147
147
  'shell.deliveryHealth.dismiss': 'Schließen',
148
148
  // ─────────────────────────────────────────────────────────────────────────
149
+ // Customization issues — the section-rail foot (`NavIssues`)
150
+ // ─────────────────────────────────────────────────────────────────────────
151
+ // EC-478. Jede `{var}` ist ein BEZEICHNER (Eintrags-id, Erweiterungspunkt,
152
+ // Komponenten-/Sammlungs-id) und bleibt bewusst unübersetzt. Fachbegriffe, die
153
+ // im Code stehen (`reuse.component`, `reuse.relationProp`, `studio.config`,
154
+ // Prop, Slot, Block), bleiben ebenfalls unübersetzt — der Entwickler muss sie
155
+ // in seiner Konfiguration wiederfinden.
156
+ // EC-479 — das Projekt deklariert nichts, womit das Studio arbeiten könnte.
157
+ 'customization.issue.noCollections': 'Dieses Projekt deklariert keine Inhaltssammlungen. Fügen Sie sie in „{file}“ hinzu — das Studio zeigt Ihr Schema oder keines, niemals Beispielinhalte.',
158
+ 'customization.issue.duplicateOverrideId': 'Doppelte Überschreibungs-id „{id}“ für „{point}“ — die spätere wird ignoriert.',
159
+ 'customization.issue.unknownOverrideTarget': 'Die Überschreibung „{id}“ für „{point}“ passt zu keinem eingebauten Baustein, den sie ersetzen könnte.',
160
+ 'customization.issue.invalidOverride': 'Die Überschreibung „{id}“ für „{point}“ ist ungültig: {reason}',
161
+ 'customization.issue.reason.rendererNotAComponent': 'der Renderer ist keine Komponente',
162
+ 'customization.issue.reason.viewNoRender': 'die Ansicht hat keine render-Funktion',
163
+ 'customization.issue.reason.viewNoLabel': 'die Ansicht hat keine Beschriftung',
164
+ 'customization.issue.derivedIdBuiltinCollision': 'Die Ansicht „{label}“ für „{point}“ leitet die id „{id}“ aus ihrer Beschriftung ab, was der eingebauten Ansicht „{id}“ entspricht — die eingebaute Ansicht bleibt erhalten und diese wird ignoriert. Geben Sie eine explizite id an, um eine eingebaute Ansicht absichtlich zu ersetzen.',
165
+ 'customization.issue.derivedIdCollectionCollision': 'Die Ansichts-id „{id}“ für „{point}“ ist mehrdeutig: Sie verbindet die Sammlungen {collections} mit „-“, und eine Sammlung heißt buchstäblich „{joined}“ — deren eigene Ansicht leitet dieselbe id ab. Geben Sie dieser Gruppe eine explizite id.',
166
+ // EC-467 — die Deklaration wiederverwendbarer Elemente (`defineStudio({ reuse })`).
167
+ 'builder.reuse.config.unknownComponent': 'Wiederverwendbare Elemente: Die Studio-Konfiguration deklariert reuse.component „{component}“, was keine registrierte Komponente ist. Korrigieren Sie die id oder entfernen Sie den reuse-Block, damit das Studio die Einbettung selbst ermittelt.',
168
+ 'builder.reuse.config.noRelationProp': 'Wiederverwendbare Elemente: Die deklarierte Einbettung „{component}“ hat kein Relations-Prop für ein einzelnes Dokument und kann daher auf kein wiederverwendbares Dokument zeigen. Eine Einbettung benötigt genau ein Relations-Prop mit Kardinalität eins.',
169
+ 'builder.reuse.config.unknownRelationProp': 'Wiederverwendbare Elemente: Die deklarierte Einbettung „{component}“ hat kein Relations-Prop für ein einzelnes Dokument mit dem Namen „{relationProp}“. Ihre Relations-Props sind: {props}.',
170
+ 'builder.reuse.config.ambiguousRelationProp': 'Wiederverwendbare Elemente: Die deklarierte Einbettung „{component}“ hat {count} Relations-Props für ein einzelnes Dokument ({props}) — ergänzen Sie reuse.relationProp, um anzugeben, welches auf das wiederverwendbare Dokument zeigt.',
171
+ 'builder.reuse.config.unknownCollection': 'Wiederverwendbare Elemente: „{component}.{relationProp}“ verweist auf die Sammlung „{collection}“, die dieses Projekt nicht definiert.',
172
+ 'builder.reuse.config.noBlocksField': 'Wiederverwendbare Elemente: Die Sammlung „{collection}“ hinter „{component}.{relationProp}“ hat kein Block-Feld (Komposition), sodass die Einbettung nichts einbinden kann.',
173
+ 'builder.reuse.config.ambiguousInference': 'Wiederverwendbare Elemente: {count} Komponenten haben die Form einer wiederverwendbaren Einbettung ({components}). Ein Projekt hat genau eine wiederverwendbare Einbettung, deshalb rät das Studio nicht — deklarieren Sie sie in studio.config als reuse: { component: \'<id>\' }. Bis dahin sind die Wiederverwendungs-Gesten deaktiviert.',
174
+ // ─────────────────────────────────────────────────────────────────────────
149
175
  // Auth / errors
150
176
  // ─────────────────────────────────────────────────────────────────────────
151
177
  'auth.signIn': 'Anmelden',
@@ -232,6 +258,9 @@ export const deMessages = {
232
258
  // EC-448 — dritter Dok-Status (veröffentlicht mit unveröffentlichten Änderungen).
233
259
  'cms.docState.changed': 'geändert',
234
260
  'cms.docState.draft': 'Entwurf',
261
+ // EC-479 — ohne Projektsprachen kann keine CMS-Sitzung geöffnet werden.
262
+ 'cms.session.noLocales.title': 'Dieses Projekt deklariert keine Sprachen',
263
+ 'cms.session.noLocales.body': 'Fügen Sie Ihrer Projektkonfiguration eine locales-Liste hinzu. Die Standardsprache ist der Schlüssel, unter dem Ihre Inhalte gespeichert werden — das Studio wählt sie deshalb nicht für Sie aus.',
235
264
  'cms.list.view.all': 'Alle Einträge',
236
265
  'cms.list.unknownCollection': 'Unbekannte Sammlung {id}.',
237
266
  'cms.list.import.noId': '(keine ID)',
@@ -422,6 +451,109 @@ export const deMessages = {
422
451
  'cms.issueBody.document-nesting-depth.warning': 'Dieser Inhalt ist {depth} Ebenen tief verschachtelt und nähert sich dem Speicherlimit von {limit} Ebenen.',
423
452
  'cms.issueBody.hierarchy-cycle': 'Dieser Eintrag ist sein eigener Vorfahr – die Kette der übergeordneten Einträge bildet eine Schleife.',
424
453
  // ─────────────────────────────────────────────────────────────────────────
454
+ // CMS validation issue BODIES (EC-487)
455
+ //
456
+ // EC-443 localized the issue TITLES (`cms.issue.<code>` above); the bodies were
457
+ // still built as English template literals inside `packages/core`, which cannot
458
+ // import this catalog. EC-478 solved that shape for `CustomizationIssue` by having
459
+ // the producer carry a message KEY; these are the same carriage for
460
+ // `CmsValidationIssue`, so the rail foot, the Issues pane and the for-review lane
461
+ // never mix a German title with an English body.
462
+ //
463
+ // The English source is a SECOND copy of what the producer builds — the tie between
464
+ // them is `lib/persona/cms-issue-i18n.test.ts`, which renders every real producer's
465
+ // issue through this catalog and asserts byte-identity. Interpolated values are
466
+ // IDENTIFIERS (field/collection/route/locale ids, patterns, counts) and stay
467
+ // unlocalized in every language.
468
+ //
469
+ // `cms.issueDetail.*` are FRAGMENTS spliced into the sentences above.
470
+ // ─────────────────────────────────────────────────────────────────────────
471
+ 'cms.issueMessage.duplicateDocument': 'Doppeltes Dokument „{id}“ in der Sammlung „{collection}“.',
472
+ 'cms.issueMessage.fieldDetail': 'Das Feld „{field}“ {detail}.',
473
+ 'cms.issueMessage.fieldReason': 'Feld „{field}“: {reason}',
474
+ 'cms.issueMessage.propDetail': 'Die Eigenschaft „{field}“ {detail}.',
475
+ 'cms.issueMessage.propReason': 'Eigenschaft „{field}“: {reason}',
476
+ 'cms.issueMessage.relationUnknownTargetCollection': 'Das Beziehungsfeld „{field}“ zielt auf die unbekannte Sammlung „{target}“.',
477
+ 'cms.issueMessage.relationSingleValued': 'Das Beziehungsfeld „{field}“ ist einwertig, hat aber {count} Ziele.',
478
+ 'cms.issueMessage.relationNotAReference': 'Das Beziehungsfeld „{field}“ enthält einen Wert, der keine Dokumentreferenz ist.',
479
+ 'cms.issueMessage.relationWrongCollection': 'Das Beziehungsfeld „{field}“ zeigt auf die Sammlung „{got}“, zielt aber auf „{target}“.',
480
+ 'cms.issueMessage.relationMissingDocument': 'Das Beziehungsfeld „{field}“ verweist auf das fehlende Dokument „{id}“ in „{target}“.',
481
+ 'cms.issueMessage.relationUnpublishedDocument': 'Das Beziehungsfeld „{field}“ verweist auf das unveröffentlichte Dokument „{id}“ in „{target}“ — auf der veröffentlichten Website erscheint dort ein Platzhalter.',
482
+ 'cms.issueMessage.assetNoAssetCollection': 'Das Medienfeld „{field}“ benötigt eine Mediensammlung, es ist aber keine registriert.',
483
+ 'cms.issueMessage.assetSingleValued': 'Das Medienfeld „{field}“ ist einwertig, hat aber {count} Ziele.',
484
+ 'cms.issueMessage.assetExpectsId': 'Das Medienfeld „{field}“ erwartet eine Medien-id.',
485
+ 'cms.issueMessage.assetUnknown': 'Das Medienfeld „{field}“ verweist auf das unbekannte Medium „{asset}“.',
486
+ 'cms.issueMessage.requiredFieldMissing': 'Das Pflichtfeld „{field}“ fehlt.',
487
+ 'cms.issueMessage.requiredPropMissing': 'Die Pflichteigenschaft „{field}“ fehlt.',
488
+ 'cms.issueMessage.perLocaleMapValue': 'Das Feld „{field}“ erwartet einen Wert vom Typ „{type}“, enthält aber eine Sprach-Zuordnung (Schlüssel: {keys}) — sprachabhängige Werte liegen im „localized“-Bereich des Dokuments, niemals im Feldwert selbst.',
489
+ 'cms.issueMessage.richTextHoldsArray': 'Das Rich-Text-Feld „{field}“ erwartet eine Zeichenkette oder einen Rich-Text-Wert („{ version, doc }“), enthält aber ein Array.',
490
+ 'cms.issueMessage.richTextHoldsBareDoc': 'Das Rich-Text-Feld „{field}“ erwartet eine Zeichenkette oder einen Rich-Text-Wert („{ version, doc }“), enthält aber ein blankes Rich-Text-Dokument ohne die Hülle „{ version, doc }“.',
491
+ 'cms.issueMessage.richTextHoldsObject': 'Das Rich-Text-Feld „{field}“ erwartet eine Zeichenkette oder einen Rich-Text-Wert („{ version, doc }“), enthält aber ein Objekt mit den Schlüsseln „{keys}“.',
492
+ 'cms.issueMessage.unknownCollectionForDocument': 'Das Dokument „{id}“ verweist auf die unbekannte Sammlung „{collection}“.',
493
+ 'cms.issueMessage.localizedPlainValue': 'Das sprachabhängige Feld „{field}“ enthält einen einfachen Wert im gemeinsamen „values“-Bereich — erwartet werden sprachabhängige Werte unter „localized.<locale>.{field}“. Der einfache Wert dient nur noch als letzte Rückfallebene.',
494
+ 'cms.issueMessage.requiredLocalizedMissingDefault': 'Das sprachabhängige Pflichtfeld „{field}“ fehlt für die Standardsprache „{locale}“.',
495
+ 'cms.issueMessage.localizedNoValueNoFallback': 'Das sprachabhängige Feld „{field}“ hat keinen Wert für die Sprache „{locale}“ und keine Rückfallebene.',
496
+ 'cms.issueMessage.hierarchyCycle': 'Das Dokument „{id}“ ist sein eigener Vorfahre — die Elternkette bildet einen Zyklus.',
497
+ 'cms.issueMessage.nestingDepthError': 'Das Dokument „{id}“ ist {depth} Ebenen tief verschachtelt und überschreitet damit das Schreib-Limit des Backends von {limit} Ebenen — selbst das Falten der Tiefe beim Speichern rettet ein so tiefes Dokument nicht, der Schreibvorgang kann nicht ausgeführt werden. Teilen Sie es in kleinere verknüpfte Dokumente auf.',
498
+ 'cms.issueMessage.nestingDepthWarning': 'Das Dokument „{id}“ ist {depth} Ebenen tief verschachtelt und nähert sich damit dem Limit des Backends von {limit} Ebenen. Flachen Sie den tiefsten Pfad ab, bevor er weiter wächst.',
499
+ 'cms.issueMessage.propFilterable': 'Die Komponenten-Eigenschaft „{field}“ deklariert „filterable“, was nur für Dokumentfelder gilt.',
500
+ 'cms.issueMessage.propUnique': 'Die Komponenten-Eigenschaft „{field}“ deklariert „unique“, was nur über die Dokumente einer Sammlung hinweg gilt.',
501
+ 'cms.issueMessage.singletonDrift': 'Das Einzelstück „{collection}“ hat {count} Dokumente — es sollte genau eines haben. Behalten Sie das richtige Dokument und entfernen Sie die übrigen, damit es sich direkt öffnen lässt.',
502
+ 'cms.issueMessage.unknownAlias.one': 'Ein Dokument ist dem Alias „{alias}“ zugewiesen, der kein deklarierter Slot von „{collection}“ ist ({declared}). Weisen Sie einen gültigen Slot zu.',
503
+ 'cms.issueMessage.unknownAlias.other': '{count} Dokumente sind dem Alias „{alias}“ zugewiesen, der kein deklarierter Slot von „{collection}“ ist ({declared}). Weisen Sie einen gültigen Slot zu.',
504
+ 'cms.issueMessage.duplicateAlias': '{count} Dokumente teilen sich den Alias „{alias}“ in „{collection}“. Jeder Slot darf nur einem Dokument zugewiesen sein — weisen Sie neu zu oder entfernen Sie die Duplikate.',
505
+ 'cms.issueMessage.unfilledSlot': 'Der Slot „{slot}“ von „{collection}“ hat noch kein Dokument. Weisen Sie eines zu, damit Code, der „{slot}“ auflöst, es findet.',
506
+ 'cms.issueMessage.reservedFieldName': 'Der Feldname „{field}“ ist reserviert (der Diskriminator selbstbeschreibender Knoten).',
507
+ 'cms.issueMessage.duplicateSelectOption': 'Doppelte Auswahloption „{option}“ im Feld „{field}“.',
508
+ 'cms.issueMessage.duplicateObjectField': 'Doppeltes Feld „{field}“ im Objektfeld „{parent}“.',
509
+ 'cms.issueMessage.assetCollectionSingleton': 'Die Mediensammlung „{collection}“ kann kein Einzelstück sein.',
510
+ 'cms.issueMessage.duplicateCollectionField': 'Doppeltes Feld „{field}“ in der Sammlung „{collection}“.',
511
+ 'cms.issueMessage.duplicateCollectionId': 'Doppelte Sammlungs-id „{collection}“.',
512
+ 'cms.issueMessage.unknownLocale': 'Die Sprache „{locale}“ gehört nicht zum konfigurierten Sprachsatz.',
513
+ 'cms.issueMessage.unknownVersion': 'Für das Dokument „{id}“ ist keine Version {version} aufgezeichnet.',
514
+ 'cms.issueMessage.routeConflict': 'Die Routen „{first}“ und „{second}“ treffen auf dieselben URLs zu (Muster „{pattern}“).',
515
+ 'cms.issueMessage.redirectLoop': 'Die Weiterleitungskette ab „{from}“ bildet eine Schleife (…{chain}).',
516
+ 'cms.issueMessage.allDynamicShadowsMount': 'Die Route „{route}“ („{pattern}“) besteht nur aus dynamischen Segmenten und trifft damit auf JEDE URL mit {depth} Segmenten zu — die Hierarchie-Einhängung „{mountRoute}“ („{mountPattern}“) wird auf dieser Ebene nur dort herangezogen, wo die Route kein Dokument auflöst. Nichts ist dadurch grundsätzlich unerreichbar, aber der Vorrang entscheidet sich dort am INHALT statt an den Routen: {shadowed} werden stillschweigend verdeckt, sobald ein zusammengesetzter Pfad mit {claimed} kollidiert — und keine Seite erfährt davon. Geben Sie der Route ein statisches Präfix („/blog/:slug“), damit sie einen Namensraum beansprucht statt einer ganzen Ebene.',
517
+ 'cms.issueMessage.mountCannotServe': 'Die Hierarchie-Einhängung „{route}“ („{pattern}“) kann niemals ein Dokument ausliefern: {why}. Der Resolver überspringt eine solche Einhängung stillschweigend, deshalb liefert jede URL unter „{space}“ einen 404, ohne dass ein Hinweis erscheint.',
518
+ 'cms.issueMessage.deadCatchAll': 'Die Route „{route}“ („{pattern}“) liefert in beide Richtungen nichts: Sie endet in einem Catch-all, deshalb verwirft sie jeder Router — ihr Präfix enthält aber ein dynamisches Segment ({dynamic}), deshalb wird auch keine Hierarchie-Einhängung daraus gebaut. Das Präfix einer Einhängung muss statisch sein — deklarieren Sie eine Einhängung pro Sprache (`{ pattern: \'/de/:path*\', locale: \'de\' }`) oder entfernen Sie die Route.',
519
+ 'cms.issueMessage.mountConflict': '{opening} — Einhängungen werden in Deklarationsreihenfolge aufgelöst, nicht nach Spezifität; deshalb beansprucht „{earlier}“ (Sammlung „{earlierCollection}“) dort jede URL, die der eigene Baum auflöst, und Dokumente aus „{laterCollection}“ sind an diesen URLs unerreichbar.',
520
+ 'cms.issueMessage.routeBoundDocumentNotFound': 'Das an die Route gebundene Dokument „{collection}:{id}“ wurde nicht gefunden.',
521
+ 'cms.issueMessage.routeParamNotCaptured': 'Die Route „{route}“ bindet ihr Dokument an den URL-Parameter „:{param}“, den das Muster „{pattern}“ nicht erfasst.',
522
+ 'cms.issueMessage.collectionNotDefined': 'Die Sammlung „{collection}“ ist nicht definiert.',
523
+ 'cms.issueDetail.expectsString': 'erwartet eine Zeichenkette',
524
+ 'cms.issueDetail.expectsRichText': 'erwartet Rich-Text-Inhalt (eine Zeichenkette oder einen Rich-Text-Wert)',
525
+ 'cms.issueDetail.expectsNumber': 'erwartet eine Zahl',
526
+ 'cms.issueDetail.expectsBoolean': 'erwartet einen Wahrheitswert',
527
+ 'cms.issueDetail.expectsIsoDate': 'erwartet ein ISO-8601-Datum (z. B. „2026-09-18“)',
528
+ 'cms.issueDetail.expectsDate': 'erwartet ein Datum (ISO-8601-Zeichenkette oder Epochenzahl)',
529
+ 'cms.issueDetail.valueNotAmongOptions': 'hat den Wert „{value}“, der nicht zu seinen Optionen gehört',
530
+ 'cms.issueDetail.expectsObjectList': 'erwartet eine Liste von Objekten',
531
+ 'cms.issueDetail.expectsObject': 'erwartet ein Objekt',
532
+ 'cms.issueDetail.implausibleYear': 'hat das Jahr {year}, was unbeabsichtigt wirkt (erwartet wird eine vierstellige Jahreszahl)',
533
+ 'cms.issueDetail.dateBoundNotADate': 'deklariert {bound} `{declared}` auf einem Datumsfeld, was kein Datum ist — verwenden Sie eine ISO-8601-Zeichenkette wie „1900-01-01“',
534
+ 'cms.issueDetail.earlierThanMin': 'liegt vor {min}',
535
+ 'cms.issueDetail.laterThanMax': 'liegt nach {max}',
536
+ 'cms.issueDetail.stringBoundOffDate': 'deklariert {bound} „{declared}“ als Zeichenkette, was nur auf einem Datumsfeld sinnvoll ist — verwenden Sie eine Zahl',
537
+ 'cms.issueDetail.shorterThanMinLength': 'ist kürzer als die Mindestlänge {min}',
538
+ 'cms.issueDetail.longerThanMaxLength': 'ist länger als die Höchstlänge {max}',
539
+ 'cms.issueDetail.doesNotMatchPattern': 'entspricht nicht dem Muster {pattern}',
540
+ 'cms.issueDetail.lessThanMin': 'ist kleiner als das Minimum {min}',
541
+ 'cms.issueDetail.greaterThanMax': 'ist größer als das Maximum {max}',
542
+ 'cms.issueDetail.fewerThanMinItems': 'hat weniger als {min} Einträge',
543
+ 'cms.issueDetail.moreThanMaxItems': 'hat mehr als {max} Einträge',
544
+ 'cms.issueDetail.singleValuedManyTargets': 'ist einwertig, hat aber {count} Ziele',
545
+ 'cms.issueDetail.notADocumentReference': 'enthält einen Wert, der keine Dokumentreferenz ist',
546
+ 'cms.issueDetail.pointsAtOtherCollection': 'zeigt auf die Sammlung „{got}“, zielt aber auf „{target}“',
547
+ 'cms.issueDetail.expectsAssetIdString': 'erwartet eine Medien-id als Zeichenkette',
548
+ 'cms.issueDetail.shadowedRootDocuments': 'die WURZEL-Dokumente von „{collection}“ unter „{space}“',
549
+ 'cms.issueDetail.shadowedNestedDocuments': '„{collection}“-Dokumente, die {levels} Ebenen unter „{space}“ verschachtelt sind',
550
+ 'cms.issueDetail.claimedBySlug': 'einem Slug aus „{collection}“',
551
+ 'cms.issueDetail.claimedByOwnDocument': 'dem eigenen Dokument der Route',
552
+ 'cms.issueDetail.mountCollectionNotDeclared': 'die Sammlung „{collection}“ ist nicht deklariert',
553
+ 'cms.issueDetail.mountCollectionNotHierarchical': 'die Sammlung „{collection}“ hat keine `parent`-Selbstbeziehung und damit keine verschachtelten Pfade zum Zusammensetzen',
554
+ 'cms.issueDetail.mountsSamePath': 'Die Hierarchie-Einhängungen „{earlier}“ („{earlierPattern}“) und „{later}“ („{laterPattern}“) sind beide unter „{space}“ eingehängt',
555
+ 'cms.issueDetail.mountsNested': 'Die Hierarchie-Einhängung „{later}“ („{laterPattern}“) liegt innerhalb von „{earlier}“ („{earlierPattern}“), das zuerst deklariert ist und ebenfalls „{space}“ vollständig beansprucht',
556
+ // ─────────────────────────────────────────────────────────────────────────
425
557
  // CMS — details pane (slot + sidebar fields)
426
558
  // ─────────────────────────────────────────────────────────────────────────
427
559
  'cms.details.slot': 'Slot',