@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,13 +1,14 @@
1
1
  /// <reference lib="dom" />
2
2
  /**
3
- * The Library surface: the pane that BROWSES a project's files, as a Jx document over the kit.
3
+ * The Content home surface: one collection, browsed, as a Jx document over the kit (studio.md
4
+ * §22.5).
4
5
  *
5
- * This is the adapter. `browse/library-pane.ts` keeps the Library — the scan, the filter, the
6
- * window, the creation and upload flows, the per-file menu — and hands this module one projection:
7
- * a word saying which of nine things to draw, the toolbar's chips already marked, and rows whose
6
+ * This is the adapter. `browse/library-pane.ts` keeps the home — the scan, the collection and its
7
+ * filter, the window, the header line, the per-file menu — and hands this module one projection: a
8
+ * word saying which of eight things to draw, the toolbar's chips already marked, and rows whose
8
9
  * every field is already a string. The document renders that and decides nothing.
9
10
  *
10
- * **Nine cases, one discriminant.** `$switch` over a value is the only conditional a document has,
11
+ * **Eight cases, one discriminant.** `$switch` over a value is the only conditional a document has,
11
12
  * and "is the scan running, did it finish, did the project have anything in it, did the filter keep
12
13
  * any of it, and which layout is on" is five questions. The pane answers them once and the surface
13
14
  * reads a word — which is also what keeps the four honest empty states from collapsing back into
@@ -22,8 +23,8 @@
22
23
  * **The container is CLEARED, because this is a pane and not a panel.** A panel is handed
23
24
  * `.panel-content`, a node lit renders `nothing` into, whose comment markers must survive; the
24
25
  * canvas stage is handed to whichever mode owns it whole, and `canvas/canvas-render.ts` hands it
25
- * over by emptying it. So the mount empties it too, which is what stops two Libraries stacking when
26
- * a repaint lands before the first mount has settled.
26
+ * over by emptying it. So the mount empties it too, which is what stops two homes stacking when a
27
+ * repaint lands before the first mount has settled.
27
28
  *
28
29
  * @docs studio/projects/browse
29
30
  */
@@ -40,11 +41,11 @@ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
40
41
  registerSurface("library-pane", libraryDoc);
41
42
 
42
43
  /**
43
- * Which of nine things the body draws.
44
+ * Which of eight things the body draws.
44
45
  *
45
46
  * The first four are the states the Manage view called "No files found" — a scan still running, a
46
- * scan that could not finish, a project with no files at all, and a filter that matched none of
47
- * them — and the last five are the layouts. One word, so no two of them can be true at once.
47
+ * scan that could not finish, a collection with nothing in it, and a filter that matched none of it
48
+ * — and the last four are the views. One word, so no two of them can be true at once.
48
49
  */
49
50
  export type LibraryViewKind =
50
51
  | "loading"
@@ -52,7 +53,6 @@ export type LibraryViewKind =
52
53
  | "empty"
53
54
  | "nomatch"
54
55
  | "cards"
55
- | "media"
56
56
  | "table"
57
57
  | "calendar"
58
58
  | "board";
@@ -69,9 +69,7 @@ export interface LibraryRow {
69
69
  * Which of three things stands in the art box.
70
70
  *
71
71
  * `image` is the file itself, `doc` is the live-preview island the host fills, and `glyph` is the
72
- * honest answer for a file nothing here can draw. Media tiles never say `doc`: a tile is a
73
- * thumbnail of an asset, and a live document render inside one is the cost the Media layout
74
- * exists to avoid.
72
+ * honest answer for a file nothing here can draw.
75
73
  */
76
74
  art: "image" | "doc" | "glyph";
77
75
  /** The URL an `image` loads. Empty for the other two. */
@@ -99,10 +97,10 @@ export interface LibraryColumn {
99
97
  * note; only Board prints a count, and only the Calendar's undated section is dimmed.
100
98
  */
101
99
  export interface LibraryGroup {
102
- /** The group's identity across repaints — the date, or the category name. */
100
+ /** The group's identity across repaints — the date, or the folder. */
103
101
  id: string;
104
102
  title: string;
105
- /** Board's honest total for the category, already a string. Empty for a Calendar day. */
103
+ /** Board's honest total for the folder, already a string. Empty for a Calendar day. */
106
104
  count: string;
107
105
  /** What this group left out, or the undated section's count. */
108
106
  note: string;
@@ -112,21 +110,53 @@ export interface LibraryGroup {
112
110
  files: LibraryRow[];
113
111
  }
114
112
 
115
- /** A toolbar chip: a category or a layout, and whether it is the one in force. */
113
+ /** A toolbar chip: a view, and whether it is the one in force. */
116
114
  export interface LibraryChip {
117
115
  key: string;
118
116
  label: string;
119
117
  checked: "true" | "false";
120
118
  }
121
119
 
120
+ /**
121
+ * The header line: where a collection's entries are published (§22.5).
122
+ *
123
+ * `page` reads "Each post has a page at `/blog/:slug` using Post" with **Design the post page**;
124
+ * `none` reads "Entries have no page of their own" with **Add one**; `loading` is the sentence
125
+ * shown while the pages are being read; `hidden` draws nothing (Pages, a file-backed collection).
126
+ */
127
+ export interface LibraryPageLine {
128
+ state: "hidden" | "loading" | "page" | "none";
129
+ /** The sentence before the pattern, or the whole sentence for `loading` and `none`. */
130
+ text: string;
131
+ /** The URL pattern, drawn as code. */
132
+ pattern: string;
133
+ /** "using Post", or "with no template". */
134
+ template: string;
135
+ /** The button that opens the page in Design. */
136
+ designLabel: string;
137
+ }
138
+
122
139
  /** Everything the document draws, as one value. */
123
140
  export interface LibraryView {
124
- /** The region id stamped on the root, so the screenshot pipeline can address the Library. */
141
+ /** The region id stamped on the root, so the screenshot pipeline can address the home. */
125
142
  region: string;
126
- /** The region id on the scroller, which is also the drop zone. */
127
- dropRegion: string;
128
143
  view: LibraryViewKind;
129
- categories: LibraryChip[];
144
+ /** The collection's title: "Pages", "Posts". */
145
+ title: string;
146
+ /** The line under the title, or "" for none. */
147
+ subtitle: string;
148
+ /** The search field's label: "Search posts". */
149
+ searchLabel: string;
150
+ /** The create button's label: "New post". */
151
+ newLabel: string;
152
+ /** Whether **New <item>** is drawn: a file-backed collection (one CSV) gains rows in its file. */
153
+ newState: "hidden" | "shown";
154
+ /**
155
+ * Whether **Fields** and **Edit in grid** are drawn: a declared collection has fields and a grid
156
+ * of its own, Pages does not.
157
+ */
158
+ fieldsState: "hidden" | "shown";
159
+ page: LibraryPageLine;
130
160
  layouts: LibraryChip[];
131
161
  /**
132
162
  * Whether the language facet is drawn at all.
@@ -137,15 +167,13 @@ export interface LibraryView {
137
167
  localeState: "hidden" | "shown";
138
168
  localeOptions: SurfaceOption[];
139
169
  localeValue: string;
170
+ /** The Filter: drawn when something groups the entries (their status, or the Board's field). */
171
+ filterState: "hidden" | "shown";
172
+ filterOptions: SurfaceOption[];
173
+ filterValue: string;
140
174
  query: string;
141
- /** Where an upload lands, as the label's tooltip says it — before the files are chosen. */
142
- uploadHint: string;
143
- /** The picker's `accept`, from the media registry. */
144
- uploadAccept: string;
145
175
  bannerState: "hidden" | "shown";
146
176
  bannerText: string;
147
- /** `"true"` while a drag is over the body. A state the host holds, not a class a handler adds. */
148
- dropActive: "true" | "false";
149
177
  /** The `nomatch` sentence, naming the filters that produced it. */
150
178
  emptyMessage: string;
151
179
  /** The second line of `incomplete` and `nomatch`. */
@@ -162,28 +190,25 @@ export interface LibraryView {
162
190
  truncatedState: "hidden" | "shown";
163
191
  }
164
192
 
165
- /** What a control can ask the Library to do. Every one of them is a decision the pane owns. */
193
+ /** What a control can ask the home to do. Every one of them is a decision the pane owns. */
166
194
  export interface LibraryActions {
167
- setCategory: (key: string) => void;
168
195
  setLayout: (key: string) => void;
169
196
  setLocale: (value: string) => void;
197
+ setFilter: (value: string) => void;
170
198
  search: (value: string) => void;
171
199
  openFile: (path: string) => void;
172
200
  /** Right-click on a row, at the pointer. */
173
201
  contextMenu: (path: string, x: number, y: number) => void;
174
- /** The New menu opens under its own button. */
175
- openNewMenu: (opener: HTMLElement) => void;
176
- /**
177
- * A file picker settled.
178
- *
179
- * The ELEMENT rather than its list, because a file input that is not cleared refuses the same
180
- * file twice — and the picker is the surface's own control, so the host is the one that clears
181
- * it.
182
- */
183
- upload: (input: HTMLInputElement) => void;
184
- dragOver: () => void;
185
- dragOut: () => void;
186
- drop: (files: FileList | null) => void;
202
+ /** **New <item>** opens Add new on the collection's kind. */
203
+ openNew: () => void;
204
+ /** **Fields** opens Project Settings › Content types on this collection. */
205
+ openFields: () => void;
206
+ /** **Edit in grid** opens the collection's grid (`collection.editInGrid`). */
207
+ openGrid: () => void;
208
+ /** **Design the <item> page** opens the collection's page in Design. */
209
+ designPage: () => void;
210
+ /** **Add one** writes the collection's page. */
211
+ addPage: () => void;
187
212
  scrolled: () => void;
188
213
  retry: () => void;
189
214
  reset: () => void;
@@ -211,19 +236,24 @@ interface LibraryScope extends LibraryView, LibraryActions {}
211
236
  /** Write a projection into the scope. */
212
237
  function project(scope: LibraryScope, view: LibraryView): void {
213
238
  scope.region = view.region;
214
- scope.dropRegion = view.dropRegion;
215
239
  scope.view = view.view;
216
- scope.categories = view.categories;
240
+ scope.title = view.title;
241
+ scope.subtitle = view.subtitle;
242
+ scope.searchLabel = view.searchLabel;
243
+ scope.newLabel = view.newLabel;
244
+ scope.newState = view.newState;
245
+ scope.fieldsState = view.fieldsState;
246
+ scope.page = view.page;
217
247
  scope.layouts = view.layouts;
248
+ scope.filterState = view.filterState;
249
+ scope.filterOptions = view.filterOptions;
250
+ scope.filterValue = view.filterValue;
218
251
  scope.localeState = view.localeState;
219
252
  scope.localeOptions = view.localeOptions;
220
253
  scope.localeValue = view.localeValue;
221
254
  scope.query = view.query;
222
- scope.uploadHint = view.uploadHint;
223
- scope.uploadAccept = view.uploadAccept;
224
255
  scope.bannerState = view.bannerState;
225
256
  scope.bannerText = view.bannerText;
226
- scope.dropActive = view.dropActive;
227
257
  scope.emptyMessage = view.emptyMessage;
228
258
  scope.emptyDetail = view.emptyDetail;
229
259
  scope.pad = view.pad;
@@ -251,7 +281,7 @@ function rowPath(state: JxScope | undefined): string {
251
281
  }
252
282
 
253
283
  /**
254
- * Mount the Library document into `host`, wired to `actions`.
284
+ * Mount the Content home document into `host`, wired to `actions`.
255
285
  *
256
286
  * @param {HTMLElement} host - The pane's canvas stage
257
287
  * @param {LibraryView} view - What to draw right now
@@ -269,25 +299,29 @@ export function mountLibrarySurface(
269
299
  const listening = new AbortController();
270
300
  placeholderBrokenImages(host, listening.signal);
271
301
  const scope: LibraryScope = reactive<LibraryScope>({
302
+ addPage: actions.addPage,
272
303
  bannerState: "hidden",
273
304
  bannerText: "",
274
- categories: [],
275
305
  columns: [],
276
306
  contextMenu: actions.contextMenu,
277
- dragOut: actions.dragOut,
278
- dragOver: actions.dragOver,
279
- drop: actions.drop,
280
- dropActive: "false",
281
- dropRegion: "",
307
+ designPage: actions.designPage,
282
308
  emptyDetail: "",
283
309
  emptyMessage: "",
310
+ fieldsState: "hidden",
284
311
  groups: [],
285
312
  layouts: [],
313
+ filterOptions: [],
314
+ filterState: "hidden",
315
+ filterValue: "",
286
316
  localeOptions: [],
287
317
  localeState: "hidden",
288
318
  localeValue: "",
319
+ newLabel: "",
320
+ newState: "hidden",
321
+ openFields: actions.openFields,
322
+ openGrid: actions.openGrid,
289
323
  openFile: actions.openFile,
290
- openNewMenu: actions.openNewMenu,
324
+ openNew: actions.openNew,
291
325
  pad: "",
292
326
  padBottom: "",
293
327
  padTop: "",
@@ -296,18 +330,19 @@ export function mountLibrarySurface(
296
330
  region: "",
297
331
  reset: actions.reset,
298
332
  retry: actions.retry,
333
+ page: { designLabel: "", pattern: "", state: "hidden", template: "", text: "" },
299
334
  rows: [],
300
335
  scrolled: actions.scrolled,
301
336
  scroller: actions.scroller,
302
337
  search: actions.search,
303
- setCategory: actions.setCategory,
338
+ searchLabel: "",
304
339
  setLayout: actions.setLayout,
340
+ setFilter: actions.setFilter,
305
341
  setLocale: actions.setLocale,
342
+ subtitle: "",
343
+ title: "",
306
344
  truncated: "",
307
345
  truncatedState: "hidden",
308
- upload: actions.upload,
309
- uploadAccept: "",
310
- uploadHint: "",
311
346
  view: "loading",
312
347
  });
313
348
  project(scope, view);
@@ -87,9 +87,14 @@
87
87
  "fontSize": "var(--jx-text-xs)"
88
88
  },
89
89
  "& [part=\"more\"]": {
90
- "margin": "0",
91
- "color": "var(--fg-dim)",
92
- "fontSize": "var(--jx-text-xs)"
90
+ "justifyContent": "flex-start"
91
+ },
92
+ "& [part=\"browse-all\"]": {
93
+ "$description": "The last row, set apart by a rule: it does not pick a file, it opens the picker that shows all of them.",
94
+ "marginTop": "var(--jx-space-1)",
95
+ "paddingTop": "var(--jx-space-2)",
96
+ "borderTop": "1px solid var(--border)",
97
+ "justifyContent": "flex-start"
93
98
  }
94
99
  },
95
100
  "children": [
@@ -288,14 +293,65 @@
288
293
  },
289
294
  "cases": {
290
295
  "shown": {
291
- "$description": "A truncated list says so. Fifty rows is the cap the list has always had; the sentence is what keeps the cap from reading as \"that is all there is\".",
292
- "tagName": "p",
296
+ "$description": "A truncated list says so, and the marker is a control (the rule studio.md §5.6 states for every truncation marker): it raises the cap by fifty, so every file the Media workspace lists can be reached from here without a search. Inert \"…21 more\" text was the panel holding the answer and not showing it.",
297
+ "tagName": "jx-button",
293
298
  "attributes": {
294
299
  "part": "more"
295
300
  },
296
- "textContent": "${state.moreLabel}"
301
+ "$props": {
302
+ "variant": "secondary",
303
+ "size": "sm",
304
+ "quiet": true
305
+ },
306
+ "onclick": {
307
+ "$prototype": "Function",
308
+ "body": [
309
+ {
310
+ "operator": "call",
311
+ "target": {
312
+ "$ref": "#/state/showMore"
313
+ },
314
+ "value": []
315
+ }
316
+ ]
317
+ },
318
+ "children": [
319
+ {
320
+ "tagName": "span",
321
+ "textContent": "${state.moreLabel}"
322
+ }
323
+ ]
297
324
  }
298
325
  }
326
+ },
327
+ {
328
+ "tagName": "jx-button",
329
+ "attributes": {
330
+ "part": "browse-all"
331
+ },
332
+ "$props": {
333
+ "variant": "secondary",
334
+ "size": "sm",
335
+ "quiet": true
336
+ },
337
+ "onclick": {
338
+ "$prototype": "Function",
339
+ "body": [
340
+ {
341
+ "operator": "call",
342
+ "target": {
343
+ "$ref": "#/state/browseAll"
344
+ },
345
+ "value": []
346
+ }
347
+ ]
348
+ },
349
+ "children": [
350
+ {
351
+ "tagName": "span",
352
+ "textContent": "${state.browseAllLabel}"
353
+ }
354
+ ]
299
355
  }
300
356
  ]
301
357
  }
@@ -14,6 +14,10 @@
14
14
  * which is the whole reason `panels/seo-modal.ts` had to fork its own Browse onto the kit menu, and
15
15
  * a top-layer popover has no such problem.
16
16
  *
17
+ * **The last row opens the big picker.** **Browse all media…** hands the same commit to the Media
18
+ * workspace's own surface in a dialog (`media/media-library.ts`), so the compact list and the full
19
+ * one are two sizes of one picker rather than two pickers.
20
+ *
17
21
  * **The filter takes the caret, and the adapter is what puts it there.** A `jx-popover` moves focus
18
22
  * into itself but has no opinion about which control; the panel is a search box over a list, so the
19
23
  * box is where typing should land. The node is reached through the mounted root rather than a
@@ -60,8 +64,10 @@ export interface MediaBrowserView {
60
64
  /** What stands in for the list when nothing matches. */
61
65
  emptyLabel: string;
62
66
  moreState: "hidden" | "shown";
63
- /** "…10 more" — the cap is fifty and a truncated list says so. */
67
+ /** "Show 10 more": a truncated list says so, and the marker raises the cap. */
64
68
  moreLabel: string;
69
+ /** The last row: "Browse all media…", or "Browse all images…" for a field that holds a picture. */
70
+ browseAllLabel: string;
65
71
  }
66
72
 
67
73
  /** What a control asks the flow to do. */
@@ -70,6 +76,10 @@ export interface MediaBrowserActions {
70
76
  pick: (path: string) => void;
71
77
  /** A thumbnail finished decoding at that size. The flow decides whether it is news. */
72
78
  measure: (file: string, width: number, height: number) => void;
79
+ /** Raise the cap on listed rows: the truncation marker is a control, not a sentence. */
80
+ showMore: () => void;
81
+ /** Open the full-size picker: the Media workspace's surface, in a dialog (studio.md §9.3). */
82
+ browseAll: () => void;
73
83
  /** The platform closed the panel: clicked outside, Escape, or a second press on the invoker. */
74
84
  dismissed?: () => void;
75
85
  }
@@ -90,6 +100,7 @@ function project(scope: MediaBrowserScope, view: MediaBrowserView): void {
90
100
  scope.emptyLabel = view.emptyLabel;
91
101
  scope.moreState = view.moreState;
92
102
  scope.moreLabel = view.moreLabel;
103
+ scope.browseAllLabel = view.browseAllLabel;
93
104
  }
94
105
 
95
106
  /**
@@ -106,6 +117,8 @@ export function openMediaBrowserSurface(
106
117
  anchor: HTMLElement | null,
107
118
  ): MediaBrowserSurfaceHandle {
108
119
  const scope: MediaBrowserScope = reactive<MediaBrowserScope>({
120
+ browseAll: actions.browseAll,
121
+ browseAllLabel: view.browseAllLabel,
109
122
  emptyLabel: view.emptyLabel,
110
123
  filter: view.filter,
111
124
  measure: actions.measure,
@@ -115,6 +128,7 @@ export function openMediaBrowserSurface(
115
128
  rows: view.rows,
116
129
  rowsState: view.rowsState,
117
130
  setFilter: actions.setFilter,
131
+ showMore: actions.showMore,
118
132
  x: view.x,
119
133
  y: view.y,
120
134
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://jxsuite.com/schema/v1",
3
3
  "$id": "StudioMediaField",
4
- "$description": "The media field: a thumbnail of what the value names, the value itself, and the two doors to a different one. It is a LEAF a caller interpolates \u2014 the Inspector's Content tab, the Signals panel and the grid's image-cell panel each draw an empty host and `ui/media-picker.ts` mounts this into it \u2014 so it has no chrome of its own and takes its width from whatever row it lands in. **Browse is addressed through its `part`, not through a class.** `ui/regions.ts` derives `inspector/field:<prop>/browse` by finding the Browse control inside the Inspector's own `[data-prop]` row; the handle used to be `.media-picker-browse`, and a document emits no class, so `[part=\"browse\"]` is the handle now. The four `.media-picker*` rules from `styles/overlays.css` are TRANSCRIBED here rather than shared, for the reason `doc-header.json` gives: a class a document does not emit cannot style it. `--radius` becomes `--jx-radius-sm` on the way, because a document mounted in a pane's stage is outside `<sp-theme>` and would otherwise take a fallback rather than follow the theme.",
4
+ "$description": "The media field: a thumbnail of what the value names, the value itself, and the two doors to a different one. It is a LEAF a caller interpolates \u2014 the Inspector's Content tab, the Signals panel and the grid's image-cell panel each draw an empty host and `ui/media-picker.ts` mounts this into it \u2014 so it has no chrome of its own and takes its width from whatever row it lands in. **Browse is addressed through its `part`, not through a class.** `ui/regions.ts` derives `inspector/field:<prop>/browse` by finding the Browse control inside the Inspector's own `[data-prop]` row; the handle used to be `.media-picker-browse`, and a document emits no class, so `[part=\"browse\"]` is the handle now. The four `.media-picker*` rules from `styles/overlays.css` are TRANSCRIBED here rather than shared, because a class a document does not emit cannot style it. `--radius` becomes `--jx-radius-sm` on the way, because a document mounted in a pane's stage is outside `<sp-theme>` and would otherwise take a fallback rather than follow the theme.",
5
5
  "tagName": "div",
6
6
  "attributes": {
7
7
  "part": "media-field"