@jxsuite/studio 6.1.1 → 6.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. package/dist/chunks/{2020-va2wwra4.js → 2020-f2gkpy8d.js} +3 -3
  2. package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
  3. package/dist/chunks/adapter-4912g339.js +4 -0
  4. package/dist/chunks/cf-account-picker-wccaenh6.js +4 -0
  5. package/dist/chunks/cf-settings-br6105tr.js +4 -0
  6. package/dist/chunks/color-28ksk2qm.js +4 -0
  7. package/dist/chunks/color-area-0fj8a4ga.js +4 -0
  8. package/dist/chunks/color-field-xch8kx2g.js +4 -0
  9. package/dist/chunks/color-slider-jxd8v350.js +4 -0
  10. package/dist/chunks/combobox-p0efwjke.js +4 -0
  11. package/dist/chunks/components-db68vsn7.js +4 -0
  12. package/dist/chunks/content-source-1449qesq.js +4 -0
  13. package/dist/chunks/convert-to-repeater-5h457egj.js +4 -0
  14. package/dist/chunks/dialog-c4x05vyx.js +4 -0
  15. package/dist/chunks/editor-x9jn86a7.js +4 -0
  16. package/dist/chunks/entry-commands-may24cpt.js +4 -0
  17. package/dist/chunks/extension-sections-pvr14vxr.js +4 -0
  18. package/dist/chunks/file-ops-x9v54pcj.js +4 -0
  19. package/dist/chunks/files-j3knqf0s.js +4 -0
  20. package/dist/chunks/format-host-tyre2trb.js +4 -0
  21. package/dist/chunks/fs-events-64ma9htc.js +4 -0
  22. package/dist/chunks/git-panel-84ps5dex.js +4 -0
  23. package/dist/chunks/grid-view-d2wq9ezg.js +51 -0
  24. package/dist/chunks/icons-pnfz478q.js +4 -0
  25. package/dist/chunks/iframe-entry-fvbk89gm.js +5 -0
  26. package/dist/chunks/iframe-entry-jdcktez8.js +5 -0
  27. package/dist/chunks/iframe-entry-x0ygf2yr.js +5 -0
  28. package/dist/chunks/iframe-entry-zap785cw.js +5 -0
  29. package/dist/chunks/iframe-host-ck6vejt5.js +4 -0
  30. package/dist/chunks/index-b8xw3vy9.js +4 -0
  31. package/dist/chunks/{index-2veqmnhr.js → index-zpjmzqfk.js} +3 -3
  32. package/dist/chunks/{javascript-8nbvs12s.js → javascript-m54mnwp6.js} +3 -3
  33. package/dist/chunks/{jsonMode-s8kt9dsj.js → jsonMode-w15cmrcm.js} +8 -8
  34. package/dist/chunks/jx-validate-at3zn8wa.js +4 -0
  35. package/dist/chunks/layers-h4xp1pss.js +4 -0
  36. package/dist/chunks/layers-panel-m5hw1d7g.js +4 -0
  37. package/dist/chunks/listbox-e74qjyq6.js +4 -0
  38. package/dist/chunks/lit-html-8t8t3dnr.js +4 -0
  39. package/dist/chunks/media-picker-2cweexc5.js +4 -0
  40. package/dist/chunks/menu-n6yzswmy.js +4 -0
  41. package/dist/chunks/menu-ynw13y0s.js +4 -0
  42. package/dist/chunks/monaco-binding-7gx83x3r.js +4 -0
  43. package/dist/chunks/monaco-buffer-qzxn567r.js +4 -0
  44. package/dist/chunks/monaco-setup-gxf6656g.js +4 -0
  45. package/dist/chunks/notify-cj5zbrs2.js +4 -0
  46. package/dist/chunks/number-field-y62xq0ty.js +4 -0
  47. package/dist/chunks/parse-b7ddhr8m.js +4 -0
  48. package/dist/chunks/platform-3dfws9js.js +4 -0
  49. package/dist/chunks/popover-jt2gxmzs.js +4 -0
  50. package/dist/chunks/publish-panel-1gvxbj21.js +4 -0
  51. package/dist/chunks/quick-search-0dajrwqg.js +4 -0
  52. package/dist/chunks/references-49qgt404.js +4 -0
  53. package/dist/chunks/right-panel-jm1bwe53.js +4 -0
  54. package/dist/chunks/section-registry-6kwc4fky.js +4 -0
  55. package/dist/chunks/select-rzds841e.js +4 -0
  56. package/dist/chunks/split-n2gfpm5m.js +4 -0
  57. package/dist/chunks/{studio-1q1sh2ax.js → studio-0q988f9w.js} +3 -3
  58. package/dist/chunks/studio-0rt52vpq.js +5 -0
  59. package/dist/chunks/studio-18vgbhs5.js +5 -0
  60. package/dist/chunks/{studio-h46vtzk8.js → studio-1fxkaaea.js} +4 -4
  61. package/dist/chunks/studio-24mccdrj.js +5 -0
  62. package/dist/chunks/studio-2eh507zk.js +9 -0
  63. package/dist/chunks/studio-2hcbccfv.js +5 -0
  64. package/dist/chunks/studio-2j1cb95x.js +5 -0
  65. package/dist/chunks/studio-2jbs3rxv.js +5 -0
  66. package/dist/chunks/{studio-rv11kfwa.js → studio-485046te.js} +7 -7
  67. package/dist/chunks/studio-4h8k4dw9.js +5 -0
  68. package/dist/chunks/studio-5f6n18kx.js +5 -0
  69. package/dist/chunks/studio-5gthpky6.js +5 -0
  70. package/dist/chunks/studio-5ve6bbep.js +5 -0
  71. package/dist/chunks/studio-6ep3js6b.js +9 -0
  72. package/dist/chunks/studio-6wkmf3wz.js +9 -0
  73. package/dist/chunks/studio-841rf3cg.js +5 -0
  74. package/dist/chunks/studio-8gmwgheg.js +5 -0
  75. package/dist/chunks/studio-8qm0ep50.js +5 -0
  76. package/dist/chunks/{studio-8grwxtqk.js → studio-90pq9km1.js} +4 -4
  77. package/dist/chunks/studio-924p1tm1.js +6 -0
  78. package/dist/chunks/{studio-pre0skq6.js → studio-a3g98wjr.js} +4 -4
  79. package/dist/chunks/studio-a3shpz9y.js +5 -0
  80. package/dist/chunks/studio-amsbaaar.js +6 -0
  81. package/dist/chunks/studio-at5spjbc.js +7 -0
  82. package/dist/chunks/studio-b2xv945e.js +5 -0
  83. package/dist/chunks/studio-bn5nkafw.js +5 -0
  84. package/dist/chunks/studio-bw6q5xjf.js +9 -0
  85. package/dist/chunks/studio-c7q0t9x1.js +5 -0
  86. package/dist/chunks/studio-camnhc96.js +6 -0
  87. package/dist/chunks/studio-cffqvnzd.js +5 -0
  88. package/dist/chunks/studio-d81xfh1g.js +5 -0
  89. package/dist/chunks/studio-dgz8d0c1.js +5 -0
  90. package/dist/chunks/studio-efvfrsf8.js +5 -0
  91. package/dist/chunks/studio-er30bpcx.js +5 -0
  92. package/dist/chunks/studio-ezscgr64.js +5 -0
  93. package/dist/chunks/studio-ffrrncvz.js +5 -0
  94. package/dist/chunks/studio-fpphgn8y.js +10 -0
  95. package/dist/chunks/studio-j1kvhdjk.js +4 -0
  96. package/dist/chunks/{studio-vrmcjf9g.js → studio-j430n16g.js} +5 -5
  97. package/dist/chunks/studio-jjkg84nj.js +5 -0
  98. package/dist/chunks/studio-m0q32ars.js +4 -0
  99. package/dist/chunks/studio-m6bdst11.js +5 -0
  100. package/dist/chunks/studio-nv2cptd4.js +64 -0
  101. package/dist/chunks/studio-nwfrc98n.js +5 -0
  102. package/dist/chunks/studio-p1wgvp7r.js +5 -0
  103. package/dist/chunks/studio-pag2wncm.js +5 -0
  104. package/dist/chunks/studio-qvanvzfd.js +5 -0
  105. package/dist/chunks/studio-qwa64kt7.js +5 -0
  106. package/dist/chunks/studio-rk1zc4x3.js +928 -0
  107. package/dist/chunks/studio-se2r3ptc.js +5 -0
  108. package/dist/chunks/studio-sg2a0dh0.js +5 -0
  109. package/dist/chunks/studio-tjzjhe68.js +5 -0
  110. package/dist/chunks/{studio-wszjyh0j.js → studio-tq0rtfwj.js} +4 -4
  111. package/dist/chunks/{studio-kggey1jt.js → studio-v0jzqdjm.js} +4 -4
  112. package/dist/chunks/studio-v2w7q8r1.js +7 -0
  113. package/dist/chunks/studio-v5vjq1h0.js +4 -0
  114. package/dist/chunks/studio-v8aga3vp.js +14 -0
  115. package/dist/chunks/studio-vfcdrfmv.js +5 -0
  116. package/dist/chunks/studio-vmfkgdjf.js +5 -0
  117. package/dist/chunks/studio-wt1816jj.js +5 -0
  118. package/dist/chunks/studio-wz73q5kq.js +4 -0
  119. package/dist/chunks/studio-y04qtxvp.js +7 -0
  120. package/dist/chunks/studio-y21g8zzg.js +5 -0
  121. package/dist/chunks/{studio-zey7zsdw.js → studio-y64hrt8p.js} +7 -7
  122. package/dist/chunks/studio-ynn90f58.js +16 -0
  123. package/dist/chunks/studio-yxz682sx.js +5 -0
  124. package/dist/chunks/studio-zp7snvkq.js +5 -0
  125. package/dist/chunks/studio-zq4z6tm6.js +5 -0
  126. package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
  127. package/dist/chunks/tabs-f5cw3tgp.js +4 -0
  128. package/dist/chunks/textfield-wewc8rq2.js +4 -0
  129. package/dist/chunks/toast-c9fn075p.js +4 -0
  130. package/dist/chunks/toast-host-ke5z4ng7.js +4 -0
  131. package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
  132. package/dist/chunks/tooltip-5v8ngwj2.js +4 -0
  133. package/dist/chunks/tree-mdq3v5cw.js +4 -0
  134. package/dist/chunks/{tsMode-2frah6h1.js → tsMode-sf49ee9x.js} +7 -7
  135. package/dist/chunks/workspace-jtfahpee.js +4 -0
  136. package/dist/chunks/ws-client-nze0k6mv.js +4 -0
  137. package/dist/iframe-entry.js +16 -16
  138. package/dist/manifest.json +63 -63
  139. package/dist/studio.js +97 -97
  140. package/package.json +6 -6
  141. package/src/about/about-modal.ts +4 -3
  142. package/src/account/action-flow.ts +45 -38
  143. package/src/account-status.ts +7 -2
  144. package/src/browse/library-layouts.ts +8 -5
  145. package/src/browse/library-model.ts +18 -6
  146. package/src/browse/library-pane.ts +37 -21
  147. package/src/browse/library-preview.ts +14 -9
  148. package/src/browse/library-source.ts +1 -1
  149. package/src/canvas/asset-refs.ts +24 -9
  150. package/src/canvas/asset-resolve.ts +19 -23
  151. package/src/canvas/canvas-helpers.ts +7 -6
  152. package/src/canvas/canvas-live-render.ts +44 -53
  153. package/src/canvas/canvas-patcher.ts +30 -30
  154. package/src/canvas/canvas-perf.ts +11 -5
  155. package/src/canvas/canvas-render.ts +62 -41
  156. package/src/canvas/canvas-surface.ts +5 -3
  157. package/src/canvas/canvas-utils.ts +90 -49
  158. package/src/canvas/dialog-path.ts +9 -4
  159. package/src/canvas/dialog-state.ts +1 -2
  160. package/src/canvas/diff-marks.ts +9 -16
  161. package/src/canvas/diff-toolbar.ts +8 -7
  162. package/src/canvas/edit-width-drag.ts +4 -1
  163. package/src/canvas/edit-width.ts +1 -3
  164. package/src/canvas/iframe-channel.ts +27 -13
  165. package/src/canvas/iframe-drop.ts +13 -12
  166. package/src/canvas/iframe-editable-root.ts +29 -16
  167. package/src/canvas/iframe-entry.ts +80 -63
  168. package/src/canvas/iframe-eval.ts +73 -49
  169. package/src/canvas/iframe-host.ts +135 -96
  170. package/src/canvas/iframe-inline-edit.ts +49 -30
  171. package/src/canvas/iframe-insert.ts +5 -4
  172. package/src/canvas/iframe-interaction.ts +30 -25
  173. package/src/canvas/iframe-overlay.ts +1 -1
  174. package/src/canvas/iframe-patch.ts +18 -15
  175. package/src/canvas/iframe-position.ts +12 -6
  176. package/src/canvas/iframe-protocol.ts +12 -16
  177. package/src/canvas/iframe-render.ts +36 -34
  178. package/src/canvas/iframe-slash.ts +24 -11
  179. package/src/canvas/iframe-subtree.ts +6 -2
  180. package/src/canvas/path-mapping.ts +19 -12
  181. package/src/canvas/popover-path.ts +7 -3
  182. package/src/canvas/popover-state.ts +1 -2
  183. package/src/canvas/serialize-scope.ts +13 -5
  184. package/src/canvas/stage-scrollbar.ts +2 -1
  185. package/src/canvas/surface-registry.ts +21 -3
  186. package/src/collab/collab-commands.ts +7 -2
  187. package/src/collab/collab-session.ts +84 -45
  188. package/src/collab/collab-state.ts +4 -3
  189. package/src/collab/monaco-binding.ts +16 -13
  190. package/src/collab/monaco-cursors.ts +5 -2
  191. package/src/commands/budget.ts +3 -3
  192. package/src/commands/command-args.ts +103 -71
  193. package/src/commands/context.ts +22 -20
  194. package/src/commands/keymap.ts +47 -43
  195. package/src/commands/levels.ts +3 -3
  196. package/src/commands/live-context.ts +7 -7
  197. package/src/commands/reference.ts +2 -1
  198. package/src/commands/registry.ts +12 -10
  199. package/src/commands/run-reported.ts +15 -10
  200. package/src/component-props.ts +46 -30
  201. package/src/content/collection-match.ts +5 -4
  202. package/src/content/draft-state.ts +4 -3
  203. package/src/content/entry-commands.ts +3 -2
  204. package/src/content/entry-editor.ts +29 -17
  205. package/src/content/entry-fields.ts +12 -7
  206. package/src/content/entry-model.ts +21 -12
  207. package/src/editor/canvas-context-menu.ts +1 -2
  208. package/src/editor/canvas-slash-bridge.ts +3 -6
  209. package/src/editor/content-slice.ts +16 -14
  210. package/src/editor/context-menu.ts +35 -22
  211. package/src/editor/convert-targets.ts +30 -35
  212. package/src/editor/convert-to-component.ts +11 -5
  213. package/src/editor/convert-to-repeater.ts +34 -22
  214. package/src/editor/editable-tags.ts +17 -2
  215. package/src/editor/file-drop-action.ts +21 -22
  216. package/src/editor/inline-edit-apply.ts +35 -17
  217. package/src/editor/inline-edit.ts +66 -50
  218. package/src/editor/inline-format.ts +59 -56
  219. package/src/editor/inline-link.ts +40 -15
  220. package/src/editor/insert-zone-action.ts +1 -1
  221. package/src/editor/merge-tags.ts +58 -19
  222. package/src/editor/repeater-scope.ts +39 -28
  223. package/src/editor/shortcuts.ts +32 -20
  224. package/src/editor/slash-menu.ts +1 -6
  225. package/src/files/asset-versions.ts +4 -4
  226. package/src/files/components.ts +15 -10
  227. package/src/files/elements.ts +5 -6
  228. package/src/files/file-ops.ts +77 -36
  229. package/src/files/files.ts +90 -95
  230. package/src/files/media-meta.ts +2 -1
  231. package/src/files/media-paths.ts +3 -0
  232. package/src/files/serialize-document.ts +2 -2
  233. package/src/format/constraints.ts +1 -1
  234. package/src/format/convert-file.ts +27 -13
  235. package/src/format/format-choices.ts +2 -1
  236. package/src/format/format-host.ts +76 -50
  237. package/src/github/github-auth-status.ts +27 -3
  238. package/src/github/github-auth.ts +19 -9
  239. package/src/github/github-publish.ts +24 -20
  240. package/src/grid/cell-editors.ts +46 -31
  241. package/src/grid/cell-popovers.ts +5 -3
  242. package/src/grid/edit-buffer.ts +10 -9
  243. package/src/grid/grid-controller.ts +20 -22
  244. package/src/grid/grid-layout.ts +21 -5
  245. package/src/grid/grid-open.ts +3 -6
  246. package/src/grid/grid-panel.ts +11 -4
  247. package/src/grid/grid-source.ts +8 -8
  248. package/src/grid/grid-view.ts +14 -17
  249. package/src/grid/redirects-grid.ts +14 -5
  250. package/src/grid/redirects.ts +16 -14
  251. package/src/grid/schema-columns.ts +25 -19
  252. package/src/grid/sources/connector-source.ts +47 -20
  253. package/src/grid/sources/content-source.ts +25 -24
  254. package/src/grid/sources/csv-file-source.ts +2 -2
  255. package/src/grid/tabulator-tables.d.ts +55 -34
  256. package/src/hosting/stage.ts +7 -7
  257. package/src/i18n/i18n-commands.ts +1 -2
  258. package/src/media/media-pane.ts +4 -1
  259. package/src/new-project/add-repo-modal.ts +20 -19
  260. package/src/new-project/import-tab.ts +10 -14
  261. package/src/new-project/location-fields.ts +2 -1
  262. package/src/new-project/new-project-modal.ts +12 -9
  263. package/src/packages/jxsuite-update.ts +4 -3
  264. package/src/packages/pull-package-sync.ts +26 -25
  265. package/src/page-params.ts +97 -68
  266. package/src/panels/activity-panel.ts +17 -9
  267. package/src/panels/ai-chat/attached-context.ts +13 -7
  268. package/src/panels/ai-chat/chat-view.ts +80 -73
  269. package/src/panels/ai-chat/composer.ts +30 -33
  270. package/src/panels/ai-chat/sessions-view.ts +1 -2
  271. package/src/panels/ai-panel.ts +23 -20
  272. package/src/panels/block-action-bar.ts +46 -35
  273. package/src/panels/bottom-dock.ts +5 -3
  274. package/src/panels/canvas-dnd-bridge.ts +31 -24
  275. package/src/panels/data-explorer.ts +62 -25
  276. package/src/panels/data-grid.ts +14 -11
  277. package/src/panels/dnd.ts +108 -118
  278. package/src/panels/editors.ts +52 -21
  279. package/src/panels/elements-panel.ts +10 -3
  280. package/src/panels/events-panel.ts +84 -69
  281. package/src/panels/formula-workspace.ts +76 -51
  282. package/src/panels/frontmatter-fields.ts +24 -19
  283. package/src/panels/frontmatter-panel.ts +44 -34
  284. package/src/panels/git-diff-open.ts +4 -4
  285. package/src/panels/git-panel.ts +49 -61
  286. package/src/panels/head-panel.ts +131 -111
  287. package/src/panels/i18n-panel.ts +10 -3
  288. package/src/panels/imports-panel.ts +23 -47
  289. package/src/panels/jump-bar.ts +48 -29
  290. package/src/panels/layers-panel.ts +97 -74
  291. package/src/panels/left-panel.ts +3 -3
  292. package/src/panels/pane-context.ts +31 -22
  293. package/src/panels/pane-grid.ts +49 -20
  294. package/src/panels/panel-registry.ts +22 -37
  295. package/src/panels/properties-panel.ts +175 -121
  296. package/src/panels/quick-search.ts +53 -31
  297. package/src/panels/right-panel.ts +3 -3
  298. package/src/panels/seo-modal.ts +13 -17
  299. package/src/panels/settings-menu.ts +15 -15
  300. package/src/panels/signals-panel.ts +153 -131
  301. package/src/panels/statement-editor.ts +230 -140
  302. package/src/panels/style-panel.ts +218 -205
  303. package/src/panels/style-utils.ts +114 -51
  304. package/src/panels/stylebook-doc.ts +57 -54
  305. package/src/panels/stylebook-layers-panel.ts +9 -9
  306. package/src/panels/stylebook-panel.ts +13 -17
  307. package/src/panels/tab-drop.ts +27 -11
  308. package/src/panels/tab-strip.ts +36 -26
  309. package/src/platform-errors.ts +57 -43
  310. package/src/platform.ts +58 -30
  311. package/src/platforms/cloud.ts +345 -175
  312. package/src/platforms/default-platform.ts +10 -4
  313. package/src/platforms/devserver.ts +129 -117
  314. package/src/platforms/read-batcher.ts +16 -8
  315. package/src/project-list.ts +2 -1
  316. package/src/publish/deploy-checklist.ts +8 -2
  317. package/src/publish/pages-service.ts +28 -13
  318. package/src/publish/publish-commands.ts +5 -4
  319. package/src/publish/publish-panel.ts +10 -6
  320. package/src/recent-projects.ts +15 -8
  321. package/src/resize-edges.ts +26 -36
  322. package/src/services/a11y-report.ts +26 -19
  323. package/src/services/agent-seed.ts +23 -11
  324. package/src/services/ai-ask.ts +9 -12
  325. package/src/services/ai-command-tools.ts +68 -62
  326. package/src/services/ai-import-tools.ts +80 -67
  327. package/src/services/ai-models.ts +17 -13
  328. package/src/services/ai-project-tools.ts +68 -32
  329. package/src/services/ai-session-store.ts +19 -10
  330. package/src/services/ai-system-prompt.ts +46 -20
  331. package/src/services/ai-tools.ts +71 -27
  332. package/src/services/ai-write-report.ts +20 -12
  333. package/src/services/ai-writes.ts +4 -4
  334. package/src/services/automation.ts +58 -31
  335. package/src/services/cem-export.ts +149 -58
  336. package/src/services/clock.ts +6 -1
  337. package/src/services/code-services.ts +37 -31
  338. package/src/services/context-manager.ts +14 -10
  339. package/src/services/context-resolver.ts +20 -8
  340. package/src/services/data-service.ts +19 -15
  341. package/src/services/directory-picker.ts +18 -12
  342. package/src/services/document-assistant.ts +39 -19
  343. package/src/services/gated-registry.ts +10 -6
  344. package/src/services/harness/chat-reducer.ts +23 -1
  345. package/src/services/import-client.ts +91 -38
  346. package/src/services/import-seed.ts +8 -2
  347. package/src/services/jx-validate.ts +28 -31
  348. package/src/services/live-preview.ts +0 -0
  349. package/src/services/live-surfaces.ts +6 -3
  350. package/src/services/model-uri.ts +10 -2
  351. package/src/services/module-preloads.ts +12 -8
  352. package/src/services/monaco-buffer.ts +43 -24
  353. package/src/services/monaco-lazy.ts +7 -8
  354. package/src/services/monaco-setup.ts +23 -16
  355. package/src/services/notify.ts +44 -17
  356. package/src/services/popover-report.ts +25 -10
  357. package/src/services/preview-eval.ts +20 -8
  358. package/src/services/profile.ts +13 -6
  359. package/src/services/project-path.ts +13 -10
  360. package/src/services/references.ts +0 -0
  361. package/src/services/render-critic.ts +8 -7
  362. package/src/services/settings/kernel.ts +13 -4
  363. package/src/services/settings/write-queue.ts +9 -9
  364. package/src/services/token-lint.ts +12 -10
  365. package/src/services/tool-executor.ts +17 -5
  366. package/src/services/tool-outcomes.ts +44 -24
  367. package/src/services/trusted-types.ts +24 -7
  368. package/src/settings/contexts-section.ts +11 -8
  369. package/src/settings/contributed-section.ts +79 -60
  370. package/src/settings/css-vars-editor.ts +37 -16
  371. package/src/settings/defs-editor.ts +38 -35
  372. package/src/settings/extension-rows.ts +16 -8
  373. package/src/settings/extension-sections.ts +23 -13
  374. package/src/settings/extensions-section.ts +4 -1
  375. package/src/settings/general-settings.ts +11 -8
  376. package/src/settings/locales-section.ts +20 -12
  377. package/src/settings/preferences-dialog.ts +9 -6
  378. package/src/settings/preferences-keymap.ts +7 -5
  379. package/src/settings/preferences-sections.ts +11 -5
  380. package/src/settings/project-sections.ts +1 -1
  381. package/src/settings/schema-field-ui.ts +9 -0
  382. package/src/settings/settings-document.ts +5 -5
  383. package/src/shell/tree.ts +6 -5
  384. package/src/shell.ts +104 -81
  385. package/src/site-context.ts +37 -22
  386. package/src/state.ts +41 -49
  387. package/src/store.ts +54 -34
  388. package/src/studio.ts +25 -75
  389. package/src/style/live-preview.ts +1 -1
  390. package/src/style/project-styles.ts +6 -7
  391. package/src/style/token-ref.ts +5 -4
  392. package/src/surfaces/about.ts +18 -19
  393. package/src/surfaces/add-repo.ts +17 -19
  394. package/src/surfaces/ai-chat.ts +31 -36
  395. package/src/surfaces/ai-credentials-form.ts +6 -16
  396. package/src/surfaces/ai-managed-connect.ts +3 -4
  397. package/src/surfaces/ai-model-picker.ts +3 -5
  398. package/src/surfaces/block-action-bar.ts +22 -11
  399. package/src/surfaces/boot-failure.ts +4 -5
  400. package/src/surfaces/bottom-dock.ts +9 -18
  401. package/src/surfaces/canvas-stage.ts +12 -11
  402. package/src/surfaces/cf-account-picker.ts +17 -18
  403. package/src/surfaces/commandbar.ts +14 -9
  404. package/src/surfaces/convert-repeater.ts +17 -19
  405. package/src/surfaces/data-actions.ts +9 -7
  406. package/src/surfaces/dialog.ts +26 -28
  407. package/src/surfaces/diff-toolbar.ts +9 -7
  408. package/src/surfaces/doc-header.ts +10 -19
  409. package/src/surfaces/empty-state.ts +7 -10
  410. package/src/surfaces/entry-editor.ts +14 -11
  411. package/src/surfaces/expression-editor.ts +11 -25
  412. package/src/surfaces/files-panel.ts +27 -14
  413. package/src/surfaces/formula-palette.ts +4 -5
  414. package/src/surfaces/git-panel.ts +7 -15
  415. package/src/surfaces/github-auth.ts +16 -20
  416. package/src/surfaces/github-publish.ts +17 -22
  417. package/src/surfaces/grid-cell.ts +30 -31
  418. package/src/surfaces/grid-open.ts +10 -14
  419. package/src/surfaces/grid-panel.ts +13 -9
  420. package/src/surfaces/grid-replace.ts +13 -13
  421. package/src/surfaces/grid-views.ts +15 -18
  422. package/src/surfaces/inspector-dock.ts +13 -12
  423. package/src/surfaces/jump-bar.ts +5 -6
  424. package/src/surfaces/jxsuite-update.ts +16 -22
  425. package/src/surfaces/library-pane.ts +19 -20
  426. package/src/surfaces/logic-panel.ts +17 -30
  427. package/src/surfaces/logic-workspace.ts +13 -15
  428. package/src/surfaces/media-browser.ts +11 -10
  429. package/src/surfaces/media-field.ts +4 -5
  430. package/src/surfaces/media-pane.ts +8 -7
  431. package/src/surfaces/menu.ts +29 -23
  432. package/src/surfaces/navigator-dock.ts +11 -12
  433. package/src/surfaces/new-project.ts +27 -26
  434. package/src/surfaces/pane-context.ts +20 -25
  435. package/src/surfaces/pane-grid.ts +15 -10
  436. package/src/surfaces/panel-activity.ts +5 -6
  437. package/src/surfaces/panel-data.ts +3 -4
  438. package/src/surfaces/panel-deploy-checklist.ts +5 -6
  439. package/src/surfaces/panel-elements.ts +5 -7
  440. package/src/surfaces/panel-i18n.ts +5 -7
  441. package/src/surfaces/panel-imports.ts +6 -13
  442. package/src/surfaces/panel-outline.ts +25 -19
  443. package/src/surfaces/panel-page.ts +11 -18
  444. package/src/surfaces/panel-problems.ts +5 -7
  445. package/src/surfaces/panel-signals.ts +20 -34
  446. package/src/surfaces/panel-stylebook-layers.ts +5 -8
  447. package/src/surfaces/preferences.ts +21 -11
  448. package/src/surfaces/progress-modal.ts +15 -9
  449. package/src/surfaces/properties-panel.json +1 -1
  450. package/src/surfaces/properties-panel.ts +20 -42
  451. package/src/surfaces/publish.ts +18 -18
  452. package/src/surfaces/push-plan.ts +7 -8
  453. package/src/surfaces/rail.ts +13 -13
  454. package/src/surfaces/reference-field.ts +11 -15
  455. package/src/surfaces/schema-builder.ts +16 -22
  456. package/src/surfaces/schema-form.ts +15 -25
  457. package/src/surfaces/secret-field.ts +9 -6
  458. package/src/surfaces/seo.ts +21 -15
  459. package/src/surfaces/settings-contexts.ts +9 -7
  460. package/src/surfaces/settings-contributed.ts +14 -10
  461. package/src/surfaces/settings-css-vars.ts +5 -12
  462. package/src/surfaces/settings-defs.json +2 -2
  463. package/src/surfaces/settings-defs.ts +17 -21
  464. package/src/surfaces/settings-deploy.ts +8 -15
  465. package/src/surfaces/settings-extensions.ts +5 -6
  466. package/src/surfaces/settings-head.ts +33 -39
  467. package/src/surfaces/settings-locales.ts +8 -20
  468. package/src/surfaces/settings-overview.ts +5 -6
  469. package/src/surfaces/settings-packages.ts +8 -7
  470. package/src/surfaces/settings-pane.ts +9 -18
  471. package/src/surfaces/settings-rawjson.ts +5 -6
  472. package/src/surfaces/shell.ts +1 -2
  473. package/src/surfaces/slash-menu.ts +19 -9
  474. package/src/surfaces/statements.ts +13 -18
  475. package/src/surfaces/statusbar.ts +17 -14
  476. package/src/surfaces/style-panel.ts +18 -31
  477. package/src/surfaces/stylebook-chrome.ts +3 -5
  478. package/src/surfaces/tab-strip.ts +14 -13
  479. package/src/surfaces/target-line.ts +6 -7
  480. package/src/surfaces/welcome.ts +5 -7
  481. package/src/tabs/patch-ops.ts +4 -3
  482. package/src/tabs/project-config.ts +32 -21
  483. package/src/tabs/selection.ts +36 -8
  484. package/src/tabs/tab.ts +52 -41
  485. package/src/tabs/transact.ts +98 -53
  486. package/src/types.ts +32 -17
  487. package/src/ui/ai-credentials-form.ts +10 -13
  488. package/src/ui/ai-model-picker.ts +3 -3
  489. package/src/ui/cf-account-picker.ts +7 -9
  490. package/src/ui/color-selector.ts +9 -5
  491. package/src/ui/dynamic-slot.ts +7 -8
  492. package/src/ui/expression-editor.ts +112 -105
  493. package/src/ui/form-controls.ts +57 -48
  494. package/src/ui/formula-catalog.ts +239 -230
  495. package/src/ui/formula-chips.ts +33 -18
  496. package/src/ui/layers.ts +44 -31
  497. package/src/ui/media-picker.ts +18 -9
  498. package/src/ui/popover-surface.ts +20 -12
  499. package/src/ui/progress-modal.ts +13 -8
  500. package/src/ui/regions.ts +7 -6
  501. package/src/ui/schema-form.ts +113 -70
  502. package/src/ui/surface.ts +71 -8
  503. package/src/ui/timing.ts +9 -0
  504. package/src/ui/value-source.ts +44 -31
  505. package/src/ui/virtual-window.ts +3 -2
  506. package/src/utils/base64.ts +3 -1
  507. package/src/utils/edit-display.ts +73 -73
  508. package/src/utils/element-selectors.ts +3 -2
  509. package/src/utils/google-fonts.ts +15 -14
  510. package/src/utils/inherited-style.ts +18 -20
  511. package/src/utils/link-target.ts +1 -1
  512. package/src/utils/preview-format.ts +25 -3
  513. package/src/utils/strip-events.ts +49 -22
  514. package/src/utils/studio-utils.ts +29 -14
  515. package/src/view.ts +2 -3
  516. package/src/workspace/pane-derive.ts +10 -12
  517. package/src/workspace/session.ts +53 -43
  518. package/src/workspace/workspace.ts +40 -36
  519. package/dist/chunks/adapter-f93pafd7.js +0 -4
  520. package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
  521. package/dist/chunks/cf-settings-125tdm0w.js +0 -4
  522. package/dist/chunks/color-area-jqhna8zy.js +0 -4
  523. package/dist/chunks/color-field-embq5ctg.js +0 -4
  524. package/dist/chunks/color-fpezvnkt.js +0 -4
  525. package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
  526. package/dist/chunks/combobox-773hdzyj.js +0 -4
  527. package/dist/chunks/components-ax2f1fnn.js +0 -4
  528. package/dist/chunks/content-source-108aqtk1.js +0 -4
  529. package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
  530. package/dist/chunks/dialog-mtm9fq5t.js +0 -4
  531. package/dist/chunks/editor-pfgdmkb0.js +0 -4
  532. package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
  533. package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
  534. package/dist/chunks/file-ops-meej5mqf.js +0 -4
  535. package/dist/chunks/files-44vp8a2s.js +0 -4
  536. package/dist/chunks/format-host-7q1petb9.js +0 -4
  537. package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
  538. package/dist/chunks/git-panel-zngbymvd.js +0 -4
  539. package/dist/chunks/grid-view-sx9vynsp.js +0 -51
  540. package/dist/chunks/icons-p44xhjf0.js +0 -4
  541. package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
  542. package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
  543. package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
  544. package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
  545. package/dist/chunks/index-wkyfjeqz.js +0 -4
  546. package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
  547. package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
  548. package/dist/chunks/layers-xd92fg8d.js +0 -4
  549. package/dist/chunks/listbox-s8fkmnq8.js +0 -4
  550. package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
  551. package/dist/chunks/media-picker-0svzkdyb.js +0 -4
  552. package/dist/chunks/menu-37d07z9m.js +0 -4
  553. package/dist/chunks/menu-5c55ea3d.js +0 -4
  554. package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
  555. package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
  556. package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
  557. package/dist/chunks/notify-0xgtn8q1.js +0 -4
  558. package/dist/chunks/number-field-gw7sq8rn.js +0 -4
  559. package/dist/chunks/parse-897fvqah.js +0 -4
  560. package/dist/chunks/platform-v1qctbe6.js +0 -4
  561. package/dist/chunks/popover-8htra4er.js +0 -4
  562. package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
  563. package/dist/chunks/quick-search-a54e6t5n.js +0 -4
  564. package/dist/chunks/references-gmqp82fs.js +0 -4
  565. package/dist/chunks/right-panel-v7t9awbk.js +0 -4
  566. package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
  567. package/dist/chunks/select-n3v7gwas.js +0 -4
  568. package/dist/chunks/split-pff8f3ze.js +0 -4
  569. package/dist/chunks/studio-0bhx5hz6.js +0 -5
  570. package/dist/chunks/studio-0k1ddnyy.js +0 -6
  571. package/dist/chunks/studio-1b04pd0j.js +0 -64
  572. package/dist/chunks/studio-4dwbj6gb.js +0 -5
  573. package/dist/chunks/studio-4tanh828.js +0 -5
  574. package/dist/chunks/studio-55h4mstj.js +0 -4
  575. package/dist/chunks/studio-5tnvjkz4.js +0 -5
  576. package/dist/chunks/studio-60dqgb0c.js +0 -5
  577. package/dist/chunks/studio-61dp09qg.js +0 -9
  578. package/dist/chunks/studio-63epcrj2.js +0 -5
  579. package/dist/chunks/studio-74k29dy9.js +0 -5
  580. package/dist/chunks/studio-7vg6jcd3.js +0 -5
  581. package/dist/chunks/studio-7zx31knw.js +0 -9
  582. package/dist/chunks/studio-8bxk97km.js +0 -5
  583. package/dist/chunks/studio-933e30n4.js +0 -5
  584. package/dist/chunks/studio-98wnwhbg.js +0 -5
  585. package/dist/chunks/studio-9mccjwjh.js +0 -14
  586. package/dist/chunks/studio-a2ke1e4t.js +0 -5
  587. package/dist/chunks/studio-e3a2a6v3.js +0 -4
  588. package/dist/chunks/studio-e81q1vb9.js +0 -5
  589. package/dist/chunks/studio-epgrmqqm.js +0 -5
  590. package/dist/chunks/studio-ery42sqr.js +0 -4
  591. package/dist/chunks/studio-g1shz58g.js +0 -5
  592. package/dist/chunks/studio-gf0fz03c.js +0 -5
  593. package/dist/chunks/studio-gjtpe62q.js +0 -6
  594. package/dist/chunks/studio-gkskhg7m.js +0 -5
  595. package/dist/chunks/studio-gx4dnjzd.js +0 -5
  596. package/dist/chunks/studio-j03zga3y.js +0 -9
  597. package/dist/chunks/studio-jhpxeckz.js +0 -5
  598. package/dist/chunks/studio-k01r7ykp.js +0 -5
  599. package/dist/chunks/studio-kk7h30ne.js +0 -7
  600. package/dist/chunks/studio-kt1zqney.js +0 -5
  601. package/dist/chunks/studio-m3cwhvye.js +0 -5
  602. package/dist/chunks/studio-mcayt6hz.js +0 -5
  603. package/dist/chunks/studio-myjcghv3.js +0 -5
  604. package/dist/chunks/studio-n8bxwc3y.js +0 -4
  605. package/dist/chunks/studio-ngm8gvpb.js +0 -5
  606. package/dist/chunks/studio-nj5a01jy.js +0 -928
  607. package/dist/chunks/studio-pcgz8heb.js +0 -5
  608. package/dist/chunks/studio-qcsq0t15.js +0 -5
  609. package/dist/chunks/studio-qkstvve9.js +0 -5
  610. package/dist/chunks/studio-qv1pwd3c.js +0 -5
  611. package/dist/chunks/studio-rc6dvxjb.js +0 -7
  612. package/dist/chunks/studio-s8dmmz66.js +0 -5
  613. package/dist/chunks/studio-sp5xzbj4.js +0 -6
  614. package/dist/chunks/studio-szsjbj0g.js +0 -5
  615. package/dist/chunks/studio-t1xzawhr.js +0 -16
  616. package/dist/chunks/studio-t6b6qe31.js +0 -5
  617. package/dist/chunks/studio-tdcprbqb.js +0 -5
  618. package/dist/chunks/studio-vyc0b4he.js +0 -10
  619. package/dist/chunks/studio-w0cgf6jg.js +0 -5
  620. package/dist/chunks/studio-w3hskzqk.js +0 -5
  621. package/dist/chunks/studio-xgrgcdyh.js +0 -9
  622. package/dist/chunks/studio-xz2yxfcb.js +0 -5
  623. package/dist/chunks/studio-y6n42tgs.js +0 -5
  624. package/dist/chunks/studio-yb560vxr.js +0 -5
  625. package/dist/chunks/studio-yn9f8vtx.js +0 -5
  626. package/dist/chunks/studio-yw05w8f0.js +0 -7
  627. package/dist/chunks/studio-z16sgavc.js +0 -5
  628. package/dist/chunks/studio-zyqn40w4.js +0 -5
  629. package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
  630. package/dist/chunks/tabs-jwthg40w.js +0 -4
  631. package/dist/chunks/textfield-spy3hc77.js +0 -4
  632. package/dist/chunks/toast-4d35zd64.js +0 -4
  633. package/dist/chunks/toast-host-8sjmfed3.js +0 -4
  634. package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
  635. package/dist/chunks/tree-h19v1jfz.js +0 -4
  636. package/dist/chunks/workspace-zt81g1ms.js +0 -4
  637. package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
@@ -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,
@@ -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;