@elytracms/studio 0.0.100 → 0.0.102
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/convex/analytics-cost.test.ts +1 -1
- package/convex/asset-meta-patch.test.ts +7 -27
- package/convex/assets.ts +6 -41
- package/convex/cms.ts +2 -29
- package/convex/delivery.ts +2 -2
- package/convex/record-functions.ts +15 -82
- package/convex/redirects.ts +11 -116
- package/convex/schema.ts +4 -23
- package/convex/shared-capture.convex.test.ts +165 -0
- package/convex/triggers.ts +7 -14
- package/dist/components/ai/ai-chat-panel-lazy.js +7 -2
- package/dist/components/ai/ai-chat-panel-lazy.js.map +1 -1
- package/dist/components/ai/ai-chat-panel.js +8 -5
- package/dist/components/ai/ai-chat-panel.js.map +1 -1
- package/dist/components/ai/proposal-card.js +2 -1
- package/dist/components/ai/proposal-card.js.map +1 -1
- package/dist/components/ai/proposal-unfilled.d.ts +14 -0
- package/dist/components/ai/proposal-unfilled.js +33 -0
- package/dist/components/ai/proposal-unfilled.js.map +1 -0
- package/dist/components/ai/translate-document-action.js +8 -6
- package/dist/components/ai/translate-document-action.js.map +1 -1
- package/dist/components/ai/translate-skipped.js +1 -0
- package/dist/components/ai/translate-skipped.js.map +1 -1
- package/dist/components/app-views/studio-config.d.ts +12 -12
- package/dist/components/app-views/studio-config.js.map +1 -1
- package/dist/components/assets/asset-detail.js +1 -2
- package/dist/components/assets/asset-detail.js.map +1 -1
- package/dist/components/assets/asset-metadata.d.ts +2 -9
- package/dist/components/assets/asset-metadata.js +3 -10
- package/dist/components/assets/asset-metadata.js.map +1 -1
- package/dist/components/assets/asset-search.js +1 -1
- package/dist/components/assets/asset-search.js.map +1 -1
- package/dist/components/assets/asset-selection.js +2 -2
- package/dist/components/assets/asset-selection.js.map +1 -1
- package/dist/components/assets/assets-collection-view-source.d.ts +2 -3
- package/dist/components/assets/assets-collection-view-source.js +2 -3
- package/dist/components/assets/assets-collection-view-source.js.map +1 -1
- package/dist/components/builder/__fixtures__/reuse-race.d.ts +30 -0
- package/dist/components/builder/__fixtures__/reuse-race.js +77 -0
- package/dist/components/builder/__fixtures__/reuse-race.js.map +1 -0
- package/dist/components/builder/builder-store.d.ts +37 -1
- package/dist/components/builder/builder-store.js +21 -6
- package/dist/components/builder/builder-store.js.map +1 -1
- package/dist/components/builder/canvas-chrome-css.d.ts +1 -1
- package/dist/components/builder/canvas-chrome-css.js +1 -1
- package/dist/components/builder/canvas-chrome-css.js.map +1 -1
- package/dist/components/builder/canvas-chrome.d.ts +1 -1
- package/dist/components/builder/canvas-chrome.js +1 -1
- package/dist/components/builder/canvas-chrome.js.map +1 -1
- package/dist/components/builder/canvas-rebase.d.ts +4 -4
- package/dist/components/builder/canvas-rebase.js +3 -2
- package/dist/components/builder/canvas-rebase.js.map +1 -1
- package/dist/components/builder/canvas-render-context.d.ts +1 -1
- package/dist/components/builder/canvas-render-context.js +1 -1
- package/dist/components/builder/canvas-render-context.js.map +1 -1
- package/dist/components/builder/composition-field-editor-lazy.js +2 -1
- package/dist/components/builder/composition-field-editor-lazy.js.map +1 -1
- package/dist/components/builder/composition-field-editor.js +3 -3
- package/dist/components/builder/composition-field-editor.js.map +1 -1
- package/dist/components/builder/reuse-context.d.ts +9 -2
- package/dist/components/builder/reuse-context.js +46 -6
- package/dist/components/builder/reuse-context.js.map +1 -1
- package/dist/components/builder/reuse.d.ts +113 -70
- package/dist/components/builder/reuse.js +123 -108
- package/dist/components/builder/reuse.js.map +1 -1
- package/dist/components/cms/asset-field.js +1 -3
- package/dist/components/cms/asset-field.js.map +1 -1
- package/dist/components/cms/cell.d.ts +2 -2
- package/dist/components/cms/cell.js +8 -18
- package/dist/components/cms/cell.js.map +1 -1
- package/dist/components/cms/cms-store.d.ts +9 -1
- package/dist/components/cms/cms-store.js +1 -0
- package/dist/components/cms/cms-store.js.map +1 -1
- package/dist/components/cms/detail-editor.js +15 -14
- package/dist/components/cms/detail-editor.js.map +1 -1
- package/dist/components/cms/field-control.js +13 -1
- package/dist/components/cms/field-control.js.map +1 -1
- package/dist/components/cms/prop-fields.js +1 -1
- package/dist/components/cms/prop-fields.js.map +1 -1
- package/dist/components/cms/rich-text/lazy.js +2 -1
- package/dist/components/cms/rich-text/lazy.js.map +1 -1
- package/dist/components/cms/rich-text/toolbar-state.d.ts +1 -1
- package/dist/components/cms/rich-text/toolbar-state.js +1 -1
- package/dist/components/cms/rich-text/toolbar-state.js.map +1 -1
- package/dist/components/cms/use-field-focus.js +3 -3
- package/dist/components/cms/use-field-focus.js.map +1 -1
- package/dist/components/cms/version-compare-lazy.js +2 -1
- package/dist/components/cms/version-compare-lazy.js.map +1 -1
- package/dist/components/components/components-index.js +1 -1
- package/dist/components/components/components-index.js.map +1 -1
- package/dist/components/deployment-setup-gate.d.ts +1 -1
- package/dist/components/deployment-setup-gate.js +1 -1
- package/dist/components/deployment-setup-gate.js.map +1 -1
- package/dist/components/load-failure.d.ts +62 -0
- package/dist/components/load-failure.js +110 -0
- package/dist/components/load-failure.js.map +1 -0
- package/dist/components/notifications/shell-findings.js +3 -3
- package/dist/components/notifications/shell-findings.js.map +1 -1
- package/dist/customization.d.ts +3 -3
- package/dist/customization.js.map +1 -1
- package/dist/lib/ai/apply-content.js +99 -28
- package/dist/lib/ai/apply-content.js.map +1 -1
- package/dist/lib/ai/chat-context.d.ts +77 -7
- package/dist/lib/ai/chat-context.js +139 -14
- package/dist/lib/ai/chat-context.js.map +1 -1
- package/dist/lib/ai/chat-state.d.ts +7 -1
- package/dist/lib/ai/chat-state.js.map +1 -1
- package/dist/lib/ai/constraints.d.ts +5 -0
- package/dist/lib/ai/constraints.js +21 -6
- package/dist/lib/ai/constraints.js.map +1 -1
- package/dist/lib/ai/fake-provider.d.ts +76 -26
- package/dist/lib/ai/fake-provider.js +210 -66
- package/dist/lib/ai/fake-provider.js.map +1 -1
- package/dist/lib/ai/index.d.ts +1 -0
- package/dist/lib/ai/index.js +1 -0
- package/dist/lib/ai/index.js.map +1 -1
- package/dist/lib/ai/keyless-assistant.d.ts +37 -0
- package/dist/lib/ai/keyless-assistant.js +193 -0
- package/dist/lib/ai/keyless-assistant.js.map +1 -0
- package/dist/lib/ai/knowledge.d.ts +9 -9
- package/dist/lib/ai/knowledge.js +22 -0
- package/dist/lib/ai/knowledge.js.map +1 -1
- package/dist/lib/ai/shape.d.ts +25 -2
- package/dist/lib/ai/shape.js +58 -7
- package/dist/lib/ai/shape.js.map +1 -1
- package/dist/lib/ai/tools.d.ts +18 -1
- package/dist/lib/ai/tools.js +74 -11
- package/dist/lib/ai/tools.js.map +1 -1
- package/dist/lib/ai/translate-document.d.ts +8 -1
- package/dist/lib/ai/translate-document.js +25 -9
- package/dist/lib/ai/translate-document.js.map +1 -1
- package/dist/lib/ai/types.d.ts +22 -7
- package/dist/lib/ai/types.js.map +1 -1
- package/dist/lib/ai/update-fields.js +13 -17
- package/dist/lib/ai/update-fields.js.map +1 -1
- package/dist/lib/ai/writer-form.d.ts +72 -3
- package/dist/lib/ai/writer-form.js +320 -42
- package/dist/lib/ai/writer-form.js.map +1 -1
- package/dist/lib/assets/upload.d.ts +1 -2
- package/dist/lib/assets/upload.js +1 -2
- package/dist/lib/assets/upload.js.map +1 -1
- package/dist/lib/auth-errors.d.ts +1 -1
- package/dist/lib/auth-errors.js +1 -1
- package/dist/lib/auth-errors.js.map +1 -1
- package/dist/lib/engine-version.d.ts +1 -1
- package/dist/lib/engine-version.js +1 -1
- package/dist/lib/engine-version.js.map +1 -1
- package/dist/lib/i18n/messages.de.d.ts +1 -1
- package/dist/lib/i18n/messages.de.js +32 -8
- package/dist/lib/i18n/messages.de.js.map +1 -1
- package/dist/lib/i18n/messages.en.d.ts +25 -3
- package/dist/lib/i18n/messages.en.js +40 -10
- package/dist/lib/i18n/messages.en.js.map +1 -1
- package/dist/lib/operations/cms-persistence.d.ts +28 -0
- package/dist/lib/operations/cms-persistence.js +55 -0
- package/dist/lib/operations/cms-persistence.js.map +1 -1
- package/dist/lib/persistence/convex-adapter.js +7 -2
- package/dist/lib/persistence/convex-adapter.js.map +1 -1
- package/dist/lib/workspace/index.d.ts +3 -3
- package/dist/lib/workspace/index.js +3 -3
- package/dist/lib/workspace/index.js.map +1 -1
- package/dist/router/navigate-once.d.ts +1 -1
- package/dist/router/navigate-once.js.map +1 -1
- package/dist/router/root.d.ts +3 -2
- package/dist/router/root.js +25 -4
- package/dist/router/root.js.map +1 -1
- package/package.json +3 -3
- package/convex/asset-alt-migration.test.ts +0 -127
- package/convex/redirect-migration.test.ts +0 -205
- package/convex/version-kind-stamping.test.ts +0 -118
|
@@ -111,6 +111,14 @@ declare const MESSAGES: {
|
|
|
111
111
|
'shell.backToProjects': import("./types.js").SourceMessage;
|
|
112
112
|
'shell.routeNotFound.title': import("./types.js").SourceMessage;
|
|
113
113
|
'shell.routeNotFound.body': import("./types.js").SourceMessage;
|
|
114
|
+
'shell.failure.module.title': import("./types.js").SourceMessage;
|
|
115
|
+
'shell.failure.module.body': import("./types.js").SourceMessage;
|
|
116
|
+
'shell.failure.module.restartHint': import("./types.js").SourceMessage;
|
|
117
|
+
'shell.failure.error.title': import("./types.js").SourceMessage;
|
|
118
|
+
'shell.failure.error.body': import("./types.js").SourceMessage;
|
|
119
|
+
'shell.failure.back': import("./types.js").SourceMessage;
|
|
120
|
+
'shell.failure.reload': import("./types.js").SourceMessage;
|
|
121
|
+
'shell.failure.reloadCost': import("./types.js").SourceMessage;
|
|
114
122
|
'shell.projectSwitcher.recent': import("./types.js").SourceMessage;
|
|
115
123
|
'shell.projects': import("./types.js").SourceMessage;
|
|
116
124
|
'shell.projectSwitcher.browseAll': import("./types.js").SourceMessage;
|
|
@@ -161,7 +169,6 @@ declare const MESSAGES: {
|
|
|
161
169
|
'builder.reuse.config.ambiguousRelationProp': import("./types.js").SourceMessage;
|
|
162
170
|
'builder.reuse.config.unknownCollection': import("./types.js").SourceMessage;
|
|
163
171
|
'builder.reuse.config.noBlocksField': import("./types.js").SourceMessage;
|
|
164
|
-
'builder.reuse.config.ambiguousInference': import("./types.js").SourceMessage;
|
|
165
172
|
'auth.signIn': import("./types.js").SourceMessage;
|
|
166
173
|
'auth.signIn.heading': import("./types.js").SourceMessage;
|
|
167
174
|
'auth.signIn.headingCreate': import("./types.js").SourceMessage;
|
|
@@ -215,6 +222,8 @@ declare const MESSAGES: {
|
|
|
215
222
|
'operations.error.documentSchemaViolation': import("./types.js").SourceMessage;
|
|
216
223
|
'operations.error.strictReferencesBlockDelete': import("./types.js").SourceMessage;
|
|
217
224
|
'operations.error.strictReferencesBlockDeleteOne': import("./types.js").SourceMessage;
|
|
225
|
+
'operations.error.referencesBlockDelete': import("./types.js").SourceMessage;
|
|
226
|
+
'operations.error.referencesBlockDeleteOne': import("./types.js").SourceMessage;
|
|
218
227
|
'operations.error.strictReferencesBlockUnpublish': import("./types.js").SourceMessage;
|
|
219
228
|
'operations.error.strictReferencesBlockUnpublishOne': import("./types.js").SourceMessage;
|
|
220
229
|
'operations.error.strictTargetsUnpublishedOne': import("./types.js").SourceMessage;
|
|
@@ -474,6 +483,7 @@ declare const MESSAGES: {
|
|
|
474
483
|
'cms.issueMessage.preConvergenceV1': import("./types.js").SourceMessage;
|
|
475
484
|
'cms.issueMessage.preConvergenceBareBlocks': import("./types.js").SourceMessage;
|
|
476
485
|
'cms.issueMessage.preConvergencePlaintext': import("./types.js").SourceMessage;
|
|
486
|
+
'cms.issueMessage.untaggedSequenceComponent': import("./types.js").SourceMessage;
|
|
477
487
|
'cms.issueMessage.gateUnknownCollection': import("./types.js").SourceMessage;
|
|
478
488
|
'cms.issueMessage.gateAssetLibraryUnready': import("./types.js").SourceMessage;
|
|
479
489
|
'cms.issueMessage.gateNoLocales': import("./types.js").SourceMessage;
|
|
@@ -657,6 +667,8 @@ declare const MESSAGES: {
|
|
|
657
667
|
'cms.reference.publishedBadge': import("./types.js").SourceMessage;
|
|
658
668
|
'cms.field.rendererCrashed': import("./types.js").SourceMessage;
|
|
659
669
|
'cms.field.noRenderer': import("./types.js").SourceMessage;
|
|
670
|
+
'cms.field.blocksInFieldRow': import("./types.js").SourceMessage;
|
|
671
|
+
'cms.field.noControlForType': import("./types.js").SourceMessage;
|
|
660
672
|
'cms.field.itemActions': import("./types.js").SourceMessage;
|
|
661
673
|
'cms.field.moveUp': import("./types.js").SourceMessage;
|
|
662
674
|
'cms.field.moveDown': import("./types.js").SourceMessage;
|
|
@@ -852,8 +864,8 @@ declare const MESSAGES: {
|
|
|
852
864
|
'components.index.guide.badge': import("./types.js").SourceMessage;
|
|
853
865
|
'components.index.guide.intro': import("./types.js").SourceMessage;
|
|
854
866
|
'components.index.guide.doc.authoring': import("./types.js").SourceMessage;
|
|
855
|
-
'components.index.guide.doc.
|
|
856
|
-
'components.index.guide.doc.
|
|
867
|
+
'components.index.guide.doc.components': import("./types.js").SourceMessage;
|
|
868
|
+
'components.index.guide.doc.guide': import("./types.js").SourceMessage;
|
|
857
869
|
'components.index.guide.namespaceNote': import("./types.js").SourceMessage;
|
|
858
870
|
'components.taxonomy.uncategorized': import("./types.js").SourceMessage;
|
|
859
871
|
'components.detail.tab.preview': import("./types.js").SourceMessage;
|
|
@@ -956,6 +968,10 @@ declare const MESSAGES: {
|
|
|
956
968
|
'builder.reuse.madeReusablePublished': import("./types.js").SourceMessage;
|
|
957
969
|
'builder.reuse.madeReusablePublishFailed': import("./types.js").SourceMessage;
|
|
958
970
|
'builder.reuse.madeReusableDraft': import("./types.js").SourceMessage;
|
|
971
|
+
'builder.reuse.undoKeptPublished': import("./types.js").SourceMessage;
|
|
972
|
+
'builder.reuse.undoKeptEdited': import("./types.js").SourceMessage;
|
|
973
|
+
'builder.reuse.undoKeptReferenced': import("./types.js").SourceMessage;
|
|
974
|
+
'builder.reuse.undoKeptFailed': import("./types.js").SourceMessage;
|
|
959
975
|
'builder.reuse.noTargetToDetach': import("./types.js").SourceMessage;
|
|
960
976
|
'builder.reuse.noContentToDetach': import("./types.js").SourceMessage;
|
|
961
977
|
'builder.reuse.detachedToCopy': import("./types.js").SourceMessage;
|
|
@@ -1146,9 +1162,14 @@ declare const MESSAGES: {
|
|
|
1146
1162
|
'ai.translate.skipped.unreadable': import("./types.js").SourceMessage;
|
|
1147
1163
|
'ai.translate.skipped.notReturned': import("./types.js").SourceMessage;
|
|
1148
1164
|
'ai.translate.skipped.structureChanged': import("./types.js").SourceMessage;
|
|
1165
|
+
'ai.translate.skipped.locked': import("./types.js").SourceMessage;
|
|
1149
1166
|
'ai.update.proposalTitle': import("./types.js").SourceMessage;
|
|
1150
1167
|
'ai.update.diffBefore': import("./types.js").SourceMessage;
|
|
1151
1168
|
'ai.update.diffAfter': import("./types.js").SourceMessage;
|
|
1169
|
+
'ai.create.unfilledTitle': import("./types.js").SourceMessage;
|
|
1170
|
+
'ai.create.unfilled.empty': import("./types.js").SourceMessage;
|
|
1171
|
+
'ai.create.unfilled.noCandidates': import("./types.js").SourceMessage;
|
|
1172
|
+
'ai.create.unfilled.dropped': import("./types.js").SourceMessage;
|
|
1152
1173
|
'builder.roles.noStack': import("./types.js").SourceMessage;
|
|
1153
1174
|
'builder.roles.noGrid': import("./types.js").SourceMessage;
|
|
1154
1175
|
'builder.roles.noText': import("./types.js").SourceMessage;
|
|
@@ -1157,6 +1178,7 @@ declare const MESSAGES: {
|
|
|
1157
1178
|
'cms.issueMessage.nonCanonicalValue': import("./types.js").SourceMessage;
|
|
1158
1179
|
'cms.issueMessage.propsNotJudged': import("./types.js").SourceMessage;
|
|
1159
1180
|
'cms.issueMessage.assetHoldsUrl': import("./types.js").SourceMessage;
|
|
1181
|
+
'cms.issueMessage.slugNotSegment': import("./types.js").SourceMessage;
|
|
1160
1182
|
'cms.issueMessage.emptyAllow': import("./types.js").SourceMessage;
|
|
1161
1183
|
'cms.issueMessage.unknownAllowComponent': import("./types.js").SourceMessage;
|
|
1162
1184
|
'cms.issueMessage.blocksNotTopLevel': import("./types.js").SourceMessage;
|
|
@@ -126,6 +126,15 @@ const MESSAGES = {
|
|
|
126
126
|
'shell.backToProjects': msg('Back to projects'),
|
|
127
127
|
'shell.routeNotFound.title': msg('Page not found'),
|
|
128
128
|
'shell.routeNotFound.body': msg('This studio URL doesn’t resolve to a section.'),
|
|
129
|
+
// EC-717 — the failure notice (the root catch-all and each lazily loaded surface).
|
|
130
|
+
'shell.failure.module.title': msg('This part of the studio could not be loaded', 'Heading of the notice shown when a lazily loaded part of the studio failed to download.'),
|
|
131
|
+
'shell.failure.module.body': msg('Its code failed to download, usually because the dev server rebuilt its dependency cache while this tab was open. Go back to keep working; this part stays unavailable until the page is reloaded.'),
|
|
132
|
+
'shell.failure.module.restartHint': msg('If reloading does not help, restart the dev server.'),
|
|
133
|
+
'shell.failure.error.title': msg('Something went wrong', 'Heading of the notice shown when the studio hit an unexpected error.'),
|
|
134
|
+
'shell.failure.error.body': msg('The studio hit an unexpected error here. Reloading the page usually recovers.'),
|
|
135
|
+
'shell.failure.back': msg('Back', 'Button on the failure notice: in-app navigation back, without reloading the page.'),
|
|
136
|
+
'shell.failure.reload': msg('Reload', 'Button on the failure notice: a full page reload.'),
|
|
137
|
+
'shell.failure.reloadCost': msg('Reloading empties the playground: everything created or changed in this tab is lost.', 'Shown under the Reload button in playground mode only.'),
|
|
129
138
|
'shell.projectSwitcher.recent': msg('Recent'),
|
|
130
139
|
'shell.projects': msg('Projects'),
|
|
131
140
|
'shell.projectSwitcher.browseAll': msg('Browse all projects'),
|
|
@@ -195,16 +204,16 @@ const MESSAGES = {
|
|
|
195
204
|
// something. {label} is the developer's own view label (project data, echoed).
|
|
196
205
|
'customization.issue.derivedIdBuiltinCollision': msg('View "{label}" for "{point}" derives the id "{id}" from its label, which is the built-in "{id}" view — the built-in is kept and this view is ignored. Pass an explicit id to replace a built-in on purpose.', 'Config error at the rail foot (EC-476). {label} is the custom view’s label, {id} the derived id that collides with a built-in view id.'),
|
|
197
206
|
'customization.issue.derivedIdCollectionCollision': msg('View id "{id}" for "{point}" is ambiguous: it joins the collections {collections} with "-", and a collection is literally named "{joined}" — its own lens derives the same id. Pass an explicit id to this group.', 'Config warning at the rail foot (EC-477). {collections} is a quoted, comma-separated id list; {joined} is those ids joined with "-".'),
|
|
198
|
-
// EC-467 — the project's reusable-elements declaration (`defineStudio({ reuse })`)
|
|
199
|
-
//
|
|
200
|
-
// {
|
|
201
|
-
|
|
207
|
+
// EC-467 — the project's reusable-elements declaration (`defineStudio({ reuse })`);
|
|
208
|
+
// EC-728: the only source of the embed (declared, never inferred). "Reusable elements"
|
|
209
|
+
// is the product term for the feature; {component}, {relationProp}, {collection},
|
|
210
|
+
// {props} are identifiers.
|
|
211
|
+
'builder.reuse.config.unknownComponent': msg('Reusable elements: studio config declares reuse.component "{component}", which is not a registered component. Fix the id to name your embed component — until then the reuse gestures are off.'),
|
|
202
212
|
'builder.reuse.config.noRelationProp': msg('Reusable elements: the declared embed "{component}" has no single-document relation prop, so it cannot point at a reusable document. An embed needs one relation prop with cardinality one.'),
|
|
203
213
|
'builder.reuse.config.unknownRelationProp': msg('Reusable elements: the declared embed "{component}" has no single-document relation prop named "{relationProp}". Its relation props are: {props}.', '{props} is a quoted, comma-separated prop-name list.'),
|
|
204
214
|
'builder.reuse.config.ambiguousRelationProp': msg('Reusable elements: the declared embed "{component}" has {count} single-document relation props ({props}) — add reuse.relationProp to say which one points at the reusable document.', '{count} is a number; {props} a quoted, comma-separated prop-name list.'),
|
|
205
215
|
'builder.reuse.config.unknownCollection': msg('Reusable elements: "{component}.{relationProp}" targets the collection "{collection}", which this project does not define.'),
|
|
206
216
|
'builder.reuse.config.noBlocksField': msg('Reusable elements: the collection "{collection}" behind "{component}.{relationProp}" has no blocks (composition) field, so there is nothing for the embed to transclude.'),
|
|
207
|
-
'builder.reuse.config.ambiguousInference': msg('Reusable elements: {count} components have the reusable-embed shape ({components}). A project has exactly one reusable-element embed, so the studio will not guess — declare it in studio.config as reuse: { component: \'<id>\' }. Until then the reuse gestures are off.', 'Config warning at the rail foot. {count} is a number, {components} a quoted, comma-separated component-id list. The literal `reuse: { component: \'<id>\' }` is CODE — keep it verbatim.'),
|
|
208
217
|
// ─────────────────────────────────────────────────────────────────────────
|
|
209
218
|
// Auth / errors
|
|
210
219
|
// ─────────────────────────────────────────────────────────────────────────
|
|
@@ -282,6 +291,9 @@ const MESSAGES = {
|
|
|
282
291
|
'operations.error.documentSchemaViolation': msg('Document “{collection}:{id}” violates its collection schema.', 'The publish gate rejected the draft; the per-field lines follow beneath it.'),
|
|
283
292
|
'operations.error.strictReferencesBlockDelete': msg('Cannot delete “{target}”: {count} documents reference it through strict relation fields — {named}{more}. Remove these references first.', '{named} is an identifier list “collection:id” (field); {more} is the andMore fragment or empty.'),
|
|
284
293
|
'operations.error.strictReferencesBlockDeleteOne': msg('Cannot delete “{target}”: {count} document references it through strict relation fields — {named}. Remove these references first.'),
|
|
294
|
+
// EC-739 — an UNREFERENCED delete (a cleanup, e.g. Make reusable's Undo): refused by a reference of any strictness.
|
|
295
|
+
'operations.error.referencesBlockDelete': msg('Cannot delete “{target}”: {count} documents reference it — {named}{more}. This delete runs only while nothing references it.', '{named} is an identifier list “collection:id” (field); {more} is the andMore fragment or empty.'),
|
|
296
|
+
'operations.error.referencesBlockDeleteOne': msg('Cannot delete “{target}”: {count} document references it — {named}. This delete runs only while nothing references it.'),
|
|
285
297
|
'operations.error.strictReferencesBlockUnpublish': msg('Cannot unpublish “{target}”: {count} documents reference it through strict relation fields — {named}{more}. Remove these references first.'),
|
|
286
298
|
'operations.error.strictReferencesBlockUnpublishOne': msg('Cannot unpublish “{target}”: {count} document references it through strict relation fields — {named}. Remove these references first.'),
|
|
287
299
|
// EC-589 — the referrer direction of `strict: true`: publish refused while a strict target is missing or unpublished.
|
|
@@ -602,7 +614,7 @@ const MESSAGES = {
|
|
|
602
614
|
'cms.issueMessage.relationStrictUnpublished': msg('Relation field "{field}" is strict: "{id}" in "{target}" is not published, so this document cannot be published until it is.'),
|
|
603
615
|
'cms.issueMessage.assetNoAssetCollection': msg('Asset field "{field}" requires an asset collection, but none is registered.'),
|
|
604
616
|
'cms.issueMessage.assetSingleValued': msg('Asset field "{field}" is single-valued but has {count} targets.'),
|
|
605
|
-
'cms.issueMessage.assetExpectsId': msg(
|
|
617
|
+
'cms.issueMessage.assetExpectsId': msg("Asset field \"{field}\" expects an asset id, or { type: 'asset', id, …per-use fields } — an object needs type: 'asset'."),
|
|
606
618
|
'cms.issueMessage.assetUnknown': msg('Asset field "{field}" references unknown asset "{asset}".'),
|
|
607
619
|
'cms.issueMessage.assetNotAccepted': msg('Asset field "{field}" accepts only {accept}, but asset "{asset}" is {type}.'),
|
|
608
620
|
'cms.issueMessage.requiredFieldMissing': msg('Required field "{field}" is missing.'),
|
|
@@ -612,6 +624,7 @@ const MESSAGES = {
|
|
|
612
624
|
'cms.issueMessage.preConvergenceV1': msg('Field "{field}" holds a pre-convergence content shape (the v1 "{ version, doc }" envelope) — the engine reads only the converged "{ version: 2, content }" sequence. Re-seed this content.'),
|
|
613
625
|
'cms.issueMessage.preConvergenceBareBlocks': msg('Field "{field}" holds a pre-convergence content shape (a bare composition node list) — the engine reads only the converged "{ version: 2, content }" sequence. Re-seed this content.'),
|
|
614
626
|
'cms.issueMessage.preConvergencePlaintext': msg('Field "{field}" holds a pre-convergence content shape (legacy plain text) — the engine reads only the converged "{ version: 2, content }" sequence. Re-seed this content.'),
|
|
627
|
+
'cms.issueMessage.untaggedSequenceComponent': msg('Field "{field}" holds the component "{component}" (node "{node}") without its "elytra/component" tag in a content list — the engine reads only tagged components there, so the whole value renders its invalid-content fallback. It was written past the write path; save the field again through the editor or re-seed it.'),
|
|
615
628
|
'cms.issueMessage.gateUnknownCollection': msg('The project declares no collection “{collection}” — there are no rules to publish it by.', 'EC-595 A2 (F23): the publish gate refuses a document of a collection the project config does not declare. {collection} is the collection id.'),
|
|
616
629
|
'cms.issueMessage.gateAssetLibraryUnready': msg('The asset library could not be read — refusing to publish unverified asset references. Try again.', 'EC-595 A2 (EC-588, ruled 1f): the publish gate could not read the asset library, so a document that references assets is refused instead of published with the asset checks off.'),
|
|
617
630
|
'cms.issueMessage.gateNoLocales': msg('The project declares no locales — refusing to publish without them.', 'EC-595 A2: the publish gate refuses when the project config declares no locales (the storage key of every localized value).'),
|
|
@@ -818,6 +831,8 @@ const MESSAGES = {
|
|
|
818
831
|
// ─────────────────────────────────────────────────────────────────────────
|
|
819
832
|
'cms.field.rendererCrashed': msg('Custom renderer crashed — showing the built-in control.'),
|
|
820
833
|
'cms.field.noRenderer': msg('No field renderer registered for control “{control}”.'),
|
|
834
|
+
'cms.field.blocksInFieldRow': msg('A blocks field is edited as the page canvas on a form tab of its own — it has no field row here.', 'EC-740: notice in place of a field row for a blocks (composition) field, e.g. one placed in the Details pane.'),
|
|
835
|
+
'cms.field.noControlForType': msg('No built-in control for the field type “{type}”.'),
|
|
821
836
|
'cms.field.itemActions': msg('Item actions'),
|
|
822
837
|
'cms.field.moveUp': msg('Move up'),
|
|
823
838
|
'cms.field.moveDown': msg('Move down'),
|
|
@@ -1058,10 +1073,10 @@ const MESSAGES = {
|
|
|
1058
1073
|
'components.index.byCategory': msg('By category'),
|
|
1059
1074
|
'components.index.guide.title': msg('Registering & extending components'),
|
|
1060
1075
|
'components.index.guide.badge': msg('for developers'),
|
|
1061
|
-
'components.index.guide.intro': msg('Components are code, owned by your repo. Register a manifest (prop schemas, defaults, inspector controls, slots, and preview fixtures) and the studio browses, inspects, and previews it. These in
|
|
1076
|
+
'components.index.guide.intro': msg('Components are code, owned by your repo. Register a manifest (prop schemas, defaults, inspector controls, slots, and preview fixtures) and the studio browses, inspects, and previews it. These guides, in the Elytra engine repository’s docs, cover the details:'),
|
|
1062
1077
|
'components.index.guide.doc.authoring': msg('How to declare and register a component so the studio can browse, inspect, and preview it.'),
|
|
1063
|
-
'components.index.guide.doc.
|
|
1064
|
-
'components.index.guide.doc.
|
|
1078
|
+
'components.index.guide.doc.components': msg('The guide’s components chapter: the manifest + implementation pair, registering the list, fixtures, reusable elements, styling.'),
|
|
1079
|
+
'components.index.guide.doc.guide': msg('The guide’s overview and chapter index: setup, the config API, delivery, the CLI and environment reference.'),
|
|
1065
1080
|
'components.index.guide.namespaceNote': msg('Components are the list in your config, with ids you choose (Heading, site.Hero). Elytra’s own components are the opt-in @elytracms/components package — list them, a subset, or none.'),
|
|
1066
1081
|
'components.taxonomy.uncategorized': msg('Uncategorized'),
|
|
1067
1082
|
'components.detail.tab.preview': msg('Preview'),
|
|
@@ -1181,6 +1196,12 @@ const MESSAGES = {
|
|
|
1181
1196
|
'builder.reuse.madeReusablePublished': msg('Made “{name}” reusable and published it.'),
|
|
1182
1197
|
'builder.reuse.madeReusablePublishFailed': msg('Made “{name}” reusable, but publishing failed — publish it from its document.'),
|
|
1183
1198
|
'builder.reuse.madeReusableDraft': msg('Made “{name}” reusable (draft) — publish it to show on live pages.'),
|
|
1199
|
+
// EC-728 — Undo of "Make reusable" restored the block; the reusable document it created
|
|
1200
|
+
// stays, and the notice names it and why. {name} is the reusable's name (project data).
|
|
1201
|
+
'builder.reuse.undoKeptPublished': msg('Undone — the reusable element “{name}” stays: it is published.'),
|
|
1202
|
+
'builder.reuse.undoKeptEdited': msg('Undone — the reusable element “{name}” stays: it was edited since it was made.'),
|
|
1203
|
+
'builder.reuse.undoKeptReferenced': msg('Undone — the reusable element “{name}” stays: it is embedded elsewhere.'),
|
|
1204
|
+
'builder.reuse.undoKeptFailed': msg('Undone — the reusable element “{name}” stays: it could not be removed. Delete it from its collection if you do not need it.'),
|
|
1184
1205
|
'builder.reuse.noTargetToDetach': msg('This element has no target to detach.'),
|
|
1185
1206
|
'builder.reuse.noContentToDetach': msg('The referenced element has no content to detach.'),
|
|
1186
1207
|
'builder.reuse.detachedToCopy': msg('Detached to an editable copy — the live link is broken.'),
|
|
@@ -1396,10 +1417,17 @@ const MESSAGES = {
|
|
|
1396
1417
|
'ai.translate.skipped.unreadable': msg('its stored value could not be read'),
|
|
1397
1418
|
'ai.translate.skipped.notReturned': msg('the assistant returned no text for it'),
|
|
1398
1419
|
'ai.translate.skipped.structureChanged': msg('the translation lost formatting, links or embedded items — the original was kept'),
|
|
1420
|
+
// EC-738 — a bucket whose read-only (or AI-excluded) content is shaped differently from the source's.
|
|
1421
|
+
'ai.translate.skipped.locked': msg('it holds content that cannot be changed here, arranged differently from the source — left as it is'),
|
|
1399
1422
|
// EC-378 — the update (edit-existing) proposal
|
|
1400
1423
|
'ai.update.proposalTitle': msg('Changes to {collection}'),
|
|
1401
1424
|
'ai.update.diffBefore': msg('Current'),
|
|
1402
1425
|
'ai.update.diffAfter': msg('Proposed'),
|
|
1426
|
+
// EC-715 — what an AI create left empty, listed on its proposal card
|
|
1427
|
+
'ai.create.unfilledTitle': msg('Left empty ({count})', '{count} is a number.'),
|
|
1428
|
+
'ai.create.unfilled.empty': msg('the draft gave it no value'),
|
|
1429
|
+
'ai.create.unfilled.noCandidates': msg('nothing the assistant searched for fits it'),
|
|
1430
|
+
'ai.create.unfilled.dropped': msg('an id the assistant had not searched for was removed'),
|
|
1403
1431
|
// EC-591 — canvas notices for roles nobody in the project's component list fills.
|
|
1404
1432
|
// A role names what the canvas needs from the list; a missing one switches its
|
|
1405
1433
|
// gesture off, and these say so instead of leaving a dead affordance.
|
|
@@ -1410,9 +1438,11 @@ const MESSAGES = {
|
|
|
1410
1438
|
'builder.inspector.unset': msg('Not set', 'An inspector prop with no value — the component uses its own default.'),
|
|
1411
1439
|
'builder.inspector.unsetWithHint': msg('Not set (default: {hint})', '{hint} is the manifest default shown as a suggestion, e.g. "vertical" or "2".'),
|
|
1412
1440
|
// EC-586 / EC-581 (wave-0092, zone A) — canonical values and the per-FieldType definition
|
|
1413
|
-
'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.
|
|
1441
|
+
'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. Save the field again through the editor or an operation to store the canonical form.'),
|
|
1414
1442
|
'cms.issueMessage.propsNotJudged': msg('The component props in field "{field}" were not judged: the page was resolved without a component registry, so they are delivered as stored and their issues are not reported.'),
|
|
1415
1443
|
'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 put an external image’s address in the component’s URL prop (the Image’s “Image URL”).'),
|
|
1444
|
+
// EC-733 — the slug role holds what the slug rule writes
|
|
1445
|
+
'cms.issueMessage.slugNotSegment': msg('Slug field "{field}" holds "{value}", which is not a URL segment — the slug rule writes "{slug}" for it. The live URL is built from the stored slug as written; store the slug the rule writes.'),
|
|
1416
1446
|
// EC-584 — the AllowList parse (config load / registration).
|
|
1417
1447
|
'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.'),
|
|
1418
1448
|
'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.'),
|