@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
@@ -26,25 +26,20 @@
26
26
  * @docs studio/logic/statements
27
27
  */
28
28
 
29
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
29
30
  import { reactive } from "../reactivity";
30
31
  import { REGION_ATTR } from "../ui/regions";
31
32
  import { mountSurface, registerSurface } from "../ui/surface";
32
33
  import statementsDoc from "./statements.json";
33
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
34
+ import type { JxElement } from "@jxsuite/schema/types";
34
35
  import type { JxScope } from "@jxsuite/runtime/types";
35
- import type { SurfaceHandle } from "../ui/surface";
36
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
36
37
 
37
- registerSurface("statements", statementsDoc as unknown as JxDocument);
38
+ registerSurface("statements", statementsDoc);
38
39
 
39
40
  /** Which control one operand of a statement draws. The flow picks it; the document switches on it. */
40
41
  export type StatementFieldKind = "control" | "text" | "select" | "flags";
41
42
 
42
- /** A closed list of choices, in the shape the kit's select reads. */
43
- export interface StatementOption {
44
- value: string;
45
- label: string;
46
- }
47
-
48
43
  /** One `eventInit` flag of a `dispatchEvent` statement. */
49
44
  export interface StatementFlagView {
50
45
  /** `<row>::<prop>::<flag>` — self-contained, because a third `$map` shadows both above it. */
@@ -64,7 +59,7 @@ export interface StatementFieldView {
64
59
  /** What a `text` or `select` control holds. Empty for the other two kinds. */
65
60
  value: string;
66
61
  placeholder: string;
67
- options: StatementOption[];
62
+ options: SurfaceOption[];
68
63
  flags: StatementFlagView[];
69
64
  }
70
65
 
@@ -119,7 +114,7 @@ export interface StatementIslands {
119
114
  controlSlot: (id: string, host: HTMLElement) => void;
120
115
  }
121
116
 
122
- interface StatementScope extends Record<string, unknown>, StatementActions {
117
+ interface StatementScope extends StatementActions {
123
118
  rows: StatementRowView[];
124
119
  }
125
120
 
@@ -171,7 +166,7 @@ export function renderStatementsSurface(
171
166
  region is a fact about the HOST — who is drawing this editor — not about the document inside
172
167
  it, so it should be true the moment the host is claimed rather than a frame later. */
173
168
  host.setAttribute(REGION_ATTR, region);
174
- const scope = reactive({ ...actions, rows }) as StatementScope;
169
+ const scope: StatementScope = reactive<StatementScope>({ ...actions, rows });
175
170
  const record: Mounted = { disposed: false, handle: null, scope };
176
171
  mounts.set(host, record);
177
172
  /* No race to arbitrate: a repaint arriving while this is in flight takes the branch above — a
@@ -200,16 +195,16 @@ export function renderStatementsSurface(
200
195
 
201
196
  /** The `part` a node was rendered with, or "". */
202
197
  function partOf(def: JxElement | string): string {
203
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
204
- return typeof part === "string" ? part : "";
198
+ const part = isString(def) ? undefined : def.attributes?.["part"];
199
+ return isString(part) ? part : "";
205
200
  }
206
201
 
207
202
  /** The `key` of the `$map` item a node was rendered inside, or "". */
208
203
  function itemKey(state: JxScope | undefined): string {
209
- const item = (state?.["$map"] as { item?: unknown } | undefined)?.item;
210
- const key =
211
- item !== null && typeof item === "object" ? (item as Record<string, unknown>).key : "";
212
- return typeof key === "string" ? key : "";
204
+ const map = state?.["$map"];
205
+ const item = isJsonObject(map) ? map["item"] : undefined;
206
+ const key = isJsonObject(item) ? item["key"] : "";
207
+ return isString(key) ? key : "";
213
208
  }
214
209
 
215
210
  /**
@@ -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