@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,17 +27,18 @@
27
27
  * @docs studio/interface/preferences
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 { overlayRegion, REGION_ATTR } from "../ui/regions";
33
- import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
34
+ import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
34
35
  import { whenReady } from "./dialog";
35
36
  import preferencesDoc from "./preferences.json";
36
- import type { JxElement, JxDocument } from "@jxsuite/schema/types";
37
+ import type { JxElement } from "@jxsuite/schema/types";
37
38
  import type { JxScope } from "@jxsuite/runtime/types";
38
39
  import type { SurfaceHandle } from "../ui/surface";
39
40
 
40
- registerSurface("preferences", preferencesDoc as unknown as JxDocument);
41
+ registerSurface("preferences", preferencesDoc);
41
42
 
42
43
  /** One row of the section list. `current` is the string `aria-current` takes. */
43
44
  export interface PreferencesSectionRow {
@@ -173,7 +174,7 @@ interface PreferencesFlags {
173
174
  hasConflict: boolean;
174
175
  }
175
176
 
176
- interface PreferencesScope extends Record<string, unknown>, PreferencesView, PreferencesFlags {
177
+ interface PreferencesScope extends PreferencesView, PreferencesFlags {
177
178
  selectSection: (id: string) => void;
178
179
  setTheme: (value: string) => void;
179
180
  runAccountAction: (key: string) => void;
@@ -199,8 +200,8 @@ function derive(view: PreferencesView): PreferencesView & PreferencesFlags {
199
200
 
200
201
  /** The `part` a node's definition carries, or `""` for a text node or an unmarked element. */
201
202
  function partOf(def: JxElement | string): string {
202
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
203
- return typeof part === "string" ? part : "";
203
+ const part = isString(def) ? undefined : def.attributes?.["part"];
204
+ return isString(part) ? part : "";
204
205
  }
205
206
 
206
207
  /**
@@ -234,10 +235,16 @@ export function openPreferencesSurface(
234
235
  closed = true;
235
236
  options.onClosed();
236
237
  };
238
+ /* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
239
+ element, and a direct `closed` test after that `await` would be narrowed to the value the test
240
+ before it saw. */
241
+ const isClosed = (): boolean => closed;
237
242
 
238
- const scope = reactive({
243
+ const scope: PreferencesScope = reactive<PreferencesScope>({
239
244
  ...derive(options.view),
240
245
  capture: (_scope: JxScope, event: Event) => {
246
+ /* SAFETY: `preferences.json` names `capture` in exactly one place, the keys sheet's
247
+ `onkeydown`, so the event the runtime hands it is always the platform's `KeyboardEvent`. */
241
248
  options.onCaptureKey(event as KeyboardEvent);
242
249
  },
243
250
  closed: finish,
@@ -270,7 +277,7 @@ export function openPreferencesSurface(
270
277
  toggleRebind: (commandId: string) => {
271
278
  options.onToggleRebind(commandId);
272
279
  },
273
- }) as PreferencesScope;
280
+ });
274
281
 
275
282
  let mounted: SurfaceHandle | null = null;
276
283
  const ready = mountSurface("preferences", scope, slot, {
@@ -287,13 +294,16 @@ export function openPreferencesSurface(
287
294
  },
288
295
  }).then(async (surface) => {
289
296
  mounted = surface;
297
+ /* SAFETY: `preferences.json`'s root definition carries `tagName: "jx-dialog"`, so the runtime
298
+ mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare
299
+ string. */
290
300
  const element = surface.root as HTMLElement;
291
- if (closed) {
301
+ if (isClosed()) {
292
302
  surface.dispose();
293
303
  return element;
294
304
  }
295
305
  await whenReady(element);
296
- if (closed) {
306
+ if (isClosed()) {
297
307
  return element;
298
308
  }
299
309
  /* The region goes on the platform's own `<dialog>`, which is the one element here that HAS a
@@ -323,7 +333,7 @@ export function openPreferencesSurface(
323
333
  const element = mounted?.root;
324
334
  if (element instanceof HTMLElement) {
325
335
  // The platform's close first, so focus goes back where it came from; then the document.
326
- closeDialog(element);
336
+ close(element);
327
337
  }
328
338
  // A mount that has not landed yet is disposed by `ready` when it does — `finish` tells it so.
329
339
  mounted?.dispose();
@@ -21,13 +21,12 @@
21
21
  import { reactive } from "../reactivity";
22
22
  import { mountSurface, registerSurface } from "../ui/surface";
23
23
  import { overlayRegion, REGION_ATTR } from "../ui/regions";
24
- import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
24
+ import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
25
25
  import { whenReady } from "./dialog";
26
26
  import progressDoc from "./progress-modal.json";
27
27
  import type { SurfaceHandle } from "../ui/surface";
28
- import type { JxDocument } from "@jxsuite/schema/types";
29
28
 
30
- registerSurface("progress-modal", progressDoc as unknown as JxDocument);
29
+ registerSurface("progress-modal", progressDoc);
31
30
 
32
31
  /** What the flow hands the surface. Everything is a projection; the flow keeps the operation. */
33
32
  export interface ProgressSurfaceOptions {
@@ -64,7 +63,7 @@ export interface ProgressSurfaceHandle {
64
63
  close: () => void;
65
64
  }
66
65
 
67
- interface ProgressScope extends Record<string, unknown> {
66
+ interface ProgressScope {
68
67
  title: string;
69
68
  status: string;
70
69
  /**
@@ -91,7 +90,11 @@ export function openProgressSurface(options: ProgressSurfaceOptions): ProgressSu
91
90
  options.layer.append(slot);
92
91
 
93
92
  let closed = false;
94
- const scope = reactive<ProgressScope>({
93
+ /* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
94
+ element, and a direct `closed` test after that `await` would be narrowed to the value the test
95
+ before it saw. */
96
+ const isClosed = (): boolean => closed;
97
+ const scope: ProgressScope = reactive<ProgressScope>({
95
98
  background: () => {
96
99
  options.onBackground();
97
100
  },
@@ -104,12 +107,15 @@ export function openProgressSurface(options: ProgressSurfaceOptions): ProgressSu
104
107
  },
105
108
  status: options.status,
106
109
  title: options.title,
107
- }) as ProgressScope;
110
+ });
108
111
 
109
112
  let mounted: SurfaceHandle | null = null;
110
113
  const ready = mountSurface("progress-modal", scope, slot).then(async (surface) => {
114
+ /* SAFETY: `progress-modal.json`'s root definition carries `tagName: "jx-dialog"`, so the
115
+ runtime mounts an HTMLElement; a `Text` root only comes from a document whose root is a
116
+ bare string. */
111
117
  const element = surface.root as HTMLElement;
112
- if (closed) {
118
+ if (isClosed()) {
113
119
  surface.dispose();
114
120
  return element;
115
121
  }
@@ -118,7 +124,7 @@ export function openProgressSurface(options: ProgressSurfaceOptions): ProgressSu
118
124
  DOCUMENT rendered, while the element's OWN template is one `connectedCallback` later.
119
125
  `showModal` in between finds no `<dialog>` to open, and the surface never shows. */
120
126
  await whenReady(element);
121
- if (closed) {
127
+ if (isClosed()) {
122
128
  return element;
123
129
  }
124
130
  showModal(element);
@@ -134,7 +140,7 @@ export function openProgressSurface(options: ProgressSurfaceOptions): ProgressSu
134
140
  const element = mounted?.root;
135
141
  if (element instanceof HTMLElement) {
136
142
  // The platform's close first, so focus goes back where it came from; then the document.
137
- closeDialog(element);
143
+ close(element);
138
144
  }
139
145
  // A mount that has not landed yet is disposed by `ready` when it does.
140
146
  mounted?.dispose();
@@ -629,7 +629,7 @@
629
629
  "display": "contents"
630
630
  },
631
631
  "$switch": {
632
- "$ref": "$map/item/shape"
632
+ "$ref": "$map/item/variant"
633
633
  },
634
634
  "cases": {
635
635
  "field": {
@@ -31,14 +31,16 @@
31
31
  * @docs studio/design/properties
32
32
  */
33
33
 
34
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
34
35
  import { reactive } from "../reactivity";
35
36
  import { mountSurface, registerSurface } from "../ui/surface";
36
37
  import propertiesPanelDoc from "./properties-panel.json";
37
- import type { SurfaceHandle } from "../ui/surface";
38
+ import type { SurfaceAction, SurfaceHandle, SurfaceOption } from "../ui/surface";
39
+ import type { ColorTokenView } from "../ui/color-selector";
38
40
  import type { JxScope } from "@jxsuite/runtime/types";
39
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
41
+ import type { JxElement } from "@jxsuite/schema/types";
40
42
 
41
- registerSurface("properties-panel", propertiesPanelDoc as unknown as JxDocument);
43
+ registerSurface("properties-panel", propertiesPanelDoc);
42
44
 
43
45
  /** Which control a `field` row draws. The flow picks it; the document switches on it. */
44
46
  export type ContentFieldKind =
@@ -52,25 +54,7 @@ export type ContentFieldKind =
52
54
  | "control";
53
55
 
54
56
  /** What a row is drawn as. Everything a section body can hold is one of these. */
55
- export type ContentRowShape = "field" | "kv" | "note" | "action" | "file";
56
-
57
- /**
58
- * One colour the project has named, as a `color` row's palette draws it.
59
- *
60
- * The same three fields the Style tab projects, and for the same reason: `value` is the reference a
61
- * click commits, `color` is only how it reads on screen, and `label` is what a reader hears.
62
- */
63
- export interface ContentTokenView extends Record<string, unknown> {
64
- value: string;
65
- color: string;
66
- label: string;
67
- }
68
-
69
- /** A choice a select offers, in the shape the kit's select reads. */
70
- export interface ContentOption {
71
- value: string;
72
- label: string;
73
- }
57
+ export type ContentRowVariant = "field" | "kv" | "note" | "action" | "file";
74
58
 
75
59
  /**
76
60
  * One row of a section — every field already decided, whatever shape it is.
@@ -81,7 +65,7 @@ export interface ContentOption {
81
65
  export interface ContentRowView {
82
66
  /** The row's reconcile identity AND what every callback hands back. */
83
67
  key: string;
84
- shape: ContentRowShape;
68
+ variant: ContentRowVariant;
85
69
  /** `data-prop` — what `inspector/field:<prop>` addresses. Every shape carries one. */
86
70
  prop: string;
87
71
  /** The visible label of a `field`; the accessible name of a `kv` pair's controls. */
@@ -99,9 +83,9 @@ export interface ContentRowView {
99
83
  /** Draw the text control monospaced — a template, a pointer, a code-ish value. */
100
84
  mono: boolean;
101
85
  /** Choices for `select`; the routes or the popover ids for a `link`'s value half. */
102
- options: ContentOption[];
86
+ options: SurfaceOption[];
103
87
  /** The palette a `color` row offers inside its picker, and whether it has one to offer. */
104
- tokens: ContentTokenView[];
88
+ tokens: ColorTokenView[];
105
89
  hasTokens: boolean;
106
90
  /**
107
91
  * The provenance chip's shape: `""` draws nothing (§6.7's `default` state, where absence IS the
@@ -125,7 +109,7 @@ export interface ContentRowView {
125
109
  source: string;
126
110
  /** A `link` row's kind half: the chosen kind, and the five it chooses between. */
127
111
  linkKind: string;
128
- kindOptions: ContentOption[];
112
+ kindOptions: SurfaceOption[];
129
113
  /** `route` draws a picker of the site's own routes; `text` draws a field. */
130
114
  linkValueKind: string;
131
115
  /** A `kv` pair's key cell, and the remove button's accessible name. */
@@ -151,12 +135,6 @@ export interface ContentSectionView {
151
135
  rows: ContentRowView[];
152
136
  }
153
137
 
154
- /** A button an empty state offers — the action that fills the region. */
155
- export interface ContentEmptyAction {
156
- id: string;
157
- label: string;
158
- }
159
-
160
138
  /** Everything the document reads. */
161
139
  export interface ContentPanelView {
162
140
  /**
@@ -168,7 +146,7 @@ export interface ContentPanelView {
168
146
  emptyMessage: string;
169
147
  emptyDetail: string;
170
148
  hasEmptyDetail: boolean;
171
- emptyActions: ContentEmptyAction[];
149
+ emptyActions: SurfaceAction[];
172
150
  hasEmptyActions: boolean;
173
151
  /** The layout card: the tag clicked, its class, the file it came from. */
174
152
  layoutTag: string;
@@ -218,8 +196,7 @@ export interface ContentPanelSurface {
218
196
  /** A control host the document drew, reported as the runtime created it. */
219
197
  export type ContentControlSink = (key: string, host: HTMLElement) => void;
220
198
 
221
- interface ContentPanelScope
222
- extends Record<string, unknown>, ContentPanelView, ContentPanelActions {}
199
+ interface ContentPanelScope extends ContentPanelView, ContentPanelActions {}
223
200
 
224
201
  /** The scope's starting shape, before the first projection lands on it. */
225
202
  export function emptyContentView(): ContentPanelView {
@@ -267,15 +244,16 @@ function controlKeyOf(part: string, state: JxScope | undefined): string {
267
244
  if (part !== "control-host") {
268
245
  return "";
269
246
  }
270
- const item = (state?.["$map"] as { item?: Record<string, unknown> } | undefined)?.item;
271
- const key = item?.["key"];
272
- return typeof key === "string" ? key : "";
247
+ const map = state?.["$map"];
248
+ const item = isJsonObject(map) ? map["item"] : undefined;
249
+ const key = isJsonObject(item) ? item["key"] : undefined;
250
+ return isString(key) ? key : "";
273
251
  }
274
252
 
275
253
  /** A node definition's `part`, as written in the document. */
276
254
  function partOf(def: JxElement | string): string {
277
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
278
- return typeof part === "string" ? part : "";
255
+ const part = isString(def) ? undefined : def.attributes?.["part"];
256
+ return isString(part) ? part : "";
279
257
  }
280
258
 
281
259
  /**
@@ -296,10 +274,10 @@ export function mountContentSurface(
296
274
  actions: ContentPanelActions,
297
275
  onControlHost: ContentControlSink,
298
276
  ): ContentPanelSurface {
299
- const scope = reactive<ContentPanelScope>({
277
+ const scope: ContentPanelScope = reactive<ContentPanelScope>({
300
278
  ...emptyContentView(),
301
279
  ...actions,
302
- }) as ContentPanelScope;
280
+ });
303
281
  project(scope, values);
304
282
 
305
283
  let mounted: SurfaceHandle | null = null;
@@ -31,23 +31,16 @@
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 { whenReady } from "./dialog";
36
36
  import publishDoc from "./publish.json";
37
- import type { SurfaceHandle } from "../ui/surface";
38
- import type { JxDocument } from "@jxsuite/schema/types";
37
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
39
38
 
40
- registerSurface("publish", publishDoc as unknown as JxDocument);
39
+ registerSurface("publish", publishDoc);
41
40
 
42
41
  /** Where the Cloudflare Pages GitHub App is installed from. */
43
42
  const PAGES_APP_INSTALL_URL = "https://github.com/apps/cloudflare-pages/installations/new";
44
43
 
45
- /** One Cloudflare account, as the picker draws it. */
46
- export interface PublishAccountRow {
47
- value: string;
48
- label: string;
49
- }
50
-
51
44
  /** The create-and-connect form, as the reader has filled it in so far. */
52
45
  export interface PublishForm {
53
46
  accountId: string;
@@ -95,7 +88,7 @@ export interface PublishView {
95
88
  busy: boolean;
96
89
  /** The last refusal, verbatim from whatever raised it. Empty draws nothing. */
97
90
  error: string;
98
- accounts: PublishAccountRow[];
91
+ accounts: SurfaceOption[];
99
92
  form: PublishForm;
100
93
  /** The connected Pages project, or null when this site has none yet. */
101
94
  deploy: PublishDeploy | null;
@@ -164,7 +157,7 @@ interface PublishFlags {
164
157
  */
165
158
  needsPagesApp: boolean;
166
159
  pagesAppUrl: string;
167
- accountOptions: PublishAccountRow[];
160
+ accountOptions: SurfaceOption[];
168
161
  accountId: string;
169
162
  projectName: string;
170
163
  owner: string;
@@ -181,7 +174,7 @@ interface PublishFlags {
181
174
  busy: boolean;
182
175
  }
183
176
 
184
- interface PublishScope extends Record<string, unknown>, PublishFlags {
177
+ interface PublishScope extends PublishFlags {
185
178
  connect: () => void;
186
179
  replace: () => void;
187
180
  setToken: (value: string) => void;
@@ -286,8 +279,12 @@ export function openPublishSurface(options: PublishSurfaceOptions): PublishSurfa
286
279
  closed = true;
287
280
  options.onClosed();
288
281
  };
282
+ /* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
283
+ element, and a direct `closed` test after that `await` would be narrowed to the value the test
284
+ before it saw. */
285
+ const isClosed = (): boolean => closed;
289
286
 
290
- const scope = reactive({
287
+ const scope: PublishScope = reactive<PublishScope>({
291
288
  ...derive(options.view),
292
289
  closed: finish,
293
290
  connect: () => {
@@ -341,18 +338,21 @@ export function openPublishSurface(options: PublishSurfaceOptions): PublishSurfa
341
338
  tokenDraft = "";
342
339
  options.onSaveToken(token);
343
340
  },
344
- }) as PublishScope;
341
+ });
345
342
 
346
343
  let mounted: SurfaceHandle | null = null;
347
344
  const ready = mountSurface("publish", scope, slot).then(async (surface) => {
348
345
  mounted = surface;
346
+ /* SAFETY: `publish.json`'s root definition carries `tagName: "jx-dialog"`, so the runtime
347
+ mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare
348
+ string. */
349
349
  const element = surface.root as HTMLElement;
350
- if (closed) {
350
+ if (isClosed()) {
351
351
  surface.dispose();
352
352
  return element;
353
353
  }
354
354
  await whenReady(element);
355
- if (closed) {
355
+ if (isClosed()) {
356
356
  return element;
357
357
  }
358
358
  /* The region goes on the platform's own `<dialog>`, which is the one element here that HAS a
@@ -375,7 +375,7 @@ export function openPublishSurface(options: PublishSurfaceOptions): PublishSurfa
375
375
  const element = mounted?.root;
376
376
  if (element instanceof HTMLElement) {
377
377
  // The platform's close first, so focus goes back where it came from; then the document.
378
- closeDialog(element);
378
+ close(element);
379
379
  }
380
380
  // A mount that has not landed yet is disposed by `ready` when it does — `finish` tells it so.
381
381
  mounted?.dispose();
@@ -13,10 +13,9 @@
13
13
  import { reactive } from "../reactivity";
14
14
  import { mountSurface, registerSurface } from "../ui/surface";
15
15
  import pushPlanDoc from "./push-plan.json";
16
- import type { JxDocument } from "@jxsuite/schema/types";
17
16
  import type { SurfaceHandle } from "../ui/surface";
18
17
 
19
- registerSurface("push-plan", pushPlanDoc as unknown as JxDocument);
18
+ registerSurface("push-plan", pushPlanDoc);
20
19
 
21
20
  /** One step of the plan. `kind` colours the rule beside it; nothing here reads it otherwise. */
22
21
  export interface PushStepRow {
@@ -44,8 +43,6 @@ export interface PushPlanSurfaceHandle {
44
43
  dispose: () => void;
45
44
  }
46
45
 
47
- interface PushPlanScope extends Record<string, unknown>, PushPlanView {}
48
-
49
46
  /**
50
47
  * Mount the plan into `host`.
51
48
  *
@@ -54,20 +51,22 @@ interface PushPlanScope extends Record<string, unknown>, PushPlanView {}
54
51
  * @returns {PushPlanSurfaceHandle}
55
52
  */
56
53
  export function mountPushPlanSurface(host: HTMLElement, view: PushPlanView): PushPlanSurfaceHandle {
57
- const scope = reactive<PushPlanScope>({
54
+ const scope: PushPlanView = reactive<PushPlanView>({
58
55
  errors: view.errors,
59
56
  steps: view.steps,
60
57
  warnings: view.warnings,
61
- }) as PushPlanScope;
58
+ });
62
59
 
63
60
  let mounted: SurfaceHandle | null = null;
64
61
  let disposed = false;
65
62
  const ready = mountSurface("push-plan", scope, host).then((surface) => {
66
63
  if (disposed) {
67
64
  surface.dispose();
68
- return surface.root as HTMLElement;
65
+ } else {
66
+ mounted = surface;
69
67
  }
70
- mounted = surface;
68
+ /* SAFETY: `push-plan.json`'s root definition is a `div` element, so the runtime mounts an
69
+ HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
71
70
  return surface.root as HTMLElement;
72
71
  });
73
72
 
@@ -46,11 +46,10 @@ import { activeTab } from "../workspace/workspace";
46
46
  import railDoc from "./rail.json";
47
47
 
48
48
  import type { EffectScope } from "@vue/reactivity";
49
- import type { JxDocument } from "@jxsuite/schema/types";
50
49
  import type { PanelRecord } from "../panels/panel-registry";
51
50
  import type { SurfaceHandle } from "../ui/surface";
52
51
 
53
- registerSurface("rail", railDoc as unknown as JxDocument);
52
+ registerSurface("rail", railDoc);
54
53
 
55
54
  /** One rail button, as the surface reads it. */
56
55
  interface RailButton {
@@ -72,7 +71,13 @@ interface RailGroupProjection {
72
71
  panels: RailButton[];
73
72
  }
74
73
 
75
- interface RailScope extends Record<string, unknown> {
74
+ /** The parts of the rail's scope recomputed from the registry and the shell on every render. */
75
+ type RailProjection = Pick<
76
+ RailScope,
77
+ "groups" | "libraryOpen" | "libraryVisible" | "settingsVisible"
78
+ >;
79
+
80
+ interface RailScope {
76
81
  groups: RailGroupProjection[];
77
82
  settingsVisible: boolean;
78
83
  settingsOpen: boolean;
@@ -80,7 +85,7 @@ interface RailScope extends Record<string, unknown> {
80
85
  libraryOpen: boolean;
81
86
  openLibrary: () => void;
82
87
  toggle: (id: string) => void;
83
- openSettings: (anchor: unknown) => void;
88
+ openSettings: (anchor: EventTarget | null) => void;
84
89
  }
85
90
 
86
91
  let _scope: EffectScope | null = null;
@@ -112,12 +117,7 @@ export function toggleRailPanel(panel: PanelRecord): void {
112
117
  }
113
118
 
114
119
  /** The rail, as the surface reads it, from the registry and the shell as they stand now. */
115
- function project(): {
116
- groups: RailGroupProjection[];
117
- settingsVisible: boolean;
118
- libraryVisible: boolean;
119
- libraryOpen: boolean;
120
- } {
120
+ function project(): RailProjection {
121
121
  const ctx = panelContext();
122
122
  const groups = railGroups(ctx).map((group, index) => ({
123
123
  dividerAbove: index > 0,
@@ -146,14 +146,14 @@ const LIBRARY_COMMAND = "library.open";
146
146
 
147
147
  /** The reactive scope the surface reads, made once. */
148
148
  function state(): RailScope {
149
- _state ??= reactive({
149
+ _state ??= reactive<RailScope>({
150
150
  groups: [],
151
151
  libraryOpen: false,
152
152
  libraryVisible: false,
153
153
  openLibrary: () => {
154
154
  void runActiveReported(LIBRARY_COMMAND, undefined, "Navigator rail");
155
155
  },
156
- openSettings: (anchor: unknown) => {
156
+ openSettings: (anchor: EventTarget | null) => {
157
157
  if (!(anchor instanceof HTMLElement)) {
158
158
  return;
159
159
  }
@@ -175,7 +175,7 @@ function state(): RailScope {
175
175
  toggleRailPanel(panel);
176
176
  }
177
177
  },
178
- }) as RailScope;
178
+ });
179
179
  return _state;
180
180
  }
181
181
 
@@ -25,16 +25,9 @@ import { reactive } from "../reactivity";
25
25
  import { mountSurface, registerSurface } from "../ui/surface";
26
26
  import referenceDoc from "./reference-field.json";
27
27
 
28
- import type { JxDocument } from "@jxsuite/schema/types";
29
- import type { SurfaceHandle } from "../ui/surface";
28
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
30
29
 
31
- registerSurface("reference-field", referenceDoc as unknown as JxDocument);
32
-
33
- /** One row of the picker: an entry id, the empty row, or the value that is not on disk. */
34
- export interface ReferenceChoice {
35
- value: string;
36
- label: string;
37
- }
30
+ registerSurface("reference-field", referenceDoc);
38
31
 
39
32
  /** What the field says right now. Every field is the flow's, never a state it derives. */
40
33
  export interface ReferenceFieldView {
@@ -50,7 +43,7 @@ export interface ReferenceFieldView {
50
43
  /** The entry id the field holds, as a string. */
51
44
  value: string;
52
45
  /** The picker's rows, in the order they are offered. Empty on a text field. */
53
- options: ReferenceChoice[];
46
+ options: SurfaceOption[];
54
47
  /** True while the read is in flight: the picker is inert and says so in its one row. */
55
48
  disabled: boolean;
56
49
  /** A sentence under the control. Empty draws none. */
@@ -82,8 +75,7 @@ export interface ReferenceFieldSurfaceHandle {
82
75
  dispose: () => void;
83
76
  }
84
77
 
85
- interface ReferenceScope
86
- extends Record<string, unknown>, ReferenceFieldView, ReferenceFieldActions {}
78
+ interface ReferenceScope extends ReferenceFieldView, ReferenceFieldActions {}
87
79
 
88
80
  /** The view a freshly mounted surface starts on: a picker that has not been told anything. */
89
81
  function emptyView(): ReferenceFieldView {
@@ -112,7 +104,7 @@ export function mountReferenceFieldSurface(
112
104
  actions: ReferenceFieldActions,
113
105
  ): ReferenceFieldSurfaceHandle {
114
106
  host.textContent = "";
115
- const scope = reactive<ReferenceScope>({ ...emptyView(), ...actions }) as ReferenceScope;
107
+ const scope: ReferenceScope = reactive<ReferenceScope>({ ...emptyView(), ...actions });
116
108
 
117
109
  /** `null` while a mount is in flight — which is a standing surface, not a missing one. */
118
110
  let handle: SurfaceHandle | null = null;
@@ -121,13 +113,17 @@ export function mountReferenceFieldSurface(
121
113
 
122
114
  const mount = (): Promise<HTMLElement> =>
123
115
  mountSurface("reference-field", scope, host).then((mounted) => {
116
+ /* SAFETY: `reference-field.json`'s root definition carries `tagName: "div"`, so the runtime
117
+ mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare
118
+ string. */
119
+ const root = mounted.root as HTMLElement;
124
120
  mounting = false;
125
121
  if (disposed) {
126
122
  mounted.dispose();
127
- return mounted.root as HTMLElement;
123
+ return root;
128
124
  }
129
125
  handle = mounted;
130
- return mounted.root as HTMLElement;
126
+ return root;
131
127
  });
132
128
 
133
129
  const ready = mount();