@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
@@ -63,8 +63,9 @@
63
63
  * @docs studio/interface
64
64
  */
65
65
 
66
- import { displayTagName } from "@jxsuite/schema/guards";
67
- import { childList, getNodeAtPath, nodeLabel, pathsEqual, projectState } from "../store";
66
+ import { displayTagName, isNonNullObject, isString } from "@jxsuite/schema/guards";
67
+ import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
68
+ import { childList, nodeLabel, pathsEqual, projectState } from "../store";
68
69
  import { effect, effectScope } from "../reactivity";
69
70
  import { activePane, workspace } from "../workspace/workspace";
70
71
  import { derivationOfPane, tabOfPane } from "../canvas/canvas-surface";
@@ -74,14 +75,21 @@ import { runReported } from "../commands/run-reported";
74
75
  import { openMenu } from "../surfaces/menu";
75
76
  import { rectOf } from "../utils/geometry";
76
77
  import { mountJumpBarSurface } from "../surfaces/jump-bar";
77
- import type { CommandArgs, CommandRegistry } from "../commands/registry";
78
+ import type { CommandRegistry } from "../commands/registry";
78
79
  import type { FormulaEditDef, FunctionEditDef } from "../types";
79
80
  import type { JxPath } from "../state";
80
- import type { MenuHandle, MenuRowProjection } from "../surfaces/menu";
81
+ import type {
82
+ MenuHandle,
83
+ MenuRowProjection,
84
+ OpenMenuOptions,
85
+ ViewportPoint,
86
+ } from "../surfaces/menu";
81
87
  import type { JumpBarSurface, ProjectedStep } from "../surfaces/jump-bar";
82
88
  import type { Tab } from "../tabs/tab";
83
89
  import type { PaneDerivation } from "../workspace/workspace";
84
90
  import type { EffectScope } from "@vue/reactivity";
91
+ import type { JxMutableNode } from "@jxsuite/schema/types";
92
+ import type { CommandArgValues } from "../commands/command-args";
85
93
 
86
94
  /**
87
95
  * The region the trail stamps on itself. It is the status bar's DOCUMENT field: the document, and
@@ -108,7 +116,7 @@ export type JumpSegmentKind = "file" | "editor" | "node";
108
116
  export interface JumpChoice {
109
117
  label: string;
110
118
  command: string;
111
- args?: CommandArgs;
119
+ args?: CommandArgValues;
112
120
  /** The choice you are already on. Marked, never hidden — a menu that omits it loses its place. */
113
121
  current?: boolean;
114
122
  }
@@ -121,7 +129,7 @@ export interface JumpSegment {
121
129
  title?: string;
122
130
  /** The command that MOVES you here, or `null` when you are already here. */
123
131
  command: string | null;
124
- args?: CommandArgs;
132
+ args?: CommandArgValues;
125
133
  /** Where else this step could go. Fewer than two is not a choice, and renders no control. */
126
134
  choices: readonly JumpChoice[];
127
135
  }
@@ -160,19 +168,19 @@ export interface SelectionCrumb {
160
168
  * array pseudo-element ("Repeater") and its template both visible instead of collapsing the array
161
169
  * into a bare `[index]`.
162
170
  */
163
- export function selectionCrumbs(document: unknown, selection: JxPath): SelectionCrumb[] {
171
+ export function selectionCrumbs(document: JxMutableNode, selection: JxPath): SelectionCrumb[] {
164
172
  const crumbs: SelectionCrumb[] = [];
165
173
  for (let i = 0; i < selection.length;) {
166
174
  const seg = selection[i];
167
175
  const step = seg === "map" ? 1 : 2;
168
- const path = selection.slice(0, i + step) as JxPath;
169
- const node = getNodeAtPath(document as never, path);
176
+ const path = selection.slice(0, i + step);
177
+ const node = getNodeAtPath(document, path);
170
178
  const fallbackTag = node?.tag;
171
179
  const label =
172
180
  node?.$prototype === "Array"
173
181
  ? "Repeater"
174
182
  : displayTagName(node?.tagName) ||
175
- (typeof fallbackTag === "string" ? fallbackTag : "") ||
183
+ (isString(fallbackTag) ? fallbackTag : "") ||
176
184
  (seg === "cases" ? String(selection[i + 1]) : `[${selection[i + 1]}]`);
177
185
  crumbs.push({ label, path });
178
186
  i += step;
@@ -191,7 +199,7 @@ export function selectionCrumbs(document: unknown, selection: JxPath): Selection
191
199
  * addressable, so both drop out and the segment renders no control at all.
192
200
  */
193
201
  export function crumbSiblings(
194
- document: unknown,
202
+ document: JxMutableNode,
195
203
  crumbs: readonly SelectionCrumb[],
196
204
  index: number,
197
205
  ): JumpChoice[] {
@@ -199,17 +207,17 @@ export function crumbSiblings(
199
207
  if (!crumb) {
200
208
  return [];
201
209
  }
202
- const parentPath = (index === 0 ? [] : crumbs[index - 1]!.path) as JxPath;
203
- const parent = getNodeAtPath(document as never, parentPath);
210
+ const parentPath: JxPath = index === 0 ? [] : crumbs[index - 1]!.path;
211
+ const parent = getNodeAtPath(document, parentPath);
204
212
  const key = crumb.path.at(-2);
205
213
  const own = crumb.path;
206
214
  if (key === "cases") {
207
215
  const cases = parent?.cases;
208
- if (!cases || typeof cases !== "object") {
216
+ if (!isNonNullObject(cases)) {
209
217
  return [];
210
218
  }
211
219
  return Object.keys(cases).map((name) => {
212
- const path = [...parentPath, "cases", name] as JxPath;
220
+ const path: JxPath = [...parentPath, "cases", name];
213
221
  return choiceFor(document, path, name, own);
214
222
  });
215
223
  }
@@ -218,17 +226,22 @@ export function crumbSiblings(
218
226
  }
219
227
  const choices: JumpChoice[] = [];
220
228
  for (const [i, child] of childList(parent).entries()) {
221
- if (typeof child === "string") {
229
+ if (isString(child)) {
222
230
  continue;
223
231
  }
224
- const path = [...parentPath, "children", i] as JxPath;
232
+ const path: JxPath = [...parentPath, "children", i];
225
233
  choices.push(choiceFor(document, path, nodeLabel(child), own));
226
234
  }
227
235
  return choices;
228
236
  }
229
237
 
230
- function choiceFor(document: unknown, path: JxPath, fallback: string, own: JxPath): JumpChoice {
231
- const node = getNodeAtPath(document as never, path);
238
+ function choiceFor(
239
+ document: JxMutableNode,
240
+ path: JxPath,
241
+ fallback: string,
242
+ own: JxPath,
243
+ ): JumpChoice {
244
+ const node = getNodeAtPath(document, path);
232
245
  const label = node ? nodeLabel(node) : fallback;
233
246
  const choice: JumpChoice = { args: { path }, command: "selection.set", label };
234
247
  // `pathsEqual`, not a joined key: a separator is a guess about what a segment cannot contain,
@@ -278,8 +291,7 @@ export function jumpSegments(
278
291
 
279
292
  // A logic editor is the leaf of the address, and it has no selection under it: the Monaco buffer
280
293
  // And the formula workspace are editing a definition, not a node of the document tree.
281
- const editingFunction = tab.session.ui.editingFunction as FunctionEditDef | null;
282
- const editingFormula = tab.session.ui.editingFormula as FormulaEditDef | null;
294
+ const { editingFormula, editingFunction } = tab.session.ui;
283
295
  if (editingFunction) {
284
296
  segments.push(editorSegment("ƒ", editingFunction));
285
297
  return segments;
@@ -333,9 +345,7 @@ function editorSegment(sigil: string, def: FunctionEditDef | FormulaEditDef): Ju
333
345
  */
334
346
  function stepKey(segment: JumpSegment): string {
335
347
  const path = segment.args?.path;
336
- return segment.kind === "node" && Array.isArray(path)
337
- ? `node:${(path as JxPath).join("/")}`
338
- : segment.kind;
348
+ return segment.kind === "node" && Array.isArray(path) ? `node:${path.join("/")}` : segment.kind;
339
349
  }
340
350
 
341
351
  /** Whether the registry can actually run this id right now. */
@@ -446,7 +456,7 @@ function openChoices(segment: JumpSegment, anchor: HTMLElement | null): void {
446
456
  },
447
457
  title: choice.label,
448
458
  }));
449
- const handle = openMenu({
459
+ const options: OpenMenuOptions = {
450
460
  label: `Go to a sibling of ${segment.label}`,
451
461
  onClosed: (closed) => {
452
462
  if (_menu === closed) {
@@ -455,10 +465,13 @@ function openChoices(segment: JumpSegment, anchor: HTMLElement | null): void {
455
465
  },
456
466
  opener: anchor,
457
467
  placement: ABOVE_OPENER,
458
- ...(anchor ? { place: (box: DOMRect) => aboveOpener(anchor, box) } : {}),
459
468
  region: "jump-bar",
460
469
  rows,
461
- });
470
+ };
471
+ if (anchor) {
472
+ options.place = (box: DOMRect) => aboveOpener(anchor, box);
473
+ }
474
+ const handle = openMenu(options);
462
475
  _menu = handle;
463
476
  }
464
477
 
@@ -466,13 +479,19 @@ function openChoices(segment: JumpSegment, anchor: HTMLElement | null): void {
466
479
  * The menu's corner when it hangs above `anchor`: its bottom on the anchor's top, leading edges
467
480
  * aligned.
468
481
  */
469
- export function aboveOpener(anchor: HTMLElement, box: DOMRect): { x: number; y: number } {
482
+ export function aboveOpener(anchor: HTMLElement, box: DOMRect): ViewportPoint {
470
483
  const rect = rectOf(anchor);
471
484
  return { x: Math.round(rect.left), y: Math.max(0, Math.round(rect.top - box.height)) };
472
485
  }
473
486
 
474
487
  /** The address of the focused pane, and the segments behind it. */
475
- function projectFocused(): { steps: ProjectedStep[]; segments: JumpSegment[] } {
488
+ interface FocusedAddress {
489
+ steps: ProjectedStep[];
490
+ segments: JumpSegment[];
491
+ }
492
+
493
+ /** Projects {@link FocusedAddress} for the focused pane. */
494
+ function projectFocused(): FocusedAddress {
476
495
  const paneId = activePane().id;
477
496
  const segments = jumpSegments(tabOfPane(paneId), derivationOfPane(paneId));
478
497
  const registry = activeRegistry();
@@ -47,7 +47,15 @@
47
47
  */
48
48
 
49
49
  import { nothing } from "lit-html";
50
- import { displayTagName, isTagExpression, tagNameCandidates } from "@jxsuite/schema/guards";
50
+ import {
51
+ displayTagName,
52
+ isMappedArray,
53
+ isNonNullObject,
54
+ isNumber,
55
+ isString,
56
+ isTagExpression,
57
+ tagNameCandidates,
58
+ } from "@jxsuite/schema/guards";
51
59
  import {
52
60
  VOID_ELEMENTS,
53
61
  childIndex,
@@ -60,7 +68,7 @@ import {
60
68
  } from "../store";
61
69
  import { activeTab } from "../workspace/workspace";
62
70
  import {
63
- isSelected as isPathSelected,
71
+ isSelected,
64
72
  primarySelection,
65
73
  rangeSelection,
66
74
  selectionAnchor,
@@ -72,7 +80,12 @@ import { mutateUpdateProperty, transactDoc } from "../tabs/transact";
72
80
  import { view } from "../view";
73
81
  import { setActivityTab } from "../shell";
74
82
  import { registerPanel } from "./panel-registry";
75
- import { detachStylebookLayers, mountStylebookLayersPanel } from "./stylebook-layers-panel";
83
+ import {
84
+ INDENT_BASE,
85
+ INDENT_STEP,
86
+ detachStylebookLayers,
87
+ mountStylebookLayersPanel,
88
+ } from "./stylebook-layers-panel";
76
89
  import { selectStylebookTag, stylebookMeta } from "./stylebook-panel";
77
90
  import { isInlineElement } from "../editor/inline-edit";
78
91
  import { showContextMenu } from "../editor/context-menu";
@@ -115,17 +128,17 @@ const TEXT_PREVIEW_MAX = 40;
115
128
  * Deliberately short. `section`, `ul` and `table` are omitted: "Section" next to a `section` badge
116
129
  * is the repetition this function exists to remove.
117
130
  */
118
- const LANDMARK_NAMES: Readonly<Record<string, string>> = {
119
- article: "Article",
120
- aside: "Sidebar",
121
- dialog: "Dialog",
122
- figure: "Figure",
123
- footer: "Footer",
124
- form: "Form",
125
- header: "Header",
126
- main: "Main",
127
- nav: "Navigation",
128
- };
131
+ const LANDMARK_NAMES: ReadonlyMap<string, string> = new Map([
132
+ ["article", "Article"],
133
+ ["aside", "Sidebar"],
134
+ ["dialog", "Dialog"],
135
+ ["figure", "Figure"],
136
+ ["footer", "Footer"],
137
+ ["form", "Form"],
138
+ ["header", "Header"],
139
+ ["main", "Main"],
140
+ ["nav", "Navigation"],
141
+ ]);
129
142
 
130
143
  /** Trim and ellipsize to {@link LABEL_MAX}. */
131
144
  function truncate(text: string): string {
@@ -141,17 +154,17 @@ function truncate(text: string): string {
141
154
  * five-buttons-per-row build already cost it.
142
155
  */
143
156
  function firstText(node: JxMutableNode, depth = 0): string {
144
- if (typeof node.textContent === "string" && node.textContent.trim()) {
157
+ if (isString(node.textContent) && node.textContent.trim()) {
145
158
  return node.textContent.trim();
146
159
  }
147
160
  if (depth >= 3 || !Array.isArray(node.children)) {
148
161
  return "";
149
162
  }
150
163
  for (const child of node.children) {
151
- if (typeof child === "string" && child.trim()) {
164
+ if (isString(child) && child.trim()) {
152
165
  return child.trim();
153
166
  }
154
- if (child && typeof child === "object") {
167
+ if (isNonNullObject(child)) {
155
168
  const found = firstText(child, depth + 1);
156
169
  if (found) {
157
170
  return found;
@@ -164,7 +177,7 @@ function firstText(node: JxMutableNode, depth = 0): string {
164
177
  /** The node's first class name, when it has a plain (unbound) `class` attribute. */
165
178
  function firstClass(node: JxMutableNode): string {
166
179
  const value = node.attributes?.class;
167
- return typeof value === "string" ? (value.trim().split(/\s+/u)[0] ?? "") : "";
180
+ return isString(value) ? (value.trim().split(/\s+/u)[0] ?? "") : "";
168
181
  }
169
182
 
170
183
  /**
@@ -188,14 +201,14 @@ export function outlineLabel(node: JxMutableNode): string {
188
201
  if (node.$id) {
189
202
  return `#${truncate(node.$id)}`;
190
203
  }
191
- if (typeof node.textContent === "string" && node.textContent.trim()) {
204
+ if (isString(node.textContent) && node.textContent.trim()) {
192
205
  return truncate(node.textContent);
193
206
  }
194
207
  const cls = firstClass(node);
195
208
  if (cls) {
196
209
  return `.${truncate(cls)}`;
197
210
  }
198
- const landmark = LANDMARK_NAMES[displayTagName(node.tagName).toLowerCase()];
211
+ const landmark = LANDMARK_NAMES.get(displayTagName(node.tagName).toLowerCase());
199
212
  if (landmark) {
200
213
  return landmark;
201
214
  }
@@ -256,12 +269,11 @@ export function rowCommandViews(
256
269
  // ─── The tree, as a keyboard surface ─────────────────────────────────────────
257
270
 
258
271
  /**
259
- * Pixels of indent per level, the depth past which the column stops paying, and the row's own
260
- * gutter.
272
+ * The depth past which the column stops paying. The pixels per level and the row's own gutter are
273
+ * the Stylebook layers panel's {@link INDENT_STEP} and {@link INDENT_BASE}, so the two trees indent
274
+ * alike.
261
275
  */
262
- const INDENT_STEP = 16;
263
276
  const INDENT_MAX_DEPTH = 6;
264
- const INDENT_BASE = 8;
265
277
 
266
278
  /**
267
279
  * The indent for `depth`, capped.
@@ -275,7 +287,7 @@ export function indentWidth(depth: number): number {
275
287
 
276
288
  /** The inverse of {@link pathKey}: numeric segments come back as numbers, as the doc stores them. */
277
289
  function pathFromKey(key: string): JxPath {
278
- return key ? (key.split("/").map((s) => (/^\d+$/u.test(s) ? Number(s) : s)) as JxPath) : [];
290
+ return key ? key.split("/").map((s) => (/^\d+$/u.test(s) ? Number(s) : s)) : [];
279
291
  }
280
292
 
281
293
  // ─── The row model, and the window onto it ───────────────────────────────────
@@ -288,7 +300,7 @@ function pathFromKey(key: string): JxPath {
288
300
  * window only. Splitting the two is the whole saving — the expensive half is the kit elements a
289
301
  * row's cluster mounts, not the walk that finds it.
290
302
  */
291
- interface OutlineRow {
303
+ interface OutlineRowFacts {
292
304
  /** `pathKey(path)` — the drag-and-drop and roving-focus key, and the `$map`'s reconcile key. */
293
305
  key: string;
294
306
  path: JxPath;
@@ -303,7 +315,6 @@ interface OutlineRow {
303
315
  * than quietly start selecting text nodes.
304
316
  */
305
317
  item: boolean;
306
- node: JxMutableNode | string | number | boolean;
307
318
  nodeType: string;
308
319
  /** 1-based position among the row's `role="treeitem"` siblings — see {@link numberOutlineSets}. */
309
320
  posInSet: number;
@@ -311,6 +322,20 @@ interface OutlineRow {
311
322
  setSize: number;
312
323
  }
313
324
 
325
+ /** A `role="treeitem"` row: an element, a repeater, a template or a case, always an object node. */
326
+ interface OutlineItemRow extends OutlineRowFacts {
327
+ item: true;
328
+ node: JxMutableNode;
329
+ }
330
+
331
+ /** A text-node row: drawn, but not a tree item. Its node is the bare child primitive. */
332
+ interface OutlineTextRow extends OutlineRowFacts {
333
+ item: false;
334
+ node: JxMutableNode | string | number | boolean;
335
+ }
336
+
337
+ type OutlineRow = OutlineItemRow | OutlineTextRow;
338
+
314
339
  /**
315
340
  * The declared height of one row — `surfaces/panel-outline.json`'s `[part="row"] { block-size }`.
316
341
  *
@@ -456,6 +481,11 @@ function watchOutlineTree(): void {
456
481
  * reorder, canvas to Outline sync, a collaborator's cursor, a jump from Problems — needs the
457
482
  * unambiguous one.
458
483
  */
484
+ /** Whether a decoded `data-jx-path` is a path: an array of string and number segments. */
485
+ function isJxPath(value: unknown): value is JxPath {
486
+ return Array.isArray(value) && value.every((segment) => isString(segment) || isNumber(segment));
487
+ }
488
+
459
489
  export function outlineRowPath(el: Element | null): JxPath | null {
460
490
  const row = el?.closest<HTMLElement>("[data-jx-path]");
461
491
  if (!row?.dataset.jxPath) {
@@ -463,7 +493,7 @@ export function outlineRowPath(el: Element | null): JxPath | null {
463
493
  }
464
494
  try {
465
495
  const parsed: unknown = JSON.parse(row.dataset.jxPath);
466
- return Array.isArray(parsed) ? (parsed as JxPath) : null;
496
+ return isJxPath(parsed) ? parsed : null;
467
497
  } catch {
468
498
  return null;
469
499
  }
@@ -674,7 +704,7 @@ function outlineRowLabel(row: OutlineRow): string {
674
704
  const text = String(row.node);
675
705
  return text.length > TEXT_PREVIEW_MAX ? `${text.slice(0, TEXT_PREVIEW_MAX)}…` : text;
676
706
  }
677
- const node = row.node as JxMutableNode;
707
+ const { node } = row;
678
708
  return row.nodeType === "case-ref" ? node.$ref || "external" : outlineLabel(node);
679
709
  }
680
710
 
@@ -733,7 +763,7 @@ export function startLayerTitleEdit(path: JxPath, rerender: () => void) {
733
763
  /* The row's own node, not a second `getNodeAtPath` walk: the model already holds it, and reading
734
764
  it back off the model is what makes "a text line has no `$title` to write" a real branch rather
735
765
  than a defensive null check nothing can reach. */
736
- if (!row?.item || typeof row.node !== "object") {
766
+ if (!row?.item) {
737
767
  return;
738
768
  }
739
769
  _editing = { key: row.key, rerender, text: row.node.$title || "" };
@@ -827,9 +857,11 @@ function buildOutlineRows(doc: JxMutableNode, mode: string, collapsed: Set<strin
827
857
  }
828
858
 
829
859
  const isText = nodeType === "text";
860
+ /** The row's node when it is a tree item; `null` for a text-node row. */
861
+ let element: JxMutableNode | null = null;
830
862
  if (!isText) {
831
863
  // After the text-node branch, a row's node is a JxMutableNode or it is not a row at all.
832
- if (typeof node !== "object" || node === null) {
864
+ if (!isNonNullObject(node)) {
833
865
  continue;
834
866
  }
835
867
  if (path.length >= 2 && nodeType === "element") {
@@ -839,22 +871,28 @@ function buildOutlineRows(doc: JxMutableNode, mode: string, collapsed: Set<strin
839
871
  continue;
840
872
  }
841
873
  }
874
+ element = node;
842
875
  }
843
876
 
844
877
  while (ancestors.length > 0 && rows[ancestors.at(-1)!]!.depth >= depth) {
845
878
  ancestors.pop();
846
879
  }
847
- rows.push({
848
- depth,
849
- item: !isText,
850
- key,
851
- node,
852
- nodeType,
853
- parent: ancestors.at(-1) ?? -1,
854
- path,
855
- posInSet: 0,
856
- setSize: 0,
857
- });
880
+ const parent = ancestors.at(-1) ?? -1;
881
+ rows.push(
882
+ element === null
883
+ ? { depth, item: false, key, node, nodeType, parent, path, posInSet: 0, setSize: 0 }
884
+ : {
885
+ depth,
886
+ item: true,
887
+ key,
888
+ node: element,
889
+ nodeType,
890
+ parent,
891
+ path,
892
+ posInSet: 0,
893
+ setSize: 0,
894
+ },
895
+ );
858
896
  ancestors.push(rows.length - 1);
859
897
  }
860
898
  return numberOutlineSets(rows);
@@ -890,30 +928,20 @@ function numberOutlineSets(rows: OutlineRow[]): OutlineRow[] {
890
928
 
891
929
  /** Whether the row has anything under it — children, a map template, or `$switch` cases. */
892
930
  function isExpandable(row: OutlineRow): boolean {
893
- if (!row.item || typeof row.node !== "object") {
931
+ if (!row.item) {
894
932
  return false;
895
933
  }
896
- const node = row.node as JxMutableNode;
934
+ const { node } = row;
897
935
  const hasChildren = Array.isArray(node.children) && node.children.length > 0;
898
- const hasMapChildren =
899
- node.children !== undefined &&
900
- typeof node.children === "object" &&
901
- (node.children as unknown as Record<string, unknown>).$prototype === "Array";
936
+ const hasMapChildren = isMappedArray(node.children);
902
937
  const hasCases =
903
- Boolean(node.$switch) &&
904
- typeof node.cases === "object" &&
905
- node.cases !== null &&
906
- Object.keys(node.cases).length > 0;
938
+ Boolean(node.$switch) && isNonNullObject(node.cases) && Object.keys(node.cases).length > 0;
907
939
  return hasChildren || hasMapChildren || hasCases || (row.nodeType === "map" && Boolean(node.map));
908
940
  }
909
941
 
910
942
  /** The badge: what it says, which of the six drawings it gets, and what it says on hover. */
911
- function rowBadge(row: OutlineRow): {
912
- badge: string;
913
- badgeKind: string;
914
- badgeTitle: string | null;
915
- } {
916
- const node = row.node as JxMutableNode;
943
+ function rowBadge(row: OutlineItemRow): Pick<OutlineRowView, "badge" | "badgeKind" | "badgeTitle"> {
944
+ const { node } = row;
917
945
  if (row.nodeType === "map") {
918
946
  return { badge: "↻", badgeKind: "map", badgeTitle: "Repeating list — one copy per item" };
919
947
  }
@@ -930,9 +958,7 @@ function rowBadge(row: OutlineRow): {
930
958
  badge: "▣",
931
959
  badgeKind: "slot",
932
960
  badgeTitle:
933
- typeof slotName === "string" && slotName.trim()
934
- ? `Slot "${slotName.trim()}"`
935
- : "Default slot",
961
+ isString(slotName) && slotName.trim() ? `Slot "${slotName.trim()}"` : "Default slot",
936
962
  };
937
963
  }
938
964
  /* The ROW BADGE, which is the one place the tag is shown as itself rather than folded into a
@@ -994,10 +1020,9 @@ function outlineRowView(
994
1020
  if (!row.item) {
995
1021
  return textRowView(row);
996
1022
  }
997
- const { depth, key, nodeType, path } = row;
998
- const node = row.node as JxMutableNode;
1023
+ const { depth, key, node, nodeType, path } = row;
999
1024
 
1000
- const selected = isPathSelected(doc.selection, path);
1025
+ const selected = isSelected(doc.selection, path);
1001
1026
  const expandable = isExpandable(row);
1002
1027
  // Array nodes can't accept dropped children (their content is the single map template), so they
1003
1028
  // Block the make-child drop instruction like void elements do.
@@ -1006,8 +1031,7 @@ function outlineRowView(
1006
1031
  // Array (repeater) nodes are first-class structural nodes — movable/draggable/deletable like
1007
1032
  // Elements. Both sit at a numeric child index; templates (path tail "map") and case nodes do
1008
1033
  // Not, so they stay selectable/editable but not structurally manipulable.
1009
- const structural =
1010
- (nodeType === "element" || nodeType === "map") && typeof childIndex(path) === "number";
1034
+ const structural = (nodeType === "element" || nodeType === "map") && isNumber(childIndex(path));
1011
1035
  const isRoot = doc.mode === "content" ? path.length === 0 : path.length < 2;
1012
1036
  const grabbable = structural && !isRoot;
1013
1037
  const open = expandable && !collapsed.has(key);
@@ -1187,7 +1211,7 @@ function revealChangedSelection(): void {
1187
1211
  function revealSelectedRow(): void {
1188
1212
  const drawn = _outlineList?.querySelector(`${ROW_SELECTOR}[aria-selected="true"]`);
1189
1213
  if (drawn) {
1190
- drawn.scrollIntoView?.({ behavior: "smooth", block: "nearest" });
1214
+ drawn.scrollIntoView({ behavior: "smooth", block: "nearest" });
1191
1215
  return;
1192
1216
  }
1193
1217
  revealOutlineRow(outlineIndexOfPath(primarySelection(activeTab.value?.session.selection)));
@@ -1244,9 +1268,9 @@ export function mountOutlinePanel(
1244
1268
  standing = {
1245
1269
  handle: mountOutlineSurface(target, values, {
1246
1270
  contextMenu: (_scope, event) => {
1247
- const path = outlineRowPath(event.target as Element | null);
1248
- if (path) {
1249
- showContextMenu(event as MouseEvent, path, { rerender: () => _outlineRerender?.() });
1271
+ const path = outlineRowPath(event.target instanceof Element ? event.target : null);
1272
+ if (path && event instanceof MouseEvent) {
1273
+ showContextMenu(event, path, { rerender: () => _outlineRerender?.() });
1250
1274
  redrawOutline();
1251
1275
  }
1252
1276
  },
@@ -1260,10 +1284,9 @@ export function mountOutlinePanel(
1260
1284
  mount would, and the host decides when it is worth anything. An unconnected input
1261
1285
  cannot take focus. */
1262
1286
  queueMicrotask(() => {
1263
- const input = element as HTMLInputElement;
1264
- if (input.isConnected) {
1265
- input.focus();
1266
- input.select?.();
1287
+ if (element instanceof HTMLInputElement && element.isConnected) {
1288
+ element.focus();
1289
+ element.select();
1267
1290
  }
1268
1291
  });
1269
1292
  },
@@ -27,7 +27,7 @@
27
27
  */
28
28
 
29
29
  import { render as litRender } from "lit-html";
30
- import { leftPanel } from "../store";
30
+ import { leftPanel, requireShellRef } from "../store";
31
31
  import { effect, effectScope } from "../reactivity";
32
32
  import { activeTab } from "../workspace/workspace";
33
33
  import { shell } from "../shell";
@@ -72,7 +72,7 @@ export function mount(deps: NavigatorPanelDeps) {
72
72
  _deps = deps;
73
73
  registerNavigatorPanels();
74
74
  _dock = mountNavigatorDock(
75
- leftPanel,
75
+ requireShellRef(leftPanel, "left-panel"),
76
76
  { panels: [panelView()] },
77
77
  {
78
78
  onContent: (panelId, host) => {
@@ -180,7 +180,7 @@ function navigatorDocument(): NavigatorDocument | null {
180
180
  return null;
181
181
  }
182
182
  return {
183
- canvas: aTab.session.canvas as Record<string, unknown> | null,
183
+ canvas: aTab.session.canvas,
184
184
  content: aTab.doc.content,
185
185
  document: aTab.doc.document,
186
186
  documentPath: aTab.documentPath,