@jxsuite/studio 6.1.0 → 6.1.2

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 (645) hide show
  1. package/dist/chunks/2020-f2gkpy8d.js +4 -0
  2. package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
  3. package/dist/chunks/adapter-4912g339.js +4 -0
  4. package/dist/chunks/cf-account-picker-wccaenh6.js +4 -0
  5. package/dist/chunks/cf-settings-br6105tr.js +4 -0
  6. package/dist/chunks/color-28ksk2qm.js +4 -0
  7. package/dist/chunks/color-area-0fj8a4ga.js +4 -0
  8. package/dist/chunks/color-field-xch8kx2g.js +4 -0
  9. package/dist/chunks/color-slider-jxd8v350.js +4 -0
  10. package/dist/chunks/combobox-p0efwjke.js +4 -0
  11. package/dist/chunks/components-db68vsn7.js +4 -0
  12. package/dist/chunks/content-source-1449qesq.js +4 -0
  13. package/dist/chunks/convert-to-repeater-5h457egj.js +4 -0
  14. package/dist/chunks/dialog-c4x05vyx.js +4 -0
  15. package/dist/chunks/editor-x9jn86a7.js +4 -0
  16. package/dist/chunks/entry-commands-may24cpt.js +4 -0
  17. package/dist/chunks/extension-sections-pvr14vxr.js +4 -0
  18. package/dist/chunks/file-ops-x9v54pcj.js +4 -0
  19. package/dist/chunks/files-j3knqf0s.js +4 -0
  20. package/dist/chunks/format-host-tyre2trb.js +4 -0
  21. package/dist/chunks/fs-events-64ma9htc.js +4 -0
  22. package/dist/chunks/git-panel-84ps5dex.js +4 -0
  23. package/dist/chunks/grid-view-d2wq9ezg.js +51 -0
  24. package/dist/chunks/icons-pnfz478q.js +4 -0
  25. package/dist/chunks/iframe-entry-fvbk89gm.js +5 -0
  26. package/dist/chunks/iframe-entry-jdcktez8.js +5 -0
  27. package/dist/chunks/iframe-entry-x0ygf2yr.js +5 -0
  28. package/dist/chunks/iframe-entry-zap785cw.js +5 -0
  29. package/dist/chunks/iframe-host-ck6vejt5.js +4 -0
  30. package/dist/chunks/index-b8xw3vy9.js +4 -0
  31. package/dist/chunks/{index-gybvv7a6.js → index-zpjmzqfk.js} +3 -3
  32. package/dist/chunks/{javascript-rnvdp3k4.js → javascript-m54mnwp6.js} +3 -3
  33. package/dist/chunks/jsonMode-w15cmrcm.js +13 -0
  34. package/dist/chunks/jx-validate-at3zn8wa.js +4 -0
  35. package/dist/chunks/layers-h4xp1pss.js +4 -0
  36. package/dist/chunks/layers-panel-m5hw1d7g.js +4 -0
  37. package/dist/chunks/listbox-e74qjyq6.js +4 -0
  38. package/dist/chunks/lit-html-8t8t3dnr.js +4 -0
  39. package/dist/chunks/media-picker-2cweexc5.js +4 -0
  40. package/dist/chunks/menu-n6yzswmy.js +4 -0
  41. package/dist/chunks/menu-ynw13y0s.js +4 -0
  42. package/dist/chunks/monaco-binding-7gx83x3r.js +4 -0
  43. package/dist/chunks/monaco-buffer-qzxn567r.js +4 -0
  44. package/dist/chunks/monaco-setup-gxf6656g.js +4 -0
  45. package/dist/chunks/notify-cj5zbrs2.js +4 -0
  46. package/dist/chunks/number-field-y62xq0ty.js +4 -0
  47. package/dist/chunks/parse-b7ddhr8m.js +4 -0
  48. package/dist/chunks/platform-3dfws9js.js +4 -0
  49. package/dist/chunks/popover-jt2gxmzs.js +4 -0
  50. package/dist/chunks/publish-panel-1gvxbj21.js +4 -0
  51. package/dist/chunks/quick-search-0dajrwqg.js +4 -0
  52. package/dist/chunks/references-49qgt404.js +4 -0
  53. package/dist/chunks/right-panel-jm1bwe53.js +4 -0
  54. package/dist/chunks/section-registry-6kwc4fky.js +4 -0
  55. package/dist/chunks/select-rzds841e.js +4 -0
  56. package/dist/chunks/split-n2gfpm5m.js +4 -0
  57. package/dist/chunks/{studio-5g0ag7c0.js → studio-0q988f9w.js} +3 -3
  58. package/dist/chunks/studio-0rt52vpq.js +5 -0
  59. package/dist/chunks/studio-18vgbhs5.js +5 -0
  60. package/dist/chunks/{studio-pxg4ap1e.js → studio-1fxkaaea.js} +4 -4
  61. package/dist/chunks/studio-24mccdrj.js +5 -0
  62. package/dist/chunks/studio-2eh507zk.js +9 -0
  63. package/dist/chunks/studio-2hcbccfv.js +5 -0
  64. package/dist/chunks/studio-2j1cb95x.js +5 -0
  65. package/dist/chunks/studio-2jbs3rxv.js +5 -0
  66. package/dist/chunks/{studio-qbj760tx.js → studio-485046te.js} +7 -7
  67. package/dist/chunks/studio-4h8k4dw9.js +5 -0
  68. package/dist/chunks/studio-5f6n18kx.js +5 -0
  69. package/dist/chunks/studio-5gthpky6.js +5 -0
  70. package/dist/chunks/studio-5ve6bbep.js +5 -0
  71. package/dist/chunks/studio-6ep3js6b.js +9 -0
  72. package/dist/chunks/studio-6wkmf3wz.js +9 -0
  73. package/dist/chunks/studio-841rf3cg.js +5 -0
  74. package/dist/chunks/studio-8gmwgheg.js +5 -0
  75. package/dist/chunks/studio-8qm0ep50.js +5 -0
  76. package/dist/chunks/{studio-anyrgzvb.js → studio-90pq9km1.js} +4 -4
  77. package/dist/chunks/studio-924p1tm1.js +6 -0
  78. package/dist/chunks/{studio-v2bvmbjj.js → studio-a3g98wjr.js} +4 -4
  79. package/dist/chunks/studio-a3shpz9y.js +5 -0
  80. package/dist/chunks/studio-amsbaaar.js +6 -0
  81. package/dist/chunks/studio-at5spjbc.js +7 -0
  82. package/dist/chunks/studio-b2xv945e.js +5 -0
  83. package/dist/chunks/studio-bn5nkafw.js +5 -0
  84. package/dist/chunks/studio-bw6q5xjf.js +9 -0
  85. package/dist/chunks/studio-c7q0t9x1.js +5 -0
  86. package/dist/chunks/studio-camnhc96.js +6 -0
  87. package/dist/chunks/studio-cffqvnzd.js +5 -0
  88. package/dist/chunks/studio-d81xfh1g.js +5 -0
  89. package/dist/chunks/studio-dgz8d0c1.js +5 -0
  90. package/dist/chunks/studio-efvfrsf8.js +5 -0
  91. package/dist/chunks/studio-er30bpcx.js +5 -0
  92. package/dist/chunks/studio-ezscgr64.js +5 -0
  93. package/dist/chunks/studio-ffrrncvz.js +5 -0
  94. package/dist/chunks/studio-fpphgn8y.js +10 -0
  95. package/dist/chunks/studio-j1kvhdjk.js +4 -0
  96. package/dist/chunks/{studio-txjjzrsm.js → studio-j430n16g.js} +5 -5
  97. package/dist/chunks/studio-jjkg84nj.js +5 -0
  98. package/dist/chunks/studio-m0q32ars.js +4 -0
  99. package/dist/chunks/studio-m6bdst11.js +5 -0
  100. package/dist/chunks/studio-nv2cptd4.js +64 -0
  101. package/dist/chunks/studio-nwfrc98n.js +5 -0
  102. package/dist/chunks/studio-p1wgvp7r.js +5 -0
  103. package/dist/chunks/studio-pag2wncm.js +5 -0
  104. package/dist/chunks/studio-qvanvzfd.js +5 -0
  105. package/dist/chunks/studio-qwa64kt7.js +5 -0
  106. package/dist/chunks/studio-rk1zc4x3.js +928 -0
  107. package/dist/chunks/studio-se2r3ptc.js +5 -0
  108. package/dist/chunks/studio-sg2a0dh0.js +5 -0
  109. package/dist/chunks/studio-tjzjhe68.js +5 -0
  110. package/dist/chunks/{studio-0x3jyb8r.js → studio-tq0rtfwj.js} +4 -4
  111. package/dist/chunks/{studio-cpxkgjrj.js → studio-v0jzqdjm.js} +4 -4
  112. package/dist/chunks/studio-v2w7q8r1.js +7 -0
  113. package/dist/chunks/studio-v5vjq1h0.js +4 -0
  114. package/dist/chunks/studio-v8aga3vp.js +14 -0
  115. package/dist/chunks/studio-vfcdrfmv.js +5 -0
  116. package/dist/chunks/studio-vmfkgdjf.js +5 -0
  117. package/dist/chunks/studio-wt1816jj.js +5 -0
  118. package/dist/chunks/studio-wz73q5kq.js +4 -0
  119. package/dist/chunks/studio-y04qtxvp.js +7 -0
  120. package/dist/chunks/studio-y21g8zzg.js +5 -0
  121. package/dist/chunks/studio-y64hrt8p.js +12 -0
  122. package/dist/chunks/studio-ynn90f58.js +16 -0
  123. package/dist/chunks/studio-yxz682sx.js +5 -0
  124. package/dist/chunks/studio-zp7snvkq.js +5 -0
  125. package/dist/chunks/studio-zq4z6tm6.js +5 -0
  126. package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
  127. package/dist/chunks/tabs-f5cw3tgp.js +4 -0
  128. package/dist/chunks/textfield-wewc8rq2.js +4 -0
  129. package/dist/chunks/toast-c9fn075p.js +4 -0
  130. package/dist/chunks/toast-host-ke5z4ng7.js +4 -0
  131. package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
  132. package/dist/chunks/tooltip-5v8ngwj2.js +4 -0
  133. package/dist/chunks/tree-mdq3v5cw.js +4 -0
  134. package/dist/chunks/tsMode-sf49ee9x.js +14 -0
  135. package/dist/chunks/workspace-jtfahpee.js +4 -0
  136. package/dist/chunks/ws-client-nze0k6mv.js +4 -0
  137. package/dist/iframe-entry.js +16 -16
  138. package/dist/manifest.json +63 -63
  139. package/dist/studio.js +98 -98
  140. package/dist/workers/ts.worker.js +3 -3
  141. package/package.json +11 -11
  142. package/src/about/about-modal.ts +4 -3
  143. package/src/account/action-flow.ts +45 -38
  144. package/src/account-status.ts +7 -2
  145. package/src/browse/library-layouts.ts +8 -5
  146. package/src/browse/library-model.ts +18 -6
  147. package/src/browse/library-pane.ts +37 -21
  148. package/src/browse/library-preview.ts +14 -9
  149. package/src/browse/library-source.ts +1 -1
  150. package/src/canvas/asset-refs.ts +24 -9
  151. package/src/canvas/asset-resolve.ts +19 -23
  152. package/src/canvas/canvas-helpers.ts +7 -6
  153. package/src/canvas/canvas-live-render.ts +44 -53
  154. package/src/canvas/canvas-patcher.ts +30 -30
  155. package/src/canvas/canvas-perf.ts +11 -5
  156. package/src/canvas/canvas-render.ts +66 -42
  157. package/src/canvas/canvas-surface.ts +5 -3
  158. package/src/canvas/canvas-utils.ts +163 -64
  159. package/src/canvas/dialog-path.ts +9 -4
  160. package/src/canvas/dialog-state.ts +1 -2
  161. package/src/canvas/diff-marks.ts +9 -16
  162. package/src/canvas/diff-toolbar.ts +8 -7
  163. package/src/canvas/edit-width-drag.ts +4 -1
  164. package/src/canvas/edit-width.ts +1 -3
  165. package/src/canvas/iframe-channel.ts +27 -13
  166. package/src/canvas/iframe-drop.ts +13 -12
  167. package/src/canvas/iframe-editable-root.ts +29 -16
  168. package/src/canvas/iframe-entry.ts +80 -63
  169. package/src/canvas/iframe-eval.ts +73 -49
  170. package/src/canvas/iframe-host.ts +203 -118
  171. package/src/canvas/iframe-inline-edit.ts +69 -32
  172. package/src/canvas/iframe-insert.ts +5 -4
  173. package/src/canvas/iframe-interaction.ts +37 -26
  174. package/src/canvas/iframe-overlay.ts +1 -1
  175. package/src/canvas/iframe-patch.ts +18 -15
  176. package/src/canvas/iframe-position.ts +12 -6
  177. package/src/canvas/iframe-protocol.ts +15 -16
  178. package/src/canvas/iframe-render.ts +41 -36
  179. package/src/canvas/iframe-slash.ts +24 -11
  180. package/src/canvas/iframe-subtree.ts +6 -2
  181. package/src/canvas/path-mapping.ts +19 -12
  182. package/src/canvas/popover-path.ts +7 -3
  183. package/src/canvas/popover-state.ts +1 -2
  184. package/src/canvas/serialize-scope.ts +13 -5
  185. package/src/canvas/stage-scrollbar.ts +2 -1
  186. package/src/canvas/surface-registry.ts +21 -3
  187. package/src/collab/collab-commands.ts +7 -2
  188. package/src/collab/collab-session.ts +84 -45
  189. package/src/collab/collab-state.ts +4 -3
  190. package/src/collab/monaco-binding.ts +16 -13
  191. package/src/collab/monaco-cursors.ts +5 -2
  192. package/src/commands/budget.ts +3 -3
  193. package/src/commands/command-args.ts +103 -71
  194. package/src/commands/context.ts +22 -20
  195. package/src/commands/defaults.ts +4 -1
  196. package/src/commands/keymap.ts +47 -43
  197. package/src/commands/levels.ts +3 -3
  198. package/src/commands/live-context.ts +10 -8
  199. package/src/commands/reference.ts +2 -1
  200. package/src/commands/registry.ts +12 -10
  201. package/src/commands/run-reported.ts +15 -10
  202. package/src/component-props.ts +46 -30
  203. package/src/content/collection-match.ts +5 -4
  204. package/src/content/draft-state.ts +4 -3
  205. package/src/content/entry-commands.ts +3 -2
  206. package/src/content/entry-editor.ts +29 -17
  207. package/src/content/entry-fields.ts +12 -7
  208. package/src/content/entry-model.ts +21 -12
  209. package/src/editor/canvas-context-menu.ts +1 -2
  210. package/src/editor/canvas-slash-bridge.ts +3 -6
  211. package/src/editor/content-slice.ts +16 -14
  212. package/src/editor/context-menu.ts +35 -22
  213. package/src/editor/convert-targets.ts +30 -35
  214. package/src/editor/convert-to-component.ts +11 -5
  215. package/src/editor/convert-to-repeater.ts +34 -22
  216. package/src/editor/editable-tags.ts +17 -2
  217. package/src/editor/file-drop-action.ts +21 -22
  218. package/src/editor/inline-edit-apply.ts +35 -17
  219. package/src/editor/inline-edit.ts +66 -50
  220. package/src/editor/inline-format.ts +59 -56
  221. package/src/editor/inline-link.ts +40 -15
  222. package/src/editor/insert-zone-action.ts +1 -1
  223. package/src/editor/merge-tags.ts +58 -19
  224. package/src/editor/repeater-scope.ts +39 -28
  225. package/src/editor/shortcuts.ts +87 -47
  226. package/src/editor/slash-menu.ts +1 -6
  227. package/src/files/asset-versions.ts +4 -4
  228. package/src/files/components.ts +15 -10
  229. package/src/files/elements.ts +5 -6
  230. package/src/files/file-ops.ts +77 -36
  231. package/src/files/files.ts +90 -95
  232. package/src/files/media-meta.ts +2 -1
  233. package/src/files/media-paths.ts +6 -1
  234. package/src/files/serialize-document.ts +2 -2
  235. package/src/format/constraints.ts +1 -1
  236. package/src/format/convert-file.ts +27 -13
  237. package/src/format/format-choices.ts +2 -1
  238. package/src/format/format-host.ts +76 -50
  239. package/src/github/github-auth-status.ts +27 -3
  240. package/src/github/github-auth.ts +19 -9
  241. package/src/github/github-publish.ts +24 -20
  242. package/src/grid/cell-editors.ts +46 -31
  243. package/src/grid/cell-popovers.ts +5 -3
  244. package/src/grid/edit-buffer.ts +10 -9
  245. package/src/grid/grid-controller.ts +20 -22
  246. package/src/grid/grid-layout.ts +21 -5
  247. package/src/grid/grid-open.ts +3 -6
  248. package/src/grid/grid-panel.ts +11 -4
  249. package/src/grid/grid-source.ts +8 -8
  250. package/src/grid/grid-view.ts +14 -17
  251. package/src/grid/redirects-grid.ts +14 -5
  252. package/src/grid/redirects.ts +16 -14
  253. package/src/grid/schema-columns.ts +25 -19
  254. package/src/grid/sources/connector-source.ts +47 -20
  255. package/src/grid/sources/content-source.ts +25 -24
  256. package/src/grid/sources/csv-file-source.ts +2 -2
  257. package/src/grid/tabulator-tables.d.ts +55 -34
  258. package/src/hosting/stage.ts +7 -7
  259. package/src/i18n/i18n-commands.ts +1 -2
  260. package/src/media/media-pane.ts +4 -1
  261. package/src/new-project/add-repo-modal.ts +20 -19
  262. package/src/new-project/import-tab.ts +10 -14
  263. package/src/new-project/location-fields.ts +2 -1
  264. package/src/new-project/new-project-modal.ts +12 -9
  265. package/src/packages/jxsuite-update.ts +4 -3
  266. package/src/packages/pull-package-sync.ts +26 -25
  267. package/src/page-params.ts +97 -68
  268. package/src/panels/activity-panel.ts +17 -9
  269. package/src/panels/ai-chat/attached-context.ts +13 -7
  270. package/src/panels/ai-chat/chat-view.ts +80 -73
  271. package/src/panels/ai-chat/composer.ts +30 -33
  272. package/src/panels/ai-chat/sessions-view.ts +1 -2
  273. package/src/panels/ai-panel.ts +23 -20
  274. package/src/panels/block-action-bar.ts +46 -35
  275. package/src/panels/bottom-dock.ts +5 -3
  276. package/src/panels/canvas-dnd-bridge.ts +31 -24
  277. package/src/panels/data-explorer.ts +62 -25
  278. package/src/panels/data-grid.ts +14 -11
  279. package/src/panels/dnd.ts +108 -118
  280. package/src/panels/editors.ts +55 -22
  281. package/src/panels/elements-panel.ts +10 -3
  282. package/src/panels/events-panel.ts +84 -69
  283. package/src/panels/formula-workspace.ts +76 -51
  284. package/src/panels/frontmatter-fields.ts +24 -19
  285. package/src/panels/frontmatter-panel.ts +44 -34
  286. package/src/panels/git-diff-open.ts +4 -4
  287. package/src/panels/git-panel.ts +49 -61
  288. package/src/panels/head-panel.ts +131 -111
  289. package/src/panels/i18n-panel.ts +10 -3
  290. package/src/panels/imports-panel.ts +23 -47
  291. package/src/panels/jump-bar.ts +48 -29
  292. package/src/panels/layers-panel.ts +97 -74
  293. package/src/panels/left-panel.ts +3 -3
  294. package/src/panels/pane-context.ts +31 -22
  295. package/src/panels/pane-grid.ts +49 -20
  296. package/src/panels/panel-registry.ts +22 -37
  297. package/src/panels/properties-panel.ts +175 -121
  298. package/src/panels/quick-search.ts +53 -31
  299. package/src/panels/right-panel.ts +3 -3
  300. package/src/panels/seo-modal.ts +13 -17
  301. package/src/panels/settings-menu.ts +15 -15
  302. package/src/panels/signals-panel.ts +153 -131
  303. package/src/panels/statement-editor.ts +230 -140
  304. package/src/panels/style-panel.ts +254 -216
  305. package/src/panels/style-utils.ts +114 -51
  306. package/src/panels/stylebook-doc.ts +57 -54
  307. package/src/panels/stylebook-layers-panel.ts +9 -9
  308. package/src/panels/stylebook-panel.ts +13 -17
  309. package/src/panels/tab-drop.ts +27 -11
  310. package/src/panels/tab-strip.ts +36 -26
  311. package/src/platform-errors.ts +57 -43
  312. package/src/platform.ts +58 -30
  313. package/src/platforms/cloud.ts +345 -175
  314. package/src/platforms/default-platform.ts +10 -4
  315. package/src/platforms/devserver.ts +174 -127
  316. package/src/platforms/read-batcher.ts +16 -8
  317. package/src/project-list.ts +2 -1
  318. package/src/publish/deploy-checklist.ts +8 -2
  319. package/src/publish/pages-service.ts +28 -13
  320. package/src/publish/publish-commands.ts +5 -4
  321. package/src/publish/publish-panel.ts +10 -6
  322. package/src/recent-projects.ts +15 -8
  323. package/src/resize-edges.ts +26 -36
  324. package/src/services/a11y-report.ts +26 -19
  325. package/src/services/agent-seed.ts +23 -11
  326. package/src/services/ai-ask.ts +9 -12
  327. package/src/services/ai-command-tools.ts +68 -62
  328. package/src/services/ai-import-tools.ts +80 -67
  329. package/src/services/ai-models.ts +17 -13
  330. package/src/services/ai-project-tools.ts +68 -32
  331. package/src/services/ai-session-store.ts +19 -10
  332. package/src/services/ai-system-prompt.ts +46 -20
  333. package/src/services/ai-tools.ts +71 -27
  334. package/src/services/ai-write-report.ts +20 -12
  335. package/src/services/ai-writes.ts +4 -4
  336. package/src/services/automation.ts +58 -31
  337. package/src/services/cem-export.ts +149 -58
  338. package/src/services/clock.ts +6 -1
  339. package/src/services/code-services.ts +37 -31
  340. package/src/services/context-manager.ts +14 -10
  341. package/src/services/context-resolver.ts +20 -8
  342. package/src/services/data-service.ts +19 -15
  343. package/src/services/directory-picker.ts +18 -12
  344. package/src/services/document-assistant.ts +39 -19
  345. package/src/services/gated-registry.ts +10 -6
  346. package/src/services/harness/chat-reducer.ts +23 -1
  347. package/src/services/import-client.ts +91 -38
  348. package/src/services/import-seed.ts +8 -2
  349. package/src/services/jx-validate.ts +28 -31
  350. package/src/services/live-preview.ts +0 -0
  351. package/src/services/live-surfaces.ts +6 -3
  352. package/src/services/model-uri.ts +10 -2
  353. package/src/services/module-preloads.ts +12 -8
  354. package/src/services/monaco-buffer.ts +43 -24
  355. package/src/services/monaco-lazy.ts +7 -8
  356. package/src/services/monaco-setup.ts +23 -16
  357. package/src/services/notify.ts +44 -17
  358. package/src/services/popover-report.ts +25 -10
  359. package/src/services/preview-eval.ts +20 -8
  360. package/src/services/profile.ts +13 -6
  361. package/src/services/project-path.ts +13 -10
  362. package/src/services/references.ts +0 -0
  363. package/src/services/render-critic.ts +8 -7
  364. package/src/services/settings/kernel.ts +13 -4
  365. package/src/services/settings/write-queue.ts +9 -9
  366. package/src/services/token-lint.ts +12 -10
  367. package/src/services/tool-executor.ts +17 -5
  368. package/src/services/tool-outcomes.ts +44 -24
  369. package/src/services/trusted-types.ts +24 -7
  370. package/src/settings/contexts-section.ts +11 -8
  371. package/src/settings/contributed-section.ts +79 -60
  372. package/src/settings/css-vars-editor.ts +37 -16
  373. package/src/settings/defs-editor.ts +38 -35
  374. package/src/settings/extension-rows.ts +16 -8
  375. package/src/settings/extension-sections.ts +23 -13
  376. package/src/settings/extensions-section.ts +4 -1
  377. package/src/settings/general-settings.ts +11 -8
  378. package/src/settings/locales-section.ts +20 -12
  379. package/src/settings/preferences-dialog.ts +9 -6
  380. package/src/settings/preferences-keymap.ts +7 -5
  381. package/src/settings/preferences-sections.ts +11 -5
  382. package/src/settings/project-sections.ts +1 -1
  383. package/src/settings/schema-field-ui.ts +9 -0
  384. package/src/settings/settings-document.ts +5 -5
  385. package/src/shell/tree.ts +6 -5
  386. package/src/shell.ts +104 -81
  387. package/src/site-context.ts +37 -22
  388. package/src/state.ts +41 -49
  389. package/src/store.ts +54 -34
  390. package/src/studio.ts +39 -77
  391. package/src/style/live-preview.ts +1 -1
  392. package/src/style/project-styles.ts +6 -7
  393. package/src/style/token-ref.ts +5 -4
  394. package/src/surfaces/about.ts +18 -19
  395. package/src/surfaces/add-repo.ts +17 -19
  396. package/src/surfaces/ai-chat.ts +31 -36
  397. package/src/surfaces/ai-credentials-form.ts +6 -16
  398. package/src/surfaces/ai-managed-connect.ts +3 -4
  399. package/src/surfaces/ai-model-picker.ts +3 -5
  400. package/src/surfaces/block-action-bar.ts +22 -11
  401. package/src/surfaces/boot-failure.ts +4 -5
  402. package/src/surfaces/bottom-dock.ts +9 -18
  403. package/src/surfaces/canvas-stage.ts +12 -11
  404. package/src/surfaces/cf-account-picker.ts +17 -18
  405. package/src/surfaces/commandbar.ts +14 -9
  406. package/src/surfaces/convert-repeater.ts +17 -19
  407. package/src/surfaces/data-actions.ts +9 -7
  408. package/src/surfaces/dialog.ts +26 -28
  409. package/src/surfaces/diff-toolbar.ts +9 -7
  410. package/src/surfaces/doc-header.ts +10 -19
  411. package/src/surfaces/empty-state.ts +7 -10
  412. package/src/surfaces/entry-editor.ts +14 -11
  413. package/src/surfaces/expression-editor.ts +11 -25
  414. package/src/surfaces/files-panel.ts +27 -14
  415. package/src/surfaces/formula-palette.ts +4 -5
  416. package/src/surfaces/git-panel.ts +7 -15
  417. package/src/surfaces/github-auth.ts +16 -20
  418. package/src/surfaces/github-publish.ts +17 -22
  419. package/src/surfaces/grid-cell.ts +30 -31
  420. package/src/surfaces/grid-open.ts +10 -14
  421. package/src/surfaces/grid-panel.ts +13 -9
  422. package/src/surfaces/grid-replace.ts +13 -13
  423. package/src/surfaces/grid-views.ts +15 -18
  424. package/src/surfaces/inspector-dock.ts +13 -12
  425. package/src/surfaces/jump-bar.ts +5 -6
  426. package/src/surfaces/jxsuite-update.ts +16 -22
  427. package/src/surfaces/library-pane.ts +25 -20
  428. package/src/surfaces/logic-panel.ts +17 -30
  429. package/src/surfaces/logic-workspace.ts +13 -15
  430. package/src/surfaces/media-browser.ts +11 -10
  431. package/src/surfaces/media-field.ts +4 -5
  432. package/src/surfaces/media-pane.ts +8 -7
  433. package/src/surfaces/menu.ts +29 -23
  434. package/src/surfaces/navigator-dock.ts +11 -12
  435. package/src/surfaces/new-project.ts +27 -26
  436. package/src/surfaces/pane-context.ts +20 -25
  437. package/src/surfaces/pane-grid.ts +15 -10
  438. package/src/surfaces/panel-activity.ts +5 -6
  439. package/src/surfaces/panel-data.ts +3 -4
  440. package/src/surfaces/panel-deploy-checklist.ts +5 -6
  441. package/src/surfaces/panel-elements.ts +5 -7
  442. package/src/surfaces/panel-i18n.ts +5 -7
  443. package/src/surfaces/panel-imports.ts +6 -13
  444. package/src/surfaces/panel-outline.ts +25 -19
  445. package/src/surfaces/panel-page.ts +11 -18
  446. package/src/surfaces/panel-problems.ts +5 -7
  447. package/src/surfaces/panel-signals.ts +20 -34
  448. package/src/surfaces/panel-stylebook-layers.ts +5 -8
  449. package/src/surfaces/preferences.ts +21 -11
  450. package/src/surfaces/progress-modal.ts +15 -9
  451. package/src/surfaces/properties-panel.json +1 -1
  452. package/src/surfaces/properties-panel.ts +20 -42
  453. package/src/surfaces/publish.ts +18 -18
  454. package/src/surfaces/push-plan.ts +7 -8
  455. package/src/surfaces/rail.json +126 -73
  456. package/src/surfaces/rail.ts +38 -12
  457. package/src/surfaces/reference-field.ts +11 -15
  458. package/src/surfaces/schema-builder.ts +16 -22
  459. package/src/surfaces/schema-form.ts +15 -25
  460. package/src/surfaces/secret-field.ts +9 -6
  461. package/src/surfaces/seo.ts +21 -15
  462. package/src/surfaces/settings-contexts.ts +9 -7
  463. package/src/surfaces/settings-contributed.ts +14 -10
  464. package/src/surfaces/settings-css-vars.ts +5 -12
  465. package/src/surfaces/settings-defs.json +2 -2
  466. package/src/surfaces/settings-defs.ts +17 -21
  467. package/src/surfaces/settings-deploy.ts +8 -15
  468. package/src/surfaces/settings-extensions.ts +5 -6
  469. package/src/surfaces/settings-head.ts +33 -39
  470. package/src/surfaces/settings-locales.ts +8 -20
  471. package/src/surfaces/settings-overview.ts +5 -6
  472. package/src/surfaces/settings-packages.ts +8 -7
  473. package/src/surfaces/settings-pane.ts +9 -18
  474. package/src/surfaces/settings-rawjson.ts +5 -6
  475. package/src/surfaces/shell.ts +1 -2
  476. package/src/surfaces/slash-menu.ts +19 -9
  477. package/src/surfaces/statements.ts +13 -18
  478. package/src/surfaces/statusbar.ts +17 -14
  479. package/src/surfaces/style-panel.ts +18 -31
  480. package/src/surfaces/stylebook-chrome.ts +3 -5
  481. package/src/surfaces/tab-strip.ts +14 -13
  482. package/src/surfaces/target-line.ts +6 -7
  483. package/src/surfaces/welcome.ts +5 -7
  484. package/src/tabs/patch-ops.ts +4 -3
  485. package/src/tabs/project-config.ts +32 -21
  486. package/src/tabs/selection.ts +36 -8
  487. package/src/tabs/tab.ts +52 -41
  488. package/src/tabs/transact.ts +98 -53
  489. package/src/tabs/typing.ts +31 -0
  490. package/src/types.ts +32 -17
  491. package/src/ui/ai-credentials-form.ts +10 -13
  492. package/src/ui/ai-model-picker.ts +3 -3
  493. package/src/ui/cf-account-picker.ts +7 -9
  494. package/src/ui/color-selector.ts +9 -5
  495. package/src/ui/dynamic-slot.ts +7 -8
  496. package/src/ui/expression-editor.ts +112 -105
  497. package/src/ui/form-controls.ts +57 -48
  498. package/src/ui/formula-catalog.ts +239 -230
  499. package/src/ui/formula-chips.ts +33 -18
  500. package/src/ui/layers.ts +44 -31
  501. package/src/ui/media-picker.ts +18 -9
  502. package/src/ui/popover-surface.ts +20 -12
  503. package/src/ui/progress-modal.ts +13 -8
  504. package/src/ui/regions.ts +7 -6
  505. package/src/ui/schema-form.ts +113 -70
  506. package/src/ui/surface.ts +71 -8
  507. package/src/ui/timing.ts +9 -0
  508. package/src/ui/value-source.ts +44 -31
  509. package/src/ui/virtual-window.ts +3 -2
  510. package/src/utils/base64.ts +3 -1
  511. package/src/utils/edit-display.ts +103 -74
  512. package/src/utils/element-selectors.ts +3 -2
  513. package/src/utils/google-fonts.ts +15 -14
  514. package/src/utils/inherited-style.ts +18 -20
  515. package/src/utils/link-target.ts +1 -1
  516. package/src/utils/preview-format.ts +25 -3
  517. package/src/utils/strip-events.ts +49 -22
  518. package/src/utils/studio-utils.ts +29 -14
  519. package/src/view.ts +2 -3
  520. package/src/workspace/pane-derive.ts +10 -12
  521. package/src/workspace/session.ts +53 -43
  522. package/src/workspace/workspace.ts +47 -36
  523. package/dist/chunks/2020-nkxms0ay.js +0 -4
  524. package/dist/chunks/adapter-m948ab5f.js +0 -4
  525. package/dist/chunks/cf-account-picker-n8hr38v7.js +0 -4
  526. package/dist/chunks/cf-settings-356xdtne.js +0 -4
  527. package/dist/chunks/color-area-jqhna8zy.js +0 -4
  528. package/dist/chunks/color-field-embq5ctg.js +0 -4
  529. package/dist/chunks/color-fpezvnkt.js +0 -4
  530. package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
  531. package/dist/chunks/combobox-773hdzyj.js +0 -4
  532. package/dist/chunks/components-yk3t844e.js +0 -4
  533. package/dist/chunks/content-source-bawmyc09.js +0 -4
  534. package/dist/chunks/convert-to-repeater-7wns8kf1.js +0 -4
  535. package/dist/chunks/dialog-mtm9fq5t.js +0 -4
  536. package/dist/chunks/editor-6sc8nacq.js +0 -4
  537. package/dist/chunks/entry-commands-8ay9fh81.js +0 -4
  538. package/dist/chunks/extension-sections-na7rj3nr.js +0 -4
  539. package/dist/chunks/file-ops-gye0qw56.js +0 -4
  540. package/dist/chunks/files-dmc2xvcq.js +0 -4
  541. package/dist/chunks/format-host-t76b53f8.js +0 -4
  542. package/dist/chunks/fs-events-cg4tpz06.js +0 -4
  543. package/dist/chunks/git-panel-yef7bshy.js +0 -4
  544. package/dist/chunks/grid-view-7tt4bxw1.js +0 -51
  545. package/dist/chunks/icons-qbh8akb1.js +0 -4
  546. package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
  547. package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
  548. package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
  549. package/dist/chunks/iframe-host-tmz30gfp.js +0 -4
  550. package/dist/chunks/index-nag78a9h.js +0 -4
  551. package/dist/chunks/jsonMode-zhwsprqk.js +0 -13
  552. package/dist/chunks/jx-validate-3gbp5nkn.js +0 -4
  553. package/dist/chunks/layers-fvz99859.js +0 -4
  554. package/dist/chunks/layers-panel-gchmbf9p.js +0 -4
  555. package/dist/chunks/listbox-s8fkmnq8.js +0 -4
  556. package/dist/chunks/lit-html-9agdspkt.js +0 -4
  557. package/dist/chunks/media-picker-rhjvyy00.js +0 -4
  558. package/dist/chunks/menu-2e4y9j7b.js +0 -4
  559. package/dist/chunks/menu-37d07z9m.js +0 -4
  560. package/dist/chunks/monaco-binding-2jnhjjvr.js +0 -4
  561. package/dist/chunks/monaco-buffer-rp21359g.js +0 -4
  562. package/dist/chunks/monaco-setup-vhh7gayr.js +0 -4
  563. package/dist/chunks/notify-h3www560.js +0 -4
  564. package/dist/chunks/number-field-gw7sq8rn.js +0 -4
  565. package/dist/chunks/parse-897fvqah.js +0 -4
  566. package/dist/chunks/platform-hz34wcd7.js +0 -4
  567. package/dist/chunks/popover-8htra4er.js +0 -4
  568. package/dist/chunks/publish-panel-exsmjzyj.js +0 -4
  569. package/dist/chunks/quick-search-pgaqeh0m.js +0 -4
  570. package/dist/chunks/references-2cgdxnb8.js +0 -4
  571. package/dist/chunks/right-panel-jf856w5w.js +0 -4
  572. package/dist/chunks/section-registry-jnf8r5gy.js +0 -4
  573. package/dist/chunks/select-n3v7gwas.js +0 -4
  574. package/dist/chunks/split-pff8f3ze.js +0 -4
  575. package/dist/chunks/studio-0f55h9ye.js +0 -5
  576. package/dist/chunks/studio-0sqdhnew.js +0 -12
  577. package/dist/chunks/studio-19x1c75w.js +0 -5
  578. package/dist/chunks/studio-2sqcndak.js +0 -5
  579. package/dist/chunks/studio-3aey7dd3.js +0 -5
  580. package/dist/chunks/studio-3bpdkq2s.js +0 -5
  581. package/dist/chunks/studio-47y6fbpf.js +0 -5
  582. package/dist/chunks/studio-4m3826v2.js +0 -5
  583. package/dist/chunks/studio-4nx2dj1g.js +0 -4
  584. package/dist/chunks/studio-4xv5s47r.js +0 -9
  585. package/dist/chunks/studio-5g4t8v6w.js +0 -5
  586. package/dist/chunks/studio-5py436sf.js +0 -5
  587. package/dist/chunks/studio-77kt594t.js +0 -5
  588. package/dist/chunks/studio-8f87n763.js +0 -10
  589. package/dist/chunks/studio-8mb00b84.js +0 -5
  590. package/dist/chunks/studio-8p51gq2h.js +0 -6
  591. package/dist/chunks/studio-954ds834.js +0 -5
  592. package/dist/chunks/studio-9ft45c83.js +0 -9
  593. package/dist/chunks/studio-a2138x5k.js +0 -7
  594. package/dist/chunks/studio-a9yzstqj.js +0 -5
  595. package/dist/chunks/studio-acdksxx6.js +0 -5
  596. package/dist/chunks/studio-ar8jcf2y.js +0 -5
  597. package/dist/chunks/studio-bmn4mn9j.js +0 -7
  598. package/dist/chunks/studio-e7xxa0sj.js +0 -5
  599. package/dist/chunks/studio-ecaz25vk.js +0 -5
  600. package/dist/chunks/studio-ery42sqr.js +0 -4
  601. package/dist/chunks/studio-fzdywr6p.js +0 -9
  602. package/dist/chunks/studio-g5fmf0c1.js +0 -5
  603. package/dist/chunks/studio-g7nse7zb.js +0 -5
  604. package/dist/chunks/studio-geq1ea6k.js +0 -14
  605. package/dist/chunks/studio-ghkb32r8.js +0 -5
  606. package/dist/chunks/studio-ghrhy2y7.js +0 -5
  607. package/dist/chunks/studio-grawhey1.js +0 -5
  608. package/dist/chunks/studio-h0xgswew.js +0 -5
  609. package/dist/chunks/studio-h9c4p2tx.js +0 -5
  610. package/dist/chunks/studio-jyzj5cxs.js +0 -5
  611. package/dist/chunks/studio-mgx8yhnz.js +0 -64
  612. package/dist/chunks/studio-mpb04y1d.js +0 -6
  613. package/dist/chunks/studio-n17mty64.js +0 -5
  614. package/dist/chunks/studio-nwh2eqsk.js +0 -6
  615. package/dist/chunks/studio-q1h883bt.js +0 -16
  616. package/dist/chunks/studio-q4tv82h7.js +0 -9
  617. package/dist/chunks/studio-qpqa7vk3.js +0 -5
  618. package/dist/chunks/studio-qqz8e5gk.js +0 -5
  619. package/dist/chunks/studio-qvasen3f.js +0 -5
  620. package/dist/chunks/studio-rggdb3hm.js +0 -5
  621. package/dist/chunks/studio-sghy936h.js +0 -4
  622. package/dist/chunks/studio-skprc6ef.js +0 -5
  623. package/dist/chunks/studio-tt2nactf.js +0 -5
  624. package/dist/chunks/studio-tyasmc39.js +0 -5
  625. package/dist/chunks/studio-vk9ezads.js +0 -5
  626. package/dist/chunks/studio-vzacdfsc.js +0 -4
  627. package/dist/chunks/studio-w4c0xmrw.js +0 -5
  628. package/dist/chunks/studio-wfjqhhbk.js +0 -5
  629. package/dist/chunks/studio-wgh5kxpj.js +0 -5
  630. package/dist/chunks/studio-xasj0796.js +0 -5
  631. package/dist/chunks/studio-y78s8r2n.js +0 -5
  632. package/dist/chunks/studio-z8w183sh.js +0 -5
  633. package/dist/chunks/studio-zscd9ty4.js +0 -928
  634. package/dist/chunks/studio-zxp13sss.js +0 -7
  635. package/dist/chunks/studio-zygnmm01.js +0 -5
  636. package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
  637. package/dist/chunks/tabs-jwthg40w.js +0 -4
  638. package/dist/chunks/textfield-spy3hc77.js +0 -4
  639. package/dist/chunks/toast-4d35zd64.js +0 -4
  640. package/dist/chunks/toast-host-8sjmfed3.js +0 -4
  641. package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
  642. package/dist/chunks/tree-h19v1jfz.js +0 -4
  643. package/dist/chunks/tsMode-gr0m4dzr.js +0 -14
  644. package/dist/chunks/workspace-m15qtcqp.js +0 -4
  645. package/dist/chunks/ws-client-nf61frr1.js +0 -4
@@ -12,6 +12,9 @@
12
12
  * marks with `localStorage["jx-canvas-debug"] = "1"`.
13
13
  */
14
14
 
15
+ import { isFunction } from "@jxsuite/schema/guards";
16
+ import type { JsonValue } from "@jxsuite/schema/types";
17
+
15
18
  /** Rolling window per span. Bounded so a long session cannot grow the sample arrays. */
16
19
  const SAMPLE_LIMIT = 128;
17
20
 
@@ -106,7 +109,12 @@ export const canvasPerf: CanvasPerf = {
106
109
  timings: {},
107
110
  };
108
111
 
109
- (globalThis as Record<string, unknown>).__jxCanvasPerf = canvasPerf;
112
+ declare global {
113
+ /** The live counters, for inspection from a devtools console or a profiling harness. */
114
+ var __jxCanvasPerf: CanvasPerf | undefined;
115
+ }
116
+
117
+ globalThis.__jxCanvasPerf = canvasPerf;
110
118
 
111
119
  /** Retained duration samples per span, parallel to `canvasPerf.timings`. */
112
120
  const samples = new Map<string, number[]>();
@@ -121,13 +129,11 @@ function debugEnabled() {
121
129
 
122
130
  /** Monotonic clock, or 0 when the environment has no `performance` (durations then read as 0). */
123
131
  function now(): number {
124
- return typeof performance !== "undefined" && typeof performance.now === "function"
125
- ? performance.now()
126
- : 0;
132
+ return typeof performance !== "undefined" && isFunction(performance.now) ? performance.now() : 0;
127
133
  }
128
134
 
129
135
  /** Log a canvas perf event when debug mode is on. */
130
- export function perfLog(event: string, detail?: unknown) {
136
+ export function perfLog(event: string, detail?: JsonValue) {
131
137
  if (debugEnabled()) {
132
138
  console.debug(`[jx-canvas] ${event}`, detail ?? "");
133
139
  }
@@ -4,13 +4,17 @@
4
4
  * dispatches to manage/settings/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,8 +44,6 @@ 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";
@@ -63,6 +65,7 @@ import {
63
65
  bufferWrites,
64
66
  commitBufferWrites,
65
67
  } from "../services/monaco-buffer";
68
+ import { noteTyping } from "../tabs/typing";
66
69
  import { diffModelUrisFor, modelUriFor, monacoLangForPath } from "../services/model-uri";
67
70
  import { renderWelcome } from "../surfaces/welcome";
68
71
  import { emptyState } from "../surfaces/empty-state";
@@ -411,13 +414,15 @@ async function createSourceCollabBinding(
411
414
  ): Promise<() => void> {
412
415
  const { bindMonacoToYText } = await import("../collab/monaco-binding");
413
416
  const unbind = bindMonacoToYText({
414
- awareness: ctx.awareness as unknown as BindingAwareness,
417
+ awareness: ctx.awareness,
415
418
  editors: [editor],
416
419
  model,
417
420
  origin: ctx.localOrigin,
421
+ /* SAFETY: collabSourceContext's `text` is `collab.sourceText(handle.doc)`, the session's shared
422
+ source Y.Text, attached to the handle's Y.Doc as the binding requires. */
418
423
  text: ctx.text as Y.Text,
419
424
  });
420
- const detachStyles = attachCursorStyles(ctx.awareness as unknown as AwarenessLike, document);
425
+ const detachStyles = attachCursorStyles(ctx.awareness, document);
421
426
  return () => {
422
427
  detachStyles();
423
428
  unbind();
@@ -557,7 +562,7 @@ function sideMarks(
557
562
  */
558
563
  async function mountDiffEditor(
559
564
  surface: CanvasSurface,
560
- container: Element,
565
+ container: HTMLElement,
561
566
  state: GitDiffState,
562
567
  ): Promise<void> {
563
568
  const { paneId } = surface;
@@ -588,17 +593,20 @@ async function mountDiffEditor(
588
593
  lang,
589
594
  monaco.Uri.parse(uris.work),
590
595
  );
591
- const editor = monaco.editor.createDiffEditor(container as HTMLElement, {
592
- automaticLayout: true,
593
- fontFamily: "'JetBrains Mono', 'SF Mono', 'Fira Code', 'Consolas', monospace",
594
- fontSize: 12,
595
- minimap: { enabled: false },
596
- originalEditable: false,
597
- readOnly: true,
598
- renderSideBySide: true,
599
- scrollBeyondLastLine: false,
600
- theme: monacoTheme(),
601
- }) as NonNullable<CanvasSurface["monacoDiffEditor"]>;
596
+ const editor: NonNullable<CanvasSurface["monacoDiffEditor"]> = monaco.editor.createDiffEditor(
597
+ container,
598
+ {
599
+ automaticLayout: true,
600
+ fontFamily: "'JetBrains Mono', 'SF Mono', 'Fira Code', 'Consolas', monospace",
601
+ fontSize: 12,
602
+ minimap: { enabled: false },
603
+ originalEditable: false,
604
+ readOnly: true,
605
+ renderSideBySide: true,
606
+ scrollBeyondLastLine: false,
607
+ theme: monacoTheme(),
608
+ },
609
+ );
602
610
  editor.setModel({ modified, original });
603
611
  editor._diffKey = key;
604
612
  surface.monacoDiffEditor = editor;
@@ -662,7 +670,7 @@ function resetCanvasView(surface: CanvasSurface) {
662
670
  async function mountSourceEditor(
663
671
  tab: Tab,
664
672
  surface: CanvasSurface,
665
- editorContainer: Element,
673
+ editorContainer: HTMLElement,
666
674
  filePath: string,
667
675
  lang: string,
668
676
  ): Promise<void> {
@@ -756,7 +764,7 @@ async function mountSourceEditor(
756
764
  // Typed as the surface `view` declares (the editor plus `_ignoreNextChange` / `_writes`), because
757
765
  // The instance is HELD here now rather than re-read off `view.monacoEditor` in every callback.
758
766
  const sourceEditor: NonNullable<typeof surface.monacoEditor> = monaco.editor.create(
759
- editorContainer as unknown as HTMLElement,
767
+ editorContainer,
760
768
  {
761
769
  automaticLayout: true,
762
770
  fontFamily: "'JetBrains Mono', 'SF Mono', 'Fira Code', 'Consolas', monospace",
@@ -800,8 +808,10 @@ async function mountSourceEditor(
800
808
  return;
801
809
  }
802
810
  // A keystroke: the buffer is ahead of the document until the commit lands, and the text is the
803
- // User's own — which is the narrower fact the close and quit gates read.
811
+ // User's own — which is the narrower fact the close and quit gates read. Noted for Save too, which
812
+ // Must not read disabled over text the commit has not parsed yet.
804
813
  writes.markTyped();
814
+ noteTyping(tab.id);
805
815
  writes.arm(BUFFER_COMMIT, 600, async () => {
806
816
  /* `tab` is the tab this editor was MOUNTED for, captured above and never re-read. It used to
807
817
  be `activeTab.value` — whatever was focused when the timer fired — which is the same
@@ -829,7 +839,7 @@ async function mountSourceEditor(
829
839
  if (!tabIsLive(tab)) {
830
840
  return;
831
841
  }
832
- tab.doc.document = document as JxMutableNode;
842
+ tab.doc.document = document;
833
843
  tab.doc.content.frontmatter = frontmatter;
834
844
  tab.doc.dirty = true;
835
845
  writes.markSettled();
@@ -842,6 +852,8 @@ async function mountSourceEditor(
842
852
  // The buffer's text is the author's own layout now — the objects they opened up or
843
853
  // Closed, the blank lines they left — so it is what the next save preserves.
844
854
  const parsed = parseJsonDocument(sourceEditor.getValue());
855
+ /* SAFETY: a JSON source tab holds a Jx document, whose schema makes the top-level object
856
+ parseJsonDocument returns a node; text that does not parse throws into the catch. */
845
857
  tab.doc.document = parsed.document as JxMutableNode;
846
858
  tab.doc.layout = parsed.layout;
847
859
  tab.doc.dirty = true;
@@ -927,7 +939,7 @@ function renderDerivationNotice(
927
939
  surface.wrap.style.display = "block";
928
940
  const registry = activeRegistry();
929
941
  const pin = registry?.get("pane.pin");
930
- litRender(
942
+ render(
931
943
  emptyState(surface.wrap, {
932
944
  message,
933
945
  ...(held && { detail: `${tabLabel(held)} is still open here.` }),
@@ -951,7 +963,7 @@ function renderCanvasImpl(surface: CanvasSurface) {
951
963
  /* Every read below is scoped to ONE pane. The stage, the panels it mounted and the mode it draws
952
964
  are the surface's; the document is whatever tab that pane is showing, which is `activeTab` only
953
965
  when the pane is the focused one. */
954
- const canvasWrap = surface.wrap;
966
+ const canvasWrap = stageOf(surface);
955
967
  /* A pane with no stage renders nothing — it is not an error and it is not a fallback to some
956
968
  other pane's stage. Two schedulers can name a stage-less pane: a frame queued for a pane that
957
969
  lost the shell's single stage between the schedule and the rAF, and `escalateToFullRender` on
@@ -1009,6 +1021,8 @@ function renderCanvasImpl(surface: CanvasSurface) {
1009
1021
  );
1010
1022
  return;
1011
1023
  }
1024
+ /* SAFETY: `initCanvasRender` runs at studio boot (studio.ts), before the shell schedules the first
1025
+ pane render, and nothing resets `_ctx` afterwards. */
1012
1026
  const ctx = _ctx as CanvasRenderCtx;
1013
1027
  const S = {
1014
1028
  document: tab.doc.document,
@@ -1190,8 +1204,8 @@ function renderCanvasImpl(surface: CanvasSurface) {
1190
1204
  curFilter !== surface.prevStylebookFilter ||
1191
1205
  curCustomized !== surface.prevStylebookCustomizedOnly;
1192
1206
  if (!filterChanged) {
1193
- const style = transposeStylebookStyle(getEffectiveStyle(tab.doc.document?.style));
1194
- if (postStyleUpdateToStylebookHosts(style as Record<string, unknown>) > 0) {
1207
+ const style = transposeStylebookStyle(getEffectiveStyle(tab.doc.document.style));
1208
+ if (postStyleUpdateToStylebookHosts(style) > 0) {
1195
1209
  return;
1196
1210
  }
1197
1211
  }
@@ -1258,7 +1272,7 @@ function renderCanvasImpl(surface: CanvasSurface) {
1258
1272
  leaving, and lit's part, which the empty-state and welcome paths own. */
1259
1273
  releaseCanvasHosts(canvasWrap);
1260
1274
  detachCanvasStage(surface);
1261
- litRender(nothing, canvasWrap);
1275
+ render(nothing, canvasWrap);
1262
1276
  surface.panzoomWrap = null;
1263
1277
  // Reset inline style overrides from other modes
1264
1278
  canvasWrap.style.padding = "";
@@ -1462,7 +1476,7 @@ function renderCanvasImpl(surface: CanvasSurface) {
1462
1476
  decided rather than the opener: a comparison reaches this branch from three doors (the panel,
1463
1477
  a Diff lens, the Editor axis) and only this one sees every arrival. Forcing it here also
1464
1478
  leaves `diffView` alone, so a document opened after a `.css` still comes up Visual. */
1465
- const renderable = canRenderComparison(gitDiffState.filePath ?? "");
1479
+ const renderable = canRenderComparison(gitDiffState.filePath);
1466
1480
  if (diffShowsCode(surface.paneId, renderable)) {
1467
1481
  /* A null map is how the toolbar learns there is no visual half to offer: it draws Code as a
1468
1482
  static label rather than as half of a choice, and reports the line marks instead of a node
@@ -1515,12 +1529,15 @@ function renderCanvasImpl(surface: CanvasSurface) {
1515
1529
 
1516
1530
  /** @param {string} content */
1517
1531
  const parseContent = (content: string): Promise<JxMutableNode> => {
1518
- const fmtPath = gitDiffState.filePath ?? "";
1532
+ const fmtPath = gitDiffState.filePath;
1519
1533
  if (formatForPath(fmtPath)) {
1520
1534
  return parseSourceForPath(fmtPath, content).then((r) => r.document);
1521
1535
  }
1522
1536
  return Promise.resolve().then(() => {
1523
1537
  try {
1538
+ /* SAFETY: a side of a VISUAL comparison is a revision of a document the canvas renders
1539
+ (canRenderComparison chose this half), a JSON Jx document; unparseable text throws into
1540
+ the catch, which draws the failure instead. */
1524
1541
  return JSON.parse(content) as JxMutableNode;
1525
1542
  } catch {
1526
1543
  return {
@@ -1633,8 +1650,8 @@ function renderCanvasImpl(surface: CanvasSurface) {
1633
1650
  const entry = canvasPanelEntry(null, null, true);
1634
1651
  // A component-definition doc (root tag is a custom element) is a fragment, not a page: it should
1635
1652
  // Hug its content rather than have the column fill+stretch to the viewport (dead scroll space).
1636
- const rootTag = (S.document as { tagName?: unknown }).tagName;
1637
- const isComponentDoc = typeof rootTag === "string" && rootTag.includes("-");
1653
+ const rootTag = S.document.tagName;
1654
+ const isComponentDoc = isString(rootTag) && rootTag.includes("-");
1638
1655
  const { featureToggles: editToggles } = S.ui;
1639
1656
  /* The stage stacks when it carries the card: the band first, the page's scroller below it.
1640
1657
  Set on every render rather than on the transition, because whether a document HAS a header
@@ -1677,6 +1694,8 @@ function renderCanvasImpl(surface: CanvasSurface) {
1677
1694
  }
1678
1695
  const editColumn = stageHost(surface, "edit-column");
1679
1696
  const scroller = stageHost(surface, "edit-canvas");
1697
+ /* SAFETY: the edit stage view always draws its `edit-canvas` part, and this runs only once
1698
+ drawStage settled with that stage (the `!stage` return above). */
1680
1699
  entry.panel.scrollContainer = scroller as HTMLElement;
1681
1700
  /* The one mode whose stage SCROLLS under the zoom pod, so the one that tells the pane how
1682
1701
  wide its scrollbar is. The pod floats in the pane's chrome layer, which spans the gutter
@@ -1730,7 +1749,7 @@ function renderCanvasImpl(surface: CanvasSurface) {
1730
1749
  if (!hasMedia) {
1731
1750
  // Single panel — use baseWidth if a custom one is defined, otherwise full-width
1732
1751
  const effectiveMedia = getEffectiveMedia(S.document.$media);
1733
- const hasBaseWidth = effectiveMedia && effectiveMedia["--"];
1752
+ const hasBaseWidth = effectiveMedia["--"];
1734
1753
  const label = hasBaseWidth ? `${mediaDisplayName("--")} (${baseWidth}px)` : null;
1735
1754
  const entry = canvasPanelEntry(
1736
1755
  hasBaseWidth ? "base" : null,
@@ -1897,8 +1916,11 @@ function renderCanvasIntoPanel(
1897
1916
  ) {
1898
1917
  const gen = passGen ?? surface.renderGeneration;
1899
1918
  const tab = tabOfPane(surface.paneId);
1919
+ /* SAFETY: every caller is a renderCanvasImpl pass, which returns before drawing any panel when its
1920
+ pane has no tab, so without an override `tab` was non-null when this pass began; the git-diff
1921
+ callers always pass their override. */
1900
1922
  const docToRender = docOverride || (tab?.doc.document as JxMutableNode);
1901
- const canvas = panel.canvas as HTMLElement;
1923
+ const { canvas } = panel;
1902
1924
 
1903
1925
  canvasPerf.panelRenders += 1;
1904
1926
  panel.ready = false;
@@ -1944,14 +1966,16 @@ function renderCanvasIntoPanel(
1944
1966
  // The canvas you are looking at; it says so itself.
1945
1967
  }
1946
1968
  })
1947
- .catch((error: unknown) => {
1948
- const detail = error instanceof Error ? error.message : String(error);
1949
- notify.error("The canvas could not be mounted.", {
1950
- detail,
1951
- key: "canvas.mount",
1952
- source: "Canvas",
1953
- });
1954
- });
1969
+ .catch(reportMountFailure);
1970
+ }
1971
+
1972
+ /** A canvas mount that rejected, reported as a Problem with the failure's own message. */
1973
+ function reportMountFailure(cause: unknown): void {
1974
+ notify.error("The canvas could not be mounted.", {
1975
+ detail: errorMessage(cause),
1976
+ key: "canvas.mount",
1977
+ source: "Canvas",
1978
+ });
1955
1979
  }
1956
1980
 
1957
1981
  /*
@@ -2009,7 +2033,7 @@ function refuseUnresolvableToken(token: string): void {
2009
2033
  throw new RangeError(`command "insert.data" needs an open document; no tab is active`);
2010
2034
  }
2011
2035
  const root = tokenRoot(token);
2012
- const state = (tab.doc.document.state ?? {}) as Record<string, unknown>;
2036
+ const state = tab.doc.document.state ?? {};
2013
2037
  if (root === "state") {
2014
2038
  const name = token.split(".")[1] ?? "";
2015
2039
  if (!(name in state)) {
@@ -17,6 +17,7 @@ import { allCanvasSurfaces, stageContaining, surfaceForPane } from "./surface-re
17
17
  import type { CanvasSurface } from "./surface-registry";
18
18
  import type { PaneDerivation } from "../workspace/workspace";
19
19
  import type { CanvasPanel } from "../types";
20
+ import type { UnboundCanvasPanel } from "./canvas-utils";
20
21
  import type { Tab } from "../tabs/tab";
21
22
 
22
23
  export {
@@ -149,11 +150,12 @@ export function panelHostingCanvas(
149
150
  * answers with the FOCUSED pane's tab, which is a different document the moment the click is in a
150
151
  * pane the keyboard is not in.
151
152
  *
152
- * @param {CanvasPanel} panel
153
+ * @param {UnboundCanvasPanel} panel
153
154
  * @returns {Tab | null}
154
155
  */
155
- export function tabOfMountedPanel(panel: CanvasPanel): Tab | null {
156
- const canvasEl = panel.canvas as HTMLElement | null;
156
+ export function tabOfMountedPanel(panel: UnboundCanvasPanel): Tab | null {
157
+ // An unbound board (no canvas node yet) has no pane mounting it.
158
+ const canvasEl = panel.canvas;
157
159
  const mounted = canvasEl ? panelHostingCanvas(canvasEl) : null;
158
160
  return mounted ? tabOfPane(mounted.surface.paneId) : null;
159
161
  }