@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
@@ -54,12 +54,12 @@ import { collabState } from "../collab/collab-state";
54
54
  import { problemCount, problems } from "../services/notify";
55
55
  import { mountSurface, registerSurface } from "../ui/surface";
56
56
  import statusbarDoc from "./statusbar.json";
57
+ import type { CommandArgValues } from "../commands/command-args";
57
58
  import type { CommandRegistry } from "../commands/registry";
58
59
  import type { EffectScope } from "@vue/reactivity";
59
- import type { JxDocument } from "@jxsuite/schema/types";
60
60
  import type { SurfaceHandle } from "../ui/surface";
61
61
 
62
- registerSurface("statusbar", statusbarDoc as unknown as JxDocument);
62
+ registerSurface("statusbar", statusbarDoc);
63
63
 
64
64
  let _scope: EffectScope | null = null;
65
65
 
@@ -72,7 +72,7 @@ interface StatusItem {
72
72
  label: string;
73
73
  /** Extra context for the tooltip. The command's own title and chord are added to it. */
74
74
  title?: string;
75
- args?: Record<string, unknown>;
75
+ args?: CommandArgValues;
76
76
  }
77
77
 
78
78
  /** One item as the surface reads it: a button that runs a command through `run`, or a readout. */
@@ -85,7 +85,7 @@ interface ProjectedItem {
85
85
  disabled: boolean;
86
86
  /** For a button: what `run` runs. */
87
87
  command: string | null;
88
- args: Record<string, unknown> | undefined;
88
+ args: CommandArgValues | undefined;
89
89
  }
90
90
 
91
91
  interface ProjectedField {
@@ -147,9 +147,10 @@ function projectField(
147
147
  items: readonly (StatusItem | null)[],
148
148
  ): ProjectedField | null {
149
149
  const region = `statusbar/${id}`;
150
- const live = items
151
- .map((item) => (item === null ? null : projectItem(registry, region, item)))
152
- .filter((item): item is ProjectedItem => item !== null);
150
+ const live = items.flatMap((item) => {
151
+ const projected = item === null ? null : projectItem(registry, region, item);
152
+ return projected === null ? [] : [projected];
153
+ });
153
154
  if (live.length === 0) {
154
155
  return null;
155
156
  }
@@ -266,7 +267,7 @@ function present(fields: readonly (ProjectedField | null)[]): ProjectedField[] {
266
267
  return fields.filter((field): field is ProjectedField => field !== null);
267
268
  }
268
269
 
269
- interface StatusbarScope extends Record<string, unknown> {
270
+ interface StatusbarScope {
270
271
  /** The fields before the DOCUMENT slot: PROJECT. */
271
272
  leading: ProjectedField[];
272
273
  /** Whether the DOCUMENT slot has a trail to show. */
@@ -282,7 +283,7 @@ let _handle: SurfaceHandle | null = null;
282
283
 
283
284
  /** The reactive scope the surface reads, made once. */
284
285
  function state(): StatusbarScope {
285
- _state ??= reactive({
286
+ _state ??= reactive<StatusbarScope>({
286
287
  hasDocument: false,
287
288
  leading: [],
288
289
  run: (key: string) => {
@@ -291,11 +292,11 @@ function state(): StatusbarScope {
291
292
  .find((i) => i.key === key);
292
293
  const registry = activeRegistry();
293
294
  if (item?.command && registry) {
294
- void runReported(registry, item.command, item.args as never, "Status Bar");
295
+ void runReported(registry, item.command, item.args, "Status Bar");
295
296
  }
296
297
  },
297
298
  trailing: [],
298
- }) as StatusbarScope;
299
+ });
299
300
  return _state;
300
301
  }
301
302
 
@@ -306,17 +307,19 @@ function state(): StatusbarScope {
306
307
  * is the same hand-over the pane grid gives the tab strip and the context bar.
307
308
  */
308
309
  function ensureMounted(): void {
309
- if (_mount || !statusbarEl) {
310
+ // The host is captured, so the mount callback below reads the element this call checked.
311
+ const host = statusbarEl;
312
+ if (_mount || !host) {
310
313
  return;
311
314
  }
312
- const mount = mountSurface("statusbar", state(), statusbarEl);
315
+ const mount = mountSurface("statusbar", state(), host);
313
316
  _mount = mount;
314
317
  void mount.then((handle) => {
315
318
  if (_mount !== mount) {
316
319
  return;
317
320
  }
318
321
  _handle = handle;
319
- attachJumpBarHost(statusbarEl.querySelector<HTMLElement>('[part="trail"]'));
322
+ attachJumpBarHost(host.querySelector<HTMLElement>('[part="trail"]'));
320
323
  });
321
324
  }
322
325
 
@@ -22,13 +22,15 @@
22
22
  * @docs studio/design/style-inspector
23
23
  */
24
24
 
25
+ import { isString } from "@jxsuite/schema/guards";
25
26
  import { reactive } from "../reactivity";
26
27
  import { mountSurface, registerSurface } from "../ui/surface";
27
28
  import stylePanelDoc from "./style-panel.json";
28
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
29
+ import type { JxElement } from "@jxsuite/schema/types";
29
30
  import type { SurfaceHandle } from "../ui/surface";
31
+ import type { ColorTokenView } from "../ui/color-selector";
30
32
 
31
- registerSurface("style-panel", stylePanelDoc as unknown as JxDocument);
33
+ registerSurface("style-panel", stylePanelDoc);
32
34
 
33
35
  // ─── The projection ──────────────────────────────────────────────────────────
34
36
 
@@ -58,19 +60,6 @@ export type StyleRowKind =
58
60
  /** How the provenance chip is drawn: not at all, as a control, or as a statement. */
59
61
  export type StyleChipControl = "none" | "button" | "text";
60
62
 
61
- /**
62
- * One colour the project has named, as the row's palette draws it.
63
- *
64
- * `value` is the reference and `color` is the literal behind it, and they are two fields because
65
- * they are two things: choosing a swatch commits `var(--color-accent)`, while the chip is only how
66
- * that reads on screen. `label` is what a reader hears — a swatch is never named by its hex.
67
- */
68
- export interface StyleTokenView extends Record<string, unknown> {
69
- value: string;
70
- color: string;
71
- label: string;
72
- }
73
-
74
63
  /**
75
64
  * One keyword a `keywords` row lists under its field.
76
65
  *
@@ -78,7 +67,7 @@ export interface StyleTokenView extends Record<string, unknown> {
78
67
  * — and the two stay separate because the field holds the value: a combobox row's label is a
79
68
  * courtesy, never a second spelling the reader could end up with.
80
69
  */
81
- export interface StyleOptionView extends Record<string, unknown> {
70
+ export interface StyleOptionView {
82
71
  value: string;
83
72
  label: string;
84
73
  /** A muted note at the end of the row — a font token's own name beside its display name. */
@@ -97,7 +86,7 @@ export interface StyleOptionView extends Record<string, unknown> {
97
86
  }
98
87
 
99
88
  /** One value of a button-group row. */
100
- export interface StyleButtonView extends Record<string, unknown> {
89
+ export interface StyleButtonView {
101
90
  /** The owning row's key — a nested `$map` shadows `$map.item`, so the row carries it here. */
102
91
  row: string;
103
92
  /** The CSS value this button commits, and the button's identity in the repeater. */
@@ -130,7 +119,7 @@ export interface StyleButtonView extends Record<string, unknown> {
130
119
  * `prop` is the name a reader, the region grammar and the inspector see. The two are different on
131
120
  * purpose: one coordinate's `color` and another's are two rows with one name.
132
121
  */
133
- export interface StyleRowView extends Record<string, unknown> {
122
+ export interface StyleRowView {
134
123
  key: string;
135
124
  prop: string;
136
125
  label: string;
@@ -177,7 +166,7 @@ export interface StyleRowView extends Record<string, unknown> {
177
166
  choicesHint: string;
178
167
  buttons: StyleButtonView[];
179
168
  /** The palette a colour row offers inside its picker, and whether it has one to offer. */
180
- tokens: StyleTokenView[];
169
+ tokens: ColorTokenView[];
181
170
  hasTokens: boolean;
182
171
  overflowSelected: boolean;
183
172
  expanded: boolean;
@@ -190,7 +179,7 @@ export interface StyleRowView extends Record<string, unknown> {
190
179
  }
191
180
 
192
181
  /** One accordion section. */
193
- export interface StyleSectionView extends Record<string, unknown> {
182
+ export interface StyleSectionView {
194
183
  key: string;
195
184
  label: string;
196
185
  open: boolean;
@@ -236,14 +225,14 @@ export interface StylePanelActions {
236
225
  /** The provenance chip, a custom pair's remove and a nested rule's remove are one verb. */
237
226
  chipClick: (key: string) => void;
238
227
  /** Open the Value Source picker under the chip that was pressed. */
239
- pickSource: (key: string, anchor: unknown) => void;
228
+ pickSource: (key: string, anchor: EventTarget | null) => void;
240
229
  /** Open the row's list of offerable values under the button that was pressed. */
241
- pickChoice: (key: string, anchor: unknown) => void;
230
+ pickChoice: (key: string, anchor: EventTarget | null) => void;
242
231
  pressButton: (key: string, value: string) => void;
243
232
  toggleShorthand: (key: string) => void;
244
233
  renameCustom: (key: string, name: string) => void;
245
234
  /** Enter in the add-a-property field. Given the field too, because it is emptied on success. */
246
- addCustom: (key: string, field: unknown) => void;
235
+ addCustom: (key: string, field: EventTarget | null) => void;
247
236
  openNested: (key: string) => void;
248
237
  addNested: () => void;
249
238
  }
@@ -264,12 +253,12 @@ export interface StylePanelSurface {
264
253
  }
265
254
 
266
255
  /** The scope the document reads: the view plus the actions, flat. */
267
- interface StylePanelScope extends Record<string, unknown>, StylePanelView, StylePanelActions {}
256
+ interface StylePanelScope extends StylePanelView, StylePanelActions {}
268
257
 
269
258
  /** A node definition's `part`, as written in the document. */
270
259
  function partOf(def: JxElement | string): string {
271
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
272
- return typeof part === "string" ? part : "";
260
+ const part = isString(def) ? undefined : def.attributes?.["part"];
261
+ return isString(part) ? part : "";
273
262
  }
274
263
 
275
264
  /** Write a whole view into the scope. Assignment only — the mount is never rebuilt for a repaint. */
@@ -300,7 +289,7 @@ export function mountStylePanelSurface(
300
289
  actions: StylePanelActions,
301
290
  hosts: StyleHostSink,
302
291
  ): StylePanelSurface {
303
- const scope = reactive<StylePanelScope>({
292
+ const scope: StylePanelScope = reactive<StylePanelScope>({
304
293
  ...actions,
305
294
  emptyActionLabel: "",
306
295
  emptyMessage: "",
@@ -308,7 +297,7 @@ export function mountStylePanelSurface(
308
297
  hasEmptyAction: false,
309
298
  sections: [],
310
299
  view: "empty",
311
- }) as StylePanelScope;
300
+ });
312
301
  project(scope, view);
313
302
 
314
303
  host.replaceChildren();
@@ -334,9 +323,7 @@ export function mountStylePanelSurface(
334
323
  dock that redrew took the tab's root away without telling anyone. */
335
324
  connected: () =>
336
325
  !disposed &&
337
- (mounted === null
338
- ? host.childNodes.length === 0
339
- : (mounted.root as Node).parentNode === host),
326
+ (mounted === null ? host.childNodes.length === 0 : mounted.root.parentNode === host),
340
327
  dispose() {
341
328
  disposed = true;
342
329
  hosts.target(null);
@@ -29,10 +29,9 @@
29
29
  import { reactive } from "../reactivity";
30
30
  import { mountSurface, registerSurface } from "../ui/surface";
31
31
  import chromeDoc from "./stylebook-chrome.json";
32
- import type { JxDocument } from "@jxsuite/schema/types";
33
32
  import type { SurfaceHandle } from "../ui/surface";
34
33
 
35
- registerSurface("stylebook-chrome", chromeDoc as unknown as JxDocument);
34
+ registerSurface("stylebook-chrome", chromeDoc);
36
35
 
37
36
  /** What the bar says right now. Every field is the panel's own wording, never a value it derives. */
38
37
  export interface StylebookChromeView {
@@ -64,8 +63,7 @@ export interface StylebookChromeSurface {
64
63
  update: (view: StylebookChromeView) => void;
65
64
  }
66
65
 
67
- interface StylebookChromeScope
68
- extends Record<string, unknown>, StylebookChromeView, StylebookChromeActions {}
66
+ interface StylebookChromeScope extends StylebookChromeView, StylebookChromeActions {}
69
67
 
70
68
  /**
71
69
  * Create the bar's surface, mounted into a host of its own.
@@ -84,7 +82,7 @@ export function createStylebookChromeSurface(
84
82
  ): StylebookChromeSurface {
85
83
  const host = document.createElement("div");
86
84
  host.style.display = "contents";
87
- const scope = reactive({ ...view, ...actions }) as StylebookChromeScope;
85
+ const scope: StylebookChromeScope = reactive<StylebookChromeScope>({ ...view, ...actions });
88
86
 
89
87
  /** `null` while a mount is in flight — which is a standing surface, not a missing one. */
90
88
  let handle: SurfaceHandle | null = null;
@@ -28,20 +28,21 @@
28
28
  * @docs studio/interface
29
29
  */
30
30
 
31
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
31
32
  import { reactive } from "../reactivity";
32
33
  import { mountSurface, registerSurface } from "../ui/surface";
33
34
  import tabStripDoc from "./tab-strip.json";
34
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
35
+ import type { JxElement } from "@jxsuite/schema/types";
35
36
  import type { JxScope } from "@jxsuite/runtime/types";
36
37
  import type { SurfaceHandle } from "../ui/surface";
37
38
 
38
- registerSurface("tab-strip", tabStripDoc as unknown as JxDocument);
39
+ registerSurface("tab-strip", tabStripDoc);
39
40
 
40
41
  /**
41
42
  * One chip, as the document draws it. Every field is a value: the document asks no question about a
42
43
  * tab, and there is no branch in it that a projection has not already decided.
43
44
  */
44
- export interface TabChipView extends Record<string, unknown> {
45
+ export interface TabChipView {
45
46
  /** The tab id: the repeater's key, the tab's `value`, and what every action is addressed with. */
46
47
  key: string;
47
48
  /** The shortest suffix that tells this document apart, or a page's route. */
@@ -107,7 +108,7 @@ export interface TabStripActions {
107
108
  /** The chevron, or a derived pane's ✕. The anchor is the button that was pressed. */
108
109
  openTrailing: (anchor: HTMLElement | null) => void;
109
110
  /** A wheel over the strip. A host function in handler position, so it takes the event. */
110
- wheel: (scope: unknown, event: WheelEvent) => void;
111
+ wheel: (scope: JxScope, event: WheelEvent) => void;
111
112
  /** A chip element exists. `panels/tab-strip.ts` makes it a pragmatic drag source and drop target. */
112
113
  chipHost: (element: HTMLElement, id: string) => void;
113
114
  /**
@@ -146,20 +147,20 @@ export interface TabStripSurface {
146
147
  }
147
148
 
148
149
  /** The scope `tab-strip.json` reads. */
149
- interface TabStripScope
150
- extends Record<string, unknown>, TabStripValues, TabStripActions, TabStripDragState {}
150
+ interface TabStripScope extends TabStripValues, TabStripActions, TabStripDragState {}
151
151
 
152
152
  /** The `part` a node's definition carries, or `""` for a text node or an unmarked element. */
153
153
  function partOf(def: JxElement | string): string {
154
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
155
- return typeof part === "string" ? part : "";
154
+ const part = isString(def) ? undefined : def.attributes?.["part"];
155
+ return isString(part) ? part : "";
156
156
  }
157
157
 
158
158
  /** The tab id a mapped `jx-tab` node was rendered for, read from the row scope, or `""`. */
159
159
  function mappedChipKey(state: JxScope | undefined): string {
160
- const map = state?.["$map"] as { item?: { key?: unknown } } | undefined;
161
- const key = map?.item?.key;
162
- return typeof key === "string" ? key : "";
160
+ const map = state?.["$map"];
161
+ const item = isJsonObject(map) ? map["item"] : undefined;
162
+ const key = isJsonObject(item) ? item["key"] : undefined;
163
+ return isString(key) ? key : "";
163
164
  }
164
165
 
165
166
  /**
@@ -178,13 +179,13 @@ export function mountTabStripSurface(
178
179
  values: TabStripValues,
179
180
  actions: TabStripActions,
180
181
  ): TabStripSurface {
181
- const scope = reactive<TabStripScope>({
182
+ const scope: TabStripScope = reactive<TabStripScope>({
182
183
  ...values,
183
184
  ...actions,
184
185
  dragKey: "",
185
186
  dropIndex: -1,
186
187
  dropTail: false,
187
- }) as TabStripScope;
188
+ });
188
189
 
189
190
  host.replaceChildren();
190
191
  let mounted: SurfaceHandle | null = null;
@@ -46,11 +46,10 @@ import { reactive } from "../reactivity";
46
46
  import { mountSurface, registerSurface } from "../ui/surface";
47
47
  import { openMenu } from "./menu";
48
48
  import targetLineDoc from "./target-line.json";
49
- import type { JxDocument } from "@jxsuite/schema/types";
50
49
  import type { MenuHandle, MenuRowProjection } from "./menu";
51
50
  import type { SurfaceHandle } from "../ui/surface";
52
51
 
53
- registerSurface("target-line", targetLineDoc as unknown as JxDocument);
52
+ registerSurface("target-line", targetLineDoc);
54
53
 
55
54
  /** The region the line stamps on itself, so a shot can crop it. */
56
55
  const REGION = "inspector/target";
@@ -108,7 +107,7 @@ export const BASE_SELECTOR_LABEL = "base rule";
108
107
  // ─── The projection ──────────────────────────────────────────────────────────
109
108
 
110
109
  /** One word of the sentence, as the document reads it. */
111
- interface ProjectedSegment extends Record<string, unknown> {
110
+ interface ProjectedSegment {
112
111
  key: string;
113
112
  label: string;
114
113
  title: string;
@@ -119,7 +118,7 @@ interface ProjectedSegment extends Record<string, unknown> {
119
118
  }
120
119
 
121
120
  /** The scope `target-line.json` reads. */
122
- interface TargetLineScope extends Record<string, unknown> {
121
+ interface TargetLineScope {
123
122
  region: string;
124
123
  segments: ProjectedSegment[];
125
124
  selectorLabel: string;
@@ -201,7 +200,7 @@ function scope(): TargetLineScope {
201
200
  toggleLabel: "Show affected",
202
201
  warn: false,
203
202
  warningText: "",
204
- }) as TargetLineScope;
203
+ });
205
204
  return _scope;
206
205
  }
207
206
 
@@ -311,11 +310,11 @@ export function openSelectorMenu(): void {
311
310
  },
312
311
  title: BASE_SELECTOR_LABEL,
313
312
  },
314
- ...selector.options.map((option, index) => ({
313
+ ...selector.options.map((option, index): MenuRowProjection => ({
315
314
  /* What the ● in the old menu said: this element already DECLARES this rule. Where you are is
316
315
  stated once, by the trigger's own label — a row that carried both facts would be two
317
316
  answers on one line. */
318
- checked: (selector.declared.has(option) ? "true" : "false") as "true" | "false",
317
+ checked: selector.declared.has(option) ? "true" : "false",
319
318
  destructive: false,
320
319
  disabled: false,
321
320
  dividerAbove: index === 0,
@@ -24,16 +24,15 @@ import { runOfferedAction } from "../account/action-flow";
24
24
  import { platformSupportsAddRepo } from "../new-project/add-repo-modal";
25
25
  import { getProjectList } from "../project-list";
26
26
  import { reactive } from "../reactivity";
27
- import { now } from "../services/clock";
27
+ import { MINUTE, now } from "../services/clock";
28
28
  import { clearRecentProjects, getRecentProjects, removeRecentProject } from "../recent-projects";
29
29
  import { platformSupportsClone } from "../panels/git-panel";
30
30
  import { mountSurface, registerSurface } from "../ui/surface";
31
31
  import welcomeDoc from "./welcome.json";
32
- import type { JxDocument } from "@jxsuite/schema/types";
33
32
  import type { SurfaceHandle } from "../ui/surface";
34
33
  import type { AccountNotice, OfferedAction } from "../types";
35
34
 
36
- registerSurface("welcome", welcomeDoc as unknown as JxDocument);
35
+ registerSurface("welcome", welcomeDoc);
37
36
 
38
37
  interface WelcomeCtx {
39
38
  openProject: () => void;
@@ -122,7 +121,6 @@ export function recentLocations(
122
121
  return labels;
123
122
  }
124
123
 
125
- const MINUTE = 60_000;
126
124
  const HOUR = 60 * MINUTE;
127
125
  const DAY = 24 * HOUR;
128
126
 
@@ -195,7 +193,7 @@ interface CatalogueRow {
195
193
  detail: string;
196
194
  }
197
195
 
198
- interface WelcomeScope extends Record<string, unknown> {
196
+ interface WelcomeScope {
199
197
  actions: StartAction[];
200
198
  installNeeded: boolean;
201
199
  installUrl: string;
@@ -292,7 +290,7 @@ function noticeAction(key: string): OfferedAction | null {
292
290
 
293
291
  /** The reactive scope the surface reads, made once. */
294
292
  function state(): WelcomeScope {
295
- _state ??= reactive({
293
+ _state ??= reactive<WelcomeScope>({
296
294
  actions: [],
297
295
  catalogue: [],
298
296
  clear: () => {
@@ -342,7 +340,7 @@ function state(): WelcomeScope {
342
340
  }
343
341
  }
344
342
  },
345
- }) as WelcomeScope;
343
+ });
346
344
  return _state;
347
345
  }
348
346
 
@@ -7,6 +7,7 @@
7
7
 
8
8
  // oxlint-disable-next-line unicorn/prefer-export-from -- JxDocOpPair is also used locally (TransactionRecord)
9
9
  import type { JxDocOpPair } from "@jxsuite/schema/doc-ops";
10
+ import type { JxDocumentValue, JxMutableNode } from "@jxsuite/schema/types";
10
11
  import type { JxPath } from "../state";
11
12
  import type { Tab } from "./tab.js";
12
13
 
@@ -48,8 +49,8 @@ export type { JxDocOpPair };
48
49
  */
49
50
  export interface JxFmOp {
50
51
  field: string;
51
- before?: unknown;
52
- after?: unknown;
52
+ before?: JxDocumentValue | undefined;
53
+ after?: JxDocumentValue | undefined;
53
54
  }
54
55
 
55
56
  /** Everything recorded during one transaction. */
@@ -82,7 +83,7 @@ export interface PatchConsumer {
82
83
  * was consumed by whichever pane's effect ran first, so the second full-rendered every patched
83
84
  * edit while the skip counter reported one skip.
84
85
  */
85
- markConsumed: (docRef: object, tab: Tab) => void;
86
+ markConsumed: (docRef: JxMutableNode, tab: Tab) => void;
86
87
  /**
87
88
  * Apply the batch to all ready canvas panels. Throws on any failure (caller escalates). `record`
88
89
  * carries the value-carrying `docOps` the iframe consumer posts across the frame boundary; the
@@ -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