@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
package/src/studio.ts CHANGED
@@ -21,10 +21,12 @@ import {
21
21
  registerRenderer,
22
22
  render,
23
23
  requireProjectState,
24
+ requireShellRef,
24
25
  setProjectState,
25
26
  toolbarEl,
26
27
  updateSession,
27
28
  } from "./store";
29
+ import { getEffectiveRenderLocale } from "./site-context";
28
30
 
29
31
  import {
30
32
  PRIMARY_PANE,
@@ -57,6 +59,7 @@ import { isEditing } from "./editor/inline-edit";
57
59
  import { applyTransform, registerCanvasViewCommands } from "./canvas/canvas-utils";
58
60
  import { diffCommands, setDiffChromeRepaint } from "./canvas/diff-toolbar";
59
61
  import type { CanvasSurface } from "./canvas/canvas-surface";
62
+ import type { InspectorTabId } from "./shell";
60
63
  import {
61
64
  initCanvasRender,
62
65
  registerSelectionSetCommand,
@@ -117,15 +120,15 @@ import {
117
120
  import {
118
121
  loadProject as _loadProject,
119
122
  openProject as _openProject,
120
- renderFilesTemplate,
121
123
  findHomePage,
122
124
  loadDirectory,
125
+ loadProjectDirectories,
123
126
  openFileInPane,
124
127
  openFileInTab,
125
128
  openLastSessionOrHome,
126
- registerFileTreeDnD,
127
129
  reloadCleanTab,
128
130
  reloadTabsIfChanged,
131
+ setSessionWorkspaceShow,
129
132
  } from "./files/files";
130
133
  import { resetIgnoreCache } from "./files/gitignore";
131
134
  import { resetAssetVersions } from "./files/asset-versions";
@@ -136,12 +139,21 @@ import {
136
139
  configureCollabParser,
137
140
  configureCollabSerializer,
138
141
  } from "./collab/collab-session";
139
- import { renderImportsTemplate } from "./panels/imports-panel";
140
- import { invalidateLayoutPickerCache, renderHeadTemplate } from "./panels/head-panel";
141
- import { exportCemManifest as _exportCemManifest } from "./services/cem-export";
142
+ import { invalidateLayoutPickerCache } from "./panels/head-panel";
142
143
  import { installAutomationHook } from "./services/automation";
143
- import { invalidateLibrary } from "./browse/library-pane";
144
- import { invalidateMediaCache } from "./ui/media-picker";
144
+ import { invalidateLibrary, resetContentView } from "./browse/library-pane";
145
+ import { invalidateCollectionPages, resetCollectionPages } from "./content/collection-pages";
146
+ import { invalidatePageSummaries } from "./content/page-summaries";
147
+ import { invalidateEntrySummaries, noteSavedEntry } from "./content/entry-summaries";
148
+ import { invalidateRepeaterSources } from "./canvas/repeater-sources";
149
+ import { entryFields } from "./content/entry-fields";
150
+ import { contentCacheDrops } from "./content/content-collections";
151
+ import { resetWritingBanners } from "./content/writing-banner";
152
+ import { resetCollectionsPanel } from "./panels/collections-panel";
153
+ import { resetStylesPanel } from "./panels/styles-panel";
154
+ import { resetVariablesFocus } from "./style/variables-focus";
155
+ import { invalidateMediaCache, isMediaScanPath } from "./ui/media-picker";
156
+ import { invalidateSiteIndex, resetSitePanel } from "./panels/site-panel";
145
157
  import { setMediaChangedHandler } from "./files/media-upload";
146
158
  import { applyFileDrop } from "./editor/file-drop-action";
147
159
  import {
@@ -171,13 +183,13 @@ import { autoSyncProjectOnOpen } from "./packages/pull-package-sync";
171
183
  import webdata from "../data/webdata.json";
172
184
  import { registerDataExplorerCommands } from "./panels/data-explorer";
173
185
  import {
174
- cleanupGitPanel,
186
+ cleanupSourceControl,
175
187
  cloneRepository,
176
188
  loadDiffForLens,
177
189
  registerSourceControlCommands,
178
- renderGitPanel,
179
190
  noteFileSaved,
180
- } from "./panels/git-panel";
191
+ setSourceControlDeps,
192
+ } from "./publish/source-control";
181
193
 
182
194
  import { registerKit } from "./ui/kit";
183
195
  import "./ui/panel-resize.js";
@@ -188,13 +200,12 @@ import { initShortcuts, registerStudioCommands } from "./editor/shortcuts";
188
200
  import type { ProjectOpenOutcome, ProjectOpenTarget } from "./editor/shortcuts";
189
201
  import { createCommandRegistry } from "./commands/registry";
190
202
  import { chordsInScopes } from "./commands/keymap";
191
- import { FRAME_KEY_SCOPES } from "./canvas/iframe-keys";
203
+ import { FRAME_KEY_SCOPES, HOST_ONLY_COMMANDS } from "./canvas/iframe-keys";
192
204
  import { createLiveContext } from "./commands/live-context";
193
205
  import { hasAiCredentials } from "./services/ai-models";
194
- import { mount as mountActivityBar } from "./surfaces/rail";
206
+ import { mount } from "./surfaces/rail";
195
207
  import * as toolbarPanel from "./surfaces/commandbar";
196
208
  import * as overlaysPanel from "./panels/overlays";
197
- import * as frontmatterPanelMod from "./panels/frontmatter-panel";
198
209
  import * as rightPanelMod from "./panels/right-panel";
199
210
  import * as chatPanelMod from "./panels/chat-panel";
200
211
  import { setProjectAdopter } from "./services/project-adoption";
@@ -254,21 +265,38 @@ import { registerPopoverCommands } from "./services/popover-report";
254
265
  import { registerStyleCommands } from "./panels/style-panel";
255
266
  import { registerGridCommands } from "./grid/grid-open";
256
267
  import { registerExtensionCommands } from "./settings/extension-commands";
257
- import { registerSettingsCommands } from "./settings/settings-document";
268
+ import {
269
+ registerSettingsCommands,
270
+ rememberStylesView,
271
+ showSettingsDocument,
272
+ } from "./settings/settings-document";
273
+ import {
274
+ installWorkspaceFollow,
275
+ revealInPane,
276
+ switchWorkspace,
277
+ } from "./workspace/workspace-switch";
278
+ import { workspaceBackCommands } from "./workspace/workspace-back";
279
+ import type { HomeWorkspaceId, WorkspaceId } from "./workspace/workspace-ids";
280
+ import { openWorkspaceHome, placeWorkspaceHome } from "./workspace/workspace-home";
258
281
  import { registerPreferencesCommands } from "./settings/preferences-dialog";
259
282
  import { registerAboutCommands } from "./about/about-modal";
260
283
  import { registerCollabCommands } from "./collab/collab-commands";
261
- import { registerLibraryCommands } from "./browse/library-commands";
284
+ import { registerContentViewCommands } from "./browse/library-commands";
262
285
  import { registerFileFormatCommands } from "./format/convert-file";
263
286
  import { registerPublishCommands } from "./publish/publish-commands";
264
287
  import { registerGridViewCommands } from "./grid/grid-panel";
265
288
  import { registerRedirectsCommands } from "./grid/redirects-grid";
266
289
  import { registerContentCommands } from "./content/entry-commands";
290
+ import { registerAddNewCommands } from "./create/add-new-commands";
291
+ import { registerMediaCommands } from "./media/media-commands";
292
+ import { focusMediaHome, resetMediaLibrary } from "./media/media-library";
293
+ import { focusPublishHome } from "./publish/publish-workspace";
267
294
  import { registerI18nCommands } from "./i18n/i18n-commands";
268
295
  import { convertToComponent } from "./editor/convert-to-component";
269
296
  import type { GitDiffState } from "./types";
297
+ import { PROJECT_CONFIG_PATH } from "./tabs/tab";
270
298
  import type { Tab } from "./tabs/tab";
271
- import type { JxDocument, JxMutableNode, ProjectConfig } from "@jxsuite/schema/types";
299
+ import type { JxDocument, ProjectConfig } from "@jxsuite/schema/types";
272
300
  import { setBundleBase } from "./services/bundle-base";
273
301
  import { mountBootFailureTree, mountShellTree } from "./shell/tree";
274
302
 
@@ -299,8 +327,8 @@ setBundleBase(import.meta.url);
299
327
  *
300
328
  * `loadDiff` is here rather than in `workspace/pane-derive.ts` because that module owns no I/O —
301
329
  * which is what lets its whole decision-making half be tested with no platform. It is the same pair
302
- * of reads `panels/git-panel.ts` makes for a row click; an added file has no `HEAD` copy, so its
303
- * "original" is the empty string rather than a `gitShow` that would throw.
330
+ * of reads `publish/source-control.ts` makes for a Before and after; an added file has no `HEAD`
331
+ * copy, so its "original" is the empty string rather than a `gitShow` that would throw.
304
332
  */
305
333
  const derivationDeps: DerivationDeps = {
306
334
  /*
@@ -373,6 +401,10 @@ function setCanvasMode(tab: Tab | null, mode: string) {
373
401
  shell.git.diffState = null;
374
402
  }
375
403
  tab.session.ui.canvasMode = mode;
404
+ // The Styles home view follows the author's own switches between Variables and Elements.
405
+ if (tab.documentPath === PROJECT_CONFIG_PATH) {
406
+ rememberStylesView(mode);
407
+ }
376
408
  }
377
409
 
378
410
  // ─── Component registry ───────────────────────────────────────────────────────
@@ -499,7 +531,7 @@ initShellRefs();
499
531
  mountShell();
500
532
 
501
533
  // Mount extracted panel modules
502
- toolbarPanel.mount(toolbarEl, {
534
+ toolbarPanel.mount(requireShellRef(toolbarEl, "toolbar"), {
503
535
  closeFunctionEditor: () => closeFunctionEditor(),
504
536
  getCanvasMode,
505
537
  openProject: () => openProject(),
@@ -527,11 +559,26 @@ const primaryCell = cellForPane(PRIMARY_PANE);
527
559
 
528
560
  tabStrip.mount(primaryCell?.strip ?? document.createElement("div"));
529
561
 
562
+ /**
563
+ * Give the keyboard to the home a Back landed on (`workspace/workspace-back.ts`): the media tile
564
+ * that was opened, the change whose comparison it was. One function for the Back control and for
565
+ * Escape, so the two land in the same place.
566
+ */
567
+ function focusWorkspaceHome(paneId: string, id: WorkspaceId): void {
568
+ if (id === "media") {
569
+ focusMediaHome(paneId);
570
+ } else if (id === "publish") {
571
+ focusPublishHome(paneId);
572
+ }
573
+ }
574
+
530
575
  paneContext.mount(primaryCell?.chrome ?? document.createElement("div"), {
531
576
  exportFile,
532
577
  // No `getCanvasMode`: the bar is drawn once per pane and asks its own pane. See `PaneContextCtx`.
533
578
  parseMediaEntries,
534
579
  setCanvasMode,
580
+ closeTab: tabStrip.requestClose,
581
+ focusHome: focusWorkspaceHome,
535
582
  });
536
583
  /* The diff's Visual/Code switch decides whether the zoom pod is drawn, and the half it writes is
537
584
  not reactive — so the switch repaints the chrome as well as the stage. See `setDiffChromeRepaint`. */
@@ -561,6 +608,7 @@ setFileDropHandler(applyFileDrop);
561
608
  setMediaChangedHandler(async (dir) => {
562
609
  invalidateMediaCache();
563
610
  invalidateLibrary();
611
+ invalidateSiteIndex();
564
612
  await loadDirectory(dir);
565
613
  renderLeftPanel();
566
614
  });
@@ -585,7 +633,7 @@ setStylebookHitHandler((tag, media) => {
585
633
  1. Commit-on-parent-click: it ends the live inline-edit session, which the iframe cannot observe
586
634
  itself (layers panel, tab strip, right panel…).
587
635
  2. The block action bar goes with it. The bar is `position: fixed` and clamped into the window,
588
- so it can sit over the Document Header card, the pane context bar and the docks; an author
636
+ so it can sit over the pane context bar, the Inspector and the docks; an author
589
637
  working in the Inspector's Logic tab reported it "blocking a part of the interface that the
590
638
  user needs to utilize". It is SUPPRESSED, not dismissed — a plain dismiss flashes back on the
591
639
  next snapshot or overlay repaint — and it comes back the moment the canvas takes a pointer or
@@ -641,9 +689,8 @@ window.addEventListener("beforeunload", (e: BeforeUnloadEvent) => {
641
689
  // Author may cancel the close, and the record is the same either way.
642
690
  flushSession();
643
691
  if (hasUnsavedTabs()) {
692
+ // The HTML standard's trigger for the leave-page prompt; the legacy `returnValue` is deprecated.
644
693
  e.preventDefault();
645
- // Legacy browsers require a truthy returnValue to trigger the native confirm prompt.
646
- e.returnValue = "";
647
694
  }
648
695
  });
649
696
 
@@ -743,11 +790,8 @@ function installPaneRenderEffects(paneId: string): void {
743
790
  installDerivationEffects(paneId, derivationDeps);
744
791
  effect(() => {
745
792
  const tab = tabOfPane(paneId);
746
- if (tab) {
747
- const doc = tab.doc.document;
748
- if (doc && consumePatchedDocument(doc, paneId)) {
749
- return;
750
- }
793
+ if (tab && consumePatchedDocument(tab.doc.document, paneId)) {
794
+ return;
751
795
  }
752
796
  scheduleCanvasRender(paneId);
753
797
  });
@@ -781,10 +825,8 @@ function installPaneRenderEffects(paneId: string): void {
781
825
  void tab.session.ui.previewProps;
782
826
  void tab.session.ui.showLayout;
783
827
  }
784
- // Project-level render inputs: the stylebook catalogue's filters and the settings section are
785
- // Shell state, so a change repaints the canvas with or without a document focused.
786
- void shell.settingsTab;
787
- void shell.stylebook.tab;
828
+ // Project-level render inputs: the stylebook catalogue's filters are shell state, so a change
829
+ // Repaints the canvas with or without a document focused.
788
830
  void shell.stylebook.filter;
789
831
  void shell.stylebook.customizedOnly;
790
832
  scheduleCanvasRender(paneId);
@@ -803,8 +845,11 @@ function installPaneRenderEffects(paneId: string): void {
803
845
  * The other half of `i18n.switchLocale`. Without this the control moves a chip and the artboard
804
846
  * goes on drawing the same document left-to-right, which makes the verb a label rather than a
805
847
  * rendering context. Scoped to THIS pane's stage for the reason the scheme effect above gives.
848
+ * The document's OWN language when nothing is chosen, so an Arabic file draws right to left
849
+ * without being asked (`getEffectiveRenderLocale`).
806
850
  */
807
- const locale = tabOfPane(paneId)?.session.ui.previewLocale ?? null;
851
+ const tab = tabOfPane(paneId);
852
+ const locale = getEffectiveRenderLocale(tab?.session.ui.previewLocale, tab?.documentPath);
808
853
  postLocaleToLiveHosts(locale, surfaceForPane(paneId).wrap);
809
854
  });
810
855
  }
@@ -849,10 +894,6 @@ rightPanelMod.mount({
849
894
  renderCanvas: () => renderCanvas(),
850
895
  });
851
896
 
852
- // The Document Header card — every document with frontmatter or `$head`. It has no host of its own:
853
- // The stage hands one over (`canvas-render.ts`), and this only starts the reactive subscription.
854
- frontmatterPanelMod.mount();
855
-
856
897
  // The assistant's create_project tool adopts freshly scaffolded projects through the same
857
898
  // Flow as the recent-projects list.
858
899
  setProjectAdopter(openRecentProject);
@@ -862,8 +903,20 @@ setImportHandoff(revealImportHandoff);
862
903
  one — see services/connection.ts for why only the chromium shell can. */
863
904
  watchConnection();
864
905
 
906
+ /* What source control needs from the bootstrap: the two writes a comparison makes outside
907
+ `shell.git` (the Publish workspace's Before and after puts the file's own tab into git-diff), and
908
+ the clone flow, which ends by opening the project it cloned. */
909
+ setSourceControlDeps({
910
+ cloneRepository: () => {
911
+ void cloneRepository({ openRecentProject });
912
+ },
913
+ setCanvasMode,
914
+ setGitDiffState: (state: GitDiffState | null) => {
915
+ shell.git.diffState = state;
916
+ },
917
+ });
918
+
865
919
  leftPanelMod.mount({
866
- cloneRepository: () => cloneRepository({ openRecentProject }),
867
920
  defBadgeLabel,
868
921
  defCategory,
869
922
  defaultDef,
@@ -871,7 +924,6 @@ leftPanelMod.mount({
871
924
  navigateToComponent,
872
925
  registerComponentsDnD,
873
926
  registerElementsDnD,
874
- registerFileTreeDnD,
875
927
  registerLayersDnD,
876
928
  renderCanvas: () => renderCanvas(),
877
929
  // The Data panel's Refresh: a canvas re-render that ALSO lets automatic `Request` state entries
@@ -894,15 +946,8 @@ leftPanelMod.mount({
894
946
  }
895
947
  renderCanvas(paneId);
896
948
  },
897
- renderFilesTemplate,
898
- renderGitPanel,
899
- renderHeadTemplate,
900
- renderImportsTemplate,
901
949
  mountSignalsPanel,
902
950
  setCanvasMode,
903
- setGitDiffState: (state: GitDiffState | null) => {
904
- shell.git.diffState = state;
905
- },
906
951
  webdata,
907
952
  });
908
953
 
@@ -911,7 +956,6 @@ leftPanelMod.mount({
911
956
  registerRenderer("leftPanel", () => leftPanelMod.render());
912
957
  registerRenderer("canvas", () => renderCanvas());
913
958
  registerRenderer("rightPanel", () => rightPanelMod.render());
914
- registerRenderer("frontmatterPanel", () => frontmatterPanelMod.render());
915
959
  registerRenderer("seoModal", renderSeoModal);
916
960
  registerRenderer("chatPanel", () => chatPanelMod.render());
917
961
  registerRenderer("overlays", () => overlaysPanel.render());
@@ -919,7 +963,7 @@ renderStatusbar();
919
963
  // The status bar mounts the jump bar too: the focused pane's breadcrumb trail is its DOCUMENT
920
964
  // Field, and the only breadcrumb in the shell.
921
965
  mountStatusbar();
922
- mountActivityBar();
966
+ mount();
923
967
 
924
968
  /* The background-click deselect moved into `editor/shortcuts.ts`'s `installStageGestures`, beside
925
969
  the wheel and the middle-drag, because it is a STAGE gesture: it compared against the app's one
@@ -957,9 +1001,32 @@ function ensureFsSync() {
957
1001
  of them wrong, and it is the same event for all four. The bar's memo is separate from
958
1002
  `page-params`' because it is keyed per DOCUMENT rather than globally; leaving it behind kept
959
1003
  a stale candidate list in the picker after the collection changed. */
960
- invalidateDerivedCaches: () => {
1004
+ invalidateDerivedCaches: (paths, structural = true) => {
961
1005
  invalidatePageRouteCache();
962
1006
  invalidateLayoutPickerCache();
1007
+ invalidateSiteIndex(paths);
1008
+ /* The Content workspace's three: the scan its collections are filtered from, the pages that
1009
+ say where each collection is published, and the entry list the Collections panel draws.
1010
+ Each is dropped only by a batch that can make it wrong, so a save does not re-walk the
1011
+ project or blank the Collections panel (`contentCacheDrops`). */
1012
+ const drops = contentCacheDrops(paths, structural);
1013
+ if (drops.scan) {
1014
+ invalidateLibrary();
1015
+ }
1016
+ if (drops.pages) {
1017
+ invalidateCollectionPages();
1018
+ invalidatePageSummaries();
1019
+ }
1020
+ if (drops.entries) {
1021
+ invalidateEntrySummaries();
1022
+ invalidateRepeaterSources();
1023
+ }
1024
+ /* The media listing is a walk of `public/` and every collection's `images/`, so only a batch
1025
+ under one of them (or one that cannot say what changed) can make it wrong: a file added by
1026
+ git, the OS or a Files-panel delete. */
1027
+ if (paths === undefined || paths.some((path) => isMediaScanPath(path))) {
1028
+ invalidateMediaCache();
1029
+ }
963
1030
  invalidateParamValues();
964
1031
  paneContext.resetParamValues();
965
1032
  },
@@ -975,18 +1042,18 @@ const _urlParams = new URLSearchParams(location.search);
975
1042
  const _projectParam = _urlParams.get("project") || _urlParams.get("open");
976
1043
 
977
1044
  if (!_projectParam) {
978
- // Electrobun (and other non-?project= hosts) load their project over RPC, so the ?project= branch
1045
+ // The desktop app (and other non-?project= hosts) load their project over RPC, so the ?project= branch
979
1046
  // Below — which is the only place that calls platform.activate() — is skipped. Kick off activate()
980
- // Here UNCONDITIONALLY so this window's loopback canvasUrl is fetched on boot (the canvas iframe
981
- // Needs it); a render() once it resolves lets ensureHost swap an early default iframe for the
982
- // Loopback one (see iframe-host ensureHost's canvasUrl-changed rebuild).
1047
+ // Here UNCONDITIONALLY so this window's canvasUrl is fetched on boot (the canvas iframe
1048
+ // Needs it); a render() once it resolves lets ensureHost rebuild against it if it differs from
1049
+ // The default (see iframe-host ensureHost's canvasUrl-changed rebuild).
983
1050
  const _bootPlatform = getPlatform();
984
1051
  // oxlint-disable-next-line unicorn/prefer-top-level-await -- fire-and-forget: must not block the initial render
985
1052
  void _bootPlatform
986
- .activate?.()
1053
+ .activate()
987
1054
  // No project is bound yet, so this call only warms the canvasUrl; a backend that refuses it
988
1055
  // Still gets the render below rather than an unhandled rejection.
989
- ?.catch((error: unknown) => {
1056
+ .catch((error) => {
990
1057
  // A refusal that offers an action is the action flow's to explain; it is not a fault.
991
1058
  if (!isActionRequired(error)) {
992
1059
  console.error("Boot activation failed:", error);
@@ -1018,18 +1085,14 @@ if (_projectParam) {
1018
1085
  // Report a bare `Error: <message>` because the only identifying fact was still block-scoped.
1019
1086
  let fileRelPath = _urlParams.get("file") || _projectParam;
1020
1087
  try {
1021
- const siteCtx = platform.resolveSiteContext
1022
- ? await platform.resolveSiteContext(_projectParam)
1023
- : { sitePath: null };
1088
+ const siteCtx = await platform.resolveSiteContext(_projectParam);
1024
1089
 
1025
1090
  if (siteCtx.sitePath) {
1026
1091
  // Set PAL project root to absolute path so file ops work
1027
1092
  if (siteCtx.sitePath) {
1028
1093
  platform.projectRoot = siteCtx.sitePath;
1029
1094
  // Await activation so the server resolves project-relative static files
1030
- if (platform.activate) {
1031
- await platform.activate();
1032
- }
1095
+ await platform.activate();
1033
1096
  }
1034
1097
 
1035
1098
  resetIgnoreCache();
@@ -1053,31 +1116,9 @@ if (_projectParam) {
1053
1116
  await ensureDependenciesInstalled();
1054
1117
  await loadComponentRegistry();
1055
1118
 
1056
- // Load directory tree and populate projectDirs from conventional dirs found
1057
- const conventionalDirs = new Set([
1058
- "pages",
1059
- "layouts",
1060
- "components",
1061
- "content",
1062
- "data",
1063
- "public",
1064
- "styles",
1065
- ]);
1066
- /* Through `loadDirectory`, not `platform.listDirectory`: this is the second copy of the
1067
- conventional-dir walk (the first is `openProject` in files/files.ts), and the loader is
1068
- what reads the `.gitignore` chain governing each directory. Listing around it left the
1069
- `?project=` boot as the one door into a project whose tree knew no ignore rules. */
1070
- await loadDirectory(".");
1071
- const dirEntries = requireProjectState().dirs.get(".") ?? [];
1072
- const foundDirs = [];
1073
- for (const e of dirEntries) {
1074
- if (e.type === "directory" && conventionalDirs.has(e.name)) {
1075
- foundDirs.push(e.name);
1076
- requireProjectState().expanded.add(e.path || e.name);
1077
- await loadDirectory(e.path || e.name);
1078
- }
1079
- }
1080
- requireProjectState().projectDirs = foundDirs;
1119
+ /* Through `loadDirectory` (inside `loadProjectDirectories`), not `platform.listDirectory`:
1120
+ the loader is what reads the `.gitignore` chain governing each directory. */
1121
+ await loadProjectDirectories();
1081
1122
  void maybePromptJxsuiteUpdate(siteCtx.sitePath);
1082
1123
  }
1083
1124
 
@@ -1144,7 +1185,7 @@ if (_projectParam) {
1144
1185
  openTab({
1145
1186
  id: fileRelPath,
1146
1187
  documentPath: fileRelPath,
1147
- document: parsedDoc as JxMutableNode,
1188
+ document: parsedDoc,
1148
1189
  ...(frontmatter != null && { frontmatter }),
1149
1190
  layout,
1150
1191
  sourceFormat: fileFormat?.name ?? null,
@@ -1294,10 +1335,32 @@ async function openProject(target: ProjectOpenTarget = "thisWindow"): Promise<Pr
1294
1335
  if (!(await tabStrip.confirmCloseAll("Opening another project"))) {
1295
1336
  return "cancelled";
1296
1337
  }
1297
- const opened = await _openProject({ renderLeftPanel });
1338
+ const opened = await _openProject({ renderLeftPanel, resetProjectCaches });
1298
1339
  ensureFsSync();
1299
1340
  return opened ? "opened" : "cancelled";
1300
1341
  }
1342
+ /**
1343
+ * The one project-switch reset of the caches panels keep for the project being left: the Site
1344
+ * panel's index and filter, the media listing it and every image field read, and the Media
1345
+ * workspace's own filter, search and selection. Both open paths run it (this file's
1346
+ * `openRecentProject`, and `files.ts`'s `openProject` behind ⌘O, the toolbar and the welcome
1347
+ * screen), so neither can show the previous project's pages or media.
1348
+ */
1349
+ function resetProjectCaches(): void {
1350
+ resetSitePanel();
1351
+ resetContentView();
1352
+ resetCollectionPages();
1353
+ invalidatePageSummaries();
1354
+ invalidateEntrySummaries();
1355
+ invalidateRepeaterSources();
1356
+ resetCollectionsPanel();
1357
+ resetStylesPanel();
1358
+ resetVariablesFocus();
1359
+ resetWritingBanners();
1360
+ invalidateMediaCache();
1361
+ resetMediaLibrary();
1362
+ }
1363
+
1301
1364
  async function openRecentProject(root: string) {
1302
1365
  // One entry for the whole sequence, not three surfaces for its three phases. Opening a project
1303
1366
  // Used to chain a blocking spinner (dependencies), a transient status line (git sync) and a
@@ -1355,9 +1418,10 @@ async function openRecentProject(root: string) {
1355
1418
  platform.projectRoot = root;
1356
1419
  // Source control, the stylebook selection and the settings tab describe the project being
1357
1420
  // Left behind; carrying them over showed the previous repository's branch and file count
1358
- // Under the new project's name. The poll timer is re-armed by the panel's next render.
1359
- cleanupGitPanel();
1421
+ // Under the new project's name. The poll timer is re-armed by the Publish workspace's next mount.
1422
+ cleanupSourceControl();
1360
1423
  resetProjectShell();
1424
+ resetProjectCaches();
1361
1425
  // The format registry is cached per project — the previous root's registry (often empty on a
1362
1426
  // Fresh desktop launch) must not answer for this project, or non-JSON documents fail with
1363
1427
  // "No format class imported" until a reload. Mirrors openProject in files.ts.
@@ -1365,6 +1429,9 @@ async function openRecentProject(root: string) {
1365
1429
  void loadFormats();
1366
1430
  refreshExtensionUi(platform);
1367
1431
  const content = await platform.readFile("project.json");
1432
+ /* SAFETY: This is `project.json` at the root the user chose to open, the project's own config
1433
+ file whose schema is ProjectConfig; Studio edits it in that shape and does not re-validate it
1434
+ on open, as the folder-picker path in `platforms/devserver.ts` does not either. */
1368
1435
  const config = JSON.parse(content) as ProjectConfig;
1369
1436
 
1370
1437
  closeAllTabs();
@@ -1389,28 +1456,11 @@ async function openRecentProject(root: string) {
1389
1456
  activity.step("Install dependencies");
1390
1457
  await ensureDependenciesInstalled();
1391
1458
  activity.step("Read the project");
1392
- await loadDirectory(".");
1459
+ await loadProjectDirectories();
1393
1460
  await loadComponentRegistry();
1394
1461
 
1395
- const conventionalDirs = new Set([
1396
- "pages",
1397
- "layouts",
1398
- "components",
1399
- "content",
1400
- "data",
1401
- "public",
1402
- "styles",
1403
- ]);
1404
- const entries = requireProjectState().dirs.get(".") || [];
1405
- for (const e of entries) {
1406
- if (e.type === "directory" && conventionalDirs.has(e.name)) {
1407
- requireProjectState().expanded.add(e.path || e.name);
1408
- await loadDirectory(e.path || e.name);
1409
- }
1410
- }
1411
-
1412
1462
  addRecentProject(requireProjectState().name, root);
1413
- setActivityTab("files");
1463
+ // The Navigator shows the panel the workspace frame chose as the project opened (§22.3).
1414
1464
  renderLeftPanel();
1415
1465
  // The project's name is now permanent state in the status bar's PROJECT field.
1416
1466
 
@@ -1511,7 +1561,16 @@ registerStudioCommands(
1511
1561
  );
1512
1562
 
1513
1563
  // Tab navigation (⌃Tab MRU cycling, ⌘⇧T reopen-closed) is defined beside the tab model it drives.
1514
- registerTabCommands(commandRegistry, { openFile: openFileInTab, openFileInPane });
1564
+ /* `pane.compareWith` opens into the other pane without moving the keyboard; a compared document of
1565
+ another workspace would land hidden by that pane's strip, so it is revealed, which enters its
1566
+ workspace (`workspace/workspace-switch.ts`). */
1567
+ registerTabCommands(commandRegistry, {
1568
+ openFile: openFileInTab,
1569
+ openFileInPane: async (paneId, path) => {
1570
+ await openFileInPane(paneId, path);
1571
+ revealInPane(paneId, path);
1572
+ },
1573
+ });
1515
1574
 
1516
1575
  /* The derivation's own two verbs (§18.4), beside the `PaneDerivation` they read and write rather
1517
1576
  than in `paneCommands()`. `tests/app-commands-composition.test.ts` is the guard that this line
@@ -1527,6 +1586,28 @@ commandRegistry.registerAll(derivationCommands(derivationDeps));
1527
1586
  * available or what it does — that would be the second definition site the design exists to prevent
1528
1587
  * (§13).
1529
1588
  */
1589
+ /* The workspace's two halves (`workspace/workspace-switch.ts`): the follow, which enters a tab's
1590
+ workspace whenever a tab is activated, and the switch `view.setWorkspace` runs, which puts a
1591
+ workspace's tabs (or its home) on screen. The homes are handed in, so the switch imports
1592
+ neither the homes' surfaces nor the settings document. */
1593
+ const workspaceDeps = {
1594
+ openHome: (id: HomeWorkspaceId) => {
1595
+ openWorkspaceHome(id);
1596
+ },
1597
+ // The Styles home: the view it was left in, Variables on a first visit (§7.1).
1598
+ openStyles: () => {
1599
+ showSettingsDocument();
1600
+ },
1601
+ placeHome: placeWorkspaceHome,
1602
+ setInspectorTab: (tab: InspectorTabId) => rightPanelMod.setInspectorTab(tab),
1603
+ };
1604
+ installWorkspaceFollow(workspaceDeps);
1605
+ /** Show a workspace with the bootstrap's homes: what `view.setWorkspace` and a reopen both run. */
1606
+ function showWorkspaceWithHomes(id: WorkspaceId): void {
1607
+ switchWorkspace(id, workspaceDeps);
1608
+ }
1609
+ // A project reopens in the workspace it was left in, once its documents are open (§22.1).
1610
+ setSessionWorkspaceShow(showWorkspaceWithHomes);
1530
1611
  registerShellViewCommands(commandRegistry, {
1531
1612
  // The registry's own answer, so a gated-off panel cannot be persisted as a showing tab.
1532
1613
  panelAvailable: (id) => {
@@ -1534,8 +1615,20 @@ registerShellViewCommands(commandRegistry, {
1534
1615
  return panel ? (panel.when?.(commandRegistry.context()) ?? true) : true;
1535
1616
  },
1536
1617
  inspectorTab: () => rightPanelMod.inspectorTab(),
1618
+ restingInspectorTab: () => rightPanelMod.restingInspectorTab(),
1537
1619
  setInspectorTab: (tab) => rightPanelMod.setInspectorTab(tab),
1620
+ showWorkspace: showWorkspaceWithHomes,
1538
1621
  });
1622
+ /* Back to a strip-less workspace's home (Media, Styles, Publish): the pane context bar's Back
1623
+ control and Escape. The close goes through the strip's guarded close, so a view with unsaved
1624
+ work still asks first. */
1625
+ commandRegistry.registerAll(
1626
+ workspaceBackCommands({
1627
+ closeTab: tabStrip.requestClose,
1628
+ focusHome: focusWorkspaceHome,
1629
+ setCanvasMode,
1630
+ }),
1631
+ );
1539
1632
  registerCanvasViewCommands(commandRegistry, {
1540
1633
  getCanvasMode,
1541
1634
  renderPane: renderCanvas,
@@ -1546,7 +1639,7 @@ registerCanvasViewCommands(commandRegistry, {
1546
1639
  });
1547
1640
  /* A save moves the working tree under any comparison of that file, and nothing about a
1548
1641
  comparison notices on its own — see `noteFileSaved`. Injected rather than imported: `file-ops`
1549
- must not pull the Source Control panel into its graph. */
1642
+ must not pull source control into its graph. */
1550
1643
  /* The second listener is the live chrome lane: a saved surface document or kit component re-mounts
1551
1644
  the roots it draws in THIS shell (studio-ui-guidelines.md §9.3). Inert for every project but the
1552
1645
  two the chrome comes from, by the saved path alone. */
@@ -1559,9 +1652,17 @@ const liveChrome = createLiveSurfaceSaver({
1559
1652
  Component Settings and the Library read the props the file has now rather than the ones the scan
1560
1653
  saw when the project opened. The Content tab and the Library are told, because neither reads the
1561
1654
  registry reactively. */
1562
- setDocumentSavedListener((path, doc) => {
1655
+ setDocumentSavedListener((path, doc, tab) => {
1563
1656
  void noteFileSaved(path);
1564
- void liveChrome(path, doc as unknown as JxDocument);
1657
+ // Any saved file can be data a repeater on the canvas reads; the next render asks again.
1658
+ invalidateRepeaterSources();
1659
+ // An entry's new title or status reaches the Collections panel and the Content home at once.
1660
+ if (noteSavedEntry(path, entryFields(tab))) {
1661
+ renderLeftPanel();
1662
+ }
1663
+ /* SAFETY: The listener fires for a tab's saved ROOT document, and a root document is a
1664
+ JxDocument held in the editor's mutable node form; `liveChrome` only acts on surface paths. */
1665
+ void liveChrome(path, doc as JxDocument);
1565
1666
  if (noteComponentSaved(path, doc)) {
1566
1667
  renderPropertiesPanel();
1567
1668
  renderLeftPanel();
@@ -1575,8 +1676,8 @@ commandRegistry.registerAll(diffCommands());
1575
1676
  ensurePopoverRevealWatch();
1576
1677
  registerSelectionSetCommand(commandRegistry);
1577
1678
  registerInspectorCommands(commandRegistry);
1578
- /* Search appearance, behind one record with two buttons: the Document Header card's and the Page
1579
- panel's. A surface that IS the capability is one the palette cannot reach. */
1679
+ /* Search appearance, behind one record the Page tab's button runs: a surface that IS the capability
1680
+ is one the palette cannot reach. */
1580
1681
  registerSeoCommands(commandRegistry);
1581
1682
  registerA11yCommands(commandRegistry);
1582
1683
  registerPopoverCommands(commandRegistry);
@@ -1597,9 +1698,11 @@ registerGridCommands(commandRegistry);
1597
1698
  registerSettingsCommands(commandRegistry);
1598
1699
  registerExtensionCommands(commandRegistry);
1599
1700
  registerPreferencesCommands(commandRegistry);
1600
- registerLibraryCommands(commandRegistry);
1701
+ registerContentViewCommands(commandRegistry);
1601
1702
  registerFileFormatCommands(commandRegistry);
1602
1703
  registerContentCommands(commandRegistry);
1704
+ registerAddNewCommands(commandRegistry);
1705
+ registerMediaCommands(commandRegistry);
1603
1706
  /* The four translation verbs: open a sibling translation, create the missing one, show the
1604
1707
  Languages panel, declare a language. `i18n.switchLocale` is deliberately not among them — it sets
1605
1708
  a rendering context, so it lives with the other axis-3 verbs in `canvasViewCommands`. */
@@ -1643,7 +1746,7 @@ initShortcuts(commandRegistry, stageContext);
1643
1746
  which is what makes Preferences › Keyboard reach inside the page. */
1644
1747
  setKeymapSource(
1645
1748
  () => ({
1646
- chords: chordsInScopes(commandRegistry.keymap, FRAME_KEY_SCOPES),
1749
+ chords: chordsInScopes(commandRegistry.keymap, FRAME_KEY_SCOPES, HOST_ONLY_COMMANDS),
1647
1750
  mac: commandRegistry.keymap.mac,
1648
1751
  }),
1649
1752
  (listener) => commandRegistry.keymap.onChange(listener),