@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
@@ -39,9 +39,13 @@ import type { TransactionRecord } from "../tabs/patch-ops";
39
39
  import type { Tab } from "../tabs/tab";
40
40
  import type { JxDocOp } from "@jxsuite/schema/doc-ops";
41
41
  import type { CollabHandle } from "@jxsuite/collab/provider";
42
- import type { JxMutableNode } from "@jxsuite/schema/types";
42
+ import type { JxDocumentValue, JxMutableNode, JxPath } from "@jxsuite/schema/types";
43
43
  import type * as CollabNS from "@jxsuite/collab";
44
+ import type { CollabAwarenessState } from "@jxsuite/collab/awareness-types";
45
+ import type { DocumentRecord } from "@jxsuite/collab/schema";
46
+ import type * as Y from "yjs";
44
47
  import { collabState, registerCollabPath, unregisterCollabPath } from "./collab-state";
48
+ import type { PeerPresence } from "./collab-state";
45
49
  import { notify } from "../services/notify";
46
50
 
47
51
  type CollabModule = typeof CollabNS;
@@ -89,7 +93,7 @@ export function configureCollabSerializer(fn: ((tab: Tab) => Promise<string>) |
89
93
  export type CollabParser = (
90
94
  tab: Tab,
91
95
  text: string,
92
- ) => Promise<{ document: JxMutableNode; frontmatter?: Record<string, unknown> }>;
96
+ ) => Promise<{ document: JxMutableNode; frontmatter?: DocumentRecord }>;
93
97
 
94
98
  let _parse: CollabParser | null = null;
95
99
 
@@ -158,11 +162,43 @@ interface TabRuntime {
158
162
  optedOut: { value: boolean };
159
163
  }
160
164
 
165
+ /**
166
+ * What a session's undo manager hands its stack listeners. A stack item's `meta` is Yjs's scratch
167
+ * map for whoever owns the manager, and the two listeners in createSession are its only users: the
168
+ * one key they write is the selection snapshot.
169
+ */
170
+ interface StackItemEvent {
171
+ stackItem: { meta: Map<"selection", JxPath[]> };
172
+ }
173
+
161
174
  const runtimes = new WeakMap<Tab, TabRuntime>();
162
175
 
163
176
  /** Callers hold either the raw tab or a reactive proxy of it; key runtimes by the raw object. */
164
177
  function rawTab(tab: Tab): Tab {
165
- return toRaw(tab as unknown as object) as Tab;
178
+ return toRaw(tab);
179
+ }
180
+
181
+ /**
182
+ * The document's shared frontmatter map, at the value type its writers keep.
183
+ *
184
+ * `frontmatterMap` hands back an untyped `Y.Map`, but only three writers ever touch it: the first
185
+ * client's `seedStructure` (a {@link DocumentRecord}) and the two mirrors in this module, which copy
186
+ * entries of a {@link DocumentRecord}. A key a parser left cleared may hold `undefined`, as
187
+ * DocumentRecord itself allows.
188
+ */
189
+ function sharedFrontmatterOf(collab: CollabModule, doc: Y.Doc): Y.Map<JxDocumentValue | undefined> {
190
+ // SAFETY: every write to this map is a DocumentRecord entry (see the doc comment above).
191
+ return collab.frontmatterMap(doc) as Y.Map<JxDocumentValue | undefined>;
192
+ }
193
+
194
+ /**
195
+ * Whether the session is still synced, read fresh.
196
+ *
197
+ * A detach flips `synced` while an awaited parse or serialization is in flight; the narrowing
198
+ * TypeScript carries over from a check made before the `await` cannot see that.
199
+ */
200
+ function stillSynced(session: ActiveSession): boolean {
201
+ return session.synced;
166
202
  }
167
203
 
168
204
  function runtimeOf(tab: Tab): TabRuntime | undefined {
@@ -238,7 +274,7 @@ function onTransact(tab: Tab, record: TransactionRecord, origin: TransactOrigin)
238
274
  if (!session || !session.synced) {
239
275
  return;
240
276
  }
241
- session.lastSeenRef = toRaw(tab.doc.document) as object;
277
+ session.lastSeenRef = toRaw(tab.doc.document);
242
278
  if (origin === "remote") {
243
279
  // The reconciler keeps source text fresh regardless of WHO edited the structure. The tab's
244
280
  // Dirty state is driven by the server's room-level `doc-dirty` broadcast (see onDirty in
@@ -307,7 +343,7 @@ function publishRecord(session: ActiveSession, record: TransactionRecord): void
307
343
  function publishDiff(session: ActiveSession): void {
308
344
  const { collab, handle, tab } = session;
309
345
  const before = collab.yDocToJson(handle.doc);
310
- const after = jsonClone(toRaw(tab.doc.document)) as JxMutableNode;
346
+ const after = jsonClone(toRaw(tab.doc.document));
311
347
  const ops = collab.diffDocs(before, after);
312
348
  if (ops === null) {
313
349
  collab.replaceYStructure(handle.doc, after, collab.LOCAL_ORIGIN);
@@ -326,7 +362,7 @@ function reconcileTabFromY(session: ActiveSession): void {
326
362
  transactDoc(
327
363
  session.tab,
328
364
  (t) => {
329
- const target = t.doc.document as Record<string, unknown>;
365
+ const target = t.doc.document;
330
366
  for (const key of Object.keys(target)) {
331
367
  if (!(key in next)) {
332
368
  delete target[key];
@@ -348,7 +384,7 @@ function isReconciler(session: ActiveSession): boolean {
348
384
  const { awareness } = session.handle;
349
385
  let lowest = awareness.clientID;
350
386
  for (const [clientId, state] of awareness.getStates()) {
351
- if ((state as { canWrite?: boolean }).canWrite !== false && clientId < lowest) {
387
+ if (state["canWrite"] !== false && clientId < lowest) {
352
388
  lowest = clientId;
353
389
  }
354
390
  }
@@ -416,7 +452,7 @@ async function sourceParseNow(session: ActiveSession): Promise<void> {
416
452
  // Unparseable source: keep the last good structure (the preview goes stale, not wrong).
417
453
  return;
418
454
  }
419
- if (!session.synced || collab.canonicalRevOf(handle.doc) !== rev) {
455
+ if (!stillSynced(session) || collab.canonicalRevOf(handle.doc) !== rev) {
420
456
  // The lock flipped while parsing; this mirror was computed against a dead representation.
421
457
  return;
422
458
  }
@@ -430,7 +466,7 @@ async function sourceParseNow(session: ActiveSession): Promise<void> {
430
466
  collab.replaceYStructure(handle.doc, parsed.document, collab.MIRROR_ORIGIN);
431
467
  }
432
468
  }
433
- const frontmatter = collab.frontmatterMap(handle.doc);
469
+ const frontmatter = sharedFrontmatterOf(collab, handle.doc);
434
470
  const next = parsed.frontmatter ?? {};
435
471
  handle.doc.transact(() => {
436
472
  // Detached copy: keys are deleted while iterating.
@@ -541,12 +577,7 @@ export function collabSourceContext(tab: Tab): {
541
577
  reason: a client that cannot write cannot be the one holding a write. */
542
578
  const others = collab
543
579
  .otherSourceEditors(handle.awareness, session.path, handle.awareness.clientID)
544
- .filter((clientId) => {
545
- const peer = handle.awareness.getStates().get(clientId) as
546
- | { canWrite?: boolean }
547
- | undefined;
548
- return peer?.canWrite !== false;
549
- });
580
+ .filter((clientId) => handle.awareness.getStates().get(clientId)?.["canWrite"] !== false);
550
581
  if (others.length === 0) {
551
582
  // Freshen the structure mirror once more, then hand the lock back.
552
583
  void sourceParseNow(session).then(() => {
@@ -729,16 +760,15 @@ async function attachSession(tab: Tab): Promise<void> {
729
760
  handle.destroy();
730
761
  return;
731
762
  }
732
- let timer: ReturnType<typeof setTimeout> | null = null;
763
+ // Assigned synchronously: a Promise executor runs before its constructor returns.
764
+ let timer: ReturnType<typeof setTimeout> | undefined;
733
765
  const timeout = new Promise<never>((_, reject) => {
734
766
  timer = setTimeout(() => reject(new Error("collab-sync-timeout")), SYNC_TIMEOUT_MS);
735
767
  });
736
768
  try {
737
769
  await Promise.race([handle.whenSynced, timeout]);
738
770
  } finally {
739
- if (timer) {
740
- clearTimeout(timer);
741
- }
771
+ clearTimeout(timer);
742
772
  }
743
773
  if (runtime.generation !== generation) {
744
774
  handle.destroy();
@@ -804,7 +834,7 @@ function detachSession(tab: Tab): void {
804
834
  // Re-base the op-log history on the current document for solo editing.
805
835
  tab.history.snapshots = [
806
836
  {
807
- document: jsonClone(toRaw(tab.doc.document)) as Record<string, unknown>,
837
+ document: jsonClone(toRaw(tab.doc.document)),
808
838
  selection: cloneSelection(tab.session.selection),
809
839
  },
810
840
  ];
@@ -828,7 +858,7 @@ function createSession(
828
858
  collab,
829
859
  disposers: [],
830
860
  handle,
831
- lastSeenRef: toRaw(tab.doc.document) as object,
861
+ lastSeenRef: toRaw(tab.doc.document),
832
862
  mirrorTimer: null,
833
863
  path,
834
864
  sourceLockOwner: null,
@@ -843,7 +873,7 @@ function createSession(
843
873
  const meta = collab.metaMap(handle.doc);
844
874
  if (meta.get("structureSeeded") === true) {
845
875
  const yJson = collab.yDocToJson(handle.doc);
846
- const tabJson = jsonClone(toRaw(tab.doc.document)) as JxMutableNode;
876
+ const tabJson = jsonClone(toRaw(tab.doc.document));
847
877
  if (!collab.deepEqual(yJson, tabJson)) {
848
878
  const ops = collab.diffDocs(tabJson, yJson);
849
879
  if (ops === null) {
@@ -855,19 +885,21 @@ function createSession(
855
885
  }
856
886
  }
857
887
  session.applyingRemoteFrontmatter = true;
858
- const sharedFrontmatter = collab.frontmatterMap(handle.doc);
888
+ const sharedFrontmatter = sharedFrontmatterOf(collab, handle.doc);
859
889
  for (const [key, value] of sharedFrontmatter.entries()) {
860
- tab.doc.content.frontmatter[key] = value as never;
890
+ tab.doc.content.frontmatter[key] = value;
861
891
  }
862
892
  session.applyingRemoteFrontmatter = false;
863
893
  } else if (session.canWrite) {
864
- collab.seedStructure(handle.doc, jsonClone(toRaw(tab.doc.document)) as JxMutableNode, {
865
- frontmatter: jsonClone(toRaw(tab.doc.content.frontmatter)),
894
+ collab.seedStructure(handle.doc, jsonClone(toRaw(tab.doc.document)), {
895
+ /* SAFETY: frontmatter is parsed YAML/JSON held as plain values, and jsonClone round-trips it
896
+ * through JSON, so every value is JSON data, which JxDocumentValue includes. */
897
+ frontmatter: jsonClone(toRaw(tab.doc.content.frontmatter)) as DocumentRecord,
866
898
  origin: collab.SEED_ORIGIN,
867
899
  sourceFormat: tab.doc.sourceFormat,
868
900
  });
869
901
  }
870
- session.lastSeenRef = toRaw(tab.doc.document) as object;
902
+ session.lastSeenRef = toRaw(tab.doc.document);
871
903
 
872
904
  // The server owns the room-level unsaved state: `onDirty` fires synchronously with the current
873
905
  // Value on subscribe (delivered during the open handshake), so attaching to a clean room clears
@@ -902,11 +934,11 @@ function createSession(
902
934
  { trackedOrigins: new Set([collab.LOCAL_ORIGIN]) },
903
935
  );
904
936
  session.undoManager = undoManager;
905
- const onStackAdd = ({ stackItem }: { stackItem: { meta: Map<unknown, unknown> } }) => {
937
+ const onStackAdd = ({ stackItem }: StackItemEvent) => {
906
938
  stackItem.meta.set("selection", cloneSelection(tab.session.selection));
907
939
  };
908
- const onStackPop = ({ stackItem }: { stackItem: { meta: Map<unknown, unknown> } }) => {
909
- const selection = stackItem.meta.get("selection") as (string | number)[][] | undefined;
940
+ const onStackPop = ({ stackItem }: StackItemEvent) => {
941
+ const selection = stackItem.meta.get("selection");
910
942
  tab.session.selection = cloneSelection(selection ?? []);
911
943
  };
912
944
  undoManager.on("stack-item-added", onStackAdd);
@@ -928,11 +960,14 @@ function createSession(
928
960
 
929
961
  // Inbound: remote structure transactions → JxDocOps → the surgical pipeline.
930
962
  const structure = collab.structureMap(handle.doc);
931
- const structureObserver = (events: unknown, transaction: { origin: unknown }) => {
963
+ const structureObserver = (
964
+ events: Y.YEvent<Y.AbstractType<unknown>>[],
965
+ transaction: { origin: unknown },
966
+ ) => {
932
967
  if (transaction.origin === collab.LOCAL_ORIGIN || !session.synced) {
933
968
  return;
934
969
  }
935
- const ops = collab.yEventsToDocOps(events as never);
970
+ const ops = collab.yEventsToDocOps(events);
936
971
  if (ops === null) {
937
972
  reconcileTabFromY(session);
938
973
  return;
@@ -963,7 +998,7 @@ function createSession(
963
998
  // The source reconciler (lowest write clientID in source mode) parses Y.Text back into the
964
999
  // Structure tree on a debounce, so every client's canvas previews source edits live.
965
1000
  const source = collab.sourceText(handle.doc);
966
- const sourceObserver = (_event: unknown, transaction: { origin: unknown }) => {
1001
+ const sourceObserver = (_event: Y.YTextEvent, transaction: { origin: unknown }) => {
967
1002
  if (transaction.origin === collab.MIRROR_ORIGIN || !session.synced) {
968
1003
  return;
969
1004
  }
@@ -981,13 +1016,13 @@ function createSession(
981
1016
  void sourceParseNow(session);
982
1017
  }, 600);
983
1018
  };
984
- source.observe(sourceObserver as never);
985
- session.disposers.push(() => source.unobserve(sourceObserver as never));
1019
+ source.observe(sourceObserver);
1020
+ session.disposers.push(() => source.unobserve(sourceObserver));
986
1021
 
987
1022
  // Inbound frontmatter (per-field).
988
- const frontmatter = collab.frontmatterMap(handle.doc);
1023
+ const frontmatter = sharedFrontmatterOf(collab, handle.doc);
989
1024
  const frontmatterObserver = (
990
- event: { changes: { keys: Map<string, { action: string }> }; target: unknown },
1025
+ event: Y.YMapEvent<JxDocumentValue | undefined>,
991
1026
  transaction: { origin: unknown },
992
1027
  ) => {
993
1028
  if (transaction.origin === collab.LOCAL_ORIGIN || !session.synced) {
@@ -999,15 +1034,15 @@ function createSession(
999
1034
  if (change.action === "delete") {
1000
1035
  delete tab.doc.content.frontmatter[key];
1001
1036
  } else {
1002
- tab.doc.content.frontmatter[key] = frontmatter.get(key) as never;
1037
+ tab.doc.content.frontmatter[key] = frontmatter.get(key);
1003
1038
  }
1004
1039
  }
1005
1040
  } finally {
1006
1041
  session.applyingRemoteFrontmatter = false;
1007
1042
  }
1008
1043
  };
1009
- frontmatter.observe(frontmatterObserver as never);
1010
- session.disposers.push(() => frontmatter.unobserve(frontmatterObserver as never));
1044
+ frontmatter.observe(frontmatterObserver);
1045
+ session.disposers.push(() => frontmatter.unobserve(frontmatterObserver));
1011
1046
 
1012
1047
  // Outbound frontmatter: mutateUpdateFrontmatter bypasses transactDoc, so watch the map deeply.
1013
1048
  tab.scope.run(() => {
@@ -1021,7 +1056,8 @@ function createSession(
1021
1056
  if (session.applyingRemoteFrontmatter || !session.synced || !session.canWrite) {
1022
1057
  return;
1023
1058
  }
1024
- const local = JSON.parse(json) as Record<string, unknown>;
1059
+ // SAFETY: `json` is JSON.stringify of the frontmatter record above, so it parses to one.
1060
+ const local = JSON.parse(json) as DocumentRecord;
1025
1061
  handle.doc.transact(() => {
1026
1062
  // Detached copy: keys are deleted while iterating.
1027
1063
  const sharedKeys = [...frontmatter.keys()];
@@ -1060,13 +1096,13 @@ function createSession(
1060
1096
  // Flush) reconciles by diff. Deferred one microtask so the transact observer marks its own
1061
1097
  // Refs first (the assignment happens mid-transaction, before the observer runs).
1062
1098
  effect(() => {
1063
- const ref = toRaw(tab.doc.document) as object;
1099
+ const ref = toRaw(tab.doc.document);
1064
1100
  queueMicrotask(() => {
1065
1101
  const current = runtimeOf(tab)?.session;
1066
1102
  if (current !== session || !session.synced || !session.canWrite) {
1067
1103
  return;
1068
1104
  }
1069
- const nowRef = toRaw(tab.doc.document) as object;
1105
+ const nowRef = toRaw(tab.doc.document);
1070
1106
  if (nowRef !== ref || nowRef === session.lastSeenRef) {
1071
1107
  return;
1072
1108
  }
@@ -1081,10 +1117,13 @@ function createSession(
1081
1117
  // Presence roster + status.
1082
1118
  const state = collabState(tab);
1083
1119
  const awarenessObserver = () => {
1084
- const peers: { clientId: number; state: never }[] = [];
1120
+ const peers: PeerPresence[] = [];
1085
1121
  for (const [clientId, peerState] of handle.awareness.getStates()) {
1086
1122
  if (clientId !== handle.awareness.clientID && peerState["user"]) {
1087
- peers.push({ clientId, state: peerState as never });
1123
+ /* SAFETY: every Studio client publishes its state through the setLocalState call in
1124
+ * createSession above, which writes a CollabAwarenessState; a state with no `user` (a
1125
+ * client mid-handshake) was skipped by the check above. */
1126
+ peers.push({ clientId, state: peerState as CollabAwarenessState });
1088
1127
  }
1089
1128
  }
1090
1129
  state.peers = peers;
@@ -60,17 +60,18 @@ const attachedPaths = new Map<string, number>();
60
60
  export function collabState(tab: Tab): TabCollabState {
61
61
  // Key on the raw tab: writers (the collab session, via ensureCollab's raw tab) and readers
62
62
  // (toolbar/tab-strip, via reactive `workspace.tabs.get` proxies) must resolve the same entry.
63
- const key = toRaw(tab as unknown as object) as Tab;
63
+ const key = toRaw(tab);
64
64
  let state = states.get(key);
65
65
  if (!state) {
66
- state = reactive({
66
+ const initial: TabCollabState = {
67
67
  active: false,
68
68
  attachError: "",
69
69
  peers: [],
70
70
  readOnly: false,
71
71
  sourceCanonical: false,
72
72
  status: "unavailable",
73
- }) as TabCollabState;
73
+ };
74
+ state = reactive(initial);
74
75
  states.set(key, state);
75
76
  }
76
77
  return state;
@@ -34,6 +34,7 @@ import {
34
34
  createAbsolutePositionFromRelativePosition,
35
35
  createRelativePositionFromTypeIndex,
36
36
  } from "@jxsuite/collab";
37
+ import { isString } from "@jxsuite/schema/guards";
37
38
  import type * as Y from "yjs";
38
39
  import type { editor } from "monaco-editor";
39
40
  import type { AwarenessLike } from "./monaco-cursors";
@@ -43,7 +44,8 @@ import type { AwarenessLike } from "./monaco-cursors";
43
44
  * `./monaco-cursors.ts` already defines for the style manager) plus the one writer it needs.
44
45
  */
45
46
  export interface BindingAwareness extends AwarenessLike {
46
- setLocalStateField: (field: string, value: unknown) => void;
47
+ /** Publishes this client's caret; `selection` is the one field the binding owns. */
48
+ setLocalStateField: (field: "selection", value: RelativeSelection | null) => void;
47
49
  }
48
50
 
49
51
  export interface MonacoYTextBindingOptions {
@@ -60,14 +62,17 @@ export interface MonacoYTextBindingOptions {
60
62
  }
61
63
 
62
64
  /** A caret snapshotted as two positions that survive a concurrent edit. */
63
- interface RelativeSelection {
65
+ export interface RelativeSelection {
64
66
  anchor: Y.RelativePosition;
65
67
  head: Y.RelativePosition;
66
68
  }
67
69
 
68
- /** A peer's published caret, as it arrives over the wire (JSON, hence `unknown` halves). */
70
+ /**
71
+ * A peer's published caret, as it arrives over the wire: the JSON of a {@link RelativeSelection},
72
+ * with every level optional because an older or partial state may omit it.
73
+ */
69
74
  interface PeerSelectionState {
70
- selection?: { anchor?: unknown; head?: unknown } | null;
75
+ selection?: { anchor?: Y.RelativePosition; head?: Y.RelativePosition } | null;
71
76
  }
72
77
 
73
78
  /**
@@ -178,18 +183,16 @@ export function bindMonacoToYText(options: MonacoYTextBindingOptions): () => voi
178
183
  if (clientId === awareness.clientID) {
179
184
  continue;
180
185
  }
186
+ /* SAFETY: `selection` is reserved for this binding (awareness-types.ts), so every writer
187
+ * publishes relativeSelectionOf's RelativeSelection or null. Its JSON round trip keeps the
188
+ * plain fields createAbsolutePositionFromRelativePosition reads, and every level is optional
189
+ * and checked below, so a peer that publishes none is skipped. */
181
190
  const { selection } = (raw ?? {}) as PeerSelectionState;
182
191
  if (!selection?.anchor || !selection.head) {
183
192
  continue;
184
193
  }
185
- const anchor = createAbsolutePositionFromRelativePosition(
186
- selection.anchor as Y.RelativePosition,
187
- doc,
188
- );
189
- const head = createAbsolutePositionFromRelativePosition(
190
- selection.head as Y.RelativePosition,
191
- doc,
192
- );
194
+ const anchor = createAbsolutePositionFromRelativePosition(selection.anchor, doc);
195
+ const head = createAbsolutePositionFromRelativePosition(selection.head, doc);
193
196
  if (!anchor || !head || anchor.type !== text || head.type !== text) {
194
197
  continue;
195
198
  }
@@ -289,7 +292,7 @@ export function bindMonacoToYText(options: MonacoYTextBindingOptions): () => voi
289
292
  embeds (`insert` is then an object or another type), and a Monaco buffer has nowhere to
290
293
  put one — upstream cast the field to string and produced `"[object Object]"` in the
291
294
  document. The same clause catches an op carrying none of the three fields. */
292
- if (typeof op.insert !== "string") {
295
+ if (!isString(op.insert)) {
293
296
  throw new TypeError(
294
297
  "bindMonacoToYText: unsupported Y.Text delta op — a text buffer can only apply " +
295
298
  "string inserts",
@@ -14,7 +14,7 @@ export interface AwarenessLike {
14
14
  off: (event: "change", cb: () => void) => void;
15
15
  }
16
16
 
17
- interface PeerStateShape {
17
+ interface PeerPresence {
18
18
  user?: { color?: string; name?: string; login?: string };
19
19
  }
20
20
 
@@ -40,7 +40,10 @@ export function cursorStylesheet(awareness: AwarenessLike): string {
40
40
  if (clientId === awareness.clientID) {
41
41
  continue;
42
42
  }
43
- const { user } = raw as PeerStateShape;
43
+ /* SAFETY: y-protocols keeps only non-null state objects in getStates() (a peer clearing its
44
+ * state removes the entry), and every member of PeerPresence is optional and read through
45
+ * optional chaining below, so a peer that publishes no `user` is skipped, not misread. */
46
+ const { user } = raw as PeerPresence;
44
47
  if (!user?.color) {
45
48
  continue;
46
49
  }
@@ -54,12 +54,14 @@ import { collabCommands } from "../collab/collab-commands";
54
54
  import { assistantCommands } from "../panels/ai-panel";
55
55
  import { preferencesCommands } from "../settings/preferences-dialog";
56
56
  import { aboutCommands } from "../about/about-modal";
57
- import { libraryCommands } from "../browse/library-commands";
58
- import { sourceControlCommands } from "../panels/git-panel";
57
+ import { contentViewCommands } from "../browse/library-commands";
58
+ import { sourceControlCommands } from "../publish/source-control";
59
59
  import { publishCommands } from "../publish/publish-commands";
60
60
  import { gridViewCommands } from "../grid/grid-panel";
61
61
  import { redirectsCommands } from "../grid/redirects-grid";
62
62
  import { contentCommands } from "../content/entry-commands";
63
+ import { addNewCommands } from "../create/add-new-commands";
64
+ import { mediaCommands } from "../media/media-commands";
63
65
  import { i18nCommands } from "../i18n/i18n-commands";
64
66
  import { newProjectCommands } from "../new-project/new-project-modal";
65
67
  import { canvasCommands } from "../editor/shortcuts";
@@ -67,6 +69,7 @@ import { formatCommands, registerSelectionCommands } from "../panels/block-actio
67
69
  import { fileFormatCommands } from "../format/convert-file";
68
70
  import { registerTabCommands } from "../workspace/workspace";
69
71
  import { derivationCommands, noopDerivationDeps } from "../workspace/pane-derive";
72
+ import { workspaceBackCommands } from "../workspace/workspace-back";
70
73
  import type { AnyCommand } from "./registry";
71
74
 
72
75
  /** A verb set that does nothing — the checks read declarations, never behaviour. */
@@ -111,13 +114,15 @@ function viaRegistration(): AnyCommand[] {
111
114
  */
112
115
  export function appCommandSet(): AnyCommand[] {
113
116
  return [
114
- // The panel roster is the one dependency the checks must supply for real: the ⌘1–8 records are
115
- // Generated from it, so an empty one would hide eight commands (and their chords) from the
116
- // Level check, the chrome budget and the generated keyboard sheet alike.
117
+ // The panel roster is the one dependency the checks must supply for real: the `panel.focus.*`
118
+ // Records are generated from it, so an empty one would hide a command per panel from the level
119
+ // Check, the chrome budget and the generated command sheet alike.
117
120
  ...defaultCommands({ ...noopCommandDeps(), panelRoster: panelFocusRoster() }),
118
121
  ...viaRegistration(),
119
122
  ...derivationCommands(noopDerivationDeps()),
120
123
  ...shellViewCommands({ inspectorTab: () => DEFAULT_INSPECTOR_TAB, setInspectorTab: NO_OP }),
124
+ // Back to a strip-less workspace's home: the pane context bar's Back control, and Escape.
125
+ ...workspaceBackCommands({ closeTab: NO_OP, setCanvasMode: NO_OP }),
121
126
  ...canvasViewCommands({
122
127
  getCanvasMode: () => "design",
123
128
  renderPane: NO_OP,
@@ -150,8 +155,13 @@ export function appCommandSet(): AnyCommand[] {
150
155
  ...assistantCommands(),
151
156
  ...preferencesCommands(),
152
157
  ...aboutCommands(),
153
- ...libraryCommands(),
158
+ // The Content home's verbs: which collection it shows, and that collection's own view.
159
+ ...contentViewCommands(),
154
160
  ...contentCommands(),
161
+ // Add new (`file.new`): the one creation dialog, and its no-dialog form for a named kind.
162
+ ...addNewCommands(),
163
+ // The Media workspace's four verbs: browse, upload, replace and delete (studio.md §22.6).
164
+ ...mediaCommands(),
155
165
  // The four translation verbs. `i18n.switchLocale` is deliberately not among them: it is a
156
166
  // Rendering context, defined in `canvas/canvas-utils.ts` beside the per-tab UI state it writes.
157
167
  ...i18nCommands(),
@@ -15,8 +15,8 @@
15
15
  * region table, because `registerPanel()` did not exist. It does now, so the two `rail/*` rows are
16
16
  * a QUERY over `railDeclarations()` ({@link dockTabs}) and adding a ninth rail panel fails this
17
17
  * check without anyone remembering to update a list. The two rows that remain declared are the two
18
- * docks whose tab sets this module cannot see from a bare Bun process: the Inspector's four come
19
- * from `commands/defaults.ts`'s `INSPECTOR_TABS` (a query in all but name), and the Bottom dock's
18
+ * docks whose tab sets this module cannot see from a bare Bun process: the Inspector's three come
19
+ * from `commands/defaults.ts`'s `INSPECTOR_STRIP` (a query in all but name), and the Bottom dock's
20
20
  * four are records in `panels/bottom-dock.ts`, which renders lit templates and therefore cannot be
21
21
  * imported here. `tests/bottom-dock.test.ts` asserts the declared row and the registered set are
22
22
  * the same four titles, so the copy cannot drift — the same bargain `tests/right-panel.test.ts`
@@ -24,7 +24,7 @@
24
24
  * joins them the way it already joins the rail.
25
25
  */
26
26
 
27
- import { INSPECTOR_TABS } from "./defaults";
27
+ import { INSPECTOR_STRIP } from "./defaults";
28
28
 
29
29
  /** The caps. Raising either one is a design decision, so it happens here, in one place. */
30
30
  export const CHROME_BUDGET = {
@@ -65,10 +65,12 @@ export interface DockDeclaration {
65
65
  /**
66
66
  * The tabbed regions that are still WRITTEN DOWN rather than observed.
67
67
  *
68
- * The Inspector's row is a query in all but name — `INSPECTOR_TABS` is the list `right-panel.ts`
69
- * renders and `⌘⇧1–4` address, so a fifth inspector tab fails this check in the commit that adds
70
- * it. The Bottom dock's row is the same shape: the four ids live in `shell.ts`'s `BOTTOM_TAB_IDS`
71
- * (so `view.setBottomTab`'s enum can be read in a bare Bun process) and the four RECORDS live in
68
+ * The Inspector's row is a query in all but name — `INSPECTOR_STRIP` is the strip `right-panel.ts`
69
+ * renders (Page · Element · Assistant), so a fifth strip tab fails this check in the commit that
70
+ * adds it. Element's Content · Style · Logic sub-switch lives inside a tab's body and is not
71
+ * counted: it is three views of one target, not three places (`studio-ui-guidelines.md` §12.2). The
72
+ * Bottom dock's row is the same shape: the four ids live in `shell.ts`'s `BOTTOM_TAB_IDS` (so
73
+ * `view.setBottomTab`'s enum can be read in a bare Bun process) and the four RECORDS live in
72
74
  * `panels/bottom-dock.ts`. It inherited this cap before it existed, which is why Deploy folded into
73
75
  * Activity rather than becoming a fifth tab.
74
76
  *
@@ -78,7 +80,7 @@ export interface DockDeclaration {
78
80
  * those could disagree.
79
81
  */
80
82
  export const DECLARED_DOCK_TABS: readonly DockDeclaration[] = [
81
- { dock: "inspector", tabs: INSPECTOR_TABS.map((tab) => tab.title) },
83
+ { dock: "inspector", tabs: INSPECTOR_STRIP.map((tab) => tab.title) },
82
84
  { dock: "bottom", tabs: ["Problems", "Logic", "Activity"] },
83
85
  ];
84
86
 
@@ -112,9 +114,9 @@ export interface BudgetViolation {
112
114
 
113
115
  /** Commands declaring the primary Command Bar cluster. */
114
116
  export function primaryCommandIds(commands: readonly BudgetableRecord[]): string[] {
115
- return commands
116
- .filter((command) => (command.menus ?? []).includes("commandbar/primary"))
117
- .map((command) => command.id);
117
+ return commands.flatMap((command) =>
118
+ (command.menus ?? []).includes("commandbar/primary") ? [command.id] : [],
119
+ );
118
120
  }
119
121
 
120
122
  /**