@jxsuite/studio 6.1.2 → 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 (522) hide show
  1. package/README.md +5 -5
  2. package/dist/chunks/2020-5wtzce5g.js +4 -0
  3. package/dist/chunks/adapter-5tphg7xe.js +4 -0
  4. package/dist/chunks/add-new-flow-psym14sn.js +4 -0
  5. package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
  6. package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
  7. package/dist/chunks/{color-area-0fj8a4ga.js → color-area-6rbra5dy.js} +2 -2
  8. package/dist/chunks/{color-field-xch8kx2g.js → color-field-gy56c94g.js} +3 -3
  9. package/dist/chunks/color-m7r1vk54.js +4 -0
  10. package/dist/chunks/{color-slider-jxd8v350.js → color-slider-sqqdyf6c.js} +2 -2
  11. package/dist/chunks/{combobox-p0efwjke.js → combobox-72h32ejk.js} +3 -3
  12. package/dist/chunks/components-r22xca09.js +4 -0
  13. package/dist/chunks/content-source-mmppmcyg.js +4 -0
  14. package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
  15. package/dist/chunks/editor-ccd9jwsa.js +4 -0
  16. package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
  17. package/dist/chunks/extension-sections-0egb88dm.js +4 -0
  18. package/dist/chunks/file-ops-qnab36ek.js +4 -0
  19. package/dist/chunks/files-rcn56qvm.js +4 -0
  20. package/dist/chunks/format-host-yxz0kjjs.js +4 -0
  21. package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
  22. package/dist/chunks/grid-open-4z1g062t.js +4 -0
  23. package/dist/chunks/{grid-view-d2wq9ezg.js → grid-view-qg1b5eqx.js} +25 -25
  24. package/dist/chunks/{icons-pnfz478q.js → icons-63bjtbs7.js} +2 -2
  25. package/dist/chunks/{iframe-entry-jdcktez8.js → iframe-entry-2zggzajv.js} +4 -4
  26. package/dist/chunks/{iframe-entry-zap785cw.js → iframe-entry-76j8vwwx.js} +4 -4
  27. package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
  28. package/dist/chunks/{iframe-entry-x0ygf2yr.js → iframe-entry-pkgmcgp0.js} +4 -4
  29. package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
  30. package/dist/chunks/{index-zpjmzqfk.js → index-32eqzv1k.js} +3 -3
  31. package/dist/chunks/index-f0jn7nnp.js +4 -0
  32. package/dist/chunks/{javascript-m54mnwp6.js → javascript-pjp734q4.js} +3 -3
  33. package/dist/chunks/jsonMode-njkvsa02.js +13 -0
  34. package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
  35. package/dist/chunks/layers-bgyr11tr.js +4 -0
  36. package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
  37. package/dist/chunks/{listbox-e74qjyq6.js → listbox-c421cf8c.js} +2 -2
  38. package/dist/chunks/lit-html-v9gh687x.js +4 -0
  39. package/dist/chunks/media-library-sq468wts.js +4 -0
  40. package/dist/chunks/media-picker-shfe59pt.js +4 -0
  41. package/dist/chunks/{menu-n6yzswmy.js → menu-bdpzbfvs.js} +2 -2
  42. package/dist/chunks/{monaco-binding-7gx83x3r.js → monaco-binding-vq1hgnn0.js} +3 -3
  43. package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
  44. package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
  45. package/dist/chunks/notify-kzrjr3fv.js +4 -0
  46. package/dist/chunks/parse-v77xtwv7.js +4 -0
  47. package/dist/chunks/platform-7v4rtd7m.js +4 -0
  48. package/dist/chunks/popover-b89sfej7.js +4 -0
  49. package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
  50. package/dist/chunks/publish-quick-qx2455cj.js +4 -0
  51. package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
  52. package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
  53. package/dist/chunks/references-9547rg5s.js +4 -0
  54. package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
  55. package/dist/chunks/source-control-kwktr9y6.js +4 -0
  56. package/dist/chunks/{split-n2gfpm5m.js → split-c9zfdgxf.js} +2 -2
  57. package/dist/chunks/studio-03ct6yfv.js +9 -0
  58. package/dist/chunks/studio-07rcfje3.js +5 -0
  59. package/dist/chunks/studio-3e54qh39.js +7 -0
  60. package/dist/chunks/studio-3exxhz5g.js +5 -0
  61. package/dist/chunks/studio-3q40e3rj.js +5 -0
  62. package/dist/chunks/studio-3qeh9t0h.js +6 -0
  63. package/dist/chunks/studio-3qqjeep5.js +6 -0
  64. package/dist/chunks/studio-43sd2mam.js +4 -0
  65. package/dist/chunks/studio-4hp8pkyt.js +5 -0
  66. package/dist/chunks/studio-58xg6j2q.js +9 -0
  67. package/dist/chunks/studio-5g0rprdt.js +7 -0
  68. package/dist/chunks/{studio-2j1cb95x.js → studio-6m380wp7.js} +4 -4
  69. package/dist/chunks/studio-80jyh1xh.js +4 -0
  70. package/dist/chunks/studio-83mk4bgg.js +9 -0
  71. package/dist/chunks/{studio-v0jzqdjm.js → studio-881z1xrx.js} +4 -4
  72. package/dist/chunks/studio-8m0y2qe7.js +5 -0
  73. package/dist/chunks/{studio-d81xfh1g.js → studio-8tr6cfrc.js} +4 -4
  74. package/dist/chunks/studio-8vcvfs7r.js +6 -0
  75. package/dist/chunks/studio-9tmebf0s.js +5 -0
  76. package/dist/chunks/studio-a2bvaptz.js +5 -0
  77. package/dist/chunks/studio-b7y5mr30.js +5 -0
  78. package/dist/chunks/studio-bavb31r0.js +5 -0
  79. package/dist/chunks/{studio-dgz8d0c1.js → studio-bbe4c90a.js} +4 -4
  80. package/dist/chunks/studio-c05wdnt3.js +5 -0
  81. package/dist/chunks/studio-ccv2svc6.js +5 -0
  82. package/dist/chunks/studio-d5grtb9e.js +16 -0
  83. package/dist/chunks/studio-df0baea9.js +5 -0
  84. package/dist/chunks/studio-dgk4dqtx.js +7 -0
  85. package/dist/chunks/studio-e1g64q43.js +5 -0
  86. package/dist/chunks/studio-ed1hp6zf.js +6 -0
  87. package/dist/chunks/studio-ed3xx40h.js +7 -0
  88. package/dist/chunks/studio-f14e1zdj.js +5 -0
  89. package/dist/chunks/studio-fbhxxc5f.js +5 -0
  90. package/dist/chunks/studio-fyh0jc96.js +5 -0
  91. package/dist/chunks/studio-gcxk20n7.js +5 -0
  92. package/dist/chunks/studio-jaaz8ce9.js +5 -0
  93. package/dist/chunks/{studio-90pq9km1.js → studio-jcnsdaep.js} +4 -4
  94. package/dist/chunks/studio-jsgf2q5k.js +7 -0
  95. package/dist/chunks/{studio-0q988f9w.js → studio-k3xxbagr.js} +3 -3
  96. package/dist/chunks/{studio-5ve6bbep.js → studio-k7evxqh4.js} +4 -4
  97. package/dist/chunks/studio-kt3pjkwd.js +5 -0
  98. package/dist/chunks/studio-m8g16bgz.js +5 -0
  99. package/dist/chunks/studio-mn0476ag.js +5 -0
  100. package/dist/chunks/studio-mx1smyq0.js +5 -0
  101. package/dist/chunks/studio-n0c5h6mf.js +5 -0
  102. package/dist/chunks/{studio-485046te.js → studio-nh6d342n.js} +7 -7
  103. package/dist/chunks/studio-nqxqf8p2.js +4 -0
  104. package/dist/chunks/studio-p4nrkvqr.js +5 -0
  105. package/dist/chunks/{studio-1fxkaaea.js → studio-pbxa5fpc.js} +4 -4
  106. package/dist/chunks/studio-pgmvdv7z.js +7 -0
  107. package/dist/chunks/studio-ph84avkf.js +5 -0
  108. package/dist/chunks/{studio-tq0rtfwj.js → studio-q0mvbaq6.js} +4 -4
  109. package/dist/chunks/studio-q0tccd43.js +5 -0
  110. package/dist/chunks/studio-q7rtx6zq.js +14 -0
  111. package/dist/chunks/{studio-a3g98wjr.js → studio-qgh13jtz.js} +4 -4
  112. package/dist/chunks/studio-qmn1xc24.js +5 -0
  113. package/dist/chunks/studio-qwdqwkj0.js +5 -0
  114. package/dist/chunks/studio-r5qy30vx.js +5 -0
  115. package/dist/chunks/studio-rj9eamf8.js +5 -0
  116. package/dist/chunks/studio-rptgsk96.js +5 -0
  117. package/dist/chunks/studio-rthyg42z.js +928 -0
  118. package/dist/chunks/studio-s19tp1xr.js +5 -0
  119. package/dist/chunks/studio-s32578pn.js +5 -0
  120. package/dist/chunks/studio-svb7yyve.js +5 -0
  121. package/dist/chunks/studio-syreb644.js +5 -0
  122. package/dist/chunks/studio-tf9jryb1.js +10 -0
  123. package/dist/chunks/studio-tfkznv39.js +5 -0
  124. package/dist/chunks/studio-tft6r105.js +5 -0
  125. package/dist/chunks/studio-txf2kysx.js +5 -0
  126. package/dist/chunks/studio-v8867ddv.js +12 -0
  127. package/dist/chunks/studio-vxq7fcvv.js +5 -0
  128. package/dist/chunks/studio-w4rz9hdk.js +5 -0
  129. package/dist/chunks/studio-wbcjbhy1.js +9 -0
  130. package/dist/chunks/studio-wc649wss.js +5 -0
  131. package/dist/chunks/studio-wys23mxz.js +5 -0
  132. package/dist/chunks/studio-x1x167jh.js +5 -0
  133. package/dist/chunks/studio-x9hsze61.js +5 -0
  134. package/dist/chunks/studio-y0n7yxea.js +9 -0
  135. package/dist/chunks/studio-y3ahhdpx.js +5 -0
  136. package/dist/chunks/studio-z97c48fk.js +5 -0
  137. package/dist/chunks/studio-zat62m0c.js +5 -0
  138. package/dist/chunks/studio-zcd2e7yz.js +5 -0
  139. package/dist/chunks/studio-zz9qe3rw.js +64 -0
  140. package/dist/chunks/toast-1gv0h53h.js +4 -0
  141. package/dist/chunks/{toast-host-ke5z4ng7.js → toast-host-1yg5ar8d.js} +3 -3
  142. package/dist/chunks/{tooltip-5v8ngwj2.js → tooltip-yypz28gq.js} +3 -3
  143. package/dist/chunks/{tree-mdq3v5cw.js → tree-9xa4hm7n.js} +2 -2
  144. package/dist/chunks/tsMode-epyfz1hv.js +14 -0
  145. package/dist/chunks/workspace-dz7nxfhv.js +4 -0
  146. package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
  147. package/dist/chunks/{ws-client-nze0k6mv.js → ws-client-bv552sfx.js} +3 -3
  148. package/dist/iframe-entry.js +20 -16
  149. package/dist/manifest.json +77 -63
  150. package/dist/studio.js +103 -104
  151. package/dist/workers/ts.worker.js +3 -3
  152. package/package.json +12 -11
  153. package/src/browse/component-examples.ts +272 -0
  154. package/src/browse/library-commands.ts +64 -104
  155. package/src/browse/library-layouts.ts +263 -49
  156. package/src/browse/library-model.ts +181 -133
  157. package/src/browse/library-pane.ts +738 -446
  158. package/src/browse/library-preview.ts +149 -19
  159. package/src/browse/library-source.ts +308 -41
  160. package/src/browse/preview-root.ts +78 -0
  161. package/src/browse/preview-style.ts +155 -0
  162. package/src/canvas/asset-refs.ts +16 -1
  163. package/src/canvas/canvas-live-render.ts +222 -30
  164. package/src/canvas/canvas-origin.ts +37 -12
  165. package/src/canvas/canvas-page-context.ts +112 -0
  166. package/src/canvas/canvas-render.ts +113 -107
  167. package/src/canvas/canvas-utils.ts +57 -12
  168. package/src/canvas/iframe-drop.ts +107 -0
  169. package/src/canvas/iframe-entry.ts +24 -12
  170. package/src/canvas/iframe-host.ts +134 -62
  171. package/src/canvas/iframe-keys.ts +11 -0
  172. package/src/canvas/iframe-patch.ts +8 -7
  173. package/src/canvas/iframe-protocol.ts +24 -5
  174. package/src/canvas/iframe-render.ts +48 -1
  175. package/src/canvas/iframe-subtree.ts +5 -2
  176. package/src/canvas/npm-modules.ts +22 -0
  177. package/src/canvas/preview-navigate.ts +16 -0
  178. package/src/canvas/repeater-sources.ts +200 -0
  179. package/src/canvas/stage-scrollbar.ts +5 -1
  180. package/src/canvas/surface-registry.ts +6 -0
  181. package/src/commands/app-commands.ts +16 -6
  182. package/src/commands/budget.ts +10 -8
  183. package/src/commands/context.ts +35 -10
  184. package/src/commands/defaults.ts +69 -45
  185. package/src/commands/keymap.ts +9 -0
  186. package/src/commands/levels.ts +11 -5
  187. package/src/commands/live-context.ts +2 -0
  188. package/src/commands/registry.ts +10 -1
  189. package/src/content/collection-match.ts +6 -5
  190. package/src/content/collection-pages.ts +412 -0
  191. package/src/content/content-collections.ts +270 -0
  192. package/src/content/entry-commands.ts +51 -60
  193. package/src/content/entry-editor.ts +111 -18
  194. package/src/content/entry-fields.ts +13 -1
  195. package/src/content/entry-inspector.ts +225 -0
  196. package/src/content/entry-model.ts +17 -3
  197. package/src/content/entry-open.ts +80 -0
  198. package/src/content/entry-summaries.ts +440 -0
  199. package/src/content/file-record-ids.ts +80 -0
  200. package/src/content/file-records.ts +125 -0
  201. package/src/content/page-summaries.ts +129 -0
  202. package/src/content/record-entry.ts +201 -0
  203. package/src/content/writing-banner.ts +177 -0
  204. package/src/create/add-new-commands.ts +185 -0
  205. package/src/create/add-new-flow.ts +1116 -0
  206. package/src/create/add-new.ts +1014 -0
  207. package/src/create/element-name.ts +121 -0
  208. package/src/editor/convert-to-component.ts +67 -43
  209. package/src/editor/file-drop-action.ts +9 -1
  210. package/src/editor/inline-edit-apply.ts +44 -0
  211. package/src/editor/inline-edit.ts +10 -0
  212. package/src/editor/insert-component.ts +91 -0
  213. package/src/editor/insert-zone-action.ts +13 -4
  214. package/src/editor/shortcuts.ts +44 -22
  215. package/src/editor/slash-menu.ts +51 -8
  216. package/src/files/components.ts +74 -10
  217. package/src/files/file-ops.ts +15 -5
  218. package/src/files/files.ts +164 -150
  219. package/src/files/fs-events.ts +18 -7
  220. package/src/files/media-meta.ts +95 -1
  221. package/src/files/media-types.ts +55 -0
  222. package/src/files/media-upload.ts +209 -52
  223. package/src/files/new-file-name.ts +156 -0
  224. package/src/files/serialize-document.ts +13 -3
  225. package/src/format/format-host.ts +15 -0
  226. package/src/github/github-auth.ts +2 -2
  227. package/src/github/github-publish.ts +4 -3
  228. package/src/grid/grid-controller.ts +5 -1
  229. package/src/grid/grid-open.ts +0 -27
  230. package/src/grid/grid-panel.ts +54 -2
  231. package/src/grid/grid-reveal.ts +34 -0
  232. package/src/grid/grid-source.ts +3 -25
  233. package/src/grid/grid-view.ts +31 -6
  234. package/src/grid/sources/content-source.ts +75 -7
  235. package/src/grid/tabulator-tables.d.ts +6 -0
  236. package/src/hosting/document.ts +2 -2
  237. package/src/i18n/i18n-commands.ts +2 -1
  238. package/src/media/media-commands.ts +181 -0
  239. package/src/media/media-library-model.ts +232 -0
  240. package/src/media/media-library.ts +1283 -0
  241. package/src/media/media-pane.ts +47 -19
  242. package/src/packages/pull-package-sync.ts +1 -1
  243. package/src/panels/activity-panel.ts +21 -5
  244. package/src/panels/ai-chat/chat-markdown.ts +8 -8
  245. package/src/panels/block-action-bar.ts +11 -11
  246. package/src/panels/canvas-dnd-bridge.ts +5 -2
  247. package/src/panels/chat-panel.ts +6 -6
  248. package/src/panels/collections-panel.ts +306 -0
  249. package/src/panels/component-preview.ts +35 -13
  250. package/src/panels/data-explorer.ts +1 -1
  251. package/src/panels/data-grid.ts +4 -0
  252. package/src/panels/dnd.ts +17 -30
  253. package/src/panels/elements-panel.ts +9 -2
  254. package/src/panels/empty-state.ts +2 -2
  255. package/src/panels/formula-workspace.ts +2 -3
  256. package/src/panels/frontmatter-fields.ts +9 -9
  257. package/src/panels/git-diff-open.ts +9 -5
  258. package/src/panels/head-panel.ts +369 -103
  259. package/src/panels/i18n-panel.ts +11 -10
  260. package/src/panels/imports-panel.ts +2 -0
  261. package/src/panels/jump-bar.ts +27 -2
  262. package/src/panels/layers-panel.ts +36 -30
  263. package/src/panels/left-panel.ts +22 -8
  264. package/src/panels/navigator-panels.ts +23 -11
  265. package/src/panels/pane-context.ts +111 -29
  266. package/src/panels/pane-grid.ts +6 -6
  267. package/src/panels/panel-registry.ts +14 -9
  268. package/src/panels/properties-panel.ts +7 -3
  269. package/src/panels/right-panel.ts +199 -43
  270. package/src/panels/seo-modal.ts +41 -108
  271. package/src/panels/settings-menu.ts +52 -50
  272. package/src/panels/settings-pane.ts +268 -162
  273. package/src/panels/signals-panel.ts +3 -4
  274. package/src/panels/site-model.ts +367 -0
  275. package/src/panels/site-panel.ts +638 -0
  276. package/src/panels/style-panel.ts +37 -3
  277. package/src/panels/stylebook-doc.ts +142 -10
  278. package/src/panels/stylebook-layers-panel.ts +39 -80
  279. package/src/panels/stylebook-panel.ts +47 -10
  280. package/src/panels/styles-panel.ts +327 -0
  281. package/src/panels/tab-strip.ts +109 -25
  282. package/src/platform.ts +1 -1
  283. package/src/platforms/cloud.ts +28 -1
  284. package/src/platforms/default-platform.ts +4 -4
  285. package/src/platforms/devserver.ts +51 -25
  286. package/src/publish/deploy-checklist.ts +12 -7
  287. package/src/publish/pages-service.ts +38 -14
  288. package/src/publish/publish-changes.ts +491 -0
  289. package/src/publish/publish-commands.ts +83 -18
  290. package/src/publish/publish-ids.ts +49 -0
  291. package/src/publish/publish-quick.ts +148 -0
  292. package/src/publish/publish-workspace.ts +926 -0
  293. package/src/publish/source-control.ts +907 -0
  294. package/src/services/automation.ts +16 -20
  295. package/src/services/cf-settings.ts +4 -4
  296. package/src/services/connection.ts +2 -2
  297. package/src/services/directory-picker.ts +2 -2
  298. package/src/services/references.ts +0 -0
  299. package/src/services/render-critic.ts +21 -2
  300. package/src/services/settings/definitions.ts +25 -14
  301. package/src/settings/contributed-section.ts +49 -10
  302. package/src/settings/css-vars-editor.ts +93 -27
  303. package/src/settings/developer-panels.ts +43 -0
  304. package/src/settings/extension-sections.ts +20 -2
  305. package/src/settings/general-settings.ts +91 -21
  306. package/src/settings/preferences-dialog.ts +8 -1
  307. package/src/settings/project-sections.ts +27 -10
  308. package/src/settings/schema-field-ui.ts +3 -1
  309. package/src/settings/section-registry.ts +116 -11
  310. package/src/settings/settings-dialog.ts +192 -0
  311. package/src/settings/settings-document.ts +182 -162
  312. package/src/shell.ts +467 -431
  313. package/src/site-context.ts +64 -10
  314. package/src/state.ts +28 -9
  315. package/src/studio.ts +194 -41
  316. package/src/style/project-styles.ts +34 -0
  317. package/src/style/stylebook-specimens.ts +89 -0
  318. package/src/style/stylebook-target.ts +26 -0
  319. package/src/style/tag-inheritance.ts +105 -0
  320. package/src/style/variables-focus.ts +61 -0
  321. package/src/style/variables-view.ts +235 -0
  322. package/src/surfaces/add-new.json +1482 -0
  323. package/src/surfaces/add-new.ts +325 -0
  324. package/src/surfaces/ai-chat.ts +2 -2
  325. package/src/surfaces/boot-failure.json +4 -3
  326. package/src/surfaces/bottom-dock.json +1 -1
  327. package/src/surfaces/canvas-stage.json +30 -19
  328. package/src/surfaces/canvas-stage.ts +5 -5
  329. package/src/surfaces/collections-panel.json +615 -0
  330. package/src/surfaces/collections-panel.ts +168 -0
  331. package/src/surfaces/commandbar.json +241 -96
  332. package/src/surfaces/commandbar.ts +134 -99
  333. package/src/surfaces/empty-state.json +1 -1
  334. package/src/surfaces/entry-editor.json +136 -0
  335. package/src/surfaces/entry-editor.ts +21 -0
  336. package/src/surfaces/entry-inspector.json +371 -0
  337. package/src/surfaces/entry-inspector.ts +143 -0
  338. package/src/surfaces/inspector-dock.json +162 -14
  339. package/src/surfaces/inspector-dock.ts +46 -19
  340. package/src/surfaces/library-pane.json +670 -437
  341. package/src/surfaces/library-pane.ts +94 -59
  342. package/src/surfaces/media-browser.json +62 -6
  343. package/src/surfaces/media-browser.ts +15 -1
  344. package/src/surfaces/media-field.json +1 -1
  345. package/src/surfaces/media-library.json +1586 -0
  346. package/src/surfaces/media-library.ts +282 -0
  347. package/src/surfaces/media-pick-dialog.json +71 -0
  348. package/src/surfaces/media-pick-dialog.ts +132 -0
  349. package/src/surfaces/menu.ts +18 -0
  350. package/src/surfaces/pane-context.json +144 -77
  351. package/src/surfaces/pane-context.ts +24 -0
  352. package/src/surfaces/panel-deploy-checklist.json +12 -6
  353. package/src/surfaces/panel-deploy-checklist.ts +3 -1
  354. package/src/surfaces/panel-page.json +72 -2
  355. package/src/surfaces/panel-page.ts +38 -7
  356. package/src/surfaces/panel-signals.json +1 -1
  357. package/src/surfaces/panel-signals.ts +5 -5
  358. package/src/surfaces/panel-stylebook-layers.json +71 -204
  359. package/src/surfaces/panel-stylebook-layers.ts +0 -21
  360. package/src/surfaces/preferences.json +120 -48
  361. package/src/surfaces/preferences.ts +8 -0
  362. package/src/surfaces/publish-quick.json +428 -0
  363. package/src/surfaces/publish-quick.ts +165 -0
  364. package/src/surfaces/publish-workspace.json +2892 -0
  365. package/src/surfaces/publish-workspace.ts +391 -0
  366. package/src/surfaces/rail.json +1 -159
  367. package/src/surfaces/rail.ts +18 -75
  368. package/src/surfaces/schema-form.json +10 -2
  369. package/src/surfaces/schema-form.ts +2 -0
  370. package/src/surfaces/seo.json +1 -1
  371. package/src/surfaces/settings-contributed.json +5 -5
  372. package/src/surfaces/settings-contributed.ts +18 -2
  373. package/src/surfaces/settings-css-vars.json +44 -36
  374. package/src/surfaces/settings-css-vars.ts +77 -4
  375. package/src/surfaces/settings-deploy.json +2 -15
  376. package/src/surfaces/settings-deploy.ts +1 -1
  377. package/src/surfaces/settings-dialog.json +51 -0
  378. package/src/surfaces/settings-dialog.ts +169 -0
  379. package/src/surfaces/settings-overview.json +3 -3
  380. package/src/surfaces/settings-overview.ts +9 -2
  381. package/src/surfaces/settings-pane.json +269 -46
  382. package/src/surfaces/settings-pane.ts +85 -24
  383. package/src/surfaces/shell.json +2 -1
  384. package/src/surfaces/site-panel.json +1029 -0
  385. package/src/surfaces/site-panel.ts +233 -0
  386. package/src/surfaces/slash-menu.json +63 -21
  387. package/src/surfaces/slash-menu.ts +23 -0
  388. package/src/surfaces/statusbar.ts +39 -15
  389. package/src/surfaces/styles-panel.json +735 -0
  390. package/src/surfaces/styles-panel.ts +195 -0
  391. package/src/surfaces/styles-variables.json +149 -0
  392. package/src/surfaces/styles-variables.ts +145 -0
  393. package/src/surfaces/tab-strip.json +4 -4
  394. package/src/surfaces/welcome.ts +1 -1
  395. package/src/surfaces/writing-banner.json +94 -0
  396. package/src/surfaces/writing-banner.ts +80 -0
  397. package/src/tabs/bare-repeaters.ts +101 -0
  398. package/src/tabs/tab.ts +47 -7
  399. package/src/types.ts +21 -26
  400. package/src/ui/form-controls.ts +47 -8
  401. package/src/ui/layers.ts +13 -0
  402. package/src/ui/media-picker.ts +284 -40
  403. package/src/ui/regions.ts +7 -6
  404. package/src/ui/schema-form.ts +259 -27
  405. package/src/ui/virtual-window.ts +26 -1
  406. package/src/utils/base64.ts +3 -3
  407. package/src/utils/edit-display.ts +322 -67
  408. package/src/utils/local-day.ts +18 -0
  409. package/src/workspace/pane-derive.ts +4 -4
  410. package/src/workspace/session.ts +28 -7
  411. package/src/workspace/tab-workspace.ts +137 -0
  412. package/src/workspace/workspace-back.ts +189 -0
  413. package/src/workspace/workspace-home.ts +133 -0
  414. package/src/workspace/workspace-ids.ts +129 -0
  415. package/src/workspace/workspace-switch.ts +372 -0
  416. package/src/workspace/workspace.ts +125 -11
  417. package/styles/shell-frame.css +30 -7
  418. package/styles/shell-frame.json +15 -3
  419. package/dist/chunks/2020-f2gkpy8d.js +0 -4
  420. package/dist/chunks/adapter-4912g339.js +0 -4
  421. package/dist/chunks/cf-account-picker-wccaenh6.js +0 -4
  422. package/dist/chunks/cf-settings-br6105tr.js +0 -4
  423. package/dist/chunks/color-28ksk2qm.js +0 -4
  424. package/dist/chunks/components-db68vsn7.js +0 -4
  425. package/dist/chunks/content-source-1449qesq.js +0 -4
  426. package/dist/chunks/convert-to-repeater-5h457egj.js +0 -4
  427. package/dist/chunks/editor-x9jn86a7.js +0 -4
  428. package/dist/chunks/entry-commands-may24cpt.js +0 -4
  429. package/dist/chunks/extension-sections-pvr14vxr.js +0 -4
  430. package/dist/chunks/file-ops-x9v54pcj.js +0 -4
  431. package/dist/chunks/files-j3knqf0s.js +0 -4
  432. package/dist/chunks/format-host-tyre2trb.js +0 -4
  433. package/dist/chunks/fs-events-64ma9htc.js +0 -4
  434. package/dist/chunks/git-panel-84ps5dex.js +0 -4
  435. package/dist/chunks/iframe-entry-fvbk89gm.js +0 -5
  436. package/dist/chunks/iframe-host-ck6vejt5.js +0 -4
  437. package/dist/chunks/index-b8xw3vy9.js +0 -4
  438. package/dist/chunks/jsonMode-w15cmrcm.js +0 -13
  439. package/dist/chunks/jx-validate-at3zn8wa.js +0 -4
  440. package/dist/chunks/layers-h4xp1pss.js +0 -4
  441. package/dist/chunks/layers-panel-m5hw1d7g.js +0 -4
  442. package/dist/chunks/lit-html-8t8t3dnr.js +0 -4
  443. package/dist/chunks/media-picker-2cweexc5.js +0 -4
  444. package/dist/chunks/menu-ynw13y0s.js +0 -4
  445. package/dist/chunks/monaco-buffer-qzxn567r.js +0 -4
  446. package/dist/chunks/monaco-setup-gxf6656g.js +0 -4
  447. package/dist/chunks/notify-cj5zbrs2.js +0 -4
  448. package/dist/chunks/parse-b7ddhr8m.js +0 -4
  449. package/dist/chunks/platform-3dfws9js.js +0 -4
  450. package/dist/chunks/popover-jt2gxmzs.js +0 -4
  451. package/dist/chunks/publish-panel-1gvxbj21.js +0 -4
  452. package/dist/chunks/quick-search-0dajrwqg.js +0 -4
  453. package/dist/chunks/references-49qgt404.js +0 -4
  454. package/dist/chunks/right-panel-jm1bwe53.js +0 -4
  455. package/dist/chunks/section-registry-6kwc4fky.js +0 -4
  456. package/dist/chunks/studio-0rt52vpq.js +0 -5
  457. package/dist/chunks/studio-18vgbhs5.js +0 -5
  458. package/dist/chunks/studio-24mccdrj.js +0 -5
  459. package/dist/chunks/studio-2eh507zk.js +0 -9
  460. package/dist/chunks/studio-2hcbccfv.js +0 -5
  461. package/dist/chunks/studio-2jbs3rxv.js +0 -5
  462. package/dist/chunks/studio-4h8k4dw9.js +0 -5
  463. package/dist/chunks/studio-5f6n18kx.js +0 -5
  464. package/dist/chunks/studio-5gthpky6.js +0 -5
  465. package/dist/chunks/studio-6ep3js6b.js +0 -9
  466. package/dist/chunks/studio-6wkmf3wz.js +0 -9
  467. package/dist/chunks/studio-841rf3cg.js +0 -5
  468. package/dist/chunks/studio-8gmwgheg.js +0 -5
  469. package/dist/chunks/studio-8qm0ep50.js +0 -5
  470. package/dist/chunks/studio-924p1tm1.js +0 -6
  471. package/dist/chunks/studio-a3shpz9y.js +0 -5
  472. package/dist/chunks/studio-amsbaaar.js +0 -6
  473. package/dist/chunks/studio-at5spjbc.js +0 -7
  474. package/dist/chunks/studio-b2xv945e.js +0 -5
  475. package/dist/chunks/studio-bn5nkafw.js +0 -5
  476. package/dist/chunks/studio-bw6q5xjf.js +0 -9
  477. package/dist/chunks/studio-c7q0t9x1.js +0 -5
  478. package/dist/chunks/studio-camnhc96.js +0 -6
  479. package/dist/chunks/studio-cffqvnzd.js +0 -5
  480. package/dist/chunks/studio-efvfrsf8.js +0 -5
  481. package/dist/chunks/studio-er30bpcx.js +0 -5
  482. package/dist/chunks/studio-ezscgr64.js +0 -5
  483. package/dist/chunks/studio-ffrrncvz.js +0 -5
  484. package/dist/chunks/studio-fpphgn8y.js +0 -10
  485. package/dist/chunks/studio-j1kvhdjk.js +0 -4
  486. package/dist/chunks/studio-j430n16g.js +0 -7
  487. package/dist/chunks/studio-jjkg84nj.js +0 -5
  488. package/dist/chunks/studio-m0q32ars.js +0 -4
  489. package/dist/chunks/studio-m6bdst11.js +0 -5
  490. package/dist/chunks/studio-nv2cptd4.js +0 -64
  491. package/dist/chunks/studio-nwfrc98n.js +0 -5
  492. package/dist/chunks/studio-p1wgvp7r.js +0 -5
  493. package/dist/chunks/studio-pag2wncm.js +0 -5
  494. package/dist/chunks/studio-qvanvzfd.js +0 -5
  495. package/dist/chunks/studio-qwa64kt7.js +0 -5
  496. package/dist/chunks/studio-rk1zc4x3.js +0 -928
  497. package/dist/chunks/studio-se2r3ptc.js +0 -5
  498. package/dist/chunks/studio-sg2a0dh0.js +0 -5
  499. package/dist/chunks/studio-tjzjhe68.js +0 -5
  500. package/dist/chunks/studio-v2w7q8r1.js +0 -7
  501. package/dist/chunks/studio-v5vjq1h0.js +0 -4
  502. package/dist/chunks/studio-v8aga3vp.js +0 -14
  503. package/dist/chunks/studio-vfcdrfmv.js +0 -5
  504. package/dist/chunks/studio-vmfkgdjf.js +0 -5
  505. package/dist/chunks/studio-wt1816jj.js +0 -5
  506. package/dist/chunks/studio-wz73q5kq.js +0 -4
  507. package/dist/chunks/studio-y04qtxvp.js +0 -7
  508. package/dist/chunks/studio-y21g8zzg.js +0 -5
  509. package/dist/chunks/studio-y64hrt8p.js +0 -12
  510. package/dist/chunks/studio-ynn90f58.js +0 -16
  511. package/dist/chunks/studio-yxz682sx.js +0 -5
  512. package/dist/chunks/studio-zp7snvkq.js +0 -5
  513. package/dist/chunks/studio-zq4z6tm6.js +0 -5
  514. package/dist/chunks/toast-c9fn075p.js +0 -4
  515. package/dist/chunks/tsMode-sf49ee9x.js +0 -14
  516. package/dist/chunks/workspace-jtfahpee.js +0 -4
  517. package/src/panels/frontmatter-panel.ts +0 -711
  518. package/src/panels/git-panel.ts +0 -1108
  519. package/src/surfaces/doc-header.json +0 -776
  520. package/src/surfaces/doc-header.ts +0 -222
  521. package/src/surfaces/git-panel.json +0 -1880
  522. package/src/surfaces/git-panel.ts +0 -264
@@ -0,0 +1,233 @@
1
+ /// <reference lib="dom" />
2
+ /**
3
+ * The Site panel, as a mounted document (`specs/studio.md` §5.7).
4
+ *
5
+ * `panels/site-panel.ts` is the flow — which files are pages and in what order, how a collection
6
+ * nests its pages, what a click opens and what a drag inserts — and this is the surface it draws
7
+ * into: the reactive scope `site-panel.json` reads, and the mount that stays put while the
8
+ * Navigator repaints around it.
9
+ *
10
+ * **Three islands, all through `onNodeCreated`.** A component card's preview box is filled with the
11
+ * component rendered live, a component card is a drag source, and a media thumbnail is a drag
12
+ * source. Each is announced to the flow as its node is CREATED, with the mapped row it was drawn
13
+ * for, which is the compliant seam for registering behaviour on a node a document created
14
+ * (studio-ui-guidelines.md §9.4) — never a query over the mounted DOM. The `disposed` guard comes
15
+ * first for the reason `surfaces/files-panel.ts` gives: a panel taken down inside the same turn
16
+ * still walks this callback for every row, and a registration made then would outlive it.
17
+ *
18
+ * @docs studio/interface
19
+ */
20
+
21
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
22
+ import { reactive } from "../reactivity";
23
+ import { mountSurface, registerSurface } from "../ui/surface";
24
+ import sitePanelDoc from "./site-panel.json";
25
+ import type { JsonObject, JxElement } from "@jxsuite/schema/types";
26
+ import type { JxScope } from "@jxsuite/runtime/types";
27
+ import type { SurfaceHandle } from "../ui/surface";
28
+ import type {
29
+ SiteComponentRow,
30
+ SiteMediaRow,
31
+ SitePageRow,
32
+ SiteTemplateRow,
33
+ } from "../panels/site-model";
34
+
35
+ registerSurface("site-panel", sitePanelDoc);
36
+
37
+ /** What a section draws: a sentence while reading, one when empty or filtered out, or its rows. */
38
+ export type SiteSectionState = "loading" | "empty" | "nomatch" | "listed";
39
+
40
+ /** Everything the document reads. Every field is a value. */
41
+ export interface SitePanelValues {
42
+ /** `none` draws one sentence asking for a project; `project` draws the four sections. */
43
+ body: "none" | "project";
44
+ filter: string;
45
+ pages: SitePageRow[];
46
+ pagesState: SiteSectionState;
47
+ pagesCount: string;
48
+ templates: SiteTemplateRow[];
49
+ templatesState: SiteSectionState;
50
+ templatesCount: string;
51
+ components: SiteComponentRow[];
52
+ componentsState: SiteSectionState;
53
+ componentsCount: string;
54
+ media: SiteMediaRow[];
55
+ mediaState: SiteSectionState;
56
+ mediaCount: string;
57
+ /**
58
+ * The line under a strip that does not show every thumbnail the filter admits ("Show all 766 in
59
+ * Media"), or `""` when it shows them all.
60
+ */
61
+ mediaMore: string;
62
+ }
63
+
64
+ /** What a control can ask the panel to do. Read once, when the scope is made. */
65
+ export interface SitePanelActions {
66
+ /** The filter field now holds `value`. */
67
+ setFilter: (value: string) => void;
68
+ /** Open a page, a template or a media file by its project path. */
69
+ open: (path: string) => void;
70
+ /** Open a component's definition by its tag. */
71
+ openComponent: (tagName: string) => void;
72
+ /** The `+` was pressed: open Add new. */
73
+ add: () => void;
74
+ /** Switch to the Media workspace. */
75
+ openMedia: () => void;
76
+ }
77
+
78
+ /** The islands the flow attaches behaviour to, each announced as it is created. */
79
+ export interface SitePanelIslands {
80
+ /** A component card's empty preview box, for the component with this tag. */
81
+ preview: (element: HTMLElement, tagName: string) => void;
82
+ /** A component card, which drags an instance of the component with this tag. */
83
+ componentSource: (element: HTMLElement, tagName: string) => void;
84
+ /** A media thumbnail, which drags an element referencing the file at this path. */
85
+ mediaSource: (element: HTMLElement, path: string) => void;
86
+ }
87
+
88
+ export interface SitePanelSurfaceHandle {
89
+ /** Settles once the document is mounted. */
90
+ readonly ready: Promise<unknown>;
91
+ /** Whether the mounted root is still where it was put. */
92
+ connected: () => boolean;
93
+ update: (values: SitePanelValues) => void;
94
+ dispose: () => void;
95
+ }
96
+
97
+ interface SitePanelScope extends SitePanelValues, SitePanelActions {}
98
+
99
+ /** The scope's shape before the first projection lands on it. */
100
+ export function emptySitePanelValues(): SitePanelValues {
101
+ return {
102
+ body: "none",
103
+ components: [],
104
+ componentsCount: "",
105
+ componentsState: "loading",
106
+ filter: "",
107
+ media: [],
108
+ mediaCount: "",
109
+ mediaMore: "",
110
+ mediaState: "loading",
111
+ pages: [],
112
+ pagesCount: "",
113
+ pagesState: "loading",
114
+ templates: [],
115
+ templatesCount: "",
116
+ templatesState: "loading",
117
+ };
118
+ }
119
+
120
+ /** Write a projection in, field by field, so an unchanged field is inert. */
121
+ function project(scope: SitePanelScope, values: SitePanelValues): void {
122
+ scope.body = values.body;
123
+ scope.filter = values.filter;
124
+ scope.pages = values.pages;
125
+ scope.pagesState = values.pagesState;
126
+ scope.pagesCount = values.pagesCount;
127
+ scope.templates = values.templates;
128
+ scope.templatesState = values.templatesState;
129
+ scope.templatesCount = values.templatesCount;
130
+ scope.components = values.components;
131
+ scope.componentsState = values.componentsState;
132
+ scope.componentsCount = values.componentsCount;
133
+ scope.media = values.media;
134
+ scope.mediaState = values.mediaState;
135
+ scope.mediaCount = values.mediaCount;
136
+ scope.mediaMore = values.mediaMore;
137
+ }
138
+
139
+ /** The `part` a node was declared with, or the empty string. */
140
+ function partOf(def: JxElement | string): string {
141
+ const part = isString(def) ? undefined : def.attributes?.["part"];
142
+ return isString(part) ? part : "";
143
+ }
144
+
145
+ /** The `$map` item a node was rendered inside, if it was rendered inside one. */
146
+ function mapItem(state: JxScope | undefined): JsonObject | null {
147
+ const map = state?.["$map"];
148
+ const item = isJsonObject(map) ? map["item"] : undefined;
149
+ return isJsonObject(item) ? item : null;
150
+ }
151
+
152
+ /** One string field of the mapped row, or the empty string. */
153
+ function itemField(state: JxScope | undefined, field: string): string {
154
+ const value = mapItem(state)?.[field];
155
+ return isString(value) ? value : "";
156
+ }
157
+
158
+ /**
159
+ * Mount the Site panel into `container`, the content box the Navigator painted.
160
+ *
161
+ * @param container Where the document goes.
162
+ * @param values What it shows to begin with.
163
+ * @param actions What its controls do.
164
+ * @param islands Where the flow attaches previews and drag sources.
165
+ */
166
+ export function mountSitePanelSurface(
167
+ container: HTMLElement,
168
+ values: SitePanelValues,
169
+ actions: SitePanelActions,
170
+ islands: SitePanelIslands,
171
+ ): SitePanelSurfaceHandle {
172
+ const scope: SitePanelScope = reactive<SitePanelScope>({
173
+ ...emptySitePanelValues(),
174
+ ...actions,
175
+ });
176
+ project(scope, values);
177
+
178
+ let mounted: SurfaceHandle | null = null;
179
+ let disposed = false;
180
+ const ready = mountSurface("site-panel", scope, container, {
181
+ onNodeCreated: (element, _path, def, state) => {
182
+ if (disposed || !(element instanceof HTMLElement)) {
183
+ return;
184
+ }
185
+ switch (partOf(def)) {
186
+ case "card-preview": {
187
+ const tag = itemField(state, "tagName");
188
+ if (tag !== "") {
189
+ islands.preview(element, tag);
190
+ }
191
+ break;
192
+ }
193
+ case "component-card": {
194
+ const tag = itemField(state, "tagName");
195
+ if (tag !== "") {
196
+ islands.componentSource(element, tag);
197
+ }
198
+ break;
199
+ }
200
+ case "media-thumb": {
201
+ const path = itemField(state, "path");
202
+ if (path !== "") {
203
+ islands.mediaSource(element, path);
204
+ }
205
+ break;
206
+ }
207
+ default: {
208
+ break;
209
+ }
210
+ }
211
+ },
212
+ }).then((surface) => {
213
+ if (disposed) {
214
+ surface.dispose();
215
+ return surface;
216
+ }
217
+ mounted = surface;
218
+ return surface;
219
+ });
220
+
221
+ return {
222
+ connected: () => !disposed && (mounted === null || mounted.root.parentNode === container),
223
+ dispose() {
224
+ disposed = true;
225
+ mounted?.dispose();
226
+ mounted = null;
227
+ },
228
+ ready,
229
+ update: (next) => {
230
+ project(scope, next);
231
+ },
232
+ };
233
+ }
@@ -140,36 +140,78 @@
140
140
  {
141
141
  "$prototype": "Array",
142
142
  "items": {
143
- "$ref": "#/state/rows"
143
+ "$ref": "#/state/groups"
144
144
  },
145
145
  "key": {
146
146
  "$ref": "$map/item/key"
147
147
  },
148
148
  "map": {
149
- "tagName": "jx-option",
149
+ "tagName": "div",
150
150
  "attributes": {
151
- "part": "option",
152
- "id": "slash-menu-option-${$map.index}",
153
- "value": "${$map.item.key}",
154
- "label": "${$map.item.label}",
155
- "description": "${$map.item.description}"
151
+ "part": "group",
152
+ "role": "group",
153
+ "aria-label": "${$map.item.name}"
156
154
  },
157
- "onmouseenter": {
158
- "$prototype": "Function",
159
- "body": [
160
- {
161
- "operator": "call",
162
- "target": {
163
- "$ref": "#/state/hover"
155
+ "children": [
156
+ {
157
+ "tagName": "div",
158
+ "attributes": {
159
+ "part": "group-label-slot",
160
+ "role": "none"
161
+ },
162
+ "style": {
163
+ "display": "contents"
164
+ },
165
+ "$switch": {
166
+ "$ref": "$map/item/hasLabel"
167
+ },
168
+ "cases": {
169
+ "true": {
170
+ "tagName": "div",
171
+ "attributes": {
172
+ "part": "group-heading",
173
+ "aria-hidden": "true"
174
+ },
175
+ "textContent": "${$map.item.label}"
176
+ }
177
+ }
178
+ },
179
+ {
180
+ "$prototype": "Array",
181
+ "items": {
182
+ "$ref": "$map/item/rows"
183
+ },
184
+ "key": {
185
+ "$ref": "$map/item/key"
186
+ },
187
+ "map": {
188
+ "tagName": "jx-option",
189
+ "attributes": {
190
+ "part": "option",
191
+ "id": "slash-menu-option-${$map.item.index}",
192
+ "value": "${$map.item.key}",
193
+ "label": "${$map.item.label}",
194
+ "description": "${$map.item.description}"
164
195
  },
165
- "value": [
166
- {
167
- "$ref": "$map/index"
168
- }
169
- ]
196
+ "onmouseenter": {
197
+ "$prototype": "Function",
198
+ "body": [
199
+ {
200
+ "operator": "call",
201
+ "target": {
202
+ "$ref": "#/state/hover"
203
+ },
204
+ "value": [
205
+ {
206
+ "$ref": "$map/item/index"
207
+ }
208
+ ]
209
+ }
210
+ ]
211
+ }
170
212
  }
171
- ]
172
- }
213
+ }
214
+ ]
173
215
  }
174
216
  }
175
217
  ]
@@ -59,6 +59,23 @@ export interface SlashMenuRow {
59
59
  label: string;
60
60
  /** A muted note at the end of the row. Empty draws no box: `jx-option` hides its own part. */
61
61
  description: string;
62
+ /** The row's position in the FLAT list — its id, and what a hover reports. */
63
+ index: number;
64
+ }
65
+
66
+ /**
67
+ * One headed run of rows: the HTML elements (no heading), then the project's components under
68
+ * "Components" (§5.7). A `role="group"` wrapper is what `jx-listbox` reads headings from, and its
69
+ * rows stay its own (`optionsOf` keeps every descendant option whose nearest listbox is this one).
70
+ */
71
+ export interface SlashMenuGroup {
72
+ key: string;
73
+ /** The visible heading; empty for the unheaded first group. */
74
+ label: string;
75
+ /** The group's accessible name, which the unheaded group needs too. */
76
+ name: string;
77
+ hasLabel: boolean;
78
+ rows: SlashMenuRow[];
62
79
  }
63
80
 
64
81
  /** What the panel is showing right now. */
@@ -71,7 +88,10 @@ export interface SlashMenuView {
71
88
  showFilter: boolean;
72
89
  /** What that field contains. */
73
90
  filter: string;
91
+ /** Every row, flat, in the order the keyboard walks them. */
74
92
  rows: SlashMenuRow[];
93
+ /** The same rows as the panel draws them, headed. */
94
+ groups: SlashMenuGroup[];
75
95
  /** The highlighted row, as an index into {@link SlashMenuView.rows}. */
76
96
  activeIndex: number;
77
97
  }
@@ -108,6 +128,7 @@ interface SlashMenuScope {
108
128
  showFilter: boolean;
109
129
  filter: string;
110
130
  rows: SlashMenuRow[];
131
+ groups: SlashMenuGroup[];
111
132
  /**
112
133
  * The active row's id — the ONE string the highlight is written as. The listbox turns it into a
113
134
  * row's `selected`, and the filter field, when there is one, puts the same string in its
@@ -193,6 +214,7 @@ export function openSlashMenuSurface(
193
214
  }
194
215
  },
195
216
  rows: [...view.rows],
217
+ groups: [...view.groups],
196
218
  showFilter: view.showFilter,
197
219
  x: view.x,
198
220
  y: view.y,
@@ -274,6 +296,7 @@ export function openSlashMenuSurface(
274
296
  scope.showFilter = next.showFilter;
275
297
  scope.filter = next.filter;
276
298
  scope.rows = [...next.rows];
299
+ scope.groups = [...next.groups];
277
300
  scope.activeId = activeIdOf(next);
278
301
  scope.isEmpty = next.rows.length === 0;
279
302
  scope.expanded = next.rows.length > 0;
@@ -47,6 +47,8 @@ import { attachJumpBarHost, mountJumpBar, unmountJumpBar } from "../panels/jump-
47
47
  import { shell } from "../shell";
48
48
  import { effect, effectScope, reactive } from "../reactivity";
49
49
  import { activeTab } from "../workspace/workspace";
50
+ import { PROJECT_STYLES_VIEW } from "../style/project-styles";
51
+ import { stylebookTarget } from "../style/stylebook-target";
50
52
  import { activeRegistry } from "../commands/active-registry";
51
53
  import { runReported } from "../commands/run-reported";
52
54
  import { deployStatusItem } from "../publish/deploy-checklist";
@@ -164,6 +166,14 @@ export function aheadBehindLabel(ahead: number, behind: number): string {
164
166
  return `${ahead > 0 ? ` ↑${ahead}` : ""}${behind > 0 ? ` ↓${behind}` : ""}`;
165
167
  }
166
168
 
169
+ /** "No changes", "1 changed file", "3 changed files": what the branch item's tooltip states. */
170
+ export function changedFilesLabel(count: number): string {
171
+ if (count === 0) {
172
+ return "No changes";
173
+ }
174
+ return count === 1 ? "1 changed file" : `${count} changed files`;
175
+ }
176
+
167
177
  function projectField_(registry: CommandRegistry | null): ProjectedField | null {
168
178
  const project = projectState;
169
179
  const { status } = shell.git;
@@ -183,11 +193,16 @@ function projectField_(registry: CommandRegistry | null): ProjectedField | null
183
193
  — and adjacent duplicate chrome is what the chrome budget (studio-ui-guidelines.md §12.2)
184
194
  forbids. `tests/statusbar.test.ts` pins the pairing from both ends, so deleting the
185
195
  checklist's repo step fails there rather than quietly taking the state off the bar. */
196
+ /* `publish.open { tab: "review" }` rather than the bare workspace setter: the setter's title
197
+ is "Switch Workspace", which says nothing about where a branch item goes, and the Publish
198
+ workspace remembers its last sub-tab, so a click from a count of changes could land on
199
+ Hosting. Review changes is the tab that count is a count of. */
186
200
  status?.isRepo === true && status.branch
187
201
  ? {
188
- command: "panel.focus.git",
202
+ args: { tab: "review" },
203
+ command: "publish.open",
189
204
  label: `⑂ ${status.branch}${aheadBehindLabel(status.ahead, status.behind)}`,
190
- title: `${status.files.length} changed file(s)`,
205
+ title: `${changedFilesLabel(status.files.length)} on ${status.branch}`,
191
206
  }
192
207
  : null,
193
208
  // Where the project stands with shipping — ambient state, so it belongs beside the branch and
@@ -203,7 +218,7 @@ function projectField_(registry: CommandRegistry | null): ProjectedField | null
203
218
  args: { tab: "problems" },
204
219
  command: "view.setBottomTab",
205
220
  label: `⚠ ${count}`,
206
- title: `${count} problem(s)`,
221
+ title: count === 1 ? "1 problem" : `${count} problems`,
207
222
  }
208
223
  : null,
209
224
  /* `collab.showStatus` — "what is happening in this document?" — because that is the question a
@@ -233,28 +248,36 @@ function projectField_(registry: CommandRegistry | null): ProjectedField | null
233
248
  * states it permanently, with its ancestors, one field to the left.
234
249
  */
235
250
  function selectionField(registry: CommandRegistry | null): ProjectedField | null {
236
- const paths = activeTab.value?.session.selection ?? [];
237
- if (paths.length > 0) {
238
- // A document selection owns the field even when it prints nothing: the Stylebook's selector
239
- // Below would otherwise appear while an element is picked, which is two answers to one question.
240
- return paths.length > 1
251
+ const tab = activeTab.value;
252
+ /* The Stylebook's selection is what the Style panel is editing, and it is a selection OF the
253
+ Stylebook canvas, so it is the field's content exactly while the focused tab draws that canvas,
254
+ and never elsewhere. It outlives a workspace switch (coming back to Styles finds `h1` still
255
+ picked), but a Content page or the Publish home is not editing `h1`, and the field used to say
256
+ it was there. The Style panel gates on the same mode (`panels/style-panel.ts`).
257
+
258
+ It also wins over the document selection here, because in that mode the document selection is
259
+ not the author's: picking a tag clears it (`selectStylebookTag`), so the "a single selection
260
+ prints nothing" rule below hid the rule being edited in the one place it applied. The command
261
+ bar and the Inspector header ask the same question through `stylebookTarget`. */
262
+ if (tab?.session.ui.canvasMode === PROJECT_STYLES_VIEW) {
263
+ const target = stylebookTarget(tab);
264
+ return target
241
265
  ? projectField(registry, "selection", [
242
266
  {
243
267
  command: null,
244
- label: `${paths.length} selected`,
245
- title: `${paths.length} elements are selected; the trail names the primary`,
268
+ label: target.replaceAll(" ", " › "),
269
+ title: "The style rule being edited",
246
270
  },
247
271
  ])
248
272
  : null;
249
273
  }
250
- // The stylebook's own selection is a selection: it is what the Style panel is editing, and it is
251
- // The only thing in this field when no document node is picked.
252
- return shell.stylebook.selection
274
+ const paths = tab?.session.selection ?? [];
275
+ return paths.length > 1
253
276
  ? projectField(registry, "selection", [
254
277
  {
255
278
  command: null,
256
- label: shell.stylebook.selection.replaceAll(" ", " › "),
257
- title: "The style rule being edited",
279
+ label: `${paths.length} selected`,
280
+ title: `${paths.length} elements are selected; the trail names the primary`,
258
281
  },
259
282
  ])
260
283
  : null;
@@ -352,6 +375,7 @@ export function mountStatusbar(): void {
352
375
  // Reading it here is what repaints the bar from a skeleton into the real thing.
353
376
  void activeRegistry();
354
377
  void shell.stylebook.selection;
378
+ void activeTab.value?.session.ui.canvasMode;
355
379
  void shell.git.status;
356
380
  void problems.length;
357
381
  const tab = activeTab.value;