@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
@@ -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
 
@@ -26,10 +26,9 @@
26
26
  import { reactive } from "../reactivity";
27
27
  import { mountSurface, registerSurface } from "../ui/surface";
28
28
  import gitPanelDoc from "./git-panel.json";
29
- import type { JxDocument } from "@jxsuite/schema/types";
30
- import type { SurfaceHandle } from "../ui/surface";
29
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
31
30
 
32
- registerSurface("git-panel", gitPanelDoc as unknown as JxDocument);
31
+ registerSurface("git-panel", gitPanelDoc);
33
32
 
34
33
  /** One changed file, as the document draws it. Every field is a value: no records, no closures. */
35
34
  export interface GitFileRowView {
@@ -72,12 +71,6 @@ export interface GitCommitView {
72
71
  meta: string;
73
72
  }
74
73
 
75
- /** One row of the branch picker. `__new__` is a row like any other; the flow knows what it means. */
76
- export interface GitBranchOption {
77
- value: string;
78
- label: string;
79
- }
80
-
81
74
  /** What the panel says the surface should be showing right now. */
82
75
  export interface GitPanelValues {
83
76
  /**
@@ -104,7 +97,7 @@ export interface GitPanelValues {
104
97
  branchName: string;
105
98
  /** What the picker currently holds. Not always {@link branchName} — see the adapter's note. */
106
99
  branchValue: string;
107
- branchOptions: GitBranchOption[];
100
+ branchOptions: SurfaceOption[];
108
101
  /** `changes` or `history` — `shell.git.subTab`, which names the `$switch` case. */
109
102
  subTab: string;
110
103
  /** "Local Changes (6)" — the count is part of the tab's label, not a badge of its own. */
@@ -159,7 +152,7 @@ export interface GitPanelSurfaceHandle {
159
152
  }
160
153
 
161
154
  /** The scope the document reads: the projection, plus everything a control can ask for. */
162
- interface GitPanelScope extends Record<string, unknown>, GitPanelValues, GitPanelActions {}
155
+ interface GitPanelScope extends GitPanelValues, GitPanelActions {}
163
156
 
164
157
  /** Write a projection into the scope. Assignment by assignment, so an unchanged field is inert. */
165
158
  function project(scope: GitPanelScope, values: GitPanelValues): void {
@@ -237,10 +230,10 @@ export function mountGitPanelSurface(
237
230
  values: GitPanelValues,
238
231
  actions: GitPanelActions,
239
232
  ): GitPanelSurfaceHandle {
240
- const scope = reactive<GitPanelScope>({
233
+ const scope: GitPanelScope = reactive<GitPanelScope>({
241
234
  ...emptyValues(),
242
235
  ...actions,
243
- }) as GitPanelScope;
236
+ });
244
237
  project(scope, values);
245
238
 
246
239
  let mounted: SurfaceHandle | null = null;
@@ -258,8 +251,7 @@ export function mountGitPanelSurface(
258
251
  answer is simply whether this handle is still wanted — answering no would start a second
259
252
  mount racing the first. Once mounted, the question is whether the root is still where it was
260
253
  put: a Navigator that painted another panel cleared this document out from under it. */
261
- connected: () =>
262
- !disposed && (mounted === null || (mounted.root as Node).parentNode === container),
254
+ connected: () => !disposed && (mounted === null || mounted.root.parentNode === container),
263
255
  dispose() {
264
256
  disposed = true;
265
257
  mounted?.dispose();
@@ -27,13 +27,12 @@
27
27
  import { reactive } from "../reactivity";
28
28
  import { mountSurface, registerSurface } from "../ui/surface";
29
29
  import { overlayRegion, REGION_ATTR } from "../ui/regions";
30
- import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
30
+ import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
31
31
  import { whenReady } from "./dialog";
32
32
  import githubAuthDoc from "./github-auth.json";
33
- import type { SurfaceHandle } from "../ui/surface";
34
- import type { JxDocument } from "@jxsuite/schema/types";
33
+ import type { DialogLayerHandle, SurfaceHandle } from "../ui/surface";
35
34
 
36
- registerSurface("github-auth", githubAuthDoc as unknown as JxDocument);
35
+ registerSurface("github-auth", githubAuthDoc);
37
36
 
38
37
  export interface GithubAuthSurfaceOptions {
39
38
  /** Where the dialog is mounted — the dialog layer, handed in so this never reaches back. */
@@ -48,16 +47,7 @@ export interface GithubAuthSurfaceOptions {
48
47
  onClosed: () => void;
49
48
  }
50
49
 
51
- export interface GithubAuthSurfaceHandle {
52
- /** The slot in the dialog layer that carries the region. */
53
- host: HTMLElement;
54
- /** Resolves with the `jx-dialog` element once it has rendered and been opened. */
55
- ready: Promise<HTMLElement>;
56
- /** Close the dialog (the platform restores focus) and dispose the document. Idempotent. */
57
- close: () => void;
58
- }
59
-
60
- interface GithubAuthScope extends Record<string, unknown> {
50
+ interface GithubAuthScope {
61
51
  userCode: string;
62
52
  verificationUri: string;
63
53
  cancel: () => void;
@@ -65,7 +55,7 @@ interface GithubAuthScope extends Record<string, unknown> {
65
55
  }
66
56
 
67
57
  /** Put the code up. The handle's `ready` resolves once the dialog is showing. */
68
- export function openGithubAuthSurface(options: GithubAuthSurfaceOptions): GithubAuthSurfaceHandle {
58
+ export function openGithubAuthSurface(options: GithubAuthSurfaceOptions): DialogLayerHandle {
69
59
  const slot = document.createElement("div");
70
60
  /* The layer is `pointer-events: none` so a click passes through it when nothing is up, and every
71
61
  slot in it turns them back on for its own content. `pointer-events` INHERITS, and the top layer
@@ -90,26 +80,32 @@ export function openGithubAuthSurface(options: GithubAuthSurfaceOptions): Github
90
80
  closed = true;
91
81
  options.onClosed();
92
82
  };
83
+ /* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
84
+ element, and a direct `closed` test after that `await` would be narrowed to the value the test
85
+ before it saw. */
86
+ const isClosed = (): boolean => closed;
93
87
 
94
- const scope = reactive<GithubAuthScope>({
88
+ const scope: GithubAuthScope = reactive<GithubAuthScope>({
95
89
  cancel: () => {
96
90
  options.onCancel();
97
91
  },
98
92
  closed: finish,
99
93
  userCode: options.userCode,
100
94
  verificationUri: options.verificationUri,
101
- }) as GithubAuthScope;
95
+ });
102
96
 
103
97
  let mounted: SurfaceHandle | null = null;
104
98
  const ready = mountSurface("github-auth", scope, slot).then(async (surface) => {
105
99
  mounted = surface;
100
+ /* SAFETY: `github-auth.json`'s root definition is a `jx-dialog` element, so the runtime
101
+ mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
106
102
  const element = surface.root as HTMLElement;
107
- if (closed) {
103
+ if (isClosed()) {
108
104
  surface.dispose();
109
105
  return element;
110
106
  }
111
107
  await whenReady(element);
112
- if (closed) {
108
+ if (isClosed()) {
113
109
  return element;
114
110
  }
115
111
  showModal(element);
@@ -125,7 +121,7 @@ export function openGithubAuthSurface(options: GithubAuthSurfaceOptions): Github
125
121
  const element = mounted?.root;
126
122
  if (element instanceof HTMLElement) {
127
123
  // The platform's close first, so focus goes back where it came from; then the document.
128
- closeDialog(element);
124
+ close(element);
129
125
  }
130
126
  // A mount that has not landed yet is disposed by `ready` when it does — `finish` tells it so.
131
127
  mounted?.dispose();