@elytracms/studio 0.0.104 → 0.0.106

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/components/app-views/module.d.ts +4 -0
  2. package/dist/components/app-views/module.js.map +1 -1
  3. package/dist/components/builder/builder-store.d.ts +19 -3
  4. package/dist/components/builder/builder-store.js +24 -13
  5. package/dist/components/builder/builder-store.js.map +1 -1
  6. package/dist/components/builder/clipboard-actions.js +6 -5
  7. package/dist/components/builder/clipboard-actions.js.map +1 -1
  8. package/dist/components/builder/composition-field-editor.js +4 -2
  9. package/dist/components/builder/composition-field-editor.js.map +1 -1
  10. package/dist/components/cms/document-diff-view.js +43 -7
  11. package/dist/components/cms/document-diff-view.js.map +1 -1
  12. package/dist/components/cms/duplicate-document.js +5 -5
  13. package/dist/components/cms/duplicate-document.js.map +1 -1
  14. package/dist/components/cms/rich-text/editor.d.ts +7 -1
  15. package/dist/components/cms/rich-text/editor.js +9 -4
  16. package/dist/components/cms/rich-text/editor.js.map +1 -1
  17. package/dist/components/cms/rich-text/embed-identity.d.ts +36 -0
  18. package/dist/components/cms/rich-text/embed-identity.js +114 -0
  19. package/dist/components/cms/rich-text/embed-identity.js.map +1 -0
  20. package/dist/components/cms/rich-text/extensions.d.ts +7 -1
  21. package/dist/components/cms/rich-text/extensions.js +7 -1
  22. package/dist/components/cms/rich-text/extensions.js.map +1 -1
  23. package/dist/components/cms/rich-text/insert.d.ts +10 -5
  24. package/dist/components/cms/rich-text/insert.js +10 -12
  25. package/dist/components/cms/rich-text/insert.js.map +1 -1
  26. package/dist/components/components/component-preview.d.ts +0 -2
  27. package/dist/components/components/component-preview.js +0 -4
  28. package/dist/components/components/component-preview.js.map +1 -1
  29. package/dist/components/components/transfer-dialog.js +3 -1
  30. package/dist/components/components/transfer-dialog.js.map +1 -1
  31. package/dist/components/components/transfer.d.ts +12 -8
  32. package/dist/components/components/transfer.js +16 -15
  33. package/dist/components/components/transfer.js.map +1 -1
  34. package/dist/components/redirects/redirects-schema.d.ts +31 -0
  35. package/dist/components/redirects/redirects-schema.js +12 -6
  36. package/dist/components/redirects/redirects-schema.js.map +1 -1
  37. package/dist/lib/ai/translate-document.d.ts +4 -1
  38. package/dist/lib/ai/translate-document.js +87 -47
  39. package/dist/lib/ai/translate-document.js.map +1 -1
  40. package/dist/lib/ai/writer-form.d.ts +48 -5
  41. package/dist/lib/ai/writer-form.js +119 -64
  42. package/dist/lib/ai/writer-form.js.map +1 -1
  43. package/dist/lib/engine-version.d.ts +1 -1
  44. package/dist/lib/engine-version.js +1 -1
  45. package/dist/lib/engine-version.js.map +1 -1
  46. package/dist/lib/i18n/messages.de.js +20 -1
  47. package/dist/lib/i18n/messages.de.js.map +1 -1
  48. package/dist/lib/i18n/messages.en.d.ts +20 -1
  49. package/dist/lib/i18n/messages.en.js +21 -2
  50. package/dist/lib/i18n/messages.en.js.map +1 -1
  51. package/dist/lib/persona/labels.js +2 -0
  52. package/dist/lib/persona/labels.js.map +1 -1
  53. package/dist/lib/registry/preview.d.ts +2 -1
  54. package/dist/lib/registry/preview.js +8 -3
  55. package/dist/lib/registry/preview.js.map +1 -1
  56. package/dist/lib/workspace/index.d.ts +9 -1
  57. package/dist/lib/workspace/index.js +13 -2
  58. package/dist/lib/workspace/index.js.map +1 -1
  59. package/package.json +3 -3
@@ -445,11 +445,13 @@ declare const MESSAGES: {
445
445
  'cms.issue.asset-without-url': import("./types.js").SourceMessage;
446
446
  'cms.issue.asset-meta-drift': import("./types.js").SourceMessage;
447
447
  'cms.issue.duplicate-document': import("./types.js").SourceMessage;
448
+ 'cms.issue.duplicate-node-id': import("./types.js").SourceMessage;
448
449
  'cms.issue.unknown-locale': import("./types.js").SourceMessage;
449
450
  'cms.issue.missing-localized-value': import("./types.js").SourceMessage;
450
451
  'cms.issue.route-conflict': import("./types.js").SourceMessage;
451
452
  'cms.issue.redirect-loop': import("./types.js").SourceMessage;
452
453
  'cms.issue.invalid-redirect': import("./types.js").SourceMessage;
454
+ 'cms.issue.invalid-route': import("./types.js").SourceMessage;
453
455
  'cms.issue.unknown-route-target': import("./types.js").SourceMessage;
454
456
  'cms.issue.hierarchy-cycle': import("./types.js").SourceMessage;
455
457
  'cms.issue.document-nesting-depth': import("./types.js").SourceMessage;
@@ -471,6 +473,7 @@ declare const MESSAGES: {
471
473
  'cms.issueBody.document-nesting-depth.warning': import("./types.js").SourceMessage;
472
474
  'cms.issueBody.hierarchy-cycle': import("./types.js").SourceMessage;
473
475
  'cms.issueMessage.duplicateDocument': import("./types.js").SourceMessage;
476
+ 'cms.issueMessage.duplicateNodeId': import("./types.js").SourceMessage;
474
477
  'cms.issueMessage.fieldDetail': import("./types.js").SourceMessage;
475
478
  'cms.issueMessage.fieldReason': import("./types.js").SourceMessage;
476
479
  'cms.issueMessage.fieldHiddenPredicateThrew': import("./types.js").SourceMessage;
@@ -545,16 +548,26 @@ declare const MESSAGES: {
545
548
  'cms.issueMessage.redirectLoop': import("./types.js").SourceMessage;
546
549
  'cms.issueMessage.duplicateRedirect': import("./types.js").SourceMessage;
547
550
  'cms.issueMessage.redirectFromMalformed': import("./types.js").SourceMessage;
551
+ 'cms.issueMessage.redirectToRefused': import("./types.js").SourceMessage;
552
+ 'cms.issueDetail.redirectToRelative': import("./types.js").SourceMessage;
553
+ 'cms.issueDetail.redirectToOtherHost': import("./types.js").SourceMessage;
554
+ 'cms.issueDetail.redirectToScheme': import("./types.js").SourceMessage;
555
+ 'cms.issueDetail.redirectToNotUrl': import("./types.js").SourceMessage;
556
+ 'cms.issueDetail.redirectToMalformedPercent': import("./types.js").SourceMessage;
557
+ 'cms.issueDetail.redirectToBrokenCharacter': import("./types.js").SourceMessage;
558
+ 'cms.issueDetail.redirectToDotSegment': import("./types.js").SourceMessage;
548
559
  'cms.issueMessage.redirectUnreadable': import("./types.js").SourceMessage;
549
560
  'cms.issueMessage.redirectReportUnreadable': import("./types.js").SourceMessage;
550
561
  'cms.issueMessage.allDynamicShadowsMount': import("./types.js").SourceMessage;
551
562
  'cms.issueMessage.mountCannotServe': import("./types.js").SourceMessage;
552
563
  'cms.issueMessage.routeSegmentNotText': import("./types.js").SourceMessage;
553
564
  'cms.issueMessage.routePatternDelimiter': import("./types.js").SourceMessage;
565
+ 'cms.issueMessage.routeParameterReserved': import("./types.js").SourceMessage;
566
+ 'cms.issueMessage.routeParameterNotIdentity': import("./types.js").SourceMessage;
567
+ 'cms.issueMessage.routeLiteralWithParameter': import("./types.js").SourceMessage;
554
568
  'cms.issueMessage.deadCatchAll': import("./types.js").SourceMessage;
555
569
  'cms.issueMessage.mountConflict': import("./types.js").SourceMessage;
556
570
  'cms.issueMessage.routeBoundDocumentNotFound': import("./types.js").SourceMessage;
557
- 'cms.issueMessage.routeParamNotCaptured': import("./types.js").SourceMessage;
558
571
  'cms.issueMessage.collectionNotDefined': import("./types.js").SourceMessage;
559
572
  'cms.issueMessage.storedDocumentUnreadable': import("./types.js").SourceMessage;
560
573
  'cms.issueMessage.unaddressableLocaleCollision': import("./types.js").SourceMessage;
@@ -841,6 +854,10 @@ declare const MESSAGES: {
841
854
  'redirects.field.to.label': import("./types.js").SourceMessage;
842
855
  'redirects.field.permanent.label': import("./types.js").SourceMessage;
843
856
  'redirects.field.enabled.label': import("./types.js").SourceMessage;
857
+ 'redirects.field.from.description': import("./types.js").SourceMessage;
858
+ 'redirects.field.to.description': import("./types.js").SourceMessage;
859
+ 'redirects.field.permanent.description': import("./types.js").SourceMessage;
860
+ 'redirects.field.enabled.description': import("./types.js").SourceMessage;
844
861
  'references.title': import("./types.js").SourceMessage;
845
862
  'references.hintOutbound': import("./types.js").SourceMessage;
846
863
  'references.emptyOutbound': import("./types.js").SourceMessage;
@@ -1218,6 +1235,7 @@ declare const MESSAGES: {
1218
1235
  'cms.issueMessage.slugNotSegment': import("./types.js").SourceMessage;
1219
1236
  'cms.issueMessage.slugNotAddressable': import("./types.js").SourceMessage;
1220
1237
  'cms.issueMessage.slugNotEncodable': import("./types.js").SourceMessage;
1238
+ 'cms.issueMessage.documentIdNotSegment': import("./types.js").SourceMessage;
1221
1239
  'cms.issueMessage.emptyAllow': import("./types.js").SourceMessage;
1222
1240
  'cms.issueMessage.unknownAllowComponent': import("./types.js").SourceMessage;
1223
1241
  'cms.issueMessage.blocksNotTopLevel': import("./types.js").SourceMessage;
@@ -1235,6 +1253,7 @@ declare const MESSAGES: {
1235
1253
  'cms.issueMessage.boundNotANumber': import("./types.js").SourceMessage;
1236
1254
  'cms.issueMessage.invalidPattern': import("./types.js").SourceMessage;
1237
1255
  'cms.issueMessage.defaultNotOfType': import("./types.js").SourceMessage;
1256
+ 'cms.issueMessage.defaultHoldsComponents': import("./types.js").SourceMessage;
1238
1257
  'cms.issueDetail.fewerPlainTextCharacters': import("./types.js").SourceMessage;
1239
1258
  'cms.issueDetail.morePlainTextCharacters': import("./types.js").SourceMessage;
1240
1259
  'content.queryError.operatorNotForType': import("./types.js").SourceMessage;
@@ -565,11 +565,13 @@ const MESSAGES = {
565
565
  'cms.issue.asset-without-url': msg('Asset without a file'),
566
566
  '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.'),
567
567
  'cms.issue.duplicate-document': msg('Duplicate entry'),
568
+ 'cms.issue.duplicate-node-id': msg('Duplicate component id', 'EC-776: two components in one document share an id — the later one was copied without a new id; publishing is refused until it is inserted again.'),
568
569
  'cms.issue.unknown-locale': msg('Unknown language'),
569
570
  'cms.issue.missing-localized-value': msg('Missing translation'),
570
571
  'cms.issue.route-conflict': msg('Conflicting URL'),
571
572
  'cms.issue.redirect-loop': msg('Redirect loop'),
572
- '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).'),
573
+ 'cms.issue.invalid-redirect': msg('Invalid redirect', 'EC-590/EC-628/EC-771: a duplicate `from`, a stored redirect that cannot be read, or a destination that is not a path or an http(s) URL (the last two are not served).'),
574
+ 'cms.issue.invalid-route': msg('Invalid route', 'EC-770: a route declaration the route gate refuses — it serves nothing (e.g. a pattern holding a ? or a %, a mount no collection can back).'),
573
575
  'cms.issue.unknown-route-target': msg('Missing page'),
574
576
  'cms.issue.hierarchy-cycle': msg('Page nesting loop'),
575
577
  'cms.issue.document-nesting-depth': msg('Content nested too deeply'),
@@ -612,6 +614,7 @@ const MESSAGES = {
612
614
  // `cms.issueDetail.*` are FRAGMENTS spliced into the sentences above.
613
615
  // ─────────────────────────────────────────────────────────────────────────
614
616
  'cms.issueMessage.duplicateDocument': msg('Duplicate document "{id}" in collection "{collection}".'),
617
+ 'cms.issueMessage.duplicateNodeId': msg('Field "{field}": component id "{id}" is already used by another component in this document — every component needs its own id (this one was copied without a new one). Remove it and insert it again to publish; the draft keeps it.'),
615
618
  'cms.issueMessage.fieldDetail': msg('Field "{field}" {detail}.'),
616
619
  'cms.issueMessage.fieldReason': msg('Field "{field}": {reason}'),
617
620
  // EC-598 — a config `hidden` predicate threw. {reason} is the thrown message: author
@@ -691,6 +694,14 @@ const MESSAGES = {
691
694
  'cms.issueMessage.duplicateRedirect': msg('Redirect from "{redirectFrom}" duplicates the redirect from "{keptFrom}" — both are "{from}" once trailing slashes are ignored and percent-encoding is decoded. The redirect from "{keptFrom}" applies; delete or change this one.'),
692
695
  // EC-760 — a redirect `from` that is not a valid percent-encoding matches no request
693
696
  'cms.issueMessage.redirectFromMalformed': msg('Redirect from "{from}" holds a "%" that is not a percent-encoding, so it can match no request and is not served. Write the character itself, or "%25" for a percent sign.'),
697
+ 'cms.issueMessage.redirectToRefused': msg('Redirect from "{from}" is not served: its destination {reason}. A destination is a path on this site starting with "/" (e.g. "/new-page") or a full http:// or https:// URL.', 'EC-771: {reason} is one of the cms.issueDetail.redirectTo* fragments; "/new-page", http:// and https:// are code — keep them as written.'),
698
+ 'cms.issueDetail.redirectToRelative': msg('is neither a path starting with "/" nor a full http:// or https:// URL'),
699
+ 'cms.issueDetail.redirectToOtherHost': msg('starts with "//" or "/\\", which a browser reads as another host'),
700
+ 'cms.issueDetail.redirectToScheme': msg('uses the scheme "{scheme}", and only http:// and https:// are served', 'EC-771: {scheme} is a URL scheme such as javascript: or mailto: (code — never translate it).'),
701
+ 'cms.issueDetail.redirectToNotUrl': msg('is not a valid http:// or https:// URL'),
702
+ 'cms.issueDetail.redirectToMalformedPercent': msg('holds a "%" that is not a percent-encoding (write the character itself, or "%25" for a percent sign)'),
703
+ 'cms.issueDetail.redirectToBrokenCharacter': msg('holds half of a character (a lone UTF-16 surrogate), which no URL can carry'),
704
+ 'cms.issueDetail.redirectToDotSegment': msg('holds a "." or ".." segment, which a browser removes before the request'),
694
705
  '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.'),
695
706
  '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.'),
696
707
  '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.'),
@@ -698,10 +709,12 @@ const MESSAGES = {
698
709
  // EC-760 — the route gate: a static pattern segment is text
699
710
  'cms.issueMessage.routeSegmentNotText': msg('Route "{route}" ("{pattern}") is not served: a pattern segment is not URL text ({segments}). A pattern is written as text — "/über-uns", not "/%C3%BCber-uns" — and its links are encoded, so a "%" is refused; so are a "." or ".." segment (a browser removes it before the request) and half of a character (no URL can carry it). Rewrite the segment.', 'EC-760: {segments} lists the refused pattern segments, each quoted as written in code; "/über-uns" and "/%C3%BCber-uns" are code — keep them as written.'),
700
711
  'cms.issueMessage.routePatternDelimiter': msg('Route "{route}" ("{pattern}") is not served: the pattern holds {delimiters}, which a URL reads as the start of its query or fragment, so the route would end there. A pattern is a path — remove the character.', 'EC-760: {delimiters} is "?" and/or "#", quoted and comma-separated — the characters are code; keep them as written.'),
712
+ 'cms.issueMessage.routeParameterReserved': msg('Route "{route}" ("{pattern}") is not served: a parameter name is reserved ({names}) — every JavaScript object already answers to it (a member of Object.prototype), so a lookup by it finds the inherited member where nothing is held. Rename the parameter.', 'EC-773: {names} lists the reserved parameter names, quoted — JavaScript member names such as __proto__ or constructor; they and Object.prototype are code (never translate them).'),
713
+ 'cms.issueMessage.routeParameterNotIdentity': msg('Route "{route}" ("{pattern}") is not served: its document is found by the parameter ":{identity}" alone, so the pattern must hold exactly that one parameter. Any other parameter is never compared with the document — every value of it would address the same page. Make ":{identity}" the pattern\'s only parameter, or bind no document.', 'EC-772: {identity} is the parameter name the route\'s document id placeholder names (e.g. slug); a pattern and ":{identity}" are code — keep them as written.'),
714
+ 'cms.issueMessage.routeLiteralWithParameter': msg('Route "{route}" ("{pattern}") is not served: it is bound to the one document "{id}", so its pattern may hold no parameter — every value of one would address that same page. Remove the parameter, or bind the document by it (a document id ":name").', 'EC-772: {id} is the document id the route names; ":name" is code — keep it as written.'),
701
715
  '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.'),
702
716
  'cms.issueMessage.mountConflict': msg('{opening} — an exact tie, separated only by declaration order, so "{earlier}" (collection "{earlierCollection}") claims every URL there its own tree resolves, and "{laterCollection}" documents at those URLs are unreachable.'),
703
717
  'cms.issueMessage.routeBoundDocumentNotFound': msg('Route-bound document "{collection}:{id}" was not found.'),
704
- 'cms.issueMessage.routeParamNotCaptured': msg('Route "{route}" binds its document to URL parameter ":{param}", which pattern "{pattern}" does not capture.'),
705
718
  'cms.issueMessage.collectionNotDefined': msg('Collection "{collection}" is not defined.'),
706
719
  'cms.issueMessage.storedDocumentUnreadable': msg('Stored document {document} could not be read and is not delivered ({reason}).', 'EC-585 (Codex F12): {document} is collection:id (or #index), {reason} the schema findings in English.'),
707
720
  '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.'),
@@ -1051,6 +1064,10 @@ const MESSAGES = {
1051
1064
  'redirects.field.to.label': msg('To'),
1052
1065
  'redirects.field.permanent.label': msg('Permanent (301)'),
1053
1066
  'redirects.field.enabled.label': msg('Enabled'),
1067
+ 'redirects.field.from.description': msg("The path to forward, exactly as visitors request it (e.g. /old-page). A language prefix is part of the path, so each language's address needs its own redirect."),
1068
+ 'redirects.field.to.description': msg('A path on this site starting with / (e.g. /new-page), or a full https:// URL.'),
1069
+ 'redirects.field.permanent.description': msg('On: 301 permanent. Off: 302 temporary.'),
1070
+ 'redirects.field.enabled.description': msg('Only enabled redirects are served on the live site.'),
1054
1071
  // ─────────────────────────────────────────────────────────────────────────
1055
1072
  // References panel
1056
1073
  // ─────────────────────────────────────────────────────────────────────────
@@ -1492,6 +1509,7 @@ const MESSAGES = {
1492
1509
  'cms.issueMessage.slugNotAddressable': msg('Slug field "{field}" holds "{value}", which cannot be one URL segment: a browser removes a "." or ".." segment before the request, and a "/" reads as a nested path. No URL is built from it — change the slug.'),
1493
1510
  // EC-761 — a slug the route codec cannot encode at all
1494
1511
  'cms.issueMessage.slugNotEncodable': msg('Slug field "{field}" holds a broken character — half of a character such as an emoji (a lone UTF-16 surrogate), which no URL can carry. No URL is built from it — change the slug.', 'EC-761: the stored slug holds half of a two-part character (what cutting a string in the middle of an emoji yields); the value itself is not shown because half a character cannot be displayed.'),
1512
+ 'cms.issueMessage.documentIdNotSegment': msg('A document id must be usable as one URL segment — not "." or "..", no "/", and no half of a character (a lone UTF-16 surrogate). A route falls back to the id where a document has no slug, and no URL can carry this one. Choose another id.', 'EC-772: refused when a document is created with an explicit id; "." , ".." and "/" are code — keep them as written.'),
1495
1513
  // EC-584 — the AllowList parse (config load / registration).
1496
1514
  '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.'),
1497
1515
  '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.'),
@@ -1511,6 +1529,7 @@ const MESSAGES = {
1511
1529
  'cms.issueMessage.boundNotANumber': msg('Field "{field}" declares {rule} {declared} as a string — the bounds of a "{type}" field are numbers (only a date field takes an ISO date as a bound).'),
1512
1530
  'cms.issueMessage.invalidPattern': msg('Field "{field}" declares the pattern "{pattern}", which is not a valid regular expression.'),
1513
1531
  'cms.issueMessage.defaultNotOfType': msg('Field "{field}" declares a default of {value}, which is not a "{type}" value.'),
1532
+ 'cms.issueMessage.defaultHoldsComponents': msg('Field "{field}" declares a default holding components — every copy of the default would repeat their ids, and a component id is unique within a document. Keep the default to text, and insert components in the editor (or in a seed).'),
1514
1533
  'cms.issueDetail.fewerPlainTextCharacters': msg('has fewer than {min} plain-text characters'),
1515
1534
  'cms.issueDetail.morePlainTextCharacters': msg('has more than {max} plain-text characters'),
1516
1535
  'content.queryError.operatorNotForType': msg('Operator "{operator}" does not apply to "{field}", a "{type}" field.'),