@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
@@ -25,27 +25,12 @@
25
25
  import { reactive } from "../reactivity";
26
26
  import { mountSurface, registerSurface } from "../ui/surface";
27
27
  import { overlayRegion, REGION_ATTR } from "../ui/regions";
28
- import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
28
+ import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
29
29
  import { selectValue } from "@jxsuite/ui/behaviors/textfield";
30
30
  import dialogDoc from "./dialog.json";
31
- import type { SurfaceHandle } from "../ui/surface";
32
- import type { JxDocument } from "@jxsuite/schema/types";
31
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
33
32
 
34
- registerSurface("dialog", dialogDoc as unknown as JxDocument);
35
-
36
- /**
37
- * One option of a prompt's choice.
38
- *
39
- * There is no `selected` here, and its absence is the contract rather than an omission: `jx-select`
40
- * is a native `<select>`, and the reader's first pick sets an option's dirtiness flag, after which
41
- * the `selected` content attribute stops moving selectedness (`ui.md` §5.1). A projection that
42
- * marked a row would be right until the first pick and wrong after it. The chosen row is named by
43
- * `chosen`, once, beside the list.
44
- */
45
- export interface DialogChoiceOption {
46
- value: string;
47
- label: string;
48
- }
33
+ registerSurface("dialog", dialogDoc);
49
34
 
50
35
  /** What a flow hands the surface. Everything is a projection; the flow keeps the state machine. */
51
36
  export interface DialogSurfaceOptions {
@@ -61,8 +46,15 @@ export interface DialogSurfaceOptions {
61
46
  message?: string;
62
47
  /** Render a richer body into the document's island, once the element is ready. */
63
48
  island?: (host: HTMLElement) => void;
64
- /** A `jx-select` above the field, and which of its rows is chosen. */
65
- choice?: { label: string; options: DialogChoiceOption[]; chosen: string };
49
+ /**
50
+ * A `jx-select` above the field, and which of its rows is chosen. The rows carry no `selected`,
51
+ * and that absence is the contract rather than an omission: `jx-select` is a native `<select>`,
52
+ * and the reader's first pick sets an option's dirtiness flag, after which the `selected` content
53
+ * attribute stops moving selectedness (`ui.md` §5.1). A projection that marked a row would be
54
+ * right until the first pick and wrong after it. The chosen row is named by `chosen`, once,
55
+ * beside the list.
56
+ */
57
+ choice?: { label: string; options: SurfaceOption[]; chosen: string };
66
58
  /** The prompt's field. */
67
59
  field?: {
68
60
  value: string;
@@ -104,7 +96,7 @@ export interface DialogSurfacePatch {
104
96
  placeholder?: string;
105
97
  invalid?: boolean;
106
98
  error?: string;
107
- options?: DialogChoiceOption[];
99
+ options?: SurfaceOption[];
108
100
  chosen?: string;
109
101
  }
110
102
 
@@ -118,7 +110,7 @@ export interface DialogSurfaceHandle {
118
110
  close: () => void;
119
111
  }
120
112
 
121
- interface DialogScope extends Record<string, unknown> {
113
+ interface DialogScope {
122
114
  headline: string;
123
115
  confirmLabel: string;
124
116
  secondaryLabel: string;
@@ -129,7 +121,7 @@ interface DialogScope extends Record<string, unknown> {
129
121
  hasMessage: boolean;
130
122
  hasChoice: boolean;
131
123
  choiceLabel: string;
132
- options: DialogChoiceOption[];
124
+ options: SurfaceOption[];
133
125
  hasField: boolean;
134
126
  multiline: boolean;
135
127
  rows: string;
@@ -195,7 +187,7 @@ export function openDialogSurface(options: DialogSurfaceOptions): DialogSurfaceH
195
187
  slot.setAttribute(REGION_ATTR, overlayRegion("dialog", options.region));
196
188
  options.layer.append(slot);
197
189
 
198
- const scope = reactive<DialogScope>({
190
+ const scope: DialogScope = reactive<DialogScope>({
199
191
  cancel: () => {
200
192
  options.onCancel();
201
193
  },
@@ -236,10 +228,14 @@ export function openDialogSurface(options: DialogSurfaceOptions): DialogSurfaceH
236
228
  secondaryLabel: options.secondaryLabel ?? "",
237
229
  size: options.size ?? "sm",
238
230
  value: options.field?.value ?? "",
239
- }) as DialogScope;
231
+ });
240
232
 
241
233
  let handle: SurfaceHandle | null = null;
242
234
  let closed = false;
235
+ /* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
236
+ element, and a direct `closed` test after that `await` would be narrowed to the value the test
237
+ before it saw. */
238
+ const isClosed = (): boolean => closed;
243
239
  /* Closing while the element is still rendering must not leave `ready` waiting on a `jx-ready`
244
240
  a disposed element will never send, so the wait races against the close. */
245
241
  let abort: () => void = () => {};
@@ -248,14 +244,16 @@ export function openDialogSurface(options: DialogSurfaceOptions): DialogSurfaceH
248
244
  });
249
245
  const mounted = mountSurface("dialog", scope, slot);
250
246
  const ready = mounted.then(async (surface) => {
247
+ /* SAFETY: `dialog.json`'s root definition is a `jx-dialog` element, so the runtime
248
+ mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
251
249
  const element = surface.root as HTMLElement;
252
- if (closed) {
250
+ if (isClosed()) {
253
251
  surface.dispose();
254
252
  return element;
255
253
  }
256
254
  handle = surface;
257
255
  await Promise.race([whenReady(element), aborted]);
258
- if (closed) {
256
+ if (isClosed()) {
259
257
  return element;
260
258
  }
261
259
  options.island?.(element.querySelector<HTMLElement>('[part="island"]') ?? element);
@@ -284,7 +282,7 @@ export function openDialogSurface(options: DialogSurfaceOptions): DialogSurfaceH
284
282
  const element = handle?.root;
285
283
  if (element instanceof HTMLElement) {
286
284
  // The platform's close first, so focus goes back where it was; then the document goes.
287
- closeDialog(element);
285
+ close(element);
288
286
  }
289
287
  // A mount that has not landed yet is disposed by `ready` when it does.
290
288
  handle?.dispose();
@@ -18,10 +18,9 @@
18
18
  import { reactive } from "../reactivity";
19
19
  import { mountSurface, registerSurface } from "../ui/surface";
20
20
  import diffToolbarDoc from "./diff-toolbar.json";
21
- import type { JxDocument } from "@jxsuite/schema/types";
22
21
  import type { SurfaceHandle } from "../ui/surface";
23
22
 
24
- registerSurface("diff-toolbar", diffToolbarDoc as unknown as JxDocument);
23
+ registerSurface("diff-toolbar", diffToolbarDoc);
25
24
 
26
25
  /** Everything the bar draws, as one value. Every field is already a string or a boolean. */
27
26
  export interface DiffToolbarView {
@@ -66,7 +65,7 @@ export interface DiffToolbarSurfaceHandle {
66
65
  }
67
66
 
68
67
  /** The scope the document reads: {@link DiffToolbarView} plus the actions its controls call. */
69
- interface DiffToolbarScope extends Record<string, unknown>, DiffToolbarView, DiffToolbarActions {}
68
+ interface DiffToolbarScope extends DiffToolbarView, DiffToolbarActions {}
70
69
 
71
70
  /** Write a projection into the scope. */
72
71
  function project(scope: DiffToolbarScope, view: DiffToolbarView): void {
@@ -98,7 +97,7 @@ export function mountDiffToolbarSurface(
98
97
  actions: DiffToolbarActions,
99
98
  ): DiffToolbarSurfaceHandle {
100
99
  host.replaceChildren();
101
- const scope = reactive<DiffToolbarScope>({
100
+ const scope: DiffToolbarScope = reactive<DiffToolbarScope>({
102
101
  codeChecked: "false",
103
102
  countLabel: "",
104
103
  degraded: "hidden",
@@ -113,18 +112,21 @@ export function mountDiffToolbarSurface(
113
112
  stepper: "hidden",
114
113
  viewMode: "choice",
115
114
  visualChecked: "true",
116
- }) as DiffToolbarScope;
115
+ });
117
116
  project(scope, view);
118
117
 
119
118
  let mounted: SurfaceHandle | null = null;
120
119
  let disposed = false;
121
120
  const ready = mountSurface("diff-toolbar", scope, host).then((surface) => {
121
+ /* SAFETY: `diff-toolbar.json`'s root definition is a `div` element, so the runtime mounts an
122
+ HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
123
+ const root = surface.root as HTMLElement;
122
124
  if (disposed) {
123
125
  surface.dispose();
124
- return surface.root as HTMLElement;
126
+ return root;
125
127
  }
126
128
  mounted = surface;
127
- return surface.root as HTMLElement;
129
+ return root;
128
130
  });
129
131
 
130
132
  return {
@@ -27,16 +27,9 @@
27
27
  import { reactive } from "../reactivity";
28
28
  import { mountSurface, registerSurface } from "../ui/surface";
29
29
  import docHeaderDoc from "./doc-header.json";
30
- import type { JxDocument } from "@jxsuite/schema/types";
31
- import type { SurfaceHandle } from "../ui/surface";
30
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
32
31
 
33
- registerSurface("doc-header", docHeaderDoc as unknown as JxDocument);
34
-
35
- /** One choice in a row's picker. The shape `jx-select` reads. */
36
- export interface DocHeaderChoice {
37
- value: string;
38
- label: string;
39
- }
32
+ registerSurface("doc-header", docHeaderDoc);
40
33
 
41
34
  /**
42
35
  * One row of the card, as the document reads it.
@@ -45,7 +38,7 @@ export interface DocHeaderChoice {
45
38
  * `$switch` chooses on one: a row that omitted `options` would leave the picker case reading an
46
39
  * absent path.
47
40
  */
48
- export interface DocHeaderRow extends Record<string, unknown> {
41
+ export interface DocHeaderRow {
49
42
  /** The row's identity: the repeater's key, and the argument every action is given. */
50
43
  key: string;
51
44
  /** The name on `data-prop` — what a reader, a screenshot region and the inspector call it. */
@@ -68,7 +61,7 @@ export interface DocHeaderRow extends Record<string, unknown> {
68
61
  /** A text row's placeholder. Empty draws none. */
69
62
  placeholder: string;
70
63
  /** A picker's rows, in the order they are offered. Empty on every other kind. */
71
- options: DocHeaderChoice[];
64
+ options: SurfaceOption[];
72
65
  /** A sentence under the control — an empty collection, or a listing that failed. */
73
66
  note: string;
74
67
  /** Whether {@link DocHeaderRow.note} has anything in it; `$switch` is the document's conditional. */
@@ -80,7 +73,7 @@ export interface DocHeaderRow extends Record<string, unknown> {
80
73
  }
81
74
 
82
75
  /** One `$head` entry the disclosure lists, read-only. */
83
- export interface DocHeaderRawEntry extends Record<string, unknown> {
76
+ export interface DocHeaderRawEntry {
84
77
  /** Unique within one document — the repeater's key. */
85
78
  key: string;
86
79
  /** The entry as markup, e.g. `<meta name="author">`. */
@@ -134,7 +127,7 @@ export interface DocHeaderActions {
134
127
  /** Open the OS file picker for a media row and assign what comes back. */
135
128
  upload: (key: string) => void;
136
129
  /** Open the media browser under the button that was pressed. */
137
- browse: (key: string, anchor: unknown) => void;
130
+ browse: (key: string, anchor: EventTarget | null) => void;
138
131
  /** Run the `document.openSeo` command — the door to Search appearance. */
139
132
  openSeo: () => void;
140
133
  /** Remember that the Raw head tags disclosure was opened or closed. */
@@ -153,7 +146,7 @@ export interface DocHeaderSurface {
153
146
  }
154
147
 
155
148
  /** The scope the document reads: the view plus the actions, flat. */
156
- interface DocHeaderScope extends Record<string, unknown>, DocHeaderView, DocHeaderActions {}
149
+ interface DocHeaderScope extends DocHeaderView, DocHeaderActions {}
157
150
 
158
151
  /** Write a whole view into the scope. Assignment only — the mount is never rebuilt for a repaint. */
159
152
  function project(scope: DocHeaderScope, view: DocHeaderView): void {
@@ -184,7 +177,7 @@ export function mountDocHeaderSurface(
184
177
  view: DocHeaderView,
185
178
  actions: DocHeaderActions,
186
179
  ): DocHeaderSurface {
187
- const scope = reactive<DocHeaderScope>({
180
+ const scope: DocHeaderScope = reactive<DocHeaderScope>({
188
181
  ...actions,
189
182
  collection: "Document",
190
183
  expanded: true,
@@ -195,7 +188,7 @@ export function mountDocHeaderSurface(
195
188
  region: "",
196
189
  route: "",
197
190
  rows: [],
198
- }) as DocHeaderScope;
191
+ });
199
192
  project(scope, view);
200
193
 
201
194
  host.replaceChildren();
@@ -218,9 +211,7 @@ export function mountDocHeaderSurface(
218
211
  stage that redrew took the card's root away without telling anyone. */
219
212
  connected: () =>
220
213
  !disposed &&
221
- (mounted === null
222
- ? host.childNodes.length === 0
223
- : (mounted.root as Node).parentNode === host),
214
+ (mounted === null ? host.childNodes.length === 0 : mounted.root.parentNode === host),
224
215
  dispose() {
225
216
  disposed = true;
226
217
  mounted?.dispose();
@@ -28,13 +28,12 @@ import { reactive } from "../reactivity";
28
28
  import { mountSurface, registerSurface } from "../ui/surface";
29
29
  import emptyStateDoc from "./empty-state.json";
30
30
  import type { EmptyStateSpec } from "../panels/empty-state";
31
- import type { JxDocument } from "@jxsuite/schema/types";
32
31
  import type { SurfaceHandle } from "../ui/surface";
33
32
 
34
- registerSurface("empty-state", emptyStateDoc as unknown as JxDocument);
33
+ registerSurface("empty-state", emptyStateDoc);
35
34
 
36
35
  /** One button, as the document draws it: a key, a word, and whether it can act. */
37
- interface EmptyStateActionRow extends Record<string, unknown> {
36
+ interface EmptyStateActionRow {
38
37
  /** The repeater's key and what a press is addressed with — this action's slot in the list. */
39
38
  id: string;
40
39
  label: string;
@@ -44,10 +43,8 @@ interface EmptyStateActionRow extends Record<string, unknown> {
44
43
  /**
45
44
  * What the document draws, with every branch already decided.
46
45
  *
47
- * Named apart from the scope rather than derived from it with `Omit`: the scope carries the kit's
48
- * `Record<string, unknown>` index signature, and `Omit` over a type with one keeps the signature
49
- * and drops every named property — so the projection below would have type-checked against
50
- * anything.
46
+ * Named apart from the scope, which adds the one callback, so the projection below is checked
47
+ * against exactly the fields the document draws.
51
48
  */
52
49
  interface EmptyStateView {
53
50
  message: string;
@@ -59,7 +56,7 @@ interface EmptyStateView {
59
56
  }
60
57
 
61
58
  /** The scope `empty-state.json` reads. Every field is a value; the document asks no question. */
62
- interface EmptyStateScope extends Record<string, unknown>, EmptyStateView {
59
+ interface EmptyStateScope extends EmptyStateView {
63
60
  runAction: (id: string) => void;
64
61
  }
65
62
 
@@ -89,12 +86,12 @@ export function createEmptyStateSurface(spec: EmptyStateSpec): EmptyStateSurface
89
86
 
90
87
  /** The handlers, held apart from the scope so `runAction` never has to be reassigned. */
91
88
  let handlers: (() => void)[] = [];
92
- const scope = reactive<EmptyStateScope>({
89
+ const scope: EmptyStateScope = reactive<EmptyStateScope>({
93
90
  ...project(spec),
94
91
  runAction: (id: string) => {
95
92
  handlers[Number(id)]?.();
96
93
  },
97
- }) as EmptyStateScope;
94
+ });
98
95
  handlers = handlersOf(spec);
99
96
 
100
97
  let mounted: SurfaceHandle | null = null;
@@ -27,13 +27,14 @@
27
27
  * @docs studio/projects/content-types
28
28
  */
29
29
 
30
+ import { isString } from "@jxsuite/schema/guards";
30
31
  import { reactive } from "../reactivity";
31
32
  import { mountSurface, registerSurface } from "../ui/surface";
32
33
  import entryEditorDoc from "./entry-editor.json";
33
- import type { JxDocument } from "@jxsuite/schema/types";
34
+ import type { JxElement } from "@jxsuite/schema/types";
34
35
  import type { SurfaceHandle } from "../ui/surface";
35
36
 
36
- registerSurface("entry-editor", entryEditorDoc as unknown as JxDocument);
37
+ registerSurface("entry-editor", entryEditorDoc);
37
38
 
38
39
  /** Everything the document draws, as one value. */
39
40
  export interface EntryEditorView {
@@ -89,7 +90,7 @@ export interface EntryEditorSurfaceHandle {
89
90
  }
90
91
 
91
92
  /** The scope the document reads: the view plus the actions, flat. */
92
- interface EntryEditorScope extends Record<string, unknown>, EntryEditorView, EntryEditorActions {}
93
+ interface EntryEditorScope extends EntryEditorView, EntryEditorActions {}
93
94
 
94
95
  /** Write a whole view into the scope. Assignment only — the mount is never rebuilt for a repaint. */
95
96
  function project(scope: EntryEditorScope, view: EntryEditorView): void {
@@ -107,10 +108,9 @@ function project(scope: EntryEditorScope, view: EntryEditorView): void {
107
108
  }
108
109
 
109
110
  /** The `part` a node was authored with, or `""` — the only thing this adapter asks about a node. */
110
- function partOf(def: unknown): string {
111
- const attributes = (def as { attributes?: Record<string, unknown> } | null)?.attributes;
112
- const part = attributes?.["part"];
113
- return typeof part === "string" ? part : "";
111
+ function partOf(def: JxElement | string): string {
112
+ const part = isString(def) ? undefined : def.attributes?.["part"];
113
+ return isString(part) ? part : "";
114
114
  }
115
115
 
116
116
  /**
@@ -133,7 +133,7 @@ export function mountEntryEditorSurface(
133
133
  islands: EntryEditorIslands,
134
134
  ): EntryEditorSurfaceHandle {
135
135
  host.replaceChildren();
136
- const scope = reactive<EntryEditorScope>({
136
+ const scope: EntryEditorScope = reactive<EntryEditorScope>({
137
137
  collection: "",
138
138
  draft: false,
139
139
  draftAxis: "hidden",
@@ -147,7 +147,7 @@ export function mountEntryEditorSurface(
147
147
  region: "",
148
148
  setDraft: actions.setDraft,
149
149
  stage: "empty",
150
- }) as EntryEditorScope;
150
+ });
151
151
  project(scope, view);
152
152
 
153
153
  let mounted: SurfaceHandle | null = null;
@@ -163,12 +163,15 @@ export function mountEntryEditorSurface(
163
163
  }
164
164
  },
165
165
  }).then((surface) => {
166
+ /* SAFETY: `entry-editor.json`'s root definition is a `div` element, so the runtime mounts an
167
+ HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
168
+ const root = surface.root as HTMLElement;
166
169
  if (disposed) {
167
170
  surface.dispose();
168
- return surface.root as HTMLElement;
171
+ return root;
169
172
  }
170
173
  mounted = surface;
171
- return surface.root as HTMLElement;
174
+ return root;
172
175
  });
173
176
 
174
177
  return {
@@ -31,26 +31,12 @@
31
31
  import { reactive } from "../reactivity";
32
32
  import { mountSurface, registerSurface } from "../ui/surface";
33
33
  import expressionEditorDoc from "./expression-editor.json";
34
- import type { JxDocument } from "@jxsuite/schema/types";
35
- import type { SurfaceHandle } from "../ui/surface";
34
+ import type { SurfaceHandle, SurfaceOption, SurfaceOptionGroup } from "../ui/surface";
36
35
 
37
- registerSurface("expression-editor", expressionEditorDoc as unknown as JxDocument);
38
-
39
- /** A closed list of choices, in the shape the kit's select reads. */
40
- export interface ExprOption {
41
- value: string;
42
- label: string;
43
- }
44
-
45
- /** A delimited run of choices — the kit's own `optgroup`, which draws both halves of the rule. */
46
- export interface ExprSelectGroup {
47
- id: string;
48
- label: string;
49
- rows: ExprOption[];
50
- }
36
+ registerSurface("expression-editor", expressionEditorDoc);
51
37
 
52
38
  /** One chip of the pipeline, as the document draws it. */
53
- export interface ExprChipView extends Record<string, unknown> {
39
+ export interface ExprChipView {
54
40
  /** The joined node path: the repeater's key, and what a click reports back to the flow. */
55
41
  key: string;
56
42
  label: string;
@@ -83,7 +69,7 @@ export type ExprLead = "none" | "arg" | "case" | "default";
83
69
  * Every field is a string, a flag or a list: the document asks no question about an expression, and
84
70
  * there is no branch in it that the walk has not already taken.
85
71
  */
86
- export interface ExprRowView extends Record<string, unknown> {
72
+ export interface ExprRowView {
87
73
  /**
88
74
  * Unique within one editor, and the repeater's key. It is the node's own path plus the slot it
89
75
  * fills, so a row that survives an edit keeps its node — which is what stops a keystroke in one
@@ -111,19 +97,19 @@ export interface ExprRowView extends Record<string, unknown> {
111
97
  /** The accessible name of the row's icon-only control. */
112
98
  title: string;
113
99
  /** An `operator` row's grouped operator list. */
114
- groups: ExprSelectGroup[];
100
+ groups: SurfaceOptionGroup[];
115
101
  /** An `operator` row offers the catalog beside its picker; a nested one does not. */
116
102
  catalog: boolean;
117
103
  /** Which rung an `operand` row shows. */
118
104
  source: ExprSource;
119
105
  /** The rungs on offer. Empty means the slot admits one shape, so there is nothing to choose. */
120
- sourceOptions: ExprOption[];
106
+ sourceOptions: SurfaceOption[];
121
107
  /** Whether the rung picker is drawn at all — `sourceOptions` non-empty, said as a flag. */
122
108
  chooser: boolean;
123
109
  /** `string`, `number`, `boolean` or `null` — what the literal type picker holds. */
124
110
  literalType: string;
125
111
  /** The literal types on offer. A separate list from {@link sourceOptions}: two questions. */
126
- typeOptions: ExprOption[];
112
+ typeOptions: SurfaceOption[];
127
113
  /** Which literal control follows the type picker: `text`, `number`, `bool` or `null`. */
128
114
  literal: string;
129
115
  /** What a text literal, a number literal or a ref picker holds. */
@@ -131,9 +117,9 @@ export interface ExprRowView extends Record<string, unknown> {
131
117
  /** What a boolean literal holds. */
132
118
  checked: boolean;
133
119
  /** The signals this slot may bind to. */
134
- refOptions: ExprOption[];
120
+ refOptions: SurfaceOption[];
135
121
  /** The event refs, as their own named run. Empty where the position admits none. */
136
- refGroups: ExprSelectGroup[];
122
+ refGroups: SurfaceOptionGroup[];
137
123
  /** Which leading cell the row carries. */
138
124
  lead: ExprLead;
139
125
  /** An arg's positional name, or the `default` case's word. */
@@ -181,7 +167,7 @@ export interface ExpressionActions {
181
167
  pickChip: (key: string) => void;
182
168
  }
183
169
 
184
- interface ExpressionScope extends Record<string, unknown>, ExpressionActions {
170
+ interface ExpressionScope extends ExpressionActions {
185
171
  rows: ExprRowView[];
186
172
  }
187
173
 
@@ -225,7 +211,7 @@ export function renderExpressionEditorSurface(
225
211
  }
226
212
  takeDown(host, existing);
227
213
  host.textContent = "";
228
- const scope = reactive({ ...actions, rows }) as ExpressionScope;
214
+ const scope: ExpressionScope = reactive<ExpressionScope>({ ...actions, rows });
229
215
  const record: Mounted = { disposed: false, handle: null, scope };
230
216
  mounts.set(host, record);
231
217
  /* No race to arbitrate: a repaint arriving while this is in flight takes the branch above — a
@@ -37,14 +37,15 @@
37
37
  * @docs studio/interface
38
38
  */
39
39
 
40
+ import { isNonNullObject, isString } from "@jxsuite/schema/guards";
40
41
  import { reactive } from "../reactivity";
41
42
  import { mountSurface, registerSurface } from "../ui/surface";
42
43
  import filesPanelDoc from "./files-panel.json";
43
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
44
+ import type { JxElement } from "@jxsuite/schema/types";
44
45
  import type { JxScope } from "@jxsuite/runtime/types";
45
46
  import type { SurfaceHandle } from "../ui/surface";
46
47
 
47
- registerSurface("files-panel", filesPanelDoc as unknown as JxDocument);
48
+ registerSurface("files-panel", filesPanelDoc);
48
49
 
49
50
  /**
50
51
  * One row the tree draws, with every field already a string.
@@ -170,7 +171,7 @@ export interface FilesPanelSurfaceHandle {
170
171
  }
171
172
 
172
173
  /** The scope the document reads: the projection, plus everything a control can ask for. */
173
- interface FilesPanelScope extends Record<string, unknown>, FilesPanelValues, FilesPanelActions {}
174
+ interface FilesPanelScope extends FilesPanelValues, FilesPanelActions {}
174
175
 
175
176
  /** Write a projection into the scope. Assignment by assignment, so an unchanged field is inert. */
176
177
  function project(scope: FilesPanelScope, values: FilesPanelValues): void {
@@ -214,15 +215,28 @@ export function emptyFilesPanelValues(): FilesPanelValues {
214
215
 
215
216
  /** The `part` a node's definition carries, or `""` for a text node or an unmarked element. */
216
217
  function partOf(def: JxElement | string): string {
217
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
218
- return typeof part === "string" ? part : "";
218
+ const part = isString(def) ? undefined : def.attributes?.["part"];
219
+ return isString(part) ? part : "";
219
220
  }
220
221
 
221
- /** The mapped row a node was rendered inside, or null when it was not in one. */
222
- function mappedRow(state: JxScope | undefined): FileRowView | null {
223
- const map = state?.["$map"] as { item?: unknown } | undefined;
224
- const item = map?.item as FileRowView | undefined;
225
- return typeof item?.path === "string" ? item : null;
222
+ /**
223
+ * The path and type of the mapped row a node was rendered inside, or null when it was not in one.
224
+ * The only mapped array in `files-panel.json` is `#/state/rows`, which `project()` fills from
225
+ * `FilesPanelValues.rows: FileRowView[]`, so a row's item carries both as strings.
226
+ */
227
+ function mappedRow(state: JxScope | undefined): Pick<FileRowView, "path" | "type"> | null {
228
+ const map = state?.["$map"];
229
+ const item = isNonNullObject(map) && "item" in map ? map.item : undefined;
230
+ if (
231
+ !isNonNullObject(item) ||
232
+ !("path" in item) ||
233
+ !isString(item.path) ||
234
+ !("type" in item) ||
235
+ !isString(item.type)
236
+ ) {
237
+ return null;
238
+ }
239
+ return { path: item.path, type: item.type };
226
240
  }
227
241
 
228
242
  /**
@@ -237,10 +251,10 @@ export function mountFilesPanelSurface(
237
251
  values: FilesPanelValues,
238
252
  actions: FilesPanelActions,
239
253
  ): FilesPanelSurfaceHandle {
240
- const scope = reactive<FilesPanelScope>({
254
+ const scope: FilesPanelScope = reactive<FilesPanelScope>({
241
255
  ...emptyFilesPanelValues(),
242
256
  ...actions,
243
- }) as FilesPanelScope;
257
+ });
244
258
  project(scope, values);
245
259
 
246
260
  let mounted: SurfaceHandle | null = null;
@@ -286,8 +300,7 @@ export function mountFilesPanelSurface(
286
300
  answer is simply whether this handle is still wanted — answering no would start a second
287
301
  mount racing the first. Once mounted, the question is whether the root is still where it was
288
302
  put: a Navigator that painted another panel cleared this document out from under it. */
289
- connected: () =>
290
- !disposed && (mounted === null || (mounted.root as Node).parentNode === container),
303
+ connected: () => !disposed && (mounted === null || mounted.root.parentNode === container),
291
304
  dispose() {
292
305
  disposed = true;
293
306
  mounted?.dispose();
@@ -39,9 +39,8 @@ import formulaPaletteDoc from "./formula-palette.json";
39
39
 
40
40
  import type { FormulaCatalogEntry } from "../ui/formula-catalog";
41
41
  import type { SurfaceHandle } from "../ui/surface";
42
- import type { JxDocument } from "@jxsuite/schema/types";
43
42
 
44
- registerSurface("formula-palette", formulaPaletteDoc as unknown as JxDocument);
43
+ registerSurface("formula-palette", formulaPaletteDoc);
45
44
 
46
45
  /** The popover slot id, and so the `overlay.popover:formula-palette` region the shots address. */
47
46
  const SLOT = "formula-palette";
@@ -81,7 +80,7 @@ interface GroupProjection {
81
80
  }
82
81
 
83
82
  /** The scope `formula-palette.json` reads, and the six things a gesture asks of this module. */
84
- interface FormulaPaletteScope extends Record<string, unknown> {
83
+ interface FormulaPaletteScope {
85
84
  open: boolean;
86
85
  query: string;
87
86
  groups: GroupProjection[];
@@ -106,7 +105,7 @@ interface FormulaPaletteScope extends Record<string, unknown> {
106
105
  move: (delta: number) => void;
107
106
  activate: () => void;
108
107
  hover: (index: number) => void;
109
- activateRow: (value: unknown) => void;
108
+ activateRow: (value: string) => void;
110
109
  }
111
110
 
112
111
  let _open = false;
@@ -228,7 +227,7 @@ function scope(): FormulaPaletteScope {
228
227
  },
229
228
  open: false,
230
229
  query: "",
231
- }) as FormulaPaletteScope;
230
+ });
232
231
  return _scope;
233
232
  }
234
233