@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
@@ -27,26 +27,55 @@
27
27
  * this — an id outside a declared set — and one refusal shape is easier to catch than two.
28
28
  */
29
29
 
30
+ import { isBoolean, isNonNullObject, isNumber, isString } from "@jxsuite/schema/guards";
31
+ import type { JsonValue } from "@jxsuite/schema/types";
32
+
33
+ /**
34
+ * One received argument: a JSON value, or `undefined` for a key a caller left out. Every surface
35
+ * that sends arguments speaks JSON (a palette prompt, a manifest step, an AI tool call), and an
36
+ * explicit `undefined` is how a programmatic caller spells "absent" — JSON cannot carry one.
37
+ */
38
+ export type CommandArgValue = JsonValue | undefined;
39
+
30
40
  /** Arguments as they arrive from a palette prompt, a manifest step or an AI tool call. */
31
- export type CommandArgValues = Record<string, unknown>;
41
+ export type CommandArgValues = Record<string, CommandArgValue>;
32
42
 
33
43
  /** `command "<id>" argument "<key>": <problem>` — the one sentence shape every failure here uses. */
34
44
  function refuse(commandId: string, key: string, problem: string): RangeError {
35
45
  return new RangeError(`command "${commandId}" argument "${key}": ${problem}`);
36
46
  }
37
47
 
48
+ /**
49
+ * The `typeof` word for a non-string JSON value, as every refusal sentence has always printed it:
50
+ * `null`, arrays and objects are all `object` to `typeof`, so they are all `object` here.
51
+ */
52
+ function typeWordOf(value: JsonValue): string {
53
+ if (isNumber(value)) {
54
+ return "number";
55
+ }
56
+ if (isBoolean(value)) {
57
+ return "boolean";
58
+ }
59
+ return isString(value) ? "string" : "object";
60
+ }
61
+
38
62
  /** How a received value is quoted back to the caller. Strings keep their quotes; nothing is elided. */
39
- function describe(value: unknown): string {
63
+ function describe(value: CommandArgValue): string {
40
64
  if (value === undefined) {
41
65
  return "missing";
42
66
  }
43
- return typeof value === "string" ? `"${value}"` : `${typeof value} ${JSON.stringify(value)}`;
67
+ return isString(value) ? `"${value}"` : `${typeWordOf(value)} ${JSON.stringify(value)}`;
68
+ }
69
+
70
+ /** Whether a value is a `JxPath`: an array whose every segment is a string key or a numeric index. */
71
+ function isPathSegments(value: CommandArgValue): value is (string | number)[] {
72
+ return Array.isArray(value) && value.every((segment) => isString(segment) || isNumber(segment));
44
73
  }
45
74
 
46
75
  /** A required string argument. */
47
76
  export function stringArg(commandId: string, args: CommandArgValues, key: string): string {
48
77
  const value = args[key];
49
- if (typeof value !== "string" || value === "") {
78
+ if (!isString(value) || value === "") {
50
79
  throw refuse(commandId, key, `expected a non-empty string, got ${describe(value)}`);
51
80
  }
52
81
  return value;
@@ -67,7 +96,7 @@ export function optionalStringArg(
67
96
  /** A required finite number argument. `NaN` and `Infinity` are refusals, not values. */
68
97
  export function numberArg(commandId: string, args: CommandArgValues, key: string): number {
69
98
  const value = args[key];
70
- if (typeof value !== "number" || !Number.isFinite(value)) {
99
+ if (!isNumber(value) || !Number.isFinite(value)) {
71
100
  throw refuse(commandId, key, `expected a finite number, got ${describe(value)}`);
72
101
  }
73
102
  return value;
@@ -84,7 +113,7 @@ export function numberArg(commandId: string, args: CommandArgValues, key: string
84
113
  */
85
114
  export function integerArg(commandId: string, args: CommandArgValues, key: string): number {
86
115
  const value = args[key];
87
- if (typeof value !== "number" || !Number.isInteger(value)) {
116
+ if (!isNumber(value) || !Number.isInteger(value)) {
88
117
  throw refuse(commandId, key, `expected an integer, got ${describe(value)}`);
89
118
  }
90
119
  return value;
@@ -116,7 +145,7 @@ export function boundedNumberArg(
116
145
  /** A required boolean argument. A setter's whole point is that `false` is a value, so no default. */
117
146
  export function booleanArg(commandId: string, args: CommandArgValues, key: string): boolean {
118
147
  const value = args[key];
119
- if (typeof value !== "boolean") {
148
+ if (!isBoolean(value)) {
120
149
  throw refuse(commandId, key, `expected a boolean, got ${describe(value)}`);
121
150
  }
122
151
  return value;
@@ -136,7 +165,9 @@ export function enumArg<T extends string>(
136
165
  declared: readonly T[],
137
166
  ): T {
138
167
  const value = args[key];
139
- if (typeof value !== "string" || !(declared as readonly string[]).includes(value)) {
168
+ // `find` hands back the DECLARED entry, typed `T`, which is the same string the caller sent.
169
+ const match = isString(value) ? declared.find((entry) => entry === value) : undefined;
170
+ if (match === undefined) {
140
171
  // `none` for an empty set: a derived enum (`derivedEnumProperty`) is honestly empty before the
141
172
  // Project supplies its values, and "declared: " with nothing after it reads as a truncation.
142
173
  throw refuse(
@@ -145,7 +176,7 @@ export function enumArg<T extends string>(
145
176
  `${describe(value)} is not declared — declared: ${declared.join(", ") || "none"}`,
146
177
  );
147
178
  }
148
- return value as T;
179
+ return match;
149
180
  }
150
181
 
151
182
  /**
@@ -160,17 +191,14 @@ export function pathArg(
160
191
  key: string,
161
192
  ): (string | number)[] {
162
193
  const value = args[key];
163
- if (
164
- !Array.isArray(value) ||
165
- !value.every((s) => typeof s === "string" || typeof s === "number")
166
- ) {
194
+ if (!isPathSegments(value)) {
167
195
  throw refuse(
168
196
  commandId,
169
197
  key,
170
198
  `expected an array of path segments (strings or numbers), got ${describe(value)}`,
171
199
  );
172
200
  }
173
- return value as (string | number)[];
201
+ return value;
174
202
  }
175
203
 
176
204
  /** A path argument that may be `null` — "select nothing" is a state a user can be in. */
@@ -203,17 +231,14 @@ export function pathListArg(
203
231
  throw refuse(commandId, key, `expected an array of document paths, got ${describe(value)}`);
204
232
  }
205
233
  return value.map((entry, i) => {
206
- if (
207
- !Array.isArray(entry) ||
208
- !entry.every((s) => typeof s === "string" || typeof s === "number")
209
- ) {
234
+ if (!isPathSegments(entry)) {
210
235
  throw refuse(
211
236
  commandId,
212
237
  key,
213
238
  `entry ${i} is not a document path — expected an array of segments, got ${describe(entry)}`,
214
239
  );
215
240
  }
216
- return entry as (string | number)[];
241
+ return entry;
217
242
  });
218
243
  }
219
244
 
@@ -224,11 +249,39 @@ export function pathListArg(
224
249
  // Them ONE call site, so a schema that disagrees with its coercion is now a refusal rather than a
225
250
  // Defect a reviewer has to spot — which is what this module exists to prevent.
226
251
 
252
+ /**
253
+ * The JSON Schema keywords a command property uses — what the builders below write and what
254
+ * {@link coerceArgs} reads. Read loosely: a keyword with no reader (`description`, `default`) is
255
+ * carried for the palette and the AI tool, and never consulted by the coercion.
256
+ */
257
+ export interface PropertySchema {
258
+ description?: string;
259
+ title?: string;
260
+ default?: JsonValue;
261
+ type?: string | readonly string[];
262
+ /** Strings only: the `enum` row is {@link enumArg}, which admits nothing but a declared string. */
263
+ enum?: readonly string[];
264
+ const?: JsonValue;
265
+ oneOf?: readonly PropertySchema[];
266
+ items?: PropertySchema;
267
+ minimum?: number;
268
+ maximum?: number;
269
+ }
270
+
271
+ /** The object schema {@link argsSchema} writes, as {@link coerceArgs} reads it. */
272
+ export interface CommandArgsSchema {
273
+ additionalProperties?: boolean;
274
+ properties?: Record<string, PropertySchema>;
275
+ required?: readonly string[];
276
+ /** Always `"object"` as {@link argsSchema} writes it; the coercion never reads it. */
277
+ type?: string;
278
+ }
279
+
227
280
  /** `{ type: "object", properties, required, additionalProperties: false }` in one call. */
228
281
  export function argsSchema(
229
- properties: Record<string, object>,
282
+ properties: Record<string, PropertySchema>,
230
283
  required: readonly string[] = Object.keys(properties),
231
- ): object {
284
+ ): CommandArgsSchema {
232
285
  return {
233
286
  additionalProperties: false,
234
287
  properties,
@@ -238,7 +291,7 @@ export function argsSchema(
238
291
  }
239
292
 
240
293
  /** A string property constrained to a declared set, with the human sentence the palette shows. */
241
- export function enumProperty(declared: readonly string[], description: string): object {
294
+ export function enumProperty(declared: readonly string[], description: string): PropertySchema {
242
295
  return { description, enum: [...declared], type: "string" };
243
296
  }
244
297
 
@@ -261,7 +314,7 @@ export function enumProperty(declared: readonly string[], description: string):
261
314
  export function derivedEnumProperty(
262
315
  declared: () => readonly string[],
263
316
  description: string,
264
- ): object {
317
+ ): PropertySchema {
265
318
  return {
266
319
  description,
267
320
  get enum() {
@@ -275,17 +328,17 @@ export function derivedEnumProperty(
275
328
  export function numberProperty(
276
329
  description: string,
277
330
  bounds: { minimum?: number; maximum?: number } = {},
278
- ): object {
331
+ ): PropertySchema {
279
332
  return { description, type: "number", ...bounds };
280
333
  }
281
334
 
282
335
  /** A boolean property. Named `open`/`enabled`/… by the caller; the description carries the sense. */
283
- export function booleanProperty(description: string): object {
336
+ export function booleanProperty(description: string): PropertySchema {
284
337
  return { description, type: "boolean" };
285
338
  }
286
339
 
287
340
  /** A `JxPath` property — an array of string keys and numeric indexes. */
288
- export function pathProperty(description: string, nullable = false): object {
341
+ export function pathProperty(description: string, nullable = false): PropertySchema {
289
342
  const path = {
290
343
  items: { type: ["string", "number"] },
291
344
  type: "array",
@@ -294,7 +347,7 @@ export function pathProperty(description: string, nullable = false): object {
294
347
  }
295
348
 
296
349
  /** A property holding a LIST of `JxPath`s — an array of arrays of segments. */
297
- export function pathListProperty(description: string): object {
350
+ export function pathListProperty(description: string): PropertySchema {
298
351
  return {
299
352
  description,
300
353
  items: { items: { type: ["string", "number"] }, type: "array" },
@@ -303,7 +356,7 @@ export function pathListProperty(description: string): object {
303
356
  }
304
357
 
305
358
  /** A free-form string property. */
306
- export function stringProperty(description: string): object {
359
+ export function stringProperty(description: string): PropertySchema {
307
360
  return { description, type: "string" };
308
361
  }
309
362
 
@@ -314,24 +367,6 @@ export function stringProperty(description: string): object {
314
367
  // Validator that agrees with them today. What the schema cannot say (a breakpoint the document
315
368
  // Defines, a path that addresses a node) stays in `run`; the schema owns the shape.
316
369
 
317
- /** The JSON Schema keywords a command property uses. Read loosely; unknown keywords are ignored. */
318
- interface PropertySchema {
319
- type?: string | readonly string[];
320
- enum?: readonly unknown[];
321
- const?: unknown;
322
- oneOf?: readonly PropertySchema[];
323
- items?: PropertySchema;
324
- minimum?: number;
325
- maximum?: number;
326
- }
327
-
328
- /** The object schema `argsSchema` writes, as {@link coerceArgs} reads it. */
329
- interface ArgsSchemaShape {
330
- properties?: Record<string, PropertySchema>;
331
- required?: readonly string[];
332
- additionalProperties?: boolean;
333
- }
334
-
335
370
  /**
336
371
  * The rows of {@link coerceArgs}'s dispatch table, by name.
337
372
  *
@@ -361,7 +396,7 @@ function isPathSegmentTypes(types: readonly string[]): boolean {
361
396
 
362
397
  /** A single JSON type name, or the list form `["number", "null"]`, as a list. */
363
398
  function typesOf(type: string | readonly string[]): readonly string[] {
364
- return Array.isArray(type) ? type : [type as string];
399
+ return isString(type) ? [type] : type;
365
400
  }
366
401
 
367
402
  /**
@@ -371,8 +406,8 @@ function typesOf(type: string | readonly string[]): readonly string[] {
371
406
  * getter, and this function only classifies. The getter is read by the `enum` row when the value is
372
407
  * coerced, which is what makes the list live at that moment rather than at classification.
373
408
  */
374
- export function describeShape(property: object): CoercionRow {
375
- const p = property as PropertySchema;
409
+ export function coercionRowOf(property: PropertySchema): CoercionRow {
410
+ const p = property;
376
411
  if ("enum" in p) {
377
412
  return "enum";
378
413
  }
@@ -427,28 +462,28 @@ export function describeShape(property: object): CoercionRow {
427
462
  }
428
463
 
429
464
  /** Whether a value is of one JSON type. `number` means FINITE, as {@link numberArg} already insists. */
430
- function isJsonType(type: string, value: unknown): boolean {
465
+ function isJsonType(type: string, value: CommandArgValue): boolean {
431
466
  switch (type) {
432
467
  case "null": {
433
468
  return value === null;
434
469
  }
435
470
  case "boolean": {
436
- return typeof value === "boolean";
471
+ return isBoolean(value);
437
472
  }
438
473
  case "string": {
439
- return typeof value === "string";
474
+ return isString(value);
440
475
  }
441
476
  case "number": {
442
- return typeof value === "number" && Number.isFinite(value);
477
+ return isNumber(value) && Number.isFinite(value);
443
478
  }
444
479
  case "integer": {
445
- return typeof value === "number" && Number.isInteger(value);
480
+ return isNumber(value) && Number.isInteger(value);
446
481
  }
447
482
  case "array": {
448
483
  return Array.isArray(value);
449
484
  }
450
485
  case "object": {
451
- return typeof value === "object" && value !== null && !Array.isArray(value);
486
+ return isNonNullObject(value) && !Array.isArray(value);
452
487
  }
453
488
  default: {
454
489
  break;
@@ -478,17 +513,18 @@ export function typedArg(
478
513
  args: CommandArgValues,
479
514
  key: string,
480
515
  types: readonly string[],
481
- ): unknown {
516
+ ): JsonValue {
482
517
  const value = args[key];
483
- if (!types.some((type) => isJsonType(type, value))) {
518
+ // `undefined` is admitted by no JSON type, so the first test only states what the second proves.
519
+ if (value === undefined || !types.some((type) => isJsonType(type, value))) {
484
520
  throw refuse(commandId, key, `expected ${listTypes(types)}, got ${describe(value)}`);
485
521
  }
486
522
  return value;
487
523
  }
488
524
 
489
525
  /** One line per row, for the sentence a `oneOf` refusal prints when no branch admits the value. */
490
- function shapeOf(property: PropertySchema): string {
491
- switch (describeShape(property)) {
526
+ function expectedValueText(property: PropertySchema): string {
527
+ switch (coercionRowOf(property)) {
492
528
  case "enum": {
493
529
  return `one of ${(property.enum ?? []).map((v) => describe(v)).join(" | ")}`;
494
530
  }
@@ -496,7 +532,7 @@ function shapeOf(property: PropertySchema): string {
496
532
  return `the constant ${describe(property.const)}`;
497
533
  }
498
534
  case "one-of": {
499
- return (property.oneOf ?? []).map((branch) => shapeOf(branch)).join(" or ");
535
+ return (property.oneOf ?? []).map((branch) => expectedValueText(branch)).join(" or ");
500
536
  }
501
537
  case "typed": {
502
538
  return listTypes(typesOf(property.type ?? []));
@@ -545,7 +581,7 @@ function oneOfArg(
545
581
  args: CommandArgValues,
546
582
  key: string,
547
583
  branches: readonly PropertySchema[],
548
- ): unknown {
584
+ ): CommandArgValue {
549
585
  const value = args[key];
550
586
  const refusals: unknown[] = [];
551
587
  for (const branch of branches) {
@@ -567,7 +603,7 @@ function oneOfArg(
567
603
  throw refuse(
568
604
  commandId,
569
605
  key,
570
- `expected ${branches.map((branch) => shapeOf(branch)).join(" or ")}, got ${describe(value)}`,
606
+ `expected ${branches.map((branch) => expectedValueText(branch)).join(" or ")}, got ${describe(value)}`,
571
607
  );
572
608
  }
573
609
 
@@ -577,11 +613,11 @@ function coerceProperty(
577
613
  args: CommandArgValues,
578
614
  key: string,
579
615
  property: PropertySchema,
580
- ): unknown {
581
- switch (describeShape(property)) {
616
+ ): CommandArgValue {
617
+ switch (coercionRowOf(property)) {
582
618
  case "enum": {
583
619
  // The read of `property.enum` is HERE — a derived list is resolved at coercion time.
584
- return enumArg(commandId, args, key, (property.enum ?? []) as readonly string[]);
620
+ return enumArg(commandId, args, key, property.enum ?? []);
585
621
  }
586
622
  case "const": {
587
623
  const value = args[key];
@@ -652,12 +688,8 @@ function coerceProperty(
652
688
  * `run` body keeps its own `stringArg(...)` lines as typed readers and can never disagree with this
653
689
  * pass, because they are the same functions reading the same values.
654
690
  */
655
- export function coerceArgs(
656
- commandId: string,
657
- schema: object,
658
- args: CommandArgValues,
659
- ): CommandArgValues {
660
- const spec = schema as ArgsSchemaShape;
691
+ export function coerceArgs(commandId: string, schema: CommandArgsSchema, args: CommandArgValues) {
692
+ const spec = schema;
661
693
  const properties = spec.properties ?? {};
662
694
  const declared = Object.keys(properties);
663
695
  const required = spec.required ?? [];
@@ -23,6 +23,8 @@
23
23
 
24
24
  import type { KeyScope } from "./levels";
25
25
  import type { JxPath } from "../state";
26
+ import { DEFAULT_WORKSPACE } from "../workspace/workspace-ids";
27
+ import type { WorkspaceId } from "../workspace/workspace-ids";
26
28
 
27
29
  /** PAL-derived capability keys. One `when` clause replaces a scattered `if (platform.x)`. */
28
30
  export const CAPABILITIES = [
@@ -35,6 +37,11 @@ export const CAPABILITIES = [
35
37
  /* The image editor's gate. A backend that cannot hand Studio a project file's raw bytes cannot
36
38
  decode one, so the Image mode is not offered at all rather than offered and then failing. */
37
39
  "readFileBytes",
40
+ /* The Publish family's host question (studio.md §22.8): the host can reach the Cloudflare API
41
+ (`cfApi`), so it can connect a provider, deploy and read deployments. Whether it can open a
42
+ pull request is not a key: no record is refused on it. Send for review is a destination
43
+ inside the workspace, refused by the flow with its reason (`publish/publish-changes.ts`). */
44
+ "publish",
38
45
  ] as const;
39
46
 
40
47
  export type Capability = (typeof CAPABILITIES)[number];
@@ -55,10 +62,11 @@ export type EditorKind =
55
62
  | "grid"
56
63
  | "code"
57
64
  | "diff"
58
- | "library"
59
65
  | "config"
66
+ | "tokens"
60
67
  | "entry"
61
68
  | "media"
69
+ | "home"
62
70
  | "none";
63
71
 
64
72
  /** The Canvas view axis — one control, three values (§4.2). */
@@ -81,36 +89,39 @@ export type CanvasView = "edit" | "design" | "preview";
81
89
  */
82
90
 
83
91
  /** The `canvasMode` strings, mapped onto the editor each one actually names. */
84
- const EDITOR_KIND_BY_MODE: Readonly<Record<string, EditorKind>> = {
85
- design: "canvas",
86
- edit: "canvas",
92
+ const EDITOR_KIND_BY_MODE = new Map<string, EditorKind>([
93
+ ["design", "canvas"],
94
+ ["edit", "canvas"],
87
95
  /* The Entry editor — `content/entry-editor.ts`'s ENTRY_MODE. A form over ONE content entry's
88
96
  frontmatter, typed by its collection's schema; the same document the canvas edits the body of,
89
97
  which is why it is a mode of that tab rather than a tab of its own. */
90
- entry: "entry",
91
- "git-diff": "diff",
92
- grid: "grid",
93
- manage: "library",
98
+ ["entry", "entry"],
99
+ ["git-diff", "diff"],
100
+ ["grid", "grid"],
101
+ /* A workspace's home (`workspace/workspace-home.ts`): the surface a workspace opens on when none
102
+ of its own tabs is open. No document, no selection, nothing to paste into, so not the Canvas
103
+ key scope a mode this map did not know would fall into. */
104
+ ["content-home", "home"],
105
+ ["media-home", "home"],
106
+ ["publish-home", "home"],
94
107
  /* The Media viewer — `media/media-pane.ts`. An image, a video, a font specimen: files the studio
95
108
  can SHOW but has no document model for, which is why clicking one used to end in "No format
96
109
  class imported for …", advice that means nothing about a PNG. */
97
- media: "media",
98
- preview: "canvas",
99
- /* Project Settings — `settings/settings-document.ts`'s SETTINGS_MODE. A form over `project.json`,
100
- which is a configuration object and not a document tree; `stylebook` (Project Styles) is the
101
- second editor over that same document and answers `config` for the same reason. */
102
- settings: "config",
103
- source: "code",
104
- stylebook: "config",
105
- };
110
+ ["media", "media"],
111
+ ["preview", "canvas"],
112
+ ["source", "code"],
113
+ ["stylebook", "config"],
114
+ /* The Variables view (`style/variables-view.ts`): a form over `project.json`'s custom
115
+ properties, nothing to paste into, so the global key scope rather than the Canvas one. */
116
+ ["tokens", "tokens"],
117
+ ]);
106
118
 
107
119
  /**
108
120
  * The editor kind a mode string names.
109
121
  *
110
122
  * An unknown mode reads as Canvas, and that default is only for modes STUDIO DOES NOT OWN: a format
111
123
  * declares its own list (`format.studio.modes`) and every mode declared that way is a view of the
112
- * artboard. A mode Studio itself introduces is not covered by it and belongs in the map above —
113
- * which is what `settings` was not.
124
+ * artboard. A mode Studio itself introduces is not covered by it and belongs in the map above.
114
125
  */
115
126
  /**
116
127
  * Human names for the editor kinds, so no surface prints an enum at a reader — and so two surfaces
@@ -121,25 +132,28 @@ const EDITOR_KIND_BY_MODE: Readonly<Record<string, EditorKind>> = {
121
132
  export const EDITOR_KIND_LABELS: Readonly<Record<EditorKind, string>> = {
122
133
  canvas: "Canvas",
123
134
  code: "Code",
124
- config: "Project Styles",
135
+ /* The Styles workspace's three views of `project.json` are named for what each one edits:
136
+ Elements (element defaults by tag, the `stylebook` editor), Variables and Code. */
137
+ config: "Elements",
125
138
  diff: "Diff",
126
139
  entry: "Entry",
127
140
  grid: "Grid",
141
+ home: "Home",
128
142
  media: "Media",
129
- library: "Library",
130
143
  none: "None",
144
+ tokens: "Variables",
131
145
  };
132
146
 
133
147
  export function editorKindForMode(mode: string): EditorKind {
134
- return EDITOR_KIND_BY_MODE[mode] ?? "canvas";
148
+ return EDITOR_KIND_BY_MODE.get(mode) ?? "canvas";
135
149
  }
136
150
 
137
151
  /** Only the three canvas modes carry a view. */
138
- const CANVAS_VIEW_BY_MODE: Readonly<Record<string, CanvasView>> = {
139
- design: "design",
140
- edit: "edit",
141
- preview: "preview",
142
- };
152
+ const CANVAS_VIEW_BY_MODE = new Map<string, CanvasView>([
153
+ ["design", "design"],
154
+ ["edit", "edit"],
155
+ ["preview", "preview"],
156
+ ]);
143
157
 
144
158
  /**
145
159
  * The Canvas view a mode names — the neutral "design" for a mode that has none.
@@ -147,7 +161,7 @@ const CANVAS_VIEW_BY_MODE: Readonly<Record<string, CanvasView>> = {
147
161
  * Meaningful only where {@link editorKindForMode} answers `"canvas"`; every reader pairs the two.
148
162
  */
149
163
  export function canvasViewForMode(mode: string): CanvasView {
150
- return CANVAS_VIEW_BY_MODE[mode] ?? "design";
164
+ return CANVAS_VIEW_BY_MODE.get(mode) ?? "design";
151
165
  }
152
166
 
153
167
  /** Facts a command may be gated on. Every field is a plain value; predicates read, never write. */
@@ -164,6 +178,15 @@ export interface CommandContext {
164
178
  behind: number;
165
179
  dirtyCount: number;
166
180
  };
181
+ /**
182
+ * Which of the five workspaces is on screen (`shell.workspace`). A record or a panel whose
183
+ * surface belongs to one workspace gates on this, and every builder of a context — the live one,
184
+ * `panelContext()` and this module's empty one — has to fill it, or a predicate reads the default
185
+ * and silently never holds.
186
+ */
187
+ workspace: {
188
+ id: WorkspaceId;
189
+ };
167
190
  document: {
168
191
  open: boolean;
169
192
  dirty: boolean;
@@ -293,6 +316,7 @@ export function emptyContext(): CommandContext {
293
316
  return {
294
317
  project: { open: false, isSite: false, isRepo: false, isMultilingual: false },
295
318
  git: { ahead: 0, behind: 0, dirtyCount: 0 },
319
+ workspace: { id: DEFAULT_WORKSPACE },
296
320
  document: { open: false, dirty: false, mode: "", canUndo: false, canRedo: false },
297
321
  editor: { kind: "none" },
298
322
  canvas: { view: "design" },
@@ -319,6 +343,7 @@ export function emptyContext(): CommandContext {
319
343
  windowControls: false,
320
344
  findReferences: false,
321
345
  readFileBytes: false,
346
+ publish: false,
322
347
  },
323
348
  };
324
349
  }
@@ -332,6 +357,8 @@ export function emptyContext(): CommandContext {
332
357
  */
333
358
  export function makeContext(patch: CommandContextPatch = {}): CommandContext {
334
359
  const base = emptyContext();
360
+ /* SAFETY: a `CommandContextPatch` is a mapped type over `keyof CommandContext`, so every own key
361
+ it carries is a context group; `Object.keys` only widens those names to `string`. */
335
362
  for (const key of Object.keys(patch) as (keyof CommandContext)[]) {
336
363
  const group = patch[key];
337
364
  if (group) {