@elytracms/studio 0.0.92 → 0.0.93

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 (241) hide show
  1. package/convex/asset-alt-migration.test.ts +127 -0
  2. package/convex/asset-replace.test.ts +168 -0
  3. package/convex/asset-revalidate.test.ts +6 -6
  4. package/convex/assets.ts +41 -5
  5. package/convex/cms.ts +25 -11
  6. package/convex/contract-parity.test.ts +18 -3
  7. package/convex/document-revalidate.test.ts +10 -12
  8. package/convex/orphan-hydration.test.ts +116 -0
  9. package/convex/rail-write-parity.test.ts +11 -8
  10. package/convex/schema.ts +6 -0
  11. package/dist/components/ai/proposal-card.js +2 -1
  12. package/dist/components/ai/proposal-card.js.map +1 -1
  13. package/dist/components/ai/translate-document-dialog.js +4 -2
  14. package/dist/components/ai/translate-document-dialog.js.map +1 -1
  15. package/dist/components/ai/translate-skipped.d.ts +19 -0
  16. package/dist/components/ai/translate-skipped.js +46 -0
  17. package/dist/components/ai/translate-skipped.js.map +1 -0
  18. package/dist/components/assets/asset-detail.js +18 -8
  19. package/dist/components/assets/asset-detail.js.map +1 -1
  20. package/dist/components/assets/asset-metadata.d.ts +15 -4
  21. package/dist/components/assets/asset-metadata.js +15 -2
  22. package/dist/components/assets/asset-metadata.js.map +1 -1
  23. package/dist/components/assets/asset-search.js +4 -1
  24. package/dist/components/assets/asset-search.js.map +1 -1
  25. package/dist/components/assets/asset-selection.d.ts +0 -8
  26. package/dist/components/assets/asset-selection.js +4 -23
  27. package/dist/components/assets/asset-selection.js.map +1 -1
  28. package/dist/components/assets/asset-thumb.js +3 -2
  29. package/dist/components/assets/asset-thumb.js.map +1 -1
  30. package/dist/components/assets/assets-collection-view-source.d.ts +3 -3
  31. package/dist/components/assets/assets-collection-view-source.js +9 -5
  32. package/dist/components/assets/assets-collection-view-source.js.map +1 -1
  33. package/dist/components/assets/assets-store.d.ts +14 -0
  34. package/dist/components/assets/assets-store.js +23 -1
  35. package/dist/components/assets/assets-store.js.map +1 -1
  36. package/dist/components/assets/replace-file.d.ts +22 -0
  37. package/dist/components/assets/replace-file.js +59 -0
  38. package/dist/components/assets/replace-file.js.map +1 -0
  39. package/dist/components/builder/blocks-model.d.ts +14 -26
  40. package/dist/components/builder/blocks-model.js +35 -41
  41. package/dist/components/builder/blocks-model.js.map +1 -1
  42. package/dist/components/builder/blocks-panel.d.ts +7 -3
  43. package/dist/components/builder/blocks-panel.js +6 -5
  44. package/dist/components/builder/blocks-panel.js.map +1 -1
  45. package/dist/components/builder/builder-store.d.ts +104 -15
  46. package/dist/components/builder/builder-store.js +156 -31
  47. package/dist/components/builder/builder-store.js.map +1 -1
  48. package/dist/components/builder/canvas-body.d.ts +30 -0
  49. package/dist/components/builder/canvas-body.js +38 -0
  50. package/dist/components/builder/canvas-body.js.map +1 -0
  51. package/dist/components/builder/canvas-chrome-css.js +7 -0
  52. package/dist/components/builder/canvas-chrome-css.js.map +1 -1
  53. package/dist/components/builder/canvas-dnd.d.ts +7 -7
  54. package/dist/components/builder/canvas-dnd.js +5 -5
  55. package/dist/components/builder/canvas-dnd.js.map +1 -1
  56. package/dist/components/builder/canvas-render-context.d.ts +27 -19
  57. package/dist/components/builder/canvas-render-context.js +42 -43
  58. package/dist/components/builder/canvas-render-context.js.map +1 -1
  59. package/dist/components/builder/canvas-runs.d.ts +45 -0
  60. package/dist/components/builder/canvas-runs.js +51 -0
  61. package/dist/components/builder/canvas-runs.js.map +1 -0
  62. package/dist/components/builder/canvas.js +32 -5
  63. package/dist/components/builder/canvas.js.map +1 -1
  64. package/dist/components/builder/clipboard-actions.d.ts +15 -0
  65. package/dist/components/builder/clipboard-actions.js +44 -7
  66. package/dist/components/builder/clipboard-actions.js.map +1 -1
  67. package/dist/components/builder/composition-field-editor.d.ts +3 -15
  68. package/dist/components/builder/composition-field-editor.js +29 -40
  69. package/dist/components/builder/composition-field-editor.js.map +1 -1
  70. package/dist/components/builder/delete-key.d.ts +5 -0
  71. package/dist/components/builder/delete-key.js +4 -0
  72. package/dist/components/builder/delete-key.js.map +1 -1
  73. package/dist/components/builder/insert-context.d.ts +17 -25
  74. package/dist/components/builder/insert-context.js +45 -92
  75. package/dist/components/builder/insert-context.js.map +1 -1
  76. package/dist/components/builder/page-tree.d.ts +3 -3
  77. package/dist/components/builder/page-tree.js +3 -3
  78. package/dist/components/builder/page-tree.js.map +1 -1
  79. package/dist/components/builder/placement-refusal.d.ts +18 -0
  80. package/dist/components/builder/placement-refusal.js +46 -0
  81. package/dist/components/builder/placement-refusal.js.map +1 -0
  82. package/dist/components/builder/property-inspector.js +4 -0
  83. package/dist/components/builder/property-inspector.js.map +1 -1
  84. package/dist/components/builder/reuse-context.js +65 -27
  85. package/dist/components/builder/reuse-context.js.map +1 -1
  86. package/dist/components/builder/reuse.d.ts +79 -1
  87. package/dist/components/builder/reuse.js +69 -2
  88. package/dist/components/builder/reuse.js.map +1 -1
  89. package/dist/components/builder/run-inspector.d.ts +11 -0
  90. package/dist/components/builder/run-inspector.js +33 -0
  91. package/dist/components/builder/run-inspector.js.map +1 -0
  92. package/dist/components/cms/asset-field.d.ts +38 -1
  93. package/dist/components/cms/asset-field.js +182 -58
  94. package/dist/components/cms/asset-field.js.map +1 -1
  95. package/dist/components/cms/asset-picker-core.d.ts +16 -0
  96. package/dist/components/cms/asset-picker-core.js +20 -0
  97. package/dist/components/cms/asset-picker-core.js.map +1 -1
  98. package/dist/components/cms/asset-picker.js +12 -18
  99. package/dist/components/cms/asset-picker.js.map +1 -1
  100. package/dist/components/cms/bulk-actions.d.ts +3 -19
  101. package/dist/components/cms/bulk-actions.js +3 -24
  102. package/dist/components/cms/bulk-actions.js.map +1 -1
  103. package/dist/components/cms/cell.js.map +1 -1
  104. package/dist/components/cms/cms-store.d.ts +5 -4
  105. package/dist/components/cms/cms-store.js +16 -36
  106. package/dist/components/cms/cms-store.js.map +1 -1
  107. package/dist/components/cms/detail-editor.js +0 -1
  108. package/dist/components/cms/detail-editor.js.map +1 -1
  109. package/dist/components/cms/document-diff-view.d.ts +3 -1
  110. package/dist/components/cms/document-diff-view.js +12 -7
  111. package/dist/components/cms/document-diff-view.js.map +1 -1
  112. package/dist/components/cms/field-anchors.d.ts +7 -4
  113. package/dist/components/cms/field-anchors.js +9 -7
  114. package/dist/components/cms/field-anchors.js.map +1 -1
  115. package/dist/components/cms/field-control-lib.d.ts +15 -1
  116. package/dist/components/cms/field-control-lib.js +22 -3
  117. package/dist/components/cms/field-control-lib.js.map +1 -1
  118. package/dist/components/cms/gate-validation.d.ts +21 -30
  119. package/dist/components/cms/gate-validation.js +11 -32
  120. package/dist/components/cms/gate-validation.js.map +1 -1
  121. package/dist/components/cms/object-array-field.js +4 -4
  122. package/dist/components/cms/object-array-field.js.map +1 -1
  123. package/dist/components/cms/prop-fields.d.ts +7 -2
  124. package/dist/components/cms/prop-fields.js +13 -6
  125. package/dist/components/cms/prop-fields.js.map +1 -1
  126. package/dist/components/cms/rich-text/embed-picker.d.ts +1 -1
  127. package/dist/components/cms/rich-text/embed-picker.js.map +1 -1
  128. package/dist/components/cms/rich-text/insert.d.ts +20 -9
  129. package/dist/components/cms/rich-text/insert.js +25 -17
  130. package/dist/components/cms/rich-text/insert.js.map +1 -1
  131. package/dist/components/cms/use-publish-controller.d.ts +1 -2
  132. package/dist/components/cms/use-publish-controller.js +7 -19
  133. package/dist/components/cms/use-publish-controller.js.map +1 -1
  134. package/dist/components/cms/versions-pane.js +8 -1
  135. package/dist/components/cms/versions-pane.js.map +1 -1
  136. package/dist/components/collection-view/cms-collection-view-source.js +3 -1
  137. package/dist/components/collection-view/cms-collection-view-source.js.map +1 -1
  138. package/dist/components/components/transfer-dialog.js +2 -1
  139. package/dist/components/components/transfer-dialog.js.map +1 -1
  140. package/dist/components/components/transfer.d.ts +10 -10
  141. package/dist/components/components/transfer.js +13 -12
  142. package/dist/components/components/transfer.js.map +1 -1
  143. package/dist/lib/ai/apply-content.js +56 -116
  144. package/dist/lib/ai/apply-content.js.map +1 -1
  145. package/dist/lib/ai/chat-context.d.ts +8 -0
  146. package/dist/lib/ai/chat-context.js +37 -6
  147. package/dist/lib/ai/chat-context.js.map +1 -1
  148. package/dist/lib/ai/chat-state.d.ts +6 -0
  149. package/dist/lib/ai/chat-state.js.map +1 -1
  150. package/dist/lib/ai/constraints.d.ts +20 -5
  151. package/dist/lib/ai/constraints.js +125 -33
  152. package/dist/lib/ai/constraints.js.map +1 -1
  153. package/dist/lib/ai/fake-provider.d.ts +16 -3
  154. package/dist/lib/ai/fake-provider.js +22 -6
  155. package/dist/lib/ai/fake-provider.js.map +1 -1
  156. package/dist/lib/ai/index.d.ts +2 -0
  157. package/dist/lib/ai/index.js +2 -0
  158. package/dist/lib/ai/index.js.map +1 -1
  159. package/dist/lib/ai/leash.d.ts +34 -0
  160. package/dist/lib/ai/leash.js +28 -0
  161. package/dist/lib/ai/leash.js.map +1 -0
  162. package/dist/lib/ai/rich-text-input.d.ts +8 -8
  163. package/dist/lib/ai/rich-text-input.js +2 -1
  164. package/dist/lib/ai/rich-text-input.js.map +1 -1
  165. package/dist/lib/ai/rich-text-translate.d.ts +27 -4
  166. package/dist/lib/ai/rich-text-translate.js +28 -10
  167. package/dist/lib/ai/rich-text-translate.js.map +1 -1
  168. package/dist/lib/ai/shape.d.ts +13 -13
  169. package/dist/lib/ai/shape.js +69 -93
  170. package/dist/lib/ai/shape.js.map +1 -1
  171. package/dist/lib/ai/tools.d.ts +36 -41
  172. package/dist/lib/ai/tools.js +83 -87
  173. package/dist/lib/ai/tools.js.map +1 -1
  174. package/dist/lib/ai/translate-document.d.ts +32 -4
  175. package/dist/lib/ai/translate-document.js +144 -46
  176. package/dist/lib/ai/translate-document.js.map +1 -1
  177. package/dist/lib/ai/types.d.ts +34 -23
  178. package/dist/lib/ai/types.js.map +1 -1
  179. package/dist/lib/ai/update-fields.d.ts +15 -12
  180. package/dist/lib/ai/update-fields.js +112 -188
  181. package/dist/lib/ai/update-fields.js.map +1 -1
  182. package/dist/lib/ai/writer-form.d.ts +116 -0
  183. package/dist/lib/ai/writer-form.js +429 -0
  184. package/dist/lib/ai/writer-form.js.map +1 -0
  185. package/dist/lib/assets/upload.d.ts +31 -2
  186. package/dist/lib/assets/upload.js +61 -6
  187. package/dist/lib/assets/upload.js.map +1 -1
  188. package/dist/lib/clipboard/os-clipboard.d.ts +10 -2
  189. package/dist/lib/clipboard/os-clipboard.js +8 -4
  190. package/dist/lib/clipboard/os-clipboard.js.map +1 -1
  191. package/dist/lib/clipboard/paste-target.d.ts +18 -9
  192. package/dist/lib/clipboard/paste-target.js +8 -7
  193. package/dist/lib/clipboard/paste-target.js.map +1 -1
  194. package/dist/lib/cms/field-patch.d.ts +0 -10
  195. package/dist/lib/cms/field-patch.js +4 -30
  196. package/dist/lib/cms/field-patch.js.map +1 -1
  197. package/dist/lib/cms-views/view-model.d.ts +3 -3
  198. package/dist/lib/collection-view/collection-view-source.d.ts +7 -3
  199. package/dist/lib/collection-view/collection-view-source.js.map +1 -1
  200. package/dist/lib/data/collection-content.js +3 -2
  201. package/dist/lib/data/collection-content.js.map +1 -1
  202. package/dist/lib/dnd/drop-rules.d.ts +25 -31
  203. package/dist/lib/dnd/drop-rules.js +53 -59
  204. package/dist/lib/dnd/drop-rules.js.map +1 -1
  205. package/dist/lib/engine-version.d.ts +1 -1
  206. package/dist/lib/engine-version.js +1 -1
  207. package/dist/lib/engine-version.js.map +1 -1
  208. package/dist/lib/i18n/messages.de.js +40 -3
  209. package/dist/lib/i18n/messages.de.js.map +1 -1
  210. package/dist/lib/i18n/messages.en.d.ts +34 -2
  211. package/dist/lib/i18n/messages.en.js +43 -3
  212. package/dist/lib/i18n/messages.en.js.map +1 -1
  213. package/dist/lib/operations/project-runtime-config.d.ts +25 -6
  214. package/dist/lib/operations/project-runtime-config.js +37 -10
  215. package/dist/lib/operations/project-runtime-config.js.map +1 -1
  216. package/dist/lib/operations/publish-with-revision.d.ts +33 -1
  217. package/dist/lib/operations/publish-with-revision.js +32 -0
  218. package/dist/lib/operations/publish-with-revision.js.map +1 -1
  219. package/dist/lib/operations/runtime-validator.d.ts +19 -68
  220. package/dist/lib/operations/runtime-validator.js +12 -138
  221. package/dist/lib/operations/runtime-validator.js.map +1 -1
  222. package/dist/lib/operations/studio-operations.d.ts +9 -2
  223. package/dist/lib/operations/studio-operations.js +13 -11
  224. package/dist/lib/operations/studio-operations.js.map +1 -1
  225. package/dist/lib/persistence/convex-adapter.js +6 -1
  226. package/dist/lib/persistence/convex-adapter.js.map +1 -1
  227. package/dist/lib/persona/labels.js +3 -1
  228. package/dist/lib/persona/labels.js.map +1 -1
  229. package/dist/lib/workspace/index.d.ts +8 -11
  230. package/dist/lib/workspace/index.js +12 -24
  231. package/dist/lib/workspace/index.js.map +1 -1
  232. package/package.json +3 -3
  233. package/dist/components/cms/cms-composition-validators.d.ts +0 -16
  234. package/dist/components/cms/cms-composition-validators.js +0 -133
  235. package/dist/components/cms/cms-composition-validators.js.map +0 -1
  236. package/dist/components/cms/publish-clean.d.ts +0 -28
  237. package/dist/components/cms/publish-clean.js +0 -38
  238. package/dist/components/cms/publish-clean.js.map +0 -1
  239. package/dist/lib/assets/asset-placements.d.ts +0 -28
  240. package/dist/lib/assets/asset-placements.js +0 -83
  241. package/dist/lib/assets/asset-placements.js.map +0 -1
@@ -204,6 +204,8 @@ declare const MESSAGES: {
204
204
  'operations.error.strictReferencesBlockUnpublishOne': import("./types.js").SourceMessage;
205
205
  'operations.error.strictTargetsUnpublishedOne': import("./types.js").SourceMessage;
206
206
  'operations.error.strictTargetsUnpublished': import("./types.js").SourceMessage;
207
+ 'operations.error.publishNeedsLocales': import("./types.js").SourceMessage;
208
+ 'operations.error.versionNotPinnable': import("./types.js").SourceMessage;
207
209
  'operations.errorDetail.andMore': import("./types.js").SourceMessage;
208
210
  'content.queryError.nonFilterableField': import("./types.js").SourceMessage;
209
211
  'content.queryError.unknownField': import("./types.js").SourceMessage;
@@ -414,6 +416,7 @@ declare const MESSAGES: {
414
416
  'cms.issue.hidden-predicate-error': import("./types.js").SourceMessage;
415
417
  'cms.issue.unaddressable-url': import("./types.js").SourceMessage;
416
418
  'cms.issue.unknown-version': import("./types.js").SourceMessage;
419
+ 'cms.issue.invalid-stored-document': import("./types.js").SourceMessage;
417
420
  'cms.issueBody.missing-required-field': import("./types.js").SourceMessage;
418
421
  'cms.issueBody.missing-localized-value.default': import("./types.js").SourceMessage;
419
422
  'cms.issueBody.missing-localized-value.fallback': import("./types.js").SourceMessage;
@@ -495,6 +498,7 @@ declare const MESSAGES: {
495
498
  'cms.issueMessage.routeBoundDocumentNotFound': import("./types.js").SourceMessage;
496
499
  'cms.issueMessage.routeParamNotCaptured': import("./types.js").SourceMessage;
497
500
  'cms.issueMessage.collectionNotDefined': import("./types.js").SourceMessage;
501
+ 'cms.issueMessage.storedDocumentUnreadable': import("./types.js").SourceMessage;
498
502
  'cms.issueMessage.unaddressableLocaleCollision': import("./types.js").SourceMessage;
499
503
  'cms.issueDetail.expectsString': import("./types.js").SourceMessage;
500
504
  'cms.issueDetail.expectsRichText': import("./types.js").SourceMessage;
@@ -563,6 +567,8 @@ declare const MESSAGES: {
563
567
  'cms.version.textUnchanged': import("./types.js").SourceMessage;
564
568
  'cms.version.restoreBlock': import("./types.js").SourceMessage;
565
569
  'cms.version.nestedContentChanged': import("./types.js").SourceMessage;
570
+ 'cms.version.nestedInProse': import("./types.js").SourceMessage;
571
+ 'cms.version.nestedIn': import("./types.js").SourceMessage;
566
572
  'cms.version.blockAdded': import("./types.js").SourceMessage;
567
573
  'cms.version.blockRemoved': import("./types.js").SourceMessage;
568
574
  'cms.version.emptyValue': import("./types.js").SourceMessage;
@@ -649,6 +655,16 @@ declare const MESSAGES: {
649
655
  'cms.asset.notSet': import("./types.js").SourceMessage;
650
656
  'cms.asset.imageOptions.title': import("./types.js").SourceMessage;
651
657
  'cms.asset.imageOptions.description': import("./types.js").SourceMessage;
658
+ 'cms.asset.imageOptions.placementTitle': import("./types.js").SourceMessage;
659
+ 'cms.asset.imageOptions.placementHint': import("./types.js").SourceMessage;
660
+ 'cms.asset.imageOptions.assetTitle': import("./types.js").SourceMessage;
661
+ 'cms.asset.imageOptions.assetHint': import("./types.js").SourceMessage;
662
+ 'cms.asset.imageOptions.whereUsed': import("./types.js").SourceMessage;
663
+ 'cms.asset.replaceFile': import("./types.js").SourceMessage;
664
+ 'cms.asset.replacing': import("./types.js").SourceMessage;
665
+ 'cms.asset.replaceWrongKind': import("./types.js").SourceMessage;
666
+ 'cms.asset.replaceSaveFirst': import("./types.js").SourceMessage;
667
+ 'cms.asset.replacedCheckFocal': import("./types.js").SourceMessage;
652
668
  'cms.asset.focalPoint': import("./types.js").SourceMessage;
653
669
  'cms.asset.resetToCentre': import("./types.js").SourceMessage;
654
670
  'cms.asset.focalPointHint': import("./types.js").SourceMessage;
@@ -876,6 +892,10 @@ declare const MESSAGES: {
876
892
  'builder.clipboard.notAllowed': import("./types.js").SourceMessage;
877
893
  'builder.clipboard.notAllowedByField': import("./types.js").SourceMessage;
878
894
  'builder.clipboard.issueComponent': import("./types.js").SourceMessage;
895
+ 'builder.placement.notAllowedByField': import("./types.js").SourceMessage;
896
+ 'builder.placement.notAllowedInSlot': import("./types.js").SourceMessage;
897
+ 'builder.placement.serverOnly': import("./types.js").SourceMessage;
898
+ 'builder.placement.dismiss': import("./types.js").SourceMessage;
879
899
  'builder.clipboard.error.corruptJson': import("./types.js").SourceMessage;
880
900
  'builder.clipboard.error.notEnvelope': import("./types.js").SourceMessage;
881
901
  'builder.clipboard.error.foreignFormat': import("./types.js").SourceMessage;
@@ -912,7 +932,6 @@ declare const MESSAGES: {
912
932
  'builder.inspector.slots': import("./types.js").SourceMessage;
913
933
  'builder.inspector.slotsHint': import("./types.js").SourceMessage;
914
934
  'builder.inspector.propertiesPane': import("./types.js").SourceMessage;
915
- 'builder.inspector.invalidValue': import("./types.js").SourceMessage;
916
935
  'builder.inspector.invalidJson': import("./types.js").SourceMessage;
917
936
  'builder.layout.title': import("./types.js").SourceMessage;
918
937
  'builder.layout.direction': import("./types.js").SourceMessage;
@@ -956,7 +975,10 @@ declare const MESSAGES: {
956
975
  'builder.canvasTheme.stylesheetErrorNotice': import("./types.js").SourceMessage;
957
976
  'builder.canvasTheme.noThemeTokensNotice': import("./types.js").SourceMessage;
958
977
  'builder.canvasTheme.noStylesheetNotice': import("./types.js").SourceMessage;
959
- 'builder.composition.preservedNotice': import("./types.js").SourceMessage;
978
+ 'builder.run.title': import("./types.js").SourceMessage;
979
+ 'builder.run.items': import("./types.js").SourceMessage;
980
+ 'builder.run.hint': import("./types.js").SourceMessage;
981
+ 'builder.run.delete': import("./types.js").SourceMessage;
960
982
  'builder.spacing.gapAfterChild': import("./types.js").SourceMessage;
961
983
  'builder.richText.toolbarLabel': import("./types.js").SourceMessage;
962
984
  'builder.richText.linkPlaceholder': import("./types.js").SourceMessage;
@@ -1079,6 +1101,10 @@ declare const MESSAGES: {
1079
1101
  'ai.translate.proposalTitle': import("./types.js").SourceMessage;
1080
1102
  'ai.translate.diffBefore': import("./types.js").SourceMessage;
1081
1103
  'ai.translate.diffAfter': import("./types.js").SourceMessage;
1104
+ 'ai.translate.skippedTitle': import("./types.js").SourceMessage;
1105
+ 'ai.translate.skipped.unreadable': import("./types.js").SourceMessage;
1106
+ 'ai.translate.skipped.notReturned': import("./types.js").SourceMessage;
1107
+ 'ai.translate.skipped.structureChanged': import("./types.js").SourceMessage;
1082
1108
  'ai.update.proposalTitle': import("./types.js").SourceMessage;
1083
1109
  'ai.update.diffBefore': import("./types.js").SourceMessage;
1084
1110
  'ai.update.diffAfter': import("./types.js").SourceMessage;
@@ -1089,7 +1115,13 @@ declare const MESSAGES: {
1089
1115
  'builder.inspector.unsetWithHint': import("./types.js").SourceMessage;
1090
1116
  'cms.issueMessage.nonCanonicalValue': import("./types.js").SourceMessage;
1091
1117
  'cms.issueMessage.assetHoldsUrl': import("./types.js").SourceMessage;
1118
+ 'cms.issueMessage.emptyAllow': import("./types.js").SourceMessage;
1119
+ 'cms.issueMessage.unknownAllowComponent': import("./types.js").SourceMessage;
1092
1120
  'cms.issueMessage.blocksNotTopLevel': import("./types.js").SourceMessage;
1121
+ 'cms.issueMessage.placementKeyReserved': import("./types.js").SourceMessage;
1122
+ 'cms.issueMessage.placementNotScalar': import("./types.js").SourceMessage;
1123
+ 'cms.issueMessage.sourceNotOnAssetCollection': import("./types.js").SourceMessage;
1124
+ 'cms.issueMessage.sourceTypeMismatch': import("./types.js").SourceMessage;
1093
1125
  'cms.issueMessage.uniqueNotTopLevel': import("./types.js").SourceMessage;
1094
1126
  'cms.issueMessage.localizedOnProp': import("./types.js").SourceMessage;
1095
1127
  'cms.issueMessage.localizedOnSubField': import("./types.js").SourceMessage;
@@ -267,6 +267,8 @@ const MESSAGES = {
267
267
  // EC-589 — the referrer direction of `strict: true`: publish refused while a strict target is missing or unpublished.
268
268
  'operations.error.strictTargetsUnpublishedOne': msg('Document “{target}” cannot be published: a strict relation target is missing or unpublished — publish it first.'),
269
269
  'operations.error.strictTargetsUnpublished': msg('Document “{target}” cannot be published: strict relation targets are missing or unpublished — publish them first.'),
270
+ 'operations.error.publishNeedsLocales': msg('“{target}” cannot be published: its collection declares localized fields ({fields}), and no locale config was given to judge their hidden values in.', 'EC-585: a headless runtime publishing a localized collection without the project locale config; {fields} is a comma-separated list of field names.'),
271
+ 'operations.error.versionNotPinnable': msg('Version {version} of “{target}” was not recorded by a publish, so it cannot be pinned live — restore it into the draft and publish that instead.', 'EC-585: only a version a publish recorded can be re-pinned; {version} is a number.'),
270
272
  'operations.errorDetail.andMore': msg(', and {count} more', 'Truncation fragment spliced into the strict-reference sentences; keeps its leading comma and space.'),
271
273
  // EC-494 — content-query errors (`core/content`'s validateWhere/validateSort/
272
274
  // validateLimit). Two studio surfaces render them: the filter builder's per-clause
@@ -521,6 +523,7 @@ const MESSAGES = {
521
523
  'cms.issue.hidden-predicate-error': msg('Broken visibility rule'),
522
524
  'cms.issue.unaddressable-url': msg('Unreachable URL'),
523
525
  'cms.issue.unknown-version': msg('Unknown version'),
526
+ 'cms.issue.invalid-stored-document': msg('Unreadable stored document', 'EC-585: a stored row the delivery snapshot shipped is not a valid document, so it is not delivered.'),
524
527
  // EC-443 — issue-card BODY templates, only for codes whose full body derives
525
528
  // from `code` + `path`/`meta` (`issue-copy.ts`); every other code shows the
526
529
  // raw English core message (honest fallback).
@@ -627,6 +630,7 @@ const MESSAGES = {
627
630
  'cms.issueMessage.routeBoundDocumentNotFound': msg('Route-bound document "{collection}:{id}" was not found.'),
628
631
  'cms.issueMessage.routeParamNotCaptured': msg('Route "{route}" binds its document to URL parameter ":{param}", which pattern "{pattern}" does not capture.'),
629
632
  'cms.issueMessage.collectionNotDefined': msg('Collection "{collection}" is not defined.'),
633
+ 'cms.issueMessage.storedDocumentUnreadable': msg('Stored document {document} could not be read and is not delivered ({reason}).', 'EC-585 (Codex F12): {document} is collection:id (or #index), {reason} the schema findings in English.'),
630
634
  'cms.issueMessage.unaddressableLocaleCollision': msg('No URL reaches "{id}" in locale "{locale}": its address would be "{url}", but the first segment "{segment}" is a declared locale code, so the site reads that URL as locale "{segment}", path "{readPath}". Rename that segment — on this document or on the ancestor that owns it — so it does not collide with a locale code.'),
631
635
  'cms.issueDetail.expectsString': msg('expects a string'),
632
636
  'cms.issueDetail.expectsRichText': msg('expects rich-text content (a string or a rich-text value)'),
@@ -708,6 +712,9 @@ const MESSAGES = {
708
712
  'cms.version.textUnchanged': msg('Text unchanged — formatting or whitespace differs.'),
709
713
  'cms.version.restoreBlock': msg('Restore this block from v{version}'),
710
714
  'cms.version.nestedContentChanged': msg('Nested content changed.'),
715
+ // EC-593 — where a nested component's diff row sits.
716
+ 'cms.version.nestedInProse': msg('in the text'),
717
+ 'cms.version.nestedIn': msg('inside {path}', '{path} lists component names, e.g. "Section › Grid".'),
711
718
  'cms.version.blockAdded': msg('Block added.'),
712
719
  'cms.version.blockRemoved': msg('Block removed.'),
713
720
  'cms.version.emptyValue': msg('empty'),
@@ -808,7 +815,17 @@ const MESSAGES = {
808
815
  'cms.asset.altLabel': msg('Alt:', 'Inline label prefixing an image’s alt text.'),
809
816
  'cms.asset.notSet': msg('not set'),
810
817
  'cms.asset.imageOptions.title': msg('Image options'),
811
- 'cms.asset.imageOptions.description': msg('Focal point and metadata — shared across every use of this image.'),
818
+ 'cms.asset.imageOptions.description': msg('What belongs to this use of the image, apart from what is true of the image everywhere.'),
819
+ 'cms.asset.imageOptions.placementTitle': msg('In this place', 'Image options dialog: the section of per-use (placement) fields, e.g. a caption.'),
820
+ 'cms.asset.imageOptions.placementHint': msg('Only this use of the image — another page can show it differently.'),
821
+ 'cms.asset.imageOptions.assetTitle': msg('About this image', 'Image options dialog: the section of the asset’s own facts (alt text, credit, focal point).'),
822
+ 'cms.asset.imageOptions.assetHint': msg('Applies everywhere this image is used — a change here changes every use.'),
823
+ 'cms.asset.imageOptions.whereUsed': msg('Where it is used'),
824
+ 'cms.asset.replaceFile': msg('Replace file', 'Asset action: upload new bytes into the SAME asset — every use shows the new file.'),
825
+ 'cms.asset.replacing': msg('Replacing…'),
826
+ 'cms.asset.replaceWrongKind': msg('“{name}” not used — a replacement must be {types}, like the current file.'),
827
+ 'cms.asset.replaceSaveFirst': msg('Save or discard the metadata changes first.'),
828
+ 'cms.asset.replacedCheckFocal': msg('The file was replaced — check that the focal point still frames the subject.'),
812
829
  'cms.asset.focalPoint': msg('Focal point'),
813
830
  'cms.asset.resetToCentre': msg('Reset to centre'),
814
831
  'cms.asset.focalPointHint': msg('Click or drag on the image to set the focal point used when it’s cropped.'),
@@ -1086,6 +1103,12 @@ const MESSAGES = {
1086
1103
  // EC-554 — the composition FIELD's top-level `allow` refuses the pasted root.
1087
1104
  'builder.clipboard.notAllowedByField': msg('{component} cannot be pasted at the top level of "{field}" — the field does not allow it.', '{component} is the pasted root’s short component name (e.g. “Container”); {field} is the composition field’s label (e.g. “Canvas”).'),
1088
1105
  'builder.clipboard.issueComponent': msg('component'),
1106
+ // EC-584 — a refused placement: the builder reducer ran the one placement judge and
1107
+ // left the composition unchanged. Shown above the canvas (and for a refused paste).
1108
+ 'builder.placement.notAllowedByField': msg('{component} is not allowed at the top level of "{field}" — the field does not allow it. Nothing changed.', '{component} is the component’s short name (e.g. “Hero”); {field} is the composition field’s label (e.g. “Canvas”).'),
1109
+ 'builder.placement.notAllowedInSlot': msg('{component} is not allowed in {destination} — the slot does not allow it. Nothing changed.', '{component} is the component’s short name; {destination} is “Parent · slot” (e.g. “Section · body”).'),
1110
+ 'builder.placement.serverOnly': msg('{component} renders on the server only and cannot be placed on the canvas. Nothing changed.', 'EC-191: a component declared clientRenderable: false — usable in page/layout code, not in an editor composition.'),
1111
+ 'builder.placement.dismiss': msg('Dismiss'),
1089
1112
  // EC-494 — the engine-built clipboard failures (`core/clipboard`), which carry a
1090
1113
  // catalog ref because that subpath may not import this catalog, plus the studio-side
1091
1114
  // paste diff and its summary (translated in place — it already holds the locale).
@@ -1125,7 +1148,6 @@ const MESSAGES = {
1125
1148
  'builder.inspector.slots': msg('Slots'),
1126
1149
  'builder.inspector.slotsHint': msg('Add or reorder slot children from the page tree.'),
1127
1150
  'builder.inspector.propertiesPane': msg('Properties'),
1128
- 'builder.inspector.invalidValue': msg('Value doesn’t match the prop schema — the component renders its own default until it is fixed.'),
1129
1151
  'builder.inspector.invalidJson': msg('Invalid JSON'),
1130
1152
  'builder.layout.title': msg('Layout'),
1131
1153
  'builder.layout.direction': msg('Direction'),
@@ -1176,7 +1198,13 @@ const MESSAGES = {
1176
1198
  // Mixed-sequence honesty notice (EC-549 interim): a blocks value carrying
1177
1199
  // typography items the canvas cannot render yet must SAY so — count + pointer,
1178
1200
  // never silence (EC-500 D3's canvas contract, scope item 3).
1179
- 'builder.composition.preservedNotice': msg('This composition carries {count} text item(s) the canvas can’t display yet. They keep their position between the blocks, are untouched by canvas edits, and publish normally.', '{count} is the number of preserved non-component sequence items (prose paragraphs, quotes, …).'),
1201
+ // EC-549 — a typography run of a canvas value (loose prose between blocks): selected,
1202
+ // edited in the inspector's rich-text editor, deleted like a block. It replaced the
1203
+ // count-only `builder.composition.preservedNotice`.
1204
+ 'builder.run.title': msg('Text', 'Inspector title for a selected run of loose prose (paragraphs, quotes, lists) between blocks.'),
1205
+ 'builder.run.items': msg('{count} item(s)', '{count} is the number of typography items (paragraphs, headings, quotes…) in the run.'),
1206
+ 'builder.run.hint': msg('Written text between the blocks — edit it here; it keeps its place between the blocks and publishes as it reads.'),
1207
+ 'builder.run.delete': msg('Delete text'),
1180
1208
  'builder.spacing.gapAfterChild': msg('Gap after child {index}'),
1181
1209
  'builder.richText.toolbarLabel': msg('Text formatting'),
1182
1210
  'builder.richText.linkPlaceholder': msg('https://… (empty removes)'),
@@ -1313,6 +1341,11 @@ const MESSAGES = {
1313
1341
  'ai.translate.proposalTitle': msg('Translation of {collection}'),
1314
1342
  'ai.translate.diffBefore': msg('Current'),
1315
1343
  'ai.translate.diffAfter': msg('Translated'),
1344
+ // EC-593 — what a translation run could not translate is reported, never skipped silently.
1345
+ 'ai.translate.skippedTitle': msg('Not translated ({count})', '{count} is a number.'),
1346
+ 'ai.translate.skipped.unreadable': msg('its stored value could not be read'),
1347
+ 'ai.translate.skipped.notReturned': msg('the assistant returned no text for it'),
1348
+ 'ai.translate.skipped.structureChanged': msg('the translation lost formatting, links or embedded items — the original was kept'),
1316
1349
  // EC-378 — the update (edit-existing) proposal
1317
1350
  'ai.update.proposalTitle': msg('Changes to {collection}'),
1318
1351
  'ai.update.diffBefore': msg('Current'),
@@ -1329,7 +1362,14 @@ const MESSAGES = {
1329
1362
  // EC-586 / EC-581 (wave-0092, zone A) — canonical values and the per-FieldType definition
1330
1363
  'cms.issueMessage.nonCanonicalValue': msg('Field "{field}" is stored in a non-canonical form for a "{type}" field — it was written past the write path that stores one form per field type. It still reads correctly; saving the document again stores the canonical form.'),
1331
1364
  'cms.issueMessage.assetHoldsUrl': msg('Asset field "{field}" holds a URL — an asset value is a library asset, never a URL. Upload the image to the library and pick it, or give a component a literal src for an external image.'),
1365
+ // EC-584 — the AllowList parse (config load / registration).
1366
+ 'cms.issueMessage.emptyAllow': msg('Field "{field}" declares an empty "allow" — a list permits exactly the ids it names, so an empty one permits nothing. Omit "allow" for the type\'s default vocabulary, or list the component ids.'),
1367
+ 'cms.issueMessage.unknownAllowComponent': msg('Field "{field}" allows "{component}", which is not a component of this project — check the id, or remove it from "allow".', '{component} is the component id as declared in the field\'s allow list.'),
1332
1368
  'cms.issueMessage.blocksNotTopLevel': msg('Field "{field}" is a "blocks" field inside an object — a blocks field is top-level only (a canvas inside a repeater breaks the form, the validator positions and the delivery type). Declare another top-level blocks field, or give a component a blocks prop (a slot).'),
1369
+ 'cms.issueMessage.placementKeyReserved': msg('Asset field "{asset}" declares the per-use sub-field "{field}", a name the asset itself owns — it would never reach a component (the asset\'s own "{field}" wins). Rename it; an image\'s alt, credit or AI fact belongs on the asset collection.'),
1370
+ 'cms.issueMessage.placementNotScalar': msg('Asset field "{asset}" declares the per-use sub-field "{field}" of type "{type}" — a placement holds data about this use of the image (a caption, a layout), never a reference or rich text.'),
1371
+ 'cms.issueMessage.sourceNotOnAssetCollection': msg('Field "{field}" declares source "{source}" — an embedded-metadata source fills a top-level field of the asset collection only.'),
1372
+ 'cms.issueMessage.sourceTypeMismatch': msg('Field "{field}" declares source "{source}", which cannot fill a "{type}" field (every source fills text; iptc:digitalSourceType also a boolean).'),
1333
1373
  'cms.issueMessage.uniqueNotTopLevel': msg('Sub-field "{field}" declares "unique" — uniqueness is judged across a collection\'s documents, so it applies to top-level fields only.'),
1334
1374
  'cms.issueMessage.localizedOnProp': msg('Component prop "{field}" declares "localized" — a localized value is stored per locale under the document, so only a top-level document field can be localized (localize the field that holds the composition).'),
1335
1375
  'cms.issueMessage.localizedOnSubField': msg('Sub-field "{field}" declares "localized" — a localized value is stored per locale under the document, so only a top-level field can be localized (localize the field that holds it).'),