@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
@@ -24,13 +24,12 @@
24
24
  import { reactive } from "../reactivity";
25
25
  import { mountSurface, registerSurface } from "../ui/surface";
26
26
  import { overlayRegion, REGION_ATTR } from "../ui/regions";
27
- import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
27
+ import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
28
28
  import { whenReady } from "./dialog";
29
29
  import jxsuiteUpdateDoc from "./jxsuite-update.json";
30
- import type { SurfaceHandle } from "../ui/surface";
31
- import type { JxDocument } from "@jxsuite/schema/types";
30
+ import type { DialogLayerHandle, SurfaceHandle } from "../ui/surface";
32
31
 
33
- registerSurface("jxsuite-update", jxsuiteUpdateDoc as unknown as JxDocument);
32
+ registerSurface("jxsuite-update", jxsuiteUpdateDoc);
34
33
 
35
34
  /** One package the offer would move. Every field is already the string the row prints. */
36
35
  export interface JxsuiteUpdateRow {
@@ -55,16 +54,7 @@ export interface JxsuiteUpdateSurfaceOptions {
55
54
  onClosed: () => void;
56
55
  }
57
56
 
58
- export interface JxsuiteUpdateSurfaceHandle {
59
- /** The slot in the dialog layer that carries the region. */
60
- host: HTMLElement;
61
- /** Resolves with the `jx-dialog` element once it has rendered and been opened. */
62
- ready: Promise<HTMLElement>;
63
- /** Close the dialog (the platform restores focus) and dispose the document. Idempotent. */
64
- close: () => void;
65
- }
66
-
67
- interface JxsuiteUpdateScope extends Record<string, unknown> {
57
+ interface JxsuiteUpdateScope {
68
58
  packages: JxsuiteUpdateRow[];
69
59
  confirm: () => void;
70
60
  cancel: () => void;
@@ -72,9 +62,7 @@ interface JxsuiteUpdateScope extends Record<string, unknown> {
72
62
  }
73
63
 
74
64
  /** Open the offer. The handle's `ready` resolves once the dialog is showing. */
75
- export function openJxsuiteUpdateSurface(
76
- options: JxsuiteUpdateSurfaceOptions,
77
- ): JxsuiteUpdateSurfaceHandle {
65
+ export function openJxsuiteUpdateSurface(options: JxsuiteUpdateSurfaceOptions): DialogLayerHandle {
78
66
  const slot = document.createElement("div");
79
67
  /* The layer is `pointer-events: none` so a click passes through it when nothing is up, and every
80
68
  slot in it turns them back on for its own content. `pointer-events` INHERITS, and the top layer
@@ -98,8 +86,12 @@ export function openJxsuiteUpdateSurface(
98
86
  closed = true;
99
87
  options.onClosed();
100
88
  };
89
+ /* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
90
+ element, and a direct `closed` test after that `await` would be narrowed to the value the test
91
+ before it saw. */
92
+ const isClosed = (): boolean => closed;
101
93
 
102
- const scope = reactive<JxsuiteUpdateScope>({
94
+ const scope: JxsuiteUpdateScope = reactive<JxsuiteUpdateScope>({
103
95
  cancel: () => {
104
96
  options.onCancel();
105
97
  },
@@ -108,18 +100,20 @@ export function openJxsuiteUpdateSurface(
108
100
  options.onConfirm();
109
101
  },
110
102
  packages: options.packages,
111
- }) as JxsuiteUpdateScope;
103
+ });
112
104
 
113
105
  let mounted: SurfaceHandle | null = null;
114
106
  const ready = mountSurface("jxsuite-update", scope, slot).then(async (surface) => {
115
107
  mounted = surface;
108
+ /* SAFETY: `jxsuite-update.json`'s root definition is a `jx-dialog` element, so the runtime
109
+ mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
116
110
  const element = surface.root as HTMLElement;
117
- if (closed) {
111
+ if (isClosed()) {
118
112
  surface.dispose();
119
113
  return element;
120
114
  }
121
115
  await whenReady(element);
122
- if (closed) {
116
+ if (isClosed()) {
123
117
  return element;
124
118
  }
125
119
  showModal(element);
@@ -135,7 +129,7 @@ export function openJxsuiteUpdateSurface(
135
129
  const element = mounted?.root;
136
130
  if (element instanceof HTMLElement) {
137
131
  // The platform's close first, so focus goes back where it came from; then the document.
138
- closeDialog(element);
132
+ close(element);
139
133
  }
140
134
  // A mount that has not landed yet is disposed by `ready` when it does — `finish` tells it so.
141
135
  mounted?.dispose();
@@ -28,15 +28,16 @@
28
28
  * @docs studio/projects/browse
29
29
  */
30
30
 
31
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
31
32
  import { reactive } from "../reactivity";
32
33
  import { mountSurface, registerSurface } from "../ui/surface";
33
34
  import { placeholderBrokenImages } from "../utils/edit-display";
34
35
  import libraryDoc from "./library-pane.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
- import type { SurfaceHandle } from "../ui/surface";
38
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
38
39
 
39
- registerSurface("library-pane", libraryDoc as unknown as JxDocument);
40
+ registerSurface("library-pane", libraryDoc);
40
41
 
41
42
  /**
42
43
  * Which of nine things the body draws.
@@ -118,12 +119,6 @@ export interface LibraryChip {
118
119
  checked: "true" | "false";
119
120
  }
120
121
 
121
- /** One row of the language facet. */
122
- export interface LibraryOption {
123
- value: string;
124
- label: string;
125
- }
126
-
127
122
  /** Everything the document draws, as one value. */
128
123
  export interface LibraryView {
129
124
  /** The region id stamped on the root, so the screenshot pipeline can address the Library. */
@@ -140,7 +135,7 @@ export interface LibraryView {
140
135
  * chrome that says nothing.
141
136
  */
142
137
  localeState: "hidden" | "shown";
143
- localeOptions: LibraryOption[];
138
+ localeOptions: SurfaceOption[];
144
139
  localeValue: string;
145
140
  query: string;
146
141
  /** Where an upload lands, as the label's tooltip says it — before the files are chosen. */
@@ -211,7 +206,7 @@ export interface LibrarySurfaceHandle {
211
206
  }
212
207
 
213
208
  /** The scope the document reads: {@link LibraryView} plus the actions its controls call. */
214
- interface LibraryScope extends Record<string, unknown>, LibraryView, LibraryActions {}
209
+ interface LibraryScope extends LibraryView, LibraryActions {}
215
210
 
216
211
  /** Write a projection into the scope. */
217
212
  function project(scope: LibraryScope, view: LibraryView): void {
@@ -243,15 +238,16 @@ function project(scope: LibraryScope, view: LibraryView): void {
243
238
 
244
239
  /** The `part` a node's definition carries, or "" for a text node or an unmarked element. */
245
240
  function partOf(def: JxElement | string): string {
246
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
247
- return typeof part === "string" ? part : "";
241
+ const part = isString(def) ? undefined : def.attributes?.["part"];
242
+ return isString(part) ? part : "";
248
243
  }
249
244
 
250
245
  /** The path of the mapped row a node was rendered inside, or "" when it was not in one. */
251
246
  function rowPath(state: JxScope | undefined): string {
252
- const map = state?.["$map"] as { item?: { path?: unknown } } | undefined;
253
- const path = map?.item?.path;
254
- return typeof path === "string" ? path : "";
247
+ const map = state?.["$map"];
248
+ const item = isJsonObject(map) ? map["item"] : undefined;
249
+ const path = isJsonObject(item) ? item["path"] : undefined;
250
+ return isString(path) ? path : "";
255
251
  }
256
252
 
257
253
  /**
@@ -272,7 +268,7 @@ export function mountLibrarySurface(
272
268
  // Than the browser's broken-image glyph.
273
269
  const listening = new AbortController();
274
270
  placeholderBrokenImages(host, listening.signal);
275
- const scope = reactive<LibraryScope>({
271
+ const scope: LibraryScope = reactive<LibraryScope>({
276
272
  bannerState: "hidden",
277
273
  bannerText: "",
278
274
  categories: [],
@@ -313,7 +309,7 @@ export function mountLibrarySurface(
313
309
  uploadAccept: "",
314
310
  uploadHint: "",
315
311
  view: "loading",
316
- }) as LibraryScope;
312
+ });
317
313
  project(scope, view);
318
314
 
319
315
  let mounted: SurfaceHandle | null = null;
@@ -340,12 +336,15 @@ export function mountLibrarySurface(
340
336
  }
341
337
  },
342
338
  }).then((surface) => {
339
+ /* SAFETY: `library-pane.json`'s root definition is a `div` element, so the runtime mounts an
340
+ HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
341
+ const root = surface.root as HTMLElement;
343
342
  if (disposed) {
344
343
  surface.dispose();
345
- return surface.root as HTMLElement;
344
+ return root;
346
345
  }
347
346
  mounted = surface;
348
- return surface.root as HTMLElement;
347
+ return root;
349
348
  });
350
349
 
351
350
  return {
@@ -21,20 +21,15 @@
21
21
  * @docs studio/logic/events
22
22
  */
23
23
 
24
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
24
25
  import { reactive } from "../reactivity";
25
26
  import { mountSurface, registerSurface } from "../ui/surface";
26
27
  import logicPanelDoc from "./logic-panel.json";
27
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
28
+ import type { JxElement } from "@jxsuite/schema/types";
28
29
  import type { JxScope } from "@jxsuite/runtime/types";
29
- import type { SurfaceHandle } from "../ui/surface";
30
+ import type { SurfaceAction, SurfaceHandle, SurfaceOption } from "../ui/surface";
30
31
 
31
- registerSurface("logic-panel", logicPanelDoc as unknown as JxDocument);
32
-
33
- /** A closed list of choices, in the shape the kit's select reads. */
34
- export interface LogicOption {
35
- value: string;
36
- label: string;
37
- }
32
+ registerSurface("logic-panel", logicPanelDoc);
38
33
 
39
34
  /** Which control a bindable row draws. The flow picks it; the document switches on it. */
40
35
  export type LogicFieldKind = "control" | "text" | "select";
@@ -55,7 +50,7 @@ export interface LogicFieldView {
55
50
  /** What a `text` or `select` control holds. Empty for a control host. */
56
51
  value: string;
57
52
  placeholder: string;
58
- options: LogicOption[];
53
+ options: SurfaceOption[];
59
54
  /** Draw the text control monospaced — a pointer or a template string. */
60
55
  mono: boolean;
61
56
  /** The rung's own id, for `data-source`. */
@@ -131,7 +126,7 @@ export interface LogicBindingView {
131
126
  /** The code body's text. Empty for every other body. */
132
127
  code: string;
133
128
  refValue: string;
134
- refOptions: LogicOption[];
129
+ refOptions: SurfaceOption[];
135
130
  /** The escape hatch's accessible name — the code editor, or the formula workspace. */
136
131
  openTitle: string;
137
132
  }
@@ -149,12 +144,6 @@ export interface LogicKvView {
149
144
  tags: string;
150
145
  }
151
146
 
152
- /** One button of an empty state — an id the flow knows, and the words on it. */
153
- export interface LogicEmptyAction {
154
- id: string;
155
- label: string;
156
- }
157
-
158
147
  /** Everything the Logic tab shows, already decided. */
159
148
  export interface LogicView {
160
149
  /** `empty` or `ready` — no document, no selection and a stale one are all the first. */
@@ -164,7 +153,7 @@ export interface LogicView {
164
153
  * What the reader can do about it. An empty state that teaches nothing offers none
165
154
  * (studio-ui-guidelines.md §11.1).
166
155
  */
167
- emptyActions: LogicEmptyAction[];
156
+ emptyActions: SurfaceAction[];
168
157
  hasEmptyActions: boolean;
169
158
 
170
159
  hasRepeater: boolean;
@@ -233,7 +222,7 @@ export interface LogicIslands {
233
222
  statementsSlot: (key: string, host: HTMLElement) => void;
234
223
  }
235
224
 
236
- interface LogicScope extends Record<string, unknown>, LogicView, LogicActions {}
225
+ interface LogicScope extends LogicView, LogicActions {}
237
226
 
238
227
  export interface LogicSurface {
239
228
  /** Re-project. The document's bindings skip every value that did not move. */
@@ -279,23 +268,21 @@ export function emptyLogicView(): LogicView {
279
268
 
280
269
  /** Assign the projection field by field: the runtime writes only the bindings that moved. */
281
270
  function project(scope: LogicScope, view: LogicView): void {
282
- for (const [key, value] of Object.entries(view)) {
283
- (scope as Record<string, unknown>)[key] = value;
284
- }
271
+ Object.assign(scope, view);
285
272
  }
286
273
 
287
274
  /** The `part` a node was rendered with, or "". */
288
275
  function partOf(def: JxElement | string): string {
289
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
290
- return typeof part === "string" ? part : "";
276
+ const part = isString(def) ? undefined : def.attributes?.["part"];
277
+ return isString(part) ? part : "";
291
278
  }
292
279
 
293
280
  /** The `key` of the `$map` item a node was rendered inside, or "". */
294
281
  function itemKey(state: JxScope | undefined): string {
295
- const item = (state?.["$map"] as { item?: unknown } | undefined)?.item;
296
- const key =
297
- item !== null && typeof item === "object" ? (item as Record<string, unknown>).key : "";
298
- return typeof key === "string" ? key : "";
282
+ const map = state?.["$map"];
283
+ const item = isJsonObject(map) ? map["item"] : undefined;
284
+ const key = isJsonObject(item) ? item["key"] : "";
285
+ return isString(key) ? key : "";
299
286
  }
300
287
 
301
288
  /**
@@ -316,10 +303,10 @@ export function mountLogicSurface(
316
303
  actions: LogicActions,
317
304
  islands: LogicIslands,
318
305
  ): LogicSurface {
319
- const scope = reactive<LogicScope>({
306
+ const scope: LogicScope = reactive<LogicScope>({
320
307
  ...emptyLogicView(),
321
308
  ...actions,
322
- } as LogicScope) as LogicScope;
309
+ });
323
310
  project(scope, view);
324
311
 
325
312
  let mounted: SurfaceHandle | null = null;
@@ -29,14 +29,15 @@
29
29
  * @docs studio/logic/formula-workspace
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 logicWorkspaceDoc from "./logic-workspace.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("logic-workspace", logicWorkspaceDoc as unknown as JxDocument);
40
+ registerSurface("logic-workspace", logicWorkspaceDoc);
40
41
 
41
42
  /** One chip of the pipeline, as the document draws it. */
42
43
  export interface LogicChipView {
@@ -112,8 +113,7 @@ export interface LogicWorkspaceIslands {
112
113
  treeSlot: (key: string, host: HTMLElement) => void;
113
114
  }
114
115
 
115
- interface LogicWorkspaceScope
116
- extends Record<string, unknown>, LogicWorkspaceView, LogicWorkspaceActions {}
116
+ interface LogicWorkspaceScope extends LogicWorkspaceView, LogicWorkspaceActions {}
117
117
 
118
118
  export interface LogicWorkspaceSurface {
119
119
  /** Re-project. The document's bindings skip every value that did not move. */
@@ -151,23 +151,21 @@ export function emptyLogicWorkspaceView(): LogicWorkspaceView {
151
151
 
152
152
  /** Assign the projection field by field: the runtime writes only the bindings that moved. */
153
153
  function project(scope: LogicWorkspaceScope, view: LogicWorkspaceView): void {
154
- for (const [key, value] of Object.entries(view)) {
155
- (scope as Record<string, unknown>)[key] = value;
156
- }
154
+ Object.assign(scope, view);
157
155
  }
158
156
 
159
157
  /** The `part` a node was rendered with, or "". */
160
158
  function partOf(def: JxElement | string): string {
161
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
162
- return typeof part === "string" ? part : "";
159
+ const part = isString(def) ? undefined : def.attributes?.["part"];
160
+ return isString(part) ? part : "";
163
161
  }
164
162
 
165
163
  /** The `key` of the `$map` item a node was rendered inside, or "". */
166
164
  function itemKey(state: JxScope | undefined): string {
167
- const item = (state?.["$map"] as { item?: unknown } | undefined)?.item;
168
- const key =
169
- item !== null && typeof item === "object" ? (item as Record<string, unknown>).key : "";
170
- return typeof key === "string" ? key : "";
165
+ const map = state?.["$map"];
166
+ const item = isJsonObject(map) ? map["item"] : undefined;
167
+ const key = isJsonObject(item) ? item["key"] : "";
168
+ return isString(key) ? key : "";
171
169
  }
172
170
 
173
171
  /**
@@ -187,10 +185,10 @@ export function mountLogicWorkspace(
187
185
  actions: LogicWorkspaceActions,
188
186
  islands: LogicWorkspaceIslands,
189
187
  ): LogicWorkspaceSurface {
190
- const scope = reactive<LogicWorkspaceScope>({
188
+ const scope: LogicWorkspaceScope = reactive<LogicWorkspaceScope>({
191
189
  ...emptyLogicWorkspaceView(),
192
190
  ...actions,
193
- } as LogicWorkspaceScope) as LogicWorkspaceScope;
191
+ });
194
192
  project(scope, view);
195
193
 
196
194
  let mounted: SurfaceHandle | null = null;
@@ -26,10 +26,9 @@ import { openPopoverSurface } from "../ui/popover-surface";
26
26
  import { reactive } from "../reactivity";
27
27
  import { registerSurface } from "../ui/surface";
28
28
  import mediaBrowserDoc from "./media-browser.json";
29
- import type { JxDocument } from "@jxsuite/schema/types";
30
- import type { PopoverSurfaceHandle } from "../ui/popover-surface";
29
+ import type { OpenPopoverSurfaceOptions, PopoverSurfaceHandle } from "../ui/popover-surface";
31
30
 
32
- registerSurface("media-browser", mediaBrowserDoc as unknown as JxDocument);
31
+ registerSurface("media-browser", mediaBrowserDoc);
33
32
 
34
33
  /** The slot id, and so the panel's region: `overlay.menu:media-picker`. */
35
34
  const SLOT = "media-picker";
@@ -79,8 +78,7 @@ export interface MediaBrowserSurfaceHandle extends PopoverSurfaceHandle {
79
78
  update: (view: MediaBrowserView) => void;
80
79
  }
81
80
 
82
- interface MediaBrowserScope
83
- extends Record<string, unknown>, MediaBrowserView, Omit<MediaBrowserActions, "dismissed"> {}
81
+ interface MediaBrowserScope extends MediaBrowserView, Omit<MediaBrowserActions, "dismissed"> {}
84
82
 
85
83
  /** Write a projection into the scope. */
86
84
  function project(scope: MediaBrowserScope, view: MediaBrowserView): void {
@@ -107,7 +105,7 @@ export function openMediaBrowserSurface(
107
105
  actions: MediaBrowserActions,
108
106
  anchor: HTMLElement | null,
109
107
  ): MediaBrowserSurfaceHandle {
110
- const scope = reactive<MediaBrowserScope>({
108
+ const scope: MediaBrowserScope = reactive<MediaBrowserScope>({
111
109
  emptyLabel: view.emptyLabel,
112
110
  filter: view.filter,
113
111
  measure: actions.measure,
@@ -119,15 +117,18 @@ export function openMediaBrowserSurface(
119
117
  setFilter: actions.setFilter,
120
118
  x: view.x,
121
119
  y: view.y,
122
- }) as MediaBrowserScope;
120
+ });
123
121
 
124
- const handle = openPopoverSurface({
122
+ const options: OpenPopoverSurfaceOptions<MediaBrowserScope> = {
125
123
  anchor,
126
124
  name: "media-browser",
127
125
  scope,
128
126
  slot: SLOT,
129
- ...(actions.dismissed ? { onDismissed: actions.dismissed } : {}),
130
- });
127
+ };
128
+ if (actions.dismissed) {
129
+ options.onDismissed = actions.dismissed;
130
+ }
131
+ const handle = openPopoverSurface(options);
131
132
 
132
133
  void handle.ready.then(() => {
133
134
  if (handle.isOpen()) {
@@ -22,10 +22,9 @@
22
22
  import { reactive } from "../reactivity";
23
23
  import { mountSurface, registerSurface } from "../ui/surface";
24
24
  import mediaFieldDoc from "./media-field.json";
25
- import type { JxDocument } from "@jxsuite/schema/types";
26
25
  import type { SurfaceHandle } from "../ui/surface";
27
26
 
28
- registerSurface("media-field", mediaFieldDoc as unknown as JxDocument);
27
+ registerSurface("media-field", mediaFieldDoc);
29
28
 
30
29
  /** Everything the control draws, as one value. */
31
30
  export interface MediaFieldView {
@@ -58,7 +57,7 @@ export interface MediaFieldHandle {
58
57
  }
59
58
 
60
59
  /** The scope the document reads. */
61
- interface MediaFieldScope extends Record<string, unknown>, MediaFieldView, MediaFieldActions {}
60
+ interface MediaFieldScope extends MediaFieldView, MediaFieldActions {}
62
61
 
63
62
  /** Write a projection into the scope. */
64
63
  function project(scope: MediaFieldScope, view: MediaFieldView): void {
@@ -81,7 +80,7 @@ export function mountMediaFieldSurface(
81
80
  view: MediaFieldView,
82
81
  actions: MediaFieldActions,
83
82
  ): MediaFieldHandle {
84
- const scope = reactive<MediaFieldScope>({
83
+ const scope: MediaFieldScope = reactive<MediaFieldScope>({
85
84
  browse: actions.browse,
86
85
  edit: actions.edit,
87
86
  label: view.label,
@@ -90,7 +89,7 @@ export function mountMediaFieldSurface(
90
89
  upload: actions.upload,
91
90
  value: view.value,
92
91
  warm: actions.warm,
93
- }) as MediaFieldScope;
92
+ });
94
93
 
95
94
  let mounted: SurfaceHandle | null = null;
96
95
  let disposed = false;
@@ -24,10 +24,9 @@
24
24
  import { reactive } from "../reactivity";
25
25
  import { mountSurface, registerSurface } from "../ui/surface";
26
26
  import mediaDoc from "./media-pane.json";
27
- import type { JxDocument } from "@jxsuite/schema/types";
28
27
  import type { SurfaceHandle } from "../ui/surface";
29
28
 
30
- registerSurface("media-pane", mediaDoc as unknown as JxDocument);
29
+ registerSurface("media-pane", mediaDoc);
31
30
 
32
31
  /**
33
32
  * Which element the stage draws the file in.
@@ -105,7 +104,7 @@ export interface MediaSurfaceHandle {
105
104
  * `$switch` discriminant derived here — "is there a list" is a restatement of the list, and a view
106
105
  * that had to keep the two in step would be a second place to get it wrong.
107
106
  */
108
- interface MediaScope extends Record<string, unknown>, MediaView, MediaActions {
107
+ interface MediaScope extends MediaView, MediaActions {
109
108
  hasUsageFiles: boolean;
110
109
  }
111
110
 
@@ -141,7 +140,7 @@ export function mountMediaSurface(
141
140
  actions: MediaActions,
142
141
  ): MediaSurfaceHandle {
143
142
  host.replaceChildren();
144
- const scope = reactive<MediaScope>({
143
+ const scope: MediaScope = reactive<MediaScope>({
145
144
  copyRef: actions.copyRef,
146
145
  extLabel: "",
147
146
  facts: "",
@@ -159,7 +158,7 @@ export function mountMediaSurface(
159
158
  usageFiles: [],
160
159
  usageHeadline: "",
161
160
  usageState: "hidden",
162
- }) as MediaScope;
161
+ });
163
162
  project(scope, view);
164
163
 
165
164
  let mounted: SurfaceHandle | null = null;
@@ -171,9 +170,11 @@ export function mountMediaSurface(
171
170
  const ready = mountSurface("media-pane", scope, host).then((surface) => {
172
171
  if (disposed) {
173
172
  surface.dispose();
174
- return surface.root as HTMLElement;
173
+ } else {
174
+ mounted = surface;
175
175
  }
176
- mounted = surface;
176
+ /* SAFETY: `media-pane.json`'s root definition is a `div` element, so the runtime mounts an
177
+ HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
177
178
  return surface.root as HTMLElement;
178
179
  });
179
180