@elytracms/studio 0.0.80 → 0.0.82
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/contract-parity.test.ts +1 -1
- package/convex/functions.ts +13 -3
- package/convex/http-routes.test.ts +143 -0
- package/convex/http.ts +19 -9
- package/convex/redirect-revalidate.test.ts +130 -0
- package/convex/revalidate.ts +9 -7
- package/convex/schema.ts +0 -19
- package/convex/triggers.ts +33 -3
- package/convex/users.ts +1 -1
- package/dist/components/ai/ai-chat-panel.js +26 -4
- package/dist/components/ai/ai-chat-panel.js.map +1 -1
- package/dist/components/ai/proposal-card.d.ts +27 -0
- package/dist/components/ai/proposal-card.js +31 -3
- package/dist/components/ai/proposal-card.js.map +1 -1
- package/dist/components/ai/proposal-issues.d.ts +55 -0
- package/dist/components/ai/proposal-issues.js +69 -0
- package/dist/components/ai/proposal-issues.js.map +1 -0
- package/dist/components/ai/translate-document-dialog.js +38 -3
- package/dist/components/ai/translate-document-dialog.js.map +1 -1
- package/dist/components/app-views/default-modules.d.ts +141 -44
- package/dist/components/app-views/default-modules.js +229 -65
- package/dist/components/app-views/default-modules.js.map +1 -1
- package/dist/components/app-views/module.d.ts +38 -0
- package/dist/components/app-views/module.js.map +1 -1
- package/dist/components/app-views/sidebar.d.ts +5 -2
- package/dist/components/app-views/sidebar.js +16 -5
- package/dist/components/app-views/sidebar.js.map +1 -1
- package/dist/components/app-views/studio-config.d.ts +28 -1
- package/dist/components/app-views/studio-config.js +1 -1
- package/dist/components/app-views/studio-config.js.map +1 -1
- package/dist/components/builder/canvas-render-context.js +10 -2
- package/dist/components/builder/canvas-render-context.js.map +1 -1
- package/dist/components/builder/clipboard-actions.js +5 -3
- package/dist/components/builder/clipboard-actions.js.map +1 -1
- package/dist/components/builder/reuse-context.js +7 -1
- package/dist/components/builder/reuse-context.js.map +1 -1
- package/dist/components/builder/reuse.d.ts +94 -16
- package/dist/components/builder/reuse.js +201 -19
- package/dist/components/builder/reuse.js.map +1 -1
- package/dist/components/cms/bulk-actions.js +10 -5
- package/dist/components/cms/bulk-actions.js.map +1 -1
- package/dist/components/cms/cell-edit.d.ts +18 -3
- package/dist/components/cms/cell-edit.js +29 -7
- package/dist/components/cms/cell-edit.js.map +1 -1
- package/dist/components/cms/cms-store.d.ts +54 -14
- package/dist/components/cms/cms-store.js +142 -45
- package/dist/components/cms/cms-store.js.map +1 -1
- package/dist/components/cms/collection-table.js +2 -2
- package/dist/components/cms/collection-table.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/document-editor-context.d.ts +12 -1
- package/dist/components/cms/document-editor-context.js.map +1 -1
- package/dist/components/cms/field-control.js +22 -8
- package/dist/components/cms/field-control.js.map +1 -1
- package/dist/components/cms/field-renderer.js +8 -1
- package/dist/components/cms/field-renderer.js.map +1 -1
- package/dist/components/cms/gate-validation.d.ts +36 -0
- package/dist/components/cms/gate-validation.js +17 -0
- package/dist/components/cms/gate-validation.js.map +1 -0
- package/dist/components/cms/import-export.js +2 -1
- package/dist/components/cms/import-export.js.map +1 -1
- package/dist/components/cms/inline-field-errors.d.ts +8 -0
- package/dist/components/cms/inline-field-errors.js +52 -0
- package/dist/components/cms/inline-field-errors.js.map +1 -0
- package/dist/components/cms/issues-pane.d.ts +4 -2
- package/dist/components/cms/issues-pane.js +13 -7
- package/dist/components/cms/issues-pane.js.map +1 -1
- package/dist/components/cms/slug-collision-report.d.ts +41 -0
- package/dist/components/cms/slug-collision-report.js +52 -0
- package/dist/components/cms/slug-collision-report.js.map +1 -0
- package/dist/components/components/transfer-dialog.js +10 -12
- package/dist/components/components/transfer-dialog.js.map +1 -1
- package/dist/components/deployment-setup-gate.d.ts +24 -0
- package/dist/components/deployment-setup-gate.js +29 -4
- package/dist/components/deployment-setup-gate.js.map +1 -1
- package/dist/components/issue-severity.d.ts +73 -0
- package/dist/components/issue-severity.js +56 -0
- package/dist/components/issue-severity.js.map +1 -0
- package/dist/components/nav-issues.d.ts +68 -0
- package/dist/components/nav-issues.js +78 -0
- package/dist/components/nav-issues.js.map +1 -0
- package/dist/components/operation-error.js +3 -3
- package/dist/components/operation-error.js.map +1 -1
- package/dist/components/project-list.d.ts +9 -3
- package/dist/components/project-list.js +11 -5
- package/dist/components/project-list.js.map +1 -1
- package/dist/components/project-switcher.d.ts +3 -1
- package/dist/components/project-switcher.js +4 -2
- package/dist/components/project-switcher.js.map +1 -1
- package/dist/components/redirects/redirects-store.d.ts +21 -0
- package/dist/components/redirects/redirects-store.js +17 -4
- package/dist/components/redirects/redirects-store.js.map +1 -1
- package/dist/components/section-nav.js +75 -10
- package/dist/components/section-nav.js.map +1 -1
- package/dist/customization.d.ts +7 -0
- package/dist/customization.js.map +1 -1
- package/dist/lib/ai/apply-content.js +6 -7
- package/dist/lib/ai/apply-content.js.map +1 -1
- package/dist/lib/ai/chat-context.d.ts +32 -26
- package/dist/lib/ai/chat-context.js +81 -9
- package/dist/lib/ai/chat-context.js.map +1 -1
- package/dist/lib/ai/constraints.d.ts +42 -0
- package/dist/lib/ai/constraints.js +259 -0
- package/dist/lib/ai/constraints.js.map +1 -0
- package/dist/lib/ai/index.d.ts +2 -0
- package/dist/lib/ai/index.js +2 -0
- package/dist/lib/ai/index.js.map +1 -1
- package/dist/lib/ai/proposal-validation.d.ts +26 -0
- package/dist/lib/ai/proposal-validation.js +17 -0
- package/dist/lib/ai/proposal-validation.js.map +1 -0
- package/dist/lib/ai/shape.js +60 -13
- package/dist/lib/ai/shape.js.map +1 -1
- package/dist/lib/ai/tools.d.ts +8 -4
- package/dist/lib/ai/tools.js +43 -14
- package/dist/lib/ai/tools.js.map +1 -1
- package/dist/lib/ai/translate-document.d.ts +35 -1
- package/dist/lib/ai/translate-document.js +16 -1
- package/dist/lib/ai/translate-document.js.map +1 -1
- package/dist/lib/ai/types.d.ts +11 -6
- package/dist/lib/ai/types.js.map +1 -1
- package/dist/lib/ai/update-fields.d.ts +8 -6
- package/dist/lib/ai/update-fields.js +9 -22
- package/dist/lib/ai/update-fields.js.map +1 -1
- package/dist/lib/clipboard/paste-issues.d.ts +5 -0
- package/dist/lib/clipboard/paste-issues.js +16 -6
- package/dist/lib/clipboard/paste-issues.js.map +1 -1
- package/dist/lib/cms/document-gate.d.ts +37 -0
- package/dist/lib/cms/document-gate.js +40 -0
- package/dist/lib/cms/document-gate.js.map +1 -0
- package/dist/lib/cms-views/view-model.d.ts +5 -0
- package/dist/lib/cms-views/view-model.js +10 -4
- package/dist/lib/cms-views/view-model.js.map +1 -1
- package/dist/lib/data/collection-content.d.ts +6 -1
- package/dist/lib/data/collection-content.js +51 -15
- package/dist/lib/data/collection-content.js.map +1 -1
- package/dist/lib/i18n/i18n.d.ts +51 -16
- package/dist/lib/i18n/i18n.js +119 -43
- package/dist/lib/i18n/i18n.js.map +1 -1
- package/dist/lib/i18n/index.d.ts +8 -1
- package/dist/lib/i18n/index.js +1 -1
- package/dist/lib/i18n/index.js.map +1 -1
- package/dist/lib/i18n/messages.de.js +200 -0
- package/dist/lib/i18n/messages.de.js.map +1 -1
- package/dist/lib/i18n/messages.en.d.ts +162 -0
- package/dist/lib/i18n/messages.en.js +226 -0
- package/dist/lib/i18n/messages.en.js.map +1 -1
- package/dist/lib/i18n/types.d.ts +15 -9
- package/dist/lib/i18n/types.js.map +1 -1
- package/dist/lib/locale/binding-fallback.d.ts +8 -1
- package/dist/lib/locale/binding-fallback.js +8 -1
- package/dist/lib/locale/binding-fallback.js.map +1 -1
- package/dist/lib/locale/locale-store.d.ts +41 -9
- package/dist/lib/locale/locale-store.js +34 -15
- package/dist/lib/locale/locale-store.js.map +1 -1
- package/dist/lib/locale/locale-switcher.d.ts +3 -1
- package/dist/lib/locale/locale-switcher.js +4 -2
- package/dist/lib/locale/locale-switcher.js.map +1 -1
- package/dist/lib/locale/use-studio-locale.d.ts +9 -4
- package/dist/lib/locale/use-studio-locale.js.map +1 -1
- package/dist/lib/operations/studio-operations.js +19 -2
- package/dist/lib/operations/studio-operations.js.map +1 -1
- package/dist/lib/persistence/convex-adapter.d.ts +1 -3
- package/dist/lib/persistence/convex-adapter.js +0 -55
- package/dist/lib/persistence/convex-adapter.js.map +1 -1
- package/dist/lib/persistence/deployment-readiness.js +10 -0
- package/dist/lib/persistence/deployment-readiness.js.map +1 -1
- package/dist/lib/persona/labels.d.ts +85 -9
- package/dist/lib/persona/labels.js +198 -58
- package/dist/lib/persona/labels.js.map +1 -1
- package/dist/lib/routes/route-issues.d.ts +9 -0
- package/dist/lib/routes/route-issues.js +117 -0
- package/dist/lib/routes/route-issues.js.map +1 -0
- package/dist/lib/webhooks/dispatcher.d.ts +5 -2
- package/dist/lib/webhooks/dispatcher.js.map +1 -1
- package/dist/lib/webhooks/tags.js +150 -17
- package/dist/lib/webhooks/tags.js.map +1 -1
- package/dist/lib/workspace/config-issues.d.ts +56 -0
- package/dist/lib/workspace/config-issues.js +72 -0
- package/dist/lib/workspace/config-issues.js.map +1 -0
- package/dist/lib/workspace/index.d.ts +24 -8
- package/dist/lib/workspace/index.js +28 -18
- package/dist/lib/workspace/index.js.map +1 -1
- package/dist/lib/workspace/switcher-source.d.ts +20 -3
- package/dist/lib/workspace/switcher-source.js.map +1 -1
- package/dist/lib/workspace/workspace-source.js +27 -0
- package/dist/lib/workspace/workspace-source.js.map +1 -1
- package/dist/previews/manifest-format.d.ts +13 -6
- package/dist/previews/manifest-format.js +9 -2
- package/dist/previews/manifest-format.js.map +1 -1
- package/dist/router/root.d.ts +36 -1
- package/dist/router/root.js +54 -7
- package/dist/router/root.js.map +1 -1
- package/package.json +2 -2
- package/convex/cliTokens.ts +0 -63
- package/convex/sync.ts +0 -297
|
@@ -130,6 +130,22 @@ declare const MESSAGES: {
|
|
|
130
130
|
'shell.playground.badge': import("./types.js").SourceMessage;
|
|
131
131
|
'shell.playground.hint': import("./types.js").SourceMessage;
|
|
132
132
|
'shell.deliveryHealth.dismiss': import("./types.js").SourceMessage;
|
|
133
|
+
'customization.issue.noCollections': import("./types.js").SourceMessage;
|
|
134
|
+
'customization.issue.duplicateOverrideId': import("./types.js").SourceMessage;
|
|
135
|
+
'customization.issue.unknownOverrideTarget': import("./types.js").SourceMessage;
|
|
136
|
+
'customization.issue.invalidOverride': import("./types.js").SourceMessage;
|
|
137
|
+
'customization.issue.reason.rendererNotAComponent': import("./types.js").SourceMessage;
|
|
138
|
+
'customization.issue.reason.viewNoRender': import("./types.js").SourceMessage;
|
|
139
|
+
'customization.issue.reason.viewNoLabel': import("./types.js").SourceMessage;
|
|
140
|
+
'customization.issue.derivedIdBuiltinCollision': import("./types.js").SourceMessage;
|
|
141
|
+
'customization.issue.derivedIdCollectionCollision': import("./types.js").SourceMessage;
|
|
142
|
+
'builder.reuse.config.unknownComponent': import("./types.js").SourceMessage;
|
|
143
|
+
'builder.reuse.config.noRelationProp': import("./types.js").SourceMessage;
|
|
144
|
+
'builder.reuse.config.unknownRelationProp': import("./types.js").SourceMessage;
|
|
145
|
+
'builder.reuse.config.ambiguousRelationProp': import("./types.js").SourceMessage;
|
|
146
|
+
'builder.reuse.config.unknownCollection': import("./types.js").SourceMessage;
|
|
147
|
+
'builder.reuse.config.noBlocksField': import("./types.js").SourceMessage;
|
|
148
|
+
'builder.reuse.config.ambiguousInference': import("./types.js").SourceMessage;
|
|
133
149
|
'auth.signIn': import("./types.js").SourceMessage;
|
|
134
150
|
'auth.signIn.heading': import("./types.js").SourceMessage;
|
|
135
151
|
'auth.signIn.headingCreate': import("./types.js").SourceMessage;
|
|
@@ -162,6 +178,38 @@ declare const MESSAGES: {
|
|
|
162
178
|
'error.dismiss': import("./types.js").SourceMessage;
|
|
163
179
|
'error.sessionExpiredTitle': import("./types.js").SourceMessage;
|
|
164
180
|
'error.sessionExpired': import("./types.js").SourceMessage;
|
|
181
|
+
'operations.errorLabel.validation': import("./types.js").SourceMessage;
|
|
182
|
+
'operations.errorLabel.not-found': import("./types.js").SourceMessage;
|
|
183
|
+
'operations.errorLabel.conflict': import("./types.js").SourceMessage;
|
|
184
|
+
'operations.errorLabel.backend-unavailable': import("./types.js").SourceMessage;
|
|
185
|
+
'operations.errorLabel.unauthorized': import("./types.js").SourceMessage;
|
|
186
|
+
'operations.errorLabel.unknown': import("./types.js").SourceMessage;
|
|
187
|
+
'operations.error.invalidInput': import("./types.js").SourceMessage;
|
|
188
|
+
'operations.error.notFound': import("./types.js").SourceMessage;
|
|
189
|
+
'operations.error.conflict': import("./types.js").SourceMessage;
|
|
190
|
+
'operations.error.backendUnavailable': import("./types.js").SourceMessage;
|
|
191
|
+
'operations.error.unauthorized': import("./types.js").SourceMessage;
|
|
192
|
+
'operations.error.unknown': import("./types.js").SourceMessage;
|
|
193
|
+
'operations.error.documentSchemaViolation': import("./types.js").SourceMessage;
|
|
194
|
+
'operations.error.strictReferencesBlockDelete': import("./types.js").SourceMessage;
|
|
195
|
+
'operations.error.strictReferencesBlockDeleteOne': import("./types.js").SourceMessage;
|
|
196
|
+
'operations.error.strictReferencesBlockUnpublish': import("./types.js").SourceMessage;
|
|
197
|
+
'operations.error.strictReferencesBlockUnpublishOne': import("./types.js").SourceMessage;
|
|
198
|
+
'operations.errorDetail.andMore': import("./types.js").SourceMessage;
|
|
199
|
+
'content.queryError.nonFilterableField': import("./types.js").SourceMessage;
|
|
200
|
+
'content.queryError.unknownField': import("./types.js").SourceMessage;
|
|
201
|
+
'content.queryError.unknownCollection': import("./types.js").SourceMessage;
|
|
202
|
+
'content.queryError.filterShape': import("./types.js").SourceMessage;
|
|
203
|
+
'content.queryError.filterNoOperators': import("./types.js").SourceMessage;
|
|
204
|
+
'content.queryError.unknownOperator': import("./types.js").SourceMessage;
|
|
205
|
+
'content.queryError.operatorInRequiresArray': import("./types.js").SourceMessage;
|
|
206
|
+
'content.queryError.operatorRequiresString': import("./types.js").SourceMessage;
|
|
207
|
+
'content.queryError.operatorEmptyRequiresBoolean': import("./types.js").SourceMessage;
|
|
208
|
+
'content.queryError.operatorRequiresScalar': import("./types.js").SourceMessage;
|
|
209
|
+
'content.queryError.sortNotFilterable': import("./types.js").SourceMessage;
|
|
210
|
+
'content.queryError.sortUnknownField': import("./types.js").SourceMessage;
|
|
211
|
+
'content.queryError.sortDirection': import("./types.js").SourceMessage;
|
|
212
|
+
'content.queryError.limitPositiveInteger': import("./types.js").SourceMessage;
|
|
165
213
|
'cms.index.heading': import("./types.js").SourceMessage;
|
|
166
214
|
'cms.index.description': import("./types.js").SourceMessage;
|
|
167
215
|
'cms.index.fieldCount.one': import("./types.js").SourceMessage;
|
|
@@ -192,6 +240,8 @@ declare const MESSAGES: {
|
|
|
192
240
|
'cms.docState.published': import("./types.js").SourceMessage;
|
|
193
241
|
'cms.docState.changed': import("./types.js").SourceMessage;
|
|
194
242
|
'cms.docState.draft': import("./types.js").SourceMessage;
|
|
243
|
+
'cms.session.noLocales.title': import("./types.js").SourceMessage;
|
|
244
|
+
'cms.session.noLocales.body': import("./types.js").SourceMessage;
|
|
195
245
|
'cms.list.view.all': import("./types.js").SourceMessage;
|
|
196
246
|
'cms.list.unknownCollection': import("./types.js").SourceMessage;
|
|
197
247
|
'cms.list.import.noId': import("./types.js").SourceMessage;
|
|
@@ -211,6 +261,8 @@ declare const MESSAGES: {
|
|
|
211
261
|
'cms.list.bulk.noSettableFields': import("./types.js").SourceMessage;
|
|
212
262
|
'cms.list.bulk.setField': import("./types.js").SourceMessage;
|
|
213
263
|
'cms.list.bulk.clearSelection': import("./types.js").SourceMessage;
|
|
264
|
+
'cms.list.bulk.error.notInSession': import("./types.js").SourceMessage;
|
|
265
|
+
'cms.list.bulk.error.notValidToPublish': import("./types.js").SourceMessage;
|
|
214
266
|
'cms.list.bulk.set.set': import("./types.js").SourceMessage;
|
|
215
267
|
'cms.list.bulk.set.to': import("./types.js").SourceMessage;
|
|
216
268
|
'cms.list.bulk.set.valueAria': import("./types.js").SourceMessage;
|
|
@@ -234,6 +286,8 @@ declare const MESSAGES: {
|
|
|
234
286
|
'cms.filter.fieldAria': import("./types.js").SourceMessage;
|
|
235
287
|
'cms.filter.operatorAria': import("./types.js").SourceMessage;
|
|
236
288
|
'cms.filter.remove': import("./types.js").SourceMessage;
|
|
289
|
+
'cms.filter.issue.stateOperator': import("./types.js").SourceMessage;
|
|
290
|
+
'cms.filter.issue.stateValue': import("./types.js").SourceMessage;
|
|
237
291
|
'cms.filter.valueAria': import("./types.js").SourceMessage;
|
|
238
292
|
'cms.filter.valueListPlaceholder': import("./types.js").SourceMessage;
|
|
239
293
|
'cms.filter.pickRelation': import("./types.js").SourceMessage;
|
|
@@ -337,6 +391,7 @@ declare const MESSAGES: {
|
|
|
337
391
|
'cms.issue.reserved-field-name': import("./types.js").SourceMessage;
|
|
338
392
|
'cms.issue.missing-required-field': import("./types.js").SourceMessage;
|
|
339
393
|
'cms.issue.invalid-field-value': import("./types.js").SourceMessage;
|
|
394
|
+
'cms.issue.invalid-field-value.warning': import("./types.js").SourceMessage;
|
|
340
395
|
'cms.issue.unknown-relation-target': import("./types.js").SourceMessage;
|
|
341
396
|
'cms.issue.unpublished-relation-target': import("./types.js").SourceMessage;
|
|
342
397
|
'cms.issue.cardinality-violation': import("./types.js").SourceMessage;
|
|
@@ -354,6 +409,7 @@ declare const MESSAGES: {
|
|
|
354
409
|
'cms.issue.unknown-alias': import("./types.js").SourceMessage;
|
|
355
410
|
'cms.issue.unfilled-slot': import("./types.js").SourceMessage;
|
|
356
411
|
'cms.issue.custom-validation': import("./types.js").SourceMessage;
|
|
412
|
+
'cms.issue.unaddressable-url': import("./types.js").SourceMessage;
|
|
357
413
|
'cms.issue.unknown-version': import("./types.js").SourceMessage;
|
|
358
414
|
'cms.issueBody.missing-required-field': import("./types.js").SourceMessage;
|
|
359
415
|
'cms.issueBody.missing-localized-value.default': import("./types.js").SourceMessage;
|
|
@@ -362,6 +418,95 @@ declare const MESSAGES: {
|
|
|
362
418
|
'cms.issueBody.document-nesting-depth.error': import("./types.js").SourceMessage;
|
|
363
419
|
'cms.issueBody.document-nesting-depth.warning': import("./types.js").SourceMessage;
|
|
364
420
|
'cms.issueBody.hierarchy-cycle': import("./types.js").SourceMessage;
|
|
421
|
+
'cms.issueMessage.duplicateDocument': import("./types.js").SourceMessage;
|
|
422
|
+
'cms.issueMessage.fieldDetail': import("./types.js").SourceMessage;
|
|
423
|
+
'cms.issueMessage.fieldReason': import("./types.js").SourceMessage;
|
|
424
|
+
'cms.issueMessage.propDetail': import("./types.js").SourceMessage;
|
|
425
|
+
'cms.issueMessage.propReason': import("./types.js").SourceMessage;
|
|
426
|
+
'cms.issueMessage.relationUnknownTargetCollection': import("./types.js").SourceMessage;
|
|
427
|
+
'cms.issueMessage.relationSingleValued': import("./types.js").SourceMessage;
|
|
428
|
+
'cms.issueMessage.relationNotAReference': import("./types.js").SourceMessage;
|
|
429
|
+
'cms.issueMessage.relationWrongCollection': import("./types.js").SourceMessage;
|
|
430
|
+
'cms.issueMessage.relationMissingDocument': import("./types.js").SourceMessage;
|
|
431
|
+
'cms.issueMessage.relationUnpublishedDocument': import("./types.js").SourceMessage;
|
|
432
|
+
'cms.issueMessage.assetNoAssetCollection': import("./types.js").SourceMessage;
|
|
433
|
+
'cms.issueMessage.assetSingleValued': import("./types.js").SourceMessage;
|
|
434
|
+
'cms.issueMessage.assetExpectsId': import("./types.js").SourceMessage;
|
|
435
|
+
'cms.issueMessage.assetUnknown': import("./types.js").SourceMessage;
|
|
436
|
+
'cms.issueMessage.requiredFieldMissing': import("./types.js").SourceMessage;
|
|
437
|
+
'cms.issueMessage.requiredPropMissing': import("./types.js").SourceMessage;
|
|
438
|
+
'cms.issueMessage.perLocaleMapValue': import("./types.js").SourceMessage;
|
|
439
|
+
'cms.issueMessage.richTextHoldsArray': import("./types.js").SourceMessage;
|
|
440
|
+
'cms.issueMessage.richTextHoldsBareDoc': import("./types.js").SourceMessage;
|
|
441
|
+
'cms.issueMessage.richTextHoldsObject': import("./types.js").SourceMessage;
|
|
442
|
+
'cms.issueMessage.unknownCollectionForDocument': import("./types.js").SourceMessage;
|
|
443
|
+
'cms.issueMessage.localizedPlainValue': import("./types.js").SourceMessage;
|
|
444
|
+
'cms.issueMessage.requiredLocalizedMissingDefault': import("./types.js").SourceMessage;
|
|
445
|
+
'cms.issueMessage.localizedNoValueNoFallback': import("./types.js").SourceMessage;
|
|
446
|
+
'cms.issueMessage.hierarchyCycle': import("./types.js").SourceMessage;
|
|
447
|
+
'cms.issueMessage.nestingDepthError': import("./types.js").SourceMessage;
|
|
448
|
+
'cms.issueMessage.nestingDepthWarning': import("./types.js").SourceMessage;
|
|
449
|
+
'cms.issueMessage.propFilterable': import("./types.js").SourceMessage;
|
|
450
|
+
'cms.issueMessage.propUnique': import("./types.js").SourceMessage;
|
|
451
|
+
'cms.issueMessage.singletonDrift': import("./types.js").SourceMessage;
|
|
452
|
+
'cms.issueMessage.unknownAlias.one': import("./types.js").SourceMessage;
|
|
453
|
+
'cms.issueMessage.unknownAlias.other': import("./types.js").SourceMessage;
|
|
454
|
+
'cms.issueMessage.duplicateAlias': import("./types.js").SourceMessage;
|
|
455
|
+
'cms.issueMessage.unfilledSlot': import("./types.js").SourceMessage;
|
|
456
|
+
'cms.issueMessage.reservedFieldName': import("./types.js").SourceMessage;
|
|
457
|
+
'cms.issueMessage.duplicateSelectOption': import("./types.js").SourceMessage;
|
|
458
|
+
'cms.issueMessage.duplicateObjectField': import("./types.js").SourceMessage;
|
|
459
|
+
'cms.issueMessage.assetCollectionSingleton': import("./types.js").SourceMessage;
|
|
460
|
+
'cms.issueMessage.unknownPresentationBodyField': import("./types.js").SourceMessage;
|
|
461
|
+
'cms.issueMessage.duplicateCollectionField': import("./types.js").SourceMessage;
|
|
462
|
+
'cms.issueMessage.duplicateCollectionId': import("./types.js").SourceMessage;
|
|
463
|
+
'cms.issueMessage.unknownLocale': import("./types.js").SourceMessage;
|
|
464
|
+
'cms.issueMessage.unknownVersion': import("./types.js").SourceMessage;
|
|
465
|
+
'cms.issueMessage.routeConflict': import("./types.js").SourceMessage;
|
|
466
|
+
'cms.issueMessage.redirectLoop': import("./types.js").SourceMessage;
|
|
467
|
+
'cms.issueMessage.allDynamicShadowsMount': import("./types.js").SourceMessage;
|
|
468
|
+
'cms.issueMessage.mountCannotServe': import("./types.js").SourceMessage;
|
|
469
|
+
'cms.issueMessage.deadCatchAll': import("./types.js").SourceMessage;
|
|
470
|
+
'cms.issueMessage.mountConflict': import("./types.js").SourceMessage;
|
|
471
|
+
'cms.issueMessage.routeBoundDocumentNotFound': import("./types.js").SourceMessage;
|
|
472
|
+
'cms.issueMessage.routeParamNotCaptured': import("./types.js").SourceMessage;
|
|
473
|
+
'cms.issueMessage.collectionNotDefined': import("./types.js").SourceMessage;
|
|
474
|
+
'cms.issueMessage.unaddressableLocaleCollision': import("./types.js").SourceMessage;
|
|
475
|
+
'cms.issueDetail.expectsString': import("./types.js").SourceMessage;
|
|
476
|
+
'cms.issueDetail.expectsRichText': import("./types.js").SourceMessage;
|
|
477
|
+
'cms.issueDetail.expectsNumber': import("./types.js").SourceMessage;
|
|
478
|
+
'cms.issueDetail.expectsBoolean': import("./types.js").SourceMessage;
|
|
479
|
+
'cms.issueDetail.expectsIsoDate': import("./types.js").SourceMessage;
|
|
480
|
+
'cms.issueDetail.expectsDate': import("./types.js").SourceMessage;
|
|
481
|
+
'cms.issueDetail.valueNotAmongOptions': import("./types.js").SourceMessage;
|
|
482
|
+
'cms.issueDetail.expectsObjectList': import("./types.js").SourceMessage;
|
|
483
|
+
'cms.issueDetail.expectsObject': import("./types.js").SourceMessage;
|
|
484
|
+
'cms.issueDetail.implausibleYear': import("./types.js").SourceMessage;
|
|
485
|
+
'cms.issueDetail.dateBoundNotADate': import("./types.js").SourceMessage;
|
|
486
|
+
'cms.issueDetail.earlierThanMin': import("./types.js").SourceMessage;
|
|
487
|
+
'cms.issueDetail.laterThanMax': import("./types.js").SourceMessage;
|
|
488
|
+
'cms.issueDetail.stringBoundOffDate': import("./types.js").SourceMessage;
|
|
489
|
+
'cms.issueDetail.shorterThanMinLength': import("./types.js").SourceMessage;
|
|
490
|
+
'cms.issueDetail.longerThanMaxLength': import("./types.js").SourceMessage;
|
|
491
|
+
'cms.issueDetail.doesNotMatchPattern': import("./types.js").SourceMessage;
|
|
492
|
+
'cms.issueDetail.lessThanMin': import("./types.js").SourceMessage;
|
|
493
|
+
'cms.issueDetail.greaterThanMax': import("./types.js").SourceMessage;
|
|
494
|
+
'cms.issueDetail.fewerThanMinItems': import("./types.js").SourceMessage;
|
|
495
|
+
'cms.issueDetail.moreThanMaxItems': import("./types.js").SourceMessage;
|
|
496
|
+
'cms.issueDetail.duplicateValue': import("./types.js").SourceMessage;
|
|
497
|
+
'cms.issueDetail.duplicateValueForLocale': import("./types.js").SourceMessage;
|
|
498
|
+
'cms.issueDetail.singleValuedManyTargets': import("./types.js").SourceMessage;
|
|
499
|
+
'cms.issueDetail.notADocumentReference': import("./types.js").SourceMessage;
|
|
500
|
+
'cms.issueDetail.pointsAtOtherCollection': import("./types.js").SourceMessage;
|
|
501
|
+
'cms.issueDetail.expectsAssetIdString': import("./types.js").SourceMessage;
|
|
502
|
+
'cms.issueDetail.shadowedRootDocuments': import("./types.js").SourceMessage;
|
|
503
|
+
'cms.issueDetail.shadowedNestedDocuments': import("./types.js").SourceMessage;
|
|
504
|
+
'cms.issueDetail.claimedBySlug': import("./types.js").SourceMessage;
|
|
505
|
+
'cms.issueDetail.claimedByOwnDocument': import("./types.js").SourceMessage;
|
|
506
|
+
'cms.issueDetail.mountCollectionNotDeclared': import("./types.js").SourceMessage;
|
|
507
|
+
'cms.issueDetail.mountCollectionNotHierarchical': import("./types.js").SourceMessage;
|
|
508
|
+
'cms.issueDetail.mountsSamePath': import("./types.js").SourceMessage;
|
|
509
|
+
'cms.issueDetail.mountsNested': import("./types.js").SourceMessage;
|
|
365
510
|
'cms.details.slot': import("./types.js").SourceMessage;
|
|
366
511
|
'cms.details.noSlot': import("./types.js").SourceMessage;
|
|
367
512
|
'cms.details.slotInUse': import("./types.js").SourceMessage;
|
|
@@ -758,6 +903,22 @@ declare const MESSAGES: {
|
|
|
758
903
|
'builder.clipboard.pastedInto': import("./types.js").SourceMessage;
|
|
759
904
|
'builder.clipboard.issueComponent': import("./types.js").SourceMessage;
|
|
760
905
|
'builder.clipboard.issueBinding': import("./types.js").SourceMessage;
|
|
906
|
+
'builder.clipboard.error.corruptJson': import("./types.js").SourceMessage;
|
|
907
|
+
'builder.clipboard.error.notEnvelope': import("./types.js").SourceMessage;
|
|
908
|
+
'builder.clipboard.error.foreignFormat': import("./types.js").SourceMessage;
|
|
909
|
+
'builder.clipboard.error.versionNewer': import("./types.js").SourceMessage;
|
|
910
|
+
'builder.clipboard.error.versionUnsupported': import("./types.js").SourceMessage;
|
|
911
|
+
'builder.clipboard.error.invalidPayload': import("./types.js").SourceMessage;
|
|
912
|
+
'builder.clipboard.error.nodeNotFound': import("./types.js").SourceMessage;
|
|
913
|
+
'builder.clipboard.error.fixtureNotFound': import("./types.js").SourceMessage;
|
|
914
|
+
'builder.clipboard.issue.unresolvedBinding': import("./types.js").SourceMessage;
|
|
915
|
+
'builder.clipboard.issue.missingComponent': import("./types.js").SourceMessage;
|
|
916
|
+
'builder.clipboard.summary.pasted': import("./types.js").SourceMessage;
|
|
917
|
+
'builder.clipboard.summary.pastedWith': import("./types.js").SourceMessage;
|
|
918
|
+
'builder.clipboard.summary.bindingUnresolvedOne': import("./types.js").SourceMessage;
|
|
919
|
+
'builder.clipboard.summary.bindingsUnresolved': import("./types.js").SourceMessage;
|
|
920
|
+
'builder.clipboard.summary.componentMissingOne': import("./types.js").SourceMessage;
|
|
921
|
+
'builder.clipboard.summary.componentsMissing': import("./types.js").SourceMessage;
|
|
761
922
|
'builder.reuse.makeReusable': import("./types.js").SourceMessage;
|
|
762
923
|
'builder.reuse.detachToCopy': import("./types.js").SourceMessage;
|
|
763
924
|
'builder.reuse.defaultElementName': import("./types.js").SourceMessage;
|
|
@@ -922,6 +1083,7 @@ declare const MESSAGES: {
|
|
|
922
1083
|
'ai.error.route': import("./types.js").SourceMessage;
|
|
923
1084
|
'ai.error.generic': import("./types.js").SourceMessage;
|
|
924
1085
|
'ai.error.applyFailed': import("./types.js").SourceMessage;
|
|
1086
|
+
'ai.error.applyInvalid': import("./types.js").SourceMessage;
|
|
925
1087
|
'ai.error.stepCap': import("./types.js").SourceMessage;
|
|
926
1088
|
'ai.translate.action': import("./types.js").SourceMessage;
|
|
927
1089
|
'ai.translate.tooltip': import("./types.js").SourceMessage;
|
|
@@ -145,6 +145,44 @@ const MESSAGES = {
|
|
|
145
145
|
'shell.playground.hint': msg('Playground mode: data lives in memory on this device and resets on reload. Nothing is saved to a backend.'),
|
|
146
146
|
'shell.deliveryHealth.dismiss': msg('Dismiss'),
|
|
147
147
|
// ─────────────────────────────────────────────────────────────────────────
|
|
148
|
+
// Customization issues — the section-rail foot (`NavIssues`)
|
|
149
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
150
|
+
// EC-478 — one key per `CustomizationIssue` message. The producers are
|
|
151
|
+
// `packages/core/src/studio-core/customization.ts` (the EC-236 seam, which
|
|
152
|
+
// cannot import this catalog — hence a key on the issue, not a string),
|
|
153
|
+
// `app-views/default-modules.tsx` (EC-476/477) and `builder/reuse.ts`
|
|
154
|
+
// (EC-467). Every `{var}` is an IDENTIFIER — an entry id, a customization
|
|
155
|
+
// point, a component/collection id — and stays untranslated by design.
|
|
156
|
+
// Each English here MUST stay byte-identical to the `message` its producer
|
|
157
|
+
// prebuilds; `customization-issue-i18n.test.ts` pins that both ways.
|
|
158
|
+
// Grouped by render site rather than by namespace: they are one list, and a
|
|
159
|
+
// half-translated list is the failure EC-478 exists to remove.
|
|
160
|
+
// EC-479 — the project declares nothing for the studio to work with. Produced by
|
|
161
|
+
// `lib/workspace/config-issues.ts`; {file} is the config file name (an identifier).
|
|
162
|
+
'customization.issue.noCollections': msg('This project declares no content collections. Add them to "{file}" — the studio shows your schema or none, never sample content.', 'Config error at the rail foot. {file} is the project config file name (elytra.config.ts), untranslated.'),
|
|
163
|
+
'customization.issue.duplicateOverrideId': msg('Duplicate override id "{id}" for "{point}" — the later one is ignored.', 'Config error at the rail foot. {id} is the duplicated entry id, {point} the extension point (e.g. "sidebar").'),
|
|
164
|
+
'customization.issue.unknownOverrideTarget': msg('Override "{id}" for "{point}" matches no built-in block to replace.', 'Config error at the rail foot. {id} is the override id, {point} the extension point.'),
|
|
165
|
+
'customization.issue.invalidOverride': msg('Override "{id}" for "{point}" is invalid: {reason}', 'Config error at the rail foot. {reason} is one of the customization.issue.reason.* messages (or a third-party validator’s English).'),
|
|
166
|
+
// The `{reason}` fills — the engine's own `validate` rejections, phrased to read
|
|
167
|
+
// as the tail of the sentence above (lowercase, no full stop).
|
|
168
|
+
'customization.issue.reason.rendererNotAComponent': msg('the renderer is not a component', 'Tail of customization.issue.invalidOverride — lowercase, no full stop.'),
|
|
169
|
+
'customization.issue.reason.viewNoRender': msg('the view has no render function', 'Tail of customization.issue.invalidOverride — lowercase, no full stop.'),
|
|
170
|
+
'customization.issue.reason.viewNoLabel': msg('the view has no label', 'Tail of customization.issue.invalidOverride — lowercase, no full stop.'),
|
|
171
|
+
// EC-476/477 — an id a builder DERIVED landing on an id that already means
|
|
172
|
+
// something. {label} is the developer's own view label (project data, echoed).
|
|
173
|
+
'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.'),
|
|
174
|
+
'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 "-".'),
|
|
175
|
+
// EC-467 — the project's reusable-elements declaration (`defineStudio({ reuse })`).
|
|
176
|
+
// "Reusable elements" is the product term for the feature; {component},
|
|
177
|
+
// {relationProp}, {collection}, {props}, {components} are identifiers.
|
|
178
|
+
'builder.reuse.config.unknownComponent': msg('Reusable elements: studio config declares reuse.component "{component}", which is not a registered component. Fix the id, or remove the reuse block to let the studio infer the embed.'),
|
|
179
|
+
'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.'),
|
|
180
|
+
'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.'),
|
|
181
|
+
'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.'),
|
|
182
|
+
'builder.reuse.config.unknownCollection': msg('Reusable elements: "{component}.{relationProp}" targets the collection "{collection}", which this project does not define.'),
|
|
183
|
+
'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.'),
|
|
184
|
+
'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.'),
|
|
185
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
148
186
|
// Auth / errors
|
|
149
187
|
// ─────────────────────────────────────────────────────────────────────────
|
|
150
188
|
'auth.signIn': msg('Sign in'),
|
|
@@ -190,6 +228,51 @@ const MESSAGES = {
|
|
|
190
228
|
// the session-expired predicate; re-auth happens in place, no navigation.
|
|
191
229
|
'error.sessionExpiredTitle': msg("You've been signed out", 'Heading of the blocking session-expired re-auth overlay.'),
|
|
192
230
|
'error.sessionExpired': msg("You've been signed out, so your latest changes aren't being saved. Sign in again to keep editing — your unsaved changes stay right here.", 'Body of the blocking session-expired re-auth overlay. Plain language — no auth/transport jargon.'),
|
|
231
|
+
// EC-494 — operation failures that cross the OPERATIONS boundary. The producer runs
|
|
232
|
+
// SERVER-SIDE with no locale, so `OperationError`/`OperationIssue` carry a catalog
|
|
233
|
+
// reference on the wire and `OperationErrorBanner` resolves it here. Every `{var}` is
|
|
234
|
+
// an IDENTIFIER (operation name, entity kind, document key, field name) and stays
|
|
235
|
+
// untranslated. Messages the engine does NOT author — Zod diagnostics, persistence
|
|
236
|
+
// taxonomy strings, an authorization hook's `reason` — carry no key and keep their
|
|
237
|
+
// English on purpose (EC-443): a visible English sentence beats a missing key.
|
|
238
|
+
// EC-494 — the error banner's BADGE titles (`persona/labels.ts`), moved off a
|
|
239
|
+
// hard-coded English Record for the same reason EC-443 moved the CMS issue titles:
|
|
240
|
+
// a localized body under an unlocalized badge is the same defect, inverted.
|
|
241
|
+
'operations.errorLabel.validation': msg("Couldn't save"),
|
|
242
|
+
'operations.errorLabel.not-found': msg('Not found'),
|
|
243
|
+
'operations.errorLabel.conflict': msg('Already exists'),
|
|
244
|
+
'operations.errorLabel.backend-unavailable': msg('Connection problem'),
|
|
245
|
+
'operations.errorLabel.unauthorized': msg('Not allowed'),
|
|
246
|
+
'operations.errorLabel.unknown': msg('Something went wrong'),
|
|
247
|
+
'operations.error.invalidInput': msg('Input for “{operation}” is invalid.', '{operation} is a dotted operation name, e.g. documents.upsert.'),
|
|
248
|
+
'operations.error.notFound': msg('No {entity} found for “{target}”.', '{entity} is a machine kind (project/page/cms-document); {target} is its key.'),
|
|
249
|
+
'operations.error.conflict': msg('“{target}” conflicts with an existing record.'),
|
|
250
|
+
'operations.error.backendUnavailable': msg('The persistence backend is unavailable.'),
|
|
251
|
+
'operations.error.unauthorized': msg('Operation “{operation}” was denied by the authorization hook.'),
|
|
252
|
+
'operations.error.unknown': msg('An unknown operation failure occurred.'),
|
|
253
|
+
'operations.error.documentSchemaViolation': msg('Document “{collection}:{id}” violates its collection schema.', 'The publish gate rejected the draft; the per-field lines follow beneath it.'),
|
|
254
|
+
'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.'),
|
|
255
|
+
'operations.error.strictReferencesBlockDeleteOne': msg('Cannot delete “{target}”: {count} document references it through strict relation fields — {named}. Remove these references first.'),
|
|
256
|
+
'operations.error.strictReferencesBlockUnpublish': msg('Cannot unpublish “{target}”: {count} documents reference it through strict relation fields — {named}{more}. Remove these references first.'),
|
|
257
|
+
'operations.error.strictReferencesBlockUnpublishOne': msg('Cannot unpublish “{target}”: {count} document references it through strict relation fields — {named}. Remove these references first.'),
|
|
258
|
+
'operations.errorDetail.andMore': msg(', and {count} more', 'Truncation fragment spliced into the strict-reference sentences; keeps its leading comma and space.'),
|
|
259
|
+
// EC-494 — content-query errors (`core/content`'s validateWhere/validateSort/
|
|
260
|
+
// validateLimit). Two studio surfaces render them: the filter builder's per-clause
|
|
261
|
+
// line and the canvas listing notice.
|
|
262
|
+
'content.queryError.nonFilterableField': msg('Field "{field}" on "{collection}" is not declared filterable.'),
|
|
263
|
+
'content.queryError.unknownField': msg('Field "{field}" does not exist on "{collection}".'),
|
|
264
|
+
'content.queryError.unknownCollection': msg('Collection "{collection}" is not defined.'),
|
|
265
|
+
'content.queryError.filterShape': msg('Filter for "{field}" must be a scalar or an operator object.'),
|
|
266
|
+
'content.queryError.filterNoOperators': msg('Filter for "{field}" has no operators.'),
|
|
267
|
+
'content.queryError.unknownOperator': msg('Unknown filter operator "{operator}" on "{field}" — the vocabulary is exactly {vocabulary}.', '{vocabulary} is the comma-joined list of operator tokens — identifiers, never translated.'),
|
|
268
|
+
'content.queryError.operatorInRequiresArray': msg('Operator "in" on "{field}" requires an array of scalars.'),
|
|
269
|
+
'content.queryError.operatorRequiresString': msg('Operator "{operator}" on "{field}" requires a string value.'),
|
|
270
|
+
'content.queryError.operatorEmptyRequiresBoolean': msg('Operator "empty" on "{field}" requires a boolean value (true = is empty).'),
|
|
271
|
+
'content.queryError.operatorRequiresScalar': msg('Operator "{operator}" on "{field}" requires a scalar value.'),
|
|
272
|
+
'content.queryError.sortNotFilterable': msg('Sort field "{field}" on "{collection}" is not declared filterable.'),
|
|
273
|
+
'content.queryError.sortUnknownField': msg('Sort field "{field}" does not exist on "{collection}".'),
|
|
274
|
+
'content.queryError.sortDirection': msg('Sort direction must be "asc" or "desc".'),
|
|
275
|
+
'content.queryError.limitPositiveInteger': msg('Limit must be a positive integer.'),
|
|
193
276
|
// ─────────────────────────────────────────────────────────────────────────
|
|
194
277
|
// CMS — collection list / view bar / filters / cells
|
|
195
278
|
// ─────────────────────────────────────────────────────────────────────────
|
|
@@ -234,6 +317,11 @@ const MESSAGES = {
|
|
|
234
317
|
// per-row verdict needs the versions pane's snapshot compare).
|
|
235
318
|
'cms.docState.changed': msg('changed', 'Row status-dot label — published with unpublished changes.'),
|
|
236
319
|
'cms.docState.draft': msg('draft', 'Row State-column badge — lowercase token.'),
|
|
320
|
+
// EC-479 — a CMS session cannot open without the project's locales: the default
|
|
321
|
+
// locale is the storage key every localized value is written under, so the
|
|
322
|
+
// surface refuses rather than editing in an invented one.
|
|
323
|
+
'cms.session.noLocales.title': msg('This project declares no locales', 'Heading of the panel replacing the CMS surface when the project has no locale config.'),
|
|
324
|
+
'cms.session.noLocales.body': msg('Add a locales list to your project config. The default locale is the key your content is stored under, so the studio will not choose one for you.', 'Body of the same panel. Explains why the studio refuses instead of picking a locale.'),
|
|
237
325
|
'cms.list.view.all': msg('All entries', 'Name of the built-in baseline view.'),
|
|
238
326
|
'cms.list.unknownCollection': msg('Unknown collection {id}.'),
|
|
239
327
|
'cms.list.import.noId': msg('(no id)', 'Placeholder id in an import-rejected report.'),
|
|
@@ -253,6 +341,11 @@ const MESSAGES = {
|
|
|
253
341
|
'cms.list.bulk.noSettableFields': msg('No filterable scalar fields to set.'),
|
|
254
342
|
'cms.list.bulk.setField': msg('Set field'),
|
|
255
343
|
'cms.list.bulk.clearSelection': msg('Clear selection'),
|
|
344
|
+
// EC-494 — the two per-item failure reasons authored studio-side in
|
|
345
|
+
// `bulk-actions.ts`; the rest of a bulk report's reasons are resolved from the
|
|
346
|
+
// catalog reference the operation error now carries.
|
|
347
|
+
'cms.list.bulk.error.notInSession': msg('Document is no longer in the session.'),
|
|
348
|
+
'cms.list.bulk.error.notValidToPublish': msg('Document is not valid to publish.'),
|
|
256
349
|
'cms.list.bulk.set.set': msg('Set', 'Leading word of the “Set <field> to <value>” composer.'),
|
|
257
350
|
'cms.list.bulk.set.to': msg('to', 'Connector in the “Set <field> to <value>” composer.'),
|
|
258
351
|
'cms.list.bulk.set.valueAria': msg('Set value'),
|
|
@@ -276,6 +369,10 @@ const MESSAGES = {
|
|
|
276
369
|
'cms.filter.fieldAria': msg('Filter field'),
|
|
277
370
|
'cms.filter.operatorAria': msg('Filter operator'),
|
|
278
371
|
'cms.filter.remove': msg('Remove filter'),
|
|
372
|
+
// EC-494 — the two clause problems authored studio-side (`cms-views/view-model.ts`).
|
|
373
|
+
// The schema-field ones come from `core/content` and are keyed under content.queryError.*.
|
|
374
|
+
'cms.filter.issue.stateOperator': msg('State filters support only "eq" and "in".'),
|
|
375
|
+
'cms.filter.issue.stateValue': msg('State must be "draft" or "published".'),
|
|
279
376
|
'cms.filter.valueAria': msg('Filter value'),
|
|
280
377
|
'cms.filter.valueListPlaceholder': msg('value, value, …'),
|
|
281
378
|
'cms.filter.pickRelation': msg('Pick…', 'Placeholder on a relation filter value before a target is picked.'),
|
|
@@ -398,6 +495,7 @@ const MESSAGES = {
|
|
|
398
495
|
'cms.issue.reserved-field-name': msg('Reserved field name'),
|
|
399
496
|
'cms.issue.missing-required-field': msg('Missing required field'),
|
|
400
497
|
'cms.issue.invalid-field-value': msg('Invalid value'),
|
|
498
|
+
'cms.issue.invalid-field-value.warning': msg('Check this value', 'Title for a WARNING-severity invalid-field-value issue (EC-507). The value was accepted and stored — e.g. an implausible but legal date year — so "Invalid value" would contradict what the editor can see in the field.'),
|
|
401
499
|
'cms.issue.unknown-relation-target': msg('Missing reference'),
|
|
402
500
|
'cms.issue.unpublished-relation-target': msg('Unpublished reference'),
|
|
403
501
|
'cms.issue.cardinality-violation': msg('Wrong number of values'),
|
|
@@ -415,6 +513,7 @@ const MESSAGES = {
|
|
|
415
513
|
'cms.issue.unknown-alias': msg('Unknown slot'),
|
|
416
514
|
'cms.issue.unfilled-slot': msg('Empty slot'),
|
|
417
515
|
'cms.issue.custom-validation': msg('Validation rule'),
|
|
516
|
+
'cms.issue.unaddressable-url': msg('Unreachable URL'),
|
|
418
517
|
'cms.issue.unknown-version': msg('Unknown version'),
|
|
419
518
|
// EC-443 — issue-card BODY templates, only for codes whose full body derives
|
|
420
519
|
// from `code` + `path`/`meta` (`issue-copy.ts`); every other code shows the
|
|
@@ -427,6 +526,113 @@ const MESSAGES = {
|
|
|
427
526
|
'cms.issueBody.document-nesting-depth.warning': msg('This content nests {depth} levels deep, approaching the {limit}-level storage limit.'),
|
|
428
527
|
'cms.issueBody.hierarchy-cycle': msg('This entry is its own ancestor — the parent chain forms a loop.'),
|
|
429
528
|
// ─────────────────────────────────────────────────────────────────────────
|
|
529
|
+
// CMS validation issue BODIES (EC-487)
|
|
530
|
+
//
|
|
531
|
+
// EC-443 localized the issue TITLES (`cms.issue.<code>` above); the bodies were
|
|
532
|
+
// still built as English template literals inside `packages/core`, which cannot
|
|
533
|
+
// import this catalog. EC-478 solved that shape for `CustomizationIssue` by having
|
|
534
|
+
// the producer carry a message KEY; these are the same carriage for
|
|
535
|
+
// `CmsValidationIssue`, so the rail foot, the Issues pane and the for-review lane
|
|
536
|
+
// never mix a German title with an English body.
|
|
537
|
+
//
|
|
538
|
+
// The English here is a SECOND copy of what the producer builds — the tie between
|
|
539
|
+
// them is `lib/persona/cms-issue-i18n.test.ts`, which renders every real producer's
|
|
540
|
+
// issue through this catalog and asserts byte-identity. Interpolated values are
|
|
541
|
+
// IDENTIFIERS (field/collection/route/locale ids, patterns, counts) and stay
|
|
542
|
+
// unlocalized in every language.
|
|
543
|
+
//
|
|
544
|
+
// `cms.issueDetail.*` are FRAGMENTS spliced into the sentences above.
|
|
545
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
546
|
+
'cms.issueMessage.duplicateDocument': msg('Duplicate document "{id}" in collection "{collection}".'),
|
|
547
|
+
'cms.issueMessage.fieldDetail': msg('Field "{field}" {detail}.'),
|
|
548
|
+
'cms.issueMessage.fieldReason': msg('Field "{field}": {reason}'),
|
|
549
|
+
'cms.issueMessage.propDetail': msg('Prop "{field}" {detail}.'),
|
|
550
|
+
'cms.issueMessage.propReason': msg('Prop "{field}": {reason}'),
|
|
551
|
+
'cms.issueMessage.relationUnknownTargetCollection': msg('Relation field "{field}" targets unknown collection "{target}".'),
|
|
552
|
+
'cms.issueMessage.relationSingleValued': msg('Relation field "{field}" is single-valued but has {count} targets.'),
|
|
553
|
+
'cms.issueMessage.relationNotAReference': msg('Relation field "{field}" holds a value that is not a document reference.'),
|
|
554
|
+
'cms.issueMessage.relationWrongCollection': msg('Relation field "{field}" points at collection "{got}" but targets "{target}".'),
|
|
555
|
+
'cms.issueMessage.relationMissingDocument': msg('Relation field "{field}" references missing document "{id}" in "{target}".'),
|
|
556
|
+
'cms.issueMessage.relationUnpublishedDocument': msg('Relation field "{field}" references unpublished document "{id}" in "{target}" — the published site shows a fallback there.'),
|
|
557
|
+
'cms.issueMessage.assetNoAssetCollection': msg('Asset field "{field}" requires an asset collection, but none is registered.'),
|
|
558
|
+
'cms.issueMessage.assetSingleValued': msg('Asset field "{field}" is single-valued but has {count} targets.'),
|
|
559
|
+
'cms.issueMessage.assetExpectsId': msg('Asset field "{field}" expects an asset id.'),
|
|
560
|
+
'cms.issueMessage.assetUnknown': msg('Asset field "{field}" references unknown asset "{asset}".'),
|
|
561
|
+
'cms.issueMessage.requiredFieldMissing': msg('Required field "{field}" is missing.'),
|
|
562
|
+
'cms.issueMessage.requiredPropMissing': msg('Required prop "{field}" is missing.'),
|
|
563
|
+
'cms.issueMessage.perLocaleMapValue': msg('Field "{field}" expects a "{type}" value but holds a per-locale map (keys: {keys}) — per-locale values live under the document\'s "localized" bag, never inside a field value.'),
|
|
564
|
+
'cms.issueMessage.richTextHoldsArray': msg('Rich-text field "{field}" expects a string or a rich-text value ("{ version, doc }") but holds an array.'),
|
|
565
|
+
'cms.issueMessage.richTextHoldsBareDoc': msg('Rich-text field "{field}" expects a string or a rich-text value ("{ version, doc }") but holds a bare rich-text document missing its "{ version, doc }" envelope.'),
|
|
566
|
+
'cms.issueMessage.richTextHoldsObject': msg('Rich-text field "{field}" expects a string or a rich-text value ("{ version, doc }") but holds an object with keys "{keys}".'),
|
|
567
|
+
'cms.issueMessage.unknownCollectionForDocument': msg('Document "{id}" references unknown collection "{collection}".'),
|
|
568
|
+
'cms.issueMessage.localizedPlainValue': msg('Localized field "{field}" holds a plain value in the shared "values" bag — expected per-locale values under "localized.<locale>.{field}". The plain value serves only as a last-resort fallback.'),
|
|
569
|
+
'cms.issueMessage.requiredLocalizedMissingDefault': msg('Required localized field "{field}" is missing for the default locale "{locale}".'),
|
|
570
|
+
'cms.issueMessage.localizedNoValueNoFallback': msg('Localized field "{field}" has no value for locale "{locale}" and no fallback.'),
|
|
571
|
+
'cms.issueMessage.hierarchyCycle': msg('Document "{id}" is its own ancestor — the parent chain forms a cycle.'),
|
|
572
|
+
'cms.issueMessage.nestingDepthError': msg('Document "{id}" nests {depth} levels deep, past the backend\'s {limit}-level per-write limit — even depth-folding at rest cannot rescue a document this deep, so the write cannot be dispatched. Split it into smaller linked documents.'),
|
|
573
|
+
'cms.issueMessage.nestingDepthWarning': msg('Document "{id}" nests {depth} levels deep, approaching the backend\'s {limit}-level limit. Consider flattening the deepest path before it grows further.'),
|
|
574
|
+
'cms.issueMessage.propFilterable': msg('Component prop "{field}" declares "filterable", which only applies to document fields.'),
|
|
575
|
+
'cms.issueMessage.propUnique': msg('Component prop "{field}" declares "unique", which only applies across a collection\'s documents.'),
|
|
576
|
+
'cms.issueMessage.singletonDrift': msg('Singleton "{collection}" has {count} documents — it should have one. Keep the correct document and remove the others to open it directly.'),
|
|
577
|
+
'cms.issueMessage.unknownAlias.one': msg('A document is assigned the alias "{alias}", which is not a declared slot of "{collection}" ({declared}). Reassign to a valid slot.'),
|
|
578
|
+
'cms.issueMessage.unknownAlias.other': msg('{count} documents are assigned the alias "{alias}", which is not a declared slot of "{collection}" ({declared}). Reassign to a valid slot.'),
|
|
579
|
+
'cms.issueMessage.duplicateAlias': msg('{count} documents share the alias "{alias}" in "{collection}". Each slot must be assigned to one document — reassign or clear the duplicates.'),
|
|
580
|
+
'cms.issueMessage.unfilledSlot': msg('The "{slot}" slot of "{collection}" has no document yet. Assign one so code that resolves "{slot}" finds it.'),
|
|
581
|
+
'cms.issueMessage.reservedFieldName': msg('Field name "{field}" is reserved (the self-describing node discriminator).'),
|
|
582
|
+
'cms.issueMessage.duplicateSelectOption': msg('Duplicate select option "{option}" on field "{field}".'),
|
|
583
|
+
'cms.issueMessage.duplicateObjectField': msg('Duplicate field "{field}" in object field "{parent}".'),
|
|
584
|
+
'cms.issueMessage.assetCollectionSingleton': msg('Asset collection "{collection}" cannot be a singleton.'),
|
|
585
|
+
'cms.issueMessage.unknownPresentationBodyField': msg('Collection "{collection}" declares presentation body field "{field}", which it does not define.'),
|
|
586
|
+
'cms.issueMessage.duplicateCollectionField': msg('Duplicate field "{field}" in collection "{collection}".'),
|
|
587
|
+
'cms.issueMessage.duplicateCollectionId': msg('Duplicate collection id "{collection}".'),
|
|
588
|
+
'cms.issueMessage.unknownLocale': msg('Locale "{locale}" is not in the configured locale set.'),
|
|
589
|
+
'cms.issueMessage.unknownVersion': msg('No version {version} recorded for document "{id}".'),
|
|
590
|
+
'cms.issueMessage.routeConflict': msg('Routes "{first}" and "{second}" both match the same URLs (pattern "{pattern}").'),
|
|
591
|
+
'cms.issueMessage.redirectLoop': msg('Redirect chain starting at "{from}" loops (…{chain}).'),
|
|
592
|
+
'cms.issueMessage.allDynamicShadowsMount': msg('Route "{route}" ("{pattern}") has only dynamic segments, so it matches EVERY {depth}-segment URL — hierarchy mount "{mountRoute}" ("{mountPattern}") is consulted at that depth only where the route resolves no document. Nothing is unconditionally unreachable, but precedence there is decided by CONTENT rather than by the routes: {shadowed} are silently shadowed wherever a composed path collides with {claimed}, and neither side is told. Give the route a static prefix ("/blog/:slug") so it claims a namespace instead of a whole depth.'),
|
|
593
|
+
'cms.issueMessage.mountCannotServe': msg('Hierarchy mount "{route}" ("{pattern}") can never serve a document: {why}. The resolver skips such a mount silently, so every URL under "{space}" 404s with no issue raised.'),
|
|
594
|
+
'cms.issueMessage.deadCatchAll': msg('Route "{route}" ("{pattern}") serves nothing in either direction: it ends in a catch-all, so every router drops it, but its prefix has a dynamic segment ({dynamic}), so no hierarchy mount is built for it either. A mount\'s prefix must be static — declare one mount per locale (`{ pattern: \'/de/:path*\', locale: \'de\' }`), or drop the route.'),
|
|
595
|
+
'cms.issueMessage.mountConflict': msg('{opening} — mounts resolve in declaration order, not by specificity, so "{earlier}" (collection "{earlierCollection}") claims every URL there its own tree resolves, and "{laterCollection}" documents at those URLs are unreachable.'),
|
|
596
|
+
'cms.issueMessage.routeBoundDocumentNotFound': msg('Route-bound document "{collection}:{id}" was not found.'),
|
|
597
|
+
'cms.issueMessage.routeParamNotCaptured': msg('Route "{route}" binds its document to URL parameter ":{param}", which pattern "{pattern}" does not capture.'),
|
|
598
|
+
'cms.issueMessage.collectionNotDefined': msg('Collection "{collection}" is not defined.'),
|
|
599
|
+
'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.'),
|
|
600
|
+
'cms.issueDetail.expectsString': msg('expects a string'),
|
|
601
|
+
'cms.issueDetail.expectsRichText': msg('expects rich-text content (a string or a rich-text value)'),
|
|
602
|
+
'cms.issueDetail.expectsNumber': msg('expects a number'),
|
|
603
|
+
'cms.issueDetail.expectsBoolean': msg('expects a boolean'),
|
|
604
|
+
'cms.issueDetail.expectsIsoDate': msg('expects an ISO 8601 date (e.g. "2026-09-18")'),
|
|
605
|
+
'cms.issueDetail.expectsDate': msg('expects a date (ISO 8601 string or epoch number)'),
|
|
606
|
+
'cms.issueDetail.valueNotAmongOptions': msg('has value "{value}" not among its options'),
|
|
607
|
+
'cms.issueDetail.expectsObjectList': msg('expects a list of objects'),
|
|
608
|
+
'cms.issueDetail.expectsObject': msg('expects an object'),
|
|
609
|
+
'cms.issueDetail.implausibleYear': msg('has the year {year}, which looks unintended (a four-digit year is expected)'),
|
|
610
|
+
'cms.issueDetail.dateBoundNotADate': msg('declares {bound} `{declared}` on a date field, which is not a date — use an ISO 8601 string such as "1900-01-01"'),
|
|
611
|
+
'cms.issueDetail.earlierThanMin': msg('is earlier than {min}'),
|
|
612
|
+
'cms.issueDetail.laterThanMax': msg('is later than {max}'),
|
|
613
|
+
'cms.issueDetail.stringBoundOffDate': msg('declares {bound} "{declared}" as a string, which is only meaningful on a date field — use a number'),
|
|
614
|
+
'cms.issueDetail.shorterThanMinLength': msg('is shorter than min length {min}'),
|
|
615
|
+
'cms.issueDetail.longerThanMaxLength': msg('is longer than max length {max}'),
|
|
616
|
+
'cms.issueDetail.doesNotMatchPattern': msg('does not match pattern {pattern}'),
|
|
617
|
+
'cms.issueDetail.lessThanMin': msg('is less than min {min}'),
|
|
618
|
+
'cms.issueDetail.greaterThanMax': msg('is greater than max {max}'),
|
|
619
|
+
'cms.issueDetail.fewerThanMinItems': msg('has fewer than {min} items'),
|
|
620
|
+
'cms.issueDetail.moreThanMaxItems': msg('has more than {max} items'),
|
|
621
|
+
'cms.issueDetail.duplicateValue': msg('must be unique across the collection, but document "{other}" already has this value'),
|
|
622
|
+
'cms.issueDetail.duplicateValueForLocale': msg('must be unique across the collection, but document "{other}" already has this value for locale "{locale}"'),
|
|
623
|
+
'cms.issueDetail.singleValuedManyTargets': msg('is single-valued but has {count} targets'),
|
|
624
|
+
'cms.issueDetail.notADocumentReference': msg('holds a value that is not a document reference'),
|
|
625
|
+
'cms.issueDetail.pointsAtOtherCollection': msg('points at collection "{got}" but targets "{target}"'),
|
|
626
|
+
'cms.issueDetail.expectsAssetIdString': msg('expects an asset id string'),
|
|
627
|
+
'cms.issueDetail.shadowedRootDocuments': msg('the ROOT documents of "{collection}" under "{space}"'),
|
|
628
|
+
'cms.issueDetail.shadowedNestedDocuments': msg('"{collection}" documents nested {levels} levels under "{space}"'),
|
|
629
|
+
'cms.issueDetail.claimedBySlug': msg('a "{collection}" slug'),
|
|
630
|
+
'cms.issueDetail.claimedByOwnDocument': msg('the route\'s own document'),
|
|
631
|
+
'cms.issueDetail.mountCollectionNotDeclared': msg('collection "{collection}" is not declared'),
|
|
632
|
+
'cms.issueDetail.mountCollectionNotHierarchical': msg('collection "{collection}" has no `parent` self-relation, so it has no nested paths to compose'),
|
|
633
|
+
'cms.issueDetail.mountsSamePath': msg('Hierarchy mounts "{earlier}" ("{earlierPattern}") and "{later}" ("{laterPattern}") are both mounted at "{space}"'),
|
|
634
|
+
'cms.issueDetail.mountsNested': msg('Hierarchy mount "{later}" ("{laterPattern}") is nested inside "{earlier}" ("{earlierPattern}"), which is declared first and claims all of "{space}" too'),
|
|
635
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
430
636
|
// CMS — details pane (slot + sidebar fields)
|
|
431
637
|
// ─────────────────────────────────────────────────────────────────────────
|
|
432
638
|
'cms.details.slot': msg('Slot', 'A named handle the site uses to find a document (e.g. the main menu).'),
|
|
@@ -902,6 +1108,25 @@ const MESSAGES = {
|
|
|
902
1108
|
'builder.clipboard.pastedInto': msg('{summary} · into {destination}'),
|
|
903
1109
|
'builder.clipboard.issueComponent': msg('component'),
|
|
904
1110
|
'builder.clipboard.issueBinding': msg('binding'),
|
|
1111
|
+
// EC-494 — the engine-built clipboard failures (`core/clipboard`), which carry a
|
|
1112
|
+
// catalog ref because that subpath may not import this catalog, plus the studio-side
|
|
1113
|
+
// paste diff and its summary (translated in place — it already holds the locale).
|
|
1114
|
+
'builder.clipboard.error.corruptJson': msg('Clipboard content is not valid JSON: {detail}', '{detail} is the JS parser’s own diagnostic — untranslated prose, kept verbatim.'),
|
|
1115
|
+
'builder.clipboard.error.notEnvelope': msg('Clipboard content is not an Elytra fragment envelope.'),
|
|
1116
|
+
'builder.clipboard.error.foreignFormat': msg('Clipboard content is not an Elytra fragment (expected format "{expected}").'),
|
|
1117
|
+
'builder.clipboard.error.versionNewer': msg('Fragment version {version} is newer than this studio supports (version {supported}).'),
|
|
1118
|
+
'builder.clipboard.error.versionUnsupported': msg('Fragment version {version} is not supported (this studio reads version {supported}).'),
|
|
1119
|
+
'builder.clipboard.error.invalidPayload': msg('Clipboard fragment violates the fragment schema.'),
|
|
1120
|
+
'builder.clipboard.error.nodeNotFound': msg('No node "{nodeId}" exists in the composition.'),
|
|
1121
|
+
'builder.clipboard.error.fixtureNotFound': msg('Component "{component}" declares no fixture named "{fixture}".'),
|
|
1122
|
+
'builder.clipboard.issue.unresolvedBinding': msg('Binding source "{sourceId}" is not available in this project.'),
|
|
1123
|
+
'builder.clipboard.issue.missingComponent': msg('Component "{componentId}" is not registered in this project.'),
|
|
1124
|
+
'builder.clipboard.summary.pasted': msg('Pasted'),
|
|
1125
|
+
'builder.clipboard.summary.pastedWith': msg('Pasted — {parts}', '{parts} is the comma-joined list of the two summary fragments below.'),
|
|
1126
|
+
'builder.clipboard.summary.bindingUnresolvedOne': msg('{count} binding unresolved'),
|
|
1127
|
+
'builder.clipboard.summary.bindingsUnresolved': msg('{count} bindings unresolved'),
|
|
1128
|
+
'builder.clipboard.summary.componentMissingOne': msg('{count} component missing'),
|
|
1129
|
+
'builder.clipboard.summary.componentsMissing': msg('{count} components missing'),
|
|
905
1130
|
'builder.reuse.makeReusable': msg('Make reusable'),
|
|
906
1131
|
'builder.reuse.detachToCopy': msg('Detach to copy'),
|
|
907
1132
|
'builder.reuse.defaultElementName': msg('Reusable element'),
|
|
@@ -1083,6 +1308,7 @@ const MESSAGES = {
|
|
|
1083
1308
|
'ai.error.route': msg('The assistant is unavailable right now. Please try again.'),
|
|
1084
1309
|
'ai.error.generic': msg('Something went wrong. Please try again.'),
|
|
1085
1310
|
'ai.error.applyFailed': msg('The draft could not be applied.'),
|
|
1311
|
+
'ai.error.applyInvalid': msg('The proposal no longer fits the current document: {issues}', 'Shown when a re-validation at apply time finds errors the apply would introduce (the document changed since the proposal was built). {issues} is a short list of issue messages.'),
|
|
1086
1312
|
'ai.error.stepCap': msg('The assistant stopped after {max} tool steps. Send a follow-up message to continue.', 'EC-334 per-turn step cap. {max} is a number.'),
|
|
1087
1313
|
// EC-332 — full-document translation (header action + chat tool)
|
|
1088
1314
|
'ai.translate.action': msg('Translate document'),
|