@jxsuite/studio 6.1.1 → 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 (785) hide show
  1. package/README.md +5 -5
  2. package/dist/chunks/2020-5wtzce5g.js +4 -0
  3. package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
  4. package/dist/chunks/adapter-5tphg7xe.js +4 -0
  5. package/dist/chunks/add-new-flow-psym14sn.js +4 -0
  6. package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
  7. package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
  8. package/dist/chunks/color-area-6rbra5dy.js +4 -0
  9. package/dist/chunks/color-field-gy56c94g.js +4 -0
  10. package/dist/chunks/color-m7r1vk54.js +4 -0
  11. package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
  12. package/dist/chunks/combobox-72h32ejk.js +4 -0
  13. package/dist/chunks/components-r22xca09.js +4 -0
  14. package/dist/chunks/content-source-mmppmcyg.js +4 -0
  15. package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
  16. package/dist/chunks/dialog-c4x05vyx.js +4 -0
  17. package/dist/chunks/editor-ccd9jwsa.js +4 -0
  18. package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
  19. package/dist/chunks/extension-sections-0egb88dm.js +4 -0
  20. package/dist/chunks/file-ops-qnab36ek.js +4 -0
  21. package/dist/chunks/files-rcn56qvm.js +4 -0
  22. package/dist/chunks/format-host-yxz0kjjs.js +4 -0
  23. package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
  24. package/dist/chunks/grid-open-4z1g062t.js +4 -0
  25. package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
  26. package/dist/chunks/icons-63bjtbs7.js +4 -0
  27. package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
  28. package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
  29. package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
  30. package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
  31. package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
  32. package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
  33. package/dist/chunks/index-f0jn7nnp.js +4 -0
  34. package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
  35. package/dist/chunks/jsonMode-njkvsa02.js +13 -0
  36. package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
  37. package/dist/chunks/layers-bgyr11tr.js +4 -0
  38. package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
  39. package/dist/chunks/listbox-c421cf8c.js +4 -0
  40. package/dist/chunks/lit-html-v9gh687x.js +4 -0
  41. package/dist/chunks/media-library-sq468wts.js +4 -0
  42. package/dist/chunks/media-picker-shfe59pt.js +4 -0
  43. package/dist/chunks/menu-bdpzbfvs.js +4 -0
  44. package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
  45. package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
  46. package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
  47. package/dist/chunks/notify-kzrjr3fv.js +4 -0
  48. package/dist/chunks/number-field-y62xq0ty.js +4 -0
  49. package/dist/chunks/parse-v77xtwv7.js +4 -0
  50. package/dist/chunks/platform-7v4rtd7m.js +4 -0
  51. package/dist/chunks/popover-b89sfej7.js +4 -0
  52. package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
  53. package/dist/chunks/publish-quick-qx2455cj.js +4 -0
  54. package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
  55. package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
  56. package/dist/chunks/references-9547rg5s.js +4 -0
  57. package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
  58. package/dist/chunks/select-rzds841e.js +4 -0
  59. package/dist/chunks/source-control-kwktr9y6.js +4 -0
  60. package/dist/chunks/split-c9zfdgxf.js +4 -0
  61. package/dist/chunks/studio-03ct6yfv.js +9 -0
  62. package/dist/chunks/studio-07rcfje3.js +5 -0
  63. package/dist/chunks/studio-3e54qh39.js +7 -0
  64. package/dist/chunks/studio-3exxhz5g.js +5 -0
  65. package/dist/chunks/studio-3q40e3rj.js +5 -0
  66. package/dist/chunks/studio-3qeh9t0h.js +6 -0
  67. package/dist/chunks/studio-3qqjeep5.js +6 -0
  68. package/dist/chunks/studio-43sd2mam.js +4 -0
  69. package/dist/chunks/studio-4hp8pkyt.js +5 -0
  70. package/dist/chunks/studio-58xg6j2q.js +9 -0
  71. package/dist/chunks/studio-5g0rprdt.js +7 -0
  72. package/dist/chunks/studio-6m380wp7.js +5 -0
  73. package/dist/chunks/studio-80jyh1xh.js +4 -0
  74. package/dist/chunks/studio-83mk4bgg.js +9 -0
  75. package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
  76. package/dist/chunks/studio-8m0y2qe7.js +5 -0
  77. package/dist/chunks/studio-8tr6cfrc.js +5 -0
  78. package/dist/chunks/studio-8vcvfs7r.js +6 -0
  79. package/dist/chunks/studio-9tmebf0s.js +5 -0
  80. package/dist/chunks/studio-a2bvaptz.js +5 -0
  81. package/dist/chunks/studio-b7y5mr30.js +5 -0
  82. package/dist/chunks/studio-bavb31r0.js +5 -0
  83. package/dist/chunks/studio-bbe4c90a.js +5 -0
  84. package/dist/chunks/studio-c05wdnt3.js +5 -0
  85. package/dist/chunks/studio-ccv2svc6.js +5 -0
  86. package/dist/chunks/studio-d5grtb9e.js +16 -0
  87. package/dist/chunks/studio-df0baea9.js +5 -0
  88. package/dist/chunks/studio-dgk4dqtx.js +7 -0
  89. package/dist/chunks/studio-e1g64q43.js +5 -0
  90. package/dist/chunks/studio-ed1hp6zf.js +6 -0
  91. package/dist/chunks/studio-ed3xx40h.js +7 -0
  92. package/dist/chunks/studio-f14e1zdj.js +5 -0
  93. package/dist/chunks/studio-fbhxxc5f.js +5 -0
  94. package/dist/chunks/studio-fyh0jc96.js +5 -0
  95. package/dist/chunks/studio-gcxk20n7.js +5 -0
  96. package/dist/chunks/studio-jaaz8ce9.js +5 -0
  97. package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
  98. package/dist/chunks/studio-jsgf2q5k.js +7 -0
  99. package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
  100. package/dist/chunks/studio-k7evxqh4.js +5 -0
  101. package/dist/chunks/studio-kt3pjkwd.js +5 -0
  102. package/dist/chunks/studio-m8g16bgz.js +5 -0
  103. package/dist/chunks/studio-mn0476ag.js +5 -0
  104. package/dist/chunks/studio-mx1smyq0.js +5 -0
  105. package/dist/chunks/studio-n0c5h6mf.js +5 -0
  106. package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
  107. package/dist/chunks/studio-nqxqf8p2.js +4 -0
  108. package/dist/chunks/studio-p4nrkvqr.js +5 -0
  109. package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
  110. package/dist/chunks/studio-pgmvdv7z.js +7 -0
  111. package/dist/chunks/studio-ph84avkf.js +5 -0
  112. package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
  113. package/dist/chunks/studio-q0tccd43.js +5 -0
  114. package/dist/chunks/studio-q7rtx6zq.js +14 -0
  115. package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
  116. package/dist/chunks/studio-qmn1xc24.js +5 -0
  117. package/dist/chunks/studio-qwdqwkj0.js +5 -0
  118. package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
  119. package/dist/chunks/studio-rj9eamf8.js +5 -0
  120. package/dist/chunks/studio-rptgsk96.js +5 -0
  121. package/dist/chunks/studio-rthyg42z.js +928 -0
  122. package/dist/chunks/studio-s19tp1xr.js +5 -0
  123. package/dist/chunks/studio-s32578pn.js +5 -0
  124. package/dist/chunks/studio-svb7yyve.js +5 -0
  125. package/dist/chunks/studio-syreb644.js +5 -0
  126. package/dist/chunks/studio-tf9jryb1.js +10 -0
  127. package/dist/chunks/studio-tfkznv39.js +5 -0
  128. package/dist/chunks/studio-tft6r105.js +5 -0
  129. package/dist/chunks/studio-txf2kysx.js +5 -0
  130. package/dist/chunks/studio-v8867ddv.js +12 -0
  131. package/dist/chunks/studio-vxq7fcvv.js +5 -0
  132. package/dist/chunks/studio-w4rz9hdk.js +5 -0
  133. package/dist/chunks/studio-wbcjbhy1.js +9 -0
  134. package/dist/chunks/studio-wc649wss.js +5 -0
  135. package/dist/chunks/studio-wys23mxz.js +5 -0
  136. package/dist/chunks/studio-x1x167jh.js +5 -0
  137. package/dist/chunks/studio-x9hsze61.js +5 -0
  138. package/dist/chunks/studio-y0n7yxea.js +9 -0
  139. package/dist/chunks/studio-y3ahhdpx.js +5 -0
  140. package/dist/chunks/studio-z97c48fk.js +5 -0
  141. package/dist/chunks/studio-zat62m0c.js +5 -0
  142. package/dist/chunks/studio-zcd2e7yz.js +5 -0
  143. package/dist/chunks/studio-zz9qe3rw.js +64 -0
  144. package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
  145. package/dist/chunks/tabs-f5cw3tgp.js +4 -0
  146. package/dist/chunks/textfield-wewc8rq2.js +4 -0
  147. package/dist/chunks/toast-1gv0h53h.js +4 -0
  148. package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
  149. package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
  150. package/dist/chunks/tooltip-yypz28gq.js +4 -0
  151. package/dist/chunks/tree-9xa4hm7n.js +4 -0
  152. package/dist/chunks/tsMode-epyfz1hv.js +14 -0
  153. package/dist/chunks/workspace-dz7nxfhv.js +4 -0
  154. package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
  155. package/dist/chunks/ws-client-bv552sfx.js +4 -0
  156. package/dist/iframe-entry.js +20 -16
  157. package/dist/manifest.json +77 -63
  158. package/dist/studio.js +106 -107
  159. package/dist/workers/ts.worker.js +3 -3
  160. package/package.json +17 -16
  161. package/src/about/about-modal.ts +4 -3
  162. package/src/account/action-flow.ts +45 -38
  163. package/src/account-status.ts +7 -2
  164. package/src/browse/component-examples.ts +272 -0
  165. package/src/browse/library-commands.ts +64 -104
  166. package/src/browse/library-layouts.ts +270 -53
  167. package/src/browse/library-model.ts +194 -134
  168. package/src/browse/library-pane.ts +748 -440
  169. package/src/browse/library-preview.ts +161 -26
  170. package/src/browse/library-source.ts +308 -41
  171. package/src/browse/preview-root.ts +78 -0
  172. package/src/browse/preview-style.ts +155 -0
  173. package/src/canvas/asset-refs.ts +40 -10
  174. package/src/canvas/asset-resolve.ts +19 -23
  175. package/src/canvas/canvas-helpers.ts +7 -6
  176. package/src/canvas/canvas-live-render.ts +260 -77
  177. package/src/canvas/canvas-origin.ts +37 -12
  178. package/src/canvas/canvas-page-context.ts +112 -0
  179. package/src/canvas/canvas-patcher.ts +30 -30
  180. package/src/canvas/canvas-perf.ts +11 -5
  181. package/src/canvas/canvas-render.ts +175 -148
  182. package/src/canvas/canvas-surface.ts +5 -3
  183. package/src/canvas/canvas-utils.ts +147 -61
  184. package/src/canvas/dialog-path.ts +9 -4
  185. package/src/canvas/dialog-state.ts +1 -2
  186. package/src/canvas/diff-marks.ts +9 -16
  187. package/src/canvas/diff-toolbar.ts +8 -7
  188. package/src/canvas/edit-width-drag.ts +4 -1
  189. package/src/canvas/edit-width.ts +1 -3
  190. package/src/canvas/iframe-channel.ts +27 -13
  191. package/src/canvas/iframe-drop.ts +120 -12
  192. package/src/canvas/iframe-editable-root.ts +29 -16
  193. package/src/canvas/iframe-entry.ts +104 -75
  194. package/src/canvas/iframe-eval.ts +73 -49
  195. package/src/canvas/iframe-host.ts +269 -158
  196. package/src/canvas/iframe-inline-edit.ts +49 -30
  197. package/src/canvas/iframe-insert.ts +5 -4
  198. package/src/canvas/iframe-interaction.ts +30 -25
  199. package/src/canvas/iframe-keys.ts +11 -0
  200. package/src/canvas/iframe-overlay.ts +1 -1
  201. package/src/canvas/iframe-patch.ts +25 -21
  202. package/src/canvas/iframe-position.ts +12 -6
  203. package/src/canvas/iframe-protocol.ts +36 -21
  204. package/src/canvas/iframe-render.ts +84 -35
  205. package/src/canvas/iframe-slash.ts +24 -11
  206. package/src/canvas/iframe-subtree.ts +10 -3
  207. package/src/canvas/npm-modules.ts +22 -0
  208. package/src/canvas/path-mapping.ts +19 -12
  209. package/src/canvas/popover-path.ts +7 -3
  210. package/src/canvas/popover-state.ts +1 -2
  211. package/src/canvas/preview-navigate.ts +16 -0
  212. package/src/canvas/repeater-sources.ts +200 -0
  213. package/src/canvas/serialize-scope.ts +13 -5
  214. package/src/canvas/stage-scrollbar.ts +7 -2
  215. package/src/canvas/surface-registry.ts +27 -3
  216. package/src/collab/collab-commands.ts +7 -2
  217. package/src/collab/collab-session.ts +84 -45
  218. package/src/collab/collab-state.ts +4 -3
  219. package/src/collab/monaco-binding.ts +16 -13
  220. package/src/collab/monaco-cursors.ts +5 -2
  221. package/src/commands/app-commands.ts +16 -6
  222. package/src/commands/budget.ts +13 -11
  223. package/src/commands/command-args.ts +103 -71
  224. package/src/commands/context.ts +55 -28
  225. package/src/commands/defaults.ts +69 -45
  226. package/src/commands/keymap.ts +56 -43
  227. package/src/commands/levels.ts +14 -8
  228. package/src/commands/live-context.ts +9 -7
  229. package/src/commands/reference.ts +2 -1
  230. package/src/commands/registry.ts +22 -11
  231. package/src/commands/run-reported.ts +15 -10
  232. package/src/component-props.ts +46 -30
  233. package/src/content/collection-match.ts +11 -9
  234. package/src/content/collection-pages.ts +412 -0
  235. package/src/content/content-collections.ts +270 -0
  236. package/src/content/draft-state.ts +4 -3
  237. package/src/content/entry-commands.ts +54 -62
  238. package/src/content/entry-editor.ts +137 -32
  239. package/src/content/entry-fields.ts +25 -8
  240. package/src/content/entry-inspector.ts +225 -0
  241. package/src/content/entry-model.ts +38 -15
  242. package/src/content/entry-open.ts +80 -0
  243. package/src/content/entry-summaries.ts +440 -0
  244. package/src/content/file-record-ids.ts +80 -0
  245. package/src/content/file-records.ts +125 -0
  246. package/src/content/page-summaries.ts +129 -0
  247. package/src/content/record-entry.ts +201 -0
  248. package/src/content/writing-banner.ts +177 -0
  249. package/src/create/add-new-commands.ts +185 -0
  250. package/src/create/add-new-flow.ts +1116 -0
  251. package/src/create/add-new.ts +1014 -0
  252. package/src/create/element-name.ts +121 -0
  253. package/src/editor/canvas-context-menu.ts +1 -2
  254. package/src/editor/canvas-slash-bridge.ts +3 -6
  255. package/src/editor/content-slice.ts +16 -14
  256. package/src/editor/context-menu.ts +35 -22
  257. package/src/editor/convert-targets.ts +30 -35
  258. package/src/editor/convert-to-component.ts +78 -48
  259. package/src/editor/convert-to-repeater.ts +34 -22
  260. package/src/editor/editable-tags.ts +17 -2
  261. package/src/editor/file-drop-action.ts +29 -22
  262. package/src/editor/inline-edit-apply.ts +79 -17
  263. package/src/editor/inline-edit.ts +76 -50
  264. package/src/editor/inline-format.ts +59 -56
  265. package/src/editor/inline-link.ts +40 -15
  266. package/src/editor/insert-component.ts +91 -0
  267. package/src/editor/insert-zone-action.ts +14 -5
  268. package/src/editor/merge-tags.ts +58 -19
  269. package/src/editor/repeater-scope.ts +39 -28
  270. package/src/editor/shortcuts.ts +76 -42
  271. package/src/editor/slash-menu.ts +52 -14
  272. package/src/files/asset-versions.ts +4 -4
  273. package/src/files/components.ts +89 -20
  274. package/src/files/elements.ts +5 -6
  275. package/src/files/file-ops.ts +92 -41
  276. package/src/files/files.ts +248 -239
  277. package/src/files/fs-events.ts +18 -7
  278. package/src/files/media-meta.ts +97 -2
  279. package/src/files/media-paths.ts +3 -0
  280. package/src/files/media-types.ts +55 -0
  281. package/src/files/media-upload.ts +209 -52
  282. package/src/files/new-file-name.ts +156 -0
  283. package/src/files/serialize-document.ts +15 -5
  284. package/src/format/constraints.ts +1 -1
  285. package/src/format/convert-file.ts +27 -13
  286. package/src/format/format-choices.ts +2 -1
  287. package/src/format/format-host.ts +91 -50
  288. package/src/github/github-auth-status.ts +27 -3
  289. package/src/github/github-auth.ts +21 -11
  290. package/src/github/github-publish.ts +28 -23
  291. package/src/grid/cell-editors.ts +46 -31
  292. package/src/grid/cell-popovers.ts +5 -3
  293. package/src/grid/edit-buffer.ts +10 -9
  294. package/src/grid/grid-controller.ts +25 -23
  295. package/src/grid/grid-layout.ts +21 -5
  296. package/src/grid/grid-open.ts +3 -33
  297. package/src/grid/grid-panel.ts +65 -6
  298. package/src/grid/grid-reveal.ts +34 -0
  299. package/src/grid/grid-source.ts +9 -31
  300. package/src/grid/grid-view.ts +45 -23
  301. package/src/grid/redirects-grid.ts +14 -5
  302. package/src/grid/redirects.ts +16 -14
  303. package/src/grid/schema-columns.ts +25 -19
  304. package/src/grid/sources/connector-source.ts +47 -20
  305. package/src/grid/sources/content-source.ts +100 -31
  306. package/src/grid/sources/csv-file-source.ts +2 -2
  307. package/src/grid/tabulator-tables.d.ts +61 -34
  308. package/src/hosting/document.ts +2 -2
  309. package/src/hosting/stage.ts +7 -7
  310. package/src/i18n/i18n-commands.ts +3 -3
  311. package/src/media/media-commands.ts +181 -0
  312. package/src/media/media-library-model.ts +232 -0
  313. package/src/media/media-library.ts +1283 -0
  314. package/src/media/media-pane.ts +51 -20
  315. package/src/new-project/add-repo-modal.ts +20 -19
  316. package/src/new-project/import-tab.ts +10 -14
  317. package/src/new-project/location-fields.ts +2 -1
  318. package/src/new-project/new-project-modal.ts +12 -9
  319. package/src/packages/jxsuite-update.ts +4 -3
  320. package/src/packages/pull-package-sync.ts +26 -25
  321. package/src/page-params.ts +97 -68
  322. package/src/panels/activity-panel.ts +38 -14
  323. package/src/panels/ai-chat/attached-context.ts +13 -7
  324. package/src/panels/ai-chat/chat-markdown.ts +8 -8
  325. package/src/panels/ai-chat/chat-view.ts +80 -73
  326. package/src/panels/ai-chat/composer.ts +30 -33
  327. package/src/panels/ai-chat/sessions-view.ts +1 -2
  328. package/src/panels/ai-panel.ts +23 -20
  329. package/src/panels/block-action-bar.ts +57 -46
  330. package/src/panels/bottom-dock.ts +5 -3
  331. package/src/panels/canvas-dnd-bridge.ts +36 -26
  332. package/src/panels/chat-panel.ts +6 -6
  333. package/src/panels/collections-panel.ts +306 -0
  334. package/src/panels/component-preview.ts +35 -13
  335. package/src/panels/data-explorer.ts +63 -26
  336. package/src/panels/data-grid.ts +18 -11
  337. package/src/panels/dnd.ts +115 -138
  338. package/src/panels/editors.ts +52 -21
  339. package/src/panels/elements-panel.ts +19 -5
  340. package/src/panels/empty-state.ts +2 -2
  341. package/src/panels/events-panel.ts +84 -69
  342. package/src/panels/formula-workspace.ts +78 -54
  343. package/src/panels/frontmatter-fields.ts +33 -28
  344. package/src/panels/git-diff-open.ts +10 -6
  345. package/src/panels/head-panel.ts +488 -202
  346. package/src/panels/i18n-panel.ts +20 -12
  347. package/src/panels/imports-panel.ts +25 -47
  348. package/src/panels/jump-bar.ts +75 -31
  349. package/src/panels/layers-panel.ts +130 -101
  350. package/src/panels/left-panel.ts +25 -11
  351. package/src/panels/navigator-panels.ts +23 -11
  352. package/src/panels/pane-context.ts +140 -49
  353. package/src/panels/pane-grid.ts +55 -26
  354. package/src/panels/panel-registry.ts +36 -46
  355. package/src/panels/properties-panel.ts +182 -124
  356. package/src/panels/quick-search.ts +53 -31
  357. package/src/panels/right-panel.ts +201 -45
  358. package/src/panels/seo-modal.ts +54 -125
  359. package/src/panels/settings-menu.ts +63 -61
  360. package/src/panels/settings-pane.ts +268 -162
  361. package/src/panels/signals-panel.ts +156 -135
  362. package/src/panels/site-model.ts +367 -0
  363. package/src/panels/site-panel.ts +638 -0
  364. package/src/panels/statement-editor.ts +230 -140
  365. package/src/panels/style-panel.ts +253 -206
  366. package/src/panels/style-utils.ts +114 -51
  367. package/src/panels/stylebook-doc.ts +195 -60
  368. package/src/panels/stylebook-layers-panel.ts +48 -89
  369. package/src/panels/stylebook-panel.ts +60 -27
  370. package/src/panels/styles-panel.ts +327 -0
  371. package/src/panels/tab-drop.ts +27 -11
  372. package/src/panels/tab-strip.ts +143 -49
  373. package/src/platform-errors.ts +57 -43
  374. package/src/platform.ts +59 -31
  375. package/src/platforms/cloud.ts +373 -176
  376. package/src/platforms/default-platform.ts +14 -8
  377. package/src/platforms/devserver.ts +180 -142
  378. package/src/platforms/read-batcher.ts +16 -8
  379. package/src/project-list.ts +2 -1
  380. package/src/publish/deploy-checklist.ts +20 -9
  381. package/src/publish/pages-service.ts +66 -27
  382. package/src/publish/publish-changes.ts +491 -0
  383. package/src/publish/publish-commands.ts +88 -22
  384. package/src/publish/publish-ids.ts +49 -0
  385. package/src/publish/publish-panel.ts +10 -6
  386. package/src/publish/publish-quick.ts +148 -0
  387. package/src/publish/publish-workspace.ts +926 -0
  388. package/src/publish/source-control.ts +907 -0
  389. package/src/recent-projects.ts +15 -8
  390. package/src/resize-edges.ts +26 -36
  391. package/src/services/a11y-report.ts +26 -19
  392. package/src/services/agent-seed.ts +23 -11
  393. package/src/services/ai-ask.ts +9 -12
  394. package/src/services/ai-command-tools.ts +68 -62
  395. package/src/services/ai-import-tools.ts +80 -67
  396. package/src/services/ai-models.ts +17 -13
  397. package/src/services/ai-project-tools.ts +68 -32
  398. package/src/services/ai-session-store.ts +19 -10
  399. package/src/services/ai-system-prompt.ts +46 -20
  400. package/src/services/ai-tools.ts +71 -27
  401. package/src/services/ai-write-report.ts +20 -12
  402. package/src/services/ai-writes.ts +4 -4
  403. package/src/services/automation.ts +74 -51
  404. package/src/services/cem-export.ts +149 -58
  405. package/src/services/cf-settings.ts +4 -4
  406. package/src/services/clock.ts +6 -1
  407. package/src/services/code-services.ts +37 -31
  408. package/src/services/connection.ts +2 -2
  409. package/src/services/context-manager.ts +14 -10
  410. package/src/services/context-resolver.ts +20 -8
  411. package/src/services/data-service.ts +19 -15
  412. package/src/services/directory-picker.ts +20 -14
  413. package/src/services/document-assistant.ts +39 -19
  414. package/src/services/gated-registry.ts +10 -6
  415. package/src/services/harness/chat-reducer.ts +23 -1
  416. package/src/services/import-client.ts +91 -38
  417. package/src/services/import-seed.ts +8 -2
  418. package/src/services/jx-validate.ts +28 -31
  419. package/src/services/live-preview.ts +0 -0
  420. package/src/services/live-surfaces.ts +6 -3
  421. package/src/services/model-uri.ts +10 -2
  422. package/src/services/module-preloads.ts +12 -8
  423. package/src/services/monaco-buffer.ts +43 -24
  424. package/src/services/monaco-lazy.ts +7 -8
  425. package/src/services/monaco-setup.ts +23 -16
  426. package/src/services/notify.ts +44 -17
  427. package/src/services/popover-report.ts +25 -10
  428. package/src/services/preview-eval.ts +20 -8
  429. package/src/services/profile.ts +13 -6
  430. package/src/services/project-path.ts +13 -10
  431. package/src/services/references.ts +0 -0
  432. package/src/services/render-critic.ts +29 -9
  433. package/src/services/settings/definitions.ts +25 -14
  434. package/src/services/settings/kernel.ts +13 -4
  435. package/src/services/settings/write-queue.ts +9 -9
  436. package/src/services/token-lint.ts +12 -10
  437. package/src/services/tool-executor.ts +17 -5
  438. package/src/services/tool-outcomes.ts +44 -24
  439. package/src/services/trusted-types.ts +24 -7
  440. package/src/settings/contexts-section.ts +11 -8
  441. package/src/settings/contributed-section.ts +128 -70
  442. package/src/settings/css-vars-editor.ts +119 -32
  443. package/src/settings/defs-editor.ts +38 -35
  444. package/src/settings/developer-panels.ts +43 -0
  445. package/src/settings/extension-rows.ts +16 -8
  446. package/src/settings/extension-sections.ts +42 -14
  447. package/src/settings/extensions-section.ts +4 -1
  448. package/src/settings/general-settings.ts +101 -28
  449. package/src/settings/locales-section.ts +20 -12
  450. package/src/settings/preferences-dialog.ts +17 -7
  451. package/src/settings/preferences-keymap.ts +7 -5
  452. package/src/settings/preferences-sections.ts +11 -5
  453. package/src/settings/project-sections.ts +28 -11
  454. package/src/settings/schema-field-ui.ts +12 -1
  455. package/src/settings/section-registry.ts +116 -11
  456. package/src/settings/settings-dialog.ts +192 -0
  457. package/src/settings/settings-document.ts +186 -166
  458. package/src/shell/tree.ts +6 -5
  459. package/src/shell.ts +536 -477
  460. package/src/site-context.ts +101 -32
  461. package/src/state.ts +68 -57
  462. package/src/store.ts +54 -34
  463. package/src/studio.ts +219 -116
  464. package/src/style/live-preview.ts +1 -1
  465. package/src/style/project-styles.ts +40 -7
  466. package/src/style/stylebook-specimens.ts +89 -0
  467. package/src/style/stylebook-target.ts +26 -0
  468. package/src/style/tag-inheritance.ts +105 -0
  469. package/src/style/token-ref.ts +5 -4
  470. package/src/style/variables-focus.ts +61 -0
  471. package/src/style/variables-view.ts +235 -0
  472. package/src/surfaces/about.ts +18 -19
  473. package/src/surfaces/add-new.json +1482 -0
  474. package/src/surfaces/add-new.ts +325 -0
  475. package/src/surfaces/add-repo.ts +17 -19
  476. package/src/surfaces/ai-chat.ts +33 -38
  477. package/src/surfaces/ai-credentials-form.ts +6 -16
  478. package/src/surfaces/ai-managed-connect.ts +3 -4
  479. package/src/surfaces/ai-model-picker.ts +3 -5
  480. package/src/surfaces/block-action-bar.ts +22 -11
  481. package/src/surfaces/boot-failure.json +4 -3
  482. package/src/surfaces/boot-failure.ts +4 -5
  483. package/src/surfaces/bottom-dock.json +1 -1
  484. package/src/surfaces/bottom-dock.ts +9 -18
  485. package/src/surfaces/canvas-stage.json +30 -19
  486. package/src/surfaces/canvas-stage.ts +17 -16
  487. package/src/surfaces/cf-account-picker.ts +17 -18
  488. package/src/surfaces/collections-panel.json +615 -0
  489. package/src/surfaces/collections-panel.ts +168 -0
  490. package/src/surfaces/commandbar.json +241 -96
  491. package/src/surfaces/commandbar.ts +145 -105
  492. package/src/surfaces/convert-repeater.ts +17 -19
  493. package/src/surfaces/data-actions.ts +9 -7
  494. package/src/surfaces/dialog.ts +26 -28
  495. package/src/surfaces/diff-toolbar.ts +9 -7
  496. package/src/surfaces/empty-state.json +1 -1
  497. package/src/surfaces/empty-state.ts +7 -10
  498. package/src/surfaces/entry-editor.json +136 -0
  499. package/src/surfaces/entry-editor.ts +35 -11
  500. package/src/surfaces/entry-inspector.json +371 -0
  501. package/src/surfaces/entry-inspector.ts +143 -0
  502. package/src/surfaces/expression-editor.ts +11 -25
  503. package/src/surfaces/files-panel.ts +27 -14
  504. package/src/surfaces/formula-palette.ts +4 -5
  505. package/src/surfaces/github-auth.ts +16 -20
  506. package/src/surfaces/github-publish.ts +17 -22
  507. package/src/surfaces/grid-cell.ts +30 -31
  508. package/src/surfaces/grid-open.ts +10 -14
  509. package/src/surfaces/grid-panel.ts +13 -9
  510. package/src/surfaces/grid-replace.ts +13 -13
  511. package/src/surfaces/grid-views.ts +15 -18
  512. package/src/surfaces/inspector-dock.json +162 -14
  513. package/src/surfaces/inspector-dock.ts +59 -31
  514. package/src/surfaces/jump-bar.ts +5 -6
  515. package/src/surfaces/jxsuite-update.ts +16 -22
  516. package/src/surfaces/library-pane.json +670 -437
  517. package/src/surfaces/library-pane.ts +111 -77
  518. package/src/surfaces/logic-panel.ts +17 -30
  519. package/src/surfaces/logic-workspace.ts +13 -15
  520. package/src/surfaces/media-browser.json +62 -6
  521. package/src/surfaces/media-browser.ts +26 -11
  522. package/src/surfaces/media-field.json +1 -1
  523. package/src/surfaces/media-field.ts +4 -5
  524. package/src/surfaces/media-library.json +1586 -0
  525. package/src/surfaces/media-library.ts +282 -0
  526. package/src/surfaces/media-pane.ts +8 -7
  527. package/src/surfaces/media-pick-dialog.json +71 -0
  528. package/src/surfaces/media-pick-dialog.ts +132 -0
  529. package/src/surfaces/menu.ts +47 -23
  530. package/src/surfaces/navigator-dock.ts +11 -12
  531. package/src/surfaces/new-project.ts +27 -26
  532. package/src/surfaces/pane-context.json +144 -77
  533. package/src/surfaces/pane-context.ts +44 -25
  534. package/src/surfaces/pane-grid.ts +15 -10
  535. package/src/surfaces/panel-activity.ts +5 -6
  536. package/src/surfaces/panel-data.ts +3 -4
  537. package/src/surfaces/panel-deploy-checklist.json +12 -6
  538. package/src/surfaces/panel-deploy-checklist.ts +8 -7
  539. package/src/surfaces/panel-elements.ts +5 -7
  540. package/src/surfaces/panel-i18n.ts +5 -7
  541. package/src/surfaces/panel-imports.ts +6 -13
  542. package/src/surfaces/panel-outline.ts +25 -19
  543. package/src/surfaces/panel-page.json +72 -2
  544. package/src/surfaces/panel-page.ts +49 -25
  545. package/src/surfaces/panel-problems.ts +5 -7
  546. package/src/surfaces/panel-signals.json +1 -1
  547. package/src/surfaces/panel-signals.ts +25 -39
  548. package/src/surfaces/panel-stylebook-layers.json +71 -204
  549. package/src/surfaces/panel-stylebook-layers.ts +5 -29
  550. package/src/surfaces/preferences.json +120 -48
  551. package/src/surfaces/preferences.ts +29 -11
  552. package/src/surfaces/progress-modal.ts +15 -9
  553. package/src/surfaces/properties-panel.json +1 -1
  554. package/src/surfaces/properties-panel.ts +20 -42
  555. package/src/surfaces/publish-quick.json +428 -0
  556. package/src/surfaces/publish-quick.ts +165 -0
  557. package/src/surfaces/publish-workspace.json +2892 -0
  558. package/src/surfaces/publish-workspace.ts +391 -0
  559. package/src/surfaces/publish.ts +18 -18
  560. package/src/surfaces/push-plan.ts +7 -8
  561. package/src/surfaces/rail.json +1 -159
  562. package/src/surfaces/rail.ts +22 -79
  563. package/src/surfaces/reference-field.ts +11 -15
  564. package/src/surfaces/schema-builder.ts +16 -22
  565. package/src/surfaces/schema-form.json +10 -2
  566. package/src/surfaces/schema-form.ts +17 -25
  567. package/src/surfaces/secret-field.ts +9 -6
  568. package/src/surfaces/seo.json +1 -1
  569. package/src/surfaces/seo.ts +21 -15
  570. package/src/surfaces/settings-contexts.ts +9 -7
  571. package/src/surfaces/settings-contributed.json +5 -5
  572. package/src/surfaces/settings-contributed.ts +32 -12
  573. package/src/surfaces/settings-css-vars.json +44 -36
  574. package/src/surfaces/settings-css-vars.ts +82 -16
  575. package/src/surfaces/settings-defs.json +2 -2
  576. package/src/surfaces/settings-defs.ts +17 -21
  577. package/src/surfaces/settings-deploy.json +2 -15
  578. package/src/surfaces/settings-deploy.ts +9 -16
  579. package/src/surfaces/settings-dialog.json +51 -0
  580. package/src/surfaces/settings-dialog.ts +169 -0
  581. package/src/surfaces/settings-extensions.ts +5 -6
  582. package/src/surfaces/settings-head.ts +33 -39
  583. package/src/surfaces/settings-locales.ts +8 -20
  584. package/src/surfaces/settings-overview.json +3 -3
  585. package/src/surfaces/settings-overview.ts +14 -8
  586. package/src/surfaces/settings-packages.ts +8 -7
  587. package/src/surfaces/settings-pane.json +269 -46
  588. package/src/surfaces/settings-pane.ts +88 -36
  589. package/src/surfaces/settings-rawjson.ts +5 -6
  590. package/src/surfaces/shell.json +2 -1
  591. package/src/surfaces/shell.ts +1 -2
  592. package/src/surfaces/site-panel.json +1029 -0
  593. package/src/surfaces/site-panel.ts +233 -0
  594. package/src/surfaces/slash-menu.json +63 -21
  595. package/src/surfaces/slash-menu.ts +42 -9
  596. package/src/surfaces/statements.ts +13 -18
  597. package/src/surfaces/statusbar.ts +56 -29
  598. package/src/surfaces/style-panel.ts +18 -31
  599. package/src/surfaces/stylebook-chrome.ts +3 -5
  600. package/src/surfaces/styles-panel.json +735 -0
  601. package/src/surfaces/styles-panel.ts +195 -0
  602. package/src/surfaces/styles-variables.json +149 -0
  603. package/src/surfaces/styles-variables.ts +145 -0
  604. package/src/surfaces/tab-strip.json +4 -4
  605. package/src/surfaces/tab-strip.ts +14 -13
  606. package/src/surfaces/target-line.ts +6 -7
  607. package/src/surfaces/welcome.ts +6 -8
  608. package/src/surfaces/writing-banner.json +94 -0
  609. package/src/surfaces/writing-banner.ts +80 -0
  610. package/src/tabs/bare-repeaters.ts +101 -0
  611. package/src/tabs/patch-ops.ts +4 -3
  612. package/src/tabs/project-config.ts +32 -21
  613. package/src/tabs/selection.ts +36 -8
  614. package/src/tabs/tab.ts +99 -48
  615. package/src/tabs/transact.ts +98 -53
  616. package/src/types.ts +53 -43
  617. package/src/ui/ai-credentials-form.ts +10 -13
  618. package/src/ui/ai-model-picker.ts +3 -3
  619. package/src/ui/cf-account-picker.ts +7 -9
  620. package/src/ui/color-selector.ts +9 -5
  621. package/src/ui/dynamic-slot.ts +7 -8
  622. package/src/ui/expression-editor.ts +112 -105
  623. package/src/ui/form-controls.ts +104 -56
  624. package/src/ui/formula-catalog.ts +239 -230
  625. package/src/ui/formula-chips.ts +33 -18
  626. package/src/ui/layers.ts +57 -31
  627. package/src/ui/media-picker.ts +300 -47
  628. package/src/ui/popover-surface.ts +20 -12
  629. package/src/ui/progress-modal.ts +13 -8
  630. package/src/ui/regions.ts +14 -12
  631. package/src/ui/schema-form.ts +372 -97
  632. package/src/ui/surface.ts +71 -8
  633. package/src/ui/timing.ts +9 -0
  634. package/src/ui/value-source.ts +44 -31
  635. package/src/ui/virtual-window.ts +29 -3
  636. package/src/utils/base64.ts +6 -4
  637. package/src/utils/edit-display.ts +366 -111
  638. package/src/utils/element-selectors.ts +3 -2
  639. package/src/utils/google-fonts.ts +15 -14
  640. package/src/utils/inherited-style.ts +18 -20
  641. package/src/utils/link-target.ts +1 -1
  642. package/src/utils/local-day.ts +18 -0
  643. package/src/utils/preview-format.ts +25 -3
  644. package/src/utils/strip-events.ts +49 -22
  645. package/src/utils/studio-utils.ts +29 -14
  646. package/src/view.ts +2 -3
  647. package/src/workspace/pane-derive.ts +14 -16
  648. package/src/workspace/session.ts +81 -50
  649. package/src/workspace/tab-workspace.ts +137 -0
  650. package/src/workspace/workspace-back.ts +189 -0
  651. package/src/workspace/workspace-home.ts +133 -0
  652. package/src/workspace/workspace-ids.ts +129 -0
  653. package/src/workspace/workspace-switch.ts +372 -0
  654. package/src/workspace/workspace.ts +165 -47
  655. package/styles/shell-frame.css +30 -7
  656. package/styles/shell-frame.json +15 -3
  657. package/dist/chunks/2020-va2wwra4.js +0 -4
  658. package/dist/chunks/adapter-f93pafd7.js +0 -4
  659. package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
  660. package/dist/chunks/cf-settings-125tdm0w.js +0 -4
  661. package/dist/chunks/color-area-jqhna8zy.js +0 -4
  662. package/dist/chunks/color-field-embq5ctg.js +0 -4
  663. package/dist/chunks/color-fpezvnkt.js +0 -4
  664. package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
  665. package/dist/chunks/combobox-773hdzyj.js +0 -4
  666. package/dist/chunks/components-ax2f1fnn.js +0 -4
  667. package/dist/chunks/content-source-108aqtk1.js +0 -4
  668. package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
  669. package/dist/chunks/dialog-mtm9fq5t.js +0 -4
  670. package/dist/chunks/editor-pfgdmkb0.js +0 -4
  671. package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
  672. package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
  673. package/dist/chunks/file-ops-meej5mqf.js +0 -4
  674. package/dist/chunks/files-44vp8a2s.js +0 -4
  675. package/dist/chunks/format-host-7q1petb9.js +0 -4
  676. package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
  677. package/dist/chunks/git-panel-zngbymvd.js +0 -4
  678. package/dist/chunks/grid-view-sx9vynsp.js +0 -51
  679. package/dist/chunks/icons-p44xhjf0.js +0 -4
  680. package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
  681. package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
  682. package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
  683. package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
  684. package/dist/chunks/index-wkyfjeqz.js +0 -4
  685. package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
  686. package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
  687. package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
  688. package/dist/chunks/layers-xd92fg8d.js +0 -4
  689. package/dist/chunks/listbox-s8fkmnq8.js +0 -4
  690. package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
  691. package/dist/chunks/media-picker-0svzkdyb.js +0 -4
  692. package/dist/chunks/menu-37d07z9m.js +0 -4
  693. package/dist/chunks/menu-5c55ea3d.js +0 -4
  694. package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
  695. package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
  696. package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
  697. package/dist/chunks/notify-0xgtn8q1.js +0 -4
  698. package/dist/chunks/number-field-gw7sq8rn.js +0 -4
  699. package/dist/chunks/parse-897fvqah.js +0 -4
  700. package/dist/chunks/platform-v1qctbe6.js +0 -4
  701. package/dist/chunks/popover-8htra4er.js +0 -4
  702. package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
  703. package/dist/chunks/quick-search-a54e6t5n.js +0 -4
  704. package/dist/chunks/references-gmqp82fs.js +0 -4
  705. package/dist/chunks/right-panel-v7t9awbk.js +0 -4
  706. package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
  707. package/dist/chunks/select-n3v7gwas.js +0 -4
  708. package/dist/chunks/split-pff8f3ze.js +0 -4
  709. package/dist/chunks/studio-0bhx5hz6.js +0 -5
  710. package/dist/chunks/studio-0k1ddnyy.js +0 -6
  711. package/dist/chunks/studio-1b04pd0j.js +0 -64
  712. package/dist/chunks/studio-4dwbj6gb.js +0 -5
  713. package/dist/chunks/studio-4tanh828.js +0 -5
  714. package/dist/chunks/studio-55h4mstj.js +0 -4
  715. package/dist/chunks/studio-5tnvjkz4.js +0 -5
  716. package/dist/chunks/studio-60dqgb0c.js +0 -5
  717. package/dist/chunks/studio-61dp09qg.js +0 -9
  718. package/dist/chunks/studio-63epcrj2.js +0 -5
  719. package/dist/chunks/studio-74k29dy9.js +0 -5
  720. package/dist/chunks/studio-7vg6jcd3.js +0 -5
  721. package/dist/chunks/studio-7zx31knw.js +0 -9
  722. package/dist/chunks/studio-8bxk97km.js +0 -5
  723. package/dist/chunks/studio-933e30n4.js +0 -5
  724. package/dist/chunks/studio-98wnwhbg.js +0 -5
  725. package/dist/chunks/studio-9mccjwjh.js +0 -14
  726. package/dist/chunks/studio-a2ke1e4t.js +0 -5
  727. package/dist/chunks/studio-e3a2a6v3.js +0 -4
  728. package/dist/chunks/studio-e81q1vb9.js +0 -5
  729. package/dist/chunks/studio-epgrmqqm.js +0 -5
  730. package/dist/chunks/studio-ery42sqr.js +0 -4
  731. package/dist/chunks/studio-g1shz58g.js +0 -5
  732. package/dist/chunks/studio-gf0fz03c.js +0 -5
  733. package/dist/chunks/studio-gjtpe62q.js +0 -6
  734. package/dist/chunks/studio-gkskhg7m.js +0 -5
  735. package/dist/chunks/studio-gx4dnjzd.js +0 -5
  736. package/dist/chunks/studio-j03zga3y.js +0 -9
  737. package/dist/chunks/studio-jhpxeckz.js +0 -5
  738. package/dist/chunks/studio-k01r7ykp.js +0 -5
  739. package/dist/chunks/studio-kk7h30ne.js +0 -7
  740. package/dist/chunks/studio-kt1zqney.js +0 -5
  741. package/dist/chunks/studio-m3cwhvye.js +0 -5
  742. package/dist/chunks/studio-mcayt6hz.js +0 -5
  743. package/dist/chunks/studio-myjcghv3.js +0 -5
  744. package/dist/chunks/studio-n8bxwc3y.js +0 -4
  745. package/dist/chunks/studio-ngm8gvpb.js +0 -5
  746. package/dist/chunks/studio-nj5a01jy.js +0 -928
  747. package/dist/chunks/studio-pcgz8heb.js +0 -5
  748. package/dist/chunks/studio-qcsq0t15.js +0 -5
  749. package/dist/chunks/studio-qkstvve9.js +0 -5
  750. package/dist/chunks/studio-qv1pwd3c.js +0 -5
  751. package/dist/chunks/studio-rc6dvxjb.js +0 -7
  752. package/dist/chunks/studio-s8dmmz66.js +0 -5
  753. package/dist/chunks/studio-sp5xzbj4.js +0 -6
  754. package/dist/chunks/studio-szsjbj0g.js +0 -5
  755. package/dist/chunks/studio-t1xzawhr.js +0 -16
  756. package/dist/chunks/studio-tdcprbqb.js +0 -5
  757. package/dist/chunks/studio-vrmcjf9g.js +0 -7
  758. package/dist/chunks/studio-vyc0b4he.js +0 -10
  759. package/dist/chunks/studio-w0cgf6jg.js +0 -5
  760. package/dist/chunks/studio-w3hskzqk.js +0 -5
  761. package/dist/chunks/studio-xgrgcdyh.js +0 -9
  762. package/dist/chunks/studio-xz2yxfcb.js +0 -5
  763. package/dist/chunks/studio-y6n42tgs.js +0 -5
  764. package/dist/chunks/studio-yb560vxr.js +0 -5
  765. package/dist/chunks/studio-yn9f8vtx.js +0 -5
  766. package/dist/chunks/studio-yw05w8f0.js +0 -7
  767. package/dist/chunks/studio-z16sgavc.js +0 -5
  768. package/dist/chunks/studio-zey7zsdw.js +0 -12
  769. package/dist/chunks/studio-zyqn40w4.js +0 -5
  770. package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
  771. package/dist/chunks/tabs-jwthg40w.js +0 -4
  772. package/dist/chunks/textfield-spy3hc77.js +0 -4
  773. package/dist/chunks/toast-4d35zd64.js +0 -4
  774. package/dist/chunks/toast-host-8sjmfed3.js +0 -4
  775. package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
  776. package/dist/chunks/tree-h19v1jfz.js +0 -4
  777. package/dist/chunks/tsMode-2frah6h1.js +0 -14
  778. package/dist/chunks/workspace-zt81g1ms.js +0 -4
  779. package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
  780. package/src/panels/frontmatter-panel.ts +0 -701
  781. package/src/panels/git-panel.ts +0 -1120
  782. package/src/surfaces/doc-header.json +0 -776
  783. package/src/surfaces/doc-header.ts +0 -231
  784. package/src/surfaces/git-panel.json +0 -1880
  785. package/src/surfaces/git-panel.ts +0 -272
@@ -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,28 +23,29 @@
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
  */
30
31
 
32
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
31
33
  import { reactive } from "../reactivity";
32
34
  import { mountSurface, registerSurface } from "../ui/surface";
33
35
  import { placeholderBrokenImages } from "../utils/edit-display";
34
36
  import libraryDoc from "./library-pane.json";
35
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
37
+ import type { JxElement } from "@jxsuite/schema/types";
36
38
  import type { JxScope } from "@jxsuite/runtime/types";
37
- import type { SurfaceHandle } from "../ui/surface";
39
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
38
40
 
39
- registerSurface("library-pane", libraryDoc as unknown as JxDocument);
41
+ registerSurface("library-pane", libraryDoc);
40
42
 
41
43
  /**
42
- * Which of nine things the body draws.
44
+ * Which of eight things the body draws.
43
45
  *
44
46
  * The first four are the states the Manage view called "No files found" — a scan still running, a
45
- * scan that could not finish, a project with no files at all, and a filter that matched none of
46
- * 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.
47
49
  */
48
50
  export type LibraryViewKind =
49
51
  | "loading"
@@ -51,7 +53,6 @@ export type LibraryViewKind =
51
53
  | "empty"
52
54
  | "nomatch"
53
55
  | "cards"
54
- | "media"
55
56
  | "table"
56
57
  | "calendar"
57
58
  | "board";
@@ -68,9 +69,7 @@ export interface LibraryRow {
68
69
  * Which of three things stands in the art box.
69
70
  *
70
71
  * `image` is the file itself, `doc` is the live-preview island the host fills, and `glyph` is the
71
- * honest answer for a file nothing here can draw. Media tiles never say `doc`: a tile is a
72
- * thumbnail of an asset, and a live document render inside one is the cost the Media layout
73
- * exists to avoid.
72
+ * honest answer for a file nothing here can draw.
74
73
  */
75
74
  art: "image" | "doc" | "glyph";
76
75
  /** The URL an `image` loads. Empty for the other two. */
@@ -98,10 +97,10 @@ export interface LibraryColumn {
98
97
  * note; only Board prints a count, and only the Calendar's undated section is dimmed.
99
98
  */
100
99
  export interface LibraryGroup {
101
- /** The group's identity across repaints — the date, or the category name. */
100
+ /** The group's identity across repaints — the date, or the folder. */
102
101
  id: string;
103
102
  title: string;
104
- /** 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. */
105
104
  count: string;
106
105
  /** What this group left out, or the undated section's count. */
107
106
  note: string;
@@ -111,27 +110,53 @@ export interface LibraryGroup {
111
110
  files: LibraryRow[];
112
111
  }
113
112
 
114
- /** 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. */
115
114
  export interface LibraryChip {
116
115
  key: string;
117
116
  label: string;
118
117
  checked: "true" | "false";
119
118
  }
120
119
 
121
- /** One row of the language facet. */
122
- export interface LibraryOption {
123
- value: string;
124
- label: string;
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;
125
137
  }
126
138
 
127
139
  /** Everything the document draws, as one value. */
128
140
  export interface LibraryView {
129
- /** 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. */
130
142
  region: string;
131
- /** The region id on the scroller, which is also the drop zone. */
132
- dropRegion: string;
133
143
  view: LibraryViewKind;
134
- 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;
135
160
  layouts: LibraryChip[];
136
161
  /**
137
162
  * Whether the language facet is drawn at all.
@@ -140,17 +165,15 @@ export interface LibraryView {
140
165
  * chrome that says nothing.
141
166
  */
142
167
  localeState: "hidden" | "shown";
143
- localeOptions: LibraryOption[];
168
+ localeOptions: SurfaceOption[];
144
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;
145
174
  query: string;
146
- /** Where an upload lands, as the label's tooltip says it — before the files are chosen. */
147
- uploadHint: string;
148
- /** The picker's `accept`, from the media registry. */
149
- uploadAccept: string;
150
175
  bannerState: "hidden" | "shown";
151
176
  bannerText: string;
152
- /** `"true"` while a drag is over the body. A state the host holds, not a class a handler adds. */
153
- dropActive: "true" | "false";
154
177
  /** The `nomatch` sentence, naming the filters that produced it. */
155
178
  emptyMessage: string;
156
179
  /** The second line of `incomplete` and `nomatch`. */
@@ -167,28 +190,25 @@ export interface LibraryView {
167
190
  truncatedState: "hidden" | "shown";
168
191
  }
169
192
 
170
- /** 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. */
171
194
  export interface LibraryActions {
172
- setCategory: (key: string) => void;
173
195
  setLayout: (key: string) => void;
174
196
  setLocale: (value: string) => void;
197
+ setFilter: (value: string) => void;
175
198
  search: (value: string) => void;
176
199
  openFile: (path: string) => void;
177
200
  /** Right-click on a row, at the pointer. */
178
201
  contextMenu: (path: string, x: number, y: number) => void;
179
- /** The New menu opens under its own button. */
180
- openNewMenu: (opener: HTMLElement) => void;
181
- /**
182
- * A file picker settled.
183
- *
184
- * The ELEMENT rather than its list, because a file input that is not cleared refuses the same
185
- * file twice — and the picker is the surface's own control, so the host is the one that clears
186
- * it.
187
- */
188
- upload: (input: HTMLInputElement) => void;
189
- dragOver: () => void;
190
- dragOut: () => void;
191
- 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;
192
212
  scrolled: () => void;
193
213
  retry: () => void;
194
214
  reset: () => void;
@@ -211,24 +231,29 @@ export interface LibrarySurfaceHandle {
211
231
  }
212
232
 
213
233
  /** The scope the document reads: {@link LibraryView} plus the actions its controls call. */
214
- interface LibraryScope extends Record<string, unknown>, LibraryView, LibraryActions {}
234
+ interface LibraryScope extends LibraryView, LibraryActions {}
215
235
 
216
236
  /** Write a projection into the scope. */
217
237
  function project(scope: LibraryScope, view: LibraryView): void {
218
238
  scope.region = view.region;
219
- scope.dropRegion = view.dropRegion;
220
239
  scope.view = view.view;
221
- 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;
222
247
  scope.layouts = view.layouts;
248
+ scope.filterState = view.filterState;
249
+ scope.filterOptions = view.filterOptions;
250
+ scope.filterValue = view.filterValue;
223
251
  scope.localeState = view.localeState;
224
252
  scope.localeOptions = view.localeOptions;
225
253
  scope.localeValue = view.localeValue;
226
254
  scope.query = view.query;
227
- scope.uploadHint = view.uploadHint;
228
- scope.uploadAccept = view.uploadAccept;
229
255
  scope.bannerState = view.bannerState;
230
256
  scope.bannerText = view.bannerText;
231
- scope.dropActive = view.dropActive;
232
257
  scope.emptyMessage = view.emptyMessage;
233
258
  scope.emptyDetail = view.emptyDetail;
234
259
  scope.pad = view.pad;
@@ -243,19 +268,20 @@ function project(scope: LibraryScope, view: LibraryView): void {
243
268
 
244
269
  /** The `part` a node's definition carries, or "" for a text node or an unmarked element. */
245
270
  function partOf(def: JxElement | string): string {
246
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
247
- return typeof part === "string" ? part : "";
271
+ const part = isString(def) ? undefined : def.attributes?.["part"];
272
+ return isString(part) ? part : "";
248
273
  }
249
274
 
250
275
  /** The path of the mapped row a node was rendered inside, or "" when it was not in one. */
251
276
  function rowPath(state: JxScope | undefined): string {
252
- const map = state?.["$map"] as { item?: { path?: unknown } } | undefined;
253
- const path = map?.item?.path;
254
- return typeof path === "string" ? path : "";
277
+ const map = state?.["$map"];
278
+ const item = isJsonObject(map) ? map["item"] : undefined;
279
+ const path = isJsonObject(item) ? item["path"] : undefined;
280
+ return isString(path) ? path : "";
255
281
  }
256
282
 
257
283
  /**
258
- * Mount the Library document into `host`, wired to `actions`.
284
+ * Mount the Content home document into `host`, wired to `actions`.
259
285
  *
260
286
  * @param {HTMLElement} host - The pane's canvas stage
261
287
  * @param {LibraryView} view - What to draw right now
@@ -272,26 +298,30 @@ export function mountLibrarySurface(
272
298
  // Than the browser's broken-image glyph.
273
299
  const listening = new AbortController();
274
300
  placeholderBrokenImages(host, listening.signal);
275
- const scope = reactive<LibraryScope>({
301
+ const scope: LibraryScope = reactive<LibraryScope>({
302
+ addPage: actions.addPage,
276
303
  bannerState: "hidden",
277
304
  bannerText: "",
278
- categories: [],
279
305
  columns: [],
280
306
  contextMenu: actions.contextMenu,
281
- dragOut: actions.dragOut,
282
- dragOver: actions.dragOver,
283
- drop: actions.drop,
284
- dropActive: "false",
285
- dropRegion: "",
307
+ designPage: actions.designPage,
286
308
  emptyDetail: "",
287
309
  emptyMessage: "",
310
+ fieldsState: "hidden",
288
311
  groups: [],
289
312
  layouts: [],
313
+ filterOptions: [],
314
+ filterState: "hidden",
315
+ filterValue: "",
290
316
  localeOptions: [],
291
317
  localeState: "hidden",
292
318
  localeValue: "",
319
+ newLabel: "",
320
+ newState: "hidden",
321
+ openFields: actions.openFields,
322
+ openGrid: actions.openGrid,
293
323
  openFile: actions.openFile,
294
- openNewMenu: actions.openNewMenu,
324
+ openNew: actions.openNew,
295
325
  pad: "",
296
326
  padBottom: "",
297
327
  padTop: "",
@@ -300,20 +330,21 @@ export function mountLibrarySurface(
300
330
  region: "",
301
331
  reset: actions.reset,
302
332
  retry: actions.retry,
333
+ page: { designLabel: "", pattern: "", state: "hidden", template: "", text: "" },
303
334
  rows: [],
304
335
  scrolled: actions.scrolled,
305
336
  scroller: actions.scroller,
306
337
  search: actions.search,
307
- setCategory: actions.setCategory,
338
+ searchLabel: "",
308
339
  setLayout: actions.setLayout,
340
+ setFilter: actions.setFilter,
309
341
  setLocale: actions.setLocale,
342
+ subtitle: "",
343
+ title: "",
310
344
  truncated: "",
311
345
  truncatedState: "hidden",
312
- upload: actions.upload,
313
- uploadAccept: "",
314
- uploadHint: "",
315
346
  view: "loading",
316
- }) as LibraryScope;
347
+ });
317
348
  project(scope, view);
318
349
 
319
350
  let mounted: SurfaceHandle | null = null;
@@ -340,12 +371,15 @@ export function mountLibrarySurface(
340
371
  }
341
372
  },
342
373
  }).then((surface) => {
374
+ /* SAFETY: `library-pane.json`'s root definition is a `div` element, so the runtime mounts an
375
+ HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
376
+ const root = surface.root as HTMLElement;
343
377
  if (disposed) {
344
378
  surface.dispose();
345
- return surface.root as HTMLElement;
379
+ return root;
346
380
  }
347
381
  mounted = surface;
348
- return surface.root as HTMLElement;
382
+ return root;
349
383
  });
350
384
 
351
385
  return {
@@ -21,20 +21,15 @@
21
21
  * @docs studio/logic/events
22
22
  */
23
23
 
24
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
24
25
  import { reactive } from "../reactivity";
25
26
  import { mountSurface, registerSurface } from "../ui/surface";
26
27
  import logicPanelDoc from "./logic-panel.json";
27
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
28
+ import type { JxElement } from "@jxsuite/schema/types";
28
29
  import type { JxScope } from "@jxsuite/runtime/types";
29
- import type { SurfaceHandle } from "../ui/surface";
30
+ import type { SurfaceAction, SurfaceHandle, SurfaceOption } from "../ui/surface";
30
31
 
31
- registerSurface("logic-panel", logicPanelDoc as unknown as JxDocument);
32
-
33
- /** A closed list of choices, in the shape the kit's select reads. */
34
- export interface LogicOption {
35
- value: string;
36
- label: string;
37
- }
32
+ registerSurface("logic-panel", logicPanelDoc);
38
33
 
39
34
  /** Which control a bindable row draws. The flow picks it; the document switches on it. */
40
35
  export type LogicFieldKind = "control" | "text" | "select";
@@ -55,7 +50,7 @@ export interface LogicFieldView {
55
50
  /** What a `text` or `select` control holds. Empty for a control host. */
56
51
  value: string;
57
52
  placeholder: string;
58
- options: LogicOption[];
53
+ options: SurfaceOption[];
59
54
  /** Draw the text control monospaced — a pointer or a template string. */
60
55
  mono: boolean;
61
56
  /** The rung's own id, for `data-source`. */
@@ -131,7 +126,7 @@ export interface LogicBindingView {
131
126
  /** The code body's text. Empty for every other body. */
132
127
  code: string;
133
128
  refValue: string;
134
- refOptions: LogicOption[];
129
+ refOptions: SurfaceOption[];
135
130
  /** The escape hatch's accessible name — the code editor, or the formula workspace. */
136
131
  openTitle: string;
137
132
  }
@@ -149,12 +144,6 @@ export interface LogicKvView {
149
144
  tags: string;
150
145
  }
151
146
 
152
- /** One button of an empty state — an id the flow knows, and the words on it. */
153
- export interface LogicEmptyAction {
154
- id: string;
155
- label: string;
156
- }
157
-
158
147
  /** Everything the Logic tab shows, already decided. */
159
148
  export interface LogicView {
160
149
  /** `empty` or `ready` — no document, no selection and a stale one are all the first. */
@@ -164,7 +153,7 @@ export interface LogicView {
164
153
  * What the reader can do about it. An empty state that teaches nothing offers none
165
154
  * (studio-ui-guidelines.md §11.1).
166
155
  */
167
- emptyActions: LogicEmptyAction[];
156
+ emptyActions: SurfaceAction[];
168
157
  hasEmptyActions: boolean;
169
158
 
170
159
  hasRepeater: boolean;
@@ -233,7 +222,7 @@ export interface LogicIslands {
233
222
  statementsSlot: (key: string, host: HTMLElement) => void;
234
223
  }
235
224
 
236
- interface LogicScope extends Record<string, unknown>, LogicView, LogicActions {}
225
+ interface LogicScope extends LogicView, LogicActions {}
237
226
 
238
227
  export interface LogicSurface {
239
228
  /** Re-project. The document's bindings skip every value that did not move. */
@@ -279,23 +268,21 @@ export function emptyLogicView(): LogicView {
279
268
 
280
269
  /** Assign the projection field by field: the runtime writes only the bindings that moved. */
281
270
  function project(scope: LogicScope, view: LogicView): void {
282
- for (const [key, value] of Object.entries(view)) {
283
- (scope as Record<string, unknown>)[key] = value;
284
- }
271
+ Object.assign(scope, view);
285
272
  }
286
273
 
287
274
  /** The `part` a node was rendered with, or "". */
288
275
  function partOf(def: JxElement | string): string {
289
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
290
- return typeof part === "string" ? part : "";
276
+ const part = isString(def) ? undefined : def.attributes?.["part"];
277
+ return isString(part) ? part : "";
291
278
  }
292
279
 
293
280
  /** The `key` of the `$map` item a node was rendered inside, or "". */
294
281
  function itemKey(state: JxScope | undefined): string {
295
- const item = (state?.["$map"] as { item?: unknown } | undefined)?.item;
296
- const key =
297
- item !== null && typeof item === "object" ? (item as Record<string, unknown>).key : "";
298
- return typeof key === "string" ? key : "";
282
+ const map = state?.["$map"];
283
+ const item = isJsonObject(map) ? map["item"] : undefined;
284
+ const key = isJsonObject(item) ? item["key"] : "";
285
+ return isString(key) ? key : "";
299
286
  }
300
287
 
301
288
  /**
@@ -316,10 +303,10 @@ export function mountLogicSurface(
316
303
  actions: LogicActions,
317
304
  islands: LogicIslands,
318
305
  ): LogicSurface {
319
- const scope = reactive<LogicScope>({
306
+ const scope: LogicScope = reactive<LogicScope>({
320
307
  ...emptyLogicView(),
321
308
  ...actions,
322
- } as LogicScope) as LogicScope;
309
+ });
323
310
  project(scope, view);
324
311
 
325
312
  let mounted: SurfaceHandle | null = null;
@@ -29,14 +29,15 @@
29
29
  * @docs studio/logic/formula-workspace
30
30
  */
31
31
 
32
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
32
33
  import { reactive } from "../reactivity";
33
34
  import { mountSurface, registerSurface } from "../ui/surface";
34
35
  import logicWorkspaceDoc from "./logic-workspace.json";
35
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
36
+ import type { JxElement } from "@jxsuite/schema/types";
36
37
  import type { JxScope } from "@jxsuite/runtime/types";
37
38
  import type { SurfaceHandle } from "../ui/surface";
38
39
 
39
- registerSurface("logic-workspace", logicWorkspaceDoc as unknown as JxDocument);
40
+ registerSurface("logic-workspace", logicWorkspaceDoc);
40
41
 
41
42
  /** One chip of the pipeline, as the document draws it. */
42
43
  export interface LogicChipView {
@@ -112,8 +113,7 @@ export interface LogicWorkspaceIslands {
112
113
  treeSlot: (key: string, host: HTMLElement) => void;
113
114
  }
114
115
 
115
- interface LogicWorkspaceScope
116
- extends Record<string, unknown>, LogicWorkspaceView, LogicWorkspaceActions {}
116
+ interface LogicWorkspaceScope extends LogicWorkspaceView, LogicWorkspaceActions {}
117
117
 
118
118
  export interface LogicWorkspaceSurface {
119
119
  /** Re-project. The document's bindings skip every value that did not move. */
@@ -151,23 +151,21 @@ export function emptyLogicWorkspaceView(): LogicWorkspaceView {
151
151
 
152
152
  /** Assign the projection field by field: the runtime writes only the bindings that moved. */
153
153
  function project(scope: LogicWorkspaceScope, view: LogicWorkspaceView): void {
154
- for (const [key, value] of Object.entries(view)) {
155
- (scope as Record<string, unknown>)[key] = value;
156
- }
154
+ Object.assign(scope, view);
157
155
  }
158
156
 
159
157
  /** The `part` a node was rendered with, or "". */
160
158
  function partOf(def: JxElement | string): string {
161
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
162
- return typeof part === "string" ? part : "";
159
+ const part = isString(def) ? undefined : def.attributes?.["part"];
160
+ return isString(part) ? part : "";
163
161
  }
164
162
 
165
163
  /** The `key` of the `$map` item a node was rendered inside, or "". */
166
164
  function itemKey(state: JxScope | undefined): string {
167
- const item = (state?.["$map"] as { item?: unknown } | undefined)?.item;
168
- const key =
169
- item !== null && typeof item === "object" ? (item as Record<string, unknown>).key : "";
170
- return typeof key === "string" ? key : "";
165
+ const map = state?.["$map"];
166
+ const item = isJsonObject(map) ? map["item"] : undefined;
167
+ const key = isJsonObject(item) ? item["key"] : "";
168
+ return isString(key) ? key : "";
171
169
  }
172
170
 
173
171
  /**
@@ -187,10 +185,10 @@ export function mountLogicWorkspace(
187
185
  actions: LogicWorkspaceActions,
188
186
  islands: LogicWorkspaceIslands,
189
187
  ): LogicWorkspaceSurface {
190
- const scope = reactive<LogicWorkspaceScope>({
188
+ const scope: LogicWorkspaceScope = reactive<LogicWorkspaceScope>({
191
189
  ...emptyLogicWorkspaceView(),
192
190
  ...actions,
193
- } as LogicWorkspaceScope) as LogicWorkspaceScope;
191
+ });
194
192
  project(scope, view);
195
193
 
196
194
  let mounted: SurfaceHandle | null = null;
@@ -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
  }