@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
package/src/panels/dnd.ts CHANGED
@@ -10,7 +10,7 @@ import {
10
10
  monitorForElements,
11
11
  } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
12
12
  import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine";
13
- import { displayTagName } from "@jxsuite/schema/guards";
13
+ import { isNumber } from "@jxsuite/schema/guards";
14
14
  import { disableNativeDragPreview } from "@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview";
15
15
  import {
16
16
  attachInstruction,
@@ -26,20 +26,21 @@ import {
26
26
  parentElementPath,
27
27
  renderOnly,
28
28
  } from "../store";
29
- import { mutateInsertNode, mutateMoveNode, transact, transactDoc } from "../tabs/transact";
29
+ import { mutateInsertNode, mutateMoveNode, transactDoc } from "../tabs/transact";
30
30
  import { primarySelection } from "../tabs/selection";
31
31
  import { activeTab } from "../workspace/workspace";
32
32
  import { view } from "../view";
33
33
  import { buildComponentInstance, componentRegistry } from "../files/components";
34
- import { enableElement } from "../files/elements";
35
- import type { ElementsEntry } from "../files/elements";
34
+ import { mutateImportComponent } from "../editor/insert-component";
36
35
  import { renderComponentPreview } from "./component-preview";
37
36
  import { defaultDef, unsafeTags } from "./shared";
38
37
  import { elementAtPoint } from "../utils/geometry";
39
38
  import type { JxPath } from "../state";
40
39
  import type { Tab } from "../tabs/tab";
41
- import type { JxElement, JxMutableNode } from "@jxsuite/schema/types";
40
+ import type { JxMutableNode } from "@jxsuite/schema/types";
42
41
  import type { ComponentEntry } from "../files/components.js";
42
+ import type { ElementDragPayload } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
43
+ import type { DropTargetRecord } from "@atlaskit/pragmatic-drag-and-drop/types";
43
44
 
44
45
  interface DragCanDragArgs {
45
46
  element: HTMLElement;
@@ -51,17 +52,10 @@ interface DragPreviewArgs {
51
52
  nativeSetDragImage: ((image: Element, x: number, y: number) => void) | null;
52
53
  }
53
54
 
54
- interface DragDropSourceArgs {
55
- source: { data: Record<string, unknown>; element: HTMLElement };
56
- }
57
-
58
- interface DragSelfArgs {
59
- self: { data: Record<string, unknown> };
60
- }
61
-
62
- interface DragMonitorDropArgs {
63
- source: { data: Record<string, unknown>; element: HTMLElement };
64
- location: { current: { dropTargets: { data: Record<string, unknown> }[] } };
55
+ /** Where a drop instruction inserts: the parent's path and the index among its children. */
56
+ interface DropSlot {
57
+ parent: JxPath;
58
+ index: number;
65
59
  }
66
60
 
67
61
  /**
@@ -122,23 +116,25 @@ export function registerLayersDnD() {
122
116
  view.dndCleanups = [];
123
117
  _layersFrame = requestAnimationFrame(() => {
124
118
  _layersFrame = null;
125
- const container = leftPanel?.querySelector(OUTLINE_ROOT) as HTMLElement | null;
119
+ const container = leftPanel?.querySelector<HTMLElement>(OUTLINE_ROOT);
126
120
  if (!container) {
127
121
  return;
128
122
  }
129
123
 
130
- for (const row of container.querySelectorAll("[data-dnd-row]") as NodeListOf<HTMLElement>) {
131
- const rowPath = (row.dataset.value as string)
124
+ for (const row of container.querySelectorAll<HTMLElement>("[data-dnd-row]")) {
125
+ /* SAFETY: every `[data-dnd-row]` row is a `jx-tree-item` from panel-outline.json, and the
126
+ element reflects its `value` (the row's path key) onto the host as `data-value`. */
127
+ const rowPath: JxPath = (row.dataset.value as string)
132
128
  .split("/")
133
- .map((s: string) => (/^\d+$/.test(s) ? Math.trunc(Number(s)) : s)) as JxPath;
134
- const rowDepth = Math.trunc(Number(row.dataset.dndDepth as string)) || 0;
129
+ .map((s: string) => (/^\d+$/.test(s) ? Math.trunc(Number(s)) : s));
130
+ const rowDepth = Math.trunc(Number(row.dataset.dndDepth)) || 0;
135
131
  const isVoid = Object.hasOwn(row.dataset, "dndVoid");
136
132
  const isExpanded = Object.hasOwn(row.dataset, "dndExpanded");
137
133
 
138
134
  const cleanup = combine(
139
135
  draggable({
140
136
  canDrag({ element: _el, input }: DragCanDragArgs) {
141
- const target = elementAtPoint(input.clientX, input.clientY) as HTMLElement;
137
+ const target = elementAtPoint(input.clientX, input.clientY);
142
138
  if (target?.closest(OUTLINE_ACTIONS)) {
143
139
  return false;
144
140
  }
@@ -169,9 +165,10 @@ export function registerLayersDnD() {
169
165
  }),
170
166
  dropTargetForElements({
171
167
  element: row,
172
- canDrop({ source }: DragDropSourceArgs) {
173
- const srcPath = source.data.path as JxPath | undefined;
174
- if (srcPath && isAncestor(srcPath, rowPath)) {
168
+ canDrop({ source }) {
169
+ // Only a tree-node drag carries a path array; a file-tree drag's `path` is a string.
170
+ const srcPath = source.data.path;
171
+ if (Array.isArray(srcPath) && isAncestor(srcPath, rowPath)) {
175
172
  return false;
176
173
  }
177
174
  return true;
@@ -193,12 +190,12 @@ export function registerLayersDnD() {
193
190
  input,
194
191
  mode: isExpanded ? "expanded" : "standard",
195
192
  },
196
- ) as Record<string | symbol, unknown>;
193
+ );
197
194
  },
198
- onDragEnter({ self }: DragSelfArgs) {
195
+ onDragEnter({ self }) {
199
196
  showLayerDropGap(row, self.data, container);
200
197
  },
201
- onDrag({ self }: DragSelfArgs) {
198
+ onDrag({ self }) {
202
199
  showLayerDropGap(row, self.data, container);
203
200
  },
204
201
  // No onDragLeave clear — the gap persists while the pointer crosses dead space
@@ -213,7 +210,7 @@ export function registerLayersDnD() {
213
210
 
214
211
  // Global monitor
215
212
  const monitorCleanup = monitorForElements({
216
- onDrop({ source, location }: DragMonitorDropArgs) {
213
+ onDrop({ source, location }) {
217
214
  clearLayerDropGap(container);
218
215
  const [target] = location.current.dropTargets;
219
216
  if (!target) {
@@ -224,7 +221,13 @@ export function registerLayersDnD() {
224
221
  return;
225
222
  }
226
223
  const srcData = source.data;
227
- const targetPath = target.data.path as JxPath;
224
+ /* Only an Outline row's data carries a path. The Logic tab's statement rows attach tree-item
225
+ instructions too, and the drags they accept (statements) are ones applyDropInstruction
226
+ ignores, so a drop there has nothing to apply. */
227
+ const targetPath = target.data.path;
228
+ if (!Array.isArray(targetPath)) {
229
+ return;
230
+ }
228
231
 
229
232
  // If the source had children, persist collapse at the new location
230
233
  const srcRow = srcData.type === "tree-node" && source.element;
@@ -243,7 +246,7 @@ export function registerLayersDnD() {
243
246
  }
244
247
  }
245
248
  },
246
- onDropTargetChange({ location }: DragMonitorDropArgs) {
249
+ onDropTargetChange({ location }) {
247
250
  // Clear the layer gap when the drag moves onto a non-tree target (e.g. a canvas
248
251
  // Element). When there is no target at all, keep the gap so it persists.
249
252
  const [inner] = location.current.dropTargets;
@@ -259,14 +262,12 @@ export function registerLayersDnD() {
259
262
  /** Register DnD on component rows — called from renderLeftPanel when tab=components */
260
263
  export function registerComponentsDnD() {
261
264
  requestAnimationFrame(() => {
262
- const container = leftPanel?.querySelector(".components-section") as HTMLElement | null;
265
+ const container = leftPanel?.querySelector<HTMLElement>(".components-section");
263
266
  if (!container) {
264
267
  return;
265
268
  }
266
269
 
267
- for (const row of container.querySelectorAll(
268
- "[data-component-tag]",
269
- ) as NodeListOf<HTMLElement>) {
270
+ for (const row of container.querySelectorAll<HTMLElement>("[data-component-tag]")) {
270
271
  const tagName = row.dataset.componentTag;
271
272
  if (!tagName) {
272
273
  continue;
@@ -303,11 +304,12 @@ export function registerComponentsDnD() {
303
304
  /** Register DnD on element (HTML block) rows */
304
305
  export function registerElementsDnD() {
305
306
  requestAnimationFrame(() => {
306
- const container = leftPanel?.querySelector('[part="content"]') as HTMLElement | null;
307
+ const container = leftPanel?.querySelector<HTMLElement>('[part="content"]');
307
308
  if (!container) {
308
309
  return;
309
310
  }
310
- for (const row of container.querySelectorAll("[data-block-tag]") as NodeListOf<HTMLElement>) {
311
+ for (const row of container.querySelectorAll<HTMLElement>("[data-block-tag]")) {
312
+ // SAFETY: the selector matched on `data-block-tag`, so the attribute is present and this is its text.
311
313
  const tag = row.dataset.blockTag as string;
312
314
  const preview = row.querySelector(".element-card-preview");
313
315
  if (preview && !preview.firstChild) {
@@ -338,22 +340,22 @@ export function registerElementsDnD() {
338
340
  */
339
341
  function hideDescendantRows(parentRow: HTMLElement, container: HTMLElement) {
340
342
  const prefix = `${parentRow.dataset.value}/`;
341
- const rows = container.querySelectorAll(OUTLINE_ROWS);
343
+ const rows = container.querySelectorAll<HTMLElement>(OUTLINE_ROWS);
342
344
  for (const r of rows) {
343
- if ((r as HTMLElement).dataset.value?.startsWith(prefix)) {
344
- (r as HTMLElement).style.display = "none";
345
+ if (r.dataset.value?.startsWith(prefix)) {
346
+ r.style.display = "none";
345
347
  }
346
348
  }
347
349
  }
348
350
 
349
351
  /**
350
352
  * @param {HTMLElement} rowEl
351
- * @param {Record<string, unknown>} data
353
+ * @param {DropTargetRecord["data"]} data The row's own drop-target data, carrying its instruction.
352
354
  * @param {HTMLElement} container
353
355
  */
354
356
  export function showLayerDropGap(
355
357
  rowEl: HTMLElement,
356
- data: Record<string, unknown>,
358
+ data: DropTargetRecord["data"],
357
359
  container: HTMLElement,
358
360
  ) {
359
361
  const instruction = extractInstruction(data);
@@ -379,18 +381,18 @@ export function showLayerDropGap(
379
381
  view._currentDropTargetRow = rowEl;
380
382
 
381
383
  // Shift rows to create gap
382
- const rows = [...container.querySelectorAll(OUTLINE_ROWS)];
384
+ const rows = [...container.querySelectorAll<HTMLElement>(OUTLINE_ROWS)];
383
385
  const targetIdx = rows.indexOf(rowEl);
384
386
  const gap = view.layerDragSourceHeight;
385
387
 
386
- for (let i = 0; i < rows.length; i++) {
387
- if ((rows[i] as HTMLElement).dataset.dragging !== undefined) {
388
+ for (const [i, row] of rows.entries()) {
389
+ if (row.dataset.dragging !== undefined) {
388
390
  continue;
389
391
  }
390
392
  if (instruction.type === "reorder-above") {
391
- (rows[i] as HTMLElement).style.transform = i >= targetIdx ? `translateY(${gap}px)` : "";
393
+ row.style.transform = i >= targetIdx ? `translateY(${gap}px)` : "";
392
394
  } else {
393
- (rows[i] as HTMLElement).style.transform = i > targetIdx ? `translateY(${gap}px)` : "";
395
+ row.style.transform = i > targetIdx ? `translateY(${gap}px)` : "";
394
396
  }
395
397
  }
396
398
  }
@@ -401,16 +403,51 @@ export function clearLayerDropGap(container: HTMLElement) {
401
403
  delete view._currentDropTargetRow.dataset.drop;
402
404
  view._currentDropTargetRow = null;
403
405
  }
404
- const rows = container.querySelectorAll(OUTLINE_ROWS);
406
+ const rows = container.querySelectorAll<HTMLElement>(OUTLINE_ROWS);
405
407
  for (const r of rows) {
406
- (r as HTMLElement).style.transform = "";
408
+ r.style.transform = "";
407
409
  // Also clear `display:none` left by hideDescendantRows. The row has no `style`
408
410
  // Lit binding, so an imperative style set during the drag survives the post-drop re-render on
409
411
  // Whichever row keeps that key — and a move is exactly the edit that hands a key to a different
410
412
  // Node. (The rows ARE keyed, by `pathKey`; the earlier form of this note said they were not,
411
413
  // Which made the wrong thing sound load-bearing. What is load-bearing is the missing binding.)
412
- (r as HTMLElement).style.display = "";
414
+ r.style.display = "";
415
+ }
416
+ }
417
+
418
+ /**
419
+ * Where a drop instruction lands relative to `targetPath`.
420
+ *
421
+ * `make-child` appends to the target itself. A reorder lands beside it, which needs a parent and a
422
+ * numeric index, so a reorder (or any other instruction) around a root-level path answers
423
+ * `undefined`: the drop cannot land there at all. `null` is an instruction that lands but inserts
424
+ * nothing, which this module does not apply.
425
+ *
426
+ * @param {JxMutableNode} doc
427
+ * @param {string} type
428
+ * @param {JxPath} targetPath
429
+ * @returns {DropSlot | null | undefined}
430
+ */
431
+ function dropSlot(
432
+ doc: JxMutableNode,
433
+ type: string,
434
+ targetPath: JxPath,
435
+ ): DropSlot | null | undefined {
436
+ if (type === "make-child") {
437
+ return { index: childList(getNodeAtPath(doc, targetPath)).length, parent: targetPath };
438
+ }
439
+ const parent = parentElementPath(targetPath);
440
+ const index = childIndex(targetPath);
441
+ if (!parent || !isNumber(index)) {
442
+ return undefined;
443
+ }
444
+ if (type === "reorder-above") {
445
+ return { index, parent };
446
+ }
447
+ if (type === "reorder-below") {
448
+ return { index: index + 1, parent };
413
449
  }
450
+ return null;
414
451
  }
415
452
 
416
453
  /**
@@ -420,110 +457,50 @@ export function clearLayerDropGap(container: HTMLElement) {
420
457
  *
421
458
  * @param {Tab | null} tab
422
459
  * @param {{ type: string }} instruction
423
- * @param {Record<string, unknown>} srcData
460
+ * @param {ElementDragPayload["data"]} srcData The drag source's own data, as `getInitialData` made
461
+ * it.
424
462
  * @param {JxPath} targetPath
425
463
  */
426
464
  export function applyDropInstruction(
427
465
  tab: Tab | null,
428
466
  instruction: { type: string },
429
- srcData: Record<string, unknown>,
467
+ srcData: ElementDragPayload["data"],
430
468
  targetPath: JxPath,
431
469
  ) {
432
470
  if (!tab) {
433
471
  return;
434
472
  }
435
- const doc = tab.doc.document as JxMutableNode;
436
473
  if (srcData.type === "tree-node") {
474
+ /* SAFETY: both minters of a "tree-node" payload — an Outline row's `getInitialData` and the
475
+ block action bar's drag handle — set `path` to the dragged node's JxPath. */
437
476
  const fromPath = srcData.path as JxPath;
438
- const targetParent = parentElementPath(targetPath) as JxPath;
439
- const targetIdx = childIndex(targetPath) as number;
440
- // Reordering requires a parent and a numeric index; root-level paths can't be
441
- // Reordered around.
442
- if (instruction.type !== "make-child" && (!targetParent || typeof targetIdx !== "number")) {
443
- return;
444
- }
445
-
446
- switch (instruction.type) {
447
- case "reorder-above": {
448
- transactDoc(tab, (t) => mutateMoveNode(t, fromPath, targetParent, targetIdx));
449
- break;
450
- }
451
- case "reorder-below": {
452
- transactDoc(tab, (t) => mutateMoveNode(t, fromPath, targetParent, targetIdx + 1));
453
- break;
454
- }
455
- case "make-child": {
456
- const target = getNodeAtPath(doc, targetPath);
457
- const len = childList(target).length;
458
- transactDoc(tab, (t) => mutateMoveNode(t, fromPath, targetPath, len));
459
- break;
460
- }
461
- default: {
462
- break;
463
- }
477
+ const slot = dropSlot(tab.doc.document, instruction.type, targetPath);
478
+ if (slot) {
479
+ transactDoc(tab, (t) => mutateMoveNode(t, fromPath, slot.parent, slot.index));
464
480
  }
465
481
  } else if (srcData.type === "block") {
466
- const targetParent = parentElementPath(targetPath) as JxPath;
467
- const targetIdx = childIndex(targetPath) as number;
468
- if (instruction.type !== "make-child" && (!targetParent || typeof targetIdx !== "number")) {
482
+ const slot = dropSlot(tab.doc.document, instruction.type, targetPath);
483
+ if (slot === undefined) {
469
484
  return;
470
485
  }
471
-
472
- switch (instruction.type) {
473
- case "reorder-above": {
474
- transactDoc(tab, (t) =>
475
- mutateInsertNode(
476
- t,
477
- targetParent,
478
- targetIdx,
479
- structuredClone(srcData.fragment as JxMutableNode),
480
- ),
481
- );
482
- break;
483
- }
484
- case "reorder-below": {
485
- transactDoc(tab, (t) =>
486
- mutateInsertNode(
487
- t,
488
- targetParent,
489
- targetIdx + 1,
490
- structuredClone(srcData.fragment as JxMutableNode),
491
- ),
492
- );
493
- break;
494
- }
495
- case "make-child": {
496
- const target = getNodeAtPath(doc, targetPath);
497
- const len = childList(target).length;
498
- transactDoc(tab, (t) =>
499
- mutateInsertNode(t, targetPath, len, structuredClone(srcData.fragment as JxMutableNode)),
500
- );
501
- break;
502
- }
503
- default: {
504
- break;
505
- }
506
- }
507
-
508
- /* Auto-import to `$elements` if the dropped block is a custom component.
509
- Through the ONE service (`files/elements.ts`), which is the whole point of it: this call site
510
- had its own duplicate rule and matched a local component by `ref.endsWith(basename)`, so
511
- dropping `./components/card.json` into a page that already imported `./vendor/card.json`
512
- counted as already imported and produced an element the page could not resolve. */
513
- const fragment = srcData.fragment as JxMutableNode | undefined;
514
- const tag = fragment?.tagName;
515
- if (displayTagName(tag).includes("-")) {
516
- const comp = componentRegistry.find((c: ComponentEntry) => c.tagName === tag);
517
- const before = (tab.doc.document?.$elements ?? []) as ElementsEntry[];
518
- const after = comp ? enableElement(before, comp, tab.documentPath ?? null) : before;
519
- // Only when the list actually GREW. A component the registry cannot name — an npm entry with
520
- // No package, a local one with no path — returns the list unchanged, and writing that back
521
- // Would put an empty `$elements: []` on a document that had none.
522
- if (after.length !== before.length) {
523
- transact(tab, (d: JxMutableNode) => {
524
- d.$elements = after as (string | JxElement)[];
525
- });
526
- }
486
+ /* SAFETY: every minter of a "block" payload — the Insert palette's element and component cards
487
+ and the file drop (`file-drop-action.ts`) — sets `fragment` to the JxMutableNode it inserts. */
488
+ const fragment = srcData.fragment as JxMutableNode;
489
+ /* Auto-import to `$elements` if the dropped block is a custom component, through the rule
490
+ every insertion door shares (`editor/insert-component.ts`, over the one `$elements` service):
491
+ this call site once had its own duplicate rule and matched a local component by
492
+ `ref.endsWith(basename)`, so dropping `./components/card.json` into a page that already
493
+ imported `./vendor/card.json` counted as already imported. The import is part of the same
494
+ transaction as the insert, so one ⌘Z takes back both. */
495
+ if (slot) {
496
+ transactDoc(tab, (t) => {
497
+ mutateInsertNode(t, slot.parent, slot.index, structuredClone(fragment));
498
+ mutateImportComponent(t, fragment.tagName);
499
+ /* The inserted node is the selection, as every other insert leaves it (the slash menu, Enter,
500
+ paste): the Inspector is then on the thing just placed, which is where a dropped image's
501
+ missing alt text or a component's props are filled in. */
502
+ t.session.selection = [[...slot.parent, "children", slot.index]];
503
+ });
527
504
  }
528
505
  }
529
506
  }
@@ -33,9 +33,10 @@
33
33
  import type * as monaco from "monaco-editor";
34
34
  import { loadMonaco, mountStillWanted } from "../services/monaco-lazy";
35
35
  import { monacoTheme } from "../shell";
36
- import { isJsonObject } from "@jxsuite/schema/guards";
36
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
37
37
 
38
- import { getNodeAtPath, renderOnly, updateUi } from "../store";
38
+ import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
39
+ import { renderOnly, updateUi } from "../store";
39
40
  import { activeTab, tabIsLive } from "../workspace/workspace";
40
41
  import { mutateUpdateDef, mutateUpdateProperty, transactDoc } from "../tabs/transact";
41
42
  import { view } from "../view";
@@ -50,11 +51,12 @@ import {
50
51
  } from "../services/monaco-buffer";
51
52
  import { globalEntries, namedFormulaEntries } from "../ui/formula-catalog";
52
53
  import { notify } from "../services/notify";
54
+ import type { NotifyOptions } from "../services/notify";
53
55
 
54
56
  import type { BufferWrites } from "../services/monaco-buffer";
55
57
  import { noteTyping } from "../tabs/typing";
56
58
  import type { OxLintDiagnostic } from "../services/code-services";
57
- import type { JxPrototypeDef } from "@jxsuite/schema/types";
59
+ import type { JsonValue, JxDocumentValue } from "@jxsuite/schema/types";
58
60
  import type { JxPath } from "../state";
59
61
  import type { Tab } from "../tabs/tab";
60
62
 
@@ -78,8 +80,8 @@ type FunctionEditor = NonNullable<typeof view.functionEditor>;
78
80
  function getFunctionBody(tab: Tab | null | undefined, editing: EditingTarget | null | undefined) {
79
81
  const document = tab?.doc.document;
80
82
  // Read body off any object-shaped def (covers legacy entries without $prototype).
81
- const bodyOf = (def: unknown) =>
82
- isJsonObject(def) && typeof def.body === "string" ? def.body : "";
83
+ const bodyOf = (def: JxDocumentValue | undefined) =>
84
+ isJsonObject(def) && isString(def.body) ? def.body : "";
83
85
  if (editing?.type === "def") {
84
86
  return bodyOf(document?.state?.[editing.defName]);
85
87
  } else if (editing?.type === "event") {
@@ -89,6 +91,27 @@ function getFunctionBody(tab: Tab | null | undefined, editing: EditingTarget | n
89
91
  return "";
90
92
  }
91
93
 
94
+ /**
95
+ * Whether one entry of a "lint" answer is an oxlint diagnostic.
96
+ *
97
+ * The code service forwards oxlint's own `--format=json` output (`code-api.ts`), whose every
98
+ * diagnostic carries a string `message` and `severity` and, where it points somewhere, a `labels`
99
+ * array. Those are the members checked here; `setLintMarkers` reads the rest as optional.
100
+ */
101
+ function isLintDiagnostic(value: unknown): value is OxLintDiagnostic {
102
+ return (
103
+ isJsonObject(value) &&
104
+ isString(value.message) &&
105
+ isString(value.severity) &&
106
+ (value.labels === undefined || Array.isArray(value.labels))
107
+ );
108
+ }
109
+
110
+ /** The entries of a "lint" answer that are oxlint diagnostics, in the order they came. */
111
+ function lintDiagnostics(entries: readonly JsonValue[]): OxLintDiagnostic[] {
112
+ return entries.flatMap((entry) => (isLintDiagnostic(entry) ? [entry] : []));
113
+ }
114
+
92
115
  /**
93
116
  * The element the Logic tab draws for Monaco to fill.
94
117
  *
@@ -110,6 +133,10 @@ export const CODE_HOST_SELECTOR = '[part="code-host"]';
110
133
  */
111
134
  export function syncFunctionEditor(host: HTMLElement): void {
112
135
  const tab = activeTab.value;
136
+ /* SAFETY: `editingFunction` is written only by openLogicTarget, and every caller that opens the
137
+ function surface (formula.editDef, formula.editEvent, the Data panel, the Logic tab's Open)
138
+ passes `{ type: "def", defName }` or `{ type: "event", path, eventKey }`, exactly the two
139
+ EditingTarget members. */
113
140
  const editing = tab?.session.ui.editingFunction as EditingTarget | null | undefined;
114
141
  const container = editing && tab ? host.querySelector<HTMLElement>(CODE_HOST_SELECTOR) : null;
115
142
  if (!container || !tab || !editing) {
@@ -120,7 +147,7 @@ export function syncFunctionEditor(host: HTMLElement): void {
120
147
  }
121
148
 
122
149
  const current = view.functionEditor;
123
- const attached = Boolean(current && container.contains(current.getDomNode() as Node | null));
150
+ const attached = Boolean(current && container.contains(current.getDomNode()));
124
151
  /* THE TAB IS HALF OF THE IDENTITY, and the half that used to be missing.
125
152
  `_editingTarget` is a JSON string built from the target alone, and the ordinary target
126
153
  `{"eventKey":"onclick","path":["children",0],"type":"event"}` is the SAME string for the first
@@ -261,7 +288,7 @@ function bodyWriter(tab: Tab, editing: EditingTarget, writes?: BufferWrites) {
261
288
  let wrote = false;
262
289
  if (editing.type === "def") {
263
290
  wrote = transactDoc(tab, (t) => mutateUpdateDef(t, editing.defName, { body: newBody }));
264
- } else if (editing.type === "event") {
291
+ } else {
265
292
  const node = getNodeAtPath(tab.doc.document, editing.path);
266
293
  /* THE ELEMENT THE HANDLER HANGS OFF CAN GO WHILE THE EDITOR IS OPEN — a collaborator's
267
294
  delete arriving over the wire, or the author's own ⌘Z. `editing.path` then resolves to
@@ -275,6 +302,9 @@ function bodyWriter(tab: Tab, editing: EditingTarget, writes?: BufferWrites) {
275
302
  return false;
276
303
  }
277
304
  const current = node[editing.eventKey] || {};
305
+ /* SAFETY: an `on*` key holds an event binding, which the schema makes an object (a `$ref`, a
306
+ function def or an expression def), so the spread copies that binding's fields; `|| {}`
307
+ covers a key with no binding yet. */
278
308
  wrote = transactDoc(tab, (t) =>
279
309
  mutateUpdateProperty(t, editing.path, editing.eventKey, {
280
310
  ...(current as object),
@@ -334,6 +364,8 @@ function bodyWriter(tab: Tab, editing: EditingTarget, writes?: BufferWrites) {
334
364
  */
335
365
  export async function closeFunctionEditor(): Promise<void> {
336
366
  const tab = activeTab.value;
367
+ /* SAFETY: `editingFunction` is written only by openLogicTarget, whose callers pass one of the two
368
+ EditingTarget shapes (see syncFunctionEditor). */
337
369
  const editing = tab?.session.ui.editingFunction as EditingTarget | null | undefined;
338
370
  if (!tab || !editing) {
339
371
  return;
@@ -350,13 +382,13 @@ export async function closeFunctionEditor(): Promise<void> {
350
382
  cancelBufferWrites(editor);
351
383
  const write = editor._commitBody ?? bodyWriter(tab, editing);
352
384
  if (!write(minResult?.code ?? currentCode)) {
385
+ const options: NotifyOptions = { key: "logic.close-refused", source: "Logic" };
386
+ if (tab.documentPath) {
387
+ options.path = tab.documentPath;
388
+ }
353
389
  notify.warn(
354
390
  "The handler could not be saved — source editing holds this document. Your code is still in the editor.",
355
- {
356
- key: "logic.close-refused",
357
- source: "Logic",
358
- ...(tab.documentPath ? { path: tab.documentPath } : {}),
359
- },
391
+ options,
360
392
  );
361
393
  return;
362
394
  }
@@ -487,7 +519,7 @@ async function mountFunctionEditor(
487
519
  tabIsLive(tab) &&
488
520
  bufferIsLive(editor)
489
521
  ) {
490
- setLintMarkers(editor, result.diagnostics as OxLintDiagnostic[]);
522
+ setLintMarkers(editor, lintDiagnostics(result.diagnostics));
491
523
  }
492
524
  });
493
525
 
@@ -527,7 +559,7 @@ async function mountFunctionEditor(
527
559
  return;
528
560
  }
529
561
  if (result?.diagnostics) {
530
- setLintMarkers(editor, result.diagnostics as OxLintDiagnostic[]);
562
+ setLintMarkers(editor, lintDiagnostics(result.diagnostics));
531
563
  }
532
564
  });
533
565
  });
@@ -546,7 +578,7 @@ export async function registerFunctionCompletions() {
546
578
  if (!activeTab.value) {
547
579
  return { suggestions: [] };
548
580
  }
549
- const defs = activeTab.value.doc.document?.state || {};
581
+ const defs = activeTab.value.doc.document.state || {};
550
582
  const word = model.getWordUntilPosition(position);
551
583
  const range = {
552
584
  endColumn: word.endColumn,
@@ -561,13 +593,12 @@ export async function registerFunctionCompletions() {
561
593
  const suggestions: monaco.languages.CompletionItem[] = Object.entries(defs).map(
562
594
  ([key, def]) => {
563
595
  let kind = monacoNs.languages.CompletionItemKind.Variable;
564
- if (
565
- (def as JxPrototypeDef)?.$prototype === "Function" ||
566
- (def as Record<string, unknown>)?.$handler ||
567
- formulaDocs.has(key)
568
- ) {
596
+ // A primitive or array entry carries neither field, which is what reading them off it gave.
597
+ const prototype = isJsonObject(def) ? def.$prototype : undefined;
598
+ const handler = isJsonObject(def) ? def.$handler : undefined;
599
+ if (prototype === "Function" || handler || formulaDocs.has(key)) {
569
600
  kind = monacoNs.languages.CompletionItemKind.Function;
570
- } else if ((def as JxPrototypeDef)?.$prototype) {
601
+ } else if (prototype) {
571
602
  kind = monacoNs.languages.CompletionItemKind.Property;
572
603
  }
573
604
  const item: monaco.languages.CompletionItem = {