@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
@@ -1,84 +1,94 @@
1
1
  /// <reference lib="dom" />
2
2
  /**
3
- * Project Settings — a **document**, not a modal.
3
+ * Project Settings: the built-in sections, the `project.json` tab's editors, and the two commands
4
+ * that reach them.
4
5
  *
5
- * Its predecessor (`settings-modal.ts`) was an `inset: 40px` overlay with a scrim, which meant that
6
- * while you tuned a design token that pushes live to the canvas, the canvas was behind the thing
7
- * you were tuning it in, ⌘S/⌘Z/⌘P were suspended, and "Open Data Grid" opened a tab you could not
8
- * see. §17.1 replaces it with a document in the pane whose sections are INNER NAV, and lists them.
6
+ * **Settings is a dialog; the configuration DOCUMENT is still a tab.** `project.json` is a real Tab
7
+ * under the transaction log with one write chokepoint (`tabs/project-config.ts`, §17.1), and it has
8
+ * three editors, the Styles workspace's three views: Elements (`stylebook`), Variables (`tokens`,
9
+ * `style/variables-view.ts`) and Code (`source`). Project Settings is neither of them: it is a
10
+ * dialog in the dialog layer (`./settings-dialog.ts`) hosting the section list, reachable from
11
+ * every workspace, and every section in it writes through the same chokepoint the tab's editors do,
12
+ * so the file has one history whichever door changed it.
9
13
  *
10
- * **The document is the `project.json` tab.** `project.json` is a real Tab under the transaction
11
- * log with one write chokepoint (`tabs/project-config.ts`, §17.1); this module opens that same tab
12
- * — same id, same document object — in the `settings` canvas mode. So the settings form, the
13
- * Project Styles catalogue and the raw JSON are three editors over ONE document, and undo, the
14
- * dirty flag and ⌘S are the ordinary document verbs rather than three bespoke ones. That is the
15
- * whole of the residual the shell redesign's configuration phase disclosed ("⌘Z reaches config
16
- * history only when the `project.json` tab is focused"): the settings surface now IS that tab.
17
- *
18
- * **`settings.open` did not change what it means.** The deliverable was a near-zero manifest diff:
19
- * the command still means "reach project settings, optionally at a named section", its args schema
20
- * still declares `section`, and every shot step that names it is untouched. What changed is the
21
- * `run` — a Tab instead of a modal — and the frame the seven region crops are taken in.
14
+ * **`settings.open` did not change what it means.** It still means "reach project settings,
15
+ * optionally at a named section and entry", its args schema still declares `section` and `entry`,
16
+ * and a key nobody registered still fails the call. What changed is the `run`: a dialog instead of
17
+ * a tab mode.
22
18
  *
23
19
  * @docs studio/projects/settings
24
20
  */
25
21
 
26
22
  import { errorMessage } from "@jxsuite/schema/parse";
27
- import { optionalStringArg, stringProperty } from "../commands/command-args";
23
+ import {
24
+ argsSchema,
25
+ enumArg,
26
+ enumProperty,
27
+ optionalStringArg,
28
+ stringProperty,
29
+ } from "../commands/command-args";
28
30
  import { notify } from "../services/notify";
29
31
  import { projectState } from "../state";
30
32
  import { PROJECT_CONFIG_PATH } from "../tabs/tab";
31
33
  import { lendProjectConfigLayout } from "../tabs/project-config";
32
- import { activeTab, focusPane, openTab, workspace } from "../workspace/workspace";
34
+ import { focusPane, openTab, workspace } from "../workspace/workspace";
33
35
  import {
34
36
  notifySettingsDocument,
35
37
  registerSettingsSection,
36
- settingsDocumentSection,
37
38
  setSettingsSection,
38
39
  settingsSectionKeys,
39
40
  } from "./section-registry";
40
41
  import { renderContextsSection } from "./contexts-section";
41
- import { renderCssVarsEditor } from "./css-vars-editor";
42
42
  import { renderDefsEditor } from "./defs-editor";
43
43
  import { renderDependenciesEditor } from "./dependencies-editor";
44
44
  import { renderExtensionsSection } from "./extensions-section";
45
- import { renderDeploySection, renderRawJsonSection } from "./project-sections";
45
+ import { renderRawJsonSection } from "./project-sections";
46
46
  import { renderGeneralSettings } from "./general-settings";
47
47
  import { renderHeadEditor } from "./head-editor";
48
48
  import { renderLocalesSection } from "./locales-section";
49
49
  import { selectContributedEntry } from "./contributed-section";
50
+ import { closeSettingsDialog, openSettingsDialog } from "./settings-dialog";
50
51
  // The NAME and the wire value, kept apart by that module on purpose — see its docstring.
51
- import { PROJECT_STYLES_TITLE, PROJECT_STYLES_VIEW } from "../style/project-styles";
52
+ import {
53
+ PROJECT_STYLES_TITLE,
54
+ STYLES_TAB_MODES,
55
+ STYLES_VIEWS,
56
+ STYLES_VIEW_MODES,
57
+ } from "../style/project-styles";
58
+ import { activeRegistry } from "../commands/active-registry";
59
+ import { shell } from "../shell";
52
60
  import type { Tab } from "../tabs/tab";
53
61
  import type { AnyCommand, CommandRegistry } from "../commands/registry";
62
+ import type { CommandArgValues } from "../commands/command-args";
63
+
64
+ /** The Code editor's mode, `source`, which `commands/context.ts` maps to the `code` kind. */
65
+ const SOURCE_MODE = STYLES_VIEW_MODES.code;
54
66
 
55
67
  /**
56
- * The canvas mode the settings editor draws under.
57
- *
58
- * `project.json` already declared `["stylebook", "source"]` (`tabs/tab.ts`'s `inferModes`); this is
59
- * the third editor over the same document and it leads, because reaching configuration through a
60
- * form is what "Settings" means to everyone who is not reading the file.
68
+ * The `project.json` tab's editors, in the order its Editor control offers them: Elements,
69
+ * Variables and Code, the Styles workspace's three views.
61
70
  */
62
- export const SETTINGS_MODE = "settings";
63
-
64
- /** The tab's mode list when Project Settings opens it. Settings first, so it is the initial mode. */
65
- const SETTINGS_TAB_MODES = [SETTINGS_MODE, "stylebook", "source"];
71
+ const PROJECT_TAB_MODES = STYLES_TAB_MODES;
66
72
 
67
73
  // ─── Built-in sections ────────────────────────────────────────────────────────
68
- /* Orders leave gaps so a contribution can land between two built-ins. Content Types is NOT here —
74
+ /* Orders leave gaps so a contribution can land between two built-ins. Content Types is NOT here:
69
75
  the parser extension contributes it (order 50) through its Content class descriptor's
70
76
  `$studio.settings` block, registered via ./extension-sections, which is the same path any
71
- extension's section takes.
77
+ extension's section takes, and it is listed under Integrations because that is the default
78
+ group for a contribution.
72
79
 
73
- `icon` is a KEY into the kit's glyph manifest (`@jxsuite/ui/icons`), not a tag — `studio.md`
80
+ Two sections that used to be here are not, and their renderers are not deleted: CSS Variables
81
+ (`./css-vars-editor.ts`) belongs to the Styles workspace, and Deploy (`renderDeploySection`) to
82
+ the Publish workspace. The dialog's Moved footnote says where each went.
83
+
84
+ `icon` is a KEY into the kit's glyph manifest (`@jxsuite/ui/icons`), not a tag: `studio.md`
74
85
  §13.5 is about exactly this distinction, and a key with no row draws nothing and says nothing.
75
- These were `sp-icon-*` names, which is the OTHER key space: they named Spectrum elements, so
76
- every one of them resolved to nothing the moment the nav was ready to draw one. The field is
77
- still documented as reserved (`section-registry.ts`), so nothing here draws today; the names are
78
- held to the kit's manifest by `settings-document.test.ts` so that a name is right when the inner
79
- nav does draw it, rather than discovered wrong then. */
86
+ The field is still documented as reserved (`section-registry.ts`), so nothing here draws today;
87
+ the names are held to the kit's manifest by `settings-document.test.ts` so that a name is right
88
+ when the nav does draw it, rather than discovered wrong then. */
80
89
 
81
90
  registerSettingsSection({
91
+ group: "general",
82
92
  icon: "sliders-horizontal",
83
93
  key: "overview",
84
94
  label: "Overview",
@@ -86,13 +96,35 @@ registerSettingsSection({
86
96
  render: renderGeneralSettings,
87
97
  });
88
98
  /*
89
- * Contexts sits directly under Overview because it is the project's second identity: Overview says
90
- * what the site IS, Contexts says what it is rendered UNDER. It is a definition site only — the
91
- * pane context bar selects among what is defined here, and its "Manage contexts…" footer names this
92
- * key (§6.2). It is a RE-HOST: the section shipped earlier through this same registry and moved
93
- * into the document's inner nav without its renderer being touched.
99
+ * Locales sits with Overview because both are what every author decides about the whole site: its
100
+ * name and address, and the languages it is published in. It is also the definition site the
101
+ * pane's language control, the Languages panel and `i18n.addLocale` all read: there is one
102
+ * `i18n.locales` and this is the form over it.
94
103
  */
95
104
  registerSettingsSection({
105
+ group: "general",
106
+ icon: "globe",
107
+ key: "locales",
108
+ label: "Locales",
109
+ order: 25,
110
+ render: renderLocalesSection,
111
+ });
112
+ registerSettingsSection({
113
+ group: "integrations",
114
+ icon: "share-network",
115
+ key: "extensions",
116
+ label: "Extensions",
117
+ order: 5,
118
+ render: renderExtensionsSection,
119
+ });
120
+ /*
121
+ * Contexts leads Advanced because it is the project's second identity: Overview says what the site
122
+ * IS, Contexts says what it is rendered UNDER (breakpoints, color schemes, features). It is a
123
+ * definition site only: the pane context bar selects among what is defined here, and its "Manage
124
+ * contexts…" footer names this key (§6.2).
125
+ */
126
+ registerSettingsSection({
127
+ group: "advanced",
96
128
  icon: "browser",
97
129
  key: "contexts",
98
130
  label: "Contexts",
@@ -100,39 +132,15 @@ registerSettingsSection({
100
132
  render: renderContextsSection,
101
133
  });
102
134
  registerSettingsSection({
135
+ group: "advanced",
103
136
  icon: "file-code",
104
137
  key: "head",
105
138
  label: "Site head",
106
139
  order: 20,
107
140
  render: renderHeadEditor,
108
141
  });
109
- /*
110
- * Locales sits under Site head because both are facts about the whole site's HEAD rather than about
111
- * one page: `<html lang>` and `<html dir>` are what a locale decides, and the routing choice below
112
- * them decides what a page's URL looks like. It is also the definition site the pane's language
113
- * control, the Languages panel and `i18n.addLocale` all read — there is one `i18n.locales` and this
114
- * is the form over it.
115
- */
116
- registerSettingsSection({
117
- icon: "globe",
118
- key: "locales",
119
- label: "Locales",
120
- order: 25,
121
- render: renderLocalesSection,
122
- });
123
- /*
124
- * CSS Variables was the one section the shell redesign's configuration phase did not list, and it
125
- * stayed so that the project's design tokens never left every surface at once; §17.1 lists it now,
126
- * and `css-variables-shot` addresses this key by name.
127
- */
128
- registerSettingsSection({
129
- icon: "paint-brush",
130
- key: "cssVars",
131
- label: "CSS Variables",
132
- order: 30,
133
- render: renderCssVarsEditor,
134
- });
135
142
  registerSettingsSection({
143
+ group: "advanced",
136
144
  icon: "brackets-curly",
137
145
  key: "definitions",
138
146
  label: "Data Shapes",
@@ -140,70 +148,72 @@ registerSettingsSection({
140
148
  render: renderDefsEditor,
141
149
  });
142
150
  registerSettingsSection({
151
+ group: "advanced",
143
152
  icon: "cube",
144
153
  key: "dependencies",
145
154
  label: "Packages",
146
155
  order: 60,
147
156
  render: renderDependenciesEditor,
148
157
  });
158
+ /*
159
+ * Raw JSON's "Edit as code" leaves the dialog: the Code editor is the `project.json` tab's, which is
160
+ * the Styles workspace's, so the dialog closes and the tab opens in its source editor. Activating
161
+ * it is what switches the workspace (`workspace/tab-workspace.ts`).
162
+ */
149
163
  registerSettingsSection({
150
- icon: "share-network",
151
- key: "extensions",
152
- label: "Extensions",
153
- order: 70,
154
- render: renderExtensionsSection,
155
- });
156
- registerSettingsSection({
157
- icon: "upload-simple",
158
- key: "deploy",
159
- label: "Deploy",
160
- order: 80,
161
- render: renderDeploySection,
162
- });
163
- registerSettingsSection({
164
+ group: "advanced",
164
165
  icon: "code",
165
166
  key: "rawJson",
166
167
  label: "Raw JSON",
167
168
  order: 900,
168
- render: renderRawJsonSection,
169
+ render: (container) => {
170
+ renderRawJsonSection(container, {
171
+ editAsCode: () => {
172
+ closeSettingsDialog();
173
+ showSettingsDocument(SOURCE_MODE);
174
+ },
175
+ });
176
+ },
169
177
  });
170
178
 
171
- // ─── Where the settings editor is ────────────────────────────────────────────
179
+ // ─── The document ─────────────────────────────────────────────────────────────
172
180
 
173
181
  /**
174
- * Which section the settings document is showing, or `null` when it is not the active editor.
182
+ * Remember the view the Styles workspace's home is in, when `mode` is one of the two home views
183
+ * (Variables or Elements). Code is a view beside the home, never the home, so it is not remembered:
184
+ * Back from Code and the next visit both return to the view recorded here
185
+ * (`shell.stylebook.view`).
175
186
  *
176
- * @returns {string | null}
187
+ * @param {string} mode The canvas mode `project.json` was just shown in
177
188
  */
178
- export function activeSettingsSection(): string | null {
179
- return settingsDocumentOpen() ? settingsDocumentSection() : null;
180
- }
181
-
182
- /** Whether the active tab is the configuration document in its settings editor. */
183
- export function settingsDocumentOpen(): boolean {
184
- const tab = activeTab.value;
185
- return tab?.documentPath === PROJECT_CONFIG_PATH && tab.session.ui.canvasMode === SETTINGS_MODE;
189
+ export function rememberStylesView(mode: string): void {
190
+ if (mode === STYLES_VIEW_MODES.variables || mode === STYLES_VIEW_MODES.elements) {
191
+ shell.stylebook.view = mode;
192
+ }
186
193
  }
187
194
 
188
- // ─── The document ─────────────────────────────────────────────────────────────
189
-
190
195
  /**
191
- * Open (or reveal) the configuration document in its settings editor.
196
+ * Open (or reveal) the configuration document in one of its editors.
192
197
  *
193
- * The tab is keyed by `project.json` on purpose: opening the file from the Files tree and opening
194
- * Settings reach the same tab, the same history and the same dirty flag. When it is already open
195
- * this only switches the editor, so an author who was reading the raw JSON keeps their undo stack.
198
+ * The tab is keyed by `project.json` on purpose: opening the file from the Files tree, opening
199
+ * Project Styles and "Edit as code" all reach the same tab, the same history and the same dirty
200
+ * flag. When it is already open this only switches the editor, so an author who was reading the raw
201
+ * JSON keeps their undo stack.
196
202
  *
203
+ * @param {string} [mode] The editor: Variables (`tokens`), Elements (`stylebook`) or Code
204
+ * (`source`). Defaults to the Styles home view the author was last in, Variables on a first
205
+ * visit.
197
206
  * @returns {Tab | null} The tab, or null when no project is open
198
207
  */
199
- export function showSettingsDocument(mode: string = SETTINGS_MODE): Tab | null {
208
+ export function showSettingsDocument(mode: string = shell.stylebook.view): Tab | null {
200
209
  const state = projectState;
201
210
  if (!state) {
202
211
  return null;
203
212
  }
213
+ rememberStylesView(mode);
204
214
  const existing = workspace.tabs.get(PROJECT_CONFIG_PATH);
205
215
  if (existing) {
206
- for (const candidate of SETTINGS_TAB_MODES) {
216
+ for (const candidate of PROJECT_TAB_MODES.toReversed()) {
207
217
  if (!existing.capabilities.modes.includes(candidate)) {
208
218
  existing.capabilities.modes.unshift(candidate);
209
219
  }
@@ -213,20 +223,18 @@ export function showSettingsDocument(mode: string = SETTINGS_MODE): Tab | null {
213
223
  return revealTab(existing);
214
224
  }
215
225
  const tab = openTab({
216
- capabilities: { modes: [...SETTINGS_TAB_MODES] },
226
+ capabilities: { modes: [...PROJECT_TAB_MODES] },
217
227
  document: state.projectConfig ?? {},
218
228
  documentPath: PROJECT_CONFIG_PATH,
219
229
  id: PROJECT_CONFIG_PATH,
220
230
  });
221
231
  /* The mode is written here rather than left to the capability list, because `createTab` seeds
222
- `session.ui.canvasMode` from `resolvedModes.find(m => m !== "preview")` (`tabs/tab.ts`) — i.e.
223
- from `SETTINGS_TAB_MODES[0]`, which is `settings`. A second door over the same document has to
224
- SAY which editor it is, or `styles.open` from a cold workspace opens the settings form. The
225
- capability list stays in its declared order for the same reason it always had one: the tab's
226
- Editor control offers the modes in that order. */
232
+ `session.ui.canvasMode` from the first non-preview mode, and a door over the same document has
233
+ to SAY which editor it is: "Edit as code" from a cold workspace must open the source, not
234
+ Project Styles. */
227
235
  tab.session.ui.canvasMode = mode;
228
236
  tab.session.ui.preview = false;
229
- /* The tab was opened over the configuration OBJECT — the platform parsed it, so there is no text
237
+ /* The tab was opened over the configuration OBJECT: the platform parsed it, so there is no text
230
238
  here to read a layout from, and `doc.layout` is null. A ⌘S on it would then write the
231
239
  formatter's layout for fresh output while a settings commit on the same document wrote the
232
240
  file's (`tabs/project-config.ts`, issue 308). The chokepoint reads the file once anyway; it
@@ -239,7 +247,7 @@ export function showSettingsDocument(mode: string = SETTINGS_MODE): Tab | null {
239
247
  * Make an already-open tab the active one without rebuilding it.
240
248
  *
241
249
  * `openTab` recreates the tab from scratch, which would discard the configuration document's
242
- * history — the one thing this phase exists to give it.
250
+ * history.
243
251
  *
244
252
  * @param {Tab} tab
245
253
  * @returns {Tab}
@@ -252,8 +260,7 @@ function revealTab(tab: Tab): Tab {
252
260
  operations, and the assignment is one of them: the other three are `resetTabCycle` (so
253
261
  Ctrl-Tab cycles from where you now are, not from the pane you left), `promoteMru` (so the
254
262
  MRU order agrees with what is on screen) and `syncTreeSelection` (so the file tree points
255
- at the document you are looking at). Reopening Project Settings into the side pane left
256
- all three describing the pane it had come from. */
263
+ at the document you are looking at). */
257
264
  focusPane(pane.id);
258
265
  break;
259
266
  }
@@ -264,12 +271,12 @@ function revealTab(tab: Tab): Tab {
264
271
  /**
265
272
  * Reach Project Settings, optionally at a named section.
266
273
  *
267
- * Awaits the contributed-section sync before returning, so a caller that then asks whether a
268
- * section exists is asking the complete registry. The sync is COALESCED (`extension-sections.ts`),
269
- * which is the second half of the deep-link fix: `refreshExtensionUi` fires the same function on
270
- * project activation and after every `project.json` write, and the modal started a second,
271
- * interleaved run whose unregister pass could take the caller's section down between the promise
272
- * resolving and the frame being drawn.
274
+ * Opens the dialog on the requested section (or on the one it last showed, which the registry
275
+ * remembers for the session), then awaits the contributed-section sync before returning, so a
276
+ * caller that then asks whether a section exists is asking the complete registry. The sync is
277
+ * COALESCED (`extension-sections.ts`): `refreshExtensionUi` fires the same function on project
278
+ * activation and after every `project.json` write, and a second, interleaved run could otherwise
279
+ * take the caller's section down between the promise resolving and the frame being drawn.
273
280
  *
274
281
  * @param {string} [section]
275
282
  */
@@ -277,13 +284,12 @@ export async function openProjectSettings(section?: string): Promise<void> {
277
284
  if (section !== undefined) {
278
285
  setSettingsSection(section);
279
286
  }
280
- showSettingsDocument();
281
- notifySettingsDocument();
287
+ void openSettingsDialog();
282
288
  try {
283
289
  const { syncExtensionSettingsSections } = await import("./extension-sections");
284
290
  await syncExtensionSettingsSections();
285
291
  } catch (error) {
286
- /* Contributed sections are optional — the built-ins render regardless — but a contribution that
292
+ /* Contributed sections are optional (the built-ins render regardless) but a contribution that
287
293
  will not load is a broken extension, and §17.1 files a section that fails to load as a
288
294
  Problem rather than a toast that erases itself. */
289
295
  notify.warn(`Could not load extension settings sections — ${errorMessage(error)}`, {
@@ -305,22 +311,17 @@ export async function settingsSectionsReady(): Promise<void> {
305
311
  // ─── Commands ─────────────────────────────────────────────────────────────────
306
312
 
307
313
  /**
308
- * Open Project Settings — optionally on a named section, optionally at a named entry.
314
+ * Open Project Settings: optionally on a named section, optionally at a named entry.
309
315
  *
310
- * **This one record replaces four manifest verbs**: `openSettings`, `openSettings {section}`,
311
- * `settings.setSection` and the five `input: type` steps that clicked an entry row by region id.
312
- * The third was refused outright by §13.5 because its press-shim mirrored the section registry's
313
- * LABELS in a hand-kept map; the fourth was raw input standing in for a verb that did not exist
314
- * ("`settings.selectEntry` has no command record"). Sections have KEYS and map-layout sections have
315
- * ENTRY keys; this names both, so the manifest's input-step budget falls by five and its unstable
316
- * budget by five without one `settings.open` step changing.
316
+ * Sections have KEYS and map-layout sections have ENTRY keys; this names both, so a deep link (the
317
+ * entry editor's "Fields", the Languages panel, the pane's "Manage contexts…") and a screenshot
318
+ * step are the same call.
317
319
  *
318
320
  * The validation is deliberately asynchronous. Extension-contributed sections (`connections`,
319
- * `data`, `content`) register a tick after the document opens, so refusing synchronously would
320
- * reject three legitimate section ids; the command opens, awaits the sync, and only then decides
321
- * whether the caller named something real. A wrong key therefore fails the step instead of
322
- * rendering an empty content pane — which is exactly what `css-variables` (the key is `cssVars`)
323
- * has been doing.
321
+ * `data`, `content`) register a tick after the dialog opens, so refusing synchronously would reject
322
+ * three legitimate section ids; the command opens, awaits the sync, and only then decides whether
323
+ * the caller named something real. A wrong key therefore fails the call instead of rendering an
324
+ * empty body.
324
325
  *
325
326
  * @returns {AnyCommand[]}
326
327
  */
@@ -335,7 +336,7 @@ export function settingsCommands(): AnyCommand[] {
335
336
  "type or a data connection.",
336
337
  ),
337
338
  section: stringProperty(
338
- "The settings section key to show. Defaults to Overview on a fresh open.",
339
+ "The settings section key to show. Defaults to the section shown last, or Overview.",
339
340
  ),
340
341
  },
341
342
  required: [],
@@ -344,19 +345,15 @@ export function settingsCommands(): AnyCommand[] {
344
345
  category: "Project",
345
346
  id: "settings.open",
346
347
  level: "project",
347
- // ⌘⇧, — the other half of §15's `⌘, / ⌘⇧,` pair. `app.preferences` shipped with its chord
348
- // And this one did not, so the two halves of "settings" were a keystroke and a palette search.
348
+ // ⌘⇧, — the other half of §15's `⌘, / ⌘⇧,` pair.
349
349
  keybinding: "mod+shift+,",
350
350
  menus: ["commandbar/overflow", "settings/menu", "palette"],
351
351
  group: "7_settings",
352
352
  requires: "an open project",
353
353
  /* `enablement`, not `when`: with no project open this row is DRAWN, greyed, carrying the
354
- sentence above — `studio-ui-guidelines.md` §12.3's rule that a control which cannot act
355
- explains itself rather than vanishing, and the reason the palette greys unavailable
356
- commands instead of hiding them. It used to be `when`, so the rail's Settings menu held one
357
- row on the welcome screen and said nothing about the other two; "why can't I" had no answer
358
- anywhere. The gate itself is unchanged — `enabledWith` still refuses, so `registry.run` and
359
- the assistant's tool still throw `CommandUnavailableError` exactly as before. */
354
+ sentence above (`studio-ui-guidelines.md` §12.3: a control which cannot act explains itself
355
+ rather than vanishing). `enabledWith` still refuses, so `registry.run` and the assistant's
356
+ tool throw `CommandUnavailableError`. */
360
357
  enablement: (ctx) => ctx.project.open,
361
358
  /* No `aiTool`, by `studio-ui-guidelines.md` §12.4's first rule: this opens a surface for a
362
359
  person; the model writes `project.json` through `write_file` and the extension verbs. */
@@ -394,26 +391,40 @@ export function settingsCommands(): AnyCommand[] {
394
391
  title: "Open Project Settings",
395
392
  },
396
393
  /*
397
- * The SECOND door over the same document. `project.json` has three editors — the settings form,
398
- * Project Styles and the raw source — and until now only one of them had a name: Project Styles
399
- * was reached by the pane's Editor control (which can only re-mode a tab that is ALREADY open)
400
- * and by a hand-written `canvasMode` assignment inside Overview. `canvas.setMode` cannot stand
401
- * in for this: it is level `document` and requires an open one, so from a cold workspace there
402
- * is nothing to re-mode.
394
+ * Project Styles by name: an ALIAS of `view.setWorkspace { workspace: "styles" }`, which shows
395
+ * the Styles workspace's last tab or opens its home (`project.json` in its Variables view on a
396
+ * first visit, else in the view it was left in). The id is kept because it is how deep links, the docs and older scripts name the place; the
397
+ * switch itself has one implementation, the workspace's, so the two doors cannot disagree about
398
+ * what "open Project Styles" means. `view` then picks one of the tab's three views, which is
399
+ * how a deep link (Project Settings' Moved footnote, a screenshot) reaches the Variables view
400
+ * from anywhere: `canvas.setMode` cannot stand in for it, being level `document`.
403
401
  *
404
402
  * It is a peer of `settings.open` and declares the same gate, byte for byte
405
- * (`studio-ui-guidelines.md` §12.4: two verbs over one document declare ONE availability
406
- * rule). `styles.*` is the project-level plural of the selection-level `style.*` verbs in
407
- * `panels/style-panel.ts`; the ids are one letter apart and the levels are the reason.
403
+ * (`studio-ui-guidelines.md` §12.4: two verbs over one document declare ONE availability rule).
404
+ * It is not in the gear menu: the gear holds Preferences and Project Settings, and Styles is a
405
+ * workspace the top bar already names.
408
406
  */
409
407
  {
408
+ args: argsSchema(
409
+ {
410
+ view: enumProperty(
411
+ STYLES_VIEWS,
412
+ "Which view of the project's styles to show: elements (element defaults by tag " +
413
+ "name), variables (the CSS custom properties) or code (project.json as text). " +
414
+ "Defaults to the view the Styles workspace was left in.",
415
+ ),
416
+ },
417
+ [],
418
+ ),
410
419
  category: "Project",
411
420
  id: "styles.open",
412
421
  level: "project",
413
- menus: ["settings/menu", "palette"],
414
- /* A distinct ordinal inside the settings family, so the gear reads Settings → Styles.
415
- `studio-ui-guidelines.md` §12.3's lever is `group`, never a per-menu sort; `styles.open` is
416
- not in the ⬢ menu, so nothing else sees this string. */
422
+ /* `never`, not `palette`, for the reason `view.setWorkspace` gives: the palette's way into
423
+ Styles is `workspace.focus.styles` ("Go to Styles", ⌘4), and a second row running the same
424
+ switch would be the same action under a second name. This record is the scripted door:
425
+ the Moved footnote, the Overview's Styles row and the screenshot manifest name it, and
426
+ `view` is what they can say that the chord cannot. */
427
+ menus: ["never"],
417
428
  group: "7_settings_styles",
418
429
  requires: "an open project",
419
430
  /* `studio-ui-guidelines.md` §12.4: two verbs over ONE document declare ONE availability rule,
@@ -421,8 +432,17 @@ export function settingsCommands(): AnyCommand[] {
421
432
  enablement: (ctx) => ctx.project.open,
422
433
  /* No `aiTool`, by `studio-ui-guidelines.md` §12.4's first rule: this opens a surface for a
423
434
  person. */
424
- run: () => {
425
- showSettingsDocument(PROJECT_STYLES_VIEW);
435
+ run: async (_commandCtx, args: CommandArgValues) => {
436
+ const view =
437
+ args["view"] === undefined ? null : enumArg("styles.open", args, "view", STYLES_VIEWS);
438
+ const registry = activeRegistry();
439
+ if (!registry) {
440
+ throw new Error('command "styles.open" needs the window\'s command registry');
441
+ }
442
+ await registry.run("view.setWorkspace", { workspace: "styles" });
443
+ if (view !== null) {
444
+ showSettingsDocument(STYLES_VIEW_MODES[view]);
445
+ }
426
446
  },
427
447
  // Named, never spelled from the wire value: `stylebook` is shared with `dist/iframe-entry.js`
428
448
  // And may never be renamed, so nothing a reader sees is derived from it (`style/project-styles`).
@@ -432,7 +452,7 @@ export function settingsCommands(): AnyCommand[] {
432
452
  }
433
453
 
434
454
  /**
435
- * Register the settings verb.
455
+ * Register the settings verbs.
436
456
  *
437
457
  * @param {CommandRegistry} registry
438
458
  */