@jxsuite/studio 6.1.0 → 6.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (645) hide show
  1. package/dist/chunks/2020-f2gkpy8d.js +4 -0
  2. package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
  3. package/dist/chunks/adapter-4912g339.js +4 -0
  4. package/dist/chunks/cf-account-picker-wccaenh6.js +4 -0
  5. package/dist/chunks/cf-settings-br6105tr.js +4 -0
  6. package/dist/chunks/color-28ksk2qm.js +4 -0
  7. package/dist/chunks/color-area-0fj8a4ga.js +4 -0
  8. package/dist/chunks/color-field-xch8kx2g.js +4 -0
  9. package/dist/chunks/color-slider-jxd8v350.js +4 -0
  10. package/dist/chunks/combobox-p0efwjke.js +4 -0
  11. package/dist/chunks/components-db68vsn7.js +4 -0
  12. package/dist/chunks/content-source-1449qesq.js +4 -0
  13. package/dist/chunks/convert-to-repeater-5h457egj.js +4 -0
  14. package/dist/chunks/dialog-c4x05vyx.js +4 -0
  15. package/dist/chunks/editor-x9jn86a7.js +4 -0
  16. package/dist/chunks/entry-commands-may24cpt.js +4 -0
  17. package/dist/chunks/extension-sections-pvr14vxr.js +4 -0
  18. package/dist/chunks/file-ops-x9v54pcj.js +4 -0
  19. package/dist/chunks/files-j3knqf0s.js +4 -0
  20. package/dist/chunks/format-host-tyre2trb.js +4 -0
  21. package/dist/chunks/fs-events-64ma9htc.js +4 -0
  22. package/dist/chunks/git-panel-84ps5dex.js +4 -0
  23. package/dist/chunks/grid-view-d2wq9ezg.js +51 -0
  24. package/dist/chunks/icons-pnfz478q.js +4 -0
  25. package/dist/chunks/iframe-entry-fvbk89gm.js +5 -0
  26. package/dist/chunks/iframe-entry-jdcktez8.js +5 -0
  27. package/dist/chunks/iframe-entry-x0ygf2yr.js +5 -0
  28. package/dist/chunks/iframe-entry-zap785cw.js +5 -0
  29. package/dist/chunks/iframe-host-ck6vejt5.js +4 -0
  30. package/dist/chunks/index-b8xw3vy9.js +4 -0
  31. package/dist/chunks/{index-gybvv7a6.js → index-zpjmzqfk.js} +3 -3
  32. package/dist/chunks/{javascript-rnvdp3k4.js → javascript-m54mnwp6.js} +3 -3
  33. package/dist/chunks/jsonMode-w15cmrcm.js +13 -0
  34. package/dist/chunks/jx-validate-at3zn8wa.js +4 -0
  35. package/dist/chunks/layers-h4xp1pss.js +4 -0
  36. package/dist/chunks/layers-panel-m5hw1d7g.js +4 -0
  37. package/dist/chunks/listbox-e74qjyq6.js +4 -0
  38. package/dist/chunks/lit-html-8t8t3dnr.js +4 -0
  39. package/dist/chunks/media-picker-2cweexc5.js +4 -0
  40. package/dist/chunks/menu-n6yzswmy.js +4 -0
  41. package/dist/chunks/menu-ynw13y0s.js +4 -0
  42. package/dist/chunks/monaco-binding-7gx83x3r.js +4 -0
  43. package/dist/chunks/monaco-buffer-qzxn567r.js +4 -0
  44. package/dist/chunks/monaco-setup-gxf6656g.js +4 -0
  45. package/dist/chunks/notify-cj5zbrs2.js +4 -0
  46. package/dist/chunks/number-field-y62xq0ty.js +4 -0
  47. package/dist/chunks/parse-b7ddhr8m.js +4 -0
  48. package/dist/chunks/platform-3dfws9js.js +4 -0
  49. package/dist/chunks/popover-jt2gxmzs.js +4 -0
  50. package/dist/chunks/publish-panel-1gvxbj21.js +4 -0
  51. package/dist/chunks/quick-search-0dajrwqg.js +4 -0
  52. package/dist/chunks/references-49qgt404.js +4 -0
  53. package/dist/chunks/right-panel-jm1bwe53.js +4 -0
  54. package/dist/chunks/section-registry-6kwc4fky.js +4 -0
  55. package/dist/chunks/select-rzds841e.js +4 -0
  56. package/dist/chunks/split-n2gfpm5m.js +4 -0
  57. package/dist/chunks/{studio-5g0ag7c0.js → studio-0q988f9w.js} +3 -3
  58. package/dist/chunks/studio-0rt52vpq.js +5 -0
  59. package/dist/chunks/studio-18vgbhs5.js +5 -0
  60. package/dist/chunks/{studio-pxg4ap1e.js → studio-1fxkaaea.js} +4 -4
  61. package/dist/chunks/studio-24mccdrj.js +5 -0
  62. package/dist/chunks/studio-2eh507zk.js +9 -0
  63. package/dist/chunks/studio-2hcbccfv.js +5 -0
  64. package/dist/chunks/studio-2j1cb95x.js +5 -0
  65. package/dist/chunks/studio-2jbs3rxv.js +5 -0
  66. package/dist/chunks/{studio-qbj760tx.js → studio-485046te.js} +7 -7
  67. package/dist/chunks/studio-4h8k4dw9.js +5 -0
  68. package/dist/chunks/studio-5f6n18kx.js +5 -0
  69. package/dist/chunks/studio-5gthpky6.js +5 -0
  70. package/dist/chunks/studio-5ve6bbep.js +5 -0
  71. package/dist/chunks/studio-6ep3js6b.js +9 -0
  72. package/dist/chunks/studio-6wkmf3wz.js +9 -0
  73. package/dist/chunks/studio-841rf3cg.js +5 -0
  74. package/dist/chunks/studio-8gmwgheg.js +5 -0
  75. package/dist/chunks/studio-8qm0ep50.js +5 -0
  76. package/dist/chunks/{studio-anyrgzvb.js → studio-90pq9km1.js} +4 -4
  77. package/dist/chunks/studio-924p1tm1.js +6 -0
  78. package/dist/chunks/{studio-v2bvmbjj.js → studio-a3g98wjr.js} +4 -4
  79. package/dist/chunks/studio-a3shpz9y.js +5 -0
  80. package/dist/chunks/studio-amsbaaar.js +6 -0
  81. package/dist/chunks/studio-at5spjbc.js +7 -0
  82. package/dist/chunks/studio-b2xv945e.js +5 -0
  83. package/dist/chunks/studio-bn5nkafw.js +5 -0
  84. package/dist/chunks/studio-bw6q5xjf.js +9 -0
  85. package/dist/chunks/studio-c7q0t9x1.js +5 -0
  86. package/dist/chunks/studio-camnhc96.js +6 -0
  87. package/dist/chunks/studio-cffqvnzd.js +5 -0
  88. package/dist/chunks/studio-d81xfh1g.js +5 -0
  89. package/dist/chunks/studio-dgz8d0c1.js +5 -0
  90. package/dist/chunks/studio-efvfrsf8.js +5 -0
  91. package/dist/chunks/studio-er30bpcx.js +5 -0
  92. package/dist/chunks/studio-ezscgr64.js +5 -0
  93. package/dist/chunks/studio-ffrrncvz.js +5 -0
  94. package/dist/chunks/studio-fpphgn8y.js +10 -0
  95. package/dist/chunks/studio-j1kvhdjk.js +4 -0
  96. package/dist/chunks/{studio-txjjzrsm.js → studio-j430n16g.js} +5 -5
  97. package/dist/chunks/studio-jjkg84nj.js +5 -0
  98. package/dist/chunks/studio-m0q32ars.js +4 -0
  99. package/dist/chunks/studio-m6bdst11.js +5 -0
  100. package/dist/chunks/studio-nv2cptd4.js +64 -0
  101. package/dist/chunks/studio-nwfrc98n.js +5 -0
  102. package/dist/chunks/studio-p1wgvp7r.js +5 -0
  103. package/dist/chunks/studio-pag2wncm.js +5 -0
  104. package/dist/chunks/studio-qvanvzfd.js +5 -0
  105. package/dist/chunks/studio-qwa64kt7.js +5 -0
  106. package/dist/chunks/studio-rk1zc4x3.js +928 -0
  107. package/dist/chunks/studio-se2r3ptc.js +5 -0
  108. package/dist/chunks/studio-sg2a0dh0.js +5 -0
  109. package/dist/chunks/studio-tjzjhe68.js +5 -0
  110. package/dist/chunks/{studio-0x3jyb8r.js → studio-tq0rtfwj.js} +4 -4
  111. package/dist/chunks/{studio-cpxkgjrj.js → studio-v0jzqdjm.js} +4 -4
  112. package/dist/chunks/studio-v2w7q8r1.js +7 -0
  113. package/dist/chunks/studio-v5vjq1h0.js +4 -0
  114. package/dist/chunks/studio-v8aga3vp.js +14 -0
  115. package/dist/chunks/studio-vfcdrfmv.js +5 -0
  116. package/dist/chunks/studio-vmfkgdjf.js +5 -0
  117. package/dist/chunks/studio-wt1816jj.js +5 -0
  118. package/dist/chunks/studio-wz73q5kq.js +4 -0
  119. package/dist/chunks/studio-y04qtxvp.js +7 -0
  120. package/dist/chunks/studio-y21g8zzg.js +5 -0
  121. package/dist/chunks/studio-y64hrt8p.js +12 -0
  122. package/dist/chunks/studio-ynn90f58.js +16 -0
  123. package/dist/chunks/studio-yxz682sx.js +5 -0
  124. package/dist/chunks/studio-zp7snvkq.js +5 -0
  125. package/dist/chunks/studio-zq4z6tm6.js +5 -0
  126. package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
  127. package/dist/chunks/tabs-f5cw3tgp.js +4 -0
  128. package/dist/chunks/textfield-wewc8rq2.js +4 -0
  129. package/dist/chunks/toast-c9fn075p.js +4 -0
  130. package/dist/chunks/toast-host-ke5z4ng7.js +4 -0
  131. package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
  132. package/dist/chunks/tooltip-5v8ngwj2.js +4 -0
  133. package/dist/chunks/tree-mdq3v5cw.js +4 -0
  134. package/dist/chunks/tsMode-sf49ee9x.js +14 -0
  135. package/dist/chunks/workspace-jtfahpee.js +4 -0
  136. package/dist/chunks/ws-client-nze0k6mv.js +4 -0
  137. package/dist/iframe-entry.js +16 -16
  138. package/dist/manifest.json +63 -63
  139. package/dist/studio.js +98 -98
  140. package/dist/workers/ts.worker.js +3 -3
  141. package/package.json +11 -11
  142. package/src/about/about-modal.ts +4 -3
  143. package/src/account/action-flow.ts +45 -38
  144. package/src/account-status.ts +7 -2
  145. package/src/browse/library-layouts.ts +8 -5
  146. package/src/browse/library-model.ts +18 -6
  147. package/src/browse/library-pane.ts +37 -21
  148. package/src/browse/library-preview.ts +14 -9
  149. package/src/browse/library-source.ts +1 -1
  150. package/src/canvas/asset-refs.ts +24 -9
  151. package/src/canvas/asset-resolve.ts +19 -23
  152. package/src/canvas/canvas-helpers.ts +7 -6
  153. package/src/canvas/canvas-live-render.ts +44 -53
  154. package/src/canvas/canvas-patcher.ts +30 -30
  155. package/src/canvas/canvas-perf.ts +11 -5
  156. package/src/canvas/canvas-render.ts +66 -42
  157. package/src/canvas/canvas-surface.ts +5 -3
  158. package/src/canvas/canvas-utils.ts +163 -64
  159. package/src/canvas/dialog-path.ts +9 -4
  160. package/src/canvas/dialog-state.ts +1 -2
  161. package/src/canvas/diff-marks.ts +9 -16
  162. package/src/canvas/diff-toolbar.ts +8 -7
  163. package/src/canvas/edit-width-drag.ts +4 -1
  164. package/src/canvas/edit-width.ts +1 -3
  165. package/src/canvas/iframe-channel.ts +27 -13
  166. package/src/canvas/iframe-drop.ts +13 -12
  167. package/src/canvas/iframe-editable-root.ts +29 -16
  168. package/src/canvas/iframe-entry.ts +80 -63
  169. package/src/canvas/iframe-eval.ts +73 -49
  170. package/src/canvas/iframe-host.ts +203 -118
  171. package/src/canvas/iframe-inline-edit.ts +69 -32
  172. package/src/canvas/iframe-insert.ts +5 -4
  173. package/src/canvas/iframe-interaction.ts +37 -26
  174. package/src/canvas/iframe-overlay.ts +1 -1
  175. package/src/canvas/iframe-patch.ts +18 -15
  176. package/src/canvas/iframe-position.ts +12 -6
  177. package/src/canvas/iframe-protocol.ts +15 -16
  178. package/src/canvas/iframe-render.ts +41 -36
  179. package/src/canvas/iframe-slash.ts +24 -11
  180. package/src/canvas/iframe-subtree.ts +6 -2
  181. package/src/canvas/path-mapping.ts +19 -12
  182. package/src/canvas/popover-path.ts +7 -3
  183. package/src/canvas/popover-state.ts +1 -2
  184. package/src/canvas/serialize-scope.ts +13 -5
  185. package/src/canvas/stage-scrollbar.ts +2 -1
  186. package/src/canvas/surface-registry.ts +21 -3
  187. package/src/collab/collab-commands.ts +7 -2
  188. package/src/collab/collab-session.ts +84 -45
  189. package/src/collab/collab-state.ts +4 -3
  190. package/src/collab/monaco-binding.ts +16 -13
  191. package/src/collab/monaco-cursors.ts +5 -2
  192. package/src/commands/budget.ts +3 -3
  193. package/src/commands/command-args.ts +103 -71
  194. package/src/commands/context.ts +22 -20
  195. package/src/commands/defaults.ts +4 -1
  196. package/src/commands/keymap.ts +47 -43
  197. package/src/commands/levels.ts +3 -3
  198. package/src/commands/live-context.ts +10 -8
  199. package/src/commands/reference.ts +2 -1
  200. package/src/commands/registry.ts +12 -10
  201. package/src/commands/run-reported.ts +15 -10
  202. package/src/component-props.ts +46 -30
  203. package/src/content/collection-match.ts +5 -4
  204. package/src/content/draft-state.ts +4 -3
  205. package/src/content/entry-commands.ts +3 -2
  206. package/src/content/entry-editor.ts +29 -17
  207. package/src/content/entry-fields.ts +12 -7
  208. package/src/content/entry-model.ts +21 -12
  209. package/src/editor/canvas-context-menu.ts +1 -2
  210. package/src/editor/canvas-slash-bridge.ts +3 -6
  211. package/src/editor/content-slice.ts +16 -14
  212. package/src/editor/context-menu.ts +35 -22
  213. package/src/editor/convert-targets.ts +30 -35
  214. package/src/editor/convert-to-component.ts +11 -5
  215. package/src/editor/convert-to-repeater.ts +34 -22
  216. package/src/editor/editable-tags.ts +17 -2
  217. package/src/editor/file-drop-action.ts +21 -22
  218. package/src/editor/inline-edit-apply.ts +35 -17
  219. package/src/editor/inline-edit.ts +66 -50
  220. package/src/editor/inline-format.ts +59 -56
  221. package/src/editor/inline-link.ts +40 -15
  222. package/src/editor/insert-zone-action.ts +1 -1
  223. package/src/editor/merge-tags.ts +58 -19
  224. package/src/editor/repeater-scope.ts +39 -28
  225. package/src/editor/shortcuts.ts +87 -47
  226. package/src/editor/slash-menu.ts +1 -6
  227. package/src/files/asset-versions.ts +4 -4
  228. package/src/files/components.ts +15 -10
  229. package/src/files/elements.ts +5 -6
  230. package/src/files/file-ops.ts +77 -36
  231. package/src/files/files.ts +90 -95
  232. package/src/files/media-meta.ts +2 -1
  233. package/src/files/media-paths.ts +6 -1
  234. package/src/files/serialize-document.ts +2 -2
  235. package/src/format/constraints.ts +1 -1
  236. package/src/format/convert-file.ts +27 -13
  237. package/src/format/format-choices.ts +2 -1
  238. package/src/format/format-host.ts +76 -50
  239. package/src/github/github-auth-status.ts +27 -3
  240. package/src/github/github-auth.ts +19 -9
  241. package/src/github/github-publish.ts +24 -20
  242. package/src/grid/cell-editors.ts +46 -31
  243. package/src/grid/cell-popovers.ts +5 -3
  244. package/src/grid/edit-buffer.ts +10 -9
  245. package/src/grid/grid-controller.ts +20 -22
  246. package/src/grid/grid-layout.ts +21 -5
  247. package/src/grid/grid-open.ts +3 -6
  248. package/src/grid/grid-panel.ts +11 -4
  249. package/src/grid/grid-source.ts +8 -8
  250. package/src/grid/grid-view.ts +14 -17
  251. package/src/grid/redirects-grid.ts +14 -5
  252. package/src/grid/redirects.ts +16 -14
  253. package/src/grid/schema-columns.ts +25 -19
  254. package/src/grid/sources/connector-source.ts +47 -20
  255. package/src/grid/sources/content-source.ts +25 -24
  256. package/src/grid/sources/csv-file-source.ts +2 -2
  257. package/src/grid/tabulator-tables.d.ts +55 -34
  258. package/src/hosting/stage.ts +7 -7
  259. package/src/i18n/i18n-commands.ts +1 -2
  260. package/src/media/media-pane.ts +4 -1
  261. package/src/new-project/add-repo-modal.ts +20 -19
  262. package/src/new-project/import-tab.ts +10 -14
  263. package/src/new-project/location-fields.ts +2 -1
  264. package/src/new-project/new-project-modal.ts +12 -9
  265. package/src/packages/jxsuite-update.ts +4 -3
  266. package/src/packages/pull-package-sync.ts +26 -25
  267. package/src/page-params.ts +97 -68
  268. package/src/panels/activity-panel.ts +17 -9
  269. package/src/panels/ai-chat/attached-context.ts +13 -7
  270. package/src/panels/ai-chat/chat-view.ts +80 -73
  271. package/src/panels/ai-chat/composer.ts +30 -33
  272. package/src/panels/ai-chat/sessions-view.ts +1 -2
  273. package/src/panels/ai-panel.ts +23 -20
  274. package/src/panels/block-action-bar.ts +46 -35
  275. package/src/panels/bottom-dock.ts +5 -3
  276. package/src/panels/canvas-dnd-bridge.ts +31 -24
  277. package/src/panels/data-explorer.ts +62 -25
  278. package/src/panels/data-grid.ts +14 -11
  279. package/src/panels/dnd.ts +108 -118
  280. package/src/panels/editors.ts +55 -22
  281. package/src/panels/elements-panel.ts +10 -3
  282. package/src/panels/events-panel.ts +84 -69
  283. package/src/panels/formula-workspace.ts +76 -51
  284. package/src/panels/frontmatter-fields.ts +24 -19
  285. package/src/panels/frontmatter-panel.ts +44 -34
  286. package/src/panels/git-diff-open.ts +4 -4
  287. package/src/panels/git-panel.ts +49 -61
  288. package/src/panels/head-panel.ts +131 -111
  289. package/src/panels/i18n-panel.ts +10 -3
  290. package/src/panels/imports-panel.ts +23 -47
  291. package/src/panels/jump-bar.ts +48 -29
  292. package/src/panels/layers-panel.ts +97 -74
  293. package/src/panels/left-panel.ts +3 -3
  294. package/src/panels/pane-context.ts +31 -22
  295. package/src/panels/pane-grid.ts +49 -20
  296. package/src/panels/panel-registry.ts +22 -37
  297. package/src/panels/properties-panel.ts +175 -121
  298. package/src/panels/quick-search.ts +53 -31
  299. package/src/panels/right-panel.ts +3 -3
  300. package/src/panels/seo-modal.ts +13 -17
  301. package/src/panels/settings-menu.ts +15 -15
  302. package/src/panels/signals-panel.ts +153 -131
  303. package/src/panels/statement-editor.ts +230 -140
  304. package/src/panels/style-panel.ts +254 -216
  305. package/src/panels/style-utils.ts +114 -51
  306. package/src/panels/stylebook-doc.ts +57 -54
  307. package/src/panels/stylebook-layers-panel.ts +9 -9
  308. package/src/panels/stylebook-panel.ts +13 -17
  309. package/src/panels/tab-drop.ts +27 -11
  310. package/src/panels/tab-strip.ts +36 -26
  311. package/src/platform-errors.ts +57 -43
  312. package/src/platform.ts +58 -30
  313. package/src/platforms/cloud.ts +345 -175
  314. package/src/platforms/default-platform.ts +10 -4
  315. package/src/platforms/devserver.ts +174 -127
  316. package/src/platforms/read-batcher.ts +16 -8
  317. package/src/project-list.ts +2 -1
  318. package/src/publish/deploy-checklist.ts +8 -2
  319. package/src/publish/pages-service.ts +28 -13
  320. package/src/publish/publish-commands.ts +5 -4
  321. package/src/publish/publish-panel.ts +10 -6
  322. package/src/recent-projects.ts +15 -8
  323. package/src/resize-edges.ts +26 -36
  324. package/src/services/a11y-report.ts +26 -19
  325. package/src/services/agent-seed.ts +23 -11
  326. package/src/services/ai-ask.ts +9 -12
  327. package/src/services/ai-command-tools.ts +68 -62
  328. package/src/services/ai-import-tools.ts +80 -67
  329. package/src/services/ai-models.ts +17 -13
  330. package/src/services/ai-project-tools.ts +68 -32
  331. package/src/services/ai-session-store.ts +19 -10
  332. package/src/services/ai-system-prompt.ts +46 -20
  333. package/src/services/ai-tools.ts +71 -27
  334. package/src/services/ai-write-report.ts +20 -12
  335. package/src/services/ai-writes.ts +4 -4
  336. package/src/services/automation.ts +58 -31
  337. package/src/services/cem-export.ts +149 -58
  338. package/src/services/clock.ts +6 -1
  339. package/src/services/code-services.ts +37 -31
  340. package/src/services/context-manager.ts +14 -10
  341. package/src/services/context-resolver.ts +20 -8
  342. package/src/services/data-service.ts +19 -15
  343. package/src/services/directory-picker.ts +18 -12
  344. package/src/services/document-assistant.ts +39 -19
  345. package/src/services/gated-registry.ts +10 -6
  346. package/src/services/harness/chat-reducer.ts +23 -1
  347. package/src/services/import-client.ts +91 -38
  348. package/src/services/import-seed.ts +8 -2
  349. package/src/services/jx-validate.ts +28 -31
  350. package/src/services/live-preview.ts +0 -0
  351. package/src/services/live-surfaces.ts +6 -3
  352. package/src/services/model-uri.ts +10 -2
  353. package/src/services/module-preloads.ts +12 -8
  354. package/src/services/monaco-buffer.ts +43 -24
  355. package/src/services/monaco-lazy.ts +7 -8
  356. package/src/services/monaco-setup.ts +23 -16
  357. package/src/services/notify.ts +44 -17
  358. package/src/services/popover-report.ts +25 -10
  359. package/src/services/preview-eval.ts +20 -8
  360. package/src/services/profile.ts +13 -6
  361. package/src/services/project-path.ts +13 -10
  362. package/src/services/references.ts +0 -0
  363. package/src/services/render-critic.ts +8 -7
  364. package/src/services/settings/kernel.ts +13 -4
  365. package/src/services/settings/write-queue.ts +9 -9
  366. package/src/services/token-lint.ts +12 -10
  367. package/src/services/tool-executor.ts +17 -5
  368. package/src/services/tool-outcomes.ts +44 -24
  369. package/src/services/trusted-types.ts +24 -7
  370. package/src/settings/contexts-section.ts +11 -8
  371. package/src/settings/contributed-section.ts +79 -60
  372. package/src/settings/css-vars-editor.ts +37 -16
  373. package/src/settings/defs-editor.ts +38 -35
  374. package/src/settings/extension-rows.ts +16 -8
  375. package/src/settings/extension-sections.ts +23 -13
  376. package/src/settings/extensions-section.ts +4 -1
  377. package/src/settings/general-settings.ts +11 -8
  378. package/src/settings/locales-section.ts +20 -12
  379. package/src/settings/preferences-dialog.ts +9 -6
  380. package/src/settings/preferences-keymap.ts +7 -5
  381. package/src/settings/preferences-sections.ts +11 -5
  382. package/src/settings/project-sections.ts +1 -1
  383. package/src/settings/schema-field-ui.ts +9 -0
  384. package/src/settings/settings-document.ts +5 -5
  385. package/src/shell/tree.ts +6 -5
  386. package/src/shell.ts +104 -81
  387. package/src/site-context.ts +37 -22
  388. package/src/state.ts +41 -49
  389. package/src/store.ts +54 -34
  390. package/src/studio.ts +39 -77
  391. package/src/style/live-preview.ts +1 -1
  392. package/src/style/project-styles.ts +6 -7
  393. package/src/style/token-ref.ts +5 -4
  394. package/src/surfaces/about.ts +18 -19
  395. package/src/surfaces/add-repo.ts +17 -19
  396. package/src/surfaces/ai-chat.ts +31 -36
  397. package/src/surfaces/ai-credentials-form.ts +6 -16
  398. package/src/surfaces/ai-managed-connect.ts +3 -4
  399. package/src/surfaces/ai-model-picker.ts +3 -5
  400. package/src/surfaces/block-action-bar.ts +22 -11
  401. package/src/surfaces/boot-failure.ts +4 -5
  402. package/src/surfaces/bottom-dock.ts +9 -18
  403. package/src/surfaces/canvas-stage.ts +12 -11
  404. package/src/surfaces/cf-account-picker.ts +17 -18
  405. package/src/surfaces/commandbar.ts +14 -9
  406. package/src/surfaces/convert-repeater.ts +17 -19
  407. package/src/surfaces/data-actions.ts +9 -7
  408. package/src/surfaces/dialog.ts +26 -28
  409. package/src/surfaces/diff-toolbar.ts +9 -7
  410. package/src/surfaces/doc-header.ts +10 -19
  411. package/src/surfaces/empty-state.ts +7 -10
  412. package/src/surfaces/entry-editor.ts +14 -11
  413. package/src/surfaces/expression-editor.ts +11 -25
  414. package/src/surfaces/files-panel.ts +27 -14
  415. package/src/surfaces/formula-palette.ts +4 -5
  416. package/src/surfaces/git-panel.ts +7 -15
  417. package/src/surfaces/github-auth.ts +16 -20
  418. package/src/surfaces/github-publish.ts +17 -22
  419. package/src/surfaces/grid-cell.ts +30 -31
  420. package/src/surfaces/grid-open.ts +10 -14
  421. package/src/surfaces/grid-panel.ts +13 -9
  422. package/src/surfaces/grid-replace.ts +13 -13
  423. package/src/surfaces/grid-views.ts +15 -18
  424. package/src/surfaces/inspector-dock.ts +13 -12
  425. package/src/surfaces/jump-bar.ts +5 -6
  426. package/src/surfaces/jxsuite-update.ts +16 -22
  427. package/src/surfaces/library-pane.ts +25 -20
  428. package/src/surfaces/logic-panel.ts +17 -30
  429. package/src/surfaces/logic-workspace.ts +13 -15
  430. package/src/surfaces/media-browser.ts +11 -10
  431. package/src/surfaces/media-field.ts +4 -5
  432. package/src/surfaces/media-pane.ts +8 -7
  433. package/src/surfaces/menu.ts +29 -23
  434. package/src/surfaces/navigator-dock.ts +11 -12
  435. package/src/surfaces/new-project.ts +27 -26
  436. package/src/surfaces/pane-context.ts +20 -25
  437. package/src/surfaces/pane-grid.ts +15 -10
  438. package/src/surfaces/panel-activity.ts +5 -6
  439. package/src/surfaces/panel-data.ts +3 -4
  440. package/src/surfaces/panel-deploy-checklist.ts +5 -6
  441. package/src/surfaces/panel-elements.ts +5 -7
  442. package/src/surfaces/panel-i18n.ts +5 -7
  443. package/src/surfaces/panel-imports.ts +6 -13
  444. package/src/surfaces/panel-outline.ts +25 -19
  445. package/src/surfaces/panel-page.ts +11 -18
  446. package/src/surfaces/panel-problems.ts +5 -7
  447. package/src/surfaces/panel-signals.ts +20 -34
  448. package/src/surfaces/panel-stylebook-layers.ts +5 -8
  449. package/src/surfaces/preferences.ts +21 -11
  450. package/src/surfaces/progress-modal.ts +15 -9
  451. package/src/surfaces/properties-panel.json +1 -1
  452. package/src/surfaces/properties-panel.ts +20 -42
  453. package/src/surfaces/publish.ts +18 -18
  454. package/src/surfaces/push-plan.ts +7 -8
  455. package/src/surfaces/rail.json +126 -73
  456. package/src/surfaces/rail.ts +38 -12
  457. package/src/surfaces/reference-field.ts +11 -15
  458. package/src/surfaces/schema-builder.ts +16 -22
  459. package/src/surfaces/schema-form.ts +15 -25
  460. package/src/surfaces/secret-field.ts +9 -6
  461. package/src/surfaces/seo.ts +21 -15
  462. package/src/surfaces/settings-contexts.ts +9 -7
  463. package/src/surfaces/settings-contributed.ts +14 -10
  464. package/src/surfaces/settings-css-vars.ts +5 -12
  465. package/src/surfaces/settings-defs.json +2 -2
  466. package/src/surfaces/settings-defs.ts +17 -21
  467. package/src/surfaces/settings-deploy.ts +8 -15
  468. package/src/surfaces/settings-extensions.ts +5 -6
  469. package/src/surfaces/settings-head.ts +33 -39
  470. package/src/surfaces/settings-locales.ts +8 -20
  471. package/src/surfaces/settings-overview.ts +5 -6
  472. package/src/surfaces/settings-packages.ts +8 -7
  473. package/src/surfaces/settings-pane.ts +9 -18
  474. package/src/surfaces/settings-rawjson.ts +5 -6
  475. package/src/surfaces/shell.ts +1 -2
  476. package/src/surfaces/slash-menu.ts +19 -9
  477. package/src/surfaces/statements.ts +13 -18
  478. package/src/surfaces/statusbar.ts +17 -14
  479. package/src/surfaces/style-panel.ts +18 -31
  480. package/src/surfaces/stylebook-chrome.ts +3 -5
  481. package/src/surfaces/tab-strip.ts +14 -13
  482. package/src/surfaces/target-line.ts +6 -7
  483. package/src/surfaces/welcome.ts +5 -7
  484. package/src/tabs/patch-ops.ts +4 -3
  485. package/src/tabs/project-config.ts +32 -21
  486. package/src/tabs/selection.ts +36 -8
  487. package/src/tabs/tab.ts +52 -41
  488. package/src/tabs/transact.ts +98 -53
  489. package/src/tabs/typing.ts +31 -0
  490. package/src/types.ts +32 -17
  491. package/src/ui/ai-credentials-form.ts +10 -13
  492. package/src/ui/ai-model-picker.ts +3 -3
  493. package/src/ui/cf-account-picker.ts +7 -9
  494. package/src/ui/color-selector.ts +9 -5
  495. package/src/ui/dynamic-slot.ts +7 -8
  496. package/src/ui/expression-editor.ts +112 -105
  497. package/src/ui/form-controls.ts +57 -48
  498. package/src/ui/formula-catalog.ts +239 -230
  499. package/src/ui/formula-chips.ts +33 -18
  500. package/src/ui/layers.ts +44 -31
  501. package/src/ui/media-picker.ts +18 -9
  502. package/src/ui/popover-surface.ts +20 -12
  503. package/src/ui/progress-modal.ts +13 -8
  504. package/src/ui/regions.ts +7 -6
  505. package/src/ui/schema-form.ts +113 -70
  506. package/src/ui/surface.ts +71 -8
  507. package/src/ui/timing.ts +9 -0
  508. package/src/ui/value-source.ts +44 -31
  509. package/src/ui/virtual-window.ts +3 -2
  510. package/src/utils/base64.ts +3 -1
  511. package/src/utils/edit-display.ts +103 -74
  512. package/src/utils/element-selectors.ts +3 -2
  513. package/src/utils/google-fonts.ts +15 -14
  514. package/src/utils/inherited-style.ts +18 -20
  515. package/src/utils/link-target.ts +1 -1
  516. package/src/utils/preview-format.ts +25 -3
  517. package/src/utils/strip-events.ts +49 -22
  518. package/src/utils/studio-utils.ts +29 -14
  519. package/src/view.ts +2 -3
  520. package/src/workspace/pane-derive.ts +10 -12
  521. package/src/workspace/session.ts +53 -43
  522. package/src/workspace/workspace.ts +47 -36
  523. package/dist/chunks/2020-nkxms0ay.js +0 -4
  524. package/dist/chunks/adapter-m948ab5f.js +0 -4
  525. package/dist/chunks/cf-account-picker-n8hr38v7.js +0 -4
  526. package/dist/chunks/cf-settings-356xdtne.js +0 -4
  527. package/dist/chunks/color-area-jqhna8zy.js +0 -4
  528. package/dist/chunks/color-field-embq5ctg.js +0 -4
  529. package/dist/chunks/color-fpezvnkt.js +0 -4
  530. package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
  531. package/dist/chunks/combobox-773hdzyj.js +0 -4
  532. package/dist/chunks/components-yk3t844e.js +0 -4
  533. package/dist/chunks/content-source-bawmyc09.js +0 -4
  534. package/dist/chunks/convert-to-repeater-7wns8kf1.js +0 -4
  535. package/dist/chunks/dialog-mtm9fq5t.js +0 -4
  536. package/dist/chunks/editor-6sc8nacq.js +0 -4
  537. package/dist/chunks/entry-commands-8ay9fh81.js +0 -4
  538. package/dist/chunks/extension-sections-na7rj3nr.js +0 -4
  539. package/dist/chunks/file-ops-gye0qw56.js +0 -4
  540. package/dist/chunks/files-dmc2xvcq.js +0 -4
  541. package/dist/chunks/format-host-t76b53f8.js +0 -4
  542. package/dist/chunks/fs-events-cg4tpz06.js +0 -4
  543. package/dist/chunks/git-panel-yef7bshy.js +0 -4
  544. package/dist/chunks/grid-view-7tt4bxw1.js +0 -51
  545. package/dist/chunks/icons-qbh8akb1.js +0 -4
  546. package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
  547. package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
  548. package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
  549. package/dist/chunks/iframe-host-tmz30gfp.js +0 -4
  550. package/dist/chunks/index-nag78a9h.js +0 -4
  551. package/dist/chunks/jsonMode-zhwsprqk.js +0 -13
  552. package/dist/chunks/jx-validate-3gbp5nkn.js +0 -4
  553. package/dist/chunks/layers-fvz99859.js +0 -4
  554. package/dist/chunks/layers-panel-gchmbf9p.js +0 -4
  555. package/dist/chunks/listbox-s8fkmnq8.js +0 -4
  556. package/dist/chunks/lit-html-9agdspkt.js +0 -4
  557. package/dist/chunks/media-picker-rhjvyy00.js +0 -4
  558. package/dist/chunks/menu-2e4y9j7b.js +0 -4
  559. package/dist/chunks/menu-37d07z9m.js +0 -4
  560. package/dist/chunks/monaco-binding-2jnhjjvr.js +0 -4
  561. package/dist/chunks/monaco-buffer-rp21359g.js +0 -4
  562. package/dist/chunks/monaco-setup-vhh7gayr.js +0 -4
  563. package/dist/chunks/notify-h3www560.js +0 -4
  564. package/dist/chunks/number-field-gw7sq8rn.js +0 -4
  565. package/dist/chunks/parse-897fvqah.js +0 -4
  566. package/dist/chunks/platform-hz34wcd7.js +0 -4
  567. package/dist/chunks/popover-8htra4er.js +0 -4
  568. package/dist/chunks/publish-panel-exsmjzyj.js +0 -4
  569. package/dist/chunks/quick-search-pgaqeh0m.js +0 -4
  570. package/dist/chunks/references-2cgdxnb8.js +0 -4
  571. package/dist/chunks/right-panel-jf856w5w.js +0 -4
  572. package/dist/chunks/section-registry-jnf8r5gy.js +0 -4
  573. package/dist/chunks/select-n3v7gwas.js +0 -4
  574. package/dist/chunks/split-pff8f3ze.js +0 -4
  575. package/dist/chunks/studio-0f55h9ye.js +0 -5
  576. package/dist/chunks/studio-0sqdhnew.js +0 -12
  577. package/dist/chunks/studio-19x1c75w.js +0 -5
  578. package/dist/chunks/studio-2sqcndak.js +0 -5
  579. package/dist/chunks/studio-3aey7dd3.js +0 -5
  580. package/dist/chunks/studio-3bpdkq2s.js +0 -5
  581. package/dist/chunks/studio-47y6fbpf.js +0 -5
  582. package/dist/chunks/studio-4m3826v2.js +0 -5
  583. package/dist/chunks/studio-4nx2dj1g.js +0 -4
  584. package/dist/chunks/studio-4xv5s47r.js +0 -9
  585. package/dist/chunks/studio-5g4t8v6w.js +0 -5
  586. package/dist/chunks/studio-5py436sf.js +0 -5
  587. package/dist/chunks/studio-77kt594t.js +0 -5
  588. package/dist/chunks/studio-8f87n763.js +0 -10
  589. package/dist/chunks/studio-8mb00b84.js +0 -5
  590. package/dist/chunks/studio-8p51gq2h.js +0 -6
  591. package/dist/chunks/studio-954ds834.js +0 -5
  592. package/dist/chunks/studio-9ft45c83.js +0 -9
  593. package/dist/chunks/studio-a2138x5k.js +0 -7
  594. package/dist/chunks/studio-a9yzstqj.js +0 -5
  595. package/dist/chunks/studio-acdksxx6.js +0 -5
  596. package/dist/chunks/studio-ar8jcf2y.js +0 -5
  597. package/dist/chunks/studio-bmn4mn9j.js +0 -7
  598. package/dist/chunks/studio-e7xxa0sj.js +0 -5
  599. package/dist/chunks/studio-ecaz25vk.js +0 -5
  600. package/dist/chunks/studio-ery42sqr.js +0 -4
  601. package/dist/chunks/studio-fzdywr6p.js +0 -9
  602. package/dist/chunks/studio-g5fmf0c1.js +0 -5
  603. package/dist/chunks/studio-g7nse7zb.js +0 -5
  604. package/dist/chunks/studio-geq1ea6k.js +0 -14
  605. package/dist/chunks/studio-ghkb32r8.js +0 -5
  606. package/dist/chunks/studio-ghrhy2y7.js +0 -5
  607. package/dist/chunks/studio-grawhey1.js +0 -5
  608. package/dist/chunks/studio-h0xgswew.js +0 -5
  609. package/dist/chunks/studio-h9c4p2tx.js +0 -5
  610. package/dist/chunks/studio-jyzj5cxs.js +0 -5
  611. package/dist/chunks/studio-mgx8yhnz.js +0 -64
  612. package/dist/chunks/studio-mpb04y1d.js +0 -6
  613. package/dist/chunks/studio-n17mty64.js +0 -5
  614. package/dist/chunks/studio-nwh2eqsk.js +0 -6
  615. package/dist/chunks/studio-q1h883bt.js +0 -16
  616. package/dist/chunks/studio-q4tv82h7.js +0 -9
  617. package/dist/chunks/studio-qpqa7vk3.js +0 -5
  618. package/dist/chunks/studio-qqz8e5gk.js +0 -5
  619. package/dist/chunks/studio-qvasen3f.js +0 -5
  620. package/dist/chunks/studio-rggdb3hm.js +0 -5
  621. package/dist/chunks/studio-sghy936h.js +0 -4
  622. package/dist/chunks/studio-skprc6ef.js +0 -5
  623. package/dist/chunks/studio-tt2nactf.js +0 -5
  624. package/dist/chunks/studio-tyasmc39.js +0 -5
  625. package/dist/chunks/studio-vk9ezads.js +0 -5
  626. package/dist/chunks/studio-vzacdfsc.js +0 -4
  627. package/dist/chunks/studio-w4c0xmrw.js +0 -5
  628. package/dist/chunks/studio-wfjqhhbk.js +0 -5
  629. package/dist/chunks/studio-wgh5kxpj.js +0 -5
  630. package/dist/chunks/studio-xasj0796.js +0 -5
  631. package/dist/chunks/studio-y78s8r2n.js +0 -5
  632. package/dist/chunks/studio-z8w183sh.js +0 -5
  633. package/dist/chunks/studio-zscd9ty4.js +0 -928
  634. package/dist/chunks/studio-zxp13sss.js +0 -7
  635. package/dist/chunks/studio-zygnmm01.js +0 -5
  636. package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
  637. package/dist/chunks/tabs-jwthg40w.js +0 -4
  638. package/dist/chunks/textfield-spy3hc77.js +0 -4
  639. package/dist/chunks/toast-4d35zd64.js +0 -4
  640. package/dist/chunks/toast-host-8sjmfed3.js +0 -4
  641. package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
  642. package/dist/chunks/tree-h19v1jfz.js +0 -4
  643. package/dist/chunks/tsMode-gr0m4dzr.js +0 -14
  644. package/dist/chunks/workspace-m15qtcqp.js +0 -4
  645. package/dist/chunks/ws-client-nf61frr1.js +0 -4
@@ -23,14 +23,15 @@
23
23
  * @docs studio/interface
24
24
  */
25
25
 
26
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
26
27
  import { reactive } from "../reactivity";
27
28
  import { mountSurface, registerSurface } from "../ui/surface";
28
29
  import inspectorDockDoc from "./inspector-dock.json";
29
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
30
+ import type { JsonObject, JxElement } from "@jxsuite/schema/types";
30
31
  import type { JxScope } from "@jxsuite/runtime/types";
31
32
  import type { SurfaceHandle } from "../ui/surface";
32
33
 
33
- registerSurface("inspector-dock", inspectorDockDoc as unknown as JxDocument);
34
+ registerSurface("inspector-dock", inspectorDockDoc);
34
35
 
35
36
  /** One tab of the dock, as the document draws it. Every field is a value. */
36
37
  export interface InspectorTabView {
@@ -81,7 +82,7 @@ export interface InspectorDockHandle {
81
82
  }
82
83
 
83
84
  /** The scope the document reads. */
84
- interface InspectorDockScope extends Record<string, unknown>, InspectorDockValues {
85
+ interface InspectorDockScope extends InspectorDockValues {
85
86
  selectTab: (id: string) => void;
86
87
  }
87
88
 
@@ -95,15 +96,15 @@ function project(scope: InspectorDockScope, values: InspectorDockValues): void {
95
96
 
96
97
  /** The `part` a node was declared with, or the empty string. */
97
98
  function partOf(def: JxElement | string): string {
98
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
99
- return typeof part === "string" ? part : "";
99
+ const part = isString(def) ? undefined : def.attributes?.["part"];
100
+ return isString(part) ? part : "";
100
101
  }
101
102
 
102
103
  /** The `$map` item a node was rendered inside, if it was rendered inside one. */
103
- function mapItem(state: JxScope | undefined): Record<string, unknown> | null {
104
- const map = state?.["$map"] as { item?: unknown } | undefined;
105
- const item = map?.item;
106
- return item !== null && typeof item === "object" ? (item as Record<string, unknown>) : null;
104
+ function mapItem(state: JxScope | undefined): JsonObject | null {
105
+ const map = state?.["$map"];
106
+ const item = isJsonObject(map) ? map["item"] : undefined;
107
+ return isJsonObject(item) ? item : null;
107
108
  }
108
109
 
109
110
  /**
@@ -119,10 +120,10 @@ export function mountInspectorDock(
119
120
  actions: InspectorDockActions,
120
121
  options: InspectorDockOptions,
121
122
  ): InspectorDockHandle {
122
- const scope = reactive<InspectorDockScope>({
123
+ const scope: InspectorDockScope = reactive<InspectorDockScope>({
123
124
  ...values,
124
125
  selectTab: actions.selectTab,
125
- }) as InspectorDockScope;
126
+ });
126
127
 
127
128
  container.textContent = "";
128
129
  // @ts-expect-error -- _$litPart$ is lit's private render-part marker, not in the DOM types
@@ -136,7 +137,7 @@ export function mountInspectorDock(
136
137
  return;
137
138
  }
138
139
  const key = mapItem(state)?.["key"];
139
- if (typeof key === "string" && key !== "") {
140
+ if (isString(key) && key !== "") {
140
141
  options.onBody(key, element);
141
142
  }
142
143
  },
@@ -23,10 +23,9 @@
23
23
  import { reactive } from "../reactivity";
24
24
  import { mountSurface, registerSurface } from "../ui/surface";
25
25
  import jumpBarDoc from "./jump-bar.json";
26
- import type { JxDocument } from "@jxsuite/schema/types";
27
26
  import type { SurfaceHandle } from "../ui/surface";
28
27
 
29
- registerSurface("jump-bar", jumpBarDoc as unknown as JxDocument);
28
+ registerSurface("jump-bar", jumpBarDoc);
30
29
 
31
30
  /**
32
31
  * One step of the address, as the document reads it.
@@ -35,7 +34,7 @@ registerSurface("jump-bar", jumpBarDoc as unknown as JxDocument);
35
34
  * and a `$switch` chooses on one: a step that omitted `title` would leave the readout case reading
36
35
  * an absent path.
37
36
  */
38
- export interface ProjectedStep extends Record<string, unknown> {
37
+ export interface ProjectedStep {
39
38
  /** Unique within one bar: the repeater's key, and the argument `run` and `choose` receive. */
40
39
  key: string;
41
40
  /** `project` | `file` | `editor` | `node` — stamped so a test names a step without its text. */
@@ -73,7 +72,7 @@ export interface JumpBarSurface {
73
72
  }
74
73
 
75
74
  /** The scope `jump-bar.json` reads. */
76
- interface JumpBarScope extends Record<string, unknown>, JumpBarActions {
75
+ interface JumpBarScope extends JumpBarActions {
77
76
  region: string;
78
77
  segments: ProjectedStep[];
79
78
  empty: boolean;
@@ -95,12 +94,12 @@ export function mountJumpBarSurface(
95
94
  region: string,
96
95
  actions: JumpBarActions,
97
96
  ): JumpBarSurface {
98
- const scope = reactive<JumpBarScope>({
97
+ const scope: JumpBarScope = reactive<JumpBarScope>({
99
98
  ...actions,
100
99
  empty: true,
101
100
  region,
102
101
  segments: [],
103
- }) as JumpBarScope;
102
+ });
104
103
 
105
104
  host.replaceChildren();
106
105
  let mounted: SurfaceHandle | null = null;
@@ -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,14 +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";
34
+ import { placeholderBrokenImages } from "../utils/edit-display";
33
35
  import libraryDoc from "./library-pane.json";
34
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
36
+ import type { JxElement } from "@jxsuite/schema/types";
35
37
  import type { JxScope } from "@jxsuite/runtime/types";
36
- import type { SurfaceHandle } from "../ui/surface";
38
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
37
39
 
38
- registerSurface("library-pane", libraryDoc as unknown as JxDocument);
40
+ registerSurface("library-pane", libraryDoc);
39
41
 
40
42
  /**
41
43
  * Which of nine things the body draws.
@@ -117,12 +119,6 @@ export interface LibraryChip {
117
119
  checked: "true" | "false";
118
120
  }
119
121
 
120
- /** One row of the language facet. */
121
- export interface LibraryOption {
122
- value: string;
123
- label: string;
124
- }
125
-
126
122
  /** Everything the document draws, as one value. */
127
123
  export interface LibraryView {
128
124
  /** The region id stamped on the root, so the screenshot pipeline can address the Library. */
@@ -139,7 +135,7 @@ export interface LibraryView {
139
135
  * chrome that says nothing.
140
136
  */
141
137
  localeState: "hidden" | "shown";
142
- localeOptions: LibraryOption[];
138
+ localeOptions: SurfaceOption[];
143
139
  localeValue: string;
144
140
  query: string;
145
141
  /** Where an upload lands, as the label's tooltip says it — before the files are chosen. */
@@ -210,7 +206,7 @@ export interface LibrarySurfaceHandle {
210
206
  }
211
207
 
212
208
  /** The scope the document reads: {@link LibraryView} plus the actions its controls call. */
213
- interface LibraryScope extends Record<string, unknown>, LibraryView, LibraryActions {}
209
+ interface LibraryScope extends LibraryView, LibraryActions {}
214
210
 
215
211
  /** Write a projection into the scope. */
216
212
  function project(scope: LibraryScope, view: LibraryView): void {
@@ -242,15 +238,16 @@ function project(scope: LibraryScope, view: LibraryView): void {
242
238
 
243
239
  /** The `part` a node's definition carries, or "" for a text node or an unmarked element. */
244
240
  function partOf(def: JxElement | string): string {
245
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
246
- return typeof part === "string" ? part : "";
241
+ const part = isString(def) ? undefined : def.attributes?.["part"];
242
+ return isString(part) ? part : "";
247
243
  }
248
244
 
249
245
  /** The path of the mapped row a node was rendered inside, or "" when it was not in one. */
250
246
  function rowPath(state: JxScope | undefined): string {
251
- const map = state?.["$map"] as { item?: { path?: unknown } } | undefined;
252
- const path = map?.item?.path;
253
- 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 : "";
254
251
  }
255
252
 
256
253
  /**
@@ -267,7 +264,11 @@ export function mountLibrarySurface(
267
264
  actions: LibraryActions,
268
265
  ): LibrarySurfaceHandle {
269
266
  host.replaceChildren();
270
- const scope = reactive<LibraryScope>({
267
+ // A file that will not load, or a preview image with nothing to bind, draws a placeholder rather
268
+ // Than the browser's broken-image glyph.
269
+ const listening = new AbortController();
270
+ placeholderBrokenImages(host, listening.signal);
271
+ const scope: LibraryScope = reactive<LibraryScope>({
271
272
  bannerState: "hidden",
272
273
  bannerText: "",
273
274
  categories: [],
@@ -308,7 +309,7 @@ export function mountLibrarySurface(
308
309
  uploadAccept: "",
309
310
  uploadHint: "",
310
311
  view: "loading",
311
- }) as LibraryScope;
312
+ });
312
313
  project(scope, view);
313
314
 
314
315
  let mounted: SurfaceHandle | null = null;
@@ -335,12 +336,15 @@ export function mountLibrarySurface(
335
336
  }
336
337
  },
337
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;
338
342
  if (disposed) {
339
343
  surface.dispose();
340
- return surface.root as HTMLElement;
344
+ return root;
341
345
  }
342
346
  mounted = surface;
343
- return surface.root as HTMLElement;
347
+ return root;
344
348
  });
345
349
 
346
350
  return {
@@ -355,6 +359,7 @@ export function mountLibrarySurface(
355
359
  },
356
360
  dispose() {
357
361
  disposed = true;
362
+ listening.abort();
358
363
  mounted?.dispose();
359
364
  mounted = null;
360
365
  },
@@ -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