@jxsuite/studio 6.1.2 → 8.0.1

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
@@ -7,7 +7,7 @@
7
7
  "part": "chrome"
8
8
  },
9
9
  "style": {
10
- "$description": "The `.pc-*` rules of `styles/canvas.css`, keyed on `part` and carried here, plus `.jx-collab-banner` from `styles/shell.css` — the banner rides in this band and the rule rides with it. Three token repairs travel with them, the shape `surfaces/git-panel.json` describes: `--spectrum-font-size-75` and `--spectrum-font-size-50` resolved only inside `<sp-theme>` and a document mounts outside it, so every rule reading one would silently have taken its px fallback; they are `--jx-text-md` (12px) and `--jx-text-sm` (11px) here, at the same values. Four rules are DELETED rather than moved because the kit already draws them: `.pc-derive-trigger`'s hand-built 22×20 box and its hover are `jx-action-button` quiet, `.pc-preview-toggle[selected]`'s four Spectrum custom-property overrides are the `emphasized` prop, and `.pc-ctx-manage:hover`'s underline is the only half of that rule worth keeping. The one rule ADDED is `pointer-events: auto` on the band, the pod and the popovers: `.pane-chrome` is `pointer-events: none` and gave it to its direct children through `.pane-chrome > *`, which a document root with `display: contents` is not — so the three surfaces that take the pointer say so themselves, which is also the honest place for it.",
10
+ "$description": "The `.pc-*` rules of `styles/canvas.css`, keyed on `part` and carried here, plus `.jx-collab-banner` from `styles/shell.css` — the banner rides in this band and the rule rides with it. Three token repairs travel with them, all of one shape: `--spectrum-font-size-75` and `--spectrum-font-size-50` resolved only inside `<sp-theme>` and a document mounts outside it, so every rule reading one would silently have taken its px fallback; they are `--jx-text-md` (12px) and `--jx-text-sm` (11px) here, at the same values. Four rules are DELETED rather than moved because the kit already draws them: `.pc-derive-trigger`'s hand-built 22×20 box and its hover are `jx-action-button` quiet, `.pc-preview-toggle[selected]`'s four Spectrum custom-property overrides are the `emphasized` prop, and `.pc-ctx-manage:hover`'s underline is the only half of that rule worth keeping. The one rule ADDED is `pointer-events: auto` on the band, the pod and the popovers: `.pane-chrome` is `pointer-events: none` and gave it to its direct children through `.pane-chrome > *`, which a document root with `display: contents` is not — so the three surfaces that take the pointer say so themselves, which is also the honest place for it.",
11
11
  "display": "contents",
12
12
  "& [part=\"band\"]": {
13
13
  "$description": "The pane's top band: the bar plus the standing statements that must be readable before the first keystroke. One element so the adapter can MEASURE what the stage has to clear — a banner's height is its wrapped text, which only layout knows.",
@@ -32,6 +32,10 @@
32
32
  "alignItems": "center",
33
33
  "minWidth": "0"
34
34
  },
35
+ "& [part=\"back\"]": {
36
+ "flexShrink": "0",
37
+ "marginInlineEnd": "var(--jx-space-2)"
38
+ },
35
39
  "& [part=\"axis\"]": {
36
40
  "display": "flex",
37
41
  "alignItems": "center",
@@ -214,6 +218,54 @@
214
218
  "part": "spacer"
215
219
  },
216
220
  "children": [
221
+ {
222
+ "$description": "Back to the workspace home, in a workspace that draws no tab strip (Media, Styles, Publish): the way out of a view opened beside the home — a media file, a comparison, `project.json` as Code — with the destination named, because there is no chip to click and no close button to press. It leads the bar so it sits where the strip's chips would have been. Escape runs the same command (`pane.backToHome`) wherever no text field or code editor owns the key.",
223
+ "tagName": "div",
224
+ "attributes": {
225
+ "part": "back-slot",
226
+ "role": "none"
227
+ },
228
+ "style": {
229
+ "display": "contents"
230
+ },
231
+ "$switch": {
232
+ "$ref": "#/state/backState"
233
+ },
234
+ "cases": {
235
+ "shown": {
236
+ "tagName": "jx-action-button",
237
+ "attributes": {
238
+ "part": "back"
239
+ },
240
+ "$props": {
241
+ "size": "sm",
242
+ "quiet": true,
243
+ "icon": "arrow-left",
244
+ "hint": {
245
+ "$ref": "#/state/backHint"
246
+ }
247
+ },
248
+ "onclick": {
249
+ "$prototype": "Function",
250
+ "body": [
251
+ {
252
+ "operator": "call",
253
+ "target": {
254
+ "$ref": "#/state/goBack"
255
+ },
256
+ "value": []
257
+ }
258
+ ]
259
+ },
260
+ "children": [
261
+ {
262
+ "tagName": "span",
263
+ "textContent": "${state.backLabel}"
264
+ }
265
+ ]
266
+ }
267
+ }
268
+ },
217
269
  {
218
270
  "tagName": "div",
219
271
  "attributes": {
@@ -236,8 +288,8 @@
236
288
  "size": "sm",
237
289
  "quiet": true,
238
290
  "icon": "arrows-clockwise",
239
- "label": "Show something beside this pane",
240
- "hint": "Show something beside this pane",
291
+ "label": "Show code, diff or layout beside",
292
+ "hint": "Show this document's code, diff, layout or another breakpoint beside it",
241
293
  "haspopup": "menu"
242
294
  },
243
295
  "onclick": {
@@ -525,43 +577,104 @@
525
577
  {
526
578
  "tagName": "div",
527
579
  "attributes": {
528
- "part": "axis",
529
- "data-axis": "context"
580
+ "part": "context-slot",
581
+ "role": "none"
530
582
  },
531
- "children": [
532
- {
533
- "tagName": "span",
534
- "attributes": {
535
- "part": "axis-label"
536
- },
537
- "textContent": "Context"
538
- },
539
- {
583
+ "style": {
584
+ "display": "contents"
585
+ },
586
+ "$switch": {
587
+ "$ref": "#/state/contextState"
588
+ },
589
+ "cases": {
590
+ "shown": {
540
591
  "tagName": "div",
541
592
  "attributes": {
542
- "part": "resolving-slot",
543
- "role": "none"
544
- },
545
- "style": {
546
- "display": "contents"
547
- },
548
- "$switch": {
549
- "$ref": "#/state/resolvingState"
593
+ "part": "axis",
594
+ "data-axis": "context"
550
595
  },
551
- "cases": {
552
- "shown": {
596
+ "children": [
597
+ {
598
+ "tagName": "span",
599
+ "attributes": {
600
+ "part": "axis-label"
601
+ },
602
+ "textContent": "Context"
603
+ },
604
+ {
605
+ "tagName": "div",
606
+ "attributes": {
607
+ "part": "resolving-slot",
608
+ "role": "none"
609
+ },
610
+ "style": {
611
+ "display": "contents"
612
+ },
613
+ "$switch": {
614
+ "$ref": "#/state/resolvingState"
615
+ },
616
+ "cases": {
617
+ "shown": {
618
+ "tagName": "jx-action-button",
619
+ "attributes": {
620
+ "part": "resolving-trigger"
621
+ },
622
+ "$props": {
623
+ "size": "sm",
624
+ "quiet": true,
625
+ "haspopup": "dialog",
626
+ "expanded": {
627
+ "$ref": "#/state/resolvingOpen"
628
+ },
629
+ "hint": "The values this document is being rendered with"
630
+ },
631
+ "onclick": {
632
+ "$prototype": "Function",
633
+ "body": [
634
+ {
635
+ "operator": "call",
636
+ "target": {
637
+ "$ref": "#/state/openResolving"
638
+ },
639
+ "value": [
640
+ {
641
+ "$ref": "event#/currentTarget"
642
+ }
643
+ ]
644
+ }
645
+ ]
646
+ },
647
+ "children": [
648
+ {
649
+ "tagName": "span",
650
+ "textContent": "${state.resolvingLabel}"
651
+ },
652
+ {
653
+ "tagName": "jx-icon",
654
+ "attributes": {
655
+ "part": "resolving-trigger-caret"
656
+ },
657
+ "$props": {
658
+ "name": "caret-down"
659
+ }
660
+ }
661
+ ]
662
+ }
663
+ }
664
+ },
665
+ {
553
666
  "tagName": "jx-action-button",
554
667
  "attributes": {
555
- "part": "resolving-trigger"
668
+ "part": "context-trigger"
556
669
  },
557
670
  "$props": {
558
671
  "size": "sm",
559
672
  "quiet": true,
560
673
  "haspopup": "dialog",
561
674
  "expanded": {
562
- "$ref": "#/state/resolvingOpen"
675
+ "$ref": "#/state/contextOpen"
563
676
  },
564
- "hint": "The values this document is being rendered with"
677
+ "hint": "What this document is being rendered with"
565
678
  },
566
679
  "onclick": {
567
680
  "$prototype": "Function",
@@ -569,7 +682,7 @@
569
682
  {
570
683
  "operator": "call",
571
684
  "target": {
572
- "$ref": "#/state/openResolving"
685
+ "$ref": "#/state/openContext"
573
686
  },
574
687
  "value": [
575
688
  {
@@ -582,12 +695,12 @@
582
695
  "children": [
583
696
  {
584
697
  "tagName": "span",
585
- "textContent": "${state.resolvingLabel}"
698
+ "textContent": "${state.contextSummary}"
586
699
  },
587
700
  {
588
701
  "tagName": "jx-icon",
589
702
  "attributes": {
590
- "part": "resolving-trigger-caret"
703
+ "part": "context-trigger-caret"
591
704
  },
592
705
  "$props": {
593
706
  "name": "caret-down"
@@ -595,55 +708,9 @@
595
708
  }
596
709
  ]
597
710
  }
598
- }
599
- },
600
- {
601
- "tagName": "jx-action-button",
602
- "attributes": {
603
- "part": "context-trigger"
604
- },
605
- "$props": {
606
- "size": "sm",
607
- "quiet": true,
608
- "haspopup": "dialog",
609
- "expanded": {
610
- "$ref": "#/state/contextOpen"
611
- },
612
- "hint": "What this document is being rendered with"
613
- },
614
- "onclick": {
615
- "$prototype": "Function",
616
- "body": [
617
- {
618
- "operator": "call",
619
- "target": {
620
- "$ref": "#/state/openContext"
621
- },
622
- "value": [
623
- {
624
- "$ref": "event#/currentTarget"
625
- }
626
- ]
627
- }
628
- ]
629
- },
630
- "children": [
631
- {
632
- "tagName": "span",
633
- "textContent": "${state.contextSummary}"
634
- },
635
- {
636
- "tagName": "jx-icon",
637
- "attributes": {
638
- "part": "context-trigger-caret"
639
- },
640
- "$props": {
641
- "name": "caret-down"
642
- }
643
- }
644
711
  ]
645
712
  }
646
- ]
713
+ }
647
714
  },
648
715
  {
649
716
  "tagName": "div",
@@ -97,6 +97,15 @@ export interface PaneContextView {
97
97
  /** `full` draws the three axes; `lens` draws the rendering context as a read-only summary. */
98
98
  barMode: "full" | "lens";
99
99
  presetState: "shown" | "hidden";
100
+ /**
101
+ * The Back control, in a workspace that draws no tab strip (Media, Styles, Publish): shown over a
102
+ * view opened beside the workspace's home, naming where it leads
103
+ * (`workspace/workspace-back.ts`).
104
+ */
105
+ backState: "shown" | "hidden";
106
+ /** "Back to Media", "Back to Variables". */
107
+ backLabel: string;
108
+ backHint: string;
100
109
  bannerState: "shown" | "hidden";
101
110
  /** The lens's stated rendering context — "Tablet · français". */
102
111
  summary: string;
@@ -108,6 +117,11 @@ export interface PaneContextView {
108
117
 
109
118
  viewState: "shown" | "hidden";
110
119
  views: PaneContextChoice[];
120
+ /**
121
+ * Whether the Context axis (size, scheme, language, layout) is drawn. Hidden for a tab nothing is
122
+ * rendered under: a workspace home draws its own surface, not the document at a breakpoint.
123
+ */
124
+ contextState: "shown" | "hidden";
111
125
  previewState: "shown" | "hidden";
112
126
  previewOn: boolean;
113
127
  previewHint: string;
@@ -145,6 +159,8 @@ export interface PaneContextView {
145
159
  /** What a control can ask the pane to do. Every one of them is a decision the flow owns. */
146
160
  export interface PaneContextActions {
147
161
  openPresetMenu: (anchor: HTMLElement) => void;
162
+ /** Leave the view for the workspace home (`pane.backToHome`). */
163
+ goBack: () => void;
148
164
  chooseEditor: (kind: string) => void;
149
165
  chooseView: (view: string) => void;
150
166
  togglePreview: () => void;
@@ -216,6 +232,9 @@ function project(scope: PaneContextScope, view: PaneContextView): void {
216
232
  scope.zoomRegion = view.zoomRegion;
217
233
  scope.barMode = view.barMode;
218
234
  scope.presetState = view.presetState;
235
+ scope.backState = view.backState;
236
+ scope.backLabel = view.backLabel;
237
+ scope.backHint = view.backHint;
219
238
  scope.bannerState = view.bannerState;
220
239
  scope.summary = view.summary;
221
240
  scope.editorMode = view.editorMode;
@@ -223,6 +242,7 @@ function project(scope: PaneContextScope, view: PaneContextView): void {
223
242
  scope.editorValue = view.editorValue;
224
243
  scope.editorOptions = view.editorOptions;
225
244
  scope.viewState = view.viewState;
245
+ scope.contextState = view.contextState;
226
246
  scope.views = view.views;
227
247
  scope.previewState = view.previewState;
228
248
  scope.previewOn = view.previewOn;
@@ -254,9 +274,13 @@ function project(scope: PaneContextScope, view: PaneContextView): void {
254
274
  /** The projection a pane's chrome starts from — a bar with nothing in it yet. */
255
275
  export function emptyPaneContextView(): PaneContextView {
256
276
  return {
277
+ backHint: "",
278
+ backLabel: "",
279
+ backState: "hidden",
257
280
  bannerState: "hidden",
258
281
  barMode: "full",
259
282
  contextRegion: "",
283
+ contextState: "shown",
260
284
  contextSummary: "Base",
261
285
  editorLabel: "",
262
286
  editorMode: "static",
@@ -105,8 +105,8 @@
105
105
  },
106
106
  "& [part=\"step-icon\"]": {
107
107
  "flex": "none",
108
- "width": "10px",
109
- "textAlign": "center"
108
+ "--jx-icon-size": "1em",
109
+ "marginBlockEnd": "-0.15em"
110
110
  },
111
111
  "& [part=\"action\"]": {
112
112
  "marginTop": "var(--jx-space-1)"
@@ -205,12 +205,18 @@
205
205
  },
206
206
  "children": [
207
207
  {
208
- "tagName": "span",
208
+ "tagName": "jx-icon",
209
209
  "attributes": {
210
- "part": "step-icon",
211
- "aria-hidden": "true"
210
+ "part": "step-icon"
212
211
  },
213
- "textContent": "${$map.item.icon}"
212
+ "$props": {
213
+ "name": {
214
+ "$ref": "$map/item/icon"
215
+ },
216
+ "label": {
217
+ "$ref": "$map/item/iconLabel"
218
+ }
219
+ }
214
220
  },
215
221
  {
216
222
  "tagName": "span",
@@ -41,8 +41,10 @@ export interface DeployStepRowView {
41
41
  id: string;
42
42
  /** `done` | `todo` | `unknown`, as `data-state`. `unknown` is not a third kind of "no". */
43
43
  state: string;
44
- /** The one-character glyph the checklist chose for that state. */
44
+ /** The kit icon the checklist chose for that state (`check`, `warning-circle`, `question`). */
45
45
  icon: string;
46
+ /** The state in words, the icon's accessible name: "Done", "To do", "Not checked yet". */
47
+ iconLabel: string;
46
48
  /** The label, and — unless the link is forged — the sentence that says what is missing. */
47
49
  text: string;
48
50
  }
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "$schema": "https://jxsuite.com/schema/v1",
3
3
  "$id": "StudioPanelPage",
4
- "$description": "The Navigator's Page panel: everything the open document says about itself before anybody reads its body — its frontmatter, the layout it is poured into, its title, description, viewport and icon, its OpenGraph card, and the raw `$head` tags no structured control owns. ONE row vocabulary across the first four sections, told apart by `kind`, because a Title, a Layout picker and a schema-driven frontmatter field differ in what they COMMIT rather than in what they look like — and what they commit is `panels/head-panel.ts`'s decision, reached by the row's `key`. Nothing here knows what a `$head` entry is, which of them are managed, what a content collection is or that a page has a layout: the flow hands over sections whose every field is already a string and this draws them. The Custom Tags section is the one different shape — a read-only list plus the form that adds to it — because those rows are markup a reader is being SHOWN rather than a value they are editing.",
4
+ "$description": "The Inspector's Page tab (specs/studio.md §6), the former Navigator Page panel: everything the open document says about itself before anybody reads its body — its frontmatter, the layout it is poured into, its title, description, viewport and icon, its OpenGraph card, and the raw `$head` tags no structured control owns. ONE row vocabulary across the first four sections, told apart by `kind`, because a Title, a Layout picker and a schema-driven frontmatter field differ in what they COMMIT rather than in what they look like — and what they commit is `panels/head-panel.ts`'s decision, reached by the row's `key`. Nothing here knows what a `$head` entry is, which of them are managed, what a content collection is or that a page has a layout: the flow hands over sections whose every field is already a string and this draws them. The Custom Tags section is the one different shape — a read-only list plus the form that adds to it — because those rows are markup a reader is being SHOWN rather than a value they are editing.",
5
5
  "tagName": "div",
6
6
  "attributes": {
7
7
  "part": "page"
8
8
  },
9
9
  "style": {
10
- "$description": "The eleven `.imports-*` and four `.head-*` rules in `styles/panels.css` plus the row vocabulary the panel used to borrow from `styles/inspector.css` (`.style-row`, `.style-row-label`, `.set-dot`) and `styles/overlays.css` (`.media-picker`, `.media-picker-thumb`). The borrowed ones are TRANSCRIBED rather than shared, for the reason `doc-header.json` gives: a document emits no class, so a class cannot style it, and the lit panels that still draw a `.style-row` go on owning those rules until they convert. Four token repairs travel with them. `--spectrum-font-size-50` resolved only inside `<sp-theme>` and a document is mounted outside it, so every rule that read it would silently have taken its 11px fallback and stopped following the theme; each is `--jx-text-sm` here, and the two bare `10px` literals are `--jx-text-xs`. `.imports-count` read `--text-hint`, a name NO stylesheet in this package defines — an unresolvable custom property makes the whole declaration invalid at computed-value time, so the count has been inheriting its colour rather than taking the one written for it, and it says `--fg-dim`, which is what it was drawing anyway. And `.head-section-body .style-row > sp-textfield` reached INSIDE another component to widen it, which a part cannot do and no longer has to: `[part=\"widget\"]` is the field itself. Two things changed on purpose. THE CLEAR DOT IS A BUTTON — it was a `<span>` with a click handler and no role, so a row's only route to clearing its value could not be reached from the keyboard at all. AND THE ADD FORM IS STATE, not three `ref()` handles read at submit time: a document binding writes only when the scope moves, so the flow states what each field holds and clearing one after a successful add is a real change the runtime carries back.",
10
+ "$description": "The eleven `.imports-*` and four `.head-*` rules in `styles/panels.css` plus the row vocabulary the panel used to borrow from `styles/inspector.css` (`.style-row`, `.style-row-label`, `.set-dot`) and `styles/overlays.css` (`.media-picker`, `.media-picker-thumb`). The borrowed ones are TRANSCRIBED rather than shared, because a document emits no class, so a class cannot style it, and the lit panels that still draw a `.style-row` go on owning those rules until they convert. Four token repairs travel with them. `--spectrum-font-size-50` resolved only inside `<sp-theme>` and a document is mounted outside it, so every rule that read it would silently have taken its 11px fallback and stopped following the theme; each is `--jx-text-sm` here, and the two bare `10px` literals are `--jx-text-xs`. `.imports-count` read `--text-hint`, a name NO stylesheet in this package defines — an unresolvable custom property makes the whole declaration invalid at computed-value time, so the count has been inheriting its colour rather than taking the one written for it, and it says `--fg-dim`, which is what it was drawing anyway. And `.head-section-body .style-row > sp-textfield` reached INSIDE another component to widen it, which a part cannot do and no longer has to: `[part=\"widget\"]` is the field itself. Two things changed on purpose. THE CLEAR DOT IS A BUTTON — it was a `<span>` with a click handler and no role, so a row's only route to clearing its value could not be reached from the keyboard at all. AND THE ADD FORM IS STATE, not three `ref()` handles read at submit time: a document binding writes only when the scope moves, so the flow states what each field holds and clearing one after a successful add is a real change the runtime carries back.",
11
11
  "display": "block",
12
12
  "overflowY": "auto",
13
13
  "padding": "var(--jx-space-2)",
@@ -85,6 +85,19 @@
85
85
  "width": "100%",
86
86
  "minWidth": "0"
87
87
  },
88
+ "& [part=\"readout\"]": {
89
+ "$description": "A derived value set as text in the field's place, monospaced because a URL is read character by character.",
90
+ "display": "block",
91
+ "padding": "2px 0",
92
+ "overflow": "hidden",
93
+ "textOverflow": "ellipsis",
94
+ "whiteSpace": "nowrap",
95
+ "fontFamily": "var(--font-mono, monospace)",
96
+ "fontSize": "var(--jx-text-sm)"
97
+ },
98
+ "& [part=\"row-action\"]": {
99
+ "alignSelf": "flex-start"
100
+ },
88
101
  "& [part=\"note\"]": {
89
102
  "$description": "What the row could not find out — the entries of a referenced collection that is empty, or the reason listing it failed. A sentence under the control, in the row's own label size, so it reads as part of the field rather than as an error banner.",
90
103
  "margin": "0",
@@ -501,6 +514,15 @@
501
514
  ]
502
515
  }
503
516
  },
517
+ "readout": {
518
+ "$description": "A value the document derives rather than stores, such as a page's URL, which is its file's place under `pages/`. Shown, never edited here: an editable URL would be a rename, and a rename is the file tree's.",
519
+ "tagName": "output",
520
+ "attributes": {
521
+ "part": "readout",
522
+ "aria-label": "${$map.item.label}"
523
+ },
524
+ "textContent": "${$map.item.value}"
525
+ },
504
526
  "select": {
505
527
  "tagName": "jx-select",
506
528
  "attributes": {
@@ -682,6 +704,54 @@
682
704
  }
683
705
  }
684
706
  },
707
+ {
708
+ "tagName": "div",
709
+ "attributes": {
710
+ "part": "action-slot",
711
+ "role": "none"
712
+ },
713
+ "style": {
714
+ "display": "contents"
715
+ },
716
+ "$switch": {
717
+ "$ref": "$map/item/hasAction"
718
+ },
719
+ "cases": {
720
+ "true": {
721
+ "$description": "The row's one door elsewhere, named for what it opens: the Layout row's Edit template opens the layout in Design.",
722
+ "tagName": "jx-button",
723
+ "attributes": {
724
+ "part": "row-action"
725
+ },
726
+ "$props": {
727
+ "size": "sm",
728
+ "variant": "secondary"
729
+ },
730
+ "onclick": {
731
+ "$prototype": "Function",
732
+ "body": [
733
+ {
734
+ "operator": "call",
735
+ "target": {
736
+ "$ref": "#/state/runRowAction"
737
+ },
738
+ "value": [
739
+ {
740
+ "$ref": "$map/item/key"
741
+ }
742
+ ]
743
+ }
744
+ ]
745
+ },
746
+ "children": [
747
+ {
748
+ "tagName": "span",
749
+ "textContent": "${$map.item.action}"
750
+ }
751
+ ]
752
+ }
753
+ }
754
+ },
685
755
  {
686
756
  "tagName": "div",
687
757
  "attributes": {
@@ -1,6 +1,6 @@
1
1
  /// <reference lib="dom" />
2
2
  /**
3
- * The Navigator's Page panel, as a mounted document.
3
+ * The Page panel — the Inspector's Page tab (§6) — as a mounted document.
4
4
  *
5
5
  * `panels/head-panel.ts` is the flow — what a `$head` entry means, which of them a structured
6
6
  * control already owns, what the layout cascade resolves to, which realm a title lives in and what
@@ -37,10 +37,10 @@ registerSurface("panel-page", pagePanelDoc);
37
37
  * `$switch` chooses on one: a row that omitted `options` would leave the picker case reading an
38
38
  * absent path.
39
39
  *
40
- * {@link PageRow.key} and {@link PageRow.prop} are two fields for the reason the Document Header
41
- * card gives: `key` is the identity the repeater and every action use, `prop` is the name a reader,
42
- * a screenshot region and `ui/regions.ts`'s `field:<prop>` grammar see. A collection whose schema
43
- * declares a `layout` property would otherwise share an identity with the Layout picker.
40
+ * {@link PageRow.key} and {@link PageRow.prop} are two fields: `key` is the identity the repeater
41
+ * and every action use, `prop` is the name a reader, a screenshot region and `ui/regions.ts`'s
42
+ * `field:<prop>` grammar see. A collection whose schema declares a `layout` property would
43
+ * otherwise share an identity with the Layout picker.
44
44
  */
45
45
  export interface PageRow {
46
46
  /** The row's identity: the repeater's key, and the argument every action is given. */
@@ -49,8 +49,15 @@ export interface PageRow {
49
49
  prop: string;
50
50
  /** The visible label, already carrying the required marker where a schema asks for one. */
51
51
  label: string;
52
- /** Which control the row draws. `textarea` is a multiline text field, not a second element. */
53
- kind: "text" | "textarea" | "number" | "boolean" | "select" | "media";
52
+ /**
53
+ * Which control the row draws. `textarea` is a multiline text field, not a second element;
54
+ * `readout` is no control at all, a value the document derives (a page's URL) shown as text.
55
+ */
56
+ kind: "text" | "textarea" | "number" | "boolean" | "select" | "media" | "readout";
57
+ /** The row's one button, named for what it opens. Empty draws none. */
58
+ action: string;
59
+ /** Whether {@link PageRow.action} has anything in it; `$switch` is the document's conditional. */
60
+ hasAction: boolean;
54
61
  /**
55
62
  * Whether the value is set on this document — studio-ui-guidelines.md §4.2's dot, and the row's
56
63
  * only clear affordance.
@@ -139,6 +146,8 @@ export interface PagePanelActions {
139
146
  browse: (key: string, anchor: EventTarget | null) => void;
140
147
  /** Run the `document.openSeo` command — the door to Search appearance. */
141
148
  openSeo: () => void;
149
+ /** Press the row's own button ({@link PageRow.action}). */
150
+ runRowAction: (key: string) => void;
142
151
  /** Take one custom `$head` entry away. */
143
152
  removeEntry: (key: string) => void;
144
153
  /** State what the add form's tag picker now holds, before anything is decided about it. */
@@ -231,6 +240,28 @@ export function renderPagePanelSurface(
231
240
  the next `afterRender` sees a disconnected handle and remakes the surface through the branch
232
241
  above. */
233
242
  void mountSurface("panel-page", scope, host).then((handle) => {
243
+ /* Unmounted while in flight (the Inspector's Page tab lost its document in the same turn): the
244
+ record is no longer the host's, so the surface that just landed is taken straight back out. */
245
+ if (mounts.get(host) !== record) {
246
+ handle.dispose();
247
+ return;
248
+ }
234
249
  record.handle = handle;
235
250
  });
236
251
  }
252
+
253
+ /**
254
+ * Take the panel out of `host`, if it is there — the Inspector's Page tab with no document open.
255
+ * Idempotent: a host with no mount is left as it is.
256
+ *
257
+ * @param {HTMLElement} host The panel's content area.
258
+ */
259
+ export function unmountPagePanelSurface(host: HTMLElement): void {
260
+ const existing = mounts.get(host);
261
+ if (!existing) {
262
+ return;
263
+ }
264
+ mounts.delete(host);
265
+ existing.handle?.dispose();
266
+ host.textContent = "";
267
+ }
@@ -8,7 +8,7 @@
8
8
  "data-refreshing": "${state.refreshing ? '' : null}"
9
9
  },
10
10
  "style": {
11
- "$description": "The `.signal-*`, `.signals-*` and `.data-*` rules of `styles/inspector.css`, carried here and keyed on `part`. A signal row is `part=\"entry\"` rather than `part=\"row\"` because the value tree mounted INSIDE an open one is `surfaces/panel-data.json`, whose lines are `part=\"row\"`; two documents sharing a container may not share a part name. Three token repairs travel with them, all of the shape `surfaces/git-panel.json` describes: `--spectrum-font-size-50` and the bare `10px` literals resolved only inside `<sp-theme>` and a document is mounted outside it, so every rule that read one would silently have taken its px fallback \u2014 they are `--jx-text-sm` (11px) and `--jx-text-xs` (10px) here, at the same values \u2014 and `--spectrum-corner-radius-75` is `--jx-radius-xs`, also at its own value. ONE rule is repaired rather than moved: `.signal-badge.handler` never matched anything, because `defCategory` has returned `\"function\"` since the handler category was renamed, so a function entry's badge was the only one of five drawn untinted. The tint is keyed on the category the projection actually emits now, and `--handler` is the token it was always written against. And one is DELETED, because the kit already draws it: `.signal-del`'s hand-rolled visibility hiding is `[part=\"delete\"]`'s reveal on `:hover` and on `:focus-within` \u2014 the old rule was `:hover` alone, so tabbing to Delete moved the keyboard onto an invisible control.",
11
+ "$description": "The `.signal-*`, `.signals-*` and `.data-*` rules of `styles/inspector.css`, carried here and keyed on `part`. A signal row is `part=\"entry\"` rather than `part=\"row\"` because the value tree mounted INSIDE an open one is `surfaces/panel-data.json`, whose lines are `part=\"row\"`; two documents sharing a container may not share a part name. Three token repairs travel with them, all of one shape: `--spectrum-font-size-50` and the bare `10px` literals resolved only inside `<sp-theme>` and a document is mounted outside it, so every rule that read one would silently have taken its px fallback \u2014 they are `--jx-text-sm` (11px) and `--jx-text-xs` (10px) here, at the same values \u2014 and `--spectrum-corner-radius-75` is `--jx-radius-xs`, also at its own value. ONE rule is repaired rather than moved: `.signal-badge.handler` never matched anything, because `defCategory` has returned `\"function\"` since the handler category was renamed, so a function entry's badge was the only one of five drawn untinted. The tint is keyed on the category the projection actually emits now, and `--handler` is the token it was always written against. And one is DELETED, because the kit already draws it: `.signal-del`'s hand-rolled visibility hiding is `[part=\"delete\"]`'s reveal on `:hover` and on `:focus-within` \u2014 the old rule was `:hover` alone, so tabbing to Delete moved the keyboard onto an invisible control.",
12
12
  "display": "flex",
13
13
  "flexDirection": "column",
14
14
  "minHeight": "0",
@@ -16,7 +16,7 @@
16
16
  * field, and a table field's rows and cells — and inside the innermost one `$map/item` is the cell,
17
17
  * so a control genuinely cannot see the entry it belongs to. Each record therefore carries the
18
18
  * entry name, the field key and (for a cell) its row and column, which the flow looks straight back
19
- * up. That is the same answer `surfaces/git-panel.json` gives for its nested file rows.
19
+ * up. That is the same answer `surfaces/publish-workspace.json` gives for its nested file rows.
20
20
  *
21
21
  * **Five islands, all through `onNodeCreated`** (specs/studio-ui-guidelines.md §9.4). The
22
22
  * expression editor, the statement-card editor and the media picker are lit surfaces of their own
@@ -24,10 +24,10 @@
24
24
  * resolved-value tree is a document of its own (`surfaces/panel-data.ts`). The document renders an
25
25
  * empty host for each and the flow fills it.
26
26
  *
27
- * **The container is not cleared**, for the reason `surfaces/git-panel.ts` states: a panel body is
28
- * a node lit renders into and its comment markers are how lit finds its own content again. So the
29
- * document is APPENDED, and {@link SignalsSurfaceHandle.attached} is how the panel finds out that
30
- * the Navigator has since painted another panel over the top of it.
27
+ * **The container is not cleared**, because a panel body is a node lit renders into and its comment
28
+ * markers are how lit finds its own content again. So the document is APPENDED, and
29
+ * {@link SignalsSurfaceHandle.attached} is how the panel finds out that the Navigator has since
30
+ * painted another panel over the top of it.
31
31
  *
32
32
  * @docs studio/logic/data
33
33
  */