@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,46 +1,109 @@
1
1
  {
2
2
  "$schema": "https://jxsuite.com/schema/v1",
3
3
  "$id": "StudioSettingsPane",
4
- "$description": "The Project Settings editor's two columns, drawn inside the pane: the section list and the section body. It draws no section — `panels/settings-pane.ts` keeps the registry, decides which section is current, and renders whichever one that is into the one empty `[part=\"body\"]` island this document leaves for it (studio-ui-guidelines.md §9.4), because a section renderer may be a lit template or a mounted document and neither can share a container with this one. The list is a real vertical `tablist` rather than the column of `<button aria-current=\"page\">` it replaces: a settings section is not a page and choosing one moves no location, so what the reader was owed was one tab stop, arrow keys down the column, and a body named by the entry that selected it.",
4
+ "$description": "The Project Settings dialog's two columns: the grouped section list and the section body (§17.1). It draws no section: `panels/settings-pane.ts` keeps the registry, decides which section is current, and renders whichever one that is into the one empty `[part=\"section-host\"]` island this document leaves for it (studio-ui-guidelines.md §9.4), because a section renderer may be a lit template or a mounted document and neither can share a container with this one. The list is three vertical `tablist`s, one per group (General, Integrations, Advanced), each named by its group heading: a tablist may own only tabs, so a heading between two runs of rows has to END one list rather than sit inside it. Each group is one tab stop and the arrow keys move within it. Under the groups, a Moved footnote names what left Project Settings for a workspace, each with a button that goes there.",
5
5
  "tagName": "div",
6
6
  "attributes": {
7
7
  "part": "doc"
8
8
  },
9
9
  "style": {
10
- "$description": "`.settings-doc`, `.settings-doc-nav`, `.settings-doc-content` (styles/panels.css) and `.settings-nav-item`, `.settings-nav-item:hover`, `.settings-nav-item.active`, `.settings-empty-state` (styles/overlays.css) — all seven go dead with this conversion and none is shared with a surface that is still lit. Four of them are DELETED rather than moved: the nav's own right rule and each row's hover fill, selected fill and weight are `jx-tabs[aria-orientation=\"vertical\"]` and `jx-tab` respectively, and the two Spectrum greys they reached for (`--spectrum-gray-200`, `--spectrum-gray-300`) resolved only inside an `<sp-theme>` this pane never had — so both rows had been taking their hard-coded fallback since the editor moved out of the modal.",
10
+ "$description": "No part below is named `body`, `field`, `label`, `error`, `text` or `actions`: this document is mounted inside a `jx-dialog`, the kit is light DOM, and the dialog draws its own `[part=\"body\"]` around this one, so a rule keyed on that name here would also be a rule the dialog's own styles reach.",
11
11
  "display": "flex",
12
- "height": "100%",
12
+ "height": "min(68vh, 640px)",
13
13
  "minHeight": "0",
14
14
  "background": "var(--bg)",
15
15
  "color": "var(--fg)",
16
16
  "fontFamily": "var(--jx-font-sans)",
17
17
  "textAlign": "initial",
18
18
  "& [part=\"nav\"]": {
19
- "width": "180px",
20
- "minWidth": "180px",
19
+ "display": "flex",
20
+ "flexDirection": "column",
21
+ "gap": "var(--jx-space-4)",
22
+ "width": "200px",
23
+ "minWidth": "200px",
21
24
  "flexShrink": "0",
22
- "padding": "var(--jx-space-2) 0",
25
+ "padding": "var(--jx-space-2) var(--jx-space-3) var(--jx-space-2) 0",
26
+ "borderRight": "1px solid var(--border)",
23
27
  "overflowY": "auto",
24
28
  "fontSize": "13px"
25
29
  },
30
+ "& [part=\"group\"]": {
31
+ "display": "flex",
32
+ "flexDirection": "column",
33
+ "gap": "var(--jx-space-1)"
34
+ },
35
+ "& [part=\"group-title\"]": {
36
+ "display": "flex",
37
+ "alignItems": "baseline",
38
+ "gap": "var(--jx-space-2)",
39
+ "margin": "0",
40
+ "padding": "0 var(--jx-space-3)",
41
+ "color": "var(--fg-dim)",
42
+ "fontSize": "var(--jx-text-sm)",
43
+ "fontWeight": "600",
44
+ "letterSpacing": "0.04em",
45
+ "textTransform": "uppercase"
46
+ },
47
+ "& [part=\"group-note\"]": {
48
+ "$description": "The Advanced group's \"For developers\": a qualifier on the heading, not a second heading, so it reads at the heading's size without its weight.",
49
+ "fontWeight": "400",
50
+ "letterSpacing": "0",
51
+ "textTransform": "none"
52
+ },
53
+ "& [part=\"group-note\"]:empty": {
54
+ "display": "none"
55
+ },
56
+ "& [part=\"group-tabs\"]": {
57
+ "$description": "The rule a vertical strip draws on its trailing edge is the column's own here: the nav draws one border for all three groups, so each strip drawing its own would stack three short rules beside it.",
58
+ "borderInlineEnd": "0"
59
+ },
26
60
  "& [part=\"nav-item\"]": {
27
- "$description": "Full-bleed rows, which a tab is not by default: `jx-tab` centres its label and caps itself at 220px because a horizontal strip is a row of chips. In a 180px column the row IS the target, so the label goes to the leading edge and the cap comes off.",
61
+ "$description": "Full-bleed rows, which a tab is not by default: `jx-tab` centres its label and caps itself at 220px because a horizontal strip is a row of chips. In the nav column the row IS the target, so the label goes to the leading edge and the cap comes off.",
28
62
  "maxWidth": "none",
29
63
  "justifyContent": "flex-start",
30
- "padding": "var(--jx-space-2) var(--jx-space-4)"
64
+ "padding": "var(--jx-space-2) var(--jx-space-3)"
65
+ },
66
+ "& [part=\"moved\"]": {
67
+ "display": "flex",
68
+ "flexDirection": "column",
69
+ "gap": "var(--jx-space-1)",
70
+ "marginTop": "auto",
71
+ "padding": "var(--jx-space-3)",
72
+ "borderTop": "1px solid var(--border)",
73
+ "color": "var(--fg-dim)",
74
+ "fontSize": "var(--jx-text-md)"
75
+ },
76
+ "& [part=\"moved-title\"]": {
77
+ "margin": "0",
78
+ "fontWeight": "600",
79
+ "color": "var(--fg)"
80
+ },
81
+ "& [part=\"moved-row\"]": {
82
+ "display": "flex",
83
+ "alignItems": "center",
84
+ "flexWrap": "wrap",
85
+ "gap": "var(--jx-space-1)"
31
86
  },
32
87
  "& [part=\"content\"]": {
33
88
  "flex": "1",
34
89
  "minWidth": "0",
35
90
  "overflowY": "auto",
36
- "padding": "24px"
91
+ "padding": "var(--jx-space-2) var(--jx-space-5)"
37
92
  },
38
- "& [part=\"body\"]": {
93
+ "& [part=\"group-intro\"]": {
94
+ "margin": "0 0 var(--jx-space-3)",
95
+ "color": "var(--fg-dim)",
96
+ "fontSize": "13px"
97
+ },
98
+ "& [part=\"group-intro\"]:empty": {
99
+ "display": "none"
100
+ },
101
+ "& [part=\"section-host\"]": {
39
102
  "display": "block",
40
103
  "minWidth": "0"
41
104
  },
42
105
  "& [part=\"empty\"]": {
43
- "$description": "What the body says when the active section is registered by nobody — every section unregistering at once, which is a project closing while the editor is open. A blank column beside a list reads as a broken pane, so it says which it is.",
106
+ "$description": "What the body says when the active section is registered by nobody: every section unregistering at once, which is a project closing while the dialog is open. A blank column beside a list reads as a broken dialog, so it says which it is.",
44
107
  "display": "flex",
45
108
  "alignItems": "center",
46
109
  "justifyContent": "center",
@@ -48,57 +111,189 @@
48
111
  "margin": "0",
49
112
  "color": "var(--fg-dim)",
50
113
  "fontSize": "13px"
114
+ },
115
+ "& [part=\"failure\"]": {
116
+ "$description": "A section whose renderer threw or rejected. It is said where the section would have been, in the reader's line of sight, because a section that silently draws nothing is indistinguishable from one with nothing to say.",
117
+ "margin": "0",
118
+ "padding": "var(--jx-space-3)",
119
+ "border": "1px solid var(--danger)",
120
+ "borderRadius": "var(--radius)",
121
+ "color": "var(--fg)",
122
+ "fontSize": "13px"
51
123
  }
52
124
  },
53
125
  "children": [
54
126
  {
55
- "tagName": "jx-tabs",
127
+ "tagName": "div",
56
128
  "attributes": {
57
129
  "part": "nav",
58
- "selected": "${state.active}",
59
- "orientation": "vertical"
60
- },
61
- "$props": {
62
- "label": {
63
- "$ref": "#/state/navLabel"
64
- }
65
- },
66
- "onchange": {
67
- "$prototype": "Function",
68
- "body": [
69
- {
70
- "operator": "call",
71
- "target": {
72
- "$ref": "#/state/selectSection"
73
- },
74
- "value": [
75
- {
76
- "$ref": "event#/detail"
77
- }
78
- ]
79
- }
80
- ]
130
+ "role": "none"
81
131
  },
82
132
  "children": [
83
133
  {
84
134
  "$prototype": "Array",
85
135
  "items": {
86
- "$ref": "#/state/sections"
136
+ "$ref": "#/state/groups"
87
137
  },
88
138
  "key": {
89
- "$ref": "$map/item/key"
139
+ "$ref": "$map/item/id"
90
140
  },
91
141
  "map": {
92
- "tagName": "jx-tab",
142
+ "tagName": "div",
93
143
  "attributes": {
94
- "part": "nav-item",
95
- "id": "${$map.item.tabId}",
96
- "data-section": "${$map.item.key}",
97
- "value": "${$map.item.key}",
98
- "label": "${$map.item.label}",
99
- "panel": "settings-pane-panel"
100
- }
144
+ "part": "group",
145
+ "role": "none",
146
+ "data-group": "${$map.item.id}"
147
+ },
148
+ "children": [
149
+ {
150
+ "tagName": "h3",
151
+ "attributes": {
152
+ "part": "group-title",
153
+ "id": "${$map.item.titleId}"
154
+ },
155
+ "children": [
156
+ {
157
+ "tagName": "span",
158
+ "textContent": "${$map.item.label}"
159
+ },
160
+ {
161
+ "tagName": "span",
162
+ "attributes": {
163
+ "part": "group-note"
164
+ },
165
+ "textContent": "${$map.item.note}"
166
+ }
167
+ ]
168
+ },
169
+ {
170
+ "tagName": "jx-tabs",
171
+ "attributes": {
172
+ "part": "group-tabs",
173
+ "selected": "${state.active}",
174
+ "orientation": "vertical"
175
+ },
176
+ "$props": {
177
+ "label": {
178
+ "$ref": "$map/item/tabsLabel"
179
+ }
180
+ },
181
+ "onchange": {
182
+ "$prototype": "Function",
183
+ "body": [
184
+ {
185
+ "operator": "call",
186
+ "target": {
187
+ "$ref": "#/state/selectSection"
188
+ },
189
+ "value": [
190
+ {
191
+ "$ref": "event#/detail"
192
+ }
193
+ ]
194
+ }
195
+ ]
196
+ },
197
+ "children": [
198
+ {
199
+ "$prototype": "Array",
200
+ "items": {
201
+ "$ref": "$map/item/sections"
202
+ },
203
+ "key": {
204
+ "$ref": "$map/item/key"
205
+ },
206
+ "map": {
207
+ "tagName": "jx-tab",
208
+ "attributes": {
209
+ "part": "nav-item",
210
+ "id": "${$map.item.tabId}",
211
+ "data-section": "${$map.item.key}",
212
+ "value": "${$map.item.key}",
213
+ "label": "${$map.item.label}",
214
+ "panel": "settings-pane-panel"
215
+ }
216
+ }
217
+ }
218
+ ]
219
+ }
220
+ ]
101
221
  }
222
+ },
223
+ {
224
+ "tagName": "div",
225
+ "attributes": {
226
+ "part": "moved",
227
+ "role": "group",
228
+ "aria-labelledby": "settings-pane-moved"
229
+ },
230
+ "children": [
231
+ {
232
+ "tagName": "p",
233
+ "attributes": {
234
+ "part": "moved-title",
235
+ "id": "settings-pane-moved"
236
+ },
237
+ "textContent": "Moved"
238
+ },
239
+ {
240
+ "$prototype": "Array",
241
+ "items": {
242
+ "$ref": "#/state/moved"
243
+ },
244
+ "key": {
245
+ "$ref": "$map/item/workspace"
246
+ },
247
+ "map": {
248
+ "tagName": "div",
249
+ "attributes": {
250
+ "part": "moved-row",
251
+ "data-moved": "${$map.item.workspace}"
252
+ },
253
+ "children": [
254
+ {
255
+ "tagName": "span",
256
+ "textContent": "${$map.item.what} →"
257
+ },
258
+ {
259
+ "tagName": "jx-button",
260
+ "attributes": {
261
+ "part": "moved-link"
262
+ },
263
+ "$props": {
264
+ "size": "sm",
265
+ "quiet": true,
266
+ "label": {
267
+ "$ref": "$map/item/linkLabel"
268
+ }
269
+ },
270
+ "onclick": {
271
+ "$prototype": "Function",
272
+ "body": [
273
+ {
274
+ "operator": "call",
275
+ "target": {
276
+ "$ref": "#/state/openMoved"
277
+ },
278
+ "value": [
279
+ {
280
+ "$ref": "$map/item/workspace"
281
+ }
282
+ ]
283
+ }
284
+ ]
285
+ },
286
+ "children": [
287
+ {
288
+ "tagName": "span",
289
+ "textContent": "${$map.item.place}"
290
+ }
291
+ ]
292
+ }
293
+ ]
294
+ }
295
+ }
296
+ ]
102
297
  }
103
298
  ]
104
299
  },
@@ -115,11 +310,19 @@
115
310
  }
116
311
  },
117
312
  "children": [
313
+ {
314
+ "$description": "The current group's intro (\"Changes here affect every page. Most sites never need them.\"), above whichever of its sections is showing. General has none, and an empty sentence draws nothing.",
315
+ "tagName": "p",
316
+ "attributes": {
317
+ "part": "group-intro"
318
+ },
319
+ "textContent": "${state.intro}"
320
+ },
118
321
  {
119
322
  "$description": "The island, and it stays empty: a settings section renders itself, into a host this document never writes into and never reads back (studio-ui-guidelines.md §9.4).",
120
323
  "tagName": "div",
121
324
  "attributes": {
122
- "part": "body"
325
+ "part": "section-host"
123
326
  }
124
327
  },
125
328
  {
@@ -140,6 +343,26 @@
140
343
  "textContent": "${state.empty}"
141
344
  }
142
345
  }
346
+ },
347
+ {
348
+ "tagName": "div",
349
+ "attributes": {
350
+ "part": "failure-slot",
351
+ "role": "none"
352
+ },
353
+ "$switch": {
354
+ "$ref": "#/state/failureState"
355
+ },
356
+ "cases": {
357
+ "failed": {
358
+ "tagName": "p",
359
+ "attributes": {
360
+ "part": "failure",
361
+ "role": "alert"
362
+ },
363
+ "textContent": "${state.failure}"
364
+ }
365
+ }
143
366
  }
144
367
  ]
145
368
  }
@@ -1,14 +1,16 @@
1
1
  /// <reference lib="dom" />
2
2
  /**
3
- * The Project Settings editor's chrome as a mounted document — the mount seam, and nothing else.
3
+ * The Project Settings dialog's two columns as a mounted document: the mount seam, and nothing
4
+ * else.
4
5
  *
5
- * `panels/settings-pane.ts` is the flow: which sections are registered, which of them is current,
6
- * what a nav click does, and which renderer draws the body. This is the surface it draws into.
6
+ * `panels/settings-pane.ts` is the flow: which sections are registered, which group lists each,
7
+ * which one is current, what a nav click does, and which renderer draws the body. This is the
8
+ * surface it draws into, and `surfaces/settings-dialog.ts` is the dialog it sits in.
7
9
  *
8
10
  * **One island, and the sections are why.** A settings section is handed a container and renders
9
- * into it — some of them still with lit, some by mounting a document of their own — so the body
10
- * cannot be part of this document's subtree. It draws an empty `[part="body"]`, announces it
11
- * through `onNodeCreated` as it is created, and the flow renders into it: the island seam of
11
+ * into it (some of them still with lit, some by mounting a document of their own) so the body
12
+ * cannot be part of this document's subtree. It draws an empty `[part="section-host"]`, announces
13
+ * it through `onNodeCreated` as it is created, and the flow renders into it: the island seam of
12
14
  * studio-ui-guidelines.md §9.4. Nothing here queries for it by a selector this package also
13
15
  * renders.
14
16
  *
@@ -24,37 +26,67 @@ import type { SurfaceHandle, SurfaceTab } from "../ui/surface";
24
26
 
25
27
  registerSurface("settings-pane", settingsPaneDoc);
26
28
 
27
- /** What the editor says right now. */
29
+ /** One nav group, as the document draws it. */
30
+ export interface SettingsPaneGroup {
31
+ id: string;
32
+ label: string;
33
+ /** The qualifier beside the heading ("For developers"), or the empty string for none. */
34
+ note: string;
35
+ /** The heading's element id. */
36
+ titleId: string;
37
+ /** The group's tablist name: the heading, with its qualifier when it has one. */
38
+ tabsLabel: string;
39
+ sections: SurfaceTab[];
40
+ }
41
+
42
+ /** One row of the Moved footnote: something that left Project Settings, and where it went. */
43
+ export interface SettingsPaneMovedRow {
44
+ /** What moved, as the reader knew it in Settings ("Colors and fonts"). */
45
+ what: string;
46
+ /** Where it is now: the workspace's title, which is the button's text. */
47
+ place: string;
48
+ /** The workspace id the button switches to. */
49
+ workspace: string;
50
+ /** The button's accessible name, which says the whole sentence the row draws in two parts. */
51
+ linkLabel: string;
52
+ }
53
+
54
+ /** What the dialog's columns say right now. */
28
55
  export interface SettingsPaneValues {
29
- /** The list's accessible name. A tablist takes no name from its tabs. */
30
- navLabel: string;
31
56
  /** The current section's key. */
32
57
  active: string;
33
58
  /** The current section's row id, so the body is named by the row that chose it. */
34
59
  activeTabId: string;
35
- sections: SurfaceTab[];
60
+ groups: SettingsPaneGroup[];
61
+ moved: SettingsPaneMovedRow[];
36
62
  /**
37
63
  * Whether a renderer will draw into the island.
38
64
  *
39
- * The flow's own question — `settingsSection(active)` — rather than "are there any sections": the
65
+ * The flow's own question (`settingsSection(active)`) rather than "are there any sections": the
40
66
  * body is empty exactly when the ACTIVE key is registered by nobody, and a second spelling of
41
67
  * that would be a second thing to get wrong.
42
68
  */
43
69
  hasSection: boolean;
44
70
  /** What the body says instead, when it will not be drawn into. */
45
71
  empty: string;
72
+ /** The current section's group intro, drawn above the section, or the empty string for none. */
73
+ intro: string;
74
+ /** The sentence a failed section renderer left, or the empty string while nothing failed. */
75
+ failure: string;
46
76
  }
47
77
 
48
78
  export interface SettingsPaneActions {
49
79
  /** A row was activated. */
50
80
  selectSection: (key: string) => void;
81
+ /** A Moved footnote's button was activated, naming the workspace it goes to. */
82
+ openMoved: (workspace: string) => void;
51
83
  }
52
84
 
53
85
  export interface SettingsPaneHandle {
54
86
  /** Bring the standing document up to date. An assignment; the mount is never rebuilt. */
55
87
  update: (values: SettingsPaneValues) => void;
56
88
  /**
57
- * The empty `[part="body"]` island, once it exists — the one element a section renderer needs.
89
+ * The empty `[part="section-host"]` island, once it exists: the one element a section needs.
58
90
  *
59
91
  * It is HELD rather than re-found, exactly as `surfaces/tab-strip.ts` holds its `jx-tabs`: it
60
92
  * arrives through `onNodeCreated` as the node is created, so nothing in this package queries for
@@ -63,11 +95,23 @@ export interface SettingsPaneHandle {
63
95
  body: () => HTMLElement | null;
64
96
  /** Settles once the document is mounted, or the surface was disposed first. */
65
97
  ready: Promise<void>;
98
+ /**
99
+ * Put the keyboard on the current section's row.
100
+ *
101
+ * `showModal()` focuses the dialog's first focusable descendant, which is always the first
102
+ * group's tab stop, so a dialog opened on Advanced › Raw JSON would put the ring on Overview
103
+ * while the selection was three rows down a different list. Read off `aria-selected`, which the
104
+ * strip writes, because that attribute is the one record of which row is current.
105
+ */
106
+ focusActive: () => void;
66
107
  /** Take the document down. Idempotent. */
67
108
  dispose: () => void;
68
109
  }
69
110
 
70
- interface SettingsPaneScope extends SettingsPaneValues, SettingsPaneActions {}
111
+ interface SettingsPaneScope extends SettingsPaneValues, SettingsPaneActions {
112
+ /** `failed` while {@link SettingsPaneValues.failure} holds a sentence, `ok` otherwise. */
113
+ failureState: string;
114
+ }
71
115
 
72
116
  /** The `part` a node was declared with, or the empty string. */
73
117
  function partOf(def: JxElement | string): string {
@@ -75,16 +119,20 @@ function partOf(def: JxElement | string): string {
75
119
  return isString(part) ? part : "";
76
120
  }
77
121
 
122
+ /** The case name the failure switch discriminates on, derived so the flow states only the fact. */
123
+ function failureStateOf(failure: string): string {
124
+ return failure === "" ? "ok" : "failed";
125
+ }
126
+
78
127
  /**
79
- * Mount the editor's chrome into `container`, which is the pane's stage.
128
+ * Mount the columns into `container`, which is the settings dialog's island.
80
129
  *
81
- * The container is cleared first, lit's render marker included: the stage is shared with every
82
- * other canvas mode, and a marker left behind by whatever drew there last would make the next lit
83
- * render throw on a part whose nodes have gone.
130
+ * The container is cleared first, lit's render marker included, so a host handed back after some
131
+ * other renderer used it cannot make the next lit render throw on a part whose nodes have gone.
84
132
  *
85
- * @param {HTMLElement} container The pane's `#canvas-wrap`
133
+ * @param {HTMLElement} container The dialog's pane slot
86
134
  * @param {SettingsPaneValues} values What to say on the first paint
87
- * @param {SettingsPaneActions} actions What a nav row does. Read once, when the scope is made.
135
+ * @param {SettingsPaneActions} actions What a row and a Moved button do. Read once.
88
136
  * @returns {SettingsPaneHandle}
89
137
  */
90
138
  export function mountSettingsPaneSurface(
@@ -92,7 +140,11 @@ export function mountSettingsPaneSurface(
92
140
  values: SettingsPaneValues,
93
141
  actions: SettingsPaneActions,
94
142
  ): SettingsPaneHandle {
95
- const scope: SettingsPaneScope = reactive<SettingsPaneScope>({ ...values, ...actions });
143
+ const scope: SettingsPaneScope = reactive<SettingsPaneScope>({
144
+ ...values,
145
+ ...actions,
146
+ failureState: failureStateOf(values.failure),
147
+ });
96
148
 
97
149
  container.textContent = "";
98
150
  // @ts-expect-error -- _$litPart$ is lit's private render-part marker, not in the DOM types
@@ -106,7 +158,7 @@ export function mountSettingsPaneSurface(
106
158
  /* `disposed` and not just the part: a mount that is still in flight goes on building its
107
159
  nodes after the handle has let go, and holding one of them would answer `body()` with an
108
160
  element belonging to a document nobody is standing behind any more. */
109
- if (!disposed && element instanceof HTMLElement && partOf(def) === "body") {
161
+ if (!disposed && element instanceof HTMLElement && partOf(def) === "section-host") {
110
162
  body = element;
111
163
  }
112
164
  },
@@ -126,16 +178,25 @@ export function mountSettingsPaneSurface(
126
178
  mounted = null;
127
179
  body = null;
128
180
  },
181
+ focusActive() {
182
+ const root = mounted?.root;
183
+ if (root instanceof HTMLElement) {
184
+ root.querySelector<HTMLElement>('[part="nav-item"][aria-selected="true"]')?.focus();
185
+ }
186
+ },
129
187
  ready,
130
188
  update(next) {
131
- /* Field by field, so an unchanged one is inert — and `active` LAST, because it is what the
189
+ /* Field by field, so an unchanged one is inert, and `active` LAST, because it is what each
132
190
  strip's selection is compared against: writing it before the rows it names have arrived
133
191
  would make `jx-tabs` sync a selection onto a column that does not hold that tab yet. */
134
- scope.navLabel = next.navLabel;
135
- scope.sections = next.sections;
192
+ scope.groups = next.groups;
193
+ scope.moved = next.moved;
136
194
  scope.activeTabId = next.activeTabId;
137
195
  scope.empty = next.empty;
196
+ scope.intro = next.intro;
138
197
  scope.hasSection = next.hasSection;
198
+ scope.failure = next.failure;
199
+ scope.failureState = failureStateOf(next.failure);
139
200
  scope.active = next.active;
140
201
  },
141
202
  };
@@ -32,7 +32,8 @@
32
32
  "tagName": "div",
33
33
  "attributes": {
34
34
  "id": "left-panel",
35
- "data-jx-region": "navigator"
35
+ "data-jx-region": "navigator",
36
+ "data-jx-scroller": ""
36
37
  }
37
38
  },
38
39
  {