@elytracms/studio 0.0.86 → 0.0.87

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 (203) hide show
  1. package/convex/asset-revalidate.test.ts +186 -0
  2. package/convex/assets.ts +53 -19
  3. package/convex/cms.ts +22 -0
  4. package/convex/delivery.ts +33 -116
  5. package/convex/functions.ts +3 -3
  6. package/convex/rail-write-parity.test.ts +180 -0
  7. package/convex/redirects.ts +33 -11
  8. package/convex/revalidate.ts +7 -5
  9. package/convex/triggers.ts +53 -3
  10. package/dist/components/app-views/default-modules.d.ts +20 -20
  11. package/dist/components/app-views/default-modules.js +27 -48
  12. package/dist/components/app-views/default-modules.js.map +1 -1
  13. package/dist/components/app-views/studio-config.d.ts +5 -6
  14. package/dist/components/app-views/studio-config.js.map +1 -1
  15. package/dist/components/assets/asset-metadata.d.ts +28 -19
  16. package/dist/components/assets/asset-metadata.js +24 -31
  17. package/dist/components/assets/asset-metadata.js.map +1 -1
  18. package/dist/components/assets/asset-selection.d.ts +24 -5
  19. package/dist/components/assets/asset-selection.js +39 -9
  20. package/dist/components/assets/asset-selection.js.map +1 -1
  21. package/dist/components/assets/assets-collection-view-source.d.ts +17 -14
  22. package/dist/components/assets/assets-collection-view-source.js +25 -31
  23. package/dist/components/assets/assets-collection-view-source.js.map +1 -1
  24. package/dist/components/builder/blocks-panel.js +3 -3
  25. package/dist/components/builder/blocks-panel.js.map +1 -1
  26. package/dist/components/builder/builder-store.d.ts +25 -1
  27. package/dist/components/builder/builder-store.js +3 -2
  28. package/dist/components/builder/builder-store.js.map +1 -1
  29. package/dist/components/builder/canvas-chrome-css.js +0 -17
  30. package/dist/components/builder/canvas-chrome-css.js.map +1 -1
  31. package/dist/components/builder/canvas-chrome.d.ts +10 -12
  32. package/dist/components/builder/canvas-chrome.js +12 -13
  33. package/dist/components/builder/canvas-chrome.js.map +1 -1
  34. package/dist/components/builder/canvas-dnd.d.ts +8 -0
  35. package/dist/components/builder/canvas-dnd.js +5 -3
  36. package/dist/components/builder/canvas-dnd.js.map +1 -1
  37. package/dist/components/builder/canvas-render-context.d.ts +12 -24
  38. package/dist/components/builder/canvas-render-context.js +15 -44
  39. package/dist/components/builder/canvas-render-context.js.map +1 -1
  40. package/dist/components/builder/canvas.js +5 -11
  41. package/dist/components/builder/canvas.js.map +1 -1
  42. package/dist/components/builder/clipboard-actions.d.ts +14 -6
  43. package/dist/components/builder/clipboard-actions.js +29 -20
  44. package/dist/components/builder/clipboard-actions.js.map +1 -1
  45. package/dist/components/builder/composition-field-editor.d.ts +19 -26
  46. package/dist/components/builder/composition-field-editor.js +30 -52
  47. package/dist/components/builder/composition-field-editor.js.map +1 -1
  48. package/dist/components/builder/insert-context.d.ts +3 -1
  49. package/dist/components/builder/insert-context.js +15 -10
  50. package/dist/components/builder/insert-context.js.map +1 -1
  51. package/dist/components/builder/page-tree.d.ts +29 -0
  52. package/dist/components/builder/page-tree.js +56 -58
  53. package/dist/components/builder/page-tree.js.map +1 -1
  54. package/dist/components/builder/reuse.js +5 -2
  55. package/dist/components/builder/reuse.js.map +1 -1
  56. package/dist/components/cms/asset-field.js +20 -32
  57. package/dist/components/cms/asset-field.js.map +1 -1
  58. package/dist/components/cms/cms-composition-validators.js +11 -2
  59. package/dist/components/cms/cms-composition-validators.js.map +1 -1
  60. package/dist/components/cms/editable-cell.js +5 -2
  61. package/dist/components/cms/editable-cell.js.map +1 -1
  62. package/dist/components/cms/use-document-versions.js +1 -0
  63. package/dist/components/cms/use-document-versions.js.map +1 -1
  64. package/dist/components/cms/versions-model.d.ts +0 -12
  65. package/dist/components/cms/versions-model.js +3 -15
  66. package/dist/components/cms/versions-model.js.map +1 -1
  67. package/dist/components/components/component-detail.js +1 -1
  68. package/dist/components/components/component-detail.js.map +1 -1
  69. package/dist/components/components/transfer-dialog.js +2 -4
  70. package/dist/components/components/transfer-dialog.js.map +1 -1
  71. package/dist/components/components/transfer.d.ts +13 -10
  72. package/dist/components/components/transfer.js +21 -19
  73. package/dist/components/components/transfer.js.map +1 -1
  74. package/dist/components/project-session.d.ts +9 -0
  75. package/dist/components/project-session.js +1 -1
  76. package/dist/components/project-session.js.map +1 -1
  77. package/dist/components/redirects/redirects-collection-view-source.d.ts +17 -2
  78. package/dist/components/redirects/redirects-collection-view-source.js +20 -6
  79. package/dist/components/redirects/redirects-collection-view-source.js.map +1 -1
  80. package/dist/components/section-surface.js +3 -2
  81. package/dist/components/section-surface.js.map +1 -1
  82. package/dist/components/settings-form.js +1 -2
  83. package/dist/components/settings-form.js.map +1 -1
  84. package/dist/components/studio-context.js +1 -18
  85. package/dist/components/studio-context.js.map +1 -1
  86. package/dist/components/studio-project-screen.js +3 -5
  87. package/dist/components/studio-project-screen.js.map +1 -1
  88. package/dist/lib/ai/apply-content.js +73 -29
  89. package/dist/lib/ai/apply-content.js.map +1 -1
  90. package/dist/lib/ai/constraints.d.ts +35 -0
  91. package/dist/lib/ai/constraints.js +104 -4
  92. package/dist/lib/ai/constraints.js.map +1 -1
  93. package/dist/lib/ai/route.js +4 -1
  94. package/dist/lib/ai/route.js.map +1 -1
  95. package/dist/lib/ai/shape.d.ts +3 -2
  96. package/dist/lib/ai/shape.js +16 -24
  97. package/dist/lib/ai/shape.js.map +1 -1
  98. package/dist/lib/ai/types.d.ts +8 -0
  99. package/dist/lib/ai/types.js.map +1 -1
  100. package/dist/lib/ai/update-fields.js +33 -12
  101. package/dist/lib/ai/update-fields.js.map +1 -1
  102. package/dist/lib/assets/asset-placements.d.ts +35 -0
  103. package/dist/lib/assets/asset-placements.js +74 -0
  104. package/dist/lib/assets/asset-placements.js.map +1 -0
  105. package/dist/lib/assets/backfill-thumbs.d.ts +9 -8
  106. package/dist/lib/assets/backfill-thumbs.js +13 -25
  107. package/dist/lib/assets/backfill-thumbs.js.map +1 -1
  108. package/dist/lib/clipboard/paste-issues.d.ts +17 -15
  109. package/dist/lib/clipboard/paste-issues.js +8 -45
  110. package/dist/lib/clipboard/paste-issues.js.map +1 -1
  111. package/dist/lib/clipboard/paste-target.d.ts +25 -1
  112. package/dist/lib/clipboard/paste-target.js +13 -6
  113. package/dist/lib/clipboard/paste-target.js.map +1 -1
  114. package/dist/lib/cms/published-documents.js +1 -0
  115. package/dist/lib/cms/published-documents.js.map +1 -1
  116. package/dist/lib/cms-views/view-model.d.ts +3 -3
  117. package/dist/lib/data/index.d.ts +0 -3
  118. package/dist/lib/data/index.js +4 -6
  119. package/dist/lib/data/index.js.map +1 -1
  120. package/dist/lib/dnd/drop-rules.d.ts +45 -2
  121. package/dist/lib/dnd/drop-rules.js +64 -9
  122. package/dist/lib/dnd/drop-rules.js.map +1 -1
  123. package/dist/lib/engine-version.d.ts +1 -1
  124. package/dist/lib/engine-version.js +1 -1
  125. package/dist/lib/engine-version.js.map +1 -1
  126. package/dist/lib/i18n/messages.de.js +4 -56
  127. package/dist/lib/i18n/messages.de.js.map +1 -1
  128. package/dist/lib/i18n/messages.en.d.ts +4 -53
  129. package/dist/lib/i18n/messages.en.js +8 -57
  130. package/dist/lib/i18n/messages.en.js.map +1 -1
  131. package/dist/lib/locale/fallback.js +8 -2
  132. package/dist/lib/locale/fallback.js.map +1 -1
  133. package/dist/lib/locale/index.d.ts +0 -1
  134. package/dist/lib/locale/index.js +0 -1
  135. package/dist/lib/locale/index.js.map +1 -1
  136. package/dist/lib/locale/locale-store.d.ts +10 -3
  137. package/dist/lib/locale/locale-store.js +12 -5
  138. package/dist/lib/locale/locale-store.js.map +1 -1
  139. package/dist/lib/operations/session-hydration.d.ts +9 -5
  140. package/dist/lib/operations/session-hydration.js +10 -10
  141. package/dist/lib/operations/session-hydration.js.map +1 -1
  142. package/dist/lib/persistence/convex-adapter.js +63 -75
  143. package/dist/lib/persistence/convex-adapter.js.map +1 -1
  144. package/dist/lib/persona/labels.d.ts +0 -2
  145. package/dist/lib/persona/labels.js +1 -7
  146. package/dist/lib/persona/labels.js.map +1 -1
  147. package/dist/lib/registry/index.d.ts +4 -2
  148. package/dist/lib/registry/index.js +26 -21
  149. package/dist/lib/registry/index.js.map +1 -1
  150. package/dist/lib/registry/project-components.js +0 -3
  151. package/dist/lib/registry/project-components.js.map +1 -1
  152. package/dist/lib/routes/route-issues.js +4 -5
  153. package/dist/lib/routes/route-issues.js.map +1 -1
  154. package/dist/lib/theme.js +3 -2
  155. package/dist/lib/theme.js.map +1 -1
  156. package/dist/lib/webhooks/tags.js +11 -14
  157. package/dist/lib/webhooks/tags.js.map +1 -1
  158. package/dist/lib/workspace/index.d.ts +1 -1
  159. package/dist/lib/workspace/index.js +1 -1
  160. package/dist/lib/workspace/index.js.map +1 -1
  161. package/dist/previews/enumerate.d.ts +27 -9
  162. package/dist/previews/enumerate.js +27 -6
  163. package/dist/previews/enumerate.js.map +1 -1
  164. package/dist/previews/manifest-format.d.ts +9 -0
  165. package/dist/previews/manifest-format.js.map +1 -1
  166. package/dist/router/match.d.ts +0 -2
  167. package/dist/router/match.js +0 -2
  168. package/dist/router/match.js.map +1 -1
  169. package/dist/ui/badge.d.ts +1 -1
  170. package/package.json +2 -2
  171. package/src/styles/studio.css +5 -4
  172. package/src/styles/tokens.css +72 -55
  173. package/convex/content.ts +0 -291
  174. package/dist/components/collab/collab-context.d.ts +0 -27
  175. package/dist/components/collab/collab-context.js +0 -39
  176. package/dist/components/collab/collab-context.js.map +0 -1
  177. package/dist/components/collab/collab-seed.d.ts +0 -15
  178. package/dist/components/collab/collab-seed.js +0 -20
  179. package/dist/components/collab/collab-seed.js.map +0 -1
  180. package/dist/components/extensions/extensions-view.d.ts +0 -7
  181. package/dist/components/extensions/extensions-view.js +0 -127
  182. package/dist/components/extensions/extensions-view.js.map +0 -1
  183. package/dist/lib/bindings/section-bindings.d.ts +0 -24
  184. package/dist/lib/bindings/section-bindings.js +0 -9
  185. package/dist/lib/bindings/section-bindings.js.map +0 -1
  186. package/dist/lib/data/data-store.d.ts +0 -98
  187. package/dist/lib/data/data-store.js +0 -211
  188. package/dist/lib/data/data-store.js.map +0 -1
  189. package/dist/lib/data/providers.d.ts +0 -143
  190. package/dist/lib/data/providers.js +0 -255
  191. package/dist/lib/data/providers.js.map +0 -1
  192. package/dist/lib/data/sample-capture.d.ts +0 -30
  193. package/dist/lib/data/sample-capture.js +0 -70
  194. package/dist/lib/data/sample-capture.js.map +0 -1
  195. package/dist/lib/data/sources-store.d.ts +0 -42
  196. package/dist/lib/data/sources-store.js +0 -120
  197. package/dist/lib/data/sources-store.js.map +0 -1
  198. package/dist/lib/locale/binding-fallback.d.ts +0 -35
  199. package/dist/lib/locale/binding-fallback.js +0 -73
  200. package/dist/lib/locale/binding-fallback.js.map +0 -1
  201. package/dist/lib/starters/kit-session.d.ts +0 -5
  202. package/dist/lib/starters/kit-session.js +0 -17
  203. package/dist/lib/starters/kit-session.js.map +0 -1
@@ -58,8 +58,6 @@ declare const MESSAGES: {
58
58
  'nav.assets.description': import("./types.js").SourceMessage;
59
59
  'nav.users.label': import("./types.js").SourceMessage;
60
60
  'nav.users.description': import("./types.js").SourceMessage;
61
- 'nav.extensions.label': import("./types.js").SourceMessage;
62
- 'nav.extensions.description': import("./types.js").SourceMessage;
63
61
  'nav.settings.label': import("./types.js").SourceMessage;
64
62
  'nav.settings.description': import("./types.js").SourceMessage;
65
63
  'userMenu.accountMenu': import("./types.js").SourceMessage;
@@ -409,6 +407,7 @@ declare const MESSAGES: {
409
407
  'cms.issue.unknown-alias': import("./types.js").SourceMessage;
410
408
  'cms.issue.unfilled-slot': import("./types.js").SourceMessage;
411
409
  'cms.issue.custom-validation': import("./types.js").SourceMessage;
410
+ 'cms.issue.hidden-predicate-error': import("./types.js").SourceMessage;
412
411
  'cms.issue.unaddressable-url': import("./types.js").SourceMessage;
413
412
  'cms.issue.unknown-version': import("./types.js").SourceMessage;
414
413
  'cms.issueBody.missing-required-field': import("./types.js").SourceMessage;
@@ -421,6 +420,8 @@ declare const MESSAGES: {
421
420
  'cms.issueMessage.duplicateDocument': import("./types.js").SourceMessage;
422
421
  'cms.issueMessage.fieldDetail': import("./types.js").SourceMessage;
423
422
  'cms.issueMessage.fieldReason': import("./types.js").SourceMessage;
423
+ 'cms.issueMessage.fieldHiddenPredicateThrew': import("./types.js").SourceMessage;
424
+ 'cms.issueMessage.groupHiddenPredicateThrew': import("./types.js").SourceMessage;
424
425
  'cms.issueMessage.propDetail': import("./types.js").SourceMessage;
425
426
  'cms.issueMessage.propReason': import("./types.js").SourceMessage;
426
427
  'cms.issueMessage.relationUnknownTargetCollection': import("./types.js").SourceMessage;
@@ -760,7 +761,6 @@ declare const MESSAGES: {
760
761
  'components.detail.notFound.body': import("./types.js").SourceMessage;
761
762
  'components.detail.notFound.back': import("./types.js").SourceMessage;
762
763
  'components.detail.allComponents': import("./types.js").SourceMessage;
763
- 'components.detail.designTokens': import("./types.js").SourceMessage;
764
764
  'components.status.valid': import("./types.js").SourceMessage;
765
765
  'components.status.incompatible': import("./types.js").SourceMessage;
766
766
  'components.status.invalid': import("./types.js").SourceMessage;
@@ -820,49 +820,6 @@ declare const MESSAGES: {
820
820
  'components.browser.project': import("./types.js").SourceMessage;
821
821
  'components.browser.noMatchQuery': import("./types.js").SourceMessage;
822
822
  'components.browser.noMatchFilters': import("./types.js").SourceMessage;
823
- 'extensions.tab.marketplace': import("./types.js").SourceMessage;
824
- 'extensions.tab.installed': import("./types.js").SourceMessage;
825
- 'extensions.tab.registered': import("./types.js").SourceMessage;
826
- 'extensions.header.title': import("./types.js").SourceMessage;
827
- 'extensions.header.subtitle': import("./types.js").SourceMessage;
828
- 'extensions.search.placeholder': import("./types.js").SourceMessage;
829
- 'extensions.search.aria': import("./types.js").SourceMessage;
830
- 'extensions.token.placeholder': import("./types.js").SourceMessage;
831
- 'extensions.token.unlocked': import("./types.js").SourceMessage;
832
- 'extensions.empty.noMatch.title': import("./types.js").SourceMessage;
833
- 'extensions.empty.noMatch.body': import("./types.js").SourceMessage;
834
- 'extensions.listing.private': import("./types.js").SourceMessage;
835
- 'extensions.listing.noDescription': import("./types.js").SourceMessage;
836
- 'extensions.listing.unknownAuthor': import("./types.js").SourceMessage;
837
- 'extensions.action.installed': import("./types.js").SourceMessage;
838
- 'extensions.action.install': import("./types.js").SourceMessage;
839
- 'extensions.error.accessDenied': import("./types.js").SourceMessage;
840
- 'extensions.error.installFailed': import("./types.js").SourceMessage;
841
- 'extensions.empty.installed.title': import("./types.js").SourceMessage;
842
- 'extensions.empty.installed.body': import("./types.js").SourceMessage;
843
- 'extensions.contrib.components': import("./types.js").SourceMessage;
844
- 'extensions.contrib.fieldTypes': import("./types.js").SourceMessage;
845
- 'extensions.contrib.dataSources': import("./types.js").SourceMessage;
846
- 'extensions.contrib.assetStorage': import("./types.js").SourceMessage;
847
- 'extensions.contrib.exportTargets': import("./types.js").SourceMessage;
848
- 'extensions.contrib.templates': import("./types.js").SourceMessage;
849
- 'extensions.contrib.hooks': import("./types.js").SourceMessage;
850
- 'extensions.registered.intro': import("./types.js").SourceMessage;
851
- 'extensions.registered.components.title': import("./types.js").SourceMessage;
852
- 'extensions.registered.components.empty': import("./types.js").SourceMessage;
853
- 'extensions.registered.fieldTypes.title': import("./types.js").SourceMessage;
854
- 'extensions.registered.dataSources.title': import("./types.js").SourceMessage;
855
- 'extensions.registered.assetStorage.title': import("./types.js").SourceMessage;
856
- 'extensions.registered.assetStorage.empty': import("./types.js").SourceMessage;
857
- 'extensions.registered.exportTargets.title': import("./types.js").SourceMessage;
858
- 'extensions.registered.hookPoints.title': import("./types.js").SourceMessage;
859
- 'extensions.kind.plugin': import("./types.js").SourceMessage;
860
- 'extensions.kind.componentPackage': import("./types.js").SourceMessage;
861
- 'extensions.kind.fieldType': import("./types.js").SourceMessage;
862
- 'extensions.kind.dataSource': import("./types.js").SourceMessage;
863
- 'extensions.kind.assetStorage': import("./types.js").SourceMessage;
864
- 'extensions.kind.exportTarget': import("./types.js").SourceMessage;
865
- 'extensions.kind.template': import("./types.js").SourceMessage;
866
823
  'settings.identity.title': import("./types.js").SourceMessage;
867
824
  'settings.identity.name': import("./types.js").SourceMessage;
868
825
  'settings.identity.urlKey': import("./types.js").SourceMessage;
@@ -872,7 +829,6 @@ declare const MESSAGES: {
872
829
  'settings.locales.defaultSuffix': import("./types.js").SourceMessage;
873
830
  'settings.environments.title': import("./types.js").SourceMessage;
874
831
  'settings.environments.label': import("./types.js").SourceMessage;
875
- 'settings.exportTarget': import("./types.js").SourceMessage;
876
832
  'appViews.singleton.opening': import("./types.js").SourceMessage;
877
833
  'builder.canvas.loading': import("./types.js").SourceMessage;
878
834
  'builder.blocksPanel.title': import("./types.js").SourceMessage;
@@ -892,8 +848,6 @@ declare const MESSAGES: {
892
848
  'builder.blocksPanel.variantsHeading': import("./types.js").SourceMessage;
893
849
  'builder.blocksPanel.variantIssuesHint': import("./types.js").SourceMessage;
894
850
  'builder.pageTree.title': import("./types.js").SourceMessage;
895
- 'builder.pageTree.hiddenByCondition': import("./types.js").SourceMessage;
896
- 'builder.pageTree.conditional': import("./types.js").SourceMessage;
897
851
  'builder.pageTree.addChild': import("./types.js").SourceMessage;
898
852
  'builder.pageTree.moreActions': import("./types.js").SourceMessage;
899
853
  'builder.pageTree.moveUp': import("./types.js").SourceMessage;
@@ -906,8 +860,8 @@ declare const MESSAGES: {
906
860
  'builder.clipboard.cutNotice': import("./types.js").SourceMessage;
907
861
  'builder.clipboard.pastedInto': import("./types.js").SourceMessage;
908
862
  'builder.clipboard.notAllowed': import("./types.js").SourceMessage;
863
+ 'builder.clipboard.notAllowedByField': import("./types.js").SourceMessage;
909
864
  'builder.clipboard.issueComponent': import("./types.js").SourceMessage;
910
- 'builder.clipboard.issueBinding': import("./types.js").SourceMessage;
911
865
  'builder.clipboard.error.corruptJson': import("./types.js").SourceMessage;
912
866
  'builder.clipboard.error.notEnvelope': import("./types.js").SourceMessage;
913
867
  'builder.clipboard.error.foreignFormat': import("./types.js").SourceMessage;
@@ -916,12 +870,9 @@ declare const MESSAGES: {
916
870
  'builder.clipboard.error.invalidPayload': import("./types.js").SourceMessage;
917
871
  'builder.clipboard.error.nodeNotFound': import("./types.js").SourceMessage;
918
872
  'builder.clipboard.error.fixtureNotFound': import("./types.js").SourceMessage;
919
- 'builder.clipboard.issue.unresolvedBinding': import("./types.js").SourceMessage;
920
873
  'builder.clipboard.issue.missingComponent': import("./types.js").SourceMessage;
921
874
  'builder.clipboard.summary.pasted': import("./types.js").SourceMessage;
922
875
  'builder.clipboard.summary.pastedWith': import("./types.js").SourceMessage;
923
- 'builder.clipboard.summary.bindingUnresolvedOne': import("./types.js").SourceMessage;
924
- 'builder.clipboard.summary.bindingsUnresolved': import("./types.js").SourceMessage;
925
876
  'builder.clipboard.summary.componentMissingOne': import("./types.js").SourceMessage;
926
877
  'builder.clipboard.summary.componentsMissing': import("./types.js").SourceMessage;
927
878
  'builder.reuse.makeReusable': import("./types.js").SourceMessage;
@@ -64,8 +64,6 @@ const MESSAGES = {
64
64
  'nav.assets.description': msg('Manage uploaded media and metadata.'),
65
65
  'nav.users.label': msg('Users'),
66
66
  'nav.users.description': msg('Manage who has access to this deployment and their role.'),
67
- 'nav.extensions.label': msg('Extensions'),
68
- 'nav.extensions.description': msg('Install components, field types, adapters, and templates from the marketplace.'),
69
67
  'nav.settings.label': msg('Settings'),
70
68
  'nav.settings.description': msg('Configure project metadata and locales.'),
71
69
  // ─────────────────────────────────────────────────────────────────────────
@@ -513,6 +511,7 @@ const MESSAGES = {
513
511
  'cms.issue.unknown-alias': msg('Unknown slot'),
514
512
  'cms.issue.unfilled-slot': msg('Empty slot'),
515
513
  'cms.issue.custom-validation': msg('Validation rule'),
514
+ 'cms.issue.hidden-predicate-error': msg('Broken visibility rule'),
516
515
  'cms.issue.unaddressable-url': msg('Unreachable URL'),
517
516
  'cms.issue.unknown-version': msg('Unknown version'),
518
517
  // EC-443 — issue-card BODY templates, only for codes whose full body derives
@@ -546,6 +545,10 @@ const MESSAGES = {
546
545
  'cms.issueMessage.duplicateDocument': msg('Duplicate document "{id}" in collection "{collection}".'),
547
546
  'cms.issueMessage.fieldDetail': msg('Field "{field}" {detail}.'),
548
547
  'cms.issueMessage.fieldReason': msg('Field "{field}": {reason}'),
548
+ // EC-598 — a config `hidden` predicate threw. {reason} is the thrown message: author
549
+ // prose, kept verbatim (like a `validate` message inside cms.issueMessage.fieldReason).
550
+ 'cms.issueMessage.fieldHiddenPredicateThrew': msg('The visibility rule of field "{field}" threw an error ("{reason}"), so the field is shown and validated. Fix the rule in the project config.', 'A developer-authored show/hide rule crashed. {field} is a field id, {reason} the error text the rule threw (untranslated).'),
551
+ 'cms.issueMessage.groupHiddenPredicateThrew': msg('The visibility rule of group "{group}" threw an error ("{reason}"), so its fields are shown and validated. Fix the rule in the project config.', 'A developer-authored show/hide rule of a form section crashed. {group} is the section id, {reason} the error text the rule threw (untranslated).'),
549
552
  'cms.issueMessage.propDetail': msg('Prop "{field}" {detail}.'),
550
553
  'cms.issueMessage.propReason': msg('Prop "{field}": {reason}'),
551
554
  'cms.issueMessage.relationUnknownTargetCollection': msg('Relation field "{field}" targets unknown collection "{target}".'),
@@ -951,7 +954,6 @@ const MESSAGES = {
951
954
  'components.detail.notFound.body': msg('No component is registered with id {id}.'),
952
955
  'components.detail.notFound.back': msg('Back to components'),
953
956
  'components.detail.allComponents': msg('All components'),
954
- 'components.detail.designTokens': msg('DESIGN TOKENS'),
955
957
  'components.status.valid': msg('valid'),
956
958
  'components.status.incompatible': msg('incompatible'),
957
959
  'components.status.invalid': msg('invalid'),
@@ -1012,52 +1014,6 @@ const MESSAGES = {
1012
1014
  'components.browser.noMatchQuery': msg('No components match “{query}”.'),
1013
1015
  'components.browser.noMatchFilters': msg('No components match the selected filters.'),
1014
1016
  // ─────────────────────────────────────────────────────────────────────────
1015
- // Extensions (marketplace)
1016
- // ─────────────────────────────────────────────────────────────────────────
1017
- 'extensions.tab.marketplace': msg('Marketplace'),
1018
- 'extensions.tab.installed': msg('Installed'),
1019
- 'extensions.tab.registered': msg('Registered'),
1020
- 'extensions.header.title': msg('Extensibility'),
1021
- 'extensions.header.subtitle': msg('Components · field types · data sources · asset storage · export targets · templates · hooks'),
1022
- 'extensions.search.placeholder': msg('Search extensions…'),
1023
- 'extensions.search.aria': msg('Search extensions'),
1024
- 'extensions.token.placeholder': msg('Private registry token'),
1025
- 'extensions.token.unlocked': msg('unlocked'),
1026
- 'extensions.empty.noMatch.title': msg('No extensions match'),
1027
- 'extensions.empty.noMatch.body': msg('Try a different search term.'),
1028
- 'extensions.listing.private': msg('private'),
1029
- 'extensions.listing.noDescription': msg('No description provided.'),
1030
- 'extensions.listing.unknownAuthor': msg('Unknown author'),
1031
- 'extensions.action.installed': msg('Installed'),
1032
- 'extensions.action.install': msg('Install'),
1033
- 'extensions.error.accessDenied': msg('Access denied — a valid token is required.'),
1034
- 'extensions.error.installFailed': msg('Installation failed.'),
1035
- 'extensions.empty.installed.title': msg('Nothing installed yet'),
1036
- 'extensions.empty.installed.body': msg('Install an extension from the marketplace to see what it contributes here.'),
1037
- 'extensions.contrib.components': msg('components'),
1038
- 'extensions.contrib.fieldTypes': msg('field types'),
1039
- 'extensions.contrib.dataSources': msg('data sources'),
1040
- 'extensions.contrib.assetStorage': msg('asset storage'),
1041
- 'extensions.contrib.exportTargets': msg('export targets'),
1042
- 'extensions.contrib.templates': msg('templates'),
1043
- 'extensions.contrib.hooks': msg('hooks'),
1044
- 'extensions.registered.intro': msg('Live registries on the plugin host. Built-in capabilities are always present; installing an extension adds to them.'),
1045
- 'extensions.registered.components.title': msg('Components'),
1046
- 'extensions.registered.components.empty': msg('No project components registered.'),
1047
- 'extensions.registered.fieldTypes.title': msg('Field types'),
1048
- 'extensions.registered.dataSources.title': msg('Data source kinds'),
1049
- 'extensions.registered.assetStorage.title': msg('Asset storage backends'),
1050
- 'extensions.registered.assetStorage.empty': msg('No storage adapters installed.'),
1051
- 'extensions.registered.exportTargets.title': msg('Export targets'),
1052
- 'extensions.registered.hookPoints.title': msg('Hook points'),
1053
- 'extensions.kind.plugin': msg('plugin'),
1054
- 'extensions.kind.componentPackage': msg('components'),
1055
- 'extensions.kind.fieldType': msg('field type'),
1056
- 'extensions.kind.dataSource': msg('data source'),
1057
- 'extensions.kind.assetStorage': msg('asset storage'),
1058
- 'extensions.kind.exportTarget': msg('export target'),
1059
- 'extensions.kind.template': msg('template'),
1060
- // ─────────────────────────────────────────────────────────────────────────
1061
1017
  // Settings
1062
1018
  // ─────────────────────────────────────────────────────────────────────────
1063
1019
  'settings.identity.title': msg('Identity'),
@@ -1069,7 +1025,6 @@ const MESSAGES = {
1069
1025
  'settings.locales.defaultSuffix': msg(' · default'),
1070
1026
  'settings.environments.title': msg('Environments & export'),
1071
1027
  'settings.environments.label': msg('Environments'),
1072
- 'settings.exportTarget': msg('Export target'),
1073
1028
  // ─────────────────────────────────────────────────────────────────────────
1074
1029
  // App-views shell
1075
1030
  // ─────────────────────────────────────────────────────────────────────────
@@ -1097,8 +1052,6 @@ const MESSAGES = {
1097
1052
  'builder.blocksPanel.variantsHeading': msg('Variants'),
1098
1053
  'builder.blocksPanel.variantIssuesHint': msg('Some variants have validation issues.'),
1099
1054
  'builder.pageTree.title': msg('Page tree'),
1100
- 'builder.pageTree.hiddenByCondition': msg('Hidden by condition'),
1101
- 'builder.pageTree.conditional': msg('Conditional'),
1102
1055
  'builder.pageTree.addChild': msg('Add child'),
1103
1056
  'builder.pageTree.moreActions': msg('More actions'),
1104
1057
  'builder.pageTree.moveUp': msg('Move up'),
@@ -1111,8 +1064,9 @@ const MESSAGES = {
1111
1064
  'builder.clipboard.cutNotice': msg('Cut {label}'),
1112
1065
  'builder.clipboard.pastedInto': msg('{summary} · into {destination}'),
1113
1066
  'builder.clipboard.notAllowed': msg('{component} cannot be pasted into {destination} — the slot does not allow it.', '{component} is the pasted root’s short component name (e.g. “Hero”); {destination} is “Parent · slot” (e.g. “Section · body”).'),
1067
+ // EC-554 — the composition FIELD's top-level `allow` refuses the pasted root.
1068
+ '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”).'),
1114
1069
  'builder.clipboard.issueComponent': msg('component'),
1115
- 'builder.clipboard.issueBinding': msg('binding'),
1116
1070
  // EC-494 — the engine-built clipboard failures (`core/clipboard`), which carry a
1117
1071
  // catalog ref because that subpath may not import this catalog, plus the studio-side
1118
1072
  // paste diff and its summary (translated in place — it already holds the locale).
@@ -1124,12 +1078,9 @@ const MESSAGES = {
1124
1078
  'builder.clipboard.error.invalidPayload': msg('Clipboard fragment violates the fragment schema.'),
1125
1079
  'builder.clipboard.error.nodeNotFound': msg('No node "{nodeId}" exists in the composition.'),
1126
1080
  'builder.clipboard.error.fixtureNotFound': msg('Component "{component}" declares no fixture named "{fixture}".'),
1127
- 'builder.clipboard.issue.unresolvedBinding': msg('Binding source "{sourceId}" is not available in this project.'),
1128
1081
  'builder.clipboard.issue.missingComponent': msg('Component "{componentId}" is not registered in this project.'),
1129
1082
  'builder.clipboard.summary.pasted': msg('Pasted'),
1130
- 'builder.clipboard.summary.pastedWith': msg('Pasted — {parts}', '{parts} is the comma-joined list of the two summary fragments below.'),
1131
- 'builder.clipboard.summary.bindingUnresolvedOne': msg('{count} binding unresolved'),
1132
- 'builder.clipboard.summary.bindingsUnresolved': msg('{count} bindings unresolved'),
1083
+ 'builder.clipboard.summary.pastedWith': msg('Pasted — {parts}', '{parts} is the comma-joined list of the summary fragments below.'),
1133
1084
  'builder.clipboard.summary.componentMissingOne': msg('{count} component missing'),
1134
1085
  'builder.clipboard.summary.componentsMissing': msg('{count} components missing'),
1135
1086
  'builder.reuse.makeReusable': msg('Make reusable'),