@jxsuite/studio 6.1.1 → 8.0.0

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 (785) hide show
  1. package/README.md +5 -5
  2. package/dist/chunks/2020-5wtzce5g.js +4 -0
  3. package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
  4. package/dist/chunks/adapter-5tphg7xe.js +4 -0
  5. package/dist/chunks/add-new-flow-psym14sn.js +4 -0
  6. package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
  7. package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
  8. package/dist/chunks/color-area-6rbra5dy.js +4 -0
  9. package/dist/chunks/color-field-gy56c94g.js +4 -0
  10. package/dist/chunks/color-m7r1vk54.js +4 -0
  11. package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
  12. package/dist/chunks/combobox-72h32ejk.js +4 -0
  13. package/dist/chunks/components-r22xca09.js +4 -0
  14. package/dist/chunks/content-source-mmppmcyg.js +4 -0
  15. package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
  16. package/dist/chunks/dialog-c4x05vyx.js +4 -0
  17. package/dist/chunks/editor-ccd9jwsa.js +4 -0
  18. package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
  19. package/dist/chunks/extension-sections-0egb88dm.js +4 -0
  20. package/dist/chunks/file-ops-qnab36ek.js +4 -0
  21. package/dist/chunks/files-rcn56qvm.js +4 -0
  22. package/dist/chunks/format-host-yxz0kjjs.js +4 -0
  23. package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
  24. package/dist/chunks/grid-open-4z1g062t.js +4 -0
  25. package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
  26. package/dist/chunks/icons-63bjtbs7.js +4 -0
  27. package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
  28. package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
  29. package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
  30. package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
  31. package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
  32. package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
  33. package/dist/chunks/index-f0jn7nnp.js +4 -0
  34. package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
  35. package/dist/chunks/jsonMode-njkvsa02.js +13 -0
  36. package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
  37. package/dist/chunks/layers-bgyr11tr.js +4 -0
  38. package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
  39. package/dist/chunks/listbox-c421cf8c.js +4 -0
  40. package/dist/chunks/lit-html-v9gh687x.js +4 -0
  41. package/dist/chunks/media-library-sq468wts.js +4 -0
  42. package/dist/chunks/media-picker-shfe59pt.js +4 -0
  43. package/dist/chunks/menu-bdpzbfvs.js +4 -0
  44. package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
  45. package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
  46. package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
  47. package/dist/chunks/notify-kzrjr3fv.js +4 -0
  48. package/dist/chunks/number-field-y62xq0ty.js +4 -0
  49. package/dist/chunks/parse-v77xtwv7.js +4 -0
  50. package/dist/chunks/platform-7v4rtd7m.js +4 -0
  51. package/dist/chunks/popover-b89sfej7.js +4 -0
  52. package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
  53. package/dist/chunks/publish-quick-qx2455cj.js +4 -0
  54. package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
  55. package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
  56. package/dist/chunks/references-9547rg5s.js +4 -0
  57. package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
  58. package/dist/chunks/select-rzds841e.js +4 -0
  59. package/dist/chunks/source-control-kwktr9y6.js +4 -0
  60. package/dist/chunks/split-c9zfdgxf.js +4 -0
  61. package/dist/chunks/studio-03ct6yfv.js +9 -0
  62. package/dist/chunks/studio-07rcfje3.js +5 -0
  63. package/dist/chunks/studio-3e54qh39.js +7 -0
  64. package/dist/chunks/studio-3exxhz5g.js +5 -0
  65. package/dist/chunks/studio-3q40e3rj.js +5 -0
  66. package/dist/chunks/studio-3qeh9t0h.js +6 -0
  67. package/dist/chunks/studio-3qqjeep5.js +6 -0
  68. package/dist/chunks/studio-43sd2mam.js +4 -0
  69. package/dist/chunks/studio-4hp8pkyt.js +5 -0
  70. package/dist/chunks/studio-58xg6j2q.js +9 -0
  71. package/dist/chunks/studio-5g0rprdt.js +7 -0
  72. package/dist/chunks/studio-6m380wp7.js +5 -0
  73. package/dist/chunks/studio-80jyh1xh.js +4 -0
  74. package/dist/chunks/studio-83mk4bgg.js +9 -0
  75. package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
  76. package/dist/chunks/studio-8m0y2qe7.js +5 -0
  77. package/dist/chunks/studio-8tr6cfrc.js +5 -0
  78. package/dist/chunks/studio-8vcvfs7r.js +6 -0
  79. package/dist/chunks/studio-9tmebf0s.js +5 -0
  80. package/dist/chunks/studio-a2bvaptz.js +5 -0
  81. package/dist/chunks/studio-b7y5mr30.js +5 -0
  82. package/dist/chunks/studio-bavb31r0.js +5 -0
  83. package/dist/chunks/studio-bbe4c90a.js +5 -0
  84. package/dist/chunks/studio-c05wdnt3.js +5 -0
  85. package/dist/chunks/studio-ccv2svc6.js +5 -0
  86. package/dist/chunks/studio-d5grtb9e.js +16 -0
  87. package/dist/chunks/studio-df0baea9.js +5 -0
  88. package/dist/chunks/studio-dgk4dqtx.js +7 -0
  89. package/dist/chunks/studio-e1g64q43.js +5 -0
  90. package/dist/chunks/studio-ed1hp6zf.js +6 -0
  91. package/dist/chunks/studio-ed3xx40h.js +7 -0
  92. package/dist/chunks/studio-f14e1zdj.js +5 -0
  93. package/dist/chunks/studio-fbhxxc5f.js +5 -0
  94. package/dist/chunks/studio-fyh0jc96.js +5 -0
  95. package/dist/chunks/studio-gcxk20n7.js +5 -0
  96. package/dist/chunks/studio-jaaz8ce9.js +5 -0
  97. package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
  98. package/dist/chunks/studio-jsgf2q5k.js +7 -0
  99. package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
  100. package/dist/chunks/studio-k7evxqh4.js +5 -0
  101. package/dist/chunks/studio-kt3pjkwd.js +5 -0
  102. package/dist/chunks/studio-m8g16bgz.js +5 -0
  103. package/dist/chunks/studio-mn0476ag.js +5 -0
  104. package/dist/chunks/studio-mx1smyq0.js +5 -0
  105. package/dist/chunks/studio-n0c5h6mf.js +5 -0
  106. package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
  107. package/dist/chunks/studio-nqxqf8p2.js +4 -0
  108. package/dist/chunks/studio-p4nrkvqr.js +5 -0
  109. package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
  110. package/dist/chunks/studio-pgmvdv7z.js +7 -0
  111. package/dist/chunks/studio-ph84avkf.js +5 -0
  112. package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
  113. package/dist/chunks/studio-q0tccd43.js +5 -0
  114. package/dist/chunks/studio-q7rtx6zq.js +14 -0
  115. package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
  116. package/dist/chunks/studio-qmn1xc24.js +5 -0
  117. package/dist/chunks/studio-qwdqwkj0.js +5 -0
  118. package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
  119. package/dist/chunks/studio-rj9eamf8.js +5 -0
  120. package/dist/chunks/studio-rptgsk96.js +5 -0
  121. package/dist/chunks/studio-rthyg42z.js +928 -0
  122. package/dist/chunks/studio-s19tp1xr.js +5 -0
  123. package/dist/chunks/studio-s32578pn.js +5 -0
  124. package/dist/chunks/studio-svb7yyve.js +5 -0
  125. package/dist/chunks/studio-syreb644.js +5 -0
  126. package/dist/chunks/studio-tf9jryb1.js +10 -0
  127. package/dist/chunks/studio-tfkznv39.js +5 -0
  128. package/dist/chunks/studio-tft6r105.js +5 -0
  129. package/dist/chunks/studio-txf2kysx.js +5 -0
  130. package/dist/chunks/studio-v8867ddv.js +12 -0
  131. package/dist/chunks/studio-vxq7fcvv.js +5 -0
  132. package/dist/chunks/studio-w4rz9hdk.js +5 -0
  133. package/dist/chunks/studio-wbcjbhy1.js +9 -0
  134. package/dist/chunks/studio-wc649wss.js +5 -0
  135. package/dist/chunks/studio-wys23mxz.js +5 -0
  136. package/dist/chunks/studio-x1x167jh.js +5 -0
  137. package/dist/chunks/studio-x9hsze61.js +5 -0
  138. package/dist/chunks/studio-y0n7yxea.js +9 -0
  139. package/dist/chunks/studio-y3ahhdpx.js +5 -0
  140. package/dist/chunks/studio-z97c48fk.js +5 -0
  141. package/dist/chunks/studio-zat62m0c.js +5 -0
  142. package/dist/chunks/studio-zcd2e7yz.js +5 -0
  143. package/dist/chunks/studio-zz9qe3rw.js +64 -0
  144. package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
  145. package/dist/chunks/tabs-f5cw3tgp.js +4 -0
  146. package/dist/chunks/textfield-wewc8rq2.js +4 -0
  147. package/dist/chunks/toast-1gv0h53h.js +4 -0
  148. package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
  149. package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
  150. package/dist/chunks/tooltip-yypz28gq.js +4 -0
  151. package/dist/chunks/tree-9xa4hm7n.js +4 -0
  152. package/dist/chunks/tsMode-epyfz1hv.js +14 -0
  153. package/dist/chunks/workspace-dz7nxfhv.js +4 -0
  154. package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
  155. package/dist/chunks/ws-client-bv552sfx.js +4 -0
  156. package/dist/iframe-entry.js +20 -16
  157. package/dist/manifest.json +77 -63
  158. package/dist/studio.js +106 -107
  159. package/dist/workers/ts.worker.js +3 -3
  160. package/package.json +17 -16
  161. package/src/about/about-modal.ts +4 -3
  162. package/src/account/action-flow.ts +45 -38
  163. package/src/account-status.ts +7 -2
  164. package/src/browse/component-examples.ts +272 -0
  165. package/src/browse/library-commands.ts +64 -104
  166. package/src/browse/library-layouts.ts +270 -53
  167. package/src/browse/library-model.ts +194 -134
  168. package/src/browse/library-pane.ts +748 -440
  169. package/src/browse/library-preview.ts +161 -26
  170. package/src/browse/library-source.ts +308 -41
  171. package/src/browse/preview-root.ts +78 -0
  172. package/src/browse/preview-style.ts +155 -0
  173. package/src/canvas/asset-refs.ts +40 -10
  174. package/src/canvas/asset-resolve.ts +19 -23
  175. package/src/canvas/canvas-helpers.ts +7 -6
  176. package/src/canvas/canvas-live-render.ts +260 -77
  177. package/src/canvas/canvas-origin.ts +37 -12
  178. package/src/canvas/canvas-page-context.ts +112 -0
  179. package/src/canvas/canvas-patcher.ts +30 -30
  180. package/src/canvas/canvas-perf.ts +11 -5
  181. package/src/canvas/canvas-render.ts +175 -148
  182. package/src/canvas/canvas-surface.ts +5 -3
  183. package/src/canvas/canvas-utils.ts +147 -61
  184. package/src/canvas/dialog-path.ts +9 -4
  185. package/src/canvas/dialog-state.ts +1 -2
  186. package/src/canvas/diff-marks.ts +9 -16
  187. package/src/canvas/diff-toolbar.ts +8 -7
  188. package/src/canvas/edit-width-drag.ts +4 -1
  189. package/src/canvas/edit-width.ts +1 -3
  190. package/src/canvas/iframe-channel.ts +27 -13
  191. package/src/canvas/iframe-drop.ts +120 -12
  192. package/src/canvas/iframe-editable-root.ts +29 -16
  193. package/src/canvas/iframe-entry.ts +104 -75
  194. package/src/canvas/iframe-eval.ts +73 -49
  195. package/src/canvas/iframe-host.ts +269 -158
  196. package/src/canvas/iframe-inline-edit.ts +49 -30
  197. package/src/canvas/iframe-insert.ts +5 -4
  198. package/src/canvas/iframe-interaction.ts +30 -25
  199. package/src/canvas/iframe-keys.ts +11 -0
  200. package/src/canvas/iframe-overlay.ts +1 -1
  201. package/src/canvas/iframe-patch.ts +25 -21
  202. package/src/canvas/iframe-position.ts +12 -6
  203. package/src/canvas/iframe-protocol.ts +36 -21
  204. package/src/canvas/iframe-render.ts +84 -35
  205. package/src/canvas/iframe-slash.ts +24 -11
  206. package/src/canvas/iframe-subtree.ts +10 -3
  207. package/src/canvas/npm-modules.ts +22 -0
  208. package/src/canvas/path-mapping.ts +19 -12
  209. package/src/canvas/popover-path.ts +7 -3
  210. package/src/canvas/popover-state.ts +1 -2
  211. package/src/canvas/preview-navigate.ts +16 -0
  212. package/src/canvas/repeater-sources.ts +200 -0
  213. package/src/canvas/serialize-scope.ts +13 -5
  214. package/src/canvas/stage-scrollbar.ts +7 -2
  215. package/src/canvas/surface-registry.ts +27 -3
  216. package/src/collab/collab-commands.ts +7 -2
  217. package/src/collab/collab-session.ts +84 -45
  218. package/src/collab/collab-state.ts +4 -3
  219. package/src/collab/monaco-binding.ts +16 -13
  220. package/src/collab/monaco-cursors.ts +5 -2
  221. package/src/commands/app-commands.ts +16 -6
  222. package/src/commands/budget.ts +13 -11
  223. package/src/commands/command-args.ts +103 -71
  224. package/src/commands/context.ts +55 -28
  225. package/src/commands/defaults.ts +69 -45
  226. package/src/commands/keymap.ts +56 -43
  227. package/src/commands/levels.ts +14 -8
  228. package/src/commands/live-context.ts +9 -7
  229. package/src/commands/reference.ts +2 -1
  230. package/src/commands/registry.ts +22 -11
  231. package/src/commands/run-reported.ts +15 -10
  232. package/src/component-props.ts +46 -30
  233. package/src/content/collection-match.ts +11 -9
  234. package/src/content/collection-pages.ts +412 -0
  235. package/src/content/content-collections.ts +270 -0
  236. package/src/content/draft-state.ts +4 -3
  237. package/src/content/entry-commands.ts +54 -62
  238. package/src/content/entry-editor.ts +137 -32
  239. package/src/content/entry-fields.ts +25 -8
  240. package/src/content/entry-inspector.ts +225 -0
  241. package/src/content/entry-model.ts +38 -15
  242. package/src/content/entry-open.ts +80 -0
  243. package/src/content/entry-summaries.ts +440 -0
  244. package/src/content/file-record-ids.ts +80 -0
  245. package/src/content/file-records.ts +125 -0
  246. package/src/content/page-summaries.ts +129 -0
  247. package/src/content/record-entry.ts +201 -0
  248. package/src/content/writing-banner.ts +177 -0
  249. package/src/create/add-new-commands.ts +185 -0
  250. package/src/create/add-new-flow.ts +1116 -0
  251. package/src/create/add-new.ts +1014 -0
  252. package/src/create/element-name.ts +121 -0
  253. package/src/editor/canvas-context-menu.ts +1 -2
  254. package/src/editor/canvas-slash-bridge.ts +3 -6
  255. package/src/editor/content-slice.ts +16 -14
  256. package/src/editor/context-menu.ts +35 -22
  257. package/src/editor/convert-targets.ts +30 -35
  258. package/src/editor/convert-to-component.ts +78 -48
  259. package/src/editor/convert-to-repeater.ts +34 -22
  260. package/src/editor/editable-tags.ts +17 -2
  261. package/src/editor/file-drop-action.ts +29 -22
  262. package/src/editor/inline-edit-apply.ts +79 -17
  263. package/src/editor/inline-edit.ts +76 -50
  264. package/src/editor/inline-format.ts +59 -56
  265. package/src/editor/inline-link.ts +40 -15
  266. package/src/editor/insert-component.ts +91 -0
  267. package/src/editor/insert-zone-action.ts +14 -5
  268. package/src/editor/merge-tags.ts +58 -19
  269. package/src/editor/repeater-scope.ts +39 -28
  270. package/src/editor/shortcuts.ts +76 -42
  271. package/src/editor/slash-menu.ts +52 -14
  272. package/src/files/asset-versions.ts +4 -4
  273. package/src/files/components.ts +89 -20
  274. package/src/files/elements.ts +5 -6
  275. package/src/files/file-ops.ts +92 -41
  276. package/src/files/files.ts +248 -239
  277. package/src/files/fs-events.ts +18 -7
  278. package/src/files/media-meta.ts +97 -2
  279. package/src/files/media-paths.ts +3 -0
  280. package/src/files/media-types.ts +55 -0
  281. package/src/files/media-upload.ts +209 -52
  282. package/src/files/new-file-name.ts +156 -0
  283. package/src/files/serialize-document.ts +15 -5
  284. package/src/format/constraints.ts +1 -1
  285. package/src/format/convert-file.ts +27 -13
  286. package/src/format/format-choices.ts +2 -1
  287. package/src/format/format-host.ts +91 -50
  288. package/src/github/github-auth-status.ts +27 -3
  289. package/src/github/github-auth.ts +21 -11
  290. package/src/github/github-publish.ts +28 -23
  291. package/src/grid/cell-editors.ts +46 -31
  292. package/src/grid/cell-popovers.ts +5 -3
  293. package/src/grid/edit-buffer.ts +10 -9
  294. package/src/grid/grid-controller.ts +25 -23
  295. package/src/grid/grid-layout.ts +21 -5
  296. package/src/grid/grid-open.ts +3 -33
  297. package/src/grid/grid-panel.ts +65 -6
  298. package/src/grid/grid-reveal.ts +34 -0
  299. package/src/grid/grid-source.ts +9 -31
  300. package/src/grid/grid-view.ts +45 -23
  301. package/src/grid/redirects-grid.ts +14 -5
  302. package/src/grid/redirects.ts +16 -14
  303. package/src/grid/schema-columns.ts +25 -19
  304. package/src/grid/sources/connector-source.ts +47 -20
  305. package/src/grid/sources/content-source.ts +100 -31
  306. package/src/grid/sources/csv-file-source.ts +2 -2
  307. package/src/grid/tabulator-tables.d.ts +61 -34
  308. package/src/hosting/document.ts +2 -2
  309. package/src/hosting/stage.ts +7 -7
  310. package/src/i18n/i18n-commands.ts +3 -3
  311. package/src/media/media-commands.ts +181 -0
  312. package/src/media/media-library-model.ts +232 -0
  313. package/src/media/media-library.ts +1283 -0
  314. package/src/media/media-pane.ts +51 -20
  315. package/src/new-project/add-repo-modal.ts +20 -19
  316. package/src/new-project/import-tab.ts +10 -14
  317. package/src/new-project/location-fields.ts +2 -1
  318. package/src/new-project/new-project-modal.ts +12 -9
  319. package/src/packages/jxsuite-update.ts +4 -3
  320. package/src/packages/pull-package-sync.ts +26 -25
  321. package/src/page-params.ts +97 -68
  322. package/src/panels/activity-panel.ts +38 -14
  323. package/src/panels/ai-chat/attached-context.ts +13 -7
  324. package/src/panels/ai-chat/chat-markdown.ts +8 -8
  325. package/src/panels/ai-chat/chat-view.ts +80 -73
  326. package/src/panels/ai-chat/composer.ts +30 -33
  327. package/src/panels/ai-chat/sessions-view.ts +1 -2
  328. package/src/panels/ai-panel.ts +23 -20
  329. package/src/panels/block-action-bar.ts +57 -46
  330. package/src/panels/bottom-dock.ts +5 -3
  331. package/src/panels/canvas-dnd-bridge.ts +36 -26
  332. package/src/panels/chat-panel.ts +6 -6
  333. package/src/panels/collections-panel.ts +306 -0
  334. package/src/panels/component-preview.ts +35 -13
  335. package/src/panels/data-explorer.ts +63 -26
  336. package/src/panels/data-grid.ts +18 -11
  337. package/src/panels/dnd.ts +115 -138
  338. package/src/panels/editors.ts +52 -21
  339. package/src/panels/elements-panel.ts +19 -5
  340. package/src/panels/empty-state.ts +2 -2
  341. package/src/panels/events-panel.ts +84 -69
  342. package/src/panels/formula-workspace.ts +78 -54
  343. package/src/panels/frontmatter-fields.ts +33 -28
  344. package/src/panels/git-diff-open.ts +10 -6
  345. package/src/panels/head-panel.ts +488 -202
  346. package/src/panels/i18n-panel.ts +20 -12
  347. package/src/panels/imports-panel.ts +25 -47
  348. package/src/panels/jump-bar.ts +75 -31
  349. package/src/panels/layers-panel.ts +130 -101
  350. package/src/panels/left-panel.ts +25 -11
  351. package/src/panels/navigator-panels.ts +23 -11
  352. package/src/panels/pane-context.ts +140 -49
  353. package/src/panels/pane-grid.ts +55 -26
  354. package/src/panels/panel-registry.ts +36 -46
  355. package/src/panels/properties-panel.ts +182 -124
  356. package/src/panels/quick-search.ts +53 -31
  357. package/src/panels/right-panel.ts +201 -45
  358. package/src/panels/seo-modal.ts +54 -125
  359. package/src/panels/settings-menu.ts +63 -61
  360. package/src/panels/settings-pane.ts +268 -162
  361. package/src/panels/signals-panel.ts +156 -135
  362. package/src/panels/site-model.ts +367 -0
  363. package/src/panels/site-panel.ts +638 -0
  364. package/src/panels/statement-editor.ts +230 -140
  365. package/src/panels/style-panel.ts +253 -206
  366. package/src/panels/style-utils.ts +114 -51
  367. package/src/panels/stylebook-doc.ts +195 -60
  368. package/src/panels/stylebook-layers-panel.ts +48 -89
  369. package/src/panels/stylebook-panel.ts +60 -27
  370. package/src/panels/styles-panel.ts +327 -0
  371. package/src/panels/tab-drop.ts +27 -11
  372. package/src/panels/tab-strip.ts +143 -49
  373. package/src/platform-errors.ts +57 -43
  374. package/src/platform.ts +59 -31
  375. package/src/platforms/cloud.ts +373 -176
  376. package/src/platforms/default-platform.ts +14 -8
  377. package/src/platforms/devserver.ts +180 -142
  378. package/src/platforms/read-batcher.ts +16 -8
  379. package/src/project-list.ts +2 -1
  380. package/src/publish/deploy-checklist.ts +20 -9
  381. package/src/publish/pages-service.ts +66 -27
  382. package/src/publish/publish-changes.ts +491 -0
  383. package/src/publish/publish-commands.ts +88 -22
  384. package/src/publish/publish-ids.ts +49 -0
  385. package/src/publish/publish-panel.ts +10 -6
  386. package/src/publish/publish-quick.ts +148 -0
  387. package/src/publish/publish-workspace.ts +926 -0
  388. package/src/publish/source-control.ts +907 -0
  389. package/src/recent-projects.ts +15 -8
  390. package/src/resize-edges.ts +26 -36
  391. package/src/services/a11y-report.ts +26 -19
  392. package/src/services/agent-seed.ts +23 -11
  393. package/src/services/ai-ask.ts +9 -12
  394. package/src/services/ai-command-tools.ts +68 -62
  395. package/src/services/ai-import-tools.ts +80 -67
  396. package/src/services/ai-models.ts +17 -13
  397. package/src/services/ai-project-tools.ts +68 -32
  398. package/src/services/ai-session-store.ts +19 -10
  399. package/src/services/ai-system-prompt.ts +46 -20
  400. package/src/services/ai-tools.ts +71 -27
  401. package/src/services/ai-write-report.ts +20 -12
  402. package/src/services/ai-writes.ts +4 -4
  403. package/src/services/automation.ts +74 -51
  404. package/src/services/cem-export.ts +149 -58
  405. package/src/services/cf-settings.ts +4 -4
  406. package/src/services/clock.ts +6 -1
  407. package/src/services/code-services.ts +37 -31
  408. package/src/services/connection.ts +2 -2
  409. package/src/services/context-manager.ts +14 -10
  410. package/src/services/context-resolver.ts +20 -8
  411. package/src/services/data-service.ts +19 -15
  412. package/src/services/directory-picker.ts +20 -14
  413. package/src/services/document-assistant.ts +39 -19
  414. package/src/services/gated-registry.ts +10 -6
  415. package/src/services/harness/chat-reducer.ts +23 -1
  416. package/src/services/import-client.ts +91 -38
  417. package/src/services/import-seed.ts +8 -2
  418. package/src/services/jx-validate.ts +28 -31
  419. package/src/services/live-preview.ts +0 -0
  420. package/src/services/live-surfaces.ts +6 -3
  421. package/src/services/model-uri.ts +10 -2
  422. package/src/services/module-preloads.ts +12 -8
  423. package/src/services/monaco-buffer.ts +43 -24
  424. package/src/services/monaco-lazy.ts +7 -8
  425. package/src/services/monaco-setup.ts +23 -16
  426. package/src/services/notify.ts +44 -17
  427. package/src/services/popover-report.ts +25 -10
  428. package/src/services/preview-eval.ts +20 -8
  429. package/src/services/profile.ts +13 -6
  430. package/src/services/project-path.ts +13 -10
  431. package/src/services/references.ts +0 -0
  432. package/src/services/render-critic.ts +29 -9
  433. package/src/services/settings/definitions.ts +25 -14
  434. package/src/services/settings/kernel.ts +13 -4
  435. package/src/services/settings/write-queue.ts +9 -9
  436. package/src/services/token-lint.ts +12 -10
  437. package/src/services/tool-executor.ts +17 -5
  438. package/src/services/tool-outcomes.ts +44 -24
  439. package/src/services/trusted-types.ts +24 -7
  440. package/src/settings/contexts-section.ts +11 -8
  441. package/src/settings/contributed-section.ts +128 -70
  442. package/src/settings/css-vars-editor.ts +119 -32
  443. package/src/settings/defs-editor.ts +38 -35
  444. package/src/settings/developer-panels.ts +43 -0
  445. package/src/settings/extension-rows.ts +16 -8
  446. package/src/settings/extension-sections.ts +42 -14
  447. package/src/settings/extensions-section.ts +4 -1
  448. package/src/settings/general-settings.ts +101 -28
  449. package/src/settings/locales-section.ts +20 -12
  450. package/src/settings/preferences-dialog.ts +17 -7
  451. package/src/settings/preferences-keymap.ts +7 -5
  452. package/src/settings/preferences-sections.ts +11 -5
  453. package/src/settings/project-sections.ts +28 -11
  454. package/src/settings/schema-field-ui.ts +12 -1
  455. package/src/settings/section-registry.ts +116 -11
  456. package/src/settings/settings-dialog.ts +192 -0
  457. package/src/settings/settings-document.ts +186 -166
  458. package/src/shell/tree.ts +6 -5
  459. package/src/shell.ts +536 -477
  460. package/src/site-context.ts +101 -32
  461. package/src/state.ts +68 -57
  462. package/src/store.ts +54 -34
  463. package/src/studio.ts +219 -116
  464. package/src/style/live-preview.ts +1 -1
  465. package/src/style/project-styles.ts +40 -7
  466. package/src/style/stylebook-specimens.ts +89 -0
  467. package/src/style/stylebook-target.ts +26 -0
  468. package/src/style/tag-inheritance.ts +105 -0
  469. package/src/style/token-ref.ts +5 -4
  470. package/src/style/variables-focus.ts +61 -0
  471. package/src/style/variables-view.ts +235 -0
  472. package/src/surfaces/about.ts +18 -19
  473. package/src/surfaces/add-new.json +1482 -0
  474. package/src/surfaces/add-new.ts +325 -0
  475. package/src/surfaces/add-repo.ts +17 -19
  476. package/src/surfaces/ai-chat.ts +33 -38
  477. package/src/surfaces/ai-credentials-form.ts +6 -16
  478. package/src/surfaces/ai-managed-connect.ts +3 -4
  479. package/src/surfaces/ai-model-picker.ts +3 -5
  480. package/src/surfaces/block-action-bar.ts +22 -11
  481. package/src/surfaces/boot-failure.json +4 -3
  482. package/src/surfaces/boot-failure.ts +4 -5
  483. package/src/surfaces/bottom-dock.json +1 -1
  484. package/src/surfaces/bottom-dock.ts +9 -18
  485. package/src/surfaces/canvas-stage.json +30 -19
  486. package/src/surfaces/canvas-stage.ts +17 -16
  487. package/src/surfaces/cf-account-picker.ts +17 -18
  488. package/src/surfaces/collections-panel.json +615 -0
  489. package/src/surfaces/collections-panel.ts +168 -0
  490. package/src/surfaces/commandbar.json +241 -96
  491. package/src/surfaces/commandbar.ts +145 -105
  492. package/src/surfaces/convert-repeater.ts +17 -19
  493. package/src/surfaces/data-actions.ts +9 -7
  494. package/src/surfaces/dialog.ts +26 -28
  495. package/src/surfaces/diff-toolbar.ts +9 -7
  496. package/src/surfaces/empty-state.json +1 -1
  497. package/src/surfaces/empty-state.ts +7 -10
  498. package/src/surfaces/entry-editor.json +136 -0
  499. package/src/surfaces/entry-editor.ts +35 -11
  500. package/src/surfaces/entry-inspector.json +371 -0
  501. package/src/surfaces/entry-inspector.ts +143 -0
  502. package/src/surfaces/expression-editor.ts +11 -25
  503. package/src/surfaces/files-panel.ts +27 -14
  504. package/src/surfaces/formula-palette.ts +4 -5
  505. package/src/surfaces/github-auth.ts +16 -20
  506. package/src/surfaces/github-publish.ts +17 -22
  507. package/src/surfaces/grid-cell.ts +30 -31
  508. package/src/surfaces/grid-open.ts +10 -14
  509. package/src/surfaces/grid-panel.ts +13 -9
  510. package/src/surfaces/grid-replace.ts +13 -13
  511. package/src/surfaces/grid-views.ts +15 -18
  512. package/src/surfaces/inspector-dock.json +162 -14
  513. package/src/surfaces/inspector-dock.ts +59 -31
  514. package/src/surfaces/jump-bar.ts +5 -6
  515. package/src/surfaces/jxsuite-update.ts +16 -22
  516. package/src/surfaces/library-pane.json +670 -437
  517. package/src/surfaces/library-pane.ts +111 -77
  518. package/src/surfaces/logic-panel.ts +17 -30
  519. package/src/surfaces/logic-workspace.ts +13 -15
  520. package/src/surfaces/media-browser.json +62 -6
  521. package/src/surfaces/media-browser.ts +26 -11
  522. package/src/surfaces/media-field.json +1 -1
  523. package/src/surfaces/media-field.ts +4 -5
  524. package/src/surfaces/media-library.json +1586 -0
  525. package/src/surfaces/media-library.ts +282 -0
  526. package/src/surfaces/media-pane.ts +8 -7
  527. package/src/surfaces/media-pick-dialog.json +71 -0
  528. package/src/surfaces/media-pick-dialog.ts +132 -0
  529. package/src/surfaces/menu.ts +47 -23
  530. package/src/surfaces/navigator-dock.ts +11 -12
  531. package/src/surfaces/new-project.ts +27 -26
  532. package/src/surfaces/pane-context.json +144 -77
  533. package/src/surfaces/pane-context.ts +44 -25
  534. package/src/surfaces/pane-grid.ts +15 -10
  535. package/src/surfaces/panel-activity.ts +5 -6
  536. package/src/surfaces/panel-data.ts +3 -4
  537. package/src/surfaces/panel-deploy-checklist.json +12 -6
  538. package/src/surfaces/panel-deploy-checklist.ts +8 -7
  539. package/src/surfaces/panel-elements.ts +5 -7
  540. package/src/surfaces/panel-i18n.ts +5 -7
  541. package/src/surfaces/panel-imports.ts +6 -13
  542. package/src/surfaces/panel-outline.ts +25 -19
  543. package/src/surfaces/panel-page.json +72 -2
  544. package/src/surfaces/panel-page.ts +49 -25
  545. package/src/surfaces/panel-problems.ts +5 -7
  546. package/src/surfaces/panel-signals.json +1 -1
  547. package/src/surfaces/panel-signals.ts +25 -39
  548. package/src/surfaces/panel-stylebook-layers.json +71 -204
  549. package/src/surfaces/panel-stylebook-layers.ts +5 -29
  550. package/src/surfaces/preferences.json +120 -48
  551. package/src/surfaces/preferences.ts +29 -11
  552. package/src/surfaces/progress-modal.ts +15 -9
  553. package/src/surfaces/properties-panel.json +1 -1
  554. package/src/surfaces/properties-panel.ts +20 -42
  555. package/src/surfaces/publish-quick.json +428 -0
  556. package/src/surfaces/publish-quick.ts +165 -0
  557. package/src/surfaces/publish-workspace.json +2892 -0
  558. package/src/surfaces/publish-workspace.ts +391 -0
  559. package/src/surfaces/publish.ts +18 -18
  560. package/src/surfaces/push-plan.ts +7 -8
  561. package/src/surfaces/rail.json +1 -159
  562. package/src/surfaces/rail.ts +22 -79
  563. package/src/surfaces/reference-field.ts +11 -15
  564. package/src/surfaces/schema-builder.ts +16 -22
  565. package/src/surfaces/schema-form.json +10 -2
  566. package/src/surfaces/schema-form.ts +17 -25
  567. package/src/surfaces/secret-field.ts +9 -6
  568. package/src/surfaces/seo.json +1 -1
  569. package/src/surfaces/seo.ts +21 -15
  570. package/src/surfaces/settings-contexts.ts +9 -7
  571. package/src/surfaces/settings-contributed.json +5 -5
  572. package/src/surfaces/settings-contributed.ts +32 -12
  573. package/src/surfaces/settings-css-vars.json +44 -36
  574. package/src/surfaces/settings-css-vars.ts +82 -16
  575. package/src/surfaces/settings-defs.json +2 -2
  576. package/src/surfaces/settings-defs.ts +17 -21
  577. package/src/surfaces/settings-deploy.json +2 -15
  578. package/src/surfaces/settings-deploy.ts +9 -16
  579. package/src/surfaces/settings-dialog.json +51 -0
  580. package/src/surfaces/settings-dialog.ts +169 -0
  581. package/src/surfaces/settings-extensions.ts +5 -6
  582. package/src/surfaces/settings-head.ts +33 -39
  583. package/src/surfaces/settings-locales.ts +8 -20
  584. package/src/surfaces/settings-overview.json +3 -3
  585. package/src/surfaces/settings-overview.ts +14 -8
  586. package/src/surfaces/settings-packages.ts +8 -7
  587. package/src/surfaces/settings-pane.json +269 -46
  588. package/src/surfaces/settings-pane.ts +88 -36
  589. package/src/surfaces/settings-rawjson.ts +5 -6
  590. package/src/surfaces/shell.json +2 -1
  591. package/src/surfaces/shell.ts +1 -2
  592. package/src/surfaces/site-panel.json +1029 -0
  593. package/src/surfaces/site-panel.ts +233 -0
  594. package/src/surfaces/slash-menu.json +63 -21
  595. package/src/surfaces/slash-menu.ts +42 -9
  596. package/src/surfaces/statements.ts +13 -18
  597. package/src/surfaces/statusbar.ts +56 -29
  598. package/src/surfaces/style-panel.ts +18 -31
  599. package/src/surfaces/stylebook-chrome.ts +3 -5
  600. package/src/surfaces/styles-panel.json +735 -0
  601. package/src/surfaces/styles-panel.ts +195 -0
  602. package/src/surfaces/styles-variables.json +149 -0
  603. package/src/surfaces/styles-variables.ts +145 -0
  604. package/src/surfaces/tab-strip.json +4 -4
  605. package/src/surfaces/tab-strip.ts +14 -13
  606. package/src/surfaces/target-line.ts +6 -7
  607. package/src/surfaces/welcome.ts +6 -8
  608. package/src/surfaces/writing-banner.json +94 -0
  609. package/src/surfaces/writing-banner.ts +80 -0
  610. package/src/tabs/bare-repeaters.ts +101 -0
  611. package/src/tabs/patch-ops.ts +4 -3
  612. package/src/tabs/project-config.ts +32 -21
  613. package/src/tabs/selection.ts +36 -8
  614. package/src/tabs/tab.ts +99 -48
  615. package/src/tabs/transact.ts +98 -53
  616. package/src/types.ts +53 -43
  617. package/src/ui/ai-credentials-form.ts +10 -13
  618. package/src/ui/ai-model-picker.ts +3 -3
  619. package/src/ui/cf-account-picker.ts +7 -9
  620. package/src/ui/color-selector.ts +9 -5
  621. package/src/ui/dynamic-slot.ts +7 -8
  622. package/src/ui/expression-editor.ts +112 -105
  623. package/src/ui/form-controls.ts +104 -56
  624. package/src/ui/formula-catalog.ts +239 -230
  625. package/src/ui/formula-chips.ts +33 -18
  626. package/src/ui/layers.ts +57 -31
  627. package/src/ui/media-picker.ts +300 -47
  628. package/src/ui/popover-surface.ts +20 -12
  629. package/src/ui/progress-modal.ts +13 -8
  630. package/src/ui/regions.ts +14 -12
  631. package/src/ui/schema-form.ts +372 -97
  632. package/src/ui/surface.ts +71 -8
  633. package/src/ui/timing.ts +9 -0
  634. package/src/ui/value-source.ts +44 -31
  635. package/src/ui/virtual-window.ts +29 -3
  636. package/src/utils/base64.ts +6 -4
  637. package/src/utils/edit-display.ts +366 -111
  638. package/src/utils/element-selectors.ts +3 -2
  639. package/src/utils/google-fonts.ts +15 -14
  640. package/src/utils/inherited-style.ts +18 -20
  641. package/src/utils/link-target.ts +1 -1
  642. package/src/utils/local-day.ts +18 -0
  643. package/src/utils/preview-format.ts +25 -3
  644. package/src/utils/strip-events.ts +49 -22
  645. package/src/utils/studio-utils.ts +29 -14
  646. package/src/view.ts +2 -3
  647. package/src/workspace/pane-derive.ts +14 -16
  648. package/src/workspace/session.ts +81 -50
  649. package/src/workspace/tab-workspace.ts +137 -0
  650. package/src/workspace/workspace-back.ts +189 -0
  651. package/src/workspace/workspace-home.ts +133 -0
  652. package/src/workspace/workspace-ids.ts +129 -0
  653. package/src/workspace/workspace-switch.ts +372 -0
  654. package/src/workspace/workspace.ts +165 -47
  655. package/styles/shell-frame.css +30 -7
  656. package/styles/shell-frame.json +15 -3
  657. package/dist/chunks/2020-va2wwra4.js +0 -4
  658. package/dist/chunks/adapter-f93pafd7.js +0 -4
  659. package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
  660. package/dist/chunks/cf-settings-125tdm0w.js +0 -4
  661. package/dist/chunks/color-area-jqhna8zy.js +0 -4
  662. package/dist/chunks/color-field-embq5ctg.js +0 -4
  663. package/dist/chunks/color-fpezvnkt.js +0 -4
  664. package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
  665. package/dist/chunks/combobox-773hdzyj.js +0 -4
  666. package/dist/chunks/components-ax2f1fnn.js +0 -4
  667. package/dist/chunks/content-source-108aqtk1.js +0 -4
  668. package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
  669. package/dist/chunks/dialog-mtm9fq5t.js +0 -4
  670. package/dist/chunks/editor-pfgdmkb0.js +0 -4
  671. package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
  672. package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
  673. package/dist/chunks/file-ops-meej5mqf.js +0 -4
  674. package/dist/chunks/files-44vp8a2s.js +0 -4
  675. package/dist/chunks/format-host-7q1petb9.js +0 -4
  676. package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
  677. package/dist/chunks/git-panel-zngbymvd.js +0 -4
  678. package/dist/chunks/grid-view-sx9vynsp.js +0 -51
  679. package/dist/chunks/icons-p44xhjf0.js +0 -4
  680. package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
  681. package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
  682. package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
  683. package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
  684. package/dist/chunks/index-wkyfjeqz.js +0 -4
  685. package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
  686. package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
  687. package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
  688. package/dist/chunks/layers-xd92fg8d.js +0 -4
  689. package/dist/chunks/listbox-s8fkmnq8.js +0 -4
  690. package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
  691. package/dist/chunks/media-picker-0svzkdyb.js +0 -4
  692. package/dist/chunks/menu-37d07z9m.js +0 -4
  693. package/dist/chunks/menu-5c55ea3d.js +0 -4
  694. package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
  695. package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
  696. package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
  697. package/dist/chunks/notify-0xgtn8q1.js +0 -4
  698. package/dist/chunks/number-field-gw7sq8rn.js +0 -4
  699. package/dist/chunks/parse-897fvqah.js +0 -4
  700. package/dist/chunks/platform-v1qctbe6.js +0 -4
  701. package/dist/chunks/popover-8htra4er.js +0 -4
  702. package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
  703. package/dist/chunks/quick-search-a54e6t5n.js +0 -4
  704. package/dist/chunks/references-gmqp82fs.js +0 -4
  705. package/dist/chunks/right-panel-v7t9awbk.js +0 -4
  706. package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
  707. package/dist/chunks/select-n3v7gwas.js +0 -4
  708. package/dist/chunks/split-pff8f3ze.js +0 -4
  709. package/dist/chunks/studio-0bhx5hz6.js +0 -5
  710. package/dist/chunks/studio-0k1ddnyy.js +0 -6
  711. package/dist/chunks/studio-1b04pd0j.js +0 -64
  712. package/dist/chunks/studio-4dwbj6gb.js +0 -5
  713. package/dist/chunks/studio-4tanh828.js +0 -5
  714. package/dist/chunks/studio-55h4mstj.js +0 -4
  715. package/dist/chunks/studio-5tnvjkz4.js +0 -5
  716. package/dist/chunks/studio-60dqgb0c.js +0 -5
  717. package/dist/chunks/studio-61dp09qg.js +0 -9
  718. package/dist/chunks/studio-63epcrj2.js +0 -5
  719. package/dist/chunks/studio-74k29dy9.js +0 -5
  720. package/dist/chunks/studio-7vg6jcd3.js +0 -5
  721. package/dist/chunks/studio-7zx31knw.js +0 -9
  722. package/dist/chunks/studio-8bxk97km.js +0 -5
  723. package/dist/chunks/studio-933e30n4.js +0 -5
  724. package/dist/chunks/studio-98wnwhbg.js +0 -5
  725. package/dist/chunks/studio-9mccjwjh.js +0 -14
  726. package/dist/chunks/studio-a2ke1e4t.js +0 -5
  727. package/dist/chunks/studio-e3a2a6v3.js +0 -4
  728. package/dist/chunks/studio-e81q1vb9.js +0 -5
  729. package/dist/chunks/studio-epgrmqqm.js +0 -5
  730. package/dist/chunks/studio-ery42sqr.js +0 -4
  731. package/dist/chunks/studio-g1shz58g.js +0 -5
  732. package/dist/chunks/studio-gf0fz03c.js +0 -5
  733. package/dist/chunks/studio-gjtpe62q.js +0 -6
  734. package/dist/chunks/studio-gkskhg7m.js +0 -5
  735. package/dist/chunks/studio-gx4dnjzd.js +0 -5
  736. package/dist/chunks/studio-j03zga3y.js +0 -9
  737. package/dist/chunks/studio-jhpxeckz.js +0 -5
  738. package/dist/chunks/studio-k01r7ykp.js +0 -5
  739. package/dist/chunks/studio-kk7h30ne.js +0 -7
  740. package/dist/chunks/studio-kt1zqney.js +0 -5
  741. package/dist/chunks/studio-m3cwhvye.js +0 -5
  742. package/dist/chunks/studio-mcayt6hz.js +0 -5
  743. package/dist/chunks/studio-myjcghv3.js +0 -5
  744. package/dist/chunks/studio-n8bxwc3y.js +0 -4
  745. package/dist/chunks/studio-ngm8gvpb.js +0 -5
  746. package/dist/chunks/studio-nj5a01jy.js +0 -928
  747. package/dist/chunks/studio-pcgz8heb.js +0 -5
  748. package/dist/chunks/studio-qcsq0t15.js +0 -5
  749. package/dist/chunks/studio-qkstvve9.js +0 -5
  750. package/dist/chunks/studio-qv1pwd3c.js +0 -5
  751. package/dist/chunks/studio-rc6dvxjb.js +0 -7
  752. package/dist/chunks/studio-s8dmmz66.js +0 -5
  753. package/dist/chunks/studio-sp5xzbj4.js +0 -6
  754. package/dist/chunks/studio-szsjbj0g.js +0 -5
  755. package/dist/chunks/studio-t1xzawhr.js +0 -16
  756. package/dist/chunks/studio-tdcprbqb.js +0 -5
  757. package/dist/chunks/studio-vrmcjf9g.js +0 -7
  758. package/dist/chunks/studio-vyc0b4he.js +0 -10
  759. package/dist/chunks/studio-w0cgf6jg.js +0 -5
  760. package/dist/chunks/studio-w3hskzqk.js +0 -5
  761. package/dist/chunks/studio-xgrgcdyh.js +0 -9
  762. package/dist/chunks/studio-xz2yxfcb.js +0 -5
  763. package/dist/chunks/studio-y6n42tgs.js +0 -5
  764. package/dist/chunks/studio-yb560vxr.js +0 -5
  765. package/dist/chunks/studio-yn9f8vtx.js +0 -5
  766. package/dist/chunks/studio-yw05w8f0.js +0 -7
  767. package/dist/chunks/studio-z16sgavc.js +0 -5
  768. package/dist/chunks/studio-zey7zsdw.js +0 -12
  769. package/dist/chunks/studio-zyqn40w4.js +0 -5
  770. package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
  771. package/dist/chunks/tabs-jwthg40w.js +0 -4
  772. package/dist/chunks/textfield-spy3hc77.js +0 -4
  773. package/dist/chunks/toast-4d35zd64.js +0 -4
  774. package/dist/chunks/toast-host-8sjmfed3.js +0 -4
  775. package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
  776. package/dist/chunks/tree-h19v1jfz.js +0 -4
  777. package/dist/chunks/tsMode-2frah6h1.js +0 -14
  778. package/dist/chunks/workspace-zt81g1ms.js +0 -4
  779. package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
  780. package/src/panels/frontmatter-panel.ts +0 -701
  781. package/src/panels/git-panel.ts +0 -1120
  782. package/src/surfaces/doc-header.json +0 -776
  783. package/src/surfaces/doc-header.ts +0 -231
  784. package/src/surfaces/git-panel.json +0 -1880
  785. package/src/surfaces/git-panel.ts +0 -272
@@ -7,11 +7,13 @@
7
7
 
8
8
  import { postMessageChannel } from "./iframe-channel";
9
9
  import { rectOf } from "../utils/geometry";
10
- import { displayTagName } from "@jxsuite/schema/guards";
10
+ import { displayTagName, isNonNullObject } from "@jxsuite/schema/guards";
11
11
  import {
12
12
  applyCanvasDialogOpen,
13
13
  applyCanvasPopoverOpen,
14
14
  applyPreviewColorScheme,
15
+ applyPreviewLocale,
16
+ captureLocaleBaseline,
15
17
  applySiteStyle,
16
18
  installCanvasImageRetry,
17
19
  renderResolvedDocument,
@@ -54,21 +56,24 @@ import {
54
56
  redefineElement,
55
57
  resetDocumentStyles,
56
58
  setCanvasAssetResolver,
59
+ setNpmModuleResolver,
57
60
  setResolveToken,
58
61
  } from "@jxsuite/runtime";
59
62
  import { resolveAssetRef } from "./asset-resolve";
63
+ import { npmModuleUrl } from "./npm-modules";
60
64
  import type { AssetContext } from "./asset-resolve";
61
65
  import { KIT_LOADERS } from "@jxsuite/ui/loaders";
62
- import type { IframeChannel } from "./iframe-channel";
66
+ import type { CanvasEnvelope, IframeChannel } from "./iframe-channel";
63
67
  import type {
64
68
  CanvasMode,
69
+ DragOverMsg,
65
70
  DragSrcKind,
66
71
  FileDropHit,
67
72
  IframeToParent,
68
73
  LayoutHit,
69
74
  ParentToIframe,
70
75
  } from "./iframe-protocol";
71
- import type { JxDocument, JxMutableNode, JxStyle } from "@jxsuite/schema/types";
76
+ import type { JxDocument, JxMutableNode } from "@jxsuite/schema/types";
72
77
  import type { IframeRenderCtx, RenderHandle } from "./iframe-render";
73
78
  import { setBundleBase } from "../services/bundle-base";
74
79
 
@@ -91,6 +96,14 @@ for (const [specifier, load] of Object.entries(KIT_LOADERS)) {
91
96
  preloadModule(specifier, load);
92
97
  }
93
98
 
99
+ /*
100
+ * A document's `npm:` sidecar, from the package the project installed. The build bundles one
101
+ * (`compiler/src/site/bundler.ts`); this frame asks the dev server, which bundles
102
+ * `/node_modules/<package>/<subpath>` on demand through the package's own `exports`, the URL space
103
+ * `registerElements` already imports a bare `$elements` specifier from.
104
+ */
105
+ setNpmModuleResolver((specifier) => npmModuleUrl(specifier, location.href));
106
+
94
107
  /**
95
108
  * Resolve the drop placement for a forwarded cursor: point hit-test → nearest `[data-jx-path]` →
96
109
  * pure {@link computeDropInstruction}. Returns null when the cursor resolves to no droppable target.
@@ -153,12 +166,12 @@ export function fileDropHitFor(
153
166
  targetEl: HTMLElement,
154
167
  shadowDoc: JxMutableNode | null,
155
168
  ): FileDropHit | null {
156
- const serialized = targetEl.dataset?.jxPath;
169
+ const serialized = targetEl.dataset.jxPath;
157
170
  if (serialized == null) {
158
171
  return null;
159
172
  }
160
173
  const path = parseJxPath(serialized);
161
- const node = shadowDoc ? (getNodeAtPath(shadowDoc, path as JxPath) as JxMutableNode) : undefined;
174
+ const node = shadowDoc ? getNodeAtPath(shadowDoc, path) : undefined;
162
175
  return {
163
176
  path,
164
177
  rect: rectFor(targetEl),
@@ -186,7 +199,8 @@ export function layoutHitFor(target: EventTarget | null): LayoutHit | null {
186
199
  return null;
187
200
  }
188
201
  return {
189
- className: typeof el.className === "string" ? el.className : "",
202
+ // An `HTMLElement`'s `className` is always the string form (only SVG's is an animated value).
203
+ className: el.className,
190
204
  layoutFile: el.dataset.jxLayoutFile ?? "",
191
205
  layoutPath: parseJxPath(el.dataset.jxLayoutPath ?? "[]"),
192
206
  rect: rectFor(el),
@@ -194,6 +208,34 @@ export function layoutHitFor(target: EventTarget | null): LayoutHit | null {
194
208
  };
195
209
  }
196
210
 
211
+ /**
212
+ * The text a failed patch or render reports: the thrown value's `message` when it has one, the
213
+ * value itself otherwise.
214
+ */
215
+ function failureText(cause: unknown): string {
216
+ const message = isNonNullObject(cause) && "message" in cause ? cause.message : undefined;
217
+ return String(message ?? cause);
218
+ }
219
+
220
+ /** The edge-hold auto-scroll loop's last cursor, and the drag it belongs to. */
221
+ interface AutoScrollCursor {
222
+ x: number;
223
+ y: number;
224
+ dragSeq: number;
225
+ withCursor: boolean;
226
+ src?: DragSrcKind;
227
+ gen?: number;
228
+ }
229
+
230
+ /**
231
+ * The two document APIs the `idle` sample reads, as a frame may or may not provide them. lib.dom
232
+ * declares both unconditionally; happy-dom implements neither.
233
+ */
234
+ interface IdleProbeDocument {
235
+ getAnimations?: Document["getAnimations"];
236
+ fonts?: FontFaceSet;
237
+ }
238
+
197
239
  /** Set-key keys the patcher applies IN PLACE (never a subtree re-render) — safe under a live edit. */
198
240
  const IN_PLACE_KEYS = new Set(["style", "textContent"]);
199
241
 
@@ -270,6 +312,8 @@ export function startCanvasIframe(opts: {
270
312
  // Alongside the handle so a superseded render's refs can't keep posting.
271
313
  let stopDataScopeWatch: (() => void) | null = null;
272
314
  let latestGen = -1;
315
+ // The root's language as the frame booted it, which a render with no language goes back to.
316
+ const localeBaseline = captureLocaleBaseline(container.ownerDocument);
273
317
  // The raw page doc the current DOM was rendered from — the patch source-of-truth. `renderedGen`
274
318
  // Tracks which generation it (and the DOM) reflect, so patches for an in-flight/superseded render
275
319
  // Are handled correctly rather than applied against the wrong tree.
@@ -317,14 +361,7 @@ export function startCanvasIframe(opts: {
317
361
  // (the parent has no pointer of its own then). Parent-driven flows (1/2/4) leave `src` undefined
318
362
  // And `withCursor` false — the tick falls back to `dragSrc`/`dragGen` and the parent moves the
319
363
  // Ghost from its own raw pointer.
320
- let autoScrollCursor: {
321
- x: number;
322
- y: number;
323
- dragSeq: number;
324
- withCursor: boolean;
325
- src?: DragSrcKind;
326
- gen?: number;
327
- } | null = null;
364
+ let autoScrollCursor: AutoScrollCursor | null = null;
328
365
  const win = container.ownerDocument.defaultView;
329
366
 
330
367
  function stopAutoScroll(): void {
@@ -353,16 +390,17 @@ export function startCanvasIframe(opts: {
353
390
  return;
354
391
  }
355
392
  const preview = previewAt(autoScrollCursor, src, shadowDoc, container.ownerDocument);
356
- channel.post({
357
- // Flow 3 (withCursor) re-posts the cursor so the parent keeps tracking the ghost at an edge-hold.
358
- ...(autoScrollCursor.withCursor
359
- ? { cursor: { x: autoScrollCursor.x, y: autoScrollCursor.y } }
360
- : {}),
393
+ const over: DragOverMsg = {
361
394
  dragSeq: autoScrollCursor.dragSeq,
362
395
  gen: autoScrollCursor.gen ?? dragGen,
363
396
  kind: "dragOver",
364
397
  preview,
365
- });
398
+ };
399
+ // Flow 3 (withCursor) re-posts the cursor so the parent keeps tracking the ghost at an edge-hold.
400
+ if (autoScrollCursor.withCursor) {
401
+ over.cursor = { x: autoScrollCursor.x, y: autoScrollCursor.y };
402
+ }
403
+ channel.post(over);
366
404
  autoScrollFrame = win.requestAnimationFrame(autoScrollTick);
367
405
  }
368
406
 
@@ -381,13 +419,12 @@ export function startCanvasIframe(opts: {
381
419
  stopAutoScroll();
382
420
  return;
383
421
  }
384
- autoScrollCursor = {
385
- dragSeq,
386
- withCursor: flow3 != null,
387
- x: cursor.x,
388
- y: cursor.y,
389
- ...(flow3 ? { gen: flow3.gen, src: flow3.src } : {}),
390
- };
422
+ const next: AutoScrollCursor = { dragSeq, withCursor: flow3 != null, x: cursor.x, y: cursor.y };
423
+ if (flow3) {
424
+ next.gen = flow3.gen;
425
+ next.src = flow3.src;
426
+ }
427
+ autoScrollCursor = next;
391
428
  if (!autoScrollFrame) {
392
429
  autoScrollFrame = win.requestAnimationFrame(autoScrollTick);
393
430
  }
@@ -522,13 +559,11 @@ export function startCanvasIframe(opts: {
522
559
  }
523
560
 
524
561
  function sampleIdle(): Extract<IframeToParent, { kind: "idle" }> {
525
- const running =
526
- typeof frameDoc.getAnimations === "function"
527
- ? frameDoc.getAnimations().filter((a) => a.playState === "running").length
528
- : 0;
562
+ const probe: IdleProbeDocument = frameDoc;
563
+ const running = probe.getAnimations?.().filter((a) => a.playState === "running").length ?? 0;
529
564
  return {
530
565
  animations: running,
531
- fonts: frameDoc.fonts ? frameDoc.fonts.status === "loaded" : true,
566
+ fonts: probe.fonts ? probe.fonts.status === "loaded" : true,
532
567
  gen: renderedGen,
533
568
  images: pendingImageRetries(),
534
569
  kind: "idle",
@@ -750,12 +785,7 @@ export function startCanvasIframe(opts: {
750
785
  // The wrong scope); the parent additionally gen-gates the reply against its own state.
751
786
  const results =
752
787
  msg.gen === renderedGen && renderCtx && shadowDoc
753
- ? evaluateLiveExprs(
754
- msg.exprs,
755
- renderCtx.defs as Record<string, unknown>,
756
- shadowDoc,
757
- msg.contextPath,
758
- )
788
+ ? evaluateLiveExprs(msg.exprs, renderCtx.defs, shadowDoc, msg.contextPath)
759
789
  : [];
760
790
  channel.post({ gen: msg.gen, kind: "evalResult", reqId: msg.reqId, results });
761
791
  return;
@@ -820,11 +850,7 @@ export function startCanvasIframe(opts: {
820
850
  channel.post({ gen, kind: "patchComplete" });
821
851
  armIdleWatch();
822
852
  } catch (error) {
823
- channel.post({
824
- gen,
825
- kind: "patchError",
826
- message: String((error as Error)?.message ?? error),
827
- });
853
+ channel.post({ gen, kind: "patchError", message: failureText(error) });
828
854
  }
829
855
  return;
830
856
  }
@@ -835,14 +861,10 @@ export function startCanvasIframe(opts: {
835
861
  if (msg.gen !== renderedGen || !shadowDoc) {
836
862
  return;
837
863
  }
838
- (shadowDoc as { style?: JxStyle }).style = msg.style as JxStyle;
864
+ shadowDoc.style = msg.style;
839
865
  const rootEl = container.firstElementChild;
840
866
  if (rootEl instanceof HTMLElement) {
841
- reapplyStyle(
842
- rootEl,
843
- msg.style as JxStyle,
844
- (shadowDoc as { $media?: Record<string, string> }).$media ?? {},
845
- );
867
+ reapplyStyle(rootEl, msg.style, shadowDoc.$media ?? {});
846
868
  }
847
869
  return;
848
870
  }
@@ -945,24 +967,22 @@ export function startCanvasIframe(opts: {
945
967
  if (msg.kind === "redefineElement") {
946
968
  /* The canvas half of embedding.md §7. The definition is replaced in THIS realm; instances
947
969
  already on the canvas keep the old one until the host's next render replaces them. */
948
- void redefineElement(msg.doc as never, msg.base);
970
+ /* SAFETY: The host posts only the component definition a save just wrote
971
+ (`redefineElementOnCanvases`), a whole `.json` element document, and `redefineElement`
972
+ itself rejects one whose `tagName` is not a hyphenated literal. */
973
+ void redefineElement(msg.doc as JxDocument, msg.base);
949
974
  return;
950
975
  }
951
976
  if (msg.kind === "setLocale") {
952
977
  /* The other document-level attribute flip, and the whole visible half of an axis-3 locale:
953
978
  `dir` is what makes an RTL preview actually mirror, and `lang` is what CSS's `:lang()` and
954
979
  the font stack select on. Patch-free like the scheme above — the TEXT is whatever file is
955
- open, because a translation in Jx is a different file rather than a different rendering.
956
- Cleared rather than blanked when the pane goes back to the document's own language: an
957
- empty `lang=""` is a document that claims to be in no language at all. */
958
- const root = container.ownerDocument.documentElement;
959
- if (msg.locale === null) {
960
- root.removeAttribute("lang");
961
- root.removeAttribute("dir");
962
- } else {
963
- root.setAttribute("lang", msg.locale);
964
- root.setAttribute("dir", msg.dir);
965
- }
980
+ open, because a translation in Jx is a different file rather than a different rendering. */
981
+ applyPreviewLocale(
982
+ container.ownerDocument,
983
+ msg.locale === null ? null : { dir: msg.dir, locale: msg.locale },
984
+ localeBaseline,
985
+ );
966
986
  return;
967
987
  }
968
988
  if (msg.kind === "siteStyleUpdate") {
@@ -974,6 +994,7 @@ export function startCanvasIframe(opts: {
974
994
  return;
975
995
  }
976
996
  applyPreviewColorScheme(container.ownerDocument, msg.colorScheme ?? null);
997
+ applyPreviewLocale(container.ownerDocument, msg.locale ?? null, localeBaseline);
977
998
  // A render replaces the DOM under a live edit session — COMMIT it first (never discard). The
978
999
  // Resulting editCommit/editEnd post synchronously here, so on the FIFO channel they precede
979
1000
  // This render's renderComplete and the parent routes them by the host's not-yet-flipped tab
@@ -988,6 +1009,8 @@ export function startCanvasIframe(opts: {
988
1009
  // A document with no format, where the studio's own element metadata answers on its own.
989
1010
  setEditableVerdicts(msg.editableTags ?? null);
990
1011
  const { gen, mapperCtx } = msg;
1012
+ /* SAFETY: The host posts `shadowDoc` as a JSON round-trip of the tab's raw page document (or of
1013
+ the stylebook specimen), so it is a `JxMutableNode` in the forward-op coordinate space. */
991
1014
  const rawDoc = msg.shadowDoc as JxMutableNode;
992
1015
  void (async () => {
993
1016
  try {
@@ -1002,9 +1025,11 @@ export function startCanvasIframe(opts: {
1002
1025
  than a theoretical one. It used to be exactly that, one orphaned `<style>` per styled
1003
1026
  element per render. */
1004
1027
  resetDocumentStyles(container.ownerDocument);
1005
- handle = await renderResolvedDocument({
1028
+ const renderOpts: Parameters<typeof renderResolvedDocument>[0] = {
1006
1029
  assets: versionedAssets(msg.assets ?? null),
1007
1030
  container,
1031
+ /* SAFETY: The host posts `doc` as a JSON round-trip of `resolveCanvasDocument`'s render
1032
+ document (or the stylebook specimen), which is the resolved `JxDocument` it renders. */
1008
1033
  doc: msg.doc as JxDocument,
1009
1034
  docBase: msg.docBase,
1010
1035
  mapperCtx: {
@@ -1019,8 +1044,11 @@ export function startCanvasIframe(opts: {
1019
1044
  popoverOpen: msg.popoverOpen ? serializeJxPath(msg.popoverOpen) : null,
1020
1045
  dialogOpen: msg.dialogOpen ? serializeJxPath(msg.dialogOpen) : null,
1021
1046
  siteStyle: msg.siteStyle,
1022
- ...(msg.allowAutoRequests ? { allowAutoRequests: true } : {}),
1023
- });
1047
+ };
1048
+ if (msg.allowAutoRequests) {
1049
+ renderOpts.allowAutoRequests = true;
1050
+ }
1051
+ handle = await renderResolvedDocument(renderOpts);
1024
1052
  if (gen === latestGen) {
1025
1053
  /* A render replaces the DOM, so the open attribute goes with it. The host sends the value
1026
1054
  on the render message for exactly this reason; a frame that kept only its own copy
@@ -1042,7 +1070,7 @@ export function startCanvasIframe(opts: {
1042
1070
  // BuildScope returns, and serializeDataScope reads defs[key], so the effect tracks those
1043
1071
  // Refs and RE-POSTS an updated snapshot when the data settles (the host gen-gates stale
1044
1072
  // Ones). Isolated in try/catch: a serialization failure never breaks the render ack above.
1045
- const defs = handle.ctx.defs as Record<string, unknown>;
1073
+ const { defs } = handle.ctx;
1046
1074
  stopDataScopeWatch = observeScope(() => {
1047
1075
  try {
1048
1076
  channel.post({ gen, kind: "dataScope", scope: serializeDataScope(defs) });
@@ -1054,11 +1082,7 @@ export function startCanvasIframe(opts: {
1054
1082
  postContentHeight();
1055
1083
  }
1056
1084
  } catch (error) {
1057
- channel.post({
1058
- gen,
1059
- kind: "renderError",
1060
- message: String((error as Error)?.message ?? error),
1061
- });
1085
+ channel.post({ gen, kind: "renderError", message: failureText(error) });
1062
1086
  }
1063
1087
  })();
1064
1088
  });
@@ -1066,6 +1090,8 @@ export function startCanvasIframe(opts: {
1066
1090
  channel.post({ kind: "ready" });
1067
1091
  return () => {
1068
1092
  off();
1093
+ // Leave the root as it booted, so a frame started after this one captures the same baseline.
1094
+ applyPreviewLocale(container.ownerDocument, null, localeBaseline);
1069
1095
  stopInteraction();
1070
1096
  stopKeyForwarding();
1071
1097
  stopInlineEdit();
@@ -1094,7 +1120,9 @@ export function startCanvasIframe(opts: {
1094
1120
  interface BootWindow {
1095
1121
  location: { search: string };
1096
1122
  document: { querySelector: (selectors: string) => Element | null; body: HTMLElement };
1097
- parent: { postMessage: (message: unknown, targetOrigin: string) => void };
1123
+ parent: {
1124
+ postMessage: (message: CanvasEnvelope<IframeToParent>, targetOrigin: string) => void;
1125
+ };
1098
1126
  addEventListener: (type: "message", listener: (event: MessageEvent) => void) => void;
1099
1127
  removeEventListener: (type: "message", listener: (event: MessageEvent) => void) => void;
1100
1128
  }
@@ -1111,7 +1139,7 @@ export function bootCanvasIframe(win: BootWindow): () => void {
1111
1139
  setResolveToken(params.get("rpcToken"));
1112
1140
  // ParentOrigin authenticates the parent peer. The host (iframe-host.ts) passes it ONLY for an
1113
1141
  // Http(s) parent (dev / chromium — same-origin, the origin round-trips). It OMITS it for a
1114
- // Non-http(s) parent (electrobun views://), whose custom scheme may not surface as a postMessage
1142
+ // Non-http(s) parent (a custom scheme), whose custom scheme may not surface as a postMessage
1115
1143
  // Origin: a missing value here means fall back to "*" — token-gated, NOT a silent omission — and
1116
1144
  // Log it loudly so the looser origin check is visible.
1117
1145
  const explicitParentOrigin = params.get("parentOrigin");
@@ -1122,8 +1150,9 @@ export function bootCanvasIframe(win: BootWindow): () => void {
1122
1150
  "The parent origin did not round-trip; the channel relies on the shared token alone.",
1123
1151
  );
1124
1152
  }
1125
- const container = (win.document.querySelector("#jx-canvas-root") ??
1126
- win.document.body) as HTMLElement;
1153
+ // `canvas.html` draws `#jx-canvas-root` as a `<div>`; a page without it renders into `<body>`.
1154
+ const root = win.document.querySelector("#jx-canvas-root");
1155
+ const container = root instanceof HTMLElement ? root : win.document.body;
1127
1156
  const channel = postMessageChannel<IframeToParent, ParentToIframe>({
1128
1157
  acceptOrigin: parentOrigin,
1129
1158
  source: win,
@@ -1136,5 +1165,5 @@ export function bootCanvasIframe(win: BootWindow): () => void {
1136
1165
 
1137
1166
  // Boot only when actually loaded as the iframe document (has a real parent frame), never in tests.
1138
1167
  if (typeof window !== "undefined" && window.parent !== window) {
1139
- bootCanvasIframe(window as unknown as BootWindow);
1168
+ bootCanvasIframe(window);
1140
1169
  }
@@ -13,22 +13,39 @@
13
13
 
14
14
  import { evaluateExpression } from "@jxsuite/runtime/expression";
15
15
  import { resolveRef } from "@jxsuite/runtime";
16
+ import { isFunction, isJsonObject, isNonNullObject, isRef } from "@jxsuite/schema/guards";
16
17
  import { formatPreviewValue } from "../utils/preview-format";
18
+ import type { PreviewValue } from "../utils/preview-format";
17
19
 
18
- import type { ExpressionNode } from "@jxsuite/runtime/expression";
20
+ import type { JxScope } from "@jxsuite/runtime/types";
21
+ import type {
22
+ JsonValue,
23
+ JxDocumentValue,
24
+ JxExpressionNode,
25
+ JxMutableNode,
26
+ JxStateDefinition,
27
+ } from "@jxsuite/schema/types";
19
28
  import type { EvalExprResult } from "./iframe-protocol";
20
29
 
21
- type Scope = Record<string, unknown>;
30
+ /**
31
+ * Whether the raw (document) state entry is a pure named-formula (`$expression` + parameters).
32
+ *
33
+ * Looser than `isNamedFormulaDef`: an empty `parameters` array, or an `$expression` that is not an
34
+ * object, still qualifies.
35
+ */
36
+ function isNamedFormulaEntry(
37
+ entry: JxStateDefinition | undefined,
38
+ ): entry is JxStateDefinition & { parameters: JxDocumentValue[] } {
39
+ return isJsonObject(entry) && "$expression" in entry && Array.isArray(entry["parameters"]);
40
+ }
22
41
 
23
- /** Whether the raw (document) state entry is a pure named-formula (`$expression` + parameters). */
24
- function isNamedFormulaEntry(entry: unknown): boolean {
25
- return (
26
- typeof entry === "object" &&
27
- entry !== null &&
28
- !Array.isArray(entry) &&
29
- "$expression" in entry &&
30
- Array.isArray((entry as { parameters?: unknown }).parameters)
31
- );
42
+ /** A structured clone of `value`, or null when it holds something uncloneable (a function, a node). */
43
+ function cloneOrNull<T>(value: T): T | null {
44
+ try {
45
+ return structuredClone(value);
46
+ } catch {
47
+ return null;
48
+ }
32
49
  }
33
50
 
34
51
  /**
@@ -38,21 +55,27 @@ function isNamedFormulaEntry(entry: unknown): boolean {
38
55
  * callable (event handlers, structured-body functions, server fns) is dropped so a stray `call`
39
56
  * can't run a side effect against the live canvas.
40
57
  */
41
- export function cloneLiveScope(defs: Scope, rawState: Record<string, unknown> | null): Scope {
42
- const out: Scope = {};
58
+ export function cloneLiveScope(
59
+ defs: JxScope,
60
+ rawState: Record<string, JxStateDefinition> | null,
61
+ ): JxScope {
62
+ const out: JxScope = {};
43
63
  for (const key of Object.keys(defs)) {
44
64
  try {
45
65
  // Reading through the reactive proxy auto-unwraps a top-level ref/computed — and can throw (a
46
66
  // Computed getter that throws), which maps the key to null instead of aborting the clone.
47
67
  const value = defs[key];
48
- if (typeof value === "function") {
68
+ if (isFunction(value)) {
49
69
  if (isNamedFormulaEntry(rawState?.[key])) {
50
70
  out[key] = value; // A pure formula callable — safe (and needed) for `call` nodes.
51
71
  }
52
72
  continue;
53
73
  }
54
- const json = JSON.stringify(value);
55
- out[key] = json === undefined ? null : (JSON.parse(json) as unknown);
74
+ /* SAFETY: A widening. `JSON.stringify` answers undefined for undefined, a symbol or a function,
75
+ which lib.d.ts's `string` return type leaves out. */
76
+ const json = JSON.stringify(value) as string | undefined;
77
+ // SAFETY: `json` is JSON.stringify's own output above, so it parses back to JSON data.
78
+ out[key] = json === undefined ? null : (JSON.parse(json) as JsonValue);
56
79
  } catch {
57
80
  out[key] = null;
58
81
  }
@@ -69,44 +92,41 @@ export function cloneLiveScope(defs: Scope, rawState: Record<string, unknown> |
69
92
  * chain naturally (an inner `items` ref may read the outer `$map/item`).
70
93
  */
71
94
  export function bindRepeaterContext(
72
- scope: Scope,
73
- shadowDoc: unknown,
95
+ scope: JxScope,
96
+ shadowDoc: JxMutableNode | null,
74
97
  contextPath: (string | number)[] | null,
75
- ): Scope {
98
+ ): JxScope {
76
99
  if (!contextPath || contextPath.length === 0) {
77
100
  return scope;
78
101
  }
79
- let node: unknown = shadowDoc;
102
+ let node: JxDocumentValue | undefined = shadowDoc;
80
103
  let bound = scope;
81
104
  for (const seg of contextPath) {
82
- if (!node || typeof node !== "object") {
105
+ if (!isNonNullObject(node)) {
83
106
  break;
84
107
  }
85
- const rec = node as Record<string, unknown>;
86
- if (rec.$prototype === "Array" && seg === "map") {
108
+ /* SAFETY: The shadow doc is JSON, so every non-null object on the walk is a document object or
109
+ array, and indexing either by a path segment yields another document value or undefined. */
110
+ const rec = node as Record<string, JxDocumentValue | undefined>;
111
+ if (rec["$prototype"] === "Array" && seg === "map") {
87
112
  // Entering the repeater's template — bind the first item's context before descending.
88
- const itemsDef = rec.items;
89
- const items: unknown =
90
- itemsDef && typeof itemsDef === "object" && "$ref" in itemsDef
91
- ? resolveRef((itemsDef as { $ref: string }).$ref, bound)
92
- : itemsDef;
113
+ const itemsDef = rec["items"];
114
+ const items = isRef(itemsDef) ? resolveRef(itemsDef.$ref, bound) : itemsDef;
93
115
  if (Array.isArray(items) && items.length > 0) {
94
- let item: unknown;
95
- try {
96
- // Items resolved from the shadow doc (a literal array) must not be mutable through the
97
- // Preview scope — clone; scope-resolved items are already clone data, so this is free.
98
- item = structuredClone(items[0]);
99
- } catch {
100
- item = null;
101
- }
102
- const child = Object.create(bound) as Scope;
103
- child.$map = { index: 0, item };
116
+ const [first] = items;
117
+ // Items resolved from the shadow doc (a literal array) must not be mutable through the
118
+ // Preview scope — clone; scope-resolved items are already clone data, so this is free.
119
+ const item = cloneOrNull(first);
120
+ /* SAFETY: `Object.create(bound)` is an empty object whose prototype is the scope built so far,
121
+ so it is a scope that reads every outer key through and owns only the three set below. */
122
+ const child = Object.create(bound) as JxScope;
123
+ child["$map"] = { index: 0, item };
104
124
  child["$map/item"] = item;
105
125
  child["$map/index"] = 0;
106
126
  bound = child;
107
127
  }
108
128
  }
109
- node = rec[seg as keyof typeof rec];
129
+ node = rec[seg];
110
130
  }
111
131
  return bound;
112
132
  }
@@ -118,30 +138,34 @@ export function bindRepeaterContext(
118
138
  */
119
139
  export function evaluateLiveExprs(
120
140
  exprs: { id: string; node: unknown }[],
121
- defs: Scope,
122
- shadowDoc: unknown,
141
+ defs: JxScope,
142
+ shadowDoc: JxMutableNode | null,
123
143
  contextPath: (string | number)[] | null,
124
144
  ): EvalExprResult[] {
125
- const rawState =
126
- shadowDoc && typeof shadowDoc === "object"
127
- ? ((shadowDoc as { state?: Record<string, unknown> }).state ?? null)
128
- : null;
145
+ const rawState = shadowDoc?.state ?? null;
129
146
  return exprs.map(({ id, node }) => {
130
147
  const values = new Map<string, string>();
131
148
  // A fresh scope per expression: a mutating operator writes into this clone only, and can never
132
149
  // Leak into the next expression's evaluation (or the live canvas).
133
- let scope: Scope;
150
+ let scope: JxScope;
134
151
  try {
135
152
  scope = bindRepeaterContext(cloneLiveScope(defs, rawState), shadowDoc, contextPath);
136
153
  } catch (error) {
137
154
  return { error: error instanceof Error ? error.message : String(error), id, values: [] };
138
155
  }
139
156
  try {
140
- if (!node || typeof node !== "object" || !("operator" in node)) {
157
+ if (!isNonNullObject(node) || !("operator" in node)) {
141
158
  throw new Error("not an expression node");
142
159
  }
143
- evaluateExpression(node as ExpressionNode, scope, null, undefined, {
144
- report: (path, value) => values.set(path.join("/"), formatPreviewValue(value)),
160
+ /* SAFETY: `operator` is the key every expression node carries, and `evaluateExpression`
161
+ validates the operator itself, throwing on an unknown one into the catch below. */
162
+ void evaluateExpression(node as JxExpressionNode, scope, null, undefined, {
163
+ report: (path, value) => {
164
+ /* SAFETY: the trace reports raw runtime values, and PreviewValue names every category a JS
165
+ value falls in (primitive, bigint, symbol, function, array, record); formatting relies on
166
+ nothing beyond what JSON.stringify and String() accept for any value. */
167
+ values.set(path.join("/"), formatPreviewValue(value as PreviewValue));
168
+ },
145
169
  });
146
170
  return { id, values: [...values.entries()] };
147
171
  } catch (error) {