@elytracms/studio 0.0.81 → 0.0.83
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/redirect-revalidate.test.ts +130 -0
- package/convex/revalidate.ts +9 -7
- package/convex/triggers.ts +33 -3
- 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/studio-config.d.ts +1 -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 +3 -1
- 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/cms/bulk-actions.js +8 -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 +27 -9
- package/dist/components/cms/cell-edit.js.map +1 -1
- package/dist/components/cms/cms-store.d.ts +14 -1
- package/dist/components/cms/cms-store.js +93 -24
- package/dist/components/cms/cms-store.js.map +1 -1
- package/dist/components/cms/collection-table.js +1 -1
- package/dist/components/cms/collection-table.js.map +1 -1
- package/dist/components/cms/detail-editor.js +7 -12
- 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 +20 -7
- package/dist/components/cms/field-control.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/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.js +8 -4
- 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/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/section-nav.js +5 -38
- package/dist/components/section-nav.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.js +1 -3
- 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 +68 -0
- package/dist/lib/i18n/messages.de.js.map +1 -1
- package/dist/lib/i18n/messages.en.d.ts +59 -0
- package/dist/lib/i18n/messages.en.js +80 -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/operations/studio-operations.js +19 -2
- package/dist/lib/operations/studio-operations.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 +44 -9
- package/dist/lib/persona/labels.js +143 -60
- package/dist/lib/persona/labels.js.map +1 -1
- 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 +3 -1
- package/dist/lib/workspace/config-issues.js +3 -1
- package/dist/lib/workspace/config-issues.js.map +1 -1
- package/dist/lib/workspace/index.d.ts +15 -8
- package/dist/lib/workspace/index.js +17 -18
- package/dist/lib/workspace/index.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 +5 -2
|
@@ -178,6 +178,38 @@ declare const MESSAGES: {
|
|
|
178
178
|
'error.dismiss': import("./types.js").SourceMessage;
|
|
179
179
|
'error.sessionExpiredTitle': import("./types.js").SourceMessage;
|
|
180
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;
|
|
181
213
|
'cms.index.heading': import("./types.js").SourceMessage;
|
|
182
214
|
'cms.index.description': import("./types.js").SourceMessage;
|
|
183
215
|
'cms.index.fieldCount.one': import("./types.js").SourceMessage;
|
|
@@ -229,6 +261,8 @@ declare const MESSAGES: {
|
|
|
229
261
|
'cms.list.bulk.noSettableFields': import("./types.js").SourceMessage;
|
|
230
262
|
'cms.list.bulk.setField': import("./types.js").SourceMessage;
|
|
231
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;
|
|
232
266
|
'cms.list.bulk.set.set': import("./types.js").SourceMessage;
|
|
233
267
|
'cms.list.bulk.set.to': import("./types.js").SourceMessage;
|
|
234
268
|
'cms.list.bulk.set.valueAria': import("./types.js").SourceMessage;
|
|
@@ -252,6 +286,8 @@ declare const MESSAGES: {
|
|
|
252
286
|
'cms.filter.fieldAria': import("./types.js").SourceMessage;
|
|
253
287
|
'cms.filter.operatorAria': import("./types.js").SourceMessage;
|
|
254
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;
|
|
255
291
|
'cms.filter.valueAria': import("./types.js").SourceMessage;
|
|
256
292
|
'cms.filter.valueListPlaceholder': import("./types.js").SourceMessage;
|
|
257
293
|
'cms.filter.pickRelation': import("./types.js").SourceMessage;
|
|
@@ -355,6 +391,7 @@ declare const MESSAGES: {
|
|
|
355
391
|
'cms.issue.reserved-field-name': import("./types.js").SourceMessage;
|
|
356
392
|
'cms.issue.missing-required-field': import("./types.js").SourceMessage;
|
|
357
393
|
'cms.issue.invalid-field-value': import("./types.js").SourceMessage;
|
|
394
|
+
'cms.issue.invalid-field-value.warning': import("./types.js").SourceMessage;
|
|
358
395
|
'cms.issue.unknown-relation-target': import("./types.js").SourceMessage;
|
|
359
396
|
'cms.issue.unpublished-relation-target': import("./types.js").SourceMessage;
|
|
360
397
|
'cms.issue.cardinality-violation': import("./types.js").SourceMessage;
|
|
@@ -372,6 +409,7 @@ declare const MESSAGES: {
|
|
|
372
409
|
'cms.issue.unknown-alias': import("./types.js").SourceMessage;
|
|
373
410
|
'cms.issue.unfilled-slot': import("./types.js").SourceMessage;
|
|
374
411
|
'cms.issue.custom-validation': import("./types.js").SourceMessage;
|
|
412
|
+
'cms.issue.unaddressable-url': import("./types.js").SourceMessage;
|
|
375
413
|
'cms.issue.unknown-version': import("./types.js").SourceMessage;
|
|
376
414
|
'cms.issueBody.missing-required-field': import("./types.js").SourceMessage;
|
|
377
415
|
'cms.issueBody.missing-localized-value.default': import("./types.js").SourceMessage;
|
|
@@ -419,6 +457,7 @@ declare const MESSAGES: {
|
|
|
419
457
|
'cms.issueMessage.duplicateSelectOption': import("./types.js").SourceMessage;
|
|
420
458
|
'cms.issueMessage.duplicateObjectField': import("./types.js").SourceMessage;
|
|
421
459
|
'cms.issueMessage.assetCollectionSingleton': import("./types.js").SourceMessage;
|
|
460
|
+
'cms.issueMessage.unknownPresentationBodyField': import("./types.js").SourceMessage;
|
|
422
461
|
'cms.issueMessage.duplicateCollectionField': import("./types.js").SourceMessage;
|
|
423
462
|
'cms.issueMessage.duplicateCollectionId': import("./types.js").SourceMessage;
|
|
424
463
|
'cms.issueMessage.unknownLocale': import("./types.js").SourceMessage;
|
|
@@ -432,6 +471,7 @@ declare const MESSAGES: {
|
|
|
432
471
|
'cms.issueMessage.routeBoundDocumentNotFound': import("./types.js").SourceMessage;
|
|
433
472
|
'cms.issueMessage.routeParamNotCaptured': import("./types.js").SourceMessage;
|
|
434
473
|
'cms.issueMessage.collectionNotDefined': import("./types.js").SourceMessage;
|
|
474
|
+
'cms.issueMessage.unaddressableLocaleCollision': import("./types.js").SourceMessage;
|
|
435
475
|
'cms.issueDetail.expectsString': import("./types.js").SourceMessage;
|
|
436
476
|
'cms.issueDetail.expectsRichText': import("./types.js").SourceMessage;
|
|
437
477
|
'cms.issueDetail.expectsNumber': import("./types.js").SourceMessage;
|
|
@@ -453,6 +493,8 @@ declare const MESSAGES: {
|
|
|
453
493
|
'cms.issueDetail.greaterThanMax': import("./types.js").SourceMessage;
|
|
454
494
|
'cms.issueDetail.fewerThanMinItems': import("./types.js").SourceMessage;
|
|
455
495
|
'cms.issueDetail.moreThanMaxItems': import("./types.js").SourceMessage;
|
|
496
|
+
'cms.issueDetail.duplicateValue': import("./types.js").SourceMessage;
|
|
497
|
+
'cms.issueDetail.duplicateValueForLocale': import("./types.js").SourceMessage;
|
|
456
498
|
'cms.issueDetail.singleValuedManyTargets': import("./types.js").SourceMessage;
|
|
457
499
|
'cms.issueDetail.notADocumentReference': import("./types.js").SourceMessage;
|
|
458
500
|
'cms.issueDetail.pointsAtOtherCollection': import("./types.js").SourceMessage;
|
|
@@ -861,6 +903,22 @@ declare const MESSAGES: {
|
|
|
861
903
|
'builder.clipboard.pastedInto': import("./types.js").SourceMessage;
|
|
862
904
|
'builder.clipboard.issueComponent': import("./types.js").SourceMessage;
|
|
863
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;
|
|
864
922
|
'builder.reuse.makeReusable': import("./types.js").SourceMessage;
|
|
865
923
|
'builder.reuse.detachToCopy': import("./types.js").SourceMessage;
|
|
866
924
|
'builder.reuse.defaultElementName': import("./types.js").SourceMessage;
|
|
@@ -1025,6 +1083,7 @@ declare const MESSAGES: {
|
|
|
1025
1083
|
'ai.error.route': import("./types.js").SourceMessage;
|
|
1026
1084
|
'ai.error.generic': import("./types.js").SourceMessage;
|
|
1027
1085
|
'ai.error.applyFailed': import("./types.js").SourceMessage;
|
|
1086
|
+
'ai.error.applyInvalid': import("./types.js").SourceMessage;
|
|
1028
1087
|
'ai.error.stepCap': import("./types.js").SourceMessage;
|
|
1029
1088
|
'ai.translate.action': import("./types.js").SourceMessage;
|
|
1030
1089
|
'ai.translate.tooltip': import("./types.js").SourceMessage;
|
|
@@ -228,6 +228,51 @@ const MESSAGES = {
|
|
|
228
228
|
// the session-expired predicate; re-auth happens in place, no navigation.
|
|
229
229
|
'error.sessionExpiredTitle': msg("You've been signed out", 'Heading of the blocking session-expired re-auth overlay.'),
|
|
230
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.'),
|
|
231
276
|
// ─────────────────────────────────────────────────────────────────────────
|
|
232
277
|
// CMS — collection list / view bar / filters / cells
|
|
233
278
|
// ─────────────────────────────────────────────────────────────────────────
|
|
@@ -296,6 +341,11 @@ const MESSAGES = {
|
|
|
296
341
|
'cms.list.bulk.noSettableFields': msg('No filterable scalar fields to set.'),
|
|
297
342
|
'cms.list.bulk.setField': msg('Set field'),
|
|
298
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.'),
|
|
299
349
|
'cms.list.bulk.set.set': msg('Set', 'Leading word of the “Set <field> to <value>” composer.'),
|
|
300
350
|
'cms.list.bulk.set.to': msg('to', 'Connector in the “Set <field> to <value>” composer.'),
|
|
301
351
|
'cms.list.bulk.set.valueAria': msg('Set value'),
|
|
@@ -319,6 +369,10 @@ const MESSAGES = {
|
|
|
319
369
|
'cms.filter.fieldAria': msg('Filter field'),
|
|
320
370
|
'cms.filter.operatorAria': msg('Filter operator'),
|
|
321
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".'),
|
|
322
376
|
'cms.filter.valueAria': msg('Filter value'),
|
|
323
377
|
'cms.filter.valueListPlaceholder': msg('value, value, …'),
|
|
324
378
|
'cms.filter.pickRelation': msg('Pick…', 'Placeholder on a relation filter value before a target is picked.'),
|
|
@@ -441,6 +495,7 @@ const MESSAGES = {
|
|
|
441
495
|
'cms.issue.reserved-field-name': msg('Reserved field name'),
|
|
442
496
|
'cms.issue.missing-required-field': msg('Missing required field'),
|
|
443
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.'),
|
|
444
499
|
'cms.issue.unknown-relation-target': msg('Missing reference'),
|
|
445
500
|
'cms.issue.unpublished-relation-target': msg('Unpublished reference'),
|
|
446
501
|
'cms.issue.cardinality-violation': msg('Wrong number of values'),
|
|
@@ -458,6 +513,7 @@ const MESSAGES = {
|
|
|
458
513
|
'cms.issue.unknown-alias': msg('Unknown slot'),
|
|
459
514
|
'cms.issue.unfilled-slot': msg('Empty slot'),
|
|
460
515
|
'cms.issue.custom-validation': msg('Validation rule'),
|
|
516
|
+
'cms.issue.unaddressable-url': msg('Unreachable URL'),
|
|
461
517
|
'cms.issue.unknown-version': msg('Unknown version'),
|
|
462
518
|
// EC-443 — issue-card BODY templates, only for codes whose full body derives
|
|
463
519
|
// from `code` + `path`/`meta` (`issue-copy.ts`); every other code shows the
|
|
@@ -526,6 +582,7 @@ const MESSAGES = {
|
|
|
526
582
|
'cms.issueMessage.duplicateSelectOption': msg('Duplicate select option "{option}" on field "{field}".'),
|
|
527
583
|
'cms.issueMessage.duplicateObjectField': msg('Duplicate field "{field}" in object field "{parent}".'),
|
|
528
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.'),
|
|
529
586
|
'cms.issueMessage.duplicateCollectionField': msg('Duplicate field "{field}" in collection "{collection}".'),
|
|
530
587
|
'cms.issueMessage.duplicateCollectionId': msg('Duplicate collection id "{collection}".'),
|
|
531
588
|
'cms.issueMessage.unknownLocale': msg('Locale "{locale}" is not in the configured locale set.'),
|
|
@@ -539,6 +596,7 @@ const MESSAGES = {
|
|
|
539
596
|
'cms.issueMessage.routeBoundDocumentNotFound': msg('Route-bound document "{collection}:{id}" was not found.'),
|
|
540
597
|
'cms.issueMessage.routeParamNotCaptured': msg('Route "{route}" binds its document to URL parameter ":{param}", which pattern "{pattern}" does not capture.'),
|
|
541
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.'),
|
|
542
600
|
'cms.issueDetail.expectsString': msg('expects a string'),
|
|
543
601
|
'cms.issueDetail.expectsRichText': msg('expects rich-text content (a string or a rich-text value)'),
|
|
544
602
|
'cms.issueDetail.expectsNumber': msg('expects a number'),
|
|
@@ -560,6 +618,8 @@ const MESSAGES = {
|
|
|
560
618
|
'cms.issueDetail.greaterThanMax': msg('is greater than max {max}'),
|
|
561
619
|
'cms.issueDetail.fewerThanMinItems': msg('has fewer than {min} items'),
|
|
562
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}"'),
|
|
563
623
|
'cms.issueDetail.singleValuedManyTargets': msg('is single-valued but has {count} targets'),
|
|
564
624
|
'cms.issueDetail.notADocumentReference': msg('holds a value that is not a document reference'),
|
|
565
625
|
'cms.issueDetail.pointsAtOtherCollection': msg('points at collection "{got}" but targets "{target}"'),
|
|
@@ -1048,6 +1108,25 @@ const MESSAGES = {
|
|
|
1048
1108
|
'builder.clipboard.pastedInto': msg('{summary} · into {destination}'),
|
|
1049
1109
|
'builder.clipboard.issueComponent': msg('component'),
|
|
1050
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'),
|
|
1051
1130
|
'builder.reuse.makeReusable': msg('Make reusable'),
|
|
1052
1131
|
'builder.reuse.detachToCopy': msg('Detach to copy'),
|
|
1053
1132
|
'builder.reuse.defaultElementName': msg('Reusable element'),
|
|
@@ -1229,6 +1308,7 @@ const MESSAGES = {
|
|
|
1229
1308
|
'ai.error.route': msg('The assistant is unavailable right now. Please try again.'),
|
|
1230
1309
|
'ai.error.generic': msg('Something went wrong. Please try again.'),
|
|
1231
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.'),
|
|
1232
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.'),
|
|
1233
1313
|
// EC-332 — full-document translation (header action + chat tool)
|
|
1234
1314
|
'ai.translate.action': msg('Translate document'),
|