@jxsuite/studio 6.1.2 → 8.0.0

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 (522) hide show
  1. package/README.md +5 -5
  2. package/dist/chunks/2020-5wtzce5g.js +4 -0
  3. package/dist/chunks/adapter-5tphg7xe.js +4 -0
  4. package/dist/chunks/add-new-flow-psym14sn.js +4 -0
  5. package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
  6. package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
  7. package/dist/chunks/{color-area-0fj8a4ga.js → color-area-6rbra5dy.js} +2 -2
  8. package/dist/chunks/{color-field-xch8kx2g.js → color-field-gy56c94g.js} +3 -3
  9. package/dist/chunks/color-m7r1vk54.js +4 -0
  10. package/dist/chunks/{color-slider-jxd8v350.js → color-slider-sqqdyf6c.js} +2 -2
  11. package/dist/chunks/{combobox-p0efwjke.js → combobox-72h32ejk.js} +3 -3
  12. package/dist/chunks/components-r22xca09.js +4 -0
  13. package/dist/chunks/content-source-mmppmcyg.js +4 -0
  14. package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
  15. package/dist/chunks/editor-ccd9jwsa.js +4 -0
  16. package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
  17. package/dist/chunks/extension-sections-0egb88dm.js +4 -0
  18. package/dist/chunks/file-ops-qnab36ek.js +4 -0
  19. package/dist/chunks/files-rcn56qvm.js +4 -0
  20. package/dist/chunks/format-host-yxz0kjjs.js +4 -0
  21. package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
  22. package/dist/chunks/grid-open-4z1g062t.js +4 -0
  23. package/dist/chunks/{grid-view-d2wq9ezg.js → grid-view-qg1b5eqx.js} +25 -25
  24. package/dist/chunks/{icons-pnfz478q.js → icons-63bjtbs7.js} +2 -2
  25. package/dist/chunks/{iframe-entry-jdcktez8.js → iframe-entry-2zggzajv.js} +4 -4
  26. package/dist/chunks/{iframe-entry-zap785cw.js → iframe-entry-76j8vwwx.js} +4 -4
  27. package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
  28. package/dist/chunks/{iframe-entry-x0ygf2yr.js → iframe-entry-pkgmcgp0.js} +4 -4
  29. package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
  30. package/dist/chunks/{index-zpjmzqfk.js → index-32eqzv1k.js} +3 -3
  31. package/dist/chunks/index-f0jn7nnp.js +4 -0
  32. package/dist/chunks/{javascript-m54mnwp6.js → javascript-pjp734q4.js} +3 -3
  33. package/dist/chunks/jsonMode-njkvsa02.js +13 -0
  34. package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
  35. package/dist/chunks/layers-bgyr11tr.js +4 -0
  36. package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
  37. package/dist/chunks/{listbox-e74qjyq6.js → listbox-c421cf8c.js} +2 -2
  38. package/dist/chunks/lit-html-v9gh687x.js +4 -0
  39. package/dist/chunks/media-library-sq468wts.js +4 -0
  40. package/dist/chunks/media-picker-shfe59pt.js +4 -0
  41. package/dist/chunks/{menu-n6yzswmy.js → menu-bdpzbfvs.js} +2 -2
  42. package/dist/chunks/{monaco-binding-7gx83x3r.js → monaco-binding-vq1hgnn0.js} +3 -3
  43. package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
  44. package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
  45. package/dist/chunks/notify-kzrjr3fv.js +4 -0
  46. package/dist/chunks/parse-v77xtwv7.js +4 -0
  47. package/dist/chunks/platform-7v4rtd7m.js +4 -0
  48. package/dist/chunks/popover-b89sfej7.js +4 -0
  49. package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
  50. package/dist/chunks/publish-quick-qx2455cj.js +4 -0
  51. package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
  52. package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
  53. package/dist/chunks/references-9547rg5s.js +4 -0
  54. package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
  55. package/dist/chunks/source-control-kwktr9y6.js +4 -0
  56. package/dist/chunks/{split-n2gfpm5m.js → split-c9zfdgxf.js} +2 -2
  57. package/dist/chunks/studio-03ct6yfv.js +9 -0
  58. package/dist/chunks/studio-07rcfje3.js +5 -0
  59. package/dist/chunks/studio-3e54qh39.js +7 -0
  60. package/dist/chunks/studio-3exxhz5g.js +5 -0
  61. package/dist/chunks/studio-3q40e3rj.js +5 -0
  62. package/dist/chunks/studio-3qeh9t0h.js +6 -0
  63. package/dist/chunks/studio-3qqjeep5.js +6 -0
  64. package/dist/chunks/studio-43sd2mam.js +4 -0
  65. package/dist/chunks/studio-4hp8pkyt.js +5 -0
  66. package/dist/chunks/studio-58xg6j2q.js +9 -0
  67. package/dist/chunks/studio-5g0rprdt.js +7 -0
  68. package/dist/chunks/{studio-2j1cb95x.js → studio-6m380wp7.js} +4 -4
  69. package/dist/chunks/studio-80jyh1xh.js +4 -0
  70. package/dist/chunks/studio-83mk4bgg.js +9 -0
  71. package/dist/chunks/{studio-v0jzqdjm.js → studio-881z1xrx.js} +4 -4
  72. package/dist/chunks/studio-8m0y2qe7.js +5 -0
  73. package/dist/chunks/{studio-d81xfh1g.js → studio-8tr6cfrc.js} +4 -4
  74. package/dist/chunks/studio-8vcvfs7r.js +6 -0
  75. package/dist/chunks/studio-9tmebf0s.js +5 -0
  76. package/dist/chunks/studio-a2bvaptz.js +5 -0
  77. package/dist/chunks/studio-b7y5mr30.js +5 -0
  78. package/dist/chunks/studio-bavb31r0.js +5 -0
  79. package/dist/chunks/{studio-dgz8d0c1.js → studio-bbe4c90a.js} +4 -4
  80. package/dist/chunks/studio-c05wdnt3.js +5 -0
  81. package/dist/chunks/studio-ccv2svc6.js +5 -0
  82. package/dist/chunks/studio-d5grtb9e.js +16 -0
  83. package/dist/chunks/studio-df0baea9.js +5 -0
  84. package/dist/chunks/studio-dgk4dqtx.js +7 -0
  85. package/dist/chunks/studio-e1g64q43.js +5 -0
  86. package/dist/chunks/studio-ed1hp6zf.js +6 -0
  87. package/dist/chunks/studio-ed3xx40h.js +7 -0
  88. package/dist/chunks/studio-f14e1zdj.js +5 -0
  89. package/dist/chunks/studio-fbhxxc5f.js +5 -0
  90. package/dist/chunks/studio-fyh0jc96.js +5 -0
  91. package/dist/chunks/studio-gcxk20n7.js +5 -0
  92. package/dist/chunks/studio-jaaz8ce9.js +5 -0
  93. package/dist/chunks/{studio-90pq9km1.js → studio-jcnsdaep.js} +4 -4
  94. package/dist/chunks/studio-jsgf2q5k.js +7 -0
  95. package/dist/chunks/{studio-0q988f9w.js → studio-k3xxbagr.js} +3 -3
  96. package/dist/chunks/{studio-5ve6bbep.js → studio-k7evxqh4.js} +4 -4
  97. package/dist/chunks/studio-kt3pjkwd.js +5 -0
  98. package/dist/chunks/studio-m8g16bgz.js +5 -0
  99. package/dist/chunks/studio-mn0476ag.js +5 -0
  100. package/dist/chunks/studio-mx1smyq0.js +5 -0
  101. package/dist/chunks/studio-n0c5h6mf.js +5 -0
  102. package/dist/chunks/{studio-485046te.js → studio-nh6d342n.js} +7 -7
  103. package/dist/chunks/studio-nqxqf8p2.js +4 -0
  104. package/dist/chunks/studio-p4nrkvqr.js +5 -0
  105. package/dist/chunks/{studio-1fxkaaea.js → studio-pbxa5fpc.js} +4 -4
  106. package/dist/chunks/studio-pgmvdv7z.js +7 -0
  107. package/dist/chunks/studio-ph84avkf.js +5 -0
  108. package/dist/chunks/{studio-tq0rtfwj.js → studio-q0mvbaq6.js} +4 -4
  109. package/dist/chunks/studio-q0tccd43.js +5 -0
  110. package/dist/chunks/studio-q7rtx6zq.js +14 -0
  111. package/dist/chunks/{studio-a3g98wjr.js → studio-qgh13jtz.js} +4 -4
  112. package/dist/chunks/studio-qmn1xc24.js +5 -0
  113. package/dist/chunks/studio-qwdqwkj0.js +5 -0
  114. package/dist/chunks/studio-r5qy30vx.js +5 -0
  115. package/dist/chunks/studio-rj9eamf8.js +5 -0
  116. package/dist/chunks/studio-rptgsk96.js +5 -0
  117. package/dist/chunks/studio-rthyg42z.js +928 -0
  118. package/dist/chunks/studio-s19tp1xr.js +5 -0
  119. package/dist/chunks/studio-s32578pn.js +5 -0
  120. package/dist/chunks/studio-svb7yyve.js +5 -0
  121. package/dist/chunks/studio-syreb644.js +5 -0
  122. package/dist/chunks/studio-tf9jryb1.js +10 -0
  123. package/dist/chunks/studio-tfkznv39.js +5 -0
  124. package/dist/chunks/studio-tft6r105.js +5 -0
  125. package/dist/chunks/studio-txf2kysx.js +5 -0
  126. package/dist/chunks/studio-v8867ddv.js +12 -0
  127. package/dist/chunks/studio-vxq7fcvv.js +5 -0
  128. package/dist/chunks/studio-w4rz9hdk.js +5 -0
  129. package/dist/chunks/studio-wbcjbhy1.js +9 -0
  130. package/dist/chunks/studio-wc649wss.js +5 -0
  131. package/dist/chunks/studio-wys23mxz.js +5 -0
  132. package/dist/chunks/studio-x1x167jh.js +5 -0
  133. package/dist/chunks/studio-x9hsze61.js +5 -0
  134. package/dist/chunks/studio-y0n7yxea.js +9 -0
  135. package/dist/chunks/studio-y3ahhdpx.js +5 -0
  136. package/dist/chunks/studio-z97c48fk.js +5 -0
  137. package/dist/chunks/studio-zat62m0c.js +5 -0
  138. package/dist/chunks/studio-zcd2e7yz.js +5 -0
  139. package/dist/chunks/studio-zz9qe3rw.js +64 -0
  140. package/dist/chunks/toast-1gv0h53h.js +4 -0
  141. package/dist/chunks/{toast-host-ke5z4ng7.js → toast-host-1yg5ar8d.js} +3 -3
  142. package/dist/chunks/{tooltip-5v8ngwj2.js → tooltip-yypz28gq.js} +3 -3
  143. package/dist/chunks/{tree-mdq3v5cw.js → tree-9xa4hm7n.js} +2 -2
  144. package/dist/chunks/tsMode-epyfz1hv.js +14 -0
  145. package/dist/chunks/workspace-dz7nxfhv.js +4 -0
  146. package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
  147. package/dist/chunks/{ws-client-nze0k6mv.js → ws-client-bv552sfx.js} +3 -3
  148. package/dist/iframe-entry.js +20 -16
  149. package/dist/manifest.json +77 -63
  150. package/dist/studio.js +103 -104
  151. package/dist/workers/ts.worker.js +3 -3
  152. package/package.json +12 -11
  153. package/src/browse/component-examples.ts +272 -0
  154. package/src/browse/library-commands.ts +64 -104
  155. package/src/browse/library-layouts.ts +263 -49
  156. package/src/browse/library-model.ts +181 -133
  157. package/src/browse/library-pane.ts +738 -446
  158. package/src/browse/library-preview.ts +149 -19
  159. package/src/browse/library-source.ts +308 -41
  160. package/src/browse/preview-root.ts +78 -0
  161. package/src/browse/preview-style.ts +155 -0
  162. package/src/canvas/asset-refs.ts +16 -1
  163. package/src/canvas/canvas-live-render.ts +222 -30
  164. package/src/canvas/canvas-origin.ts +37 -12
  165. package/src/canvas/canvas-page-context.ts +112 -0
  166. package/src/canvas/canvas-render.ts +113 -107
  167. package/src/canvas/canvas-utils.ts +57 -12
  168. package/src/canvas/iframe-drop.ts +107 -0
  169. package/src/canvas/iframe-entry.ts +24 -12
  170. package/src/canvas/iframe-host.ts +134 -62
  171. package/src/canvas/iframe-keys.ts +11 -0
  172. package/src/canvas/iframe-patch.ts +8 -7
  173. package/src/canvas/iframe-protocol.ts +24 -5
  174. package/src/canvas/iframe-render.ts +48 -1
  175. package/src/canvas/iframe-subtree.ts +5 -2
  176. package/src/canvas/npm-modules.ts +22 -0
  177. package/src/canvas/preview-navigate.ts +16 -0
  178. package/src/canvas/repeater-sources.ts +200 -0
  179. package/src/canvas/stage-scrollbar.ts +5 -1
  180. package/src/canvas/surface-registry.ts +6 -0
  181. package/src/commands/app-commands.ts +16 -6
  182. package/src/commands/budget.ts +10 -8
  183. package/src/commands/context.ts +35 -10
  184. package/src/commands/defaults.ts +69 -45
  185. package/src/commands/keymap.ts +9 -0
  186. package/src/commands/levels.ts +11 -5
  187. package/src/commands/live-context.ts +2 -0
  188. package/src/commands/registry.ts +10 -1
  189. package/src/content/collection-match.ts +6 -5
  190. package/src/content/collection-pages.ts +412 -0
  191. package/src/content/content-collections.ts +270 -0
  192. package/src/content/entry-commands.ts +51 -60
  193. package/src/content/entry-editor.ts +111 -18
  194. package/src/content/entry-fields.ts +13 -1
  195. package/src/content/entry-inspector.ts +225 -0
  196. package/src/content/entry-model.ts +17 -3
  197. package/src/content/entry-open.ts +80 -0
  198. package/src/content/entry-summaries.ts +440 -0
  199. package/src/content/file-record-ids.ts +80 -0
  200. package/src/content/file-records.ts +125 -0
  201. package/src/content/page-summaries.ts +129 -0
  202. package/src/content/record-entry.ts +201 -0
  203. package/src/content/writing-banner.ts +177 -0
  204. package/src/create/add-new-commands.ts +185 -0
  205. package/src/create/add-new-flow.ts +1116 -0
  206. package/src/create/add-new.ts +1014 -0
  207. package/src/create/element-name.ts +121 -0
  208. package/src/editor/convert-to-component.ts +67 -43
  209. package/src/editor/file-drop-action.ts +9 -1
  210. package/src/editor/inline-edit-apply.ts +44 -0
  211. package/src/editor/inline-edit.ts +10 -0
  212. package/src/editor/insert-component.ts +91 -0
  213. package/src/editor/insert-zone-action.ts +13 -4
  214. package/src/editor/shortcuts.ts +44 -22
  215. package/src/editor/slash-menu.ts +51 -8
  216. package/src/files/components.ts +74 -10
  217. package/src/files/file-ops.ts +15 -5
  218. package/src/files/files.ts +164 -150
  219. package/src/files/fs-events.ts +18 -7
  220. package/src/files/media-meta.ts +95 -1
  221. package/src/files/media-types.ts +55 -0
  222. package/src/files/media-upload.ts +209 -52
  223. package/src/files/new-file-name.ts +156 -0
  224. package/src/files/serialize-document.ts +13 -3
  225. package/src/format/format-host.ts +15 -0
  226. package/src/github/github-auth.ts +2 -2
  227. package/src/github/github-publish.ts +4 -3
  228. package/src/grid/grid-controller.ts +5 -1
  229. package/src/grid/grid-open.ts +0 -27
  230. package/src/grid/grid-panel.ts +54 -2
  231. package/src/grid/grid-reveal.ts +34 -0
  232. package/src/grid/grid-source.ts +3 -25
  233. package/src/grid/grid-view.ts +31 -6
  234. package/src/grid/sources/content-source.ts +75 -7
  235. package/src/grid/tabulator-tables.d.ts +6 -0
  236. package/src/hosting/document.ts +2 -2
  237. package/src/i18n/i18n-commands.ts +2 -1
  238. package/src/media/media-commands.ts +181 -0
  239. package/src/media/media-library-model.ts +232 -0
  240. package/src/media/media-library.ts +1283 -0
  241. package/src/media/media-pane.ts +47 -19
  242. package/src/packages/pull-package-sync.ts +1 -1
  243. package/src/panels/activity-panel.ts +21 -5
  244. package/src/panels/ai-chat/chat-markdown.ts +8 -8
  245. package/src/panels/block-action-bar.ts +11 -11
  246. package/src/panels/canvas-dnd-bridge.ts +5 -2
  247. package/src/panels/chat-panel.ts +6 -6
  248. package/src/panels/collections-panel.ts +306 -0
  249. package/src/panels/component-preview.ts +35 -13
  250. package/src/panels/data-explorer.ts +1 -1
  251. package/src/panels/data-grid.ts +4 -0
  252. package/src/panels/dnd.ts +17 -30
  253. package/src/panels/elements-panel.ts +9 -2
  254. package/src/panels/empty-state.ts +2 -2
  255. package/src/panels/formula-workspace.ts +2 -3
  256. package/src/panels/frontmatter-fields.ts +9 -9
  257. package/src/panels/git-diff-open.ts +9 -5
  258. package/src/panels/head-panel.ts +369 -103
  259. package/src/panels/i18n-panel.ts +11 -10
  260. package/src/panels/imports-panel.ts +2 -0
  261. package/src/panels/jump-bar.ts +27 -2
  262. package/src/panels/layers-panel.ts +36 -30
  263. package/src/panels/left-panel.ts +22 -8
  264. package/src/panels/navigator-panels.ts +23 -11
  265. package/src/panels/pane-context.ts +111 -29
  266. package/src/panels/pane-grid.ts +6 -6
  267. package/src/panels/panel-registry.ts +14 -9
  268. package/src/panels/properties-panel.ts +7 -3
  269. package/src/panels/right-panel.ts +199 -43
  270. package/src/panels/seo-modal.ts +41 -108
  271. package/src/panels/settings-menu.ts +52 -50
  272. package/src/panels/settings-pane.ts +268 -162
  273. package/src/panels/signals-panel.ts +3 -4
  274. package/src/panels/site-model.ts +367 -0
  275. package/src/panels/site-panel.ts +638 -0
  276. package/src/panels/style-panel.ts +37 -3
  277. package/src/panels/stylebook-doc.ts +142 -10
  278. package/src/panels/stylebook-layers-panel.ts +39 -80
  279. package/src/panels/stylebook-panel.ts +47 -10
  280. package/src/panels/styles-panel.ts +327 -0
  281. package/src/panels/tab-strip.ts +109 -25
  282. package/src/platform.ts +1 -1
  283. package/src/platforms/cloud.ts +28 -1
  284. package/src/platforms/default-platform.ts +4 -4
  285. package/src/platforms/devserver.ts +51 -25
  286. package/src/publish/deploy-checklist.ts +12 -7
  287. package/src/publish/pages-service.ts +38 -14
  288. package/src/publish/publish-changes.ts +491 -0
  289. package/src/publish/publish-commands.ts +83 -18
  290. package/src/publish/publish-ids.ts +49 -0
  291. package/src/publish/publish-quick.ts +148 -0
  292. package/src/publish/publish-workspace.ts +926 -0
  293. package/src/publish/source-control.ts +907 -0
  294. package/src/services/automation.ts +16 -20
  295. package/src/services/cf-settings.ts +4 -4
  296. package/src/services/connection.ts +2 -2
  297. package/src/services/directory-picker.ts +2 -2
  298. package/src/services/references.ts +0 -0
  299. package/src/services/render-critic.ts +21 -2
  300. package/src/services/settings/definitions.ts +25 -14
  301. package/src/settings/contributed-section.ts +49 -10
  302. package/src/settings/css-vars-editor.ts +93 -27
  303. package/src/settings/developer-panels.ts +43 -0
  304. package/src/settings/extension-sections.ts +20 -2
  305. package/src/settings/general-settings.ts +91 -21
  306. package/src/settings/preferences-dialog.ts +8 -1
  307. package/src/settings/project-sections.ts +27 -10
  308. package/src/settings/schema-field-ui.ts +3 -1
  309. package/src/settings/section-registry.ts +116 -11
  310. package/src/settings/settings-dialog.ts +192 -0
  311. package/src/settings/settings-document.ts +182 -162
  312. package/src/shell.ts +467 -431
  313. package/src/site-context.ts +64 -10
  314. package/src/state.ts +28 -9
  315. package/src/studio.ts +194 -41
  316. package/src/style/project-styles.ts +34 -0
  317. package/src/style/stylebook-specimens.ts +89 -0
  318. package/src/style/stylebook-target.ts +26 -0
  319. package/src/style/tag-inheritance.ts +105 -0
  320. package/src/style/variables-focus.ts +61 -0
  321. package/src/style/variables-view.ts +235 -0
  322. package/src/surfaces/add-new.json +1482 -0
  323. package/src/surfaces/add-new.ts +325 -0
  324. package/src/surfaces/ai-chat.ts +2 -2
  325. package/src/surfaces/boot-failure.json +4 -3
  326. package/src/surfaces/bottom-dock.json +1 -1
  327. package/src/surfaces/canvas-stage.json +30 -19
  328. package/src/surfaces/canvas-stage.ts +5 -5
  329. package/src/surfaces/collections-panel.json +615 -0
  330. package/src/surfaces/collections-panel.ts +168 -0
  331. package/src/surfaces/commandbar.json +241 -96
  332. package/src/surfaces/commandbar.ts +134 -99
  333. package/src/surfaces/empty-state.json +1 -1
  334. package/src/surfaces/entry-editor.json +136 -0
  335. package/src/surfaces/entry-editor.ts +21 -0
  336. package/src/surfaces/entry-inspector.json +371 -0
  337. package/src/surfaces/entry-inspector.ts +143 -0
  338. package/src/surfaces/inspector-dock.json +162 -14
  339. package/src/surfaces/inspector-dock.ts +46 -19
  340. package/src/surfaces/library-pane.json +670 -437
  341. package/src/surfaces/library-pane.ts +94 -59
  342. package/src/surfaces/media-browser.json +62 -6
  343. package/src/surfaces/media-browser.ts +15 -1
  344. package/src/surfaces/media-field.json +1 -1
  345. package/src/surfaces/media-library.json +1586 -0
  346. package/src/surfaces/media-library.ts +282 -0
  347. package/src/surfaces/media-pick-dialog.json +71 -0
  348. package/src/surfaces/media-pick-dialog.ts +132 -0
  349. package/src/surfaces/menu.ts +18 -0
  350. package/src/surfaces/pane-context.json +144 -77
  351. package/src/surfaces/pane-context.ts +24 -0
  352. package/src/surfaces/panel-deploy-checklist.json +12 -6
  353. package/src/surfaces/panel-deploy-checklist.ts +3 -1
  354. package/src/surfaces/panel-page.json +72 -2
  355. package/src/surfaces/panel-page.ts +38 -7
  356. package/src/surfaces/panel-signals.json +1 -1
  357. package/src/surfaces/panel-signals.ts +5 -5
  358. package/src/surfaces/panel-stylebook-layers.json +71 -204
  359. package/src/surfaces/panel-stylebook-layers.ts +0 -21
  360. package/src/surfaces/preferences.json +120 -48
  361. package/src/surfaces/preferences.ts +8 -0
  362. package/src/surfaces/publish-quick.json +428 -0
  363. package/src/surfaces/publish-quick.ts +165 -0
  364. package/src/surfaces/publish-workspace.json +2892 -0
  365. package/src/surfaces/publish-workspace.ts +391 -0
  366. package/src/surfaces/rail.json +1 -159
  367. package/src/surfaces/rail.ts +18 -75
  368. package/src/surfaces/schema-form.json +10 -2
  369. package/src/surfaces/schema-form.ts +2 -0
  370. package/src/surfaces/seo.json +1 -1
  371. package/src/surfaces/settings-contributed.json +5 -5
  372. package/src/surfaces/settings-contributed.ts +18 -2
  373. package/src/surfaces/settings-css-vars.json +44 -36
  374. package/src/surfaces/settings-css-vars.ts +77 -4
  375. package/src/surfaces/settings-deploy.json +2 -15
  376. package/src/surfaces/settings-deploy.ts +1 -1
  377. package/src/surfaces/settings-dialog.json +51 -0
  378. package/src/surfaces/settings-dialog.ts +169 -0
  379. package/src/surfaces/settings-overview.json +3 -3
  380. package/src/surfaces/settings-overview.ts +9 -2
  381. package/src/surfaces/settings-pane.json +269 -46
  382. package/src/surfaces/settings-pane.ts +85 -24
  383. package/src/surfaces/shell.json +2 -1
  384. package/src/surfaces/site-panel.json +1029 -0
  385. package/src/surfaces/site-panel.ts +233 -0
  386. package/src/surfaces/slash-menu.json +63 -21
  387. package/src/surfaces/slash-menu.ts +23 -0
  388. package/src/surfaces/statusbar.ts +39 -15
  389. package/src/surfaces/styles-panel.json +735 -0
  390. package/src/surfaces/styles-panel.ts +195 -0
  391. package/src/surfaces/styles-variables.json +149 -0
  392. package/src/surfaces/styles-variables.ts +145 -0
  393. package/src/surfaces/tab-strip.json +4 -4
  394. package/src/surfaces/welcome.ts +1 -1
  395. package/src/surfaces/writing-banner.json +94 -0
  396. package/src/surfaces/writing-banner.ts +80 -0
  397. package/src/tabs/bare-repeaters.ts +101 -0
  398. package/src/tabs/tab.ts +47 -7
  399. package/src/types.ts +21 -26
  400. package/src/ui/form-controls.ts +47 -8
  401. package/src/ui/layers.ts +13 -0
  402. package/src/ui/media-picker.ts +284 -40
  403. package/src/ui/regions.ts +7 -6
  404. package/src/ui/schema-form.ts +259 -27
  405. package/src/ui/virtual-window.ts +26 -1
  406. package/src/utils/base64.ts +3 -3
  407. package/src/utils/edit-display.ts +322 -67
  408. package/src/utils/local-day.ts +18 -0
  409. package/src/workspace/pane-derive.ts +4 -4
  410. package/src/workspace/session.ts +28 -7
  411. package/src/workspace/tab-workspace.ts +137 -0
  412. package/src/workspace/workspace-back.ts +189 -0
  413. package/src/workspace/workspace-home.ts +133 -0
  414. package/src/workspace/workspace-ids.ts +129 -0
  415. package/src/workspace/workspace-switch.ts +372 -0
  416. package/src/workspace/workspace.ts +125 -11
  417. package/styles/shell-frame.css +30 -7
  418. package/styles/shell-frame.json +15 -3
  419. package/dist/chunks/2020-f2gkpy8d.js +0 -4
  420. package/dist/chunks/adapter-4912g339.js +0 -4
  421. package/dist/chunks/cf-account-picker-wccaenh6.js +0 -4
  422. package/dist/chunks/cf-settings-br6105tr.js +0 -4
  423. package/dist/chunks/color-28ksk2qm.js +0 -4
  424. package/dist/chunks/components-db68vsn7.js +0 -4
  425. package/dist/chunks/content-source-1449qesq.js +0 -4
  426. package/dist/chunks/convert-to-repeater-5h457egj.js +0 -4
  427. package/dist/chunks/editor-x9jn86a7.js +0 -4
  428. package/dist/chunks/entry-commands-may24cpt.js +0 -4
  429. package/dist/chunks/extension-sections-pvr14vxr.js +0 -4
  430. package/dist/chunks/file-ops-x9v54pcj.js +0 -4
  431. package/dist/chunks/files-j3knqf0s.js +0 -4
  432. package/dist/chunks/format-host-tyre2trb.js +0 -4
  433. package/dist/chunks/fs-events-64ma9htc.js +0 -4
  434. package/dist/chunks/git-panel-84ps5dex.js +0 -4
  435. package/dist/chunks/iframe-entry-fvbk89gm.js +0 -5
  436. package/dist/chunks/iframe-host-ck6vejt5.js +0 -4
  437. package/dist/chunks/index-b8xw3vy9.js +0 -4
  438. package/dist/chunks/jsonMode-w15cmrcm.js +0 -13
  439. package/dist/chunks/jx-validate-at3zn8wa.js +0 -4
  440. package/dist/chunks/layers-h4xp1pss.js +0 -4
  441. package/dist/chunks/layers-panel-m5hw1d7g.js +0 -4
  442. package/dist/chunks/lit-html-8t8t3dnr.js +0 -4
  443. package/dist/chunks/media-picker-2cweexc5.js +0 -4
  444. package/dist/chunks/menu-ynw13y0s.js +0 -4
  445. package/dist/chunks/monaco-buffer-qzxn567r.js +0 -4
  446. package/dist/chunks/monaco-setup-gxf6656g.js +0 -4
  447. package/dist/chunks/notify-cj5zbrs2.js +0 -4
  448. package/dist/chunks/parse-b7ddhr8m.js +0 -4
  449. package/dist/chunks/platform-3dfws9js.js +0 -4
  450. package/dist/chunks/popover-jt2gxmzs.js +0 -4
  451. package/dist/chunks/publish-panel-1gvxbj21.js +0 -4
  452. package/dist/chunks/quick-search-0dajrwqg.js +0 -4
  453. package/dist/chunks/references-49qgt404.js +0 -4
  454. package/dist/chunks/right-panel-jm1bwe53.js +0 -4
  455. package/dist/chunks/section-registry-6kwc4fky.js +0 -4
  456. package/dist/chunks/studio-0rt52vpq.js +0 -5
  457. package/dist/chunks/studio-18vgbhs5.js +0 -5
  458. package/dist/chunks/studio-24mccdrj.js +0 -5
  459. package/dist/chunks/studio-2eh507zk.js +0 -9
  460. package/dist/chunks/studio-2hcbccfv.js +0 -5
  461. package/dist/chunks/studio-2jbs3rxv.js +0 -5
  462. package/dist/chunks/studio-4h8k4dw9.js +0 -5
  463. package/dist/chunks/studio-5f6n18kx.js +0 -5
  464. package/dist/chunks/studio-5gthpky6.js +0 -5
  465. package/dist/chunks/studio-6ep3js6b.js +0 -9
  466. package/dist/chunks/studio-6wkmf3wz.js +0 -9
  467. package/dist/chunks/studio-841rf3cg.js +0 -5
  468. package/dist/chunks/studio-8gmwgheg.js +0 -5
  469. package/dist/chunks/studio-8qm0ep50.js +0 -5
  470. package/dist/chunks/studio-924p1tm1.js +0 -6
  471. package/dist/chunks/studio-a3shpz9y.js +0 -5
  472. package/dist/chunks/studio-amsbaaar.js +0 -6
  473. package/dist/chunks/studio-at5spjbc.js +0 -7
  474. package/dist/chunks/studio-b2xv945e.js +0 -5
  475. package/dist/chunks/studio-bn5nkafw.js +0 -5
  476. package/dist/chunks/studio-bw6q5xjf.js +0 -9
  477. package/dist/chunks/studio-c7q0t9x1.js +0 -5
  478. package/dist/chunks/studio-camnhc96.js +0 -6
  479. package/dist/chunks/studio-cffqvnzd.js +0 -5
  480. package/dist/chunks/studio-efvfrsf8.js +0 -5
  481. package/dist/chunks/studio-er30bpcx.js +0 -5
  482. package/dist/chunks/studio-ezscgr64.js +0 -5
  483. package/dist/chunks/studio-ffrrncvz.js +0 -5
  484. package/dist/chunks/studio-fpphgn8y.js +0 -10
  485. package/dist/chunks/studio-j1kvhdjk.js +0 -4
  486. package/dist/chunks/studio-j430n16g.js +0 -7
  487. package/dist/chunks/studio-jjkg84nj.js +0 -5
  488. package/dist/chunks/studio-m0q32ars.js +0 -4
  489. package/dist/chunks/studio-m6bdst11.js +0 -5
  490. package/dist/chunks/studio-nv2cptd4.js +0 -64
  491. package/dist/chunks/studio-nwfrc98n.js +0 -5
  492. package/dist/chunks/studio-p1wgvp7r.js +0 -5
  493. package/dist/chunks/studio-pag2wncm.js +0 -5
  494. package/dist/chunks/studio-qvanvzfd.js +0 -5
  495. package/dist/chunks/studio-qwa64kt7.js +0 -5
  496. package/dist/chunks/studio-rk1zc4x3.js +0 -928
  497. package/dist/chunks/studio-se2r3ptc.js +0 -5
  498. package/dist/chunks/studio-sg2a0dh0.js +0 -5
  499. package/dist/chunks/studio-tjzjhe68.js +0 -5
  500. package/dist/chunks/studio-v2w7q8r1.js +0 -7
  501. package/dist/chunks/studio-v5vjq1h0.js +0 -4
  502. package/dist/chunks/studio-v8aga3vp.js +0 -14
  503. package/dist/chunks/studio-vfcdrfmv.js +0 -5
  504. package/dist/chunks/studio-vmfkgdjf.js +0 -5
  505. package/dist/chunks/studio-wt1816jj.js +0 -5
  506. package/dist/chunks/studio-wz73q5kq.js +0 -4
  507. package/dist/chunks/studio-y04qtxvp.js +0 -7
  508. package/dist/chunks/studio-y21g8zzg.js +0 -5
  509. package/dist/chunks/studio-y64hrt8p.js +0 -12
  510. package/dist/chunks/studio-ynn90f58.js +0 -16
  511. package/dist/chunks/studio-yxz682sx.js +0 -5
  512. package/dist/chunks/studio-zp7snvkq.js +0 -5
  513. package/dist/chunks/studio-zq4z6tm6.js +0 -5
  514. package/dist/chunks/toast-c9fn075p.js +0 -4
  515. package/dist/chunks/tsMode-sf49ee9x.js +0 -14
  516. package/dist/chunks/workspace-jtfahpee.js +0 -4
  517. package/src/panels/frontmatter-panel.ts +0 -711
  518. package/src/panels/git-panel.ts +0 -1108
  519. package/src/surfaces/doc-header.json +0 -776
  520. package/src/surfaces/doc-header.ts +0 -222
  521. package/src/surfaces/git-panel.json +0 -1880
  522. package/src/surfaces/git-panel.ts +0 -264
@@ -9,28 +9,25 @@
9
9
  import { defineElement, setSkipServerFunctions } from "@jxsuite/runtime";
10
10
  import { projectState } from "../store";
11
11
  import type { ComponentEntry } from "../files/components";
12
+ import type { JsonValue } from "@jxsuite/schema/types";
12
13
 
13
14
  /**
14
15
  * Render a live component preview by registering its custom element and instantiating it.
15
16
  *
16
17
  * @param {ComponentEntry} comp
18
+ * @param {ReadonlyMap<string, JsonValue>} [props] - Sample props (`browse/component-examples.ts`),
19
+ * set as properties before the instance connects, the way a parent's `$props` reach it (spec.md
20
+ * §16.2)
17
21
  * @returns {Promise<HTMLElement>}
18
22
  */
19
- export async function renderComponentPreview(comp: ComponentEntry) {
23
+ export async function renderComponentPreview(
24
+ comp: ComponentEntry,
25
+ props: ReadonlyMap<string, JsonValue> = new Map(),
26
+ ) {
20
27
  setSkipServerFunctions(true);
21
28
  try {
22
- if (comp.source === "npm") {
23
- if (!customElements.get(comp.tagName)) {
24
- return _componentFallback(comp.tagName);
25
- }
26
- } else {
27
- if (comp.path && !comp.path.endsWith(".json")) {
28
- // Format-class component sources (e.g. markdown) can't be imported as modules
29
- return _componentFallback(comp.tagName);
30
- }
31
- const root = projectState?.projectRoot;
32
- const url = `${location.origin}/${root ? `${root}/` : ""}${comp.path}`;
33
- await defineElement(url);
29
+ if (!(await defineComponent(comp))) {
30
+ return _componentFallback(comp.tagName);
34
31
  }
35
32
  const el = document.createElement(comp.tagName);
36
33
  for (const p of comp.props || []) {
@@ -39,6 +36,13 @@ export async function renderComponentPreview(comp: ComponentEntry) {
39
36
  el.setAttribute(p.name, val);
40
37
  }
41
38
  }
39
+ // Read at connection as the instance's own props, ahead of the attribute defaults above.
40
+ /* SAFETY: an element is an ordinary extensible object, so any string key can be written; the
41
+ instance reads each declared prop back off itself when it connects. */
42
+ const properties = el as HTMLElement & Record<string, JsonValue>;
43
+ for (const [name, value] of props) {
44
+ properties[name] = value;
45
+ }
42
46
  return el;
43
47
  } catch (error) {
44
48
  console.warn("Component preview failed:", comp.tagName, error);
@@ -46,6 +50,24 @@ export async function renderComponentPreview(comp: ComponentEntry) {
46
50
  }
47
51
  }
48
52
 
53
+ /**
54
+ * Make sure a component's element is defined in this window, registering a project definition from
55
+ * its file. Answers whether the tag can now be instantiated: a package's element only when its
56
+ * package already defined it, and a format-class source (Markdown) never, since it cannot be
57
+ * imported as a module.
58
+ */
59
+ export async function defineComponent(comp: ComponentEntry): Promise<boolean> {
60
+ if (comp.source === "npm") {
61
+ return Boolean(customElements.get(comp.tagName));
62
+ }
63
+ if (comp.path && !comp.path.endsWith(".json")) {
64
+ return false;
65
+ }
66
+ const root = projectState?.projectRoot;
67
+ await defineElement(`${location.origin}/${root ? `${root}/` : ""}${comp.path}`);
68
+ return true;
69
+ }
70
+
49
71
  /** @param {string} tagName */
50
72
  function _componentFallback(tagName: string) {
51
73
  const fallback = document.createElement("div");
@@ -419,7 +419,7 @@ export function registerDataExplorerCommands(
419
419
  * **Both halves are documents now** — `surfaces/panel-signals.{json,ts}` for the entry list and its
420
420
  * editors, `surfaces/panel-data.{json,ts}` for the value tree under an open row. So lit draws
421
421
  * nothing at all here: `render` returns `nothing` and `afterRender` mounts against the painted DOM,
422
- * which is the seam `panels/git-panel.ts` uses for the same reason. The mount comes through `deps`
422
+ * which is the seam every document-bodied Navigator panel uses. The mount comes through `deps`
423
423
  * rather than an import — this module owns the expansion store that one reads, so importing it back
424
424
  * would close a cycle — and it is idempotent, so running on every repaint is what keeps the
425
425
  * projection current.
@@ -23,6 +23,7 @@ import { mountDataActionsSurface } from "../surfaces/data-actions";
23
23
  import { mountPushPlanSurface } from "../surfaces/push-plan";
24
24
  import { dataSurfaceAvailable, pushSchema, testConnection } from "../services/data-service";
25
25
  import { openGridSourcePicker } from "../grid/grid-open";
26
+ import { closeSettingsDialog } from "../settings/settings-dialog";
26
27
  import type { DataActionsSurfaceHandle, DataActionsView } from "../surfaces/data-actions";
27
28
  import type { DialogSurfaceHandle } from "../surfaces/dialog";
28
29
  import type { PushPlanSurfaceHandle, PushPlanView } from "../surfaces/push-plan";
@@ -277,6 +278,9 @@ function paintSectionActions(
277
278
  host,
278
279
  mountDataActionsSurface(host, projectActions(sectionKey, selected), {
279
280
  openGrid: () => {
281
+ /* The actions row is drawn in the settings dialog, and a grid opens as a TAB: left up, the
282
+ dialog would cover the very tab the reader asked for (§17.1). */
283
+ closeSettingsDialog();
280
284
  void openGridSourcePicker();
281
285
  },
282
286
  push: () => {
package/src/panels/dnd.ts CHANGED
@@ -10,7 +10,7 @@ import {
10
10
  monitorForElements,
11
11
  } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
12
12
  import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine";
13
- import { displayTagName, isNumber } from "@jxsuite/schema/guards";
13
+ import { isNumber } from "@jxsuite/schema/guards";
14
14
  import { disableNativeDragPreview } from "@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview";
15
15
  import {
16
16
  attachInstruction,
@@ -26,13 +26,12 @@ import {
26
26
  parentElementPath,
27
27
  renderOnly,
28
28
  } from "../store";
29
- import { mutateInsertNode, mutateMoveNode, transact, transactDoc } from "../tabs/transact";
29
+ import { mutateInsertNode, mutateMoveNode, transactDoc } from "../tabs/transact";
30
30
  import { primarySelection } from "../tabs/selection";
31
31
  import { activeTab } from "../workspace/workspace";
32
32
  import { view } from "../view";
33
33
  import { buildComponentInstance, componentRegistry } from "../files/components";
34
- import { enableElement } from "../files/elements";
35
- import type { ElementsEntry } from "../files/elements";
34
+ import { mutateImportComponent } from "../editor/insert-component";
36
35
  import { renderComponentPreview } from "./component-preview";
37
36
  import { defaultDef, unsafeTags } from "./shared";
38
37
  import { elementAtPoint } from "../utils/geometry";
@@ -487,33 +486,21 @@ export function applyDropInstruction(
487
486
  /* SAFETY: every minter of a "block" payload — the Insert palette's element and component cards
488
487
  and the file drop (`file-drop-action.ts`) — sets `fragment` to the JxMutableNode it inserts. */
489
488
  const fragment = srcData.fragment as JxMutableNode;
489
+ /* Auto-import to `$elements` if the dropped block is a custom component, through the rule
490
+ every insertion door shares (`editor/insert-component.ts`, over the one `$elements` service):
491
+ this call site once had its own duplicate rule and matched a local component by
492
+ `ref.endsWith(basename)`, so dropping `./components/card.json` into a page that already
493
+ imported `./vendor/card.json` counted as already imported. The import is part of the same
494
+ transaction as the insert, so one ⌘Z takes back both. */
490
495
  if (slot) {
491
- transactDoc(tab, (t) =>
492
- mutateInsertNode(t, slot.parent, slot.index, structuredClone(fragment)),
493
- );
494
- }
495
-
496
- /* Auto-import to `$elements` if the dropped block is a custom component.
497
- Through the ONE service (`files/elements.ts`), which is the whole point of it: this call site
498
- had its own duplicate rule and matched a local component by `ref.endsWith(basename)`, so
499
- dropping `./components/card.json` into a page that already imported `./vendor/card.json`
500
- counted as already imported and produced an element the page could not resolve. */
501
- const tag = fragment.tagName;
502
- if (displayTagName(tag).includes("-")) {
503
- const comp = componentRegistry.find((c: ComponentEntry) => c.tagName === tag);
504
- /* SAFETY: `$elements` holds module specifiers and `{ $ref }` imports; the document type and
505
- files/elements.ts spell an inline entry as JxMutableNode and JxElement respectively, two
506
- editor views of the same JSON object that enableElement only compares by `$ref`. */
507
- const before = (tab.doc.document.$elements ?? []) as ElementsEntry[];
508
- const after = comp ? enableElement(before, comp, tab.documentPath ?? null) : before;
509
- // Only when the list actually GREW. A component the registry cannot name — an npm entry with
510
- // No package, a local one with no path — returns the list unchanged, and writing that back
511
- // Would put an empty `$elements: []` on a document that had none.
512
- if (after.length !== before.length) {
513
- transact(tab, (d: JxMutableNode) => {
514
- d.$elements = after;
515
- });
516
- }
496
+ transactDoc(tab, (t) => {
497
+ mutateInsertNode(t, slot.parent, slot.index, structuredClone(fragment));
498
+ mutateImportComponent(t, fragment.tagName);
499
+ /* The inserted node is the selection, as every other insert leaves it (the slash menu, Enter,
500
+ paste): the Inspector is then on the thing just placed, which is where a dropped image's
501
+ missing alt text or a component's props are filled in. */
502
+ t.session.selection = [[...slot.parent, "children", slot.index]];
503
+ });
517
504
  }
518
505
  }
519
506
  }
@@ -23,6 +23,7 @@
23
23
  import { isString } from "@jxsuite/schema/guards";
24
24
  import { nothing } from "lit-html";
25
25
  import { buildComponentInstance, componentRegistry } from "../files/components";
26
+ import { mutateImportComponent } from "../editor/insert-component";
26
27
  import { childList, getNodeAtPath } from "../store";
27
28
  import { getEffectiveElements } from "../site-context";
28
29
  import { mountElementsSurface } from "../surfaces/panel-elements";
@@ -164,7 +165,10 @@ function panelValues(source: NavigatorPanelDeps): ElementsValues {
164
165
  };
165
166
  }
166
167
 
167
- /** Insert a node as the last child of the selected element — what both kinds of card do. */
168
+ /**
169
+ * Insert a node as the last child of the selected element — what both kinds of card do — and import
170
+ * it when it is a component, as a drag of the same card does (§5.7: insertion has one meaning).
171
+ */
168
172
  function insertAtSelection(def: JxMutableNode): void {
169
173
  const tab = activeTab.value;
170
174
  if (!tab) {
@@ -173,7 +177,10 @@ function insertAtSelection(def: JxMutableNode): void {
173
177
  const parentPath = primarySelection(tab.session.selection) ?? [];
174
178
  const parent = getNodeAtPath(tab.doc.document, parentPath);
175
179
  const index = childList(parent).length;
176
- transactDoc(tab, (tr) => mutateInsertNode(tr, parentPath, index, structuredClone(def)));
180
+ transactDoc(tab, (tr) => {
181
+ mutateInsertNode(tr, parentPath, index, structuredClone(def));
182
+ mutateImportComponent(tr, def.tagName);
183
+ });
177
184
  }
178
185
 
179
186
  /**
@@ -24,8 +24,8 @@
24
24
  * There is no `icon` here any more, and its absence is the point rather than an omission: it was
25
25
  * typed `TemplateResult` and every value passed to it was an `sp-icon-*`, which is a Spectrum
26
26
  * element smuggled through a shared vocabulary into surfaces that have no other Spectrum in them.
27
- * `panels/git-panel.ts` was the last caller and it is a document now, so the field went with it —
28
- * `surfaces/empty-state.json` draws a word, and a region that needs a glyph beside one is asking
27
+ * The Source Control panel was the last caller and it became a document, so the field went with it
28
+ * — `surfaces/empty-state.json` draws a word, and a region that needs a glyph beside one is asking
29
29
  * for a control the kit declares rather than for a hole in this type.
30
30
  */
31
31
  export interface EmptyStateAction {
@@ -302,9 +302,8 @@ function selectionKey(editing: FormulaEditDef): string {
302
302
  *
303
303
  * The document reports a chip by its key and a button by nothing at all, so the objects behind them
304
304
  * — the tab, the target, the root node, the sub-node a commit replaces — live here, rewritten by
305
- * every projection. Held rather than recomputed at click time for the reason `panels/git-panel.ts`
306
- * states about its own seat: a callback captured at mount would reach the FIRST projection's
307
- * document for the rest of the window.
305
+ * every projection. Held rather than recomputed at click time because a callback captured at mount
306
+ * would reach the FIRST projection's document for the rest of the window.
308
307
  */
309
308
  interface Resolved {
310
309
  tab: Tab;
@@ -9,12 +9,12 @@
9
9
  *
10
10
  * {@link projectFmField} is the half that says WHAT ONE OF THEM LOOKS LIKE — which control it draws,
11
11
  * what that control currently holds, and how to read the control's answer back into a frontmatter
12
- * value. It is a projection rather than a renderer, and that is the whole of why it lives here:
13
- * both surfaces that edit frontmatter are Jx documents now (the Document Header card,
14
- * `src/surfaces/doc-header.json`, and the Navigator's Page panel, `src/surfaces/panel-page.json`),
15
- * and a document draws its own markup. What they must not each decide is that a `$ref` field is a
16
- * picker, that `"uri-reference"` is a media format, or that an array is a comma-separated line — so
17
- * they do not: they ask here and draw the answer.
12
+ * value. It is a projection rather than a renderer, and that is the whole of why it lives here: the
13
+ * surface that edits frontmatter is a Jx document (the Inspector's Page tab,
14
+ * `src/surfaces/panel-page.json`), and a document draws its own markup. What it must not decide for
15
+ * itself is that a `$ref` field is a picker, that `"uri-reference"` is a media format, or that an
16
+ * array is a comma-separated line — so it does not: it asks here and draws the answer. (The
17
+ * Document Header card that once drew the same rows above the canvas is gone, studio.md §4.2.)
18
18
  *
19
19
  * It replaces `renderFmField`, which was a lit template and could therefore only ever have ONE of
20
20
  * the two hosts. The Page panel was the last one, and the renderer went with it.
@@ -66,13 +66,13 @@ export interface FmFieldSet {
66
66
  *
67
67
  * @param {Tab} tab
68
68
  * @param {ProjectConfig | null | undefined} projectConfig
69
- * @param {Set<string>} reserved — keys managed by dedicated controls elsewhere
69
+ * @param {ReadonlySet<string>} reserved — keys managed by dedicated controls elsewhere
70
70
  * @returns {FmFieldSet}
71
71
  */
72
72
  export function collectFmFields(
73
73
  tab: Tab,
74
74
  projectConfig: ProjectConfig | null | undefined,
75
- reserved: Set<string>,
75
+ reserved: ReadonlySet<string>,
76
76
  ): FmFieldSet {
77
77
  /* SAFETY: `FormatFrontmatter` holds `JxDocumentValue`, which is the JSON value space seen through
78
78
  the typed interfaces a document's declared keys use (JxRef, JxStatement, CemEvent, ...). Every
@@ -299,7 +299,7 @@ export function projectFmField(
299
299
  return {
300
300
  parse: (raw) => {
301
301
  /* NaN is deleted rather than written. The two surfaces this replaced disagreed here: the
302
- Page panel's `spNumberField` refused a non-number and the Document Header card wrote
302
+ Page panel's `spNumberField` refused a non-number and the old Document Header card wrote
303
303
  `NaN` into the frontmatter, where it round-trips to `null`. One answer, and it is the
304
304
  one that cannot corrupt the document. */
305
305
  const trimmed = String(raw).trim();
@@ -130,10 +130,14 @@ export function openDiffTab(path: string): Tab {
130
130
  * leave the comparison for Design without reopening anything; a file it cannot gets the stub tab
131
131
  * above. Both are keyed by the path, so §14.1 holds either way — one path, one tab.
132
132
  *
133
- * `files/files.ts` is imported dynamically because it imports `cleanupGitPanel` from
134
- * `panels/git-panel.ts`, which imports this module: a static edge back would close that cycle.
135
- * `openFileInTab` answers `void` whether it opens a new tab or reveals one that was already open,
136
- * so the tab is resolved from the workspace by its path.
133
+ * The document tab opens IN `git-diff`, and an already-open one is moved into it before it is
134
+ * revealed: a comparison belongs to Publish (studio.md §22.1), and a tab activated in its edit mode
135
+ * would enter Design, frame and all, for the moment before the mode followed.
136
+ *
137
+ * `files/files.ts` is imported dynamically because it imports `cleanupSourceControl` from
138
+ * `publish/source-control.ts`, which imports this module: a static edge back would close that
139
+ * cycle. `openFileInTab` answers `void` whether it opens a new tab or reveals one that was already
140
+ * open, so the tab is resolved from the workspace by its path.
137
141
  *
138
142
  * Answers null when the file could not be opened at all, which the caller states rather than
139
143
  * silently leaving the stage on someone else's document.
@@ -143,6 +147,6 @@ export async function openComparisonTab(path: string): Promise<Tab | null> {
143
147
  return openDiffTab(path);
144
148
  }
145
149
  const files = await import("../files/files");
146
- await files.openFileInTab(path, {});
150
+ await files.openFileInTab(path, { canvasMode: "git-diff" });
147
151
  return [...workspace.tabs.values()].find((tab) => tab.documentPath === path) ?? null;
148
152
  }