@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
@@ -50,9 +50,9 @@ export type DockId = "navigator" | "inspector" | "bottom";
50
50
  export type PaletteMode = "picker" | "files" | "commands" | "nodes" | "projects";
51
51
 
52
52
  /**
53
- * One panel, as the ⌘1–8 direct keys address it.
53
+ * One panel, as its `panel.focus.<id>` record addresses it.
54
54
  *
55
- * Structurally the part of `panels/panel-registry.ts`'s `PanelRecord` a chord needs, declared here
55
+ * Structurally the part of `panels/panel-registry.ts`'s `PanelRecord` a record needs, declared here
56
56
  * rather than imported so this module keeps its one load-bearing property: it imports no state and
57
57
  * no DOM, which is what lets the three CI checks load the command set in a bare Bun process. The
58
58
  * ROSTER arrives by injection ({@link CommandDeps.panelRoster}) from the panel registry, so there
@@ -64,30 +64,52 @@ export interface RailPanel {
64
64
  /** The panel's human name, which is also the command's title after "Show ". */
65
65
  title: string;
66
66
  /** `false` for a panel with no rail button — reachable by name, not by number. */
67
- rail?: boolean;
67
+ rail?: boolean | "developer";
68
68
  /** The panel's own visibility predicate, composed into the command's. */
69
69
  when?: (ctx: CommandContext) => boolean;
70
70
  }
71
71
 
72
- /** How many rail panels get a ⌘N: the Navigator rail (§5.1) spends four per level group. */
73
- export const RAIL_CHORD_LIMIT = 8;
72
+ /** The Inspector strip's three tabs (§6): Page · Element · Assistant. */
73
+ export type InspectorStripId = "page" | "element" | "assistant";
74
74
 
75
75
  /**
76
- * The Inspector's four tabs, in the order §6 names them — which is the order ⌘⇧1–4 follow.
76
+ * One Inspector LEAF — a view the dock can show — in the order §6 names them, which is the order
77
+ * ⌘⇧1–5 follow: Page, Element's Content · Style · Logic, then Assistant.
77
78
  *
78
- * `"assistant"` is the fourth tab, not a dock of its own (there is no assistant column, §3.1), so
79
- * it is one of `shell.ts`'s `INSPECTOR_TAB_IDS` like the other three.
79
+ * `"assistant"` is a leaf, not a dock of its own (there is no assistant column, §3.1), so it is one
80
+ * of `shell.ts`'s `INSPECTOR_TAB_IDS` like the others. `strip` says which of the three strip tabs
81
+ * hosts the leaf: the three node views share Element, behind a sub-switch, because they share one
82
+ * target.
80
83
  */
81
84
  export interface InspectorTab {
82
- /** The stored `session.ui.rightTab` value, or `"assistant"` for the assistant dock. */
85
+ /** The stored `session.ui.rightTab` value. */
83
86
  id: string;
84
87
  title: string;
88
+ strip: InspectorStripId;
85
89
  }
86
90
 
87
91
  export const INSPECTOR_TABS: readonly InspectorTab[] = [
88
- { id: "properties", title: "Content" },
89
- { id: "style", title: "Style" },
90
- { id: "events", title: "Logic" },
92
+ { id: "page", strip: "page", title: "Page" },
93
+ { id: "properties", strip: "element", title: "Content" },
94
+ { id: "style", strip: "element", title: "Style" },
95
+ { id: "events", strip: "element", title: "Logic" },
96
+ { id: "assistant", strip: "assistant", title: "Assistant" },
97
+ ];
98
+
99
+ /** One tab of the strip, and the leaves it hosts. */
100
+ export interface InspectorStripTab {
101
+ id: InspectorStripId;
102
+ title: string;
103
+ }
104
+
105
+ /**
106
+ * The strip, in order. Three tabs, under the four-per-dock cap (`studio-ui-guidelines.md` §12.2):
107
+ * Element's sub-switch is inside a tab's body and is not a dock tab. The Page tab's title is
108
+ * contextual on screen (Page, Template, Component, Entry or Document, §6); this is its name.
109
+ */
110
+ export const INSPECTOR_STRIP: readonly InspectorStripTab[] = [
111
+ { id: "page", title: "Page" },
112
+ { id: "element", title: "Element" },
91
113
  { id: "assistant", title: "Assistant" },
92
114
  ];
93
115
 
@@ -119,7 +141,8 @@ export interface CommandDeps {
119
141
  */
120
142
  newWindow: () => void | Promise<void>;
121
143
  /**
122
- * The rail's panels in rail order, then the rail-less ones — the roster ⌘1–8 is generated from.
144
+ * The rail's panels in rail order, then the rail-less ones — the roster `panel.focus.*` is
145
+ * generated from.
123
146
  *
124
147
  * Every entry is a Navigator panel: the rail is the Navigator's, and a Bottom-dock tab is
125
148
  * addressed by `view.setBottomTab` instead — one door per surface. `panels/navigator-panels.ts`'s
@@ -131,8 +154,8 @@ export interface CommandDeps {
131
154
  panelRoster: readonly RailPanel[];
132
155
  /**
133
156
  * Toggle-FOCUS a panel: reveal it and take focus, or — when it already has focus — collapse the
134
- * dock hosting it and hand focus back to the pane. Deliberately not toggle-visible: ⌘1 pressed
135
- * from the canvas must land you in Files, not close it.
157
+ * dock hosting it and hand focus back to the pane. Deliberately not toggle-visible: running it
158
+ * from the canvas must land you in the panel, not close it.
136
159
  */
137
160
  focusPanel: (panelId: string) => void;
138
161
  /** Show an Inspector tab and focus the dock. `"assistant"` addresses the assistant dock. */
@@ -305,6 +328,7 @@ export function defaultCommands(deps: CommandDeps): AnyCommand[] {
305
328
  keybinding: "mod+z",
306
329
  menus: ["commandbar/primary", "palette"],
307
330
  group: "1_history",
331
+ order: 1,
308
332
  when: documentOpen,
309
333
  enablement: (ctx) => ctx.document.canUndo,
310
334
  requires: "a change to undo",
@@ -319,6 +343,7 @@ export function defaultCommands(deps: CommandDeps): AnyCommand[] {
319
343
  keybinding: ["mod+shift+z", "mod+y"],
320
344
  menus: ["commandbar/primary", "palette"],
321
345
  group: "1_history",
346
+ order: 2,
322
347
  when: documentOpen,
323
348
  enablement: (ctx) => ctx.document.canRedo,
324
349
  requires: "a change to redo",
@@ -545,7 +570,7 @@ export function defaultCommands(deps: CommandDeps): AnyCommand[] {
545
570
  * The other half of multi-window, and the half that had no door.
546
571
  *
547
572
  * "Open a project ELSEWHERE" is reachable from Open Project and from Recents
548
- * (desktop.md §4.2a); "open an EMPTY window" was reachable only from the ElectroBun
573
+ * (desktop.md §4.2a); "open an EMPTY window" was reachable only from the desktop
549
574
  * launcher's native application menu — so on a launcher whose window has no menu bar,
550
575
  * `newWindow` existed on the platform and could not be run. Gated on the same capability
551
576
  * every other multi-window verb is, so a host with one window does not offer it.
@@ -601,40 +626,39 @@ export function defaultCommands(deps: CommandDeps): AnyCommand[] {
601
626
  }
602
627
 
603
628
  /**
604
- * ⌘1–8 — one record per panel, generated from {@link CommandDeps.panelRoster}.
629
+ * One `panel.focus.<id>` record per Navigator panel, generated from
630
+ * {@link CommandDeps.panelRoster}.
605
631
  *
606
- * Generated rather than written out eight times for the reason the whole registry exists: the rail,
607
- * the chord, the palette row and the generated shortcut sheet are then four renderings of one list.
608
- * Only the first eight get a chord; a ninth panel keeps its name and its palette row, which is the
609
- * cost studio-ui-guidelines.md §12.2 puts on chrome.
632
+ * Generated rather than written out once per panel for the reason the whole registry exists: the
633
+ * rail, the palette row and the generated command sheet are then three renderings of one list.
634
+ *
635
+ * **No chords.** ⌘1–8 used to follow the rail here. The digit row now switches WORKSPACES (⌘1–5,
636
+ * `view.setWorkspace`), because the rail is Design's alone and a chord that reached a panel from
637
+ * Publish would open a column the workspace does not draw. The records stay, in the palette and
638
+ * bindable in Preferences › Keyboard, and the rail is the pointer's way to them.
610
639
  */
611
640
  export function panelFocusCommands(deps: CommandDeps): AnyCommand[] {
612
- let chordsSpent = 0;
613
- return deps.panelRoster.map((panel) => {
614
- const command: AnyCommand = {
615
- id: `panel.focus.${panel.id}`,
616
- title: `Show ${panel.title}`,
617
- category: "View",
618
- // Application, like `view.setActivity`: revealing a panel arranges the workspace. What the
619
- // PANEL acts on is the panel record's own level, and that is `registerPanel()`'s field.
620
- level: "application",
621
- menus: ["palette"],
622
- group: "4_docks",
623
- requires: "an open project",
624
- // The panel's OWN `when` composes in, so a declared-but-unbuilt surface (Search, Problems)
625
- // Has no palette row and no live chord — the record exists, the affordance does not.
626
- when: (ctx: CommandContext) => ctx.project.open && (panel.when?.(ctx) ?? true),
627
- run: () => deps.focusPanel(panel.id),
628
- };
629
- if (panel.rail !== false && chordsSpent < RAIL_CHORD_LIMIT) {
630
- chordsSpent += 1;
631
- command.keybinding = `mod+${chordsSpent}`;
632
- }
633
- return command;
634
- });
641
+ return deps.panelRoster.map((panel): AnyCommand => ({
642
+ id: `panel.focus.${panel.id}`,
643
+ title: `Show ${panel.title}`,
644
+ category: "View",
645
+ // Application, like `view.setActivity`: revealing a panel arranges the workspace. What the
646
+ // PANEL acts on is the panel record's own level, and that is `registerPanel()`'s field.
647
+ level: "application",
648
+ menus: ["palette"],
649
+ group: "4_docks",
650
+ requires: "an open project",
651
+ // The panel's OWN `when` composes in, so a declared-but-unbuilt surface (Search, Problems)
652
+ // Has no palette row — the record exists, the affordance does not.
653
+ when: (ctx: CommandContext) => ctx.project.open && (panel.when?.(ctx) ?? true),
654
+ run: () => deps.focusPanel(panel.id),
655
+ }));
635
656
  }
636
657
 
637
- /** ⌘⇧1–4 — one record per Inspector tab, generated from {@link INSPECTOR_TABS}. */
658
+ /**
659
+ * ⌘⇧1–5 — one record per Inspector leaf, generated from {@link INSPECTOR_TABS}, so the chords
660
+ * follow the strip left to right: Page, Element › Content, Style, Logic, then Assistant.
661
+ */
638
662
  export function inspectorFocusCommands(deps: CommandDeps): AnyCommand[] {
639
663
  return INSPECTOR_TABS.map((tab, index) => {
640
664
  const command: AnyCommand = {
@@ -27,6 +27,7 @@
27
27
  * colliding still throws, because that one is a bug in the app and nobody's preference.
28
28
  */
29
29
 
30
+ import { isString } from "@jxsuite/schema/guards";
30
31
  import { KEY_SCOPES } from "./levels";
31
32
  import type { KeyScope } from "./levels";
32
33
 
@@ -36,33 +37,33 @@ const MODIFIER_ORDER = ["mod", "ctrl", "alt", "shift"] as const;
36
37
  type Modifier = (typeof MODIFIER_ORDER)[number];
37
38
 
38
39
  /** Spellings people actually write, mapped onto the canonical four. */
39
- const MODIFIER_ALIASES: Readonly<Record<string, Modifier>> = {
40
- mod: "mod",
41
- cmd: "mod",
42
- command: "mod",
43
- meta: "mod",
44
- super: "mod",
45
- ctrl: "ctrl",
46
- control: "ctrl",
47
- alt: "alt",
48
- opt: "alt",
49
- option: "alt",
50
- shift: "shift",
51
- };
40
+ const MODIFIER_ALIASES = new Map<string, Modifier>([
41
+ ["mod", "mod"],
42
+ ["cmd", "mod"],
43
+ ["command", "mod"],
44
+ ["meta", "mod"],
45
+ ["super", "mod"],
46
+ ["ctrl", "ctrl"],
47
+ ["control", "ctrl"],
48
+ ["alt", "alt"],
49
+ ["opt", "alt"],
50
+ ["option", "alt"],
51
+ ["shift", "shift"],
52
+ ]);
52
53
 
53
54
  /** Key aliases — arrow/space spellings and the `KeyboardEvent.key` values that differ. */
54
- const KEY_ALIASES: Readonly<Record<string, string>> = {
55
- up: "arrowup",
56
- down: "arrowdown",
57
- left: "arrowleft",
58
- right: "arrowright",
59
- esc: "escape",
60
- space: " ",
61
- spacebar: " ",
62
- del: "delete",
63
- plus: "=",
64
- return: "enter",
65
- };
55
+ const KEY_ALIASES = new Map<string, string>([
56
+ ["up", "arrowup"],
57
+ ["down", "arrowdown"],
58
+ ["left", "arrowleft"],
59
+ ["right", "arrowright"],
60
+ ["esc", "escape"],
61
+ ["space", " "],
62
+ ["spacebar", " "],
63
+ ["del", "delete"],
64
+ ["plus", "="],
65
+ ["return", "enter"],
66
+ ]);
66
67
 
67
68
  /** How each modifier prints, per platform. */
68
69
  const MAC_GLYPHS: Readonly<Record<Modifier, string>> = {
@@ -80,18 +81,18 @@ const PC_LABELS: Readonly<Record<Modifier, string>> = {
80
81
  };
81
82
 
82
83
  /** Keys whose printed name is not just the uppercased token. */
83
- const KEY_LABELS: Readonly<Record<string, string>> = {
84
- arrowup: "↑",
85
- arrowdown: "↓",
86
- arrowleft: "←",
87
- arrowright: "→",
88
- " ": "Space",
89
- escape: "Esc",
90
- enter: "Enter",
91
- tab: "Tab",
92
- delete: "Delete",
93
- backspace: "Backspace",
94
- };
84
+ const KEY_LABELS = new Map<string, string>([
85
+ ["arrowup", "↑"],
86
+ ["arrowdown", "↓"],
87
+ ["arrowleft", "←"],
88
+ ["arrowright", "→"],
89
+ [" ", "Space"],
90
+ ["escape", "Esc"],
91
+ ["enter", "Enter"],
92
+ ["tab", "Tab"],
93
+ ["delete", "Delete"],
94
+ ["backspace", "Backspace"],
95
+ ]);
95
96
 
96
97
  /**
97
98
  * The five fields the keymap reads off a keyboard event.
@@ -159,12 +160,12 @@ export function parseChord(chord: string): ParsedChord {
159
160
  // Parses the same as "Cmd+Shift+P".
160
161
  const trimmed = token.trim();
161
162
  const lower = trimmed === "" ? " " : trimmed.toLowerCase();
162
- const modifier = MODIFIER_ALIASES[lower];
163
+ const modifier = MODIFIER_ALIASES.get(lower);
163
164
  if (modifier) {
164
165
  parsed[modifier] = true;
165
166
  continue;
166
167
  }
167
- parsed.key = KEY_ALIASES[lower] ?? lower;
168
+ parsed.key = KEY_ALIASES.get(lower) ?? lower;
168
169
  }
169
170
  if (!parsed.key) {
170
171
  throw new Error(`keybinding "${chord}" has no key — a chord needs more than modifiers`);
@@ -185,6 +186,9 @@ export function normalizeChord(chord: string): string {
185
186
 
186
187
  /** Whether the current platform is a mac. `navigator` is injectable so tests never touch globals. */
187
188
  export function isMacPlatform(
189
+ /* SAFETY: this module types without the DOM lib, so `globalThis` does not declare `navigator`.
190
+ Where a host provides one (every webview, Bun), its `platform` and `userAgent` are strings,
191
+ which is all `PlatformInfo` reads; where none exists the `?? {}` default answers. */
188
192
  nav: PlatformInfo = (globalThis as { navigator?: PlatformInfo }).navigator ?? {},
189
193
  ): boolean {
190
194
  return /mac/i.test(nav.platform ?? nav.userAgent ?? "");
@@ -209,7 +213,7 @@ export function chordFromEvent(event: KeyChordEvent, mac: boolean): string {
209
213
  chord needs more than modifiers") — so every bare modifier press threw out of `resolveEvent`,
210
214
  into the keydown listener, and onto the console. `""` is the honest answer, and
211
215
  {@link Keymap.resolveEvent} reads it as "no chord yet". */
212
- if (MODIFIER_ALIASES[key]) {
216
+ if (MODIFIER_ALIASES.has(key)) {
213
217
  return "";
214
218
  }
215
219
  const parsed: ParsedChord = {
@@ -219,7 +223,7 @@ export function chordFromEvent(event: KeyChordEvent, mac: boolean): string {
219
223
  // Shift is implied by an uppercase letter but a chord table cannot rely on that: with ⇧ held
220
224
  // `e.key` is "Z" for ⌘⇧Z and "?" for ⇧/, so the flag is the only stable signal.
221
225
  shift: event.shiftKey,
222
- key: KEY_ALIASES[key] ?? key,
226
+ key: KEY_ALIASES.get(key) ?? key,
223
227
  };
224
228
  return serializeChord(parsed);
225
229
  }
@@ -229,7 +233,7 @@ export function formatChord(chord: string, mac: boolean): string {
229
233
  const parsed = parseChord(chord);
230
234
  const held = MODIFIER_ORDER.filter((modifier) => parsed[modifier]);
231
235
  const key =
232
- KEY_LABELS[parsed.key] ??
236
+ KEY_LABELS.get(parsed.key) ??
233
237
  (parsed.key.length === 1
234
238
  ? parsed.key.toUpperCase()
235
239
  : parsed.key.charAt(0).toUpperCase() + parsed.key.slice(1));
@@ -386,7 +390,7 @@ export function createKeymap(options: { mac?: boolean } = {}): Keymap {
386
390
  if (!raw) {
387
391
  return [];
388
392
  }
389
- return (typeof raw === "string" ? [raw] : [...raw]).map((chord) => normalizeChord(chord));
393
+ return (isString(raw) ? [raw] : [...raw]).map((chord) => normalizeChord(chord));
390
394
  }
391
395
 
392
396
  function tableFor(scope: KeyScope): Map<string, Claim> {
@@ -543,14 +547,23 @@ export function createKeymap(options: { mac?: boolean } = {}): Keymap {
543
547
  * The command id is deliberately dropped — the frame decides whether to forward, never what runs —
544
548
  * and the projection is a pure function of the keymap so the host can recompute and repost it
545
549
  * whenever a rebinding lands.
550
+ *
551
+ * `except` names commands whose chords the second realm must leave alone: a command that never
552
+ * applies to what that realm draws (`canvas/iframe-keys.ts` `HOST_ONLY_COMMANDS`) would otherwise
553
+ * have the realm cancel the keystroke's own default for nothing.
546
554
  */
547
555
  export function chordsInScopes<S extends KeyScope>(
548
556
  keymap: Keymap,
549
557
  scopes: readonly S[],
558
+ except: ReadonlySet<string> = new Set(),
550
559
  ): { chord: string; scope: S }[] {
551
560
  const seen = new Set<string>();
552
561
  const out: { chord: string; scope: S }[] = [];
553
562
  for (const entry of keymap.entries()) {
563
+ // A command that can never run on behalf of the second realm must not make it swallow a key.
564
+ if (except.has(entry.commandId)) {
565
+ continue;
566
+ }
554
567
  /* `find` rather than a `Set.has` test: the narrowed member is what makes the result carry the
555
568
  CALLER's scope union. The canvas frame's table is three scopes wide (`FRAME_KEY_SCOPES`) and
556
569
  has to stay that way across the bridge, where `SyncedChord` declares exactly those three —
@@ -176,17 +176,20 @@ export type PanelPlacement = (typeof PANEL_PLACEMENTS)[number];
176
176
  export const PANEL_PLACEMENT_MATRIX: Readonly<Record<PanelPlacement, PlacementRule>> = {
177
177
  "rail/project": {
178
178
  admits: ["project"],
179
- note: "the rail's upper group — Files, Search, Source Control, Problems",
179
+ note: "the rail's upper group — Site, and Files with the developer panels on",
180
180
  },
181
181
  "rail/document": {
182
182
  admits: ["document"],
183
- note: "the rail's lower group — Outline, Page, Data, Packages",
183
+ note: "the rail's lower group — Outline, Data, and Packages with the developer panels on",
184
184
  },
185
185
  navigator: {
186
186
  admits: ["project", "document"],
187
187
  note: "whichever level the hosted panel declares; the panel header prints it",
188
188
  },
189
- inspector: { admits: ["selection"], note: "the Inspector's tabs are selection surfaces" },
189
+ inspector: {
190
+ admits: ["document", "selection"],
191
+ note: "Page is the open document's tab, Element the selection's (§6)",
192
+ },
190
193
  "dock.bottom": { admits: ["project", "document"], note: "the panel header states which" },
191
194
  };
192
195
 
@@ -196,8 +199,11 @@ export interface PlaceablePanel {
196
199
  level: Level;
197
200
  /** The dock hosting the panel's body. */
198
201
  dock: "navigator" | "inspector" | "bottom";
199
- /** `false` for a panel with no rail button — it declares no rail-group placement. */
200
- rail?: boolean | undefined;
202
+ /**
203
+ * `false` for a panel with no rail button — it declares no rail-group placement. `"developer"` is
204
+ * a rail button only while the developer panels are shown, and it still holds its placement.
205
+ */
206
+ rail?: boolean | "developer" | undefined;
201
207
  }
202
208
 
203
209
  /** One rejected (panel, placement) pair. Shaped like {@link PlacementViolation}, keyed by panel. */
@@ -231,7 +237,7 @@ export function panelPlacements(panel: PlaceablePanel): string[] {
231
237
 
232
238
  /** Whether `value` is one of the {@link PANEL_PLACEMENTS}. */
233
239
  export function isPanelPlacement(value: string): value is PanelPlacement {
234
- return (PANEL_PLACEMENTS as readonly string[]).includes(value);
240
+ return PANEL_PLACEMENTS.some((placement) => placement === value);
235
241
  }
236
242
 
237
243
  /** Check one Panel record against {@link PANEL_PLACEMENT_MATRIX}. */
@@ -300,12 +306,12 @@ export interface PlacementViolation {
300
306
 
301
307
  /** Whether `placement` is one of the {@link PLACEMENTS}. */
302
308
  export function isPlacement(value: string): value is Placement {
303
- return (PLACEMENTS as readonly string[]).includes(value);
309
+ return PLACEMENTS.some((placement) => placement === value);
304
310
  }
305
311
 
306
312
  /** Whether `level` is one of the {@link LEVELS}. */
307
313
  export function isLevel(value: string): value is Level {
308
- return (LEVELS as readonly string[]).includes(value);
314
+ return LEVELS.some((level) => level === value);
309
315
  }
310
316
 
311
317
  /** Whether the matrix lets a `level` record render in `placement`. */
@@ -25,6 +25,7 @@
25
25
  * studio.ts, and lets a test state a context without standing up the app.
26
26
  */
27
27
 
28
+ import { isFunction, isString } from "@jxsuite/schema/guards";
28
29
  import { resolveI18n } from "@jxsuite/schema/locale";
29
30
  import { componentRegistry } from "../files/components";
30
31
  import { getNodeAtPath, projectState } from "../store";
@@ -36,7 +37,7 @@ import { hasTyping } from "../tabs/typing";
36
37
  import { collabState } from "../collab/collab-state";
37
38
 
38
39
  import { canvasViewForMode, editorKindForMode, emptyContext } from "./context";
39
- import type { CommandContext, FocusRegion } from "./context";
40
+ import type { CommandContext } from "./context";
40
41
  import type { StudioPlatform } from "../types";
41
42
 
42
43
  /** Elements that own the keyboard while focused. Matches the old listener's target test exactly. */
@@ -86,7 +87,7 @@ export interface LiveContextSources {
86
87
 
87
88
  /** `capability.*` is presence-of-method on the PAL — the check every call site does by hand today. */
88
89
  function capabilities(platform: StudioPlatform | null): CommandContext["capability"] {
89
- const has = (key: keyof StudioPlatform) => typeof platform?.[key] === "function";
90
+ const has = (key: keyof StudioPlatform) => isFunction(platform?.[key]);
90
91
  return {
91
92
  dataRows: has("dataRows"),
92
93
  // The real member now, not the `codeService` stand-in it was minted against: the usage query is
@@ -96,6 +97,7 @@ function capabilities(platform: StudioPlatform | null): CommandContext["capabili
96
97
  importSite: has("importSite"),
97
98
  openProjectInNewWindow: has("openProjectInNewWindow"),
98
99
  readFileBytes: has("readFileBytes"),
100
+ publish: has("cfApi"),
99
101
  // Multi-window is a desktop-only family; `newWindow` is the one every member implies.
100
102
  windowControls: has("newWindow"),
101
103
  };
@@ -132,6 +134,7 @@ export function createLiveContext(sources: LiveContextSources): () => CommandCon
132
134
  ctx.git.ahead = shell.git.status?.ahead ?? 0;
133
135
  ctx.git.behind = shell.git.status?.behind ?? 0;
134
136
  ctx.git.dirtyCount = shell.git.status?.files.length ?? 0;
137
+ ctx.workspace.id = shell.workspace;
135
138
 
136
139
  ctx.document.open = tab !== null;
137
140
  // Typing still in a source buffer is unsaved work too, though the document has not seen it.
@@ -161,18 +164,17 @@ export function createLiveContext(sources: LiveContextSources): () => CommandCon
161
164
  const selection = primarySelection(paths);
162
165
  if (selection) {
163
166
  const node = getNodeAtPath(tab!.doc.document, selection);
167
+ const tagName = node?.tagName;
164
168
  ctx.selection.count = paths.length;
165
169
  ctx.selection.paths = paths.map((path) => [...path]);
166
170
  // Every remaining fact describes the PRIMARY — the one node a single-target verb addresses —
167
171
  // Except `isRoot`, which is the batch's own gate: a batch containing the document element
168
172
  // Cannot be deleted or duplicated any more than that element could be on its own.
169
- ctx.selection.kind = typeof node?.tagName === "string" ? node.tagName : "";
173
+ ctx.selection.kind = isString(tagName) ? tagName : "";
170
174
  // A path of fewer than two segments addresses the document element itself — the same test
171
175
  // `shortcuts.ts` spelled as `selection.length >= 2` at four separate call sites.
172
176
  ctx.selection.isRoot = paths.some((path) => path.length < 2);
173
- ctx.selection.isComponentInstance = componentRegistry.some(
174
- (c) => c.tagName === node?.tagName,
175
- );
177
+ ctx.selection.isComponentInstance = componentRegistry.some((c) => c.tagName === tagName);
176
178
  ctx.selection.isRepeater = node?.$prototype === "Array";
177
179
  }
178
180
  // Layout chrome is NOT a document selection: the node is not in the open page at all.
@@ -187,7 +189,7 @@ export function createLiveContext(sources: LiveContextSources): () => CommandCon
187
189
  being typed into. The stack asks "is something being typed into"; a record asks "is the
188
190
  thing being typed into the page". */
189
191
  ctx.caret.inCanvas = sources.isCaretActive();
190
- ctx.focus.region = shell.focusRegion as FocusRegion;
192
+ ctx.focus.region = shell.focusRegion;
191
193
  ctx.modal.open = sources.isModalOpen();
192
194
 
193
195
  if (tab) {
@@ -17,6 +17,7 @@
17
17
  * between runs is a CI diff nobody can review.
18
18
  */
19
19
 
20
+ import { isString } from "@jxsuite/schema/guards";
20
21
  import { formatChord, normalizeChord } from "./keymap";
21
22
  import { CATEGORIES } from "./levels";
22
23
  import type { KeybindingOverrides } from "./keymap";
@@ -83,7 +84,7 @@ function chordsOf(command: AnyCommand): string[] {
83
84
  if (!raw) {
84
85
  return [];
85
86
  }
86
- return (typeof raw === "string" ? [raw] : [...raw]).map((chord) => normalizeChord(chord));
87
+ return (isString(raw) ? [raw] : [...raw]).map((chord) => normalizeChord(chord));
87
88
  }
88
89
 
89
90
  /**
@@ -36,13 +36,12 @@ import { createKeymap } from "./keymap";
36
36
  import type { KeyChordEvent, Keymap, KeymapMatch } from "./keymap";
37
37
  import { checkRecordPlacements } from "./levels";
38
38
  import type { Category, KeyScope, Level, Placement } from "./levels";
39
+ import { isFunction } from "@jxsuite/schema/guards";
39
40
  import { coerceArgs } from "./command-args";
41
+ import type { CommandArgsSchema, CommandArgValues } from "./command-args";
40
42
  import { runReported } from "./run-reported";
41
43
  import type { CommandContext } from "./context";
42
44
 
43
- /** Arguments as they arrive from a palette prompt, an automation manifest step or an AI tool call. */
44
- export type CommandArgs = Record<string, unknown>;
45
-
46
45
  /** How an action's effect is undone — surfaced to the user before an agent runs it. */
47
46
  export type UndoScope = "document" | "project" | "none";
48
47
 
@@ -77,11 +76,17 @@ export interface Command<A = void> {
77
76
  * shot check's contract AND what {@link CommandRegistry.run} coerces the received record against
78
77
  * before `run` sees it (`command-args.ts`'s `coerceArgs`). One object, four readers.
79
78
  */
80
- args?: object;
79
+ args?: CommandArgsSchema;
81
80
  /** Surfaces this command renders in. Defaults to `["palette"]`. */
82
81
  menus?: readonly Placement[];
83
82
  /** Menu ordering key: "1_clipboard", "3_structure", "9_danger". */
84
83
  group?: string;
84
+ /**
85
+ * Position within its {@link Command.group}, lower first. A command without one follows the
86
+ * ordered commands of its group, by title. A group whose members have a reading order of their
87
+ * own (Undo before Redo) states it here, because the title is an accident of the language.
88
+ */
89
+ order?: number;
85
90
  /**
86
91
  * How the effect is undone. Also the LEDGER SCOPE of a bridged write:
87
92
  * `services/ai-command-tools.ts` records one "Changed N files" entry per path a projected run
@@ -216,7 +221,7 @@ export interface CommandRegistry {
216
221
  * `RangeError` naming the argument when `args` does not fit the record's schema — synchronously,
217
222
  * before `run` is entered, whichever surface the call came from.
218
223
  */
219
- run: (id: string, args?: CommandArgs) => void | Promise<void>;
224
+ run: (id: string, args?: CommandArgValues) => void | Promise<void>;
220
225
  /** The chord index, conflict-checked at registration. */
221
226
  keymap: Keymap;
222
227
  /** Resolve a keyboard event through a scope stack and run what it hits. */
@@ -254,7 +259,7 @@ function checkProjection(command: AnyCommand, toolNames: ReadonlyMap<string, str
254
259
  `command "${command.id}" aiTool name "${tool.name}" is already projected by "${claimant}"`,
255
260
  );
256
261
  }
257
- if (typeof tool.report !== "function") {
262
+ if (!isFunction(tool.report)) {
258
263
  throw new TypeError(
259
264
  `command "${command.id}" declares aiTool without a report: a tool that can only say ` +
260
265
  `"done" is refused`,
@@ -270,8 +275,7 @@ function checkProjection(command: AnyCommand, toolNames: ReadonlyMap<string, str
270
275
  selector's `paths` property in FRONT of the record's own `args`, so a record that declares its
271
276
  own `paths` would have two definitions of one argument — the model would read the record's
272
277
  description and the bridge would hand the value to the selector. */
273
- const properties = (command.args as { properties?: Record<string, unknown> } | undefined)
274
- ?.properties;
278
+ const properties = command.args?.properties;
275
279
  if (command.level === "selection" && properties && Object.hasOwn(properties, "paths")) {
276
280
  throw new Error(
277
281
  `command "${command.id}" is selection-level and may not declare "paths": the assistant ` +
@@ -341,11 +345,11 @@ export function createCommandRegistry(options: CommandRegistryOptions): CommandR
341
345
  if (violations.length > 0) {
342
346
  throw new Error(`command "${command.id}" ${violations[0]!.message}`);
343
347
  }
344
- checkProjection(command as AnyCommand, toolNames);
348
+ checkProjection(command, toolNames);
345
349
  // Chord conflicts throw from the keymap; do this LAST so a rejected record leaves the
346
350
  // Registry untouched in every failure mode — the tool name is claimed only after it.
347
351
  keymap.add(command);
348
- commands.set(command.id, command as AnyCommand);
352
+ commands.set(command.id, command);
349
353
  if (command.aiTool) {
350
354
  toolNames.set(command.aiTool.name, command.id);
351
355
  }
@@ -373,7 +377,10 @@ export function createCommandRegistry(options: CommandRegistryOptions): CommandR
373
377
  (command.menus ?? ["palette"]).includes(placement) && visibleWith(command, ctx),
374
378
  )
375
379
  .toSorted(
376
- (a, b) => (a.group ?? "").localeCompare(b.group ?? "") || a.title.localeCompare(b.title),
380
+ (a, b) =>
381
+ (a.group ?? "").localeCompare(b.group ?? "") ||
382
+ (a.order ?? Number.POSITIVE_INFINITY) - (b.order ?? Number.POSITIVE_INFINITY) ||
383
+ a.title.localeCompare(b.title),
377
384
  );
378
385
  },
379
386
  isVisible(id) {
@@ -404,6 +411,10 @@ export function createCommandRegistry(options: CommandRegistryOptions): CommandR
404
411
  their typed readers; `coerceArgs` dispatches to the same functions, so the two cannot
405
412
  disagree. A record with no `args` takes whatever it was handed, as it always has. */
406
413
  const coerced = command.args ? coerceArgs(id, command.args, args) : args;
414
+ /* SAFETY: a stored record is `Command<never>` because the map erases each record's own `A`.
415
+ The runtime contract for that erased `A` is the record's `args` schema, which `coerceArgs`
416
+ has just applied (every key its reader's return value, an undeclared key refused); a
417
+ record with no schema takes the caller's record as it always has. */
407
418
  return command.run(ctx, coerced as never);
408
419
  },
409
420
  keymap,