@jxsuite/studio 6.1.1 → 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 (637) hide show
  1. package/dist/chunks/{2020-va2wwra4.js → 2020-f2gkpy8d.js} +3 -3
  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-2veqmnhr.js → index-zpjmzqfk.js} +3 -3
  32. package/dist/chunks/{javascript-8nbvs12s.js → javascript-m54mnwp6.js} +3 -3
  33. package/dist/chunks/{jsonMode-s8kt9dsj.js → jsonMode-w15cmrcm.js} +8 -8
  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-1q1sh2ax.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-h46vtzk8.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-rv11kfwa.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-8grwxtqk.js → studio-90pq9km1.js} +4 -4
  77. package/dist/chunks/studio-924p1tm1.js +6 -0
  78. package/dist/chunks/{studio-pre0skq6.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-vrmcjf9g.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-wszjyh0j.js → studio-tq0rtfwj.js} +4 -4
  111. package/dist/chunks/{studio-kggey1jt.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-zey7zsdw.js → studio-y64hrt8p.js} +7 -7
  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-2frah6h1.js → tsMode-sf49ee9x.js} +7 -7
  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 +97 -97
  140. package/package.json +6 -6
  141. package/src/about/about-modal.ts +4 -3
  142. package/src/account/action-flow.ts +45 -38
  143. package/src/account-status.ts +7 -2
  144. package/src/browse/library-layouts.ts +8 -5
  145. package/src/browse/library-model.ts +18 -6
  146. package/src/browse/library-pane.ts +37 -21
  147. package/src/browse/library-preview.ts +14 -9
  148. package/src/browse/library-source.ts +1 -1
  149. package/src/canvas/asset-refs.ts +24 -9
  150. package/src/canvas/asset-resolve.ts +19 -23
  151. package/src/canvas/canvas-helpers.ts +7 -6
  152. package/src/canvas/canvas-live-render.ts +44 -53
  153. package/src/canvas/canvas-patcher.ts +30 -30
  154. package/src/canvas/canvas-perf.ts +11 -5
  155. package/src/canvas/canvas-render.ts +62 -41
  156. package/src/canvas/canvas-surface.ts +5 -3
  157. package/src/canvas/canvas-utils.ts +90 -49
  158. package/src/canvas/dialog-path.ts +9 -4
  159. package/src/canvas/dialog-state.ts +1 -2
  160. package/src/canvas/diff-marks.ts +9 -16
  161. package/src/canvas/diff-toolbar.ts +8 -7
  162. package/src/canvas/edit-width-drag.ts +4 -1
  163. package/src/canvas/edit-width.ts +1 -3
  164. package/src/canvas/iframe-channel.ts +27 -13
  165. package/src/canvas/iframe-drop.ts +13 -12
  166. package/src/canvas/iframe-editable-root.ts +29 -16
  167. package/src/canvas/iframe-entry.ts +80 -63
  168. package/src/canvas/iframe-eval.ts +73 -49
  169. package/src/canvas/iframe-host.ts +135 -96
  170. package/src/canvas/iframe-inline-edit.ts +49 -30
  171. package/src/canvas/iframe-insert.ts +5 -4
  172. package/src/canvas/iframe-interaction.ts +30 -25
  173. package/src/canvas/iframe-overlay.ts +1 -1
  174. package/src/canvas/iframe-patch.ts +18 -15
  175. package/src/canvas/iframe-position.ts +12 -6
  176. package/src/canvas/iframe-protocol.ts +12 -16
  177. package/src/canvas/iframe-render.ts +36 -34
  178. package/src/canvas/iframe-slash.ts +24 -11
  179. package/src/canvas/iframe-subtree.ts +6 -2
  180. package/src/canvas/path-mapping.ts +19 -12
  181. package/src/canvas/popover-path.ts +7 -3
  182. package/src/canvas/popover-state.ts +1 -2
  183. package/src/canvas/serialize-scope.ts +13 -5
  184. package/src/canvas/stage-scrollbar.ts +2 -1
  185. package/src/canvas/surface-registry.ts +21 -3
  186. package/src/collab/collab-commands.ts +7 -2
  187. package/src/collab/collab-session.ts +84 -45
  188. package/src/collab/collab-state.ts +4 -3
  189. package/src/collab/monaco-binding.ts +16 -13
  190. package/src/collab/monaco-cursors.ts +5 -2
  191. package/src/commands/budget.ts +3 -3
  192. package/src/commands/command-args.ts +103 -71
  193. package/src/commands/context.ts +22 -20
  194. package/src/commands/keymap.ts +47 -43
  195. package/src/commands/levels.ts +3 -3
  196. package/src/commands/live-context.ts +7 -7
  197. package/src/commands/reference.ts +2 -1
  198. package/src/commands/registry.ts +12 -10
  199. package/src/commands/run-reported.ts +15 -10
  200. package/src/component-props.ts +46 -30
  201. package/src/content/collection-match.ts +5 -4
  202. package/src/content/draft-state.ts +4 -3
  203. package/src/content/entry-commands.ts +3 -2
  204. package/src/content/entry-editor.ts +29 -17
  205. package/src/content/entry-fields.ts +12 -7
  206. package/src/content/entry-model.ts +21 -12
  207. package/src/editor/canvas-context-menu.ts +1 -2
  208. package/src/editor/canvas-slash-bridge.ts +3 -6
  209. package/src/editor/content-slice.ts +16 -14
  210. package/src/editor/context-menu.ts +35 -22
  211. package/src/editor/convert-targets.ts +30 -35
  212. package/src/editor/convert-to-component.ts +11 -5
  213. package/src/editor/convert-to-repeater.ts +34 -22
  214. package/src/editor/editable-tags.ts +17 -2
  215. package/src/editor/file-drop-action.ts +21 -22
  216. package/src/editor/inline-edit-apply.ts +35 -17
  217. package/src/editor/inline-edit.ts +66 -50
  218. package/src/editor/inline-format.ts +59 -56
  219. package/src/editor/inline-link.ts +40 -15
  220. package/src/editor/insert-zone-action.ts +1 -1
  221. package/src/editor/merge-tags.ts +58 -19
  222. package/src/editor/repeater-scope.ts +39 -28
  223. package/src/editor/shortcuts.ts +32 -20
  224. package/src/editor/slash-menu.ts +1 -6
  225. package/src/files/asset-versions.ts +4 -4
  226. package/src/files/components.ts +15 -10
  227. package/src/files/elements.ts +5 -6
  228. package/src/files/file-ops.ts +77 -36
  229. package/src/files/files.ts +90 -95
  230. package/src/files/media-meta.ts +2 -1
  231. package/src/files/media-paths.ts +3 -0
  232. package/src/files/serialize-document.ts +2 -2
  233. package/src/format/constraints.ts +1 -1
  234. package/src/format/convert-file.ts +27 -13
  235. package/src/format/format-choices.ts +2 -1
  236. package/src/format/format-host.ts +76 -50
  237. package/src/github/github-auth-status.ts +27 -3
  238. package/src/github/github-auth.ts +19 -9
  239. package/src/github/github-publish.ts +24 -20
  240. package/src/grid/cell-editors.ts +46 -31
  241. package/src/grid/cell-popovers.ts +5 -3
  242. package/src/grid/edit-buffer.ts +10 -9
  243. package/src/grid/grid-controller.ts +20 -22
  244. package/src/grid/grid-layout.ts +21 -5
  245. package/src/grid/grid-open.ts +3 -6
  246. package/src/grid/grid-panel.ts +11 -4
  247. package/src/grid/grid-source.ts +8 -8
  248. package/src/grid/grid-view.ts +14 -17
  249. package/src/grid/redirects-grid.ts +14 -5
  250. package/src/grid/redirects.ts +16 -14
  251. package/src/grid/schema-columns.ts +25 -19
  252. package/src/grid/sources/connector-source.ts +47 -20
  253. package/src/grid/sources/content-source.ts +25 -24
  254. package/src/grid/sources/csv-file-source.ts +2 -2
  255. package/src/grid/tabulator-tables.d.ts +55 -34
  256. package/src/hosting/stage.ts +7 -7
  257. package/src/i18n/i18n-commands.ts +1 -2
  258. package/src/media/media-pane.ts +4 -1
  259. package/src/new-project/add-repo-modal.ts +20 -19
  260. package/src/new-project/import-tab.ts +10 -14
  261. package/src/new-project/location-fields.ts +2 -1
  262. package/src/new-project/new-project-modal.ts +12 -9
  263. package/src/packages/jxsuite-update.ts +4 -3
  264. package/src/packages/pull-package-sync.ts +26 -25
  265. package/src/page-params.ts +97 -68
  266. package/src/panels/activity-panel.ts +17 -9
  267. package/src/panels/ai-chat/attached-context.ts +13 -7
  268. package/src/panels/ai-chat/chat-view.ts +80 -73
  269. package/src/panels/ai-chat/composer.ts +30 -33
  270. package/src/panels/ai-chat/sessions-view.ts +1 -2
  271. package/src/panels/ai-panel.ts +23 -20
  272. package/src/panels/block-action-bar.ts +46 -35
  273. package/src/panels/bottom-dock.ts +5 -3
  274. package/src/panels/canvas-dnd-bridge.ts +31 -24
  275. package/src/panels/data-explorer.ts +62 -25
  276. package/src/panels/data-grid.ts +14 -11
  277. package/src/panels/dnd.ts +108 -118
  278. package/src/panels/editors.ts +52 -21
  279. package/src/panels/elements-panel.ts +10 -3
  280. package/src/panels/events-panel.ts +84 -69
  281. package/src/panels/formula-workspace.ts +76 -51
  282. package/src/panels/frontmatter-fields.ts +24 -19
  283. package/src/panels/frontmatter-panel.ts +44 -34
  284. package/src/panels/git-diff-open.ts +4 -4
  285. package/src/panels/git-panel.ts +49 -61
  286. package/src/panels/head-panel.ts +131 -111
  287. package/src/panels/i18n-panel.ts +10 -3
  288. package/src/panels/imports-panel.ts +23 -47
  289. package/src/panels/jump-bar.ts +48 -29
  290. package/src/panels/layers-panel.ts +97 -74
  291. package/src/panels/left-panel.ts +3 -3
  292. package/src/panels/pane-context.ts +31 -22
  293. package/src/panels/pane-grid.ts +49 -20
  294. package/src/panels/panel-registry.ts +22 -37
  295. package/src/panels/properties-panel.ts +175 -121
  296. package/src/panels/quick-search.ts +53 -31
  297. package/src/panels/right-panel.ts +3 -3
  298. package/src/panels/seo-modal.ts +13 -17
  299. package/src/panels/settings-menu.ts +15 -15
  300. package/src/panels/signals-panel.ts +153 -131
  301. package/src/panels/statement-editor.ts +230 -140
  302. package/src/panels/style-panel.ts +218 -205
  303. package/src/panels/style-utils.ts +114 -51
  304. package/src/panels/stylebook-doc.ts +57 -54
  305. package/src/panels/stylebook-layers-panel.ts +9 -9
  306. package/src/panels/stylebook-panel.ts +13 -17
  307. package/src/panels/tab-drop.ts +27 -11
  308. package/src/panels/tab-strip.ts +36 -26
  309. package/src/platform-errors.ts +57 -43
  310. package/src/platform.ts +58 -30
  311. package/src/platforms/cloud.ts +345 -175
  312. package/src/platforms/default-platform.ts +10 -4
  313. package/src/platforms/devserver.ts +129 -117
  314. package/src/platforms/read-batcher.ts +16 -8
  315. package/src/project-list.ts +2 -1
  316. package/src/publish/deploy-checklist.ts +8 -2
  317. package/src/publish/pages-service.ts +28 -13
  318. package/src/publish/publish-commands.ts +5 -4
  319. package/src/publish/publish-panel.ts +10 -6
  320. package/src/recent-projects.ts +15 -8
  321. package/src/resize-edges.ts +26 -36
  322. package/src/services/a11y-report.ts +26 -19
  323. package/src/services/agent-seed.ts +23 -11
  324. package/src/services/ai-ask.ts +9 -12
  325. package/src/services/ai-command-tools.ts +68 -62
  326. package/src/services/ai-import-tools.ts +80 -67
  327. package/src/services/ai-models.ts +17 -13
  328. package/src/services/ai-project-tools.ts +68 -32
  329. package/src/services/ai-session-store.ts +19 -10
  330. package/src/services/ai-system-prompt.ts +46 -20
  331. package/src/services/ai-tools.ts +71 -27
  332. package/src/services/ai-write-report.ts +20 -12
  333. package/src/services/ai-writes.ts +4 -4
  334. package/src/services/automation.ts +58 -31
  335. package/src/services/cem-export.ts +149 -58
  336. package/src/services/clock.ts +6 -1
  337. package/src/services/code-services.ts +37 -31
  338. package/src/services/context-manager.ts +14 -10
  339. package/src/services/context-resolver.ts +20 -8
  340. package/src/services/data-service.ts +19 -15
  341. package/src/services/directory-picker.ts +18 -12
  342. package/src/services/document-assistant.ts +39 -19
  343. package/src/services/gated-registry.ts +10 -6
  344. package/src/services/harness/chat-reducer.ts +23 -1
  345. package/src/services/import-client.ts +91 -38
  346. package/src/services/import-seed.ts +8 -2
  347. package/src/services/jx-validate.ts +28 -31
  348. package/src/services/live-preview.ts +0 -0
  349. package/src/services/live-surfaces.ts +6 -3
  350. package/src/services/model-uri.ts +10 -2
  351. package/src/services/module-preloads.ts +12 -8
  352. package/src/services/monaco-buffer.ts +43 -24
  353. package/src/services/monaco-lazy.ts +7 -8
  354. package/src/services/monaco-setup.ts +23 -16
  355. package/src/services/notify.ts +44 -17
  356. package/src/services/popover-report.ts +25 -10
  357. package/src/services/preview-eval.ts +20 -8
  358. package/src/services/profile.ts +13 -6
  359. package/src/services/project-path.ts +13 -10
  360. package/src/services/references.ts +0 -0
  361. package/src/services/render-critic.ts +8 -7
  362. package/src/services/settings/kernel.ts +13 -4
  363. package/src/services/settings/write-queue.ts +9 -9
  364. package/src/services/token-lint.ts +12 -10
  365. package/src/services/tool-executor.ts +17 -5
  366. package/src/services/tool-outcomes.ts +44 -24
  367. package/src/services/trusted-types.ts +24 -7
  368. package/src/settings/contexts-section.ts +11 -8
  369. package/src/settings/contributed-section.ts +79 -60
  370. package/src/settings/css-vars-editor.ts +37 -16
  371. package/src/settings/defs-editor.ts +38 -35
  372. package/src/settings/extension-rows.ts +16 -8
  373. package/src/settings/extension-sections.ts +23 -13
  374. package/src/settings/extensions-section.ts +4 -1
  375. package/src/settings/general-settings.ts +11 -8
  376. package/src/settings/locales-section.ts +20 -12
  377. package/src/settings/preferences-dialog.ts +9 -6
  378. package/src/settings/preferences-keymap.ts +7 -5
  379. package/src/settings/preferences-sections.ts +11 -5
  380. package/src/settings/project-sections.ts +1 -1
  381. package/src/settings/schema-field-ui.ts +9 -0
  382. package/src/settings/settings-document.ts +5 -5
  383. package/src/shell/tree.ts +6 -5
  384. package/src/shell.ts +104 -81
  385. package/src/site-context.ts +37 -22
  386. package/src/state.ts +41 -49
  387. package/src/store.ts +54 -34
  388. package/src/studio.ts +25 -75
  389. package/src/style/live-preview.ts +1 -1
  390. package/src/style/project-styles.ts +6 -7
  391. package/src/style/token-ref.ts +5 -4
  392. package/src/surfaces/about.ts +18 -19
  393. package/src/surfaces/add-repo.ts +17 -19
  394. package/src/surfaces/ai-chat.ts +31 -36
  395. package/src/surfaces/ai-credentials-form.ts +6 -16
  396. package/src/surfaces/ai-managed-connect.ts +3 -4
  397. package/src/surfaces/ai-model-picker.ts +3 -5
  398. package/src/surfaces/block-action-bar.ts +22 -11
  399. package/src/surfaces/boot-failure.ts +4 -5
  400. package/src/surfaces/bottom-dock.ts +9 -18
  401. package/src/surfaces/canvas-stage.ts +12 -11
  402. package/src/surfaces/cf-account-picker.ts +17 -18
  403. package/src/surfaces/commandbar.ts +14 -9
  404. package/src/surfaces/convert-repeater.ts +17 -19
  405. package/src/surfaces/data-actions.ts +9 -7
  406. package/src/surfaces/dialog.ts +26 -28
  407. package/src/surfaces/diff-toolbar.ts +9 -7
  408. package/src/surfaces/doc-header.ts +10 -19
  409. package/src/surfaces/empty-state.ts +7 -10
  410. package/src/surfaces/entry-editor.ts +14 -11
  411. package/src/surfaces/expression-editor.ts +11 -25
  412. package/src/surfaces/files-panel.ts +27 -14
  413. package/src/surfaces/formula-palette.ts +4 -5
  414. package/src/surfaces/git-panel.ts +7 -15
  415. package/src/surfaces/github-auth.ts +16 -20
  416. package/src/surfaces/github-publish.ts +17 -22
  417. package/src/surfaces/grid-cell.ts +30 -31
  418. package/src/surfaces/grid-open.ts +10 -14
  419. package/src/surfaces/grid-panel.ts +13 -9
  420. package/src/surfaces/grid-replace.ts +13 -13
  421. package/src/surfaces/grid-views.ts +15 -18
  422. package/src/surfaces/inspector-dock.ts +13 -12
  423. package/src/surfaces/jump-bar.ts +5 -6
  424. package/src/surfaces/jxsuite-update.ts +16 -22
  425. package/src/surfaces/library-pane.ts +19 -20
  426. package/src/surfaces/logic-panel.ts +17 -30
  427. package/src/surfaces/logic-workspace.ts +13 -15
  428. package/src/surfaces/media-browser.ts +11 -10
  429. package/src/surfaces/media-field.ts +4 -5
  430. package/src/surfaces/media-pane.ts +8 -7
  431. package/src/surfaces/menu.ts +29 -23
  432. package/src/surfaces/navigator-dock.ts +11 -12
  433. package/src/surfaces/new-project.ts +27 -26
  434. package/src/surfaces/pane-context.ts +20 -25
  435. package/src/surfaces/pane-grid.ts +15 -10
  436. package/src/surfaces/panel-activity.ts +5 -6
  437. package/src/surfaces/panel-data.ts +3 -4
  438. package/src/surfaces/panel-deploy-checklist.ts +5 -6
  439. package/src/surfaces/panel-elements.ts +5 -7
  440. package/src/surfaces/panel-i18n.ts +5 -7
  441. package/src/surfaces/panel-imports.ts +6 -13
  442. package/src/surfaces/panel-outline.ts +25 -19
  443. package/src/surfaces/panel-page.ts +11 -18
  444. package/src/surfaces/panel-problems.ts +5 -7
  445. package/src/surfaces/panel-signals.ts +20 -34
  446. package/src/surfaces/panel-stylebook-layers.ts +5 -8
  447. package/src/surfaces/preferences.ts +21 -11
  448. package/src/surfaces/progress-modal.ts +15 -9
  449. package/src/surfaces/properties-panel.json +1 -1
  450. package/src/surfaces/properties-panel.ts +20 -42
  451. package/src/surfaces/publish.ts +18 -18
  452. package/src/surfaces/push-plan.ts +7 -8
  453. package/src/surfaces/rail.ts +13 -13
  454. package/src/surfaces/reference-field.ts +11 -15
  455. package/src/surfaces/schema-builder.ts +16 -22
  456. package/src/surfaces/schema-form.ts +15 -25
  457. package/src/surfaces/secret-field.ts +9 -6
  458. package/src/surfaces/seo.ts +21 -15
  459. package/src/surfaces/settings-contexts.ts +9 -7
  460. package/src/surfaces/settings-contributed.ts +14 -10
  461. package/src/surfaces/settings-css-vars.ts +5 -12
  462. package/src/surfaces/settings-defs.json +2 -2
  463. package/src/surfaces/settings-defs.ts +17 -21
  464. package/src/surfaces/settings-deploy.ts +8 -15
  465. package/src/surfaces/settings-extensions.ts +5 -6
  466. package/src/surfaces/settings-head.ts +33 -39
  467. package/src/surfaces/settings-locales.ts +8 -20
  468. package/src/surfaces/settings-overview.ts +5 -6
  469. package/src/surfaces/settings-packages.ts +8 -7
  470. package/src/surfaces/settings-pane.ts +9 -18
  471. package/src/surfaces/settings-rawjson.ts +5 -6
  472. package/src/surfaces/shell.ts +1 -2
  473. package/src/surfaces/slash-menu.ts +19 -9
  474. package/src/surfaces/statements.ts +13 -18
  475. package/src/surfaces/statusbar.ts +17 -14
  476. package/src/surfaces/style-panel.ts +18 -31
  477. package/src/surfaces/stylebook-chrome.ts +3 -5
  478. package/src/surfaces/tab-strip.ts +14 -13
  479. package/src/surfaces/target-line.ts +6 -7
  480. package/src/surfaces/welcome.ts +5 -7
  481. package/src/tabs/patch-ops.ts +4 -3
  482. package/src/tabs/project-config.ts +32 -21
  483. package/src/tabs/selection.ts +36 -8
  484. package/src/tabs/tab.ts +52 -41
  485. package/src/tabs/transact.ts +98 -53
  486. package/src/types.ts +32 -17
  487. package/src/ui/ai-credentials-form.ts +10 -13
  488. package/src/ui/ai-model-picker.ts +3 -3
  489. package/src/ui/cf-account-picker.ts +7 -9
  490. package/src/ui/color-selector.ts +9 -5
  491. package/src/ui/dynamic-slot.ts +7 -8
  492. package/src/ui/expression-editor.ts +112 -105
  493. package/src/ui/form-controls.ts +57 -48
  494. package/src/ui/formula-catalog.ts +239 -230
  495. package/src/ui/formula-chips.ts +33 -18
  496. package/src/ui/layers.ts +44 -31
  497. package/src/ui/media-picker.ts +18 -9
  498. package/src/ui/popover-surface.ts +20 -12
  499. package/src/ui/progress-modal.ts +13 -8
  500. package/src/ui/regions.ts +7 -6
  501. package/src/ui/schema-form.ts +113 -70
  502. package/src/ui/surface.ts +71 -8
  503. package/src/ui/timing.ts +9 -0
  504. package/src/ui/value-source.ts +44 -31
  505. package/src/ui/virtual-window.ts +3 -2
  506. package/src/utils/base64.ts +3 -1
  507. package/src/utils/edit-display.ts +73 -73
  508. package/src/utils/element-selectors.ts +3 -2
  509. package/src/utils/google-fonts.ts +15 -14
  510. package/src/utils/inherited-style.ts +18 -20
  511. package/src/utils/link-target.ts +1 -1
  512. package/src/utils/preview-format.ts +25 -3
  513. package/src/utils/strip-events.ts +49 -22
  514. package/src/utils/studio-utils.ts +29 -14
  515. package/src/view.ts +2 -3
  516. package/src/workspace/pane-derive.ts +10 -12
  517. package/src/workspace/session.ts +53 -43
  518. package/src/workspace/workspace.ts +40 -36
  519. package/dist/chunks/adapter-f93pafd7.js +0 -4
  520. package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
  521. package/dist/chunks/cf-settings-125tdm0w.js +0 -4
  522. package/dist/chunks/color-area-jqhna8zy.js +0 -4
  523. package/dist/chunks/color-field-embq5ctg.js +0 -4
  524. package/dist/chunks/color-fpezvnkt.js +0 -4
  525. package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
  526. package/dist/chunks/combobox-773hdzyj.js +0 -4
  527. package/dist/chunks/components-ax2f1fnn.js +0 -4
  528. package/dist/chunks/content-source-108aqtk1.js +0 -4
  529. package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
  530. package/dist/chunks/dialog-mtm9fq5t.js +0 -4
  531. package/dist/chunks/editor-pfgdmkb0.js +0 -4
  532. package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
  533. package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
  534. package/dist/chunks/file-ops-meej5mqf.js +0 -4
  535. package/dist/chunks/files-44vp8a2s.js +0 -4
  536. package/dist/chunks/format-host-7q1petb9.js +0 -4
  537. package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
  538. package/dist/chunks/git-panel-zngbymvd.js +0 -4
  539. package/dist/chunks/grid-view-sx9vynsp.js +0 -51
  540. package/dist/chunks/icons-p44xhjf0.js +0 -4
  541. package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
  542. package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
  543. package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
  544. package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
  545. package/dist/chunks/index-wkyfjeqz.js +0 -4
  546. package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
  547. package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
  548. package/dist/chunks/layers-xd92fg8d.js +0 -4
  549. package/dist/chunks/listbox-s8fkmnq8.js +0 -4
  550. package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
  551. package/dist/chunks/media-picker-0svzkdyb.js +0 -4
  552. package/dist/chunks/menu-37d07z9m.js +0 -4
  553. package/dist/chunks/menu-5c55ea3d.js +0 -4
  554. package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
  555. package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
  556. package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
  557. package/dist/chunks/notify-0xgtn8q1.js +0 -4
  558. package/dist/chunks/number-field-gw7sq8rn.js +0 -4
  559. package/dist/chunks/parse-897fvqah.js +0 -4
  560. package/dist/chunks/platform-v1qctbe6.js +0 -4
  561. package/dist/chunks/popover-8htra4er.js +0 -4
  562. package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
  563. package/dist/chunks/quick-search-a54e6t5n.js +0 -4
  564. package/dist/chunks/references-gmqp82fs.js +0 -4
  565. package/dist/chunks/right-panel-v7t9awbk.js +0 -4
  566. package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
  567. package/dist/chunks/select-n3v7gwas.js +0 -4
  568. package/dist/chunks/split-pff8f3ze.js +0 -4
  569. package/dist/chunks/studio-0bhx5hz6.js +0 -5
  570. package/dist/chunks/studio-0k1ddnyy.js +0 -6
  571. package/dist/chunks/studio-1b04pd0j.js +0 -64
  572. package/dist/chunks/studio-4dwbj6gb.js +0 -5
  573. package/dist/chunks/studio-4tanh828.js +0 -5
  574. package/dist/chunks/studio-55h4mstj.js +0 -4
  575. package/dist/chunks/studio-5tnvjkz4.js +0 -5
  576. package/dist/chunks/studio-60dqgb0c.js +0 -5
  577. package/dist/chunks/studio-61dp09qg.js +0 -9
  578. package/dist/chunks/studio-63epcrj2.js +0 -5
  579. package/dist/chunks/studio-74k29dy9.js +0 -5
  580. package/dist/chunks/studio-7vg6jcd3.js +0 -5
  581. package/dist/chunks/studio-7zx31knw.js +0 -9
  582. package/dist/chunks/studio-8bxk97km.js +0 -5
  583. package/dist/chunks/studio-933e30n4.js +0 -5
  584. package/dist/chunks/studio-98wnwhbg.js +0 -5
  585. package/dist/chunks/studio-9mccjwjh.js +0 -14
  586. package/dist/chunks/studio-a2ke1e4t.js +0 -5
  587. package/dist/chunks/studio-e3a2a6v3.js +0 -4
  588. package/dist/chunks/studio-e81q1vb9.js +0 -5
  589. package/dist/chunks/studio-epgrmqqm.js +0 -5
  590. package/dist/chunks/studio-ery42sqr.js +0 -4
  591. package/dist/chunks/studio-g1shz58g.js +0 -5
  592. package/dist/chunks/studio-gf0fz03c.js +0 -5
  593. package/dist/chunks/studio-gjtpe62q.js +0 -6
  594. package/dist/chunks/studio-gkskhg7m.js +0 -5
  595. package/dist/chunks/studio-gx4dnjzd.js +0 -5
  596. package/dist/chunks/studio-j03zga3y.js +0 -9
  597. package/dist/chunks/studio-jhpxeckz.js +0 -5
  598. package/dist/chunks/studio-k01r7ykp.js +0 -5
  599. package/dist/chunks/studio-kk7h30ne.js +0 -7
  600. package/dist/chunks/studio-kt1zqney.js +0 -5
  601. package/dist/chunks/studio-m3cwhvye.js +0 -5
  602. package/dist/chunks/studio-mcayt6hz.js +0 -5
  603. package/dist/chunks/studio-myjcghv3.js +0 -5
  604. package/dist/chunks/studio-n8bxwc3y.js +0 -4
  605. package/dist/chunks/studio-ngm8gvpb.js +0 -5
  606. package/dist/chunks/studio-nj5a01jy.js +0 -928
  607. package/dist/chunks/studio-pcgz8heb.js +0 -5
  608. package/dist/chunks/studio-qcsq0t15.js +0 -5
  609. package/dist/chunks/studio-qkstvve9.js +0 -5
  610. package/dist/chunks/studio-qv1pwd3c.js +0 -5
  611. package/dist/chunks/studio-rc6dvxjb.js +0 -7
  612. package/dist/chunks/studio-s8dmmz66.js +0 -5
  613. package/dist/chunks/studio-sp5xzbj4.js +0 -6
  614. package/dist/chunks/studio-szsjbj0g.js +0 -5
  615. package/dist/chunks/studio-t1xzawhr.js +0 -16
  616. package/dist/chunks/studio-t6b6qe31.js +0 -5
  617. package/dist/chunks/studio-tdcprbqb.js +0 -5
  618. package/dist/chunks/studio-vyc0b4he.js +0 -10
  619. package/dist/chunks/studio-w0cgf6jg.js +0 -5
  620. package/dist/chunks/studio-w3hskzqk.js +0 -5
  621. package/dist/chunks/studio-xgrgcdyh.js +0 -9
  622. package/dist/chunks/studio-xz2yxfcb.js +0 -5
  623. package/dist/chunks/studio-y6n42tgs.js +0 -5
  624. package/dist/chunks/studio-yb560vxr.js +0 -5
  625. package/dist/chunks/studio-yn9f8vtx.js +0 -5
  626. package/dist/chunks/studio-yw05w8f0.js +0 -7
  627. package/dist/chunks/studio-z16sgavc.js +0 -5
  628. package/dist/chunks/studio-zyqn40w4.js +0 -5
  629. package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
  630. package/dist/chunks/tabs-jwthg40w.js +0 -4
  631. package/dist/chunks/textfield-spy3hc77.js +0 -4
  632. package/dist/chunks/toast-4d35zd64.js +0 -4
  633. package/dist/chunks/toast-host-8sjmfed3.js +0 -4
  634. package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
  635. package/dist/chunks/tree-h19v1jfz.js +0 -4
  636. package/dist/chunks/workspace-zt81g1ms.js +0 -4
  637. package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
@@ -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 {
@@ -25,27 +25,12 @@
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 dialogDoc from "./dialog.json";
31
- import type { SurfaceHandle } from "../ui/surface";
32
- import type { JxDocument } from "@jxsuite/schema/types";
31
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
33
32
 
34
- registerSurface("dialog", dialogDoc as unknown as JxDocument);
35
-
36
- /**
37
- * One option of a prompt's choice.
38
- *
39
- * There is no `selected` here, and its absence is the contract rather than an omission: `jx-select`
40
- * is a native `<select>`, and the reader's first pick sets an option's dirtiness flag, after which
41
- * the `selected` content attribute stops moving selectedness (`ui.md` §5.1). A projection that
42
- * marked a row would be right until the first pick and wrong after it. The chosen row is named by
43
- * `chosen`, once, beside the list.
44
- */
45
- export interface DialogChoiceOption {
46
- value: string;
47
- label: string;
48
- }
33
+ registerSurface("dialog", dialogDoc);
49
34
 
50
35
  /** What a flow hands the surface. Everything is a projection; the flow keeps the state machine. */
51
36
  export interface DialogSurfaceOptions {
@@ -61,8 +46,15 @@ export interface DialogSurfaceOptions {
61
46
  message?: string;
62
47
  /** Render a richer body into the document's island, once the element is ready. */
63
48
  island?: (host: HTMLElement) => void;
64
- /** A `jx-select` above the field, and which of its rows is chosen. */
65
- choice?: { label: string; options: DialogChoiceOption[]; chosen: string };
49
+ /**
50
+ * A `jx-select` above the field, and which of its rows is chosen. The rows carry no `selected`,
51
+ * and that absence is the contract rather than an omission: `jx-select` is a native `<select>`,
52
+ * and the reader's first pick sets an option's dirtiness flag, after which the `selected` content
53
+ * attribute stops moving selectedness (`ui.md` §5.1). A projection that marked a row would be
54
+ * right until the first pick and wrong after it. The chosen row is named by `chosen`, once,
55
+ * beside the list.
56
+ */
57
+ choice?: { label: string; options: SurfaceOption[]; chosen: string };
66
58
  /** The prompt's field. */
67
59
  field?: {
68
60
  value: string;
@@ -104,7 +96,7 @@ export interface DialogSurfacePatch {
104
96
  placeholder?: string;
105
97
  invalid?: boolean;
106
98
  error?: string;
107
- options?: DialogChoiceOption[];
99
+ options?: SurfaceOption[];
108
100
  chosen?: string;
109
101
  }
110
102
 
@@ -118,7 +110,7 @@ export interface DialogSurfaceHandle {
118
110
  close: () => void;
119
111
  }
120
112
 
121
- interface DialogScope extends Record<string, unknown> {
113
+ interface DialogScope {
122
114
  headline: string;
123
115
  confirmLabel: string;
124
116
  secondaryLabel: string;
@@ -129,7 +121,7 @@ interface DialogScope extends Record<string, unknown> {
129
121
  hasMessage: boolean;
130
122
  hasChoice: boolean;
131
123
  choiceLabel: string;
132
- options: DialogChoiceOption[];
124
+ options: SurfaceOption[];
133
125
  hasField: boolean;
134
126
  multiline: boolean;
135
127
  rows: string;
@@ -195,7 +187,7 @@ export function openDialogSurface(options: DialogSurfaceOptions): DialogSurfaceH
195
187
  slot.setAttribute(REGION_ATTR, overlayRegion("dialog", options.region));
196
188
  options.layer.append(slot);
197
189
 
198
- const scope = reactive<DialogScope>({
190
+ const scope: DialogScope = reactive<DialogScope>({
199
191
  cancel: () => {
200
192
  options.onCancel();
201
193
  },
@@ -236,10 +228,14 @@ export function openDialogSurface(options: DialogSurfaceOptions): DialogSurfaceH
236
228
  secondaryLabel: options.secondaryLabel ?? "",
237
229
  size: options.size ?? "sm",
238
230
  value: options.field?.value ?? "",
239
- }) as DialogScope;
231
+ });
240
232
 
241
233
  let handle: SurfaceHandle | null = null;
242
234
  let closed = false;
235
+ /* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
236
+ element, and a direct `closed` test after that `await` would be narrowed to the value the test
237
+ before it saw. */
238
+ const isClosed = (): boolean => closed;
243
239
  /* Closing while the element is still rendering must not leave `ready` waiting on a `jx-ready`
244
240
  a disposed element will never send, so the wait races against the close. */
245
241
  let abort: () => void = () => {};
@@ -248,14 +244,16 @@ export function openDialogSurface(options: DialogSurfaceOptions): DialogSurfaceH
248
244
  });
249
245
  const mounted = mountSurface("dialog", scope, slot);
250
246
  const ready = mounted.then(async (surface) => {
247
+ /* SAFETY: `dialog.json`'s root definition is a `jx-dialog` element, so the runtime
248
+ mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
251
249
  const element = surface.root as HTMLElement;
252
- if (closed) {
250
+ if (isClosed()) {
253
251
  surface.dispose();
254
252
  return element;
255
253
  }
256
254
  handle = surface;
257
255
  await Promise.race([whenReady(element), aborted]);
258
- if (closed) {
256
+ if (isClosed()) {
259
257
  return element;
260
258
  }
261
259
  options.island?.(element.querySelector<HTMLElement>('[part="island"]') ?? element);
@@ -284,7 +282,7 @@ export function openDialogSurface(options: DialogSurfaceOptions): DialogSurfaceH
284
282
  const element = handle?.root;
285
283
  if (element instanceof HTMLElement) {
286
284
  // The platform's close first, so focus goes back where it was; then the document goes.
287
- closeDialog(element);
285
+ close(element);
288
286
  }
289
287
  // A mount that has not landed yet is disposed by `ready` when it does.
290
288
  handle?.dispose();
@@ -18,10 +18,9 @@
18
18
  import { reactive } from "../reactivity";
19
19
  import { mountSurface, registerSurface } from "../ui/surface";
20
20
  import diffToolbarDoc from "./diff-toolbar.json";
21
- import type { JxDocument } from "@jxsuite/schema/types";
22
21
  import type { SurfaceHandle } from "../ui/surface";
23
22
 
24
- registerSurface("diff-toolbar", diffToolbarDoc as unknown as JxDocument);
23
+ registerSurface("diff-toolbar", diffToolbarDoc);
25
24
 
26
25
  /** Everything the bar draws, as one value. Every field is already a string or a boolean. */
27
26
  export interface DiffToolbarView {
@@ -66,7 +65,7 @@ export interface DiffToolbarSurfaceHandle {
66
65
  }
67
66
 
68
67
  /** The scope the document reads: {@link DiffToolbarView} plus the actions its controls call. */
69
- interface DiffToolbarScope extends Record<string, unknown>, DiffToolbarView, DiffToolbarActions {}
68
+ interface DiffToolbarScope extends DiffToolbarView, DiffToolbarActions {}
70
69
 
71
70
  /** Write a projection into the scope. */
72
71
  function project(scope: DiffToolbarScope, view: DiffToolbarView): void {
@@ -98,7 +97,7 @@ export function mountDiffToolbarSurface(
98
97
  actions: DiffToolbarActions,
99
98
  ): DiffToolbarSurfaceHandle {
100
99
  host.replaceChildren();
101
- const scope = reactive<DiffToolbarScope>({
100
+ const scope: DiffToolbarScope = reactive<DiffToolbarScope>({
102
101
  codeChecked: "false",
103
102
  countLabel: "",
104
103
  degraded: "hidden",
@@ -113,18 +112,21 @@ export function mountDiffToolbarSurface(
113
112
  stepper: "hidden",
114
113
  viewMode: "choice",
115
114
  visualChecked: "true",
116
- }) as DiffToolbarScope;
115
+ });
117
116
  project(scope, view);
118
117
 
119
118
  let mounted: SurfaceHandle | null = null;
120
119
  let disposed = false;
121
120
  const ready = mountSurface("diff-toolbar", scope, host).then((surface) => {
121
+ /* SAFETY: `diff-toolbar.json`'s root definition is a `div` element, so the runtime mounts an
122
+ HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
123
+ const root = surface.root as HTMLElement;
122
124
  if (disposed) {
123
125
  surface.dispose();
124
- return surface.root as HTMLElement;
126
+ return root;
125
127
  }
126
128
  mounted = surface;
127
- return surface.root as HTMLElement;
129
+ return root;
128
130
  });
129
131
 
130
132
  return {