@elytracms/studio 0.0.38 → 0.0.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/convex/cms.ts +8 -2
  2. package/dist/components/app-views/default-modules.d.ts +60 -5
  3. package/dist/components/app-views/default-modules.js +53 -15
  4. package/dist/components/app-views/default-modules.js.map +1 -1
  5. package/dist/components/app-views/module.d.ts +2 -0
  6. package/dist/components/app-views/module.js +8 -0
  7. package/dist/components/app-views/module.js.map +1 -1
  8. package/dist/components/assets/asset-detail.d.ts +24 -0
  9. package/dist/components/assets/asset-detail.js +163 -0
  10. package/dist/components/assets/asset-detail.js.map +1 -0
  11. package/dist/components/assets/asset-grid.d.ts +28 -0
  12. package/dist/components/assets/asset-grid.js +68 -0
  13. package/dist/components/assets/asset-grid.js.map +1 -0
  14. package/dist/components/assets/asset-metadata.d.ts +19 -0
  15. package/dist/components/assets/asset-metadata.js +44 -0
  16. package/dist/components/assets/asset-metadata.js.map +1 -1
  17. package/dist/components/assets/assets-collection-view-source.d.ts +54 -0
  18. package/dist/components/assets/assets-collection-view-source.js +186 -0
  19. package/dist/components/assets/assets-collection-view-source.js.map +1 -0
  20. package/dist/components/assets/assets-module.d.ts +18 -0
  21. package/dist/components/assets/assets-module.js +94 -0
  22. package/dist/components/assets/assets-module.js.map +1 -0
  23. package/dist/components/assets/assets-store.js +2 -7
  24. package/dist/components/assets/assets-store.js.map +1 -1
  25. package/dist/components/assets/assets-view-preference.d.ts +15 -0
  26. package/dist/components/assets/assets-view-preference.js +22 -0
  27. package/dist/components/assets/assets-view-preference.js.map +1 -0
  28. package/dist/components/builder/builder-store.d.ts +12 -0
  29. package/dist/components/builder/builder-store.js +18 -16
  30. package/dist/components/builder/builder-store.js.map +1 -1
  31. package/dist/components/builder/clipboard-actions.js +5 -14
  32. package/dist/components/builder/clipboard-actions.js.map +1 -1
  33. package/dist/components/builder/composition-field-editor-lazy.d.ts +19 -0
  34. package/dist/components/builder/composition-field-editor-lazy.js +29 -0
  35. package/dist/components/builder/composition-field-editor-lazy.js.map +1 -0
  36. package/dist/components/builder/composition-field-editor.js +1 -4
  37. package/dist/components/builder/composition-field-editor.js.map +1 -1
  38. package/dist/components/builder/insert-context.d.ts +8 -0
  39. package/dist/components/builder/insert-context.js +1 -3
  40. package/dist/components/builder/insert-context.js.map +1 -1
  41. package/dist/components/builder/page-tree.js +1 -3
  42. package/dist/components/builder/page-tree.js.map +1 -1
  43. package/dist/components/builder/property-inspector.js +7 -134
  44. package/dist/components/builder/property-inspector.js.map +1 -1
  45. package/dist/components/cms/cms-store.d.ts +15 -4
  46. package/dist/components/cms/cms-store.js +42 -24
  47. package/dist/components/cms/cms-store.js.map +1 -1
  48. package/dist/components/cms/collection-table.d.ts +8 -1
  49. package/dist/components/cms/collection-table.js +75 -11
  50. package/dist/components/cms/collection-table.js.map +1 -1
  51. package/dist/components/cms/column-width.d.ts +25 -0
  52. package/dist/components/cms/column-width.js +47 -0
  53. package/dist/components/cms/column-width.js.map +1 -0
  54. package/dist/components/cms/detail-editor.js +143 -79
  55. package/dist/components/cms/detail-editor.js.map +1 -1
  56. package/dist/components/cms/details-pane.d.ts +21 -8
  57. package/dist/components/cms/details-pane.js +31 -11
  58. package/dist/components/cms/details-pane.js.map +1 -1
  59. package/dist/components/cms/discard-draft.d.ts +32 -0
  60. package/dist/components/cms/discard-draft.js +13 -0
  61. package/dist/components/cms/discard-draft.js.map +1 -0
  62. package/dist/components/cms/document-staging.d.ts +7 -0
  63. package/dist/components/cms/document-staging.js +44 -0
  64. package/dist/components/cms/document-staging.js.map +1 -0
  65. package/dist/components/cms/field-connection.d.ts +22 -0
  66. package/dist/components/cms/field-connection.js +37 -0
  67. package/dist/components/cms/field-connection.js.map +1 -0
  68. package/dist/components/cms/field-control.js +167 -34
  69. package/dist/components/cms/field-control.js.map +1 -1
  70. package/dist/components/cms/prop-fields.d.ts +43 -0
  71. package/dist/components/cms/prop-fields.js +154 -0
  72. package/dist/components/cms/prop-fields.js.map +1 -0
  73. package/dist/components/cms/rich-text/component-embed.d.ts +17 -3
  74. package/dist/components/cms/rich-text/component-embed.js +29 -7
  75. package/dist/components/cms/rich-text/component-embed.js.map +1 -1
  76. package/dist/components/cms/rich-text/embed-props.d.ts +49 -0
  77. package/dist/components/cms/rich-text/embed-props.js +106 -0
  78. package/dist/components/cms/rich-text/embed-props.js.map +1 -0
  79. package/dist/components/cms/rich-text/index.d.ts +6 -1
  80. package/dist/components/cms/rich-text/index.js +6 -1
  81. package/dist/components/cms/rich-text/index.js.map +1 -1
  82. package/dist/components/cms/rich-text/lazy.d.ts +19 -0
  83. package/dist/components/cms/rich-text/lazy.js +26 -0
  84. package/dist/components/cms/rich-text/lazy.js.map +1 -0
  85. package/dist/components/cms/rich-text/link-control.js +3 -1
  86. package/dist/components/cms/rich-text/link-control.js.map +1 -1
  87. package/dist/components/cms/rich-text/toolbar-state.d.ts +45 -0
  88. package/dist/components/cms/rich-text/toolbar-state.js +66 -0
  89. package/dist/components/cms/rich-text/toolbar-state.js.map +1 -0
  90. package/dist/components/cms/rich-text/toolbar.js +7 -15
  91. package/dist/components/cms/rich-text/toolbar.js.map +1 -1
  92. package/dist/components/cms/row-actions.d.ts +28 -0
  93. package/dist/components/cms/row-actions.js +20 -0
  94. package/dist/components/cms/row-actions.js.map +1 -0
  95. package/dist/components/cms/use-document-versions.d.ts +8 -1
  96. package/dist/components/cms/use-document-versions.js +31 -4
  97. package/dist/components/cms/use-document-versions.js.map +1 -1
  98. package/dist/components/cms/version-compare-lazy.d.ts +1 -0
  99. package/dist/components/cms/version-compare-lazy.js +23 -0
  100. package/dist/components/cms/version-compare-lazy.js.map +1 -0
  101. package/dist/components/cms/version-compare-text.d.ts +46 -0
  102. package/dist/components/cms/version-compare-text.js +78 -0
  103. package/dist/components/cms/version-compare-text.js.map +1 -1
  104. package/dist/components/cms/version-compare.d.ts +9 -5
  105. package/dist/components/cms/version-compare.js +217 -64
  106. package/dist/components/cms/version-compare.js.map +1 -1
  107. package/dist/components/cms/versions-pane.js +10 -4
  108. package/dist/components/cms/versions-pane.js.map +1 -1
  109. package/dist/components/components/component-detail.d.ts +5 -3
  110. package/dist/components/components/component-detail.js +41 -8
  111. package/dist/components/components/component-detail.js.map +1 -1
  112. package/dist/components/components/component-preview.d.ts +97 -0
  113. package/dist/components/components/component-preview.js +202 -0
  114. package/dist/components/components/component-preview.js.map +1 -0
  115. package/dist/components/components/components-index.d.ts +5 -3
  116. package/dist/components/components/components-index.js +19 -24
  117. package/dist/components/components/components-index.js.map +1 -1
  118. package/dist/components/components/registry-browser.d.ts +7 -0
  119. package/dist/components/components/registry-browser.js +20 -36
  120. package/dist/components/components/registry-browser.js.map +1 -1
  121. package/dist/components/components/taxonomy.d.ts +51 -0
  122. package/dist/components/components/taxonomy.js +73 -0
  123. package/dist/components/components/taxonomy.js.map +1 -0
  124. package/dist/components/components/transfer-dialog.d.ts +20 -0
  125. package/dist/components/components/transfer-dialog.js +64 -0
  126. package/dist/components/components/transfer-dialog.js.map +1 -0
  127. package/dist/components/components/transfer.d.ts +43 -0
  128. package/dist/components/components/transfer.js +31 -0
  129. package/dist/components/components/transfer.js.map +1 -0
  130. package/dist/components/project-list.js +3 -4
  131. package/dist/components/project-list.js.map +1 -1
  132. package/dist/components/project-switcher.js +3 -2
  133. package/dist/components/project-switcher.js.map +1 -1
  134. package/dist/components/rail-store-status.d.ts +21 -0
  135. package/dist/components/rail-store-status.js +21 -0
  136. package/dist/components/rail-store-status.js.map +1 -0
  137. package/dist/components/redirects/redirects-module.js +4 -8
  138. package/dist/components/redirects/redirects-module.js.map +1 -1
  139. package/dist/components/redirects/redirects-store.js +2 -7
  140. package/dist/components/redirects/redirects-store.js.map +1 -1
  141. package/dist/components/sign-in-needed-badge.d.ts +6 -0
  142. package/dist/components/sign-in-needed-badge.js +13 -0
  143. package/dist/components/sign-in-needed-badge.js.map +1 -0
  144. package/dist/components/studio-project-screen.js +1 -4
  145. package/dist/components/studio-project-screen.js.map +1 -1
  146. package/dist/components/studio-shell.js +1 -4
  147. package/dist/components/studio-shell.js.map +1 -1
  148. package/dist/components/users/users-module.js +5 -7
  149. package/dist/components/users/users-module.js.map +1 -1
  150. package/dist/components/users/users-store.js +2 -7
  151. package/dist/components/users/users-store.js.map +1 -1
  152. package/dist/lib/auth/index.js +1 -1
  153. package/dist/lib/auth/index.js.map +1 -1
  154. package/dist/lib/clipboard/paste-target.js +1 -3
  155. package/dist/lib/clipboard/paste-target.js.map +1 -1
  156. package/dist/lib/cms-views/view-model.d.ts +0 -2
  157. package/dist/lib/cms-views/view-model.js +0 -7
  158. package/dist/lib/cms-views/view-model.js.map +1 -1
  159. package/dist/lib/diff-view-preference.d.ts +7 -0
  160. package/dist/lib/diff-view-preference.js +21 -0
  161. package/dist/lib/diff-view-preference.js.map +1 -0
  162. package/dist/lib/i18n/messages.en.js +94 -33
  163. package/dist/lib/i18n/messages.en.js.map +1 -1
  164. package/dist/lib/local-preference.d.ts +11 -0
  165. package/dist/lib/local-preference.js +26 -0
  166. package/dist/lib/local-preference.js.map +1 -0
  167. package/dist/lib/locale/fallback.d.ts +45 -0
  168. package/dist/lib/locale/fallback.js +85 -0
  169. package/dist/lib/locale/fallback.js.map +1 -1
  170. package/dist/lib/persona/labels.d.ts +6 -0
  171. package/dist/lib/persona/labels.js +8 -0
  172. package/dist/lib/persona/labels.js.map +1 -1
  173. package/dist/lib/query/index.d.ts +1 -1
  174. package/dist/lib/query/index.js +1 -1
  175. package/dist/lib/query/index.js.map +1 -1
  176. package/dist/lib/query/operations-query.d.ts +14 -2
  177. package/dist/lib/query/operations-query.js +11 -6
  178. package/dist/lib/query/operations-query.js.map +1 -1
  179. package/dist/lib/rail.d.ts +0 -6
  180. package/dist/lib/rail.js +6 -25
  181. package/dist/lib/rail.js.map +1 -1
  182. package/dist/lib/theme.d.ts +0 -6
  183. package/dist/lib/theme.js +10 -13
  184. package/dist/lib/theme.js.map +1 -1
  185. package/dist/router/match.d.ts +1 -0
  186. package/dist/router/match.js +4 -0
  187. package/dist/router/match.js.map +1 -1
  188. package/dist/ui/button.d.ts +1 -1
  189. package/package.json +22 -25
@@ -24,6 +24,7 @@ export const EN_MESSAGES = {
24
24
  // Common — generic, reused across surfaces
25
25
  // ─────────────────────────────────────────────────────────────────────────
26
26
  'common.save': msg('Save'),
27
+ 'common.saving': msg('Saving…'),
27
28
  'common.saveChanges': msg('Save changes'),
28
29
  'common.cancel': msg('Cancel'),
29
30
  'common.delete': msg('Delete'),
@@ -145,6 +146,9 @@ export const EN_MESSAGES = {
145
146
  'cms.list.newPage': msg('New page'),
146
147
  'cms.list.newNamed': msg('New {noun}', 'Empty-state create button; {noun} is the singular collection label.'),
147
148
  'cms.list.moreActions': msg('More actions'),
149
+ 'cms.list.rowActionsColumnLabel': msg('Row actions', 'Screen-reader label of the row-action-menu column header (EC-316).'),
150
+ 'cms.list.rowActionsLabel': msg('Actions for {id}', 'Aria-label of one row’s ⋮ action-menu trigger.'),
151
+ 'cms.list.rowAction.open': msg('Open', 'Row-menu item: open the document’s detail editor.'),
148
152
  'cms.list.import': msg('Import…'),
149
153
  'cms.list.export': msg('Export'),
150
154
  'cms.list.forReview': msg('For review', 'Prefix in the collection-shape-drift banner heading.'),
@@ -236,6 +240,19 @@ export const EN_MESSAGES = {
236
240
  'cms.editor.publish': msg('Publish'),
237
241
  'cms.editor.moreActions': msg('More actions'),
238
242
  'cms.editor.unpublish': msg('Unpublish'),
243
+ // 0.0.39 — the Publish button is a split button: primary Publish (stay) + a
244
+ // "Publish & close" dropdown item (publish, then return to the list). Replaces the
245
+ // retired EC-316 "Save & close" (autosave made a bare "Save" meaningless).
246
+ 'cms.editor.publishActions': msg('Publish options', 'aria-label for the Publish split-button dropdown trigger.'),
247
+ 'cms.editor.publishAndClose': msg('Publish & close', 'Split-button item: publish the document, then return to the collection list (0.0.39, replaces EC-316 Save & close).'),
248
+ 'cms.editor.saveAndClose': msg('Save & close', 'Header action: save the draft, then return to the collection list (EC-316).'),
249
+ 'cms.editor.discardDraft': msg('Discard changes', 'Header ⋯-menu item: revert the draft to the published content (EC-316).'),
250
+ 'cms.editor.discardDraftUpToDateHint': msg('The draft matches the published version — nothing to discard.'),
251
+ 'cms.editor.switchToDraftToDiscard': msg('Switch to Draft to discard changes'),
252
+ 'cms.editor.discardDraftTitle': msg('Discard draft changes?'),
253
+ 'cms.editor.discardDraftDescription': msg('This reverts the draft to the currently published content. Your unpublished edits are replaced — a snapshot of them is kept in the version history.'),
254
+ 'cms.editor.discardDraftConfirm': msg('Discard changes'),
255
+ 'cms.editor.discardingDraft': msg('Discarding…'),
239
256
  'cms.editor.draftState': msg('Draft'),
240
257
  'cms.editor.publishToViewPublished': msg('Publish this document to view its published version'),
241
258
  'cms.editor.publishedReadOnlyBanner': msg('Viewing the published version — read-only.'),
@@ -248,10 +265,19 @@ export const EN_MESSAGES = {
248
265
  'cms.editor.publishAlsoHasIssues.one': msg('This page also has {count} other unresolved issue — see the Issues tab.'),
249
266
  'cms.editor.publishAlsoHasIssues.other': msg('This page also has {count} other unresolved issues — see the Issues tab.'),
250
267
  'cms.editor.publishAnyway': msg('Publish anyway'),
251
- 'cms.editor.fieldShowingFallback': msg('showing {locale}'),
252
- 'cms.editor.fieldTranslatedTo': msg('translated to {locale}'),
253
268
  'cms.editor.readOnlyBadge': msg('read-only'),
254
- 'cms.editor.fieldFallbackHint': msg('Showing the {source} (fallback) value — edit to translate to {locale}. Clearing the {locale} text falls back again.'),
269
+ // EC-318 — connected fields: the per-field localization connection affordance that
270
+ // replaces EC-176's passive "showing EN" text. Shown only on a localized field in a
271
+ // non-base locale (never on the base locale, non-localized fields, or read-only).
272
+ 'cms.editor.localeFollowsBase': msg('Follows {base}', 'Connected chip — this field inherits the base-locale value. {base} is the base locale code, e.g. "EN".'),
273
+ 'cms.editor.localeFollowsHint': msg('This field follows the {base} value. Type to translate it, or fill from {base} to start from a copy.'),
274
+ 'cms.editor.localeFillFromBase': msg('Fill from {base}', 'Action — copy the base-locale value in as a translation starting point.'),
275
+ 'cms.editor.localeTranslated': msg('Translated', 'Diverged chip — this field owns its own value in the active locale.'),
276
+ 'cms.editor.localeTranslatedHint': msg('Translated for {locale}. Clearing the text reconnects it to the {base} value — an intentionally-empty translation is not supported.'),
277
+ 'cms.editor.localeResetToBase': msg('Reset to {base}', 'Action — discard the translation so the field follows the base locale again.'),
278
+ 'cms.editor.localeResetTitle': msg('Reset to the {base} value?'),
279
+ 'cms.editor.localeResetDescription': msg('This removes the {locale} translation for this field. It will follow the {base} value again until you translate it.'),
280
+ 'cms.editor.localeResetConfirm': msg('Reset to {base}'),
255
281
  'cms.editor.issuesPane': msg('Issues'),
256
282
  'cms.editor.detailsPane': msg('Details'),
257
283
  'cms.editor.servedAt': msg('Served at {path}'),
@@ -273,6 +299,11 @@ export const EN_MESSAGES = {
273
299
  'cms.details.slotInUse': msg(' — in use', 'Suffix on a slot option already taken by another document.'),
274
300
  '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.'),
275
301
  'cms.details.empty': msg('No document properties to set.'),
302
+ // 0.0.39 — the document-level URL affordance (the EC-315 "hybrid split"): the full
303
+ // composed path as its own Details row, with ancestor-document segments linking to
304
+ // their editors and static route segments as plain text.
305
+ 'cms.details.url': msg('URL', 'Details pane section: the document’s composed URL path.'),
306
+ 'cms.details.urlCurrent': msg('this page', 'Tooltip on the final URL segment — the document being edited.'),
276
307
  // ─────────────────────────────────────────────────────────────────────────
277
308
  // CMS — import dialog
278
309
  // ─────────────────────────────────────────────────────────────────────────
@@ -288,6 +319,8 @@ export const EN_MESSAGES = {
288
319
  'cms.version.compare': msg('Compare'),
289
320
  'cms.version.closeCompare': msg('Close compare'),
290
321
  'cms.version.loadingHistory': msg('Loading version history…'),
322
+ // Shown in the lazy boundary while the version-compare chunk loads (EC-322).
323
+ 'cms.version.loadingCompare': msg('Loading the comparison…'),
291
324
  'cms.version.versionUnavailable': msg('That version is no longer available. Pick another to compare.'),
292
325
  'cms.version.currentDraft': msg('Current draft'),
293
326
  'cms.version.unsavedEdits': msg('unsaved edits'),
@@ -304,11 +337,11 @@ export const EN_MESSAGES = {
304
337
  'cms.version.versionsIdentical': msg('These two versions are identical.'),
305
338
  'cms.version.beforeVersion': msg('Before · v{version}'),
306
339
  'cms.version.afterTarget': msg('After · {target}'),
307
- 'cms.version.restoreField': msg('Restore {field}'),
308
- 'cms.version.restoreFieldLocale': msg('Restore {field} ({locale})'),
340
+ 'cms.version.restoreField': msg('Restore {field} from v{version}'),
341
+ 'cms.version.restoreFieldLocale': msg('Restore {field} ({locale}) from v{version}'),
309
342
  'cms.version.textUnchanged': msg('Text unchanged — formatting or whitespace differs.'),
310
343
  'cms.version.contentChanged': msg('Content changed.'),
311
- 'cms.version.restoreBlock': msg('Restore this block'),
344
+ 'cms.version.restoreBlock': msg('Restore this block from v{version}'),
312
345
  'cms.version.nestedContentChanged': msg('Nested content changed.'),
313
346
  'cms.version.blockAdded': msg('Block added.'),
314
347
  'cms.version.blockRemoved': msg('Block removed.'),
@@ -331,6 +364,14 @@ export const EN_MESSAGES = {
331
364
  'cms.version.compareVersionLabel': msg('Compare v{version}'),
332
365
  'cms.version.switchToDraftToRestore': msg('Switch to Draft to restore'),
333
366
  'cms.version.restore': msg('Restore'),
367
+ // EC-317 — descriptor lane, unified/side-by-side toggle, truncation, zebra.
368
+ 'cms.version.fieldColumnHeader': msg('Field'),
369
+ 'cms.version.viewSideBySide': msg('Side by side'),
370
+ 'cms.version.viewUnified': msg('Unified'),
371
+ 'cms.version.viewModeAriaLabel': msg('Diff layout'),
372
+ 'cms.version.unifiedCaption': msg('v{base} → {target}'),
373
+ 'cms.version.showMore': msg('Show more'),
374
+ 'cms.version.showLess': msg('Show less'),
334
375
  // ─────────────────────────────────────────────────────────────────────────
335
376
  // CMS — delete/unpublish reference-confirm dialog
336
377
  // ─────────────────────────────────────────────────────────────────────────
@@ -371,6 +412,10 @@ export const EN_MESSAGES = {
371
412
  'cms.field.value': msg('Value', 'Default aria-label for the scalar value editor.'),
372
413
  'cms.field.valuePlaceholder': msg('value'),
373
414
  'cms.field.colour': msg('Colour', 'aria-label on the colour-swatch field control.'),
415
+ // EC-315 — the smart slug / URL-segment control.
416
+ 'cms.field.slug.regenerate': msg('Regenerate the slug', 'Tooltip on the ↻ button that re-derives the slug from its source field.'),
417
+ 'cms.field.slug.taken': msg('Already used by “{title}”', 'Inline warning when the slug collides with another document.'),
418
+ 'cms.field.slug.takenGeneric': msg('This slug is already in use.', 'Inline warning when a custom uniqueness check reports the slug is taken.'),
374
419
  // ─────────────────────────────────────────────────────────────────────────
375
420
  // CMS — relation picker
376
421
  // ─────────────────────────────────────────────────────────────────────────
@@ -411,15 +456,10 @@ export const EN_MESSAGES = {
411
456
  'cms.asset.empty': msg('No assets yet — drop files here or use Upload.'),
412
457
  'cms.asset.noAltText': msg('No alt text'),
413
458
  // ─────────────────────────────────────────────────────────────────────────
414
- // Assets library (section)
459
+ // Assets rail (EC-319: the universal list + grid/list toggle + detail surface)
415
460
  // ─────────────────────────────────────────────────────────────────────────
416
- 'assets.title': msg('Assets'),
417
461
  'assets.error.loadFailed': msg('Assets failed to load'),
418
462
  'assets.loading': msg('Loading assets…'),
419
- 'assets.searchPlaceholder': msg('Search assets…'),
420
- 'assets.searchLabel': msg('Search assets'),
421
- 'assets.searchEmpty': msg('No assets match your search.'),
422
- 'assets.dropHint': msg('Drop files anywhere to upload, or use the Upload button.'),
423
463
  'assets.uploads.heading': msg('Uploads'),
424
464
  'assets.upload.phase.queued': msg('queued'),
425
465
  'assets.upload.phase.preparing': msg('preparing'),
@@ -429,17 +469,13 @@ export const EN_MESSAGES = {
429
469
  'assets.upload.phase.failed': msg('failed'),
430
470
  'assets.upload.attempt': msg('attempt {count}'),
431
471
  'assets.upload.dismissLabel': msg('Dismiss upload'),
432
- 'assets.card.altPrefix': msg('Alt: {alt}'),
433
- 'assets.card.noAlt': msg('No alt text'),
434
- 'assets.card.referencesLabel': msg('References of {filename}'),
435
- 'assets.card.editLabel': msg('Edit {filename}'),
472
+ 'assets.viewToggle.groupLabel': msg('List or grid view'),
473
+ 'assets.viewToggle.list': msg('List view'),
474
+ 'assets.viewToggle.grid': msg('Grid view'),
475
+ 'assets.detail.metadataHeading': msg('Metadata'),
476
+ 'assets.references.buttonLabel': msg('References'),
436
477
  'assets.references.title': msg('Used by — {name}'),
437
478
  'assets.references.description': msg('Everything referencing this asset, with deep links to the exact field or node.'),
438
- 'assets.edit.title': msg('Edit {filename}'),
439
- 'assets.edit.description': msg('Alt text flows through the delivery shape into rendered markup; the title is the library display name.'),
440
- 'assets.edit.altLabel': msg('Alt text'),
441
- 'assets.edit.altPlaceholder': msg('Describe the image…'),
442
- 'assets.edit.titleLabel': msg('Title'),
443
479
  'assets.delete.raceError.one': msg('Asset is now referenced in {count} place — reopen to review.'),
444
480
  'assets.delete.raceError.other': msg('Asset is now referenced in {count} places — reopen to review.'),
445
481
  'assets.delete.title': msg('Delete {filename}?'),
@@ -511,16 +547,38 @@ export const EN_MESSAGES = {
511
547
  'components.status.description.incompatible': msg('Manifest is registered but no implementation is available — the renderer will show a fallback.'),
512
548
  'components.status.description.invalid': msg('The registry reported a structured issue for this component.'),
513
549
  'components.index.title': msg('Component registry'),
514
- 'components.index.subtitle': msg('Browse the platform primitives and this project’s components. Select one to inspect its manifest, fields, and preview fixtures.'),
550
+ 'components.index.subtitle': msg('Browse the platform primitives and this project’s components. Select one to inspect its manifest, edit props against a live preview, and see where it is used.'),
515
551
  'components.index.stat.total': msg('Components'),
516
- 'components.index.stat.totalHint': msg('{primitives} primitives · {projects} project'),
552
+ 'components.index.stat.totalHint': msg('{primitives} base · {projects} project'),
517
553
  'components.index.stat.valid': msg('Valid'),
518
554
  'components.index.stat.needAttention': msg('Need attention'),
519
555
  'components.index.stat.needAttentionHint': msg('{incompatible} incompatible · {invalid} invalid'),
520
- '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.'),
521
- 'components.index.guide.title': msg('Registering project components'),
522
- 'components.index.guide.badge': msg('guide'),
523
- 'components.index.guide.fullGuide': msg('Full guide: {path}'),
556
+ 'components.index.pickHint': msg('Pick a component from the list to open its detail view — a live editable preview, the prop & slot manifest, and where it is used.'),
557
+ 'components.index.byCategory': msg('By category'),
558
+ 'components.index.guide.title': msg('Registering & extending components'),
559
+ 'components.index.guide.badge': msg('for developers'),
560
+ 'components.index.guide.intro': msg('Components are code, owned by your repo. Register a manifest (prop schemas, defaults, inspector controls, slots, and preview fixtures) and the studio browses, inspects, and previews it. These in-repo guides cover the details:'),
561
+ 'components.index.guide.doc.authoring': msg('How to declare and register a component so the studio can browse, inspect, and preview it.'),
562
+ 'components.index.guide.doc.fixtures': msg('Authoring deterministic preview fixtures — the states shown in this view’s live preview.'),
563
+ 'components.index.guide.doc.extensibility': msg('Extending the platform: custom field types, data sources, export targets, and plugins.'),
564
+ 'components.index.guide.namespaceNote': msg('Project code registers under the project.* namespace; platform primitives live under base.*'),
565
+ 'components.taxonomy.uncategorized': msg('Uncategorized'),
566
+ 'components.detail.tab.preview': msg('Preview'),
567
+ 'components.detail.tab.manifest': msg('Manifest'),
568
+ 'components.preview.reset': msg('Reset state'),
569
+ 'components.preview.resetProps': msg('Reset props'),
570
+ 'components.preview.edited': msg('edited'),
571
+ 'components.preview.incompatibleNote': msg('No implementation is wired up — the renderer is showing its fallback.'),
572
+ 'components.preview.serverOnlyTitle': msg('Server-only component'),
573
+ 'components.preview.serverOnlyBody': msg('This component is not client-renderable, so it can’t run in the live preview. It still renders in your delivery frames.'),
574
+ 'components.preview.slotsNote': msg('Slot content in the preview follows the selected state. Full slot editing happens in a document’s canvas — transfer this combination into one with “Use in document…”.'),
575
+ 'components.preview.unavailableTitle': msg('Preview unavailable', 'Shown in place of a component preview that threw while rendering.'),
576
+ 'components.preview.propNeedsDocument': msg('Editable in a document — no workspace context in the component preview.', 'Hint under an asset/relation/object prop control in the read-only component preview.'),
577
+ 'components.transfer.action': msg('Use in document…'),
578
+ 'components.transfer.title': msg('Use “{name}” in a document'),
579
+ 'components.transfer.description': msg('Create a new draft whose blocks field holds this combination, then open it.'),
580
+ 'components.transfer.intoField': msg('into'),
581
+ 'components.transfer.noTargets': msg('No collection declares a blocks field to transfer into.'),
524
582
  'components.fieldInspector.props': msg('Props'),
525
583
  'components.fieldInspector.noProps': msg('This component declares no editable props.'),
526
584
  'components.fieldInspector.slots': msg('Slots'),
@@ -528,10 +586,7 @@ export const EN_MESSAGES = {
528
586
  'components.fieldInspector.inline': msg('inline'),
529
587
  'components.fieldInspector.default': msg('default'),
530
588
  'components.fieldInspector.allows': msg('allows'),
531
- 'components.fixtureRunner.preview': msg('Preview'),
532
- 'components.fixtureRunner.stateCount.one': msg('{count} state'),
533
- 'components.fixtureRunner.stateCount.other': msg('{count} states'),
534
- 'components.fixtureRunner.statesAria': msg('Fixture states'),
589
+ 'components.fixtureRunner.statesAria': msg('Preview states'),
535
590
  'components.browser.searchPlaceholder': msg('Search components…'),
536
591
  'components.browser.searchAria': msg('Search components'),
537
592
  'components.browser.namespaceAria': msg('Filter by namespace'),
@@ -606,6 +661,8 @@ export const EN_MESSAGES = {
606
661
  // ─────────────────────────────────────────────────────────────────────────
607
662
  // Builder / canvas
608
663
  // ─────────────────────────────────────────────────────────────────────────
664
+ // Shown in the lazy boundary while the page-builder canvas chunk loads (EC-322).
665
+ 'builder.canvas.loading': msg('Loading the page builder…'),
609
666
  'builder.blocksPanel.title': msg('Insert block'),
610
667
  'builder.blocksPanel.addsInto': msg('Adds into {destination}.'),
611
668
  'builder.blocksPanel.searchPlaceholder': msg('Search blocks…'),
@@ -707,6 +764,8 @@ export const EN_MESSAGES = {
707
764
  // CMS rich-text editor (EC-314) — the TipTap field editor
708
765
  // ─────────────────────────────────────────────────────────────────────────
709
766
  'richText.placeholder': msg('Write something…'),
767
+ // Shown in the lazy boundary while the TipTap editor chunk loads (EC-322).
768
+ 'richText.loading': msg('Loading editor…'),
710
769
  'richText.bold': msg('Bold'),
711
770
  'richText.italic': msg('Italic'),
712
771
  'richText.underline': msg('Underline'),
@@ -714,7 +773,6 @@ export const EN_MESSAGES = {
714
773
  'richText.code': msg('Inline code'),
715
774
  'richText.paragraph': msg('Paragraph'),
716
775
  'richText.heading': msg('Heading {level}'),
717
- 'richText.style': msg('Style'),
718
776
  'richText.bulletList': msg('Bulleted list'),
719
777
  'richText.orderedList': msg('Numbered list'),
720
778
  'richText.blockquote': msg('Quote'),
@@ -731,11 +789,14 @@ export const EN_MESSAGES = {
731
789
  'richText.link.documentEmpty': msg('No documents match.'),
732
790
  'richText.link.apply': msg('Apply'),
733
791
  'richText.image.add': msg('Image'),
734
- 'richText.image.alt': msg('Alt text'),
735
792
  'richText.embed.add': msg('Embed component'),
736
793
  'richText.embed.badge': msg('Embed'),
737
794
  'richText.embed.unknown': msg('Unknown component'),
738
795
  'richText.embed.empty': msg('No components available to embed.'),
796
+ 'richText.embed.editProps': msg('Edit settings'),
797
+ 'richText.embed.editTitle': msg('Edit {name}'),
798
+ 'richText.embed.noProps': msg('This component has no editable settings.'),
799
+ 'richText.embed.blocksNote': msg('Nested content areas are edited on the canvas, not here.'),
739
800
  'richText.slash.text': msg('Text'),
740
801
  'richText.slash.empty': msg('No matching blocks'),
741
802
  };