@jxsuite/studio 6.1.1 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (785) hide show
  1. package/README.md +5 -5
  2. package/dist/chunks/2020-5wtzce5g.js +4 -0
  3. package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
  4. package/dist/chunks/adapter-5tphg7xe.js +4 -0
  5. package/dist/chunks/add-new-flow-psym14sn.js +4 -0
  6. package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
  7. package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
  8. package/dist/chunks/color-area-6rbra5dy.js +4 -0
  9. package/dist/chunks/color-field-gy56c94g.js +4 -0
  10. package/dist/chunks/color-m7r1vk54.js +4 -0
  11. package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
  12. package/dist/chunks/combobox-72h32ejk.js +4 -0
  13. package/dist/chunks/components-r22xca09.js +4 -0
  14. package/dist/chunks/content-source-mmppmcyg.js +4 -0
  15. package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
  16. package/dist/chunks/dialog-c4x05vyx.js +4 -0
  17. package/dist/chunks/editor-ccd9jwsa.js +4 -0
  18. package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
  19. package/dist/chunks/extension-sections-0egb88dm.js +4 -0
  20. package/dist/chunks/file-ops-qnab36ek.js +4 -0
  21. package/dist/chunks/files-rcn56qvm.js +4 -0
  22. package/dist/chunks/format-host-yxz0kjjs.js +4 -0
  23. package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
  24. package/dist/chunks/grid-open-4z1g062t.js +4 -0
  25. package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
  26. package/dist/chunks/icons-63bjtbs7.js +4 -0
  27. package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
  28. package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
  29. package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
  30. package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
  31. package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
  32. package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
  33. package/dist/chunks/index-f0jn7nnp.js +4 -0
  34. package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
  35. package/dist/chunks/jsonMode-njkvsa02.js +13 -0
  36. package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
  37. package/dist/chunks/layers-bgyr11tr.js +4 -0
  38. package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
  39. package/dist/chunks/listbox-c421cf8c.js +4 -0
  40. package/dist/chunks/lit-html-v9gh687x.js +4 -0
  41. package/dist/chunks/media-library-sq468wts.js +4 -0
  42. package/dist/chunks/media-picker-shfe59pt.js +4 -0
  43. package/dist/chunks/menu-bdpzbfvs.js +4 -0
  44. package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
  45. package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
  46. package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
  47. package/dist/chunks/notify-kzrjr3fv.js +4 -0
  48. package/dist/chunks/number-field-y62xq0ty.js +4 -0
  49. package/dist/chunks/parse-v77xtwv7.js +4 -0
  50. package/dist/chunks/platform-7v4rtd7m.js +4 -0
  51. package/dist/chunks/popover-b89sfej7.js +4 -0
  52. package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
  53. package/dist/chunks/publish-quick-qx2455cj.js +4 -0
  54. package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
  55. package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
  56. package/dist/chunks/references-9547rg5s.js +4 -0
  57. package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
  58. package/dist/chunks/select-rzds841e.js +4 -0
  59. package/dist/chunks/source-control-kwktr9y6.js +4 -0
  60. package/dist/chunks/split-c9zfdgxf.js +4 -0
  61. package/dist/chunks/studio-03ct6yfv.js +9 -0
  62. package/dist/chunks/studio-07rcfje3.js +5 -0
  63. package/dist/chunks/studio-3e54qh39.js +7 -0
  64. package/dist/chunks/studio-3exxhz5g.js +5 -0
  65. package/dist/chunks/studio-3q40e3rj.js +5 -0
  66. package/dist/chunks/studio-3qeh9t0h.js +6 -0
  67. package/dist/chunks/studio-3qqjeep5.js +6 -0
  68. package/dist/chunks/studio-43sd2mam.js +4 -0
  69. package/dist/chunks/studio-4hp8pkyt.js +5 -0
  70. package/dist/chunks/studio-58xg6j2q.js +9 -0
  71. package/dist/chunks/studio-5g0rprdt.js +7 -0
  72. package/dist/chunks/studio-6m380wp7.js +5 -0
  73. package/dist/chunks/studio-80jyh1xh.js +4 -0
  74. package/dist/chunks/studio-83mk4bgg.js +9 -0
  75. package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
  76. package/dist/chunks/studio-8m0y2qe7.js +5 -0
  77. package/dist/chunks/studio-8tr6cfrc.js +5 -0
  78. package/dist/chunks/studio-8vcvfs7r.js +6 -0
  79. package/dist/chunks/studio-9tmebf0s.js +5 -0
  80. package/dist/chunks/studio-a2bvaptz.js +5 -0
  81. package/dist/chunks/studio-b7y5mr30.js +5 -0
  82. package/dist/chunks/studio-bavb31r0.js +5 -0
  83. package/dist/chunks/studio-bbe4c90a.js +5 -0
  84. package/dist/chunks/studio-c05wdnt3.js +5 -0
  85. package/dist/chunks/studio-ccv2svc6.js +5 -0
  86. package/dist/chunks/studio-d5grtb9e.js +16 -0
  87. package/dist/chunks/studio-df0baea9.js +5 -0
  88. package/dist/chunks/studio-dgk4dqtx.js +7 -0
  89. package/dist/chunks/studio-e1g64q43.js +5 -0
  90. package/dist/chunks/studio-ed1hp6zf.js +6 -0
  91. package/dist/chunks/studio-ed3xx40h.js +7 -0
  92. package/dist/chunks/studio-f14e1zdj.js +5 -0
  93. package/dist/chunks/studio-fbhxxc5f.js +5 -0
  94. package/dist/chunks/studio-fyh0jc96.js +5 -0
  95. package/dist/chunks/studio-gcxk20n7.js +5 -0
  96. package/dist/chunks/studio-jaaz8ce9.js +5 -0
  97. package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
  98. package/dist/chunks/studio-jsgf2q5k.js +7 -0
  99. package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
  100. package/dist/chunks/studio-k7evxqh4.js +5 -0
  101. package/dist/chunks/studio-kt3pjkwd.js +5 -0
  102. package/dist/chunks/studio-m8g16bgz.js +5 -0
  103. package/dist/chunks/studio-mn0476ag.js +5 -0
  104. package/dist/chunks/studio-mx1smyq0.js +5 -0
  105. package/dist/chunks/studio-n0c5h6mf.js +5 -0
  106. package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
  107. package/dist/chunks/studio-nqxqf8p2.js +4 -0
  108. package/dist/chunks/studio-p4nrkvqr.js +5 -0
  109. package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
  110. package/dist/chunks/studio-pgmvdv7z.js +7 -0
  111. package/dist/chunks/studio-ph84avkf.js +5 -0
  112. package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
  113. package/dist/chunks/studio-q0tccd43.js +5 -0
  114. package/dist/chunks/studio-q7rtx6zq.js +14 -0
  115. package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
  116. package/dist/chunks/studio-qmn1xc24.js +5 -0
  117. package/dist/chunks/studio-qwdqwkj0.js +5 -0
  118. package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
  119. package/dist/chunks/studio-rj9eamf8.js +5 -0
  120. package/dist/chunks/studio-rptgsk96.js +5 -0
  121. package/dist/chunks/studio-rthyg42z.js +928 -0
  122. package/dist/chunks/studio-s19tp1xr.js +5 -0
  123. package/dist/chunks/studio-s32578pn.js +5 -0
  124. package/dist/chunks/studio-svb7yyve.js +5 -0
  125. package/dist/chunks/studio-syreb644.js +5 -0
  126. package/dist/chunks/studio-tf9jryb1.js +10 -0
  127. package/dist/chunks/studio-tfkznv39.js +5 -0
  128. package/dist/chunks/studio-tft6r105.js +5 -0
  129. package/dist/chunks/studio-txf2kysx.js +5 -0
  130. package/dist/chunks/studio-v8867ddv.js +12 -0
  131. package/dist/chunks/studio-vxq7fcvv.js +5 -0
  132. package/dist/chunks/studio-w4rz9hdk.js +5 -0
  133. package/dist/chunks/studio-wbcjbhy1.js +9 -0
  134. package/dist/chunks/studio-wc649wss.js +5 -0
  135. package/dist/chunks/studio-wys23mxz.js +5 -0
  136. package/dist/chunks/studio-x1x167jh.js +5 -0
  137. package/dist/chunks/studio-x9hsze61.js +5 -0
  138. package/dist/chunks/studio-y0n7yxea.js +9 -0
  139. package/dist/chunks/studio-y3ahhdpx.js +5 -0
  140. package/dist/chunks/studio-z97c48fk.js +5 -0
  141. package/dist/chunks/studio-zat62m0c.js +5 -0
  142. package/dist/chunks/studio-zcd2e7yz.js +5 -0
  143. package/dist/chunks/studio-zz9qe3rw.js +64 -0
  144. package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
  145. package/dist/chunks/tabs-f5cw3tgp.js +4 -0
  146. package/dist/chunks/textfield-wewc8rq2.js +4 -0
  147. package/dist/chunks/toast-1gv0h53h.js +4 -0
  148. package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
  149. package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
  150. package/dist/chunks/tooltip-yypz28gq.js +4 -0
  151. package/dist/chunks/tree-9xa4hm7n.js +4 -0
  152. package/dist/chunks/tsMode-epyfz1hv.js +14 -0
  153. package/dist/chunks/workspace-dz7nxfhv.js +4 -0
  154. package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
  155. package/dist/chunks/ws-client-bv552sfx.js +4 -0
  156. package/dist/iframe-entry.js +20 -16
  157. package/dist/manifest.json +77 -63
  158. package/dist/studio.js +106 -107
  159. package/dist/workers/ts.worker.js +3 -3
  160. package/package.json +17 -16
  161. package/src/about/about-modal.ts +4 -3
  162. package/src/account/action-flow.ts +45 -38
  163. package/src/account-status.ts +7 -2
  164. package/src/browse/component-examples.ts +272 -0
  165. package/src/browse/library-commands.ts +64 -104
  166. package/src/browse/library-layouts.ts +270 -53
  167. package/src/browse/library-model.ts +194 -134
  168. package/src/browse/library-pane.ts +748 -440
  169. package/src/browse/library-preview.ts +161 -26
  170. package/src/browse/library-source.ts +308 -41
  171. package/src/browse/preview-root.ts +78 -0
  172. package/src/browse/preview-style.ts +155 -0
  173. package/src/canvas/asset-refs.ts +40 -10
  174. package/src/canvas/asset-resolve.ts +19 -23
  175. package/src/canvas/canvas-helpers.ts +7 -6
  176. package/src/canvas/canvas-live-render.ts +260 -77
  177. package/src/canvas/canvas-origin.ts +37 -12
  178. package/src/canvas/canvas-page-context.ts +112 -0
  179. package/src/canvas/canvas-patcher.ts +30 -30
  180. package/src/canvas/canvas-perf.ts +11 -5
  181. package/src/canvas/canvas-render.ts +175 -148
  182. package/src/canvas/canvas-surface.ts +5 -3
  183. package/src/canvas/canvas-utils.ts +147 -61
  184. package/src/canvas/dialog-path.ts +9 -4
  185. package/src/canvas/dialog-state.ts +1 -2
  186. package/src/canvas/diff-marks.ts +9 -16
  187. package/src/canvas/diff-toolbar.ts +8 -7
  188. package/src/canvas/edit-width-drag.ts +4 -1
  189. package/src/canvas/edit-width.ts +1 -3
  190. package/src/canvas/iframe-channel.ts +27 -13
  191. package/src/canvas/iframe-drop.ts +120 -12
  192. package/src/canvas/iframe-editable-root.ts +29 -16
  193. package/src/canvas/iframe-entry.ts +104 -75
  194. package/src/canvas/iframe-eval.ts +73 -49
  195. package/src/canvas/iframe-host.ts +269 -158
  196. package/src/canvas/iframe-inline-edit.ts +49 -30
  197. package/src/canvas/iframe-insert.ts +5 -4
  198. package/src/canvas/iframe-interaction.ts +30 -25
  199. package/src/canvas/iframe-keys.ts +11 -0
  200. package/src/canvas/iframe-overlay.ts +1 -1
  201. package/src/canvas/iframe-patch.ts +25 -21
  202. package/src/canvas/iframe-position.ts +12 -6
  203. package/src/canvas/iframe-protocol.ts +36 -21
  204. package/src/canvas/iframe-render.ts +84 -35
  205. package/src/canvas/iframe-slash.ts +24 -11
  206. package/src/canvas/iframe-subtree.ts +10 -3
  207. package/src/canvas/npm-modules.ts +22 -0
  208. package/src/canvas/path-mapping.ts +19 -12
  209. package/src/canvas/popover-path.ts +7 -3
  210. package/src/canvas/popover-state.ts +1 -2
  211. package/src/canvas/preview-navigate.ts +16 -0
  212. package/src/canvas/repeater-sources.ts +200 -0
  213. package/src/canvas/serialize-scope.ts +13 -5
  214. package/src/canvas/stage-scrollbar.ts +7 -2
  215. package/src/canvas/surface-registry.ts +27 -3
  216. package/src/collab/collab-commands.ts +7 -2
  217. package/src/collab/collab-session.ts +84 -45
  218. package/src/collab/collab-state.ts +4 -3
  219. package/src/collab/monaco-binding.ts +16 -13
  220. package/src/collab/monaco-cursors.ts +5 -2
  221. package/src/commands/app-commands.ts +16 -6
  222. package/src/commands/budget.ts +13 -11
  223. package/src/commands/command-args.ts +103 -71
  224. package/src/commands/context.ts +55 -28
  225. package/src/commands/defaults.ts +69 -45
  226. package/src/commands/keymap.ts +56 -43
  227. package/src/commands/levels.ts +14 -8
  228. package/src/commands/live-context.ts +9 -7
  229. package/src/commands/reference.ts +2 -1
  230. package/src/commands/registry.ts +22 -11
  231. package/src/commands/run-reported.ts +15 -10
  232. package/src/component-props.ts +46 -30
  233. package/src/content/collection-match.ts +11 -9
  234. package/src/content/collection-pages.ts +412 -0
  235. package/src/content/content-collections.ts +270 -0
  236. package/src/content/draft-state.ts +4 -3
  237. package/src/content/entry-commands.ts +54 -62
  238. package/src/content/entry-editor.ts +137 -32
  239. package/src/content/entry-fields.ts +25 -8
  240. package/src/content/entry-inspector.ts +225 -0
  241. package/src/content/entry-model.ts +38 -15
  242. package/src/content/entry-open.ts +80 -0
  243. package/src/content/entry-summaries.ts +440 -0
  244. package/src/content/file-record-ids.ts +80 -0
  245. package/src/content/file-records.ts +125 -0
  246. package/src/content/page-summaries.ts +129 -0
  247. package/src/content/record-entry.ts +201 -0
  248. package/src/content/writing-banner.ts +177 -0
  249. package/src/create/add-new-commands.ts +185 -0
  250. package/src/create/add-new-flow.ts +1116 -0
  251. package/src/create/add-new.ts +1014 -0
  252. package/src/create/element-name.ts +121 -0
  253. package/src/editor/canvas-context-menu.ts +1 -2
  254. package/src/editor/canvas-slash-bridge.ts +3 -6
  255. package/src/editor/content-slice.ts +16 -14
  256. package/src/editor/context-menu.ts +35 -22
  257. package/src/editor/convert-targets.ts +30 -35
  258. package/src/editor/convert-to-component.ts +78 -48
  259. package/src/editor/convert-to-repeater.ts +34 -22
  260. package/src/editor/editable-tags.ts +17 -2
  261. package/src/editor/file-drop-action.ts +29 -22
  262. package/src/editor/inline-edit-apply.ts +79 -17
  263. package/src/editor/inline-edit.ts +76 -50
  264. package/src/editor/inline-format.ts +59 -56
  265. package/src/editor/inline-link.ts +40 -15
  266. package/src/editor/insert-component.ts +91 -0
  267. package/src/editor/insert-zone-action.ts +14 -5
  268. package/src/editor/merge-tags.ts +58 -19
  269. package/src/editor/repeater-scope.ts +39 -28
  270. package/src/editor/shortcuts.ts +76 -42
  271. package/src/editor/slash-menu.ts +52 -14
  272. package/src/files/asset-versions.ts +4 -4
  273. package/src/files/components.ts +89 -20
  274. package/src/files/elements.ts +5 -6
  275. package/src/files/file-ops.ts +92 -41
  276. package/src/files/files.ts +248 -239
  277. package/src/files/fs-events.ts +18 -7
  278. package/src/files/media-meta.ts +97 -2
  279. package/src/files/media-paths.ts +3 -0
  280. package/src/files/media-types.ts +55 -0
  281. package/src/files/media-upload.ts +209 -52
  282. package/src/files/new-file-name.ts +156 -0
  283. package/src/files/serialize-document.ts +15 -5
  284. package/src/format/constraints.ts +1 -1
  285. package/src/format/convert-file.ts +27 -13
  286. package/src/format/format-choices.ts +2 -1
  287. package/src/format/format-host.ts +91 -50
  288. package/src/github/github-auth-status.ts +27 -3
  289. package/src/github/github-auth.ts +21 -11
  290. package/src/github/github-publish.ts +28 -23
  291. package/src/grid/cell-editors.ts +46 -31
  292. package/src/grid/cell-popovers.ts +5 -3
  293. package/src/grid/edit-buffer.ts +10 -9
  294. package/src/grid/grid-controller.ts +25 -23
  295. package/src/grid/grid-layout.ts +21 -5
  296. package/src/grid/grid-open.ts +3 -33
  297. package/src/grid/grid-panel.ts +65 -6
  298. package/src/grid/grid-reveal.ts +34 -0
  299. package/src/grid/grid-source.ts +9 -31
  300. package/src/grid/grid-view.ts +45 -23
  301. package/src/grid/redirects-grid.ts +14 -5
  302. package/src/grid/redirects.ts +16 -14
  303. package/src/grid/schema-columns.ts +25 -19
  304. package/src/grid/sources/connector-source.ts +47 -20
  305. package/src/grid/sources/content-source.ts +100 -31
  306. package/src/grid/sources/csv-file-source.ts +2 -2
  307. package/src/grid/tabulator-tables.d.ts +61 -34
  308. package/src/hosting/document.ts +2 -2
  309. package/src/hosting/stage.ts +7 -7
  310. package/src/i18n/i18n-commands.ts +3 -3
  311. package/src/media/media-commands.ts +181 -0
  312. package/src/media/media-library-model.ts +232 -0
  313. package/src/media/media-library.ts +1283 -0
  314. package/src/media/media-pane.ts +51 -20
  315. package/src/new-project/add-repo-modal.ts +20 -19
  316. package/src/new-project/import-tab.ts +10 -14
  317. package/src/new-project/location-fields.ts +2 -1
  318. package/src/new-project/new-project-modal.ts +12 -9
  319. package/src/packages/jxsuite-update.ts +4 -3
  320. package/src/packages/pull-package-sync.ts +26 -25
  321. package/src/page-params.ts +97 -68
  322. package/src/panels/activity-panel.ts +38 -14
  323. package/src/panels/ai-chat/attached-context.ts +13 -7
  324. package/src/panels/ai-chat/chat-markdown.ts +8 -8
  325. package/src/panels/ai-chat/chat-view.ts +80 -73
  326. package/src/panels/ai-chat/composer.ts +30 -33
  327. package/src/panels/ai-chat/sessions-view.ts +1 -2
  328. package/src/panels/ai-panel.ts +23 -20
  329. package/src/panels/block-action-bar.ts +57 -46
  330. package/src/panels/bottom-dock.ts +5 -3
  331. package/src/panels/canvas-dnd-bridge.ts +36 -26
  332. package/src/panels/chat-panel.ts +6 -6
  333. package/src/panels/collections-panel.ts +306 -0
  334. package/src/panels/component-preview.ts +35 -13
  335. package/src/panels/data-explorer.ts +63 -26
  336. package/src/panels/data-grid.ts +18 -11
  337. package/src/panels/dnd.ts +115 -138
  338. package/src/panels/editors.ts +52 -21
  339. package/src/panels/elements-panel.ts +19 -5
  340. package/src/panels/empty-state.ts +2 -2
  341. package/src/panels/events-panel.ts +84 -69
  342. package/src/panels/formula-workspace.ts +78 -54
  343. package/src/panels/frontmatter-fields.ts +33 -28
  344. package/src/panels/git-diff-open.ts +10 -6
  345. package/src/panels/head-panel.ts +488 -202
  346. package/src/panels/i18n-panel.ts +20 -12
  347. package/src/panels/imports-panel.ts +25 -47
  348. package/src/panels/jump-bar.ts +75 -31
  349. package/src/panels/layers-panel.ts +130 -101
  350. package/src/panels/left-panel.ts +25 -11
  351. package/src/panels/navigator-panels.ts +23 -11
  352. package/src/panels/pane-context.ts +140 -49
  353. package/src/panels/pane-grid.ts +55 -26
  354. package/src/panels/panel-registry.ts +36 -46
  355. package/src/panels/properties-panel.ts +182 -124
  356. package/src/panels/quick-search.ts +53 -31
  357. package/src/panels/right-panel.ts +201 -45
  358. package/src/panels/seo-modal.ts +54 -125
  359. package/src/panels/settings-menu.ts +63 -61
  360. package/src/panels/settings-pane.ts +268 -162
  361. package/src/panels/signals-panel.ts +156 -135
  362. package/src/panels/site-model.ts +367 -0
  363. package/src/panels/site-panel.ts +638 -0
  364. package/src/panels/statement-editor.ts +230 -140
  365. package/src/panels/style-panel.ts +253 -206
  366. package/src/panels/style-utils.ts +114 -51
  367. package/src/panels/stylebook-doc.ts +195 -60
  368. package/src/panels/stylebook-layers-panel.ts +48 -89
  369. package/src/panels/stylebook-panel.ts +60 -27
  370. package/src/panels/styles-panel.ts +327 -0
  371. package/src/panels/tab-drop.ts +27 -11
  372. package/src/panels/tab-strip.ts +143 -49
  373. package/src/platform-errors.ts +57 -43
  374. package/src/platform.ts +59 -31
  375. package/src/platforms/cloud.ts +373 -176
  376. package/src/platforms/default-platform.ts +14 -8
  377. package/src/platforms/devserver.ts +180 -142
  378. package/src/platforms/read-batcher.ts +16 -8
  379. package/src/project-list.ts +2 -1
  380. package/src/publish/deploy-checklist.ts +20 -9
  381. package/src/publish/pages-service.ts +66 -27
  382. package/src/publish/publish-changes.ts +491 -0
  383. package/src/publish/publish-commands.ts +88 -22
  384. package/src/publish/publish-ids.ts +49 -0
  385. package/src/publish/publish-panel.ts +10 -6
  386. package/src/publish/publish-quick.ts +148 -0
  387. package/src/publish/publish-workspace.ts +926 -0
  388. package/src/publish/source-control.ts +907 -0
  389. package/src/recent-projects.ts +15 -8
  390. package/src/resize-edges.ts +26 -36
  391. package/src/services/a11y-report.ts +26 -19
  392. package/src/services/agent-seed.ts +23 -11
  393. package/src/services/ai-ask.ts +9 -12
  394. package/src/services/ai-command-tools.ts +68 -62
  395. package/src/services/ai-import-tools.ts +80 -67
  396. package/src/services/ai-models.ts +17 -13
  397. package/src/services/ai-project-tools.ts +68 -32
  398. package/src/services/ai-session-store.ts +19 -10
  399. package/src/services/ai-system-prompt.ts +46 -20
  400. package/src/services/ai-tools.ts +71 -27
  401. package/src/services/ai-write-report.ts +20 -12
  402. package/src/services/ai-writes.ts +4 -4
  403. package/src/services/automation.ts +74 -51
  404. package/src/services/cem-export.ts +149 -58
  405. package/src/services/cf-settings.ts +4 -4
  406. package/src/services/clock.ts +6 -1
  407. package/src/services/code-services.ts +37 -31
  408. package/src/services/connection.ts +2 -2
  409. package/src/services/context-manager.ts +14 -10
  410. package/src/services/context-resolver.ts +20 -8
  411. package/src/services/data-service.ts +19 -15
  412. package/src/services/directory-picker.ts +20 -14
  413. package/src/services/document-assistant.ts +39 -19
  414. package/src/services/gated-registry.ts +10 -6
  415. package/src/services/harness/chat-reducer.ts +23 -1
  416. package/src/services/import-client.ts +91 -38
  417. package/src/services/import-seed.ts +8 -2
  418. package/src/services/jx-validate.ts +28 -31
  419. package/src/services/live-preview.ts +0 -0
  420. package/src/services/live-surfaces.ts +6 -3
  421. package/src/services/model-uri.ts +10 -2
  422. package/src/services/module-preloads.ts +12 -8
  423. package/src/services/monaco-buffer.ts +43 -24
  424. package/src/services/monaco-lazy.ts +7 -8
  425. package/src/services/monaco-setup.ts +23 -16
  426. package/src/services/notify.ts +44 -17
  427. package/src/services/popover-report.ts +25 -10
  428. package/src/services/preview-eval.ts +20 -8
  429. package/src/services/profile.ts +13 -6
  430. package/src/services/project-path.ts +13 -10
  431. package/src/services/references.ts +0 -0
  432. package/src/services/render-critic.ts +29 -9
  433. package/src/services/settings/definitions.ts +25 -14
  434. package/src/services/settings/kernel.ts +13 -4
  435. package/src/services/settings/write-queue.ts +9 -9
  436. package/src/services/token-lint.ts +12 -10
  437. package/src/services/tool-executor.ts +17 -5
  438. package/src/services/tool-outcomes.ts +44 -24
  439. package/src/services/trusted-types.ts +24 -7
  440. package/src/settings/contexts-section.ts +11 -8
  441. package/src/settings/contributed-section.ts +128 -70
  442. package/src/settings/css-vars-editor.ts +119 -32
  443. package/src/settings/defs-editor.ts +38 -35
  444. package/src/settings/developer-panels.ts +43 -0
  445. package/src/settings/extension-rows.ts +16 -8
  446. package/src/settings/extension-sections.ts +42 -14
  447. package/src/settings/extensions-section.ts +4 -1
  448. package/src/settings/general-settings.ts +101 -28
  449. package/src/settings/locales-section.ts +20 -12
  450. package/src/settings/preferences-dialog.ts +17 -7
  451. package/src/settings/preferences-keymap.ts +7 -5
  452. package/src/settings/preferences-sections.ts +11 -5
  453. package/src/settings/project-sections.ts +28 -11
  454. package/src/settings/schema-field-ui.ts +12 -1
  455. package/src/settings/section-registry.ts +116 -11
  456. package/src/settings/settings-dialog.ts +192 -0
  457. package/src/settings/settings-document.ts +186 -166
  458. package/src/shell/tree.ts +6 -5
  459. package/src/shell.ts +536 -477
  460. package/src/site-context.ts +101 -32
  461. package/src/state.ts +68 -57
  462. package/src/store.ts +54 -34
  463. package/src/studio.ts +219 -116
  464. package/src/style/live-preview.ts +1 -1
  465. package/src/style/project-styles.ts +40 -7
  466. package/src/style/stylebook-specimens.ts +89 -0
  467. package/src/style/stylebook-target.ts +26 -0
  468. package/src/style/tag-inheritance.ts +105 -0
  469. package/src/style/token-ref.ts +5 -4
  470. package/src/style/variables-focus.ts +61 -0
  471. package/src/style/variables-view.ts +235 -0
  472. package/src/surfaces/about.ts +18 -19
  473. package/src/surfaces/add-new.json +1482 -0
  474. package/src/surfaces/add-new.ts +325 -0
  475. package/src/surfaces/add-repo.ts +17 -19
  476. package/src/surfaces/ai-chat.ts +33 -38
  477. package/src/surfaces/ai-credentials-form.ts +6 -16
  478. package/src/surfaces/ai-managed-connect.ts +3 -4
  479. package/src/surfaces/ai-model-picker.ts +3 -5
  480. package/src/surfaces/block-action-bar.ts +22 -11
  481. package/src/surfaces/boot-failure.json +4 -3
  482. package/src/surfaces/boot-failure.ts +4 -5
  483. package/src/surfaces/bottom-dock.json +1 -1
  484. package/src/surfaces/bottom-dock.ts +9 -18
  485. package/src/surfaces/canvas-stage.json +30 -19
  486. package/src/surfaces/canvas-stage.ts +17 -16
  487. package/src/surfaces/cf-account-picker.ts +17 -18
  488. package/src/surfaces/collections-panel.json +615 -0
  489. package/src/surfaces/collections-panel.ts +168 -0
  490. package/src/surfaces/commandbar.json +241 -96
  491. package/src/surfaces/commandbar.ts +145 -105
  492. package/src/surfaces/convert-repeater.ts +17 -19
  493. package/src/surfaces/data-actions.ts +9 -7
  494. package/src/surfaces/dialog.ts +26 -28
  495. package/src/surfaces/diff-toolbar.ts +9 -7
  496. package/src/surfaces/empty-state.json +1 -1
  497. package/src/surfaces/empty-state.ts +7 -10
  498. package/src/surfaces/entry-editor.json +136 -0
  499. package/src/surfaces/entry-editor.ts +35 -11
  500. package/src/surfaces/entry-inspector.json +371 -0
  501. package/src/surfaces/entry-inspector.ts +143 -0
  502. package/src/surfaces/expression-editor.ts +11 -25
  503. package/src/surfaces/files-panel.ts +27 -14
  504. package/src/surfaces/formula-palette.ts +4 -5
  505. package/src/surfaces/github-auth.ts +16 -20
  506. package/src/surfaces/github-publish.ts +17 -22
  507. package/src/surfaces/grid-cell.ts +30 -31
  508. package/src/surfaces/grid-open.ts +10 -14
  509. package/src/surfaces/grid-panel.ts +13 -9
  510. package/src/surfaces/grid-replace.ts +13 -13
  511. package/src/surfaces/grid-views.ts +15 -18
  512. package/src/surfaces/inspector-dock.json +162 -14
  513. package/src/surfaces/inspector-dock.ts +59 -31
  514. package/src/surfaces/jump-bar.ts +5 -6
  515. package/src/surfaces/jxsuite-update.ts +16 -22
  516. package/src/surfaces/library-pane.json +670 -437
  517. package/src/surfaces/library-pane.ts +111 -77
  518. package/src/surfaces/logic-panel.ts +17 -30
  519. package/src/surfaces/logic-workspace.ts +13 -15
  520. package/src/surfaces/media-browser.json +62 -6
  521. package/src/surfaces/media-browser.ts +26 -11
  522. package/src/surfaces/media-field.json +1 -1
  523. package/src/surfaces/media-field.ts +4 -5
  524. package/src/surfaces/media-library.json +1586 -0
  525. package/src/surfaces/media-library.ts +282 -0
  526. package/src/surfaces/media-pane.ts +8 -7
  527. package/src/surfaces/media-pick-dialog.json +71 -0
  528. package/src/surfaces/media-pick-dialog.ts +132 -0
  529. package/src/surfaces/menu.ts +47 -23
  530. package/src/surfaces/navigator-dock.ts +11 -12
  531. package/src/surfaces/new-project.ts +27 -26
  532. package/src/surfaces/pane-context.json +144 -77
  533. package/src/surfaces/pane-context.ts +44 -25
  534. package/src/surfaces/pane-grid.ts +15 -10
  535. package/src/surfaces/panel-activity.ts +5 -6
  536. package/src/surfaces/panel-data.ts +3 -4
  537. package/src/surfaces/panel-deploy-checklist.json +12 -6
  538. package/src/surfaces/panel-deploy-checklist.ts +8 -7
  539. package/src/surfaces/panel-elements.ts +5 -7
  540. package/src/surfaces/panel-i18n.ts +5 -7
  541. package/src/surfaces/panel-imports.ts +6 -13
  542. package/src/surfaces/panel-outline.ts +25 -19
  543. package/src/surfaces/panel-page.json +72 -2
  544. package/src/surfaces/panel-page.ts +49 -25
  545. package/src/surfaces/panel-problems.ts +5 -7
  546. package/src/surfaces/panel-signals.json +1 -1
  547. package/src/surfaces/panel-signals.ts +25 -39
  548. package/src/surfaces/panel-stylebook-layers.json +71 -204
  549. package/src/surfaces/panel-stylebook-layers.ts +5 -29
  550. package/src/surfaces/preferences.json +120 -48
  551. package/src/surfaces/preferences.ts +29 -11
  552. package/src/surfaces/progress-modal.ts +15 -9
  553. package/src/surfaces/properties-panel.json +1 -1
  554. package/src/surfaces/properties-panel.ts +20 -42
  555. package/src/surfaces/publish-quick.json +428 -0
  556. package/src/surfaces/publish-quick.ts +165 -0
  557. package/src/surfaces/publish-workspace.json +2892 -0
  558. package/src/surfaces/publish-workspace.ts +391 -0
  559. package/src/surfaces/publish.ts +18 -18
  560. package/src/surfaces/push-plan.ts +7 -8
  561. package/src/surfaces/rail.json +1 -159
  562. package/src/surfaces/rail.ts +22 -79
  563. package/src/surfaces/reference-field.ts +11 -15
  564. package/src/surfaces/schema-builder.ts +16 -22
  565. package/src/surfaces/schema-form.json +10 -2
  566. package/src/surfaces/schema-form.ts +17 -25
  567. package/src/surfaces/secret-field.ts +9 -6
  568. package/src/surfaces/seo.json +1 -1
  569. package/src/surfaces/seo.ts +21 -15
  570. package/src/surfaces/settings-contexts.ts +9 -7
  571. package/src/surfaces/settings-contributed.json +5 -5
  572. package/src/surfaces/settings-contributed.ts +32 -12
  573. package/src/surfaces/settings-css-vars.json +44 -36
  574. package/src/surfaces/settings-css-vars.ts +82 -16
  575. package/src/surfaces/settings-defs.json +2 -2
  576. package/src/surfaces/settings-defs.ts +17 -21
  577. package/src/surfaces/settings-deploy.json +2 -15
  578. package/src/surfaces/settings-deploy.ts +9 -16
  579. package/src/surfaces/settings-dialog.json +51 -0
  580. package/src/surfaces/settings-dialog.ts +169 -0
  581. package/src/surfaces/settings-extensions.ts +5 -6
  582. package/src/surfaces/settings-head.ts +33 -39
  583. package/src/surfaces/settings-locales.ts +8 -20
  584. package/src/surfaces/settings-overview.json +3 -3
  585. package/src/surfaces/settings-overview.ts +14 -8
  586. package/src/surfaces/settings-packages.ts +8 -7
  587. package/src/surfaces/settings-pane.json +269 -46
  588. package/src/surfaces/settings-pane.ts +88 -36
  589. package/src/surfaces/settings-rawjson.ts +5 -6
  590. package/src/surfaces/shell.json +2 -1
  591. package/src/surfaces/shell.ts +1 -2
  592. package/src/surfaces/site-panel.json +1029 -0
  593. package/src/surfaces/site-panel.ts +233 -0
  594. package/src/surfaces/slash-menu.json +63 -21
  595. package/src/surfaces/slash-menu.ts +42 -9
  596. package/src/surfaces/statements.ts +13 -18
  597. package/src/surfaces/statusbar.ts +56 -29
  598. package/src/surfaces/style-panel.ts +18 -31
  599. package/src/surfaces/stylebook-chrome.ts +3 -5
  600. package/src/surfaces/styles-panel.json +735 -0
  601. package/src/surfaces/styles-panel.ts +195 -0
  602. package/src/surfaces/styles-variables.json +149 -0
  603. package/src/surfaces/styles-variables.ts +145 -0
  604. package/src/surfaces/tab-strip.json +4 -4
  605. package/src/surfaces/tab-strip.ts +14 -13
  606. package/src/surfaces/target-line.ts +6 -7
  607. package/src/surfaces/welcome.ts +6 -8
  608. package/src/surfaces/writing-banner.json +94 -0
  609. package/src/surfaces/writing-banner.ts +80 -0
  610. package/src/tabs/bare-repeaters.ts +101 -0
  611. package/src/tabs/patch-ops.ts +4 -3
  612. package/src/tabs/project-config.ts +32 -21
  613. package/src/tabs/selection.ts +36 -8
  614. package/src/tabs/tab.ts +99 -48
  615. package/src/tabs/transact.ts +98 -53
  616. package/src/types.ts +53 -43
  617. package/src/ui/ai-credentials-form.ts +10 -13
  618. package/src/ui/ai-model-picker.ts +3 -3
  619. package/src/ui/cf-account-picker.ts +7 -9
  620. package/src/ui/color-selector.ts +9 -5
  621. package/src/ui/dynamic-slot.ts +7 -8
  622. package/src/ui/expression-editor.ts +112 -105
  623. package/src/ui/form-controls.ts +104 -56
  624. package/src/ui/formula-catalog.ts +239 -230
  625. package/src/ui/formula-chips.ts +33 -18
  626. package/src/ui/layers.ts +57 -31
  627. package/src/ui/media-picker.ts +300 -47
  628. package/src/ui/popover-surface.ts +20 -12
  629. package/src/ui/progress-modal.ts +13 -8
  630. package/src/ui/regions.ts +14 -12
  631. package/src/ui/schema-form.ts +372 -97
  632. package/src/ui/surface.ts +71 -8
  633. package/src/ui/timing.ts +9 -0
  634. package/src/ui/value-source.ts +44 -31
  635. package/src/ui/virtual-window.ts +29 -3
  636. package/src/utils/base64.ts +6 -4
  637. package/src/utils/edit-display.ts +366 -111
  638. package/src/utils/element-selectors.ts +3 -2
  639. package/src/utils/google-fonts.ts +15 -14
  640. package/src/utils/inherited-style.ts +18 -20
  641. package/src/utils/link-target.ts +1 -1
  642. package/src/utils/local-day.ts +18 -0
  643. package/src/utils/preview-format.ts +25 -3
  644. package/src/utils/strip-events.ts +49 -22
  645. package/src/utils/studio-utils.ts +29 -14
  646. package/src/view.ts +2 -3
  647. package/src/workspace/pane-derive.ts +14 -16
  648. package/src/workspace/session.ts +81 -50
  649. package/src/workspace/tab-workspace.ts +137 -0
  650. package/src/workspace/workspace-back.ts +189 -0
  651. package/src/workspace/workspace-home.ts +133 -0
  652. package/src/workspace/workspace-ids.ts +129 -0
  653. package/src/workspace/workspace-switch.ts +372 -0
  654. package/src/workspace/workspace.ts +165 -47
  655. package/styles/shell-frame.css +30 -7
  656. package/styles/shell-frame.json +15 -3
  657. package/dist/chunks/2020-va2wwra4.js +0 -4
  658. package/dist/chunks/adapter-f93pafd7.js +0 -4
  659. package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
  660. package/dist/chunks/cf-settings-125tdm0w.js +0 -4
  661. package/dist/chunks/color-area-jqhna8zy.js +0 -4
  662. package/dist/chunks/color-field-embq5ctg.js +0 -4
  663. package/dist/chunks/color-fpezvnkt.js +0 -4
  664. package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
  665. package/dist/chunks/combobox-773hdzyj.js +0 -4
  666. package/dist/chunks/components-ax2f1fnn.js +0 -4
  667. package/dist/chunks/content-source-108aqtk1.js +0 -4
  668. package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
  669. package/dist/chunks/dialog-mtm9fq5t.js +0 -4
  670. package/dist/chunks/editor-pfgdmkb0.js +0 -4
  671. package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
  672. package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
  673. package/dist/chunks/file-ops-meej5mqf.js +0 -4
  674. package/dist/chunks/files-44vp8a2s.js +0 -4
  675. package/dist/chunks/format-host-7q1petb9.js +0 -4
  676. package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
  677. package/dist/chunks/git-panel-zngbymvd.js +0 -4
  678. package/dist/chunks/grid-view-sx9vynsp.js +0 -51
  679. package/dist/chunks/icons-p44xhjf0.js +0 -4
  680. package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
  681. package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
  682. package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
  683. package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
  684. package/dist/chunks/index-wkyfjeqz.js +0 -4
  685. package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
  686. package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
  687. package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
  688. package/dist/chunks/layers-xd92fg8d.js +0 -4
  689. package/dist/chunks/listbox-s8fkmnq8.js +0 -4
  690. package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
  691. package/dist/chunks/media-picker-0svzkdyb.js +0 -4
  692. package/dist/chunks/menu-37d07z9m.js +0 -4
  693. package/dist/chunks/menu-5c55ea3d.js +0 -4
  694. package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
  695. package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
  696. package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
  697. package/dist/chunks/notify-0xgtn8q1.js +0 -4
  698. package/dist/chunks/number-field-gw7sq8rn.js +0 -4
  699. package/dist/chunks/parse-897fvqah.js +0 -4
  700. package/dist/chunks/platform-v1qctbe6.js +0 -4
  701. package/dist/chunks/popover-8htra4er.js +0 -4
  702. package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
  703. package/dist/chunks/quick-search-a54e6t5n.js +0 -4
  704. package/dist/chunks/references-gmqp82fs.js +0 -4
  705. package/dist/chunks/right-panel-v7t9awbk.js +0 -4
  706. package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
  707. package/dist/chunks/select-n3v7gwas.js +0 -4
  708. package/dist/chunks/split-pff8f3ze.js +0 -4
  709. package/dist/chunks/studio-0bhx5hz6.js +0 -5
  710. package/dist/chunks/studio-0k1ddnyy.js +0 -6
  711. package/dist/chunks/studio-1b04pd0j.js +0 -64
  712. package/dist/chunks/studio-4dwbj6gb.js +0 -5
  713. package/dist/chunks/studio-4tanh828.js +0 -5
  714. package/dist/chunks/studio-55h4mstj.js +0 -4
  715. package/dist/chunks/studio-5tnvjkz4.js +0 -5
  716. package/dist/chunks/studio-60dqgb0c.js +0 -5
  717. package/dist/chunks/studio-61dp09qg.js +0 -9
  718. package/dist/chunks/studio-63epcrj2.js +0 -5
  719. package/dist/chunks/studio-74k29dy9.js +0 -5
  720. package/dist/chunks/studio-7vg6jcd3.js +0 -5
  721. package/dist/chunks/studio-7zx31knw.js +0 -9
  722. package/dist/chunks/studio-8bxk97km.js +0 -5
  723. package/dist/chunks/studio-933e30n4.js +0 -5
  724. package/dist/chunks/studio-98wnwhbg.js +0 -5
  725. package/dist/chunks/studio-9mccjwjh.js +0 -14
  726. package/dist/chunks/studio-a2ke1e4t.js +0 -5
  727. package/dist/chunks/studio-e3a2a6v3.js +0 -4
  728. package/dist/chunks/studio-e81q1vb9.js +0 -5
  729. package/dist/chunks/studio-epgrmqqm.js +0 -5
  730. package/dist/chunks/studio-ery42sqr.js +0 -4
  731. package/dist/chunks/studio-g1shz58g.js +0 -5
  732. package/dist/chunks/studio-gf0fz03c.js +0 -5
  733. package/dist/chunks/studio-gjtpe62q.js +0 -6
  734. package/dist/chunks/studio-gkskhg7m.js +0 -5
  735. package/dist/chunks/studio-gx4dnjzd.js +0 -5
  736. package/dist/chunks/studio-j03zga3y.js +0 -9
  737. package/dist/chunks/studio-jhpxeckz.js +0 -5
  738. package/dist/chunks/studio-k01r7ykp.js +0 -5
  739. package/dist/chunks/studio-kk7h30ne.js +0 -7
  740. package/dist/chunks/studio-kt1zqney.js +0 -5
  741. package/dist/chunks/studio-m3cwhvye.js +0 -5
  742. package/dist/chunks/studio-mcayt6hz.js +0 -5
  743. package/dist/chunks/studio-myjcghv3.js +0 -5
  744. package/dist/chunks/studio-n8bxwc3y.js +0 -4
  745. package/dist/chunks/studio-ngm8gvpb.js +0 -5
  746. package/dist/chunks/studio-nj5a01jy.js +0 -928
  747. package/dist/chunks/studio-pcgz8heb.js +0 -5
  748. package/dist/chunks/studio-qcsq0t15.js +0 -5
  749. package/dist/chunks/studio-qkstvve9.js +0 -5
  750. package/dist/chunks/studio-qv1pwd3c.js +0 -5
  751. package/dist/chunks/studio-rc6dvxjb.js +0 -7
  752. package/dist/chunks/studio-s8dmmz66.js +0 -5
  753. package/dist/chunks/studio-sp5xzbj4.js +0 -6
  754. package/dist/chunks/studio-szsjbj0g.js +0 -5
  755. package/dist/chunks/studio-t1xzawhr.js +0 -16
  756. package/dist/chunks/studio-tdcprbqb.js +0 -5
  757. package/dist/chunks/studio-vrmcjf9g.js +0 -7
  758. package/dist/chunks/studio-vyc0b4he.js +0 -10
  759. package/dist/chunks/studio-w0cgf6jg.js +0 -5
  760. package/dist/chunks/studio-w3hskzqk.js +0 -5
  761. package/dist/chunks/studio-xgrgcdyh.js +0 -9
  762. package/dist/chunks/studio-xz2yxfcb.js +0 -5
  763. package/dist/chunks/studio-y6n42tgs.js +0 -5
  764. package/dist/chunks/studio-yb560vxr.js +0 -5
  765. package/dist/chunks/studio-yn9f8vtx.js +0 -5
  766. package/dist/chunks/studio-yw05w8f0.js +0 -7
  767. package/dist/chunks/studio-z16sgavc.js +0 -5
  768. package/dist/chunks/studio-zey7zsdw.js +0 -12
  769. package/dist/chunks/studio-zyqn40w4.js +0 -5
  770. package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
  771. package/dist/chunks/tabs-jwthg40w.js +0 -4
  772. package/dist/chunks/textfield-spy3hc77.js +0 -4
  773. package/dist/chunks/toast-4d35zd64.js +0 -4
  774. package/dist/chunks/toast-host-8sjmfed3.js +0 -4
  775. package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
  776. package/dist/chunks/tree-h19v1jfz.js +0 -4
  777. package/dist/chunks/tsMode-2frah6h1.js +0 -14
  778. package/dist/chunks/workspace-zt81g1ms.js +0 -4
  779. package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
  780. package/src/panels/frontmatter-panel.ts +0 -701
  781. package/src/panels/git-panel.ts +0 -1120
  782. package/src/surfaces/doc-header.json +0 -776
  783. package/src/surfaces/doc-header.ts +0 -231
  784. package/src/surfaces/git-panel.json +0 -1880
  785. package/src/surfaces/git-panel.ts +0 -272
@@ -1,16 +1,20 @@
1
1
  /// <reference lib="dom" />
2
2
  /**
3
3
  * Canvas render — extracted from studio.js (Phase 4o). Multi-mode canvas rendering orchestrator:
4
- * dispatches to manage/settings/source/edit/design/preview rendering paths.
4
+ * dispatches to source/edit/design/preview rendering paths.
5
5
  */
6
6
 
7
- import { render as litRender, nothing } from "lit-html";
7
+ import { render, nothing } from "lit-html";
8
8
  import type * as monaco from "monaco-editor";
9
9
  import type { WireDiffMarks } from "./iframe-protocol";
10
10
  import type * as Y from "yjs";
11
11
  import { loadedMonaco, loadMonaco, mountStillWanted } from "../services/monaco-lazy";
12
12
 
13
- import { getNodeAtPath, updateCanvas } from "../store";
13
+ import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
14
+ import { isString } from "@jxsuite/schema/guards";
15
+ import { errorMessage } from "@jxsuite/schema/parse";
16
+ import { stageOf } from "./surface-registry";
17
+ import { updateCanvas } from "../store";
14
18
  import { activeTab, tabIsLive, workspace } from "../workspace/workspace";
15
19
  import {
16
20
  activeMediaOfPane,
@@ -40,21 +44,25 @@ import { canRenderComparison } from "../panels/git-diff-open";
40
44
  import { releaseStageScrollbar, trackStageScrollbar } from "./stage-scrollbar";
41
45
  import { renderDiffToolbar, setDiffRepaint, setDiffToolbarHost } from "./diff-toolbar";
42
46
  import { attachCursorStyles } from "../collab/monaco-cursors";
43
- import type { AwarenessLike } from "../collab/monaco-cursors";
44
- import type { BindingAwareness } from "../collab/monaco-binding";
45
47
  import { monacoTheme, shell } from "../shell";
46
48
  import { parseSourceForPath } from "../files/file-ops";
47
49
  import { serializeDocument } from "../files/serialize-document";
48
50
  import { parseJsonDocument, serializeJson } from "@jxsuite/schema/json-layout";
49
51
  import { detachGridPanel, gridPanelMounted, renderGridMode } from "../grid/grid-panel";
50
- import { detachLibraryPane, libraryPaneMounted, renderLibraryMode } from "../browse/library-pane";
51
52
  import { detachEntryPane, entryPaneMounted, renderEntryMode } from "../content/entry-editor";
52
53
  import { detachMediaPane, mediaPaneMounted, renderMediaMode } from "../media/media-pane";
53
54
  import {
54
- detachSettingsPane,
55
- renderSettingsPane,
56
- settingsPaneMounted,
57
- } from "../panels/settings-pane";
55
+ detachVariablesView,
56
+ renderVariablesMode,
57
+ variablesViewMounted,
58
+ } from "../style/variables-view";
59
+ import { PROJECT_VARIABLES_VIEW } from "../style/project-styles";
60
+ import {
61
+ detachWorkspaceHome,
62
+ isWorkspaceHomeMode,
63
+ renderWorkspaceHome,
64
+ workspaceHomeMounted,
65
+ } from "../workspace/workspace-home";
58
66
  import { formatByName, formatForPath } from "../format/format-host";
59
67
  import {
60
68
  BUFFER_COMMIT,
@@ -64,10 +72,16 @@ import {
64
72
  commitBufferWrites,
65
73
  } from "../services/monaco-buffer";
66
74
  import { noteTyping } from "../tabs/typing";
75
+ import { normalizeDocument } from "../tabs/bare-repeaters";
67
76
  import { diffModelUrisFor, modelUriFor, monacoLangForPath } from "../services/model-uri";
68
77
  import { renderWelcome } from "../surfaces/welcome";
69
78
  import { emptyState } from "../surfaces/empty-state";
70
- import { attachDocumentHeaderHost, hasDocumentHeader } from "../panels/frontmatter-panel";
79
+ import {
80
+ attachWritingBanner,
81
+ detachWritingBanner,
82
+ renderWritingBanner,
83
+ } from "../content/writing-banner";
84
+ import { writesEntryOnCanvas } from "../content/content-collections";
71
85
  import { mountCanvasStage } from "../surfaces/canvas-stage";
72
86
  import type {
73
87
  CanvasStageActions,
@@ -236,7 +250,7 @@ function hardClearCanvasWrap(canvasWrap: HTMLElement) {
236
250
  * the two width handles apart: `data-side`, the one part the stage document draws twice).
237
251
  *
238
252
  * Per STAGE rather than per module, for the reason every other field on `CanvasSurface` is: two
239
- * panes each have a Monaco host and a card slot, and one slot would hand the second pane's stage
253
+ * panes each have a Monaco host and a banner slot, and one slot would hand the second pane's stage
240
254
  * the first pane's editor.
241
255
  */
242
256
  const _stageHosts = new WeakMap<CanvasSurface, Map<string, HTMLElement>>();
@@ -280,8 +294,8 @@ function stageActions(surface: CanvasSurface): CanvasStageActions {
280
294
  stageHosts(surface).set(detail ? `${part}:${detail}` : part, element);
281
295
  if (part === "panzoom") {
282
296
  surface.panzoomWrap = element;
283
- } else if (part === "doc-header") {
284
- attachDocumentHeaderHost(surface.paneId, element);
297
+ } else if (part === "writing-banner") {
298
+ attachWritingBanner(surface.paneId, element);
285
299
  } else if (part === "diff-toolbar") {
286
300
  setDiffToolbarHost(surface.paneId, element);
287
301
  }
@@ -317,10 +331,10 @@ function drawStage(
317
331
  entries: CanvasPanelEntry[],
318
332
  ): Promise<CanvasStageHandle | null> {
319
333
  _stageEntries.set(surface, entries);
320
- /* There is no card-host release here, and there must not be one: `renderCanvasImpl` already
321
- releases it for EVERY mode that draws no header, one branch above this one. A second answer to
334
+ /* There is no banner-host release here, and there must not be one: `renderCanvasImpl` already
335
+ releases it for EVERY mode that draws no banner, one branch above this one. A second answer to
322
336
  the same question is how the two drift — and this one would answer only for the frames that
323
- reach a stage, leaving grid, library, entry, media and settings to the first. */
337
+ reach a stage, leaving grid, the homes, entry and media to the first. */
324
338
  const standing = surface.stage;
325
339
  const stage = standing ?? mountCanvasStage(surface.wrap, view, stageActions(surface));
326
340
  surface.stage = stage;
@@ -362,9 +376,8 @@ function editorStageView(frame: "source" | "code"): CanvasStageView {
362
376
  * Release this pane's stage document.
363
377
  *
364
378
  * Called on a real mode transition and on a full reset — the two moments the structure standing on
365
- * the stage stops being the stage's. The two hosts that are handed to another module go WITH it: a
366
- * card slot or a Compare bar pointing at a detached node is a surface that draws into nothing and
367
- * never says so.
379
+ * the stage stops being the stage's. The host handed to another module goes WITH it: a Compare bar
380
+ * pointing at a detached node is a surface that draws into nothing and never says so.
368
381
  *
369
382
  * @param {CanvasSurface} surface
370
383
  */
@@ -376,7 +389,6 @@ function detachCanvasStage(surface: CanvasSurface): void {
376
389
  surface.stage = null;
377
390
  _stageHosts.delete(surface);
378
391
  _stageEntries.delete(surface);
379
- attachDocumentHeaderHost(surface.paneId, null);
380
392
  setDiffToolbarHost(surface.paneId, null);
381
393
  }
382
394
 
@@ -412,13 +424,15 @@ async function createSourceCollabBinding(
412
424
  ): Promise<() => void> {
413
425
  const { bindMonacoToYText } = await import("../collab/monaco-binding");
414
426
  const unbind = bindMonacoToYText({
415
- awareness: ctx.awareness as unknown as BindingAwareness,
427
+ awareness: ctx.awareness,
416
428
  editors: [editor],
417
429
  model,
418
430
  origin: ctx.localOrigin,
431
+ /* SAFETY: collabSourceContext's `text` is `collab.sourceText(handle.doc)`, the session's shared
432
+ source Y.Text, attached to the handle's Y.Doc as the binding requires. */
419
433
  text: ctx.text as Y.Text,
420
434
  });
421
- const detachStyles = attachCursorStyles(ctx.awareness as unknown as AwarenessLike, document);
435
+ const detachStyles = attachCursorStyles(ctx.awareness, document);
422
436
  return () => {
423
437
  detachStyles();
424
438
  unbind();
@@ -558,7 +572,7 @@ function sideMarks(
558
572
  */
559
573
  async function mountDiffEditor(
560
574
  surface: CanvasSurface,
561
- container: Element,
575
+ container: HTMLElement,
562
576
  state: GitDiffState,
563
577
  ): Promise<void> {
564
578
  const { paneId } = surface;
@@ -589,17 +603,20 @@ async function mountDiffEditor(
589
603
  lang,
590
604
  monaco.Uri.parse(uris.work),
591
605
  );
592
- const editor = monaco.editor.createDiffEditor(container as HTMLElement, {
593
- automaticLayout: true,
594
- fontFamily: "'JetBrains Mono', 'SF Mono', 'Fira Code', 'Consolas', monospace",
595
- fontSize: 12,
596
- minimap: { enabled: false },
597
- originalEditable: false,
598
- readOnly: true,
599
- renderSideBySide: true,
600
- scrollBeyondLastLine: false,
601
- theme: monacoTheme(),
602
- }) as NonNullable<CanvasSurface["monacoDiffEditor"]>;
606
+ const editor: NonNullable<CanvasSurface["monacoDiffEditor"]> = monaco.editor.createDiffEditor(
607
+ container,
608
+ {
609
+ automaticLayout: true,
610
+ fontFamily: "'JetBrains Mono', 'SF Mono', 'Fira Code', 'Consolas', monospace",
611
+ fontSize: 12,
612
+ minimap: { enabled: false },
613
+ originalEditable: false,
614
+ readOnly: true,
615
+ renderSideBySide: true,
616
+ scrollBeyondLastLine: false,
617
+ theme: monacoTheme(),
618
+ },
619
+ );
603
620
  editor.setModel({ modified, original });
604
621
  editor._diffKey = key;
605
622
  surface.monacoDiffEditor = editor;
@@ -609,10 +626,11 @@ function resetCanvasView(surface: CanvasSurface) {
609
626
  const canvasWrap = surface.wrap;
610
627
  const { paneId } = surface;
611
628
  detachGridPanel(paneId);
612
- detachLibraryPane(paneId);
613
629
  detachEntryPane(paneId);
630
+ detachWritingBanner(paneId);
614
631
  detachMediaPane(paneId);
615
- detachSettingsPane(paneId);
632
+ detachVariablesView(paneId);
633
+ detachWorkspaceHome(paneId);
616
634
  disposeSourceCollab(surface);
617
635
  disposeSourceEditor(surface);
618
636
  disposeDiffEditor(surface);
@@ -663,7 +681,7 @@ function resetCanvasView(surface: CanvasSurface) {
663
681
  async function mountSourceEditor(
664
682
  tab: Tab,
665
683
  surface: CanvasSurface,
666
- editorContainer: Element,
684
+ editorContainer: HTMLElement,
667
685
  filePath: string,
668
686
  lang: string,
669
687
  ): Promise<void> {
@@ -757,7 +775,7 @@ async function mountSourceEditor(
757
775
  // Typed as the surface `view` declares (the editor plus `_ignoreNextChange` / `_writes`), because
758
776
  // The instance is HELD here now rather than re-read off `view.monacoEditor` in every callback.
759
777
  const sourceEditor: NonNullable<typeof surface.monacoEditor> = monaco.editor.create(
760
- editorContainer as unknown as HTMLElement,
778
+ editorContainer,
761
779
  {
762
780
  automaticLayout: true,
763
781
  fontFamily: "'JetBrains Mono', 'SF Mono', 'Fira Code', 'Consolas', monospace",
@@ -832,8 +850,10 @@ async function mountSourceEditor(
832
850
  if (!tabIsLive(tab)) {
833
851
  return;
834
852
  }
835
- tab.doc.document = document as JxMutableNode;
853
+ tab.doc.document = document;
836
854
  tab.doc.content.frontmatter = frontmatter;
855
+ // The buffer is the author's own spelling now, so it is what the next save keeps.
856
+ tab.doc.source = sourceEditor.getValue();
837
857
  tab.doc.dirty = true;
838
858
  writes.markSettled();
839
859
  } catch {
@@ -845,7 +865,12 @@ async function mountSourceEditor(
845
865
  // The buffer's text is the author's own layout now — the objects they opened up or
846
866
  // Closed, the blank lines they left — so it is what the next save preserves.
847
867
  const parsed = parseJsonDocument(sourceEditor.getValue());
848
- tab.doc.document = parsed.document as JxMutableNode;
868
+ /* SAFETY: a JSON source tab holds a Jx document, whose schema makes the top-level object
869
+ parseJsonDocument returns a node; text that does not parse throws into the catch. */
870
+ const document = parsed.document as JxMutableNode;
871
+ // The member form every edit assumes, and the record of the bare repeaters the text wrote.
872
+ tab.doc.bareRepeaters = normalizeDocument(document);
873
+ tab.doc.document = document;
849
874
  tab.doc.layout = parsed.layout;
850
875
  tab.doc.dirty = true;
851
876
  writes.markSettled();
@@ -930,7 +955,7 @@ function renderDerivationNotice(
930
955
  surface.wrap.style.display = "block";
931
956
  const registry = activeRegistry();
932
957
  const pin = registry?.get("pane.pin");
933
- litRender(
958
+ render(
934
959
  emptyState(surface.wrap, {
935
960
  message,
936
961
  ...(held && { detail: `${tabLabel(held)} is still open here.` }),
@@ -954,7 +979,7 @@ function renderCanvasImpl(surface: CanvasSurface) {
954
979
  /* Every read below is scoped to ONE pane. The stage, the panels it mounted and the mode it draws
955
980
  are the surface's; the document is whatever tab that pane is showing, which is `activeTab` only
956
981
  when the pane is the focused one. */
957
- const canvasWrap = surface.wrap;
982
+ const canvasWrap = stageOf(surface);
958
983
  /* A pane with no stage renders nothing — it is not an error and it is not a fallback to some
959
984
  other pane's stage. Two schedulers can name a stage-less pane: a frame queued for a pane that
960
985
  lost the shell's single stage between the schedule and the rAF, and `escalateToFullRender` on
@@ -970,7 +995,6 @@ function renderCanvasImpl(surface: CanvasSurface) {
970
995
  // No active tab — reset every piece of canvas view state so reopening a file can never inherit
971
996
  // A stale Lit part, a dead Monaco editor, or a mismatched prevCanvasMode (the toxic states that
972
997
  // Previously left the canvas unrenderable until a full reload).
973
- attachDocumentHeaderHost(surface.paneId, null);
974
998
  resetCanvasView(surface);
975
999
  /* A DERIVED pane with nothing to draw explains itself. It is not the welcome screen and it is
976
1000
  not a blank stage: it is a standing rule that has not resolved — "Select an element inside a
@@ -1000,7 +1024,6 @@ function renderCanvasImpl(surface: CanvasSurface) {
1000
1024
  follow has run and a stage that blanked on that would flicker on every retarget. */
1001
1025
  const staleDerivation = derivationOfPane(surface.paneId);
1002
1026
  if (staleDerivation?.status === "unavailable" && staleDerivation.reason) {
1003
- attachDocumentHeaderHost(surface.paneId, null);
1004
1027
  resetCanvasView(surface);
1005
1028
  /* …and for a COMPANION, what it is still holding. `tab` here is the pane's OWN document for a
1006
1029
  companion and the SOURCE pane's for a lens — the hop `tabOfPane` takes — so the kind decides
@@ -1012,6 +1035,8 @@ function renderCanvasImpl(surface: CanvasSurface) {
1012
1035
  );
1013
1036
  return;
1014
1037
  }
1038
+ /* SAFETY: `initCanvasRender` runs at studio boot (studio.ts), before the shell schedules the first
1039
+ pane render, and nothing resets `_ctx` afterwards. */
1015
1040
  const ctx = _ctx as CanvasRenderCtx;
1016
1041
  const S = {
1017
1042
  document: tab.doc.document,
@@ -1024,28 +1049,19 @@ function renderCanvasImpl(surface: CanvasSurface) {
1024
1049
  // Re-rendering the previous mode's panels in place.
1025
1050
  const canvasMode = canvasModeOfPane(surface.paneId);
1026
1051
 
1027
- /* The Document Header card is drawn by the STAGE, and only by Edit's. It is docked
1028
- above the page's scroller, a band across the pane at 1:1: its width is the PANE's rather than
1029
- the breakpoint's, and the page scrolls under it rather than taking it along. It used to go
1030
- INSIDE Edit's column, where it was exactly as wide as whatever breakpoint or dragged width the
1031
- column had and scrolled off with the first screen of the page, and it was pinned above Design's
1032
- artboards as well. Design omits it now, so the artboards get the whole pane, and nothing is
1033
- lost by that: the Navigator's Page panel carries the same fields in every mode.
1034
- `hasDocumentHeader` is the other predicate, and it is a fact about the DOCUMENT. It used to
1035
- carry two more clauses, suppressing the card while a function body or a formula was open on
1036
- the grounds that those sub-editors took the whole stage. They open in the dock's Logic tab now
1037
- (§16.3) and the page is still on screen behind it, so those clauses only DETACHED the visible
1038
- card: it stopped re-rendering and quietly showed frontmatter from before the edit. */
1039
- /* …and NOT in a lens. The Document Header is an editing surface — Title, Route, SEO, the raw
1040
- frontmatter — over a document this pane does not own, and two cards editing one document's
1041
- frontmatter side by side is two writers for one field. A lens is a view; the card belongs to
1042
- the pane that owns the tab. */
1043
- const wantsDocHeader =
1052
+ /* Edit draws the page and nothing above it (§4.2): a document's settings — title, URL, layout,
1053
+ frontmatter, description, Search appearance — are the Inspector's Page tab's (§6), in every
1054
+ mode, so the stage carries no card of its own and the page starts at the top of the pane.
1055
+ A collection entry written in Edit carries the writing-mode banner (§22.5): the canvas wraps it
1056
+ in its template's layout, and the banner says the layout is locked. Not in a lens: the
1057
+ banner's door belongs to the pane that owns the tab, and a lens is a view. */
1058
+ const wantsWritingBanner =
1044
1059
  canvasMode === "edit" &&
1045
1060
  derivationOfPane(surface.paneId)?.kind !== "lens" &&
1046
- hasDocumentHeader(tab);
1047
- if (!wantsDocHeader) {
1048
- attachDocumentHeaderHost(surface.paneId, null);
1061
+ Boolean(projectState?.isSiteProject) &&
1062
+ writesEntryOnCanvas(tab.documentPath);
1063
+ if (!wantsWritingBanner) {
1064
+ detachWritingBanner(surface.paneId);
1049
1065
  }
1050
1066
 
1051
1067
  /* Advance THIS stage's render generation so stale async renders from its previous pass bail out.
@@ -1154,12 +1170,6 @@ function renderCanvasImpl(surface: CanvasSurface) {
1154
1170
  return;
1155
1171
  }
1156
1172
 
1157
- // Library fast-path, same shape: the Library pane owns its own reactivity (view state, scan,
1158
- // Window), so a same-tab re-render while it is mounted needs nothing from the canvas pipeline.
1159
- if (canvasMode === "manage" && libraryPaneMounted(surface.paneId, tab) && !modeChanged) {
1160
- return;
1161
- }
1162
-
1163
1173
  // Entry fast-path, same shape: the entry form owns its own effect over the tab's frontmatter, so
1164
1174
  // A field commit repaints the form and nothing reaches the canvas pipeline.
1165
1175
  if (canvasMode === "entry" && entryPaneMounted(surface.paneId, tab) && !modeChanged) {
@@ -1172,9 +1182,21 @@ function renderCanvasImpl(surface: CanvasSurface) {
1172
1182
  return;
1173
1183
  }
1174
1184
 
1175
- // Settings fast-path, same shape: the Project Settings editor subscribes to the section registry
1176
- // And to its own chosen section, so a mounted editor needs nothing from the canvas pipeline.
1177
- if (canvasMode === "settings" && settingsPaneMounted(surface) && !modeChanged) {
1185
+ // Variables fast-path, same shape: the view follows the document through its own effect.
1186
+ if (
1187
+ canvasMode === PROJECT_VARIABLES_VIEW &&
1188
+ variablesViewMounted(surface.paneId, tab) &&
1189
+ !modeChanged
1190
+ ) {
1191
+ return;
1192
+ }
1193
+
1194
+ // Workspace-home fast-path, same shape: a home is a standing document with nothing to re-render.
1195
+ if (
1196
+ isWorkspaceHomeMode(canvasMode) &&
1197
+ workspaceHomeMounted(surface.paneId, tab) &&
1198
+ !modeChanged
1199
+ ) {
1178
1200
  return;
1179
1201
  }
1180
1202
 
@@ -1191,10 +1213,11 @@ function renderCanvasImpl(surface: CanvasSurface) {
1191
1213
  const curCustomized = shell.stylebook.customizedOnly;
1192
1214
  const filterChanged =
1193
1215
  curFilter !== surface.prevStylebookFilter ||
1194
- curCustomized !== surface.prevStylebookCustomizedOnly;
1216
+ curCustomized !== surface.prevStylebookCustomizedOnly ||
1217
+ activeMediaOfPane(surface.paneId) !== surface.prevStylebookMedia;
1195
1218
  if (!filterChanged) {
1196
- const style = transposeStylebookStyle(getEffectiveStyle(tab.doc.document?.style));
1197
- if (postStyleUpdateToStylebookHosts(style as Record<string, unknown>) > 0) {
1219
+ const style = transposeStylebookStyle(getEffectiveStyle(tab.doc.document.style));
1220
+ if (postStyleUpdateToStylebookHosts(style) > 0) {
1198
1221
  return;
1199
1222
  }
1200
1223
  }
@@ -1238,18 +1261,18 @@ function renderCanvasImpl(surface: CanvasSurface) {
1238
1261
  // Destroy the grid panel if switching away from grid mode
1239
1262
  detachGridPanel(surface.paneId);
1240
1263
 
1241
- // The Library holds an IntersectionObserver and an LRU of live runtime subtrees; leaving the
1242
- // Mode without releasing them is exactly the unbounded retention its LRU cap exists to remove.
1243
- detachLibraryPane(surface.paneId);
1244
-
1245
- // Same for the entry form, whose effect scope subscribes to the document's frontmatter
1264
+ // The entry form's effect scope subscribes to the document's frontmatter
1246
1265
  detachEntryPane(surface.paneId);
1247
1266
 
1248
1267
  // And for the media viewer, whose effect scope subscribes to the tab's path
1249
1268
  detachMediaPane(surface.paneId);
1250
1269
 
1251
- // Same for the Project Settings editor, which holds a registry subscription
1252
- detachSettingsPane(surface.paneId);
1270
+ // And for the Variables view, whose effect scope subscribes to the document's style
1271
+ detachVariablesView(surface.paneId);
1272
+
1273
+ // And for a workspace home, whose surface holds a mounted document (the Content home's
1274
+ // IntersectionObserver and preview LRU among them)
1275
+ detachWorkspaceHome(surface.paneId);
1253
1276
 
1254
1277
  // Dispose Monaco editor if switching away from source mode
1255
1278
  disposeSourceCollab(surface);
@@ -1261,7 +1284,7 @@ function renderCanvasImpl(surface: CanvasSurface) {
1261
1284
  leaving, and lit's part, which the empty-state and welcome paths own. */
1262
1285
  releaseCanvasHosts(canvasWrap);
1263
1286
  detachCanvasStage(surface);
1264
- litRender(nothing, canvasWrap);
1287
+ render(nothing, canvasWrap);
1265
1288
  surface.panzoomWrap = null;
1266
1289
  // Reset inline style overrides from other modes
1267
1290
  canvasWrap.style.padding = "";
@@ -1282,6 +1305,7 @@ function renderCanvasImpl(surface: CanvasSurface) {
1282
1305
  if (canvasMode === "stylebook") {
1283
1306
  surface.prevStylebookFilter = shell.stylebook.filter;
1284
1307
  surface.prevStylebookCustomizedOnly = shell.stylebook.customizedOnly;
1308
+ surface.prevStylebookMedia = activeMediaOfPane(surface.paneId);
1285
1309
  void renderStylebookMode(surface, {
1286
1310
  applyTransform,
1287
1311
  canvasPanelEntry,
@@ -1360,29 +1384,8 @@ function renderCanvasImpl(surface: CanvasSurface) {
1360
1384
  return;
1361
1385
  }
1362
1386
 
1363
- /* Settings mode: the Project Settings document (§17.1). Same non-iframe-editor pattern as
1364
- grid and stylebook — the panel owns its own reactivity from here — and the reason the seven
1365
- settings screenshots now crop `pane.primary` instead of `overlay.dialog:settings` without one
1366
- manifest step changing. */
1367
- if (canvasMode === "settings") {
1368
- canvasWrap.style.padding = "0";
1369
- canvasWrap.style.display = "block";
1370
- renderSettingsPane(surface);
1371
- return;
1372
- }
1373
-
1374
- /* Library mode: the project's own contents, over a GridSource, in one of five layouts
1375
- (`browse/library-pane.ts`). `commands/context.ts` already mapped `manage` to the `library`
1376
- editor kind — this is the surface that map was pointing at. */
1377
- if (canvasMode === "manage") {
1378
- canvasWrap.style.padding = "0";
1379
- canvasWrap.style.display = "block";
1380
- renderLibraryMode(surface, tab);
1381
- return;
1382
- }
1383
-
1384
1387
  /* Entry mode: one content entry's fields, typed by its collection's schema
1385
- (`content/entry-editor.ts`). Same non-iframe-editor pattern as the Library and Settings — and
1388
+ (`content/entry-editor.ts`). Same non-iframe-editor pattern as the grid and the homes — and
1386
1389
  the reason `entry` is in `commands/context.ts`'s mode map, without which a form over a
1387
1390
  frontmatter record would have resolved into the CANVAS key scope. */
1388
1391
  if (canvasMode === "entry") {
@@ -1401,6 +1404,22 @@ function renderCanvasImpl(surface: CanvasSurface) {
1401
1404
  return;
1402
1405
  }
1403
1406
 
1407
+ /* The Styles workspace's Variables view: `project.json`'s CSS custom properties, edited in a
1408
+ form (`style/variables-view.ts`). Like a home, it writes nothing onto the stage: its own style
1409
+ block fills it (`surfaces/styles-variables.json`). */
1410
+ if (canvasMode === PROJECT_VARIABLES_VIEW) {
1411
+ renderVariablesMode(surface, tab);
1412
+ return;
1413
+ }
1414
+
1415
+ /* A workspace's home: the surface a workspace opens on when none of its own tabs is open
1416
+ (`workspace/workspace-home.ts`). Unlike the five above it writes nothing onto the stage: the
1417
+ home's own style block fills it (`surfaces/publish-workspace.json`, for one). */
1418
+ if (isWorkspaceHomeMode(canvasMode)) {
1419
+ renderWorkspaceHome(surface, tab);
1420
+ return;
1421
+ }
1422
+
1404
1423
  // Grid mode: spreadsheet editor over the tab's grid source (mirrors the Monaco/stylebook
1405
1424
  // Non-iframe-editor pattern; the panel owns its own reactivity from here).
1406
1425
  if (canvasMode === "grid") {
@@ -1465,7 +1484,7 @@ function renderCanvasImpl(surface: CanvasSurface) {
1465
1484
  decided rather than the opener: a comparison reaches this branch from three doors (the panel,
1466
1485
  a Diff lens, the Editor axis) and only this one sees every arrival. Forcing it here also
1467
1486
  leaves `diffView` alone, so a document opened after a `.css` still comes up Visual. */
1468
- const renderable = canRenderComparison(gitDiffState.filePath ?? "");
1487
+ const renderable = canRenderComparison(gitDiffState.filePath);
1469
1488
  if (diffShowsCode(surface.paneId, renderable)) {
1470
1489
  /* A null map is how the toolbar learns there is no visual half to offer: it draws Code as a
1471
1490
  static label rather than as half of a choice, and reports the line marks instead of a node
@@ -1518,12 +1537,15 @@ function renderCanvasImpl(surface: CanvasSurface) {
1518
1537
 
1519
1538
  /** @param {string} content */
1520
1539
  const parseContent = (content: string): Promise<JxMutableNode> => {
1521
- const fmtPath = gitDiffState.filePath ?? "";
1540
+ const fmtPath = gitDiffState.filePath;
1522
1541
  if (formatForPath(fmtPath)) {
1523
1542
  return parseSourceForPath(fmtPath, content).then((r) => r.document);
1524
1543
  }
1525
1544
  return Promise.resolve().then(() => {
1526
1545
  try {
1546
+ /* SAFETY: a side of a VISUAL comparison is a revision of a document the canvas renders
1547
+ (canRenderComparison chose this half), a JSON Jx document; unparseable text throws into
1548
+ the catch, which draws the failure instead. */
1527
1549
  return JSON.parse(content) as JxMutableNode;
1528
1550
  } catch {
1529
1551
  return {
@@ -1636,31 +1658,26 @@ function renderCanvasImpl(surface: CanvasSurface) {
1636
1658
  const entry = canvasPanelEntry(null, null, true);
1637
1659
  // A component-definition doc (root tag is a custom element) is a fragment, not a page: it should
1638
1660
  // Hug its content rather than have the column fill+stretch to the viewport (dead scroll space).
1639
- const rootTag = (S.document as { tagName?: unknown }).tagName;
1640
- const isComponentDoc = typeof rootTag === "string" && rootTag.includes("-");
1661
+ const rootTag = S.document.tagName;
1662
+ const isComponentDoc = isString(rootTag) && rootTag.includes("-");
1641
1663
  const { featureToggles: editToggles } = S.ui;
1642
- /* The stage stacks when it carries the card: the band first, the page's scroller below it.
1643
- Set on every render rather than on the transition, because whether a document HAS a header
1644
- changes with the tab and not with the mode. `editors.ts` and `formula-workspace.ts` already
1645
- claim the column this way — `#canvas-wrap` is a row by default and each surface states its
1646
- own axis. Stretched, because the band is as wide as the PANE: that is the whole difference
1647
- between docking the card here and drawing it in the column, whose width is the breakpoint's
1648
- or the drag's.
1649
- And FLUSH: the cell's own 24px gap (`pane-grid.json`) between two side-by-side surfaces is
1650
- dead space between a docked band and the box below it. The scroller clips its content at its
1651
- top edge, so the gap put that edge 24px below the band's border with nothing drawn in
1652
- between — the page ended at an invisible line and the band read as a hairline over one
1653
- continuous surface. At 0 the clip happens AT the border, which is what makes the border read
1654
- as the band's edge; the scroller's own 32px of top padding is the breathing room. */
1655
- canvasWrap.style.flexDirection = wantsDocHeader ? "column" : "";
1656
- canvasWrap.style.alignItems = wantsDocHeader ? "stretch" : "";
1657
- canvasWrap.style.gap = wantsDocHeader ? "0px" : "";
1664
+ /* The stage stacks when it carries the writing banner: the band first, the page's scroller
1665
+ below it. Set on every render rather than on the transition, because whether a document is
1666
+ a collection entry changes with the tab and not with the mode. `editors.ts` and
1667
+ `formula-workspace.ts` already claim the column this way — `#canvas-wrap` is a row by
1668
+ default and each surface states its own axis. Stretched, because the band is as wide as the
1669
+ PANE rather than the breakpoint's column. And FLUSH: the cell's own 24px gap
1670
+ (`pane-grid.json`) between two side-by-side surfaces would be dead space between the band and
1671
+ the scroller below it, whose own 32px of top padding is the breathing room. */
1672
+ const stacks = wantsWritingBanner;
1673
+ canvasWrap.style.flexDirection = stacks ? "column" : "";
1674
+ canvasWrap.style.alignItems = stacks ? "stretch" : "";
1675
+ canvasWrap.style.gap = stacks ? "0px" : "";
1658
1676
  void drawStage(
1659
1677
  surface,
1660
1678
  {
1661
- /* The card LEADS the frame (`tests/canvas-render.test.ts`, "Edit docks it above the page's
1662
- scroller"): a sibling of the scroller rather than a block of the column, so the page
1663
- scrolls under it and the breakpoint does not size it. The two handles are not in the
1679
+ /* The banner LEADS the frame: a sibling of the scroller rather than a block of the column,
1680
+ so the page scrolls under it and the breakpoint does not size it. The two handles are not in the
1664
1681
  column either: they are `jx-split`s standing beside it in the canvas's row, because the
1665
1682
  canvas is the track a splitter has to measure and the column is the thing being
1666
1683
  resized. */
@@ -1670,7 +1687,7 @@ function renderCanvasImpl(surface: CanvasSurface) {
1670
1687
  handles: "shown",
1671
1688
  hug: isComponentDoc,
1672
1689
  innerPart: "edit-column",
1673
- lead: wantsDocHeader ? "header" : "none",
1690
+ lead: wantsWritingBanner ? "banner" : "none",
1674
1691
  panels: [entry.item],
1675
1692
  },
1676
1693
  [entry],
@@ -1678,8 +1695,13 @@ function renderCanvasImpl(surface: CanvasSurface) {
1678
1695
  if (!stage) {
1679
1696
  return;
1680
1697
  }
1698
+ if (wantsWritingBanner) {
1699
+ renderWritingBanner(surface.paneId, tab);
1700
+ }
1681
1701
  const editColumn = stageHost(surface, "edit-column");
1682
1702
  const scroller = stageHost(surface, "edit-canvas");
1703
+ /* SAFETY: the edit stage view always draws its `edit-canvas` part, and this runs only once
1704
+ drawStage settled with that stage (the `!stage` return above). */
1683
1705
  entry.panel.scrollContainer = scroller as HTMLElement;
1684
1706
  /* The one mode whose stage SCROLLS under the zoom pod, so the one that tells the pane how
1685
1707
  wide its scrollbar is. The pod floats in the pane's chrome layer, which spans the gutter
@@ -1717,9 +1739,9 @@ function renderCanvasImpl(surface: CanvasSurface) {
1717
1739
  canvasWrap.style.padding = "0";
1718
1740
  canvasWrap.style.overflow = "hidden";
1719
1741
  }
1720
- /* No Document Header here, so the stage cell stays the row it is by default: the card is Edit's
1721
- alone (see `wantsDocHeader`), and the transition into this mode has already cleared the two
1722
- inline writes Edit makes to stack it. */
1742
+ /* Nothing leads Design's frame, so the stage cell stays the row it is by default: the writing
1743
+ banner is Edit's alone (see `wantsWritingBanner`), and the transition into this mode has
1744
+ already cleared the inline writes Edit makes to stack it. */
1723
1745
 
1724
1746
  const {
1725
1747
  sizeBreakpoints,
@@ -1733,7 +1755,7 @@ function renderCanvasImpl(surface: CanvasSurface) {
1733
1755
  if (!hasMedia) {
1734
1756
  // Single panel — use baseWidth if a custom one is defined, otherwise full-width
1735
1757
  const effectiveMedia = getEffectiveMedia(S.document.$media);
1736
- const hasBaseWidth = effectiveMedia && effectiveMedia["--"];
1758
+ const hasBaseWidth = effectiveMedia["--"];
1737
1759
  const label = hasBaseWidth ? `${mediaDisplayName("--")} (${baseWidth}px)` : null;
1738
1760
  const entry = canvasPanelEntry(
1739
1761
  hasBaseWidth ? "base" : null,
@@ -1900,8 +1922,11 @@ function renderCanvasIntoPanel(
1900
1922
  ) {
1901
1923
  const gen = passGen ?? surface.renderGeneration;
1902
1924
  const tab = tabOfPane(surface.paneId);
1925
+ /* SAFETY: every caller is a renderCanvasImpl pass, which returns before drawing any panel when its
1926
+ pane has no tab, so without an override `tab` was non-null when this pass began; the git-diff
1927
+ callers always pass their override. */
1903
1928
  const docToRender = docOverride || (tab?.doc.document as JxMutableNode);
1904
- const canvas = panel.canvas as HTMLElement;
1929
+ const { canvas } = panel;
1905
1930
 
1906
1931
  canvasPerf.panelRenders += 1;
1907
1932
  panel.ready = false;
@@ -1947,14 +1972,16 @@ function renderCanvasIntoPanel(
1947
1972
  // The canvas you are looking at; it says so itself.
1948
1973
  }
1949
1974
  })
1950
- .catch((error: unknown) => {
1951
- const detail = error instanceof Error ? error.message : String(error);
1952
- notify.error("The canvas could not be mounted.", {
1953
- detail,
1954
- key: "canvas.mount",
1955
- source: "Canvas",
1956
- });
1957
- });
1975
+ .catch(reportMountFailure);
1976
+ }
1977
+
1978
+ /** A canvas mount that rejected, reported as a Problem with the failure's own message. */
1979
+ function reportMountFailure(cause: unknown): void {
1980
+ notify.error("The canvas could not be mounted.", {
1981
+ detail: errorMessage(cause),
1982
+ key: "canvas.mount",
1983
+ source: "Canvas",
1984
+ });
1958
1985
  }
1959
1986
 
1960
1987
  /*
@@ -1974,11 +2001,11 @@ setSurfaceTeardown((surface) => {
1974
2001
  clearDiffView(surface.paneId);
1975
2002
  setDiffToolbarHost(surface.paneId, null);
1976
2003
  detachGridPanel(surface.paneId);
1977
- detachLibraryPane(surface.paneId);
1978
2004
  detachEntryPane(surface.paneId);
1979
2005
  detachMediaPane(surface.paneId);
1980
- detachSettingsPane(surface.paneId);
1981
- attachDocumentHeaderHost(surface.paneId, null);
2006
+ detachVariablesView(surface.paneId);
2007
+ detachWorkspaceHome(surface.paneId);
2008
+ detachWritingBanner(surface.paneId);
1982
2009
  disposeSourceCollab(surface);
1983
2010
  disposeSourceEditor(surface);
1984
2011
  surface.centerObserver?.disconnect();
@@ -2012,7 +2039,7 @@ function refuseUnresolvableToken(token: string): void {
2012
2039
  throw new RangeError(`command "insert.data" needs an open document; no tab is active`);
2013
2040
  }
2014
2041
  const root = tokenRoot(token);
2015
- const state = (tab.doc.document.state ?? {}) as Record<string, unknown>;
2042
+ const state = tab.doc.document.state ?? {};
2016
2043
  if (root === "state") {
2017
2044
  const name = token.split(".")[1] ?? "";
2018
2045
  if (!(name in state)) {