@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
@@ -71,7 +71,9 @@ import { diffShowsCode } from "../canvas/diff-view";
71
71
  import { canRenderComparison } from "./git-diff-open";
72
72
  import { shell } from "../shell";
73
73
  import { paneRegion } from "../ui/regions";
74
+ import { isNumber, isString } from "@jxsuite/schema/guards";
74
75
  import {
76
+ CANVAS_VIEWS,
75
77
  fitToScreen,
76
78
  getFit,
77
79
  resetZoom,
@@ -95,8 +97,8 @@ import { componentPropEntries, isComponentDoc } from "../component-props";
95
97
  import { mediaDisplayName } from "./shared";
96
98
  import type { CanvasView, FitMode } from "../canvas/canvas-utils";
97
99
  import { EDITOR_KIND_LABELS } from "../commands/context";
98
- import type { EditorKind } from "../commands/context";
99
100
  import type { ParamValues } from "../page-params";
101
+ import type { CommandArgValues } from "../commands/command-args";
100
102
  import type { Tab } from "../tabs/tab";
101
103
  import type { ResolvedI18n } from "@jxsuite/schema/locale";
102
104
  import type { JsonValue } from "../types";
@@ -257,7 +259,7 @@ export function mount(host: HTMLElement, ctx: PaneContextCtx) {
257
259
  }
258
260
  // Read reactive properties to establish tracking — mirrors the toolbar's subset.
259
261
  void tab.doc.document;
260
- void tab.doc.document?.$layout;
262
+ void tab.doc.document.$layout;
261
263
  void tab.doc.mode;
262
264
  void tab.documentPath;
263
265
  void tab.capabilities.modes;
@@ -360,13 +362,13 @@ function renderPane(paneId: string, host: HTMLElement) {
360
362
  }
361
363
  try {
362
364
  const tab = tabOfPane(paneId);
363
- const show = Boolean(tab) && wantsContextBar(tab as Tab);
365
+ const show = tab !== null && wantsContextBar(tab);
364
366
  if (!show) {
365
367
  disposePane(paneId);
366
368
  applyPaneContextOffset(0, host);
367
369
  return;
368
370
  }
369
- const view = viewFor(tab as Tab, paneId, _ctx);
371
+ const view = viewFor(tab, paneId, _ctx);
370
372
  let surface = _surfaces.get(paneId);
371
373
  if (!surface || !surface.connected()) {
372
374
  disposePane(paneId);
@@ -458,12 +460,11 @@ function openPresetMenu(paneId: string, anchor: HTMLElement): void {
458
460
  * `check-lens-mutants.ts` said so, by surviving.
459
461
  */
460
462
  function menuRow(row: PresetRow): MenuRowProjection {
461
- return {
463
+ const projection: MenuRowProjection = {
462
464
  destructive: false,
463
465
  disabled: row.disabled !== null,
464
466
  dividerAbove: false,
465
467
  id: rowId(row),
466
- ...(row.disabled === null ? {} : { requires: row.disabled }),
467
468
  run: () => {
468
469
  /* THE PANE THE MENU IS ABOUT, before the verb that resolves the focus runs.
469
470
  See {@link PresetRow.pane}: all three of these commands take the focused pane as their
@@ -476,6 +477,10 @@ function menuRow(row: PresetRow): MenuRowProjection {
476
477
  },
477
478
  title: row.label,
478
479
  };
480
+ if (row.disabled !== null) {
481
+ projection.requires = row.disabled;
482
+ }
483
+ return projection;
479
484
  }
480
485
 
481
486
  /**
@@ -487,7 +492,7 @@ function rowId(row: PresetRow): string {
487
492
  const parts = [row.command];
488
493
  for (const key of ["preset", "media", "locale"] as const) {
489
494
  const value = row.args[key];
490
- if (typeof value === "string") {
495
+ if (isString(value)) {
491
496
  parts.push(value);
492
497
  }
493
498
  }
@@ -498,7 +503,7 @@ function rowId(row: PresetRow): string {
498
503
  export interface PresetRow {
499
504
  label: string;
500
505
  command: string;
501
- args: Record<string, unknown>;
506
+ args: CommandArgValues;
502
507
  /**
503
508
  * The pane this row is ABOUT — the one whose ⟲ opened the menu.
504
509
  *
@@ -824,12 +829,12 @@ function localeOf(tab: Tab | null): PaneLocale | null {
824
829
  function contextAxis(tab: Tab, paneId: string, ctx: PaneContextCtx): Partial<PaneContextView> {
825
830
  const { ui } = tab.session;
826
831
  const { featureQueries, sizeBreakpoints } = ctx.parseMediaEntries(
827
- getEffectiveMedia(tab.doc.document?.$media as Record<string, string> | undefined),
832
+ getEffectiveMedia(tab.doc.document.$media),
828
833
  );
829
834
  const schemeQueries = featureQueries.filter(({ query }) => isSchemeQuery(query));
830
835
  const plainQueries = featureQueries.filter(({ query }) => !isSchemeQuery(query));
831
- const scheme = (ui.previewColorScheme ?? "auto") as string;
832
- const activeMedia = (ui.activeMedia ?? null) as string | null;
836
+ const scheme = ui.previewColorScheme;
837
+ const { activeMedia } = ui;
833
838
  const sizeLabel = activeMedia ? mediaDisplayName(activeMedia) : "Base";
834
839
  const schemeLabel = SCHEMES.find(([value]) => value === scheme)?.[1] ?? "Auto";
835
840
  const locale = localeOf(tab);
@@ -843,7 +848,7 @@ function contextAxis(tab: Tab, paneId: string, ctx: PaneContextCtx): Partial<Pan
843
848
  ]
844
849
  .filter((part) => part !== null)
845
850
  .join(" · ");
846
- const hasLayout = isPageDoc(tab) && Boolean(getEffectiveLayoutPath(tab.doc.document?.$layout));
851
+ const hasLayout = isPageDoc(tab) && Boolean(getEffectiveLayoutPath(tab.doc.document.$layout));
847
852
  const page = isPageDoc(tab);
848
853
  const params = page ? paramRows(tab) : [];
849
854
  const props = page ? [] : propRows(tab, paneId);
@@ -851,7 +856,7 @@ function contextAxis(tab: Tab, paneId: string, ctx: PaneContextCtx): Partial<Pan
851
856
  way the Context trigger says `Base · Auto` — a chevron with no reading is a control you have to
852
857
  open in order to learn whether it was worth opening. */
853
858
  const resolvingSet = page
854
- ? Object.values(ui.previewParams ?? {}).filter((v) => v !== "" && v !== undefined).length
859
+ ? Object.values(ui.previewParams).filter((v) => v !== "").length
855
860
  : Object.keys(ui.previewProps ?? {}).length;
856
861
  const hasResolving = page ? params.length > 0 : props.length > 0;
857
862
 
@@ -965,7 +970,7 @@ const FIT_CHOICES: readonly { value: string; fit: FitMode; label: string }[] = [
965
970
 
966
971
  /** Which entry the pod shows as chosen — a numeric fit reads as "actual size" only at 1. */
967
972
  function fitChoiceValue(fit: FitMode): string {
968
- if (typeof fit === "number") {
973
+ if (isNumber(fit)) {
969
974
  return fit === 1 ? "actual" : "";
970
975
  }
971
976
  return fit;
@@ -1006,7 +1011,7 @@ function podFor(tab: Tab, paneId: string): Partial<PaneContextView> {
1006
1011
  computed from the side pane's own zoom, and its "100%" button reset the primary. */
1007
1012
  const surface = surfaceForPane(paneId);
1008
1013
  if (mode === "edit") {
1009
- const editZoom = tab.session.ui.editZoom ?? 1;
1014
+ const { editZoom } = tab.session.ui;
1010
1015
  return { podState: "shown", zoomLabel: `${Math.round(editZoom * 100)}%` };
1011
1016
  }
1012
1017
  if (!STAGE_ZOOM_MODES.has(mode)) {
@@ -1041,7 +1046,7 @@ function podFor(tab: Tab, paneId: string): Partial<PaneContextView> {
1041
1046
  * `__jxAutomation` had no name for it. Going through the registry makes the control and the verb
1042
1047
  * one thing (one definition site per action, §13) and gets the breakpoint refusal for free.
1043
1048
  */
1044
- function runContextCommand(paneId: string, id: string, args: Record<string, unknown>): void {
1049
+ function runContextCommand(paneId: string, id: string, args: CommandArgValues): void {
1045
1050
  // THIS pane, named. The bar is drawn once per pane and the side bar's controls write the side
1046
1051
  // Pane's tab; a verb defaulting to the focused pane would have made the side bar edit the
1047
1052
  // Foreground document the moment its control became a command.
@@ -1063,7 +1068,8 @@ function actionsFor(paneId: string, ctx: PaneContextCtx): PaneContextActions {
1063
1068
  if (!tab) {
1064
1069
  return;
1065
1070
  }
1066
- const mode = modeForEditorKind(tab, kind as EditorKind);
1071
+ const editorKind = editorKindsOf(tab).find((candidate) => candidate === kind);
1072
+ const mode = editorKind && modeForEditorKind(tab, editorKind);
1067
1073
  if (!mode) {
1068
1074
  return;
1069
1075
  }
@@ -1086,8 +1092,9 @@ function actionsFor(paneId: string, ctx: PaneContextCtx): PaneContextActions {
1086
1092
  },
1087
1093
  chooseView: (value) => {
1088
1094
  const tab = tabNow();
1089
- if (tab) {
1090
- setCanvasView(tab, value as CanvasView, ctx.setCanvasMode);
1095
+ const view = CANVAS_VIEWS.find((candidate) => candidate === value);
1096
+ if (tab && view) {
1097
+ setCanvasView(tab, view, ctx.setCanvasMode);
1091
1098
  }
1092
1099
  },
1093
1100
  exportFile: ctx.exportFile,
@@ -1285,7 +1292,7 @@ function paramValuesFor(tab: Tab): ParamValues | null {
1285
1292
  * @param {ParamValues} values
1286
1293
  */
1287
1294
  function autoSelectParams(tab: Tab, values: ParamValues) {
1288
- const current = tab.session.ui.previewParams ?? {};
1295
+ const current = tab.session.ui.previewParams;
1289
1296
  const additions: Record<string, string> = {};
1290
1297
  for (const [name, list] of Object.entries(values)) {
1291
1298
  if (!current[name] && list.length > 0) {
@@ -1314,7 +1321,7 @@ function paramRows(tab: Tab): PaneContextView["params"] {
1314
1321
  label: `Preview value for [${name}]`,
1315
1322
  name,
1316
1323
  options: (values?.[name] ?? []).map((value: string) => ({ label: value, value })),
1317
- value: previewParams?.[name] ?? "",
1324
+ value: previewParams[name] ?? "",
1318
1325
  }));
1319
1326
  }
1320
1327
 
@@ -1330,6 +1337,8 @@ function paramRows(tab: Tab): PaneContextView["params"] {
1330
1337
  */
1331
1338
  function parsePropValue(raw: string): JsonValue {
1332
1339
  try {
1340
+ // SAFETY: JSON.parse only ever yields null, a boolean, a number, a string, an array or a plain
1341
+ // Object of those, which is exactly the JsonValue union.
1333
1342
  return JSON.parse(raw) as JsonValue;
1334
1343
  } catch {
1335
1344
  return raw;
@@ -1347,7 +1356,7 @@ function propRows(tab: Tab, paneId: string): PaneContextView["props"] {
1347
1356
  }
1348
1357
  const { previewProps } = tab.session.ui;
1349
1358
  const display = (v: JsonValue | undefined) =>
1350
- v === undefined ? "" : typeof v === "string" ? v : JSON.stringify(v);
1359
+ v === undefined ? "" : isString(v) ? v : JSON.stringify(v);
1351
1360
  return componentPropEntries(doc).map(({ name }) => ({
1352
1361
  key: name,
1353
1362
  label: `Test value for ${name}`,
@@ -62,6 +62,7 @@ import {
62
62
  dropTargetForElements,
63
63
  monitorForElements,
64
64
  } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
65
+ import { isString } from "@jxsuite/schema/guards";
65
66
  import { isTabDropSource } from "./tab-drop";
66
67
  import { rectOf } from "../utils/geometry";
67
68
  import {
@@ -100,8 +101,22 @@ export interface PaneCell {
100
101
  surface: CanvasSurface;
101
102
  }
102
103
 
103
- /** A cell's record, plus the disposers its stage gestures and its drop zone live behind. */
104
- interface CellState extends PaneCell {
104
+ /**
105
+ * A cell's record while the runtime fills it in, plus the disposers its stage gestures and its drop
106
+ * zone live behind.
107
+ *
108
+ * Every element field starts null and is written once, when the runtime creates that box (see
109
+ * {@link cellPart}). The runtime creates a row's nodes depth-first inside one synchronous render
110
+ * pass, so by the time anything outside that pass asks, {@link isDrawnCell} holds.
111
+ */
112
+ interface CellState {
113
+ paneId: string;
114
+ root: HTMLElement | null;
115
+ strip: HTMLElement | null;
116
+ chrome: HTMLElement | null;
117
+ stage: HTMLElement | null;
118
+ dropZone: HTMLElement | null;
119
+ surface: CanvasSurface | null;
105
120
  /** Stage-gesture disposer, live between the stage's creation and the cell's disposal. */
106
121
  releaseGestures: (() => void) | null;
107
122
  /** The drop zone's pragmatic registration, live between its creation and the cell's disposal. */
@@ -128,9 +143,22 @@ let _scope: EffectScope | null = null;
128
143
  */
129
144
  let _dragMonitor: (() => void) | null = null;
130
145
 
146
+ /** Whether every box of a cell has been created, which is what makes it a {@link PaneCell}. */
147
+ function isDrawnCell(cell: CellState): cell is CellState & PaneCell {
148
+ return (
149
+ cell.root !== null &&
150
+ cell.strip !== null &&
151
+ cell.chrome !== null &&
152
+ cell.stage !== null &&
153
+ cell.dropZone !== null &&
154
+ cell.surface !== null
155
+ );
156
+ }
157
+
131
158
  /** The cell a pane is drawn in, or null. Test-visible, and the bootstrap's handle on the primary. */
132
159
  export function cellForPane(paneId: string): PaneCell | null {
133
- return _cells.get(paneId) ?? null;
160
+ const cell = _cells.get(paneId);
161
+ return cell !== undefined && isDrawnCell(cell) ? cell : null;
134
162
  }
135
163
 
136
164
  /**
@@ -149,9 +177,9 @@ export function paneGridReady(): Promise<void> {
149
177
  * The record for a pane, created when its cell's outermost box is, and reused for the life of the
150
178
  * cell.
151
179
  *
152
- * Every element field is typed non-null and starts null, the same bargain `CanvasSurface` makes:
153
- * the runtime creates a row's nodes depth-first inside one synchronous render pass, so the record
154
- * is complete before anything outside that pass can hold it.
180
+ * Every element field starts null: the runtime creates a row's nodes depth-first inside one
181
+ * synchronous render pass, so the record is complete before anything outside that pass can hold it
182
+ * through {@link cellForPane}.
155
183
  */
156
184
  function cellState(paneId: string): CellState {
157
185
  const existing = _cells.get(paneId);
@@ -159,15 +187,15 @@ function cellState(paneId: string): CellState {
159
187
  return existing;
160
188
  }
161
189
  const cell: CellState = {
162
- chrome: null as unknown as HTMLElement,
163
- dropZone: null as unknown as HTMLElement,
190
+ chrome: null,
191
+ dropZone: null,
164
192
  paneId,
165
193
  releaseDropZone: null,
166
194
  releaseGestures: null,
167
- root: null as unknown as HTMLElement,
168
- stage: null as unknown as HTMLElement,
169
- strip: null as unknown as HTMLElement,
170
- surface: null as unknown as CanvasSurface,
195
+ root: null,
196
+ stage: null,
197
+ strip: null,
198
+ surface: null,
171
199
  };
172
200
  _cells.set(paneId, cell);
173
201
  return cell;
@@ -229,12 +257,16 @@ function watchPaneFocus(paneId: string, root: HTMLElement): void {
229
257
  */
230
258
  function attachStage(cell: CellState, stage: HTMLElement): void {
231
259
  cell.stage = stage;
232
- cell.surface = createPaneSurface(cell.paneId);
260
+ const surface = createPaneSurface(cell.paneId);
261
+ cell.surface = surface;
233
262
  registerCanvasSurface(cell.paneId, stage);
234
- cell.releaseGestures = installStageGestures(cell.surface);
263
+ cell.releaseGestures = installStageGestures(surface);
235
264
  scheduleCanvasRender(cell.paneId);
236
265
  }
237
266
 
267
+ /** What a cell's drop zone reports to a drag: refused, or the pane a drop would split beside. */
268
+ type PaneEdgeData = { type: "pane-edge-refused" } | { paneId: string; type: "pane-edge" };
269
+
238
270
  /**
239
271
  * The RIGHT BAND of `paneId`'s cell, and only while it is legal to drop there: the grid is still
240
272
  * under {@link MAX_PANES}, and `paneId` names the LAST pane — the one a second pane would sit
@@ -245,11 +277,7 @@ function attachStage(cell: CellState, stage: HTMLElement): void {
245
277
  * that the rest of the stage keeps ordinary canvas gestures — a drag never reaches this at all
246
278
  * unless `canDrop` already accepted it, so the band only ever competes with itself.
247
279
  */
248
- function edgeData(
249
- paneId: string,
250
- input: { clientX: number },
251
- element: HTMLElement,
252
- ): Record<string, unknown> {
280
+ function edgeData(paneId: string, input: { clientX: number }, element: HTMLElement): PaneEdgeData {
253
281
  if (workspace.panes.length >= MAX_PANES || workspace.panes.at(-1)?.id !== paneId) {
254
282
  return { type: "pane-edge-refused" };
255
283
  }
@@ -467,7 +495,8 @@ export function mount(): void {
467
495
  },
468
496
  onDrag({ location }) {
469
497
  const [target] = location.current.dropTargets;
470
- const edgePane = target?.data.type === "pane-edge" ? (target.data.paneId as string) : "";
498
+ const paneId = target?.data.paneId;
499
+ const edgePane = target?.data.type === "pane-edge" && isString(paneId) ? paneId : "";
471
500
  _surface?.drag({ armed: true, edgePane });
472
501
  },
473
502
  onDragStart() {
@@ -35,15 +35,13 @@ import { activeTab } from "../workspace/workspace";
35
35
  import type { Level } from "../commands/levels";
36
36
  import type { CommandContext } from "../commands/context";
37
37
  import type { GitDiffState } from "../types";
38
- import type { JxMutableNode } from "@jxsuite/schema/types";
38
+ import type { JxMutableNode, JxStateDefinition } from "@jxsuite/schema/types";
39
39
  import type { JxPath } from "../state";
40
40
  import type { Tab, TabUi } from "../tabs/tab";
41
41
  import type { nothing, TemplateResult } from "lit-html";
42
- import type { renderFilesTemplate } from "../files/files";
43
- import type { renderGitPanel } from "./git-panel";
44
- import type { renderHeadTemplate } from "./head-panel";
45
- import type { renderImportsTemplate } from "./imports-panel";
46
42
  import type { mountSignalsPanel } from "./signals-panel";
43
+ import type webdataJson from "../../data/webdata.json";
44
+ import type { DockDeclaration } from "../commands/budget";
47
45
 
48
46
  /**
49
47
  * The three docks that host panels.
@@ -61,16 +59,12 @@ export type PanelDock = "navigator" | "inspector" | "bottom";
61
59
  *
62
60
  * This is `left-panel.ts`'s old `LeftPanelCtx`, moved to the registry because it is now the panel
63
61
  * CONTRACT rather than one orchestrator's private argument list. `studio.ts` still builds it: the
64
- * renderers it injects (the file tree, the head panel, the git panel) close over bootstrap state,
65
- * and injecting them is what keeps `panels/*` free of an import cycle back through `studio.ts`.
62
+ * hooks it injects close over bootstrap state, and injecting them is what keeps `panels/*` free of
63
+ * an import cycle back through `studio.ts`.
66
64
  */
67
65
  export interface NavigatorPanelDeps {
68
66
  getCanvasMode: () => string;
69
67
  setCanvasMode: (tab: Tab | null, mode: string) => void;
70
- // Typed against their implementations so every call site stays checked. These are type-only
71
- // Imports, so they are erased — the modules themselves are never pulled in through this file.
72
- renderImportsTemplate: typeof renderImportsTemplate;
73
- renderFilesTemplate: typeof renderFilesTemplate;
74
68
  /**
75
69
  * Draw the Data panel into the painted host.
76
70
  *
@@ -79,20 +73,18 @@ export interface NavigatorPanelDeps {
79
73
  * import would close a cycle through `formula-workspace.ts`. A type-only import erases.
80
74
  */
81
75
  mountSignalsPanel: typeof mountSignalsPanel;
82
- renderHeadTemplate: typeof renderHeadTemplate;
83
- renderGitPanel: typeof renderGitPanel;
84
76
  renderCanvas: () => void;
85
77
  /** Canvas re-render that also lets automatic `Request` entries fetch (Data panel Refresh). */
86
78
  refreshData: () => void;
87
- defCategory: (def: unknown) => string;
88
- defBadgeLabel: (def: unknown) => string;
79
+ defCategory: (def: JxStateDefinition) => string;
80
+ defBadgeLabel: (def: JxStateDefinition) => string;
89
81
  navigateToComponent: (path: string) => void;
90
- webdata: Record<string, unknown>;
91
- defaultDef: (tag: string) => Record<string, unknown>;
82
+ /** The bundled `data/webdata.json`, which the Elements palette builds its blocks from. */
83
+ webdata: typeof webdataJson;
84
+ defaultDef: (tag: string) => JxMutableNode;
92
85
  registerLayersDnD: () => void;
93
86
  registerElementsDnD: () => void;
94
87
  registerComponentsDnD: () => void;
95
- registerFileTreeDnD: (ctx: { renderLeftPanel: () => void }) => void;
96
88
  setGitDiffState: (state: GitDiffState | null) => void;
97
89
  cloneRepository?: () => void;
98
90
  }
@@ -111,8 +103,8 @@ export interface NavigatorDocument {
111
103
  mode: string;
112
104
  /** The whole selection SET the navigator/inspector panels render against (§6.7). */
113
105
  selection: JxPath[];
114
- canvas: Record<string, unknown> | null;
115
- content?: { frontmatter?: Record<string, unknown> } | undefined;
106
+ canvas: Tab["session"]["canvas"] | null;
107
+ content?: { frontmatter?: Tab["doc"]["content"]["frontmatter"] } | undefined;
116
108
  documentPath?: string | null | undefined;
117
109
  ui: TabUi;
118
110
  }
@@ -215,7 +207,7 @@ export function panelContext(): CommandContext {
215
207
  ctx.project.open = projectState !== null;
216
208
  ctx.project.isMultilingual =
217
209
  (resolveI18n(projectState?.projectConfig ?? {}).i18n?.locales.length ?? 0) > 1;
218
- ctx.git.dirtyCount = shell.git.status?.files?.length ?? 0;
210
+ ctx.git.dirtyCount = shell.git.status?.files.length ?? 0;
219
211
  ctx.document.open = activeTab.value !== null;
220
212
  return ctx;
221
213
  }
@@ -333,11 +325,10 @@ function railablePanels(): readonly PanelRecord[] {
333
325
  */
334
326
  export function railGroups(ctx: CommandContext): RailGroup[] {
335
327
  const railable = railablePanels();
336
- return RAIL_GROUP_LEVELS.map(({ level, label }) => ({
337
- level,
338
- label,
339
- panels: railable.filter((panel) => panel.level === level && isPanelVisible(panel, ctx)),
340
- })).filter((group) => group.panels.length > 0);
328
+ return RAIL_GROUP_LEVELS.flatMap(({ level, label }) => {
329
+ const panels = railable.filter((panel) => panel.level === level && isPanelVisible(panel, ctx));
330
+ return panels.length > 0 ? [{ level, label, panels }] : [];
331
+ });
341
332
  }
342
333
 
343
334
  /**
@@ -355,12 +346,6 @@ export function railPanelSet(): PanelRecord[] {
355
346
  );
356
347
  }
357
348
 
358
- /** One tabbed region and what it declares, in `commands/budget.ts`'s shape. */
359
- export interface PanelDockDeclaration {
360
- dock: string;
361
- tabs: readonly string[];
362
- }
363
-
364
349
  /**
365
350
  * The rail's two groups as budget declarations — the `rail/*` rows `scripts/check-chrome-budget.ts`
366
351
  * counts, observed rather than written down. `commands/budget.ts` no longer carries a copy.
@@ -369,10 +354,10 @@ export interface PanelDockDeclaration {
369
354
  * to be visible in one context. Search is registered and hidden today, and it still spends its rail
370
355
  * slot — which is the point, because its arrival must not silently push the rail to five.
371
356
  */
372
- export function railDeclarations(): PanelDockDeclaration[] {
357
+ export function railDeclarations(): DockDeclaration[] {
373
358
  const railable = railablePanels();
374
- return RAIL_GROUP_LEVELS.map(({ level }) => ({
375
- dock: `rail/${level}`,
376
- tabs: railable.filter((panel) => panel.level === level).map((panel) => panel.title),
377
- })).filter((declaration) => declaration.tabs.length > 0);
359
+ return RAIL_GROUP_LEVELS.flatMap(({ level }) => {
360
+ const tabs = railable.filter((panel) => panel.level === level).map((panel) => panel.title);
361
+ return tabs.length > 0 ? [{ dock: `rail/${level}`, tabs }] : [];
362
+ });
378
363
  }