@jxsuite/studio 6.1.0 → 6.1.2

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 (645) hide show
  1. package/dist/chunks/2020-f2gkpy8d.js +4 -0
  2. package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
  3. package/dist/chunks/adapter-4912g339.js +4 -0
  4. package/dist/chunks/cf-account-picker-wccaenh6.js +4 -0
  5. package/dist/chunks/cf-settings-br6105tr.js +4 -0
  6. package/dist/chunks/color-28ksk2qm.js +4 -0
  7. package/dist/chunks/color-area-0fj8a4ga.js +4 -0
  8. package/dist/chunks/color-field-xch8kx2g.js +4 -0
  9. package/dist/chunks/color-slider-jxd8v350.js +4 -0
  10. package/dist/chunks/combobox-p0efwjke.js +4 -0
  11. package/dist/chunks/components-db68vsn7.js +4 -0
  12. package/dist/chunks/content-source-1449qesq.js +4 -0
  13. package/dist/chunks/convert-to-repeater-5h457egj.js +4 -0
  14. package/dist/chunks/dialog-c4x05vyx.js +4 -0
  15. package/dist/chunks/editor-x9jn86a7.js +4 -0
  16. package/dist/chunks/entry-commands-may24cpt.js +4 -0
  17. package/dist/chunks/extension-sections-pvr14vxr.js +4 -0
  18. package/dist/chunks/file-ops-x9v54pcj.js +4 -0
  19. package/dist/chunks/files-j3knqf0s.js +4 -0
  20. package/dist/chunks/format-host-tyre2trb.js +4 -0
  21. package/dist/chunks/fs-events-64ma9htc.js +4 -0
  22. package/dist/chunks/git-panel-84ps5dex.js +4 -0
  23. package/dist/chunks/grid-view-d2wq9ezg.js +51 -0
  24. package/dist/chunks/icons-pnfz478q.js +4 -0
  25. package/dist/chunks/iframe-entry-fvbk89gm.js +5 -0
  26. package/dist/chunks/iframe-entry-jdcktez8.js +5 -0
  27. package/dist/chunks/iframe-entry-x0ygf2yr.js +5 -0
  28. package/dist/chunks/iframe-entry-zap785cw.js +5 -0
  29. package/dist/chunks/iframe-host-ck6vejt5.js +4 -0
  30. package/dist/chunks/index-b8xw3vy9.js +4 -0
  31. package/dist/chunks/{index-gybvv7a6.js → index-zpjmzqfk.js} +3 -3
  32. package/dist/chunks/{javascript-rnvdp3k4.js → javascript-m54mnwp6.js} +3 -3
  33. package/dist/chunks/jsonMode-w15cmrcm.js +13 -0
  34. package/dist/chunks/jx-validate-at3zn8wa.js +4 -0
  35. package/dist/chunks/layers-h4xp1pss.js +4 -0
  36. package/dist/chunks/layers-panel-m5hw1d7g.js +4 -0
  37. package/dist/chunks/listbox-e74qjyq6.js +4 -0
  38. package/dist/chunks/lit-html-8t8t3dnr.js +4 -0
  39. package/dist/chunks/media-picker-2cweexc5.js +4 -0
  40. package/dist/chunks/menu-n6yzswmy.js +4 -0
  41. package/dist/chunks/menu-ynw13y0s.js +4 -0
  42. package/dist/chunks/monaco-binding-7gx83x3r.js +4 -0
  43. package/dist/chunks/monaco-buffer-qzxn567r.js +4 -0
  44. package/dist/chunks/monaco-setup-gxf6656g.js +4 -0
  45. package/dist/chunks/notify-cj5zbrs2.js +4 -0
  46. package/dist/chunks/number-field-y62xq0ty.js +4 -0
  47. package/dist/chunks/parse-b7ddhr8m.js +4 -0
  48. package/dist/chunks/platform-3dfws9js.js +4 -0
  49. package/dist/chunks/popover-jt2gxmzs.js +4 -0
  50. package/dist/chunks/publish-panel-1gvxbj21.js +4 -0
  51. package/dist/chunks/quick-search-0dajrwqg.js +4 -0
  52. package/dist/chunks/references-49qgt404.js +4 -0
  53. package/dist/chunks/right-panel-jm1bwe53.js +4 -0
  54. package/dist/chunks/section-registry-6kwc4fky.js +4 -0
  55. package/dist/chunks/select-rzds841e.js +4 -0
  56. package/dist/chunks/split-n2gfpm5m.js +4 -0
  57. package/dist/chunks/{studio-5g0ag7c0.js → studio-0q988f9w.js} +3 -3
  58. package/dist/chunks/studio-0rt52vpq.js +5 -0
  59. package/dist/chunks/studio-18vgbhs5.js +5 -0
  60. package/dist/chunks/{studio-pxg4ap1e.js → studio-1fxkaaea.js} +4 -4
  61. package/dist/chunks/studio-24mccdrj.js +5 -0
  62. package/dist/chunks/studio-2eh507zk.js +9 -0
  63. package/dist/chunks/studio-2hcbccfv.js +5 -0
  64. package/dist/chunks/studio-2j1cb95x.js +5 -0
  65. package/dist/chunks/studio-2jbs3rxv.js +5 -0
  66. package/dist/chunks/{studio-qbj760tx.js → studio-485046te.js} +7 -7
  67. package/dist/chunks/studio-4h8k4dw9.js +5 -0
  68. package/dist/chunks/studio-5f6n18kx.js +5 -0
  69. package/dist/chunks/studio-5gthpky6.js +5 -0
  70. package/dist/chunks/studio-5ve6bbep.js +5 -0
  71. package/dist/chunks/studio-6ep3js6b.js +9 -0
  72. package/dist/chunks/studio-6wkmf3wz.js +9 -0
  73. package/dist/chunks/studio-841rf3cg.js +5 -0
  74. package/dist/chunks/studio-8gmwgheg.js +5 -0
  75. package/dist/chunks/studio-8qm0ep50.js +5 -0
  76. package/dist/chunks/{studio-anyrgzvb.js → studio-90pq9km1.js} +4 -4
  77. package/dist/chunks/studio-924p1tm1.js +6 -0
  78. package/dist/chunks/{studio-v2bvmbjj.js → studio-a3g98wjr.js} +4 -4
  79. package/dist/chunks/studio-a3shpz9y.js +5 -0
  80. package/dist/chunks/studio-amsbaaar.js +6 -0
  81. package/dist/chunks/studio-at5spjbc.js +7 -0
  82. package/dist/chunks/studio-b2xv945e.js +5 -0
  83. package/dist/chunks/studio-bn5nkafw.js +5 -0
  84. package/dist/chunks/studio-bw6q5xjf.js +9 -0
  85. package/dist/chunks/studio-c7q0t9x1.js +5 -0
  86. package/dist/chunks/studio-camnhc96.js +6 -0
  87. package/dist/chunks/studio-cffqvnzd.js +5 -0
  88. package/dist/chunks/studio-d81xfh1g.js +5 -0
  89. package/dist/chunks/studio-dgz8d0c1.js +5 -0
  90. package/dist/chunks/studio-efvfrsf8.js +5 -0
  91. package/dist/chunks/studio-er30bpcx.js +5 -0
  92. package/dist/chunks/studio-ezscgr64.js +5 -0
  93. package/dist/chunks/studio-ffrrncvz.js +5 -0
  94. package/dist/chunks/studio-fpphgn8y.js +10 -0
  95. package/dist/chunks/studio-j1kvhdjk.js +4 -0
  96. package/dist/chunks/{studio-txjjzrsm.js → studio-j430n16g.js} +5 -5
  97. package/dist/chunks/studio-jjkg84nj.js +5 -0
  98. package/dist/chunks/studio-m0q32ars.js +4 -0
  99. package/dist/chunks/studio-m6bdst11.js +5 -0
  100. package/dist/chunks/studio-nv2cptd4.js +64 -0
  101. package/dist/chunks/studio-nwfrc98n.js +5 -0
  102. package/dist/chunks/studio-p1wgvp7r.js +5 -0
  103. package/dist/chunks/studio-pag2wncm.js +5 -0
  104. package/dist/chunks/studio-qvanvzfd.js +5 -0
  105. package/dist/chunks/studio-qwa64kt7.js +5 -0
  106. package/dist/chunks/studio-rk1zc4x3.js +928 -0
  107. package/dist/chunks/studio-se2r3ptc.js +5 -0
  108. package/dist/chunks/studio-sg2a0dh0.js +5 -0
  109. package/dist/chunks/studio-tjzjhe68.js +5 -0
  110. package/dist/chunks/{studio-0x3jyb8r.js → studio-tq0rtfwj.js} +4 -4
  111. package/dist/chunks/{studio-cpxkgjrj.js → studio-v0jzqdjm.js} +4 -4
  112. package/dist/chunks/studio-v2w7q8r1.js +7 -0
  113. package/dist/chunks/studio-v5vjq1h0.js +4 -0
  114. package/dist/chunks/studio-v8aga3vp.js +14 -0
  115. package/dist/chunks/studio-vfcdrfmv.js +5 -0
  116. package/dist/chunks/studio-vmfkgdjf.js +5 -0
  117. package/dist/chunks/studio-wt1816jj.js +5 -0
  118. package/dist/chunks/studio-wz73q5kq.js +4 -0
  119. package/dist/chunks/studio-y04qtxvp.js +7 -0
  120. package/dist/chunks/studio-y21g8zzg.js +5 -0
  121. package/dist/chunks/studio-y64hrt8p.js +12 -0
  122. package/dist/chunks/studio-ynn90f58.js +16 -0
  123. package/dist/chunks/studio-yxz682sx.js +5 -0
  124. package/dist/chunks/studio-zp7snvkq.js +5 -0
  125. package/dist/chunks/studio-zq4z6tm6.js +5 -0
  126. package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
  127. package/dist/chunks/tabs-f5cw3tgp.js +4 -0
  128. package/dist/chunks/textfield-wewc8rq2.js +4 -0
  129. package/dist/chunks/toast-c9fn075p.js +4 -0
  130. package/dist/chunks/toast-host-ke5z4ng7.js +4 -0
  131. package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
  132. package/dist/chunks/tooltip-5v8ngwj2.js +4 -0
  133. package/dist/chunks/tree-mdq3v5cw.js +4 -0
  134. package/dist/chunks/tsMode-sf49ee9x.js +14 -0
  135. package/dist/chunks/workspace-jtfahpee.js +4 -0
  136. package/dist/chunks/ws-client-nze0k6mv.js +4 -0
  137. package/dist/iframe-entry.js +16 -16
  138. package/dist/manifest.json +63 -63
  139. package/dist/studio.js +98 -98
  140. package/dist/workers/ts.worker.js +3 -3
  141. package/package.json +11 -11
  142. package/src/about/about-modal.ts +4 -3
  143. package/src/account/action-flow.ts +45 -38
  144. package/src/account-status.ts +7 -2
  145. package/src/browse/library-layouts.ts +8 -5
  146. package/src/browse/library-model.ts +18 -6
  147. package/src/browse/library-pane.ts +37 -21
  148. package/src/browse/library-preview.ts +14 -9
  149. package/src/browse/library-source.ts +1 -1
  150. package/src/canvas/asset-refs.ts +24 -9
  151. package/src/canvas/asset-resolve.ts +19 -23
  152. package/src/canvas/canvas-helpers.ts +7 -6
  153. package/src/canvas/canvas-live-render.ts +44 -53
  154. package/src/canvas/canvas-patcher.ts +30 -30
  155. package/src/canvas/canvas-perf.ts +11 -5
  156. package/src/canvas/canvas-render.ts +66 -42
  157. package/src/canvas/canvas-surface.ts +5 -3
  158. package/src/canvas/canvas-utils.ts +163 -64
  159. package/src/canvas/dialog-path.ts +9 -4
  160. package/src/canvas/dialog-state.ts +1 -2
  161. package/src/canvas/diff-marks.ts +9 -16
  162. package/src/canvas/diff-toolbar.ts +8 -7
  163. package/src/canvas/edit-width-drag.ts +4 -1
  164. package/src/canvas/edit-width.ts +1 -3
  165. package/src/canvas/iframe-channel.ts +27 -13
  166. package/src/canvas/iframe-drop.ts +13 -12
  167. package/src/canvas/iframe-editable-root.ts +29 -16
  168. package/src/canvas/iframe-entry.ts +80 -63
  169. package/src/canvas/iframe-eval.ts +73 -49
  170. package/src/canvas/iframe-host.ts +203 -118
  171. package/src/canvas/iframe-inline-edit.ts +69 -32
  172. package/src/canvas/iframe-insert.ts +5 -4
  173. package/src/canvas/iframe-interaction.ts +37 -26
  174. package/src/canvas/iframe-overlay.ts +1 -1
  175. package/src/canvas/iframe-patch.ts +18 -15
  176. package/src/canvas/iframe-position.ts +12 -6
  177. package/src/canvas/iframe-protocol.ts +15 -16
  178. package/src/canvas/iframe-render.ts +41 -36
  179. package/src/canvas/iframe-slash.ts +24 -11
  180. package/src/canvas/iframe-subtree.ts +6 -2
  181. package/src/canvas/path-mapping.ts +19 -12
  182. package/src/canvas/popover-path.ts +7 -3
  183. package/src/canvas/popover-state.ts +1 -2
  184. package/src/canvas/serialize-scope.ts +13 -5
  185. package/src/canvas/stage-scrollbar.ts +2 -1
  186. package/src/canvas/surface-registry.ts +21 -3
  187. package/src/collab/collab-commands.ts +7 -2
  188. package/src/collab/collab-session.ts +84 -45
  189. package/src/collab/collab-state.ts +4 -3
  190. package/src/collab/monaco-binding.ts +16 -13
  191. package/src/collab/monaco-cursors.ts +5 -2
  192. package/src/commands/budget.ts +3 -3
  193. package/src/commands/command-args.ts +103 -71
  194. package/src/commands/context.ts +22 -20
  195. package/src/commands/defaults.ts +4 -1
  196. package/src/commands/keymap.ts +47 -43
  197. package/src/commands/levels.ts +3 -3
  198. package/src/commands/live-context.ts +10 -8
  199. package/src/commands/reference.ts +2 -1
  200. package/src/commands/registry.ts +12 -10
  201. package/src/commands/run-reported.ts +15 -10
  202. package/src/component-props.ts +46 -30
  203. package/src/content/collection-match.ts +5 -4
  204. package/src/content/draft-state.ts +4 -3
  205. package/src/content/entry-commands.ts +3 -2
  206. package/src/content/entry-editor.ts +29 -17
  207. package/src/content/entry-fields.ts +12 -7
  208. package/src/content/entry-model.ts +21 -12
  209. package/src/editor/canvas-context-menu.ts +1 -2
  210. package/src/editor/canvas-slash-bridge.ts +3 -6
  211. package/src/editor/content-slice.ts +16 -14
  212. package/src/editor/context-menu.ts +35 -22
  213. package/src/editor/convert-targets.ts +30 -35
  214. package/src/editor/convert-to-component.ts +11 -5
  215. package/src/editor/convert-to-repeater.ts +34 -22
  216. package/src/editor/editable-tags.ts +17 -2
  217. package/src/editor/file-drop-action.ts +21 -22
  218. package/src/editor/inline-edit-apply.ts +35 -17
  219. package/src/editor/inline-edit.ts +66 -50
  220. package/src/editor/inline-format.ts +59 -56
  221. package/src/editor/inline-link.ts +40 -15
  222. package/src/editor/insert-zone-action.ts +1 -1
  223. package/src/editor/merge-tags.ts +58 -19
  224. package/src/editor/repeater-scope.ts +39 -28
  225. package/src/editor/shortcuts.ts +87 -47
  226. package/src/editor/slash-menu.ts +1 -6
  227. package/src/files/asset-versions.ts +4 -4
  228. package/src/files/components.ts +15 -10
  229. package/src/files/elements.ts +5 -6
  230. package/src/files/file-ops.ts +77 -36
  231. package/src/files/files.ts +90 -95
  232. package/src/files/media-meta.ts +2 -1
  233. package/src/files/media-paths.ts +6 -1
  234. package/src/files/serialize-document.ts +2 -2
  235. package/src/format/constraints.ts +1 -1
  236. package/src/format/convert-file.ts +27 -13
  237. package/src/format/format-choices.ts +2 -1
  238. package/src/format/format-host.ts +76 -50
  239. package/src/github/github-auth-status.ts +27 -3
  240. package/src/github/github-auth.ts +19 -9
  241. package/src/github/github-publish.ts +24 -20
  242. package/src/grid/cell-editors.ts +46 -31
  243. package/src/grid/cell-popovers.ts +5 -3
  244. package/src/grid/edit-buffer.ts +10 -9
  245. package/src/grid/grid-controller.ts +20 -22
  246. package/src/grid/grid-layout.ts +21 -5
  247. package/src/grid/grid-open.ts +3 -6
  248. package/src/grid/grid-panel.ts +11 -4
  249. package/src/grid/grid-source.ts +8 -8
  250. package/src/grid/grid-view.ts +14 -17
  251. package/src/grid/redirects-grid.ts +14 -5
  252. package/src/grid/redirects.ts +16 -14
  253. package/src/grid/schema-columns.ts +25 -19
  254. package/src/grid/sources/connector-source.ts +47 -20
  255. package/src/grid/sources/content-source.ts +25 -24
  256. package/src/grid/sources/csv-file-source.ts +2 -2
  257. package/src/grid/tabulator-tables.d.ts +55 -34
  258. package/src/hosting/stage.ts +7 -7
  259. package/src/i18n/i18n-commands.ts +1 -2
  260. package/src/media/media-pane.ts +4 -1
  261. package/src/new-project/add-repo-modal.ts +20 -19
  262. package/src/new-project/import-tab.ts +10 -14
  263. package/src/new-project/location-fields.ts +2 -1
  264. package/src/new-project/new-project-modal.ts +12 -9
  265. package/src/packages/jxsuite-update.ts +4 -3
  266. package/src/packages/pull-package-sync.ts +26 -25
  267. package/src/page-params.ts +97 -68
  268. package/src/panels/activity-panel.ts +17 -9
  269. package/src/panels/ai-chat/attached-context.ts +13 -7
  270. package/src/panels/ai-chat/chat-view.ts +80 -73
  271. package/src/panels/ai-chat/composer.ts +30 -33
  272. package/src/panels/ai-chat/sessions-view.ts +1 -2
  273. package/src/panels/ai-panel.ts +23 -20
  274. package/src/panels/block-action-bar.ts +46 -35
  275. package/src/panels/bottom-dock.ts +5 -3
  276. package/src/panels/canvas-dnd-bridge.ts +31 -24
  277. package/src/panels/data-explorer.ts +62 -25
  278. package/src/panels/data-grid.ts +14 -11
  279. package/src/panels/dnd.ts +108 -118
  280. package/src/panels/editors.ts +55 -22
  281. package/src/panels/elements-panel.ts +10 -3
  282. package/src/panels/events-panel.ts +84 -69
  283. package/src/panels/formula-workspace.ts +76 -51
  284. package/src/panels/frontmatter-fields.ts +24 -19
  285. package/src/panels/frontmatter-panel.ts +44 -34
  286. package/src/panels/git-diff-open.ts +4 -4
  287. package/src/panels/git-panel.ts +49 -61
  288. package/src/panels/head-panel.ts +131 -111
  289. package/src/panels/i18n-panel.ts +10 -3
  290. package/src/panels/imports-panel.ts +23 -47
  291. package/src/panels/jump-bar.ts +48 -29
  292. package/src/panels/layers-panel.ts +97 -74
  293. package/src/panels/left-panel.ts +3 -3
  294. package/src/panels/pane-context.ts +31 -22
  295. package/src/panels/pane-grid.ts +49 -20
  296. package/src/panels/panel-registry.ts +22 -37
  297. package/src/panels/properties-panel.ts +175 -121
  298. package/src/panels/quick-search.ts +53 -31
  299. package/src/panels/right-panel.ts +3 -3
  300. package/src/panels/seo-modal.ts +13 -17
  301. package/src/panels/settings-menu.ts +15 -15
  302. package/src/panels/signals-panel.ts +153 -131
  303. package/src/panels/statement-editor.ts +230 -140
  304. package/src/panels/style-panel.ts +254 -216
  305. package/src/panels/style-utils.ts +114 -51
  306. package/src/panels/stylebook-doc.ts +57 -54
  307. package/src/panels/stylebook-layers-panel.ts +9 -9
  308. package/src/panels/stylebook-panel.ts +13 -17
  309. package/src/panels/tab-drop.ts +27 -11
  310. package/src/panels/tab-strip.ts +36 -26
  311. package/src/platform-errors.ts +57 -43
  312. package/src/platform.ts +58 -30
  313. package/src/platforms/cloud.ts +345 -175
  314. package/src/platforms/default-platform.ts +10 -4
  315. package/src/platforms/devserver.ts +174 -127
  316. package/src/platforms/read-batcher.ts +16 -8
  317. package/src/project-list.ts +2 -1
  318. package/src/publish/deploy-checklist.ts +8 -2
  319. package/src/publish/pages-service.ts +28 -13
  320. package/src/publish/publish-commands.ts +5 -4
  321. package/src/publish/publish-panel.ts +10 -6
  322. package/src/recent-projects.ts +15 -8
  323. package/src/resize-edges.ts +26 -36
  324. package/src/services/a11y-report.ts +26 -19
  325. package/src/services/agent-seed.ts +23 -11
  326. package/src/services/ai-ask.ts +9 -12
  327. package/src/services/ai-command-tools.ts +68 -62
  328. package/src/services/ai-import-tools.ts +80 -67
  329. package/src/services/ai-models.ts +17 -13
  330. package/src/services/ai-project-tools.ts +68 -32
  331. package/src/services/ai-session-store.ts +19 -10
  332. package/src/services/ai-system-prompt.ts +46 -20
  333. package/src/services/ai-tools.ts +71 -27
  334. package/src/services/ai-write-report.ts +20 -12
  335. package/src/services/ai-writes.ts +4 -4
  336. package/src/services/automation.ts +58 -31
  337. package/src/services/cem-export.ts +149 -58
  338. package/src/services/clock.ts +6 -1
  339. package/src/services/code-services.ts +37 -31
  340. package/src/services/context-manager.ts +14 -10
  341. package/src/services/context-resolver.ts +20 -8
  342. package/src/services/data-service.ts +19 -15
  343. package/src/services/directory-picker.ts +18 -12
  344. package/src/services/document-assistant.ts +39 -19
  345. package/src/services/gated-registry.ts +10 -6
  346. package/src/services/harness/chat-reducer.ts +23 -1
  347. package/src/services/import-client.ts +91 -38
  348. package/src/services/import-seed.ts +8 -2
  349. package/src/services/jx-validate.ts +28 -31
  350. package/src/services/live-preview.ts +0 -0
  351. package/src/services/live-surfaces.ts +6 -3
  352. package/src/services/model-uri.ts +10 -2
  353. package/src/services/module-preloads.ts +12 -8
  354. package/src/services/monaco-buffer.ts +43 -24
  355. package/src/services/monaco-lazy.ts +7 -8
  356. package/src/services/monaco-setup.ts +23 -16
  357. package/src/services/notify.ts +44 -17
  358. package/src/services/popover-report.ts +25 -10
  359. package/src/services/preview-eval.ts +20 -8
  360. package/src/services/profile.ts +13 -6
  361. package/src/services/project-path.ts +13 -10
  362. package/src/services/references.ts +0 -0
  363. package/src/services/render-critic.ts +8 -7
  364. package/src/services/settings/kernel.ts +13 -4
  365. package/src/services/settings/write-queue.ts +9 -9
  366. package/src/services/token-lint.ts +12 -10
  367. package/src/services/tool-executor.ts +17 -5
  368. package/src/services/tool-outcomes.ts +44 -24
  369. package/src/services/trusted-types.ts +24 -7
  370. package/src/settings/contexts-section.ts +11 -8
  371. package/src/settings/contributed-section.ts +79 -60
  372. package/src/settings/css-vars-editor.ts +37 -16
  373. package/src/settings/defs-editor.ts +38 -35
  374. package/src/settings/extension-rows.ts +16 -8
  375. package/src/settings/extension-sections.ts +23 -13
  376. package/src/settings/extensions-section.ts +4 -1
  377. package/src/settings/general-settings.ts +11 -8
  378. package/src/settings/locales-section.ts +20 -12
  379. package/src/settings/preferences-dialog.ts +9 -6
  380. package/src/settings/preferences-keymap.ts +7 -5
  381. package/src/settings/preferences-sections.ts +11 -5
  382. package/src/settings/project-sections.ts +1 -1
  383. package/src/settings/schema-field-ui.ts +9 -0
  384. package/src/settings/settings-document.ts +5 -5
  385. package/src/shell/tree.ts +6 -5
  386. package/src/shell.ts +104 -81
  387. package/src/site-context.ts +37 -22
  388. package/src/state.ts +41 -49
  389. package/src/store.ts +54 -34
  390. package/src/studio.ts +39 -77
  391. package/src/style/live-preview.ts +1 -1
  392. package/src/style/project-styles.ts +6 -7
  393. package/src/style/token-ref.ts +5 -4
  394. package/src/surfaces/about.ts +18 -19
  395. package/src/surfaces/add-repo.ts +17 -19
  396. package/src/surfaces/ai-chat.ts +31 -36
  397. package/src/surfaces/ai-credentials-form.ts +6 -16
  398. package/src/surfaces/ai-managed-connect.ts +3 -4
  399. package/src/surfaces/ai-model-picker.ts +3 -5
  400. package/src/surfaces/block-action-bar.ts +22 -11
  401. package/src/surfaces/boot-failure.ts +4 -5
  402. package/src/surfaces/bottom-dock.ts +9 -18
  403. package/src/surfaces/canvas-stage.ts +12 -11
  404. package/src/surfaces/cf-account-picker.ts +17 -18
  405. package/src/surfaces/commandbar.ts +14 -9
  406. package/src/surfaces/convert-repeater.ts +17 -19
  407. package/src/surfaces/data-actions.ts +9 -7
  408. package/src/surfaces/dialog.ts +26 -28
  409. package/src/surfaces/diff-toolbar.ts +9 -7
  410. package/src/surfaces/doc-header.ts +10 -19
  411. package/src/surfaces/empty-state.ts +7 -10
  412. package/src/surfaces/entry-editor.ts +14 -11
  413. package/src/surfaces/expression-editor.ts +11 -25
  414. package/src/surfaces/files-panel.ts +27 -14
  415. package/src/surfaces/formula-palette.ts +4 -5
  416. package/src/surfaces/git-panel.ts +7 -15
  417. package/src/surfaces/github-auth.ts +16 -20
  418. package/src/surfaces/github-publish.ts +17 -22
  419. package/src/surfaces/grid-cell.ts +30 -31
  420. package/src/surfaces/grid-open.ts +10 -14
  421. package/src/surfaces/grid-panel.ts +13 -9
  422. package/src/surfaces/grid-replace.ts +13 -13
  423. package/src/surfaces/grid-views.ts +15 -18
  424. package/src/surfaces/inspector-dock.ts +13 -12
  425. package/src/surfaces/jump-bar.ts +5 -6
  426. package/src/surfaces/jxsuite-update.ts +16 -22
  427. package/src/surfaces/library-pane.ts +25 -20
  428. package/src/surfaces/logic-panel.ts +17 -30
  429. package/src/surfaces/logic-workspace.ts +13 -15
  430. package/src/surfaces/media-browser.ts +11 -10
  431. package/src/surfaces/media-field.ts +4 -5
  432. package/src/surfaces/media-pane.ts +8 -7
  433. package/src/surfaces/menu.ts +29 -23
  434. package/src/surfaces/navigator-dock.ts +11 -12
  435. package/src/surfaces/new-project.ts +27 -26
  436. package/src/surfaces/pane-context.ts +20 -25
  437. package/src/surfaces/pane-grid.ts +15 -10
  438. package/src/surfaces/panel-activity.ts +5 -6
  439. package/src/surfaces/panel-data.ts +3 -4
  440. package/src/surfaces/panel-deploy-checklist.ts +5 -6
  441. package/src/surfaces/panel-elements.ts +5 -7
  442. package/src/surfaces/panel-i18n.ts +5 -7
  443. package/src/surfaces/panel-imports.ts +6 -13
  444. package/src/surfaces/panel-outline.ts +25 -19
  445. package/src/surfaces/panel-page.ts +11 -18
  446. package/src/surfaces/panel-problems.ts +5 -7
  447. package/src/surfaces/panel-signals.ts +20 -34
  448. package/src/surfaces/panel-stylebook-layers.ts +5 -8
  449. package/src/surfaces/preferences.ts +21 -11
  450. package/src/surfaces/progress-modal.ts +15 -9
  451. package/src/surfaces/properties-panel.json +1 -1
  452. package/src/surfaces/properties-panel.ts +20 -42
  453. package/src/surfaces/publish.ts +18 -18
  454. package/src/surfaces/push-plan.ts +7 -8
  455. package/src/surfaces/rail.json +126 -73
  456. package/src/surfaces/rail.ts +38 -12
  457. package/src/surfaces/reference-field.ts +11 -15
  458. package/src/surfaces/schema-builder.ts +16 -22
  459. package/src/surfaces/schema-form.ts +15 -25
  460. package/src/surfaces/secret-field.ts +9 -6
  461. package/src/surfaces/seo.ts +21 -15
  462. package/src/surfaces/settings-contexts.ts +9 -7
  463. package/src/surfaces/settings-contributed.ts +14 -10
  464. package/src/surfaces/settings-css-vars.ts +5 -12
  465. package/src/surfaces/settings-defs.json +2 -2
  466. package/src/surfaces/settings-defs.ts +17 -21
  467. package/src/surfaces/settings-deploy.ts +8 -15
  468. package/src/surfaces/settings-extensions.ts +5 -6
  469. package/src/surfaces/settings-head.ts +33 -39
  470. package/src/surfaces/settings-locales.ts +8 -20
  471. package/src/surfaces/settings-overview.ts +5 -6
  472. package/src/surfaces/settings-packages.ts +8 -7
  473. package/src/surfaces/settings-pane.ts +9 -18
  474. package/src/surfaces/settings-rawjson.ts +5 -6
  475. package/src/surfaces/shell.ts +1 -2
  476. package/src/surfaces/slash-menu.ts +19 -9
  477. package/src/surfaces/statements.ts +13 -18
  478. package/src/surfaces/statusbar.ts +17 -14
  479. package/src/surfaces/style-panel.ts +18 -31
  480. package/src/surfaces/stylebook-chrome.ts +3 -5
  481. package/src/surfaces/tab-strip.ts +14 -13
  482. package/src/surfaces/target-line.ts +6 -7
  483. package/src/surfaces/welcome.ts +5 -7
  484. package/src/tabs/patch-ops.ts +4 -3
  485. package/src/tabs/project-config.ts +32 -21
  486. package/src/tabs/selection.ts +36 -8
  487. package/src/tabs/tab.ts +52 -41
  488. package/src/tabs/transact.ts +98 -53
  489. package/src/tabs/typing.ts +31 -0
  490. package/src/types.ts +32 -17
  491. package/src/ui/ai-credentials-form.ts +10 -13
  492. package/src/ui/ai-model-picker.ts +3 -3
  493. package/src/ui/cf-account-picker.ts +7 -9
  494. package/src/ui/color-selector.ts +9 -5
  495. package/src/ui/dynamic-slot.ts +7 -8
  496. package/src/ui/expression-editor.ts +112 -105
  497. package/src/ui/form-controls.ts +57 -48
  498. package/src/ui/formula-catalog.ts +239 -230
  499. package/src/ui/formula-chips.ts +33 -18
  500. package/src/ui/layers.ts +44 -31
  501. package/src/ui/media-picker.ts +18 -9
  502. package/src/ui/popover-surface.ts +20 -12
  503. package/src/ui/progress-modal.ts +13 -8
  504. package/src/ui/regions.ts +7 -6
  505. package/src/ui/schema-form.ts +113 -70
  506. package/src/ui/surface.ts +71 -8
  507. package/src/ui/timing.ts +9 -0
  508. package/src/ui/value-source.ts +44 -31
  509. package/src/ui/virtual-window.ts +3 -2
  510. package/src/utils/base64.ts +3 -1
  511. package/src/utils/edit-display.ts +103 -74
  512. package/src/utils/element-selectors.ts +3 -2
  513. package/src/utils/google-fonts.ts +15 -14
  514. package/src/utils/inherited-style.ts +18 -20
  515. package/src/utils/link-target.ts +1 -1
  516. package/src/utils/preview-format.ts +25 -3
  517. package/src/utils/strip-events.ts +49 -22
  518. package/src/utils/studio-utils.ts +29 -14
  519. package/src/view.ts +2 -3
  520. package/src/workspace/pane-derive.ts +10 -12
  521. package/src/workspace/session.ts +53 -43
  522. package/src/workspace/workspace.ts +47 -36
  523. package/dist/chunks/2020-nkxms0ay.js +0 -4
  524. package/dist/chunks/adapter-m948ab5f.js +0 -4
  525. package/dist/chunks/cf-account-picker-n8hr38v7.js +0 -4
  526. package/dist/chunks/cf-settings-356xdtne.js +0 -4
  527. package/dist/chunks/color-area-jqhna8zy.js +0 -4
  528. package/dist/chunks/color-field-embq5ctg.js +0 -4
  529. package/dist/chunks/color-fpezvnkt.js +0 -4
  530. package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
  531. package/dist/chunks/combobox-773hdzyj.js +0 -4
  532. package/dist/chunks/components-yk3t844e.js +0 -4
  533. package/dist/chunks/content-source-bawmyc09.js +0 -4
  534. package/dist/chunks/convert-to-repeater-7wns8kf1.js +0 -4
  535. package/dist/chunks/dialog-mtm9fq5t.js +0 -4
  536. package/dist/chunks/editor-6sc8nacq.js +0 -4
  537. package/dist/chunks/entry-commands-8ay9fh81.js +0 -4
  538. package/dist/chunks/extension-sections-na7rj3nr.js +0 -4
  539. package/dist/chunks/file-ops-gye0qw56.js +0 -4
  540. package/dist/chunks/files-dmc2xvcq.js +0 -4
  541. package/dist/chunks/format-host-t76b53f8.js +0 -4
  542. package/dist/chunks/fs-events-cg4tpz06.js +0 -4
  543. package/dist/chunks/git-panel-yef7bshy.js +0 -4
  544. package/dist/chunks/grid-view-7tt4bxw1.js +0 -51
  545. package/dist/chunks/icons-qbh8akb1.js +0 -4
  546. package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
  547. package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
  548. package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
  549. package/dist/chunks/iframe-host-tmz30gfp.js +0 -4
  550. package/dist/chunks/index-nag78a9h.js +0 -4
  551. package/dist/chunks/jsonMode-zhwsprqk.js +0 -13
  552. package/dist/chunks/jx-validate-3gbp5nkn.js +0 -4
  553. package/dist/chunks/layers-fvz99859.js +0 -4
  554. package/dist/chunks/layers-panel-gchmbf9p.js +0 -4
  555. package/dist/chunks/listbox-s8fkmnq8.js +0 -4
  556. package/dist/chunks/lit-html-9agdspkt.js +0 -4
  557. package/dist/chunks/media-picker-rhjvyy00.js +0 -4
  558. package/dist/chunks/menu-2e4y9j7b.js +0 -4
  559. package/dist/chunks/menu-37d07z9m.js +0 -4
  560. package/dist/chunks/monaco-binding-2jnhjjvr.js +0 -4
  561. package/dist/chunks/monaco-buffer-rp21359g.js +0 -4
  562. package/dist/chunks/monaco-setup-vhh7gayr.js +0 -4
  563. package/dist/chunks/notify-h3www560.js +0 -4
  564. package/dist/chunks/number-field-gw7sq8rn.js +0 -4
  565. package/dist/chunks/parse-897fvqah.js +0 -4
  566. package/dist/chunks/platform-hz34wcd7.js +0 -4
  567. package/dist/chunks/popover-8htra4er.js +0 -4
  568. package/dist/chunks/publish-panel-exsmjzyj.js +0 -4
  569. package/dist/chunks/quick-search-pgaqeh0m.js +0 -4
  570. package/dist/chunks/references-2cgdxnb8.js +0 -4
  571. package/dist/chunks/right-panel-jf856w5w.js +0 -4
  572. package/dist/chunks/section-registry-jnf8r5gy.js +0 -4
  573. package/dist/chunks/select-n3v7gwas.js +0 -4
  574. package/dist/chunks/split-pff8f3ze.js +0 -4
  575. package/dist/chunks/studio-0f55h9ye.js +0 -5
  576. package/dist/chunks/studio-0sqdhnew.js +0 -12
  577. package/dist/chunks/studio-19x1c75w.js +0 -5
  578. package/dist/chunks/studio-2sqcndak.js +0 -5
  579. package/dist/chunks/studio-3aey7dd3.js +0 -5
  580. package/dist/chunks/studio-3bpdkq2s.js +0 -5
  581. package/dist/chunks/studio-47y6fbpf.js +0 -5
  582. package/dist/chunks/studio-4m3826v2.js +0 -5
  583. package/dist/chunks/studio-4nx2dj1g.js +0 -4
  584. package/dist/chunks/studio-4xv5s47r.js +0 -9
  585. package/dist/chunks/studio-5g4t8v6w.js +0 -5
  586. package/dist/chunks/studio-5py436sf.js +0 -5
  587. package/dist/chunks/studio-77kt594t.js +0 -5
  588. package/dist/chunks/studio-8f87n763.js +0 -10
  589. package/dist/chunks/studio-8mb00b84.js +0 -5
  590. package/dist/chunks/studio-8p51gq2h.js +0 -6
  591. package/dist/chunks/studio-954ds834.js +0 -5
  592. package/dist/chunks/studio-9ft45c83.js +0 -9
  593. package/dist/chunks/studio-a2138x5k.js +0 -7
  594. package/dist/chunks/studio-a9yzstqj.js +0 -5
  595. package/dist/chunks/studio-acdksxx6.js +0 -5
  596. package/dist/chunks/studio-ar8jcf2y.js +0 -5
  597. package/dist/chunks/studio-bmn4mn9j.js +0 -7
  598. package/dist/chunks/studio-e7xxa0sj.js +0 -5
  599. package/dist/chunks/studio-ecaz25vk.js +0 -5
  600. package/dist/chunks/studio-ery42sqr.js +0 -4
  601. package/dist/chunks/studio-fzdywr6p.js +0 -9
  602. package/dist/chunks/studio-g5fmf0c1.js +0 -5
  603. package/dist/chunks/studio-g7nse7zb.js +0 -5
  604. package/dist/chunks/studio-geq1ea6k.js +0 -14
  605. package/dist/chunks/studio-ghkb32r8.js +0 -5
  606. package/dist/chunks/studio-ghrhy2y7.js +0 -5
  607. package/dist/chunks/studio-grawhey1.js +0 -5
  608. package/dist/chunks/studio-h0xgswew.js +0 -5
  609. package/dist/chunks/studio-h9c4p2tx.js +0 -5
  610. package/dist/chunks/studio-jyzj5cxs.js +0 -5
  611. package/dist/chunks/studio-mgx8yhnz.js +0 -64
  612. package/dist/chunks/studio-mpb04y1d.js +0 -6
  613. package/dist/chunks/studio-n17mty64.js +0 -5
  614. package/dist/chunks/studio-nwh2eqsk.js +0 -6
  615. package/dist/chunks/studio-q1h883bt.js +0 -16
  616. package/dist/chunks/studio-q4tv82h7.js +0 -9
  617. package/dist/chunks/studio-qpqa7vk3.js +0 -5
  618. package/dist/chunks/studio-qqz8e5gk.js +0 -5
  619. package/dist/chunks/studio-qvasen3f.js +0 -5
  620. package/dist/chunks/studio-rggdb3hm.js +0 -5
  621. package/dist/chunks/studio-sghy936h.js +0 -4
  622. package/dist/chunks/studio-skprc6ef.js +0 -5
  623. package/dist/chunks/studio-tt2nactf.js +0 -5
  624. package/dist/chunks/studio-tyasmc39.js +0 -5
  625. package/dist/chunks/studio-vk9ezads.js +0 -5
  626. package/dist/chunks/studio-vzacdfsc.js +0 -4
  627. package/dist/chunks/studio-w4c0xmrw.js +0 -5
  628. package/dist/chunks/studio-wfjqhhbk.js +0 -5
  629. package/dist/chunks/studio-wgh5kxpj.js +0 -5
  630. package/dist/chunks/studio-xasj0796.js +0 -5
  631. package/dist/chunks/studio-y78s8r2n.js +0 -5
  632. package/dist/chunks/studio-z8w183sh.js +0 -5
  633. package/dist/chunks/studio-zscd9ty4.js +0 -928
  634. package/dist/chunks/studio-zxp13sss.js +0 -7
  635. package/dist/chunks/studio-zygnmm01.js +0 -5
  636. package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
  637. package/dist/chunks/tabs-jwthg40w.js +0 -4
  638. package/dist/chunks/textfield-spy3hc77.js +0 -4
  639. package/dist/chunks/toast-4d35zd64.js +0 -4
  640. package/dist/chunks/toast-host-8sjmfed3.js +0 -4
  641. package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
  642. package/dist/chunks/tree-h19v1jfz.js +0 -4
  643. package/dist/chunks/tsMode-gr0m4dzr.js +0 -14
  644. package/dist/chunks/workspace-m15qtcqp.js +0 -4
  645. package/dist/chunks/ws-client-nf61frr1.js +0 -4
@@ -34,7 +34,7 @@
34
34
  * @docs studio/interface/canvas
35
35
  */
36
36
 
37
- import { displayTagName } from "@jxsuite/schema/guards";
37
+ import { displayTagName, isMappedArray, isNonNullObject, isNumber } from "@jxsuite/schema/guards";
38
38
  import { focusItem } from "@jxsuite/ui/behaviors/action-group";
39
39
  import { draggable } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
40
40
  import { disableNativeDragPreview } from "@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview";
@@ -49,6 +49,7 @@ import {
49
49
  } from "../store";
50
50
  import { activeTab } from "../workspace/workspace";
51
51
  import { activeCanvasSurface, stageContaining } from "../canvas/canvas-surface";
52
+ import { stageOf } from "../canvas/surface-registry";
52
53
  import { panelOfSurface } from "../canvas/canvas-helpers";
53
54
  import { primarySelection, structuralBatch } from "../tabs/selection";
54
55
  import {
@@ -235,7 +236,7 @@ function barPosition(anchor: {
235
236
  pointing at a node the card is covering. Everywhere else there is no scroller and the stage is
236
237
  the viewport, as it always was. */
237
238
  const surface = activeCanvasSurface();
238
- const viewport = panelOfSurface(surface)?.scrollContainer ?? surface.wrap;
239
+ const viewport = panelOfSurface(surface)?.scrollContainer ?? stageOf(surface);
239
240
  const box = viewport ? rectOf(viewport) : null;
240
241
  if (box && (anchor.top + anchor.height < box.top || anchor.top > box.bottom)) {
241
242
  return null;
@@ -324,23 +325,28 @@ export function formatCommands(): AnyCommand[] {
324
325
  title: string,
325
326
  icon: string,
326
327
  keybinding?: string,
327
- ): AnyCommand => ({
328
- category: "Edit",
329
- group: "6_format",
330
- icon,
331
- id: `format.${command}`,
332
- ...(keybinding === undefined ? {} : { keybinding }),
333
- keyScope: "caret",
334
- level: "selection",
335
- menus: ["blockbar/format", "palette"],
336
- requires: "a text caret in the canvas",
337
- run: () => {
338
- postApplyFormat({ command });
339
- },
340
- title,
341
- undo: "document",
342
- when: (ctx: CommandContext) => ctx.caret.inCanvas,
343
- });
328
+ ): AnyCommand => {
329
+ const entry: AnyCommand = {
330
+ category: "Edit",
331
+ group: "6_format",
332
+ icon,
333
+ id: `format.${command}`,
334
+ keyScope: "caret",
335
+ level: "selection",
336
+ menus: ["blockbar/format", "palette"],
337
+ requires: "a text caret in the canvas",
338
+ run: () => {
339
+ postApplyFormat({ command });
340
+ },
341
+ title,
342
+ undo: "document",
343
+ when: (ctx: CommandContext) => ctx.caret.inCanvas,
344
+ };
345
+ if (keybinding !== undefined) {
346
+ entry.keybinding = keybinding;
347
+ }
348
+ return entry;
349
+ };
344
350
 
345
351
  return [
346
352
  record("bold", "Bold", "text-b", "mod+b"),
@@ -493,7 +499,7 @@ function structuralTarget(path: JxPath | null = commandTargetPath()): Structural
493
499
  }
494
500
  const index = childIndex(path);
495
501
  const parentPath = parentElementPath(path);
496
- if (typeof index !== "number" || !parentPath) {
502
+ if (!isNumber(index) || !parentPath) {
497
503
  return null;
498
504
  }
499
505
  const parentNode = getNodeAtPath(tab.doc.document, parentPath);
@@ -510,7 +516,7 @@ function structuralTarget(path: JxPath | null = commandTargetPath()): Structural
510
516
  * block, not a container, and nesting a block inside it produces invalid markup.
511
517
  */
512
518
  function isContainerNode(node: JxMutableNode | string | null | undefined): boolean {
513
- if (!node || typeof node !== "object") {
519
+ if (!isNonNullObject(node)) {
514
520
  return false;
515
521
  }
516
522
  if (VOID_ELEMENTS.has((displayTagName(node.tagName) || "div").toLowerCase())) {
@@ -521,11 +527,10 @@ function isContainerNode(node: JxMutableNode | string | null | undefined): boole
521
527
  return false;
522
528
  }
523
529
  if (!Array.isArray(children)) {
524
- return (children as unknown as Record<string, unknown>).$prototype === "Array";
530
+ return isMappedArray(children);
525
531
  }
526
532
  return (
527
- children.length === 0 ||
528
- children.some((c) => typeof c === "object" && c !== null && !isInlineElement(c, node))
533
+ children.length === 0 || children.some((c) => isNonNullObject(c) && !isInlineElement(c, node))
529
534
  );
530
535
  }
531
536
 
@@ -549,7 +554,7 @@ function canMoveOut(): boolean {
549
554
  return (
550
555
  target !== null &&
551
556
  parentElementPath(target.parentPath) !== null &&
552
- typeof childIndex(target.parentPath) === "number"
557
+ isNumber(childIndex(target.parentPath))
553
558
  );
554
559
  }
555
560
 
@@ -598,7 +603,7 @@ function moveTargetOut(): void {
598
603
  }
599
604
  const grandparent = parentElementPath(target.parentPath);
600
605
  const parentIndex = childIndex(target.parentPath);
601
- if (!grandparent || typeof parentIndex !== "number") {
606
+ if (!grandparent || !isNumber(parentIndex)) {
602
607
  return;
603
608
  }
604
609
  transactDoc(target.tab, (t) => mutateMoveNode(t, target.path, grandparent, parentIndex + 1));
@@ -1040,7 +1045,7 @@ export function showCommandOverflow(
1040
1045
  commands.map((command, index) => {
1041
1046
  const chord = registry.keymap.formatBinding(command.id);
1042
1047
  const reason = registry.disabledReason(command.id);
1043
- return {
1048
+ const row: MenuRowProjection = {
1044
1049
  destructive: command.destructive === true,
1045
1050
  disabled: reason !== undefined,
1046
1051
  dividerAbove: index > 0 && command.destructive === true,
@@ -1049,9 +1054,14 @@ export function showCommandOverflow(
1049
1054
  runCommand(registry, command.id, target);
1050
1055
  },
1051
1056
  title: command.title,
1052
- ...(chord ? { chord } : {}),
1053
- ...(reason === undefined ? {} : { requires: reason }),
1054
1057
  };
1058
+ if (chord) {
1059
+ row.chord = chord;
1060
+ }
1061
+ if (reason !== undefined) {
1062
+ row.requires = reason;
1063
+ }
1064
+ return row;
1055
1065
  });
1056
1066
  const rows = target ? withCommandTarget(target, project) : project();
1057
1067
  _overflowHandle = openMenu({
@@ -1079,7 +1089,7 @@ export function showCommandOverflow(
1079
1089
  function returnFocusToCanvas(): void {
1080
1090
  // The FOCUSED pane's stage: the keyboard came from there and is going back there. Resolving it
1081
1091
  // From the active tab answered with whichever pane displays that document first.
1082
- const stage = activeCanvasSurface().wrap;
1092
+ const stage = stageOf(activeCanvasSurface());
1083
1093
  const iframe = stage?.querySelector<HTMLElement>("iframe.jx-canvas-iframe");
1084
1094
  (iframe ?? stage)?.focus();
1085
1095
  }
@@ -1118,9 +1128,9 @@ export function handleBlockBarEntryKey(e: KeyboardEvent): void {
1118
1128
  * The tags this node may be converted into — empty for a component instance and for a repeater,
1119
1129
  * whose content is a `map` template rather than a tag.
1120
1130
  *
1121
- * @param {JxMutableNode | null} node
1131
+ * @param {JxMutableNode | null | undefined} node
1122
1132
  */
1123
- function convertTargetsFor(node: JxMutableNode | null): SlashCommand[] {
1133
+ function convertTargetsFor(node: JxMutableNode | null | undefined): SlashCommand[] {
1124
1134
  if (!node) {
1125
1135
  return [];
1126
1136
  }
@@ -1130,10 +1140,11 @@ function convertTargetsFor(node: JxMutableNode | null): SlashCommand[] {
1130
1140
  return [];
1131
1141
  }
1132
1142
  const children = childList(node);
1143
+ const [first] = children;
1133
1144
  const isEmpty =
1134
1145
  !node.textContent &&
1135
1146
  (children.length === 0 ||
1136
- (children.length === 1 && typeof children[0] === "object" && children[0]?.tagName === "br"));
1147
+ (children.length === 1 && isNonNullObject(first) && first.tagName === "br"));
1137
1148
  return getConvertTargets((literal || "div").toLowerCase(), isEmpty);
1138
1149
  }
1139
1150
 
@@ -1173,7 +1184,7 @@ function openConvertMenu(anchor: HTMLElement): void {
1173
1184
  */
1174
1185
  function openMergeTagMenu(anchor: HTMLElement): void {
1175
1186
  const tab = activeTab.value;
1176
- const state = (tab?.doc.document.state ?? {}) as Record<string, unknown>;
1187
+ const state = tab?.doc.document.state ?? {};
1177
1188
  // The live resolved scope lives inside the iframe realm and is not threaded out, so the parent
1178
1189
  // Offers only top-level `state.*` tokens (buildMergeTags tolerates the null scopes).
1179
1190
  const tags = buildMergeTags(state, null, null);
@@ -1186,7 +1197,7 @@ function openMergeTagMenu(anchor: HTMLElement): void {
1186
1197
  if (arrayNode && tab) {
1187
1198
  const tokens = resolveRepeaterItemFields(
1188
1199
  arrayNode,
1189
- tab.doc.document.state as Record<string, unknown>,
1200
+ tab.doc.document.state,
1190
1201
  projectState?.projectConfig,
1191
1202
  );
1192
1203
  tags.push(...buildRepeaterTagsFromFields(tokens));
@@ -37,7 +37,7 @@
37
37
  * registered from here, like every other tab of this dock.
38
38
  */
39
39
 
40
- import { render as litRender, nothing } from "lit-html";
40
+ import { render, nothing } from "lit-html";
41
41
  import { effect, effectScope } from "../reactivity";
42
42
  import {
43
43
  BOTTOM_TAB_IDS,
@@ -141,6 +141,8 @@ export function activeBottomPanel(ctx: CommandContext = panelContext()): PanelRe
141
141
  */
142
142
  function bottomContext(): NavigatorPanelContext {
143
143
  return {
144
+ /* SAFETY: no Bottom dock panel reads `deps` (see above): Problems and Activity render from their
145
+ own stores and Logic from `activeTab`, so this empty stand-in is never dereferenced. */
144
146
  deps: {} as NavigatorPanelDeps,
145
147
  doc: null,
146
148
  rerender: renderBottomDock,
@@ -296,7 +298,7 @@ function paintBody(): void {
296
298
  return;
297
299
  }
298
300
  const active = activeBottomPanel();
299
- litRender(
301
+ render(
300
302
  active
301
303
  ? active.render(bottomContext())
302
304
  : emptyState(host, { message: "Nothing to show here yet." }),
@@ -394,7 +396,7 @@ export function unmountBottomDock(): void {
394
396
  _host.removeAttribute(REGION_ATTR);
395
397
  /* The document's dispose removed its own root; this clears anything a caller left beside it,
396
398
  so the host is `:empty` again and the shell's sheet takes the dock out of the grid. */
397
- litRender(nothing, _host);
399
+ render(nothing, _host);
398
400
  _host.textContent = "";
399
401
  runAfterRender(_host);
400
402
  _host = null;
@@ -42,19 +42,15 @@ import { parentCursorToIframe } from "../canvas/iframe-overlay";
42
42
  import { clearDragGhost, moveDragGhost, setDragGhost } from "./drag-ghost";
43
43
  import { getNodeAtPath } from "../store";
44
44
  import { activeTab } from "../workspace/workspace";
45
- import type { DragHost } from "../canvas/iframe-host";
45
+ import type { HostState } from "../canvas/iframe-host";
46
+ import type { ElementDragPayload } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
46
47
  import type { Tab } from "../tabs/tab";
47
48
  import type { DragSrcKind, ParentToIframe } from "../canvas/iframe-protocol";
48
49
  import type { JxMutableNode } from "@jxsuite/schema/types";
49
-
50
- /** A parent-viewport pointer position (pragmatic's `location.current.input`). */
51
- interface Cursor {
52
- x: number;
53
- y: number;
54
- }
50
+ import type { ViewportPoint } from "../surfaces/menu";
55
51
 
56
52
  interface MonitorDragArgs {
57
- source: { data: Record<string, unknown> };
53
+ source: { data: ElementDragPayload["data"] };
58
54
  location: {
59
55
  current: { input: { clientX: number; clientY: number } };
60
56
  // Pragmatic resets `current` back to `initial` when a drag is CANCELLED (Escape / dropped on no
@@ -64,6 +60,12 @@ interface MonitorDragArgs {
64
60
  };
65
61
  }
66
62
 
63
+ /** The two leg messages one cursor position yields. */
64
+ export interface DragMessages {
65
+ move: ParentToIframe;
66
+ drop: ParentToIframe;
67
+ }
68
+
67
69
  /**
68
70
  * PURE: build the `dragMove` + `drop` parent→iframe messages for a cursor, given the session id and
69
71
  * the target iframe's EMPIRICAL `scale` + `rect` (both injected so this is testable without a DOM).
@@ -72,11 +74,11 @@ interface MonitorDragArgs {
72
74
  * the move-preview and the authoritative drop never use a divergent coordinate transform.
73
75
  */
74
76
  export function buildDragMessages(
75
- cursor: Cursor,
77
+ cursor: ViewportPoint,
76
78
  dragSeq: number,
77
79
  scale: number,
78
80
  iframeRect: { left: number; top: number },
79
- ): { move: ParentToIframe; drop: ParentToIframe } {
81
+ ): DragMessages {
80
82
  const local = parentCursorToIframe(cursor, iframeRect, scale);
81
83
  return {
82
84
  drop: { cursor: local, dragSeq, kind: "drop" },
@@ -85,7 +87,7 @@ export function buildDragMessages(
85
87
  }
86
88
 
87
89
  /** The cursor of a monitor event in parent-viewport coords. */
88
- function cursorOf(location: MonitorDragArgs["location"]): Cursor {
90
+ function cursorOf(location: MonitorDragArgs["location"]): ViewportPoint {
89
91
  return { x: location.current.input.clientX, y: location.current.input.clientY };
90
92
  }
91
93
 
@@ -97,11 +99,13 @@ function cursorOf(location: MonitorDragArgs["location"]): Cursor {
97
99
  * the iframe's `canDrop` rejects ancestor/self targets). Anything else (e.g. a row missing a path)
98
100
  * is ignored.
99
101
  */
100
- function dragSrcOf(data: Record<string, unknown>): DragSrcKind | null {
102
+ function dragSrcOf(data: ElementDragPayload["data"]): DragSrcKind | null {
101
103
  if (data.type === "block") {
102
104
  return { type: "block" };
103
105
  }
104
106
  if (data.type === "tree-node" && Array.isArray(data.path)) {
107
+ /* SAFETY: both minters of a "tree-node" payload, an Outline row's `getInitialData` and the block
108
+ action bar's drag handle, set `path` to the dragged node's JxPath. */
105
109
  return { path: data.path as (string | number)[], type: "tree-node" };
106
110
  }
107
111
  return null;
@@ -120,20 +124,22 @@ function dragSrcOf(data: Record<string, unknown>): DragSrcKind | null {
120
124
  *
121
125
  * @param {Tab | null} tab The document the source path is addressed in.
122
126
  * @param {DragSrcKind} src
123
- * @param {Record<string, unknown>} data
127
+ * @param {ElementDragPayload["data"]} data
124
128
  * @returns {string}
125
129
  */
126
130
  export function ghostLabel(
127
131
  tab: Tab | null,
128
132
  src: DragSrcKind,
129
- data: Record<string, unknown>,
133
+ data: ElementDragPayload["data"],
130
134
  ): string {
131
135
  if (src.type === "block") {
136
+ /* SAFETY: every "block" payload minter (the palette and component cards in dnd.ts, the asset
137
+ file drop) sets `fragment` to the JxMutableNode the drop inserts. */
132
138
  const fragment = data.fragment as JxMutableNode | undefined;
133
139
  return displayTagName(fragment?.tagName) || "block";
134
140
  }
135
- const doc = tab?.doc.document as JxMutableNode | undefined;
136
- const node = doc ? (getNodeAtPath(doc, src.path) as JxMutableNode | undefined) : undefined;
141
+ const doc = tab?.doc.document;
142
+ const node = doc ? getNodeAtPath(doc, src.path) : undefined;
137
143
  return displayTagName(node?.tagName) || "node";
138
144
  }
139
145
 
@@ -150,9 +156,9 @@ const DROP_RESULT_TIMEOUT = 250;
150
156
  */
151
157
  interface CoordSession {
152
158
  src: DragSrcKind;
153
- srcData: Record<string, unknown>;
159
+ srcData: ElementDragPayload["data"];
154
160
  /** The host whose iframe currently holds the session, or null while off-canvas. */
155
- host: DragHost | null;
161
+ host: HostState | null;
156
162
  /** The session id the bound host was started with (for move/drop tagging). */
157
163
  seq: number;
158
164
  /** The drag ghost's label (computed once at start; the dragged thing doesn't change). */
@@ -161,9 +167,9 @@ interface CoordSession {
161
167
 
162
168
  /** Begin a session bound to `host`: bump+post dragStart, show the ghost, record the seq. */
163
169
  function startSession(
164
- host: DragHost,
170
+ host: HostState,
165
171
  src: DragSrcKind,
166
- srcData: Record<string, unknown>,
172
+ srcData: ElementDragPayload["data"],
167
173
  ): CoordSession {
168
174
  const seq = beginDragSession(host, src, srcData);
169
175
  // The label names a node in the TARGET pane's document — `host` is the artboard the cursor is
@@ -180,7 +186,7 @@ function startSession(
180
186
  * new panel's iframe drives the rest.
181
187
  * - No host (inside→outside) → dragEnd the old + unbind; the ghost keeps following off-canvas.
182
188
  */
183
- function sessionDrag(session: CoordSession, cursor: Cursor): void {
189
+ function sessionDrag(session: CoordSession, cursor: ViewportPoint): void {
184
190
  moveDragGhost(cursor.x, cursor.y);
185
191
  const target = liveDragHostAt(cursor);
186
192
  if (target === session.host) {
@@ -212,7 +218,7 @@ function sessionDrag(session: CoordSession, cursor: Cursor): void {
212
218
  * the affordances if no reply arrives (iframe reloaded mid-drag). Drops off-canvas release retained
213
219
  * data.
214
220
  */
215
- function sessionDrop(session: CoordSession, cursor: Cursor): void {
221
+ function sessionDrop(session: CoordSession, cursor: ViewportPoint): void {
216
222
  const target = liveDragHostAt(cursor);
217
223
  // Migrate first if the drop landed on a different panel than the last move bound.
218
224
  if (target && target !== session.host) {
@@ -281,7 +287,7 @@ export function registerCanvasDndBridge(): () => void {
281
287
  let session: CoordSession | null = null;
282
288
  // The in-flight pragmatic source (set in onDragStart, cleared in onDrop) so a nativeDragEnter can
283
289
  // Bind a session for a drag whose cursor entered an iframe before the parent ever bound a host.
284
- let pending: { src: DragSrcKind; srcData: Record<string, unknown> } | null = null;
290
+ let pending: Pick<CoordSession, "src" | "srcData"> | null = null;
285
291
 
286
292
  // Bind/migrate the live pragmatic session when its NATIVE stream enters an unclaimed iframe:
287
293
  // Chromium delivers dragover to the frame under the cursor, so a drag from the palette/layers
@@ -353,7 +359,8 @@ export function registerCanvasDndBridge(): () => void {
353
359
  return;
354
360
  }
355
361
  pending = null;
356
- const cursor = location.current.input ? cursorOf(location) : { x: 0, y: 0 };
362
+ // Pragmatic's DragLocation always carries an `input`, cancelled drags included.
363
+ const cursor = cursorOf(location);
357
364
  if (!session) {
358
365
  // Never bound a host (dropped off every canvas) — just hide the ghost; nothing to apply.
359
366
  clearDragGhost();
@@ -2,6 +2,15 @@
2
2
  // ─── Data Explorer ──────────────────────────────────────────────────────────
3
3
 
4
4
  import { nothing } from "lit-html";
5
+ import {
6
+ isBigInt,
7
+ isBoolean,
8
+ isFunction,
9
+ isNonNullObject,
10
+ isNumber,
11
+ isString,
12
+ isSymbol,
13
+ } from "@jxsuite/schema/guards";
5
14
  import { activeTab } from "../workspace/workspace";
6
15
  import { booleanArg, stringArg, stringProperty } from "../commands/command-args";
7
16
  import { renderDataTreeSurface } from "../surfaces/panel-data";
@@ -9,6 +18,8 @@ import { registerPanel } from "./panel-registry";
9
18
  import type { PanelBody } from "./panel-registry";
10
19
  import type { DataTreeRow } from "../surfaces/panel-data";
11
20
  import type { AnyCommand, CommandRegistry } from "../commands/registry";
21
+ import type { CommandArgValues } from "../commands/command-args";
22
+ import type { ScopeRecord, ScopeValue } from "../editor/merge-tags";
12
23
 
13
24
  /**
14
25
  * The focused tab's expansion record, created on first write.
@@ -22,7 +33,7 @@ function rowsUi(): Record<string, boolean> | null {
22
33
  if (!ui) {
23
34
  return null;
24
35
  }
25
- return (ui.dataRows ??= {});
36
+ return ui.dataRows;
26
37
  }
27
38
 
28
39
  /*
@@ -44,7 +55,7 @@ function limitsUi(): Record<string, number> | null {
44
55
  if (!ui) {
45
56
  return null;
46
57
  }
47
- return (ui.dataLimits ??= {});
58
+ return ui.dataLimits;
48
59
  }
49
60
 
50
61
  /** The cap for one marker: the default, plus whatever the reader has asked for. */
@@ -89,34 +100,60 @@ function moreRow(
89
100
  };
90
101
  }
91
102
 
92
- /** A value as the tree prints it, capped at `max` characters. `undefined` prints as nothing. */
93
- function valueText(value: unknown, max: number): string {
94
- if (typeof value === "string" && value.length > max) {
103
+ /**
104
+ * A value as the tree prints it, capped at `max` characters. `undefined` prints as nothing, and so
105
+ * do a function and a symbol: those are the values `JSON.stringify` answers with no text at all.
106
+ */
107
+ function valueText(value: ScopeValue, max: number): string {
108
+ if (isString(value) && value.length > max) {
95
109
  return `"${value.slice(0, max)}…"`;
96
110
  }
97
- return JSON.stringify(value) ?? "";
111
+ return value === undefined || isFunction(value) || isSymbol(value) ? "" : JSON.stringify(value);
112
+ }
113
+
114
+ /** Each primitive kind, in the spelling `typeof` gives it, with the guard that establishes it. */
115
+ const PRIMITIVE_KINDS: readonly (readonly [string, (value: ScopeValue) => boolean])[] = [
116
+ ["string", isString],
117
+ ["number", isNumber],
118
+ ["boolean", isBoolean],
119
+ ["bigint", isBigInt],
120
+ ["symbol", isSymbol],
121
+ ["function", isFunction],
122
+ ];
123
+
124
+ /** The `typeof` name of a value that is neither `null` nor an object. */
125
+ function primitiveKind(value: ScopeValue): string {
126
+ return PRIMITIVE_KINDS.find(([, test]) => test(value))?.[0] ?? "undefined";
98
127
  }
99
128
 
100
129
  /** Which colour a value takes. `null` and a summary label are the two the tree actually paints. */
101
- function toneOf(value: unknown): string {
102
- return value === null ? "null" : typeof value;
130
+ function toneOf(value: ScopeValue): string {
131
+ return value === null ? "null" : primitiveKind(value);
132
+ }
133
+
134
+ /**
135
+ * A value the tree can open: an array or a record. `isNonNullObject` is a `typeof "object"` test,
136
+ * so it already refuses a function; this predicate is what tells the type checker so.
137
+ */
138
+ function isOpenable(value: ScopeValue): value is ScopeValue[] | ScopeRecord {
139
+ return isNonNullObject(value);
103
140
  }
104
141
 
105
142
  /** `Array(3)` or `{2}` — what a value you can open says while it is closed. */
106
- function summaryLabel(value: object): string {
143
+ function summaryLabel(value: ScopeValue[] | ScopeRecord): string {
107
144
  return Array.isArray(value) ? `Array(${value.length})` : `{${Object.keys(value).length}}`;
108
145
  }
109
146
 
110
147
  /** Unwrap a Vue ref (has .value and .__v_isRef) to get the underlying value. */
111
- export function unwrapSignal(value: unknown) {
112
- if (value && typeof value === "object" && (value as Record<string, unknown>).__v_isRef) {
113
- return (value as Record<string, unknown>).value;
148
+ export function unwrapSignal(value: ScopeValue): ScopeValue {
149
+ if (isOpenable(value) && !Array.isArray(value) && value.__v_isRef) {
150
+ return value.value;
114
151
  }
115
152
  return value;
116
153
  }
117
154
 
118
155
  /** Type label for a signal value in the data explorer. */
119
- export function dataTypeLabel(value: unknown) {
156
+ export function dataTypeLabel(value: ScopeValue): string {
120
157
  const v = unwrapSignal(value);
121
158
  if (v === null) {
122
159
  return "null";
@@ -127,10 +164,10 @@ export function dataTypeLabel(value: unknown) {
127
164
  if (Array.isArray(v)) {
128
165
  return `Array(${v.length})`;
129
166
  }
130
- if (typeof v === "object") {
167
+ if (isOpenable(v)) {
131
168
  return `{${Object.keys(v).length}}`;
132
169
  }
133
- return typeof v;
170
+ return primitiveKind(v);
134
171
  }
135
172
 
136
173
  /* THE VALUE LIST IS GONE, AND ITS ROWS ARE THE DEFINITION ROWS — `panels/signals-panel.ts`.
@@ -148,14 +185,14 @@ export function dataTypeLabel(value: unknown) {
148
185
  * each carry their own indent. Nothing else changed: the caps are the same caps, the text is
149
186
  * truncated at the same lengths, and a capped list still ends in a marker.
150
187
  *
151
- * @param {unknown} value The resolved value to read.
188
+ * @param {ScopeValue} value The resolved value to read.
152
189
  * @param {number} depth How deep this call already is; the indent is derived from it.
153
190
  * @param {number} [maxDepth] The default depth cap, before whatever the reader has raised.
154
191
  * @param {string} path This subtree's path, which is what a raised limit is remembered against.
155
192
  * @returns {DataTreeRow[]}
156
193
  */
157
194
  export function dataTreeRows(
158
- value: unknown,
195
+ value: ScopeValue,
159
196
  depth: number,
160
197
  maxDepth = 5,
161
198
  path = "",
@@ -182,21 +219,21 @@ export function dataTreeRows(
182
219
  if (value === null || value === undefined) {
183
220
  return [row("", String(value), "null", path)];
184
221
  }
185
- if (typeof value !== "object") {
222
+ if (!isOpenable(value)) {
186
223
  return [row("", valueText(value, 200), toneOf(value), path)];
187
224
  }
188
225
 
189
226
  const array = Array.isArray(value);
190
- const entries: [string, string, unknown][] = array
227
+ const entries: [string, string, ScopeValue][] = array
191
228
  ? value.map((item, i) => [`${i}`, `[${i}] `, item])
192
- : Object.keys(value).map((key) => [key, `${key}: `, (value as Record<string, unknown>)[key]]);
229
+ : Object.keys(value).map((key) => [key, `${key}: `, value[key]]);
193
230
  const limit = array ? "items" : "keys";
194
231
  const cap = capFor(path, limit, array ? 20 : 30);
195
232
 
196
233
  const rows: DataTreeRow[] = [];
197
234
  for (const [segment, label, item] of entries.slice(0, cap)) {
198
235
  const childPath = `${path}/${segment}`;
199
- if (item === null || item === undefined || typeof item !== "object") {
236
+ if (!isOpenable(item)) {
200
237
  rows.push(row(label, valueText(item, 80), toneOf(item), childPath));
201
238
  continue;
202
239
  }
@@ -222,14 +259,14 @@ export function dataTreeRows(
222
259
  * repaint instead of this sweeping per host.
223
260
  *
224
261
  * @param {HTMLElement} host The node the tree is drawn into.
225
- * @param {unknown} value What the canvas resolved this entry to.
262
+ * @param {ScopeValue} value What the canvas resolved this entry to.
226
263
  * @param {string} path The subtree's path, which is what a raised limit is remembered against.
227
264
  * @param {() => void} rerender Repaint the panel, so that a raised limit is drawn.
228
265
  * @param {number} [maxDepth] The default depth cap, before whatever the reader has raised.
229
266
  */
230
267
  export function paintDataTree(
231
268
  host: HTMLElement,
232
- value: unknown,
269
+ value: ScopeValue,
233
270
  path: string,
234
271
  rerender: () => void,
235
272
  maxDepth = 5,
@@ -327,7 +364,7 @@ export function dataExplorerCommands(deps: DataExplorerCommandDeps): AnyCommand[
327
364
  group: "5_data",
328
365
  requires: "an open document that defines data",
329
366
  when: (ctx) => ctx.document.open,
330
- run: (_commandCtx, args) => {
367
+ run: (_commandCtx, args: CommandArgValues) => {
331
368
  const name = stringArg("data.expandRow", args, "name");
332
369
  const defined = definedDataNames();
333
370
  if (!defined.includes(name)) {
@@ -336,7 +373,7 @@ export function dataExplorerCommands(deps: DataExplorerCommandDeps): AnyCommand[
336
373
  `document — it defines: ${defined.length > 0 ? defined.join(", ") : "nothing"}`,
337
374
  );
338
375
  }
339
- const { expanded } = args as { expanded?: unknown };
376
+ const { expanded } = args;
340
377
  // `expanded` defaults to true but is never COERCED: `{ expanded: "no" }` would otherwise
341
378
  // Read as a collapse, which is the class of silent wrong answer this whole record exists
342
379
  // To stop.
@@ -26,7 +26,7 @@ import { openGridSourcePicker } from "../grid/grid-open";
26
26
  import type { DataActionsSurfaceHandle, DataActionsView } from "../surfaces/data-actions";
27
27
  import type { DialogSurfaceHandle } from "../surfaces/dialog";
28
28
  import type { PushPlanSurfaceHandle, PushPlanView } from "../surfaces/push-plan";
29
- import type { DataConnectionTestResult, DataPushResult } from "../types";
29
+ import type { DataConnectionTestResult, DataPushRequest, DataPushResult } from "../types";
30
30
  import type { SectionActionsContext } from "../settings/contributed-section";
31
31
 
32
32
  // ─── Grid opening (delegates to the grid-tab source picker) ──────────────────
@@ -75,7 +75,7 @@ function noteRows(texts: readonly string[], prefix: string) {
75
75
  }
76
76
 
77
77
  /** What the body lists: the dry run until it has been applied, then what actually happened. */
78
- function planView(state: PushDialogState): PushPlanView {
78
+ function planView(state: Pick<PushDialogState, "dryRun" | "phase" | "result">): PushPlanView {
79
79
  const shown = state.phase === "done" ? state.result : state.dryRun;
80
80
  return {
81
81
  errors: noteRows(shown?.errors ?? [], "error"),
@@ -129,27 +129,28 @@ export async function startPush(connection: string | undefined, onDone: () => vo
129
129
  if (pushDialog) {
130
130
  return;
131
131
  }
132
- const state: PushDialogState = {
132
+ /* The dialog's callbacks need the state record and the record needs the dialog's handle, so the
133
+ record is built first and completed with the handle below; it stays one object throughout. */
134
+ const pending: Omit<PushDialogState, "handle"> = {
133
135
  connection,
134
136
  dryRun: null,
135
- handle: null as unknown as DialogSurfaceHandle,
136
137
  onDone,
137
138
  phase: "loading",
138
139
  plan: null,
139
140
  result: null,
140
141
  };
141
- state.handle = openDialogSurface({
142
+ const handle = openDialogSurface({
142
143
  cancelLabel: "Cancel",
143
144
  confirmLabel: "",
144
145
  headline: connection ? `Push Schema — ${connection}` : "Push Schema",
145
146
  island: (host) => {
146
- state.plan = mountPushPlanSurface(host, planView(state));
147
+ pending.plan = mountPushPlanSurface(host, planView(pending));
147
148
  },
148
149
  layer: layerHost("dialog"),
149
150
  message: "Compiling plan…",
150
151
  onCancel: closePushDialog,
151
152
  onClosed: () => {
152
- if (pushDialog === state) {
153
+ if (pushDialog === pending) {
153
154
  closePushDialog();
154
155
  }
155
156
  },
@@ -158,12 +159,14 @@ export async function startPush(connection: string | undefined, onDone: () => vo
158
159
  },
159
160
  region: "data/push",
160
161
  });
162
+ const state: PushDialogState = Object.assign(pending, { handle });
161
163
  pushDialog = state;
162
164
 
163
- const plan = await pushSchema({
164
- dryRun: true,
165
- ...(connection === undefined ? {} : { connection }),
166
- });
165
+ const request: DataPushRequest = { dryRun: true };
166
+ if (connection !== undefined) {
167
+ request.connection = connection;
168
+ }
169
+ const plan = await pushSchema(request);
167
170
  if (pushDialog !== state) {
168
171
  return;
169
172
  }