@jxsuite/studio 6.1.1 → 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 (785) hide show
  1. package/README.md +5 -5
  2. package/dist/chunks/2020-5wtzce5g.js +4 -0
  3. package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
  4. package/dist/chunks/adapter-5tphg7xe.js +4 -0
  5. package/dist/chunks/add-new-flow-psym14sn.js +4 -0
  6. package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
  7. package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
  8. package/dist/chunks/color-area-6rbra5dy.js +4 -0
  9. package/dist/chunks/color-field-gy56c94g.js +4 -0
  10. package/dist/chunks/color-m7r1vk54.js +4 -0
  11. package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
  12. package/dist/chunks/combobox-72h32ejk.js +4 -0
  13. package/dist/chunks/components-r22xca09.js +4 -0
  14. package/dist/chunks/content-source-mmppmcyg.js +4 -0
  15. package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
  16. package/dist/chunks/dialog-c4x05vyx.js +4 -0
  17. package/dist/chunks/editor-ccd9jwsa.js +4 -0
  18. package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
  19. package/dist/chunks/extension-sections-0egb88dm.js +4 -0
  20. package/dist/chunks/file-ops-qnab36ek.js +4 -0
  21. package/dist/chunks/files-rcn56qvm.js +4 -0
  22. package/dist/chunks/format-host-yxz0kjjs.js +4 -0
  23. package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
  24. package/dist/chunks/grid-open-4z1g062t.js +4 -0
  25. package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
  26. package/dist/chunks/icons-63bjtbs7.js +4 -0
  27. package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
  28. package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
  29. package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
  30. package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
  31. package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
  32. package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
  33. package/dist/chunks/index-f0jn7nnp.js +4 -0
  34. package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
  35. package/dist/chunks/jsonMode-njkvsa02.js +13 -0
  36. package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
  37. package/dist/chunks/layers-bgyr11tr.js +4 -0
  38. package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
  39. package/dist/chunks/listbox-c421cf8c.js +4 -0
  40. package/dist/chunks/lit-html-v9gh687x.js +4 -0
  41. package/dist/chunks/media-library-sq468wts.js +4 -0
  42. package/dist/chunks/media-picker-shfe59pt.js +4 -0
  43. package/dist/chunks/menu-bdpzbfvs.js +4 -0
  44. package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
  45. package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
  46. package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
  47. package/dist/chunks/notify-kzrjr3fv.js +4 -0
  48. package/dist/chunks/number-field-y62xq0ty.js +4 -0
  49. package/dist/chunks/parse-v77xtwv7.js +4 -0
  50. package/dist/chunks/platform-7v4rtd7m.js +4 -0
  51. package/dist/chunks/popover-b89sfej7.js +4 -0
  52. package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
  53. package/dist/chunks/publish-quick-qx2455cj.js +4 -0
  54. package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
  55. package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
  56. package/dist/chunks/references-9547rg5s.js +4 -0
  57. package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
  58. package/dist/chunks/select-rzds841e.js +4 -0
  59. package/dist/chunks/source-control-kwktr9y6.js +4 -0
  60. package/dist/chunks/split-c9zfdgxf.js +4 -0
  61. package/dist/chunks/studio-03ct6yfv.js +9 -0
  62. package/dist/chunks/studio-07rcfje3.js +5 -0
  63. package/dist/chunks/studio-3e54qh39.js +7 -0
  64. package/dist/chunks/studio-3exxhz5g.js +5 -0
  65. package/dist/chunks/studio-3q40e3rj.js +5 -0
  66. package/dist/chunks/studio-3qeh9t0h.js +6 -0
  67. package/dist/chunks/studio-3qqjeep5.js +6 -0
  68. package/dist/chunks/studio-43sd2mam.js +4 -0
  69. package/dist/chunks/studio-4hp8pkyt.js +5 -0
  70. package/dist/chunks/studio-58xg6j2q.js +9 -0
  71. package/dist/chunks/studio-5g0rprdt.js +7 -0
  72. package/dist/chunks/studio-6m380wp7.js +5 -0
  73. package/dist/chunks/studio-80jyh1xh.js +4 -0
  74. package/dist/chunks/studio-83mk4bgg.js +9 -0
  75. package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
  76. package/dist/chunks/studio-8m0y2qe7.js +5 -0
  77. package/dist/chunks/studio-8tr6cfrc.js +5 -0
  78. package/dist/chunks/studio-8vcvfs7r.js +6 -0
  79. package/dist/chunks/studio-9tmebf0s.js +5 -0
  80. package/dist/chunks/studio-a2bvaptz.js +5 -0
  81. package/dist/chunks/studio-b7y5mr30.js +5 -0
  82. package/dist/chunks/studio-bavb31r0.js +5 -0
  83. package/dist/chunks/studio-bbe4c90a.js +5 -0
  84. package/dist/chunks/studio-c05wdnt3.js +5 -0
  85. package/dist/chunks/studio-ccv2svc6.js +5 -0
  86. package/dist/chunks/studio-d5grtb9e.js +16 -0
  87. package/dist/chunks/studio-df0baea9.js +5 -0
  88. package/dist/chunks/studio-dgk4dqtx.js +7 -0
  89. package/dist/chunks/studio-e1g64q43.js +5 -0
  90. package/dist/chunks/studio-ed1hp6zf.js +6 -0
  91. package/dist/chunks/studio-ed3xx40h.js +7 -0
  92. package/dist/chunks/studio-f14e1zdj.js +5 -0
  93. package/dist/chunks/studio-fbhxxc5f.js +5 -0
  94. package/dist/chunks/studio-fyh0jc96.js +5 -0
  95. package/dist/chunks/studio-gcxk20n7.js +5 -0
  96. package/dist/chunks/studio-jaaz8ce9.js +5 -0
  97. package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
  98. package/dist/chunks/studio-jsgf2q5k.js +7 -0
  99. package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
  100. package/dist/chunks/studio-k7evxqh4.js +5 -0
  101. package/dist/chunks/studio-kt3pjkwd.js +5 -0
  102. package/dist/chunks/studio-m8g16bgz.js +5 -0
  103. package/dist/chunks/studio-mn0476ag.js +5 -0
  104. package/dist/chunks/studio-mx1smyq0.js +5 -0
  105. package/dist/chunks/studio-n0c5h6mf.js +5 -0
  106. package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
  107. package/dist/chunks/studio-nqxqf8p2.js +4 -0
  108. package/dist/chunks/studio-p4nrkvqr.js +5 -0
  109. package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
  110. package/dist/chunks/studio-pgmvdv7z.js +7 -0
  111. package/dist/chunks/studio-ph84avkf.js +5 -0
  112. package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
  113. package/dist/chunks/studio-q0tccd43.js +5 -0
  114. package/dist/chunks/studio-q7rtx6zq.js +14 -0
  115. package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
  116. package/dist/chunks/studio-qmn1xc24.js +5 -0
  117. package/dist/chunks/studio-qwdqwkj0.js +5 -0
  118. package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
  119. package/dist/chunks/studio-rj9eamf8.js +5 -0
  120. package/dist/chunks/studio-rptgsk96.js +5 -0
  121. package/dist/chunks/studio-rthyg42z.js +928 -0
  122. package/dist/chunks/studio-s19tp1xr.js +5 -0
  123. package/dist/chunks/studio-s32578pn.js +5 -0
  124. package/dist/chunks/studio-svb7yyve.js +5 -0
  125. package/dist/chunks/studio-syreb644.js +5 -0
  126. package/dist/chunks/studio-tf9jryb1.js +10 -0
  127. package/dist/chunks/studio-tfkznv39.js +5 -0
  128. package/dist/chunks/studio-tft6r105.js +5 -0
  129. package/dist/chunks/studio-txf2kysx.js +5 -0
  130. package/dist/chunks/studio-v8867ddv.js +12 -0
  131. package/dist/chunks/studio-vxq7fcvv.js +5 -0
  132. package/dist/chunks/studio-w4rz9hdk.js +5 -0
  133. package/dist/chunks/studio-wbcjbhy1.js +9 -0
  134. package/dist/chunks/studio-wc649wss.js +5 -0
  135. package/dist/chunks/studio-wys23mxz.js +5 -0
  136. package/dist/chunks/studio-x1x167jh.js +5 -0
  137. package/dist/chunks/studio-x9hsze61.js +5 -0
  138. package/dist/chunks/studio-y0n7yxea.js +9 -0
  139. package/dist/chunks/studio-y3ahhdpx.js +5 -0
  140. package/dist/chunks/studio-z97c48fk.js +5 -0
  141. package/dist/chunks/studio-zat62m0c.js +5 -0
  142. package/dist/chunks/studio-zcd2e7yz.js +5 -0
  143. package/dist/chunks/studio-zz9qe3rw.js +64 -0
  144. package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
  145. package/dist/chunks/tabs-f5cw3tgp.js +4 -0
  146. package/dist/chunks/textfield-wewc8rq2.js +4 -0
  147. package/dist/chunks/toast-1gv0h53h.js +4 -0
  148. package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
  149. package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
  150. package/dist/chunks/tooltip-yypz28gq.js +4 -0
  151. package/dist/chunks/tree-9xa4hm7n.js +4 -0
  152. package/dist/chunks/tsMode-epyfz1hv.js +14 -0
  153. package/dist/chunks/workspace-dz7nxfhv.js +4 -0
  154. package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
  155. package/dist/chunks/ws-client-bv552sfx.js +4 -0
  156. package/dist/iframe-entry.js +20 -16
  157. package/dist/manifest.json +77 -63
  158. package/dist/studio.js +106 -107
  159. package/dist/workers/ts.worker.js +3 -3
  160. package/package.json +17 -16
  161. package/src/about/about-modal.ts +4 -3
  162. package/src/account/action-flow.ts +45 -38
  163. package/src/account-status.ts +7 -2
  164. package/src/browse/component-examples.ts +272 -0
  165. package/src/browse/library-commands.ts +64 -104
  166. package/src/browse/library-layouts.ts +270 -53
  167. package/src/browse/library-model.ts +194 -134
  168. package/src/browse/library-pane.ts +748 -440
  169. package/src/browse/library-preview.ts +161 -26
  170. package/src/browse/library-source.ts +308 -41
  171. package/src/browse/preview-root.ts +78 -0
  172. package/src/browse/preview-style.ts +155 -0
  173. package/src/canvas/asset-refs.ts +40 -10
  174. package/src/canvas/asset-resolve.ts +19 -23
  175. package/src/canvas/canvas-helpers.ts +7 -6
  176. package/src/canvas/canvas-live-render.ts +260 -77
  177. package/src/canvas/canvas-origin.ts +37 -12
  178. package/src/canvas/canvas-page-context.ts +112 -0
  179. package/src/canvas/canvas-patcher.ts +30 -30
  180. package/src/canvas/canvas-perf.ts +11 -5
  181. package/src/canvas/canvas-render.ts +175 -148
  182. package/src/canvas/canvas-surface.ts +5 -3
  183. package/src/canvas/canvas-utils.ts +147 -61
  184. package/src/canvas/dialog-path.ts +9 -4
  185. package/src/canvas/dialog-state.ts +1 -2
  186. package/src/canvas/diff-marks.ts +9 -16
  187. package/src/canvas/diff-toolbar.ts +8 -7
  188. package/src/canvas/edit-width-drag.ts +4 -1
  189. package/src/canvas/edit-width.ts +1 -3
  190. package/src/canvas/iframe-channel.ts +27 -13
  191. package/src/canvas/iframe-drop.ts +120 -12
  192. package/src/canvas/iframe-editable-root.ts +29 -16
  193. package/src/canvas/iframe-entry.ts +104 -75
  194. package/src/canvas/iframe-eval.ts +73 -49
  195. package/src/canvas/iframe-host.ts +269 -158
  196. package/src/canvas/iframe-inline-edit.ts +49 -30
  197. package/src/canvas/iframe-insert.ts +5 -4
  198. package/src/canvas/iframe-interaction.ts +30 -25
  199. package/src/canvas/iframe-keys.ts +11 -0
  200. package/src/canvas/iframe-overlay.ts +1 -1
  201. package/src/canvas/iframe-patch.ts +25 -21
  202. package/src/canvas/iframe-position.ts +12 -6
  203. package/src/canvas/iframe-protocol.ts +36 -21
  204. package/src/canvas/iframe-render.ts +84 -35
  205. package/src/canvas/iframe-slash.ts +24 -11
  206. package/src/canvas/iframe-subtree.ts +10 -3
  207. package/src/canvas/npm-modules.ts +22 -0
  208. package/src/canvas/path-mapping.ts +19 -12
  209. package/src/canvas/popover-path.ts +7 -3
  210. package/src/canvas/popover-state.ts +1 -2
  211. package/src/canvas/preview-navigate.ts +16 -0
  212. package/src/canvas/repeater-sources.ts +200 -0
  213. package/src/canvas/serialize-scope.ts +13 -5
  214. package/src/canvas/stage-scrollbar.ts +7 -2
  215. package/src/canvas/surface-registry.ts +27 -3
  216. package/src/collab/collab-commands.ts +7 -2
  217. package/src/collab/collab-session.ts +84 -45
  218. package/src/collab/collab-state.ts +4 -3
  219. package/src/collab/monaco-binding.ts +16 -13
  220. package/src/collab/monaco-cursors.ts +5 -2
  221. package/src/commands/app-commands.ts +16 -6
  222. package/src/commands/budget.ts +13 -11
  223. package/src/commands/command-args.ts +103 -71
  224. package/src/commands/context.ts +55 -28
  225. package/src/commands/defaults.ts +69 -45
  226. package/src/commands/keymap.ts +56 -43
  227. package/src/commands/levels.ts +14 -8
  228. package/src/commands/live-context.ts +9 -7
  229. package/src/commands/reference.ts +2 -1
  230. package/src/commands/registry.ts +22 -11
  231. package/src/commands/run-reported.ts +15 -10
  232. package/src/component-props.ts +46 -30
  233. package/src/content/collection-match.ts +11 -9
  234. package/src/content/collection-pages.ts +412 -0
  235. package/src/content/content-collections.ts +270 -0
  236. package/src/content/draft-state.ts +4 -3
  237. package/src/content/entry-commands.ts +54 -62
  238. package/src/content/entry-editor.ts +137 -32
  239. package/src/content/entry-fields.ts +25 -8
  240. package/src/content/entry-inspector.ts +225 -0
  241. package/src/content/entry-model.ts +38 -15
  242. package/src/content/entry-open.ts +80 -0
  243. package/src/content/entry-summaries.ts +440 -0
  244. package/src/content/file-record-ids.ts +80 -0
  245. package/src/content/file-records.ts +125 -0
  246. package/src/content/page-summaries.ts +129 -0
  247. package/src/content/record-entry.ts +201 -0
  248. package/src/content/writing-banner.ts +177 -0
  249. package/src/create/add-new-commands.ts +185 -0
  250. package/src/create/add-new-flow.ts +1116 -0
  251. package/src/create/add-new.ts +1014 -0
  252. package/src/create/element-name.ts +121 -0
  253. package/src/editor/canvas-context-menu.ts +1 -2
  254. package/src/editor/canvas-slash-bridge.ts +3 -6
  255. package/src/editor/content-slice.ts +16 -14
  256. package/src/editor/context-menu.ts +35 -22
  257. package/src/editor/convert-targets.ts +30 -35
  258. package/src/editor/convert-to-component.ts +78 -48
  259. package/src/editor/convert-to-repeater.ts +34 -22
  260. package/src/editor/editable-tags.ts +17 -2
  261. package/src/editor/file-drop-action.ts +29 -22
  262. package/src/editor/inline-edit-apply.ts +79 -17
  263. package/src/editor/inline-edit.ts +76 -50
  264. package/src/editor/inline-format.ts +59 -56
  265. package/src/editor/inline-link.ts +40 -15
  266. package/src/editor/insert-component.ts +91 -0
  267. package/src/editor/insert-zone-action.ts +14 -5
  268. package/src/editor/merge-tags.ts +58 -19
  269. package/src/editor/repeater-scope.ts +39 -28
  270. package/src/editor/shortcuts.ts +76 -42
  271. package/src/editor/slash-menu.ts +52 -14
  272. package/src/files/asset-versions.ts +4 -4
  273. package/src/files/components.ts +89 -20
  274. package/src/files/elements.ts +5 -6
  275. package/src/files/file-ops.ts +92 -41
  276. package/src/files/files.ts +248 -239
  277. package/src/files/fs-events.ts +18 -7
  278. package/src/files/media-meta.ts +97 -2
  279. package/src/files/media-paths.ts +3 -0
  280. package/src/files/media-types.ts +55 -0
  281. package/src/files/media-upload.ts +209 -52
  282. package/src/files/new-file-name.ts +156 -0
  283. package/src/files/serialize-document.ts +15 -5
  284. package/src/format/constraints.ts +1 -1
  285. package/src/format/convert-file.ts +27 -13
  286. package/src/format/format-choices.ts +2 -1
  287. package/src/format/format-host.ts +91 -50
  288. package/src/github/github-auth-status.ts +27 -3
  289. package/src/github/github-auth.ts +21 -11
  290. package/src/github/github-publish.ts +28 -23
  291. package/src/grid/cell-editors.ts +46 -31
  292. package/src/grid/cell-popovers.ts +5 -3
  293. package/src/grid/edit-buffer.ts +10 -9
  294. package/src/grid/grid-controller.ts +25 -23
  295. package/src/grid/grid-layout.ts +21 -5
  296. package/src/grid/grid-open.ts +3 -33
  297. package/src/grid/grid-panel.ts +65 -6
  298. package/src/grid/grid-reveal.ts +34 -0
  299. package/src/grid/grid-source.ts +9 -31
  300. package/src/grid/grid-view.ts +45 -23
  301. package/src/grid/redirects-grid.ts +14 -5
  302. package/src/grid/redirects.ts +16 -14
  303. package/src/grid/schema-columns.ts +25 -19
  304. package/src/grid/sources/connector-source.ts +47 -20
  305. package/src/grid/sources/content-source.ts +100 -31
  306. package/src/grid/sources/csv-file-source.ts +2 -2
  307. package/src/grid/tabulator-tables.d.ts +61 -34
  308. package/src/hosting/document.ts +2 -2
  309. package/src/hosting/stage.ts +7 -7
  310. package/src/i18n/i18n-commands.ts +3 -3
  311. package/src/media/media-commands.ts +181 -0
  312. package/src/media/media-library-model.ts +232 -0
  313. package/src/media/media-library.ts +1283 -0
  314. package/src/media/media-pane.ts +51 -20
  315. package/src/new-project/add-repo-modal.ts +20 -19
  316. package/src/new-project/import-tab.ts +10 -14
  317. package/src/new-project/location-fields.ts +2 -1
  318. package/src/new-project/new-project-modal.ts +12 -9
  319. package/src/packages/jxsuite-update.ts +4 -3
  320. package/src/packages/pull-package-sync.ts +26 -25
  321. package/src/page-params.ts +97 -68
  322. package/src/panels/activity-panel.ts +38 -14
  323. package/src/panels/ai-chat/attached-context.ts +13 -7
  324. package/src/panels/ai-chat/chat-markdown.ts +8 -8
  325. package/src/panels/ai-chat/chat-view.ts +80 -73
  326. package/src/panels/ai-chat/composer.ts +30 -33
  327. package/src/panels/ai-chat/sessions-view.ts +1 -2
  328. package/src/panels/ai-panel.ts +23 -20
  329. package/src/panels/block-action-bar.ts +57 -46
  330. package/src/panels/bottom-dock.ts +5 -3
  331. package/src/panels/canvas-dnd-bridge.ts +36 -26
  332. package/src/panels/chat-panel.ts +6 -6
  333. package/src/panels/collections-panel.ts +306 -0
  334. package/src/panels/component-preview.ts +35 -13
  335. package/src/panels/data-explorer.ts +63 -26
  336. package/src/panels/data-grid.ts +18 -11
  337. package/src/panels/dnd.ts +115 -138
  338. package/src/panels/editors.ts +52 -21
  339. package/src/panels/elements-panel.ts +19 -5
  340. package/src/panels/empty-state.ts +2 -2
  341. package/src/panels/events-panel.ts +84 -69
  342. package/src/panels/formula-workspace.ts +78 -54
  343. package/src/panels/frontmatter-fields.ts +33 -28
  344. package/src/panels/git-diff-open.ts +10 -6
  345. package/src/panels/head-panel.ts +488 -202
  346. package/src/panels/i18n-panel.ts +20 -12
  347. package/src/panels/imports-panel.ts +25 -47
  348. package/src/panels/jump-bar.ts +75 -31
  349. package/src/panels/layers-panel.ts +130 -101
  350. package/src/panels/left-panel.ts +25 -11
  351. package/src/panels/navigator-panels.ts +23 -11
  352. package/src/panels/pane-context.ts +140 -49
  353. package/src/panels/pane-grid.ts +55 -26
  354. package/src/panels/panel-registry.ts +36 -46
  355. package/src/panels/properties-panel.ts +182 -124
  356. package/src/panels/quick-search.ts +53 -31
  357. package/src/panels/right-panel.ts +201 -45
  358. package/src/panels/seo-modal.ts +54 -125
  359. package/src/panels/settings-menu.ts +63 -61
  360. package/src/panels/settings-pane.ts +268 -162
  361. package/src/panels/signals-panel.ts +156 -135
  362. package/src/panels/site-model.ts +367 -0
  363. package/src/panels/site-panel.ts +638 -0
  364. package/src/panels/statement-editor.ts +230 -140
  365. package/src/panels/style-panel.ts +253 -206
  366. package/src/panels/style-utils.ts +114 -51
  367. package/src/panels/stylebook-doc.ts +195 -60
  368. package/src/panels/stylebook-layers-panel.ts +48 -89
  369. package/src/panels/stylebook-panel.ts +60 -27
  370. package/src/panels/styles-panel.ts +327 -0
  371. package/src/panels/tab-drop.ts +27 -11
  372. package/src/panels/tab-strip.ts +143 -49
  373. package/src/platform-errors.ts +57 -43
  374. package/src/platform.ts +59 -31
  375. package/src/platforms/cloud.ts +373 -176
  376. package/src/platforms/default-platform.ts +14 -8
  377. package/src/platforms/devserver.ts +180 -142
  378. package/src/platforms/read-batcher.ts +16 -8
  379. package/src/project-list.ts +2 -1
  380. package/src/publish/deploy-checklist.ts +20 -9
  381. package/src/publish/pages-service.ts +66 -27
  382. package/src/publish/publish-changes.ts +491 -0
  383. package/src/publish/publish-commands.ts +88 -22
  384. package/src/publish/publish-ids.ts +49 -0
  385. package/src/publish/publish-panel.ts +10 -6
  386. package/src/publish/publish-quick.ts +148 -0
  387. package/src/publish/publish-workspace.ts +926 -0
  388. package/src/publish/source-control.ts +907 -0
  389. package/src/recent-projects.ts +15 -8
  390. package/src/resize-edges.ts +26 -36
  391. package/src/services/a11y-report.ts +26 -19
  392. package/src/services/agent-seed.ts +23 -11
  393. package/src/services/ai-ask.ts +9 -12
  394. package/src/services/ai-command-tools.ts +68 -62
  395. package/src/services/ai-import-tools.ts +80 -67
  396. package/src/services/ai-models.ts +17 -13
  397. package/src/services/ai-project-tools.ts +68 -32
  398. package/src/services/ai-session-store.ts +19 -10
  399. package/src/services/ai-system-prompt.ts +46 -20
  400. package/src/services/ai-tools.ts +71 -27
  401. package/src/services/ai-write-report.ts +20 -12
  402. package/src/services/ai-writes.ts +4 -4
  403. package/src/services/automation.ts +74 -51
  404. package/src/services/cem-export.ts +149 -58
  405. package/src/services/cf-settings.ts +4 -4
  406. package/src/services/clock.ts +6 -1
  407. package/src/services/code-services.ts +37 -31
  408. package/src/services/connection.ts +2 -2
  409. package/src/services/context-manager.ts +14 -10
  410. package/src/services/context-resolver.ts +20 -8
  411. package/src/services/data-service.ts +19 -15
  412. package/src/services/directory-picker.ts +20 -14
  413. package/src/services/document-assistant.ts +39 -19
  414. package/src/services/gated-registry.ts +10 -6
  415. package/src/services/harness/chat-reducer.ts +23 -1
  416. package/src/services/import-client.ts +91 -38
  417. package/src/services/import-seed.ts +8 -2
  418. package/src/services/jx-validate.ts +28 -31
  419. package/src/services/live-preview.ts +0 -0
  420. package/src/services/live-surfaces.ts +6 -3
  421. package/src/services/model-uri.ts +10 -2
  422. package/src/services/module-preloads.ts +12 -8
  423. package/src/services/monaco-buffer.ts +43 -24
  424. package/src/services/monaco-lazy.ts +7 -8
  425. package/src/services/monaco-setup.ts +23 -16
  426. package/src/services/notify.ts +44 -17
  427. package/src/services/popover-report.ts +25 -10
  428. package/src/services/preview-eval.ts +20 -8
  429. package/src/services/profile.ts +13 -6
  430. package/src/services/project-path.ts +13 -10
  431. package/src/services/references.ts +0 -0
  432. package/src/services/render-critic.ts +29 -9
  433. package/src/services/settings/definitions.ts +25 -14
  434. package/src/services/settings/kernel.ts +13 -4
  435. package/src/services/settings/write-queue.ts +9 -9
  436. package/src/services/token-lint.ts +12 -10
  437. package/src/services/tool-executor.ts +17 -5
  438. package/src/services/tool-outcomes.ts +44 -24
  439. package/src/services/trusted-types.ts +24 -7
  440. package/src/settings/contexts-section.ts +11 -8
  441. package/src/settings/contributed-section.ts +128 -70
  442. package/src/settings/css-vars-editor.ts +119 -32
  443. package/src/settings/defs-editor.ts +38 -35
  444. package/src/settings/developer-panels.ts +43 -0
  445. package/src/settings/extension-rows.ts +16 -8
  446. package/src/settings/extension-sections.ts +42 -14
  447. package/src/settings/extensions-section.ts +4 -1
  448. package/src/settings/general-settings.ts +101 -28
  449. package/src/settings/locales-section.ts +20 -12
  450. package/src/settings/preferences-dialog.ts +17 -7
  451. package/src/settings/preferences-keymap.ts +7 -5
  452. package/src/settings/preferences-sections.ts +11 -5
  453. package/src/settings/project-sections.ts +28 -11
  454. package/src/settings/schema-field-ui.ts +12 -1
  455. package/src/settings/section-registry.ts +116 -11
  456. package/src/settings/settings-dialog.ts +192 -0
  457. package/src/settings/settings-document.ts +186 -166
  458. package/src/shell/tree.ts +6 -5
  459. package/src/shell.ts +536 -477
  460. package/src/site-context.ts +101 -32
  461. package/src/state.ts +68 -57
  462. package/src/store.ts +54 -34
  463. package/src/studio.ts +219 -116
  464. package/src/style/live-preview.ts +1 -1
  465. package/src/style/project-styles.ts +40 -7
  466. package/src/style/stylebook-specimens.ts +89 -0
  467. package/src/style/stylebook-target.ts +26 -0
  468. package/src/style/tag-inheritance.ts +105 -0
  469. package/src/style/token-ref.ts +5 -4
  470. package/src/style/variables-focus.ts +61 -0
  471. package/src/style/variables-view.ts +235 -0
  472. package/src/surfaces/about.ts +18 -19
  473. package/src/surfaces/add-new.json +1482 -0
  474. package/src/surfaces/add-new.ts +325 -0
  475. package/src/surfaces/add-repo.ts +17 -19
  476. package/src/surfaces/ai-chat.ts +33 -38
  477. package/src/surfaces/ai-credentials-form.ts +6 -16
  478. package/src/surfaces/ai-managed-connect.ts +3 -4
  479. package/src/surfaces/ai-model-picker.ts +3 -5
  480. package/src/surfaces/block-action-bar.ts +22 -11
  481. package/src/surfaces/boot-failure.json +4 -3
  482. package/src/surfaces/boot-failure.ts +4 -5
  483. package/src/surfaces/bottom-dock.json +1 -1
  484. package/src/surfaces/bottom-dock.ts +9 -18
  485. package/src/surfaces/canvas-stage.json +30 -19
  486. package/src/surfaces/canvas-stage.ts +17 -16
  487. package/src/surfaces/cf-account-picker.ts +17 -18
  488. package/src/surfaces/collections-panel.json +615 -0
  489. package/src/surfaces/collections-panel.ts +168 -0
  490. package/src/surfaces/commandbar.json +241 -96
  491. package/src/surfaces/commandbar.ts +145 -105
  492. package/src/surfaces/convert-repeater.ts +17 -19
  493. package/src/surfaces/data-actions.ts +9 -7
  494. package/src/surfaces/dialog.ts +26 -28
  495. package/src/surfaces/diff-toolbar.ts +9 -7
  496. package/src/surfaces/empty-state.json +1 -1
  497. package/src/surfaces/empty-state.ts +7 -10
  498. package/src/surfaces/entry-editor.json +136 -0
  499. package/src/surfaces/entry-editor.ts +35 -11
  500. package/src/surfaces/entry-inspector.json +371 -0
  501. package/src/surfaces/entry-inspector.ts +143 -0
  502. package/src/surfaces/expression-editor.ts +11 -25
  503. package/src/surfaces/files-panel.ts +27 -14
  504. package/src/surfaces/formula-palette.ts +4 -5
  505. package/src/surfaces/github-auth.ts +16 -20
  506. package/src/surfaces/github-publish.ts +17 -22
  507. package/src/surfaces/grid-cell.ts +30 -31
  508. package/src/surfaces/grid-open.ts +10 -14
  509. package/src/surfaces/grid-panel.ts +13 -9
  510. package/src/surfaces/grid-replace.ts +13 -13
  511. package/src/surfaces/grid-views.ts +15 -18
  512. package/src/surfaces/inspector-dock.json +162 -14
  513. package/src/surfaces/inspector-dock.ts +59 -31
  514. package/src/surfaces/jump-bar.ts +5 -6
  515. package/src/surfaces/jxsuite-update.ts +16 -22
  516. package/src/surfaces/library-pane.json +670 -437
  517. package/src/surfaces/library-pane.ts +111 -77
  518. package/src/surfaces/logic-panel.ts +17 -30
  519. package/src/surfaces/logic-workspace.ts +13 -15
  520. package/src/surfaces/media-browser.json +62 -6
  521. package/src/surfaces/media-browser.ts +26 -11
  522. package/src/surfaces/media-field.json +1 -1
  523. package/src/surfaces/media-field.ts +4 -5
  524. package/src/surfaces/media-library.json +1586 -0
  525. package/src/surfaces/media-library.ts +282 -0
  526. package/src/surfaces/media-pane.ts +8 -7
  527. package/src/surfaces/media-pick-dialog.json +71 -0
  528. package/src/surfaces/media-pick-dialog.ts +132 -0
  529. package/src/surfaces/menu.ts +47 -23
  530. package/src/surfaces/navigator-dock.ts +11 -12
  531. package/src/surfaces/new-project.ts +27 -26
  532. package/src/surfaces/pane-context.json +144 -77
  533. package/src/surfaces/pane-context.ts +44 -25
  534. package/src/surfaces/pane-grid.ts +15 -10
  535. package/src/surfaces/panel-activity.ts +5 -6
  536. package/src/surfaces/panel-data.ts +3 -4
  537. package/src/surfaces/panel-deploy-checklist.json +12 -6
  538. package/src/surfaces/panel-deploy-checklist.ts +8 -7
  539. package/src/surfaces/panel-elements.ts +5 -7
  540. package/src/surfaces/panel-i18n.ts +5 -7
  541. package/src/surfaces/panel-imports.ts +6 -13
  542. package/src/surfaces/panel-outline.ts +25 -19
  543. package/src/surfaces/panel-page.json +72 -2
  544. package/src/surfaces/panel-page.ts +49 -25
  545. package/src/surfaces/panel-problems.ts +5 -7
  546. package/src/surfaces/panel-signals.json +1 -1
  547. package/src/surfaces/panel-signals.ts +25 -39
  548. package/src/surfaces/panel-stylebook-layers.json +71 -204
  549. package/src/surfaces/panel-stylebook-layers.ts +5 -29
  550. package/src/surfaces/preferences.json +120 -48
  551. package/src/surfaces/preferences.ts +29 -11
  552. package/src/surfaces/progress-modal.ts +15 -9
  553. package/src/surfaces/properties-panel.json +1 -1
  554. package/src/surfaces/properties-panel.ts +20 -42
  555. package/src/surfaces/publish-quick.json +428 -0
  556. package/src/surfaces/publish-quick.ts +165 -0
  557. package/src/surfaces/publish-workspace.json +2892 -0
  558. package/src/surfaces/publish-workspace.ts +391 -0
  559. package/src/surfaces/publish.ts +18 -18
  560. package/src/surfaces/push-plan.ts +7 -8
  561. package/src/surfaces/rail.json +1 -159
  562. package/src/surfaces/rail.ts +22 -79
  563. package/src/surfaces/reference-field.ts +11 -15
  564. package/src/surfaces/schema-builder.ts +16 -22
  565. package/src/surfaces/schema-form.json +10 -2
  566. package/src/surfaces/schema-form.ts +17 -25
  567. package/src/surfaces/secret-field.ts +9 -6
  568. package/src/surfaces/seo.json +1 -1
  569. package/src/surfaces/seo.ts +21 -15
  570. package/src/surfaces/settings-contexts.ts +9 -7
  571. package/src/surfaces/settings-contributed.json +5 -5
  572. package/src/surfaces/settings-contributed.ts +32 -12
  573. package/src/surfaces/settings-css-vars.json +44 -36
  574. package/src/surfaces/settings-css-vars.ts +82 -16
  575. package/src/surfaces/settings-defs.json +2 -2
  576. package/src/surfaces/settings-defs.ts +17 -21
  577. package/src/surfaces/settings-deploy.json +2 -15
  578. package/src/surfaces/settings-deploy.ts +9 -16
  579. package/src/surfaces/settings-dialog.json +51 -0
  580. package/src/surfaces/settings-dialog.ts +169 -0
  581. package/src/surfaces/settings-extensions.ts +5 -6
  582. package/src/surfaces/settings-head.ts +33 -39
  583. package/src/surfaces/settings-locales.ts +8 -20
  584. package/src/surfaces/settings-overview.json +3 -3
  585. package/src/surfaces/settings-overview.ts +14 -8
  586. package/src/surfaces/settings-packages.ts +8 -7
  587. package/src/surfaces/settings-pane.json +269 -46
  588. package/src/surfaces/settings-pane.ts +88 -36
  589. package/src/surfaces/settings-rawjson.ts +5 -6
  590. package/src/surfaces/shell.json +2 -1
  591. package/src/surfaces/shell.ts +1 -2
  592. package/src/surfaces/site-panel.json +1029 -0
  593. package/src/surfaces/site-panel.ts +233 -0
  594. package/src/surfaces/slash-menu.json +63 -21
  595. package/src/surfaces/slash-menu.ts +42 -9
  596. package/src/surfaces/statements.ts +13 -18
  597. package/src/surfaces/statusbar.ts +56 -29
  598. package/src/surfaces/style-panel.ts +18 -31
  599. package/src/surfaces/stylebook-chrome.ts +3 -5
  600. package/src/surfaces/styles-panel.json +735 -0
  601. package/src/surfaces/styles-panel.ts +195 -0
  602. package/src/surfaces/styles-variables.json +149 -0
  603. package/src/surfaces/styles-variables.ts +145 -0
  604. package/src/surfaces/tab-strip.json +4 -4
  605. package/src/surfaces/tab-strip.ts +14 -13
  606. package/src/surfaces/target-line.ts +6 -7
  607. package/src/surfaces/welcome.ts +6 -8
  608. package/src/surfaces/writing-banner.json +94 -0
  609. package/src/surfaces/writing-banner.ts +80 -0
  610. package/src/tabs/bare-repeaters.ts +101 -0
  611. package/src/tabs/patch-ops.ts +4 -3
  612. package/src/tabs/project-config.ts +32 -21
  613. package/src/tabs/selection.ts +36 -8
  614. package/src/tabs/tab.ts +99 -48
  615. package/src/tabs/transact.ts +98 -53
  616. package/src/types.ts +53 -43
  617. package/src/ui/ai-credentials-form.ts +10 -13
  618. package/src/ui/ai-model-picker.ts +3 -3
  619. package/src/ui/cf-account-picker.ts +7 -9
  620. package/src/ui/color-selector.ts +9 -5
  621. package/src/ui/dynamic-slot.ts +7 -8
  622. package/src/ui/expression-editor.ts +112 -105
  623. package/src/ui/form-controls.ts +104 -56
  624. package/src/ui/formula-catalog.ts +239 -230
  625. package/src/ui/formula-chips.ts +33 -18
  626. package/src/ui/layers.ts +57 -31
  627. package/src/ui/media-picker.ts +300 -47
  628. package/src/ui/popover-surface.ts +20 -12
  629. package/src/ui/progress-modal.ts +13 -8
  630. package/src/ui/regions.ts +14 -12
  631. package/src/ui/schema-form.ts +372 -97
  632. package/src/ui/surface.ts +71 -8
  633. package/src/ui/timing.ts +9 -0
  634. package/src/ui/value-source.ts +44 -31
  635. package/src/ui/virtual-window.ts +29 -3
  636. package/src/utils/base64.ts +6 -4
  637. package/src/utils/edit-display.ts +366 -111
  638. package/src/utils/element-selectors.ts +3 -2
  639. package/src/utils/google-fonts.ts +15 -14
  640. package/src/utils/inherited-style.ts +18 -20
  641. package/src/utils/link-target.ts +1 -1
  642. package/src/utils/local-day.ts +18 -0
  643. package/src/utils/preview-format.ts +25 -3
  644. package/src/utils/strip-events.ts +49 -22
  645. package/src/utils/studio-utils.ts +29 -14
  646. package/src/view.ts +2 -3
  647. package/src/workspace/pane-derive.ts +14 -16
  648. package/src/workspace/session.ts +81 -50
  649. package/src/workspace/tab-workspace.ts +137 -0
  650. package/src/workspace/workspace-back.ts +189 -0
  651. package/src/workspace/workspace-home.ts +133 -0
  652. package/src/workspace/workspace-ids.ts +129 -0
  653. package/src/workspace/workspace-switch.ts +372 -0
  654. package/src/workspace/workspace.ts +165 -47
  655. package/styles/shell-frame.css +30 -7
  656. package/styles/shell-frame.json +15 -3
  657. package/dist/chunks/2020-va2wwra4.js +0 -4
  658. package/dist/chunks/adapter-f93pafd7.js +0 -4
  659. package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
  660. package/dist/chunks/cf-settings-125tdm0w.js +0 -4
  661. package/dist/chunks/color-area-jqhna8zy.js +0 -4
  662. package/dist/chunks/color-field-embq5ctg.js +0 -4
  663. package/dist/chunks/color-fpezvnkt.js +0 -4
  664. package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
  665. package/dist/chunks/combobox-773hdzyj.js +0 -4
  666. package/dist/chunks/components-ax2f1fnn.js +0 -4
  667. package/dist/chunks/content-source-108aqtk1.js +0 -4
  668. package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
  669. package/dist/chunks/dialog-mtm9fq5t.js +0 -4
  670. package/dist/chunks/editor-pfgdmkb0.js +0 -4
  671. package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
  672. package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
  673. package/dist/chunks/file-ops-meej5mqf.js +0 -4
  674. package/dist/chunks/files-44vp8a2s.js +0 -4
  675. package/dist/chunks/format-host-7q1petb9.js +0 -4
  676. package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
  677. package/dist/chunks/git-panel-zngbymvd.js +0 -4
  678. package/dist/chunks/grid-view-sx9vynsp.js +0 -51
  679. package/dist/chunks/icons-p44xhjf0.js +0 -4
  680. package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
  681. package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
  682. package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
  683. package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
  684. package/dist/chunks/index-wkyfjeqz.js +0 -4
  685. package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
  686. package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
  687. package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
  688. package/dist/chunks/layers-xd92fg8d.js +0 -4
  689. package/dist/chunks/listbox-s8fkmnq8.js +0 -4
  690. package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
  691. package/dist/chunks/media-picker-0svzkdyb.js +0 -4
  692. package/dist/chunks/menu-37d07z9m.js +0 -4
  693. package/dist/chunks/menu-5c55ea3d.js +0 -4
  694. package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
  695. package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
  696. package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
  697. package/dist/chunks/notify-0xgtn8q1.js +0 -4
  698. package/dist/chunks/number-field-gw7sq8rn.js +0 -4
  699. package/dist/chunks/parse-897fvqah.js +0 -4
  700. package/dist/chunks/platform-v1qctbe6.js +0 -4
  701. package/dist/chunks/popover-8htra4er.js +0 -4
  702. package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
  703. package/dist/chunks/quick-search-a54e6t5n.js +0 -4
  704. package/dist/chunks/references-gmqp82fs.js +0 -4
  705. package/dist/chunks/right-panel-v7t9awbk.js +0 -4
  706. package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
  707. package/dist/chunks/select-n3v7gwas.js +0 -4
  708. package/dist/chunks/split-pff8f3ze.js +0 -4
  709. package/dist/chunks/studio-0bhx5hz6.js +0 -5
  710. package/dist/chunks/studio-0k1ddnyy.js +0 -6
  711. package/dist/chunks/studio-1b04pd0j.js +0 -64
  712. package/dist/chunks/studio-4dwbj6gb.js +0 -5
  713. package/dist/chunks/studio-4tanh828.js +0 -5
  714. package/dist/chunks/studio-55h4mstj.js +0 -4
  715. package/dist/chunks/studio-5tnvjkz4.js +0 -5
  716. package/dist/chunks/studio-60dqgb0c.js +0 -5
  717. package/dist/chunks/studio-61dp09qg.js +0 -9
  718. package/dist/chunks/studio-63epcrj2.js +0 -5
  719. package/dist/chunks/studio-74k29dy9.js +0 -5
  720. package/dist/chunks/studio-7vg6jcd3.js +0 -5
  721. package/dist/chunks/studio-7zx31knw.js +0 -9
  722. package/dist/chunks/studio-8bxk97km.js +0 -5
  723. package/dist/chunks/studio-933e30n4.js +0 -5
  724. package/dist/chunks/studio-98wnwhbg.js +0 -5
  725. package/dist/chunks/studio-9mccjwjh.js +0 -14
  726. package/dist/chunks/studio-a2ke1e4t.js +0 -5
  727. package/dist/chunks/studio-e3a2a6v3.js +0 -4
  728. package/dist/chunks/studio-e81q1vb9.js +0 -5
  729. package/dist/chunks/studio-epgrmqqm.js +0 -5
  730. package/dist/chunks/studio-ery42sqr.js +0 -4
  731. package/dist/chunks/studio-g1shz58g.js +0 -5
  732. package/dist/chunks/studio-gf0fz03c.js +0 -5
  733. package/dist/chunks/studio-gjtpe62q.js +0 -6
  734. package/dist/chunks/studio-gkskhg7m.js +0 -5
  735. package/dist/chunks/studio-gx4dnjzd.js +0 -5
  736. package/dist/chunks/studio-j03zga3y.js +0 -9
  737. package/dist/chunks/studio-jhpxeckz.js +0 -5
  738. package/dist/chunks/studio-k01r7ykp.js +0 -5
  739. package/dist/chunks/studio-kk7h30ne.js +0 -7
  740. package/dist/chunks/studio-kt1zqney.js +0 -5
  741. package/dist/chunks/studio-m3cwhvye.js +0 -5
  742. package/dist/chunks/studio-mcayt6hz.js +0 -5
  743. package/dist/chunks/studio-myjcghv3.js +0 -5
  744. package/dist/chunks/studio-n8bxwc3y.js +0 -4
  745. package/dist/chunks/studio-ngm8gvpb.js +0 -5
  746. package/dist/chunks/studio-nj5a01jy.js +0 -928
  747. package/dist/chunks/studio-pcgz8heb.js +0 -5
  748. package/dist/chunks/studio-qcsq0t15.js +0 -5
  749. package/dist/chunks/studio-qkstvve9.js +0 -5
  750. package/dist/chunks/studio-qv1pwd3c.js +0 -5
  751. package/dist/chunks/studio-rc6dvxjb.js +0 -7
  752. package/dist/chunks/studio-s8dmmz66.js +0 -5
  753. package/dist/chunks/studio-sp5xzbj4.js +0 -6
  754. package/dist/chunks/studio-szsjbj0g.js +0 -5
  755. package/dist/chunks/studio-t1xzawhr.js +0 -16
  756. package/dist/chunks/studio-tdcprbqb.js +0 -5
  757. package/dist/chunks/studio-vrmcjf9g.js +0 -7
  758. package/dist/chunks/studio-vyc0b4he.js +0 -10
  759. package/dist/chunks/studio-w0cgf6jg.js +0 -5
  760. package/dist/chunks/studio-w3hskzqk.js +0 -5
  761. package/dist/chunks/studio-xgrgcdyh.js +0 -9
  762. package/dist/chunks/studio-xz2yxfcb.js +0 -5
  763. package/dist/chunks/studio-y6n42tgs.js +0 -5
  764. package/dist/chunks/studio-yb560vxr.js +0 -5
  765. package/dist/chunks/studio-yn9f8vtx.js +0 -5
  766. package/dist/chunks/studio-yw05w8f0.js +0 -7
  767. package/dist/chunks/studio-z16sgavc.js +0 -5
  768. package/dist/chunks/studio-zey7zsdw.js +0 -12
  769. package/dist/chunks/studio-zyqn40w4.js +0 -5
  770. package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
  771. package/dist/chunks/tabs-jwthg40w.js +0 -4
  772. package/dist/chunks/textfield-spy3hc77.js +0 -4
  773. package/dist/chunks/toast-4d35zd64.js +0 -4
  774. package/dist/chunks/toast-host-8sjmfed3.js +0 -4
  775. package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
  776. package/dist/chunks/tree-h19v1jfz.js +0 -4
  777. package/dist/chunks/tsMode-2frah6h1.js +0 -14
  778. package/dist/chunks/workspace-zt81g1ms.js +0 -4
  779. package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
  780. package/src/panels/frontmatter-panel.ts +0 -701
  781. package/src/panels/git-panel.ts +0 -1120
  782. package/src/surfaces/doc-header.json +0 -776
  783. package/src/surfaces/doc-header.ts +0 -231
  784. package/src/surfaces/git-panel.json +0 -1880
  785. package/src/surfaces/git-panel.ts +0 -272
@@ -42,10 +42,11 @@
42
42
  */
43
43
 
44
44
  import { nothing } from "lit-html";
45
- import { getEventBinding, isExpressionDef, isJsonObject } from "@jxsuite/schema/guards";
45
+ import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
46
+ import { getEventBinding, isExpressionDef, isJsonObject, isString } from "@jxsuite/schema/guards";
46
47
 
47
48
  import { effect, effectScope, shallowRef } from "../reactivity";
48
- import { getNodeAtPath, updateUi } from "../store";
49
+ import { updateUi } from "../store";
49
50
  import { activeTab } from "../workspace/workspace";
50
51
  import { mutateAddDef, mutateUpdateDef, mutateUpdateProperty, transactDoc } from "../tabs/transact";
51
52
  import { setBottomTab } from "../shell";
@@ -69,14 +70,19 @@ import {
69
70
  stringProperty,
70
71
  } from "../commands/command-args";
71
72
 
72
- import type { JxNodeValue } from "../tabs/transact";
73
73
  import type { AnyCommand, CommandRegistry } from "../commands/registry";
74
74
  import type { PanelBody } from "./panel-registry";
75
75
  import type { ExpressionPreview } from "../services/preview-eval";
76
- import type { FormulaEditDef, FunctionEditDef, JsonValue } from "../types";
76
+ import type { FormulaEditDef, FunctionEditDef } from "../types";
77
77
  import type { Tab } from "../tabs/tab";
78
- import type { JxStateDefinition } from "@jxsuite/schema/types";
78
+ import type {
79
+ JsonObject,
80
+ JsonValue,
81
+ JxEventBinding,
82
+ JxStateDefinition,
83
+ } from "@jxsuite/schema/types";
79
84
  import type { EffectScope } from "@vue/reactivity";
85
+ import type { ScopeValue } from "../editor/merge-tags";
80
86
  import type {
81
87
  LogicChipView,
82
88
  LogicScopeEntryView,
@@ -125,10 +131,10 @@ export function logicTarget(tab: Tab | null = activeTab.value): LogicTarget | nu
125
131
  return null;
126
132
  }
127
133
  if (ui.editingFunction) {
128
- return { editing: ui.editingFunction as FunctionEditDef, surface: "function" };
134
+ return { editing: ui.editingFunction, surface: "function" };
129
135
  }
130
136
  if (ui.editingFormula) {
131
- return { editing: ui.editingFormula as FormulaEditDef, surface: "formula" };
137
+ return { editing: ui.editingFormula, surface: "formula" };
132
138
  }
133
139
  return null;
134
140
  }
@@ -176,25 +182,35 @@ export function openLogicTarget(target: LogicTarget): void {
176
182
  revealLogicPanel();
177
183
  }
178
184
 
179
- function isExprNode(value: unknown): value is Record<string, unknown> {
180
- return isJsonObject(value) && typeof value.operator === "string";
185
+ /** An expression node: a plain object naming its `operator`. */
186
+ function isExprNode(value: JsonValue | undefined): value is JsonObject {
187
+ return isJsonObject(value) && isString(value.operator);
181
188
  }
182
189
 
183
190
  // ─── Document access ─────────────────────────────────────────────────────────
184
191
 
192
+ /**
193
+ * The `$expression` of an expression entry or binding, as the JSON object it is; null for anything
194
+ * else. `isExpressionDef` has already checked it is a plain object, and the guard carries that to
195
+ * the type.
196
+ */
197
+ function expressionOf(value: JxStateDefinition | JxEventBinding | undefined): JsonObject | null {
198
+ if (!isExpressionDef(value)) {
199
+ return null;
200
+ }
201
+ const { $expression } = value;
202
+ return isJsonObject($expression) ? $expression : null;
203
+ }
204
+
185
205
  /** Read the workspace target's current root expression node from the document. */
186
- export function formulaRoot(tab: Tab, editing: FormulaEditDef): Record<string, unknown> | null {
206
+ export function formulaRoot(tab: Tab, editing: FormulaEditDef): JsonObject | null {
187
207
  const { document } = tab.doc;
188
208
  if (editing.type === "def" && editing.defName) {
189
- const def = document?.state?.[editing.defName];
190
- return isExpressionDef(def) ? (def.$expression as unknown as Record<string, unknown>) : null;
209
+ return expressionOf(document.state?.[editing.defName]);
191
210
  }
192
211
  if (editing.type === "event" && editing.path && editing.eventKey) {
193
212
  const node = getNodeAtPath(document, editing.path);
194
- const binding = node ? getEventBinding(node, editing.eventKey) : undefined;
195
- return isExpressionDef(binding)
196
- ? (binding.$expression as unknown as Record<string, unknown>)
197
- : null;
213
+ return expressionOf(node ? getEventBinding(node, editing.eventKey) : undefined);
198
214
  }
199
215
  return null;
200
216
  }
@@ -203,18 +219,18 @@ export function formulaRoot(tab: Tab, editing: FormulaEditDef): Record<string, u
203
219
  * Resolve a chip selection to its editable node: the deepest expression-node prefix of `path` (head
204
220
  * chips target ref/literal operands; stale paths fall back toward the root).
205
221
  */
206
- function resolveSelection(
207
- root: Record<string, unknown>,
208
- path: NodePath,
209
- ): { node: Record<string, unknown>; path: NodePath } {
210
- let current: unknown = root;
211
- let node: Record<string, unknown> = root;
222
+ function resolveSelection(root: JsonObject, path: NodePath) {
223
+ let current: JsonValue | undefined = root;
224
+ let node = root;
212
225
  let nodePath: NodePath = [];
213
226
  for (const [i, seg] of path.entries()) {
214
- if (!current || typeof current !== "object") {
227
+ if (Array.isArray(current)) {
228
+ current = current[Number(seg)];
229
+ } else if (isJsonObject(current)) {
230
+ current = current[String(seg)];
231
+ } else {
215
232
  break;
216
233
  }
217
- current = (current as Record<string, unknown>)[seg as keyof typeof current];
218
234
  if (isExprNode(current)) {
219
235
  node = current;
220
236
  nodePath = path.slice(0, i + 1);
@@ -224,30 +240,28 @@ function resolveSelection(
224
240
  }
225
241
 
226
242
  /** Immutably replace the value at `path` within `node` (object keys / array indexes). */
227
- function replaceAtPath(node: unknown, path: NodePath, value: unknown): unknown {
228
- if (path.length === 0) {
243
+ function replaceAtPath(node: JsonValue | undefined, path: NodePath, value: JsonValue): JsonValue {
244
+ const [head, ...rest] = path;
245
+ if (head === undefined) {
229
246
  return value;
230
247
  }
231
- const [head, ...rest] = path as [string | number, ...NodePath];
232
248
  if (Array.isArray(node)) {
233
- const copy = [...(node as unknown[])];
249
+ const copy = [...node];
234
250
  copy[Number(head)] = replaceAtPath(copy[Number(head)], rest, value);
235
251
  return copy;
236
252
  }
237
- const base: Record<string, unknown> = isJsonObject(node) ? node : {};
238
- return { ...base, [head]: replaceAtPath(base[head as string], rest, value) };
253
+ const base: JsonObject = isJsonObject(node) ? node : {};
254
+ return { ...base, [head]: replaceAtPath(base[head], rest, value) };
239
255
  }
240
256
 
241
257
  /** Write the whole updated root node back to the document position (one undo step). */
242
- function writeRoot(tab: Tab, editing: FormulaEditDef, newRoot: unknown) {
258
+ function writeRoot(tab: Tab, editing: FormulaEditDef, newRoot: JsonValue) {
243
259
  if (editing.type === "def" && editing.defName) {
244
260
  const { defName } = editing;
245
- transactDoc(tab, (t) => mutateUpdateDef(t, defName, { $expression: newRoot as JsonValue }));
261
+ transactDoc(tab, (t) => mutateUpdateDef(t, defName, { $expression: newRoot }));
246
262
  } else if (editing.type === "event" && editing.path && editing.eventKey) {
247
263
  const { eventKey, path } = editing;
248
- transactDoc(tab, (t) =>
249
- mutateUpdateProperty(t, path, eventKey, { $expression: newRoot } as JxNodeValue),
250
- );
264
+ transactDoc(tab, (t) => mutateUpdateProperty(t, path, eventKey, { $expression: newRoot }));
251
265
  }
252
266
  }
253
267
 
@@ -288,15 +302,14 @@ function selectionKey(editing: FormulaEditDef): string {
288
302
  *
289
303
  * The document reports a chip by its key and a button by nothing at all, so the objects behind them
290
304
  * — the tab, the target, the root node, the sub-node a commit replaces — live here, rewritten by
291
- * every projection. Held rather than recomputed at click time for the reason `panels/git-panel.ts`
292
- * states about its own seat: a callback captured at mount would reach the FIRST projection's
293
- * 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.
294
307
  */
295
308
  interface Resolved {
296
309
  tab: Tab;
297
310
  editing: FormulaEditDef;
298
- root: Record<string, unknown>;
299
- selected: Record<string, unknown>;
311
+ root: JsonObject;
312
+ selected: JsonObject;
300
313
  selectedPath: NodePath;
301
314
  stateEntries: Record<string, JxStateDefinition>;
302
315
  preview: ExpressionPreview | null;
@@ -304,19 +317,27 @@ interface Resolved {
304
317
  /** Chip key → node path, so a chip click needs no path parsing (a `switch` case may hold "/"). */
305
318
  chipPaths: Map<string, NodePath>;
306
319
  /** Rail entry name → the value its tree draws. */
307
- scopeValues: Map<string, unknown>;
320
+ scopeValues: Map<string, ScopeValue>;
308
321
  }
309
322
 
310
323
  let _resolved: Resolved | null = null;
311
324
 
312
- /** Replace the selected sub-node inside the root and write the whole root back. */
313
- function writeSelected(next: unknown): void {
325
+ /**
326
+ * Replace the selected sub-node inside the root and write the whole root back.
327
+ *
328
+ * Typed as the expression editor's own change callback, which is one of its two callers; the other
329
+ * is a catalog pick's `onChange`.
330
+ */
331
+ const writeSelected: Parameters<typeof mountExpressionEditor>[2] = (next) => {
314
332
  const held = _resolved;
315
333
  if (!held) {
316
334
  return;
317
335
  }
318
- writeRoot(held.tab, held.editing, replaceAtPath(held.root, held.selectedPath, next));
319
- }
336
+ /* SAFETY: both callers hand back an expression node built of JSON operator/operand values: the
337
+ expression editor's edited tree, and the node a catalog pick inserts (a JxExpressionNode). */
338
+ const node = next as JsonValue;
339
+ writeRoot(held.tab, held.editing, replaceAtPath(held.root, held.selectedPath, node));
340
+ };
320
341
 
321
342
  // ─── The projection ──────────────────────────────────────────────────────────
322
343
 
@@ -354,13 +375,13 @@ function resultOf(
354
375
  }
355
376
 
356
377
  /** The live data context — a SECOND opinion now that the page itself is on screen, not the only one. */
357
- function railOf(scope: Record<string, unknown> | null | undefined): {
358
- entries: LogicScopeEntryView[];
359
- values: Map<string, unknown>;
360
- } {
378
+ function railOf(scope: Tab["session"]["canvas"]["scope"] | undefined) {
361
379
  const entries: LogicScopeEntryView[] = [];
362
- const values = new Map<string, unknown>();
363
- for (const [name, value] of Object.entries(scope ?? {})) {
380
+ const values = new Map<string, ScopeValue>();
381
+ /* SAFETY: the canvas scope's one writer (iframe-host.ts, on a `dataScope` message) stores that
382
+ message's `scope`, a JsonObject of deep-cloned values (serialize-scope.ts). */
383
+ const snapshot = (scope ?? {}) as JsonObject;
384
+ for (const [name, value] of Object.entries(snapshot)) {
364
385
  entries.push({ key: name, name, type: dataTypeLabel(value) });
365
386
  values.set(name, unwrapSignal(value));
366
387
  }
@@ -422,7 +443,7 @@ export function workspaceView(): LogicWorkspaceView {
422
443
  };
423
444
  }
424
445
 
425
- const stateEntries = (tab.doc.document?.state ?? {}) as Record<string, JxStateDefinition>;
446
+ const stateEntries = tab.doc.document.state ?? {};
426
447
  /* Live-context evaluation in the canvas iframe with snapshot fallback (M6). The canvas is no
427
448
  longer unmounted while this surface is open — that is the entire point of the move — so the
428
449
  live path is the ORDINARY case now rather than the one that never happened. An event target's
@@ -595,7 +616,10 @@ const ACTIONS: LogicWorkspaceActions = {
595
616
  };
596
617
 
597
618
  /** Vendor a packaged formula's state entry into the document, as one undo step. */
598
- function insertDef(defName: string, def: unknown): void {
619
+ function insertDef(defName: string, def: JxStateDefinition): void {
620
+ /* SAFETY: the only def the editor and the catalog insert is a packaged formula's vendored entry
621
+ (formula-catalog.ts `ensure`): `$description`, `$expression` and `parameters`, all JSON from
622
+ @jxsuite/formulas. */
599
623
  transactDoc(activeTab.value, (t) => mutateAddDef(t, defName, def as Record<string, JsonValue>));
600
624
  }
601
625
 
@@ -750,7 +774,7 @@ export function formulaEditorCommands(): AnyCommand[] {
750
774
  if (!tab) {
751
775
  throw new RangeError(`command "formula.editDef" needs an open document`);
752
776
  }
753
- const defs = tab.doc.document?.state ?? {};
777
+ const defs = tab.doc.document.state ?? {};
754
778
  if (!(defName in defs)) {
755
779
  const defined = Object.keys(defs);
756
780
  throw new RangeError(
@@ -9,17 +9,18 @@
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.
21
21
  */
22
22
 
23
+ import { isBoolean, isString } from "@jxsuite/schema/guards";
23
24
  import { previewAssetSrc } from "../canvas/asset-refs";
24
25
  import { IMAGE_EXTENSIONS, extensionOf } from "../files/media-upload";
25
26
  import { referenceEntryState } from "../ui/form-controls";
@@ -29,12 +30,14 @@ import { referenceTarget } from "../ui/schema-form";
29
30
  import type { JsonValue } from "../types";
30
31
  import type { Tab } from "../tabs/tab";
31
32
  import type { ProjectConfig } from "@jxsuite/schema/types";
33
+ import type { SurfaceOption } from "../ui/surface";
32
34
 
33
35
  export interface FmSchemaEntry {
34
36
  type?: string;
35
37
  enum?: string[];
36
38
  format?: string;
37
- properties?: Record<string, unknown>;
39
+ /** A nested object field's own field schemas. */
40
+ properties?: Record<string, FmSchemaEntry>;
38
41
  /** `#/content/<type>` — a relationship to another collection (site-architecture.md §6.1). */
39
42
  $ref?: string;
40
43
  }
@@ -42,7 +45,8 @@ export interface FmSchemaEntry {
42
45
  export interface FmField {
43
46
  field: string;
44
47
  entry: FmSchemaEntry;
45
- value: JsonValue;
48
+ /** What the document holds under the key; `undefined` for a schema field it does not set. */
49
+ value: JsonValue | undefined;
46
50
  }
47
51
 
48
52
  export interface FmFieldSet {
@@ -62,16 +66,23 @@ export interface FmFieldSet {
62
66
  *
63
67
  * @param {Tab} tab
64
68
  * @param {ProjectConfig | null | undefined} projectConfig
65
- * @param {Set<string>} reserved — keys managed by dedicated controls elsewhere
69
+ * @param {ReadonlySet<string>} reserved — keys managed by dedicated controls elsewhere
66
70
  * @returns {FmFieldSet}
67
71
  */
68
72
  export function collectFmFields(
69
73
  tab: Tab,
70
74
  projectConfig: ProjectConfig | null | undefined,
71
- reserved: Set<string>,
75
+ reserved: ReadonlySet<string>,
72
76
  ): FmFieldSet {
73
- const fm = tab.doc.content?.frontmatter || {};
77
+ /* SAFETY: `FormatFrontmatter` holds `JxDocumentValue`, which is the JSON value space seen through
78
+ the typed interfaces a document's declared keys use (JxRef, JxStatement, CemEvent, ...). Every
79
+ frontmatter value is parsed from the file by a format class's split or JSON-cloned from one, so
80
+ each is plain JSON data, and viewing it as JsonValue reads the same data without those views. */
81
+ const fm = tab.doc.content.frontmatter as Record<string, JsonValue | undefined>;
74
82
  const collection = findContentTypeSchema(tab.documentPath, projectConfig);
83
+ /* SAFETY: a collection schema is JSON Schema, and the only keywords an FmSchemaEntry reads —
84
+ `type`, `format`, `$ref` (strings) and `enum` (a list of choices) — carry those shapes there;
85
+ `required` is already typed `string[]` on ContentTypeSchema. */
75
86
  const schema = collection?.schema as
76
87
  | { properties?: Record<string, FmSchemaEntry>; required?: string[] }
77
88
  | undefined;
@@ -84,16 +95,16 @@ export function collectFmFields(
84
95
  if (reserved.has(field)) {
85
96
  continue;
86
97
  }
87
- fields.push({ entry: fieldSchema, field, value: fm[field] as JsonValue });
98
+ fields.push({ entry: fieldSchema, field, value: fm[field] });
88
99
  }
89
100
  for (const [field, value] of Object.entries(fm)) {
90
101
  if (schemaProps[field] || field.startsWith("$") || reserved.has(field)) {
91
102
  continue;
92
103
  }
93
104
  fields.push({
94
- entry: { type: typeof value === "boolean" ? "boolean" : "string" },
105
+ entry: { type: isBoolean(value) ? "boolean" : "string" },
95
106
  field,
96
- value: value as JsonValue,
107
+ value,
97
108
  });
98
109
  }
99
110
  } else {
@@ -102,9 +113,9 @@ export function collectFmFields(
102
113
  continue;
103
114
  }
104
115
  fields.push({
105
- entry: { type: typeof value === "boolean" ? "boolean" : "string" },
116
+ entry: { type: isBoolean(value) ? "boolean" : "string" },
106
117
  field,
107
- value: value as JsonValue,
118
+ value,
108
119
  });
109
120
  }
110
121
  }
@@ -112,12 +123,6 @@ export function collectFmFields(
112
123
  return { collection, fields, hasSchema: Boolean(schemaProps), requiredFields };
113
124
  }
114
125
 
115
- /** One choice in a row's picker — the shape `jx-select` reads. */
116
- export interface FmChoice {
117
- value: string;
118
- label: string;
119
- }
120
-
121
126
  /**
122
127
  * One frontmatter field as a surface draws it. Every field is present whatever the `kind`, because
123
128
  * a document's binding renders a value and its `$switch` chooses on one: a row that omitted
@@ -140,7 +145,7 @@ export interface FmRowView {
140
145
  /** A text row's placeholder. Empty draws none. */
141
146
  placeholder: string;
142
147
  /** A picker's rows, in the order they are offered. Empty on every other kind. */
143
- options: FmChoice[];
148
+ options: SurfaceOption[];
144
149
  /** A sentence under the control — an empty collection, or a listing that failed. */
145
150
  note: string;
146
151
  /** Whether {@link FmRowView.note} has anything in it; `$switch` is a document's conditional. */
@@ -162,8 +167,8 @@ export interface FmRowProjection {
162
167
  }
163
168
 
164
169
  /** A frontmatter value as the text a field shows. An object is not a string and never pretends. */
165
- function text(value: unknown): string {
166
- return typeof value === "string" ? value : "";
170
+ function text(value: JsonValue | undefined): string {
171
+ return isString(value) ? value : "";
167
172
  }
168
173
 
169
174
  /** A blank row, so every kind carries every field a surface's bindings read. */
@@ -188,7 +193,7 @@ function blankRow(label: string): FmRowView {
188
193
  *
189
194
  * @param {string} field The frontmatter key.
190
195
  * @param {FmSchemaEntry} entry Its schema, or the type inferred from the value it already holds.
191
- * @param {unknown} value What the document says today.
196
+ * @param {JsonValue | undefined} value What the document says today.
192
197
  * @param {Set<string>} requiredFields The collection's required keys, for the label's marker.
193
198
  * @param {{ rerender: () => void }} opts How a surface is repainted when a referenced collection's
194
199
  * entry ids land — the one asynchronous read a row can start.
@@ -197,7 +202,7 @@ function blankRow(label: string): FmRowView {
197
202
  export function projectFmField(
198
203
  field: string,
199
204
  entry: FmSchemaEntry,
200
- value: unknown,
205
+ value: JsonValue | undefined,
201
206
  requiredFields: Set<string>,
202
207
  opts: { rerender: () => void },
203
208
  ): FmRowProjection {
@@ -294,7 +299,7 @@ export function projectFmField(
294
299
  return {
295
300
  parse: (raw) => {
296
301
  /* NaN is deleted rather than written. The two surfaces this replaced disagreed here: the
297
- 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
298
303
  `NaN` into the frontmatter, where it round-trips to `null`. One answer, and it is the
299
304
  one that cannot corrupt the document. */
300
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` when it reveals a tab that was already open, so the tab is
136
- * resolved from the workspace either way.
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
- const opened = await files.openFileInTab(path, {});
147
- return opened ?? [...workspace.tabs.values()].find((tab) => tab.documentPath === path) ?? null;
150
+ await files.openFileInTab(path, { canvasMode: "git-diff" });
151
+ return [...workspace.tabs.values()].find((tab) => tab.documentPath === path) ?? null;
148
152
  }