@elytracms/studio 0.0.103 → 0.0.104

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.
@@ -544,10 +544,13 @@ declare const MESSAGES: {
544
544
  'cms.issueMessage.routeConflict': import("./types.js").SourceMessage;
545
545
  'cms.issueMessage.redirectLoop': import("./types.js").SourceMessage;
546
546
  'cms.issueMessage.duplicateRedirect': import("./types.js").SourceMessage;
547
+ 'cms.issueMessage.redirectFromMalformed': import("./types.js").SourceMessage;
547
548
  'cms.issueMessage.redirectUnreadable': import("./types.js").SourceMessage;
548
549
  'cms.issueMessage.redirectReportUnreadable': import("./types.js").SourceMessage;
549
550
  'cms.issueMessage.allDynamicShadowsMount': import("./types.js").SourceMessage;
550
551
  'cms.issueMessage.mountCannotServe': import("./types.js").SourceMessage;
552
+ 'cms.issueMessage.routeSegmentNotText': import("./types.js").SourceMessage;
553
+ 'cms.issueMessage.routePatternDelimiter': import("./types.js").SourceMessage;
551
554
  'cms.issueMessage.deadCatchAll': import("./types.js").SourceMessage;
552
555
  'cms.issueMessage.mountConflict': import("./types.js").SourceMessage;
553
556
  'cms.issueMessage.routeBoundDocumentNotFound': import("./types.js").SourceMessage;
@@ -1214,6 +1217,7 @@ declare const MESSAGES: {
1214
1217
  'cms.issueMessage.assetHoldsUrl': import("./types.js").SourceMessage;
1215
1218
  'cms.issueMessage.slugNotSegment': import("./types.js").SourceMessage;
1216
1219
  'cms.issueMessage.slugNotAddressable': import("./types.js").SourceMessage;
1220
+ 'cms.issueMessage.slugNotEncodable': import("./types.js").SourceMessage;
1217
1221
  'cms.issueMessage.emptyAllow': import("./types.js").SourceMessage;
1218
1222
  'cms.issueMessage.unknownAllowComponent': import("./types.js").SourceMessage;
1219
1223
  'cms.issueMessage.blocksNotTopLevel': import("./types.js").SourceMessage;
@@ -688,11 +688,16 @@ const MESSAGES = {
688
688
  'cms.issueMessage.unknownVersion': msg('No version {version} recorded for document "{id}".'),
689
689
  'cms.issueMessage.routeConflict': msg('Routes "{first}" and "{second}" both match the same URLs (pattern "{pattern}").'),
690
690
  'cms.issueMessage.redirectLoop': msg('Redirect chain starting at "{from}" loops (…{chain}).'),
691
- 'cms.issueMessage.duplicateRedirect': msg('Redirect from "{redirectFrom}" duplicates the redirect from "{keptFrom}" — both are "{from}" once trailing slashes are ignored. The redirect from "{keptFrom}" applies; delete or change this one.'),
691
+ '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
+ // EC-760 — a redirect `from` that is not a valid percent-encoding matches no request
693
+ '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.'),
692
694
  '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.'),
693
695
  '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.'),
694
696
  '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.'),
695
697
  '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.'),
698
+ // EC-760 — the route gate: a static pattern segment is text
699
+ '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
+ '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.'),
696
701
  '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.'),
697
702
  '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.'),
698
703
  'cms.issueMessage.routeBoundDocumentNotFound': msg('Route-bound document "{collection}:{id}" was not found.'),
@@ -1087,7 +1092,7 @@ const MESSAGES = {
1087
1092
  'components.index.byCategory': msg('By category'),
1088
1093
  'components.index.guide.title': msg('Registering & extending components'),
1089
1094
  'components.index.guide.badge': msg('for developers'),
1090
- 'components.index.guide.intro': msg('Components are code, owned by your repo. Register a manifest (prop schemas, defaults, inspector controls, slots, and preview fixtures) and the studio browses, inspects, and previews it. These guides, in the Elytra engine repository’s docs, cover the details:'),
1095
+ 'components.index.guide.intro': msg('Components are code, owned by your repo. Register a manifest (prop schemas, defaults, inspector controls, slots, and preview fixtures) and the studio browses, inspects, and previews it. These chapters of the Elytra guide, which installs with @elytracms/core, cover the details:'),
1091
1096
  'components.index.guide.doc.authoring': msg('How to declare and register a component so the studio can browse, inspect, and preview it.'),
1092
1097
  'components.index.guide.doc.components': msg('The guide’s components chapter: the manifest + implementation pair, registering the list, fixtures, reusable elements, styling.'),
1093
1098
  'components.index.guide.doc.guide': msg('The guide’s overview and chapter index: setup, the config API, delivery, the CLI and environment reference.'),
@@ -1276,9 +1281,9 @@ const MESSAGES = {
1276
1281
  'builder.canvas.insertAfter': msg('Insert block after'),
1277
1282
  'builder.canvas.insertInto': msg('Insert block inside'),
1278
1283
  // Canvas-theme classification notices (EC-414 AD-D) — dev-only, never blocking.
1279
- 'builder.canvasTheme.legacyNotice': msg('This project’s canvas.css still bundles the studio design system with the site theme (the legacy merged shape). Point canvas.css at your site’s own full-Tailwind theme entry instead — see the theming guide (docs/theming.md). Everything keeps working meanwhile.', 'Dev-only migration pointer when the canvas stylesheet is the pre-EC-414 merged build.'),
1284
+ 'builder.canvasTheme.legacyNotice': msg('This project’s canvas.css still bundles the studio design system with the site theme (the legacy merged shape). Point canvas.css at your site’s own full-Tailwind theme entry instead — see the guide’s theming chapter ({guide}). Everything keeps working meanwhile.', 'Dev-only migration pointer when the canvas stylesheet is the pre-EC-414 merged build. {guide} is the theming chapter’s path in the project’s node_modules — keep it verbatim.'),
1280
1285
  'builder.canvasTheme.stylesheetErrorNotice': msg('The canvas stylesheet failed to load — blocks render unstyled. Check the studio’s canvas.css build.'),
1281
- 'builder.canvasTheme.noThemeTokensNotice': msg('The canvas stylesheet defines no theme tokens. Make canvas.css import your site’s full-Tailwind theme entry (see docs/theming.md).'),
1286
+ 'builder.canvasTheme.noThemeTokensNotice': msg('The canvas stylesheet defines no theme tokens. Make canvas.css import your site’s full-Tailwind theme entry (see the guide’s theming chapter, {guide}).', '{guide} is the theming chapter’s path in the project’s node_modules — keep it verbatim.'),
1282
1287
  'builder.canvasTheme.noStylesheetNotice': msg('No canvas stylesheet is configured — blocks render unstyled. The app must supply one via setCanvasStylesheetUrl (the create-elytra template wires this).'),
1283
1288
  // Mixed-sequence honesty notice (EC-549 interim): a blocks value carrying
1284
1289
  // typography items the canvas cannot render yet must SAY so — count + pointer,
@@ -1485,6 +1490,8 @@ const MESSAGES = {
1485
1490
  'cms.issueMessage.slugNotSegment': msg('Slug field "{field}" holds "{value}", which is not a slug by the field\'s slug rule — the rule writes "{slug}" for it. Store the slug the rule writes.'),
1486
1491
  // EC-749 — a slug the route codec cannot carry as one URL segment
1487
1492
  '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
+ // EC-761 — a slug the route codec cannot encode at all
1494
+ '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.'),
1488
1495
  // EC-584 — the AllowList parse (config load / registration).
1489
1496
  '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.'),
1490
1497
  '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.'),