@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
@@ -19,7 +19,7 @@
19
19
  * Settings › Data Shapes edits the project's `$defs` and this edits a content type's `schema`, and
20
20
  * they are the same object drawn with the same six controls per row — so the two documents are the
21
21
  * same card inside a different shell, and the views are one set of types. A second declaration of
22
- * {@link SchemaFieldView} would be the point at which the two cards start to drift, one field at a
22
+ * {@link DefsFieldView} would be the point at which the two cards start to drift, one field at a
23
23
  * time, with nothing failing.
24
24
  *
25
25
  * @docs studio/data/tables
@@ -29,28 +29,18 @@ import { reactive } from "../reactivity";
29
29
  import { mountSurface, registerSurface } from "../ui/surface";
30
30
  import builderDoc from "./schema-builder.json";
31
31
 
32
- import type { JxDocument } from "@jxsuite/schema/types";
33
- import type { SurfaceHandle } from "../ui/surface";
34
- import type { DefsChoice, DefsFieldView, NestedFieldView } from "./settings-defs";
32
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
33
+ import type { DefsFieldView } from "./settings-defs";
35
34
 
36
- registerSurface("schema-builder", builderDoc as unknown as JxDocument);
37
-
38
- /** One row of a picker: a field type, a format, or a reference target. */
39
- export type SchemaFieldChoice = DefsChoice;
40
-
41
- /** One field of the object being edited, as the document draws it. */
42
- export type SchemaFieldView = DefsFieldView;
43
-
44
- /** One child of an `object` field. It carries its parent — a nested `$map` shadows `$map.item`. */
45
- export type NestedSchemaFieldView = NestedFieldView;
35
+ registerSurface("schema-builder", builderDoc);
46
36
 
47
37
  /** Everything the document draws, as one value. */
48
38
  export interface SchemaBuilderView {
49
- fields: SchemaFieldView[];
50
- typeOptions: SchemaFieldChoice[];
51
- formatOptions: SchemaFieldChoice[];
39
+ fields: DefsFieldView[];
40
+ typeOptions: SurfaceOption[];
41
+ formatOptions: SurfaceOption[];
52
42
  /** The content types a reference field can point at. Empty draws no target picker. */
53
- targets: SchemaFieldChoice[];
43
+ targets: SurfaceOption[];
54
44
  /** Whether the foot of the list is offering the add button or the add form. */
55
45
  addState: "closed" | "open";
56
46
  addName: string;
@@ -94,7 +84,7 @@ export interface SchemaBuilderSurfaceHandle {
94
84
  dispose: () => void;
95
85
  }
96
86
 
97
- interface BuilderScope extends Record<string, unknown>, SchemaBuilderView, SchemaBuilderActions {}
87
+ interface BuilderScope extends SchemaBuilderView, SchemaBuilderActions {}
98
88
 
99
89
  /** The view a freshly mounted surface starts on: no fields, and no add form. */
100
90
  function emptyView(): SchemaBuilderView {
@@ -124,7 +114,7 @@ export function mountSchemaBuilderSurface(
124
114
  actions: SchemaBuilderActions,
125
115
  ): SchemaBuilderSurfaceHandle {
126
116
  host.textContent = "";
127
- const scope = reactive<BuilderScope>({ ...emptyView(), ...actions }) as BuilderScope;
117
+ const scope: BuilderScope = reactive<BuilderScope>({ ...emptyView(), ...actions });
128
118
 
129
119
  /** `null` while a mount is in flight — which is a standing surface, not a missing one. */
130
120
  let handle: SurfaceHandle | null = null;
@@ -133,13 +123,17 @@ export function mountSchemaBuilderSurface(
133
123
 
134
124
  const mount = (): Promise<HTMLElement> =>
135
125
  mountSurface("schema-builder", scope, host).then((mounted) => {
126
+ /* SAFETY: `schema-builder.json`'s root definition carries `tagName: "div"`, so the runtime
127
+ mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare
128
+ string. */
129
+ const root = mounted.root as HTMLElement;
136
130
  mounting = false;
137
131
  if (disposed) {
138
132
  mounted.dispose();
139
- return mounted.root as HTMLElement;
133
+ return root;
140
134
  }
141
135
  handle = mounted;
142
- return mounted.root as HTMLElement;
136
+ return root;
143
137
  });
144
138
 
145
139
  const ready = mount();
@@ -29,14 +29,15 @@
29
29
  * @docs extending/ui-kit
30
30
  */
31
31
 
32
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
32
33
  import { reactive } from "../reactivity";
33
34
  import { mountSurface, registerSurface } from "../ui/surface";
34
35
  import schemaFormDoc from "./schema-form.json";
35
- import type { SurfaceHandle } from "../ui/surface";
36
+ import type { KeyedLabel, SurfaceHandle, SurfaceOption } from "../ui/surface";
36
37
  import type { JxScope } from "@jxsuite/runtime/types";
37
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
38
+ import type { JxElement } from "@jxsuite/schema/types";
38
39
 
39
- registerSurface("schema-form", schemaFormDoc as unknown as JxDocument);
40
+ registerSurface("schema-form", schemaFormDoc);
40
41
 
41
42
  /** Which of the nine controls a row draws. The flow picks it; the document switches on it. */
42
43
  export type SchemaFormFieldKind =
@@ -50,12 +51,6 @@ export type SchemaFormFieldKind =
50
51
  | "rows"
51
52
  | "control";
52
53
 
53
- /** A control a row offers as a closed list, in the shape the kit's select reads. */
54
- export interface SchemaFormOption {
55
- value: string;
56
- label: string;
57
- }
58
-
59
54
  /** One cell of an array-of-objects row: a single declared property of one item. */
60
55
  export interface SchemaFormCellView {
61
56
  /** `${field}/${row}/${key}` — the cell's reconcile identity, and a control host's id. */
@@ -70,7 +65,7 @@ export interface SchemaFormCellView {
70
65
  kind: "text" | "select" | "checkbox" | "number" | "control";
71
66
  value: string;
72
67
  checked: boolean;
73
- options: SchemaFormOption[];
68
+ options: SurfaceOption[];
74
69
  }
75
70
 
76
71
  /** One item of an array-of-objects field. */
@@ -84,12 +79,6 @@ export interface SchemaFormRowView {
84
79
  cells: SchemaFormCellView[];
85
80
  }
86
81
 
87
- /** A read of the shape a JSON field currently holds: `title: string`. */
88
- export interface SchemaFormChipView {
89
- key: string;
90
- label: string;
91
- }
92
-
93
82
  /** One property of the schema, as the document draws it. Every field is already decided. */
94
83
  export interface SchemaFormFieldView {
95
84
  /** The schema property key: this row's reconcile identity, and what every callback names. */
@@ -106,7 +95,7 @@ export interface SchemaFormFieldView {
106
95
  checked: boolean;
107
96
  placeholder: string;
108
97
  /** Choices for `select`, suggestions for `pointer`. */
109
- options: SchemaFormOption[];
98
+ options: SurfaceOption[];
110
99
  /** Whether the pointer rung has anything to suggest; with none it is a field alone. */
111
100
  hasOptions: boolean;
112
101
  /** Bounds off the property schema, so the control refuses out-of-range input itself. */
@@ -138,7 +127,7 @@ export interface SchemaFormFieldView {
138
127
  /** The position permits exactly one rung, so the chip states it and refuses to open. */
139
128
  sourceLocked: boolean;
140
129
  /** The chips above a JSON field, naming the shape it holds. */
141
- chips: SchemaFormChipView[];
130
+ chips: KeyedLabel[];
142
131
  hasChips: boolean;
143
132
  rows: SchemaFormRowView[];
144
133
  /** The add button's accessible name on an array-of-objects field. */
@@ -179,7 +168,7 @@ export interface SchemaFormSurface {
179
168
  /** A control host the document drew, reported as the runtime created it. */
180
169
  export type ControlHostSink = (id: string, host: HTMLElement) => void;
181
170
 
182
- interface SchemaFormScope extends Record<string, unknown>, SchemaFormView, SchemaFormActions {
171
+ interface SchemaFormScope extends SchemaFormView, SchemaFormActions {
183
172
  /** The Mixed text placeholder, held in state because the literal is itself a template. */
184
173
  templatePlaceholder: string;
185
174
  }
@@ -194,20 +183,21 @@ interface SchemaFormScope extends Record<string, unknown>, SchemaFormView, Schem
194
183
  * node that needs filling.
195
184
  */
196
185
  function controlIdOf(part: string, state: JxScope | undefined): string {
197
- const item = (state?.["$map"] as { item?: Record<string, unknown> } | undefined)?.item;
186
+ const map = state?.["$map"];
187
+ const item = isJsonObject(map) && isJsonObject(map["item"]) ? map["item"] : undefined;
198
188
  const id =
199
189
  part === "control-host"
200
190
  ? item?.["key"]
201
191
  : part === "cell-control-host"
202
192
  ? item?.["id"]
203
193
  : undefined;
204
- return typeof id === "string" ? id : "";
194
+ return isString(id) ? id : "";
205
195
  }
206
196
 
207
197
  /** A node definition's `part`, as written in the document. */
208
198
  function partOf(def: JxElement | string): string {
209
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
210
- return typeof part === "string" ? part : "";
199
+ const part = isString(def) ? undefined : def.attributes?.["part"];
200
+ return isString(part) ? part : "";
211
201
  }
212
202
 
213
203
  /**
@@ -226,11 +216,11 @@ export function createSchemaFormSurface(
226
216
  ): SchemaFormSurface {
227
217
  const host = document.createElement("div");
228
218
  host.style.display = "contents";
229
- const scope = reactive({
219
+ const scope: SchemaFormScope = reactive<SchemaFormScope>({
230
220
  ...view,
231
221
  ...actions,
232
222
  templatePlaceholder: "${state.…}",
233
- }) as SchemaFormScope;
223
+ });
234
224
 
235
225
  /** `null` while a mount is in flight — which is a standing surface, not a missing one. */
236
226
  let handle: SurfaceHandle | null = null;
@@ -28,10 +28,9 @@ import { reactive } from "../reactivity";
28
28
  import { mountSurface, registerSurface } from "../ui/surface";
29
29
  import secretDoc from "./secret-field.json";
30
30
 
31
- import type { JxDocument } from "@jxsuite/schema/types";
32
31
  import type { SurfaceHandle } from "../ui/surface";
33
32
 
34
- registerSurface("secret-field", secretDoc as unknown as JxDocument);
33
+ registerSurface("secret-field", secretDoc);
35
34
 
36
35
  /** What the field says right now. Every field is the flow's, never a state it derives. */
37
36
  export interface SecretFieldView {
@@ -65,7 +64,7 @@ export interface SecretFieldSurfaceHandle {
65
64
  dispose: () => void;
66
65
  }
67
66
 
68
- interface SecretScope extends Record<string, unknown>, SecretFieldView, SecretFieldActions {
67
+ interface SecretScope extends SecretFieldView, SecretFieldActions {
69
68
  /**
70
69
  * What the field's value is bound to, and the whole of the "never render a secret back" rule.
71
70
  *
@@ -92,7 +91,7 @@ export function mountSecretFieldSurface(
92
91
  actions: SecretFieldActions,
93
92
  ): SecretFieldSurfaceHandle {
94
93
  host.textContent = "";
95
- const scope = reactive<SecretScope>({ ...emptyView(), ...actions, shown: "" }) as SecretScope;
94
+ const scope: SecretScope = reactive<SecretScope>({ ...emptyView(), ...actions, shown: "" });
96
95
 
97
96
  /** `null` while a mount is in flight — which is a standing surface, not a missing one. */
98
97
  let handle: SurfaceHandle | null = null;
@@ -101,13 +100,17 @@ export function mountSecretFieldSurface(
101
100
 
102
101
  const mount = (): Promise<HTMLElement> =>
103
102
  mountSurface("secret-field", scope, host).then((mounted) => {
103
+ /* SAFETY: `secret-field.json`'s root definition carries `tagName: "div"`, so the runtime
104
+ mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare
105
+ string. */
106
+ const root = mounted.root as HTMLElement;
104
107
  mounting = false;
105
108
  if (disposed) {
106
109
  mounted.dispose();
107
- return mounted.root as HTMLElement;
110
+ return root;
108
111
  }
109
112
  handle = mounted;
110
- return mounted.root as HTMLElement;
113
+ return root;
111
114
  });
112
115
 
113
116
  const ready = mount();
@@ -33,13 +33,12 @@
33
33
  import { reactive } from "../reactivity";
34
34
  import { mountSurface, registerSurface } from "../ui/surface";
35
35
  import { overlayRegion, REGION_ATTR } from "../ui/regions";
36
- import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
36
+ import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
37
37
  import { whenReady } from "./dialog";
38
38
  import seoDoc from "./seo.json";
39
39
  import type { SurfaceHandle } from "../ui/surface";
40
- import type { JxDocument } from "@jxsuite/schema/types";
41
40
 
42
- registerSurface("seo", seoDoc as unknown as JxDocument);
41
+ registerSurface("seo", seoDoc);
43
42
 
44
43
  /** How a field's provenance is drawn — §6.7's vocabulary, reduced to three shapes and an absence. */
45
44
  export type SeoChipKind = "none" | "dot" | "static" | "link";
@@ -65,8 +64,9 @@ export interface SeoFieldView {
65
64
  chipTitle: string;
66
65
  }
67
66
 
68
- /** One named warning. A list, never a total. */
67
+ /** A named thing that is wrong, or absent. Never summed: the list IS the report. */
69
68
  export interface SeoWarningView {
69
+ /** Stable id, so a test and a shot name the same warning. */
70
70
  id: string;
71
71
  /** The head key it is about, so the row can carry it as code. */
72
72
  field: string;
@@ -154,17 +154,17 @@ export interface SeoSurfaceHandle {
154
154
  type LineState = "text" | "unset";
155
155
 
156
156
  /** One field row with the flags the document branches on. */
157
- interface SeoFieldRow extends SeoFieldView, Record<string, unknown> {
157
+ interface SeoFieldRow extends SeoFieldView {
158
158
  valueState: LineState;
159
159
  }
160
160
 
161
161
  /** One editable row with the flags the document branches on. */
162
- interface SeoEditRow extends SeoEditRowView, Record<string, unknown> {
162
+ interface SeoEditRow extends SeoEditRowView {
163
163
  hasThumb: boolean;
164
164
  }
165
165
 
166
166
  /** One group with its rows already flagged. */
167
- interface SeoGroupRow extends Record<string, unknown> {
167
+ interface SeoGroupRow {
168
168
  key: string;
169
169
  title: string;
170
170
  note: string;
@@ -196,12 +196,12 @@ interface SeoFlags {
196
196
  groups: SeoGroupRow[];
197
197
  }
198
198
 
199
- interface SeoScope extends Record<string, unknown>, SeoFlags {
199
+ interface SeoScope extends SeoFlags {
200
200
  documentLabel: string;
201
201
  edit: (key: string, value: string) => void;
202
202
  commit: (key: string, value: string) => void;
203
203
  upload: (key: string) => void;
204
- browse: (key: string, anchor: unknown) => void;
204
+ browse: (key: string, anchor: EventTarget | null) => void;
205
205
  openDonor: (key: string) => void;
206
206
  closed: () => void;
207
207
  }
@@ -268,9 +268,9 @@ export function openSeoSurface(options: SeoSurfaceOptions): SeoSurfaceHandle {
268
268
  options.onClosed();
269
269
  };
270
270
 
271
- const scope = reactive({
271
+ const scope: SeoScope = reactive<SeoScope>({
272
272
  ...derive(options.view),
273
- browse: (key: string, anchor: unknown) => {
273
+ browse: (key: string, anchor: EventTarget | null) => {
274
274
  if (anchor instanceof HTMLElement) {
275
275
  options.onBrowse(key, anchor);
276
276
  }
@@ -288,18 +288,24 @@ export function openSeoSurface(options: SeoSurfaceOptions): SeoSurfaceHandle {
288
288
  upload: (key: string) => {
289
289
  options.onUpload(key);
290
290
  },
291
- }) as SeoScope;
291
+ });
292
292
 
293
+ /* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
294
+ element, and a direct `closed` test after that `await` would be narrowed to the value the test
295
+ before it saw. */
296
+ const isClosed = (): boolean => closed;
293
297
  let mounted: SurfaceHandle | null = null;
294
298
  const ready = mountSurface("seo", scope, slot).then(async (surface) => {
295
299
  mounted = surface;
300
+ /* SAFETY: `seo.json`'s root definition carries `tagName: "jx-dialog"`, so the runtime mounts an
301
+ HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
296
302
  const element = surface.root as HTMLElement;
297
- if (closed) {
303
+ if (isClosed()) {
298
304
  surface.dispose();
299
305
  return element;
300
306
  }
301
307
  await whenReady(element);
302
- if (closed) {
308
+ if (isClosed()) {
303
309
  return element;
304
310
  }
305
311
  const box = element.querySelector<HTMLElement>('dialog[part="dialog"]') ?? element;
@@ -317,7 +323,7 @@ export function openSeoSurface(options: SeoSurfaceOptions): SeoSurfaceHandle {
317
323
  const element = mounted?.root;
318
324
  if (element instanceof HTMLElement) {
319
325
  // The platform's close first, so focus goes back where it came from; then the document.
320
- closeDialog(element);
326
+ close(element);
321
327
  }
322
328
  // A mount that has not landed yet is disposed by `ready` when it does — `finish` tells it so.
323
329
  mounted?.dispose();
@@ -22,10 +22,9 @@ import { reactive } from "../reactivity";
22
22
  import { mountSurface, registerSurface } from "../ui/surface";
23
23
  import contextsDoc from "./settings-contexts.json";
24
24
 
25
- import type { JxDocument } from "@jxsuite/schema/types";
26
25
  import type { SurfaceHandle } from "../ui/surface";
27
26
 
28
- registerSurface("settings-contexts", contextsDoc as unknown as JxDocument);
27
+ registerSurface("settings-contexts", contextsDoc);
29
28
 
30
29
  /** One `$media` row, as the document draws it. */
31
30
  export interface ContextRowView {
@@ -111,7 +110,7 @@ export interface ContextsSurfaceHandle {
111
110
  * would be a second place to get it wrong. The refusal lines need none — `invalid` already says
112
111
  * which control the message belongs to.
113
112
  */
114
- interface ContextsScope extends Record<string, unknown>, ContextsView, ContextsActions {
113
+ interface ContextsScope extends ContextsView, ContextsActions {
115
114
  hasSectionError: boolean;
116
115
  hasNotice: boolean;
117
116
  }
@@ -141,7 +140,7 @@ export function mountContextsSurface(
141
140
  actions: ContextsActions,
142
141
  ): ContextsSurfaceHandle {
143
142
  host.textContent = "";
144
- const scope = reactive<ContextsScope>({
143
+ const scope: ContextsScope = reactive<ContextsScope>({
145
144
  ...emptyView(),
146
145
  add: actions.add,
147
146
  hasNotice: false,
@@ -151,17 +150,20 @@ export function mountContextsSurface(
151
150
  setBase: actions.setBase,
152
151
  setQuery: actions.setQuery,
153
152
  setScheme: actions.setScheme,
154
- }) as ContextsScope;
153
+ });
155
154
 
156
155
  let mounted: SurfaceHandle | null = null;
157
156
  let disposed = false;
158
157
  const ready = mountSurface("settings-contexts", scope, host).then((surface) => {
158
+ /* SAFETY: `settings-contexts.json`'s root definition carries `tagName: "div"`, so the runtime
159
+ mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
160
+ const root = surface.root as HTMLElement;
159
161
  if (disposed) {
160
162
  surface.dispose();
161
- return surface.root as HTMLElement;
163
+ return root;
162
164
  }
163
165
  mounted = surface;
164
- return surface.root as HTMLElement;
166
+ return root;
165
167
  });
166
168
 
167
169
  return {
@@ -26,14 +26,15 @@
26
26
  * @docs studio/projects/settings
27
27
  */
28
28
 
29
+ import { isString } from "@jxsuite/schema/guards";
29
30
  import { reactive } from "../reactivity";
30
31
  import { mountSurface, registerSurface } from "../ui/surface";
31
32
  import contributedDoc from "./settings-contributed.json";
32
33
 
33
- import type { JxDocument } from "@jxsuite/schema/types";
34
34
  import type { SurfaceHandle } from "../ui/surface";
35
+ import type { JxElement } from "@jxsuite/schema/types";
35
36
 
36
- registerSurface("settings-contributed", contributedDoc as unknown as JxDocument);
37
+ registerSurface("settings-contributed", contributedDoc);
37
38
 
38
39
  /** One entry key in a map-layout section's left column. */
39
40
  export interface ContributedEntryView {
@@ -101,7 +102,7 @@ export interface ContributedSurfaceHandle {
101
102
  dispose: () => void;
102
103
  }
103
104
 
104
- interface ContributedScope extends Record<string, unknown>, ContributedView, ContributedActions {}
105
+ interface ContributedScope extends ContributedView, ContributedActions {}
105
106
 
106
107
  /** The view a freshly mounted surface starts on: a form layout with nothing in it. */
107
108
  function emptyView(): ContributedView {
@@ -119,10 +120,9 @@ function emptyView(): ContributedView {
119
120
  }
120
121
 
121
122
  /** The `part` a node was authored with, or `""` — the only thing this adapter asks about a node. */
122
- function partOf(def: unknown): string {
123
- const attributes = (def as { attributes?: Record<string, unknown> } | null)?.attributes;
124
- const part = attributes?.["part"];
125
- return typeof part === "string" ? part : "";
123
+ function partOf(def: JxElement | string): string {
124
+ const part = isString(def) ? undefined : def.attributes?.["part"];
125
+ return isString(part) ? part : "";
126
126
  }
127
127
 
128
128
  /**
@@ -139,7 +139,7 @@ export function mountContributedSurface(
139
139
  islands: ContributedIslands,
140
140
  ): ContributedSurfaceHandle {
141
141
  host.textContent = "";
142
- const scope = reactive<ContributedScope>({ ...emptyView(), ...actions }) as ContributedScope;
142
+ const scope: ContributedScope = reactive<ContributedScope>({ ...emptyView(), ...actions });
143
143
 
144
144
  let mounted: SurfaceHandle | null = null;
145
145
  let disposed = false;
@@ -160,12 +160,16 @@ export function mountContributedSurface(
160
160
  }
161
161
  },
162
162
  }).then((surface) => {
163
+ /* SAFETY: `settings-contributed.json`'s root definition carries `tagName: "section"`, so the
164
+ runtime mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare
165
+ string. */
166
+ const root = surface.root as HTMLElement;
163
167
  if (disposed) {
164
168
  surface.dispose();
165
- return surface.root as HTMLElement;
169
+ return root;
166
170
  }
167
171
  mounted = surface;
168
- return surface.root as HTMLElement;
172
+ return root;
169
173
  });
170
174
 
171
175
  return {
@@ -29,16 +29,9 @@
29
29
  import { reactive } from "../reactivity";
30
30
  import { mountSurface, registerSurface } from "../ui/surface";
31
31
  import cssVarsDoc from "./settings-css-vars.json";
32
- import type { SurfaceHandle } from "../ui/surface";
33
- import type { JxDocument } from "@jxsuite/schema/types";
32
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
34
33
 
35
- registerSurface("settings-css-vars", cssVarsDoc as unknown as JxDocument);
36
-
37
- /** One row of the add-an-override picker. */
38
- export interface OverrideChoice {
39
- value: string;
40
- label: string;
41
- }
34
+ registerSurface("settings-css-vars", cssVarsDoc);
42
35
 
43
36
  /** One of a token's per-context values. */
44
37
  export interface OverrideRowView {
@@ -91,7 +84,7 @@ export interface TokenRowView {
91
84
  overrides: OverrideRowView[];
92
85
  /** Whether the add-an-override picker is offered. */
93
86
  addState: "none" | "shown";
94
- addOptions: OverrideChoice[];
87
+ addOptions: SurfaceOption[];
95
88
  /** What the picker currently reads. Always `""` in practice — see {@link renderCssVarsSurface}. */
96
89
  addPick: string;
97
90
  addLabel: string;
@@ -141,7 +134,7 @@ interface CssVarsFlags {
141
134
  hasError: boolean;
142
135
  }
143
136
 
144
- interface CssVarsScope extends Record<string, unknown>, CssVarsView, CssVarsActions, CssVarsFlags {}
137
+ interface CssVarsScope extends CssVarsView, CssVarsActions, CssVarsFlags {}
145
138
 
146
139
  interface Mounted {
147
140
  scope: CssVarsScope;
@@ -186,7 +179,7 @@ export function renderCssVarsSurface(
186
179
  }
187
180
  existing?.handle?.dispose();
188
181
  host.textContent = "";
189
- const scope = reactive({ ...derive(view), ...actions }) as CssVarsScope;
182
+ const scope: CssVarsScope = reactive<CssVarsScope>({ ...derive(view), ...actions });
190
183
  const record: Mounted = { handle: null, scope };
191
184
  mounts.set(host, record);
192
185
  /* No race to arbitrate: a redraw arriving while this is in flight takes the branch above — a
@@ -158,7 +158,7 @@
158
158
  {
159
159
  "$prototype": "Array",
160
160
  "items": {
161
- "$ref": "#/state/shapes"
161
+ "$ref": "#/state/defs"
162
162
  },
163
163
  "key": {
164
164
  "$ref": "$map/item/name"
@@ -406,7 +406,7 @@
406
406
  {
407
407
  "operator": "call",
408
408
  "target": {
409
- "$ref": "#/state/removeShape"
409
+ "$ref": "#/state/removeSelected"
410
410
  },
411
411
  "value": []
412
412
  }
@@ -26,19 +26,12 @@ import { reactive } from "../reactivity";
26
26
  import { mountSurface, registerSurface } from "../ui/surface";
27
27
  import defsDoc from "./settings-defs.json";
28
28
 
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("settings-defs", defsDoc as unknown as JxDocument);
33
-
34
- /** One row of a picker: a field type, a format, or a reference target. */
35
- export interface DefsChoice {
36
- value: string;
37
- label: string;
38
- }
31
+ registerSurface("settings-defs", defsDoc);
39
32
 
40
33
  /** One data shape in the left column. */
41
- export interface DefsShapeView {
34
+ export interface DefsEntryView {
42
35
  name: string;
43
36
  selected: boolean;
44
37
  }
@@ -87,7 +80,7 @@ export interface DefsFieldView {
87
80
 
88
81
  /** Everything the document draws, as one value. */
89
82
  export interface DefsView {
90
- shapes: DefsShapeView[];
83
+ defs: DefsEntryView[];
91
84
  /** Whether the left column is offering the new-shape button or the form. */
92
85
  newState: "closed" | "open";
93
86
  newName: string;
@@ -95,10 +88,10 @@ export interface DefsView {
95
88
  editorState: "empty" | "editing";
96
89
  selected: string;
97
90
  fields: DefsFieldView[];
98
- typeOptions: DefsChoice[];
99
- formatOptions: DefsChoice[];
91
+ typeOptions: SurfaceOption[];
92
+ formatOptions: SurfaceOption[];
100
93
  /** The content types a reference field can point at. */
101
- targets: DefsChoice[];
94
+ targets: SurfaceOption[];
102
95
  addState: "closed" | "open";
103
96
  addName: string;
104
97
  addType: string;
@@ -114,7 +107,7 @@ export interface DefsActions {
114
107
  editNew: (value: string) => void;
115
108
  createNew: () => void;
116
109
  cancelNew: () => void;
117
- removeShape: () => void;
110
+ removeSelected: () => void;
118
111
  renameField: (key: string, value: string) => void;
119
112
  setType: (key: string, value: string) => void;
120
113
  setFormat: (key: string, value: string) => void;
@@ -149,7 +142,7 @@ export interface DefsSurfaceHandle {
149
142
  dispose: () => void;
150
143
  }
151
144
 
152
- interface DefsScope extends Record<string, unknown>, DefsView, DefsActions {}
145
+ interface DefsScope extends DefsView, DefsActions {}
153
146
 
154
147
  /** The view a freshly mounted surface starts on: no shapes, and nothing chosen. */
155
148
  function emptyView(): DefsView {
@@ -160,13 +153,13 @@ function emptyView(): DefsView {
160
153
  addRequired: false,
161
154
  addState: "closed",
162
155
  addType: "string",
156
+ defs: [],
163
157
  editorState: "empty",
164
158
  fields: [],
165
159
  formatOptions: [],
166
160
  newName: "",
167
161
  newState: "closed",
168
162
  selected: "",
169
- shapes: [],
170
163
  targets: [],
171
164
  typeOptions: [],
172
165
  };
@@ -181,17 +174,20 @@ function emptyView(): DefsView {
181
174
  */
182
175
  export function mountDefsSurface(host: HTMLElement, actions: DefsActions): DefsSurfaceHandle {
183
176
  host.textContent = "";
184
- const scope = reactive<DefsScope>({ ...emptyView(), ...actions }) as DefsScope;
177
+ const scope: DefsScope = reactive<DefsScope>({ ...emptyView(), ...actions });
185
178
 
186
179
  let mounted: SurfaceHandle | null = null;
187
180
  let disposed = false;
188
181
  const ready = mountSurface("settings-defs", scope, host).then((surface) => {
182
+ /* SAFETY: `settings-defs.json`'s root definition carries `tagName: "section"`, so the runtime
183
+ mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
184
+ const root = surface.root as HTMLElement;
189
185
  if (disposed) {
190
186
  surface.dispose();
191
- return surface.root as HTMLElement;
187
+ return root;
192
188
  }
193
189
  mounted = surface;
194
- return surface.root as HTMLElement;
190
+ return root;
195
191
  });
196
192
 
197
193
  return {
@@ -218,13 +214,13 @@ export function mountDefsSurface(host: HTMLElement, actions: DefsActions): DefsS
218
214
  scope.addRequired = view.addRequired;
219
215
  scope.addState = view.addState;
220
216
  scope.addType = view.addType;
217
+ scope.defs = view.defs;
221
218
  scope.editorState = view.editorState;
222
219
  scope.fields = view.fields;
223
220
  scope.formatOptions = view.formatOptions;
224
221
  scope.newName = view.newName;
225
222
  scope.newState = view.newState;
226
223
  scope.selected = view.selected;
227
- scope.shapes = view.shapes;
228
224
  scope.targets = view.targets;
229
225
  scope.typeOptions = view.typeOptions;
230
226
  },