@elytracms/studio 0.0.94 → 0.0.96
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/asset-alt-migration.test.ts +2 -2
- package/convex/asset-meta-patch.test.ts +218 -0
- package/convex/asset-replace-delete-race.test.ts +127 -0
- package/convex/assets.ts +27 -2
- package/convex/cms.ts +124 -8
- package/convex/delivery-redirects.test.ts +167 -0
- package/convex/delivery.ts +15 -5
- package/convex/rail-write-parity.test.ts +6 -6
- package/convex/redirects.ts +1 -1
- package/convex/schema.ts +6 -0
- package/convex/strict-reference-race.test.ts +139 -0
- package/dist/addon.d.ts +1 -1
- package/dist/addon.js.map +1 -1
- package/dist/components/ai/ai-chat-panel.js +15 -2
- package/dist/components/ai/ai-chat-panel.js.map +1 -1
- package/dist/components/ai/translate-document-action.d.ts +6 -0
- package/dist/components/ai/translate-document-action.js.map +1 -1
- package/dist/components/ai/translate-document-dialog.d.ts +1 -1
- package/dist/components/ai/translate-document-dialog.js +5 -5
- package/dist/components/ai/translate-document-dialog.js.map +1 -1
- package/dist/components/assets/asset-detail.js +29 -11
- package/dist/components/assets/asset-detail.js.map +1 -1
- package/dist/components/assets/asset-locale.d.ts +16 -0
- package/dist/components/assets/asset-locale.js +30 -0
- package/dist/components/assets/asset-locale.js.map +1 -0
- package/dist/components/assets/asset-meta-drift-notice.d.ts +13 -0
- package/dist/components/assets/asset-meta-drift-notice.js +22 -0
- package/dist/components/assets/asset-meta-drift-notice.js.map +1 -0
- package/dist/components/assets/asset-meta-label.d.ts +13 -0
- package/dist/components/assets/asset-meta-label.js +17 -0
- package/dist/components/assets/asset-meta-label.js.map +1 -0
- package/dist/components/assets/asset-metadata.d.ts +89 -15
- package/dist/components/assets/asset-metadata.js +123 -11
- package/dist/components/assets/asset-metadata.js.map +1 -1
- package/dist/components/assets/asset-search.d.ts +6 -2
- package/dist/components/assets/asset-search.js +19 -3
- package/dist/components/assets/asset-search.js.map +1 -1
- package/dist/components/assets/asset-thumb.js +6 -2
- package/dist/components/assets/asset-thumb.js.map +1 -1
- package/dist/components/assets/assets-collection-view-source.d.ts +25 -9
- package/dist/components/assets/assets-collection-view-source.js +80 -26
- package/dist/components/assets/assets-collection-view-source.js.map +1 -1
- package/dist/components/assets/assets-store.js +17 -4
- package/dist/components/assets/assets-store.js.map +1 -1
- package/dist/components/builder/builder-store.d.ts +21 -0
- package/dist/components/builder/builder-store.js +22 -0
- package/dist/components/builder/builder-store.js.map +1 -1
- package/dist/components/builder/canvas-commit-boundary.d.ts +22 -0
- package/dist/components/builder/canvas-commit-boundary.js +27 -0
- package/dist/components/builder/canvas-commit-boundary.js.map +1 -0
- package/dist/components/builder/canvas-rebase.d.ts +101 -0
- package/dist/components/builder/canvas-rebase.js +179 -0
- package/dist/components/builder/canvas-rebase.js.map +1 -0
- package/dist/components/builder/canvas-render-context.d.ts +6 -3
- package/dist/components/builder/canvas-render-context.js +17 -8
- package/dist/components/builder/canvas-render-context.js.map +1 -1
- package/dist/components/builder/composition-field-editor.d.ts +26 -2
- package/dist/components/builder/composition-field-editor.js +46 -27
- package/dist/components/builder/composition-field-editor.js.map +1 -1
- package/dist/components/builder/node-factory.js +15 -3
- package/dist/components/builder/node-factory.js.map +1 -1
- package/dist/components/builder/property-inspector.js +3 -1
- package/dist/components/builder/property-inspector.js.map +1 -1
- package/dist/components/builder/run-inspector.js +10 -6
- package/dist/components/builder/run-inspector.js.map +1 -1
- package/dist/components/cms/asset-field.d.ts +5 -2
- package/dist/components/cms/asset-field.js +34 -17
- package/dist/components/cms/asset-field.js.map +1 -1
- package/dist/components/cms/asset-picker-core.d.ts +2 -2
- package/dist/components/cms/asset-picker-core.js +2 -2
- package/dist/components/cms/asset-picker-core.js.map +1 -1
- package/dist/components/cms/asset-picker.js +6 -2
- package/dist/components/cms/asset-picker.js.map +1 -1
- package/dist/components/cms/canvas-commit.d.ts +62 -0
- package/dist/components/cms/canvas-commit.js +39 -0
- package/dist/components/cms/canvas-commit.js.map +1 -0
- package/dist/components/cms/cms-store.d.ts +21 -8
- package/dist/components/cms/cms-store.js +19 -10
- package/dist/components/cms/cms-store.js.map +1 -1
- package/dist/components/cms/collection-table.js +27 -18
- package/dist/components/cms/collection-table.js.map +1 -1
- package/dist/components/cms/commit-policy.d.ts +6 -2
- package/dist/components/cms/commit-policy.js +1 -1
- package/dist/components/cms/commit-policy.js.map +1 -1
- package/dist/components/cms/detail-editor.js +12 -2
- package/dist/components/cms/detail-editor.js.map +1 -1
- package/dist/components/cms/draft-commit.d.ts +16 -3
- package/dist/components/cms/draft-commit.js +3 -2
- package/dist/components/cms/draft-commit.js.map +1 -1
- package/dist/components/cms/use-document-draft.d.ts +121 -5
- package/dist/components/cms/use-document-draft.js +197 -54
- package/dist/components/cms/use-document-draft.js.map +1 -1
- package/dist/components/cms/use-live-url.d.ts +6 -1
- package/dist/components/cms/use-live-url.js +12 -9
- package/dist/components/cms/use-live-url.js.map +1 -1
- package/dist/components/collection-view/cms-collection-view-source.js +11 -5
- package/dist/components/collection-view/cms-collection-view-source.js.map +1 -1
- package/dist/components/components/transfer-dialog.js +6 -4
- package/dist/components/components/transfer-dialog.js.map +1 -1
- package/dist/components/deployment-setup-gate.js +10 -1
- package/dist/components/deployment-setup-gate.js.map +1 -1
- package/dist/components/records/record-lens.js +3 -8
- package/dist/components/records/record-lens.js.map +1 -1
- package/dist/lib/ai/chat-state.d.ts +7 -0
- package/dist/lib/ai/chat-state.js.map +1 -1
- package/dist/lib/ai/tools.d.ts +8 -0
- package/dist/lib/ai/tools.js +4 -0
- package/dist/lib/ai/tools.js.map +1 -1
- package/dist/lib/assets/upload.d.ts +25 -7
- package/dist/lib/assets/upload.js +30 -21
- package/dist/lib/assets/upload.js.map +1 -1
- package/dist/lib/cms/published-documents.d.ts +24 -6
- package/dist/lib/cms/published-documents.js +39 -6
- package/dist/lib/cms/published-documents.js.map +1 -1
- package/dist/lib/cms-views/view-model.d.ts +25 -105
- package/dist/lib/cms-views/view-model.js +36 -103
- package/dist/lib/cms-views/view-model.js.map +1 -1
- package/dist/lib/collection-view/__fixtures__/document-writes.js +1 -0
- package/dist/lib/collection-view/__fixtures__/document-writes.js.map +1 -1
- package/dist/lib/collection-view/collection-view-source.d.ts +21 -8
- package/dist/lib/collection-view/collection-view-source.js.map +1 -1
- package/dist/lib/data/collection-content.js +5 -0
- package/dist/lib/data/collection-content.js.map +1 -1
- package/dist/lib/engine-version.d.ts +1 -1
- package/dist/lib/engine-version.js +1 -1
- package/dist/lib/engine-version.js.map +1 -1
- package/dist/lib/i18n/messages.de.js +20 -4
- package/dist/lib/i18n/messages.de.js.map +1 -1
- package/dist/lib/i18n/messages.en.d.ts +16 -1
- package/dist/lib/i18n/messages.en.js +22 -5
- package/dist/lib/i18n/messages.en.js.map +1 -1
- package/dist/lib/operations/cms-persistence.d.ts +80 -35
- package/dist/lib/operations/cms-persistence.js +348 -85
- package/dist/lib/operations/cms-persistence.js.map +1 -1
- package/dist/lib/operations/config-manifest-lookup.d.ts +1 -1
- package/dist/lib/operations/config-manifest-lookup.js +3 -3
- package/dist/lib/operations/config-manifest-lookup.js.map +1 -1
- package/dist/lib/persistence/convex-adapter.js +54 -8
- package/dist/lib/persistence/convex-adapter.js.map +1 -1
- package/dist/lib/persistence/deployment-readiness.js +14 -11
- package/dist/lib/persistence/deployment-readiness.js.map +1 -1
- package/dist/lib/persona/labels.js +2 -0
- package/dist/lib/persona/labels.js.map +1 -1
- package/dist/lib/query/index.d.ts +2 -2
- package/dist/lib/query/index.js +1 -1
- package/dist/lib/query/index.js.map +1 -1
- package/dist/lib/query/operations-query.d.ts +26 -0
- package/dist/lib/query/operations-query.js +12 -0
- package/dist/lib/query/operations-query.js.map +1 -1
- package/dist/lib/registry/index.js +2 -2
- package/dist/lib/registry/index.js.map +1 -1
- package/dist/lib/registry/preview.d.ts +10 -0
- package/dist/lib/registry/preview.js +13 -4
- package/dist/lib/registry/preview.js.map +1 -1
- package/dist/lib/routes/route-issues.js +6 -3
- package/dist/lib/routes/route-issues.js.map +1 -1
- package/dist/lib/workspace/workspace-source.js +6 -7
- package/dist/lib/workspace/workspace-source.js.map +1 -1
- package/dist/previews/entry-node.d.ts +14 -0
- package/dist/previews/entry-node.js +22 -0
- package/dist/previews/entry-node.js.map +1 -0
- package/dist/previews/harness.js +2 -16
- package/dist/previews/harness.js.map +1 -1
- package/package.json +3 -3
|
@@ -108,7 +108,6 @@ declare const MESSAGES: {
|
|
|
108
108
|
'shell.session.loading': import("./types.js").SourceMessage;
|
|
109
109
|
'shell.session.error.title': import("./types.js").SourceMessage;
|
|
110
110
|
'shell.session.error.body': import("./types.js").SourceMessage;
|
|
111
|
-
'shell.workspaceGate.title': import("./types.js").SourceMessage;
|
|
112
111
|
'shell.workspaceGate.issuesLabel': import("./types.js").SourceMessage;
|
|
113
112
|
'shell.backend.connecting': import("./types.js").SourceMessage;
|
|
114
113
|
'shell.backend.notConfigured.title': import("./types.js").SourceMessage;
|
|
@@ -207,6 +206,8 @@ declare const MESSAGES: {
|
|
|
207
206
|
'operations.error.strictTargetsUnpublished': import("./types.js").SourceMessage;
|
|
208
207
|
'operations.error.publishNeedsLocales': import("./types.js").SourceMessage;
|
|
209
208
|
'operations.error.versionNotPinnable': import("./types.js").SourceMessage;
|
|
209
|
+
'operations.error.changesetBlocked': import("./types.js").SourceMessage;
|
|
210
|
+
'operations.error.changesetDeleteNotReversible': import("./types.js").SourceMessage;
|
|
210
211
|
'operations.errorDetail.andMore': import("./types.js").SourceMessage;
|
|
211
212
|
'content.queryError.nonFilterableField': import("./types.js").SourceMessage;
|
|
212
213
|
'content.queryError.unknownField': import("./types.js").SourceMessage;
|
|
@@ -221,6 +222,10 @@ declare const MESSAGES: {
|
|
|
221
222
|
'content.queryError.sortNotFilterable': import("./types.js").SourceMessage;
|
|
222
223
|
'content.queryError.sortUnknownField': import("./types.js").SourceMessage;
|
|
223
224
|
'content.queryError.sortDirection': import("./types.js").SourceMessage;
|
|
225
|
+
'content.queryError.sortShape': import("./types.js").SourceMessage;
|
|
226
|
+
'content.queryError.sortFieldName': import("./types.js").SourceMessage;
|
|
227
|
+
'content.queryError.sortKeyRenamed': import("./types.js").SourceMessage;
|
|
228
|
+
'content.queryError.sortUnknownKey': import("./types.js").SourceMessage;
|
|
224
229
|
'content.queryError.limitPositiveInteger': import("./types.js").SourceMessage;
|
|
225
230
|
'cms.index.heading': import("./types.js").SourceMessage;
|
|
226
231
|
'cms.index.description': import("./types.js").SourceMessage;
|
|
@@ -343,6 +348,7 @@ declare const MESSAGES: {
|
|
|
343
348
|
'cms.editor.loadingLiveUrl': import("./types.js").SourceMessage;
|
|
344
349
|
'cms.editor.publishToViewLive': import("./types.js").SourceMessage;
|
|
345
350
|
'cms.editor.setFrontendUrlHint': import("./types.js").SourceMessage;
|
|
351
|
+
'cms.editor.publishedReadFailed': import("./types.js").SourceMessage;
|
|
346
352
|
'cms.editor.switchToDraftToPublish': import("./types.js").SourceMessage;
|
|
347
353
|
'cms.editor.fixIssuesToPublish.one': import("./types.js").SourceMessage;
|
|
348
354
|
'cms.editor.fixIssuesToPublish.other': import("./types.js").SourceMessage;
|
|
@@ -400,6 +406,8 @@ declare const MESSAGES: {
|
|
|
400
406
|
'cms.issue.unpublished-relation-target': import("./types.js").SourceMessage;
|
|
401
407
|
'cms.issue.cardinality-violation': import("./types.js").SourceMessage;
|
|
402
408
|
'cms.issue.unknown-asset': import("./types.js").SourceMessage;
|
|
409
|
+
'cms.issue.asset-without-url': import("./types.js").SourceMessage;
|
|
410
|
+
'cms.issue.asset-meta-drift': import("./types.js").SourceMessage;
|
|
403
411
|
'cms.issue.duplicate-document': import("./types.js").SourceMessage;
|
|
404
412
|
'cms.issue.unknown-locale': import("./types.js").SourceMessage;
|
|
405
413
|
'cms.issue.missing-localized-value': import("./types.js").SourceMessage;
|
|
@@ -462,6 +470,7 @@ declare const MESSAGES: {
|
|
|
462
470
|
'cms.conflict.empty': import("./types.js").SourceMessage;
|
|
463
471
|
'cms.conflict.structured': import("./types.js").SourceMessage;
|
|
464
472
|
'cms.conflict.cellRefused': import("./types.js").SourceMessage;
|
|
473
|
+
'cms.conflict.unauthored': import("./types.js").SourceMessage;
|
|
465
474
|
'cms.presence.inField': import("./types.js").SourceMessage;
|
|
466
475
|
'cms.presence.inFieldMany': import("./types.js").SourceMessage;
|
|
467
476
|
'cms.presence.someone': import("./types.js").SourceMessage;
|
|
@@ -481,6 +490,7 @@ declare const MESSAGES: {
|
|
|
481
490
|
'cms.issueMessage.duplicateAlias': import("./types.js").SourceMessage;
|
|
482
491
|
'cms.issueMessage.unfilledSlot': import("./types.js").SourceMessage;
|
|
483
492
|
'cms.issueMessage.reservedFieldName': import("./types.js").SourceMessage;
|
|
493
|
+
'cms.issueMessage.reservedFieldTypeOption': import("./types.js").SourceMessage;
|
|
484
494
|
'cms.issueMessage.duplicateSelectOption': import("./types.js").SourceMessage;
|
|
485
495
|
'cms.issueMessage.duplicateObjectField': import("./types.js").SourceMessage;
|
|
486
496
|
'cms.issueMessage.assetCollectionSingleton': import("./types.js").SourceMessage;
|
|
@@ -492,6 +502,8 @@ declare const MESSAGES: {
|
|
|
492
502
|
'cms.issueMessage.routeConflict': import("./types.js").SourceMessage;
|
|
493
503
|
'cms.issueMessage.redirectLoop': import("./types.js").SourceMessage;
|
|
494
504
|
'cms.issueMessage.duplicateRedirect': import("./types.js").SourceMessage;
|
|
505
|
+
'cms.issueMessage.redirectUnreadable': import("./types.js").SourceMessage;
|
|
506
|
+
'cms.issueMessage.redirectReportUnreadable': import("./types.js").SourceMessage;
|
|
495
507
|
'cms.issueMessage.allDynamicShadowsMount': import("./types.js").SourceMessage;
|
|
496
508
|
'cms.issueMessage.mountCannotServe': import("./types.js").SourceMessage;
|
|
497
509
|
'cms.issueMessage.deadCatchAll': import("./types.js").SourceMessage;
|
|
@@ -696,6 +708,9 @@ declare const MESSAGES: {
|
|
|
696
708
|
'assets.viewToggle.list': import("./types.js").SourceMessage;
|
|
697
709
|
'assets.viewToggle.grid': import("./types.js").SourceMessage;
|
|
698
710
|
'assets.detail.metadataHeading': import("./types.js").SourceMessage;
|
|
711
|
+
'assets.detail.noFileUrl': import("./types.js").SourceMessage;
|
|
712
|
+
'assets.detail.metaDriftNotLocalized': import("./types.js").SourceMessage;
|
|
713
|
+
'assets.detail.metaDriftUndeclared': import("./types.js").SourceMessage;
|
|
699
714
|
'assets.references.buttonLabel': import("./types.js").SourceMessage;
|
|
700
715
|
'assets.references.title': import("./types.js").SourceMessage;
|
|
701
716
|
'assets.references.description': import("./types.js").SourceMessage;
|
|
@@ -122,8 +122,7 @@ const MESSAGES = {
|
|
|
122
122
|
'shell.session.loading': msg('Loading project…'),
|
|
123
123
|
'shell.session.error.title': msg('Couldn’t load this project’s saved state'),
|
|
124
124
|
'shell.session.error.body': msg('The studio never falls back to sample content against a live backend — your data is safe; retry once the backend is reachable.'),
|
|
125
|
-
'shell.workspaceGate.
|
|
126
|
-
'shell.workspaceGate.issuesLabel': msg('Workspace config issues', 'aria-label on the issues list.'),
|
|
125
|
+
'shell.workspaceGate.issuesLabel': msg('Workspace config issues', 'aria-label on the list of located config issues under a failing deployment-setup check (EC-626).'),
|
|
127
126
|
'shell.backend.connecting': msg('Connecting to backend…'),
|
|
128
127
|
'shell.backend.notConfigured.title': msg('Backend not configured'),
|
|
129
128
|
'shell.backend.unavailable.title': msg('Backend unavailable'),
|
|
@@ -273,6 +272,9 @@ const MESSAGES = {
|
|
|
273
272
|
'operations.error.strictTargetsUnpublished': msg('Document “{target}” cannot be published: strict relation targets are missing or unpublished — publish them first.'),
|
|
274
273
|
'operations.error.publishNeedsLocales': msg('“{target}” cannot be published: its collection declares localized fields ({fields}), and no locale config was given to judge their hidden values in.', 'EC-585: a headless runtime publishing a localized collection without the project locale config; {fields} is a comma-separated list of field names.'),
|
|
275
274
|
'operations.error.versionNotPinnable': msg('Version {version} of “{target}” was not recorded by a publish, so it cannot be pinned live — restore it into the draft and publish that instead.', 'EC-585: only a version a publish recorded can be re-pinned; {version} is a number.'),
|
|
275
|
+
// EC-648 — changesets: apply blocked by an issue, and the step a changeset refuses because no undo can reverse it.
|
|
276
|
+
'operations.error.changesetBlocked': msg('Changeset “{changeset}” has blocking validation issues and cannot be applied.', '{changeset} is a changeset id, e.g. cs-0001; the blocking issues follow beneath it.'),
|
|
277
|
+
'operations.error.changesetDeleteNotReversible': msg('Step {step}: “{target}” cannot be deleted inside a changeset — a delete removes its version history and publication, which no undo can restore. Delete it on its own.', 'EC-648: {step} is the 0-based step number; {target} is the document key collection:id.'),
|
|
276
278
|
'operations.errorDetail.andMore': msg(', and {count} more', 'Truncation fragment spliced into the strict-reference sentences; keeps its leading comma and space.'),
|
|
277
279
|
// EC-494 — content-query errors (`core/content`'s validateWhere/validateSort/
|
|
278
280
|
// validateLimit). Two studio surfaces render them: the filter builder's per-clause
|
|
@@ -290,6 +292,11 @@ const MESSAGES = {
|
|
|
290
292
|
'content.queryError.sortNotFilterable': msg('Sort field "{field}" on "{collection}" is not declared filterable.'),
|
|
291
293
|
'content.queryError.sortUnknownField': msg('Sort field "{field}" does not exist on "{collection}".'),
|
|
292
294
|
'content.queryError.sortDirection': msg('Sort direction must be "asc" or "desc".'),
|
|
295
|
+
// EC-660 — THE sort shape (`{ field, direction? }`, strict) judged by validateSort.
|
|
296
|
+
'content.queryError.sortShape': msg('Sort must be an object { field, direction? }.', 'The braces are code — the literal shape of a sort; keep them and the key names untranslated.'),
|
|
297
|
+
'content.queryError.sortFieldName': msg('Sort field must be a non-empty field name.'),
|
|
298
|
+
'content.queryError.sortKeyRenamed': msg('Sort key "{key}" is spelled "{replacement}".', '{key} is a retired key name (dir), {replacement} the key that replaced it (direction) — identifiers.'),
|
|
299
|
+
'content.queryError.sortUnknownKey': msg('Sort key "{key}" is not read — a sort is { field, direction? }.', 'The braces are code — the literal shape of a sort; keep them and the key names untranslated.'),
|
|
293
300
|
'content.queryError.limitPositiveInteger': msg('Limit must be a positive integer.'),
|
|
294
301
|
// ─────────────────────────────────────────────────────────────────────────
|
|
295
302
|
// CMS — collection list / view bar / filters / cells
|
|
@@ -441,6 +448,7 @@ const MESSAGES = {
|
|
|
441
448
|
'cms.editor.loadingLiveUrl': msg('Loading the live URL…'),
|
|
442
449
|
'cms.editor.publishToViewLive': msg('Publish to view the live page'),
|
|
443
450
|
'cms.editor.setFrontendUrlHint': msg('Set frontendUrl in elytra.config.ts to enable'),
|
|
451
|
+
'cms.editor.publishedReadFailed': msg('Couldn’t load what is published, so live URLs are unknown: {reason}', 'EC-628: the published-pool read failed (never shown as "not published"); {reason} is the operation’s error sentence.'),
|
|
444
452
|
'cms.editor.switchToDraftToPublish': msg('Switch to Draft to publish'),
|
|
445
453
|
'cms.editor.fixIssuesToPublish.one': msg('Fix {count} issue to publish'),
|
|
446
454
|
'cms.editor.fixIssuesToPublish.other': msg('Fix {count} issues to publish'),
|
|
@@ -510,12 +518,14 @@ const MESSAGES = {
|
|
|
510
518
|
'cms.issue.unpublished-relation-target': msg('Unpublished reference'),
|
|
511
519
|
'cms.issue.cardinality-violation': msg('Wrong number of values'),
|
|
512
520
|
'cms.issue.unknown-asset': msg('Missing asset'),
|
|
521
|
+
'cms.issue.asset-without-url': msg('Asset without a file'),
|
|
522
|
+
'cms.issue.asset-meta-drift': msg('Unused asset translation', 'EC-659: an asset keeps a translated value (e.g. of its alt text) for a field that is no longer translatable — the shared value is shown; the stored translation is kept but not used.'),
|
|
513
523
|
'cms.issue.duplicate-document': msg('Duplicate entry'),
|
|
514
524
|
'cms.issue.unknown-locale': msg('Unknown language'),
|
|
515
525
|
'cms.issue.missing-localized-value': msg('Missing translation'),
|
|
516
526
|
'cms.issue.route-conflict': msg('Conflicting URL'),
|
|
517
527
|
'cms.issue.redirect-loop': msg('Redirect loop'),
|
|
518
|
-
'cms.issue.invalid-redirect': msg('
|
|
528
|
+
'cms.issue.invalid-redirect': msg('Invalid redirect', 'EC-590/EC-628: a duplicate `from`, or a stored redirect that cannot be read (and is not served).'),
|
|
519
529
|
'cms.issue.unknown-route-target': msg('Missing page'),
|
|
520
530
|
'cms.issue.hierarchy-cycle': msg('Page nesting loop'),
|
|
521
531
|
'cms.issue.document-nesting-depth': msg('Content nested too deeply'),
|
|
@@ -597,6 +607,7 @@ const MESSAGES = {
|
|
|
597
607
|
'cms.conflict.empty': msg('(empty)', 'EC-595 A2: {value} when the stored value is empty.'),
|
|
598
608
|
'cms.conflict.structured': msg('a structured value', 'EC-595 A2: {value} when the stored value is not plain text (an object, a list, rich text).'),
|
|
599
609
|
'cms.conflict.cellRefused': msg('This field was changed by someone else since you loaded it — their value is shown.', 'EC-595 A2: a table cell or bulk edit refused because the field changed meanwhile; the stored value is kept.'),
|
|
610
|
+
'cms.conflict.unauthored': msg('A change was not saved: it does not say which version of the document it was made on, so it could overwrite a newer change. Reload the document and make it again.', 'EC-647: a write that names no revision it was authored against is refused, never sent at the newest one (it could silently overwrite a colleague). Shown on the persistence error banner.'),
|
|
600
611
|
'cms.presence.inField': msg('{name} is in this field', 'EC-595 A2 thin presence: another session has this field focused. {name} is their name.'),
|
|
601
612
|
'cms.presence.inFieldMany': msg('{names} are in this field', 'EC-595 A2 thin presence: several sessions have this field focused. {names} is a comma-separated list of names.'),
|
|
602
613
|
'cms.presence.someone': msg('Someone', 'EC-595 A2 thin presence: the name of a present session that carries no name.'),
|
|
@@ -615,7 +626,8 @@ const MESSAGES = {
|
|
|
615
626
|
'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.'),
|
|
616
627
|
'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.'),
|
|
617
628
|
'cms.issueMessage.unfilledSlot': msg('The "{slot}" slot of "{collection}" has no document yet. Assign one so code that resolves "{slot}" finds it.'),
|
|
618
|
-
'cms.issueMessage.reservedFieldName': msg('Field name "{field}" is reserved (the self-describing node discriminator).'),
|
|
629
|
+
'cms.issueMessage.reservedFieldName': msg('Field name "{field}" is reserved (the self-describing node discriminator): a field named "{field}" may only be a select whose options exclude the engine\'s node types (reference, asset, block, elytra/*), and this one is a "{kind}" field.', 'EC-654: {kind} is a field type identifier (text, object, …); the parenthesised list is code — keep it untranslated.'),
|
|
630
|
+
'cms.issueMessage.reservedFieldTypeOption': msg('Select field "{field}" lists the option "{option}", an engine node type — a "{field}" of "{option}" would read as an engine node (reference, asset, block, elytra/*). Rename the option.', 'EC-654: {option} is the option value as declared; the parenthesised list is code — keep it untranslated.'),
|
|
619
631
|
'cms.issueMessage.duplicateSelectOption': msg('Duplicate select option "{option}" on field "{field}".'),
|
|
620
632
|
'cms.issueMessage.duplicateObjectField': msg('Duplicate field "{field}" in object field "{parent}".'),
|
|
621
633
|
'cms.issueMessage.assetCollectionSingleton': msg('Asset collection "{collection}" cannot be a singleton.'),
|
|
@@ -627,6 +639,8 @@ const MESSAGES = {
|
|
|
627
639
|
'cms.issueMessage.routeConflict': msg('Routes "{first}" and "{second}" both match the same URLs (pattern "{pattern}").'),
|
|
628
640
|
'cms.issueMessage.redirectLoop': msg('Redirect chain starting at "{from}" loops (…{chain}).'),
|
|
629
641
|
'cms.issueMessage.duplicateRedirect': msg('Redirect "{redirect}" (from "{redirectFrom}") duplicates redirect "{kept}" (from "{keptFrom}") — both are "{from}" once trailing slashes are ignored. "{kept}" applies; delete or change the other.'),
|
|
642
|
+
'cms.issueMessage.redirectUnreadable': msg('Stored redirect {redirect} could not be read and is not served ({reason}).', 'EC-628 (Codex F04): {redirect} is "id" (or #index), {reason} the column findings in English.'),
|
|
643
|
+
'cms.issueMessage.redirectReportUnreadable': msg("The deployment reported redirect issue #{index}, which this host cannot read — a redirect is not served; run the site on the deployment's engine version.", 'EC-628: the delivery snapshot carried a redirect issue the host (an older engine) cannot parse.'),
|
|
630
644
|
'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.'),
|
|
631
645
|
'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.'),
|
|
632
646
|
'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.'),
|
|
@@ -863,6 +877,9 @@ const MESSAGES = {
|
|
|
863
877
|
'assets.viewToggle.list': msg('List view'),
|
|
864
878
|
'assets.viewToggle.grid': msg('Grid view'),
|
|
865
879
|
'assets.detail.metadataHeading': msg('Metadata'),
|
|
880
|
+
'assets.detail.noFileUrl': msg('This asset has no file to serve — it renders as an empty image everywhere it is used. Replace the file.'),
|
|
881
|
+
'assets.detail.metaDriftNotLocalized': msg('Old translations are stored for {fields}, but the field is no longer translatable — every page shows its shared value. Saving the field removes them.', 'EC-659: {fields} lists field names with the locales holding an old translation, e.g. “alt (de, fr)”.'),
|
|
882
|
+
'assets.detail.metaDriftUndeclared': msg('Translated values are stored for {fields}, which this asset collection does not declare — they are not used anywhere.', 'EC-659: {fields} lists stored field names with their locales, e.g. “caption (de)”.'),
|
|
866
883
|
'assets.references.buttonLabel': msg('References'),
|
|
867
884
|
'assets.references.title': msg('Used by — {name}'),
|
|
868
885
|
'assets.references.description': msg('Everything referencing this asset, with deep links to the exact field or node.'),
|
|
@@ -1369,7 +1386,7 @@ const MESSAGES = {
|
|
|
1369
1386
|
'builder.inspector.unsetWithHint': msg('Not set (default: {hint})', '{hint} is the manifest default shown as a suggestion, e.g. "vertical" or "2".'),
|
|
1370
1387
|
// EC-586 / EC-581 (wave-0092, zone A) — canonical values and the per-FieldType definition
|
|
1371
1388
|
'cms.issueMessage.nonCanonicalValue': msg('Field "{field}" is stored in a non-canonical form for a "{type}" field — it was written past the write path that stores one form per field type. It still reads correctly; saving the document again stores the canonical form.'),
|
|
1372
|
-
'cms.issueMessage.assetHoldsUrl': msg('Asset field "{field}" holds a URL — an asset value is a library asset, never a URL. Upload the image to the library and pick it, or
|
|
1389
|
+
'cms.issueMessage.assetHoldsUrl': msg('Asset field "{field}" holds a URL — an asset value is a library asset, never a URL. Upload the image to the library and pick it, or put an external image’s address in the component’s URL prop (the Image’s “Image URL”).'),
|
|
1373
1390
|
// EC-584 — the AllowList parse (config load / registration).
|
|
1374
1391
|
'cms.issueMessage.emptyAllow': msg('Field "{field}" declares an empty "allow" — a list permits exactly the ids it names, so an empty one permits nothing. Omit "allow" for the type\'s default vocabulary, or list the component ids.'),
|
|
1375
1392
|
'cms.issueMessage.unknownAllowComponent': msg('Field "{field}" allows "{component}", which is not a component of this project — check the id, or remove it from "allow".', '{component} is the component id as declared in the field\'s allow list.'),
|