@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
@@ -13,6 +13,7 @@
13
13
  * hop would report `var(--color-brand)` as a colour.
14
14
  */
15
15
 
16
+ import { isNumber, isString } from "@jxsuite/schema/guards";
16
17
  import type { JxStyle } from "@jxsuite/schema/types";
17
18
 
18
19
  /** A value that is EXACTLY one `var()` reference — not `calc(var(--a) * 2)`, which is a value. */
@@ -24,11 +25,11 @@ const MAX_HOPS = 10;
24
25
  /**
25
26
  * The token a value references, or null when the value is not a bare reference.
26
27
  *
27
- * @param {unknown} value
28
+ * @param {string | number} value
28
29
  * @returns {string | null}
29
30
  */
30
- export function tokenRefName(value: unknown): string | null {
31
- if (typeof value !== "string") {
31
+ export function tokenRefName(value: string | number): string | null {
32
+ if (!isString(value)) {
32
33
  return null;
33
34
  }
34
35
  return TOKEN_REF_RE.exec(value)?.[1] ?? null;
@@ -75,7 +76,7 @@ export function resolveTokenValue(
75
76
  }
76
77
  seen.add(ref);
77
78
  const next = style?.[ref];
78
- if (typeof next !== "string" && typeof next !== "number") {
79
+ if (!isString(next) && !isNumber(next)) {
79
80
  return undefined;
80
81
  }
81
82
  current = next;
@@ -17,19 +17,12 @@
17
17
  import { reactive } from "../reactivity";
18
18
  import { mountSurface, registerSurface } from "../ui/surface";
19
19
  import { overlayRegion, REGION_ATTR } from "../ui/regions";
20
- import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
20
+ import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
21
21
  import { whenReady } from "./dialog";
22
22
  import aboutDoc from "./about.json";
23
- import type { SurfaceHandle } from "../ui/surface";
24
- import type { JxDocument } from "@jxsuite/schema/types";
23
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
25
24
 
26
- registerSurface("about", aboutDoc as unknown as JxDocument);
27
-
28
- /** One row of the metadata list: a label and the value beside it. */
29
- export interface AboutRow {
30
- label: string;
31
- value: string;
32
- }
25
+ registerSurface("about", aboutDoc);
33
26
 
34
27
  /** One external link in the dialog's link row. */
35
28
  export interface AboutLink {
@@ -41,7 +34,7 @@ export interface AboutSurfaceOptions {
41
34
  /** Where the dialog is mounted — the dialog layer. */
42
35
  layer: HTMLElement;
43
36
  headline: string;
44
- rows: AboutRow[];
37
+ rows: SurfaceOption[];
45
38
  links: AboutLink[];
46
39
  /** The dialog closed, for any reason the platform owns as well as the Close button. */
47
40
  onClosed: () => void;
@@ -49,7 +42,7 @@ export interface AboutSurfaceOptions {
49
42
 
50
43
  /** What the flow may change once the dialog is up: the package list, when it arrives. */
51
44
  export interface AboutSurfacePatch {
52
- rows?: AboutRow[];
45
+ rows?: SurfaceOption[];
53
46
  packages?: { name: string; version: string }[];
54
47
  }
55
48
 
@@ -60,9 +53,9 @@ export interface AboutSurfaceHandle {
60
53
  close: () => void;
61
54
  }
62
55
 
63
- interface AboutScope extends Record<string, unknown> {
56
+ interface AboutScope {
64
57
  headline: string;
65
- rows: AboutRow[];
58
+ rows: SurfaceOption[];
66
59
  links: AboutLink[];
67
60
  packages: { name: string; version: string }[];
68
61
  /**
@@ -100,7 +93,11 @@ export function openAboutSurface(options: AboutSurfaceOptions): AboutSurfaceHand
100
93
  closed = true;
101
94
  options.onClosed();
102
95
  };
103
- const scope = reactive<AboutScope>({
96
+ /* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
97
+ element, and a direct `closed` test after that `await` would be narrowed to the value the test
98
+ before it saw. */
99
+ const isClosed = (): boolean => closed;
100
+ const scope: AboutScope = reactive<AboutScope>({
104
101
  close: () => handle.close(),
105
102
  closed: finish,
106
103
  headline: options.headline,
@@ -108,13 +105,15 @@ export function openAboutSurface(options: AboutSurfaceOptions): AboutSurfaceHand
108
105
  packages: [],
109
106
  packagesState: "loading",
110
107
  rows: options.rows,
111
- }) as AboutScope;
108
+ });
112
109
 
113
110
  let mounted: SurfaceHandle | null = null;
114
111
  const ready = mountSurface("about", scope, slot).then(async (surface) => {
115
112
  mounted = surface;
113
+ // SAFETY: `about.json`'s root definition carries `tagName: "jx-dialog"`, so the runtime mounts an
114
+ // HTMLElement; a `Text` root only comes from a document whose root is a bare string.
116
115
  const element = surface.root as HTMLElement;
117
- if (closed) {
116
+ if (isClosed()) {
118
117
  surface.dispose();
119
118
  return element;
120
119
  }
@@ -125,7 +124,7 @@ export function openAboutSurface(options: AboutSurfaceOptions): AboutSurfaceHand
125
124
  `openDialogSurface` rather than reimplemented, because both surfaces are `jx-dialog`s and
126
125
  there is one answer to when one of those is ready. */
127
126
  await whenReady(element);
128
- if (closed) {
127
+ if (isClosed()) {
129
128
  return element;
130
129
  }
131
130
  showModal(element);
@@ -140,7 +139,7 @@ export function openAboutSurface(options: AboutSurfaceOptions): AboutSurfaceHand
140
139
  const element = mounted?.root;
141
140
  if (element instanceof HTMLElement) {
142
141
  // The platform's close first, so focus goes back where it came from; then the document.
143
- closeDialog(element);
142
+ close(element);
144
143
  }
145
144
  mounted?.dispose();
146
145
  mounted = null;
@@ -31,14 +31,13 @@
31
31
  import { reactive } from "../reactivity";
32
32
  import { mountSurface, registerSurface } from "../ui/surface";
33
33
  import { overlayRegion, REGION_ATTR } from "../ui/regions";
34
- import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
34
+ import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
35
35
  import { focusField } from "@jxsuite/ui/behaviors/textfield";
36
36
  import { whenReady } from "./dialog";
37
37
  import addRepoDoc from "./add-repo.json";
38
- import type { SurfaceHandle } from "../ui/surface";
39
- import type { JxDocument } from "@jxsuite/schema/types";
38
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
40
39
 
41
- registerSurface("add-repo", addRepoDoc as unknown as JxDocument);
40
+ registerSurface("add-repo", addRepoDoc);
42
41
 
43
42
  /** One repository, as the list draws it. Every field is already a string or a flag. */
44
43
  export interface AddRepoRow {
@@ -68,12 +67,6 @@ export interface AddRepoAccessLink {
68
67
  title: string;
69
68
  }
70
69
 
71
- /** One entry of the account filter. `""` is every account. */
72
- export interface AddRepoOwner {
73
- value: string;
74
- label: string;
75
- }
76
-
77
70
  /**
78
71
  * Why the repository list is empty, when it is.
79
72
  *
@@ -105,7 +98,7 @@ export interface AddRepoView {
105
98
  /** The account the list is narrowed to; `""` is every account. */
106
99
  owner: string;
107
100
  /** The account filter's entries, "All accounts" first; empty hides it (one account, or none). */
108
- owners: AddRepoOwner[];
101
+ owners: SurfaceOption[];
109
102
  /** The listing is in flight. Its own state, because "not yet asked" is not "reaches nothing". */
110
103
  loading: boolean;
111
104
  /** The repositories to draw, already filtered and ordered. */
@@ -226,8 +219,7 @@ interface AddRepoFlags {
226
219
  confirmDisabled: boolean;
227
220
  }
228
221
 
229
- interface AddRepoScope
230
- extends Record<string, unknown>, Omit<AddRepoView, "rows" | "locations">, AddRepoFlags {
222
+ interface AddRepoScope extends Omit<AddRepoView, "rows" | "locations">, AddRepoFlags {
231
223
  setFilter: (value: string) => void;
232
224
  setOwner: (value: string) => void;
233
225
  select: (fullName: string) => void;
@@ -277,7 +269,7 @@ function derive(view: AddRepoView): Omit<AddRepoView, "rows" | "locations"> & Ad
277
269
  ? "loading"
278
270
  : rows.length > 0
279
271
  ? "listed"
280
- : (`empty-${view.emptyState}` as AddRepoFlags["listState"]),
272
+ : (`empty-${view.emptyState}` as const),
281
273
  locations,
282
274
  refreshDisabled: view.loading || view.busy,
283
275
  rows,
@@ -309,8 +301,12 @@ export function openAddRepoSurface(options: AddRepoSurfaceOptions): AddRepoSurfa
309
301
  closed = true;
310
302
  options.onClosed();
311
303
  };
304
+ /* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
305
+ element, and a direct `closed` test after that `await` would be narrowed to the value the test
306
+ before it saw. */
307
+ const isClosed = (): boolean => closed;
312
308
 
313
- const scope = reactive({
309
+ const scope: AddRepoScope = reactive<AddRepoScope>({
314
310
  ...derive(options.view),
315
311
  closed: finish,
316
312
  confirm: () => {
@@ -350,18 +346,20 @@ export function openAddRepoSurface(options: AddRepoSurfaceOptions): AddRepoSurfa
350
346
  scope.owner = value;
351
347
  options.onOwner(value);
352
348
  },
353
- }) as AddRepoScope;
349
+ });
354
350
 
355
351
  let mounted: SurfaceHandle | null = null;
356
352
  const ready = mountSurface("add-repo", scope, slot).then(async (surface) => {
357
353
  mounted = surface;
354
+ // SAFETY: `add-repo.json`'s root definition carries `tagName: "jx-dialog"`, so the runtime mounts an
355
+ // HTMLElement; a `Text` root only comes from a document whose root is a bare string.
358
356
  const element = surface.root as HTMLElement;
359
- if (closed) {
357
+ if (isClosed()) {
360
358
  surface.dispose();
361
359
  return element;
362
360
  }
363
361
  await whenReady(element);
364
- if (closed) {
362
+ if (isClosed()) {
365
363
  return element;
366
364
  }
367
365
  showModal(element);
@@ -384,7 +382,7 @@ export function openAddRepoSurface(options: AddRepoSurfaceOptions): AddRepoSurfa
384
382
  const element = mounted?.root;
385
383
  if (element instanceof HTMLElement) {
386
384
  // The platform's close first, so focus goes back where it came from; then the document.
387
- closeDialog(element);
385
+ close(element);
388
386
  }
389
387
  // A mount that has not landed yet is disposed by `ready` when it does — `finish` tells it so.
390
388
  mounted?.dispose();
@@ -27,15 +27,16 @@
27
27
  * @docs studio/ai/chat
28
28
  */
29
29
 
30
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
30
31
  import { reactive } from "../reactivity";
31
32
  import { trustedHtml } from "../services/trusted-types";
32
33
  import { mountSurface, registerSurface } from "../ui/surface";
33
34
  import aiChatDoc from "./ai-chat.json";
34
- import type { JxElement, JxDocument } from "@jxsuite/schema/types";
35
+ import type { JsonObject, JxElement } from "@jxsuite/schema/types";
35
36
  import type { JxScope } from "@jxsuite/runtime/types";
36
- import type { SurfaceHandle } from "../ui/surface";
37
+ import type { KeyedLabel, SurfaceHandle } from "../ui/surface";
37
38
 
38
- registerSurface("ai-chat", aiChatDoc as unknown as JxDocument);
39
+ registerSurface("ai-chat", aiChatDoc);
39
40
 
40
41
  /** How close (px) to the bottom of a scroller still counts as "following along". */
41
42
  const STICK_THRESHOLD = 48;
@@ -51,7 +52,7 @@ const LOG_STICK_THRESHOLD = 24;
51
52
  * rendering of the registry rather than a second place its capabilities are decided
52
53
  * (`studio-ui-guidelines.md` §12.5).
53
54
  */
54
- export interface ChatCommandView extends Record<string, unknown> {
55
+ export interface ChatCommandView {
55
56
  /** The reconcile key. The command id, because a button is drawn once per bar. */
56
57
  key: string;
57
58
  /** What `run` is given. */
@@ -68,14 +69,8 @@ export interface ChatCommandView extends Record<string, unknown> {
68
69
  disabled: boolean;
69
70
  }
70
71
 
71
- /** One answer an `ask_user` card offers as a shortcut. */
72
- export interface ChatAskOption extends Record<string, unknown> {
73
- key: string;
74
- label: string;
75
- }
76
-
77
72
  /** One line an import run has reported. */
78
- export interface ChatLogLine extends Record<string, unknown> {
73
+ export interface ChatLogLine {
79
74
  key: string;
80
75
  phase: string;
81
76
  message: string;
@@ -88,7 +83,7 @@ export interface ChatLogLine extends Record<string, unknown> {
88
83
  * `$switch` chooses on one: a chip that omitted `options` would leave the question case reading an
89
84
  * absent path.
90
85
  */
91
- export interface ChatChipView extends Record<string, unknown> {
86
+ export interface ChatChipView {
92
87
  /** The tool-call id — the reconcile key. */
93
88
  key: string;
94
89
  /** The tool's name, for a test and for the `data-tool` attribute. */
@@ -114,7 +109,8 @@ export interface ChatChipView extends Record<string, unknown> {
114
109
  hasContext: boolean;
115
110
  /** `pending`, `unanswered`, `answered`, `failed` or `none` — which half of the card to draw. */
116
111
  askState: string;
117
- options: ChatAskOption[];
112
+ /** The answers an `ask_user` card offers as shortcuts. */
113
+ options: KeyedLabel[];
118
114
  /** What the reader replied, once they have. */
119
115
  answer: string;
120
116
  /** `run` when this call has an import to report, `none` otherwise. */
@@ -133,7 +129,7 @@ export interface ChatChipView extends Record<string, unknown> {
133
129
  }
134
130
 
135
131
  /** One file a turn changed. */
136
- export interface ChatChangeView extends Record<string, unknown> {
132
+ export interface ChatChangeView {
137
133
  key: string;
138
134
  path: string;
139
135
  /** The tool that wrote it, or the sentence saying why it did not. */
@@ -143,14 +139,8 @@ export interface ChatChangeView extends Record<string, unknown> {
143
139
  disk: boolean;
144
140
  }
145
141
 
146
- /** One attached-context chip on a user turn. */
147
- export interface ChatContextChip extends Record<string, unknown> {
148
- key: string;
149
- label: string;
150
- }
151
-
152
142
  /** One line of the transcript. */
153
- export interface ChatRowView extends Record<string, unknown> {
143
+ export interface ChatRowView {
154
144
  /** The message id. The `$map` key, and what `restore` is given. */
155
145
  key: string;
156
146
  /** `user`, `assistant`, `streaming`, `typing` or `tool-error`. */
@@ -159,7 +149,8 @@ export interface ChatRowView extends Record<string, unknown> {
159
149
  body: string;
160
150
  /** Sanitized model output for an `assistant` row. Filled into the island, never bound. */
161
151
  markdown: string;
162
- contextChips: ChatContextChip[];
152
+ /** The attached-context chips on a user turn. */
153
+ contextChips: KeyedLabel[];
163
154
  hasContextChips: boolean;
164
155
  chips: ChatChipView[];
165
156
  hasChips: boolean;
@@ -172,7 +163,7 @@ export interface ChatRowView extends Record<string, unknown> {
172
163
  }
173
164
 
174
165
  /** One row of the chat history. */
175
- export interface ChatSessionView extends Record<string, unknown> {
166
+ export interface ChatSessionView {
176
167
  /** The session id — the key, and what a row opens or deletes. */
177
168
  key: string;
178
169
  title: string;
@@ -181,7 +172,7 @@ export interface ChatSessionView extends Record<string, unknown> {
181
172
  }
182
173
 
183
174
  /** One chip the composer is carrying. */
184
- export interface ChatComposerChip extends Record<string, unknown> {
175
+ export interface ChatComposerChip {
185
176
  /** The chip's kind — one chip per kind, so the kind IS the identity. */
186
177
  key: string;
187
178
  label: string;
@@ -277,7 +268,7 @@ export interface AiChatSurface {
277
268
  }
278
269
 
279
270
  /** The scope the document reads: the view, the flow's actions, and the scroller's own handler. */
280
- interface AiChatScope extends Record<string, unknown>, AiChatView, AiChatActions {
271
+ interface AiChatScope extends AiChatView, AiChatActions {
281
272
  scrolled: () => void;
282
273
  }
283
274
 
@@ -353,21 +344,21 @@ export function emptyAiChatView(): AiChatView {
353
344
 
354
345
  /** The `part` a node's definition carries, or "" for a text node or an unmarked element. */
355
346
  function partOf(def: JxElement | string): string {
356
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
357
- return typeof part === "string" ? part : "";
347
+ const part = isString(def) ? undefined : def.attributes?.["part"];
348
+ return isString(part) ? part : "";
358
349
  }
359
350
 
360
351
  /** The `$map` item a node was rendered inside, if it was rendered inside one. */
361
- function mapItem(state: JxScope | undefined): Record<string, unknown> | null {
362
- const map = state?.["$map"] as { item?: unknown } | undefined;
363
- const item = map?.item;
364
- return item !== null && typeof item === "object" ? (item as Record<string, unknown>) : null;
352
+ function mapItem(state: JxScope | undefined): JsonObject | null {
353
+ const map = state?.["$map"];
354
+ const item = isJsonObject(map) ? map["item"] : undefined;
355
+ return isJsonObject(item) ? item : null;
365
356
  }
366
357
 
367
358
  /** A string field off a `$map` item, or "". */
368
- function itemString(item: Record<string, unknown> | null, field: string): string {
359
+ function itemString(item: JsonObject | null, field: string): string {
369
360
  const value = item?.[field];
370
- return typeof value === "string" ? value : "";
361
+ return isString(value) ? value : "";
371
362
  }
372
363
 
373
364
  /** Keep a scroller pinned to its newest line, unless the reader has scrolled away from it. */
@@ -406,7 +397,7 @@ export function mountAiChatSurface(
406
397
  /** The import logs, by chip key. */
407
398
  const logs = new Map<string, HTMLElement>();
408
399
 
409
- const scope = reactive<AiChatScope>({
400
+ const scope: AiChatScope = reactive<AiChatScope>({
410
401
  ...emptyAiChatView(),
411
402
  ...actions,
412
403
  scrolled: () => {
@@ -416,7 +407,7 @@ export function mountAiChatSurface(
416
407
  STICK_THRESHOLD;
417
408
  }
418
409
  },
419
- }) as AiChatScope;
410
+ });
420
411
  project(scope, view);
421
412
 
422
413
  /**
@@ -451,7 +442,11 @@ export function mountAiChatSurface(
451
442
  * value assigned here is a `TrustedHTML`; without one the same assertion has still run.
452
443
  */
453
444
  function fillIsland(node: HTMLElement, html: string): void {
454
- (node as unknown as { innerHTML: unknown }).innerHTML = trustedHtml(html);
445
+ /* SAFETY: lib.dom declares `innerHTML` as `string`, but the setter's IDL type is
446
+ `(TrustedHTML or DOMString)`, and `trustedHtml` returns one of exactly those two: the policy's
447
+ `TrustedHTML`, or the asserted string where the API is absent. Widening the property to what
448
+ the sink accepts is an upcast of this HTMLElement, so the write reaches the same setter. */
449
+ (node as { innerHTML: unknown }).innerHTML = trustedHtml(html);
455
450
  }
456
451
 
457
452
  let mounted: SurfaceHandle | null = null;
@@ -29,18 +29,9 @@
29
29
  import { reactive } from "../reactivity";
30
30
  import { mountSurface, registerSurface } from "../ui/surface";
31
31
  import credentialsDoc from "./ai-credentials-form.json";
32
- import type { SurfaceHandle } from "../ui/surface";
33
- import type { JxDocument } from "@jxsuite/schema/types";
32
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
34
33
 
35
- registerSurface("ai-credentials-form", credentialsDoc as unknown as JxDocument);
36
-
37
- /** One row of the listed catalogue, as the combobox draws it. */
38
- export interface CredentialsModelRow {
39
- /** The model id — the row's key, and what a pick writes into the model draft. */
40
- value: string;
41
- /** What the row reads. */
42
- label: string;
43
- }
34
+ registerSurface("ai-credentials-form", credentialsDoc);
44
35
 
45
36
  /** What the form says right now. Every field is the flow's, never a state it derives. */
46
37
  export interface AiCredentialsView {
@@ -51,7 +42,7 @@ export interface AiCredentialsView {
51
42
  modelDraft: string;
52
43
  baseUrlDraft: string;
53
44
  /** The catalogue the last successful listing returned; empty draws no chevron on the field. */
54
- models: CredentialsModelRow[];
45
+ models: SurfaceOption[];
55
46
  /** A listing is in flight: the button says so and refuses a second one. */
56
47
  modelsLoading: boolean;
57
48
  /** What the fetch button reads — including while it is working, and once a list has landed. */
@@ -88,11 +79,10 @@ interface AiCredentialsFlags {
88
79
  /** Whether there is a refusal to draw beside the fetch button. */
89
80
  hasError: boolean;
90
81
  /** The catalogue as the kit's combobox draws it — the list, never a corpus it matches against. */
91
- modelOptions: CredentialsModelRow[];
82
+ modelOptions: SurfaceOption[];
92
83
  }
93
84
 
94
- interface AiCredentialsScope
95
- extends Record<string, unknown>, AiCredentialsView, AiCredentialsActions, AiCredentialsFlags {}
85
+ interface AiCredentialsScope extends AiCredentialsView, AiCredentialsActions, AiCredentialsFlags {}
96
86
 
97
87
  /** The view plus the flags the document renders from. */
98
88
  function derive(view: AiCredentialsView): AiCredentialsView & AiCredentialsFlags {
@@ -119,7 +109,7 @@ export function createAiCredentialsSurface(
119
109
  ): AiCredentialsSurface {
120
110
  const host = document.createElement("div");
121
111
  host.style.display = "contents";
122
- const scope = reactive({ ...derive(view), ...actions }) as AiCredentialsScope;
112
+ const scope: AiCredentialsScope = reactive<AiCredentialsScope>({ ...derive(view), ...actions });
123
113
 
124
114
  /** `null` while a mount is in flight — which is a standing surface, not a missing one. */
125
115
  let handle: SurfaceHandle | null = null;
@@ -27,9 +27,8 @@ import { reactive } from "../reactivity";
27
27
  import { mountSurface, registerSurface } from "../ui/surface";
28
28
  import connectDoc from "./ai-managed-connect.json";
29
29
  import type { SurfaceHandle } from "../ui/surface";
30
- import type { JxDocument } from "@jxsuite/schema/types";
31
30
 
32
- registerSurface("ai-managed-connect", connectDoc as unknown as JxDocument);
31
+ registerSurface("ai-managed-connect", connectDoc);
33
32
 
34
33
  /** What the offer says right now. Every field is the flow's wording, never a state it derives. */
35
34
  export interface ManagedConnectView {
@@ -63,7 +62,7 @@ interface ManagedConnectFlags {
63
62
  }
64
63
 
65
64
  interface ManagedConnectScope
66
- extends Record<string, unknown>, ManagedConnectView, ManagedConnectActions, ManagedConnectFlags {}
65
+ extends ManagedConnectView, ManagedConnectActions, ManagedConnectFlags {}
67
66
 
68
67
  /** The view plus the flag the document switches on. */
69
68
  function derive(view: ManagedConnectView): ManagedConnectView & ManagedConnectFlags {
@@ -87,7 +86,7 @@ export function createManagedConnectSurface(
87
86
  ): ManagedConnectSurface {
88
87
  const host = document.createElement("div");
89
88
  host.style.display = "contents";
90
- const scope = reactive({ ...derive(view), ...actions }) as ManagedConnectScope;
89
+ const scope: ManagedConnectScope = reactive<ManagedConnectScope>({ ...derive(view), ...actions });
91
90
 
92
91
  /** `null` while a mount is in flight — which is a standing surface, not a missing one. */
93
92
  let handle: SurfaceHandle | null = null;
@@ -25,9 +25,8 @@ import { reactive } from "../reactivity";
25
25
  import { mountSurface, registerSurface } from "../ui/surface";
26
26
  import pickerDoc from "./ai-model-picker.json";
27
27
  import type { SurfaceHandle } from "../ui/surface";
28
- import type { JxDocument } from "@jxsuite/schema/types";
29
28
 
30
- registerSurface("ai-model-picker", pickerDoc as unknown as JxDocument);
29
+ registerSurface("ai-model-picker", pickerDoc);
31
30
 
32
31
  /** One row the control offers. Already a label — the flow decides what a row is called. */
33
32
  export interface ModelPickerRow {
@@ -79,8 +78,7 @@ interface ModelPickerFlags {
79
78
  hasFailure: boolean;
80
79
  }
81
80
 
82
- interface ModelPickerScope
83
- extends Record<string, unknown>, ModelPickerView, ModelPickerActions, ModelPickerFlags {}
81
+ interface ModelPickerScope extends ModelPickerView, ModelPickerActions, ModelPickerFlags {}
84
82
 
85
83
  /** The view plus the flag the document switches on. */
86
84
  function derive(view: ModelPickerView): ModelPickerView & ModelPickerFlags {
@@ -103,7 +101,7 @@ export function createModelPickerSurface(
103
101
  ): ModelPickerSurface {
104
102
  const host = document.createElement("div");
105
103
  host.style.display = "contents";
106
- const scope = reactive({ ...derive(view), ...actions }) as ModelPickerScope;
104
+ const scope: ModelPickerScope = reactive<ModelPickerScope>({ ...derive(view), ...actions });
107
105
 
108
106
  /** `null` while a mount is in flight — which is a standing surface, not a missing one. */
109
107
  let handle: SurfaceHandle | null = null;
@@ -29,15 +29,16 @@
29
29
  * @docs studio/editing/writing
30
30
  */
31
31
 
32
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
32
33
  import { reactive } from "../reactivity";
33
34
  import { mountSurface, registerSurface } from "../ui/surface";
34
35
  import blockActionBarDoc from "./block-action-bar.json";
35
36
 
36
37
  import type { JxScope } from "@jxsuite/runtime/types";
37
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
38
+ import type { JxElement } from "@jxsuite/schema/types";
38
39
  import { rectOf } from "../utils/geometry";
39
40
 
40
- registerSurface("block-action-bar", blockActionBarDoc as unknown as JxDocument);
41
+ registerSurface("block-action-bar", blockActionBarDoc);
41
42
 
42
43
  /** One button, already decided: what it is called, what it draws, and why it cannot act. */
43
44
  export interface BlockBarTool {
@@ -116,7 +117,7 @@ export interface BlockBarActions {
116
117
  }
117
118
 
118
119
  /** The scope `block-action-bar.json` reads. */
119
- interface BlockBarScope extends BlockBarView, Record<string, unknown> {
120
+ interface BlockBarScope extends BlockBarView {
120
121
  linkValue: string;
121
122
  linkExisting: boolean;
122
123
  linkApplyLabel: string;
@@ -167,8 +168,8 @@ export function emptyBlockBarView(): BlockBarView {
167
168
 
168
169
  /** A node definition's `part`, as written in the document. */
169
170
  function partOf(def: JxElement | string): string {
170
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
171
- return typeof part === "string" ? part : "";
171
+ const part = isString(def) ? undefined : def.attributes?.["part"];
172
+ return isString(part) ? part : "";
172
173
  }
173
174
 
174
175
  /**
@@ -180,9 +181,10 @@ function partOf(def: JxElement | string): string {
180
181
  * same shape `surfaces/schema-form.ts` and `surfaces/properties-panel.ts` use.
181
182
  */
182
183
  function commandIdOf(state: JxScope | undefined): string {
183
- const item = (state?.["$map"] as { item?: Record<string, unknown> } | undefined)?.item;
184
- const id = item?.["id"];
185
- return typeof id === "string" ? id : "";
184
+ const map = state?.["$map"];
185
+ const item = isJsonObject(map) ? map["item"] : undefined;
186
+ const id = isJsonObject(item) ? item["id"] : undefined;
187
+ return isString(id) ? id : "";
186
188
  }
187
189
 
188
190
  /** The bar's mounted surface, and every handle the flow is allowed to reach back through. */
@@ -250,22 +252,29 @@ export function mountBlockActionBar(host: HTMLElement, actions: BlockBarActions)
250
252
  linkApplyLabel: "Apply",
251
253
  linkExisting: false,
252
254
  linkInput: (_scope: JxScope, event: Event) => {
253
- const value = (event.target as { value?: unknown } | null)?.value;
254
- scope.linkValue = typeof value === "string" ? value : "";
255
+ const { target } = event;
256
+ const value = target !== null && "value" in target ? target.value : undefined;
257
+ scope.linkValue = isString(value) ? value : "";
255
258
  },
256
259
  linkValue: "",
257
260
  linkX: 0,
258
261
  linkY: 0,
259
262
  openMergeTags: (_scope: JxScope, event: Event) => {
260
263
  event.stopPropagation();
264
+ // SAFETY: Only the merge-tags `jx-action-button`'s `onclick` binds this handler, and during
265
+ // Dispatch `currentTarget` is the element the listener sits on.
261
266
  actions.openMergeTags(event.currentTarget as HTMLElement);
262
267
  },
263
268
  openOverflow: (_scope: JxScope, event: Event) => {
264
269
  event.stopPropagation();
270
+ // SAFETY: Only the overflow `jx-action-button`'s `onclick` binds this handler, and during
271
+ // Dispatch `currentTarget` is the element the listener sits on.
265
272
  actions.openOverflow(event.currentTarget as HTMLElement);
266
273
  },
267
274
  openTagMenu: (_scope: JxScope, event: Event) => {
268
275
  event.stopPropagation();
276
+ // SAFETY: Only the tag `jx-action-button`'s `onclick` binds this handler, and during
277
+ // Dispatch `currentTarget` is the element the listener sits on.
269
278
  actions.openTagMenu(event.currentTarget as HTMLElement);
270
279
  },
271
280
  removeLink: () => {
@@ -274,7 +283,7 @@ export function mountBlockActionBar(host: HTMLElement, actions: BlockBarActions)
274
283
  },
275
284
  run: (id: string) => actions.run(id),
276
285
  selectParent: () => actions.selectParent(),
277
- }) as BlockBarScope;
286
+ });
278
287
 
279
288
  /* One mount for the life of the window, and no teardown to write. The bar is chrome the app
280
289
  never takes down: `dismissBlockActionBar` hides it through `visible`, and its layer slot is
@@ -295,6 +304,8 @@ export function mountBlockActionBar(host: HTMLElement, actions: BlockBarActions)
295
304
  return;
296
305
  }
297
306
  if (part === "link") {
307
+ // SAFETY: `part: "link"` is the document's `jx-popover`, whose class carries `open` and the
308
+ // `showPopover({ source })` overload that PopoverElement names.
298
309
  linkEl = element as PopoverElement;
299
310
  return;
300
311
  }
@@ -28,9 +28,8 @@ import { APP_NAME, GIT_COMMIT, VERSION } from "../version";
28
28
  import bootFailureDoc from "./boot-failure.json";
29
29
  import type { BootRefusal } from "../platforms/default-platform";
30
30
  import type { SurfaceHandle } from "../ui/surface";
31
- import type { JxDocument } from "@jxsuite/schema/types";
32
31
 
33
- registerSurface("boot-failure", bootFailureDoc as unknown as JxDocument);
32
+ registerSurface("boot-failure", bootFailureDoc);
34
33
 
35
34
  /** The page the failure happened on — `location`, or a stand-in with the one field read. */
36
35
  export interface BootFailurePage {
@@ -49,7 +48,7 @@ export interface BootFailureView {
49
48
  }
50
49
 
51
50
  /** The scope `boot-failure.json` reads. */
52
- interface BootFailureScope extends Record<string, unknown>, BootFailureView {
51
+ interface BootFailureScope extends BootFailureView {
53
52
  /** The last Copy landed on the clipboard; the button says so. */
54
53
  copied: boolean;
55
54
  reload: () => void;
@@ -135,7 +134,7 @@ export function mountBootFailureSurface(
135
134
  page: BootFailurePage = location,
136
135
  ): Promise<SurfaceHandle> {
137
136
  const view = bootFailureView(refusal, page);
138
- const scope = reactive<BootFailureScope>({
137
+ const scope: BootFailureScope = reactive<BootFailureScope>({
139
138
  ...view,
140
139
  copied: false,
141
140
  async copy() {
@@ -151,6 +150,6 @@ export function mountBootFailureSurface(
151
150
  reload() {
152
151
  location.reload();
153
152
  },
154
- }) as BootFailureScope;
153
+ });
155
154
  return mountSurface("boot-failure", scope, host);
156
155
  }