@jxsuite/studio 6.1.1 → 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 (637) hide show
  1. package/dist/chunks/{2020-va2wwra4.js → 2020-f2gkpy8d.js} +3 -3
  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-2veqmnhr.js → index-zpjmzqfk.js} +3 -3
  32. package/dist/chunks/{javascript-8nbvs12s.js → javascript-m54mnwp6.js} +3 -3
  33. package/dist/chunks/{jsonMode-s8kt9dsj.js → jsonMode-w15cmrcm.js} +8 -8
  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-1q1sh2ax.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-h46vtzk8.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-rv11kfwa.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-8grwxtqk.js → studio-90pq9km1.js} +4 -4
  77. package/dist/chunks/studio-924p1tm1.js +6 -0
  78. package/dist/chunks/{studio-pre0skq6.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-vrmcjf9g.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-wszjyh0j.js → studio-tq0rtfwj.js} +4 -4
  111. package/dist/chunks/{studio-kggey1jt.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-zey7zsdw.js → studio-y64hrt8p.js} +7 -7
  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-2frah6h1.js → tsMode-sf49ee9x.js} +7 -7
  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 +97 -97
  140. package/package.json +6 -6
  141. package/src/about/about-modal.ts +4 -3
  142. package/src/account/action-flow.ts +45 -38
  143. package/src/account-status.ts +7 -2
  144. package/src/browse/library-layouts.ts +8 -5
  145. package/src/browse/library-model.ts +18 -6
  146. package/src/browse/library-pane.ts +37 -21
  147. package/src/browse/library-preview.ts +14 -9
  148. package/src/browse/library-source.ts +1 -1
  149. package/src/canvas/asset-refs.ts +24 -9
  150. package/src/canvas/asset-resolve.ts +19 -23
  151. package/src/canvas/canvas-helpers.ts +7 -6
  152. package/src/canvas/canvas-live-render.ts +44 -53
  153. package/src/canvas/canvas-patcher.ts +30 -30
  154. package/src/canvas/canvas-perf.ts +11 -5
  155. package/src/canvas/canvas-render.ts +62 -41
  156. package/src/canvas/canvas-surface.ts +5 -3
  157. package/src/canvas/canvas-utils.ts +90 -49
  158. package/src/canvas/dialog-path.ts +9 -4
  159. package/src/canvas/dialog-state.ts +1 -2
  160. package/src/canvas/diff-marks.ts +9 -16
  161. package/src/canvas/diff-toolbar.ts +8 -7
  162. package/src/canvas/edit-width-drag.ts +4 -1
  163. package/src/canvas/edit-width.ts +1 -3
  164. package/src/canvas/iframe-channel.ts +27 -13
  165. package/src/canvas/iframe-drop.ts +13 -12
  166. package/src/canvas/iframe-editable-root.ts +29 -16
  167. package/src/canvas/iframe-entry.ts +80 -63
  168. package/src/canvas/iframe-eval.ts +73 -49
  169. package/src/canvas/iframe-host.ts +135 -96
  170. package/src/canvas/iframe-inline-edit.ts +49 -30
  171. package/src/canvas/iframe-insert.ts +5 -4
  172. package/src/canvas/iframe-interaction.ts +30 -25
  173. package/src/canvas/iframe-overlay.ts +1 -1
  174. package/src/canvas/iframe-patch.ts +18 -15
  175. package/src/canvas/iframe-position.ts +12 -6
  176. package/src/canvas/iframe-protocol.ts +12 -16
  177. package/src/canvas/iframe-render.ts +36 -34
  178. package/src/canvas/iframe-slash.ts +24 -11
  179. package/src/canvas/iframe-subtree.ts +6 -2
  180. package/src/canvas/path-mapping.ts +19 -12
  181. package/src/canvas/popover-path.ts +7 -3
  182. package/src/canvas/popover-state.ts +1 -2
  183. package/src/canvas/serialize-scope.ts +13 -5
  184. package/src/canvas/stage-scrollbar.ts +2 -1
  185. package/src/canvas/surface-registry.ts +21 -3
  186. package/src/collab/collab-commands.ts +7 -2
  187. package/src/collab/collab-session.ts +84 -45
  188. package/src/collab/collab-state.ts +4 -3
  189. package/src/collab/monaco-binding.ts +16 -13
  190. package/src/collab/monaco-cursors.ts +5 -2
  191. package/src/commands/budget.ts +3 -3
  192. package/src/commands/command-args.ts +103 -71
  193. package/src/commands/context.ts +22 -20
  194. package/src/commands/keymap.ts +47 -43
  195. package/src/commands/levels.ts +3 -3
  196. package/src/commands/live-context.ts +7 -7
  197. package/src/commands/reference.ts +2 -1
  198. package/src/commands/registry.ts +12 -10
  199. package/src/commands/run-reported.ts +15 -10
  200. package/src/component-props.ts +46 -30
  201. package/src/content/collection-match.ts +5 -4
  202. package/src/content/draft-state.ts +4 -3
  203. package/src/content/entry-commands.ts +3 -2
  204. package/src/content/entry-editor.ts +29 -17
  205. package/src/content/entry-fields.ts +12 -7
  206. package/src/content/entry-model.ts +21 -12
  207. package/src/editor/canvas-context-menu.ts +1 -2
  208. package/src/editor/canvas-slash-bridge.ts +3 -6
  209. package/src/editor/content-slice.ts +16 -14
  210. package/src/editor/context-menu.ts +35 -22
  211. package/src/editor/convert-targets.ts +30 -35
  212. package/src/editor/convert-to-component.ts +11 -5
  213. package/src/editor/convert-to-repeater.ts +34 -22
  214. package/src/editor/editable-tags.ts +17 -2
  215. package/src/editor/file-drop-action.ts +21 -22
  216. package/src/editor/inline-edit-apply.ts +35 -17
  217. package/src/editor/inline-edit.ts +66 -50
  218. package/src/editor/inline-format.ts +59 -56
  219. package/src/editor/inline-link.ts +40 -15
  220. package/src/editor/insert-zone-action.ts +1 -1
  221. package/src/editor/merge-tags.ts +58 -19
  222. package/src/editor/repeater-scope.ts +39 -28
  223. package/src/editor/shortcuts.ts +32 -20
  224. package/src/editor/slash-menu.ts +1 -6
  225. package/src/files/asset-versions.ts +4 -4
  226. package/src/files/components.ts +15 -10
  227. package/src/files/elements.ts +5 -6
  228. package/src/files/file-ops.ts +77 -36
  229. package/src/files/files.ts +90 -95
  230. package/src/files/media-meta.ts +2 -1
  231. package/src/files/media-paths.ts +3 -0
  232. package/src/files/serialize-document.ts +2 -2
  233. package/src/format/constraints.ts +1 -1
  234. package/src/format/convert-file.ts +27 -13
  235. package/src/format/format-choices.ts +2 -1
  236. package/src/format/format-host.ts +76 -50
  237. package/src/github/github-auth-status.ts +27 -3
  238. package/src/github/github-auth.ts +19 -9
  239. package/src/github/github-publish.ts +24 -20
  240. package/src/grid/cell-editors.ts +46 -31
  241. package/src/grid/cell-popovers.ts +5 -3
  242. package/src/grid/edit-buffer.ts +10 -9
  243. package/src/grid/grid-controller.ts +20 -22
  244. package/src/grid/grid-layout.ts +21 -5
  245. package/src/grid/grid-open.ts +3 -6
  246. package/src/grid/grid-panel.ts +11 -4
  247. package/src/grid/grid-source.ts +8 -8
  248. package/src/grid/grid-view.ts +14 -17
  249. package/src/grid/redirects-grid.ts +14 -5
  250. package/src/grid/redirects.ts +16 -14
  251. package/src/grid/schema-columns.ts +25 -19
  252. package/src/grid/sources/connector-source.ts +47 -20
  253. package/src/grid/sources/content-source.ts +25 -24
  254. package/src/grid/sources/csv-file-source.ts +2 -2
  255. package/src/grid/tabulator-tables.d.ts +55 -34
  256. package/src/hosting/stage.ts +7 -7
  257. package/src/i18n/i18n-commands.ts +1 -2
  258. package/src/media/media-pane.ts +4 -1
  259. package/src/new-project/add-repo-modal.ts +20 -19
  260. package/src/new-project/import-tab.ts +10 -14
  261. package/src/new-project/location-fields.ts +2 -1
  262. package/src/new-project/new-project-modal.ts +12 -9
  263. package/src/packages/jxsuite-update.ts +4 -3
  264. package/src/packages/pull-package-sync.ts +26 -25
  265. package/src/page-params.ts +97 -68
  266. package/src/panels/activity-panel.ts +17 -9
  267. package/src/panels/ai-chat/attached-context.ts +13 -7
  268. package/src/panels/ai-chat/chat-view.ts +80 -73
  269. package/src/panels/ai-chat/composer.ts +30 -33
  270. package/src/panels/ai-chat/sessions-view.ts +1 -2
  271. package/src/panels/ai-panel.ts +23 -20
  272. package/src/panels/block-action-bar.ts +46 -35
  273. package/src/panels/bottom-dock.ts +5 -3
  274. package/src/panels/canvas-dnd-bridge.ts +31 -24
  275. package/src/panels/data-explorer.ts +62 -25
  276. package/src/panels/data-grid.ts +14 -11
  277. package/src/panels/dnd.ts +108 -118
  278. package/src/panels/editors.ts +52 -21
  279. package/src/panels/elements-panel.ts +10 -3
  280. package/src/panels/events-panel.ts +84 -69
  281. package/src/panels/formula-workspace.ts +76 -51
  282. package/src/panels/frontmatter-fields.ts +24 -19
  283. package/src/panels/frontmatter-panel.ts +44 -34
  284. package/src/panels/git-diff-open.ts +4 -4
  285. package/src/panels/git-panel.ts +49 -61
  286. package/src/panels/head-panel.ts +131 -111
  287. package/src/panels/i18n-panel.ts +10 -3
  288. package/src/panels/imports-panel.ts +23 -47
  289. package/src/panels/jump-bar.ts +48 -29
  290. package/src/panels/layers-panel.ts +97 -74
  291. package/src/panels/left-panel.ts +3 -3
  292. package/src/panels/pane-context.ts +31 -22
  293. package/src/panels/pane-grid.ts +49 -20
  294. package/src/panels/panel-registry.ts +22 -37
  295. package/src/panels/properties-panel.ts +175 -121
  296. package/src/panels/quick-search.ts +53 -31
  297. package/src/panels/right-panel.ts +3 -3
  298. package/src/panels/seo-modal.ts +13 -17
  299. package/src/panels/settings-menu.ts +15 -15
  300. package/src/panels/signals-panel.ts +153 -131
  301. package/src/panels/statement-editor.ts +230 -140
  302. package/src/panels/style-panel.ts +218 -205
  303. package/src/panels/style-utils.ts +114 -51
  304. package/src/panels/stylebook-doc.ts +57 -54
  305. package/src/panels/stylebook-layers-panel.ts +9 -9
  306. package/src/panels/stylebook-panel.ts +13 -17
  307. package/src/panels/tab-drop.ts +27 -11
  308. package/src/panels/tab-strip.ts +36 -26
  309. package/src/platform-errors.ts +57 -43
  310. package/src/platform.ts +58 -30
  311. package/src/platforms/cloud.ts +345 -175
  312. package/src/platforms/default-platform.ts +10 -4
  313. package/src/platforms/devserver.ts +129 -117
  314. package/src/platforms/read-batcher.ts +16 -8
  315. package/src/project-list.ts +2 -1
  316. package/src/publish/deploy-checklist.ts +8 -2
  317. package/src/publish/pages-service.ts +28 -13
  318. package/src/publish/publish-commands.ts +5 -4
  319. package/src/publish/publish-panel.ts +10 -6
  320. package/src/recent-projects.ts +15 -8
  321. package/src/resize-edges.ts +26 -36
  322. package/src/services/a11y-report.ts +26 -19
  323. package/src/services/agent-seed.ts +23 -11
  324. package/src/services/ai-ask.ts +9 -12
  325. package/src/services/ai-command-tools.ts +68 -62
  326. package/src/services/ai-import-tools.ts +80 -67
  327. package/src/services/ai-models.ts +17 -13
  328. package/src/services/ai-project-tools.ts +68 -32
  329. package/src/services/ai-session-store.ts +19 -10
  330. package/src/services/ai-system-prompt.ts +46 -20
  331. package/src/services/ai-tools.ts +71 -27
  332. package/src/services/ai-write-report.ts +20 -12
  333. package/src/services/ai-writes.ts +4 -4
  334. package/src/services/automation.ts +58 -31
  335. package/src/services/cem-export.ts +149 -58
  336. package/src/services/clock.ts +6 -1
  337. package/src/services/code-services.ts +37 -31
  338. package/src/services/context-manager.ts +14 -10
  339. package/src/services/context-resolver.ts +20 -8
  340. package/src/services/data-service.ts +19 -15
  341. package/src/services/directory-picker.ts +18 -12
  342. package/src/services/document-assistant.ts +39 -19
  343. package/src/services/gated-registry.ts +10 -6
  344. package/src/services/harness/chat-reducer.ts +23 -1
  345. package/src/services/import-client.ts +91 -38
  346. package/src/services/import-seed.ts +8 -2
  347. package/src/services/jx-validate.ts +28 -31
  348. package/src/services/live-preview.ts +0 -0
  349. package/src/services/live-surfaces.ts +6 -3
  350. package/src/services/model-uri.ts +10 -2
  351. package/src/services/module-preloads.ts +12 -8
  352. package/src/services/monaco-buffer.ts +43 -24
  353. package/src/services/monaco-lazy.ts +7 -8
  354. package/src/services/monaco-setup.ts +23 -16
  355. package/src/services/notify.ts +44 -17
  356. package/src/services/popover-report.ts +25 -10
  357. package/src/services/preview-eval.ts +20 -8
  358. package/src/services/profile.ts +13 -6
  359. package/src/services/project-path.ts +13 -10
  360. package/src/services/references.ts +0 -0
  361. package/src/services/render-critic.ts +8 -7
  362. package/src/services/settings/kernel.ts +13 -4
  363. package/src/services/settings/write-queue.ts +9 -9
  364. package/src/services/token-lint.ts +12 -10
  365. package/src/services/tool-executor.ts +17 -5
  366. package/src/services/tool-outcomes.ts +44 -24
  367. package/src/services/trusted-types.ts +24 -7
  368. package/src/settings/contexts-section.ts +11 -8
  369. package/src/settings/contributed-section.ts +79 -60
  370. package/src/settings/css-vars-editor.ts +37 -16
  371. package/src/settings/defs-editor.ts +38 -35
  372. package/src/settings/extension-rows.ts +16 -8
  373. package/src/settings/extension-sections.ts +23 -13
  374. package/src/settings/extensions-section.ts +4 -1
  375. package/src/settings/general-settings.ts +11 -8
  376. package/src/settings/locales-section.ts +20 -12
  377. package/src/settings/preferences-dialog.ts +9 -6
  378. package/src/settings/preferences-keymap.ts +7 -5
  379. package/src/settings/preferences-sections.ts +11 -5
  380. package/src/settings/project-sections.ts +1 -1
  381. package/src/settings/schema-field-ui.ts +9 -0
  382. package/src/settings/settings-document.ts +5 -5
  383. package/src/shell/tree.ts +6 -5
  384. package/src/shell.ts +104 -81
  385. package/src/site-context.ts +37 -22
  386. package/src/state.ts +41 -49
  387. package/src/store.ts +54 -34
  388. package/src/studio.ts +25 -75
  389. package/src/style/live-preview.ts +1 -1
  390. package/src/style/project-styles.ts +6 -7
  391. package/src/style/token-ref.ts +5 -4
  392. package/src/surfaces/about.ts +18 -19
  393. package/src/surfaces/add-repo.ts +17 -19
  394. package/src/surfaces/ai-chat.ts +31 -36
  395. package/src/surfaces/ai-credentials-form.ts +6 -16
  396. package/src/surfaces/ai-managed-connect.ts +3 -4
  397. package/src/surfaces/ai-model-picker.ts +3 -5
  398. package/src/surfaces/block-action-bar.ts +22 -11
  399. package/src/surfaces/boot-failure.ts +4 -5
  400. package/src/surfaces/bottom-dock.ts +9 -18
  401. package/src/surfaces/canvas-stage.ts +12 -11
  402. package/src/surfaces/cf-account-picker.ts +17 -18
  403. package/src/surfaces/commandbar.ts +14 -9
  404. package/src/surfaces/convert-repeater.ts +17 -19
  405. package/src/surfaces/data-actions.ts +9 -7
  406. package/src/surfaces/dialog.ts +26 -28
  407. package/src/surfaces/diff-toolbar.ts +9 -7
  408. package/src/surfaces/doc-header.ts +10 -19
  409. package/src/surfaces/empty-state.ts +7 -10
  410. package/src/surfaces/entry-editor.ts +14 -11
  411. package/src/surfaces/expression-editor.ts +11 -25
  412. package/src/surfaces/files-panel.ts +27 -14
  413. package/src/surfaces/formula-palette.ts +4 -5
  414. package/src/surfaces/git-panel.ts +7 -15
  415. package/src/surfaces/github-auth.ts +16 -20
  416. package/src/surfaces/github-publish.ts +17 -22
  417. package/src/surfaces/grid-cell.ts +30 -31
  418. package/src/surfaces/grid-open.ts +10 -14
  419. package/src/surfaces/grid-panel.ts +13 -9
  420. package/src/surfaces/grid-replace.ts +13 -13
  421. package/src/surfaces/grid-views.ts +15 -18
  422. package/src/surfaces/inspector-dock.ts +13 -12
  423. package/src/surfaces/jump-bar.ts +5 -6
  424. package/src/surfaces/jxsuite-update.ts +16 -22
  425. package/src/surfaces/library-pane.ts +19 -20
  426. package/src/surfaces/logic-panel.ts +17 -30
  427. package/src/surfaces/logic-workspace.ts +13 -15
  428. package/src/surfaces/media-browser.ts +11 -10
  429. package/src/surfaces/media-field.ts +4 -5
  430. package/src/surfaces/media-pane.ts +8 -7
  431. package/src/surfaces/menu.ts +29 -23
  432. package/src/surfaces/navigator-dock.ts +11 -12
  433. package/src/surfaces/new-project.ts +27 -26
  434. package/src/surfaces/pane-context.ts +20 -25
  435. package/src/surfaces/pane-grid.ts +15 -10
  436. package/src/surfaces/panel-activity.ts +5 -6
  437. package/src/surfaces/panel-data.ts +3 -4
  438. package/src/surfaces/panel-deploy-checklist.ts +5 -6
  439. package/src/surfaces/panel-elements.ts +5 -7
  440. package/src/surfaces/panel-i18n.ts +5 -7
  441. package/src/surfaces/panel-imports.ts +6 -13
  442. package/src/surfaces/panel-outline.ts +25 -19
  443. package/src/surfaces/panel-page.ts +11 -18
  444. package/src/surfaces/panel-problems.ts +5 -7
  445. package/src/surfaces/panel-signals.ts +20 -34
  446. package/src/surfaces/panel-stylebook-layers.ts +5 -8
  447. package/src/surfaces/preferences.ts +21 -11
  448. package/src/surfaces/progress-modal.ts +15 -9
  449. package/src/surfaces/properties-panel.json +1 -1
  450. package/src/surfaces/properties-panel.ts +20 -42
  451. package/src/surfaces/publish.ts +18 -18
  452. package/src/surfaces/push-plan.ts +7 -8
  453. package/src/surfaces/rail.ts +13 -13
  454. package/src/surfaces/reference-field.ts +11 -15
  455. package/src/surfaces/schema-builder.ts +16 -22
  456. package/src/surfaces/schema-form.ts +15 -25
  457. package/src/surfaces/secret-field.ts +9 -6
  458. package/src/surfaces/seo.ts +21 -15
  459. package/src/surfaces/settings-contexts.ts +9 -7
  460. package/src/surfaces/settings-contributed.ts +14 -10
  461. package/src/surfaces/settings-css-vars.ts +5 -12
  462. package/src/surfaces/settings-defs.json +2 -2
  463. package/src/surfaces/settings-defs.ts +17 -21
  464. package/src/surfaces/settings-deploy.ts +8 -15
  465. package/src/surfaces/settings-extensions.ts +5 -6
  466. package/src/surfaces/settings-head.ts +33 -39
  467. package/src/surfaces/settings-locales.ts +8 -20
  468. package/src/surfaces/settings-overview.ts +5 -6
  469. package/src/surfaces/settings-packages.ts +8 -7
  470. package/src/surfaces/settings-pane.ts +9 -18
  471. package/src/surfaces/settings-rawjson.ts +5 -6
  472. package/src/surfaces/shell.ts +1 -2
  473. package/src/surfaces/slash-menu.ts +19 -9
  474. package/src/surfaces/statements.ts +13 -18
  475. package/src/surfaces/statusbar.ts +17 -14
  476. package/src/surfaces/style-panel.ts +18 -31
  477. package/src/surfaces/stylebook-chrome.ts +3 -5
  478. package/src/surfaces/tab-strip.ts +14 -13
  479. package/src/surfaces/target-line.ts +6 -7
  480. package/src/surfaces/welcome.ts +5 -7
  481. package/src/tabs/patch-ops.ts +4 -3
  482. package/src/tabs/project-config.ts +32 -21
  483. package/src/tabs/selection.ts +36 -8
  484. package/src/tabs/tab.ts +52 -41
  485. package/src/tabs/transact.ts +98 -53
  486. package/src/types.ts +32 -17
  487. package/src/ui/ai-credentials-form.ts +10 -13
  488. package/src/ui/ai-model-picker.ts +3 -3
  489. package/src/ui/cf-account-picker.ts +7 -9
  490. package/src/ui/color-selector.ts +9 -5
  491. package/src/ui/dynamic-slot.ts +7 -8
  492. package/src/ui/expression-editor.ts +112 -105
  493. package/src/ui/form-controls.ts +57 -48
  494. package/src/ui/formula-catalog.ts +239 -230
  495. package/src/ui/formula-chips.ts +33 -18
  496. package/src/ui/layers.ts +44 -31
  497. package/src/ui/media-picker.ts +18 -9
  498. package/src/ui/popover-surface.ts +20 -12
  499. package/src/ui/progress-modal.ts +13 -8
  500. package/src/ui/regions.ts +7 -6
  501. package/src/ui/schema-form.ts +113 -70
  502. package/src/ui/surface.ts +71 -8
  503. package/src/ui/timing.ts +9 -0
  504. package/src/ui/value-source.ts +44 -31
  505. package/src/ui/virtual-window.ts +3 -2
  506. package/src/utils/base64.ts +3 -1
  507. package/src/utils/edit-display.ts +73 -73
  508. package/src/utils/element-selectors.ts +3 -2
  509. package/src/utils/google-fonts.ts +15 -14
  510. package/src/utils/inherited-style.ts +18 -20
  511. package/src/utils/link-target.ts +1 -1
  512. package/src/utils/preview-format.ts +25 -3
  513. package/src/utils/strip-events.ts +49 -22
  514. package/src/utils/studio-utils.ts +29 -14
  515. package/src/view.ts +2 -3
  516. package/src/workspace/pane-derive.ts +10 -12
  517. package/src/workspace/session.ts +53 -43
  518. package/src/workspace/workspace.ts +40 -36
  519. package/dist/chunks/adapter-f93pafd7.js +0 -4
  520. package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
  521. package/dist/chunks/cf-settings-125tdm0w.js +0 -4
  522. package/dist/chunks/color-area-jqhna8zy.js +0 -4
  523. package/dist/chunks/color-field-embq5ctg.js +0 -4
  524. package/dist/chunks/color-fpezvnkt.js +0 -4
  525. package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
  526. package/dist/chunks/combobox-773hdzyj.js +0 -4
  527. package/dist/chunks/components-ax2f1fnn.js +0 -4
  528. package/dist/chunks/content-source-108aqtk1.js +0 -4
  529. package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
  530. package/dist/chunks/dialog-mtm9fq5t.js +0 -4
  531. package/dist/chunks/editor-pfgdmkb0.js +0 -4
  532. package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
  533. package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
  534. package/dist/chunks/file-ops-meej5mqf.js +0 -4
  535. package/dist/chunks/files-44vp8a2s.js +0 -4
  536. package/dist/chunks/format-host-7q1petb9.js +0 -4
  537. package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
  538. package/dist/chunks/git-panel-zngbymvd.js +0 -4
  539. package/dist/chunks/grid-view-sx9vynsp.js +0 -51
  540. package/dist/chunks/icons-p44xhjf0.js +0 -4
  541. package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
  542. package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
  543. package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
  544. package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
  545. package/dist/chunks/index-wkyfjeqz.js +0 -4
  546. package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
  547. package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
  548. package/dist/chunks/layers-xd92fg8d.js +0 -4
  549. package/dist/chunks/listbox-s8fkmnq8.js +0 -4
  550. package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
  551. package/dist/chunks/media-picker-0svzkdyb.js +0 -4
  552. package/dist/chunks/menu-37d07z9m.js +0 -4
  553. package/dist/chunks/menu-5c55ea3d.js +0 -4
  554. package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
  555. package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
  556. package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
  557. package/dist/chunks/notify-0xgtn8q1.js +0 -4
  558. package/dist/chunks/number-field-gw7sq8rn.js +0 -4
  559. package/dist/chunks/parse-897fvqah.js +0 -4
  560. package/dist/chunks/platform-v1qctbe6.js +0 -4
  561. package/dist/chunks/popover-8htra4er.js +0 -4
  562. package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
  563. package/dist/chunks/quick-search-a54e6t5n.js +0 -4
  564. package/dist/chunks/references-gmqp82fs.js +0 -4
  565. package/dist/chunks/right-panel-v7t9awbk.js +0 -4
  566. package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
  567. package/dist/chunks/select-n3v7gwas.js +0 -4
  568. package/dist/chunks/split-pff8f3ze.js +0 -4
  569. package/dist/chunks/studio-0bhx5hz6.js +0 -5
  570. package/dist/chunks/studio-0k1ddnyy.js +0 -6
  571. package/dist/chunks/studio-1b04pd0j.js +0 -64
  572. package/dist/chunks/studio-4dwbj6gb.js +0 -5
  573. package/dist/chunks/studio-4tanh828.js +0 -5
  574. package/dist/chunks/studio-55h4mstj.js +0 -4
  575. package/dist/chunks/studio-5tnvjkz4.js +0 -5
  576. package/dist/chunks/studio-60dqgb0c.js +0 -5
  577. package/dist/chunks/studio-61dp09qg.js +0 -9
  578. package/dist/chunks/studio-63epcrj2.js +0 -5
  579. package/dist/chunks/studio-74k29dy9.js +0 -5
  580. package/dist/chunks/studio-7vg6jcd3.js +0 -5
  581. package/dist/chunks/studio-7zx31knw.js +0 -9
  582. package/dist/chunks/studio-8bxk97km.js +0 -5
  583. package/dist/chunks/studio-933e30n4.js +0 -5
  584. package/dist/chunks/studio-98wnwhbg.js +0 -5
  585. package/dist/chunks/studio-9mccjwjh.js +0 -14
  586. package/dist/chunks/studio-a2ke1e4t.js +0 -5
  587. package/dist/chunks/studio-e3a2a6v3.js +0 -4
  588. package/dist/chunks/studio-e81q1vb9.js +0 -5
  589. package/dist/chunks/studio-epgrmqqm.js +0 -5
  590. package/dist/chunks/studio-ery42sqr.js +0 -4
  591. package/dist/chunks/studio-g1shz58g.js +0 -5
  592. package/dist/chunks/studio-gf0fz03c.js +0 -5
  593. package/dist/chunks/studio-gjtpe62q.js +0 -6
  594. package/dist/chunks/studio-gkskhg7m.js +0 -5
  595. package/dist/chunks/studio-gx4dnjzd.js +0 -5
  596. package/dist/chunks/studio-j03zga3y.js +0 -9
  597. package/dist/chunks/studio-jhpxeckz.js +0 -5
  598. package/dist/chunks/studio-k01r7ykp.js +0 -5
  599. package/dist/chunks/studio-kk7h30ne.js +0 -7
  600. package/dist/chunks/studio-kt1zqney.js +0 -5
  601. package/dist/chunks/studio-m3cwhvye.js +0 -5
  602. package/dist/chunks/studio-mcayt6hz.js +0 -5
  603. package/dist/chunks/studio-myjcghv3.js +0 -5
  604. package/dist/chunks/studio-n8bxwc3y.js +0 -4
  605. package/dist/chunks/studio-ngm8gvpb.js +0 -5
  606. package/dist/chunks/studio-nj5a01jy.js +0 -928
  607. package/dist/chunks/studio-pcgz8heb.js +0 -5
  608. package/dist/chunks/studio-qcsq0t15.js +0 -5
  609. package/dist/chunks/studio-qkstvve9.js +0 -5
  610. package/dist/chunks/studio-qv1pwd3c.js +0 -5
  611. package/dist/chunks/studio-rc6dvxjb.js +0 -7
  612. package/dist/chunks/studio-s8dmmz66.js +0 -5
  613. package/dist/chunks/studio-sp5xzbj4.js +0 -6
  614. package/dist/chunks/studio-szsjbj0g.js +0 -5
  615. package/dist/chunks/studio-t1xzawhr.js +0 -16
  616. package/dist/chunks/studio-t6b6qe31.js +0 -5
  617. package/dist/chunks/studio-tdcprbqb.js +0 -5
  618. package/dist/chunks/studio-vyc0b4he.js +0 -10
  619. package/dist/chunks/studio-w0cgf6jg.js +0 -5
  620. package/dist/chunks/studio-w3hskzqk.js +0 -5
  621. package/dist/chunks/studio-xgrgcdyh.js +0 -9
  622. package/dist/chunks/studio-xz2yxfcb.js +0 -5
  623. package/dist/chunks/studio-y6n42tgs.js +0 -5
  624. package/dist/chunks/studio-yb560vxr.js +0 -5
  625. package/dist/chunks/studio-yn9f8vtx.js +0 -5
  626. package/dist/chunks/studio-yw05w8f0.js +0 -7
  627. package/dist/chunks/studio-z16sgavc.js +0 -5
  628. package/dist/chunks/studio-zyqn40w4.js +0 -5
  629. package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
  630. package/dist/chunks/tabs-jwthg40w.js +0 -4
  631. package/dist/chunks/textfield-spy3hc77.js +0 -4
  632. package/dist/chunks/toast-4d35zd64.js +0 -4
  633. package/dist/chunks/toast-host-8sjmfed3.js +0 -4
  634. package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
  635. package/dist/chunks/tree-h19v1jfz.js +0 -4
  636. package/dist/chunks/workspace-zt81g1ms.js +0 -4
  637. package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
@@ -63,7 +63,7 @@ import { errorMessage } from "@jxsuite/schema/parse";
63
63
  import { effect, toRaw } from "../reactivity";
64
64
  import { getPlatform } from "../platform";
65
65
  import { notify } from "../services/notify";
66
- import { requireProjectState, setProjectState } from "../state";
66
+ import { projectState, requireProjectState, setProjectState } from "../state";
67
67
  import { setWorkspaceProject, workspace } from "../workspace/workspace";
68
68
  import { PROJECT_CONFIG_PATH, createTab, disposeTab } from "./tab";
69
69
  import { transactDoc } from "./transact";
@@ -71,7 +71,7 @@ import { deriveJsonLayout, parseJsonDocument, serializeJson } from "@jxsuite/sch
71
71
  import type { JsonLayout } from "@jxsuite/schema/json-layout";
72
72
 
73
73
  import type { Tab } from "./tab";
74
- import type { ProjectConfig } from "@jxsuite/schema/types";
74
+ import type { JxMutableNode, ProjectConfig } from "@jxsuite/schema/types";
75
75
 
76
76
  export { PROJECT_CONFIG_PATH } from "./tab";
77
77
 
@@ -147,7 +147,7 @@ let _seeding: Promise<void> | null = null;
147
147
  */
148
148
  function openConfigTab(): Tab | null {
149
149
  const tab = workspace.tabs.get(PROJECT_CONFIG_PATH);
150
- return tab ? (toRaw(tab as unknown as object) as Tab) : null;
150
+ return tab ? toRaw(tab) : null;
151
151
  }
152
152
 
153
153
  /** Drop the current binding, disposing the detached document if that is what it was. */
@@ -169,7 +169,8 @@ function seedCommitted(): Promise<void> {
169
169
  const text = await getPlatform().readFile(PROJECT_CONFIG_PATH);
170
170
  const { document, layout } = parseJsonDocument(text);
171
171
  _layout = layout;
172
- _committed = serializeProjectConfig(document as unknown as ProjectConfig);
172
+ // {@link serializeProjectConfig}'s serialisation, over the file's parse rather than a config.
173
+ _committed = serializeJson(document, configLayout());
173
174
  } catch {
174
175
  // No file, an unreadable one, or one that does not parse. "Unknown" is the honest answer,
175
176
  // And an unknown file is one every commit must write.
@@ -240,8 +241,22 @@ function syncProjectState(config: ProjectConfig): void {
240
241
  * @returns {ProjectConfig | null}
241
242
  */
242
243
  function liveConfig(): ProjectConfig | null {
243
- const config = requireProjectState()?.projectConfig;
244
- return config ? (toRaw(config as unknown as object) as ProjectConfig) : null;
244
+ const config = projectState?.projectConfig;
245
+ return config ? toRaw(config) : null;
246
+ }
247
+
248
+ /**
249
+ * The configuration a configuration document holds, unwrapped.
250
+ *
251
+ * @param {JxMutableNode} document The bound tab's `doc.document`.
252
+ * @returns {ProjectConfig}
253
+ */
254
+ function configOf(document: JxMutableNode): ProjectConfig {
255
+ /* SAFETY: every document this module reads is the `project.json` tab's root, and that root is
256
+ only ever installed as a ProjectConfig: `createTab` below seeds it from `projectConfig`, an open
257
+ tab parsed the file the schema gate wrote, and every transaction here assigns configuration
258
+ keys. The Tab type calls every root a JxMutableNode; this is the one place that says which. */
259
+ return toRaw(document) as ProjectConfig;
245
260
  }
246
261
 
247
262
  /**
@@ -261,10 +276,10 @@ function liveConfig(): ProjectConfig | null {
261
276
  * settings surfaces render from `projectState` and mutate it in place, and every reader of the
262
277
  * document follows the root reference {@link transactDoc} replaces when the transaction ends.
263
278
  *
264
- * @param {Record<string, unknown>} target
279
+ * @param {JxMutableNode} target
265
280
  * @param {ProjectConfig} source
266
281
  */
267
- function replaceContents(target: Record<string, unknown>, source: ProjectConfig): void {
282
+ function replaceContents(target: JxMutableNode, source: ProjectConfig): void {
268
283
  for (const key of Object.keys(target)) {
269
284
  delete target[key];
270
285
  }
@@ -282,10 +297,10 @@ function bind(tab: Tab): Tab {
282
297
  tab.scope.run(() => {
283
298
  effect(() => {
284
299
  const doc = tab.doc.document;
285
- if (_bound !== tab || !requireProjectState()) {
300
+ if (_bound !== tab || !projectState) {
286
301
  return;
287
302
  }
288
- syncProjectState(toRaw(doc) as unknown as ProjectConfig);
303
+ syncProjectState(configOf(doc));
289
304
  });
290
305
  });
291
306
  return tab;
@@ -316,7 +331,7 @@ export function projectConfigDocument(): Tab {
316
331
  return bind(open);
317
332
  }
318
333
  _detached = createTab({
319
- document: (state.projectConfig ?? {}) as unknown as Record<string, unknown>,
334
+ document: state.projectConfig ?? {},
320
335
  documentPath: PROJECT_CONFIG_PATH,
321
336
  id: PROJECT_CONFIG_PATH,
322
337
  });
@@ -380,7 +395,7 @@ export async function commitProjectConfig(
380
395
  // The seed, and the record it read handed to the document — so the tab the Settings door opened
381
396
  // Writes the same bytes from ⌘S that this commit is about to.
382
397
  await lendProjectConfigLayout(tab);
383
- const current = toRaw(tab.doc.document) as unknown as ProjectConfig;
398
+ const current = configOf(tab.doc.document);
384
399
  const currentText = serializeProjectConfig(current);
385
400
 
386
401
  // Two objects that disagree — whichever one loses, an edit written into it is lost. Null when
@@ -404,7 +419,7 @@ export async function commitProjectConfig(
404
419
  }
405
420
 
406
421
  const base = rival ?? current;
407
- const next = patch ? ({ ...base, ...patch } as ProjectConfig) : base;
422
+ const next: ProjectConfig = patch ? { ...base, ...patch } : base;
408
423
  const text = serializeProjectConfig(next);
409
424
 
410
425
  // Nothing the file does not already say: no transaction, no write, and therefore no diff. The
@@ -417,7 +432,7 @@ export async function commitProjectConfig(
417
432
 
418
433
  const before = extensionsKey(current);
419
434
  transactDoc(tab, (t) => {
420
- const doc = t.doc.document as unknown as Record<string, unknown>;
435
+ const doc = t.doc.document;
421
436
  if (rival) {
422
437
  replaceContents(doc, rival);
423
438
  }
@@ -429,7 +444,7 @@ export async function commitProjectConfig(
429
444
  // Serialised from what the transaction actually LANDED, not from the `next` computed above: a
430
445
  // Gate on `transactDoc` can refuse a mutation, and writing the value it refused would put the
431
446
  // File and the document into the one disagreement this module exists to make impossible.
432
- const config = toRaw(tab.doc.document) as unknown as ProjectConfig;
447
+ const config = configOf(tab.doc.document);
433
448
  const output = serializeProjectConfig(config);
434
449
  try {
435
450
  await getPlatform().writeFile(PROJECT_CONFIG_PATH, output);
@@ -480,18 +495,14 @@ export async function commitProjectConfig(
480
495
  * @returns {Promise<void>}
481
496
  */
482
497
  export async function adoptProjectConfig(config: ProjectConfig, text: string): Promise<void> {
483
- if (!requireProjectState()) {
498
+ if (!projectState) {
484
499
  // No project state is no configuration document either ({@link projectConfigDocument} reads
485
500
  // One). The workspace copy is then the only thing there is to keep true.
486
501
  setWorkspaceProject(workspace.projectRoot, config);
487
502
  return;
488
503
  }
489
504
  const tab = projectConfigDocument();
490
- transactDoc(
491
- tab,
492
- (t) => replaceContents(t.doc.document as unknown as Record<string, unknown>, config),
493
- { skipHistory: true },
494
- );
505
+ transactDoc(tab, (t) => replaceContents(t.doc.document, config), { skipHistory: true });
495
506
  tab.doc.dirty = false;
496
507
  // Settle a read already in flight before saying what the file holds, or it would resolve after
497
508
  // These lines with the PREVIOUS bytes and record, and make the next real commit look like a
@@ -42,6 +42,8 @@
42
42
  * standing between a mixed selection and a half-applied, unrecorded delete.
43
43
  */
44
44
 
45
+ import { isNumber } from "@jxsuite/schema/guards";
46
+
45
47
  import type { JxPath } from "../state";
46
48
  import { isAncestor, pathsEqual } from "../state";
47
49
 
@@ -52,7 +54,7 @@ import { isAncestor, pathsEqual } from "../state";
52
54
  * @returns {JxPath | null}
53
55
  */
54
56
  export function primarySelection(selection: readonly JxPath[] | null | undefined): JxPath | null {
55
- return selection && selection.length > 0 ? (selection.at(-1) as JxPath) : null;
57
+ return selection?.at(-1) ?? null;
56
58
  }
57
59
 
58
60
  /**
@@ -62,7 +64,7 @@ export function primarySelection(selection: readonly JxPath[] | null | undefined
62
64
  * @returns {JxPath | null}
63
65
  */
64
66
  export function selectionAnchor(selection: readonly JxPath[] | null | undefined): JxPath | null {
65
- return selection && selection.length > 0 ? (selection[0] as JxPath) : null;
67
+ return selection?.[0] ?? null;
66
68
  }
67
69
 
68
70
  /**
@@ -187,7 +189,7 @@ export function comparePaths(a: JxPath, b: JxPath): number {
187
189
  if (x === y) {
188
190
  continue;
189
191
  }
190
- if (typeof x === "number" && typeof y === "number") {
192
+ if (isNumber(x) && isNumber(y)) {
191
193
  return x - y;
192
194
  }
193
195
  return String(x) < String(y) ? -1 : 1;
@@ -231,7 +233,27 @@ export function topLevelSelection(selection: readonly JxPath[]): JxPath[] {
231
233
  * @returns {boolean}
232
234
  */
233
235
  export function isSpliceablePath(path: JxPath): boolean {
234
- return path.at(-2) === "children" && typeof path.at(-1) === "number";
236
+ return spliceCoordinate(path) !== null;
237
+ }
238
+
239
+ /** Where a structural verb splices: the parent element's path and the index in its children. */
240
+ export interface SpliceCoordinate {
241
+ parentPath: JxPath;
242
+ index: number;
243
+ }
244
+
245
+ /**
246
+ * The splice coordinate `path` names, or `null` for no path and for every path
247
+ * {@link isSpliceablePath} refuses.
248
+ *
249
+ * @param {JxPath | null | undefined} path
250
+ * @returns {SpliceCoordinate | null}
251
+ */
252
+ export function spliceCoordinate(path: JxPath | null | undefined): SpliceCoordinate | null {
253
+ const index = path?.at(-1);
254
+ return path && path.at(-2) === "children" && isNumber(index)
255
+ ? { index, parentPath: path.slice(0, -2) }
256
+ : null;
235
257
  }
236
258
 
237
259
  /**
@@ -289,7 +311,13 @@ export function selectionsEqual(
289
311
  ): boolean {
290
312
  const x = a ?? [];
291
313
  const y = b ?? [];
292
- return x.length === y.length && x.every((p, i) => pathsEqual(p, y[i] as JxPath));
314
+ return x.length === y.length && x.every((p, i) => pathsEqual(p, y[i] ?? null));
315
+ }
316
+
317
+ /** One field's value read across the selection: `mixed` when the selected nodes disagree. */
318
+ export interface UnifiedValue<T> {
319
+ mixed: boolean;
320
+ value: T | undefined;
293
321
  }
294
322
 
295
323
  /**
@@ -306,13 +334,13 @@ export function selectionsEqual(
306
334
  *
307
335
  * @template T
308
336
  * @param {readonly T[]} values One per selected node, in selection order.
309
- * @returns {{ mixed: boolean; value: T | undefined }}
337
+ * @returns {UnifiedValue<T>}
310
338
  */
311
- export function unifyValues<T>(values: readonly T[]): { mixed: boolean; value: T | undefined } {
339
+ export function unifyValues<T>(values: readonly T[]): UnifiedValue<T> {
312
340
  if (values.length === 0) {
313
341
  return { mixed: false, value: undefined };
314
342
  }
315
- const first = values[0] as T;
343
+ const [first] = values;
316
344
  const key = JSON.stringify(first ?? null);
317
345
  for (let i = 1; i < values.length; i++) {
318
346
  if (JSON.stringify(values[i] ?? null) !== key) {
package/src/tabs/tab.ts CHANGED
@@ -1,12 +1,13 @@
1
1
  /// <reference lib="dom" />
2
2
  import { effectScope, reactive } from "../reactivity";
3
3
  import { formatByName, formatForPath } from "../format/format-host";
4
+ import type { FormatFrontmatter } from "../format/format-host";
4
5
  import { normalizeArrayChildren } from "../state";
5
6
  import type { JxPath } from "../state";
6
7
  import type { FormulaEditDef, FunctionEditDef, InlineEditDef, JsonValue } from "../types";
7
8
  import { editorKindForMode } from "../commands/context";
8
9
  import type { EditorKind } from "../commands/context";
9
- import type { JxMutableNode } from "@jxsuite/schema/types";
10
+ import type { JsonObject, JxMutableNode } from "@jxsuite/schema/types";
10
11
  import type { JxDocOp, JxFmOp } from "./patch-ops";
11
12
  import type { JsonLayout } from "@jxsuite/schema/json-layout";
12
13
 
@@ -125,7 +126,7 @@ export interface StoredLivePreview {
125
126
 
126
127
  interface HistorySnapshot {
127
128
  /** Full document at this state (checkpoint), or null when the ops describe the transition. */
128
- document: Record<string, unknown> | null;
129
+ document: JxMutableNode | null;
129
130
  /** Selection after this state's transaction — the whole set, so a batch undoes back to it. */
130
131
  selection: (string | number)[][];
131
132
  /** Selection before this state's transaction (restored on surgical undo). */
@@ -177,11 +178,10 @@ export interface Tab {
177
178
  scope: {
178
179
  stop: () => void;
179
180
  run: <T>(fn: () => T) => T | undefined;
180
- [k: string]: unknown;
181
181
  };
182
182
  doc: {
183
183
  document: JxMutableNode;
184
- content: { frontmatter: Record<string, unknown> };
184
+ content: { frontmatter: FormatFrontmatter };
185
185
  mode: string;
186
186
  sourceFormat: string | null;
187
187
  handlersSource: string | null;
@@ -230,7 +230,7 @@ export interface Tab {
230
230
  // A serializable snapshot of the iframe's resolved `$defs` (data-source values), posted over
231
231
  // The bridge as a `dataScope` message and read by the data-explorer panel. Plain data now —
232
232
  // The old live `EffectScope` (with `.stop()`) moved into the iframe realm with buildScope.
233
- scope: Record<string, unknown> | null;
233
+ scope: JsonObject | null;
234
234
  // Latest live (iframe-evaluated) expression previews keyed by editing-target id, stored
235
235
  // Beside `scope` the same way (services/live-preview.ts owns reads/writes).
236
236
  livePreviews: Record<string, StoredLivePreview> | null;
@@ -249,7 +249,7 @@ export interface Tab {
249
249
  * @param {boolean} preview — initial preview-toggle state
250
250
  * @returns {TabUi}
251
251
  */
252
- function createDefaultUi(canvasMode: string, preview = false) {
252
+ function createDefaultUi(canvasMode: string, preview = false): TabUi {
253
253
  return {
254
254
  activeMedia: null,
255
255
  activeSelector: null,
@@ -264,7 +264,7 @@ function createDefaultUi(canvasMode: string, preview = false) {
264
264
  pendingInlineEdit: null,
265
265
  preview,
266
266
  previewColorScheme: "auto" as const,
267
- previewLocale: null as string | null,
267
+ previewLocale: null,
268
268
  previewParams: {},
269
269
  previewProps: null,
270
270
  rightTab: "properties",
@@ -295,8 +295,8 @@ const ALL_MODES = ["edit", "design", "preview", "source", "stylebook", "git-diff
295
295
  * id: string;
296
296
  * documentPath?: string | null;
297
297
  * fileHandle?: FileSystemFileHandle | null;
298
- * document: Record<string, unknown>;
299
- * frontmatter?: Record<string, unknown>;
298
+ * document: JxMutableNode;
299
+ * frontmatter?: FormatFrontmatter;
300
300
  * sourceFormat?: string | null;
301
301
  * capabilities?: { modes?: string[] };
302
302
  * openedFrom?: TabOrigin | null;
@@ -320,8 +320,8 @@ export function createTab({
320
320
  id: string;
321
321
  documentPath?: string | null;
322
322
  fileHandle?: FileSystemFileHandle | null;
323
- document: Record<string, unknown>;
324
- frontmatter?: Record<string, unknown>;
323
+ document: JxMutableNode;
324
+ frontmatter?: FormatFrontmatter;
325
325
  sourceFormat?: string | null;
326
326
  capabilities?: { modes?: string[] };
327
327
  openedFrom?: TabOrigin | null;
@@ -342,45 +342,56 @@ export function createTab({
342
342
  const initialCanvasMode = resolvedModes.find((m) => m !== "preview") ?? "edit";
343
343
  const initialPreview = resolvedModes[0] === "preview";
344
344
 
345
+ const doc: Tab["doc"] = {
346
+ content: { frontmatter: frontmatter || {} },
347
+ dirty: false,
348
+ document,
349
+ handlersSource: null,
350
+ layout,
351
+ mode: inferDocumentMode(documentPath, sourceFormat),
352
+ sourceFormat,
353
+ };
354
+ const history: Tab["history"] = {
355
+ index: 0,
356
+ snapshots: [{ document: structuredClone(document), selection: [] }],
357
+ };
358
+ const session: Tab["session"] = {
359
+ canvas: {
360
+ refreshing: false,
361
+ error: null,
362
+ livePreviews: null,
363
+ pendingInlineEdit: null,
364
+ scope: null,
365
+ status: "idle",
366
+ },
367
+ clipboard: null,
368
+ hover: null,
369
+ openedFrom,
370
+ selection: [],
371
+ ui: createDefaultUi(initialCanvasMode, initialPreview),
372
+ };
373
+
374
+ /* SAFETY: `reactive()` returns a deep proxy carrying its target's own members, and none of these
375
+ Three trees holds a ref for `UnwrapNestedRefs` to unwrap, so each proxy IS the shape it is cast
376
+ To. The type argument is pinned to `object` because `UnwrapNestedRefs<JxMutableNode>` recurses
377
+ Deeply enough for tsc to give up (TS2589); the proxies are deep either way. */
345
378
  const tab = scope.run(() => ({
346
379
  capabilities: { modes: resolvedModes },
347
- doc: reactive({
348
- content: { frontmatter: frontmatter || {} },
349
- dirty: false,
350
- document,
351
- handlersSource: null,
352
- layout,
353
- mode: inferDocumentMode(documentPath, sourceFormat),
354
- sourceFormat,
355
- }),
380
+ doc: reactive<object>(doc) as Tab["doc"],
356
381
  documentPath,
357
382
  fileHandle,
358
- history: reactive({
359
- index: 0,
360
- snapshots: [{ document: structuredClone(document), selection: [] }],
361
- }),
383
+ history: reactive<object>(history) as Tab["history"],
362
384
  id,
363
385
  pinned: false,
364
386
  preview: previewTab,
365
387
  scope,
366
- session: reactive({
367
- canvas: {
368
- refreshing: false,
369
- error: null,
370
- livePreviews: null,
371
- pendingInlineEdit: null,
372
- scope: null,
373
- status: "idle",
374
- },
375
- clipboard: null,
376
- hover: null,
377
- openedFrom,
378
- selection: [],
379
- ui: createDefaultUi(initialCanvasMode, initialPreview),
380
- }),
381
- })) as unknown as Tab;
388
+ session: reactive<object>(session) as Tab["session"],
389
+ }));
382
390
 
383
- return tab;
391
+ /* SAFETY: `scope` was created at the top of this function and nothing has stopped it, and an
392
+ Active scope's `run` always returns its callback's value; `undefined` is only what an inactive
393
+ Scope answers. */
394
+ return tab as Tab;
384
395
  }
385
396
 
386
397
  /**