@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
@@ -45,6 +45,7 @@
45
45
  * the document it is warning you about.
46
46
  */
47
47
 
48
+ import { writesEntryOnCanvas } from "../content/content-collections";
48
49
  import { projectState, updateUi } from "../store";
49
50
  import { effect, effectScope } from "../reactivity";
50
51
  import { PRIMARY_PANE, focusPane, workspace } from "../workspace/workspace";
@@ -68,10 +69,14 @@ import { openMenu } from "../surfaces/menu";
68
69
  import { emptyPaneContextView, mountPaneContextSurface } from "../surfaces/pane-context";
69
70
  import { PANE_SELECTOR } from "../surfaces/pane-grid";
70
71
  import { diffShowsCode } from "../canvas/diff-view";
72
+ import { backTargetOf, goBack } from "../workspace/workspace-back";
73
+ import type { WorkspaceId } from "../workspace/workspace-ids";
71
74
  import { canRenderComparison } from "./git-diff-open";
72
75
  import { shell } from "../shell";
73
76
  import { paneRegion } from "../ui/regions";
77
+ import { isNumber, isString } from "@jxsuite/schema/guards";
74
78
  import {
79
+ CANVAS_VIEWS,
75
80
  fitToScreen,
76
81
  getFit,
77
82
  resetZoom,
@@ -87,7 +92,12 @@ import {
87
92
  import { editorKindOf, editorKindsOf, modeForEditorKind } from "../tabs/tab";
88
93
  import { collabState } from "../collab/collab-state";
89
94
  import { activeRegistry } from "../commands/active-registry";
90
- import { getEffectiveLayoutPath, getEffectiveLocales, getEffectiveMedia } from "../site-context";
95
+ import {
96
+ getEffectiveLayoutPath,
97
+ getEffectiveLocales,
98
+ getEffectiveMedia,
99
+ getEffectiveRenderLocale,
100
+ } from "../site-context";
91
101
  import { localeLabel, localeOfPath } from "@jxsuite/schema/locale";
92
102
  import { isSchemeQuery } from "../utils/canvas-media";
93
103
  import { dynamicRouteParams, loadParamValues, pagePathsDef } from "../page-params";
@@ -95,8 +105,8 @@ import { componentPropEntries, isComponentDoc } from "../component-props";
95
105
  import { mediaDisplayName } from "./shared";
96
106
  import type { CanvasView, FitMode } from "../canvas/canvas-utils";
97
107
  import { EDITOR_KIND_LABELS } from "../commands/context";
98
- import type { EditorKind } from "../commands/context";
99
108
  import type { ParamValues } from "../page-params";
109
+ import type { CommandArgValues } from "../commands/command-args";
100
110
  import type { Tab } from "../tabs/tab";
101
111
  import type { ResolvedI18n } from "@jxsuite/schema/locale";
102
112
  import type { JsonValue } from "../types";
@@ -141,6 +151,14 @@ export interface PaneContextCtx {
141
151
  * Editor picker a control over the primary's document.
142
152
  */
143
153
  setCanvasMode: (tab: Tab, mode: string) => void;
154
+ /**
155
+ * Close a tab through the strip's guarded close (`panels/tab-strip.ts` `requestClose`): what the
156
+ * Back control does to a media viewer or a comparison. Absent (a test's partial bootstrap), the
157
+ * control runs `pane.backToHome` instead, whose bootstrap deps carry the same close.
158
+ */
159
+ closeTab?: (tabId: string) => void | Promise<void>;
160
+ /** Give the keyboard to the home a Back landed on (`WorkspaceBackDeps.focusHome`). */
161
+ focusHome?: (paneId: string, id: WorkspaceId) => void;
144
162
  parseMediaEntries: (media: Record<string, string> | null | undefined) => {
145
163
  sizeBreakpoints: {
146
164
  name: string;
@@ -217,10 +235,51 @@ export function attachPaneChromeHost(paneId: string, host: HTMLElement | null):
217
235
 
218
236
  /** Take one pane's document down and forget it. Idempotent. */
219
237
  function disposePane(paneId: string): void {
238
+ _bandWatches.get(paneId)?.observer.disconnect();
239
+ _bandWatches.delete(paneId);
220
240
  _surfaces.get(paneId)?.dispose();
221
241
  _surfaces.delete(paneId);
222
242
  }
223
243
 
244
+ /**
245
+ * Each pane's band, as the observer that keeps the stage offset in step with it watches it.
246
+ *
247
+ * The offset used to be MEASURED on every projection, synchronously, right after the update that
248
+ * may have changed the band. A projection runs inside whatever changed the pane (a tab activation,
249
+ * a workspace switch, a mode change) with the rest of that change still to be written, so the read
250
+ * paid a style recalculation of the whole half-written document every time: 12 to 18 ms per tab
251
+ * activation in the perf trace, the hottest forced recalculation once the tab strip stopped
252
+ * reading. A `ResizeObserver` reports the band's height after the frame's own layout, when it is
253
+ * free to read, and only when it actually changed.
254
+ */
255
+ const _bandWatches = new Map<string, { band: HTMLElement; observer: ResizeObserver }>();
256
+
257
+ /**
258
+ * Keep `paneId`'s stage offset following its band: measure it once now, and again whenever it
259
+ * resizes. Re-binds when the document has drawn a new band element; a no-op for the one it holds.
260
+ * Without `ResizeObserver` (a DOM with no layout engine) every call measures, as before.
261
+ */
262
+ function watchBand(paneId: string, host: HTMLElement, surface: PaneContextSurfaceHandle): void {
263
+ const band = surface.band();
264
+ const held = _bandWatches.get(paneId);
265
+ if (held && held.band === band) {
266
+ return;
267
+ }
268
+ held?.observer.disconnect();
269
+ _bandWatches.delete(paneId);
270
+ applyPaneContextOffset(topBandHeight(surface), host);
271
+ if (!band || typeof ResizeObserver === "undefined") {
272
+ return;
273
+ }
274
+ const observer = new ResizeObserver(() => {
275
+ if (_surfaces.get(paneId) === surface) {
276
+ applyPaneContextOffset(topBandHeight(surface), host);
277
+ }
278
+ });
279
+ observer.observe(band);
280
+ _bandWatches.set(paneId, { band, observer });
281
+ }
282
+
224
283
  /**
225
284
  * Mount the pane chrome. Idempotent.
226
285
  *
@@ -257,7 +316,7 @@ export function mount(host: HTMLElement, ctx: PaneContextCtx) {
257
316
  }
258
317
  // Read reactive properties to establish tracking — mirrors the toolbar's subset.
259
318
  void tab.doc.document;
260
- void tab.doc.document?.$layout;
319
+ void tab.doc.document.$layout;
261
320
  void tab.doc.mode;
262
321
  void tab.documentPath;
263
322
  void tab.capabilities.modes;
@@ -331,21 +390,6 @@ function topBandHeight(surface: PaneContextSurfaceHandle): number {
331
390
  return Math.max(surface.band()?.offsetHeight ?? 0, PANE_CONTEXT_HEIGHT);
332
391
  }
333
392
 
334
- /**
335
- * Whether this tab's editor has any of the bar's three axes to offer.
336
- *
337
- * Project Settings has none: it declares one editor kind, no canvas view, and no rendering context
338
- * — and the one control the bar WOULD contribute, "Manage contexts…", routes to a section of the
339
- * very document on screen. A bar of three inert controls above the definition site they point at is
340
- * chrome that says nothing, so the stage takes the whole pane.
341
- *
342
- * @param {Tab} tab
343
- * @returns {boolean}
344
- */
345
- function wantsContextBar(tab: Tab): boolean {
346
- return tab.session.ui.canvasMode !== "settings";
347
- }
348
-
349
393
  /** Project every attached pane's chrome. */
350
394
  export function render() {
351
395
  for (const [paneId, host] of _hosts) {
@@ -360,13 +404,12 @@ function renderPane(paneId: string, host: HTMLElement) {
360
404
  }
361
405
  try {
362
406
  const tab = tabOfPane(paneId);
363
- const show = Boolean(tab) && wantsContextBar(tab as Tab);
364
- if (!show) {
407
+ if (tab === null) {
365
408
  disposePane(paneId);
366
409
  applyPaneContextOffset(0, host);
367
410
  return;
368
411
  }
369
- const view = viewFor(tab as Tab, paneId, _ctx);
412
+ const view = viewFor(tab, paneId, _ctx);
370
413
  let surface = _surfaces.get(paneId);
371
414
  if (!surface || !surface.connected()) {
372
415
  disposePane(paneId);
@@ -380,13 +423,15 @@ function renderPane(paneId: string, host: HTMLElement) {
380
423
  void surface.ready.then(() => {
381
424
  const live = _surfaces.get(paneId);
382
425
  if (live) {
383
- applyPaneContextOffset(topBandHeight(live), host);
426
+ watchBand(paneId, host, live);
384
427
  }
385
428
  });
386
429
  return;
387
430
  }
388
431
  surface.update(view);
389
- applyPaneContextOffset(topBandHeight(surface), host);
432
+ /* No read here: the band's observer writes the offset once the frame has laid the band out
433
+ ({@link watchBand}). Only a band element the update REPLACED is re-measured now. */
434
+ watchBand(paneId, host, surface);
390
435
  } catch (error) {
391
436
  console.error("pane-context render error:", error);
392
437
  }
@@ -458,12 +503,11 @@ function openPresetMenu(paneId: string, anchor: HTMLElement): void {
458
503
  * `check-lens-mutants.ts` said so, by surviving.
459
504
  */
460
505
  function menuRow(row: PresetRow): MenuRowProjection {
461
- return {
506
+ const projection: MenuRowProjection = {
462
507
  destructive: false,
463
508
  disabled: row.disabled !== null,
464
509
  dividerAbove: false,
465
510
  id: rowId(row),
466
- ...(row.disabled === null ? {} : { requires: row.disabled }),
467
511
  run: () => {
468
512
  /* THE PANE THE MENU IS ABOUT, before the verb that resolves the focus runs.
469
513
  See {@link PresetRow.pane}: all three of these commands take the focused pane as their
@@ -476,6 +520,10 @@ function menuRow(row: PresetRow): MenuRowProjection {
476
520
  },
477
521
  title: row.label,
478
522
  };
523
+ if (row.disabled !== null) {
524
+ projection.requires = row.disabled;
525
+ }
526
+ return projection;
479
527
  }
480
528
 
481
529
  /**
@@ -487,7 +535,7 @@ function rowId(row: PresetRow): string {
487
535
  const parts = [row.command];
488
536
  for (const key of ["preset", "media", "locale"] as const) {
489
537
  const value = row.args[key];
490
- if (typeof value === "string") {
538
+ if (isString(value)) {
491
539
  parts.push(value);
492
540
  }
493
541
  }
@@ -498,7 +546,7 @@ function rowId(row: PresetRow): string {
498
546
  export interface PresetRow {
499
547
  label: string;
500
548
  command: string;
501
- args: Record<string, unknown>;
549
+ args: CommandArgValues;
502
550
  /**
503
551
  * The pane this row is ABOUT — the one whose ⟲ opened the menu.
504
552
  *
@@ -658,10 +706,27 @@ function viewFor(tab: Tab, paneId: string, ctx: PaneContextCtx): PaneContextView
658
706
  view.summary = lensSummary(paneId);
659
707
  return view;
660
708
  }
709
+ /* The way out of a view in a workspace with no tab strip: named for where it leads. Never in a
710
+ lens, whose tab is the source pane's, and whose own exit is the derivation's. */
711
+ const back = backTargetOf(tab);
712
+ if (back) {
713
+ view.backState = "shown";
714
+ view.backLabel = back.label;
715
+ view.backHint = back.hint;
716
+ }
661
717
  Object.assign(view, editorAxis(tab));
662
718
  if (editorKindOf(tab) === "canvas") {
663
719
  Object.assign(view, viewAxis(tab));
664
720
  }
721
+ /* A workspace home (the Content, Media or Publish home) draws its workspace's own surface over a
722
+ stub document, so there is no rendering context to choose: "Context: Base" over the Publish
723
+ workspace was a control that could change nothing on screen. The ⟲ menu goes for the same
724
+ reason: every projection it offers is of the document, and a home has none to project. */
725
+ if (editorKindOf(tab) === "home") {
726
+ view.contextState = "hidden";
727
+ view.presetState = "hidden";
728
+ return view;
729
+ }
665
730
  Object.assign(view, contextAxis(tab, paneId, ctx));
666
731
  /* THIS tab's effective mode. `ctx.getCanvasMode()` answered for the focused pane, so a document
667
732
  opened as Code in either pane put an Export button in the OTHER pane's bar as well — over a
@@ -805,10 +870,8 @@ interface PaneLocale {
805
870
  * A single declared locale is the same as none for this control — there is nothing to switch TO,
806
871
  * and "groups a document declares nothing for are absent" is the rule the whole popover follows.
807
872
  *
808
- * The fallback chain is what makes the control honest about a file it has not been told about:
809
- * `previewLocale` is the author's explicit choice, the path is the file's own language
810
- * (`site-architecture.md` §13.3 puts a translation in its own directory), and the default locale is
811
- * what an unprefixed page renders as.
873
+ * The language itself is `getEffectiveRenderLocale`'s answer (`site-context.ts`), the rule every
874
+ * artboard draws by: the choice, else the file's own language, else the default locale.
812
875
  */
813
876
  function localeOf(tab: Tab | null): PaneLocale | null {
814
877
  const i18n = getEffectiveLocales();
@@ -816,20 +879,22 @@ function localeOf(tab: Tab | null): PaneLocale | null {
816
879
  return null;
817
880
  }
818
881
  const pathLocale = localeOfPath(tab.documentPath ?? "", i18n);
819
- const own = pathLocale ?? i18n.defaultLocale;
820
- const effective = tab.session.ui.previewLocale ?? own;
882
+ /* The artboard's own rule, so the segment and the canvas cannot name two languages; a stored
883
+ choice the project no longer declares is not reported, because it is not drawn. */
884
+ const own = getEffectiveRenderLocale(null, tab.documentPath) ?? i18n.defaultLocale;
885
+ const effective = getEffectiveRenderLocale(tab.session.ui.previewLocale, tab.documentPath) ?? own;
821
886
  return { effective, i18n, overridden: effective !== own, pathLocale };
822
887
  }
823
888
 
824
889
  function contextAxis(tab: Tab, paneId: string, ctx: PaneContextCtx): Partial<PaneContextView> {
825
890
  const { ui } = tab.session;
826
891
  const { featureQueries, sizeBreakpoints } = ctx.parseMediaEntries(
827
- getEffectiveMedia(tab.doc.document?.$media as Record<string, string> | undefined),
892
+ getEffectiveMedia(tab.doc.document.$media),
828
893
  );
829
894
  const schemeQueries = featureQueries.filter(({ query }) => isSchemeQuery(query));
830
895
  const plainQueries = featureQueries.filter(({ query }) => !isSchemeQuery(query));
831
- const scheme = (ui.previewColorScheme ?? "auto") as string;
832
- const activeMedia = (ui.activeMedia ?? null) as string | null;
896
+ const scheme = ui.previewColorScheme;
897
+ const { activeMedia } = ui;
833
898
  const sizeLabel = activeMedia ? mediaDisplayName(activeMedia) : "Base";
834
899
  const schemeLabel = SCHEMES.find(([value]) => value === scheme)?.[1] ?? "Auto";
835
900
  const locale = localeOf(tab);
@@ -843,7 +908,12 @@ function contextAxis(tab: Tab, paneId: string, ctx: PaneContextCtx): Partial<Pan
843
908
  ]
844
909
  .filter((part) => part !== null)
845
910
  .join(" · ");
846
- const hasLayout = isPageDoc(tab) && Boolean(getEffectiveLayoutPath(tab.doc.document?.$layout));
911
+ /* An entry written on the canvas is wrapped in its template's layout like a page (§22.5), so it
912
+ offers the same "show layout" choice. Whether a layout resolves for it is read asynchronously
913
+ by the canvas; the project default is the answer this bar can give synchronously. */
914
+ const hasLayout =
915
+ (isPageDoc(tab) && Boolean(getEffectiveLayoutPath(tab.doc.document.$layout))) ||
916
+ (Boolean(projectState?.isSiteProject) && writesEntryOnCanvas(tab.documentPath));
847
917
  const page = isPageDoc(tab);
848
918
  const params = page ? paramRows(tab) : [];
849
919
  const props = page ? [] : propRows(tab, paneId);
@@ -851,7 +921,7 @@ function contextAxis(tab: Tab, paneId: string, ctx: PaneContextCtx): Partial<Pan
851
921
  way the Context trigger says `Base · Auto` — a chevron with no reading is a control you have to
852
922
  open in order to learn whether it was worth opening. */
853
923
  const resolvingSet = page
854
- ? Object.values(ui.previewParams ?? {}).filter((v) => v !== "" && v !== undefined).length
924
+ ? Object.values(ui.previewParams).filter((v) => v !== "").length
855
925
  : Object.keys(ui.previewProps ?? {}).length;
856
926
  const hasResolving = page ? params.length > 0 : props.length > 0;
857
927
 
@@ -922,8 +992,9 @@ function sizeRows(
922
992
  * cannot and must not claim to translate the page. What it does change is real: the artboard's
923
993
  * `lang` and its `dir`, and an RTL locale mirrors the layout on the stage. A control that let an
924
994
  * author believe it had translated anything would be worse than no control — which is also why the
925
- * sentence stops there: the build's `$page.locale` is not injected into the canvas render today, so
926
- * a tooltip promising it would be describing the site rather than the pane.
995
+ * sentence stops there: the page's `$page.locale` comes from its route on the canvas as in the
996
+ * build (studio.md §4.1), so this control does not change it, and a tooltip promising otherwise
997
+ * would describe something the pane does not do.
927
998
  *
928
999
  * Labelled with each locale's AUTONYM, for the reason `localeLabel` gives: a reader looking for
929
1000
  * their own language scans for their own word for it.
@@ -965,7 +1036,7 @@ const FIT_CHOICES: readonly { value: string; fit: FitMode; label: string }[] = [
965
1036
 
966
1037
  /** Which entry the pod shows as chosen — a numeric fit reads as "actual size" only at 1. */
967
1038
  function fitChoiceValue(fit: FitMode): string {
968
- if (typeof fit === "number") {
1039
+ if (isNumber(fit)) {
969
1040
  return fit === 1 ? "actual" : "";
970
1041
  }
971
1042
  return fit;
@@ -1006,7 +1077,7 @@ function podFor(tab: Tab, paneId: string): Partial<PaneContextView> {
1006
1077
  computed from the side pane's own zoom, and its "100%" button reset the primary. */
1007
1078
  const surface = surfaceForPane(paneId);
1008
1079
  if (mode === "edit") {
1009
- const editZoom = tab.session.ui.editZoom ?? 1;
1080
+ const { editZoom } = tab.session.ui;
1010
1081
  return { podState: "shown", zoomLabel: `${Math.round(editZoom * 100)}%` };
1011
1082
  }
1012
1083
  if (!STAGE_ZOOM_MODES.has(mode)) {
@@ -1041,7 +1112,7 @@ function podFor(tab: Tab, paneId: string): Partial<PaneContextView> {
1041
1112
  * `__jxAutomation` had no name for it. Going through the registry makes the control and the verb
1042
1113
  * one thing (one definition site per action, §13) and gets the breakpoint refusal for free.
1043
1114
  */
1044
- function runContextCommand(paneId: string, id: string, args: Record<string, unknown>): void {
1115
+ function runContextCommand(paneId: string, id: string, args: CommandArgValues): void {
1045
1116
  // THIS pane, named. The bar is drawn once per pane and the side bar's controls write the side
1046
1117
  // Pane's tab; a verb defaulting to the focused pane would have made the side bar edit the
1047
1118
  // Foreground document the moment its control became a command.
@@ -1063,7 +1134,8 @@ function actionsFor(paneId: string, ctx: PaneContextCtx): PaneContextActions {
1063
1134
  if (!tab) {
1064
1135
  return;
1065
1136
  }
1066
- const mode = modeForEditorKind(tab, kind as EditorKind);
1137
+ const editorKind = editorKindsOf(tab).find((candidate) => candidate === kind);
1138
+ const mode = editorKind && modeForEditorKind(tab, editorKind);
1067
1139
  if (!mode) {
1068
1140
  return;
1069
1141
  }
@@ -1086,11 +1158,28 @@ function actionsFor(paneId: string, ctx: PaneContextCtx): PaneContextActions {
1086
1158
  },
1087
1159
  chooseView: (value) => {
1088
1160
  const tab = tabNow();
1089
- if (tab) {
1090
- setCanvasView(tab, value as CanvasView, ctx.setCanvasMode);
1161
+ const view = CANVAS_VIEWS.find((candidate) => candidate === value);
1162
+ if (tab && view) {
1163
+ setCanvasView(tab, view, ctx.setCanvasMode);
1091
1164
  }
1092
1165
  },
1093
1166
  exportFile: ctx.exportFile,
1167
+ /* The flow directly rather than `pane.backToHome`: the command's `when` keeps Escape away from
1168
+ a text field and the code editor, and the CONTROL must work in both (Back from Code is the
1169
+ Styles case). The pane is focused first, because the view going back is this pane's. */
1170
+ goBack: () => {
1171
+ focusPane(paneId);
1172
+ const { closeTab } = ctx;
1173
+ if (!closeTab) {
1174
+ runContextCommand(paneId, "pane.backToHome", {});
1175
+ return;
1176
+ }
1177
+ void goBack(paneId, {
1178
+ closeTab,
1179
+ setCanvasMode: ctx.setCanvasMode,
1180
+ ...(ctx.focusHome && { focusHome: ctx.focusHome }),
1181
+ });
1182
+ },
1094
1183
  manageContexts: () => {
1095
1184
  void activeRegistry()?.run("settings.open", { section: "contexts" });
1096
1185
  },
@@ -1285,7 +1374,7 @@ function paramValuesFor(tab: Tab): ParamValues | null {
1285
1374
  * @param {ParamValues} values
1286
1375
  */
1287
1376
  function autoSelectParams(tab: Tab, values: ParamValues) {
1288
- const current = tab.session.ui.previewParams ?? {};
1377
+ const current = tab.session.ui.previewParams;
1289
1378
  const additions: Record<string, string> = {};
1290
1379
  for (const [name, list] of Object.entries(values)) {
1291
1380
  if (!current[name] && list.length > 0) {
@@ -1314,7 +1403,7 @@ function paramRows(tab: Tab): PaneContextView["params"] {
1314
1403
  label: `Preview value for [${name}]`,
1315
1404
  name,
1316
1405
  options: (values?.[name] ?? []).map((value: string) => ({ label: value, value })),
1317
- value: previewParams?.[name] ?? "",
1406
+ value: previewParams[name] ?? "",
1318
1407
  }));
1319
1408
  }
1320
1409
 
@@ -1330,6 +1419,8 @@ function paramRows(tab: Tab): PaneContextView["params"] {
1330
1419
  */
1331
1420
  function parsePropValue(raw: string): JsonValue {
1332
1421
  try {
1422
+ // SAFETY: JSON.parse only ever yields null, a boolean, a number, a string, an array or a plain
1423
+ // Object of those, which is exactly the JsonValue union.
1333
1424
  return JSON.parse(raw) as JsonValue;
1334
1425
  } catch {
1335
1426
  return raw;
@@ -1347,7 +1438,7 @@ function propRows(tab: Tab, paneId: string): PaneContextView["props"] {
1347
1438
  }
1348
1439
  const { previewProps } = tab.session.ui;
1349
1440
  const display = (v: JsonValue | undefined) =>
1350
- v === undefined ? "" : typeof v === "string" ? v : JSON.stringify(v);
1441
+ v === undefined ? "" : isString(v) ? v : JSON.stringify(v);
1351
1442
  return componentPropEntries(doc).map(({ name }) => ({
1352
1443
  key: name,
1353
1444
  label: `Test value for ${name}`,
@@ -62,6 +62,7 @@ import {
62
62
  dropTargetForElements,
63
63
  monitorForElements,
64
64
  } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
65
+ import { isString } from "@jxsuite/schema/guards";
65
66
  import { isTabDropSource } from "./tab-drop";
66
67
  import { rectOf } from "../utils/geometry";
67
68
  import {
@@ -100,8 +101,22 @@ export interface PaneCell {
100
101
  surface: CanvasSurface;
101
102
  }
102
103
 
103
- /** A cell's record, plus the disposers its stage gestures and its drop zone live behind. */
104
- interface CellState extends PaneCell {
104
+ /**
105
+ * A cell's record while the runtime fills it in, plus the disposers its stage gestures and its drop
106
+ * zone live behind.
107
+ *
108
+ * Every element field starts null and is written once, when the runtime creates that box (see
109
+ * {@link cellPart}). The runtime creates a row's nodes depth-first inside one synchronous render
110
+ * pass, so by the time anything outside that pass asks, {@link isDrawnCell} holds.
111
+ */
112
+ interface CellState {
113
+ paneId: string;
114
+ root: HTMLElement | null;
115
+ strip: HTMLElement | null;
116
+ chrome: HTMLElement | null;
117
+ stage: HTMLElement | null;
118
+ dropZone: HTMLElement | null;
119
+ surface: CanvasSurface | null;
105
120
  /** Stage-gesture disposer, live between the stage's creation and the cell's disposal. */
106
121
  releaseGestures: (() => void) | null;
107
122
  /** The drop zone's pragmatic registration, live between its creation and the cell's disposal. */
@@ -128,9 +143,22 @@ let _scope: EffectScope | null = null;
128
143
  */
129
144
  let _dragMonitor: (() => void) | null = null;
130
145
 
146
+ /** Whether every box of a cell has been created, which is what makes it a {@link PaneCell}. */
147
+ function isDrawnCell(cell: CellState): cell is CellState & PaneCell {
148
+ return (
149
+ cell.root !== null &&
150
+ cell.strip !== null &&
151
+ cell.chrome !== null &&
152
+ cell.stage !== null &&
153
+ cell.dropZone !== null &&
154
+ cell.surface !== null
155
+ );
156
+ }
157
+
131
158
  /** The cell a pane is drawn in, or null. Test-visible, and the bootstrap's handle on the primary. */
132
159
  export function cellForPane(paneId: string): PaneCell | null {
133
- return _cells.get(paneId) ?? null;
160
+ const cell = _cells.get(paneId);
161
+ return cell !== undefined && isDrawnCell(cell) ? cell : null;
134
162
  }
135
163
 
136
164
  /**
@@ -149,9 +177,9 @@ export function paneGridReady(): Promise<void> {
149
177
  * The record for a pane, created when its cell's outermost box is, and reused for the life of the
150
178
  * cell.
151
179
  *
152
- * Every element field is typed non-null and starts null, the same bargain `CanvasSurface` makes:
153
- * the runtime creates a row's nodes depth-first inside one synchronous render pass, so the record
154
- * is complete before anything outside that pass can hold it.
180
+ * Every element field starts null: the runtime creates a row's nodes depth-first inside one
181
+ * synchronous render pass, so the record is complete before anything outside that pass can hold it
182
+ * through {@link cellForPane}.
155
183
  */
156
184
  function cellState(paneId: string): CellState {
157
185
  const existing = _cells.get(paneId);
@@ -159,15 +187,15 @@ function cellState(paneId: string): CellState {
159
187
  return existing;
160
188
  }
161
189
  const cell: CellState = {
162
- chrome: null as unknown as HTMLElement,
163
- dropZone: null as unknown as HTMLElement,
190
+ chrome: null,
191
+ dropZone: null,
164
192
  paneId,
165
193
  releaseDropZone: null,
166
194
  releaseGestures: null,
167
- root: null as unknown as HTMLElement,
168
- stage: null as unknown as HTMLElement,
169
- strip: null as unknown as HTMLElement,
170
- surface: null as unknown as CanvasSurface,
195
+ root: null,
196
+ stage: null,
197
+ strip: null,
198
+ surface: null,
171
199
  };
172
200
  _cells.set(paneId, cell);
173
201
  return cell;
@@ -229,12 +257,16 @@ function watchPaneFocus(paneId: string, root: HTMLElement): void {
229
257
  */
230
258
  function attachStage(cell: CellState, stage: HTMLElement): void {
231
259
  cell.stage = stage;
232
- cell.surface = createPaneSurface(cell.paneId);
260
+ const surface = createPaneSurface(cell.paneId);
261
+ cell.surface = surface;
233
262
  registerCanvasSurface(cell.paneId, stage);
234
- cell.releaseGestures = installStageGestures(cell.surface);
263
+ cell.releaseGestures = installStageGestures(surface);
235
264
  scheduleCanvasRender(cell.paneId);
236
265
  }
237
266
 
267
+ /** What a cell's drop zone reports to a drag: refused, or the pane a drop would split beside. */
268
+ type PaneEdgeData = { type: "pane-edge-refused" } | { paneId: string; type: "pane-edge" };
269
+
238
270
  /**
239
271
  * The RIGHT BAND of `paneId`'s cell, and only while it is legal to drop there: the grid is still
240
272
  * under {@link MAX_PANES}, and `paneId` names the LAST pane — the one a second pane would sit
@@ -245,11 +277,7 @@ function attachStage(cell: CellState, stage: HTMLElement): void {
245
277
  * that the rest of the stage keeps ordinary canvas gestures — a drag never reaches this at all
246
278
  * unless `canDrop` already accepted it, so the band only ever competes with itself.
247
279
  */
248
- function edgeData(
249
- paneId: string,
250
- input: { clientX: number },
251
- element: HTMLElement,
252
- ): Record<string, unknown> {
280
+ function edgeData(paneId: string, input: { clientX: number }, element: HTMLElement): PaneEdgeData {
253
281
  if (workspace.panes.length >= MAX_PANES || workspace.panes.at(-1)?.id !== paneId) {
254
282
  return { type: "pane-edge-refused" };
255
283
  }
@@ -284,12 +312,12 @@ function attachDropZone(paneId: string, element: HTMLElement): () => void {
284
312
  * One of a cell's five boxes has been created. Fill the record in, and wire what belongs to it.
285
313
  *
286
314
  * The context bar is HANDED its host rather than resolving a region, the same way
287
- * `panels/frontmatter-panel.ts` is handed the stage. It cannot resolve one the way the tab strip
288
- * does: the strip's host carries `pane.<id>/tabs` and nothing inside it re-stamps that id, while
289
- * the context bar stamps `pane.<id>/context` on markup it renders INSIDE its box — so a region on
290
- * the wrapper as well would put the same id on two nested elements, and `resolveRegion` takes the
291
- * LAST match. Sixty shots crop `pane.primary/context`; a second, larger element carrying it is a
292
- * silently widened crop.
315
+ * `content/writing-banner.ts` is handed its host on the stage. It cannot resolve one the way the
316
+ * tab strip does: the strip's host carries `pane.<id>/tabs` and nothing inside it re-stamps that
317
+ * id, while the context bar stamps `pane.<id>/context` on markup it renders INSIDE its box — so a
318
+ * region on the wrapper as well would put the same id on two nested elements, and `resolveRegion`
319
+ * takes the LAST match. Sixty shots crop `pane.primary/context`; a second, larger element carrying
320
+ * it is a silently widened crop.
293
321
  */
294
322
  function cellPart(paneId: string, part: PaneCellPart, element: HTMLElement): void {
295
323
  const cell = cellState(paneId);
@@ -467,7 +495,8 @@ export function mount(): void {
467
495
  },
468
496
  onDrag({ location }) {
469
497
  const [target] = location.current.dropTargets;
470
- const edgePane = target?.data.type === "pane-edge" ? (target.data.paneId as string) : "";
498
+ const paneId = target?.data.paneId;
499
+ const edgePane = target?.data.type === "pane-edge" && isString(paneId) ? paneId : "";
471
500
  _surface?.drag({ armed: true, edgePane });
472
501
  },
473
502
  onDragStart() {