@jxsuite/studio 6.1.1 → 8.0.0

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 (785) hide show
  1. package/README.md +5 -5
  2. package/dist/chunks/2020-5wtzce5g.js +4 -0
  3. package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
  4. package/dist/chunks/adapter-5tphg7xe.js +4 -0
  5. package/dist/chunks/add-new-flow-psym14sn.js +4 -0
  6. package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
  7. package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
  8. package/dist/chunks/color-area-6rbra5dy.js +4 -0
  9. package/dist/chunks/color-field-gy56c94g.js +4 -0
  10. package/dist/chunks/color-m7r1vk54.js +4 -0
  11. package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
  12. package/dist/chunks/combobox-72h32ejk.js +4 -0
  13. package/dist/chunks/components-r22xca09.js +4 -0
  14. package/dist/chunks/content-source-mmppmcyg.js +4 -0
  15. package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
  16. package/dist/chunks/dialog-c4x05vyx.js +4 -0
  17. package/dist/chunks/editor-ccd9jwsa.js +4 -0
  18. package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
  19. package/dist/chunks/extension-sections-0egb88dm.js +4 -0
  20. package/dist/chunks/file-ops-qnab36ek.js +4 -0
  21. package/dist/chunks/files-rcn56qvm.js +4 -0
  22. package/dist/chunks/format-host-yxz0kjjs.js +4 -0
  23. package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
  24. package/dist/chunks/grid-open-4z1g062t.js +4 -0
  25. package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
  26. package/dist/chunks/icons-63bjtbs7.js +4 -0
  27. package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
  28. package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
  29. package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
  30. package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
  31. package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
  32. package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
  33. package/dist/chunks/index-f0jn7nnp.js +4 -0
  34. package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
  35. package/dist/chunks/jsonMode-njkvsa02.js +13 -0
  36. package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
  37. package/dist/chunks/layers-bgyr11tr.js +4 -0
  38. package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
  39. package/dist/chunks/listbox-c421cf8c.js +4 -0
  40. package/dist/chunks/lit-html-v9gh687x.js +4 -0
  41. package/dist/chunks/media-library-sq468wts.js +4 -0
  42. package/dist/chunks/media-picker-shfe59pt.js +4 -0
  43. package/dist/chunks/menu-bdpzbfvs.js +4 -0
  44. package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
  45. package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
  46. package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
  47. package/dist/chunks/notify-kzrjr3fv.js +4 -0
  48. package/dist/chunks/number-field-y62xq0ty.js +4 -0
  49. package/dist/chunks/parse-v77xtwv7.js +4 -0
  50. package/dist/chunks/platform-7v4rtd7m.js +4 -0
  51. package/dist/chunks/popover-b89sfej7.js +4 -0
  52. package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
  53. package/dist/chunks/publish-quick-qx2455cj.js +4 -0
  54. package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
  55. package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
  56. package/dist/chunks/references-9547rg5s.js +4 -0
  57. package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
  58. package/dist/chunks/select-rzds841e.js +4 -0
  59. package/dist/chunks/source-control-kwktr9y6.js +4 -0
  60. package/dist/chunks/split-c9zfdgxf.js +4 -0
  61. package/dist/chunks/studio-03ct6yfv.js +9 -0
  62. package/dist/chunks/studio-07rcfje3.js +5 -0
  63. package/dist/chunks/studio-3e54qh39.js +7 -0
  64. package/dist/chunks/studio-3exxhz5g.js +5 -0
  65. package/dist/chunks/studio-3q40e3rj.js +5 -0
  66. package/dist/chunks/studio-3qeh9t0h.js +6 -0
  67. package/dist/chunks/studio-3qqjeep5.js +6 -0
  68. package/dist/chunks/studio-43sd2mam.js +4 -0
  69. package/dist/chunks/studio-4hp8pkyt.js +5 -0
  70. package/dist/chunks/studio-58xg6j2q.js +9 -0
  71. package/dist/chunks/studio-5g0rprdt.js +7 -0
  72. package/dist/chunks/studio-6m380wp7.js +5 -0
  73. package/dist/chunks/studio-80jyh1xh.js +4 -0
  74. package/dist/chunks/studio-83mk4bgg.js +9 -0
  75. package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
  76. package/dist/chunks/studio-8m0y2qe7.js +5 -0
  77. package/dist/chunks/studio-8tr6cfrc.js +5 -0
  78. package/dist/chunks/studio-8vcvfs7r.js +6 -0
  79. package/dist/chunks/studio-9tmebf0s.js +5 -0
  80. package/dist/chunks/studio-a2bvaptz.js +5 -0
  81. package/dist/chunks/studio-b7y5mr30.js +5 -0
  82. package/dist/chunks/studio-bavb31r0.js +5 -0
  83. package/dist/chunks/studio-bbe4c90a.js +5 -0
  84. package/dist/chunks/studio-c05wdnt3.js +5 -0
  85. package/dist/chunks/studio-ccv2svc6.js +5 -0
  86. package/dist/chunks/studio-d5grtb9e.js +16 -0
  87. package/dist/chunks/studio-df0baea9.js +5 -0
  88. package/dist/chunks/studio-dgk4dqtx.js +7 -0
  89. package/dist/chunks/studio-e1g64q43.js +5 -0
  90. package/dist/chunks/studio-ed1hp6zf.js +6 -0
  91. package/dist/chunks/studio-ed3xx40h.js +7 -0
  92. package/dist/chunks/studio-f14e1zdj.js +5 -0
  93. package/dist/chunks/studio-fbhxxc5f.js +5 -0
  94. package/dist/chunks/studio-fyh0jc96.js +5 -0
  95. package/dist/chunks/studio-gcxk20n7.js +5 -0
  96. package/dist/chunks/studio-jaaz8ce9.js +5 -0
  97. package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
  98. package/dist/chunks/studio-jsgf2q5k.js +7 -0
  99. package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
  100. package/dist/chunks/studio-k7evxqh4.js +5 -0
  101. package/dist/chunks/studio-kt3pjkwd.js +5 -0
  102. package/dist/chunks/studio-m8g16bgz.js +5 -0
  103. package/dist/chunks/studio-mn0476ag.js +5 -0
  104. package/dist/chunks/studio-mx1smyq0.js +5 -0
  105. package/dist/chunks/studio-n0c5h6mf.js +5 -0
  106. package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
  107. package/dist/chunks/studio-nqxqf8p2.js +4 -0
  108. package/dist/chunks/studio-p4nrkvqr.js +5 -0
  109. package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
  110. package/dist/chunks/studio-pgmvdv7z.js +7 -0
  111. package/dist/chunks/studio-ph84avkf.js +5 -0
  112. package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
  113. package/dist/chunks/studio-q0tccd43.js +5 -0
  114. package/dist/chunks/studio-q7rtx6zq.js +14 -0
  115. package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
  116. package/dist/chunks/studio-qmn1xc24.js +5 -0
  117. package/dist/chunks/studio-qwdqwkj0.js +5 -0
  118. package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
  119. package/dist/chunks/studio-rj9eamf8.js +5 -0
  120. package/dist/chunks/studio-rptgsk96.js +5 -0
  121. package/dist/chunks/studio-rthyg42z.js +928 -0
  122. package/dist/chunks/studio-s19tp1xr.js +5 -0
  123. package/dist/chunks/studio-s32578pn.js +5 -0
  124. package/dist/chunks/studio-svb7yyve.js +5 -0
  125. package/dist/chunks/studio-syreb644.js +5 -0
  126. package/dist/chunks/studio-tf9jryb1.js +10 -0
  127. package/dist/chunks/studio-tfkznv39.js +5 -0
  128. package/dist/chunks/studio-tft6r105.js +5 -0
  129. package/dist/chunks/studio-txf2kysx.js +5 -0
  130. package/dist/chunks/studio-v8867ddv.js +12 -0
  131. package/dist/chunks/studio-vxq7fcvv.js +5 -0
  132. package/dist/chunks/studio-w4rz9hdk.js +5 -0
  133. package/dist/chunks/studio-wbcjbhy1.js +9 -0
  134. package/dist/chunks/studio-wc649wss.js +5 -0
  135. package/dist/chunks/studio-wys23mxz.js +5 -0
  136. package/dist/chunks/studio-x1x167jh.js +5 -0
  137. package/dist/chunks/studio-x9hsze61.js +5 -0
  138. package/dist/chunks/studio-y0n7yxea.js +9 -0
  139. package/dist/chunks/studio-y3ahhdpx.js +5 -0
  140. package/dist/chunks/studio-z97c48fk.js +5 -0
  141. package/dist/chunks/studio-zat62m0c.js +5 -0
  142. package/dist/chunks/studio-zcd2e7yz.js +5 -0
  143. package/dist/chunks/studio-zz9qe3rw.js +64 -0
  144. package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
  145. package/dist/chunks/tabs-f5cw3tgp.js +4 -0
  146. package/dist/chunks/textfield-wewc8rq2.js +4 -0
  147. package/dist/chunks/toast-1gv0h53h.js +4 -0
  148. package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
  149. package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
  150. package/dist/chunks/tooltip-yypz28gq.js +4 -0
  151. package/dist/chunks/tree-9xa4hm7n.js +4 -0
  152. package/dist/chunks/tsMode-epyfz1hv.js +14 -0
  153. package/dist/chunks/workspace-dz7nxfhv.js +4 -0
  154. package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
  155. package/dist/chunks/ws-client-bv552sfx.js +4 -0
  156. package/dist/iframe-entry.js +20 -16
  157. package/dist/manifest.json +77 -63
  158. package/dist/studio.js +106 -107
  159. package/dist/workers/ts.worker.js +3 -3
  160. package/package.json +17 -16
  161. package/src/about/about-modal.ts +4 -3
  162. package/src/account/action-flow.ts +45 -38
  163. package/src/account-status.ts +7 -2
  164. package/src/browse/component-examples.ts +272 -0
  165. package/src/browse/library-commands.ts +64 -104
  166. package/src/browse/library-layouts.ts +270 -53
  167. package/src/browse/library-model.ts +194 -134
  168. package/src/browse/library-pane.ts +748 -440
  169. package/src/browse/library-preview.ts +161 -26
  170. package/src/browse/library-source.ts +308 -41
  171. package/src/browse/preview-root.ts +78 -0
  172. package/src/browse/preview-style.ts +155 -0
  173. package/src/canvas/asset-refs.ts +40 -10
  174. package/src/canvas/asset-resolve.ts +19 -23
  175. package/src/canvas/canvas-helpers.ts +7 -6
  176. package/src/canvas/canvas-live-render.ts +260 -77
  177. package/src/canvas/canvas-origin.ts +37 -12
  178. package/src/canvas/canvas-page-context.ts +112 -0
  179. package/src/canvas/canvas-patcher.ts +30 -30
  180. package/src/canvas/canvas-perf.ts +11 -5
  181. package/src/canvas/canvas-render.ts +175 -148
  182. package/src/canvas/canvas-surface.ts +5 -3
  183. package/src/canvas/canvas-utils.ts +147 -61
  184. package/src/canvas/dialog-path.ts +9 -4
  185. package/src/canvas/dialog-state.ts +1 -2
  186. package/src/canvas/diff-marks.ts +9 -16
  187. package/src/canvas/diff-toolbar.ts +8 -7
  188. package/src/canvas/edit-width-drag.ts +4 -1
  189. package/src/canvas/edit-width.ts +1 -3
  190. package/src/canvas/iframe-channel.ts +27 -13
  191. package/src/canvas/iframe-drop.ts +120 -12
  192. package/src/canvas/iframe-editable-root.ts +29 -16
  193. package/src/canvas/iframe-entry.ts +104 -75
  194. package/src/canvas/iframe-eval.ts +73 -49
  195. package/src/canvas/iframe-host.ts +269 -158
  196. package/src/canvas/iframe-inline-edit.ts +49 -30
  197. package/src/canvas/iframe-insert.ts +5 -4
  198. package/src/canvas/iframe-interaction.ts +30 -25
  199. package/src/canvas/iframe-keys.ts +11 -0
  200. package/src/canvas/iframe-overlay.ts +1 -1
  201. package/src/canvas/iframe-patch.ts +25 -21
  202. package/src/canvas/iframe-position.ts +12 -6
  203. package/src/canvas/iframe-protocol.ts +36 -21
  204. package/src/canvas/iframe-render.ts +84 -35
  205. package/src/canvas/iframe-slash.ts +24 -11
  206. package/src/canvas/iframe-subtree.ts +10 -3
  207. package/src/canvas/npm-modules.ts +22 -0
  208. package/src/canvas/path-mapping.ts +19 -12
  209. package/src/canvas/popover-path.ts +7 -3
  210. package/src/canvas/popover-state.ts +1 -2
  211. package/src/canvas/preview-navigate.ts +16 -0
  212. package/src/canvas/repeater-sources.ts +200 -0
  213. package/src/canvas/serialize-scope.ts +13 -5
  214. package/src/canvas/stage-scrollbar.ts +7 -2
  215. package/src/canvas/surface-registry.ts +27 -3
  216. package/src/collab/collab-commands.ts +7 -2
  217. package/src/collab/collab-session.ts +84 -45
  218. package/src/collab/collab-state.ts +4 -3
  219. package/src/collab/monaco-binding.ts +16 -13
  220. package/src/collab/monaco-cursors.ts +5 -2
  221. package/src/commands/app-commands.ts +16 -6
  222. package/src/commands/budget.ts +13 -11
  223. package/src/commands/command-args.ts +103 -71
  224. package/src/commands/context.ts +55 -28
  225. package/src/commands/defaults.ts +69 -45
  226. package/src/commands/keymap.ts +56 -43
  227. package/src/commands/levels.ts +14 -8
  228. package/src/commands/live-context.ts +9 -7
  229. package/src/commands/reference.ts +2 -1
  230. package/src/commands/registry.ts +22 -11
  231. package/src/commands/run-reported.ts +15 -10
  232. package/src/component-props.ts +46 -30
  233. package/src/content/collection-match.ts +11 -9
  234. package/src/content/collection-pages.ts +412 -0
  235. package/src/content/content-collections.ts +270 -0
  236. package/src/content/draft-state.ts +4 -3
  237. package/src/content/entry-commands.ts +54 -62
  238. package/src/content/entry-editor.ts +137 -32
  239. package/src/content/entry-fields.ts +25 -8
  240. package/src/content/entry-inspector.ts +225 -0
  241. package/src/content/entry-model.ts +38 -15
  242. package/src/content/entry-open.ts +80 -0
  243. package/src/content/entry-summaries.ts +440 -0
  244. package/src/content/file-record-ids.ts +80 -0
  245. package/src/content/file-records.ts +125 -0
  246. package/src/content/page-summaries.ts +129 -0
  247. package/src/content/record-entry.ts +201 -0
  248. package/src/content/writing-banner.ts +177 -0
  249. package/src/create/add-new-commands.ts +185 -0
  250. package/src/create/add-new-flow.ts +1116 -0
  251. package/src/create/add-new.ts +1014 -0
  252. package/src/create/element-name.ts +121 -0
  253. package/src/editor/canvas-context-menu.ts +1 -2
  254. package/src/editor/canvas-slash-bridge.ts +3 -6
  255. package/src/editor/content-slice.ts +16 -14
  256. package/src/editor/context-menu.ts +35 -22
  257. package/src/editor/convert-targets.ts +30 -35
  258. package/src/editor/convert-to-component.ts +78 -48
  259. package/src/editor/convert-to-repeater.ts +34 -22
  260. package/src/editor/editable-tags.ts +17 -2
  261. package/src/editor/file-drop-action.ts +29 -22
  262. package/src/editor/inline-edit-apply.ts +79 -17
  263. package/src/editor/inline-edit.ts +76 -50
  264. package/src/editor/inline-format.ts +59 -56
  265. package/src/editor/inline-link.ts +40 -15
  266. package/src/editor/insert-component.ts +91 -0
  267. package/src/editor/insert-zone-action.ts +14 -5
  268. package/src/editor/merge-tags.ts +58 -19
  269. package/src/editor/repeater-scope.ts +39 -28
  270. package/src/editor/shortcuts.ts +76 -42
  271. package/src/editor/slash-menu.ts +52 -14
  272. package/src/files/asset-versions.ts +4 -4
  273. package/src/files/components.ts +89 -20
  274. package/src/files/elements.ts +5 -6
  275. package/src/files/file-ops.ts +92 -41
  276. package/src/files/files.ts +248 -239
  277. package/src/files/fs-events.ts +18 -7
  278. package/src/files/media-meta.ts +97 -2
  279. package/src/files/media-paths.ts +3 -0
  280. package/src/files/media-types.ts +55 -0
  281. package/src/files/media-upload.ts +209 -52
  282. package/src/files/new-file-name.ts +156 -0
  283. package/src/files/serialize-document.ts +15 -5
  284. package/src/format/constraints.ts +1 -1
  285. package/src/format/convert-file.ts +27 -13
  286. package/src/format/format-choices.ts +2 -1
  287. package/src/format/format-host.ts +91 -50
  288. package/src/github/github-auth-status.ts +27 -3
  289. package/src/github/github-auth.ts +21 -11
  290. package/src/github/github-publish.ts +28 -23
  291. package/src/grid/cell-editors.ts +46 -31
  292. package/src/grid/cell-popovers.ts +5 -3
  293. package/src/grid/edit-buffer.ts +10 -9
  294. package/src/grid/grid-controller.ts +25 -23
  295. package/src/grid/grid-layout.ts +21 -5
  296. package/src/grid/grid-open.ts +3 -33
  297. package/src/grid/grid-panel.ts +65 -6
  298. package/src/grid/grid-reveal.ts +34 -0
  299. package/src/grid/grid-source.ts +9 -31
  300. package/src/grid/grid-view.ts +45 -23
  301. package/src/grid/redirects-grid.ts +14 -5
  302. package/src/grid/redirects.ts +16 -14
  303. package/src/grid/schema-columns.ts +25 -19
  304. package/src/grid/sources/connector-source.ts +47 -20
  305. package/src/grid/sources/content-source.ts +100 -31
  306. package/src/grid/sources/csv-file-source.ts +2 -2
  307. package/src/grid/tabulator-tables.d.ts +61 -34
  308. package/src/hosting/document.ts +2 -2
  309. package/src/hosting/stage.ts +7 -7
  310. package/src/i18n/i18n-commands.ts +3 -3
  311. package/src/media/media-commands.ts +181 -0
  312. package/src/media/media-library-model.ts +232 -0
  313. package/src/media/media-library.ts +1283 -0
  314. package/src/media/media-pane.ts +51 -20
  315. package/src/new-project/add-repo-modal.ts +20 -19
  316. package/src/new-project/import-tab.ts +10 -14
  317. package/src/new-project/location-fields.ts +2 -1
  318. package/src/new-project/new-project-modal.ts +12 -9
  319. package/src/packages/jxsuite-update.ts +4 -3
  320. package/src/packages/pull-package-sync.ts +26 -25
  321. package/src/page-params.ts +97 -68
  322. package/src/panels/activity-panel.ts +38 -14
  323. package/src/panels/ai-chat/attached-context.ts +13 -7
  324. package/src/panels/ai-chat/chat-markdown.ts +8 -8
  325. package/src/panels/ai-chat/chat-view.ts +80 -73
  326. package/src/panels/ai-chat/composer.ts +30 -33
  327. package/src/panels/ai-chat/sessions-view.ts +1 -2
  328. package/src/panels/ai-panel.ts +23 -20
  329. package/src/panels/block-action-bar.ts +57 -46
  330. package/src/panels/bottom-dock.ts +5 -3
  331. package/src/panels/canvas-dnd-bridge.ts +36 -26
  332. package/src/panels/chat-panel.ts +6 -6
  333. package/src/panels/collections-panel.ts +306 -0
  334. package/src/panels/component-preview.ts +35 -13
  335. package/src/panels/data-explorer.ts +63 -26
  336. package/src/panels/data-grid.ts +18 -11
  337. package/src/panels/dnd.ts +115 -138
  338. package/src/panels/editors.ts +52 -21
  339. package/src/panels/elements-panel.ts +19 -5
  340. package/src/panels/empty-state.ts +2 -2
  341. package/src/panels/events-panel.ts +84 -69
  342. package/src/panels/formula-workspace.ts +78 -54
  343. package/src/panels/frontmatter-fields.ts +33 -28
  344. package/src/panels/git-diff-open.ts +10 -6
  345. package/src/panels/head-panel.ts +488 -202
  346. package/src/panels/i18n-panel.ts +20 -12
  347. package/src/panels/imports-panel.ts +25 -47
  348. package/src/panels/jump-bar.ts +75 -31
  349. package/src/panels/layers-panel.ts +130 -101
  350. package/src/panels/left-panel.ts +25 -11
  351. package/src/panels/navigator-panels.ts +23 -11
  352. package/src/panels/pane-context.ts +140 -49
  353. package/src/panels/pane-grid.ts +55 -26
  354. package/src/panels/panel-registry.ts +36 -46
  355. package/src/panels/properties-panel.ts +182 -124
  356. package/src/panels/quick-search.ts +53 -31
  357. package/src/panels/right-panel.ts +201 -45
  358. package/src/panels/seo-modal.ts +54 -125
  359. package/src/panels/settings-menu.ts +63 -61
  360. package/src/panels/settings-pane.ts +268 -162
  361. package/src/panels/signals-panel.ts +156 -135
  362. package/src/panels/site-model.ts +367 -0
  363. package/src/panels/site-panel.ts +638 -0
  364. package/src/panels/statement-editor.ts +230 -140
  365. package/src/panels/style-panel.ts +253 -206
  366. package/src/panels/style-utils.ts +114 -51
  367. package/src/panels/stylebook-doc.ts +195 -60
  368. package/src/panels/stylebook-layers-panel.ts +48 -89
  369. package/src/panels/stylebook-panel.ts +60 -27
  370. package/src/panels/styles-panel.ts +327 -0
  371. package/src/panels/tab-drop.ts +27 -11
  372. package/src/panels/tab-strip.ts +143 -49
  373. package/src/platform-errors.ts +57 -43
  374. package/src/platform.ts +59 -31
  375. package/src/platforms/cloud.ts +373 -176
  376. package/src/platforms/default-platform.ts +14 -8
  377. package/src/platforms/devserver.ts +180 -142
  378. package/src/platforms/read-batcher.ts +16 -8
  379. package/src/project-list.ts +2 -1
  380. package/src/publish/deploy-checklist.ts +20 -9
  381. package/src/publish/pages-service.ts +66 -27
  382. package/src/publish/publish-changes.ts +491 -0
  383. package/src/publish/publish-commands.ts +88 -22
  384. package/src/publish/publish-ids.ts +49 -0
  385. package/src/publish/publish-panel.ts +10 -6
  386. package/src/publish/publish-quick.ts +148 -0
  387. package/src/publish/publish-workspace.ts +926 -0
  388. package/src/publish/source-control.ts +907 -0
  389. package/src/recent-projects.ts +15 -8
  390. package/src/resize-edges.ts +26 -36
  391. package/src/services/a11y-report.ts +26 -19
  392. package/src/services/agent-seed.ts +23 -11
  393. package/src/services/ai-ask.ts +9 -12
  394. package/src/services/ai-command-tools.ts +68 -62
  395. package/src/services/ai-import-tools.ts +80 -67
  396. package/src/services/ai-models.ts +17 -13
  397. package/src/services/ai-project-tools.ts +68 -32
  398. package/src/services/ai-session-store.ts +19 -10
  399. package/src/services/ai-system-prompt.ts +46 -20
  400. package/src/services/ai-tools.ts +71 -27
  401. package/src/services/ai-write-report.ts +20 -12
  402. package/src/services/ai-writes.ts +4 -4
  403. package/src/services/automation.ts +74 -51
  404. package/src/services/cem-export.ts +149 -58
  405. package/src/services/cf-settings.ts +4 -4
  406. package/src/services/clock.ts +6 -1
  407. package/src/services/code-services.ts +37 -31
  408. package/src/services/connection.ts +2 -2
  409. package/src/services/context-manager.ts +14 -10
  410. package/src/services/context-resolver.ts +20 -8
  411. package/src/services/data-service.ts +19 -15
  412. package/src/services/directory-picker.ts +20 -14
  413. package/src/services/document-assistant.ts +39 -19
  414. package/src/services/gated-registry.ts +10 -6
  415. package/src/services/harness/chat-reducer.ts +23 -1
  416. package/src/services/import-client.ts +91 -38
  417. package/src/services/import-seed.ts +8 -2
  418. package/src/services/jx-validate.ts +28 -31
  419. package/src/services/live-preview.ts +0 -0
  420. package/src/services/live-surfaces.ts +6 -3
  421. package/src/services/model-uri.ts +10 -2
  422. package/src/services/module-preloads.ts +12 -8
  423. package/src/services/monaco-buffer.ts +43 -24
  424. package/src/services/monaco-lazy.ts +7 -8
  425. package/src/services/monaco-setup.ts +23 -16
  426. package/src/services/notify.ts +44 -17
  427. package/src/services/popover-report.ts +25 -10
  428. package/src/services/preview-eval.ts +20 -8
  429. package/src/services/profile.ts +13 -6
  430. package/src/services/project-path.ts +13 -10
  431. package/src/services/references.ts +0 -0
  432. package/src/services/render-critic.ts +29 -9
  433. package/src/services/settings/definitions.ts +25 -14
  434. package/src/services/settings/kernel.ts +13 -4
  435. package/src/services/settings/write-queue.ts +9 -9
  436. package/src/services/token-lint.ts +12 -10
  437. package/src/services/tool-executor.ts +17 -5
  438. package/src/services/tool-outcomes.ts +44 -24
  439. package/src/services/trusted-types.ts +24 -7
  440. package/src/settings/contexts-section.ts +11 -8
  441. package/src/settings/contributed-section.ts +128 -70
  442. package/src/settings/css-vars-editor.ts +119 -32
  443. package/src/settings/defs-editor.ts +38 -35
  444. package/src/settings/developer-panels.ts +43 -0
  445. package/src/settings/extension-rows.ts +16 -8
  446. package/src/settings/extension-sections.ts +42 -14
  447. package/src/settings/extensions-section.ts +4 -1
  448. package/src/settings/general-settings.ts +101 -28
  449. package/src/settings/locales-section.ts +20 -12
  450. package/src/settings/preferences-dialog.ts +17 -7
  451. package/src/settings/preferences-keymap.ts +7 -5
  452. package/src/settings/preferences-sections.ts +11 -5
  453. package/src/settings/project-sections.ts +28 -11
  454. package/src/settings/schema-field-ui.ts +12 -1
  455. package/src/settings/section-registry.ts +116 -11
  456. package/src/settings/settings-dialog.ts +192 -0
  457. package/src/settings/settings-document.ts +186 -166
  458. package/src/shell/tree.ts +6 -5
  459. package/src/shell.ts +536 -477
  460. package/src/site-context.ts +101 -32
  461. package/src/state.ts +68 -57
  462. package/src/store.ts +54 -34
  463. package/src/studio.ts +219 -116
  464. package/src/style/live-preview.ts +1 -1
  465. package/src/style/project-styles.ts +40 -7
  466. package/src/style/stylebook-specimens.ts +89 -0
  467. package/src/style/stylebook-target.ts +26 -0
  468. package/src/style/tag-inheritance.ts +105 -0
  469. package/src/style/token-ref.ts +5 -4
  470. package/src/style/variables-focus.ts +61 -0
  471. package/src/style/variables-view.ts +235 -0
  472. package/src/surfaces/about.ts +18 -19
  473. package/src/surfaces/add-new.json +1482 -0
  474. package/src/surfaces/add-new.ts +325 -0
  475. package/src/surfaces/add-repo.ts +17 -19
  476. package/src/surfaces/ai-chat.ts +33 -38
  477. package/src/surfaces/ai-credentials-form.ts +6 -16
  478. package/src/surfaces/ai-managed-connect.ts +3 -4
  479. package/src/surfaces/ai-model-picker.ts +3 -5
  480. package/src/surfaces/block-action-bar.ts +22 -11
  481. package/src/surfaces/boot-failure.json +4 -3
  482. package/src/surfaces/boot-failure.ts +4 -5
  483. package/src/surfaces/bottom-dock.json +1 -1
  484. package/src/surfaces/bottom-dock.ts +9 -18
  485. package/src/surfaces/canvas-stage.json +30 -19
  486. package/src/surfaces/canvas-stage.ts +17 -16
  487. package/src/surfaces/cf-account-picker.ts +17 -18
  488. package/src/surfaces/collections-panel.json +615 -0
  489. package/src/surfaces/collections-panel.ts +168 -0
  490. package/src/surfaces/commandbar.json +241 -96
  491. package/src/surfaces/commandbar.ts +145 -105
  492. package/src/surfaces/convert-repeater.ts +17 -19
  493. package/src/surfaces/data-actions.ts +9 -7
  494. package/src/surfaces/dialog.ts +26 -28
  495. package/src/surfaces/diff-toolbar.ts +9 -7
  496. package/src/surfaces/empty-state.json +1 -1
  497. package/src/surfaces/empty-state.ts +7 -10
  498. package/src/surfaces/entry-editor.json +136 -0
  499. package/src/surfaces/entry-editor.ts +35 -11
  500. package/src/surfaces/entry-inspector.json +371 -0
  501. package/src/surfaces/entry-inspector.ts +143 -0
  502. package/src/surfaces/expression-editor.ts +11 -25
  503. package/src/surfaces/files-panel.ts +27 -14
  504. package/src/surfaces/formula-palette.ts +4 -5
  505. package/src/surfaces/github-auth.ts +16 -20
  506. package/src/surfaces/github-publish.ts +17 -22
  507. package/src/surfaces/grid-cell.ts +30 -31
  508. package/src/surfaces/grid-open.ts +10 -14
  509. package/src/surfaces/grid-panel.ts +13 -9
  510. package/src/surfaces/grid-replace.ts +13 -13
  511. package/src/surfaces/grid-views.ts +15 -18
  512. package/src/surfaces/inspector-dock.json +162 -14
  513. package/src/surfaces/inspector-dock.ts +59 -31
  514. package/src/surfaces/jump-bar.ts +5 -6
  515. package/src/surfaces/jxsuite-update.ts +16 -22
  516. package/src/surfaces/library-pane.json +670 -437
  517. package/src/surfaces/library-pane.ts +111 -77
  518. package/src/surfaces/logic-panel.ts +17 -30
  519. package/src/surfaces/logic-workspace.ts +13 -15
  520. package/src/surfaces/media-browser.json +62 -6
  521. package/src/surfaces/media-browser.ts +26 -11
  522. package/src/surfaces/media-field.json +1 -1
  523. package/src/surfaces/media-field.ts +4 -5
  524. package/src/surfaces/media-library.json +1586 -0
  525. package/src/surfaces/media-library.ts +282 -0
  526. package/src/surfaces/media-pane.ts +8 -7
  527. package/src/surfaces/media-pick-dialog.json +71 -0
  528. package/src/surfaces/media-pick-dialog.ts +132 -0
  529. package/src/surfaces/menu.ts +47 -23
  530. package/src/surfaces/navigator-dock.ts +11 -12
  531. package/src/surfaces/new-project.ts +27 -26
  532. package/src/surfaces/pane-context.json +144 -77
  533. package/src/surfaces/pane-context.ts +44 -25
  534. package/src/surfaces/pane-grid.ts +15 -10
  535. package/src/surfaces/panel-activity.ts +5 -6
  536. package/src/surfaces/panel-data.ts +3 -4
  537. package/src/surfaces/panel-deploy-checklist.json +12 -6
  538. package/src/surfaces/panel-deploy-checklist.ts +8 -7
  539. package/src/surfaces/panel-elements.ts +5 -7
  540. package/src/surfaces/panel-i18n.ts +5 -7
  541. package/src/surfaces/panel-imports.ts +6 -13
  542. package/src/surfaces/panel-outline.ts +25 -19
  543. package/src/surfaces/panel-page.json +72 -2
  544. package/src/surfaces/panel-page.ts +49 -25
  545. package/src/surfaces/panel-problems.ts +5 -7
  546. package/src/surfaces/panel-signals.json +1 -1
  547. package/src/surfaces/panel-signals.ts +25 -39
  548. package/src/surfaces/panel-stylebook-layers.json +71 -204
  549. package/src/surfaces/panel-stylebook-layers.ts +5 -29
  550. package/src/surfaces/preferences.json +120 -48
  551. package/src/surfaces/preferences.ts +29 -11
  552. package/src/surfaces/progress-modal.ts +15 -9
  553. package/src/surfaces/properties-panel.json +1 -1
  554. package/src/surfaces/properties-panel.ts +20 -42
  555. package/src/surfaces/publish-quick.json +428 -0
  556. package/src/surfaces/publish-quick.ts +165 -0
  557. package/src/surfaces/publish-workspace.json +2892 -0
  558. package/src/surfaces/publish-workspace.ts +391 -0
  559. package/src/surfaces/publish.ts +18 -18
  560. package/src/surfaces/push-plan.ts +7 -8
  561. package/src/surfaces/rail.json +1 -159
  562. package/src/surfaces/rail.ts +22 -79
  563. package/src/surfaces/reference-field.ts +11 -15
  564. package/src/surfaces/schema-builder.ts +16 -22
  565. package/src/surfaces/schema-form.json +10 -2
  566. package/src/surfaces/schema-form.ts +17 -25
  567. package/src/surfaces/secret-field.ts +9 -6
  568. package/src/surfaces/seo.json +1 -1
  569. package/src/surfaces/seo.ts +21 -15
  570. package/src/surfaces/settings-contexts.ts +9 -7
  571. package/src/surfaces/settings-contributed.json +5 -5
  572. package/src/surfaces/settings-contributed.ts +32 -12
  573. package/src/surfaces/settings-css-vars.json +44 -36
  574. package/src/surfaces/settings-css-vars.ts +82 -16
  575. package/src/surfaces/settings-defs.json +2 -2
  576. package/src/surfaces/settings-defs.ts +17 -21
  577. package/src/surfaces/settings-deploy.json +2 -15
  578. package/src/surfaces/settings-deploy.ts +9 -16
  579. package/src/surfaces/settings-dialog.json +51 -0
  580. package/src/surfaces/settings-dialog.ts +169 -0
  581. package/src/surfaces/settings-extensions.ts +5 -6
  582. package/src/surfaces/settings-head.ts +33 -39
  583. package/src/surfaces/settings-locales.ts +8 -20
  584. package/src/surfaces/settings-overview.json +3 -3
  585. package/src/surfaces/settings-overview.ts +14 -8
  586. package/src/surfaces/settings-packages.ts +8 -7
  587. package/src/surfaces/settings-pane.json +269 -46
  588. package/src/surfaces/settings-pane.ts +88 -36
  589. package/src/surfaces/settings-rawjson.ts +5 -6
  590. package/src/surfaces/shell.json +2 -1
  591. package/src/surfaces/shell.ts +1 -2
  592. package/src/surfaces/site-panel.json +1029 -0
  593. package/src/surfaces/site-panel.ts +233 -0
  594. package/src/surfaces/slash-menu.json +63 -21
  595. package/src/surfaces/slash-menu.ts +42 -9
  596. package/src/surfaces/statements.ts +13 -18
  597. package/src/surfaces/statusbar.ts +56 -29
  598. package/src/surfaces/style-panel.ts +18 -31
  599. package/src/surfaces/stylebook-chrome.ts +3 -5
  600. package/src/surfaces/styles-panel.json +735 -0
  601. package/src/surfaces/styles-panel.ts +195 -0
  602. package/src/surfaces/styles-variables.json +149 -0
  603. package/src/surfaces/styles-variables.ts +145 -0
  604. package/src/surfaces/tab-strip.json +4 -4
  605. package/src/surfaces/tab-strip.ts +14 -13
  606. package/src/surfaces/target-line.ts +6 -7
  607. package/src/surfaces/welcome.ts +6 -8
  608. package/src/surfaces/writing-banner.json +94 -0
  609. package/src/surfaces/writing-banner.ts +80 -0
  610. package/src/tabs/bare-repeaters.ts +101 -0
  611. package/src/tabs/patch-ops.ts +4 -3
  612. package/src/tabs/project-config.ts +32 -21
  613. package/src/tabs/selection.ts +36 -8
  614. package/src/tabs/tab.ts +99 -48
  615. package/src/tabs/transact.ts +98 -53
  616. package/src/types.ts +53 -43
  617. package/src/ui/ai-credentials-form.ts +10 -13
  618. package/src/ui/ai-model-picker.ts +3 -3
  619. package/src/ui/cf-account-picker.ts +7 -9
  620. package/src/ui/color-selector.ts +9 -5
  621. package/src/ui/dynamic-slot.ts +7 -8
  622. package/src/ui/expression-editor.ts +112 -105
  623. package/src/ui/form-controls.ts +104 -56
  624. package/src/ui/formula-catalog.ts +239 -230
  625. package/src/ui/formula-chips.ts +33 -18
  626. package/src/ui/layers.ts +57 -31
  627. package/src/ui/media-picker.ts +300 -47
  628. package/src/ui/popover-surface.ts +20 -12
  629. package/src/ui/progress-modal.ts +13 -8
  630. package/src/ui/regions.ts +14 -12
  631. package/src/ui/schema-form.ts +372 -97
  632. package/src/ui/surface.ts +71 -8
  633. package/src/ui/timing.ts +9 -0
  634. package/src/ui/value-source.ts +44 -31
  635. package/src/ui/virtual-window.ts +29 -3
  636. package/src/utils/base64.ts +6 -4
  637. package/src/utils/edit-display.ts +366 -111
  638. package/src/utils/element-selectors.ts +3 -2
  639. package/src/utils/google-fonts.ts +15 -14
  640. package/src/utils/inherited-style.ts +18 -20
  641. package/src/utils/link-target.ts +1 -1
  642. package/src/utils/local-day.ts +18 -0
  643. package/src/utils/preview-format.ts +25 -3
  644. package/src/utils/strip-events.ts +49 -22
  645. package/src/utils/studio-utils.ts +29 -14
  646. package/src/view.ts +2 -3
  647. package/src/workspace/pane-derive.ts +14 -16
  648. package/src/workspace/session.ts +81 -50
  649. package/src/workspace/tab-workspace.ts +137 -0
  650. package/src/workspace/workspace-back.ts +189 -0
  651. package/src/workspace/workspace-home.ts +133 -0
  652. package/src/workspace/workspace-ids.ts +129 -0
  653. package/src/workspace/workspace-switch.ts +372 -0
  654. package/src/workspace/workspace.ts +165 -47
  655. package/styles/shell-frame.css +30 -7
  656. package/styles/shell-frame.json +15 -3
  657. package/dist/chunks/2020-va2wwra4.js +0 -4
  658. package/dist/chunks/adapter-f93pafd7.js +0 -4
  659. package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
  660. package/dist/chunks/cf-settings-125tdm0w.js +0 -4
  661. package/dist/chunks/color-area-jqhna8zy.js +0 -4
  662. package/dist/chunks/color-field-embq5ctg.js +0 -4
  663. package/dist/chunks/color-fpezvnkt.js +0 -4
  664. package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
  665. package/dist/chunks/combobox-773hdzyj.js +0 -4
  666. package/dist/chunks/components-ax2f1fnn.js +0 -4
  667. package/dist/chunks/content-source-108aqtk1.js +0 -4
  668. package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
  669. package/dist/chunks/dialog-mtm9fq5t.js +0 -4
  670. package/dist/chunks/editor-pfgdmkb0.js +0 -4
  671. package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
  672. package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
  673. package/dist/chunks/file-ops-meej5mqf.js +0 -4
  674. package/dist/chunks/files-44vp8a2s.js +0 -4
  675. package/dist/chunks/format-host-7q1petb9.js +0 -4
  676. package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
  677. package/dist/chunks/git-panel-zngbymvd.js +0 -4
  678. package/dist/chunks/grid-view-sx9vynsp.js +0 -51
  679. package/dist/chunks/icons-p44xhjf0.js +0 -4
  680. package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
  681. package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
  682. package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
  683. package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
  684. package/dist/chunks/index-wkyfjeqz.js +0 -4
  685. package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
  686. package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
  687. package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
  688. package/dist/chunks/layers-xd92fg8d.js +0 -4
  689. package/dist/chunks/listbox-s8fkmnq8.js +0 -4
  690. package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
  691. package/dist/chunks/media-picker-0svzkdyb.js +0 -4
  692. package/dist/chunks/menu-37d07z9m.js +0 -4
  693. package/dist/chunks/menu-5c55ea3d.js +0 -4
  694. package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
  695. package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
  696. package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
  697. package/dist/chunks/notify-0xgtn8q1.js +0 -4
  698. package/dist/chunks/number-field-gw7sq8rn.js +0 -4
  699. package/dist/chunks/parse-897fvqah.js +0 -4
  700. package/dist/chunks/platform-v1qctbe6.js +0 -4
  701. package/dist/chunks/popover-8htra4er.js +0 -4
  702. package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
  703. package/dist/chunks/quick-search-a54e6t5n.js +0 -4
  704. package/dist/chunks/references-gmqp82fs.js +0 -4
  705. package/dist/chunks/right-panel-v7t9awbk.js +0 -4
  706. package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
  707. package/dist/chunks/select-n3v7gwas.js +0 -4
  708. package/dist/chunks/split-pff8f3ze.js +0 -4
  709. package/dist/chunks/studio-0bhx5hz6.js +0 -5
  710. package/dist/chunks/studio-0k1ddnyy.js +0 -6
  711. package/dist/chunks/studio-1b04pd0j.js +0 -64
  712. package/dist/chunks/studio-4dwbj6gb.js +0 -5
  713. package/dist/chunks/studio-4tanh828.js +0 -5
  714. package/dist/chunks/studio-55h4mstj.js +0 -4
  715. package/dist/chunks/studio-5tnvjkz4.js +0 -5
  716. package/dist/chunks/studio-60dqgb0c.js +0 -5
  717. package/dist/chunks/studio-61dp09qg.js +0 -9
  718. package/dist/chunks/studio-63epcrj2.js +0 -5
  719. package/dist/chunks/studio-74k29dy9.js +0 -5
  720. package/dist/chunks/studio-7vg6jcd3.js +0 -5
  721. package/dist/chunks/studio-7zx31knw.js +0 -9
  722. package/dist/chunks/studio-8bxk97km.js +0 -5
  723. package/dist/chunks/studio-933e30n4.js +0 -5
  724. package/dist/chunks/studio-98wnwhbg.js +0 -5
  725. package/dist/chunks/studio-9mccjwjh.js +0 -14
  726. package/dist/chunks/studio-a2ke1e4t.js +0 -5
  727. package/dist/chunks/studio-e3a2a6v3.js +0 -4
  728. package/dist/chunks/studio-e81q1vb9.js +0 -5
  729. package/dist/chunks/studio-epgrmqqm.js +0 -5
  730. package/dist/chunks/studio-ery42sqr.js +0 -4
  731. package/dist/chunks/studio-g1shz58g.js +0 -5
  732. package/dist/chunks/studio-gf0fz03c.js +0 -5
  733. package/dist/chunks/studio-gjtpe62q.js +0 -6
  734. package/dist/chunks/studio-gkskhg7m.js +0 -5
  735. package/dist/chunks/studio-gx4dnjzd.js +0 -5
  736. package/dist/chunks/studio-j03zga3y.js +0 -9
  737. package/dist/chunks/studio-jhpxeckz.js +0 -5
  738. package/dist/chunks/studio-k01r7ykp.js +0 -5
  739. package/dist/chunks/studio-kk7h30ne.js +0 -7
  740. package/dist/chunks/studio-kt1zqney.js +0 -5
  741. package/dist/chunks/studio-m3cwhvye.js +0 -5
  742. package/dist/chunks/studio-mcayt6hz.js +0 -5
  743. package/dist/chunks/studio-myjcghv3.js +0 -5
  744. package/dist/chunks/studio-n8bxwc3y.js +0 -4
  745. package/dist/chunks/studio-ngm8gvpb.js +0 -5
  746. package/dist/chunks/studio-nj5a01jy.js +0 -928
  747. package/dist/chunks/studio-pcgz8heb.js +0 -5
  748. package/dist/chunks/studio-qcsq0t15.js +0 -5
  749. package/dist/chunks/studio-qkstvve9.js +0 -5
  750. package/dist/chunks/studio-qv1pwd3c.js +0 -5
  751. package/dist/chunks/studio-rc6dvxjb.js +0 -7
  752. package/dist/chunks/studio-s8dmmz66.js +0 -5
  753. package/dist/chunks/studio-sp5xzbj4.js +0 -6
  754. package/dist/chunks/studio-szsjbj0g.js +0 -5
  755. package/dist/chunks/studio-t1xzawhr.js +0 -16
  756. package/dist/chunks/studio-tdcprbqb.js +0 -5
  757. package/dist/chunks/studio-vrmcjf9g.js +0 -7
  758. package/dist/chunks/studio-vyc0b4he.js +0 -10
  759. package/dist/chunks/studio-w0cgf6jg.js +0 -5
  760. package/dist/chunks/studio-w3hskzqk.js +0 -5
  761. package/dist/chunks/studio-xgrgcdyh.js +0 -9
  762. package/dist/chunks/studio-xz2yxfcb.js +0 -5
  763. package/dist/chunks/studio-y6n42tgs.js +0 -5
  764. package/dist/chunks/studio-yb560vxr.js +0 -5
  765. package/dist/chunks/studio-yn9f8vtx.js +0 -5
  766. package/dist/chunks/studio-yw05w8f0.js +0 -7
  767. package/dist/chunks/studio-z16sgavc.js +0 -5
  768. package/dist/chunks/studio-zey7zsdw.js +0 -12
  769. package/dist/chunks/studio-zyqn40w4.js +0 -5
  770. package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
  771. package/dist/chunks/tabs-jwthg40w.js +0 -4
  772. package/dist/chunks/textfield-spy3hc77.js +0 -4
  773. package/dist/chunks/toast-4d35zd64.js +0 -4
  774. package/dist/chunks/toast-host-8sjmfed3.js +0 -4
  775. package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
  776. package/dist/chunks/tree-h19v1jfz.js +0 -4
  777. package/dist/chunks/tsMode-2frah6h1.js +0 -14
  778. package/dist/chunks/workspace-zt81g1ms.js +0 -4
  779. package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
  780. package/src/panels/frontmatter-panel.ts +0 -701
  781. package/src/panels/git-panel.ts +0 -1120
  782. package/src/surfaces/doc-header.json +0 -776
  783. package/src/surfaces/doc-header.ts +0 -231
  784. package/src/surfaces/git-panel.json +0 -1880
  785. package/src/surfaces/git-panel.ts +0 -272
@@ -26,23 +26,43 @@
26
26
  * @docs studio/ai/chat
27
27
  */
28
28
 
29
- import { isSealContent } from "@jxsuite/ai/messages";
29
+ import { SEAL_RELOADED, isSealContent } from "@jxsuite/ai/messages";
30
30
  import type { ToolResult } from "@jxsuite/ai/tools";
31
+ import { isBoolean, isNonNullObject, isString } from "@jxsuite/schema/guards";
31
32
  import type { PersistedMessage } from "./ai-session-store";
32
- import { UNANSWERED_TOOL_RESULT } from "./context-manager";
33
33
 
34
34
  /** The tool that suspends a turn on the author (services/ai-ask.ts). */
35
- const ASK_TOOL = "ask_user";
35
+ export const ASK_TOOL = "ask_user";
36
36
 
37
- /** The outcome of an ordinary call that never ran to completion — the seal's own words. */
38
- const NEVER_COMPLETED = JSON.parse(UNANSWERED_TOOL_RESULT) as ToolResult;
37
+ /**
38
+ * The outcome of an ordinary call that never ran to completion — the seal's own words: the object
39
+ * `context-manager.ts`'s `UNANSWERED_TOOL_RESULT` serializes, built from the same sentence.
40
+ */
41
+ const NEVER_COMPLETED: ToolResult = { success: false, error: SEAL_RELOADED };
39
42
 
40
- /** A tool-call record as persisted: `id` and `name` are what pairing and the chip read. */
43
+ /**
44
+ * A tool-call record as persisted: `id` and `name` are what pairing and the chip read. Every member
45
+ * is optional and unchecked, because the records come back out of storage; each is narrowed where
46
+ * it is read.
47
+ */
41
48
  interface PersistedToolCall {
42
49
  id?: unknown;
43
50
  name?: unknown;
44
51
  result?: unknown;
45
- [key: string]: unknown;
52
+ }
53
+
54
+ /**
55
+ * Whether a persisted `toolCalls` entry is a record at all. Any object qualifies — every member of
56
+ * {@link PersistedToolCall} is optional — and a primitive (a corrupt or foreign payload) is passed
57
+ * through untouched by both directions.
58
+ */
59
+ function isToolCallRecord(value: unknown): value is PersistedToolCall {
60
+ return isNonNullObject(value);
61
+ }
62
+
63
+ /** Whether a parsed tool message is a `ToolResult`: an object whose `success` is a boolean. */
64
+ function isToolResult(value: unknown): value is ToolResult {
65
+ return isNonNullObject(value) && "success" in value && isBoolean(value.success);
46
66
  }
47
67
 
48
68
  /**
@@ -61,28 +81,29 @@ export function stripToolResults(messages: readonly PersistedMessage[]): Persist
61
81
  return {
62
82
  ...message,
63
83
  toolCalls: message.toolCalls.map((call) => {
64
- if (!call || typeof call !== "object") {
84
+ if (!isToolCallRecord(call)) {
65
85
  return call;
66
86
  }
67
- const { result: _result, ...rest } = call as PersistedToolCall;
87
+ const { result: _result, ...rest } = call;
68
88
  return rest;
69
89
  }),
70
90
  };
71
91
  });
72
92
  }
73
93
 
74
- /** A tool message's content as a `ToolResult`, or null when it is not one. */
75
- function parseToolResult(content: unknown): ToolResult | null {
76
- if (typeof content !== "string") {
94
+ /**
95
+ * A tool message's content as a `ToolResult`, or null when it is not one.
96
+ *
97
+ * The content is re-checked as a string although {@link PersistedMessage} declares one: the message
98
+ * came back out of storage, where a corrupt or foreign payload can hold anything.
99
+ */
100
+ function parseToolResult(content: string): ToolResult | null {
101
+ if (!isString(content)) {
77
102
  return null;
78
103
  }
79
104
  try {
80
- const parsed = JSON.parse(content) as unknown;
81
- return parsed &&
82
- typeof parsed === "object" &&
83
- typeof (parsed as ToolResult).success === "boolean"
84
- ? (parsed as ToolResult)
85
- : null;
105
+ const parsed: unknown = JSON.parse(content);
106
+ return isToolResult(parsed) ? parsed : null;
86
107
  } catch {
87
108
  return null;
88
109
  }
@@ -114,7 +135,7 @@ export function backfillToolResults(messages: readonly PersistedMessage[]): Pers
114
135
  break;
115
136
  }
116
137
  const result = parseToolResult(reply.content);
117
- if (typeof reply.toolCallId === "string" && result && !replies.has(reply.toolCallId)) {
138
+ if (isString(reply.toolCallId) && result && !replies.has(reply.toolCallId)) {
118
139
  replies.set(reply.toolCallId, result);
119
140
  if (isSealContent(reply.content)) {
120
141
  sealed.add(reply.toolCallId);
@@ -123,12 +144,11 @@ export function backfillToolResults(messages: readonly PersistedMessage[]): Pers
123
144
  }
124
145
  return {
125
146
  ...message,
126
- toolCalls: message.toolCalls.map((call) => {
127
- if (!call || typeof call !== "object") {
128
- return call;
147
+ toolCalls: message.toolCalls.map((record) => {
148
+ if (!isToolCallRecord(record)) {
149
+ return record;
129
150
  }
130
- const record = call as PersistedToolCall;
131
- const id = typeof record.id === "string" ? record.id : undefined;
151
+ const id = isString(record.id) ? record.id : undefined;
132
152
  const answered = id === undefined ? undefined : replies.get(id);
133
153
  if (record.name === ASK_TOOL) {
134
154
  /* A question's only outcomes are an answer or none: a seal is not an answer, and a
@@ -22,6 +22,20 @@
22
22
  * @docs studio/interface/problems-and-progress
23
23
  */
24
24
 
25
+ /**
26
+ * A W3C `TrustedHTML`: opaque to script, accepted by an injection sink, and stringifying to the
27
+ * markup it wraps. This TypeScript's `lib.dom` does not declare it, so it is declared here with the
28
+ * one member a reader can rely on.
29
+ */
30
+ export interface TrustedHtml {
31
+ toString: () => string;
32
+ }
33
+
34
+ /** The policy object `createPolicy` answers with, narrowed to the one factory the shell calls. */
35
+ export interface StudioPolicy {
36
+ createHTML: (input: string) => TrustedHtml;
37
+ }
38
+
25
39
  /** The subset of the Trusted Types API this module uses — typed here so no DOM lib is required. */
26
40
  interface TrustedTypesApi {
27
41
  createPolicy: (
@@ -31,7 +45,7 @@ interface TrustedTypesApi {
31
45
  createScript?: (input: string) => string;
32
46
  createScriptURL?: (input: string) => string;
33
47
  },
34
- ) => { createHTML: (input: string) => unknown };
48
+ ) => StudioPolicy;
35
49
  }
36
50
 
37
51
  /** The policy name, which a CSP `trusted-types` directive would have to allow. */
@@ -75,18 +89,21 @@ export function assertSanitized(value: string): string {
75
89
  }
76
90
 
77
91
  /** Created once. A second `createPolicy` with the same name throws when policies are restricted. */
78
- let policy: { createHTML: (input: string) => unknown } | null = null;
92
+ let policy: StudioPolicy | null = null;
79
93
 
80
94
  /**
81
95
  * The shell's Trusted Types policy, or null where the API does not exist.
82
96
  *
83
- * @returns {{ createHTML: (input: string) => unknown } | null}
97
+ * @returns {StudioPolicy | null}
84
98
  */
85
- export function studioPolicy(): { createHTML: (input: string) => unknown } | null {
99
+ export function studioPolicy(): StudioPolicy | null {
86
100
  if (policy) {
87
101
  return policy;
88
102
  }
89
- const api = (globalThis as unknown as { trustedTypes?: TrustedTypesApi }).trustedTypes;
103
+ /* SAFETY: `trustedTypes` is the member Trusted Types adds to the global scope, which this
104
+ `lib.dom` predates; the intersection only names it, typed as possibly absent, and an absent
105
+ member (a browser without Trusted Types, and the tests) is the `undefined` handled below. */
106
+ const api = (globalThis as typeof globalThis & { trustedTypes?: TrustedTypesApi }).trustedTypes;
90
107
  if (!api) {
91
108
  return null;
92
109
  }
@@ -110,9 +127,9 @@ export function studioPolicy(): { createHTML: (input: string) => unknown } | nul
110
127
  * guard that only fires under Trusted Types would be a guard that never fires in the tests.
111
128
  *
112
129
  * @param {string} value Markup from `markdownToHtml`.
113
- * @returns {unknown} A `TrustedHTML`, or the asserted string.
130
+ * @returns {TrustedHtml | string} A `TrustedHTML`, or the asserted string.
114
131
  */
115
- export function trustedHtml(value: string): unknown {
132
+ export function trustedHtml(value: string): TrustedHtml | string {
116
133
  const active = studioPolicy();
117
134
  return active ? active.createHTML(value) : assertSanitized(value);
118
135
  }
@@ -76,6 +76,12 @@ export interface ContextEntry {
76
76
  kind: ContextKind;
77
77
  }
78
78
 
79
+ /** A `$media` map, split: the base width, and every other entry classified. */
80
+ export interface ContextSplit {
81
+ base: string;
82
+ entries: ContextEntry[];
83
+ }
84
+
79
85
  /**
80
86
  * Which kind of context an entry is.
81
87
  *
@@ -98,12 +104,9 @@ export function contextKindOf(query: string): ContextKind {
98
104
  * Split a `$media` map into the base width and the three context groups.
99
105
  *
100
106
  * @param {Record<string, string> | undefined} media
101
- * @returns {{ base: string; entries: ContextEntry[] }}
107
+ * @returns {ContextSplit}
102
108
  */
103
- export function splitContexts(media?: Record<string, string> | undefined): {
104
- base: string;
105
- entries: ContextEntry[];
106
- } {
109
+ export function splitContexts(media?: Record<string, string> | undefined): ContextSplit {
107
110
  const source = media ?? {};
108
111
  const entries: ContextEntry[] = [];
109
112
  for (const [key, raw] of Object.entries(source)) {
@@ -232,11 +235,11 @@ export function contextsError(container: HTMLElement): { target: string; message
232
235
  * a projection, which makes reading through to the store the thing that keeps them honest.
233
236
  */
234
237
  function currentConfig(): ProjectConfig {
235
- return (projectState?.projectConfig || {}) as ProjectConfig;
238
+ return projectState?.projectConfig ?? {};
236
239
  }
237
240
 
238
241
  function currentMedia(): Record<string, string> {
239
- return (currentConfig().$media || {}) as Record<string, string>;
242
+ return currentConfig().$media ?? {};
240
243
  }
241
244
 
242
245
  // ─── Writing ──────────────────────────────────────────────────────────────────
@@ -271,7 +274,7 @@ async function persistMedia(
271
274
  target: ErrorTarget,
272
275
  ): Promise<void> {
273
276
  const config = currentConfig();
274
- const candidate = { ...config, $media: next } as unknown;
277
+ const candidate: ProjectConfig = { ...config, $media: next };
275
278
  let schemaErrors: string[] = [];
276
279
  let inherited: string[] = [];
277
280
  try {
@@ -39,6 +39,7 @@
39
39
  * text. It is one value now, and the field shows it.
40
40
  */
41
41
 
42
+ import { isFunction, isJsonObject, isNonNullObject, isString } from "@jxsuite/schema/guards";
42
43
  import { errorMessage } from "@jxsuite/schema/parse";
43
44
  import { getPlatform } from "../platform";
44
45
  import { commitProjectConfig } from "../tabs/project-config";
@@ -48,12 +49,12 @@ import { resolveContextPointer } from "../services/context-resolver";
48
49
  import { deriveSecretEnvName } from "../services/data-service";
49
50
  import { validateProjectConfig } from "../services/jx-validate";
50
51
  import { notify } from "../services/notify";
51
- import { paneRegion } from "../ui/regions";
52
- import { paneOfContainer } from "../canvas/canvas-surface";
52
+ import { SETTINGS_DIALOG_REGION } from "../surfaces/settings-dialog";
53
53
  import { mountContributedSurface } from "../surfaces/settings-contributed";
54
54
 
55
55
  import type { JsonSchema, SchemaFormContext } from "../ui/schema-form";
56
- import type { ProjectConfig } from "@jxsuite/schema/types";
56
+ import type { JsonObject, JsonValue } from "@jxsuite/schema/types";
57
+ import type { ResolveContextOptions } from "../services/context-resolver";
57
58
  import type {
58
59
  ContributedActions,
59
60
  ContributedSurfaceHandle,
@@ -74,7 +75,13 @@ export interface SettingsContribution {
74
75
  entry?:
75
76
  | {
76
77
  ui?: Record<string, { control?: string; enum?: unknown }> | undefined;
77
- newEntry?: Record<string, unknown> | undefined;
78
+ newEntry?: JsonObject | undefined;
79
+ /**
80
+ * What ONE entry of a map section is called, singular and lowercase ("content type",
81
+ * "table"), so the column offers "New content type" rather than "New Entry", a word that
82
+ * means a collection's item everywhere else in Studio. Defaults to "entry".
83
+ */
84
+ noun?: string | undefined;
78
85
  }
79
86
  | undefined;
80
87
  };
@@ -139,13 +146,8 @@ export function resetContributedSectionState(): void {
139
146
  * such entry, so the caller's refusal can name both sides.
140
147
  */
141
148
  export function selectContributedEntry(sectionKey: string, entryKey: string): string[] | null {
142
- const section = (projectState?.projectConfig as Record<string, unknown> | null | undefined)?.[
143
- sectionKey
144
- ];
145
- const entries =
146
- section && typeof section === "object" && !Array.isArray(section)
147
- ? (section as Record<string, unknown>)
148
- : {};
149
+ const section = projectState?.projectConfig?.[sectionKey];
150
+ const entries = isJsonObject(section) ? section : {};
149
151
  if (!Object.hasOwn(entries, entryKey)) {
150
152
  return Object.keys(entries);
151
153
  }
@@ -170,6 +172,14 @@ export function resetContributedDiagnostics(): void {
170
172
  diagnostics.clear();
171
173
  }
172
174
 
175
+ /** {@link routeDiagnostics}' answer: per-field messages, and the ones about the record itself. */
176
+ export interface RoutedDiagnostics {
177
+ /** The first message for each property one level under the base, keyed by property name. */
178
+ fields: Record<string, string>;
179
+ /** Messages whose pointer is the base itself, for the section line. */
180
+ section: string[];
181
+ }
182
+
173
183
  /**
174
184
  * Route `jx-validate` messages ("/search/index: must be string") to the field they are about.
175
185
  *
@@ -182,10 +192,7 @@ export function resetContributedDiagnostics(): void {
182
192
  * @param {string[]} messages
183
193
  * @returns
184
194
  */
185
- export function routeDiagnostics(
186
- base: string,
187
- messages: string[],
188
- ): { fields: Record<string, string>; section: string[] } {
195
+ export function routeDiagnostics(base: string, messages: string[]): RoutedDiagnostics {
189
196
  const fields: Record<string, string> = {};
190
197
  const section: string[] = [];
191
198
  for (const message of messages) {
@@ -230,7 +237,12 @@ export function routeDiagnostics(
230
237
  * @param {() => void} rerender
231
238
  */
232
239
  async function saveProjectConfig(base: string, rerender: () => void) {
233
- const config = (projectState as { projectConfig: ProjectConfig }).projectConfig;
240
+ /* Every caller reached this through `sectionValue`, which returns null without a config, so a
241
+ project is open here; the guard only states that to the compiler. */
242
+ const config = projectState?.projectConfig;
243
+ if (!config) {
244
+ return;
245
+ }
234
246
 
235
247
  const commit = await commitProjectConfig();
236
248
  if (!commit.ok) {
@@ -258,7 +270,7 @@ async function saveProjectConfig(base: string, rerender: () => void) {
258
270
  // ─── Helpers ──────────────────────────────────────────────────────────────────
259
271
 
260
272
  /** Apply a schema-form patch onto a record in place; `undefined` values unset the key. */
261
- function applyPatch(target: Record<string, unknown>, patch: Record<string, unknown>) {
273
+ function applyPatch<V>(target: Record<string, V>, patch: Record<string, V | undefined>) {
262
274
  for (const [key, value] of Object.entries(patch)) {
263
275
  if (value === undefined) {
264
276
  delete target[key];
@@ -277,30 +289,30 @@ function slugify(name: string): string {
277
289
  }
278
290
 
279
291
  /** Instantiate a newEntry template, substituting `${key}` in every string value. */
280
- function instantiateNewEntry(
281
- template: Record<string, unknown> | undefined,
282
- key: string,
283
- ): Record<string, unknown> {
292
+ function instantiateNewEntry(template: JsonObject | undefined, key: string): JsonObject {
284
293
  if (!template) {
285
294
  return {};
286
295
  }
287
- const substitute = (value: unknown): unknown => {
288
- if (typeof value === "string") {
296
+ const substituteObject = (value: JsonObject): JsonObject => {
297
+ const out: JsonObject = {};
298
+ for (const [k, v] of Object.entries(value)) {
299
+ out[k] = substitute(v);
300
+ }
301
+ return out;
302
+ };
303
+ const substitute = (value: JsonValue): JsonValue => {
304
+ if (isString(value)) {
289
305
  return value.replaceAll("${key}", key);
290
306
  }
291
307
  if (Array.isArray(value)) {
292
308
  return value.map((item) => substitute(item));
293
309
  }
294
- if (value && typeof value === "object") {
295
- const out: Record<string, unknown> = {};
296
- for (const [k, v] of Object.entries(value)) {
297
- out[k] = substitute(v);
298
- }
299
- return out;
310
+ if (isJsonObject(value)) {
311
+ return substituteObject(value);
300
312
  }
301
313
  return value;
302
314
  };
303
- return substitute(template) as Record<string, unknown>;
315
+ return substituteObject(template);
304
316
  }
305
317
 
306
318
  /**
@@ -314,53 +326,68 @@ function buildContext(
314
326
  entryKey: string | null = null,
315
327
  ): SchemaFormContext {
316
328
  const platform = getPlatform();
317
- return {
329
+ const context: SchemaFormContext = {
318
330
  fieldKeyPrefix: `$settings.${sectionKey}`,
319
- resolvePointer: (pointer, scope) =>
320
- resolveContextPointer(pointer, {
321
- projectConfig: (projectState?.projectConfig ?? {}) as Record<string, unknown>,
322
- ...(scope !== undefined && { scope }),
323
- ...(opts.formats !== undefined && { formats: opts.formats }),
324
- }),
325
- ...(typeof platform.setSecrets === "function"
326
- ? {
327
- commitSecret: async (key: string, value: string) => {
328
- const envName = deriveSecretEnvName(sectionKey, entryKey, key);
329
- await platform.setSecrets!({ set: { [envName]: value } });
330
- return envName;
331
- },
332
- }
333
- : {}),
331
+ resolvePointer: (pointer, scope) => {
332
+ const resolveOpts: ResolveContextOptions = {
333
+ projectConfig: projectState?.projectConfig ?? {},
334
+ };
335
+ /* The scope is the form's current value record, which is section JSON; the guard is what
336
+ lets the compiler see that, and it also stands for the old `!== undefined` test. */
337
+ if (isJsonObject(scope)) {
338
+ resolveOpts.scope = scope;
339
+ }
340
+ if (opts.formats !== undefined) {
341
+ resolveOpts.formats = opts.formats;
342
+ }
343
+ return resolveContextPointer(pointer, resolveOpts);
344
+ },
334
345
  };
346
+ if (isFunction(platform.setSecrets)) {
347
+ context.commitSecret = async (key: string, value: string) => {
348
+ const envName = deriveSecretEnvName(sectionKey, entryKey, key);
349
+ await platform.setSecrets!({ set: { [envName]: value } });
350
+ return envName;
351
+ };
352
+ }
353
+ return context;
335
354
  }
336
355
 
337
356
  /** The section's value object in the project config, created on demand. */
338
- function sectionValue(key: string): Record<string, unknown> | null {
339
- const config = projectState?.projectConfig as Record<string, unknown> | null | undefined;
357
+ function sectionValue(key: string): JsonObject | null {
358
+ const config = projectState?.projectConfig;
340
359
  if (!config) {
341
360
  return null;
342
361
  }
343
362
  const existing = config[key];
344
- if (existing && typeof existing === "object" && !Array.isArray(existing)) {
345
- return existing as Record<string, unknown>;
363
+ if (isJsonObject(existing)) {
364
+ return existing;
346
365
  }
347
- const fresh: Record<string, unknown> = {};
366
+ const fresh: JsonObject = {};
348
367
  config[key] = fresh;
349
368
  return fresh;
350
369
  }
351
370
 
352
371
  // ─── Per-container mount ──────────────────────────────────────────────────────
353
372
 
354
- /* There is no `paneOfContainer` here. It moved to `canvas/canvas-surface.ts`, beside the other
355
- "which pane is this about" answers, because it is not a settings idea: any stage content handed
356
- only a host needs it, and `settings/general-settings.ts` and `settings/project-sections.ts` are
357
- two more that do — both write a canvas mode, and both used to write the FOCUSED pane's. */
373
+ /**
374
+ * A region under the settings dialog, which is where a contributed section is drawn (§17.1): its
375
+ * entry rows and its entry editor are named under `overlay.dialog:settings`, so a shot can crop one
376
+ * without a selector.
377
+ *
378
+ * @param {string} part
379
+ * @returns {string}
380
+ */
381
+ function sectionRegion(part: string): string {
382
+ return `${SETTINGS_DIALOG_REGION}/${part}`;
383
+ }
358
384
 
359
385
  /** One mounted section: its document, its two island hosts, and what it was last asked to draw. */
360
386
  interface SectionMount {
361
387
  /** The element the registry handed the renderer, and this record's identity. */
362
388
  container: HTMLElement;
363
- handle: ContributedSurfaceHandle;
389
+ /** The mounted document, or `null` for the instant between creating this record and mounting. */
390
+ handle: ContributedSurfaceHandle | null;
364
391
  contribution: SettingsContribution;
365
392
  opts: ContributedSectionOptions;
366
393
  /** Where the schema form goes, once the document has made one. */
@@ -397,14 +424,39 @@ function say(record: SectionMount, value: string): void {
397
424
 
398
425
  // ─── Projection ───────────────────────────────────────────────────────────────
399
426
 
427
+ /** The default name for one entry of a map section, when the contribution names none. */
428
+ const DEFAULT_ENTRY_NOUN = "entry";
429
+
430
+ /** The map column's words for one entry: the four places a map section names it. */
431
+ export interface EntryWords {
432
+ newLabel: string;
433
+ newFieldLabel: string;
434
+ newPlaceholder: string;
435
+ emptyText: string;
436
+ }
437
+
438
+ /** The map column's words, from what the contribution calls one entry. */
439
+ export function entryWords(noun?: string): EntryWords {
440
+ const word = noun?.trim().toLowerCase() || DEFAULT_ENTRY_NOUN;
441
+ const capitalised = `${word.charAt(0).toUpperCase()}${word.slice(1)}`;
442
+ // "an entry", "a table": the article English reads before the word's first sound, by its letter.
443
+ const article = /^[aeiou]/u.test(word) ? "an" : "a";
444
+ return {
445
+ emptyText: `Select ${article} ${word} or create one`,
446
+ newFieldLabel: `${capitalised} name`,
447
+ newLabel: `New ${word}`,
448
+ newPlaceholder: `${slugify(word)}-name`,
449
+ };
450
+ }
451
+
400
452
  /** What the document draws right now, read from the store and this module's own state. */
401
453
  function project(record: SectionMount): ContributedView {
402
- const { container, contribution, opts } = record;
454
+ const { contribution, opts } = record;
403
455
  const sectionKey = contribution.key;
404
456
  const title = contribution.title ?? sectionKey;
405
457
  const actionsState = opts.actions ? "slot" : "none";
406
- const paneId = paneOfContainer(container);
407
- const editorRegion = paneRegion(paneId, "editor");
458
+ const editorRegion = sectionRegion("editor");
459
+ const words = entryWords(contribution.settings.entry?.noun);
408
460
 
409
461
  if ((contribution.settings.layout ?? "form") !== "map") {
410
462
  return {
@@ -417,21 +469,21 @@ function project(record: SectionMount): ContributedView {
417
469
  newName: "",
418
470
  newState: "closed",
419
471
  title,
472
+ ...words,
420
473
  };
421
474
  }
422
475
 
423
476
  const entries = sectionValue(sectionKey) ?? {};
424
477
  const selected = selectedEntries.get(sectionKey) ?? null;
425
478
  const value = selected === null ? undefined : entries[selected];
426
- const editing =
427
- selected !== null && value !== undefined && value !== null && typeof value === "object";
479
+ const editing = selected !== null && isNonNullObject(value);
428
480
  return {
429
481
  actionsState,
430
482
  editorRegion,
431
483
  editorState: editing ? "editing" : "empty",
432
484
  entries: Object.keys(entries).map((name) => ({
433
485
  key: name,
434
- region: paneRegion(paneId, `entry:${name}`),
486
+ region: sectionRegion(`entry:${name}`),
435
487
  selected: name === selected,
436
488
  })),
437
489
  entryName: record.echo ?? (editing ? selected : ""),
@@ -439,6 +491,7 @@ function project(record: SectionMount): ContributedView {
439
491
  newName: newEntryNames.get(sectionKey) ?? "",
440
492
  newState: newEntryOpen.has(sectionKey) ? "open" : "closed",
441
493
  title,
494
+ ...words,
442
495
  };
443
496
  }
444
497
 
@@ -499,11 +552,14 @@ function paintForm(record: SectionMount): void {
499
552
  const entries = sectionValue(sectionKey) ?? {};
500
553
  const selected = selectedEntries.get(sectionKey) ?? null;
501
554
  const value = selected === null ? undefined : entries[selected];
502
- if (selected === null || !value || typeof value !== "object") {
555
+ if (selected === null || !isNonNullObject(value)) {
503
556
  host.replaceChildren();
504
557
  return;
505
558
  }
506
- const entry = value as Record<string, unknown>;
559
+ /* SAFETY: a map section's entries are objects by the section schema (`additionalProperties`
560
+ of type object), and the check above admits only objects; an array entry is malformed config
561
+ the form still treats as the record it should be, reading and writing named members. */
562
+ const entry = value as JsonObject;
507
563
  const base = `/${sectionKey}/${selected}`;
508
564
  place(
509
565
  mountSchemaForm(`section:${sectionKey}:${selected}`, contribution.entrySchema, entry, {
@@ -619,7 +675,7 @@ function actionsFor(record: SectionMount): ContributedActions {
619
675
  return;
620
676
  }
621
677
  // Rebuild the map to preserve entry order under the new key
622
- const next: Record<string, unknown> = {};
678
+ const next: JsonObject = {};
623
679
  for (const [k, v] of Object.entries(target)) {
624
680
  next[k === selected ? slug : k] = v;
625
681
  delete target[k];
@@ -655,19 +711,20 @@ export function renderContributedSection(
655
711
  record.contribution = contribution;
656
712
  record.opts = opts;
657
713
  }
658
- if (!record?.handle.attached()) {
659
- record?.handle.dispose();
714
+ let handle = record?.handle ?? null;
715
+ if (!record || !handle?.attached()) {
716
+ handle?.dispose();
660
717
  const fresh: SectionMount = {
661
718
  actionsHost: null,
662
719
  container,
663
720
  contribution,
664
721
  echo: null,
665
722
  formHost: null,
666
- handle: undefined as unknown as ContributedSurfaceHandle,
723
+ handle: null,
667
724
  opts,
668
725
  };
669
726
  mounts.set(container, fresh);
670
- fresh.handle = mountContributedSurface(container, actionsFor(fresh), {
727
+ handle = mountContributedSurface(container, actionsFor(fresh), {
671
728
  actionsSlot: (host) => {
672
729
  fresh.actionsHost = host;
673
730
  paintActions(fresh);
@@ -677,9 +734,10 @@ export function renderContributedSection(
677
734
  paintForm(fresh);
678
735
  },
679
736
  });
737
+ fresh.handle = handle;
680
738
  record = fresh;
681
739
  }
682
- record.handle.update(project(record));
740
+ handle.update(project(record));
683
741
  paintActions(record);
684
742
  paintForm(record);
685
743
  }