@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
@@ -29,15 +29,16 @@
29
29
  * @docs studio/editing/writing
30
30
  */
31
31
 
32
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
32
33
  import { reactive } from "../reactivity";
33
34
  import { mountSurface, registerSurface } from "../ui/surface";
34
35
  import blockActionBarDoc from "./block-action-bar.json";
35
36
 
36
37
  import type { JxScope } from "@jxsuite/runtime/types";
37
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
38
+ import type { JxElement } from "@jxsuite/schema/types";
38
39
  import { rectOf } from "../utils/geometry";
39
40
 
40
- registerSurface("block-action-bar", blockActionBarDoc as unknown as JxDocument);
41
+ registerSurface("block-action-bar", blockActionBarDoc);
41
42
 
42
43
  /** One button, already decided: what it is called, what it draws, and why it cannot act. */
43
44
  export interface BlockBarTool {
@@ -116,7 +117,7 @@ export interface BlockBarActions {
116
117
  }
117
118
 
118
119
  /** The scope `block-action-bar.json` reads. */
119
- interface BlockBarScope extends BlockBarView, Record<string, unknown> {
120
+ interface BlockBarScope extends BlockBarView {
120
121
  linkValue: string;
121
122
  linkExisting: boolean;
122
123
  linkApplyLabel: string;
@@ -167,8 +168,8 @@ export function emptyBlockBarView(): BlockBarView {
167
168
 
168
169
  /** A node definition's `part`, as written in the document. */
169
170
  function partOf(def: JxElement | string): string {
170
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
171
- return typeof part === "string" ? part : "";
171
+ const part = isString(def) ? undefined : def.attributes?.["part"];
172
+ return isString(part) ? part : "";
172
173
  }
173
174
 
174
175
  /**
@@ -180,9 +181,10 @@ function partOf(def: JxElement | string): string {
180
181
  * same shape `surfaces/schema-form.ts` and `surfaces/properties-panel.ts` use.
181
182
  */
182
183
  function commandIdOf(state: JxScope | undefined): string {
183
- const item = (state?.["$map"] as { item?: Record<string, unknown> } | undefined)?.item;
184
- const id = item?.["id"];
185
- return typeof id === "string" ? id : "";
184
+ const map = state?.["$map"];
185
+ const item = isJsonObject(map) ? map["item"] : undefined;
186
+ const id = isJsonObject(item) ? item["id"] : undefined;
187
+ return isString(id) ? id : "";
186
188
  }
187
189
 
188
190
  /** The bar's mounted surface, and every handle the flow is allowed to reach back through. */
@@ -250,22 +252,29 @@ export function mountBlockActionBar(host: HTMLElement, actions: BlockBarActions)
250
252
  linkApplyLabel: "Apply",
251
253
  linkExisting: false,
252
254
  linkInput: (_scope: JxScope, event: Event) => {
253
- const value = (event.target as { value?: unknown } | null)?.value;
254
- scope.linkValue = typeof value === "string" ? value : "";
255
+ const { target } = event;
256
+ const value = target !== null && "value" in target ? target.value : undefined;
257
+ scope.linkValue = isString(value) ? value : "";
255
258
  },
256
259
  linkValue: "",
257
260
  linkX: 0,
258
261
  linkY: 0,
259
262
  openMergeTags: (_scope: JxScope, event: Event) => {
260
263
  event.stopPropagation();
264
+ // SAFETY: Only the merge-tags `jx-action-button`'s `onclick` binds this handler, and during
265
+ // Dispatch `currentTarget` is the element the listener sits on.
261
266
  actions.openMergeTags(event.currentTarget as HTMLElement);
262
267
  },
263
268
  openOverflow: (_scope: JxScope, event: Event) => {
264
269
  event.stopPropagation();
270
+ // SAFETY: Only the overflow `jx-action-button`'s `onclick` binds this handler, and during
271
+ // Dispatch `currentTarget` is the element the listener sits on.
265
272
  actions.openOverflow(event.currentTarget as HTMLElement);
266
273
  },
267
274
  openTagMenu: (_scope: JxScope, event: Event) => {
268
275
  event.stopPropagation();
276
+ // SAFETY: Only the tag `jx-action-button`'s `onclick` binds this handler, and during
277
+ // Dispatch `currentTarget` is the element the listener sits on.
269
278
  actions.openTagMenu(event.currentTarget as HTMLElement);
270
279
  },
271
280
  removeLink: () => {
@@ -274,7 +283,7 @@ export function mountBlockActionBar(host: HTMLElement, actions: BlockBarActions)
274
283
  },
275
284
  run: (id: string) => actions.run(id),
276
285
  selectParent: () => actions.selectParent(),
277
- }) as BlockBarScope;
286
+ });
278
287
 
279
288
  /* One mount for the life of the window, and no teardown to write. The bar is chrome the app
280
289
  never takes down: `dismissBlockActionBar` hides it through `visible`, and its layer slot is
@@ -295,6 +304,8 @@ export function mountBlockActionBar(host: HTMLElement, actions: BlockBarActions)
295
304
  return;
296
305
  }
297
306
  if (part === "link") {
307
+ // SAFETY: `part: "link"` is the document's `jx-popover`, whose class carries `open` and the
308
+ // `showPopover({ source })` overload that PopoverElement names.
298
309
  linkEl = element as PopoverElement;
299
310
  return;
300
311
  }
@@ -28,9 +28,8 @@ import { APP_NAME, GIT_COMMIT, VERSION } from "../version";
28
28
  import bootFailureDoc from "./boot-failure.json";
29
29
  import type { BootRefusal } from "../platforms/default-platform";
30
30
  import type { SurfaceHandle } from "../ui/surface";
31
- import type { JxDocument } from "@jxsuite/schema/types";
32
31
 
33
- registerSurface("boot-failure", bootFailureDoc as unknown as JxDocument);
32
+ registerSurface("boot-failure", bootFailureDoc);
34
33
 
35
34
  /** The page the failure happened on — `location`, or a stand-in with the one field read. */
36
35
  export interface BootFailurePage {
@@ -49,7 +48,7 @@ export interface BootFailureView {
49
48
  }
50
49
 
51
50
  /** The scope `boot-failure.json` reads. */
52
- interface BootFailureScope extends Record<string, unknown>, BootFailureView {
51
+ interface BootFailureScope extends BootFailureView {
53
52
  /** The last Copy landed on the clipboard; the button says so. */
54
53
  copied: boolean;
55
54
  reload: () => void;
@@ -135,7 +134,7 @@ export function mountBootFailureSurface(
135
134
  page: BootFailurePage = location,
136
135
  ): Promise<SurfaceHandle> {
137
136
  const view = bootFailureView(refusal, page);
138
- const scope = reactive<BootFailureScope>({
137
+ const scope: BootFailureScope = reactive<BootFailureScope>({
139
138
  ...view,
140
139
  copied: false,
141
140
  async copy() {
@@ -151,6 +150,6 @@ export function mountBootFailureSurface(
151
150
  reload() {
152
151
  location.reload();
153
152
  },
154
- }) as BootFailureScope;
153
+ });
155
154
  return mountSurface("boot-failure", scope, host);
156
155
  }
@@ -15,23 +15,14 @@
15
15
  * @docs studio/interface
16
16
  */
17
17
 
18
+ import { isString } from "@jxsuite/schema/guards";
18
19
  import { reactive } from "../reactivity";
19
20
  import { mountSurface, registerSurface } from "../ui/surface";
20
21
  import bottomDockDoc from "./bottom-dock.json";
21
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
22
- import type { SurfaceHandle } from "../ui/surface";
22
+ import type { JxElement } from "@jxsuite/schema/types";
23
+ import type { SurfaceHandle, SurfaceTab } from "../ui/surface";
23
24
 
24
- registerSurface("bottom-dock", bottomDockDoc as unknown as JxDocument);
25
-
26
- /** One tab of the strip, as the document draws it. */
27
- export interface BottomTabView {
28
- /** The panel id — the row's identity, the strip's `selected` value, and `data-tab`. */
29
- key: string;
30
- /** The record's title with its badge already appended ("Problems 2"). */
31
- label: string;
32
- /** The tab element's own id, which the one panel names as its `aria-labelledby`. */
33
- tabId: string;
34
- }
25
+ registerSurface("bottom-dock", bottomDockDoc);
35
26
 
36
27
  /** What the dock says right now. */
37
28
  export interface BottomDockValues {
@@ -41,7 +32,7 @@ export interface BottomDockValues {
41
32
  tabId: string;
42
33
  /** `dock.bottom/panel:<id>`, or empty when no tab is showing and the body has no identity. */
43
34
  bodyRegion: string;
44
- tabs: BottomTabView[];
35
+ tabs: SurfaceTab[];
45
36
  }
46
37
 
47
38
  export interface BottomDockActions {
@@ -62,7 +53,7 @@ export interface BottomDockHandle {
62
53
  dispose: () => void;
63
54
  }
64
55
 
65
- interface BottomDockScope extends Record<string, unknown>, BottomDockValues, BottomDockActions {}
56
+ interface BottomDockScope extends BottomDockValues, BottomDockActions {}
66
57
 
67
58
  function project(scope: BottomDockScope, values: BottomDockValues): void {
68
59
  scope.tab = values.tab;
@@ -73,8 +64,8 @@ function project(scope: BottomDockScope, values: BottomDockValues): void {
73
64
 
74
65
  /** The `part` a node was declared with, or the empty string. */
75
66
  function partOf(def: JxElement | string): string {
76
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
77
- return typeof part === "string" ? part : "";
67
+ const part = isString(def) ? undefined : def.attributes?.["part"];
68
+ return isString(part) ? part : "";
78
69
  }
79
70
 
80
71
  /**
@@ -90,7 +81,7 @@ export function mountBottomDockSurface(
90
81
  actions: BottomDockActions,
91
82
  options: BottomDockOptions,
92
83
  ): BottomDockHandle {
93
- const scope = reactive<BottomDockScope>({ ...values, ...actions }) as BottomDockScope;
84
+ const scope: BottomDockScope = reactive<BottomDockScope>({ ...values, ...actions });
94
85
 
95
86
  container.textContent = "";
96
87
  // @ts-expect-error -- _$litPart$ is lit's private render-part marker, not in the DOM types
@@ -29,14 +29,15 @@
29
29
  * @docs studio/interface/canvas
30
30
  */
31
31
 
32
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
32
33
  import { reactive } from "../reactivity";
33
34
  import { mountSurface, registerSurface } from "../ui/surface";
34
35
  import canvasStageDoc from "./canvas-stage.json";
35
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
36
+ import type { JxElement } from "@jxsuite/schema/types";
36
37
  import type { JxScope } from "@jxsuite/runtime/types";
37
38
  import type { SurfaceHandle } from "../ui/surface";
38
39
 
39
- registerSurface("canvas-stage", canvasStageDoc as unknown as JxDocument);
40
+ registerSurface("canvas-stage", canvasStageDoc);
40
41
 
41
42
  /** One artboard, as the document reads it. Every field is already a string or a boolean. */
42
43
  export interface CanvasStagePanelItem {
@@ -104,7 +105,7 @@ export interface CanvasStageHandle {
104
105
  }
105
106
 
106
107
  /** The scope the document reads: {@link CanvasStageView} plus the one control it draws. */
107
- interface CanvasStageScope extends Record<string, unknown>, CanvasStageView {
108
+ interface CanvasStageScope extends CanvasStageView {
108
109
  pickPanel: (key: string) => void;
109
110
  }
110
111
 
@@ -117,16 +118,16 @@ interface CanvasStageScope extends Record<string, unknown>, CanvasStageView {
117
118
  * `data-side` tells the two width handles apart — the one part the document draws twice.
118
119
  */
119
120
  function attrOf(def: JxElement | string, name: string): string {
120
- const value = typeof def === "string" ? undefined : def.attributes?.[name];
121
- return typeof value === "string" ? value : "";
121
+ const value = isString(def) ? undefined : def.attributes?.[name];
122
+ return isString(value) ? value : "";
122
123
  }
123
124
 
124
125
  /** The `key` of the `$map` item a node was rendered inside, or "". */
125
126
  function itemKey(state: JxScope | undefined): string {
126
- const item = (state?.["$map"] as { item?: unknown } | undefined)?.item;
127
- const key =
128
- item !== null && typeof item === "object" ? (item as Record<string, unknown>).key : "";
129
- return typeof key === "string" ? key : "";
127
+ const map = state?.["$map"];
128
+ const item = isJsonObject(map) ? map["item"] : undefined;
129
+ const key = isJsonObject(item) ? item["key"] : "";
130
+ return isString(key) ? key : "";
130
131
  }
131
132
 
132
133
  /** The three parts an artboard is made of; everything else is a singleton host. */
@@ -180,7 +181,7 @@ export function mountCanvasStage(
180
181
  "the iframe survives" means — so the record a fresh render builds is filled from here rather
181
182
  than from a callback that will not fire again. */
182
183
  const boards = new Map<string, Map<string, HTMLElement>>();
183
- const scope = reactive<CanvasStageScope>({
184
+ const scope: CanvasStageScope = reactive<CanvasStageScope>({
184
185
  frame: "boards",
185
186
  framePart: "panzoom",
186
187
  frameVars: "",
@@ -190,7 +191,7 @@ export function mountCanvasStage(
190
191
  lead: "none",
191
192
  panels: [],
192
193
  pickPanel: actions.pickPanel,
193
- }) as CanvasStageScope;
194
+ });
194
195
  project(scope, view);
195
196
 
196
197
  let mounted: SurfaceHandle | null = null;
@@ -25,25 +25,19 @@
25
25
  import { reactive } from "../reactivity";
26
26
  import { mountSurface, registerSurface } from "../ui/surface";
27
27
  import { overlayRegion, REGION_ATTR } from "../ui/regions";
28
- import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
28
+ import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
29
29
  import { whenReady } from "./dialog";
30
30
  import pickerDoc from "./cf-account-picker.json";
31
31
  import type { SurfaceHandle } from "../ui/surface";
32
- import type { JxDocument } from "@jxsuite/schema/types";
32
+ import type { CfAccount } from "../publish/pages-service";
33
33
 
34
- registerSurface("cf-account-picker", pickerDoc as unknown as JxDocument);
35
-
36
- /** One account the grant reaches, as the list draws it. */
37
- export interface CfAccountPickerRow {
38
- id: string;
39
- name: string;
40
- }
34
+ registerSurface("cf-account-picker", pickerDoc);
41
35
 
42
36
  /** What the flow knows. Every one of these may change while the dialog is up. */
43
37
  export interface CfAccountPickerView {
44
38
  /** The listing is in flight. Its own state, because "not yet asked" is not "reaches nothing". */
45
39
  loading: boolean;
46
- accounts: CfAccountPickerRow[];
40
+ accounts: CfAccount[];
47
41
  /** The last refusal — a listing that failed, or an account the broker would not accept. */
48
42
  failure: string;
49
43
  /** The id being committed, so its own row can say so rather than the whole list going grey. */
@@ -88,15 +82,14 @@ interface CfAccountPickerFlags {
88
82
  }
89
83
 
90
84
  /** One row, as the document reads it: what it says, and whether it may be pressed. */
91
- interface CfAccountPickerScopeRow extends CfAccountPickerRow {
85
+ interface CfAccountPickerScopeRow extends CfAccount {
92
86
  /** This row's own button text — "Selecting…" while it is the one being committed. */
93
87
  label: string;
94
88
  /** Every row is disabled while any commit is in flight: one answer at a time. */
95
89
  busy: boolean;
96
90
  }
97
91
 
98
- interface CfAccountPickerScope
99
- extends Record<string, unknown>, CfAccountPickerView, CfAccountPickerFlags {
92
+ interface CfAccountPickerScope extends CfAccountPickerView, CfAccountPickerFlags {
100
93
  choose: (id: string) => void;
101
94
  retry: () => void;
102
95
  closed: () => void;
@@ -150,8 +143,12 @@ export function openCfAccountPickerSurface(options: CfAccountPickerOptions): CfA
150
143
  closed = true;
151
144
  options.onClosed();
152
145
  };
146
+ /* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
147
+ element, and a direct `closed` test after that `await` would be narrowed to the value the test
148
+ before it saw. */
149
+ const isClosed = (): boolean => closed;
153
150
 
154
- const scope = reactive({
151
+ const scope: CfAccountPickerScope = reactive<CfAccountPickerScope>({
155
152
  ...derive({ accounts: [], choosing: "", failure: "", loading: true }),
156
153
  choose: (id: string) => {
157
154
  options.onChoose(id);
@@ -160,18 +157,20 @@ export function openCfAccountPickerSurface(options: CfAccountPickerOptions): CfA
160
157
  retry: () => {
161
158
  options.onRetry();
162
159
  },
163
- }) as CfAccountPickerScope;
160
+ });
164
161
 
165
162
  let mounted: SurfaceHandle | null = null;
166
163
  const ready = mountSurface("cf-account-picker", scope, slot).then(async (surface) => {
167
164
  mounted = surface;
165
+ /* SAFETY: `cf-account-picker.json`'s root definition is a `jx-dialog` element, so the runtime
166
+ mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
168
167
  const element = surface.root as HTMLElement;
169
- if (closed) {
168
+ if (isClosed()) {
170
169
  surface.dispose();
171
170
  return element;
172
171
  }
173
172
  await whenReady(element);
174
- if (closed) {
173
+ if (isClosed()) {
175
174
  return element;
176
175
  }
177
176
  showModal(element);
@@ -186,7 +185,7 @@ export function openCfAccountPickerSurface(options: CfAccountPickerOptions): CfA
186
185
  const element = mounted?.root;
187
186
  if (element instanceof HTMLElement) {
188
187
  // The platform's close first, so focus goes back where it came from; then the document.
189
- closeDialog(element);
188
+ close(element);
190
189
  }
191
190
  mounted?.dispose();
192
191
  mounted = null;
@@ -57,9 +57,8 @@ import type { Tab } from "../tabs/tab";
57
57
  import type { SiteBuildResult, SitePreviewResult, StudioPlatform } from "../types";
58
58
  import type { CommandRegistry } from "../commands/registry";
59
59
  import type { EffectScope } from "@vue/reactivity";
60
- import type { JxDocument } from "@jxsuite/schema/types";
61
60
 
62
- registerSurface("commandbar", commandbarDoc as unknown as JxDocument);
61
+ registerSurface("commandbar", commandbarDoc);
63
62
 
64
63
  /**
65
64
  * What the Command Bar is handed at mount.
@@ -146,7 +145,7 @@ export interface SegmentProjection {
146
145
  export type WindowControlLayout = "none" | "mac" | "other";
147
146
 
148
147
  /** The document's scope: the projections, and the host functions its handlers `call`. */
149
- interface CommandBarScope extends Record<string, unknown> {
148
+ interface CommandBarScope {
150
149
  csd: WindowControlLayout;
151
150
  menuVisible: boolean;
152
151
  menuOpen: boolean;
@@ -262,7 +261,7 @@ export function openInBrowserTarget(tab: Tab | null): BrowserTarget {
262
261
  }
263
262
  const params = dynamicRouteParams(documentPath);
264
263
  if (params.length > 0) {
265
- const chosen = (tab?.session.ui.previewParams ?? {}) as Record<string, string>;
264
+ const chosen: Record<string, string> = tab?.session.ui.previewParams ?? {};
266
265
  const missing = params.filter((name) => !chosen[name]);
267
266
  if (missing.length > 0) {
268
267
  const names = missing.map((name) => `:${name}`).join(", ");
@@ -482,8 +481,8 @@ const BUILD_SITE = "project.buildSite";
482
481
  const OPEN_IN_BROWSER = "view.openInBrowser";
483
482
 
484
483
  /** The sentence in an unknown thrown value. */
485
- function errorText(error: unknown): string {
486
- return error instanceof Error ? error.message : String(error);
484
+ function errorText(cause: unknown): string {
485
+ return cause instanceof Error ? cause.message : String(cause);
487
486
  }
488
487
 
489
488
  /** The document's label: its path without the project root, which is already segment one. */
@@ -546,8 +545,14 @@ interface WindowControls {
546
545
  }
547
546
 
548
547
  function windowControls(): WindowControls | undefined {
549
- return (globalThis as unknown as { __jxPlatform?: { windowControls?: WindowControls } })
550
- .__jxPlatform?.windowControls;
548
+ const platform = globalThis.__jxPlatform;
549
+ if (platform == null || !("windowControls" in platform)) {
550
+ return undefined;
551
+ }
552
+ /* SAFETY: the PAL interface deliberately leaves `windowControls` undeclared; the one adapter that
553
+ adds it is the desktop launcher's (`packages/desktop/src/platform.ts`), whose object carries the
554
+ `close`, `maximize` and `minimize` functions this bar calls. */
555
+ return platform.windowControls as WindowControls | undefined;
551
556
  }
552
557
 
553
558
  // ─── The Command Center pill, the layout tabs and the docks, projected ───────
@@ -769,7 +774,7 @@ function state(): CommandBarScope {
769
774
  windowControl: (action) => {
770
775
  windowControls()?.[action]();
771
776
  },
772
- }) as CommandBarScope;
777
+ });
773
778
  return _state;
774
779
  }
775
780
 
@@ -25,14 +25,13 @@
25
25
  import { reactive } from "../reactivity";
26
26
  import { mountSurface, registerSurface } from "../ui/surface";
27
27
  import { overlayRegion, REGION_ATTR } from "../ui/regions";
28
- import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
28
+ import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
29
29
  import { selectValue } from "@jxsuite/ui/behaviors/textfield";
30
30
  import { whenReady } from "./dialog";
31
31
  import convertRepeaterDoc from "./convert-repeater.json";
32
- import type { SurfaceHandle } from "../ui/surface";
33
- import type { JxDocument } from "@jxsuite/schema/types";
32
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
34
33
 
35
- registerSurface("convert-repeater", convertRepeaterDoc as unknown as JxDocument);
34
+ registerSurface("convert-repeater", convertRepeaterDoc);
36
35
 
37
36
  /**
38
37
  * The items-source row that is not a definition: pick it and the dialog asks for a name instead.
@@ -42,12 +41,6 @@ registerSurface("convert-repeater", convertRepeaterDoc as unknown as JxDocument)
42
41
  */
43
42
  export const CREATE_NEW_SOURCE = "__new__";
44
43
 
45
- /** One row of either picker. */
46
- export interface ConvertRepeaterOption {
47
- value: string;
48
- label: string;
49
- }
50
-
51
44
  /** What the flow knows. Every one of these may change while the dialog is up. */
52
45
  export interface ConvertRepeaterView {
53
46
  /** State definitions that hold an array, in the order they were found. */
@@ -97,9 +90,9 @@ export interface ConvertRepeaterSurfaceHandle {
97
90
  /** What the document discriminates on, and the rows it maps. Derived, never handed in. */
98
91
  interface ConvertRepeaterFlags {
99
92
  /** The source picker's rows: every array definition, then `Create new…`. */
100
- sourceOptions: ConvertRepeaterOption[];
93
+ sourceOptions: SurfaceOption[];
101
94
  /** The filter and sort pickers' rows: `None`, then every function definition. */
102
- functionOptions: ConvertRepeaterOption[];
95
+ functionOptions: SurfaceOption[];
103
96
  /** The chosen source is the sentinel, so the name field is drawn. */
104
97
  creating: boolean;
105
98
  /** There is at least one function to offer, so the two optional rows are drawn. */
@@ -108,8 +101,7 @@ interface ConvertRepeaterFlags {
108
101
  invalid: boolean;
109
102
  }
110
103
 
111
- interface ConvertRepeaterScope
112
- extends Record<string, unknown>, ConvertRepeaterView, ConvertRepeaterFlags {
104
+ interface ConvertRepeaterScope extends ConvertRepeaterView, ConvertRepeaterFlags {
113
105
  pickSource: (value: string) => void;
114
106
  setName: (value: string) => void;
115
107
  pickFilter: (value: string) => void;
@@ -163,8 +155,12 @@ export function openConvertRepeaterSurface(
163
155
  closed = true;
164
156
  options.onClosed();
165
157
  };
158
+ /* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
159
+ element, and a direct `closed` test after that `await` would be narrowed to the value the test
160
+ before it saw. */
161
+ const isClosed = (): boolean => closed;
166
162
 
167
- const scope = reactive({
163
+ const scope: ConvertRepeaterScope = reactive<ConvertRepeaterScope>({
168
164
  ...derive(options.view),
169
165
  closed: finish,
170
166
  confirm: () => {
@@ -191,7 +187,7 @@ export function openConvertRepeaterSurface(
191
187
  scope.newName = value;
192
188
  options.onName(value);
193
189
  },
194
- }) as ConvertRepeaterScope;
190
+ });
195
191
 
196
192
  let mounted: SurfaceHandle | null = null;
197
193
 
@@ -218,13 +214,15 @@ export function openConvertRepeaterSurface(
218
214
 
219
215
  const ready = mountSurface("convert-repeater", scope, slot).then(async (surface) => {
220
216
  mounted = surface;
217
+ /* SAFETY: `convert-repeater.json`'s root definition is a `jx-dialog` element, so the runtime
218
+ mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
221
219
  const element = surface.root as HTMLElement;
222
- if (closed) {
220
+ if (isClosed()) {
223
221
  surface.dispose();
224
222
  return element;
225
223
  }
226
224
  await whenReady(element);
227
- if (closed) {
225
+ if (isClosed()) {
228
226
  return element;
229
227
  }
230
228
  showModal(element);
@@ -243,7 +241,7 @@ export function openConvertRepeaterSurface(
243
241
  const element = mounted?.root;
244
242
  if (element instanceof HTMLElement) {
245
243
  // The platform's close first, so focus goes back where it came from; then the document.
246
- closeDialog(element);
244
+ close(element);
247
245
  }
248
246
  // A mount that has not landed yet is disposed by `ready` when it does — `finish` tells it so.
249
247
  mounted?.dispose();
@@ -18,10 +18,9 @@
18
18
  import { reactive } from "../reactivity";
19
19
  import { mountSurface, registerSurface } from "../ui/surface";
20
20
  import dataActionsDoc from "./data-actions.json";
21
- import type { JxDocument } from "@jxsuite/schema/types";
22
21
  import type { SurfaceHandle } from "../ui/surface";
23
22
 
24
- registerSurface("data-actions", dataActionsDoc as unknown as JxDocument);
23
+ registerSurface("data-actions", dataActionsDoc);
25
24
 
26
25
  /** Everything the row draws. */
27
26
  export interface DataActionsView {
@@ -52,7 +51,7 @@ export interface DataActionsSurfaceHandle {
52
51
  dispose: () => void;
53
52
  }
54
53
 
55
- interface DataActionsScope extends Record<string, unknown>, DataActionsView, DataActionsCallbacks {}
54
+ interface DataActionsScope extends DataActionsView, DataActionsCallbacks {}
56
55
 
57
56
  /** Write a projection into the scope. */
58
57
  function project(scope: DataActionsScope, view: DataActionsView): void {
@@ -78,7 +77,7 @@ export function mountDataActionsSurface(
78
77
  view: DataActionsView,
79
78
  actions: DataActionsCallbacks,
80
79
  ): DataActionsSurfaceHandle {
81
- const scope = reactive<DataActionsScope>({
80
+ const scope: DataActionsScope = reactive<DataActionsScope>({
82
81
  openGrid: actions.openGrid,
83
82
  push: actions.push,
84
83
  resultOk: "false",
@@ -89,18 +88,21 @@ export function mountDataActionsSurface(
89
88
  testDisabled: false,
90
89
  testLabel: "Test Connection",
91
90
  testState: "hidden",
92
- }) as DataActionsScope;
91
+ });
93
92
  project(scope, view);
94
93
 
95
94
  let mounted: SurfaceHandle | null = null;
96
95
  let disposed = false;
97
96
  const ready = mountSurface("data-actions", scope, host).then((surface) => {
97
+ /* SAFETY: `data-actions.json`'s root definition is a `div` element, so the runtime mounts an
98
+ HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
99
+ const root = surface.root as HTMLElement;
98
100
  if (disposed) {
99
101
  surface.dispose();
100
- return surface.root as HTMLElement;
102
+ return root;
101
103
  }
102
104
  mounted = surface;
103
- return surface.root as HTMLElement;
105
+ return root;
104
106
  });
105
107
 
106
108
  return {