@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
@@ -7,21 +7,30 @@
7
7
  */
8
8
 
9
9
  import { projectState, stripEventHandlers } from "../store";
10
- import { displayTagName } from "@jxsuite/schema/guards";
10
+ import {
11
+ displayTagName,
12
+ isJsonObject,
13
+ isMappedArray,
14
+ isNonNullObject,
15
+ isString,
16
+ } from "@jxsuite/schema/guards";
11
17
  import { canvasModeOfTab } from "./canvas-surface";
12
18
  import { toRaw } from "../reactivity";
13
19
  import {
14
20
  distributePageIntoLayout,
15
21
  getEffectiveElements,
16
22
  getEffectiveHead,
23
+ extensionClassPaths,
17
24
  getEffectiveImports,
18
25
  getEffectiveLayoutPath,
19
26
  getEffectiveMedia,
20
27
  resolveLayoutDoc,
21
28
  } from "../site-context";
22
29
  import { documentBase } from "./canvas-origin";
23
- import { getPlatform, hasPlatform } from "../platform";
24
30
  import { componentRegistry, computeRelativePath } from "../files/components";
31
+ import { collectUsedTags } from "@jxsuite/schema/component-meta";
32
+ import { injectContext } from "@jxsuite/site/context";
33
+ import { documentUrlPattern } from "@jxsuite/site/routes";
25
34
  import { prepareForEditMode } from "../utils/edit-display";
26
35
  import {
27
36
  paramBoundStateKeys,
@@ -29,10 +38,23 @@ import {
29
38
  substitutePreviewParams,
30
39
  } from "../page-params";
31
40
  import { isComponentDoc, substitutePreviewProps } from "../component-props";
32
- import { assetContextFor } from "./asset-refs";
41
+ import { assetContextFor, hostAssetDeclarations } from "./asset-refs";
42
+ import { collectionForFile } from "../content/collection-match";
43
+ import { writesEntryOnCanvas } from "../content/content-collections";
44
+ import { collectionPage, entryLayoutPath, entryLocale } from "../content/collection-pages";
45
+ import { pageContextFor } from "./canvas-page-context";
46
+ import { loadExtensions } from "../format/format-host";
47
+ import { bakeRepeaterSources, extensionClassKeys, repeaterSourceKeys } from "./repeater-sources";
33
48
 
34
49
  import type { AssetContext } from "./asset-refs";
35
- import type { JxElement, JxMutableNode, JxPath } from "@jxsuite/schema/types";
50
+ import type {
51
+ JsonValue,
52
+ JxDocument,
53
+ JxElement,
54
+ JxMutableNode,
55
+ JxPath,
56
+ JxStyle,
57
+ } from "@jxsuite/schema/types";
36
58
  import type { ComponentEntry } from "../files/components.js";
37
59
  import type { LayoutMarker } from "./path-mapping";
38
60
  import type { Tab } from "../tabs/tab";
@@ -55,19 +77,20 @@ function findPageContentPrefix(
55
77
  node: JxMutableNode,
56
78
  path: (string | number)[] = [],
57
79
  ): { prefix: (string | number)[]; offset: number } | null {
58
- if (!node || typeof node !== "object") {
80
+ // Document JSON can hold a null or scalar where a node belongs; neither has page content.
81
+ if (!isNonNullObject(node)) {
59
82
  return null;
60
83
  }
61
84
  if (Array.isArray(node.children)) {
62
85
  const firstPageIdx = node.children.findIndex(
63
- (child) => child && typeof child === "object" && !child.$__layout,
86
+ (child) => isNonNullObject(child) && !child.$__layout,
64
87
  );
65
88
  if (firstPageIdx !== -1) {
66
89
  return { offset: firstPageIdx, prefix: [...path, "children"] };
67
90
  }
68
91
  for (let i = 0; i < node.children.length; i++) {
69
92
  const child = node.children[i];
70
- if (child && typeof child === "object" && child.$__layout) {
93
+ if (isNonNullObject(child) && child.$__layout) {
71
94
  const found = findPageContentPrefix(child, [...path, "children", i]);
72
95
  if (found) {
73
96
  return found;
@@ -87,13 +110,14 @@ function findPageContentPrefix(
87
110
  * editor can open the layout with that node selected. See {@link LayoutMarker}.
88
111
  */
89
112
  export function markLayoutNodes(node: JxMutableNode, file: string, path: JxPath = []) {
90
- if (!node || typeof node !== "object") {
113
+ // Layout JSON can hold a null or scalar where a node belongs; there is nothing to mark on it.
114
+ if (!isNonNullObject(node)) {
91
115
  return;
92
116
  }
93
117
  node.$__layout = { file, path } satisfies LayoutMarker;
94
118
  if (Array.isArray(node.children)) {
95
119
  for (const [i, child] of node.children.entries()) {
96
- if (typeof child === "string") {
120
+ if (isString(child)) {
97
121
  continue;
98
122
  }
99
123
  markLayoutNodes(child, file, [...path, "children", i]);
@@ -101,13 +125,125 @@ export function markLayoutNodes(node: JxMutableNode, file: string, path: JxPath
101
125
  }
102
126
  if (Array.isArray(node.$elements)) {
103
127
  for (const [i, el] of node.$elements.entries()) {
104
- if (typeof el !== "string") {
128
+ if (!isString(el)) {
129
+ /* SAFETY: a non-string `$elements` entry is an inline element definition or a `{ $ref }`
130
+ import. markLayoutNodes stamps `$__layout` and walks `children` / `$elements`, which a
131
+ `$ref` entry simply lacks, so it is marked as a childless node. */
105
132
  markLayoutNodes(el as JxMutableNode, file, [...path, "$elements", i]);
106
133
  }
107
134
  }
108
135
  }
109
136
  }
110
137
 
138
+ /**
139
+ * A layout as the canvas wraps a document in it: read, its nodes marked with the file they come
140
+ * from, and itself wrapped in the layout ITS `$layout` names, all the way up.
141
+ *
142
+ * A layout can sit in another layout (`layouts/post.json` → `layouts/base.json`), and the build
143
+ * resolves the whole chain (`@jxsuite/site` `resolveLayout`), so a page drawn in the inner layout
144
+ * alone lost the outer one's nav and footer on the canvas and nowhere else. Each level is merged
145
+ * the way the build merges it, and each node keeps the marker of the file it was authored in, so
146
+ * opening a locked node still opens the layout that holds it. A cycle stops at the first repeat
147
+ * rather than recursing forever, and a parent that cannot be read leaves the chain where it is.
148
+ *
149
+ * @param {string} layoutPath - The `$layout` reference, project-relative as authored
150
+ * @param {Set<string>} [seen] - Files already on the chain
151
+ * @returns {Promise<JxMutableNode | null>} The merged, marked layout, or null when unreadable
152
+ */
153
+ export async function resolveCanvasLayout(
154
+ layoutPath: string,
155
+ seen = new Set<string>(),
156
+ ): Promise<JxMutableNode | null> {
157
+ const file = layoutPath.replace(/^\.\//, "");
158
+ if (seen.has(file)) {
159
+ return null;
160
+ }
161
+ seen.add(file);
162
+ const layoutDoc = await resolveLayoutDoc(layoutPath);
163
+ if (!layoutDoc) {
164
+ return null;
165
+ }
166
+ // The SAME normalization resolveLayoutDoc reads the file with, so the marker's `file` is a path
167
+ // The editor can hand straight to navigateToComponent when the author asks to open it.
168
+ markLayoutNodes(layoutDoc, file);
169
+ const parentRef = layoutDoc.$layout;
170
+ if (!isString(parentRef) || !parentRef) {
171
+ return layoutDoc;
172
+ }
173
+ const parent = await resolveCanvasLayout(parentRef, seen);
174
+ if (!parent) {
175
+ return layoutDoc;
176
+ }
177
+ const merged = distributePageIntoLayout(parent, layoutDoc);
178
+ delete merged.$layout;
179
+ return merged;
180
+ }
181
+
182
+ /**
183
+ * Re-address a layout's `$elements` imports from the layout's file to the document being drawn.
184
+ *
185
+ * A layout's `{ $ref: "../components/site-nav.json" }` is relative to the LAYOUT, but once the
186
+ * layout is merged around a document the canvas resolves every `$ref` against the document's own
187
+ * base. A page in `pages/` sits as deep as `layouts/`, so the two answers agreed by coincidence; an
188
+ * entry in `content/menu/` or a page in `pages/blog/` resolved the same ref to
189
+ * `content/components/…`, which 404s and leaves the nav and footer unregistered. Each entry is
190
+ * re-addressed from the file its `$__layout` marker names, which is the file it was authored in at
191
+ * every level of a layout chain. Bare specifiers and URLs are left alone, and so is an entry with
192
+ * no marker (the document's own).
193
+ *
194
+ * @param {(JxElement | string)[] | undefined} elements - The merged document's `$elements`
195
+ * @param {string} documentPath - The project-relative path of the document being drawn
196
+ */
197
+ export function rebaseLayoutElementRefs(
198
+ elements: readonly (JxElement | string | null)[] | undefined,
199
+ documentPath: string,
200
+ ) {
201
+ for (const el of elements ?? []) {
202
+ if (!isNonNullObject(el) || !isString(el.$ref) || !/^\.\.?\//.test(el.$ref)) {
203
+ continue;
204
+ }
205
+ const marker = el["$__layout"];
206
+ if (!isJsonObject(marker) || !isString(marker.file)) {
207
+ continue;
208
+ }
209
+ const target = new URL(el.$ref, `jx-project:/${marker.file}`).pathname.replace(/^\//, "");
210
+ el.$ref = computeRelativePath(documentPath, target);
211
+ }
212
+ }
213
+
214
+ /**
215
+ * A document's own layout override: its root's `$layout`, or a Markdown document's frontmatter
216
+ * `$layout` (which the build reads, and which the Inspector's Page tab writes); `undefined` when it
217
+ * names none.
218
+ */
219
+ export function pageLayout(doc: JxMutableNode, tab: Tab | null): string | false | undefined {
220
+ if (doc.$layout !== undefined) {
221
+ return doc.$layout;
222
+ }
223
+ const fromFrontmatter = tab?.doc.content.frontmatter.$layout;
224
+ return isString(fromFrontmatter) || fromFrontmatter === false ? fromFrontmatter : undefined;
225
+ }
226
+
227
+ /**
228
+ * The layout a collection entry is drawn in (studio.md §22.5): the entry's own `$layout` (on its
229
+ * document, or in its frontmatter for a Markdown entry, {@link pageLayout}), else its collection's
230
+ * template page's `$layout`, else the project's `defaults.layout`. `null` when none applies.
231
+ *
232
+ * The template PAGE's own body is not spliced around the entry: a page that binds the entry into a
233
+ * wrapper of its own shows that wrapper only in Preview of the page itself, because the edit
234
+ * transforms cannot map the entry's paths through the page's bound node.
235
+ */
236
+ export async function entryLayout(
237
+ doc: JxMutableNode,
238
+ tab: Tab | null,
239
+ path: string | null | undefined,
240
+ ): Promise<string | null> {
241
+ const own = pageLayout(doc, tab);
242
+ const match = path ? collectionForFile(path) : null;
243
+ const page = match ? await collectionPage(match.name, entryLocale(path)) : null;
244
+ return entryLayoutPath(own, page);
245
+ }
246
+
111
247
  /**
112
248
  * Resolve a document into the form the iframe canvas renders: layout-distributed, edit-transformed,
113
249
  * with components/imports/$media/$head merged in, plus the path-mapper context and site style. This
@@ -157,7 +293,7 @@ export async function resolveCanvasDocument(
157
293
  /** How the canvas must address project media, or null when its origin serves the site URL space. */
158
294
  assets: AssetContext | null;
159
295
  mapperCtx: WireMapperCtx;
160
- siteStyle: Record<string, unknown> | null;
296
+ siteStyle: JxStyle | null;
161
297
  }> {
162
298
  const S = { documentPath: tab?.documentPath, mode: tab?.doc.mode };
163
299
  const canvasMode = modeOverride ?? canvasModeOfTab(tab);
@@ -172,24 +308,35 @@ export async function resolveCanvasDocument(
172
308
  S.documentPath &&
173
309
  projectState?.isSiteProject &&
174
310
  (S.documentPath.startsWith("pages/") || S.documentPath.startsWith("./pages/"));
311
+ /* A collection entry written on the canvas is drawn the way a page is: inside a layout, with the
312
+ layout's nodes locked and the entry's own tree the editable region (studio.md §22.5). */
313
+ const isEntry =
314
+ !isPage && Boolean(projectState?.isSiteProject) && writesEntryOnCanvas(S.documentPath);
175
315
  let pageContentPrefix: (string | number)[] | null = null;
176
316
  let pageContentOffset = 0;
177
317
 
178
318
  // Layout wrapping obeys the tab-bar's "show layout elements" toggle (default on); with it off,
179
319
  // The page renders alone — the unwrapped path is identical to a non-layout page.
180
- if (isPage && tab?.session.ui.showLayout !== false) {
181
- const layoutPath = getEffectiveLayoutPath(doc.$layout);
320
+ if ((isPage || isEntry) && tab?.session.ui.showLayout !== false) {
321
+ const layoutPath = isEntry
322
+ ? await entryLayout(doc, tab, S.documentPath)
323
+ : getEffectiveLayoutPath(pageLayout(doc, tab));
182
324
  if (layoutPath) {
183
- const layoutDoc = (await resolveLayoutDoc(layoutPath)) as JxMutableNode | null;
325
+ const layoutDoc = await resolveCanvasLayout(layoutPath);
184
326
  if (layoutDoc) {
185
- // The SAME normalization resolveLayoutDoc reads the file with, so the marker's `file` is a
186
- // Path the editor can hand straight to navigateToComponent when the author asks to open it.
187
- markLayoutNodes(layoutDoc, layoutPath.replace(/^\.\//, ""));
188
327
  const pageForSlots = canvasMode === "preview" ? structuredClone(toRaw(doc)) : renderDoc;
189
328
  const merged = distributePageIntoLayout(layoutDoc, pageForSlots);
190
329
  renderDoc =
191
330
  canvasMode === "preview" ? merged : prepareForEditMode(stripEventHandlers(merged));
192
331
  layoutWrapped = true;
332
+ if (S.documentPath) {
333
+ /* SAFETY: a document's `$elements` entries are tag-name strings, `{ $ref }` imports or
334
+ inline element definitions (a hand-edited null among them is skipped by the walk). */
335
+ rebaseLayoutElementRefs(
336
+ renderDoc.$elements as (JxElement | string | null)[] | undefined,
337
+ S.documentPath,
338
+ );
339
+ }
193
340
  const pageContent = findPageContentPrefix(merged);
194
341
  pageContentPrefix = pageContent?.prefix ?? null;
195
342
  pageContentOffset = pageContent?.offset ?? 0;
@@ -197,6 +344,24 @@ export async function resolveCanvasDocument(
197
344
  }
198
345
  }
199
346
 
347
+ /* `$site` / `$page`, and the project's own state, exactly as the build injects them — a layout
348
+ that binds `${state.$page.url}` (a header marking its current link) threw on the canvas, and in
349
+ Preview, where templates are live, that one TypeError blanked the whole page. Onto COPIES of
350
+ `state` and `imports`: the edit-mode render doc shares both with the tab's source document,
351
+ which must not gain injected keys it would then save. */
352
+ const projectConfig = projectState?.projectConfig;
353
+ if (isPage && projectConfig) {
354
+ renderDoc = { ...renderDoc, state: { ...renderDoc.state } };
355
+ if (renderDoc.imports) {
356
+ renderDoc.imports = { ...renderDoc.imports };
357
+ }
358
+ /* SAFETY: a page render document is a JxDocument in all but its declared (mutable) type;
359
+ `injectContext` writes `state`, `$media` and `imports`, all of which the copy above owns. */
360
+ injectContext(renderDoc as JxDocument, projectConfig, {
361
+ urlPattern: documentUrlPattern(S.documentPath),
362
+ });
363
+ }
364
+
200
365
  const fileBase = documentBase(projectState?.projectRoot);
201
366
  const docBase = S.documentPath ? new URL(S.documentPath, fileBase).href : undefined;
202
367
  /*
@@ -210,10 +375,7 @@ export async function resolveCanvasDocument(
210
375
  * — design and edit swap every bound src for a transparent pixel, so they never reached the
211
376
  * network to fail.
212
377
  */
213
- const assets = assetContextFor(S.documentPath, {
214
- fileBaseUrl: fileBase,
215
- ...(hasPlatform() ? { space: getPlatform().assetSpace } : {}),
216
- });
378
+ const assets = assetContextFor(S.documentPath, hostAssetDeclarations());
217
379
 
218
380
  // Substitute chosen dynamic route params ({$ref: "#/$params/x"} → literal), inject state.$page,
219
381
  // And bake the substituted class-prototype state entries via the backend resolver — in every
@@ -222,15 +384,47 @@ export async function resolveCanvasDocument(
222
384
  // (posted as shadowDoc), whose $refs must survive for editing/serialization.
223
385
  if (isPage && tab) {
224
386
  const { previewParams } = tab.session.ui;
225
- if (previewParams && Object.keys(previewParams).length > 0) {
226
- const boundKeys = paramBoundStateKeys(
227
- (doc as { state?: Record<string, unknown> }).state ?? null,
228
- );
387
+ if (Object.keys(previewParams).length > 0) {
388
+ const boundKeys = paramBoundStateKeys(doc.state ?? null);
229
389
  renderDoc = substitutePreviewParams(renderDoc, previewParams, S.documentPath);
230
390
  await resolveParamBoundState(renderDoc, boundKeys, docBase);
231
391
  }
232
392
  }
233
393
 
394
+ // `$site` and `$page`, as the build injects them (canvas-page-context.ts), in every mode: Preview
395
+ // Draws the page as it ships, and edit mode evaluates a component's bound props live. For a page
396
+ // This refines the pair injected above with the chosen route params and the project's i18n, and
397
+ // It is the only injection a collection entry gets.
398
+ if ((isPage || isEntry) && S.documentPath) {
399
+ const context = await pageContextFor(
400
+ {
401
+ documentPath: S.documentPath,
402
+ fields: isEntry ? (tab?.doc.content.frontmatter ?? null) : null,
403
+ isEntry,
404
+ lang: doc.$lang,
405
+ params: tab?.session.ui.previewParams ?? {},
406
+ title: doc.title,
407
+ },
408
+ projectState?.projectConfig,
409
+ );
410
+ if (context) {
411
+ // A rebuild, not a write: the render doc shares nodes with the tab's source document.
412
+ renderDoc = { ...renderDoc, state: { ...renderDoc.state, ...context } };
413
+ }
414
+ }
415
+
416
+ /* Class-backed state resolved before the render rather than by it (repeater-sources.ts): in every
417
+ mode, an entry naming an enabled extension's class by a bare `$prototype`, as the build
418
+ resolves it; in Edit and Design, also the collections a repeater reads, whose first item draws
419
+ the repeater's template. */
420
+ const extensions = await loadExtensions();
421
+ const classes = extensionClassPaths(extensions);
422
+ const bakeKeys = extensionClassKeys(renderDoc, classes);
423
+ if (canvasMode !== "preview") {
424
+ bakeKeys.push(...repeaterSourceKeys(doc));
425
+ }
426
+ renderDoc = await bakeRepeaterSources(renderDoc, [...new Set(bakeKeys)], docBase, classes);
427
+
234
428
  // Component definition docs (non-page): seed chosen test-prop values into the render doc's state
235
429
  // So a non-instantiated component previews with real data — templates, dataScope snapshots, and
236
430
  // Live/snapshot expression previews all see the values (M6, the previewParams mirror). Pure
@@ -253,30 +447,29 @@ export async function resolveCanvasDocument(
253
447
  const arrayPaths = new Set<string>();
254
448
  if (canvasMode !== "preview") {
255
449
  (function findArrayPaths(node: JxMutableNode, path: (string | number)[]) {
256
- if (!node || typeof node !== "object") {
450
+ // Document JSON can hold a null or scalar where a node belongs; it holds no repeater.
451
+ if (!isNonNullObject(node)) {
257
452
  return;
258
453
  }
259
- if ((node as unknown as { $prototype?: string }).$prototype === "Array") {
454
+ if (node.$prototype === "Array") {
260
455
  arrayPaths.add(path.join("/"));
261
- const mapDef = (node as JxMutableNode).map;
262
- if (mapDef && typeof mapDef === "object") {
456
+ const mapDef = node.map;
457
+ if (isNonNullObject(mapDef)) {
263
458
  findArrayPaths(mapDef, [...path, "map"]);
264
459
  }
265
460
  return;
266
461
  }
267
462
  if (Array.isArray(node.children)) {
268
- for (let i = 0; i < node.children.length; i++) {
269
- const child = node.children[i];
270
- if (typeof child === "string") {
463
+ for (const [i, child] of node.children.entries()) {
464
+ if (isString(child)) {
271
465
  continue;
272
466
  }
273
- findArrayPaths(child!, [...path, "children", i]);
467
+ findArrayPaths(child, [...path, "children", i]);
274
468
  }
275
- } else if (
276
- node.children &&
277
- typeof node.children === "object" &&
278
- (node.children as unknown as { $prototype?: string }).$prototype === "Array"
279
- ) {
469
+ } else if (isMappedArray(node.children)) {
470
+ /* SAFETY: the bare mapped-array slot is a repeater node in all but its declared type, and
471
+ the walk reads only what isMappedArray just established (`$prototype`) and its `map`
472
+ template, an element definition. */
280
473
  findArrayPaths(node.children as JxMutableNode, [...path, "children"]);
281
474
  }
282
475
  if (node.$switch && node.cases) {
@@ -295,32 +488,34 @@ export async function resolveCanvasDocument(
295
488
  const isLayoutDoc =
296
489
  S.documentPath != null &&
297
490
  (S.documentPath.startsWith("layouts/") || S.documentPath.startsWith("./layouts/"));
491
+ /* SAFETY: a document's `$elements` entries are tag-name strings, `{ $ref }` imports or inline
492
+ element definitions, each a JxElement or a string; getEffectiveElements only dedups them by the
493
+ string itself or by `$ref`. */
298
494
  const effectiveElements = getEffectiveElements(renderDoc.$elements as (JxElement | string)[]);
299
495
  if ((S.mode === "content" || layoutWrapped || isLayoutDoc) && componentRegistry.length > 0) {
300
496
  const existingRefs = new Set(
301
- effectiveElements.map((e: JxElement | string) => (typeof e === "string" ? e : e?.$ref)),
497
+ // A null entry in a document's `$elements` names nothing, so it contributes no ref.
498
+ effectiveElements.map((e: JxElement | string) => (isNonNullObject(e) ? e.$ref : e)),
302
499
  );
303
- const collectTags = (node: JxMutableNode): Set<string> => {
304
- const tags = new Set<string>();
305
- if (!node || typeof node !== "object") {
306
- return tags;
307
- }
308
- if (node.tagName) {
309
- tags.add(displayTagName(node.tagName));
310
- }
311
- if (Array.isArray(node.children)) {
312
- for (const child of node.children) {
313
- if (typeof child !== "string") {
314
- for (const t of collectTags(child)) {
315
- tags.add(t);
316
- }
317
- }
318
- }
500
+ /* Every tag the render can reach: the document's own, then — through the registry's `uses` —
501
+ each component's, transitively. Components address one another by bare `tagName` and declare
502
+ no `$elements` (the build finds them project-wide), so a tag that only appears INSIDE a
503
+ component (a card's panel, a header's theme toggle) was never registered here and rendered as
504
+ an empty, unstyled element. */
505
+ const byTag = new Map(componentRegistry.map((c: ComponentEntry) => [c.tagName, c]));
506
+ /* SAFETY: a render document is JSON by construction (it crosses into the canvas realm by
507
+ `postMessage`); the walk only reads `tagName`, `children`, `map` and `cases` off it. */
508
+ const reachable = collectUsedTags(renderDoc as JsonValue);
509
+ if (renderDoc.tagName) {
510
+ reachable.add(displayTagName(renderDoc.tagName));
511
+ }
512
+ for (const tag of reachable) {
513
+ for (const used of byTag.get(tag)?.uses ?? []) {
514
+ reachable.add(used);
319
515
  }
320
- return tags;
321
- };
322
- for (const tag of collectTags(renderDoc)) {
323
- const comp = componentRegistry.find((c: ComponentEntry) => c.tagName === tag);
516
+ }
517
+ for (const tag of reachable) {
518
+ const comp = byTag.get(tag);
324
519
  if (comp && comp.source !== "npm" && comp.path) {
325
520
  const relPath = computeRelativePath(S.documentPath ?? null, comp.path);
326
521
  if (!existingRefs.has(relPath)) {
@@ -331,24 +526,12 @@ export async function resolveCanvasDocument(
331
526
  }
332
527
  }
333
528
  if (effectiveElements.length > 0) {
334
- renderDoc.$elements = effectiveElements as (string | JxMutableNode | { $ref: string })[];
335
- }
336
- renderDoc.imports = getEffectiveImports(renderDoc.imports);
337
- // The effective-media/head getters return the merged value or undefined. Optional properties
338
- // Cannot be assigned undefined under exactOptionalPropertyTypes, so clear them by deleting the key
339
- // When the getter yields nothing.
340
- const media = getEffectiveMedia(renderDoc.$media);
341
- if (media === undefined) {
342
- delete renderDoc.$media;
343
- } else {
344
- renderDoc.$media = media as NonNullable<JxMutableNode["$media"]>;
345
- }
346
- const head = getEffectiveHead(renderDoc.$head);
347
- if (head === undefined) {
348
- delete renderDoc.$head;
349
- } else {
350
- renderDoc.$head = head as NonNullable<JxMutableNode["$head"]>;
529
+ renderDoc.$elements = effectiveElements;
351
530
  }
531
+ renderDoc.imports = getEffectiveImports(renderDoc.imports, extensions);
532
+ // The effective-media/head getters always answer a value: the merge, or an empty one.
533
+ renderDoc.$media = getEffectiveMedia(renderDoc.$media);
534
+ renderDoc.$head = getEffectiveHead(renderDoc.$head);
352
535
 
353
536
  return {
354
537
  assets,
@@ -361,6 +544,6 @@ export async function resolveCanvasDocument(
361
544
  pageContentPrefix,
362
545
  },
363
546
  renderDoc,
364
- siteStyle: (projectState?.projectConfig?.style as Record<string, unknown>) ?? null,
547
+ siteStyle: projectState?.projectConfig?.style ?? null,
365
548
  };
366
549
  }
@@ -1,20 +1,20 @@
1
1
  /// <reference lib="dom" />
2
2
  /**
3
- * Canvas origin derivation. The canvas iframe may load same-origin (dev server / chromium /
4
- * electrobun gate-off, where the platform canvasUrl is a relative path) or cross-origin (electrobun
5
- * loopback, where canvasUrl is an absolute http://127.0.0.1:<port> URL).
3
+ * Canvas origin derivation. The canvas iframe may load same-origin (dev server / chromium / cloud,
4
+ * where the platform canvasUrl is a relative path) or cross-origin (a host whose canvasUrl is an
5
+ * absolute http://127.0.0.1:<port> URL).
6
6
  *
7
7
  * CanvasBaseOrigin() returns the origin the canvas document lives on, so callers that build
8
8
  * absolute asset/doc URLs target the right server. For a relative canvasUrl this resolves to
9
- * location.origin — IDENTITY for the same-origin paths, so dev/chromium/electrobun-gate-off are
10
- * byte-identical to before.
9
+ * location.origin — IDENTITY for the same-origin paths, so dev/chromium/cloud are byte-identical to
10
+ * before.
11
11
  */
12
12
 
13
13
  import { getPlatform, hasPlatform } from "../platform";
14
14
 
15
15
  /**
16
- * The origin serving the canvas document. When the platform registers an absolute canvasUrl
17
- * (electrobun loopback), this is that URL's origin; otherwise it falls back to the parent's own
16
+ * The origin serving the canvas document. When the platform registers an absolute canvasUrl (an
17
+ * absolute loopback URL), this is that URL's origin; otherwise it falls back to the parent's own
18
18
  * origin (a relative canvasUrl resolves against location.href to location.origin).
19
19
  */
20
20
  export function canvasBaseOrigin(): string {
@@ -25,6 +25,31 @@ export function canvasBaseOrigin(): string {
25
25
  return location.origin;
26
26
  }
27
27
 
28
+ /**
29
+ * The dev-proxy token for a render in the SHELL's own realm, or null when it has none to use.
30
+ *
31
+ * A desktop server gates `/__jx_resolve__` and `/__jx_server__` on its rpcToken, and the canvas
32
+ * iframe authenticates by reading it off its own URL (`?rpcToken=`). The shell renders documents
33
+ * too (the Library's previews, the assistant's render check) through its own copy of the runtime,
34
+ * and that copy was never told: every `$src` class on a previewed page posted without the token and
35
+ * drew a 403. The token is read off the same canvas URL rather than a second channel, so there is
36
+ * one place it is handed out.
37
+ *
38
+ * Same-origin only. A cross-origin canvas (an absolute loopback canvasUrl) is not where the shell's
39
+ * relative dev-proxy fetches go, so its token would authenticate nothing and is better not spread
40
+ * around.
41
+ *
42
+ * @returns {string | null} The token, or null on a host with no token or a cross-origin canvas.
43
+ */
44
+ export function hostResolveToken(): string | null {
45
+ const canvasUrl = hasPlatform() ? getPlatform().canvasUrl : undefined;
46
+ if (!canvasUrl) {
47
+ return null;
48
+ }
49
+ const url = new URL(canvasUrl, location.href);
50
+ return url.origin === location.origin ? url.searchParams.get("rpcToken") : null;
51
+ }
52
+
28
53
  /**
29
54
  * The base the canvas fetches PROJECT FILES against — component `$ref`s, `$src` modules, images.
30
55
  *
@@ -69,11 +94,11 @@ export function documentBase(projectRoot?: string): string {
69
94
  * the desktop MutationObserver only rewrites asynchronously. Rendering the src loopback-absolute up
70
95
  * front eliminates that race for direct-parent <img> sites.
71
96
  *
72
- * Guarded: this ONLY rewrites when a real cross-origin http(s) loopback is registered (electrobun
73
- * loopback, canvasUrl set to an absolute http URL) whose origin differs from location.origin.
74
- * Otherwise — dev server, chromium, electrobun gate-off, and the pre-activate window — it returns
75
- * the ORIGINAL relative path unchanged, keeping those cases byte-identical (an absolute
76
- * ${location.origin}/... on the shell would just reintroduce views://... — the exact bug).
97
+ * Guarded: this ONLY rewrites when a real cross-origin http(s) loopback is registered (canvasUrl
98
+ * set to an absolute http URL) whose origin differs from location.origin. Otherwise — dev server,
99
+ * chromium, cloud, and the pre-activate window — it returns the ORIGINAL relative path unchanged,
100
+ * keeping those cases byte-identical (an absolute ${location.origin}/... on the shell would just
101
+ * reintroduce views://... — the exact bug).
77
102
  *
78
103
  * Only for PROJECT asset srcs; NEVER call it for shell-packaged views:// assets (sp-icons, bundled
79
104
  * chrome). Already-absolute inputs (data:/blob:/http/views://) are returned untouched, so it is