@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
@@ -42,7 +42,8 @@
42
42
  * @docs studio/logic/events
43
43
  */
44
44
 
45
- import { getNodeAtPath, renderOnly } from "../store";
45
+ import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
46
+ import { renderOnly } from "../store";
46
47
  import { activeTab } from "../workspace/workspace";
47
48
  import { primarySelection, unifyValues } from "../tabs/selection";
48
49
  import {
@@ -68,6 +69,7 @@ import {
68
69
  import { VALUE_SOURCE_LABELS, capsForPosition, slotCaps, slotMode } from "../ui/value-source";
69
70
  import { cloneValue } from "../tabs/doc-op-apply";
70
71
  import { openMenu } from "../surfaces/menu";
72
+ import type { MenuRowProjection } from "../surfaces/menu";
71
73
  import { showPromptDialog } from "../ui/layers";
72
74
  import { effect, effectScope } from "../reactivity";
73
75
  import {
@@ -86,30 +88,28 @@ import {
86
88
  isFunctionDef,
87
89
  isJsonObject,
88
90
  isRef,
91
+ isString,
89
92
  } from "@jxsuite/schema/guards";
90
93
 
91
94
  import type {
92
95
  LogicBindingView,
93
96
  LogicBodyKind,
94
- LogicEmptyAction,
95
97
  LogicFieldView,
96
- LogicOption,
97
98
  LogicSurface,
98
99
  LogicView,
99
100
  } from "../surfaces/logic-panel";
100
101
  import type { JsonValue } from "../types";
101
102
  import type { EffectScope } from "@vue/reactivity";
102
- import type { SignalOption } from "../ui/dynamic-slot";
103
103
  import type { SlotCapsSource, SlotMode } from "../ui/value-source";
104
104
  import type { JxPath } from "../state";
105
105
  import type {
106
- CemEvent,
106
+ JxDocumentValue,
107
107
  JxEventBinding,
108
108
  JxFunctionDef,
109
109
  JxMutableNode,
110
- JxPrototypeDef,
111
- JxStatement,
110
+ JxStateDefinition,
112
111
  } from "@jxsuite/schema/types";
112
+ import type { SurfaceAction, SurfaceOption } from "../ui/surface";
113
113
 
114
114
  /**
115
115
  * The events worth SUGGESTING — not the events an element may have.
@@ -146,7 +146,10 @@ const EVENT_NAME_PATTERN = /^on[a-z][\da-z-]*$/i;
146
146
  const HANDLER_MODES: SlotMode[] = capsForPosition("eventHandler");
147
147
 
148
148
  /** The value a handler starts at on each rung, when the user has never been on that rung before. */
149
- function seedForHandlerMode(mode: SlotMode, functionDefs: [string, unknown][]): JsonValue {
149
+ function seedForHandlerMode(
150
+ mode: SlotMode,
151
+ functionDefs: [string, JxStateDefinition][],
152
+ ): JsonValue {
150
153
  if (mode === "function") {
151
154
  return { $prototype: "Function", body: "", parameters: [] };
152
155
  }
@@ -202,7 +205,7 @@ function mixedEventCount(doc: JxMutableNode, targets: readonly JxPath[], evKey:
202
205
  return 0;
203
206
  }
204
207
  const values = targets.map((path) => {
205
- const n = getNodeAtPath(doc, path) as JxMutableNode | undefined;
208
+ const n = getNodeAtPath(doc, path);
206
209
  return n ? (getEventBinding(n, evKey) ?? null) : null;
207
210
  });
208
211
  return unifyValues(values).mixed ? targets.length : 0;
@@ -214,12 +217,13 @@ function mixedEventCount(doc: JxMutableNode, targets: readonly JxPath[], evKey:
214
217
  interface FieldPlan {
215
218
  label: string;
216
219
  caps: SlotCapsSource;
217
- value: unknown;
220
+ /** What the selected node holds at the row's position. */
221
+ value: JxDocumentValue | undefined;
218
222
  mode: SlotMode;
219
223
  offered: SlotMode[];
220
224
  onChange: (v?: JsonValue) => void;
221
225
  onClear?: (() => void) | undefined;
222
- extraSignals: SignalOption[] | null;
226
+ extraSignals: SurfaceOption[] | null;
223
227
  literalDefault: JsonValue | undefined;
224
228
  stateDefs: readonly string[];
225
229
  /** Fills the row's control host when the active rung is a formula. */
@@ -229,7 +233,7 @@ interface FieldPlan {
229
233
  /** Everything an event binding needs. */
230
234
  interface BindingPlan {
231
235
  key: string;
232
- value: unknown;
236
+ value: JxEventBinding;
233
237
  mode: SlotMode;
234
238
  fn: JxFunctionDef | null;
235
239
  body: LogicBodyKind;
@@ -245,7 +249,7 @@ interface Plans {
245
249
  targets: JxPath[];
246
250
  /** The primary selection — the one whose bodies are edited. */
247
251
  selection: JxPath | null;
248
- functionDefs: [string, unknown][];
252
+ functionDefs: [string, JxStateDefinition][];
249
253
  }
250
254
 
251
255
  let plans: Plans = {
@@ -280,7 +284,7 @@ function sourceHint(mode: SlotMode, offered: readonly SlotMode[]): string {
280
284
  }
281
285
 
282
286
  /** Every pointer the From data… rung offers on a bindable position. */
283
- function refOptions(plan: FieldPlan): LogicOption[] {
287
+ function refOptions(plan: FieldPlan): SurfaceOption[] {
284
288
  return [
285
289
  ...plan.stateDefs.map((name) => ({ label: name, value: `#/state/${name}` })),
286
290
  ...(plan.extraSignals ?? []),
@@ -334,11 +338,13 @@ function addField(
334
338
  const mode = effectiveSlotMode(key, spec.value);
335
339
  const plan: FieldPlan = { ...spec, mode, offered };
336
340
  if (mode === "expression") {
337
- const node = (spec.value as { $expression?: unknown } | undefined)?.$expression;
341
+ // The rung is "expression" only for an object carrying `$expression` (value-source.ts slotMode).
342
+ const node = isJsonObject(spec.value) ? spec.value.$expression : undefined;
338
343
  plan.paint = (host) =>
339
344
  mountExpressionEditor(
340
345
  host,
341
346
  node,
347
+ // SAFETY: the expression editor reports the tree it edits, built of JSON operator/operand nodes.
342
348
  (next) => spec.onChange({ $expression: next } as JsonValue),
343
349
  {
344
350
  allowEventRef: false,
@@ -367,7 +373,7 @@ export function projectLogicPanel(): LogicView {
367
373
  const tab = activeTab.value;
368
374
  const selection = primarySelection(tab?.session.selection);
369
375
  const doc = tab?.doc.document;
370
- const nothingToWire = (message: string, actions: LogicEmptyAction[] = []): LogicView => {
376
+ const nothingToWire = (message: string, actions: SurfaceAction[] = []): LogicView => {
371
377
  plans = { bindings, cases, fields, functionDefs: [], selection: null, targets: [] };
372
378
  view.emptyActions = actions;
373
379
  view.emptyMessage = message;
@@ -387,7 +393,7 @@ export function projectLogicPanel(): LogicView {
387
393
  if (!selection) {
388
394
  return nothingToWire(clickAnythingTo("wire it up"));
389
395
  }
390
- const node = getNodeAtPath(doc, selection) as JxMutableNode | undefined;
396
+ const node = getNodeAtPath(doc, selection);
391
397
  if (!node) {
392
398
  return nothingToWire(staleSelectionMessage());
393
399
  }
@@ -395,8 +401,7 @@ export function projectLogicPanel(): LogicView {
395
401
  view.state = "ready";
396
402
  const defs = doc.state || {};
397
403
  const functionDefs = Object.entries(defs).filter(
398
- ([, d]) =>
399
- (d as JxPrototypeDef)?.$prototype === "Function" || (d as Record<string, unknown>)?.$handler,
404
+ ([, d]) => isJsonObject(d) && (d.$prototype === "Function" || Boolean(d.$handler)),
400
405
  );
401
406
  // The whole selection the Logic tab wires. `[selection]` when one element is selected — which is
402
407
  // Every existing call site's behaviour, unchanged.
@@ -416,7 +421,7 @@ export function projectLogicPanel(): LogicView {
416
421
  const key = selection.join("/");
417
422
  /* De-escalating to Fixed value restores the bound signal's declared default — the old unbind
418
423
  behaviour, and the reason the ladder has to be told what a position's default IS. */
419
- const literalDefaultOf = (raw: unknown): JsonValue | undefined => {
424
+ const literalDefaultOf = (raw: JxDocumentValue | undefined): JsonValue | undefined => {
420
425
  const bound = isRef(raw) ? raw.$ref : null;
421
426
  if (!bound) {
422
427
  return undefined;
@@ -501,13 +506,13 @@ export function projectLogicPanel(): LogicView {
501
506
  const declared: LogicView["declared"] = [];
502
507
  for (const [fnName, d] of Object.entries(defs)) {
503
508
  if (isFunctionDef(d) && Array.isArray(d.emits)) {
504
- for (const [i, ev] of (d.emits as CemEvent[]).entries()) {
509
+ for (const [i, ev] of d.emits.entries()) {
505
510
  declared.push({
506
511
  key: `${fnName}:${ev.name || i}`,
507
512
  name: ev.name || "(unnamed)",
508
513
  source: `← ${fnName}`,
509
514
  title: ev.description || "",
510
- type: isJsonObject(ev.type) && typeof ev.type.text === "string" ? ev.type.text : "",
515
+ type: isJsonObject(ev.type) && isString(ev.type.text) ? ev.type.text : "",
511
516
  });
512
517
  }
513
518
  }
@@ -528,23 +533,25 @@ export function projectLogicPanel(): LogicView {
528
533
 
529
534
  // ── The custom element's outward contract ────────────────────────────────
530
535
  if (isCustomElement && isRoot) {
531
- const observed = Object.entries(defs).filter(
532
- ([, d]) => (d as Record<string, unknown>).attribute,
533
- );
534
- view.hasObserved = true;
535
- view.observedOpen = isInspectorSectionOpen("__observed", false);
536
- view.observedEmpty = observed.length === 0;
537
- view.observed = observed.map(([name, d]) => {
538
- const def = d as Record<string, unknown>;
539
- return {
536
+ // A state entry that declares an `attribute` is an object; a primitive entry declares none.
537
+ const observed: LogicView["observed"] = [];
538
+ for (const [name, def] of Object.entries(defs)) {
539
+ if (!isJsonObject(def) || !def.attribute) {
540
+ continue;
541
+ }
542
+ observed.push({
540
543
  detail: `→ ${name}`,
541
544
  key: name,
542
545
  name: String(def.attribute),
543
546
  prop: `attribute:${name}`,
544
547
  tags: def.reflects ? "reflects" : "",
545
548
  value: def.type ? String(def.type) : "",
546
- };
547
- });
549
+ });
550
+ }
551
+ view.hasObserved = true;
552
+ view.observedOpen = isInspectorSectionOpen("__observed", false);
553
+ view.observedEmpty = observed.length === 0;
554
+ view.observed = observed;
548
555
 
549
556
  const cssProps = Object.entries(node.style || {}).filter(([k]) => k.startsWith("--"));
550
557
  view.hasCssProps = cssProps.length > 0;
@@ -579,14 +586,15 @@ function bindingView(
579
586
  bindings: Map<string, BindingPlan>,
580
587
  evKey: string,
581
588
  evVal: JxEventBinding,
582
- defs: Record<string, unknown>,
589
+ defs: Record<string, JxStateDefinition>,
583
590
  ): LogicBindingView {
584
591
  const { functionDefs, selection, targets } = plans;
585
592
  const tab = activeTab.value!;
586
593
  const fn: JxFunctionDef | null = isFunctionDef(evVal) ? evVal : null;
587
594
  const expression = isExpressionDef(evVal) ? evVal.$expression : null;
588
595
  const mode = slotMode(evVal);
589
- const structured = Boolean(fn && Array.isArray(fn.body));
596
+ const statements = fn && Array.isArray(fn.body) ? fn.body : null;
597
+ const structured = statements !== null;
590
598
  const body: LogicBodyKind = fn
591
599
  ? structured
592
600
  ? "statements"
@@ -597,16 +605,16 @@ function bindingView(
597
605
  const mixed = mixedEventCount(tab.doc.document, targets, evKey) > 0;
598
606
  const plan: BindingPlan = { body, fn, key: evKey, mode, value: evVal };
599
607
 
600
- if (fn && structured && selection) {
608
+ if (fn && statements && selection) {
601
609
  plan.mountStatements = (host) =>
602
610
  mountStatementEditor(
603
611
  host,
604
- fn.body as JxStatement[],
612
+ statements,
605
613
  (next) =>
606
614
  transactDoc(activeTab.value, (t) =>
607
615
  mutateUpdateProperty(t, selection, evKey, {
608
616
  ...fn,
609
- body: next as unknown as JsonValue,
617
+ body: next,
610
618
  }),
611
619
  ),
612
620
  {
@@ -619,7 +627,7 @@ function bindingView(
619
627
  second. */
620
628
  region: inspectorStatementsRegion(evKey),
621
629
  stateDefs: Object.keys(defs),
622
- stateEntries: defs as never,
630
+ stateEntries: defs,
623
631
  },
624
632
  );
625
633
  }
@@ -634,12 +642,16 @@ function bindingView(
634
642
  selection,
635
643
  () => renderOnly("rightPanel"),
636
644
  );
637
- const commitExpression = (newNode: unknown) =>
645
+ const commitExpression: Parameters<typeof mountExpressionEditor>[2] = (newNode) =>
638
646
  transactDoc(activeTab.value, (t) =>
647
+ // SAFETY: the expression editor reports the tree it edits, built of JSON operator/operand nodes.
639
648
  mutateUpdateProperty(t, selection, evKey, { $expression: newNode as JsonValue }),
640
649
  );
641
- const insertDef = (defName: string, def: unknown) =>
650
+ const insertDef = (defName: string, def: JxStateDefinition) =>
642
651
  transactDoc(activeTab.value, (t) =>
652
+ /* SAFETY: the only def the expression editor inserts is a packaged formula's vendored entry
653
+ (formula-catalog.ts `ensure`): `$description`, `$expression` and `parameters`, all JSON
654
+ from @jxsuite/formulas. */
643
655
  mutateAddDef(t, defName, def as Record<string, JsonValue>),
644
656
  );
645
657
  plan.paint = (host) =>
@@ -648,7 +660,7 @@ function bindingView(
648
660
  onInsertDef: insertDef,
649
661
  preview,
650
662
  stateDefs: Object.keys(defs),
651
- stateEntries: defs as never,
663
+ stateEntries: defs,
652
664
  });
653
665
  }
654
666
  bindings.set(evKey, plan);
@@ -658,7 +670,7 @@ function bindingView(
658
670
  clearTitle: mixed
659
671
  ? `${targets.length} selected elements bind ${evKey} differently — clearing removes it from all of them`
660
672
  : `Clear ${evKey}`,
661
- code: fn && !structured && typeof fn.body === "string" ? fn.body : "",
673
+ code: fn && !structured && isString(fn.body) ? fn.body : "",
662
674
  codeChecked: body === "code" ? "true" : "false",
663
675
  dotState: mixed ? "mixed" : "set",
664
676
  key: evKey,
@@ -689,14 +701,14 @@ const expressionHosts = new Map<string, HTMLElement>();
689
701
  const statementHosts = new Map<string, HTMLElement>();
690
702
 
691
703
  /** The section ids the document names, and the keys `inspectorSections` stores them under. */
692
- const SECTION_KEYS: Record<string, string> = {
693
- condition: "__condition",
694
- cssparts: "__cssparts",
695
- cssprops: "__cssprops",
696
- events: "__events",
697
- observed: "__observed",
698
- repeater: "__repeater",
699
- };
704
+ const SECTION_KEYS = new Map([
705
+ ["condition", "__condition"],
706
+ ["cssparts", "__cssparts"],
707
+ ["cssprops", "__cssprops"],
708
+ ["events", "__events"],
709
+ ["observed", "__observed"],
710
+ ["repeater", "__repeater"],
711
+ ]);
700
712
 
701
713
  /**
702
714
  * Mount the Logic tab into the container the Inspector owns, and subscribe to what it draws.
@@ -784,7 +796,7 @@ export function bindLogicPanelHost(el: HTMLElement | null): void {
784
796
  mutateUpdateProperty(t, selection, key, {
785
797
  $prototype: "Function",
786
798
  body: value,
787
- parameters: (plan.fn?.parameters as JsonValue) || [],
799
+ parameters: plan.fn?.parameters || [],
788
800
  }),
789
801
  );
790
802
  }
@@ -795,7 +807,7 @@ export function bindLogicPanelHost(el: HTMLElement | null): void {
795
807
  return;
796
808
  }
797
809
  if (plan.mode === "ref") {
798
- plan.onChange(value ? ({ $ref: value } as JsonValue) : undefined);
810
+ plan.onChange(value ? { $ref: value } : undefined);
799
811
  return;
800
812
  }
801
813
  plan.onChange(value);
@@ -810,7 +822,7 @@ export function bindLogicPanelHost(el: HTMLElement | null): void {
810
822
  );
811
823
  },
812
824
  setSection: (id, open) => {
813
- const stored = SECTION_KEYS[id];
825
+ const stored = SECTION_KEYS.get(id);
814
826
  if (stored) {
815
827
  setInspectorSection(stored, open);
816
828
  }
@@ -929,7 +941,7 @@ function openSourceMenu(key: string, anchor: HTMLElement): void {
929
941
  opener: anchor,
930
942
  region: "value-source",
931
943
  rows: plan.offered.map((rung) => ({
932
- checked: (rung === plan.mode ? "true" : "false") as "true" | "false",
944
+ checked: rung === plan.mode ? "true" : "false",
933
945
  destructive: false,
934
946
  disabled: false,
935
947
  dividerAbove: false,
@@ -937,8 +949,9 @@ function openSourceMenu(key: string, anchor: HTMLElement): void {
937
949
  title: VALUE_SOURCE_LABELS[rung],
938
950
  })),
939
951
  run: (id) => {
940
- const next = id as SlotMode;
941
- if (next === plan.mode) {
952
+ // The rows are `plan.offered`, so the id names one of its rungs.
953
+ const next = plan.offered.find((rung) => rung === id);
954
+ if (next === undefined || next === plan.mode) {
942
955
  return;
943
956
  }
944
957
  /* Leaving From data… seeds an empty Fixed value stash with the signal's declared default, so
@@ -955,6 +968,8 @@ function openSourceMenu(key: string, anchor: HTMLElement): void {
955
968
  key,
956
969
  plan.mode,
957
970
  next,
971
+ /* SAFETY: `plan.value` is a property read straight off the selected node, and a document is
972
+ JSON however the editor's node type spells its open keys. */
958
973
  cloneValue(plan.value as JsonValue | undefined),
959
974
  slotModeSeed(next, {
960
975
  extraSignals: plan.extraSignals,
@@ -978,7 +993,7 @@ function openHandlerMenu(key: string, anchor: HTMLElement): void {
978
993
  opener: anchor,
979
994
  region: "value-source",
980
995
  rows: HANDLER_MODES.map((rung) => ({
981
- checked: (rung === plan.mode ? "true" : "false") as "true" | "false",
996
+ checked: rung === plan.mode ? "true" : "false",
982
997
  destructive: false,
983
998
  disabled: false,
984
999
  dividerAbove: false,
@@ -986,8 +1001,9 @@ function openHandlerMenu(key: string, anchor: HTMLElement): void {
986
1001
  title: VALUE_SOURCE_LABELS[rung],
987
1002
  })),
988
1003
  run: (id) => {
989
- const next = id as SlotMode;
990
- if (next === plan.mode) {
1004
+ // The rows are HANDLER_MODES, so the id names one of its rungs.
1005
+ const next = HANDLER_MODES.find((rung) => rung === id);
1006
+ if (next === undefined || next === plan.mode) {
991
1007
  return;
992
1008
  }
993
1009
  const seed = seedForHandlerMode(next, plans.functionDefs);
@@ -998,6 +1014,7 @@ function openHandlerMenu(key: string, anchor: HTMLElement): void {
998
1014
  `event|${plans.selection?.join("/") ?? ""}|${key}`,
999
1015
  plan.mode,
1000
1016
  next,
1017
+ // SAFETY: an event binding (a `$ref`, function def or expression def) is a JSON object.
1001
1018
  plan.value as JsonValue,
1002
1019
  seed,
1003
1020
  ) ?? seed,
@@ -1020,8 +1037,8 @@ function openEventNameMenu(key: string, anchor: HTMLElement): void {
1020
1037
  opener: anchor,
1021
1038
  region: "event-name",
1022
1039
  rows: [
1023
- ...suggestions.map((name) => ({
1024
- checked: (name === key ? "true" : "false") as "true" | "false",
1040
+ ...suggestions.map((name): MenuRowProjection => ({
1041
+ checked: name === key ? "true" : "false",
1025
1042
  destructive: false,
1026
1043
  disabled: false,
1027
1044
  dividerAbove: false,
@@ -1062,15 +1079,13 @@ function renameEvent(evKey: string, newKey: string): void {
1062
1079
  }
1063
1080
  transactDoc(activeTab.value, (t) => {
1064
1081
  for (const target of plans.targets) {
1065
- const existing = getEventBinding(
1066
- getNodeAtPath(t.doc.document, target) as JxMutableNode,
1067
- evKey,
1068
- );
1082
+ const node = getNodeAtPath(t.doc.document, target);
1083
+ const existing = node ? getEventBinding(node, evKey) : undefined;
1069
1084
  if (existing === undefined) {
1070
1085
  continue;
1071
1086
  }
1072
1087
  mutateUpdateProperty(t, target, evKey);
1073
- mutateUpdateProperty(t, target, newKey, existing as JsonValue);
1088
+ mutateUpdateProperty(t, target, newKey, existing);
1074
1089
  }
1075
1090
  });
1076
1091
  }
@@ -1095,7 +1110,7 @@ function setHandlerBodyMode(key: string, mode: string): void {
1095
1110
  transactDoc(activeTab.value, (t) =>
1096
1111
  mutateUpdateProperty(t, selection, key, {
1097
1112
  ...fn,
1098
- body: (mode === "statements" ? [] : "") as JsonValue,
1113
+ body: mode === "statements" ? [] : "",
1099
1114
  }),
1100
1115
  );
1101
1116
  }
@@ -1107,7 +1122,7 @@ function addEventBinding(): void {
1107
1122
  if (!selection || !tab) {
1108
1123
  return;
1109
1124
  }
1110
- const node = getNodeAtPath(tab.doc.document, selection) as JxMutableNode | undefined;
1125
+ const node = getNodeAtPath(tab.doc.document, selection);
1111
1126
  let evName = "onclick";
1112
1127
  for (const name of EVENT_NAMES) {
1113
1128
  if (!node?.[name]) {