@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
@@ -26,10 +26,9 @@
26
26
  import { reactive } from "../reactivity";
27
27
  import { mountSurface, registerSurface } from "../ui/surface";
28
28
  import gitPanelDoc from "./git-panel.json";
29
- import type { JxDocument } from "@jxsuite/schema/types";
30
- import type { SurfaceHandle } from "../ui/surface";
29
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
31
30
 
32
- registerSurface("git-panel", gitPanelDoc as unknown as JxDocument);
31
+ registerSurface("git-panel", gitPanelDoc);
33
32
 
34
33
  /** One changed file, as the document draws it. Every field is a value: no records, no closures. */
35
34
  export interface GitFileRowView {
@@ -72,12 +71,6 @@ export interface GitCommitView {
72
71
  meta: string;
73
72
  }
74
73
 
75
- /** One row of the branch picker. `__new__` is a row like any other; the flow knows what it means. */
76
- export interface GitBranchOption {
77
- value: string;
78
- label: string;
79
- }
80
-
81
74
  /** What the panel says the surface should be showing right now. */
82
75
  export interface GitPanelValues {
83
76
  /**
@@ -104,7 +97,7 @@ export interface GitPanelValues {
104
97
  branchName: string;
105
98
  /** What the picker currently holds. Not always {@link branchName} — see the adapter's note. */
106
99
  branchValue: string;
107
- branchOptions: GitBranchOption[];
100
+ branchOptions: SurfaceOption[];
108
101
  /** `changes` or `history` — `shell.git.subTab`, which names the `$switch` case. */
109
102
  subTab: string;
110
103
  /** "Local Changes (6)" — the count is part of the tab's label, not a badge of its own. */
@@ -159,7 +152,7 @@ export interface GitPanelSurfaceHandle {
159
152
  }
160
153
 
161
154
  /** The scope the document reads: the projection, plus everything a control can ask for. */
162
- interface GitPanelScope extends Record<string, unknown>, GitPanelValues, GitPanelActions {}
155
+ interface GitPanelScope extends GitPanelValues, GitPanelActions {}
163
156
 
164
157
  /** Write a projection into the scope. Assignment by assignment, so an unchanged field is inert. */
165
158
  function project(scope: GitPanelScope, values: GitPanelValues): void {
@@ -237,10 +230,10 @@ export function mountGitPanelSurface(
237
230
  values: GitPanelValues,
238
231
  actions: GitPanelActions,
239
232
  ): GitPanelSurfaceHandle {
240
- const scope = reactive<GitPanelScope>({
233
+ const scope: GitPanelScope = reactive<GitPanelScope>({
241
234
  ...emptyValues(),
242
235
  ...actions,
243
- }) as GitPanelScope;
236
+ });
244
237
  project(scope, values);
245
238
 
246
239
  let mounted: SurfaceHandle | null = null;
@@ -258,8 +251,7 @@ export function mountGitPanelSurface(
258
251
  answer is simply whether this handle is still wanted — answering no would start a second
259
252
  mount racing the first. Once mounted, the question is whether the root is still where it was
260
253
  put: a Navigator that painted another panel cleared this document out from under it. */
261
- connected: () =>
262
- !disposed && (mounted === null || (mounted.root as Node).parentNode === container),
254
+ connected: () => !disposed && (mounted === null || mounted.root.parentNode === container),
263
255
  dispose() {
264
256
  disposed = true;
265
257
  mounted?.dispose();
@@ -27,13 +27,12 @@
27
27
  import { reactive } from "../reactivity";
28
28
  import { mountSurface, registerSurface } from "../ui/surface";
29
29
  import { overlayRegion, REGION_ATTR } from "../ui/regions";
30
- import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
30
+ import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
31
31
  import { whenReady } from "./dialog";
32
32
  import githubAuthDoc from "./github-auth.json";
33
- import type { SurfaceHandle } from "../ui/surface";
34
- import type { JxDocument } from "@jxsuite/schema/types";
33
+ import type { DialogLayerHandle, SurfaceHandle } from "../ui/surface";
35
34
 
36
- registerSurface("github-auth", githubAuthDoc as unknown as JxDocument);
35
+ registerSurface("github-auth", githubAuthDoc);
37
36
 
38
37
  export interface GithubAuthSurfaceOptions {
39
38
  /** Where the dialog is mounted — the dialog layer, handed in so this never reaches back. */
@@ -48,16 +47,7 @@ export interface GithubAuthSurfaceOptions {
48
47
  onClosed: () => void;
49
48
  }
50
49
 
51
- export interface GithubAuthSurfaceHandle {
52
- /** The slot in the dialog layer that carries the region. */
53
- host: HTMLElement;
54
- /** Resolves with the `jx-dialog` element once it has rendered and been opened. */
55
- ready: Promise<HTMLElement>;
56
- /** Close the dialog (the platform restores focus) and dispose the document. Idempotent. */
57
- close: () => void;
58
- }
59
-
60
- interface GithubAuthScope extends Record<string, unknown> {
50
+ interface GithubAuthScope {
61
51
  userCode: string;
62
52
  verificationUri: string;
63
53
  cancel: () => void;
@@ -65,7 +55,7 @@ interface GithubAuthScope extends Record<string, unknown> {
65
55
  }
66
56
 
67
57
  /** Put the code up. The handle's `ready` resolves once the dialog is showing. */
68
- export function openGithubAuthSurface(options: GithubAuthSurfaceOptions): GithubAuthSurfaceHandle {
58
+ export function openGithubAuthSurface(options: GithubAuthSurfaceOptions): DialogLayerHandle {
69
59
  const slot = document.createElement("div");
70
60
  /* The layer is `pointer-events: none` so a click passes through it when nothing is up, and every
71
61
  slot in it turns them back on for its own content. `pointer-events` INHERITS, and the top layer
@@ -90,26 +80,32 @@ export function openGithubAuthSurface(options: GithubAuthSurfaceOptions): Github
90
80
  closed = true;
91
81
  options.onClosed();
92
82
  };
83
+ /* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
84
+ element, and a direct `closed` test after that `await` would be narrowed to the value the test
85
+ before it saw. */
86
+ const isClosed = (): boolean => closed;
93
87
 
94
- const scope = reactive<GithubAuthScope>({
88
+ const scope: GithubAuthScope = reactive<GithubAuthScope>({
95
89
  cancel: () => {
96
90
  options.onCancel();
97
91
  },
98
92
  closed: finish,
99
93
  userCode: options.userCode,
100
94
  verificationUri: options.verificationUri,
101
- }) as GithubAuthScope;
95
+ });
102
96
 
103
97
  let mounted: SurfaceHandle | null = null;
104
98
  const ready = mountSurface("github-auth", scope, slot).then(async (surface) => {
105
99
  mounted = surface;
100
+ /* SAFETY: `github-auth.json`'s root definition is a `jx-dialog` element, so the runtime
101
+ mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
106
102
  const element = surface.root as HTMLElement;
107
- if (closed) {
103
+ if (isClosed()) {
108
104
  surface.dispose();
109
105
  return element;
110
106
  }
111
107
  await whenReady(element);
112
- if (closed) {
108
+ if (isClosed()) {
113
109
  return element;
114
110
  }
115
111
  showModal(element);
@@ -125,7 +121,7 @@ export function openGithubAuthSurface(options: GithubAuthSurfaceOptions): Github
125
121
  const element = mounted?.root;
126
122
  if (element instanceof HTMLElement) {
127
123
  // The platform's close first, so focus goes back where it came from; then the document.
128
- closeDialog(element);
124
+ close(element);
129
125
  }
130
126
  // A mount that has not landed yet is disposed by `ready` when it does — `finish` tells it so.
131
127
  mounted?.dispose();
@@ -22,13 +22,12 @@
22
22
  import { reactive } from "../reactivity";
23
23
  import { mountSurface, registerSurface } from "../ui/surface";
24
24
  import { overlayRegion, REGION_ATTR } from "../ui/regions";
25
- import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
25
+ import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
26
26
  import { whenReady } from "./dialog";
27
27
  import githubPublishDoc from "./github-publish.json";
28
- import type { SurfaceHandle } from "../ui/surface";
29
- import type { JxDocument } from "@jxsuite/schema/types";
28
+ import type { DialogLayerHandle, SurfaceHandle } from "../ui/surface";
30
29
 
31
- registerSurface("github-publish", githubPublishDoc as unknown as JxDocument);
30
+ registerSurface("github-publish", githubPublishDoc);
32
31
 
33
32
  /**
34
33
  * What the dialog collects.
@@ -55,15 +54,7 @@ export interface GithubPublishSurfaceOptions {
55
54
  onClosed: () => void;
56
55
  }
57
56
 
58
- export interface GithubPublishSurfaceHandle {
59
- host: HTMLElement;
60
- /** Resolves with the `jx-dialog` element once it has rendered and been opened. */
61
- ready: Promise<HTMLElement>;
62
- /** Close the dialog (the platform restores focus) and dispose the document. Idempotent. */
63
- close: () => void;
64
- }
65
-
66
- interface GithubPublishScope extends Record<string, unknown> {
57
+ interface GithubPublishScope {
67
58
  name: string;
68
59
  description: string;
69
60
  isPrivate: boolean;
@@ -76,9 +67,7 @@ interface GithubPublishScope extends Record<string, unknown> {
76
67
  }
77
68
 
78
69
  /** Open the dialog. The handle's `ready` resolves once it is showing. */
79
- export function openGithubPublishSurface(
80
- options: GithubPublishSurfaceOptions,
81
- ): GithubPublishSurfaceHandle {
70
+ export function openGithubPublishSurface(options: GithubPublishSurfaceOptions): DialogLayerHandle {
82
71
  const slot = document.createElement("div");
83
72
  /* The layer is `pointer-events: none` so a click passes through it when nothing is up, and every
84
73
  slot in it turns them back on for its own content. */
@@ -100,8 +89,12 @@ export function openGithubPublishSurface(
100
89
  closed = true;
101
90
  options.onClosed();
102
91
  };
92
+ /* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
93
+ element, and a direct `closed` test after that `await` would be narrowed to the value the test
94
+ before it saw. */
95
+ const isClosed = (): boolean => closed;
103
96
 
104
- const scope = reactive<GithubPublishScope>({
97
+ const scope: GithubPublishScope = reactive<GithubPublishScope>({
105
98
  cancel: () => {
106
99
  options.onCancel();
107
100
  },
@@ -125,13 +118,15 @@ export function openGithubPublishSurface(
125
118
  setPrivate: (value) => {
126
119
  scope.isPrivate = value;
127
120
  },
128
- }) as GithubPublishScope;
121
+ });
129
122
 
130
123
  let mounted: SurfaceHandle | null = null;
131
124
  const ready = mountSurface("github-publish", scope, slot).then(async (surface) => {
132
125
  mounted = surface;
126
+ /* SAFETY: `github-publish.json`'s root definition is a `jx-dialog` element, so the runtime
127
+ mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
133
128
  const element = surface.root as HTMLElement;
134
- if (closed) {
129
+ if (isClosed()) {
135
130
  surface.dispose();
136
131
  return element;
137
132
  }
@@ -140,14 +135,14 @@ export function openGithubPublishSurface(
140
135
  `<dialog>` to open — the body is all there, correctly styled, and never shows. Shared with
141
136
  `openDialogSurface` and `openAboutSurface` rather than reimplemented. */
142
137
  await whenReady(element);
143
- if (closed) {
138
+ if (isClosed()) {
144
139
  return element;
145
140
  }
146
141
  showModal(element);
147
142
  return element;
148
143
  });
149
144
 
150
- const handle: GithubPublishSurfaceHandle = {
145
+ const handle: DialogLayerHandle = {
151
146
  close() {
152
147
  if (closed) {
153
148
  return;
@@ -155,7 +150,7 @@ export function openGithubPublishSurface(
155
150
  const element = mounted?.root;
156
151
  if (element instanceof HTMLElement) {
157
152
  // The platform's close first, so focus goes back where it came from; then the document.
158
- closeDialog(element);
153
+ close(element);
159
154
  }
160
155
  mounted?.dispose();
161
156
  mounted = null;
@@ -15,25 +15,21 @@
15
15
  * @docs studio/editing/grid
16
16
  */
17
17
 
18
+ import { isString } from "@jxsuite/schema/guards";
18
19
  import { reactive } from "../reactivity";
19
20
  import { openPopoverSurface } from "../ui/popover-surface";
20
21
  import { registerSurface } from "../ui/surface";
21
22
  import gridCellDoc from "./grid-cell.json";
22
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
23
+ import type { JxElement } from "@jxsuite/schema/types";
23
24
  import type { JxPath } from "@jxsuite/runtime/types";
24
- import type { PopoverSurfaceHandle } from "../ui/popover-surface";
25
+ import type { OpenPopoverSurfaceOptions, PopoverSurfaceHandle } from "../ui/popover-surface";
26
+ import type { SurfaceOption } from "../ui/surface";
25
27
 
26
- registerSurface("grid-cell", gridCellDoc as unknown as JxDocument);
28
+ registerSurface("grid-cell", gridCellDoc);
27
29
 
28
30
  /** The slot id, and so the panel's region: `overlay.popover:grid/cell`. */
29
31
  const SLOT = "grid/cell";
30
32
 
31
- /** One row of a relationship column's list. */
32
- export interface GridCellOption {
33
- value: string;
34
- label: string;
35
- }
36
-
37
33
  /** Everything the panel draws. */
38
34
  export interface GridCellView {
39
35
  x: number;
@@ -45,7 +41,7 @@ export interface GridCellView {
45
41
  /** "Entries of “post”", when the column names a target type. */
46
42
  hint: string;
47
43
  hintState: "hidden" | "shown";
48
- options: GridCellOption[];
44
+ options: SurfaceOption[];
49
45
  /** What the list holds; empty when the current value is not one of its rows. */
50
46
  value: string;
51
47
  /** What the free-text field holds: the current value when no row matches it. */
@@ -62,28 +58,26 @@ export interface GridCellSurfaceOptions {
62
58
  dismissed?: () => void;
63
59
  }
64
60
 
65
- export type GridCellSurfaceHandle = PopoverSurfaceHandle;
66
-
67
- interface GridCellScope extends Record<string, unknown>, GridCellView {
61
+ interface GridCellScope extends GridCellView {
68
62
  pick: (value: string) => void;
69
63
  done: () => void;
70
64
  }
71
65
 
72
66
  /** The `part` a node's definition carries, or "" for a text node or an unmarked element. */
73
67
  function partOf(def: JxElement | string): string {
74
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
75
- return typeof part === "string" ? part : "";
68
+ const part = isString(def) ? undefined : def.attributes?.["part"];
69
+ return isString(part) ? part : "";
76
70
  }
77
71
 
78
72
  /**
79
73
  * Open the cell value picker.
80
74
  *
81
75
  * @param {GridCellSurfaceOptions} options
82
- * @returns {GridCellSurfaceHandle}
76
+ * @returns {PopoverSurfaceHandle}
83
77
  */
84
- export function openGridCellSurface(options: GridCellSurfaceOptions): GridCellSurfaceHandle {
78
+ export function openGridCellSurface(options: GridCellSurfaceOptions): PopoverSurfaceHandle {
85
79
  const { view } = options;
86
- const scope = reactive<GridCellScope>({
80
+ const scope: GridCellScope = reactive<GridCellScope>({
87
81
  custom: view.custom,
88
82
  done: () => {
89
83
  handle.close();
@@ -98,23 +92,28 @@ export function openGridCellSurface(options: GridCellSurfaceOptions): GridCellSu
98
92
  value: view.value,
99
93
  x: view.x,
100
94
  y: view.y,
101
- }) as GridCellScope;
95
+ });
102
96
 
103
- const handle = openPopoverSurface({
97
+ const popover: OpenPopoverSurfaceOptions<GridCellScope> = {
104
98
  anchor: null,
105
99
  name: "grid-cell",
106
100
  scope,
107
101
  slot: SLOT,
108
- ...(options.dismissed ? { onDismissed: options.dismissed } : {}),
109
- ...(options.island
110
- ? {
111
- onNodeCreated: (element: HTMLElement | Text, _path: JxPath, def: JxElement | string) => {
112
- if (partOf(def) === "picker-host" && element instanceof HTMLElement) {
113
- options.island?.(element);
114
- }
115
- },
116
- }
117
- : {}),
118
- });
102
+ };
103
+ if (options.dismissed) {
104
+ popover.onDismissed = options.dismissed;
105
+ }
106
+ if (options.island) {
107
+ popover.onNodeCreated = (
108
+ element: HTMLElement | Text,
109
+ _path: JxPath,
110
+ def: JxElement | string,
111
+ ) => {
112
+ if (partOf(def) === "picker-host" && element instanceof HTMLElement) {
113
+ options.island?.(element);
114
+ }
115
+ };
116
+ }
117
+ const handle = openPopoverSurface(popover);
119
118
  return handle;
120
119
  }
@@ -19,16 +19,9 @@
19
19
  import { reactive } from "../reactivity";
20
20
  import { mountSurface, registerSurface } from "../ui/surface";
21
21
  import gridOpenDoc from "./grid-open.json";
22
- import type { JxDocument } from "@jxsuite/schema/types";
23
- import type { SurfaceHandle } from "../ui/surface";
22
+ import type { SurfaceAction, SurfaceHandle } from "../ui/surface";
24
23
 
25
- registerSurface("grid-open", gridOpenDoc as unknown as JxDocument);
26
-
27
- /** One openable source. The id is opaque here: only the flow knows what it names. */
28
- export interface GridSourceRow {
29
- id: string;
30
- label: string;
31
- }
24
+ registerSurface("grid-open", gridOpenDoc);
32
25
 
33
26
  /** One origin of sources — the project itself, or one connection. */
34
27
  export interface GridSourceGroup {
@@ -36,7 +29,7 @@ export interface GridSourceGroup {
36
29
  key: string;
37
30
  title: string;
38
31
  state: "listed" | "empty";
39
- rows: GridSourceRow[];
32
+ rows: SurfaceAction[];
40
33
  /** Why the group is empty, in a sentence. Empty when it is not. */
41
34
  emptyMessage: string;
42
35
  }
@@ -47,7 +40,7 @@ export interface GridOpenSurfaceHandle {
47
40
  dispose: () => void;
48
41
  }
49
42
 
50
- interface GridOpenScope extends Record<string, unknown> {
43
+ interface GridOpenScope {
51
44
  groups: GridSourceGroup[];
52
45
  open: (id: string) => void;
53
46
  }
@@ -65,16 +58,19 @@ export function mountGridOpenSurface(
65
58
  groups: GridSourceGroup[],
66
59
  open: (id: string) => void,
67
60
  ): GridOpenSurfaceHandle {
68
- const scope = reactive<GridOpenScope>({ groups, open }) as GridOpenScope;
61
+ const scope: GridOpenScope = reactive<GridOpenScope>({ groups, open });
69
62
  let mounted: SurfaceHandle | null = null;
70
63
  let disposed = false;
71
64
  const ready = mountSurface("grid-open", scope, host).then((surface) => {
65
+ /* SAFETY: `grid-open.json`'s root definition is a `div` element, so the runtime mounts an
66
+ HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
67
+ const root = surface.root as HTMLElement;
72
68
  if (disposed) {
73
69
  surface.dispose();
74
- return surface.root as HTMLElement;
70
+ return root;
75
71
  }
76
72
  mounted = surface;
77
- return surface.root as HTMLElement;
73
+ return root;
78
74
  });
79
75
  return {
80
76
  dispose() {
@@ -25,13 +25,14 @@
25
25
  * @docs studio/data/grid
26
26
  */
27
27
 
28
+ import { isString } from "@jxsuite/schema/guards";
28
29
  import { reactive } from "../reactivity";
29
30
  import { mountSurface, registerSurface } from "../ui/surface";
30
31
  import gridPanelDoc from "./grid-panel.json";
31
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
32
+ import type { JxElement } from "@jxsuite/schema/types";
32
33
  import type { SurfaceHandle } from "../ui/surface";
33
34
 
34
- registerSurface("grid-panel", gridPanelDoc as unknown as JxDocument);
35
+ registerSurface("grid-panel", gridPanelDoc);
35
36
 
36
37
  /** Everything the frame draws, as one value. Every field is already a string or a boolean. */
37
38
  export interface GridPanelView {
@@ -98,7 +99,7 @@ export interface GridPanelSurfaceHandle {
98
99
  }
99
100
 
100
101
  /** The scope the document reads: {@link GridPanelView} plus the actions its controls call. */
101
- interface GridPanelScope extends Record<string, unknown>, GridPanelView, GridPanelActions {}
102
+ interface GridPanelScope extends GridPanelView, GridPanelActions {}
102
103
 
103
104
  /** Write a projection into the scope. */
104
105
  function project(scope: GridPanelScope, view: GridPanelView): void {
@@ -124,8 +125,8 @@ function project(scope: GridPanelScope, view: GridPanelView): void {
124
125
 
125
126
  /** The `part` a node's definition carries, or "" for a text node or an unmarked element. */
126
127
  function partOf(def: JxElement | string): string {
127
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
128
- return typeof part === "string" ? part : "";
128
+ const part = isString(def) ? undefined : def.attributes?.["part"];
129
+ return isString(part) ? part : "";
129
130
  }
130
131
 
131
132
  /**
@@ -142,7 +143,7 @@ export function mountGridPanelSurface(
142
143
  actions: GridPanelActions,
143
144
  ): GridPanelSurfaceHandle {
144
145
  host.replaceChildren();
145
- const scope = reactive<GridPanelScope>({
146
+ const scope: GridPanelScope = reactive<GridPanelScope>({
146
147
  addRow: actions.addRow,
147
148
  canDelete: false,
148
149
  canInsert: false,
@@ -172,7 +173,7 @@ export function mountGridPanelSurface(
172
173
  setFilter: actions.setFilter,
173
174
  view: "grid",
174
175
  viewLabel: "View",
175
- }) as GridPanelScope;
176
+ });
176
177
  project(scope, view);
177
178
 
178
179
  let mounted: SurfaceHandle | null = null;
@@ -186,12 +187,15 @@ export function mountGridPanelSurface(
186
187
  }
187
188
  },
188
189
  }).then((surface) => {
190
+ /* SAFETY: `grid-panel.json`'s root definition is a `div` element, so the runtime mounts an
191
+ HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
192
+ const root = surface.root as HTMLElement;
189
193
  if (disposed) {
190
194
  surface.dispose();
191
- return surface.root as HTMLElement;
195
+ return root;
192
196
  }
193
197
  mounted = surface;
194
- return surface.root as HTMLElement;
198
+ return root;
195
199
  });
196
200
 
197
201
  return {
@@ -15,10 +15,9 @@ import { reactive } from "../reactivity";
15
15
  import { openPopoverSurface } from "../ui/popover-surface";
16
16
  import { registerSurface } from "../ui/surface";
17
17
  import gridReplaceDoc from "./grid-replace.json";
18
- import type { JxDocument } from "@jxsuite/schema/types";
19
- import type { PopoverSurfaceHandle } from "../ui/popover-surface";
18
+ import type { OpenPopoverSurfaceOptions, PopoverSurfaceHandle } from "../ui/popover-surface";
20
19
 
21
- registerSurface("grid-replace", gridReplaceDoc as unknown as JxDocument);
20
+ registerSurface("grid-replace", gridReplaceDoc);
22
21
 
23
22
  /** The slot id, and so the panel's region: `overlay.popover:grid/replace`. */
24
23
  const SLOT = "grid/replace";
@@ -31,9 +30,7 @@ export interface GridReplaceActions {
31
30
  dismissed?: () => void;
32
31
  }
33
32
 
34
- export type GridReplaceSurfaceHandle = PopoverSurfaceHandle;
35
-
36
- interface GridReplaceScope extends Record<string, unknown> {
33
+ interface GridReplaceScope {
37
34
  x: number;
38
35
  y: number;
39
36
  find: string;
@@ -50,14 +47,14 @@ interface GridReplaceScope extends Record<string, unknown> {
50
47
  * @param {{ x: number; y: number }} at - Where it opens, in viewport pixels
51
48
  * @param {GridReplaceActions} actions - What each press does
52
49
  * @param {HTMLElement | null} anchor - The toolbar button it hangs from
53
- * @returns {GridReplaceSurfaceHandle}
50
+ * @returns {PopoverSurfaceHandle}
54
51
  */
55
52
  export function openGridReplaceSurface(
56
53
  at: { x: number; y: number },
57
54
  actions: GridReplaceActions,
58
55
  anchor: HTMLElement | null,
59
- ): GridReplaceSurfaceHandle {
60
- const scope = reactive<GridReplaceScope>({
56
+ ): PopoverSurfaceHandle {
57
+ const scope: GridReplaceScope = reactive<GridReplaceScope>({
61
58
  cancel: () => {
62
59
  handle.close();
63
60
  actions.dismissed?.();
@@ -75,15 +72,18 @@ export function openGridReplaceSurface(
75
72
  },
76
73
  x: at.x,
77
74
  y: at.y,
78
- }) as GridReplaceScope;
75
+ });
79
76
 
80
- const handle = openPopoverSurface({
77
+ const popover: OpenPopoverSurfaceOptions<GridReplaceScope> = {
81
78
  anchor,
82
79
  name: "grid-replace",
83
80
  scope,
84
81
  slot: SLOT,
85
- ...(actions.dismissed ? { onDismissed: actions.dismissed } : {}),
86
- });
82
+ };
83
+ if (actions.dismissed) {
84
+ popover.onDismissed = actions.dismissed;
85
+ }
86
+ const handle = openPopoverSurface(popover);
87
87
 
88
88
  return handle;
89
89
  }
@@ -20,10 +20,10 @@ import { reactive } from "../reactivity";
20
20
  import { openPopoverSurface } from "../ui/popover-surface";
21
21
  import { registerSurface } from "../ui/surface";
22
22
  import gridViewsDoc from "./grid-views.json";
23
- import type { JxDocument } from "@jxsuite/schema/types";
24
- import type { PopoverSurfaceHandle } from "../ui/popover-surface";
23
+ import type { OpenPopoverSurfaceOptions, PopoverSurfaceHandle } from "../ui/popover-surface";
24
+ import type { SurfaceOption } from "../ui/surface";
25
25
 
26
- registerSurface("grid-views", gridViewsDoc as unknown as JxDocument);
26
+ registerSurface("grid-views", gridViewsDoc);
27
27
 
28
28
  /** The slot id, and so the panel's region: `overlay.popover:grid/views`. */
29
29
  const SLOT = "grid/views";
@@ -41,12 +41,6 @@ export interface GridSavedViewRow {
41
41
  deleteLabel: string;
42
42
  }
43
43
 
44
- /** A closed list of choices, in the shape the kit's select reads. */
45
- export interface GridSelectOption {
46
- value: string;
47
- label: string;
48
- }
49
-
50
44
  /** One column's visibility. */
51
45
  export interface GridColumnToggle {
52
46
  field: string;
@@ -65,9 +59,9 @@ export interface GridViewsView {
65
59
  saveLabel: string;
66
60
  columns: GridColumnToggle[];
67
61
  /** Every column, plus the "Source order" row that clears the sort. */
68
- fieldOptions: GridSelectOption[];
69
- dirOptions: GridSelectOption[];
70
- groupOptions: GridSelectOption[];
62
+ fieldOptions: SurfaceOption[];
63
+ dirOptions: SurfaceOption[];
64
+ groupOptions: SurfaceOption[];
71
65
  sortField: string;
72
66
  sortDir: string;
73
67
  /** There is no sort to redirect, so the direction control is off rather than lying. */
@@ -93,7 +87,7 @@ export interface GridViewsSurfaceHandle extends PopoverSurfaceHandle {
93
87
  update: (view: GridViewsView) => void;
94
88
  }
95
89
 
96
- interface GridViewsScope extends Record<string, unknown>, GridViewsView, GridViewsActions {}
90
+ interface GridViewsScope extends GridViewsView, GridViewsActions {}
97
91
 
98
92
  /** Write a projection into the scope. */
99
93
  function project(scope: GridViewsScope, view: GridViewsView): void {
@@ -125,7 +119,7 @@ export function openGridViewsSurface(
125
119
  actions: GridViewsActions,
126
120
  anchor: HTMLElement | null,
127
121
  ): GridViewsSurfaceHandle {
128
- const scope = reactive<GridViewsScope>({
122
+ const scope: GridViewsScope = reactive<GridViewsScope>({
129
123
  applyView: actions.applyView,
130
124
  columns: [],
131
125
  deleteView: actions.deleteView,
@@ -147,16 +141,19 @@ export function openGridViewsSurface(
147
141
  viewsState: "empty",
148
142
  x: 0,
149
143
  y: 0,
150
- }) as GridViewsScope;
144
+ });
151
145
  project(scope, view);
152
146
 
153
- const handle = openPopoverSurface({
147
+ const popover: OpenPopoverSurfaceOptions<GridViewsScope> = {
154
148
  anchor,
155
149
  name: "grid-views",
156
150
  scope,
157
151
  slot: SLOT,
158
- ...(actions.dismissed ? { onDismissed: actions.dismissed } : {}),
159
- });
152
+ };
153
+ if (actions.dismissed) {
154
+ popover.onDismissed = actions.dismissed;
155
+ }
156
+ const handle = openPopoverSurface(popover);
160
157
 
161
158
  return {
162
159
  close: handle.close,