@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
@@ -12,12 +12,22 @@
12
12
  * Pure and DOM-free: deps limited to `@jxsuite/schema` guards/types + {@link getNodeAtPath}.
13
13
  */
14
14
 
15
- import { isRef } from "@jxsuite/schema/guards";
16
- import { getNodeAtPath } from "../state";
15
+ import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
16
+ import {
17
+ isJsonObject,
18
+ isMappedArray,
19
+ isNonNullObject,
20
+ isRef,
21
+ isString,
22
+ } from "@jxsuite/schema/guards";
17
23
 
18
24
  import type { JxPath } from "../state";
19
- import type { ContentSectionEntry } from "../types";
20
- import type { JxMappedArray, JxMutableNode, ProjectConfig } from "@jxsuite/schema/types";
25
+ import type {
26
+ JxMappedArray,
27
+ JxMutableNode,
28
+ JxStateDefinition,
29
+ ProjectConfig,
30
+ } from "@jxsuite/schema/types";
21
31
 
22
32
  /** Cap on how many inferred/declared fields we enumerate (mirrors merge-tags BREADTH_CAP breadth). */
23
33
  const FIELD_CAP = 50;
@@ -44,18 +54,16 @@ export function findEnclosingRepeater(
44
54
  if (mapIdx <= 0) {
45
55
  return null;
46
56
  }
47
- const node = getNodeAtPath(doc, path.slice(0, mapIdx)) as
48
- | (Record<string, unknown> & JxMappedArray)
49
- | undefined;
50
- return node && node.$prototype === "Array" ? (node as JxMappedArray) : null;
57
+ const node = getNodeAtPath(doc, path.slice(0, mapIdx));
58
+ return isMappedArray(node) ? node : null;
51
59
  }
52
60
 
53
61
  /** Strip a `#/state/<name>` JSON-Pointer ref to its bare state name (null when it is not one). */
54
- function refToStateName(ref: unknown): string | null {
55
- if (!isRef(ref)) {
62
+ function refToStateName(binding: JxMappedArray["items"]): string | null {
63
+ if (!isRef(binding)) {
56
64
  return null;
57
65
  }
58
- const { $ref: target } = ref;
66
+ const { $ref: target } = binding;
59
67
  return target.startsWith("#/state/") ? target.slice("#/state/".length) : null;
60
68
  }
61
69
 
@@ -85,25 +93,28 @@ function safeFields(names: string[]): string[] {
85
93
  */
86
94
  export function resolveRepeaterItemFields(
87
95
  arrayNode: JxMappedArray,
88
- state: Record<string, unknown> | null | undefined,
96
+ state: Readonly<Record<string, JxStateDefinition>> | null | undefined,
89
97
  projectConfig: ProjectConfig | null | undefined,
90
98
  ): string[] {
91
99
  const base = ["item", "index"];
92
- const { items } = arrayNode as { items?: unknown };
100
+ const { items } = arrayNode;
93
101
  const defs = state ?? {};
94
102
 
95
103
  const stateName = refToStateName(items);
96
104
  if (stateName) {
97
- const def = defs[stateName] as Record<string, unknown> | undefined;
98
- if (def && typeof def === "object") {
105
+ const def = defs[stateName];
106
+ if (isJsonObject(def)) {
99
107
  // (a) Content collection — `{ contentType: "<name>" }`. Import-aliased `$prototype` still
100
108
  // Matches because we detect on the `contentType` string, not the prototype name.
101
- if (typeof def.contentType === "string") {
102
- const content = (projectConfig?.content ?? {}) as Record<string, ContentSectionEntry>;
103
- const ct = content[def.contentType];
104
- const props = ct?.schema?.properties;
109
+ if (isString(def.contentType)) {
110
+ /* The `content` section is contributed by an extension and absorbed by the project
111
+ config's index signature, so each level is checked before it is read. */
112
+ const content = projectConfig?.content;
113
+ const ct = isJsonObject(content) ? content[def.contentType] : undefined;
114
+ const ctSchema = isJsonObject(ct) ? ct.schema : undefined;
115
+ const props = isJsonObject(ctSchema) ? ctSchema.properties : undefined;
105
116
  const out = [...base, "item.id", "item.body"];
106
- if (props && typeof props === "object") {
117
+ if (isNonNullObject(props)) {
107
118
  for (const f of safeFields(Object.keys(props))) {
108
119
  out.push(`item.data.${f}`);
109
120
  }
@@ -112,14 +123,14 @@ export function resolveRepeaterItemFields(
112
123
  }
113
124
 
114
125
  // (b) State array — declared object item-schema, or inferred from a sample default[0].
115
- const itemsSchema = def.items as Record<string, unknown> | undefined;
116
- const declared = itemsSchema?.properties as Record<string, unknown> | undefined;
117
- if (declared && typeof declared === "object") {
126
+ const itemsSchema = def.items;
127
+ const declared = isJsonObject(itemsSchema) ? itemsSchema.properties : undefined;
128
+ if (isNonNullObject(declared)) {
118
129
  return [...base, ...safeFields(Object.keys(declared)).map((f) => `item.${f}`)];
119
130
  }
120
- const defaults = def.default as unknown[] | undefined;
121
- const sample: unknown = Array.isArray(defaults) ? defaults[0] : undefined;
122
- if (sample && typeof sample === "object" && !Array.isArray(sample)) {
131
+ const defaults = def.default;
132
+ const sample = Array.isArray(defaults) ? defaults[0] : undefined;
133
+ if (isJsonObject(sample)) {
123
134
  return [...base, ...safeFields(Object.keys(sample)).map((f) => `item.${f}`)];
124
135
  }
125
136
  }
@@ -128,8 +139,8 @@ export function resolveRepeaterItemFields(
128
139
 
129
140
  // (c) Inline literal array — infer fields from the first object element.
130
141
  if (Array.isArray(items)) {
131
- const [first] = items as unknown[];
132
- if (first && typeof first === "object" && !Array.isArray(first)) {
142
+ const [first] = items;
143
+ if (isJsonObject(first)) {
133
144
  return [...base, ...safeFields(Object.keys(first)).map((f) => `item.${f}`)];
134
145
  }
135
146
  }
@@ -30,6 +30,7 @@
30
30
  * to the code that runs, so a chord and its behaviour cannot drift apart again.
31
31
  */
32
32
 
33
+ import { isFunction, isNonNullObject } from "@jxsuite/schema/guards";
33
34
  import { childIndex, childList, getNodeAtPath, parentElementPath, projectState } from "../store";
34
35
  import { activeTab, workspace } from "../workspace/workspace";
35
36
  import {
@@ -45,8 +46,8 @@ import {
45
46
  mutateDuplicateNodes,
46
47
  mutateInsertNode,
47
48
  mutateRemoveNodes,
48
- redo as tabRedo,
49
- undo as tabUndo,
49
+ redo,
50
+ undo,
50
51
  transactDoc,
51
52
  } from "../tabs/transact";
52
53
  import {
@@ -81,6 +82,7 @@ import { runReported } from "../commands/run-reported";
81
82
  import { pointerAnchor } from "../canvas/iframe-host";
82
83
  import type { PointerAnchor } from "../canvas/iframe-host";
83
84
  import type { CommandContext } from "../commands/context";
85
+ import type { CommandArgValues } from "../commands/command-args";
84
86
  import type { DockId as CommandDockId } from "../commands/defaults";
85
87
  import type { AnyCommand, CommandRegistry } from "../commands/registry";
86
88
  import type { DockId, FocusRegion } from "../shell";
@@ -165,11 +167,14 @@ function navigateSelection(direction: -1 | 1): void {
165
167
  tab.session.selection = [[]];
166
168
  return;
167
169
  }
168
- if (selected.length < 2) {
170
+ // `parentElementPath` is null exactly when the path is the document element (length < 2).
171
+ const parentPath = parentElementPath(selected);
172
+ if (!parentPath) {
169
173
  return;
170
174
  }
171
- const parentPath = parentElementPath(selected) as JxPath;
172
175
  const parent = getNodeAtPath(tab.doc.document, parentPath);
176
+ // SAFETY: a selection path of length >= 2 addresses a child as `[..., "children", n]`, so its
177
+ // Last segment is the numeric index `n` (the same invariant `insertSiblingParagraph` relies on).
173
178
  const newIndex = (childIndex(selected) as number) + direction;
174
179
  if (newIndex >= 0 && newIndex < childList(parent).length) {
175
180
  tab.session.selection = [[...parentPath, "children", newIndex]];
@@ -190,14 +195,10 @@ function selectSiblings(): void {
190
195
  return;
191
196
  }
192
197
  const selected = primarySelection(tab.session.selection);
193
- const parentPath = (
194
- selected && selected.length >= 2 ? parentElementPath(selected) : []
195
- ) as JxPath;
198
+ const parentPath: JxPath = (selected ? parentElementPath(selected) : null) ?? [];
196
199
  const parent = getNodeAtPath(tab.doc.document, parentPath);
197
200
  const paths = childList(parent).flatMap((child, index) =>
198
- typeof child === "object" && child !== null
199
- ? [[...parentPath, "children", index] as JxPath]
200
- : [],
201
+ isNonNullObject(child) ? [[...parentPath, "children", index]] : [],
201
202
  );
202
203
  if (paths.length > 0) {
203
204
  tab.session.selection = paths;
@@ -242,10 +243,16 @@ function selectParent(): void {
242
243
  function insertSiblingParagraph(): void {
243
244
  const tab = activeTab.value;
244
245
  const selected = primarySelection(tab?.session.selection);
245
- if (!tab || !selected || selected.length < 2) {
246
+ if (!tab || !selected) {
247
+ return;
248
+ }
249
+ // Null exactly when the selection is the document element, which has no sibling slot.
250
+ const parentPath = parentElementPath(selected);
251
+ if (!parentPath) {
246
252
  return;
247
253
  }
248
- const parentPath = parentElementPath(selected) as JxPath;
254
+ // SAFETY: a selection path of length >= 2 addresses a child as `[..., "children", n]`, so its
255
+ // Last segment is the numeric child index `n`.
249
256
  const index = childIndex(selected) as number;
250
257
  const newPath = [...parentPath, "children", index + 1];
251
258
  transactDoc(tab, (t) => {
@@ -303,14 +310,14 @@ function closeDocument(): void {
303
310
  function undoDocument(): void {
304
311
  const tab = activeTab.value;
305
312
  if (tab) {
306
- tabUndo(tab);
313
+ undo(tab);
307
314
  }
308
315
  }
309
316
 
310
317
  function redoDocument(): void {
311
318
  const tab = activeTab.value;
312
319
  if (tab) {
313
- tabRedo(tab);
320
+ redo(tab);
314
321
  }
315
322
  }
316
323
 
@@ -349,7 +356,7 @@ function zoomBy(ctx: CommandContext, factor: number, redraw: () => void): void {
349
356
  return;
350
357
  }
351
358
  if (isContentZoom(ctx)) {
352
- setEditZoom((tab.session.ui.editZoom ?? 1) * factor);
359
+ setEditZoom(tab.session.ui.editZoom * factor);
353
360
  return;
354
361
  }
355
362
  // Around the stage's middle, like the zoom pod's buttons.
@@ -397,7 +404,7 @@ function toggleShellDock(registry: CommandRegistry, dock: CommandDockId): void {
397
404
  * a missing id must be inert rather than an exception thrown out of a keydown handler. A present
398
405
  * one that refuses its arguments is not inert: `commands/run-reported.ts` files it in Problems.
399
406
  */
400
- function runIfPresent(registry: CommandRegistry, id: string, args: Record<string, unknown>): void {
407
+ function runIfPresent(registry: CommandRegistry, id: string, args: CommandArgValues): void {
401
408
  if (registry.get(id) && registry.isEnabled(id)) {
402
409
  void runReported(registry, id, args, "Keyboard");
403
410
  }
@@ -521,15 +528,15 @@ function cycleRegion(direction: 1 | -1): void {
521
528
  }
522
529
  }
523
530
 
524
- // ─── Panel and inspector focus (⌘1–8, ⌘⇧1–4) ─────────────────────────────────
531
+ // ─── Panel and inspector focus (`panel.focus.*`, ⌘⇧1–4) ──────────────────────
525
532
 
526
533
  /**
527
534
  * Toggle-FOCUS, not toggle-visible.
528
535
  *
529
- * ⌘1 from the canvas reveals Files and puts the caret in it; ⌘1 again — with Files already focused
530
- * — collapses the dock and hands the caret back to the pane. The distinction matters because the
531
- * common case is "take me there", and a toggle-visible binding makes that a coin flip on whichever
532
- * panel happened to be showing.
536
+ * `Show Files` from the canvas reveals Files and puts the caret in it; running it again — with
537
+ * Files already focused — collapses the dock and hands the caret back to the pane. The distinction
538
+ * matters because the common case is "take me there", and a toggle-visible binding makes that a
539
+ * coin flip on whichever panel happened to be showing.
533
540
  *
534
541
  * Every panel this can be handed lives in the Navigator. The roster is the rail plus the rail-less
535
542
  * NAVIGATOR panels (`panels/navigator-panels.ts`), so a Bottom-dock record cannot reach here — the
@@ -539,14 +546,14 @@ function cycleRegion(direction: 1 | -1): void {
539
546
  */
540
547
  function focusPanel(panelId: string): void {
541
548
  /* THE DOOR. `shell.ts`'s `NAVIGATOR_PANEL_IDS` docstring says the command is what refuses an
542
- undeclared id, "at the one door a caller comes through" — this is that door for ⌘1–8, and it
549
+ undeclared id, "at the one door a caller comes through" — this is that door for `panel.focus.*`, and it
543
550
  was the only one of three doors that had no lock. `setActivityTab` now takes a
544
551
  `NavigatorPanelId`, so the roster's `string` has to be narrowed somewhere; narrowing HERE keeps
545
552
  `commands/defaults.ts` free of shell types, which is the property that lets three CI checks
546
553
  load the command set in a bare Bun process.
547
554
 
548
555
  A throw rather than a silent return: `tests/navigator-panels.test.ts` asserts the enum and the
549
- registry agree, so this is unreachable while that passes, and a chord that quietly does nothing
556
+ registry agree, so this is unreachable while that passes, and a command that quietly does nothing
550
557
  is precisely the defect this change is closing. */
551
558
  const id = requireNavigatorPanelId(panelId, "panel.focus");
552
559
  const alreadyThere =
@@ -647,8 +654,9 @@ function askWhereToOpen(openName: string): Promise<ProjectOpenTarget | "cancel">
647
654
  export async function openProjectFlow(hooks: StudioCommandHooks): Promise<void> {
648
655
  const platform = hasPlatform() ? getPlatform() : null;
649
656
  const canOpenElsewhere =
650
- typeof platform?.openProjectInNewWindow === "function" &&
651
- typeof platform?.pickProject === "function";
657
+ platform !== null &&
658
+ isFunction(platform.openProjectInNewWindow) &&
659
+ isFunction(platform.pickProject);
652
660
  if (!projectState || !canOpenElsewhere) {
653
661
  await hooks.openProject("thisWindow");
654
662
  return;
@@ -959,7 +967,11 @@ export function initShortcuts(registry: CommandRegistry, stageContext: StageCont
959
967
  document.addEventListener(
960
968
  "wheel",
961
969
  (e: WheelEvent) => {
962
- if ((e.ctrlKey || e.metaKey) && !(e.target as Element | null)?.closest(STAGE_SELECTOR)) {
970
+ const { target } = e;
971
+ if (
972
+ (e.ctrlKey || e.metaKey) &&
973
+ !(target instanceof Element && target.closest(STAGE_SELECTOR))
974
+ ) {
963
975
  e.preventDefault();
964
976
  }
965
977
  },
@@ -978,7 +990,6 @@ export function initShortcuts(registry: CommandRegistry, stageContext: StageCont
978
990
  * scrolled with the wheel at all.
979
991
  *
980
992
  * - `grid` — a Tabulator viewport with its own virtual scroller.
981
- * - `manage` — the Library's ordinary overflow container.
982
993
  * - `settings` — the Project Settings document (`panels/settings-pane.ts`): an `overflow-y: auto`
983
994
  * section column, plus the Raw JSON `<pre>`'s own box inside it.
984
995
  * - `entry` — the Entry editor's `overflow-y: auto` form (`content/entry-editor.ts`).
@@ -988,28 +999,30 @@ export function initShortcuts(registry: CommandRegistry, stageContext: StageCont
988
999
  * there is no artboard here to zoom, either.
989
1000
  */
990
1001
  const SELF_SCROLLING_MODES: ReadonlySet<string> = new Set([
1002
+ /* The Content home — `browse/library-pane.ts`. Its own scrolling list, nothing to zoom. */
1003
+ "content-home",
991
1004
  "entry",
992
1005
  "grid",
993
- "manage",
994
1006
  /* `media` — the Media viewer's own scrolling column (`media/media-pane.ts`). There is no artboard
995
1007
  here either: a wheel over an image is a scroll down the page it sits on, not a zoom. */
996
1008
  "media",
1009
+ /* A workspace's home — `workspace/workspace-home.ts`. A centred column with nothing to zoom. */
1010
+ "media-home",
997
1011
  "preview",
998
- "settings",
1012
+ "publish-home",
999
1013
  ]);
1000
1014
 
1001
1015
  /**
1002
1016
  * Can a box between `target` and the stage still answer this wheel itself?
1003
1017
  *
1004
- * Edit forwards every wheel to the page's scroller (see the branch below), which was the whole
1005
- * story while the stage cell held nothing but the page. It also holds the Document Header band now,
1006
- * a capped scroll container standing beside the scroller — and a `preventDefault` from an ANCESTOR
1007
- * listener cancels the native scroll of whatever the pointer is over, so a form taller than the cap
1008
- * could not be wheeled at all while the page scrolled underneath it instead. So the stage takes the
1009
- * wheel only when nothing inside it wants one: the walk stops at the stage cell, and it steps over
1010
- * the page's scroller because that box is what the forwarding is FOR — a wheel forwarded out of the
1011
- * cross-origin frame is dispatched on the cell itself and reaches no scrollable element on the way,
1012
- * and letting the browser scroll the page natively would chain out of it into the shell.
1018
+ * Edit forwards every wheel to the page's scroller (see the branch below). A `preventDefault` from
1019
+ * an ANCESTOR listener cancels the native scroll of whatever the pointer is over, so any box in the
1020
+ * stage cell that scrolls itself (a sideways strip, a capped list) would otherwise be unwheelable
1021
+ * while the page scrolled underneath it instead. So the stage takes the wheel only when nothing
1022
+ * inside it wants one: the walk stops at the stage cell, and it steps over the page's scroller
1023
+ * because that box is what the forwarding is FOR — a wheel forwarded out of the cross-origin frame
1024
+ * is dispatched on the cell itself and reaches no scrollable element on the way, and letting the
1025
+ * browser scroll the page natively would chain out of it into the shell.
1013
1026
  *
1014
1027
  * @param {WheelEvent} e
1015
1028
  * @param {HTMLElement} stage The cell the listener is on — the walk's upper bound, exclusive.
@@ -1022,7 +1035,7 @@ function wheelBelongsInside(
1022
1035
  ): boolean {
1023
1036
  const { target } = e;
1024
1037
  let el: Element | null =
1025
- target instanceof Element ? target : ((target as Node | null)?.parentElement ?? null);
1038
+ target instanceof Element ? target : target instanceof Node ? target.parentElement : null;
1026
1039
  while (el && el !== stage) {
1027
1040
  if (el instanceof HTMLElement && el !== pageScroller && canScrollBy(el, e.deltaX, e.deltaY)) {
1028
1041
  return true;
@@ -1134,8 +1147,8 @@ export function installStageGestures(surface: CanvasSurface): () => void {
1134
1147
  /* The stage's own scroller, by the `part` the stage document draws it with — the same
1135
1148
  attribute every other consumer of the canvas's chrome now addresses it by. */
1136
1149
  const sc = canvasWrap.querySelector<HTMLElement>('[part="edit-canvas"]');
1137
- /* …unless the pointer is over a box in this cell that scrolls itself — the Document Header
1138
- band, which Edit docks beside the scroller. See {@link wheelBelongsInside}. */
1150
+ /* …unless the pointer is over a box in this cell that scrolls itself. See
1151
+ {@link wheelBelongsInside}. */
1139
1152
  if (sc && !wheelBelongsInside(e, canvasWrap, sc)) {
1140
1153
  e.preventDefault();
1141
1154
  sc.scrollTop += e.deltaY;
@@ -1219,7 +1232,7 @@ export function installStageGestures(surface: CanvasSurface): () => void {
1219
1232
  canvasWrap.addEventListener(
1220
1233
  "click",
1221
1234
  (e: MouseEvent) => {
1222
- if (e.target !== canvasWrap && e.target !== surface.panzoomWrap) {
1235
+ if (!isStageBackground(e.target, canvasWrap, surface.panzoomWrap)) {
1223
1236
  return;
1224
1237
  }
1225
1238
  const tab = tabOfPane(surface.paneId);
@@ -1237,6 +1250,27 @@ export function installStageGestures(surface: CanvasSurface): () => void {
1237
1250
  };
1238
1251
  }
1239
1252
 
1253
+ /**
1254
+ * Whether a click landed on a stage's BACKGROUND rather than on anything drawn in it: the stage
1255
+ * itself, the pan/zoom surface, or the frame box every view draws its artboards in.
1256
+ *
1257
+ * The frame box is the one that matters in Edit. Edit has no pan/zoom surface; its frame is the
1258
+ * scrolling `[part="edit-canvas"]` that fills the stage around the page column, so the grey margin
1259
+ * beside the page IS that box, and a test that knew only the stage and the pan/zoom surface never
1260
+ * saw a click there. The frame is recognised by its static `data-slot`, which the stage document
1261
+ * stamps on it in every view.
1262
+ */
1263
+ export function isStageBackground(
1264
+ target: EventTarget | null,
1265
+ stage: Element,
1266
+ panzoom: Element | null,
1267
+ ): boolean {
1268
+ if (target === stage || (panzoom !== null && target === panzoom)) {
1269
+ return true;
1270
+ }
1271
+ return target instanceof HTMLElement && target.dataset.slot === "frame" && stage.contains(target);
1272
+ }
1273
+
1240
1274
  /** The context a stage answers with before the bootstrap has published a reader. */
1241
1275
  function stageless(): ShortcutPointerContext {
1242
1276
  return {
@@ -27,14 +27,15 @@
27
27
  */
28
28
 
29
29
  import { openSlashMenuSurface } from "../surfaces/slash-menu";
30
+ import { componentSlashCommands } from "./insert-component";
30
31
  import { rectOf } from "../utils/geometry";
31
- import type { SlashMenuRow, SlashMenuSurface, SlashMenuView } from "../surfaces/slash-menu";
32
-
33
- interface SlashCommand {
34
- label: string;
35
- tag: string;
36
- description: string;
37
- }
32
+ import type {
33
+ SlashMenuGroup,
34
+ SlashMenuRow,
35
+ SlashMenuSurface,
36
+ SlashMenuView,
37
+ } from "../surfaces/slash-menu";
38
+ import type { SlashCommand } from "./inline-edit";
38
39
 
39
40
  // ─── Commands ─────────────────────────────────────────────────────────────────
40
41
 
@@ -120,9 +121,43 @@ export function showSlashMenuAtRect(
120
121
  showAt(rect, filter, cbs);
121
122
  }
122
123
 
124
+ /**
125
+ * The standard set: the HTML elements, then the project's components under their own heading
126
+ * (§5.7), read from the registry at the moment the menu opens so a component saved a moment ago is
127
+ * on offer.
128
+ */
129
+ function standardCommands(): SlashCommand[] {
130
+ return [...SLASH_COMMANDS, ...componentSlashCommands()];
131
+ }
132
+
123
133
  /** Everything on offer right now: what the caller named, or the standard set. */
124
134
  function source(): SlashCommand[] {
125
- return callbacks?.commands || SLASH_COMMANDS;
135
+ return callbacks?.commands || standardCommands();
136
+ }
137
+
138
+ /**
139
+ * The rows as the panel groups them: consecutive offers with the same heading share a group, and
140
+ * the first, unheaded group is the HTML elements. Each row keeps its index in the FLAT list, which
141
+ * is the one the keyboard, the highlight and a pick count in.
142
+ */
143
+ function groupsOf(rows: readonly SlashMenuRow[], items: readonly SlashCommand[]): SlashMenuGroup[] {
144
+ const groups: SlashMenuGroup[] = [];
145
+ for (const [index, row] of rows.entries()) {
146
+ const label = items[index]?.group ?? "";
147
+ const last = groups.at(-1);
148
+ if (last?.label === label) {
149
+ last.rows.push(row);
150
+ } else {
151
+ groups.push({
152
+ hasLabel: label !== "",
153
+ key: label || "elements",
154
+ label,
155
+ name: label || "Elements",
156
+ rows: [row],
157
+ });
158
+ }
159
+ }
160
+ return groups;
126
161
  }
127
162
 
128
163
  /** The offers a filter leaves standing. An empty filter leaves all of them. */
@@ -137,14 +172,17 @@ function matching(filter: string, from: SlashCommand[]): SlashCommand[] {
137
172
  /** What the panel should be showing, from the state above. */
138
173
  function view(): SlashMenuView {
139
174
  const rect = _anchorRect;
175
+ const rows = filteredItems.map((cmd, index): SlashMenuRow => ({
176
+ description: cmd.description,
177
+ index,
178
+ key: cmd.tag,
179
+ label: cmd.label,
180
+ }));
140
181
  return {
141
182
  activeIndex: activeIdx,
142
183
  filter: filterText,
143
- rows: filteredItems.map((cmd): SlashMenuRow => ({
144
- description: cmd.description,
145
- key: cmd.tag,
146
- label: cmd.label,
147
- })),
184
+ groups: groupsOf(rows, filteredItems),
185
+ rows,
148
186
  showFilter,
149
187
  // The gap between the anchor and the panel is the `--jx-popover-offset` token the element
150
188
  // Already applies, so this is the anchor's own edge rather than an edge plus a guess.
@@ -168,7 +206,7 @@ function showAt(
168
206
  callbacks = cbs;
169
207
  _anchorRect = rect;
170
208
 
171
- filteredItems = matching(filter, cbs.commands || SLASH_COMMANDS);
209
+ filteredItems = matching(filter, cbs.commands || standardCommands());
172
210
 
173
211
  if (filteredItems.length === 0 && !cbs.showFilter) {
174
212
  dismissSlashMenu();
@@ -30,13 +30,14 @@
30
30
  * paths only — a `.json` or `.md` file is never loaded by URL from the canvas, and leaving them out
31
31
  * keeps that message as small as the media set.
32
32
  *
33
- * Pure module state — it imports nothing but path normalization and the reactivity re-export — so
34
- * the canvas host can import it without dragging in the file layer.
33
+ * Pure module state — it imports nothing but path normalization, the primitive guards and the
34
+ * reactivity re-export — so the canvas host can import it without dragging in the file layer.
35
35
  *
36
36
  * @docs extending/embedding/platform-adapter
37
37
  */
38
38
 
39
39
  import { normalizeProjectPath } from "@jxsuite/schema/asset-paths";
40
+ import { isString } from "@jxsuite/schema/guards";
40
41
  import { shallowRef } from "../reactivity";
41
42
  import type { DirEntry } from "../types";
42
43
 
@@ -161,8 +162,7 @@ export function noteListing(entries: readonly DirEntry[], since: number): void {
161
162
  if (path === "" || dirtiedSince(path, since)) {
162
163
  continue;
163
164
  }
164
- const version =
165
- typeof entry.version === "string" && entry.version !== "" ? entry.version : null;
165
+ const version = isString(entry.version) && entry.version !== "" ? entry.version : null;
166
166
  const held = versions.get(path);
167
167
  if (version === null) {
168
168
  if (held === undefined) {