@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
@@ -20,7 +20,6 @@
20
20
  * @docs studio/interface/canvas
21
21
  * @docs studio/interface/preferences
22
22
  */
23
- import type { JxDocument } from "@jxsuite/schema/types";
24
23
  import type { JxScope } from "@jxsuite/runtime/types";
25
24
  import { ensureCaret } from "@jxsuite/ui/behaviors/menu";
26
25
  import { reactive } from "../reactivity";
@@ -29,7 +28,7 @@ import { mountSurface, registerSurface } from "../ui/surface";
29
28
  import { rectOf } from "../utils/geometry";
30
29
  import menuDoc from "./menu.json";
31
30
 
32
- registerSurface("menu", menuDoc as unknown as JxDocument);
31
+ registerSurface("menu", menuDoc);
33
32
 
34
33
  /**
35
34
  * What a row prints: a projection of one command record, decided by the adapter that opens the
@@ -65,12 +64,12 @@ export interface OpenMenuOptions {
65
64
  /** The menu's accessible name. */
66
65
  label: string;
67
66
  /** Where the panel opens, in viewport pixels, when `place` is not given. */
68
- origin?: { x: number; y: number };
67
+ origin?: ViewportPoint;
69
68
  /**
70
69
  * Where the panel opens as a function of its measured box: run once the popover is shown and
71
70
  * again a frame later, so a menu that hangs off a control can put its bottom flush with a floor.
72
71
  */
73
- place?: (box: DOMRect) => { x: number; y: number };
72
+ place?: (box: DOMRect) => ViewportPoint;
74
73
  /** The lowest edge the menu and its submenus may reach; the viewport by default. */
75
74
  floor?: () => number;
76
75
  /**
@@ -113,6 +112,12 @@ export interface MenuHandle {
113
112
  readonly setRows: (rows: readonly MenuRowProjection[]) => void;
114
113
  }
115
114
 
115
+ /** A point in viewport pixels: where a floating panel's corner sits. */
116
+ export interface ViewportPoint {
117
+ x: number;
118
+ y: number;
119
+ }
120
+
116
121
  type MenuElement = HTMLElement & {
117
122
  open?: boolean;
118
123
  x?: number;
@@ -140,7 +145,7 @@ type ProjectedRow = Omit<
140
145
  };
141
146
 
142
147
  /** The scope shape `menu.json` reads. */
143
- interface MenuScope extends Record<string, unknown> {
148
+ interface MenuScope {
144
149
  rows: ProjectedRow[];
145
150
  label: string;
146
151
  x: number;
@@ -167,7 +172,7 @@ export function placementOf(
167
172
  * Where a menu with no coordinates of its own opens on an engine that cannot anchor it: below its
168
173
  * opener, leading edges aligned — the same corner the placement names.
169
174
  */
170
- function belowOpener(opener: HTMLElement | null | undefined): { x: number; y: number } {
175
+ function belowOpener(opener: HTMLElement | null | undefined): ViewportPoint {
171
176
  if (!opener) {
172
177
  return { x: 0, y: 0 };
173
178
  }
@@ -205,17 +210,6 @@ function rowById(rows: readonly ProjectedRow[], id: string): ProjectedRow | unde
205
210
  return undefined;
206
211
  }
207
212
 
208
- const ZERO_BOX = {
209
- bottom: 0,
210
- height: 0,
211
- left: 0,
212
- right: 0,
213
- top: 0,
214
- width: 0,
215
- x: 0,
216
- y: 0,
217
- } as DOMRect;
218
-
219
213
  /**
220
214
  * Open a menu.
221
215
  *
@@ -242,15 +236,20 @@ export function openMenu(options: OpenMenuOptions): MenuHandle {
242
236
  options.onClosed?.(handle);
243
237
  };
244
238
 
239
+ /* `place` is first asked before anything is laid out, so it is handed an empty box: a real
240
+ `DOMRect` whose every edge and dimension is zero. */
245
241
  const initial = options.place
246
- ? options.place(ZERO_BOX)
242
+ ? options.place(new DOMRect())
247
243
  : (options.origin ?? belowOpener(options.opener));
248
- const scope: MenuScope = reactive({
244
+ const scope: MenuScope = reactive<MenuScope>({
249
245
  floor: options.floor?.() ?? 0,
250
246
  label: options.label,
251
247
  placement: placementOf(options),
252
248
  rows: options.rows.map((row) => project(row)),
253
249
  select: (_scope: JxScope, event: Event) => {
250
+ /* SAFETY: `menu.json` binds this handler to `onselect` alone, and a row's `select` is raised
251
+ by the runtime's `dispatchEvent` statement in `jx-menu-item.json`, which always constructs
252
+ a `CustomEvent` whose `detail` is the row's value. */
254
253
  const id = String((event as CustomEvent).detail);
255
254
  const row = rowById(scope.rows, id);
256
255
  if (!row) {
@@ -267,7 +266,7 @@ export function openMenu(options: OpenMenuOptions): MenuHandle {
267
266
  },
268
267
  x: initial.x,
269
268
  y: initial.y,
270
- }) as MenuScope;
269
+ });
271
270
 
272
271
  /** Put the panel where `place` says, from its box as laid out now. */
273
272
  const place = (): void => {
@@ -279,18 +278,25 @@ export function openMenu(options: OpenMenuOptions): MenuHandle {
279
278
  scope.y = at.y;
280
279
  };
281
280
 
281
+ /* Read through a call, not the property path: `close()` can abort the controller while the menu
282
+ is awaiting `jx-ready`, and a direct test after that `await` would be narrowed to the value the
283
+ test before it saw. */
284
+ const aborted = (): boolean => controller.signal.aborted;
285
+
282
286
  const ready = (async () => {
283
287
  const mounted = await mountSurface("menu", scope, slot, { signal: controller.signal });
284
- if (controller.signal.aborted) {
288
+ if (aborted()) {
285
289
  // Closed before the document finished mounting; the runtime already disposed it.
286
290
  return;
287
291
  }
288
292
  ({ dispose } = mounted);
289
293
  // The document's root IS the menu, and a custom element connects asynchronously: `jx-ready` is
290
294
  // The menu saying its `popover` attribute is on and it may be shown.
295
+ // SAFETY: `menu.json`'s root definition carries `tagName: "jx-menu"`, so the mounted root is
296
+ // The kit's menu element, which reflects `open`, `x` and `y` and inherits `showPopover`.
291
297
  menu = mounted.root as MenuElement;
292
298
  menu.addEventListener("toggle", (event) => {
293
- if ((event as { newState?: string }).newState === "closed") {
299
+ if (event.newState === "closed") {
294
300
  finish();
295
301
  }
296
302
  });
@@ -299,7 +305,7 @@ export function openMenu(options: OpenMenuOptions): MenuHandle {
299
305
  menu!.addEventListener("jx-ready", () => resolve(), { once: true });
300
306
  });
301
307
  }
302
- if (controller.signal.aborted) {
308
+ if (aborted()) {
303
309
  return;
304
310
  }
305
311
  const source =
@@ -16,14 +16,15 @@
16
16
  * @docs studio/interface
17
17
  */
18
18
 
19
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
19
20
  import { reactive } from "../reactivity";
20
21
  import { mountSurface, registerSurface } from "../ui/surface";
21
22
  import navigatorDockDoc from "./navigator-dock.json";
22
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
23
+ import type { JsonObject, JxElement } from "@jxsuite/schema/types";
23
24
  import type { JxScope } from "@jxsuite/runtime/types";
24
25
  import type { SurfaceHandle } from "../ui/surface";
25
26
 
26
- registerSurface("navigator-dock", navigatorDockDoc as unknown as JxDocument);
27
+ registerSurface("navigator-dock", navigatorDockDoc);
27
28
 
28
29
  /** The panel showing, as the document draws it. */
29
30
  export interface NavigatorPanelView {
@@ -65,19 +66,17 @@ export interface NavigatorDockHandle {
65
66
  dispose: () => void;
66
67
  }
67
68
 
68
- interface NavigatorDockScope extends Record<string, unknown>, NavigatorDockValues {}
69
-
70
69
  /** The `part` a node was declared with, or the empty string. */
71
70
  function partOf(def: JxElement | string): string {
72
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
73
- return typeof part === "string" ? part : "";
71
+ const part = isString(def) ? undefined : def.attributes?.["part"];
72
+ return isString(part) ? part : "";
74
73
  }
75
74
 
76
75
  /** The `$map` item a node was rendered inside, if it was rendered inside one. */
77
- function mapItem(state: JxScope | undefined): Record<string, unknown> | null {
78
- const map = state?.["$map"] as { item?: unknown } | undefined;
79
- const item = map?.item;
80
- return item !== null && typeof item === "object" ? (item as Record<string, unknown>) : null;
76
+ function mapItem(state: JxScope | undefined): JsonObject | null {
77
+ const map = state?.["$map"];
78
+ const item = isJsonObject(map) ? map["item"] : undefined;
79
+ return isJsonObject(item) ? item : null;
81
80
  }
82
81
 
83
82
  /**
@@ -91,7 +90,7 @@ export function mountNavigatorDock(
91
90
  values: NavigatorDockValues,
92
91
  options: NavigatorDockOptions,
93
92
  ): NavigatorDockHandle {
94
- const scope = reactive<NavigatorDockScope>({ panels: values.panels }) as NavigatorDockScope;
93
+ const scope: NavigatorDockValues = reactive<NavigatorDockValues>({ panels: values.panels });
95
94
 
96
95
  container.textContent = "";
97
96
  // @ts-expect-error -- _$litPart$ is lit's private render-part marker, not in the DOM types
@@ -105,7 +104,7 @@ export function mountNavigatorDock(
105
104
  return;
106
105
  }
107
106
  const key = mapItem(state)?.["key"];
108
- if (typeof key === "string") {
107
+ if (isString(key)) {
109
108
  options.onContent(key, element);
110
109
  }
111
110
  },
@@ -31,22 +31,17 @@
31
31
  * @docs studio/projects/create
32
32
  */
33
33
 
34
+ import { isString } from "@jxsuite/schema/guards";
34
35
  import { reactive } from "../reactivity";
35
36
  import { mountSurface, registerSurface } from "../ui/surface";
36
37
  import { overlayRegion, REGION_ATTR } from "../ui/regions";
37
- import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
38
+ import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
38
39
  import { whenReady } from "./dialog";
39
40
  import newProjectDoc from "./new-project.json";
40
- import type { SurfaceHandle } from "../ui/surface";
41
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
41
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
42
+ import type { JxElement } from "@jxsuite/schema/types";
42
43
 
43
- registerSurface("new-project", newProjectDoc as unknown as JxDocument);
44
-
45
- /** One row of a kit `jx-select`, and of the tab strip: a value and what it reads. */
46
- export interface NewProjectRow {
47
- value: string;
48
- label: string;
49
- }
44
+ registerSurface("new-project", newProjectDoc);
50
45
 
51
46
  /** One card in the starter gallery — including the one that is not a starter. */
52
47
  export interface NewProjectCard {
@@ -80,7 +75,7 @@ export interface NewProjectView {
80
75
  showTabs: boolean;
81
76
  /** The chosen tab's value, and the strip's rows. */
82
77
  tab: string;
83
- tabs: NewProjectRow[];
78
+ tabs: SurfaceOption[];
84
79
  /** Which body to draw. */
85
80
  body: NewProjectBody;
86
81
  /** The sentence above a closed AI gate: the two tabs ask for the same thing differently. */
@@ -110,10 +105,10 @@ export interface NewProjectView {
110
105
  browsing: boolean;
111
106
  browseLabel: string;
112
107
  owner: string;
113
- owners: NewProjectRow[];
108
+ owners: SurfaceOption[];
114
109
  /** `"private"` or `"public"` — a value rather than a flag, because a select holds one. */
115
110
  visibility: string;
116
- visibilities: NewProjectRow[];
111
+ visibilities: SurfaceOption[];
117
112
  /** The owner already has a repository of this name. Empty says nothing. */
118
113
  repoTaken: string;
119
114
  /** `Creates` or `Repository`, and the destination itself. */
@@ -127,12 +122,12 @@ export interface NewProjectView {
127
122
  maxDepth: string;
128
123
  maxPages: string;
129
124
  breakpointMode: string;
130
- breakpointModes: NewProjectRow[];
125
+ breakpointModes: SurfaceOption[];
131
126
  breakpointCount: string;
132
127
  maxBreakpoints: string;
133
128
  breakpointWidths: string;
134
129
  breakpointRounding: string;
135
- roundings: NewProjectRow[];
130
+ roundings: SurfaceOption[];
136
131
  /** What the chosen mode says will happen. */
137
132
  breakpointHint: string;
138
133
  aiNaming: boolean;
@@ -233,8 +228,7 @@ interface NewProjectFlags {
233
228
  hasInstallUrl: boolean;
234
229
  }
235
230
 
236
- interface NewProjectScope
237
- extends Record<string, unknown>, NewProjectView, NewProjectFlags, NewProjectActions {}
231
+ interface NewProjectScope extends NewProjectView, NewProjectFlags, NewProjectActions {}
238
232
 
239
233
  /** The view plus the flags the document renders from. */
240
234
  function derive(view: NewProjectView): NewProjectView & NewProjectFlags {
@@ -260,8 +254,8 @@ function derive(view: NewProjectView): NewProjectView & NewProjectFlags {
260
254
 
261
255
  /** A node's authored `part`, which is how an island announces which one it is. */
262
256
  function partOf(def: JxElement | string): string {
263
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
264
- return typeof part === "string" ? part : "";
257
+ const part = isString(def) ? undefined : def.attributes?.["part"];
258
+ return isString(part) ? part : "";
265
259
  }
266
260
 
267
261
  /**
@@ -294,6 +288,10 @@ export function openNewProjectSurface(options: NewProjectSurfaceOptions): NewPro
294
288
  closed = true;
295
289
  options.actions.closed();
296
290
  };
291
+ /* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
292
+ element, and a direct `closed` test after that `await` would be narrowed to the value the test
293
+ before it saw. */
294
+ const isClosed = (): boolean => closed;
297
295
 
298
296
  /** The island boxes the document has announced, by part. Replaced as the bodies come and go. */
299
297
  const boxes = new Map<string, HTMLElement>();
@@ -325,14 +323,14 @@ export function openNewProjectSurface(options: NewProjectSurfaceOptions): NewPro
325
323
  }
326
324
  };
327
325
 
328
- const scope = reactive({
326
+ const scope: NewProjectScope = reactive<NewProjectScope>({
329
327
  ...derive(options.view),
330
328
  ...options.actions,
331
329
  browse: () => {
332
330
  options.actions.browse();
333
331
  },
334
332
  closed: finish,
335
- }) as NewProjectScope;
333
+ });
336
334
 
337
335
  let mounted: SurfaceHandle | null = null;
338
336
  const ready = mountSurface("new-project", scope, slot, {
@@ -345,13 +343,16 @@ export function openNewProjectSurface(options: NewProjectSurfaceOptions): NewPro
345
343
  },
346
344
  }).then(async (surface) => {
347
345
  mounted = surface;
346
+ /* SAFETY: `new-project.json`'s root definition carries `tagName: "jx-dialog"`, so the runtime
347
+ mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare
348
+ string. */
348
349
  const element = surface.root as HTMLElement;
349
- if (closed) {
350
+ if (isClosed()) {
350
351
  surface.dispose();
351
352
  return element;
352
353
  }
353
354
  await whenReady(element);
354
- if (closed) {
355
+ if (isClosed()) {
355
356
  return element;
356
357
  }
357
358
  /* The region goes on the platform's own `<dialog>`, which is the one element here that HAS a
@@ -375,7 +376,7 @@ export function openNewProjectSurface(options: NewProjectSurfaceOptions): NewPro
375
376
  const element = mounted?.root;
376
377
  if (element instanceof HTMLElement) {
377
378
  // The platform's close first, so focus goes back where it came from; then the document.
378
- closeDialog(element);
379
+ close(element);
379
380
  }
380
381
  // A mount that has not landed yet is disposed by `ready` when it does — `finish` tells it so.
381
382
  mounted?.dispose();
@@ -394,8 +395,8 @@ export function openNewProjectSurface(options: NewProjectSurfaceOptions): NewPro
394
395
  move. Measurement and a focus move are the two imperative things a surface may still do
395
396
  (ui.md §2 rule 5). */
396
397
  requestAnimationFrame(() => {
397
- element.querySelector('[part="dialog"]')?.scrollTo?.(0, 0);
398
- element.querySelector<HTMLElement>('[part="name"] [part="input"]')?.focus?.();
398
+ element.querySelector('[part="dialog"]')?.scrollTo(0, 0);
399
+ element.querySelector<HTMLElement>('[part="name"] [part="input"]')?.focus();
399
400
  });
400
401
  },
401
402
  host: slot,
@@ -28,21 +28,17 @@
28
28
  * @docs studio/interface/tabs
29
29
  */
30
30
 
31
- import { close as closePopover, openAt } from "@jxsuite/ui/behaviors/popover";
31
+ import { close, openAt } from "@jxsuite/ui/behaviors/popover";
32
+ import { isString } from "@jxsuite/schema/guards";
32
33
  import { reactive } from "../reactivity";
33
34
  import { mountSurface, registerSurface } from "../ui/surface";
34
35
  import { rectOf } from "../utils/geometry";
35
36
  import paneContextDoc from "./pane-context.json";
36
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
37
- import type { SurfaceHandle } from "../ui/surface";
37
+ import type { JxElement } from "@jxsuite/schema/types";
38
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
39
+ import type { ViewportPoint } from "./menu";
38
40
 
39
- registerSurface("pane-context", paneContextDoc as unknown as JxDocument);
40
-
41
- /** One row of a `jx-select`: the value it writes and the word it prints. */
42
- export interface PaneContextOption {
43
- value: string;
44
- label: string;
45
- }
41
+ registerSurface("pane-context", paneContextDoc);
46
42
 
47
43
  /**
48
44
  * One segment of a radio group — a size, a scheme, a view, a language.
@@ -74,7 +70,7 @@ export interface PaneContextParam {
74
70
  name: string;
75
71
  label: string;
76
72
  value: string;
77
- options: PaneContextOption[];
73
+ options: SurfaceOption[];
78
74
  }
79
75
 
80
76
  /** One component test prop: a field, and the region id the screenshot pipeline addresses it by. */
@@ -108,7 +104,7 @@ export interface PaneContextView {
108
104
  editorMode: "static" | "picker";
109
105
  editorLabel: string;
110
106
  editorValue: string;
111
- editorOptions: PaneContextOption[];
107
+ editorOptions: SurfaceOption[];
112
108
 
113
109
  viewState: "shown" | "hidden";
114
110
  views: PaneContextChoice[];
@@ -143,7 +139,7 @@ export interface PaneContextView {
143
139
  zoomLabel: string;
144
140
  fitState: "shown" | "hidden";
145
141
  fitValue: string;
146
- fitOptions: PaneContextOption[];
142
+ fitOptions: SurfaceOption[];
147
143
  }
148
144
 
149
145
  /** What a control can ask the pane to do. Every one of them is a decision the flow owns. */
@@ -205,8 +201,7 @@ interface PopoverState {
205
201
  resolvingOpen: boolean;
206
202
  }
207
203
 
208
- interface PaneContextScope
209
- extends Record<string, unknown>, PaneContextView, PaneContextActions, PopoverState {
204
+ interface PaneContextScope extends PaneContextView, PaneContextActions, PopoverState {
210
205
  /** The two panel doors the document calls, which the mount owns rather than the flow. */
211
206
  openContext: (anchor: HTMLElement) => void;
212
207
  openResolving: (anchor: HTMLElement) => void;
@@ -307,8 +302,8 @@ export function emptyPaneContextView(): PaneContextView {
307
302
  * undefined at that moment and the two panels would both be filed under the same empty key.
308
303
  */
309
304
  function attrOf(def: JxElement | string, name: string): string {
310
- const value = typeof def === "string" ? undefined : def.attributes?.[name];
311
- return typeof value === "string" ? value : "";
305
+ const value = isString(def) ? undefined : def.attributes?.[name];
306
+ return isString(value) ? value : "";
312
307
  }
313
308
 
314
309
  /**
@@ -325,7 +320,7 @@ function attrOf(def: JxElement | string, name: string): string {
325
320
  * platform against the trigger it was opened from (ui.md §6) and these coordinates are ignored;
326
321
  * they stand for the engines that cannot.
327
322
  */
328
- function placeBelow(anchor: HTMLElement, panel: HTMLElement | null): { x: number; y: number } {
323
+ function placeBelow(anchor: HTMLElement, panel: HTMLElement | null): ViewportPoint {
329
324
  const box = rectOf(anchor);
330
325
  const width = panel ? rectOf(panel).width : 0;
331
326
  const right = Math.max(0, box.right - width);
@@ -352,7 +347,7 @@ export function mountPaneContextSurface(
352
347
  module finds an invoker from a panel — so two panes mounting this surface under one id would
353
348
  hand the second pane's trigger the first pane's panel. */
354
349
  const uid = `pane-context-${paneId}`;
355
- const scope = reactive<PaneContextScope>({
350
+ const scope: PaneContextScope = reactive<PaneContextScope>({
356
351
  ...emptyPaneContextView(),
357
352
  ...actions,
358
353
  contextOpen: false,
@@ -369,7 +364,7 @@ export function mountPaneContextSurface(
369
364
  resolvingPopoverId: `${uid}-resolving`,
370
365
  resolvingX: 0,
371
366
  resolvingY: 0,
372
- }) as PaneContextScope;
367
+ });
373
368
  project(scope, view);
374
369
 
375
370
  const nodes = new Map<string, HTMLElement>();
@@ -378,7 +373,7 @@ export function mountPaneContextSurface(
378
373
 
379
374
  /** The panel a `data-popover` key names, once the document has drawn it. */
380
375
  const panelOf = (kind: "context" | "resolving"): PopoverElement | null =>
381
- (nodes.get(`popover:${kind}`) as PopoverElement | undefined) ?? null;
376
+ nodes.get(`popover:${kind}`) ?? null;
382
377
 
383
378
  /**
384
379
  * Show a panel from its trigger, positioning it before and after the show.
@@ -391,7 +386,7 @@ export function mountPaneContextSurface(
391
386
  if (!panel) {
392
387
  return;
393
388
  }
394
- const write = (at: { x: number; y: number }): void => {
389
+ const write = (at: ViewportPoint): void => {
395
390
  if (kind === "context") {
396
391
  scope.contextX = at.x;
397
392
  scope.contextY = at.y;
@@ -418,7 +413,7 @@ export function mountPaneContextSurface(
418
413
  }
419
414
  const panel = panelOf(kind);
420
415
  if (panel) {
421
- closePopover(panel);
416
+ close(panel);
422
417
  }
423
418
  };
424
419
 
@@ -454,7 +449,7 @@ export function mountPaneContextSurface(
454
449
  `hidePopover()` queues its toggle: `canvas.setResolvingOpen { open: false }` has to be
455
450
  true of `isResolvingOpen()` on the line after it, not a task later. */
456
451
  element.addEventListener("toggle", (event) => {
457
- const open = (event as Event & { newState?: string }).newState === "open";
452
+ const open = event.newState === "open";
458
453
  if (kind === "context") {
459
454
  scope.contextOpen = open;
460
455
  } else {
@@ -483,7 +478,7 @@ export function mountPaneContextSurface(
483
478
  },
484
479
  /* A mount still in flight has nothing in the host to ask about, and answering "no" would make
485
480
  the next repaint tear down the mount it is waiting for and start a second one. */
486
- connected: () => !disposed && (mounted === null || (mounted.root as Node).parentNode === host),
481
+ connected: () => !disposed && (mounted === null || mounted.root.parentNode === host),
487
482
  dispose() {
488
483
  disposed = true;
489
484
  hidePanel("context");
@@ -23,14 +23,15 @@
23
23
  * @docs studio/interface
24
24
  */
25
25
 
26
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
26
27
  import { reactive } from "../reactivity";
27
28
  import { mountSurface, registerSurface } from "../ui/surface";
28
29
  import paneGridDoc from "./pane-grid.json";
29
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
30
+ import type { JxElement } from "@jxsuite/schema/types";
30
31
  import type { JxScope } from "@jxsuite/runtime/types";
31
32
  import type { SurfaceHandle } from "../ui/surface";
32
33
 
33
- registerSurface("pane-grid", paneGridDoc as unknown as JxDocument);
34
+ registerSurface("pane-grid", paneGridDoc);
34
35
 
35
36
  /**
36
37
  * The `part` a pane's CELL carries.
@@ -80,7 +81,7 @@ const CELL_PARTS: ReadonlyMap<string, PaneCellPart> = new Map([
80
81
  * Every field is a finished value. The document asks no question about a pane — not which index it
81
82
  * is at, not how many there are — so a projection cannot disagree with what is drawn.
82
83
  */
83
- export interface PaneGridRow extends Record<string, unknown> {
84
+ export interface PaneGridRow {
84
85
  /** The pane id. The repeater's key, and what every action is addressed with. */
85
86
  id: string;
86
87
  /** `"shown"` for every row but the first. The `$switch` the leading splitter hangs off. */
@@ -165,7 +166,7 @@ export interface PaneGridSurface {
165
166
  }
166
167
 
167
168
  /** The scope `pane-grid.json` reads. */
168
- interface PaneGridScope extends Record<string, unknown>, PaneGridDragState {
169
+ interface PaneGridScope extends PaneGridDragState {
169
170
  rows: PaneGridRow[];
170
171
  /** `jx-split`'s `value`. */
171
172
  paneSplit: number;
@@ -180,8 +181,8 @@ interface PaneGridScope extends Record<string, unknown>, PaneGridDragState {
180
181
 
181
182
  /** The `part` a node's definition carries, or `""` for a text node or an unmarked element. */
182
183
  function partOf(def: JxElement | string): string {
183
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
184
- return typeof part === "string" ? part : "";
184
+ const part = isString(def) ? undefined : def.attributes?.["part"];
185
+ return isString(part) ? part : "";
185
186
  }
186
187
 
187
188
  /**
@@ -192,8 +193,10 @@ function partOf(def: JxElement | string): string {
192
193
  * object the projection put in `rows`.
193
194
  */
194
195
  function paneOf(state: JxScope | undefined): string {
195
- const row = (state?.["$map"] as { item?: { id?: unknown } } | undefined)?.item;
196
- return typeof row?.id === "string" ? row.id : "";
196
+ const map = state?.["$map"];
197
+ const row = isJsonObject(map) ? map["item"] : undefined;
198
+ const id = isJsonObject(row) ? row["id"] : undefined;
199
+ return isString(id) ? id : "";
197
200
  }
198
201
 
199
202
  /**
@@ -215,7 +218,7 @@ export function mountPaneGridSurface(
215
218
  actions: PaneGridActions,
216
219
  ): PaneGridSurface {
217
220
  host.replaceChildren();
218
- const scope = reactive<PaneGridScope>({
221
+ const scope: PaneGridScope = reactive<PaneGridScope>({
219
222
  armed: false,
220
223
  edgePane: "",
221
224
  move: actions.move,
@@ -226,7 +229,7 @@ export function mountPaneGridSurface(
226
229
  splitGap: split.gap,
227
230
  splitMax: split.max,
228
231
  splitMin: split.min,
229
- }) as PaneGridScope;
232
+ });
230
233
 
231
234
  let mounted: SurfaceHandle | null = null;
232
235
  let disposed = false;
@@ -239,6 +242,8 @@ export function mountPaneGridSurface(
239
242
  onNodeCreated: (element, _path, def, state) => {
240
243
  const cellPart = CELL_PARTS.get(partOf(def));
241
244
  if (cellPart) {
245
+ /* SAFETY: `pane-grid.json` declares no text children and no SVG, so every node carrying
246
+ one of the five cell parts is an HTML element the runtime created from a tagName. */
242
247
  actions.cellPart(paneOf(state), cellPart, element as HTMLElement);
243
248
  }
244
249
  },
@@ -31,10 +31,9 @@ import { effect, effectScope, reactive } from "../reactivity";
31
31
  import { mountSurface, registerSurface } from "../ui/surface";
32
32
  import activityDoc from "./panel-activity.json";
33
33
  import type { EffectScope } from "@vue/reactivity";
34
- import type { JxDocument } from "@jxsuite/schema/types";
35
34
  import type { SurfaceHandle } from "../ui/surface";
36
35
 
37
- registerSurface("panel-activity", activityDoc as unknown as JxDocument);
36
+ registerSurface("panel-activity", activityDoc);
38
37
 
39
38
  /** One declared phase of an operation, as the surface reads it. */
40
39
  export interface ActivityStepView {
@@ -98,7 +97,7 @@ export interface ActivitySurfaceDeps {
98
97
  }
99
98
 
100
99
  /** The scope the document reads: the projection, flattened, beside the three callbacks. */
101
- interface ActivityScope extends Record<string, unknown> {
100
+ interface ActivityScope {
102
101
  rows: ActivityRowView[];
103
102
  hasRows: boolean;
104
103
  hasFinished: boolean;
@@ -127,7 +126,7 @@ function standingIn(container: HTMLElement): boolean {
127
126
  return false;
128
127
  }
129
128
  // Still mounting into this very container: a second call must not start a second mount.
130
- return _handle === null ? _mount !== null : (_handle.root as Node).parentNode === container;
129
+ return _handle === null ? _mount !== null : _handle.root.parentNode === container;
131
130
  }
132
131
 
133
132
  /**
@@ -142,7 +141,7 @@ export function mountActivitySurface(container: HTMLElement, deps: ActivitySurfa
142
141
  }
143
142
  disposeActivitySurface();
144
143
  _container = container;
145
- const scope = reactive<ActivityScope>({
144
+ const scope: ActivityScope = reactive<ActivityScope>({
146
145
  cancel: deps.cancel,
147
146
  clearFinished: deps.clearFinished,
148
147
  clearLabel: "",
@@ -150,7 +149,7 @@ export function mountActivitySurface(container: HTMLElement, deps: ActivitySurfa
150
149
  hasRows: false,
151
150
  rows: [],
152
151
  toggleLog: deps.toggleLog,
153
- }) as ActivityScope;
152
+ });
154
153
  _scope = effectScope();
155
154
  _scope.run(() => {
156
155
  effect(() => {
@@ -22,10 +22,9 @@
22
22
  import { reactive } from "../reactivity";
23
23
  import { mountSurface, registerSurface } from "../ui/surface";
24
24
  import dataTreeDoc from "./panel-data.json";
25
- import type { JxDocument } from "@jxsuite/schema/types";
26
25
  import type { SurfaceHandle } from "../ui/surface";
27
26
 
28
- registerSurface("panel-data", dataTreeDoc as unknown as JxDocument);
27
+ registerSurface("panel-data", dataTreeDoc);
29
28
 
30
29
  /**
31
30
  * One line of a value tree, as the document reads it.
@@ -69,7 +68,7 @@ export interface DataTreeActions {
69
68
  }
70
69
 
71
70
  /** The scope the document reads. */
72
- interface DataTreeScope extends Record<string, unknown>, DataTreeActions {
71
+ interface DataTreeScope extends DataTreeActions {
73
72
  rows: DataTreeRow[];
74
73
  }
75
74
 
@@ -113,7 +112,7 @@ export function renderDataTreeSurface(
113
112
  }
114
113
  takeDown(host, existing);
115
114
  host.textContent = "";
116
- const scope = reactive({ rows, showMore: actions.showMore }) as DataTreeScope;
115
+ const scope: DataTreeScope = reactive<DataTreeScope>({ rows, showMore: actions.showMore });
117
116
  const record: Mounted = { disposed: false, handle: null, scope };
118
117
  mounts.set(host, record);
119
118
  /* No race to arbitrate: a repaint arriving while this is in flight takes the branch above — a