@elytracms/studio 0.0.33 → 0.0.35
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/dist/components/app-views/default-modules.js +13 -6
- package/dist/components/app-views/default-modules.js.map +1 -1
- package/dist/components/cms/cms-store.d.ts +7 -6
- package/dist/components/cms/cms-store.js +30 -10
- package/dist/components/cms/cms-store.js.map +1 -1
- package/dist/components/cms/detail-editor.js +29 -7
- package/dist/components/cms/detail-editor.js.map +1 -1
- package/dist/components/cms/details-pane.js +4 -3
- package/dist/components/cms/details-pane.js.map +1 -1
- package/dist/components/cms/field-renderer.js +2 -1
- package/dist/components/cms/field-renderer.js.map +1 -1
- package/dist/components/cms/import-export.js +3 -2
- package/dist/components/cms/import-export.js.map +1 -1
- package/dist/components/cms/issues-pane.js +3 -2
- package/dist/components/cms/issues-pane.js.map +1 -1
- package/dist/components/redirects/redirects-schema.js +10 -5
- package/dist/components/redirects/redirects-schema.js.map +1 -1
- package/dist/components/users/users-schema.js +7 -4
- package/dist/components/users/users-schema.js.map +1 -1
- package/dist/lib/cms-views/view-model.js +3 -2
- package/dist/lib/cms-views/view-model.js.map +1 -1
- package/dist/lib/i18n/i18n.d.ts +29 -2
- package/dist/lib/i18n/i18n.js +93 -9
- package/dist/lib/i18n/i18n.js.map +1 -1
- package/dist/lib/i18n/index.d.ts +1 -1
- package/dist/lib/i18n/index.js +1 -1
- package/dist/lib/i18n/index.js.map +1 -1
- package/dist/lib/i18n/messages.en.js +38 -0
- package/dist/lib/i18n/messages.en.js.map +1 -1
- package/dist/lib/i18n/types.d.ts +13 -0
- package/dist/lib/i18n/types.js.map +1 -1
- package/dist/lib/references/reference-model.js +6 -4
- package/dist/lib/references/reference-model.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.en.js","sourceRoot":"","sources":["../../../src/lib/i18n/messages.en.ts"],"names":[],"mappings":"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","sourcesContent":["import { msg } from './types'\nimport type { SourceCatalog } from './types'\n\n/**\n * The engine's built-in **English source catalog** (EC-241) — the source of truth\n * and the ultimate fallback for every studio-chrome string. A consumer adds a\n * language via `defineStudio({ i18n: { locales: { de: deMessages } } })`; a key\n * missing from the active locale falls back to the English `message` here, then to\n * the key itself (a visible fallback + a one-time console signal), never a silent\n * blank.\n *\n * Organised by surface. `common.*` holds generic, reused affordances (buttons,\n * status words); every other namespace maps to one studio surface. Values that come\n * from the project's schema/config (field labels, collection names, component\n * manifests) are NOT here — those are `LocalizedString`s resolved by `resolveLabel`\n * (the separate schema-label axis).\n *\n * Scope honesty (EC-241): this covers the studio's **component chrome**. A handful\n * of `lib/*` label helpers (`persona/labels`, `cms-views` operator labels,\n * `auth-errors`, `clipboard` summaries, core `describeAccept`) and the JSX-chip\n * developer boot hints (backend/workspace gates) are a documented follow-up — they\n * need a message-with-elements splitter beyond the plain-string `translate()`.\n */\nexport const EN_MESSAGES: SourceCatalog = {\n // ─────────────────────────────────────────────────────────────────────────\n // Common — generic, reused across surfaces\n // ─────────────────────────────────────────────────────────────────────────\n 'common.save': msg('Save'),\n 'common.saveChanges': msg('Save changes'),\n 'common.cancel': msg('Cancel'),\n 'common.delete': msg('Delete'),\n 'common.remove': msg('Remove'),\n 'common.add': msg('Add'),\n 'common.edit': msg('Edit'),\n 'common.close': msg('Close'),\n 'common.copy': msg('Copy'),\n 'common.duplicate': msg('Duplicate'),\n 'common.select': msg('Select'),\n 'common.clear': msg('Clear'),\n 'common.apply': msg('Apply'),\n 'common.upload': msg('Upload'),\n 'common.retry': msg('Retry'),\n 'common.discard': msg('Discard'),\n 'common.dismiss': msg('Dismiss'),\n 'common.loading': msg('Loading…'),\n 'common.searchPlaceholder': msg('Search…'),\n 'common.none': msg('None'),\n 'common.required': msg('required', 'Badge on a required field/slot — lowercase.'),\n 'common.optional': msg('optional', 'Badge on an optional slot — lowercase.'),\n 'common.yes': msg('Yes'),\n 'common.no': msg('No'),\n 'common.true': msg('true', 'Boolean value display — the literal on-state word.'),\n 'common.false': msg('false', 'Boolean value display — the literal off-state word.'),\n 'common.backendUnreachable': msg('The persistence backend is unreachable.'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Built-in navigation views (the section rail)\n // ─────────────────────────────────────────────────────────────────────────\n 'nav.cms.label': msg('CMS'),\n 'nav.cms.description': msg('Model collections, fields, and documents.'),\n 'nav.components.label': msg('Components'),\n 'nav.components.description': msg('Browse the registry of primitives and project components.'),\n 'nav.redirects.label': msg('Redirects'),\n 'nav.redirects.description': msg('Create and manage URL redirects (301/302) for this site.'),\n 'nav.assets.label': msg('Assets'),\n 'nav.assets.description': msg('Manage uploaded media and metadata.'),\n 'nav.users.label': msg('Users'),\n 'nav.users.description': msg('Manage who has access to this deployment and their role.'),\n 'nav.extensions.label': msg('Extensions'),\n 'nav.extensions.description': msg(\n 'Install components, field types, adapters, and templates from the marketplace.',\n ),\n 'nav.settings.label': msg('Settings'),\n 'nav.settings.description': msg('Configure project metadata and locales.'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Current-user menu (shell header)\n // ─────────────────────────────────────────────────────────────────────────\n 'userMenu.accountMenu': msg('Account menu', 'aria-label on the avatar button that opens the user menu.'),\n 'userMenu.lightMode': msg('Light mode', 'Menu item: switch the studio to the light colour theme.'),\n 'userMenu.darkMode': msg('Dark mode', 'Menu item: switch the studio to the dark colour theme.'),\n 'userMenu.accountSettings': msg('Account settings'),\n 'userMenu.soon': msg('Soon', 'Badge on a feature that is not available yet.'),\n 'userMenu.signOut': msg('Sign out'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Shell — top bar, section rail, boot/error frames, project chrome\n // ─────────────────────────────────────────────────────────────────────────\n 'shell.allProjects': msg('All projects', 'aria-label on the home/logo link in the top bar.'),\n 'shell.breadcrumb.label': msg('Breadcrumb', 'aria-label on the breadcrumb navigation landmark.'),\n 'shell.nav.label': msg('Sections', 'aria-label on the vertical section rail.'),\n 'shell.sidebar.expand': msg('Expand sidebar'),\n 'shell.sidebar.collapse': msg('Collapse sidebar'),\n 'shell.sidebar.collapseLabel': msg('Collapse', 'Verb label beside the collapse icon on the expanded rail.'),\n 'shell.nav.planned': msg('Planned', 'Tooltip on the status dot of a planned (not-yet-enabled) nav view.'),\n 'shell.nav.collapseView': msg('Collapse {name}', 'aria-label on a parent nav item disclosure; {name} is the view label.'),\n 'shell.nav.expandView': msg('Expand {name}', 'aria-label on a parent nav item disclosure; {name} is the view label.'),\n 'shell.nav.issuesCount': msg('{count} sidebar issues', 'aria-label summarising rail customization issues on the collapsed rail.'),\n 'shell.sectionState.empty.title': msg('Nothing here yet'),\n 'shell.sectionState.empty.description': msg('This section has no content for the active project.'),\n 'shell.sectionState.loading.description': msg('Fetching the latest state for this section.'),\n 'shell.sectionState.error.title': msg('Something went wrong'),\n 'shell.sectionState.error.description': msg('This section could not be loaded. Try again in a moment.'),\n 'shell.sectionState.unavailable.title': msg('Not available'),\n 'shell.sectionState.unavailable.description': msg('This section is not available for the active project.'),\n 'shell.sectionState.planned.title': msg('Planned'),\n 'shell.sectionState.planned.description': msg('This surface is planned and not yet enabled for this project.'),\n 'shell.sectionState.badge.empty': msg('empty', 'Status badge on the empty section state — lowercase token.'),\n 'shell.sectionState.badge.loading': msg('loading'),\n 'shell.sectionState.badge.error': msg('error'),\n 'shell.sectionState.badge.unavailable': msg('unavailable'),\n 'shell.sectionState.badge.planned': msg('planned'),\n 'shell.projectNotFound.title': msg('Project not found'),\n 'shell.projectNotFound.body': msg('This project doesn’t exist or was deleted. It may only have existed in this session.'),\n 'shell.backToProjects': msg('Back to projects'),\n 'shell.routeNotFound.title': msg('Page not found'),\n 'shell.routeNotFound.body': msg('This studio URL doesn’t resolve to a section.'),\n 'shell.projectSwitcher.recent': msg('Recent'),\n 'shell.projects': msg('Projects'),\n 'shell.projectSwitcher.browseAll': msg('Browse all projects'),\n 'shell.project.notProvisioned': msg('not provisioned', 'Badge on a configured project with no backend yet.'),\n 'shell.projectList.recent': msg('Recent', 'Section label above recent-project chips (rendered uppercase).'),\n 'shell.projectList.empty.title': msg('No projects'),\n 'shell.projectCard.open': msg('Open project'),\n 'shell.session.loading': msg('Loading project…'),\n 'shell.session.error.title': msg('Couldn’t load this project’s saved state'),\n '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.'),\n 'shell.workspaceGate.title': msg('Workspace config is invalid'),\n 'shell.workspaceGate.issuesLabel': msg('Workspace config issues', 'aria-label on the issues list.'),\n 'shell.backend.connecting': msg('Connecting to backend…'),\n 'shell.backend.notConfigured.title': msg('Backend not configured'),\n 'shell.backend.unavailable.title': msg('Backend unavailable'),\n 'shell.backend.unavailable.body': msg('The configured Convex deployment did not respond. Your data is safe on the backend — the studio will not switch to local storage.'),\n 'shell.backend.retryConnection': msg('Retry connection'),\n 'shell.unsavedChanges.title': msg('Unsaved changes'),\n 'shell.unsavedChanges.body': msg('You have unsaved changes. Save them before leaving, or discard them.'),\n 'shell.unsavedChanges.saving': msg('Saving…'),\n 'shell.devLogin.badge': msg('Dev login'),\n 'shell.playground.badge': msg('Playground', 'Product term — may stay untranslated.'),\n 'shell.playground.hint': msg('Playground mode: data lives in memory on this device and resets on reload. Nothing is saved to a backend.'),\n 'shell.deliveryHealth.dismiss': msg('Dismiss'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Auth / errors\n // ─────────────────────────────────────────────────────────────────────────\n 'auth.signIn': msg('Sign in'),\n 'error.dismiss': msg('Dismiss error', 'aria-label on the error banner dismiss button.'),\n 'error.signedOut': msg('signed out', 'Badge on the session-expired error banner — lowercase token.'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // CMS — collection list / view bar / filters / cells\n // ─────────────────────────────────────────────────────────────────────────\n 'cms.list.new': msg('New', 'Create button on a non-page collection.'),\n 'cms.list.newPage': msg('New page'),\n 'cms.list.newNamed': msg('New {noun}', 'Empty-state create button; {noun} is the singular collection label.'),\n 'cms.list.moreActions': msg('More actions'),\n 'cms.list.import': msg('Import…'),\n 'cms.list.export': msg('Export'),\n 'cms.list.forReview': msg('For review', 'Prefix in the collection-shape-drift banner heading.'),\n 'cms.list.count': msg('{count} {noun}', 'Working-set count; {noun} is the collection singular/plural label (data).'),\n 'cms.list.countFiltered': msg('{visible} of {total} {noun}', 'Working-set count when filters hide rows.'),\n 'cms.list.emptyNone': msg('No {noun} yet.', '{noun} is the plural collection label (data), lowercased.'),\n 'cms.list.emptyFiltered': msg('No documents match the current view’s filters.'),\n 'cms.list.selectAll': msg('Select all documents in view'),\n 'cms.list.selectRow': msg('Select {id}'),\n 'cms.list.column.title': msg('Title'),\n 'cms.list.column.state': msg('State'),\n 'cms.list.column.url': msg('URL'),\n 'cms.list.view.all': msg('All documents', 'Name of the built-in default view.'),\n 'cms.list.unknownCollection': msg('Unknown collection {id}.'),\n 'cms.list.import.noId': msg('(no id)', 'Placeholder id in an import-rejected report.'),\n 'cms.list.display.ariaLabel': msg('Display options'),\n 'cms.list.display.title': msg('Display: layout and columns'),\n 'cms.list.display.layout': msg('Layout'),\n 'cms.list.display.flatList': msg('Flat list'),\n 'cms.list.display.pageHierarchy': msg('Page hierarchy'),\n 'cms.list.display.columns': msg('Columns · first visible is the title'),\n 'cms.list.display.toggleColumn': msg('Toggle column {field}'),\n 'cms.list.display.titleTag': msg('(title)', 'Suffix marking the title column in the column list.'),\n 'cms.list.display.moveColumnUp': msg('Move column {field} up'),\n 'cms.list.display.moveColumnDown': msg('Move column {field} down'),\n 'cms.list.bulk.count': msg('{count} selected'),\n 'cms.list.bulk.publish': msg('Publish'),\n 'cms.list.bulk.unpublish': msg('Unpublish'),\n 'cms.list.bulk.noSettableFields': msg('No filterable scalar fields to set.'),\n 'cms.list.bulk.setField': msg('Set field'),\n 'cms.list.bulk.clearSelection': msg('Clear selection'),\n 'cms.list.bulk.set.set': msg('Set', 'Leading word of the “Set <field> to <value>” composer.'),\n 'cms.list.bulk.set.to': msg('to', 'Connector in the “Set <field> to <value>” composer.'),\n 'cms.list.bulk.set.valueAria': msg('Set value'),\n 'cms.list.bulk.set.apply': msg('Apply to selection'),\n 'cms.list.bulk.report.verb.setField': msg('set {field}', 'Action name spliced into the bulk-report summary.'),\n 'cms.list.bulk.report.verb.publish': msg('publish', 'Lowercase action name spliced into the bulk-report summary.'),\n 'cms.list.bulk.report.verb.unpublish': msg('unpublish'),\n 'cms.list.bulk.report.verb.delete': msg('delete'),\n 'cms.list.bulk.report.summary': msg('Bulk {action}: {succeeded} succeeded'),\n 'cms.list.bulk.report.failedSuffix': msg(', {count} failed'),\n 'cms.list.bulk.report.failedBadge': msg('{count} failed'),\n 'cms.list.bulk.report.done': msg('done'),\n 'cms.list.bulk.error.invalidSetField': msg('Set-field is missing its field/value or the collection schema.'),\n 'cms.filter.button': msg('Filter'),\n 'cms.filter.summaryMultiple': msg('{count} filters', 'Chip summary when more than one clause is active.'),\n 'cms.filter.clearAria': msg('Clear filter'),\n 'cms.filter.refineSession': msg('Refine · this session'),\n 'cms.filter.clearAll': msg('Clear all'),\n 'cms.filter.add': msg('Add filter'),\n 'cms.filter.andHint': msg('all conditions must match (AND)'),\n 'cms.filter.fieldAria': msg('Filter field'),\n 'cms.filter.operatorAria': msg('Filter operator'),\n 'cms.filter.remove': msg('Remove filter'),\n 'cms.filter.valueAria': msg('Filter value'),\n 'cms.filter.valueListPlaceholder': msg('value, value, …'),\n 'cms.filter.state.published': msg('published'),\n 'cms.filter.state.draft': msg('draft'),\n 'cms.cell.fallbackTitle': msg('Showing {source} (fallback) — no {requested} translation yet. Edit to translate.'),\n 'cms.cell.richText': msg('rich text', 'Placeholder for a rich-text cell whose preview is empty.'),\n 'cms.cell.itemCount.one': msg('{count} item'),\n 'cms.cell.itemCount.other': msg('{count} items'),\n 'cms.cell.object': msg('object', 'Placeholder for a single object cell that has a value.'),\n 'cms.cell.blockCount.one': msg('{count} block'),\n 'cms.cell.blockCount.other': msg('{count} blocks'),\n 'cms.cell.createsVariantTitle': msg('Saving creates the {locale} translation of this field.'),\n 'cms.cell.newVariant': msg('new', 'Suffix on the edit-locale badge when a fresh variant will be created.'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // CMS — document detail editor\n // ─────────────────────────────────────────────────────────────────────────\n 'cms.editor.notFoundTitle': msg('Not found'),\n 'cms.editor.backToList': msg('Back to {label}'),\n 'cms.editor.publishFailed': msg('Publish failed.'),\n 'cms.editor.publishFailedReason': msg('Publish failed: {error}'),\n 'cms.editor.saveFailed': msg('Save failed'),\n 'cms.editor.unsavedChanges': msg('Unsaved changes'),\n 'cms.editor.saved': msg('Saved'),\n 'cms.editor.saving': msg('Saving…'),\n 'cms.editor.openLiveUrl': msg('Open {path}'),\n 'cms.editor.viewLive': msg('View live'),\n 'cms.editor.loadingLiveUrl': msg('Loading the live URL…'),\n 'cms.editor.publishToViewLive': msg('Publish to view the live page'),\n 'cms.editor.setFrontendUrlHint': msg('Set frontendUrl in elytra.config.ts to enable'),\n 'cms.editor.switchToDraftToPublish': msg('Switch to Draft to publish'),\n 'cms.editor.fixIssuesToPublish.one': msg('Fix {count} issue to publish'),\n 'cms.editor.fixIssuesToPublish.other': msg('Fix {count} issues to publish'),\n 'cms.editor.publishing': msg('Publishing…'),\n 'cms.editor.publishedState': msg('Published'),\n 'cms.editor.publish': msg('Publish'),\n 'cms.editor.moreActions': msg('More actions'),\n 'cms.editor.unpublish': msg('Unpublish'),\n 'cms.editor.draftState': msg('Draft'),\n 'cms.editor.publishToViewPublished': msg('Publish this document to view its published version'),\n 'cms.editor.publishedReadOnlyBanner': msg('Viewing the published version — read-only.'),\n 'cms.editor.switchToDraft': msg('Switch to Draft'),\n 'cms.editor.loadingPublishedVersion': msg('Loading the published version…'),\n 'cms.editor.noPublishedVersion': msg('No published version found for this document.'),\n 'cms.editor.unsavedChangesGuard': msg('You have unsaved changes to this record. Save them before leaving, or discard them.'),\n 'cms.editor.publishUnpublishedRefsTitle': msg('Publish with unpublished references?'),\n 'cms.editor.publishUnpublishedRefsDescription': msg('This page references content that isn’t published yet — those sections will be empty on the live site until you publish it too.'),\n 'cms.editor.publishAlsoHasIssues.one': msg('This page also has {count} other unresolved issue — see the Issues tab.'),\n 'cms.editor.publishAlsoHasIssues.other': msg('This page also has {count} other unresolved issues — see the Issues tab.'),\n 'cms.editor.publishAnyway': msg('Publish anyway'),\n 'cms.editor.fieldShowingFallback': msg('showing {locale}'),\n 'cms.editor.fieldTranslatedTo': msg('translated to {locale}'),\n 'cms.editor.readOnlyBadge': msg('read-only'),\n 'cms.editor.fieldFallbackHint': msg('Showing the {source} (fallback) value — edit to translate to {locale}. Clearing the {locale} text falls back again.'),\n 'cms.editor.issuesPane': msg('Issues'),\n 'cms.editor.detailsPane': msg('Details'),\n 'cms.editor.servedAt': msg('Served at {path}'),\n 'cms.editor.slugUrlHint': msg('The URL is derived from the slug (and parent) — set a slug to define it.'),\n 'cms.editor.embedUnpublishedIssue': msg('Embeds the reusable “{title}”, which isn’t published — it will be empty on the live site until you publish it.'),\n 'cms.editor.embedMissingIssue': msg('Embeds a reusable that no longer exists (“{id}”) — fix or remove the embed.'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // CMS — versions (compare + pane)\n // ─────────────────────────────────────────────────────────────────────────\n 'cms.version.paneLabel': msg('Versions'),\n 'cms.version.compare': msg('Compare'),\n 'cms.version.closeCompare': msg('Close compare'),\n 'cms.version.loadingHistory': msg('Loading version history…'),\n 'cms.version.versionUnavailable': msg('That version is no longer available. Pick another to compare.'),\n 'cms.version.currentDraft': msg('Current draft'),\n 'cms.version.unsavedEdits': msg('unsaved edits'),\n 'cms.version.baseCaption': msg('Base'),\n 'cms.version.compareWithCaption': msg('Compare with'),\n 'cms.version.compareNewer': msg('Compare a newer version'),\n 'cms.version.compareOlder': msg('Compare an older version'),\n 'cms.version.restoreWholeTitle': msg('Restore the whole document to v{version}'),\n 'cms.version.restoreVersion': msg('Restore version'),\n 'cms.version.noDifferences': msg('No differences'),\n 'cms.version.changeSummary.one': msg('{count} change · {unchanged} unchanged'),\n 'cms.version.changeSummary.other': msg('{count} changes · {unchanged} unchanged'),\n 'cms.version.comparingPastVersionsHint': msg(' · comparing two past versions — set “Compare with” to Current draft to restore'),\n 'cms.version.versionsIdentical': msg('These two versions are identical.'),\n 'cms.version.beforeVersion': msg('Before · v{version}'),\n 'cms.version.afterTarget': msg('After · {target}'),\n 'cms.version.restoreField': msg('Restore {field}'),\n 'cms.version.restoreFieldLocale': msg('Restore {field} ({locale})'),\n 'cms.version.textUnchanged': msg('Text unchanged — formatting or whitespace differs.'),\n 'cms.version.contentChanged': msg('Content changed.'),\n 'cms.version.restoreBlock': msg('Restore this block'),\n 'cms.version.nestedContentChanged': msg('Nested content changed.'),\n 'cms.version.blockAdded': msg('Block added.'),\n 'cms.version.blockRemoved': msg('Block removed.'),\n 'cms.version.emptyValue': msg('empty'),\n 'cms.version.richText': msg('rich text'),\n 'cms.version.itemCount.one': msg('{count} item'),\n 'cms.version.itemCount.other': msg('{count} items'),\n 'cms.version.objectValue': msg('object'),\n 'cms.version.kindNew': msg('new'),\n 'cms.version.kindRemoved': msg('removed'),\n 'cms.version.unpublishedChanges': msg('Unpublished changes'),\n 'cms.version.notPublishedYet': msg('Not published yet'),\n 'cms.version.fixValidationToPublish': msg('Fix the document’s validation issues to publish'),\n 'cms.version.liveUpToDate': msg('The live version is up to date — nothing to publish.'),\n 'cms.version.comparingHint': msg('Comparing v{base} → {target}. Click a version to set it as the base.'),\n 'cms.version.noVersionsYet': msg('No published versions yet.'),\n 'cms.version.baseBadge': msg('Base'),\n 'cms.version.comparedBadge': msg('Compared'),\n 'cms.version.compareWithDraft': msg('Compare this version with the current draft'),\n 'cms.version.compareVersionLabel': msg('Compare v{version}'),\n 'cms.version.switchToDraftToRestore': msg('Switch to Draft to restore'),\n 'cms.version.restore': msg('Restore'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // CMS — delete/unpublish reference-confirm dialog\n // ─────────────────────────────────────────────────────────────────────────\n 'cms.reference.documentCount': msg('{count} documents'),\n 'cms.reference.confirmTitle': msg('{action} {subject}?'),\n 'cms.reference.checking': msg('Checking inbound references…'),\n 'cms.reference.checkUnavailable': msg('Inbound references could not be checked — the reference index is unreachable.'),\n 'cms.reference.blocked.one': msg('Blocked: {count} strict reference prevents this. Remove the references below first.'),\n 'cms.reference.blocked.other': msg('Blocked: {count} strict references prevent this. Remove the references below first.'),\n 'cms.reference.notReferenced': msg('Not referenced anywhere.'),\n 'cms.reference.permanentDelete.one': msg('This permanently deletes the document.'),\n 'cms.reference.permanentDelete.other': msg('This permanently deletes the {count} selected documents.'),\n 'cms.reference.canProceed': msg('You can {action} — {summary} will show a fallback until fixed. Each one becomes a visible validation issue.'),\n 'cms.reference.proceedUnavailable': msg('Proceeding is allowed, but affected places cannot be listed right now.'),\n 'cms.reference.proceedAnyway': msg('{action} anyway'),\n 'cms.reference.verb.unpublish': msg('unpublish', 'Lowercase verb spliced into “You can {action} …”.'),\n 'cms.reference.verb.delete': msg('delete'),\n 'cms.reference.placeCount.one': msg('{count} place'),\n 'cms.reference.placeCount.other': msg('{count} places'),\n 'cms.reference.bulkSummary': msg('{count} documents are affected; {places}'),\n 'cms.reference.atLocation': msg('at', 'Connector before a field/location deep-link in an impact row.'),\n 'cms.reference.strictBadge': msg('strict'),\n 'cms.reference.draftBadge': msg('draft'),\n 'cms.reference.publishedBadge': msg('published'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // CMS — field controls / scalar editor\n // ─────────────────────────────────────────────────────────────────────────\n 'cms.field.rendererCrashed': msg('Custom renderer crashed — showing the built-in control.'),\n 'cms.field.noRenderer': msg('No field renderer registered for control “{control}”.'),\n 'cms.field.itemActions': msg('Item actions'),\n 'cms.field.moveUp': msg('Move up'),\n 'cms.field.moveDown': msg('Move down'),\n 'cms.field.collapseAll': msg('Collapse all'),\n 'cms.field.expandAll': msg('Expand all'),\n 'cms.field.noItems': msg('No items'),\n 'cms.field.dragToReorder': msg('Drag to reorder'),\n 'cms.field.addItem': msg('Add item'),\n 'cms.field.value': msg('Value', 'Default aria-label for the scalar value editor.'),\n 'cms.field.valuePlaceholder': msg('value'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // CMS — relation picker\n // ─────────────────────────────────────────────────────────────────────────\n 'cms.relation.change': msg('Change'),\n 'cms.relation.openTitle': msg('Open {title}'),\n 'cms.relation.pick': msg('Pick'),\n 'cms.relation.pickTitle.one': msg('Pick a related document'),\n 'cms.relation.pickTitle.many': msg('Pick related document'),\n 'cms.relation.fromCollection': msg('From {collection}'),\n 'cms.relation.selectMultipleHint': msg('select multiple'),\n 'cms.relation.noDocuments': msg('No documents in {collection}.'),\n 'cms.relation.selectedCount': msg('{count} selected'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // CMS — asset field + asset picker\n // ─────────────────────────────────────────────────────────────────────────\n 'cms.asset.rejected.one': msg('“{name}” skipped — only {types} allowed here.'),\n 'cms.asset.rejected.other': msg('{count} files skipped — only {types} allowed here.'),\n 'cms.asset.dropToUpload': msg('Drop to upload'),\n 'cms.asset.selectOrDrop': msg('Select or drop an image'),\n 'cms.asset.selectAsset': msg('Select an asset'),\n 'cms.asset.altLabel': msg('Alt:', 'Inline label prefixing an image’s alt text.'),\n 'cms.asset.notSet': msg('not set'),\n 'cms.asset.imageOptions.title': msg('Image options'),\n 'cms.asset.imageOptions.description': msg('Focal point and metadata — shared across every use of this image.'),\n 'cms.asset.focalPoint': msg('Focal point'),\n 'cms.asset.resetToCentre': msg('Reset to centre'),\n 'cms.asset.focalPointHint': msg('Click or drag on the image to set the focal point used when it’s cropped.'),\n 'cms.asset.noMetaFields': msg('No editable metadata fields are declared on the asset collection. Add fields (e.g. {code1}, {code2}) to it in code.'),\n 'cms.asset.pickTitle': msg('Pick an asset'),\n 'cms.asset.pickDescription': msg('Select from the project’s asset library.'),\n 'cms.asset.noProject': msg('The asset library needs a project — this CMS session has none.'),\n 'cms.asset.restoreDialogSize': msg('Restore dialog size'),\n 'cms.asset.maximizeDialog': msg('Maximize dialog'),\n 'cms.asset.searchPlaceholder': msg('Search assets…'),\n 'cms.asset.loading': msg('Loading assets…'),\n 'cms.asset.loadError': msg('Assets failed to load.'),\n 'cms.asset.noMatches': msg('No assets match your search.'),\n 'cms.asset.empty': msg('No assets yet — drop files here or use Upload.'),\n 'cms.asset.noAltText': msg('No alt text'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Assets library (section)\n // ─────────────────────────────────────────────────────────────────────────\n 'assets.title': msg('Assets'),\n 'assets.error.loadFailed': msg('Assets failed to load'),\n 'assets.loading': msg('Loading assets…'),\n 'assets.searchPlaceholder': msg('Search assets…'),\n 'assets.searchLabel': msg('Search assets'),\n 'assets.searchEmpty': msg('No assets match your search.'),\n 'assets.dropHint': msg('Drop files anywhere to upload, or use the Upload button.'),\n 'assets.uploads.heading': msg('Uploads'),\n 'assets.upload.phase.queued': msg('queued'),\n 'assets.upload.phase.preparing': msg('preparing'),\n 'assets.upload.phase.uploading': msg('uploading'),\n 'assets.upload.phase.confirming': msg('saving metadata'),\n 'assets.upload.phase.done': msg('done'),\n 'assets.upload.phase.failed': msg('failed'),\n 'assets.upload.attempt': msg('attempt {count}'),\n 'assets.upload.dismissLabel': msg('Dismiss upload'),\n 'assets.card.altPrefix': msg('Alt: {alt}'),\n 'assets.card.noAlt': msg('No alt text'),\n 'assets.card.referencesLabel': msg('References of {filename}'),\n 'assets.card.editLabel': msg('Edit {filename}'),\n 'assets.references.title': msg('Used by — {name}'),\n 'assets.references.description': msg('Everything referencing this asset, with deep links to the exact field or node.'),\n 'assets.edit.title': msg('Edit {filename}'),\n 'assets.edit.description': msg('Alt text flows through the delivery shape into rendered markup; the title is the library display name.'),\n 'assets.edit.altLabel': msg('Alt text'),\n 'assets.edit.altPlaceholder': msg('Describe the image…'),\n 'assets.edit.titleLabel': msg('Title'),\n 'assets.delete.raceError.one': msg('Asset is now referenced in {count} place — reopen to review.'),\n 'assets.delete.raceError.other': msg('Asset is now referenced in {count} places — reopen to review.'),\n 'assets.delete.title': msg('Delete {filename}?'),\n 'assets.delete.description': msg('Removes the stored bytes and the metadata record. This cannot be undone.'),\n 'assets.delete.checking': msg('Checking references…'),\n 'assets.delete.inUse.one': msg('In use in {count} place'),\n 'assets.delete.inUse.other': msg('In use in {count} places'),\n 'assets.delete.brokenWarning': msg('Deleting will leave these references broken — they will surface as validation issues.'),\n 'assets.delete.noReferences': msg('No references found. Safe to delete.'),\n 'assets.delete.confirmAnyway': msg('Delete anyway'),\n 'assets.focalPoint.noPreview': msg('No image preview — upload or pick an image asset to set a focal point.'),\n 'assets.focalPoint.setLabel': msg('Set focal point'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Users (section)\n // ─────────────────────────────────────────────────────────────────────────\n 'users.checkingAccess': msg('Checking access…'),\n 'users.restrictedTitle': msg('Admins only'),\n 'users.restrictedBody': msg('Managing users and roles requires the admin role on this deployment. Ask an admin to grant you access.'),\n 'users.loadFailed': msg('Users failed to load'),\n 'users.loading': msg('Loading users…'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Redirects (section)\n // ─────────────────────────────────────────────────────────────────────────\n 'redirects.loadFailed': msg('Redirects failed to load'),\n 'redirects.loading': msg('Loading redirects…'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // References panel\n // ─────────────────────────────────────────────────────────────────────────\n 'references.title': msg('References'),\n 'references.hintOutbound': msg('What this entry points at — click to jump to the target, or to the exact field.'),\n 'references.emptyOutbound': msg('No outbound references.'),\n 'references.usedBy': msg('Used by'),\n 'references.hintInbound': msg('Everything referencing this entry — click to jump to the exact field or node.'),\n 'references.emptyInbound': msg('Not referenced anywhere.'),\n 'references.loading': msg('Loading references…'),\n 'references.loadFailed': msg('References failed to load'),\n 'references.indexUnreachable': msg('The reference index is unreachable.'),\n 'references.sectionLoadError': msg('Couldn’t load this section: {error}'),\n 'references.locationPrefix': msg('at', 'Prefix before a reference’s location label.'),\n 'references.badgeDraft': msg('draft'),\n 'references.badgePublished': msg('published'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Components registry browser\n // ─────────────────────────────────────────────────────────────────────────\n 'components.detail.notFound.title': msg('Component not found'),\n 'components.detail.notFound.body': msg('No component is registered with id {id}.'),\n 'components.detail.notFound.back': msg('Back to components'),\n 'components.detail.allComponents': msg('All components'),\n 'components.detail.designTokens': msg('DESIGN TOKENS'),\n 'components.status.valid': msg('valid'),\n 'components.status.incompatible': msg('incompatible'),\n 'components.status.invalid': msg('invalid'),\n 'components.status.aria': msg('Status: {status}'),\n 'components.status.description.valid': msg('Manifest is registered and an implementation is wired up.'),\n 'components.status.description.incompatible': msg('Manifest is registered but no implementation is available — the renderer will show a fallback.'),\n 'components.status.description.invalid': msg('The registry reported a structured issue for this component.'),\n 'components.index.title': msg('Component registry'),\n 'components.index.subtitle': msg('Browse the platform primitives and this project’s components. Select one to inspect its manifest, fields, and preview fixtures.'),\n 'components.index.stat.total': msg('Components'),\n 'components.index.stat.totalHint': msg('{primitives} primitives · {projects} project'),\n 'components.index.stat.valid': msg('Valid'),\n 'components.index.stat.needAttention': msg('Need attention'),\n 'components.index.stat.needAttentionHint': msg('{incompatible} incompatible · {invalid} invalid'),\n 'components.index.pickHint': msg('Pick a component from the list to open its detail view — manifest metadata, the prop & slot inspector, and the visual fixture runner.'),\n 'components.index.guide.title': msg('Registering project components'),\n 'components.index.guide.badge': msg('guide'),\n 'components.index.guide.fullGuide': msg('Full guide: {path}'),\n 'components.fieldInspector.props': msg('Props'),\n 'components.fieldInspector.noProps': msg('This component declares no editable props.'),\n 'components.fieldInspector.slots': msg('Slots'),\n 'components.fieldInspector.noSlots': msg('This component has no slots.'),\n 'components.fieldInspector.inline': msg('inline'),\n 'components.fieldInspector.default': msg('default'),\n 'components.fieldInspector.allows': msg('allows'),\n 'components.fixtureRunner.preview': msg('Preview'),\n 'components.fixtureRunner.stateCount.one': msg('{count} state'),\n 'components.fixtureRunner.stateCount.other': msg('{count} states'),\n 'components.fixtureRunner.statesAria': msg('Fixture states'),\n 'components.browser.searchPlaceholder': msg('Search components…'),\n 'components.browser.searchAria': msg('Search components'),\n 'components.browser.namespaceAria': msg('Filter by namespace'),\n 'components.browser.all': msg('All'),\n 'components.browser.primitives': msg('Primitives'),\n 'components.browser.project': msg('Project'),\n 'components.browser.noMatchQuery': msg('No components match “{query}”.'),\n 'components.browser.noMatchFilters': msg('No components match the selected filters.'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Extensions (marketplace)\n // ─────────────────────────────────────────────────────────────────────────\n 'extensions.tab.marketplace': msg('Marketplace'),\n 'extensions.tab.installed': msg('Installed'),\n 'extensions.tab.registered': msg('Registered'),\n 'extensions.header.title': msg('Extensibility'),\n 'extensions.header.subtitle': msg('Components · field types · data sources · asset storage · export targets · templates · hooks'),\n 'extensions.search.placeholder': msg('Search extensions…'),\n 'extensions.search.aria': msg('Search extensions'),\n 'extensions.token.placeholder': msg('Private registry token'),\n 'extensions.token.unlocked': msg('unlocked'),\n 'extensions.empty.noMatch.title': msg('No extensions match'),\n 'extensions.empty.noMatch.body': msg('Try a different search term.'),\n 'extensions.listing.private': msg('private'),\n 'extensions.listing.noDescription': msg('No description provided.'),\n 'extensions.listing.unknownAuthor': msg('Unknown author'),\n 'extensions.action.installed': msg('Installed'),\n 'extensions.action.install': msg('Install'),\n 'extensions.error.accessDenied': msg('Access denied — a valid token is required.'),\n 'extensions.error.installFailed': msg('Installation failed.'),\n 'extensions.empty.installed.title': msg('Nothing installed yet'),\n 'extensions.empty.installed.body': msg('Install an extension from the marketplace to see what it contributes here.'),\n 'extensions.contrib.components': msg('components'),\n 'extensions.contrib.fieldTypes': msg('field types'),\n 'extensions.contrib.dataSources': msg('data sources'),\n 'extensions.contrib.assetStorage': msg('asset storage'),\n 'extensions.contrib.exportTargets': msg('export targets'),\n 'extensions.contrib.templates': msg('templates'),\n 'extensions.contrib.hooks': msg('hooks'),\n 'extensions.registered.intro': msg('Live registries on the plugin host. Built-in capabilities are always present; installing an extension adds to them.'),\n 'extensions.registered.components.title': msg('Components'),\n 'extensions.registered.components.empty': msg('No project components registered.'),\n 'extensions.registered.fieldTypes.title': msg('Field types'),\n 'extensions.registered.dataSources.title': msg('Data source kinds'),\n 'extensions.registered.assetStorage.title': msg('Asset storage backends'),\n 'extensions.registered.assetStorage.empty': msg('No storage adapters installed.'),\n 'extensions.registered.exportTargets.title': msg('Export targets'),\n 'extensions.registered.hookPoints.title': msg('Hook points'),\n 'extensions.kind.plugin': msg('plugin'),\n 'extensions.kind.componentPackage': msg('components'),\n 'extensions.kind.fieldType': msg('field type'),\n 'extensions.kind.dataSource': msg('data source'),\n 'extensions.kind.assetStorage': msg('asset storage'),\n 'extensions.kind.exportTarget': msg('export target'),\n 'extensions.kind.template': msg('template'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Settings\n // ─────────────────────────────────────────────────────────────────────────\n 'settings.identity.title': msg('Identity'),\n 'settings.identity.name': msg('Name'),\n 'settings.identity.urlKey': msg('URL key'),\n 'settings.locales.title': msg('Locales'),\n 'settings.locales.configuredCount': msg('{count} configured'),\n 'settings.locales.configured': msg('Configured locales'),\n 'settings.locales.defaultSuffix': msg(' · default'),\n 'settings.environments.title': msg('Environments & export'),\n 'settings.environments.label': msg('Environments'),\n 'settings.exportTarget': msg('Export target'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // App-views shell\n // ─────────────────────────────────────────────────────────────────────────\n 'appViews.singleton.opening': msg('Opening {label}…'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Builder / canvas\n // ─────────────────────────────────────────────────────────────────────────\n 'builder.blocksPanel.title': msg('Insert block'),\n 'builder.blocksPanel.addsInto': msg('Adds into {destination}.'),\n 'builder.blocksPanel.searchPlaceholder': msg('Search blocks…'),\n 'builder.blocksPanel.searchAria': msg('Search blocks'),\n 'builder.blocksPanel.layoutHelpers': msg('layout helpers'),\n 'builder.blocksPanel.noAllowed': msg('No allowed components match.'),\n 'builder.blocksPanel.noMatch': msg('No components match “{query}”.'),\n 'builder.blocksPanel.insertTileAria': msg('Insert {title} — {variant}'),\n 'builder.blocksPanel.copyExactAria': msg('Copy exact configuration — {title} ({variant})'),\n 'builder.blocksPanel.copyExactConfiguration': msg('Copy exact configuration'),\n 'builder.blocksPanel.previewFailed': msg('Preview failed: {error}'),\n 'builder.pageTree.title': msg('Page tree'),\n 'builder.pageTree.hiddenByCondition': msg('Hidden by condition'),\n 'builder.pageTree.conditional': msg('Conditional'),\n 'builder.pageTree.addChild': msg('Add child'),\n 'builder.pageTree.moreActions': msg('More actions'),\n 'builder.pageTree.moveUp': msg('Move up'),\n 'builder.pageTree.moveDown': msg('Move down'),\n 'builder.clipboard.paste': msg('Paste'),\n 'builder.clipboard.cut': msg('Cut'),\n 'builder.clipboard.writeError': msg('Could not write to the clipboard: {detail}'),\n 'builder.clipboard.rootCannotBeCut': msg('The page root cannot be cut.'),\n 'builder.clipboard.copied': msg('Copied {label}'),\n 'builder.clipboard.cutNotice': msg('Cut {label}'),\n 'builder.clipboard.pastedInto': msg('{summary} · into {destination}'),\n 'builder.clipboard.issueComponent': msg('component'),\n 'builder.clipboard.issueBinding': msg('binding'),\n 'builder.reuse.makeReusable': msg('Make reusable'),\n 'builder.reuse.detachToCopy': msg('Detach to copy'),\n 'builder.reuse.defaultElementName': msg('Reusable element'),\n 'builder.reuse.madeReusablePublished': msg('Made “{name}” reusable and published it.'),\n 'builder.reuse.madeReusablePublishFailed': msg('Made “{name}” reusable, but publishing failed — publish it from its document.'),\n 'builder.reuse.madeReusableDraft': msg('Made “{name}” reusable (draft) — publish it to show on live pages.'),\n 'builder.reuse.noTargetToDetach': msg('This element has no target to detach.'),\n 'builder.reuse.noContentToDetach': msg('The referenced element has no content to detach.'),\n 'builder.reuse.detachedToCopy': msg('Detached to an editable copy — the live link is broken.'),\n 'builder.reuse.makeReusableDescription': msg('Moves the selected block into a new reusable element and embeds it here. The same element can then be embedded on any page. Publish it now to keep the section visible everywhere, or save it as a draft to keep editing first.'),\n 'builder.reuse.nameLabel': msg('Name'),\n 'builder.reuse.namePlaceholder': msg('Reservation CTA', 'Example placeholder in the reusable-name input.'),\n 'builder.reuse.saveDraft': msg('Save Draft'),\n 'builder.reuse.publish': msg('Publish'),\n 'builder.inspector.emptySelection': msg('Select a node in the tree or canvas to edit its properties.'),\n 'builder.inspector.title': msg('Inspector'),\n 'builder.inspector.unknownComponent': msg('unknown component'),\n 'builder.inspector.noManifest': msg('No manifest is registered for this component, so its props can’t be edited.'),\n 'builder.inspector.props': msg('Props'),\n 'builder.inspector.noEditableProps': msg('No editable props.'),\n 'builder.inspector.slots': msg('Slots'),\n 'builder.inspector.slotsHint': msg('Add or reorder slot children from the page tree.'),\n 'builder.inspector.propertiesPane': msg('Properties'),\n 'builder.inspector.invalidValue': msg('Value doesn’t match the prop schema — the canvas falls back to the default.'),\n 'builder.inspector.invalidJson': msg('Invalid JSON'),\n 'builder.layout.title': msg('Layout'),\n 'builder.layout.direction': msg('Direction'),\n 'builder.layout.vertical': msg('Vertical'),\n 'builder.layout.horizontal': msg('Horizontal'),\n 'builder.layout.columns': msg('Columns'),\n 'builder.layout.columnCount.one': msg('{count} column'),\n 'builder.layout.columnCount.other': msg('{count} columns'),\n 'builder.layout.gap': msg('Gap'),\n 'builder.layout.alignment': msg('Alignment'),\n 'builder.layout.onPhones': msg('On phones'),\n 'builder.layout.stack': msg('Stack'),\n 'builder.layout.keepColumns': msg('Keep columns'),\n 'builder.layout.gapStep.hairline': msg('Hairline'),\n 'builder.layout.gapStep.extraSmall': msg('Extra small'),\n 'builder.layout.gapStep.small': msg('Small'),\n 'builder.layout.gapStep.medium': msg('Medium'),\n 'builder.layout.gapStep.large': msg('Large'),\n 'builder.layout.gapStep.extraLarge': msg('Extra large'),\n 'builder.layout.gapStep.huge': msg('Huge'),\n 'builder.layout.align.start': msg('Start'),\n 'builder.layout.align.center': msg('Center'),\n 'builder.layout.align.end': msg('End'),\n 'builder.layout.align.stretch': msg('Stretch'),\n 'builder.canvas.pagePreview': msg('Page preview'),\n 'builder.canvas.reusableUnpublishedTitle': msg('This reusable element isn’t published yet'),\n 'builder.canvas.reusableMissingTitle': msg('This reusable element is missing'),\n 'builder.canvas.reusableUnpublishedHint': msg('Publish it to show it here and on live pages — or open it from the Properties panel to keep editing.'),\n 'builder.canvas.reusableMissingHint': msg('Open the embed’s “Element” in the Properties panel to fix the reference.'),\n 'builder.canvas.viewportPreviewAria': msg('{label} preview'),\n 'builder.canvas.viewportWidthTitle': msg('{label} width'),\n 'builder.canvas.breakpointsIssueLabel': msg('breakpoints'),\n 'builder.canvas.undo': msg('Undo'),\n 'builder.canvas.redo': msg('Redo'),\n 'builder.canvas.insert': msg('Insert'),\n 'builder.spacing.gapAfterChild': msg('Gap after child {index}'),\n 'builder.richText.toolbarLabel': msg('Text formatting'),\n 'builder.richText.linkPlaceholder': msg('https://… (empty removes)'),\n 'builder.richText.linkUrl': msg('Link URL'),\n 'builder.richText.set': msg('Set'),\n 'builder.richText.applyLink': msg('Apply link'),\n 'builder.richText.bold': msg('Bold'),\n 'builder.richText.italic': msg('Italic'),\n 'builder.richText.link': msg('Link'),\n 'builder.richText.removeLink': msg('Remove link'),\n 'builder.richText.unlink': msg('Unlink'),\n}\n"]}
|
|
1
|
+
{"version":3,"file":"messages.en.js","sourceRoot":"","sources":["../../../src/lib/i18n/messages.en.ts"],"names":[],"mappings":"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","sourcesContent":["import { msg } from './types'\nimport type { SourceCatalog } from './types'\n\n/**\n * The engine's built-in **English source catalog** (EC-241) — the source of truth\n * and the ultimate fallback for every studio-chrome string. A consumer adds a\n * language via `defineStudio({ i18n: { locales: { de: deMessages } } })`; a key\n * missing from the active locale falls back to the English `message` here, then to\n * the key itself (a visible fallback + a one-time console signal), never a silent\n * blank.\n *\n * Organised by surface. `common.*` holds generic, reused affordances (buttons,\n * status words); every other namespace maps to one studio surface. Values that come\n * from the project's schema/config (field labels, collection names, component\n * manifests) are NOT here — those are `LocalizedString`s resolved by `resolveLabel`\n * (the separate schema-label axis).\n *\n * Scope honesty (EC-241): this covers the studio's **component chrome**. A handful\n * of `lib/*` label helpers (`persona/labels`, `cms-views` operator labels,\n * `auth-errors`, `clipboard` summaries, core `describeAccept`) and the JSX-chip\n * developer boot hints (backend/workspace gates) are a documented follow-up — they\n * need a message-with-elements splitter beyond the plain-string `translate()`.\n */\nexport const EN_MESSAGES: SourceCatalog = {\n // ─────────────────────────────────────────────────────────────────────────\n // Common — generic, reused across surfaces\n // ─────────────────────────────────────────────────────────────────────────\n 'common.save': msg('Save'),\n 'common.saveChanges': msg('Save changes'),\n 'common.cancel': msg('Cancel'),\n 'common.delete': msg('Delete'),\n 'common.remove': msg('Remove'),\n 'common.add': msg('Add'),\n 'common.edit': msg('Edit'),\n 'common.close': msg('Close'),\n 'common.copy': msg('Copy'),\n 'common.duplicate': msg('Duplicate'),\n 'common.select': msg('Select'),\n 'common.clear': msg('Clear'),\n 'common.apply': msg('Apply'),\n 'common.upload': msg('Upload'),\n 'common.retry': msg('Retry'),\n 'common.discard': msg('Discard'),\n 'common.dismiss': msg('Dismiss'),\n 'common.loading': msg('Loading…'),\n 'common.searchPlaceholder': msg('Search…'),\n 'common.none': msg('None'),\n 'common.required': msg('required', 'Badge on a required field/slot — lowercase.'),\n 'common.optional': msg('optional', 'Badge on an optional slot — lowercase.'),\n 'common.yes': msg('Yes'),\n 'common.no': msg('No'),\n 'common.true': msg('true', 'Boolean value display — the literal on-state word.'),\n 'common.false': msg('false', 'Boolean value display — the literal off-state word.'),\n 'common.backendUnreachable': msg('The persistence backend is unreachable.'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Built-in navigation views (the section rail)\n // ─────────────────────────────────────────────────────────────────────────\n 'nav.cms.label': msg('CMS'),\n 'nav.cms.description': msg('Model collections, fields, and documents.'),\n 'nav.components.label': msg('Components'),\n 'nav.components.description': msg('Browse the registry of primitives and project components.'),\n 'nav.redirects.label': msg('Redirects'),\n 'nav.redirects.description': msg('Create and manage URL redirects (301/302) for this site.'),\n 'nav.assets.label': msg('Assets'),\n 'nav.assets.description': msg('Manage uploaded media and metadata.'),\n 'nav.users.label': msg('Users'),\n 'nav.users.description': msg('Manage who has access to this deployment and their role.'),\n 'nav.extensions.label': msg('Extensions'),\n 'nav.extensions.description': msg(\n 'Install components, field types, adapters, and templates from the marketplace.',\n ),\n 'nav.settings.label': msg('Settings'),\n 'nav.settings.description': msg('Configure project metadata and locales.'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Current-user menu (shell header)\n // ─────────────────────────────────────────────────────────────────────────\n 'userMenu.accountMenu': msg('Account menu', 'aria-label on the avatar button that opens the user menu.'),\n 'userMenu.lightMode': msg('Light mode', 'Menu item: switch the studio to the light colour theme.'),\n 'userMenu.darkMode': msg('Dark mode', 'Menu item: switch the studio to the dark colour theme.'),\n 'userMenu.accountSettings': msg('Account settings'),\n 'userMenu.soon': msg('Soon', 'Badge on a feature that is not available yet.'),\n 'userMenu.signOut': msg('Sign out'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Shell — top bar, section rail, boot/error frames, project chrome\n // ─────────────────────────────────────────────────────────────────────────\n 'shell.allProjects': msg('All projects', 'aria-label on the home/logo link in the top bar.'),\n 'shell.breadcrumb.label': msg('Breadcrumb', 'aria-label on the breadcrumb navigation landmark.'),\n 'shell.nav.label': msg('Sections', 'aria-label on the vertical section rail.'),\n 'shell.sidebar.expand': msg('Expand sidebar'),\n 'shell.sidebar.collapse': msg('Collapse sidebar'),\n 'shell.sidebar.collapseLabel': msg('Collapse', 'Verb label beside the collapse icon on the expanded rail.'),\n 'shell.nav.planned': msg('Planned', 'Tooltip on the status dot of a planned (not-yet-enabled) nav view.'),\n 'shell.nav.collapseView': msg('Collapse {name}', 'aria-label on a parent nav item disclosure; {name} is the view label.'),\n 'shell.nav.expandView': msg('Expand {name}', 'aria-label on a parent nav item disclosure; {name} is the view label.'),\n 'shell.nav.issuesCount': msg('{count} sidebar issues', 'aria-label summarising rail customization issues on the collapsed rail.'),\n 'shell.sectionState.empty.title': msg('Nothing here yet'),\n 'shell.sectionState.empty.description': msg('This section has no content for the active project.'),\n 'shell.sectionState.loading.description': msg('Fetching the latest state for this section.'),\n 'shell.sectionState.error.title': msg('Something went wrong'),\n 'shell.sectionState.error.description': msg('This section could not be loaded. Try again in a moment.'),\n 'shell.sectionState.unavailable.title': msg('Not available'),\n 'shell.sectionState.unavailable.description': msg('This section is not available for the active project.'),\n 'shell.sectionState.planned.title': msg('Planned'),\n 'shell.sectionState.planned.description': msg('This surface is planned and not yet enabled for this project.'),\n 'shell.sectionState.badge.empty': msg('empty', 'Status badge on the empty section state — lowercase token.'),\n 'shell.sectionState.badge.loading': msg('loading'),\n 'shell.sectionState.badge.error': msg('error'),\n 'shell.sectionState.badge.unavailable': msg('unavailable'),\n 'shell.sectionState.badge.planned': msg('planned'),\n 'shell.projectNotFound.title': msg('Project not found'),\n 'shell.projectNotFound.body': msg('This project doesn’t exist or was deleted. It may only have existed in this session.'),\n 'shell.backToProjects': msg('Back to projects'),\n 'shell.routeNotFound.title': msg('Page not found'),\n 'shell.routeNotFound.body': msg('This studio URL doesn’t resolve to a section.'),\n 'shell.projectSwitcher.recent': msg('Recent'),\n 'shell.projects': msg('Projects'),\n 'shell.projectSwitcher.browseAll': msg('Browse all projects'),\n 'shell.project.notProvisioned': msg('not provisioned', 'Badge on a configured project with no backend yet.'),\n 'shell.projectList.recent': msg('Recent', 'Section label above recent-project chips (rendered uppercase).'),\n 'shell.projectList.empty.title': msg('No projects'),\n 'shell.projectCard.open': msg('Open project'),\n 'shell.session.loading': msg('Loading project…'),\n 'shell.session.error.title': msg('Couldn’t load this project’s saved state'),\n '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.'),\n 'shell.workspaceGate.title': msg('Workspace config is invalid'),\n 'shell.workspaceGate.issuesLabel': msg('Workspace config issues', 'aria-label on the issues list.'),\n 'shell.backend.connecting': msg('Connecting to backend…'),\n 'shell.backend.notConfigured.title': msg('Backend not configured'),\n 'shell.backend.unavailable.title': msg('Backend unavailable'),\n 'shell.backend.unavailable.body': msg('The configured Convex deployment did not respond. Your data is safe on the backend — the studio will not switch to local storage.'),\n 'shell.backend.retryConnection': msg('Retry connection'),\n 'shell.unsavedChanges.title': msg('Unsaved changes'),\n 'shell.unsavedChanges.body': msg('You have unsaved changes. Save them before leaving, or discard them.'),\n 'shell.unsavedChanges.saving': msg('Saving…'),\n 'shell.devLogin.badge': msg('Dev login'),\n 'shell.playground.badge': msg('Playground', 'Product term — may stay untranslated.'),\n 'shell.playground.hint': msg('Playground mode: data lives in memory on this device and resets on reload. Nothing is saved to a backend.'),\n 'shell.deliveryHealth.dismiss': msg('Dismiss'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Auth / errors\n // ─────────────────────────────────────────────────────────────────────────\n 'auth.signIn': msg('Sign in'),\n 'error.dismiss': msg('Dismiss error', 'aria-label on the error banner dismiss button.'),\n 'error.signedOut': msg('signed out', 'Badge on the session-expired error banner — lowercase token.'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // CMS — collection list / view bar / filters / cells\n // ─────────────────────────────────────────────────────────────────────────\n 'cms.list.new': msg('New', 'Create button on a non-page collection.'),\n 'cms.list.newPage': msg('New page'),\n 'cms.list.newNamed': msg('New {noun}', 'Empty-state create button; {noun} is the singular collection label.'),\n 'cms.list.moreActions': msg('More actions'),\n 'cms.list.import': msg('Import…'),\n 'cms.list.export': msg('Export'),\n 'cms.list.forReview': msg('For review', 'Prefix in the collection-shape-drift banner heading.'),\n 'cms.list.count': msg('{count} {noun}', 'Working-set count; {noun} is the collection singular/plural label (data).'),\n 'cms.list.countFiltered': msg('{visible} of {total} {noun}', 'Working-set count when filters hide rows.'),\n 'cms.list.emptyNone': msg('No {noun} yet.', '{noun} is the plural collection label (data), lowercased.'),\n 'cms.list.emptyFiltered': msg('No documents match the current view’s filters.'),\n 'cms.list.selectAll': msg('Select all documents in view'),\n 'cms.list.selectRow': msg('Select {id}'),\n 'cms.list.column.title': msg('Title'),\n 'cms.list.column.state': msg('State'),\n 'cms.list.column.url': msg('URL'),\n 'cms.list.view.all': msg('All documents', 'Name of the built-in default view.'),\n 'cms.list.unknownCollection': msg('Unknown collection {id}.'),\n 'cms.list.import.noId': msg('(no id)', 'Placeholder id in an import-rejected report.'),\n 'cms.list.display.ariaLabel': msg('Display options'),\n 'cms.list.display.title': msg('Display: layout and columns'),\n 'cms.list.display.layout': msg('Layout'),\n 'cms.list.display.flatList': msg('Flat list'),\n 'cms.list.display.pageHierarchy': msg('Page hierarchy'),\n 'cms.list.display.columns': msg('Columns · first visible is the title'),\n 'cms.list.display.toggleColumn': msg('Toggle column {field}'),\n 'cms.list.display.titleTag': msg('(title)', 'Suffix marking the title column in the column list.'),\n 'cms.list.display.moveColumnUp': msg('Move column {field} up'),\n 'cms.list.display.moveColumnDown': msg('Move column {field} down'),\n 'cms.list.bulk.count': msg('{count} selected'),\n 'cms.list.bulk.publish': msg('Publish'),\n 'cms.list.bulk.unpublish': msg('Unpublish'),\n 'cms.list.bulk.noSettableFields': msg('No filterable scalar fields to set.'),\n 'cms.list.bulk.setField': msg('Set field'),\n 'cms.list.bulk.clearSelection': msg('Clear selection'),\n 'cms.list.bulk.set.set': msg('Set', 'Leading word of the “Set <field> to <value>” composer.'),\n 'cms.list.bulk.set.to': msg('to', 'Connector in the “Set <field> to <value>” composer.'),\n 'cms.list.bulk.set.valueAria': msg('Set value'),\n 'cms.list.bulk.set.apply': msg('Apply to selection'),\n 'cms.list.bulk.report.verb.setField': msg('set {field}', 'Action name spliced into the bulk-report summary.'),\n 'cms.list.bulk.report.verb.publish': msg('publish', 'Lowercase action name spliced into the bulk-report summary.'),\n 'cms.list.bulk.report.verb.unpublish': msg('unpublish'),\n 'cms.list.bulk.report.verb.delete': msg('delete'),\n 'cms.list.bulk.report.summary': msg('Bulk {action}: {succeeded} succeeded'),\n 'cms.list.bulk.report.failedSuffix': msg(', {count} failed'),\n 'cms.list.bulk.report.failedBadge': msg('{count} failed'),\n 'cms.list.bulk.report.done': msg('done'),\n 'cms.list.bulk.error.invalidSetField': msg('Set-field is missing its field/value or the collection schema.'),\n 'cms.filter.button': msg('Filter'),\n 'cms.filter.summaryMultiple': msg('{count} filters', 'Chip summary when more than one clause is active.'),\n 'cms.filter.clearAria': msg('Clear filter'),\n 'cms.filter.refineSession': msg('Refine · this session'),\n 'cms.filter.clearAll': msg('Clear all'),\n 'cms.filter.add': msg('Add filter'),\n 'cms.filter.andHint': msg('all conditions must match (AND)'),\n 'cms.filter.fieldAria': msg('Filter field'),\n 'cms.filter.operatorAria': msg('Filter operator'),\n 'cms.filter.remove': msg('Remove filter'),\n 'cms.filter.valueAria': msg('Filter value'),\n 'cms.filter.valueListPlaceholder': msg('value, value, …'),\n 'cms.filter.state.published': msg('published'),\n 'cms.filter.state.draft': msg('draft'),\n 'cms.cell.fallbackTitle': msg('Showing {source} (fallback) — no {requested} translation yet. Edit to translate.'),\n 'cms.cell.richText': msg('rich text', 'Placeholder for a rich-text cell whose preview is empty.'),\n 'cms.cell.itemCount.one': msg('{count} item'),\n 'cms.cell.itemCount.other': msg('{count} items'),\n 'cms.cell.object': msg('object', 'Placeholder for a single object cell that has a value.'),\n 'cms.cell.blockCount.one': msg('{count} block'),\n 'cms.cell.blockCount.other': msg('{count} blocks'),\n 'cms.cell.createsVariantTitle': msg('Saving creates the {locale} translation of this field.'),\n 'cms.cell.newVariant': msg('new', 'Suffix on the edit-locale badge when a fresh variant will be created.'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // CMS — document detail editor\n // ─────────────────────────────────────────────────────────────────────────\n 'cms.editor.notFoundTitle': msg('Not found'),\n 'cms.editor.backToList': msg('Back to {label}'),\n 'cms.editor.publishFailed': msg('Publish failed.'),\n 'cms.editor.publishFailedReason': msg('Publish failed: {error}'),\n 'cms.editor.saveFailed': msg('Save failed'),\n 'cms.editor.unsavedChanges': msg('Unsaved changes'),\n 'cms.editor.saved': msg('Saved'),\n 'cms.editor.saving': msg('Saving…'),\n 'cms.editor.openLiveUrl': msg('Open {path}'),\n 'cms.editor.viewLive': msg('View live'),\n 'cms.editor.loadingLiveUrl': msg('Loading the live URL…'),\n 'cms.editor.publishToViewLive': msg('Publish to view the live page'),\n 'cms.editor.setFrontendUrlHint': msg('Set frontendUrl in elytra.config.ts to enable'),\n 'cms.editor.switchToDraftToPublish': msg('Switch to Draft to publish'),\n 'cms.editor.fixIssuesToPublish.one': msg('Fix {count} issue to publish'),\n 'cms.editor.fixIssuesToPublish.other': msg('Fix {count} issues to publish'),\n 'cms.editor.publishing': msg('Publishing…'),\n 'cms.editor.publishedState': msg('Published'),\n 'cms.editor.publish': msg('Publish'),\n 'cms.editor.moreActions': msg('More actions'),\n 'cms.editor.unpublish': msg('Unpublish'),\n 'cms.editor.draftState': msg('Draft'),\n 'cms.editor.publishToViewPublished': msg('Publish this document to view its published version'),\n 'cms.editor.publishedReadOnlyBanner': msg('Viewing the published version — read-only.'),\n 'cms.editor.switchToDraft': msg('Switch to Draft'),\n 'cms.editor.loadingPublishedVersion': msg('Loading the published version…'),\n 'cms.editor.noPublishedVersion': msg('No published version found for this document.'),\n 'cms.editor.unsavedChangesGuard': msg('You have unsaved changes to this record. Save them before leaving, or discard them.'),\n 'cms.editor.publishUnpublishedRefsTitle': msg('Publish with unpublished references?'),\n 'cms.editor.publishUnpublishedRefsDescription': msg('This page references content that isn’t published yet — those sections will be empty on the live site until you publish it too.'),\n 'cms.editor.publishAlsoHasIssues.one': msg('This page also has {count} other unresolved issue — see the Issues tab.'),\n 'cms.editor.publishAlsoHasIssues.other': msg('This page also has {count} other unresolved issues — see the Issues tab.'),\n 'cms.editor.publishAnyway': msg('Publish anyway'),\n 'cms.editor.fieldShowingFallback': msg('showing {locale}'),\n 'cms.editor.fieldTranslatedTo': msg('translated to {locale}'),\n 'cms.editor.readOnlyBadge': msg('read-only'),\n 'cms.editor.fieldFallbackHint': msg('Showing the {source} (fallback) value — edit to translate to {locale}. Clearing the {locale} text falls back again.'),\n 'cms.editor.issuesPane': msg('Issues'),\n 'cms.editor.detailsPane': msg('Details'),\n 'cms.editor.servedAt': msg('Served at {path}'),\n 'cms.editor.slugUrlHint': msg('The URL is derived from the slug (and parent) — set a slug to define it.'),\n 'cms.editor.embedUnpublishedIssue': msg('Embeds the reusable “{title}”, which isn’t published — it will be empty on the live site until you publish it.'),\n 'cms.editor.embedMissingIssue': msg('Embeds a reusable that no longer exists (“{id}”) — fix or remove the embed.'),\n 'cms.editor.defaultGroup': msg('Fields', 'Title of the implicit fieldset that holds ungrouped fields.'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // CMS — issues pane (validation)\n // ─────────────────────────────────────────────────────────────────────────\n 'cms.issues.none': msg('No issues'),\n 'cms.issues.satisfied': msg('This document satisfies the collection schema.'),\n 'cms.issues.goToField': msg('Go to {field}'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // CMS — details pane (slot + sidebar fields)\n // ─────────────────────────────────────────────────────────────────────────\n 'cms.details.slot': msg('Slot', 'A named handle the site uses to find a document (e.g. the main menu).'),\n 'cms.details.noSlot': msg('— No slot —'),\n 'cms.details.slotInUse': msg(' — in use', 'Suffix on a slot option already taken by another document.'),\n 'cms.details.slotHint': msg('A stable name the site uses to find this document (e.g. the main menu), instead of which exact entry it is. One document per slot.'),\n 'cms.details.empty': msg('No document properties to set.'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // CMS — import dialog\n // ─────────────────────────────────────────────────────────────────────────\n 'cms.import.title': msg('Import documents'),\n 'cms.import.invalidJson': msg('Input is not valid JSON.'),\n 'cms.import.imported': msg('{count} imported'),\n 'cms.import.rejected': msg('{count} rejected:'),\n 'cms.import.confirm': msg('Import', 'Confirm button in the import dialog.'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // CMS — versions (compare + pane)\n // ─────────────────────────────────────────────────────────────────────────\n 'cms.version.paneLabel': msg('Versions'),\n 'cms.version.compare': msg('Compare'),\n 'cms.version.closeCompare': msg('Close compare'),\n 'cms.version.loadingHistory': msg('Loading version history…'),\n 'cms.version.versionUnavailable': msg('That version is no longer available. Pick another to compare.'),\n 'cms.version.currentDraft': msg('Current draft'),\n 'cms.version.unsavedEdits': msg('unsaved edits'),\n 'cms.version.baseCaption': msg('Base'),\n 'cms.version.compareWithCaption': msg('Compare with'),\n 'cms.version.compareNewer': msg('Compare a newer version'),\n 'cms.version.compareOlder': msg('Compare an older version'),\n 'cms.version.restoreWholeTitle': msg('Restore the whole document to v{version}'),\n 'cms.version.restoreVersion': msg('Restore version'),\n 'cms.version.noDifferences': msg('No differences'),\n 'cms.version.changeSummary.one': msg('{count} change · {unchanged} unchanged'),\n 'cms.version.changeSummary.other': msg('{count} changes · {unchanged} unchanged'),\n 'cms.version.comparingPastVersionsHint': msg(' · comparing two past versions — set “Compare with” to Current draft to restore'),\n 'cms.version.versionsIdentical': msg('These two versions are identical.'),\n 'cms.version.beforeVersion': msg('Before · v{version}'),\n 'cms.version.afterTarget': msg('After · {target}'),\n 'cms.version.restoreField': msg('Restore {field}'),\n 'cms.version.restoreFieldLocale': msg('Restore {field} ({locale})'),\n 'cms.version.textUnchanged': msg('Text unchanged — formatting or whitespace differs.'),\n 'cms.version.contentChanged': msg('Content changed.'),\n 'cms.version.restoreBlock': msg('Restore this block'),\n 'cms.version.nestedContentChanged': msg('Nested content changed.'),\n 'cms.version.blockAdded': msg('Block added.'),\n 'cms.version.blockRemoved': msg('Block removed.'),\n 'cms.version.emptyValue': msg('empty'),\n 'cms.version.richText': msg('rich text'),\n 'cms.version.itemCount.one': msg('{count} item'),\n 'cms.version.itemCount.other': msg('{count} items'),\n 'cms.version.objectValue': msg('object'),\n 'cms.version.kindNew': msg('new'),\n 'cms.version.kindRemoved': msg('removed'),\n 'cms.version.unpublishedChanges': msg('Unpublished changes'),\n 'cms.version.notPublishedYet': msg('Not published yet'),\n 'cms.version.fixValidationToPublish': msg('Fix the document’s validation issues to publish'),\n 'cms.version.liveUpToDate': msg('The live version is up to date — nothing to publish.'),\n 'cms.version.comparingHint': msg('Comparing v{base} → {target}. Click a version to set it as the base.'),\n 'cms.version.noVersionsYet': msg('No published versions yet.'),\n 'cms.version.baseBadge': msg('Base'),\n 'cms.version.comparedBadge': msg('Compared'),\n 'cms.version.compareWithDraft': msg('Compare this version with the current draft'),\n 'cms.version.compareVersionLabel': msg('Compare v{version}'),\n 'cms.version.switchToDraftToRestore': msg('Switch to Draft to restore'),\n 'cms.version.restore': msg('Restore'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // CMS — delete/unpublish reference-confirm dialog\n // ─────────────────────────────────────────────────────────────────────────\n 'cms.reference.documentCount': msg('{count} documents'),\n 'cms.reference.confirmTitle': msg('{action} {subject}?'),\n 'cms.reference.checking': msg('Checking inbound references…'),\n 'cms.reference.checkUnavailable': msg('Inbound references could not be checked — the reference index is unreachable.'),\n 'cms.reference.blocked.one': msg('Blocked: {count} strict reference prevents this. Remove the references below first.'),\n 'cms.reference.blocked.other': msg('Blocked: {count} strict references prevent this. Remove the references below first.'),\n 'cms.reference.notReferenced': msg('Not referenced anywhere.'),\n 'cms.reference.permanentDelete.one': msg('This permanently deletes the document.'),\n 'cms.reference.permanentDelete.other': msg('This permanently deletes the {count} selected documents.'),\n 'cms.reference.canProceed': msg('You can {action} — {summary} will show a fallback until fixed. Each one becomes a visible validation issue.'),\n 'cms.reference.proceedUnavailable': msg('Proceeding is allowed, but affected places cannot be listed right now.'),\n 'cms.reference.proceedAnyway': msg('{action} anyway'),\n 'cms.reference.verb.unpublish': msg('unpublish', 'Lowercase verb spliced into “You can {action} …”.'),\n 'cms.reference.verb.delete': msg('delete'),\n 'cms.reference.placeCount.one': msg('{count} place'),\n 'cms.reference.placeCount.other': msg('{count} places'),\n 'cms.reference.bulkSummary': msg('{count} documents are affected; {places}'),\n 'cms.reference.atLocation': msg('at', 'Connector before a field/location deep-link in an impact row.'),\n 'cms.reference.strictBadge': msg('strict'),\n 'cms.reference.draftBadge': msg('draft'),\n 'cms.reference.publishedBadge': msg('published'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // CMS — field controls / scalar editor\n // ─────────────────────────────────────────────────────────────────────────\n 'cms.field.rendererCrashed': msg('Custom renderer crashed — showing the built-in control.'),\n 'cms.field.noRenderer': msg('No field renderer registered for control “{control}”.'),\n 'cms.field.itemActions': msg('Item actions'),\n 'cms.field.moveUp': msg('Move up'),\n 'cms.field.moveDown': msg('Move down'),\n 'cms.field.collapseAll': msg('Collapse all'),\n 'cms.field.expandAll': msg('Expand all'),\n 'cms.field.noItems': msg('No items'),\n 'cms.field.dragToReorder': msg('Drag to reorder'),\n 'cms.field.addItem': msg('Add item'),\n 'cms.field.value': msg('Value', 'Default aria-label for the scalar value editor.'),\n 'cms.field.valuePlaceholder': msg('value'),\n 'cms.field.colour': msg('Colour', 'aria-label on the colour-swatch field control.'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // CMS — relation picker\n // ─────────────────────────────────────────────────────────────────────────\n 'cms.relation.change': msg('Change'),\n 'cms.relation.openTitle': msg('Open {title}'),\n 'cms.relation.pick': msg('Pick'),\n 'cms.relation.pickTitle.one': msg('Pick a related document'),\n 'cms.relation.pickTitle.many': msg('Pick related document'),\n 'cms.relation.fromCollection': msg('From {collection}'),\n 'cms.relation.selectMultipleHint': msg('select multiple'),\n 'cms.relation.noDocuments': msg('No documents in {collection}.'),\n 'cms.relation.selectedCount': msg('{count} selected'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // CMS — asset field + asset picker\n // ─────────────────────────────────────────────────────────────────────────\n 'cms.asset.rejected.one': msg('“{name}” skipped — only {types} allowed here.'),\n 'cms.asset.rejected.other': msg('{count} files skipped — only {types} allowed here.'),\n 'cms.asset.dropToUpload': msg('Drop to upload'),\n 'cms.asset.selectOrDrop': msg('Select or drop an image'),\n 'cms.asset.selectAsset': msg('Select an asset'),\n 'cms.asset.altLabel': msg('Alt:', 'Inline label prefixing an image’s alt text.'),\n 'cms.asset.notSet': msg('not set'),\n 'cms.asset.imageOptions.title': msg('Image options'),\n 'cms.asset.imageOptions.description': msg('Focal point and metadata — shared across every use of this image.'),\n 'cms.asset.focalPoint': msg('Focal point'),\n 'cms.asset.resetToCentre': msg('Reset to centre'),\n 'cms.asset.focalPointHint': msg('Click or drag on the image to set the focal point used when it’s cropped.'),\n 'cms.asset.noMetaFields': msg('No editable metadata fields are declared on the asset collection. Add fields (e.g. {code1}, {code2}) to it in code.'),\n 'cms.asset.pickTitle': msg('Pick an asset'),\n 'cms.asset.pickDescription': msg('Select from the project’s asset library.'),\n 'cms.asset.noProject': msg('The asset library needs a project — this CMS session has none.'),\n 'cms.asset.restoreDialogSize': msg('Restore dialog size'),\n 'cms.asset.maximizeDialog': msg('Maximize dialog'),\n 'cms.asset.searchPlaceholder': msg('Search assets…'),\n 'cms.asset.loading': msg('Loading assets…'),\n 'cms.asset.loadError': msg('Assets failed to load.'),\n 'cms.asset.noMatches': msg('No assets match your search.'),\n 'cms.asset.empty': msg('No assets yet — drop files here or use Upload.'),\n 'cms.asset.noAltText': msg('No alt text'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Assets library (section)\n // ─────────────────────────────────────────────────────────────────────────\n 'assets.title': msg('Assets'),\n 'assets.error.loadFailed': msg('Assets failed to load'),\n 'assets.loading': msg('Loading assets…'),\n 'assets.searchPlaceholder': msg('Search assets…'),\n 'assets.searchLabel': msg('Search assets'),\n 'assets.searchEmpty': msg('No assets match your search.'),\n 'assets.dropHint': msg('Drop files anywhere to upload, or use the Upload button.'),\n 'assets.uploads.heading': msg('Uploads'),\n 'assets.upload.phase.queued': msg('queued'),\n 'assets.upload.phase.preparing': msg('preparing'),\n 'assets.upload.phase.uploading': msg('uploading'),\n 'assets.upload.phase.confirming': msg('saving metadata'),\n 'assets.upload.phase.done': msg('done'),\n 'assets.upload.phase.failed': msg('failed'),\n 'assets.upload.attempt': msg('attempt {count}'),\n 'assets.upload.dismissLabel': msg('Dismiss upload'),\n 'assets.card.altPrefix': msg('Alt: {alt}'),\n 'assets.card.noAlt': msg('No alt text'),\n 'assets.card.referencesLabel': msg('References of {filename}'),\n 'assets.card.editLabel': msg('Edit {filename}'),\n 'assets.references.title': msg('Used by — {name}'),\n 'assets.references.description': msg('Everything referencing this asset, with deep links to the exact field or node.'),\n 'assets.edit.title': msg('Edit {filename}'),\n 'assets.edit.description': msg('Alt text flows through the delivery shape into rendered markup; the title is the library display name.'),\n 'assets.edit.altLabel': msg('Alt text'),\n 'assets.edit.altPlaceholder': msg('Describe the image…'),\n 'assets.edit.titleLabel': msg('Title'),\n 'assets.delete.raceError.one': msg('Asset is now referenced in {count} place — reopen to review.'),\n 'assets.delete.raceError.other': msg('Asset is now referenced in {count} places — reopen to review.'),\n 'assets.delete.title': msg('Delete {filename}?'),\n 'assets.delete.description': msg('Removes the stored bytes and the metadata record. This cannot be undone.'),\n 'assets.delete.checking': msg('Checking references…'),\n 'assets.delete.inUse.one': msg('In use in {count} place'),\n 'assets.delete.inUse.other': msg('In use in {count} places'),\n 'assets.delete.brokenWarning': msg('Deleting will leave these references broken — they will surface as validation issues.'),\n 'assets.delete.noReferences': msg('No references found. Safe to delete.'),\n 'assets.delete.confirmAnyway': msg('Delete anyway'),\n 'assets.focalPoint.noPreview': msg('No image preview — upload or pick an image asset to set a focal point.'),\n 'assets.focalPoint.setLabel': msg('Set focal point'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Users (section)\n // ─────────────────────────────────────────────────────────────────────────\n 'users.checkingAccess': msg('Checking access…'),\n 'users.restrictedTitle': msg('Admins only'),\n 'users.restrictedBody': msg('Managing users and roles requires the admin role on this deployment. Ask an admin to grant you access.'),\n 'users.loadFailed': msg('Users failed to load'),\n 'users.loading': msg('Loading users…'),\n // Built-in users rail — its schema labels resolve through the catalog (msgLabel),\n // so a consumer's translation catalog localizes the rail with no per-rail override.\n 'users.rail.label': msg('Users'),\n 'users.rail.labelSingular': msg('user', 'Singular noun for one users-rail row, e.g. in a header.'),\n 'users.field.name.label': msg('Name'),\n 'users.field.email.label': msg('Email'),\n 'users.field.role.label': msg('Role'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Redirects (section)\n // ─────────────────────────────────────────────────────────────────────────\n 'redirects.loadFailed': msg('Redirects failed to load'),\n 'redirects.loading': msg('Loading redirects…'),\n // Built-in redirects rail — schema labels via the catalog (msgLabel), see above.\n 'redirects.rail.label': msg('Redirects'),\n 'redirects.rail.labelSingular': msg('redirect', 'Singular noun for one redirect row, e.g. in a header.'),\n 'redirects.field.from.label': msg('From'),\n 'redirects.field.to.label': msg('To'),\n 'redirects.field.permanent.label': msg('Permanent (301)'),\n 'redirects.field.enabled.label': msg('Enabled'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // References panel\n // ─────────────────────────────────────────────────────────────────────────\n 'references.title': msg('References'),\n 'references.hintOutbound': msg('What this entry points at — click to jump to the target, or to the exact field.'),\n 'references.emptyOutbound': msg('No outbound references.'),\n 'references.usedBy': msg('Used by'),\n 'references.hintInbound': msg('Everything referencing this entry — click to jump to the exact field or node.'),\n 'references.emptyInbound': msg('Not referenced anywhere.'),\n 'references.loading': msg('Loading references…'),\n 'references.loadFailed': msg('References failed to load'),\n 'references.indexUnreachable': msg('The reference index is unreachable.'),\n 'references.sectionLoadError': msg('Couldn’t load this section: {error}'),\n 'references.locationPrefix': msg('at', 'Prefix before a reference’s location label.'),\n 'references.badgeDraft': msg('draft'),\n 'references.badgePublished': msg('published'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Components registry browser\n // ─────────────────────────────────────────────────────────────────────────\n 'components.detail.notFound.title': msg('Component not found'),\n 'components.detail.notFound.body': msg('No component is registered with id {id}.'),\n 'components.detail.notFound.back': msg('Back to components'),\n 'components.detail.allComponents': msg('All components'),\n 'components.detail.designTokens': msg('DESIGN TOKENS'),\n 'components.status.valid': msg('valid'),\n 'components.status.incompatible': msg('incompatible'),\n 'components.status.invalid': msg('invalid'),\n 'components.status.aria': msg('Status: {status}'),\n 'components.status.description.valid': msg('Manifest is registered and an implementation is wired up.'),\n 'components.status.description.incompatible': msg('Manifest is registered but no implementation is available — the renderer will show a fallback.'),\n 'components.status.description.invalid': msg('The registry reported a structured issue for this component.'),\n 'components.index.title': msg('Component registry'),\n 'components.index.subtitle': msg('Browse the platform primitives and this project’s components. Select one to inspect its manifest, fields, and preview fixtures.'),\n 'components.index.stat.total': msg('Components'),\n 'components.index.stat.totalHint': msg('{primitives} primitives · {projects} project'),\n 'components.index.stat.valid': msg('Valid'),\n 'components.index.stat.needAttention': msg('Need attention'),\n 'components.index.stat.needAttentionHint': msg('{incompatible} incompatible · {invalid} invalid'),\n 'components.index.pickHint': msg('Pick a component from the list to open its detail view — manifest metadata, the prop & slot inspector, and the visual fixture runner.'),\n 'components.index.guide.title': msg('Registering project components'),\n 'components.index.guide.badge': msg('guide'),\n 'components.index.guide.fullGuide': msg('Full guide: {path}'),\n 'components.fieldInspector.props': msg('Props'),\n 'components.fieldInspector.noProps': msg('This component declares no editable props.'),\n 'components.fieldInspector.slots': msg('Slots'),\n 'components.fieldInspector.noSlots': msg('This component has no slots.'),\n 'components.fieldInspector.inline': msg('inline'),\n 'components.fieldInspector.default': msg('default'),\n 'components.fieldInspector.allows': msg('allows'),\n 'components.fixtureRunner.preview': msg('Preview'),\n 'components.fixtureRunner.stateCount.one': msg('{count} state'),\n 'components.fixtureRunner.stateCount.other': msg('{count} states'),\n 'components.fixtureRunner.statesAria': msg('Fixture states'),\n 'components.browser.searchPlaceholder': msg('Search components…'),\n 'components.browser.searchAria': msg('Search components'),\n 'components.browser.namespaceAria': msg('Filter by namespace'),\n 'components.browser.all': msg('All'),\n 'components.browser.primitives': msg('Primitives'),\n 'components.browser.project': msg('Project'),\n 'components.browser.noMatchQuery': msg('No components match “{query}”.'),\n 'components.browser.noMatchFilters': msg('No components match the selected filters.'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Extensions (marketplace)\n // ─────────────────────────────────────────────────────────────────────────\n 'extensions.tab.marketplace': msg('Marketplace'),\n 'extensions.tab.installed': msg('Installed'),\n 'extensions.tab.registered': msg('Registered'),\n 'extensions.header.title': msg('Extensibility'),\n 'extensions.header.subtitle': msg('Components · field types · data sources · asset storage · export targets · templates · hooks'),\n 'extensions.search.placeholder': msg('Search extensions…'),\n 'extensions.search.aria': msg('Search extensions'),\n 'extensions.token.placeholder': msg('Private registry token'),\n 'extensions.token.unlocked': msg('unlocked'),\n 'extensions.empty.noMatch.title': msg('No extensions match'),\n 'extensions.empty.noMatch.body': msg('Try a different search term.'),\n 'extensions.listing.private': msg('private'),\n 'extensions.listing.noDescription': msg('No description provided.'),\n 'extensions.listing.unknownAuthor': msg('Unknown author'),\n 'extensions.action.installed': msg('Installed'),\n 'extensions.action.install': msg('Install'),\n 'extensions.error.accessDenied': msg('Access denied — a valid token is required.'),\n 'extensions.error.installFailed': msg('Installation failed.'),\n 'extensions.empty.installed.title': msg('Nothing installed yet'),\n 'extensions.empty.installed.body': msg('Install an extension from the marketplace to see what it contributes here.'),\n 'extensions.contrib.components': msg('components'),\n 'extensions.contrib.fieldTypes': msg('field types'),\n 'extensions.contrib.dataSources': msg('data sources'),\n 'extensions.contrib.assetStorage': msg('asset storage'),\n 'extensions.contrib.exportTargets': msg('export targets'),\n 'extensions.contrib.templates': msg('templates'),\n 'extensions.contrib.hooks': msg('hooks'),\n 'extensions.registered.intro': msg('Live registries on the plugin host. Built-in capabilities are always present; installing an extension adds to them.'),\n 'extensions.registered.components.title': msg('Components'),\n 'extensions.registered.components.empty': msg('No project components registered.'),\n 'extensions.registered.fieldTypes.title': msg('Field types'),\n 'extensions.registered.dataSources.title': msg('Data source kinds'),\n 'extensions.registered.assetStorage.title': msg('Asset storage backends'),\n 'extensions.registered.assetStorage.empty': msg('No storage adapters installed.'),\n 'extensions.registered.exportTargets.title': msg('Export targets'),\n 'extensions.registered.hookPoints.title': msg('Hook points'),\n 'extensions.kind.plugin': msg('plugin'),\n 'extensions.kind.componentPackage': msg('components'),\n 'extensions.kind.fieldType': msg('field type'),\n 'extensions.kind.dataSource': msg('data source'),\n 'extensions.kind.assetStorage': msg('asset storage'),\n 'extensions.kind.exportTarget': msg('export target'),\n 'extensions.kind.template': msg('template'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Settings\n // ─────────────────────────────────────────────────────────────────────────\n 'settings.identity.title': msg('Identity'),\n 'settings.identity.name': msg('Name'),\n 'settings.identity.urlKey': msg('URL key'),\n 'settings.locales.title': msg('Locales'),\n 'settings.locales.configuredCount': msg('{count} configured'),\n 'settings.locales.configured': msg('Configured locales'),\n 'settings.locales.defaultSuffix': msg(' · default'),\n 'settings.environments.title': msg('Environments & export'),\n 'settings.environments.label': msg('Environments'),\n 'settings.exportTarget': msg('Export target'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // App-views shell\n // ─────────────────────────────────────────────────────────────────────────\n 'appViews.singleton.opening': msg('Opening {label}…'),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Builder / canvas\n // ─────────────────────────────────────────────────────────────────────────\n 'builder.blocksPanel.title': msg('Insert block'),\n 'builder.blocksPanel.addsInto': msg('Adds into {destination}.'),\n 'builder.blocksPanel.searchPlaceholder': msg('Search blocks…'),\n 'builder.blocksPanel.searchAria': msg('Search blocks'),\n 'builder.blocksPanel.layoutHelpers': msg('layout helpers'),\n 'builder.blocksPanel.noAllowed': msg('No allowed components match.'),\n 'builder.blocksPanel.noMatch': msg('No components match “{query}”.'),\n 'builder.blocksPanel.insertTileAria': msg('Insert {title} — {variant}'),\n 'builder.blocksPanel.copyExactAria': msg('Copy exact configuration — {title} ({variant})'),\n 'builder.blocksPanel.copyExactConfiguration': msg('Copy exact configuration'),\n 'builder.blocksPanel.previewFailed': msg('Preview failed: {error}'),\n 'builder.pageTree.title': msg('Page tree'),\n 'builder.pageTree.hiddenByCondition': msg('Hidden by condition'),\n 'builder.pageTree.conditional': msg('Conditional'),\n 'builder.pageTree.addChild': msg('Add child'),\n 'builder.pageTree.moreActions': msg('More actions'),\n 'builder.pageTree.moveUp': msg('Move up'),\n 'builder.pageTree.moveDown': msg('Move down'),\n 'builder.clipboard.paste': msg('Paste'),\n 'builder.clipboard.cut': msg('Cut'),\n 'builder.clipboard.writeError': msg('Could not write to the clipboard: {detail}'),\n 'builder.clipboard.rootCannotBeCut': msg('The page root cannot be cut.'),\n 'builder.clipboard.copied': msg('Copied {label}'),\n 'builder.clipboard.cutNotice': msg('Cut {label}'),\n 'builder.clipboard.pastedInto': msg('{summary} · into {destination}'),\n 'builder.clipboard.issueComponent': msg('component'),\n 'builder.clipboard.issueBinding': msg('binding'),\n 'builder.reuse.makeReusable': msg('Make reusable'),\n 'builder.reuse.detachToCopy': msg('Detach to copy'),\n 'builder.reuse.defaultElementName': msg('Reusable element'),\n 'builder.reuse.madeReusablePublished': msg('Made “{name}” reusable and published it.'),\n 'builder.reuse.madeReusablePublishFailed': msg('Made “{name}” reusable, but publishing failed — publish it from its document.'),\n 'builder.reuse.madeReusableDraft': msg('Made “{name}” reusable (draft) — publish it to show on live pages.'),\n 'builder.reuse.noTargetToDetach': msg('This element has no target to detach.'),\n 'builder.reuse.noContentToDetach': msg('The referenced element has no content to detach.'),\n 'builder.reuse.detachedToCopy': msg('Detached to an editable copy — the live link is broken.'),\n 'builder.reuse.makeReusableDescription': msg('Moves the selected block into a new reusable element and embeds it here. The same element can then be embedded on any page. Publish it now to keep the section visible everywhere, or save it as a draft to keep editing first.'),\n 'builder.reuse.nameLabel': msg('Name'),\n 'builder.reuse.namePlaceholder': msg('Reservation CTA', 'Example placeholder in the reusable-name input.'),\n 'builder.reuse.saveDraft': msg('Save Draft'),\n 'builder.reuse.publish': msg('Publish'),\n 'builder.inspector.emptySelection': msg('Select a node in the tree or canvas to edit its properties.'),\n 'builder.inspector.title': msg('Inspector'),\n 'builder.inspector.unknownComponent': msg('unknown component'),\n 'builder.inspector.noManifest': msg('No manifest is registered for this component, so its props can’t be edited.'),\n 'builder.inspector.props': msg('Props'),\n 'builder.inspector.noEditableProps': msg('No editable props.'),\n 'builder.inspector.slots': msg('Slots'),\n 'builder.inspector.slotsHint': msg('Add or reorder slot children from the page tree.'),\n 'builder.inspector.propertiesPane': msg('Properties'),\n 'builder.inspector.invalidValue': msg('Value doesn’t match the prop schema — the canvas falls back to the default.'),\n 'builder.inspector.invalidJson': msg('Invalid JSON'),\n 'builder.layout.title': msg('Layout'),\n 'builder.layout.direction': msg('Direction'),\n 'builder.layout.vertical': msg('Vertical'),\n 'builder.layout.horizontal': msg('Horizontal'),\n 'builder.layout.columns': msg('Columns'),\n 'builder.layout.columnCount.one': msg('{count} column'),\n 'builder.layout.columnCount.other': msg('{count} columns'),\n 'builder.layout.gap': msg('Gap'),\n 'builder.layout.alignment': msg('Alignment'),\n 'builder.layout.onPhones': msg('On phones'),\n 'builder.layout.stack': msg('Stack'),\n 'builder.layout.keepColumns': msg('Keep columns'),\n 'builder.layout.gapStep.hairline': msg('Hairline'),\n 'builder.layout.gapStep.extraSmall': msg('Extra small'),\n 'builder.layout.gapStep.small': msg('Small'),\n 'builder.layout.gapStep.medium': msg('Medium'),\n 'builder.layout.gapStep.large': msg('Large'),\n 'builder.layout.gapStep.extraLarge': msg('Extra large'),\n 'builder.layout.gapStep.huge': msg('Huge'),\n 'builder.layout.align.start': msg('Start'),\n 'builder.layout.align.center': msg('Center'),\n 'builder.layout.align.end': msg('End'),\n 'builder.layout.align.stretch': msg('Stretch'),\n 'builder.canvas.pagePreview': msg('Page preview'),\n 'builder.canvas.reusableUnpublishedTitle': msg('This reusable element isn’t published yet'),\n 'builder.canvas.reusableMissingTitle': msg('This reusable element is missing'),\n 'builder.canvas.reusableUnpublishedHint': msg('Publish it to show it here and on live pages — or open it from the Properties panel to keep editing.'),\n 'builder.canvas.reusableMissingHint': msg('Open the embed’s “Element” in the Properties panel to fix the reference.'),\n 'builder.canvas.viewportPreviewAria': msg('{label} preview'),\n 'builder.canvas.viewportWidthTitle': msg('{label} width'),\n 'builder.canvas.breakpointsIssueLabel': msg('breakpoints'),\n 'builder.canvas.undo': msg('Undo'),\n 'builder.canvas.redo': msg('Redo'),\n 'builder.canvas.insert': msg('Insert'),\n 'builder.spacing.gapAfterChild': msg('Gap after child {index}'),\n 'builder.richText.toolbarLabel': msg('Text formatting'),\n 'builder.richText.linkPlaceholder': msg('https://… (empty removes)'),\n 'builder.richText.linkUrl': msg('Link URL'),\n 'builder.richText.set': msg('Set'),\n 'builder.richText.applyLink': msg('Apply link'),\n 'builder.richText.bold': msg('Bold'),\n 'builder.richText.italic': msg('Italic'),\n 'builder.richText.link': msg('Link'),\n 'builder.richText.removeLink': msg('Remove link'),\n 'builder.richText.unlink': msg('Unlink'),\n}\n"]}
|
package/dist/lib/i18n/types.d.ts
CHANGED
|
@@ -31,6 +31,19 @@ export interface StudioI18nConfig {
|
|
|
31
31
|
* Defaults to `'en'` (the in-engine source language).
|
|
32
32
|
*/
|
|
33
33
|
defaultLocale?: string;
|
|
34
|
+
/**
|
|
35
|
+
* **Pin** the studio UI to a fixed locale, overriding browser detection. Set this
|
|
36
|
+
* for a single-language deployment (e.g. a German site whose editors work in German).
|
|
37
|
+
*
|
|
38
|
+
* Why it exists: browser detection reads `navigator.languages`, which is **client-only**
|
|
39
|
+
* — under SSR the server can't see it, so it renders the default locale while the client
|
|
40
|
+
* renders the browser locale → a hydration mismatch (server text ≠ client text). A pin is
|
|
41
|
+
* read from *config*, which is imported identically on server and client, so both render
|
|
42
|
+
* the same locale with no header plumbing and no first-paint flash. When a locale is not
|
|
43
|
+
* available (not `defaultLocale` and not in `locales`) the pin is ignored (with a console
|
|
44
|
+
* signal) and detection resumes. Omit it to keep browser-preferred detection.
|
|
45
|
+
*/
|
|
46
|
+
locale?: string;
|
|
34
47
|
/**
|
|
35
48
|
* Imported translation catalogs keyed by locale code, e.g. `{ de: deMessages }`.
|
|
36
49
|
* English is always available as the built-in source, so it need not be listed.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/i18n/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/i18n/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgDH;;;;GAIG;AACH,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,WAAoB;IACvD,OAAO,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAA;AAC3E,CAAC","sourcesContent":["/**\n * Studio-UI localization types (EC-241) — the leaf module both the message catalog\n * and the resolver import, so nothing here may import studio runtime code (keeps the\n * `defineStudio` config surface free of import cycles).\n *\n * This is the **studio-chrome** axis (engine-owned strings). Schema labels are a\n * separate mechanism — a {@link import('@elytracms/core/cms-core').LocalizedString}\n * on the field/collection def, resolved via `resolveLabel`. Content-*value*\n * localization is a third, unrelated axis (`cms-core/localization.ts`).\n */\n\n/** A source-catalog entry: the English string + an optional translator hint. */\nexport interface SourceMessage {\n /** The English (source-of-truth) string. */\n message: string\n /**\n * Translator hint/context — the same word can translate differently by context\n * (the standard `msgctxt`/Lingui-comment idea). **Authoring/translation-time only:**\n * it lives on the in-engine source catalog and is NOT shipped in the flat\n * consumer-provided translation catalogs.\n */\n description?: string\n}\n\n/** The in-engine English source catalog: message key → {@link SourceMessage}. */\nexport type SourceCatalog = Record<string, SourceMessage>\n\n/** A consumer-provided translation catalog: flat message key → localized string. */\nexport type MessageCatalog = Record<string, string>\n\n/** The studio-UI localization config passed to `defineStudio({ i18n })` (EC-241). */\nexport interface StudioI18nConfig {\n /**\n * The locale used when the browser's preferred locale matches nothing available.\n * Defaults to `'en'` (the in-engine source language).\n */\n defaultLocale?: string\n /**\n * **Pin** the studio UI to a fixed locale, overriding browser detection. Set this\n * for a single-language deployment (e.g. a German site whose editors work in German).\n *\n * Why it exists: browser detection reads `navigator.languages`, which is **client-only**\n * — under SSR the server can't see it, so it renders the default locale while the client\n * renders the browser locale → a hydration mismatch (server text ≠ client text). A pin is\n * read from *config*, which is imported identically on server and client, so both render\n * the same locale with no header plumbing and no first-paint flash. When a locale is not\n * available (not `defaultLocale` and not in `locales`) the pin is ignored (with a console\n * signal) and detection resumes. Omit it to keep browser-preferred detection.\n */\n locale?: string\n /**\n * Imported translation catalogs keyed by locale code, e.g. `{ de: deMessages }`.\n * English is always available as the built-in source, so it need not be listed.\n */\n locales?: Record<string, MessageCatalog>\n}\n\n/**\n * Author a source-catalog entry with an optional translator hint (EC-241). Kept in\n * this leaf module so `messages.en.ts` can build the catalog without importing the\n * resolver (which would import studio runtime code).\n */\nexport function msg(message: string, description?: string): SourceMessage {\n return description !== undefined ? { message, description } : { message }\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { resolveDocumentTitle
|
|
1
|
+
import { resolveDocumentTitle } from '@elytracms/core/cms-core';
|
|
2
|
+
import { localizedLabel } from '@elytracms/studio/lib/i18n';
|
|
2
3
|
/**
|
|
3
4
|
* Pure presentation model for the EC-172 references panels.
|
|
4
5
|
*
|
|
@@ -73,11 +74,12 @@ export const REFERENCE_KIND_LABELS = {
|
|
|
73
74
|
};
|
|
74
75
|
function fieldLabelOf(collection, fieldName) {
|
|
75
76
|
const field = collection?.fields.find((f) => f.name === fieldName);
|
|
76
|
-
//
|
|
77
|
-
|
|
77
|
+
// Non-hook `localizedLabel` reads the active UI locale (safe anywhere), so a
|
|
78
|
+
// `{ en, de }` label resolves to the editor's language here too.
|
|
79
|
+
return localizedLabel(field?.form?.label, fieldName);
|
|
78
80
|
}
|
|
79
81
|
function collectionLabelOf(collection, collectionId) {
|
|
80
|
-
return
|
|
82
|
+
return (localizedLabel(collection?.form?.labelSingular) || localizedLabel(collection?.form?.label, collectionId));
|
|
81
83
|
}
|
|
82
84
|
/** Resolve a document's display title (titleField value, default locale first). */
|
|
83
85
|
export function documentTitleOf(collection, document, fallback) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reference-model.js","sourceRoot":"","sources":["../../../src/lib/references/reference-model.ts"],"names":[],"mappings":"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","sourcesContent":["import { resolveDocumentTitle, resolveLabel } from '@elytracms/core/cms-core'\nimport type { CmsDocument, CollectionDef } from '@elytracms/core/cms-core'\nimport type {\n ReferenceEntryRecord,\n ReferenceKind,\n ReferenceSource,\n ReferenceTarget,\n} from '@elytracms/core/persistence'\n\n/**\n * Pure presentation model for the EC-172 references panels.\n *\n * The EC-155 index stores entries as `(source, path, target, kind)` per\n * variant; this module turns those records into renderable rows: variants\n * merged onto one row (draft/published badges), human-readable source/\n * location/target labels, and deep-link descriptors that pinpoint the exact\n * field (CMS) or graph node (builder) a path identifies. No data fetching, no\n * React — everything here is a deterministic function of its inputs, so it is\n * fully testable in the node environment.\n */\n\n// --- Path parsing -------------------------------------------------------------\n\n/** Split a `collection:id` document key (the index's document source/target id). */\nexport function parseDocumentKey(key: string): { collection: string; id: string } | null {\n const separator = key.indexOf(':')\n if (separator <= 0 || separator === key.length - 1) return null\n return { collection: key.slice(0, separator), id: key.slice(separator + 1) }\n}\n\nexport interface DocumentFieldPath {\n /** Present for `localized/<locale>/<field>` paths. */\n locale?: string\n field: string\n /** Tokens below the field value (array indices, rich-text node paths). */\n rest: readonly string[]\n}\n\n/**\n * Parse a document index path (`values/<field>/…` or\n * `localized/<locale>/<field>/…`) onto the owning field.\n */\nexport function parseDocumentFieldPath(path: string): DocumentFieldPath | null {\n const tokens = path.split('/')\n if (tokens[0] === 'values' && tokens[1]) {\n return { field: tokens[1], rest: tokens.slice(2) }\n }\n if (tokens[0] === 'localized' && tokens[1] && tokens[2]) {\n return { locale: tokens[1], field: tokens[2], rest: tokens.slice(3) }\n }\n return null\n}\n\n// --- Variant merging ----------------------------------------------------------\n\n/** One panel row: the same logical entry across both variants, with flags. */\nexport interface MergedReferenceEntry {\n /** Stable row key (source + path + target + kind). */\n key: string\n source: ReferenceSource\n path: string\n target: ReferenceTarget\n kind: ReferenceKind\n /** Present in the draft variant of the index. */\n draft: boolean\n /** Present in the published variant (a live reference). */\n published: boolean\n}\n\n/**\n * Merge per-variant index records onto one row per logical entry. A\n * draft-only row (`draft && !published`) is the Sanity hidden-draft-reference\n * case the panel must make visible. Order is deterministic:\n * source type → source id → path → target type → target id → kind.\n */\nexport function mergeReferenceVariants(\n records: readonly ReferenceEntryRecord[],\n): MergedReferenceEntry[] {\n const byKey = new Map<string, MergedReferenceEntry>()\n for (const record of records) {\n const key = `${record.source.type} ${record.source.id} ${record.path} ${record.target.type} ${record.target.id} ${record.kind}`\n const existing = byKey.get(key)\n if (existing) {\n if (record.variant === 'draft') existing.draft = true\n else existing.published = true\n continue\n }\n byKey.set(key, {\n key,\n source: record.source,\n path: record.path,\n target: record.target,\n kind: record.kind,\n draft: record.variant === 'draft',\n published: record.variant === 'published',\n })\n }\n return [...byKey.values()].sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0))\n}\n\n// --- Labels & deep links --------------------------------------------------------\n\n/** Human label per reference kind (entry-row badge). */\nexport const REFERENCE_KIND_LABELS: Record<ReferenceKind, string> = {\n 'relation-field': 'relation',\n 'asset-field': 'asset field',\n 'rich-text-link': 'rich-text link',\n 'rich-text-node': 'rich-text node',\n 'component-usage': 'component usage',\n}\n\n/**\n * A deep-link descriptor the panel renders as a router link. `cms-field`\n * carries the full index path so the document editor can highlight the exact\n * field control; `builder-node` carries the resolved node id so the builder\n * can select + scroll to the node.\n */\nexport type ReferenceDeepLink =\n | { kind: 'cms-field'; collectionId: string; documentId: string; fieldPath?: string }\n | { kind: 'builder-node'; pageId?: string; nodeId?: string }\n | { kind: 'component'; componentId: string }\n | { kind: 'asset'; assetId: string }\n\n/** Everything the model needs to label entries (loaded once per panel). */\nexport interface ReferenceLabelContext {\n collections: readonly CollectionDef[]\n /** Live documents keyed by `collection:id`. */\n documents: ReadonlyMap<string, CmsDocument>\n /** Asset metadata keyed by asset id. */\n assets: ReadonlyMap<string, { filename: string; title?: string | undefined }>\n /** Resolves a component id to its manifest title (live registry lookup). */\n componentTitle: (componentId: string) => string | undefined\n}\n\n/** One fully-labelled panel row. */\nexport interface ReferenceEntryView extends MergedReferenceEntry {\n kindLabel: string\n /** The holding entity, e.g. `Post · Hello World` or `Page · Home`. */\n sourceLabel: string\n /** The exact location inside the source, e.g. `Author` or `Text (n-post-title)`. */\n locationLabel: string\n /** The referenced entity, e.g. `Ada Lovelace` or `cover.jpg`. */\n targetLabel: string\n /** Deep link to the exact source location (field control / graph node). */\n sourceLink: ReferenceDeepLink | null\n /** Link to the referenced entity's surface. */\n targetLink: ReferenceDeepLink | null\n}\n\nfunction fieldLabelOf(collection: CollectionDef | undefined, fieldName: string): string {\n const field = collection?.fields.find((f) => f.name === fieldName)\n // Pure/lib site: resolves to the default-language label (no active UI locale here).\n return resolveLabel(field?.form?.label) ?? fieldName\n}\n\nfunction collectionLabelOf(collection: CollectionDef | undefined, collectionId: string): string {\n return resolveLabel(collection?.form?.labelSingular) ?? resolveLabel(collection?.form?.label) ?? collectionId\n}\n\n/** Resolve a document's display title (titleField value, default locale first). */\nexport function documentTitleOf(\n collection: CollectionDef | undefined,\n document: CmsDocument | undefined,\n fallback: string,\n): string {\n if (!collection || !document) return fallback\n // EC-242: a function `titleField` (title pattern) has no single source field —\n // resolve it from the base values via the shared identity resolver.\n if (typeof collection.titleField === 'function') {\n return resolveDocumentTitle(collection, document.values, fallback)\n }\n const field = typeof collection.titleField === 'string' ? collection.titleField : 'title'\n const direct = document.values[field]\n if (typeof direct === 'string' && direct.length > 0) return direct\n const locales = Object.keys(document.localized ?? {}).sort()\n const preferred = document.defaultLocale\n for (const locale of [preferred, ...locales]) {\n if (!locale) continue\n const value = document.localized?.[locale]?.[field]\n if (typeof value === 'string' && value.length > 0) return value\n }\n return fallback\n}\n\n/** Strip the namespace off a component id for compact labels. */\nexport function shortComponentId(componentId: string): string {\n return componentId.replace('base.primitives.', '').replace('project.', '')\n}\n\ninterface DocumentParts {\n collection: CollectionDef | undefined\n collectionId: string\n documentId: string\n title: string\n}\n\nfunction documentParts(context: ReferenceLabelContext, key: string): DocumentParts | null {\n const ref = parseDocumentKey(key)\n if (!ref) return null\n const collection = context.collections.find((c) => c.id === ref.collection)\n return {\n collection,\n collectionId: ref.collection,\n documentId: ref.id,\n title: documentTitleOf(collection, context.documents.get(key), ref.id),\n }\n}\n\nfunction describeDocumentSource(\n context: ReferenceLabelContext,\n entry: MergedReferenceEntry,\n): { sourceLabel: string; locationLabel: string; sourceLink: ReferenceDeepLink | null } {\n const parts = documentParts(context, entry.source.id)\n if (!parts) {\n return { sourceLabel: entry.source.id, locationLabel: entry.path, sourceLink: null }\n }\n const parsed = parseDocumentFieldPath(entry.path)\n const fieldLabel = parsed ? fieldLabelOf(parts.collection, parsed.field) : entry.path\n const qualifiers: string[] = []\n if (parsed?.locale) qualifiers.push(parsed.locale)\n if (entry.kind === 'rich-text-link') qualifiers.push('link')\n if (entry.kind === 'rich-text-node') qualifiers.push('embedded node')\n if (\n entry.kind === 'relation-field' &&\n parsed &&\n parsed.rest.length === 1 &&\n /^\\d+$/.test(parsed.rest[0]!)\n ) {\n qualifiers.push(`item ${parsed.rest[0]}`)\n }\n return {\n sourceLabel: `${collectionLabelOf(parts.collection, parts.collectionId)} · ${parts.title}`,\n locationLabel: qualifiers.length > 0 ? `${fieldLabel} (${qualifiers.join(', ')})` : fieldLabel,\n sourceLink: {\n kind: 'cms-field',\n collectionId: parts.collectionId,\n documentId: parts.documentId,\n fieldPath: entry.path,\n },\n }\n}\n\n\nfunction describeTarget(\n context: ReferenceLabelContext,\n target: ReferenceTarget,\n): { targetLabel: string; targetLink: ReferenceDeepLink | null } {\n switch (target.type) {\n case 'document': {\n const parts = documentParts(context, target.id)\n if (!parts) return { targetLabel: target.id, targetLink: null }\n return {\n targetLabel: `${collectionLabelOf(parts.collection, parts.collectionId)} · ${parts.title}`,\n targetLink: {\n kind: 'cms-field',\n collectionId: parts.collectionId,\n documentId: parts.documentId,\n },\n }\n }\n case 'component':\n return {\n targetLabel: context.componentTitle(target.id) ?? shortComponentId(target.id),\n targetLink: { kind: 'component', componentId: target.id },\n }\n case 'asset': {\n const asset = context.assets.get(target.id)\n return {\n targetLabel: asset ? (asset.title ?? asset.filename) : target.id,\n targetLink: { kind: 'asset', assetId: target.id },\n }\n }\n }\n}\n\n/** Label + link one merged entry (see {@link buildReferenceEntryViews}). */\nexport function buildReferenceEntryView(\n entry: MergedReferenceEntry,\n context: ReferenceLabelContext,\n): ReferenceEntryView {\n // EC-287: a reference source is only ever a CMS document (structure is code).\n const sourceParts = describeDocumentSource(context, entry)\n return {\n ...entry,\n kindLabel: REFERENCE_KIND_LABELS[entry.kind],\n ...sourceParts,\n ...describeTarget(context, entry.target),\n }\n}\n\n/** Merge variants and label every record — the panel's full render model. */\nexport function buildReferenceEntryViews(\n records: readonly ReferenceEntryRecord[],\n context: ReferenceLabelContext,\n): ReferenceEntryView[] {\n return mergeReferenceVariants(records).map((entry) => buildReferenceEntryView(entry, context))\n}\n"]}
|
|
1
|
+
{"version":3,"file":"reference-model.js","sourceRoot":"","sources":["../../../src/lib/references/reference-model.ts"],"names":[],"mappings":"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","sourcesContent":["import { resolveDocumentTitle } from '@elytracms/core/cms-core'\nimport { localizedLabel } from '@elytracms/studio/lib/i18n'\nimport type { CmsDocument, CollectionDef } from '@elytracms/core/cms-core'\nimport type {\n ReferenceEntryRecord,\n ReferenceKind,\n ReferenceSource,\n ReferenceTarget,\n} from '@elytracms/core/persistence'\n\n/**\n * Pure presentation model for the EC-172 references panels.\n *\n * The EC-155 index stores entries as `(source, path, target, kind)` per\n * variant; this module turns those records into renderable rows: variants\n * merged onto one row (draft/published badges), human-readable source/\n * location/target labels, and deep-link descriptors that pinpoint the exact\n * field (CMS) or graph node (builder) a path identifies. No data fetching, no\n * React — everything here is a deterministic function of its inputs, so it is\n * fully testable in the node environment.\n */\n\n// --- Path parsing -------------------------------------------------------------\n\n/** Split a `collection:id` document key (the index's document source/target id). */\nexport function parseDocumentKey(key: string): { collection: string; id: string } | null {\n const separator = key.indexOf(':')\n if (separator <= 0 || separator === key.length - 1) return null\n return { collection: key.slice(0, separator), id: key.slice(separator + 1) }\n}\n\nexport interface DocumentFieldPath {\n /** Present for `localized/<locale>/<field>` paths. */\n locale?: string\n field: string\n /** Tokens below the field value (array indices, rich-text node paths). */\n rest: readonly string[]\n}\n\n/**\n * Parse a document index path (`values/<field>/…` or\n * `localized/<locale>/<field>/…`) onto the owning field.\n */\nexport function parseDocumentFieldPath(path: string): DocumentFieldPath | null {\n const tokens = path.split('/')\n if (tokens[0] === 'values' && tokens[1]) {\n return { field: tokens[1], rest: tokens.slice(2) }\n }\n if (tokens[0] === 'localized' && tokens[1] && tokens[2]) {\n return { locale: tokens[1], field: tokens[2], rest: tokens.slice(3) }\n }\n return null\n}\n\n// --- Variant merging ----------------------------------------------------------\n\n/** One panel row: the same logical entry across both variants, with flags. */\nexport interface MergedReferenceEntry {\n /** Stable row key (source + path + target + kind). */\n key: string\n source: ReferenceSource\n path: string\n target: ReferenceTarget\n kind: ReferenceKind\n /** Present in the draft variant of the index. */\n draft: boolean\n /** Present in the published variant (a live reference). */\n published: boolean\n}\n\n/**\n * Merge per-variant index records onto one row per logical entry. A\n * draft-only row (`draft && !published`) is the Sanity hidden-draft-reference\n * case the panel must make visible. Order is deterministic:\n * source type → source id → path → target type → target id → kind.\n */\nexport function mergeReferenceVariants(\n records: readonly ReferenceEntryRecord[],\n): MergedReferenceEntry[] {\n const byKey = new Map<string, MergedReferenceEntry>()\n for (const record of records) {\n const key = `${record.source.type} ${record.source.id} ${record.path} ${record.target.type} ${record.target.id} ${record.kind}`\n const existing = byKey.get(key)\n if (existing) {\n if (record.variant === 'draft') existing.draft = true\n else existing.published = true\n continue\n }\n byKey.set(key, {\n key,\n source: record.source,\n path: record.path,\n target: record.target,\n kind: record.kind,\n draft: record.variant === 'draft',\n published: record.variant === 'published',\n })\n }\n return [...byKey.values()].sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0))\n}\n\n// --- Labels & deep links --------------------------------------------------------\n\n/** Human label per reference kind (entry-row badge). */\nexport const REFERENCE_KIND_LABELS: Record<ReferenceKind, string> = {\n 'relation-field': 'relation',\n 'asset-field': 'asset field',\n 'rich-text-link': 'rich-text link',\n 'rich-text-node': 'rich-text node',\n 'component-usage': 'component usage',\n}\n\n/**\n * A deep-link descriptor the panel renders as a router link. `cms-field`\n * carries the full index path so the document editor can highlight the exact\n * field control; `builder-node` carries the resolved node id so the builder\n * can select + scroll to the node.\n */\nexport type ReferenceDeepLink =\n | { kind: 'cms-field'; collectionId: string; documentId: string; fieldPath?: string }\n | { kind: 'builder-node'; pageId?: string; nodeId?: string }\n | { kind: 'component'; componentId: string }\n | { kind: 'asset'; assetId: string }\n\n/** Everything the model needs to label entries (loaded once per panel). */\nexport interface ReferenceLabelContext {\n collections: readonly CollectionDef[]\n /** Live documents keyed by `collection:id`. */\n documents: ReadonlyMap<string, CmsDocument>\n /** Asset metadata keyed by asset id. */\n assets: ReadonlyMap<string, { filename: string; title?: string | undefined }>\n /** Resolves a component id to its manifest title (live registry lookup). */\n componentTitle: (componentId: string) => string | undefined\n}\n\n/** One fully-labelled panel row. */\nexport interface ReferenceEntryView extends MergedReferenceEntry {\n kindLabel: string\n /** The holding entity, e.g. `Post · Hello World` or `Page · Home`. */\n sourceLabel: string\n /** The exact location inside the source, e.g. `Author` or `Text (n-post-title)`. */\n locationLabel: string\n /** The referenced entity, e.g. `Ada Lovelace` or `cover.jpg`. */\n targetLabel: string\n /** Deep link to the exact source location (field control / graph node). */\n sourceLink: ReferenceDeepLink | null\n /** Link to the referenced entity's surface. */\n targetLink: ReferenceDeepLink | null\n}\n\nfunction fieldLabelOf(collection: CollectionDef | undefined, fieldName: string): string {\n const field = collection?.fields.find((f) => f.name === fieldName)\n // Non-hook `localizedLabel` reads the active UI locale (safe anywhere), so a\n // `{ en, de }` label resolves to the editor's language here too.\n return localizedLabel(field?.form?.label, fieldName)\n}\n\nfunction collectionLabelOf(collection: CollectionDef | undefined, collectionId: string): string {\n return (\n localizedLabel(collection?.form?.labelSingular) || localizedLabel(collection?.form?.label, collectionId)\n )\n}\n\n/** Resolve a document's display title (titleField value, default locale first). */\nexport function documentTitleOf(\n collection: CollectionDef | undefined,\n document: CmsDocument | undefined,\n fallback: string,\n): string {\n if (!collection || !document) return fallback\n // EC-242: a function `titleField` (title pattern) has no single source field —\n // resolve it from the base values via the shared identity resolver.\n if (typeof collection.titleField === 'function') {\n return resolveDocumentTitle(collection, document.values, fallback)\n }\n const field = typeof collection.titleField === 'string' ? collection.titleField : 'title'\n const direct = document.values[field]\n if (typeof direct === 'string' && direct.length > 0) return direct\n const locales = Object.keys(document.localized ?? {}).sort()\n const preferred = document.defaultLocale\n for (const locale of [preferred, ...locales]) {\n if (!locale) continue\n const value = document.localized?.[locale]?.[field]\n if (typeof value === 'string' && value.length > 0) return value\n }\n return fallback\n}\n\n/** Strip the namespace off a component id for compact labels. */\nexport function shortComponentId(componentId: string): string {\n return componentId.replace('base.primitives.', '').replace('project.', '')\n}\n\ninterface DocumentParts {\n collection: CollectionDef | undefined\n collectionId: string\n documentId: string\n title: string\n}\n\nfunction documentParts(context: ReferenceLabelContext, key: string): DocumentParts | null {\n const ref = parseDocumentKey(key)\n if (!ref) return null\n const collection = context.collections.find((c) => c.id === ref.collection)\n return {\n collection,\n collectionId: ref.collection,\n documentId: ref.id,\n title: documentTitleOf(collection, context.documents.get(key), ref.id),\n }\n}\n\nfunction describeDocumentSource(\n context: ReferenceLabelContext,\n entry: MergedReferenceEntry,\n): { sourceLabel: string; locationLabel: string; sourceLink: ReferenceDeepLink | null } {\n const parts = documentParts(context, entry.source.id)\n if (!parts) {\n return { sourceLabel: entry.source.id, locationLabel: entry.path, sourceLink: null }\n }\n const parsed = parseDocumentFieldPath(entry.path)\n const fieldLabel = parsed ? fieldLabelOf(parts.collection, parsed.field) : entry.path\n const qualifiers: string[] = []\n if (parsed?.locale) qualifiers.push(parsed.locale)\n if (entry.kind === 'rich-text-link') qualifiers.push('link')\n if (entry.kind === 'rich-text-node') qualifiers.push('embedded node')\n if (\n entry.kind === 'relation-field' &&\n parsed &&\n parsed.rest.length === 1 &&\n /^\\d+$/.test(parsed.rest[0]!)\n ) {\n qualifiers.push(`item ${parsed.rest[0]}`)\n }\n return {\n sourceLabel: `${collectionLabelOf(parts.collection, parts.collectionId)} · ${parts.title}`,\n locationLabel: qualifiers.length > 0 ? `${fieldLabel} (${qualifiers.join(', ')})` : fieldLabel,\n sourceLink: {\n kind: 'cms-field',\n collectionId: parts.collectionId,\n documentId: parts.documentId,\n fieldPath: entry.path,\n },\n }\n}\n\n\nfunction describeTarget(\n context: ReferenceLabelContext,\n target: ReferenceTarget,\n): { targetLabel: string; targetLink: ReferenceDeepLink | null } {\n switch (target.type) {\n case 'document': {\n const parts = documentParts(context, target.id)\n if (!parts) return { targetLabel: target.id, targetLink: null }\n return {\n targetLabel: `${collectionLabelOf(parts.collection, parts.collectionId)} · ${parts.title}`,\n targetLink: {\n kind: 'cms-field',\n collectionId: parts.collectionId,\n documentId: parts.documentId,\n },\n }\n }\n case 'component':\n return {\n targetLabel: context.componentTitle(target.id) ?? shortComponentId(target.id),\n targetLink: { kind: 'component', componentId: target.id },\n }\n case 'asset': {\n const asset = context.assets.get(target.id)\n return {\n targetLabel: asset ? (asset.title ?? asset.filename) : target.id,\n targetLink: { kind: 'asset', assetId: target.id },\n }\n }\n }\n}\n\n/** Label + link one merged entry (see {@link buildReferenceEntryViews}). */\nexport function buildReferenceEntryView(\n entry: MergedReferenceEntry,\n context: ReferenceLabelContext,\n): ReferenceEntryView {\n // EC-287: a reference source is only ever a CMS document (structure is code).\n const sourceParts = describeDocumentSource(context, entry)\n return {\n ...entry,\n kindLabel: REFERENCE_KIND_LABELS[entry.kind],\n ...sourceParts,\n ...describeTarget(context, entry.target),\n }\n}\n\n/** Merge variants and label every record — the panel's full render model. */\nexport function buildReferenceEntryViews(\n records: readonly ReferenceEntryRecord[],\n context: ReferenceLabelContext,\n): ReferenceEntryView[] {\n return mergeReferenceVariants(records).map((entry) => buildReferenceEntryView(entry, context))\n}\n"]}
|