@jxsuite/studio 4.1.0 → 5.1.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 (612) hide show
  1. package/README.md +1 -1
  2. package/data/elements-meta.json +5 -15
  3. package/data/html-meta.json +51 -6
  4. package/dist/chunks/{2020-n6tfwnda.js → 2020-g79n01v9.js} +14 -14
  5. package/dist/chunks/action-group-sp6tna8v.js +118 -0
  6. package/dist/chunks/adapter-nj7tnjfn.js +13 -0
  7. package/dist/chunks/cf-account-picker-qwkm9zrf.js +495 -0
  8. package/dist/chunks/cf-settings-71bv5zn9.js +20 -0
  9. package/dist/chunks/color-area-v17df7b8.js +154 -0
  10. package/dist/chunks/color-field-anwybnkn.js +208 -0
  11. package/dist/chunks/color-slider-44ez96fc.js +79 -0
  12. package/dist/chunks/color-xgg3kfw7.js +35 -0
  13. package/dist/chunks/combobox-5e7jev23.js +236 -0
  14. package/dist/chunks/components-vj72gqtq.js +20 -0
  15. package/dist/chunks/content-source-5mex4x1h.js +46 -0
  16. package/dist/chunks/convert-to-repeater-n64h8znc.js +639 -0
  17. package/dist/chunks/dialog-s890b918.js +85 -0
  18. package/dist/chunks/editor-3qhbg51x.js +35 -0
  19. package/dist/chunks/entry-commands-234hjnqw.js +42 -0
  20. package/dist/chunks/extension-sections-3hpcambp.js +651 -0
  21. package/dist/chunks/file-ops-8yhd83xr.js +47 -0
  22. package/dist/chunks/files-hnxqxtsg.js +72 -0
  23. package/dist/chunks/format-host-779sfp2n.js +40 -0
  24. package/dist/chunks/fs-events-b88z7g4h.js +18 -0
  25. package/dist/chunks/git-panel-xwj8fpab.js +49 -0
  26. package/dist/chunks/icons-yy10wk9r.js +402 -0
  27. package/dist/chunks/iframe-entry-15g3n6xv.js +114 -0
  28. package/dist/chunks/iframe-entry-b27vq81n.js +203 -0
  29. package/dist/chunks/iframe-entry-nbyxee1y.js +154 -0
  30. package/dist/chunks/iframe-host-syr0f9sb.js +115 -0
  31. package/dist/chunks/{index-wcnt3r9g.js → index-mdmyx6s2.js} +11 -11
  32. package/dist/chunks/index-n4j7qxyr.js +109 -0
  33. package/dist/chunks/{javascript-q8kpmfah.js → javascript-xvrfrpkb.js} +8 -9
  34. package/dist/chunks/{jsonMode-dkr040ga.js → jsonMode-tyx2kj6p.js} +526 -527
  35. package/dist/chunks/jx-validate-j0wxk72w.js +15 -0
  36. package/dist/chunks/layers-ff81wthn.js +30 -0
  37. package/dist/chunks/layers-panel-pnnghw12.js +40 -0
  38. package/dist/chunks/listbox-6v2ac08j.js +44 -0
  39. package/dist/chunks/lit-html-m244w9nh.js +17 -0
  40. package/dist/chunks/media-picker-cqhhxhhe.js +33 -0
  41. package/dist/chunks/menu-9p2w46gj.js +15 -0
  42. package/dist/chunks/menu-q99sy9rf.js +285 -0
  43. package/dist/chunks/{monaco-binding-rj6xpx9y.js → monaco-binding-sw6en4dw.js} +12 -15
  44. package/dist/chunks/monaco-buffer-bhy3hb6m.js +24 -0
  45. package/dist/chunks/{monaco-setup-vx9bhp1d.js → monaco-setup-8r62fj6y.js} +27 -37
  46. package/dist/chunks/notify-628t0anh.js +21 -0
  47. package/dist/chunks/number-field-5cndyft8.js +72 -0
  48. package/dist/chunks/parse-0zx14y15.js +10 -0
  49. package/dist/chunks/platform-ts9cg1a4.js +15 -0
  50. package/dist/chunks/popover-47z3ytva.js +25 -0
  51. package/dist/chunks/publish-panel-5zt840sy.js +27 -0
  52. package/dist/chunks/quick-search-3748564r.js +45 -0
  53. package/dist/chunks/references-qvvxej7h.js +26 -0
  54. package/dist/chunks/right-panel-eccz92qt.js +45 -0
  55. package/dist/chunks/section-registry-5pq32t0q.js +25 -0
  56. package/dist/chunks/select-2r16ez41.js +49 -0
  57. package/dist/chunks/split-g7nm1rgb.js +191 -0
  58. package/dist/chunks/studio-0hqbpbd0.js +62 -0
  59. package/dist/chunks/{studio-kryvsw6j.js → studio-1k325pwf.js} +48 -48
  60. package/dist/chunks/{studio-b55y6ewx.js → studio-1knfqgy7.js} +58 -58
  61. package/dist/chunks/{studio-2b946z26.js → studio-1z1kcjv4.js} +3628 -6095
  62. package/dist/chunks/studio-3773086z.js +111 -0
  63. package/dist/chunks/{studio-4r1pv6zf.js → studio-38emantv.js} +22 -5
  64. package/dist/chunks/{studio-x813zp48.js → studio-3rz5md06.js} +30 -30
  65. package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
  66. package/dist/chunks/studio-5te5tqng.js +81 -0
  67. package/dist/chunks/studio-5wt9nvhd.js +4763 -0
  68. package/dist/chunks/{studio-p4ngc046.js → studio-6ewqv390.js} +9 -9
  69. package/dist/chunks/{studio-9ab8gqsm.js → studio-6nzaktvy.js} +7 -7
  70. package/dist/chunks/studio-6xa21ej9.js +28 -0
  71. package/dist/chunks/{studio-5ehhackm.js → studio-727xh0e3.js} +19 -19
  72. package/dist/chunks/{studio-gcye7qka.js → studio-7e11jpa9.js} +21 -21
  73. package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
  74. package/dist/chunks/studio-7xnmgv66.js +13615 -0
  75. package/dist/chunks/studio-8scdew0e.js +258 -0
  76. package/dist/chunks/{studio-fbf92ckf.js → studio-93zafjcm.js} +275 -163
  77. package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
  78. package/dist/chunks/studio-a79k90n9.js +1162 -0
  79. package/dist/chunks/studio-aj37eer3.js +422 -0
  80. package/dist/chunks/studio-b0k5tqgp.js +2432 -0
  81. package/dist/chunks/studio-b4s9eykd.js +2811 -0
  82. package/dist/chunks/{studio-f3wqjtk5.js → studio-d0300636.js} +5076 -18
  83. package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
  84. package/dist/chunks/studio-e1pgga3k.js +839 -0
  85. package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
  86. package/dist/chunks/{studio-q43a5y9h.js → studio-g3jevyjt.js} +16 -16
  87. package/dist/chunks/studio-gb13095a.js +2806 -0
  88. package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
  89. package/dist/chunks/{studio-dm19q43r.js → studio-hhvs4sdg.js} +10 -10
  90. package/dist/chunks/{studio-x4qkdat5.js → studio-js8nv53n.js} +1749 -2481
  91. package/dist/chunks/{studio-qjy2z9bv.js → studio-jxp12rnj.js} +32 -137
  92. package/dist/chunks/{studio-trxrabqf.js → studio-k75n7vhp.js} +527 -283
  93. package/dist/chunks/{studio-q9jd1a60.js → studio-kcgff4r0.js} +15 -18
  94. package/dist/chunks/studio-kkqkcp3d.js +17668 -0
  95. package/dist/chunks/studio-mhhyamxf.js +763 -0
  96. package/dist/chunks/{studio-cft9r4r7.js → studio-nq5yf5mp.js} +22 -22
  97. package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
  98. package/dist/chunks/studio-nzzpvzx9.js +185 -0
  99. package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
  100. package/dist/chunks/{studio-3bqpr0zh.js → studio-pxbgypmg.js} +299 -110
  101. package/dist/chunks/studio-q0a3yk4n.js +33 -0
  102. package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
  103. package/dist/chunks/{studio-6yw4y3my.js → studio-qhhm6hbt.js} +8 -8
  104. package/dist/chunks/studio-qk4bfsq2.js +362 -0
  105. package/dist/chunks/{studio-msd847zn.js → studio-qk90fgqm.js} +361 -90
  106. package/dist/chunks/{studio-jkftxyvz.js → studio-r6nvacqs.js} +5861 -2154
  107. package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
  108. package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
  109. package/dist/chunks/studio-rs76k67r.js +12 -0
  110. package/dist/chunks/studio-sbjyc8bt.js +954 -0
  111. package/dist/chunks/{studio-1wagb550.js → studio-syg2tadj.js} +11 -11
  112. package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
  113. package/dist/chunks/studio-tqgryxwg.js +1171 -0
  114. package/dist/chunks/studio-try13h8c.js +8448 -0
  115. package/dist/chunks/studio-vfq8qpjt.js +1219 -0
  116. package/dist/chunks/studio-vhv5tgxm.js +51 -0
  117. package/dist/chunks/{studio-ahn3pdgx.js → studio-vw7mzp6z.js} +52 -38
  118. package/dist/chunks/studio-wqpngpsk.js +174 -0
  119. package/dist/chunks/studio-wqz6dggm.js +1356 -0
  120. package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
  121. package/dist/chunks/studio-yxa81f45.js +12 -0
  122. package/dist/chunks/studio-zdn2g6dt.js +148 -0
  123. package/dist/chunks/swatch-group-t0n6h2rn.js +139 -0
  124. package/dist/chunks/tabs-wbp1cdws.js +156 -0
  125. package/dist/chunks/textfield-abk6qyee.js +73 -0
  126. package/dist/chunks/toast-780pvfbv.js +27 -0
  127. package/dist/chunks/toast-host-3sqv46sn.js +116 -0
  128. package/dist/chunks/toolbar-xbh5bhtr.js +194 -0
  129. package/dist/chunks/tooltip-eptb614w.js +369 -0
  130. package/dist/chunks/tree-a73p0pqm.js +367 -0
  131. package/dist/chunks/{tsMode-76kr53q0.js → tsMode-jy4m86rv.js} +83 -85
  132. package/dist/chunks/workspace-t55jdjbx.js +69 -0
  133. package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
  134. package/dist/iframe-entry.js +1873 -673
  135. package/dist/studio.js +52757 -36535
  136. package/dist/workers/editor.worker.js +1040 -1085
  137. package/dist/workers/json.worker.js +1946 -1991
  138. package/dist/workers/ts.worker.js +4960 -5005
  139. package/index.html +1 -0
  140. package/package.json +18 -52
  141. package/src/about/about-modal.ts +72 -123
  142. package/src/browse/library-commands.ts +20 -49
  143. package/src/browse/library-layouts.ts +87 -218
  144. package/src/browse/library-pane.ts +406 -438
  145. package/src/canvas/canvas-helpers.ts +0 -49
  146. package/src/canvas/canvas-live-render.ts +25 -2
  147. package/src/canvas/canvas-render.ts +666 -231
  148. package/src/canvas/canvas-surface.ts +0 -1
  149. package/src/canvas/canvas-utils.ts +333 -113
  150. package/src/canvas/dialog-path.ts +76 -0
  151. package/src/canvas/dialog-state.ts +67 -0
  152. package/src/canvas/diff-marks.ts +252 -0
  153. package/src/canvas/diff-toolbar.ts +349 -0
  154. package/src/canvas/diff-view.ts +123 -0
  155. package/src/canvas/edit-width-drag.ts +187 -0
  156. package/src/canvas/edit-width.ts +150 -0
  157. package/src/canvas/iframe-entry.ts +125 -8
  158. package/src/canvas/iframe-host.ts +271 -15
  159. package/src/canvas/iframe-interaction.ts +133 -13
  160. package/src/canvas/iframe-patch.ts +7 -1
  161. package/src/canvas/iframe-position.ts +5 -6
  162. package/src/canvas/iframe-protocol.ts +106 -5
  163. package/src/canvas/iframe-render.ts +373 -5
  164. package/src/canvas/iframe-slash.ts +2 -2
  165. package/src/canvas/iframe-subtree.ts +5 -8
  166. package/src/canvas/path-mapping.ts +25 -3
  167. package/src/canvas/popover-path.ts +106 -0
  168. package/src/canvas/popover-state.ts +155 -0
  169. package/src/canvas/surface-registry.ts +21 -10
  170. package/src/collab/presence-chips.ts +51 -73
  171. package/src/commands/app-commands.ts +10 -0
  172. package/src/commands/budget.ts +12 -0
  173. package/src/commands/command-args.ts +404 -6
  174. package/src/commands/defaults.ts +44 -14
  175. package/src/commands/live-context.ts +11 -5
  176. package/src/commands/reference.ts +12 -2
  177. package/src/commands/registry.ts +177 -10
  178. package/src/commands/run-reported.ts +120 -0
  179. package/src/content/entry-commands.ts +16 -23
  180. package/src/content/entry-editor.ts +144 -101
  181. package/src/editor/canvas-slash-bridge.ts +2 -2
  182. package/src/editor/context-menu.ts +49 -200
  183. package/src/editor/convert-to-component.ts +42 -82
  184. package/src/editor/convert-to-repeater.ts +132 -173
  185. package/src/editor/inline-edit.ts +11 -0
  186. package/src/editor/shortcuts.ts +76 -49
  187. package/src/editor/slash-menu.ts +150 -157
  188. package/src/files/components.ts +39 -0
  189. package/src/files/file-ops.ts +117 -11
  190. package/src/files/files.ts +944 -660
  191. package/src/files/json-layout.ts +474 -0
  192. package/src/files/serialize-document.ts +8 -1
  193. package/src/format/convert-file.ts +16 -10
  194. package/src/format/format-host.ts +50 -1
  195. package/src/github/github-auth.ts +71 -29
  196. package/src/github/github-publish.ts +57 -65
  197. package/src/grid/cell-editors.ts +46 -4
  198. package/src/grid/cell-popovers.ts +65 -62
  199. package/src/grid/grid-open.ts +86 -64
  200. package/src/grid/grid-panel.ts +390 -469
  201. package/src/grid/redirects-grid.ts +40 -44
  202. package/src/hosting/layout.ts +2 -0
  203. package/src/i18n/i18n-commands.ts +137 -62
  204. package/src/media/media-pane.ts +83 -133
  205. package/src/new-project/add-repo-modal.ts +125 -176
  206. package/src/new-project/import-tab.ts +181 -252
  207. package/src/new-project/location-fields.ts +93 -160
  208. package/src/new-project/new-project-modal.ts +376 -367
  209. package/src/packages/jxsuite-update.ts +76 -18
  210. package/src/packages/pull-package-sync.ts +5 -1
  211. package/src/panels/activity-panel.ts +137 -104
  212. package/src/panels/ai-chat/chat-markdown.ts +15 -13
  213. package/src/panels/ai-chat/chat-view.ts +307 -472
  214. package/src/panels/ai-chat/composer.ts +175 -163
  215. package/src/panels/ai-chat/sessions-view.ts +31 -62
  216. package/src/panels/ai-panel.ts +213 -185
  217. package/src/panels/block-action-bar.ts +444 -645
  218. package/src/panels/bottom-dock.ts +112 -47
  219. package/src/panels/chat-panel.ts +19 -14
  220. package/src/panels/data-explorer.ts +141 -102
  221. package/src/panels/data-grid.ts +183 -150
  222. package/src/panels/dnd.ts +75 -20
  223. package/src/panels/editors.ts +26 -19
  224. package/src/panels/elements-panel.ts +243 -186
  225. package/src/panels/empty-state.ts +26 -42
  226. package/src/panels/events-panel.ts +950 -729
  227. package/src/panels/formula-workspace.ts +434 -207
  228. package/src/panels/frontmatter-fields.ts +185 -153
  229. package/src/panels/frontmatter-panel.ts +411 -187
  230. package/src/panels/git-diff-open.ts +148 -0
  231. package/src/panels/git-panel.ts +679 -605
  232. package/src/panels/head-panel.ts +617 -435
  233. package/src/panels/i18n-panel.ts +148 -135
  234. package/src/panels/imports-panel.ts +388 -414
  235. package/src/panels/jump-bar.ts +175 -147
  236. package/src/panels/layers-panel.ts +785 -671
  237. package/src/panels/left-panel.ts +166 -94
  238. package/src/panels/navigator-panels.ts +1 -1
  239. package/src/panels/pane-context.ts +529 -677
  240. package/src/panels/pane-grid.ts +265 -241
  241. package/src/panels/panel-registry.ts +15 -4
  242. package/src/panels/problems-panel.ts +181 -99
  243. package/src/panels/properties-panel.ts +1525 -966
  244. package/src/panels/provenance.ts +31 -113
  245. package/src/panels/quick-search.ts +223 -184
  246. package/src/panels/right-panel.ts +135 -169
  247. package/src/panels/seo-modal.ts +346 -167
  248. package/src/panels/settings-menu.ts +114 -661
  249. package/src/panels/settings-pane.ts +102 -86
  250. package/src/panels/signals-panel.ts +1318 -1172
  251. package/src/panels/statement-editor.ts +556 -428
  252. package/src/panels/style-panel.ts +1367 -630
  253. package/src/panels/style-utils.ts +36 -32
  254. package/src/panels/stylebook-doc.ts +30 -73
  255. package/src/panels/stylebook-layers-panel.ts +202 -109
  256. package/src/panels/stylebook-panel.ts +124 -88
  257. package/src/panels/tab-strip.ts +386 -288
  258. package/src/platforms/cloud.ts +106 -16
  259. package/src/platforms/devserver.ts +13 -0
  260. package/src/publish/deploy-checklist.ts +124 -78
  261. package/src/publish/publish-commands.ts +4 -12
  262. package/src/publish/publish-panel.ts +134 -328
  263. package/src/services/a11y-report.ts +100 -43
  264. package/src/services/ai-command-tools.ts +538 -0
  265. package/src/services/ai-project-tools.ts +8 -2
  266. package/src/services/ai-session-store.ts +6 -0
  267. package/src/services/ai-system-prompt.ts +112 -24
  268. package/src/services/ai-tools.ts +36 -212
  269. package/src/services/ai-write-report.ts +174 -0
  270. package/src/services/document-assistant.ts +59 -8
  271. package/src/services/idle.ts +16 -14
  272. package/src/services/live-surfaces.ts +237 -0
  273. package/src/services/model-uri.ts +75 -0
  274. package/src/services/notify.ts +63 -6
  275. package/src/services/popover-report.ts +325 -0
  276. package/src/services/surface-registry.ts +56 -0
  277. package/src/services/tool-executor.ts +6 -0
  278. package/src/settings/contexts-section.ts +301 -299
  279. package/src/settings/contributed-section.ts +361 -222
  280. package/src/settings/css-vars-editor.ts +320 -325
  281. package/src/settings/defs-editor.ts +572 -535
  282. package/src/settings/dependencies-editor.ts +79 -107
  283. package/src/settings/extension-commands.ts +379 -0
  284. package/src/settings/extension-rows.ts +113 -0
  285. package/src/settings/extensions-section.ts +287 -0
  286. package/src/settings/general-settings.ts +130 -181
  287. package/src/settings/head-editor.ts +10 -305
  288. package/src/settings/locales-section.ts +146 -196
  289. package/src/settings/preferences-accounts.ts +1 -1
  290. package/src/settings/preferences-dialog.ts +350 -330
  291. package/src/settings/project-sections.ts +108 -181
  292. package/src/settings/schema-field-ui.ts +11 -399
  293. package/src/settings/section-registry.ts +8 -1
  294. package/src/settings/settings-document.ts +31 -29
  295. package/src/shell/tree.ts +42 -87
  296. package/src/shell.ts +48 -36
  297. package/src/studio.ts +104 -69
  298. package/src/style/token-ref.ts +0 -39
  299. package/src/surfaces/about.json +263 -0
  300. package/src/surfaces/about.ts +163 -0
  301. package/src/surfaces/add-repo.json +486 -0
  302. package/src/surfaces/add-repo.ts +236 -0
  303. package/src/surfaces/ai-chat.json +2185 -0
  304. package/src/surfaces/ai-chat.ts +549 -0
  305. package/src/surfaces/ai-credentials-form.json +332 -0
  306. package/src/surfaces/ai-credentials-form.ts +151 -0
  307. package/src/surfaces/ai-managed-connect.json +108 -0
  308. package/src/surfaces/ai-managed-connect.ts +123 -0
  309. package/src/surfaces/ai-model-picker.json +114 -0
  310. package/src/surfaces/ai-model-picker.ts +139 -0
  311. package/src/surfaces/block-action-bar.json +640 -0
  312. package/src/surfaces/block-action-bar.ts +368 -0
  313. package/src/surfaces/bottom-dock.json +154 -0
  314. package/src/surfaces/bottom-dock.ts +125 -0
  315. package/src/surfaces/canvas-stage.json +444 -0
  316. package/src/surfaces/canvas-stage.ts +253 -0
  317. package/src/surfaces/cf-account-picker.json +300 -0
  318. package/src/surfaces/cf-account-picker.ts +214 -0
  319. package/src/surfaces/commandbar.json +985 -0
  320. package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +417 -391
  321. package/src/surfaces/convert-repeater.json +309 -0
  322. package/src/surfaces/convert-repeater.ts +276 -0
  323. package/src/surfaces/data-actions.json +157 -0
  324. package/src/surfaces/data-actions.ts +115 -0
  325. package/src/surfaces/dialog.json +289 -0
  326. package/src/surfaces/dialog.ts +343 -0
  327. package/src/surfaces/diff-toolbar.json +266 -0
  328. package/src/surfaces/diff-toolbar.ts +139 -0
  329. package/src/surfaces/doc-header.json +739 -0
  330. package/src/surfaces/doc-header.ts +223 -0
  331. package/src/surfaces/empty-state.json +152 -0
  332. package/src/surfaces/empty-state.ts +173 -0
  333. package/src/surfaces/entry-editor.json +281 -0
  334. package/src/surfaces/entry-editor.ts +191 -0
  335. package/src/surfaces/expression-editor.json +977 -0
  336. package/src/surfaces/expression-editor.ts +266 -0
  337. package/src/surfaces/files-panel.json +592 -0
  338. package/src/surfaces/files-panel.ts +301 -0
  339. package/src/surfaces/formula-palette.json +364 -0
  340. package/src/surfaces/formula-palette.ts +340 -0
  341. package/src/surfaces/git-panel.json +1822 -0
  342. package/src/surfaces/git-panel.ts +272 -0
  343. package/src/surfaces/github-auth.json +112 -0
  344. package/src/surfaces/github-auth.ts +139 -0
  345. package/src/surfaces/github-publish.json +206 -0
  346. package/src/surfaces/github-publish.ts +169 -0
  347. package/src/surfaces/grid-cell.json +218 -0
  348. package/src/surfaces/grid-cell.ts +120 -0
  349. package/src/surfaces/grid-open.json +147 -0
  350. package/src/surfaces/grid-open.ts +87 -0
  351. package/src/surfaces/grid-panel.json +706 -0
  352. package/src/surfaces/grid-panel.ts +206 -0
  353. package/src/surfaces/grid-replace.json +179 -0
  354. package/src/surfaces/grid-replace.ts +89 -0
  355. package/src/surfaces/grid-views.json +446 -0
  356. package/src/surfaces/grid-views.ts +172 -0
  357. package/src/surfaces/inspector-dock.json +187 -0
  358. package/src/surfaces/inspector-dock.ts +161 -0
  359. package/src/surfaces/jump-bar.json +243 -0
  360. package/src/surfaces/jump-bar.ts +129 -0
  361. package/src/surfaces/jxsuite-update.json +146 -0
  362. package/src/surfaces/jxsuite-update.ts +149 -0
  363. package/src/surfaces/library-pane.json +1509 -0
  364. package/src/surfaces/library-pane.ts +363 -0
  365. package/src/surfaces/logic-panel.json +1949 -0
  366. package/src/surfaces/logic-panel.ts +369 -0
  367. package/src/surfaces/logic-workspace.json +685 -0
  368. package/src/surfaces/logic-workspace.ts +238 -0
  369. package/src/surfaces/media-browser.json +303 -0
  370. package/src/surfaces/media-browser.ts +145 -0
  371. package/src/surfaces/media-field.json +163 -0
  372. package/src/surfaces/media-field.ts +116 -0
  373. package/src/surfaces/media-pane.json +513 -0
  374. package/src/surfaces/media-pane.ts +197 -0
  375. package/src/surfaces/menu.json +232 -0
  376. package/src/surfaces/menu.ts +375 -0
  377. package/src/surfaces/navigator-dock.json +113 -0
  378. package/src/surfaces/navigator-dock.ts +130 -0
  379. package/src/surfaces/new-project.json +1654 -0
  380. package/src/surfaces/new-project.ts +411 -0
  381. package/src/surfaces/palette.json +535 -0
  382. package/src/surfaces/pane-context.json +1497 -0
  383. package/src/surfaces/pane-context.ts +513 -0
  384. package/src/surfaces/pane-grid.json +188 -0
  385. package/src/surfaces/pane-grid.ts +250 -0
  386. package/src/surfaces/panel-activity.json +563 -0
  387. package/src/surfaces/panel-activity.ts +187 -0
  388. package/src/surfaces/panel-data.json +141 -0
  389. package/src/surfaces/panel-data.ts +156 -0
  390. package/src/surfaces/panel-deploy-checklist.json +283 -0
  391. package/src/surfaces/panel-deploy-checklist.ts +175 -0
  392. package/src/surfaces/panel-elements.json +367 -0
  393. package/src/surfaces/panel-elements.ts +175 -0
  394. package/src/surfaces/panel-i18n.json +569 -0
  395. package/src/surfaces/panel-i18n.ts +212 -0
  396. package/src/surfaces/panel-imports.json +780 -0
  397. package/src/surfaces/panel-imports.ts +209 -0
  398. package/src/surfaces/panel-outline.json +734 -0
  399. package/src/surfaces/panel-outline.ts +326 -0
  400. package/src/surfaces/panel-page.json +1017 -0
  401. package/src/surfaces/panel-page.ts +240 -0
  402. package/src/surfaces/panel-problems.json +497 -0
  403. package/src/surfaces/panel-problems.ts +157 -0
  404. package/src/surfaces/panel-signals.json +1973 -0
  405. package/src/surfaces/panel-signals.ts +436 -0
  406. package/src/surfaces/panel-stylebook-layers.json +317 -0
  407. package/src/surfaces/panel-stylebook-layers.ts +155 -0
  408. package/src/surfaces/preferences.json +850 -0
  409. package/src/surfaces/preferences.ts +332 -0
  410. package/src/surfaces/progress-modal.json +110 -0
  411. package/src/surfaces/progress-modal.ts +150 -0
  412. package/src/surfaces/properties-panel.json +1578 -0
  413. package/src/surfaces/properties-panel.ts +337 -0
  414. package/src/surfaces/publish.json +945 -0
  415. package/src/surfaces/publish.ts +392 -0
  416. package/src/surfaces/push-plan.json +110 -0
  417. package/src/surfaces/push-plan.ts +87 -0
  418. package/src/surfaces/rail.json +255 -0
  419. package/src/surfaces/rail.ts +206 -0
  420. package/src/surfaces/reference-field.json +191 -0
  421. package/src/surfaces/reference-field.ts +168 -0
  422. package/src/surfaces/schema-builder.json +1011 -0
  423. package/src/surfaces/schema-builder.ts +181 -0
  424. package/src/surfaces/schema-form.json +1013 -0
  425. package/src/surfaces/schema-form.ts +287 -0
  426. package/src/surfaces/secret-field.json +60 -0
  427. package/src/surfaces/secret-field.ts +146 -0
  428. package/src/surfaces/seo.json +932 -0
  429. package/src/surfaces/seo.ts +334 -0
  430. package/src/surfaces/settings-contexts.json +538 -0
  431. package/src/surfaces/settings-contexts.ts +196 -0
  432. package/src/surfaces/settings-contributed.json +489 -0
  433. package/src/surfaces/settings-contributed.ts +199 -0
  434. package/src/surfaces/settings-css-vars.json +820 -0
  435. package/src/surfaces/settings-css-vars.ts +199 -0
  436. package/src/surfaces/settings-defs.json +1363 -0
  437. package/src/surfaces/settings-defs.ts +232 -0
  438. package/src/surfaces/settings-deploy.json +108 -0
  439. package/src/surfaces/settings-deploy.ts +135 -0
  440. package/src/surfaces/settings-extensions.json +486 -0
  441. package/src/surfaces/settings-extensions.ts +201 -0
  442. package/src/surfaces/settings-head.json +779 -0
  443. package/src/surfaces/settings-head.ts +397 -0
  444. package/src/surfaces/settings-locales.json +420 -0
  445. package/src/surfaces/settings-locales.ts +137 -0
  446. package/src/surfaces/settings-overview.json +423 -0
  447. package/src/surfaces/settings-overview.ts +218 -0
  448. package/src/surfaces/settings-packages.json +549 -0
  449. package/src/surfaces/settings-packages.ts +158 -0
  450. package/src/surfaces/settings-pane.json +147 -0
  451. package/src/surfaces/settings-pane.ts +150 -0
  452. package/src/surfaces/settings-rawjson.json +104 -0
  453. package/src/surfaces/settings-rawjson.ts +107 -0
  454. package/src/surfaces/shell.json +99 -0
  455. package/src/surfaces/shell.ts +30 -0
  456. package/src/surfaces/slash-menu.json +180 -0
  457. package/src/surfaces/slash-menu.ts +272 -0
  458. package/src/surfaces/statements.json +607 -0
  459. package/src/surfaces/statements.ts +238 -0
  460. package/src/surfaces/statusbar.json +94 -0
  461. package/src/{panels → surfaces}/statusbar.ts +164 -90
  462. package/src/surfaces/style-panel.json +1643 -0
  463. package/src/surfaces/style-panel.ts +338 -0
  464. package/src/surfaces/stylebook-chrome.json +122 -0
  465. package/src/surfaces/stylebook-chrome.ts +122 -0
  466. package/src/surfaces/tab-strip.json +448 -0
  467. package/src/surfaces/tab-strip.ts +200 -0
  468. package/src/surfaces/target-line.json +419 -0
  469. package/src/surfaces/target-line.ts +349 -0
  470. package/src/surfaces/toasts.json +189 -0
  471. package/src/surfaces/welcome.json +571 -0
  472. package/src/surfaces/welcome.ts +338 -0
  473. package/src/tabs/project-config.ts +111 -21
  474. package/src/tabs/tab.ts +52 -1
  475. package/src/types.ts +22 -0
  476. package/src/ui/ai-credentials-form.ts +104 -100
  477. package/src/ui/ai-managed-connect.ts +54 -36
  478. package/src/ui/ai-model-picker.ts +75 -47
  479. package/src/ui/cf-account-picker.ts +76 -141
  480. package/src/ui/color-selector.ts +80 -301
  481. package/src/ui/dynamic-slot.ts +43 -283
  482. package/src/ui/expression-editor.ts +797 -576
  483. package/src/ui/field-input.ts +8 -181
  484. package/src/ui/form-controls.ts +838 -366
  485. package/src/ui/formula-chips.ts +80 -85
  486. package/src/ui/kit.ts +33 -0
  487. package/src/ui/layers.ts +296 -593
  488. package/src/ui/media-picker.ts +203 -284
  489. package/src/ui/panel-resize.ts +251 -64
  490. package/src/ui/popover-surface.ts +153 -0
  491. package/src/ui/progress-modal.ts +22 -60
  492. package/src/ui/regions.ts +13 -7
  493. package/src/ui/schema-form.ts +906 -440
  494. package/src/ui/surface.ts +122 -0
  495. package/src/ui/unit-selector.ts +15 -131
  496. package/src/ui/value-source.ts +14 -0
  497. package/src/ui/virtual-window.ts +88 -9
  498. package/src/utils/canvas-media.ts +72 -0
  499. package/src/utils/edit-display.ts +7 -2
  500. package/src/utils/element-selectors.ts +69 -0
  501. package/src/utils/link-target.ts +2 -2
  502. package/src/utils/studio-utils.ts +0 -10
  503. package/src/view.ts +15 -0
  504. package/src/workspace/pane-derive.ts +36 -14
  505. package/src/workspace/workspace.ts +75 -6
  506. package/styles/canvas.css +72 -467
  507. package/styles/forced-colors.css +48 -82
  508. package/styles/forced-colors.json +41 -0
  509. package/styles/inspector.css +2 -1301
  510. package/styles/overlays.css +96 -2823
  511. package/styles/panels.css +6 -1423
  512. package/styles/shell-frame.css +272 -0
  513. package/styles/shell-frame.json +227 -0
  514. package/styles/shell.css +0 -1568
  515. package/styles/tokens.css +65 -136
  516. package/styles/tokens.json +84 -0
  517. package/dist/chunks/Overlay.dev-etqjwyf9.js +0 -23
  518. package/dist/chunks/adapter-jkcyhgtr.js +0 -14
  519. package/dist/chunks/cf-account-picker-en86v7x7.js +0 -163
  520. package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
  521. package/dist/chunks/components-zmx10t62.js +0 -21
  522. package/dist/chunks/content-source-48xg86wj.js +0 -49
  523. package/dist/chunks/convert-to-repeater-43tfn7cs.js +0 -268
  524. package/dist/chunks/editor-cptq5jp1.js +0 -37
  525. package/dist/chunks/entry-commands-e63f1xc0.js +0 -46
  526. package/dist/chunks/extension-sections-txv08xxg.js +0 -311
  527. package/dist/chunks/file-ops-wbh4hhsx.js +0 -48
  528. package/dist/chunks/files-3kfkwhk4.js +0 -93
  529. package/dist/chunks/flow-qbfgrpeh.js +0 -634
  530. package/dist/chunks/focus-trap.esm-9t2drp0g.js +0 -1025
  531. package/dist/chunks/focus-visible-6eg70z18.js +0 -167
  532. package/dist/chunks/format-host-w16q81tf.js +0 -43
  533. package/dist/chunks/fs-events-hrrg328g.js +0 -21
  534. package/dist/chunks/git-panel-532whr1y.js +0 -59
  535. package/dist/chunks/index-zqxmqxmh.js +0 -109
  536. package/dist/chunks/jx-validate-8er6gbxy.js +0 -19
  537. package/dist/chunks/layers-panel-07hm7g5j.js +0 -67
  538. package/dist/chunks/layers-q75tj2mf.js +0 -45
  539. package/dist/chunks/lit-html-j055mkh8.js +0 -22
  540. package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
  541. package/dist/chunks/notify-yjm79n4s.js +0 -30
  542. package/dist/chunks/parse-24d0gay3.js +0 -19
  543. package/dist/chunks/platform-ba1j1gbh.js +0 -16
  544. package/dist/chunks/publish-panel-v9st96ja.js +0 -29
  545. package/dist/chunks/quick-search-zccjp6gv.js +0 -66
  546. package/dist/chunks/references-3qx8fkyp.js +0 -29
  547. package/dist/chunks/right-panel-vm3b6kwy.js +0 -46
  548. package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
  549. package/dist/chunks/sp-overlay.dev-qgvhnxf4.js +0 -18
  550. package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
  551. package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
  552. package/dist/chunks/sp-tooltip.dev-4sastdnw.js +0 -15
  553. package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
  554. package/dist/chunks/studio-0a5qrh01.js +0 -3
  555. package/dist/chunks/studio-0bq6eh7v.js +0 -12
  556. package/dist/chunks/studio-18j3bmcz.js +0 -14
  557. package/dist/chunks/studio-1ngbejft.js +0 -181
  558. package/dist/chunks/studio-4b5z1x43.js +0 -424
  559. package/dist/chunks/studio-4n2b5gzb.js +0 -357
  560. package/dist/chunks/studio-4rzyrtjz.js +0 -426
  561. package/dist/chunks/studio-5fx3g9jg.js +0 -4325
  562. package/dist/chunks/studio-5myknm0a.js +0 -1903
  563. package/dist/chunks/studio-7afd21nw.js +0 -67
  564. package/dist/chunks/studio-7nte2hj4.js +0 -613
  565. package/dist/chunks/studio-8jpzqk5s.js +0 -128
  566. package/dist/chunks/studio-8q517dfr.js +0 -24
  567. package/dist/chunks/studio-950k0dx6.js +0 -6939
  568. package/dist/chunks/studio-9n4mrmnb.js +0 -184
  569. package/dist/chunks/studio-a0tswy0w.js +0 -58
  570. package/dist/chunks/studio-ahnzd9rg.js +0 -23
  571. package/dist/chunks/studio-bgxt93ga.js +0 -62
  572. package/dist/chunks/studio-cmb03bg5.js +0 -13890
  573. package/dist/chunks/studio-d1ks410h.js +0 -175
  574. package/dist/chunks/studio-ef49pnzx.js +0 -387
  575. package/dist/chunks/studio-eqq1w638.js +0 -113
  576. package/dist/chunks/studio-ew0djmhg.js +0 -341
  577. package/dist/chunks/studio-gfgb8pe6.js +0 -1652
  578. package/dist/chunks/studio-h4rxscfc.js +0 -10
  579. package/dist/chunks/studio-jc994dnr.js +0 -1066
  580. package/dist/chunks/studio-kyh9avvv.js +0 -28
  581. package/dist/chunks/studio-m3hwn7y1.js +0 -120
  582. package/dist/chunks/studio-mtfnaqs9.js +0 -659
  583. package/dist/chunks/studio-n6j9t10q.js +0 -318
  584. package/dist/chunks/studio-n8b9wqwy.js +0 -291
  585. package/dist/chunks/studio-qcy05dp8.js +0 -1743
  586. package/dist/chunks/studio-qq6jym04.js +0 -53
  587. package/dist/chunks/studio-rdx8jcxy.js +0 -83
  588. package/dist/chunks/studio-rn9ta2mz.js +0 -111
  589. package/dist/chunks/studio-t7qb9db8.js +0 -665
  590. package/dist/chunks/studio-tmc5emrw.js +0 -8
  591. package/dist/chunks/studio-z6nw2ek2.js +0 -18
  592. package/dist/chunks/studio-zczps70q.js +0 -378
  593. package/dist/chunks/studio-zqazsct2.js +0 -1823
  594. package/dist/chunks/workspace-fjx52ryv.js +0 -89
  595. package/src/panels/activity-bar.ts +0 -251
  596. package/src/panels/panel-scheduler.ts +0 -219
  597. package/src/panels/style-inputs.ts +0 -237
  598. package/src/panels/target-line.ts +0 -274
  599. package/src/panels/welcome-screen.ts +0 -346
  600. package/src/ui/button-group.ts +0 -102
  601. package/src/ui/choice-field.ts +0 -72
  602. package/src/ui/field-row.ts +0 -249
  603. package/src/ui/formula-palette.ts +0 -213
  604. package/src/ui/icons.ts +0 -52
  605. package/src/ui/jx-theme.ts +0 -130
  606. package/src/ui/spectrum.ts +0 -340
  607. package/src/ui/value-selector.ts +0 -174
  608. package/src/ui/widgets.ts +0 -172
  609. /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
  610. /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
  611. /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
  612. /package/dist/chunks/{tsMode-ef187txx.css → tsMode-hnxxb73h.css} +0 -0
@@ -1,45 +1,45 @@
1
1
  import {
2
- commitTabBuffers
3
- } from "./studio-wcy8trfx.js";
4
- import {
5
- applyDocOpToDoc,
6
- childArray,
7
- cloneValue
8
- } from "./studio-5ehhackm.js";
9
- import {
10
- childIndex,
11
- getNodeAtPath,
12
- isAncestor,
13
- normalizeArrayChildren,
14
- parentElementPath,
15
- pathsEqual,
16
- projectState
17
- } from "./studio-p4ngc046.js";
18
- import {
19
- computed,
20
- effect,
21
2
  effectScope,
22
- notify,
23
3
  onScopeDispose,
4
+ effect,
24
5
  reactive,
25
- toRaw
26
- } from "./studio-xrapxwwc.js";
6
+ toRaw,
7
+ computed,
8
+ notify2
9
+ } from "./studio-p1dw8wfw.js";
10
+ import {
11
+ commitTabBuffers2
12
+ } from "./studio-q3x06vmj.js";
13
+ import {
14
+ getPlatform2
15
+ } from "./studio-6nzaktvy.js";
16
+ import {
17
+ formatByName2,
18
+ formatForPath2,
19
+ defaultContentFormat2
20
+ } from "./studio-vw7mzp6z.js";
27
21
  import {
28
- ensureNestedStyle,
29
22
  getNestedStyle,
23
+ ensureNestedStyle,
30
24
  isEventBinding
31
- } from "./studio-q7v10cg2.js";
25
+ } from "./studio-7r42c6ca.js";
32
26
  import {
33
- defaultContentFormat,
34
- formatByName,
35
- formatForPath
36
- } from "./studio-ahn3pdgx.js";
27
+ getNodeAtPath2,
28
+ normalizeArrayChildren,
29
+ parentElementPath,
30
+ childIndex,
31
+ pathsEqual,
32
+ isAncestor,
33
+ projectState
34
+ } from "./studio-6ewqv390.js";
37
35
  import {
38
- getPlatform
39
- } from "./studio-9ab8gqsm.js";
36
+ cloneValue2,
37
+ childArray2,
38
+ applyDocOpToDoc2
39
+ } from "./studio-727xh0e3.js";
40
40
  import {
41
- __require
42
- } from "./studio-a0tswy0w.js";
41
+ __preload
42
+ } from "./studio-5te5tqng.js";
43
43
 
44
44
  // ../schema/src/locale.ts
45
45
  var RTL_SCRIPTS = new Set([
@@ -237,9 +237,9 @@ function resolveExt(def) {
237
237
  return { ext: ".json", unresolvedFormat: null };
238
238
  }
239
239
  if (def.format === undefined || def.format === "") {
240
- return { ext: defaultContentFormat()?.extensions[0] ?? ".json", unresolvedFormat: null };
240
+ return { ext: defaultContentFormat2()?.extensions[0] ?? ".json", unresolvedFormat: null };
241
241
  }
242
- const format = formatByName(def.format);
242
+ const format = formatByName2(def.format);
243
243
  return format?.extensions[0] === undefined ? { ext: null, unresolvedFormat: def.format } : { ext: format.extensions[0], unresolvedFormat: null };
244
244
  }
245
245
  function sourcePattern(source, locales) {
@@ -319,9 +319,6 @@ function collectionForFile(path, config) {
319
319
  }
320
320
 
321
321
  // src/utils/studio-utils.ts
322
- function camelToKebab(str) {
323
- return str.replaceAll(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);
324
- }
325
322
  function camelToLabel(prop) {
326
323
  return prop.replaceAll(/([A-Z])/g, " $1").replace(/^./, (c) => c.toUpperCase());
327
324
  }
@@ -409,7 +406,7 @@ function findContentTypeSchema(documentPath, projectConfig) {
409
406
  return null;
410
407
  }
411
408
  if (!match.fileBacked) {
412
- const ext = match.ext ?? defaultContentFormat()?.extensions[0] ?? ".json";
409
+ const ext = match.ext ?? defaultContentFormat2()?.extensions[0] ?? ".json";
413
410
  if (!documentPath.toLowerCase().endsWith(ext.toLowerCase())) {
414
411
  return null;
415
412
  }
@@ -622,7 +619,7 @@ function setTransactGate(fn) {
622
619
  }
623
620
  function rollbackFailedTransaction(tab, record, selectionBefore, dirtyBefore) {
624
621
  for (let i = record.docOps.length - 1;i >= 0; i--) {
625
- applyDocOpToDoc(tab.doc.document, toRaw(record.docOps[i].inverse));
622
+ applyDocOpToDoc2(tab.doc.document, toRaw(record.docOps[i].inverse));
626
623
  }
627
624
  for (let i = record.fmOps.length - 1;i >= 0; i--) {
628
625
  const op = record.fmOps[i];
@@ -726,7 +723,7 @@ function materializeState(snapshots, target) {
726
723
  const doc = jsonClone(snapshots[base].document);
727
724
  for (let i = base + 1;i <= target; i++) {
728
725
  for (const op of snapshots[i].forwardOps ?? []) {
729
- applyDocOpToDoc(doc, op);
726
+ applyDocOpToDoc2(doc, op);
730
727
  }
731
728
  }
732
729
  return doc;
@@ -743,8 +740,8 @@ function applyExternalDocOps(tab, ops) {
743
740
  }
744
741
  var DOC_META_KEYS = new Set(["state", "$media", "$head", "$elements", "imports", "$layout"]);
745
742
  function applyDocOp(tab, op) {
746
- const prev = op.op === "set-key" ? getNodeAtPath(tab.doc.document, op.path)?.[op.key] : null;
747
- applyDocOpToDoc(tab.doc.document, op);
743
+ const prev = op.op === "set-key" ? getNodeAtPath2(tab.doc.document, op.path)?.[op.key] : null;
744
+ applyDocOpToDoc2(tab.doc.document, op);
748
745
  recordDocOp({ forward: op, inverse: op });
749
746
  switch (op.op) {
750
747
  case "set-key": {
@@ -938,14 +935,14 @@ function redo(tab) {
938
935
  tab.doc.dirty = true;
939
936
  }
940
937
  function mutateInsertNode(tab, parentPath, index, nodeDef) {
941
- const parent = getNodeAtPath(tab.doc.document, parentPath);
938
+ const parent = getNodeAtPath2(tab.doc.document, parentPath);
942
939
  if (!parent) {
943
940
  return;
944
941
  }
945
- childArray(parent).splice(index, 0, structuredClone(nodeDef));
942
+ childArray2(parent).splice(index, 0, structuredClone(nodeDef));
946
943
  recordPatch({ index, op: "insert", parentPath });
947
944
  recordDocOp({
948
- forward: { index, node: cloneValue(nodeDef), op: "insert-child", parentPath },
945
+ forward: { index, node: cloneValue2(nodeDef), op: "insert-child", parentPath },
949
946
  inverse: { index, op: "remove-child", parentPath }
950
947
  });
951
948
  }
@@ -955,11 +952,11 @@ function mutateRemoveNode(tab, path) {
955
952
  }
956
953
  const elemPath = parentElementPath(path);
957
954
  const idx = childIndex(path);
958
- const [removed] = getNodeAtPath(tab.doc.document, elemPath).children.splice(idx, 1);
955
+ const [removed] = getNodeAtPath2(tab.doc.document, elemPath).children.splice(idx, 1);
959
956
  recordPatch({ op: "remove", path });
960
957
  recordDocOp({
961
958
  forward: { index: idx, op: "remove-child", parentPath: elemPath },
962
- inverse: { index: idx, node: cloneValue(removed), op: "insert-child", parentPath: elemPath }
959
+ inverse: { index: idx, node: cloneValue2(removed), op: "insert-child", parentPath: elemPath }
963
960
  });
964
961
  tab.session.selection = pruneSelection(tab.session.selection, path);
965
962
  }
@@ -967,17 +964,17 @@ function mutateDuplicateNode(tab, path) {
967
964
  if (!path || !isSpliceablePath(path)) {
968
965
  return;
969
966
  }
970
- const node = getNodeAtPath(tab.doc.document, path);
967
+ const node = getNodeAtPath2(tab.doc.document, path);
971
968
  if (!node) {
972
969
  return;
973
970
  }
974
971
  const elemPath = parentElementPath(path);
975
972
  const idx = childIndex(path);
976
973
  const clone = structuredClone(toRaw(node));
977
- getNodeAtPath(tab.doc.document, elemPath).children.splice(idx + 1, 0, clone);
974
+ getNodeAtPath2(tab.doc.document, elemPath).children.splice(idx + 1, 0, clone);
978
975
  recordPatch({ index: idx + 1, op: "insert", parentPath: elemPath });
979
976
  recordDocOp({
980
- forward: { index: idx + 1, node: cloneValue(clone), op: "insert-child", parentPath: elemPath },
977
+ forward: { index: idx + 1, node: cloneValue2(clone), op: "insert-child", parentPath: elemPath },
981
978
  inverse: { index: idx + 1, op: "remove-child", parentPath: elemPath }
982
979
  });
983
980
  tab.session.selection = [[...elemPath, "children", idx + 1]];
@@ -1009,7 +1006,7 @@ function mutateWrapNode(tab, path, wrapperTag = "div") {
1009
1006
  if (!path || !isSpliceablePath(path)) {
1010
1007
  return;
1011
1008
  }
1012
- const node = getNodeAtPath(tab.doc.document, path);
1009
+ const node = getNodeAtPath2(tab.doc.document, path);
1013
1010
  if (!node) {
1014
1011
  return;
1015
1012
  }
@@ -1019,11 +1016,11 @@ function mutateWrapNode(tab, path, wrapperTag = "div") {
1019
1016
  children: [structuredClone(toRaw(node))],
1020
1017
  tagName: wrapperTag
1021
1018
  };
1022
- const original = cloneValue(node);
1023
- getNodeAtPath(tab.doc.document, elemPath).children.splice(idx, 1, wrapper);
1019
+ const original = cloneValue2(node);
1020
+ getNodeAtPath2(tab.doc.document, elemPath).children.splice(idx, 1, wrapper);
1024
1021
  recordPatch({ op: "replace", path });
1025
1022
  recordDocOp({
1026
- forward: { index: idx, node: cloneValue(wrapper), op: "set-child", parentPath: elemPath },
1023
+ forward: { index: idx, node: cloneValue2(wrapper), op: "set-child", parentPath: elemPath },
1027
1024
  inverse: { index: idx, node: original, op: "set-child", parentPath: elemPath }
1028
1025
  });
1029
1026
  tab.session.selection = [[...elemPath, "children", idx]];
@@ -1035,8 +1032,8 @@ function mutateMoveNode(tab, fromPath, toParentPath, toIndex) {
1035
1032
  if (!fromParentPath || typeof fromIdx !== "number") {
1036
1033
  return;
1037
1034
  }
1038
- const fromParent = getNodeAtPath(doc, fromParentPath);
1039
- const toParent = getNodeAtPath(doc, toParentPath);
1035
+ const fromParent = getNodeAtPath2(doc, fromParentPath);
1036
+ const toParent = getNodeAtPath2(doc, toParentPath);
1040
1037
  if (!fromParent || !Array.isArray(fromParent.children) || !toParent) {
1041
1038
  return;
1042
1039
  }
@@ -1048,7 +1045,7 @@ function mutateMoveNode(tab, fromPath, toParentPath, toIndex) {
1048
1045
  if (fromParent === toParent && fromIdx < toIndex) {
1049
1046
  adjustedIndex -= 1;
1050
1047
  }
1051
- childArray(toParent).splice(adjustedIndex, 0, node);
1048
+ childArray2(toParent).splice(adjustedIndex, 0, node);
1052
1049
  recordPatch({ fromPath, op: "move", toIndex: adjustedIndex, toParentPath });
1053
1050
  recordDocOp({
1054
1051
  forward: {
@@ -1075,18 +1072,18 @@ function mutateMoveNode(tab, fromPath, toParentPath, toIndex) {
1075
1072
  }
1076
1073
  }
1077
1074
  function mutateUpdateProperty(tab, path, key, value) {
1078
- const node = getNodeAtPath(tab.doc.document, path);
1075
+ const node = getNodeAtPath2(tab.doc.document, path);
1079
1076
  if (!node) {
1080
1077
  return;
1081
1078
  }
1082
1079
  const prev = node[key];
1083
- const before = cloneValue(prev);
1080
+ const before = cloneValue2(prev);
1084
1081
  if (value === undefined || value === null || value === "") {
1085
1082
  delete node[key];
1086
1083
  } else {
1087
1084
  node[key] = value;
1088
1085
  }
1089
- recordDocOp(setKeyPair(path, key, before, cloneValue(node[key])));
1086
+ recordDocOp(setKeyPair(path, key, before, cloneValue2(node[key])));
1090
1087
  if (key === "textContent") {
1091
1088
  recordPatch({ op: "set-text", path });
1092
1089
  } else if (key === "style") {
@@ -1098,8 +1095,8 @@ function mutateUpdateProperty(tab, path, key, value) {
1098
1095
  }
1099
1096
  }
1100
1097
  function mutateUpdateStyle(tab, path, prop, value) {
1101
- const node = getNodeAtPath(tab.doc.document, path);
1102
- const styleBefore = cloneValue(node.style);
1098
+ const node = getNodeAtPath2(tab.doc.document, path);
1099
+ const styleBefore = cloneValue2(node.style);
1103
1100
  if (!node.style) {
1104
1101
  node.style = {};
1105
1102
  }
@@ -1111,12 +1108,12 @@ function mutateUpdateStyle(tab, path, prop, value) {
1111
1108
  if (Object.keys(node.style).length === 0) {
1112
1109
  delete node.style;
1113
1110
  }
1114
- recordDocOp(setKeyPair(path, "style", styleBefore, cloneValue(node.style)));
1111
+ recordDocOp(setKeyPair(path, "style", styleBefore, cloneValue2(node.style)));
1115
1112
  recordPatch({ op: "set-style", path });
1116
1113
  }
1117
1114
  function mutateUpdateAttribute(tab, path, attr, value) {
1118
- const node = getNodeAtPath(tab.doc.document, path);
1119
- const attrsBefore = cloneValue(node.attributes);
1115
+ const node = getNodeAtPath2(tab.doc.document, path);
1116
+ const attrsBefore = cloneValue2(node.attributes);
1120
1117
  if (!node.attributes) {
1121
1118
  node.attributes = {};
1122
1119
  }
@@ -1128,15 +1125,15 @@ function mutateUpdateAttribute(tab, path, attr, value) {
1128
1125
  if (Object.keys(node.attributes).length === 0) {
1129
1126
  delete node.attributes;
1130
1127
  }
1131
- recordDocOp(setKeyPair(path, "attributes", attrsBefore, cloneValue(node.attributes)));
1128
+ recordDocOp(setKeyPair(path, "attributes", attrsBefore, cloneValue2(node.attributes)));
1132
1129
  recordPatch({ attr, op: "set-attr", path });
1133
1130
  }
1134
1131
  function mutateUpdateMediaStyle(tab, path, mediaName, prop, value) {
1135
1132
  if (!mediaName) {
1136
1133
  return mutateUpdateStyle(tab, path, prop, value);
1137
1134
  }
1138
- const node = getNodeAtPath(tab.doc.document, path);
1139
- const styleBefore = cloneValue(node.style);
1135
+ const node = getNodeAtPath2(tab.doc.document, path);
1136
+ const styleBefore = cloneValue2(node.style);
1140
1137
  if (!node.style) {
1141
1138
  node.style = {};
1142
1139
  }
@@ -1153,12 +1150,12 @@ function mutateUpdateMediaStyle(tab, path, mediaName, prop, value) {
1153
1150
  if (Object.keys(node.style).length === 0) {
1154
1151
  delete node.style;
1155
1152
  }
1156
- recordDocOp(setKeyPair(path, "style", styleBefore, cloneValue(node.style)));
1153
+ recordDocOp(setKeyPair(path, "style", styleBefore, cloneValue2(node.style)));
1157
1154
  recordPatch({ op: "set-style", path });
1158
1155
  }
1159
1156
  function mutateUpdateNestedStyle(tab, path, selector, prop, value) {
1160
- const node = getNodeAtPath(tab.doc.document, path);
1161
- const styleBefore = cloneValue(node.style);
1157
+ const node = getNodeAtPath2(tab.doc.document, path);
1158
+ const styleBefore = cloneValue2(node.style);
1162
1159
  if (!node.style) {
1163
1160
  node.style = {};
1164
1161
  }
@@ -1174,12 +1171,12 @@ function mutateUpdateNestedStyle(tab, path, selector, prop, value) {
1174
1171
  if (Object.keys(node.style).length === 0) {
1175
1172
  delete node.style;
1176
1173
  }
1177
- recordDocOp(setKeyPair(path, "style", styleBefore, cloneValue(node.style)));
1174
+ recordDocOp(setKeyPair(path, "style", styleBefore, cloneValue2(node.style)));
1178
1175
  recordPatch({ op: "set-style", path });
1179
1176
  }
1180
1177
  function mutateUpdateMediaNestedStyle(tab, path, mediaName, selector, prop, value) {
1181
- const node = getNodeAtPath(tab.doc.document, path);
1182
- const styleBefore = cloneValue(node.style);
1178
+ const node = getNodeAtPath2(tab.doc.document, path);
1179
+ const styleBefore = cloneValue2(node.style);
1183
1180
  if (!node.style) {
1184
1181
  node.style = {};
1185
1182
  }
@@ -1200,7 +1197,7 @@ function mutateUpdateMediaNestedStyle(tab, path, mediaName, selector, prop, valu
1200
1197
  if (Object.keys(node.style).length === 0) {
1201
1198
  delete node.style;
1202
1199
  }
1203
- recordDocOp(setKeyPair(path, "style", styleBefore, cloneValue(node.style)));
1200
+ recordDocOp(setKeyPair(path, "style", styleBefore, cloneValue2(node.style)));
1204
1201
  recordPatch({ op: "set-style", path });
1205
1202
  }
1206
1203
  function pruneEmptyStylePath(root, stylePath) {
@@ -1222,8 +1219,8 @@ function pruneEmptyStylePath(root, stylePath) {
1222
1219
  }
1223
1220
  }
1224
1221
  function mutateUpdateNestedStylePath(tab, path, stylePath, prop, value) {
1225
- const node = getNodeAtPath(tab.doc.document, path);
1226
- const styleBefore = cloneValue(node.style);
1222
+ const node = getNodeAtPath2(tab.doc.document, path);
1223
+ const styleBefore = cloneValue2(node.style);
1227
1224
  if (!node.style) {
1228
1225
  node.style = {};
1229
1226
  }
@@ -1240,12 +1237,12 @@ function mutateUpdateNestedStylePath(tab, path, stylePath, prop, value) {
1240
1237
  if (Object.keys(node.style).length === 0) {
1241
1238
  delete node.style;
1242
1239
  }
1243
- recordDocOp(setKeyPair(path, "style", styleBefore, cloneValue(node.style)));
1240
+ recordDocOp(setKeyPair(path, "style", styleBefore, cloneValue2(node.style)));
1244
1241
  recordPatch({ op: "set-style", path });
1245
1242
  }
1246
1243
  function mutateUpdateMediaNestedStylePath(tab, path, mediaName, stylePath, prop, value) {
1247
- const node = getNodeAtPath(tab.doc.document, path);
1248
- const styleBefore = cloneValue(node.style);
1244
+ const node = getNodeAtPath2(tab.doc.document, path);
1245
+ const styleBefore = cloneValue2(node.style);
1249
1246
  if (!node.style) {
1250
1247
  node.style = {};
1251
1248
  }
@@ -1267,45 +1264,45 @@ function mutateUpdateMediaNestedStylePath(tab, path, mediaName, stylePath, prop,
1267
1264
  if (Object.keys(node.style).length === 0) {
1268
1265
  delete node.style;
1269
1266
  }
1270
- recordDocOp(setKeyPair(path, "style", styleBefore, cloneValue(node.style)));
1267
+ recordDocOp(setKeyPair(path, "style", styleBefore, cloneValue2(node.style)));
1271
1268
  recordPatch({ op: "set-style", path });
1272
1269
  }
1273
1270
  function mutateReplaceStyle(tab, path, style) {
1274
- const node = getNodeAtPath(tab.doc.document, path);
1275
- const styleBefore = cloneValue(node.style);
1271
+ const node = getNodeAtPath2(tab.doc.document, path);
1272
+ const styleBefore = cloneValue2(node.style);
1276
1273
  if (style && Object.keys(style).length > 0) {
1277
1274
  node.style = style;
1278
1275
  } else {
1279
1276
  delete node.style;
1280
1277
  }
1281
- recordDocOp(setKeyPair(path, "style", styleBefore, cloneValue(node.style)));
1278
+ recordDocOp(setKeyPair(path, "style", styleBefore, cloneValue2(node.style)));
1282
1279
  recordPatch({ op: "set-style", path });
1283
1280
  }
1284
1281
  function mutateAddDef(tab, name, def) {
1285
1282
  const doc = tab.doc.document;
1286
- const before = cloneValue(doc.state);
1283
+ const before = cloneValue2(doc.state);
1287
1284
  if (!doc.state) {
1288
1285
  doc.state = {};
1289
1286
  }
1290
1287
  doc.state[name] = def;
1291
- recordDocOp(setKeyPair([], "state", before, cloneValue(doc.state)));
1288
+ recordDocOp(setKeyPair([], "state", before, cloneValue2(doc.state)));
1292
1289
  recordPatch({ key: "state", op: "doc-meta" });
1293
1290
  }
1294
1291
  function mutateRemoveDef(tab, name) {
1295
1292
  const doc = tab.doc.document;
1296
1293
  if (doc.state) {
1297
- const before = cloneValue(doc.state);
1294
+ const before = cloneValue2(doc.state);
1298
1295
  delete doc.state[name];
1299
1296
  if (Object.keys(doc.state).length === 0) {
1300
1297
  delete doc.state;
1301
1298
  }
1302
- recordDocOp(setKeyPair([], "state", before, cloneValue(doc.state)));
1299
+ recordDocOp(setKeyPair([], "state", before, cloneValue2(doc.state)));
1303
1300
  recordPatch({ key: "state", op: "doc-meta" });
1304
1301
  }
1305
1302
  }
1306
1303
  function mutateUpdateDef(tab, name, updates) {
1307
1304
  const doc = tab.doc.document;
1308
- const stateBefore = cloneValue(doc.state);
1305
+ const stateBefore = cloneValue2(doc.state);
1309
1306
  if (!doc.state) {
1310
1307
  doc.state = {};
1311
1308
  }
@@ -1318,7 +1315,7 @@ function mutateUpdateDef(tab, name, updates) {
1318
1315
  delete entry[k];
1319
1316
  }
1320
1317
  }
1321
- recordDocOp(setKeyPair([], "state", stateBefore, cloneValue(doc.state)));
1318
+ recordDocOp(setKeyPair([], "state", stateBefore, cloneValue2(doc.state)));
1322
1319
  recordPatch({ key: "state", op: "doc-meta" });
1323
1320
  }
1324
1321
  function mutateRenameDef(tab, oldName, newName) {
@@ -1326,15 +1323,15 @@ function mutateRenameDef(tab, oldName, newName) {
1326
1323
  if (!doc.state || !doc.state[oldName]) {
1327
1324
  return;
1328
1325
  }
1329
- const before = cloneValue(doc.state);
1326
+ const before = cloneValue2(doc.state);
1330
1327
  doc.state[newName] = doc.state[oldName];
1331
1328
  delete doc.state[oldName];
1332
- recordDocOp(setKeyPair([], "state", before, cloneValue(doc.state)));
1329
+ recordDocOp(setKeyPair([], "state", before, cloneValue2(doc.state)));
1333
1330
  recordPatch({ key: "state", op: "doc-meta" });
1334
1331
  }
1335
1332
  function mutateUpdateProp(tab, path, propName, value) {
1336
- const node = getNodeAtPath(tab.doc.document, path);
1337
- const propsBefore = cloneValue(node.$props);
1333
+ const node = getNodeAtPath2(tab.doc.document, path);
1334
+ const propsBefore = cloneValue2(node.$props);
1338
1335
  if (!node.$props) {
1339
1336
  node.$props = {};
1340
1337
  }
@@ -1346,49 +1343,49 @@ function mutateUpdateProp(tab, path, propName, value) {
1346
1343
  if (Object.keys(node.$props).length === 0) {
1347
1344
  delete node.$props;
1348
1345
  }
1349
- recordDocOp(setKeyPair(path, "$props", propsBefore, cloneValue(node.$props)));
1346
+ recordDocOp(setKeyPair(path, "$props", propsBefore, cloneValue2(node.$props)));
1350
1347
  recordPatch({ op: "replace", path });
1351
1348
  }
1352
1349
  function mutateAddSwitchCase(tab, path, caseName, caseDef) {
1353
- const node = getNodeAtPath(tab.doc.document, path);
1354
- const before = cloneValue(node.cases);
1350
+ const node = getNodeAtPath2(tab.doc.document, path);
1351
+ const before = cloneValue2(node.cases);
1355
1352
  if (!node.cases) {
1356
1353
  node.cases = {};
1357
1354
  }
1358
1355
  node.cases[caseName] = caseDef || { tagName: "div", textContent: caseName };
1359
- recordDocOp(setKeyPair(path, "cases", before, cloneValue(node.cases)));
1356
+ recordDocOp(setKeyPair(path, "cases", before, cloneValue2(node.cases)));
1360
1357
  recordPatch({ op: "replace", path });
1361
1358
  }
1362
1359
  function mutateRemoveSwitchCase(tab, path, caseName) {
1363
- const node = getNodeAtPath(tab.doc.document, path);
1360
+ const node = getNodeAtPath2(tab.doc.document, path);
1364
1361
  if (node.cases) {
1365
- const before = cloneValue(node.cases);
1362
+ const before = cloneValue2(node.cases);
1366
1363
  delete node.cases[caseName];
1367
- recordDocOp(setKeyPair(path, "cases", before, cloneValue(node.cases)));
1364
+ recordDocOp(setKeyPair(path, "cases", before, cloneValue2(node.cases)));
1368
1365
  recordPatch({ op: "replace", path });
1369
1366
  }
1370
1367
  }
1371
1368
  function mutateRenameSwitchCase(tab, path, oldName, newName) {
1372
- const node = getNodeAtPath(tab.doc.document, path);
1369
+ const node = getNodeAtPath2(tab.doc.document, path);
1373
1370
  if (!node.cases || !node.cases[oldName]) {
1374
1371
  return;
1375
1372
  }
1376
- const before = cloneValue(node.cases);
1373
+ const before = cloneValue2(node.cases);
1377
1374
  node.cases[newName] = node.cases[oldName];
1378
1375
  delete node.cases[oldName];
1379
- recordDocOp(setKeyPair(path, "cases", before, cloneValue(node.cases)));
1376
+ recordDocOp(setKeyPair(path, "cases", before, cloneValue2(node.cases)));
1380
1377
  recordPatch({ op: "replace", path });
1381
1378
  }
1382
1379
  function mutateUpdateFrontmatter(tab, field, value) {
1383
1380
  const fm = tab.doc.content.frontmatter;
1384
- const before = Object.hasOwn(fm, field) ? cloneValue(fm[field]) : undefined;
1381
+ const before = Object.hasOwn(fm, field) ? cloneValue2(fm[field]) : undefined;
1385
1382
  const deletes = value === undefined || value === null || value === "";
1386
1383
  if (deletes) {
1387
1384
  delete fm[field];
1388
1385
  } else {
1389
1386
  fm[field] = value;
1390
1387
  }
1391
- const after = deletes ? undefined : cloneValue(value);
1388
+ const after = deletes ? undefined : cloneValue2(value);
1392
1389
  recordFmOp({ after, before, field });
1393
1390
  tab.doc.dirty = true;
1394
1391
  }
@@ -1520,6 +1517,8 @@ function createDefaultUi(canvasMode, preview = false) {
1520
1517
  return {
1521
1518
  activeMedia: null,
1522
1519
  activeSelector: null,
1520
+ openPopover: null,
1521
+ openDialog: null,
1523
1522
  canvasMode,
1524
1523
  editZoom: 1,
1525
1524
  editingFormula: null,
@@ -1542,7 +1541,7 @@ function createDefaultUi(canvasMode, preview = false) {
1542
1541
  zoom: 1
1543
1542
  };
1544
1543
  }
1545
- var ALL_MODES = ["edit", "design", "preview", "source", "stylebook"];
1544
+ var ALL_MODES = ["edit", "design", "preview", "source", "stylebook", "git-diff"];
1546
1545
  function createTab({
1547
1546
  id,
1548
1547
  documentPath = null,
@@ -1552,7 +1551,8 @@ function createTab({
1552
1551
  sourceFormat = null,
1553
1552
  capabilities,
1554
1553
  openedFrom = null,
1555
- preview: previewTab = false
1554
+ preview: previewTab = false,
1555
+ layout = null
1556
1556
  }) {
1557
1557
  const scope = effectScope();
1558
1558
  normalizeArrayChildren(document);
@@ -1566,6 +1566,7 @@ function createTab({
1566
1566
  dirty: false,
1567
1567
  document,
1568
1568
  handlersSource: null,
1569
+ layout,
1569
1570
  mode: inferDocumentMode(documentPath, sourceFormat),
1570
1571
  sourceFormat
1571
1572
  }),
@@ -1601,14 +1602,14 @@ function inferModes(documentPath, sourceFormat) {
1601
1602
  if (documentPath === PROJECT_CONFIG_PATH) {
1602
1603
  return ["stylebook", "source"];
1603
1604
  }
1604
- const format = formatByName(sourceFormat) ?? formatForPath(documentPath);
1605
+ const format = formatByName2(sourceFormat) ?? formatForPath2(documentPath);
1605
1606
  if (format) {
1606
1607
  return format.studio?.modes ?? ["edit", "design", "preview", "source"];
1607
1608
  }
1608
1609
  return ALL_MODES;
1609
1610
  }
1610
1611
  function inferDocumentMode(documentPath, sourceFormat) {
1611
- const format = formatByName(sourceFormat) ?? formatForPath(documentPath);
1612
+ const format = formatByName2(sourceFormat) ?? formatForPath2(documentPath);
1612
1613
  if (format) {
1613
1614
  return format.studio?.documentMode?.default ?? "content";
1614
1615
  }
@@ -1677,12 +1678,12 @@ var MIRROR_DEBOUNCE_MS = 800;
1677
1678
  var MIRROR_MAX_LAG_MS = 2500;
1678
1679
  var collabModulePromise = null;
1679
1680
  function loadCollab() {
1680
- collabModulePromise ??= import("./index-zqxmqxmh.js");
1681
+ collabModulePromise ??= (__preload("n4j7qxyr"), import("./index-n4j7qxyr.js"));
1681
1682
  return collabModulePromise;
1682
1683
  }
1683
1684
  function maybePlatform() {
1684
1685
  try {
1685
- return getPlatform();
1686
+ return getPlatform2();
1686
1687
  } catch {
1687
1688
  return null;
1688
1689
  }
@@ -2103,7 +2104,7 @@ async function attachSession(tab) {
2103
2104
  state.status = "failed";
2104
2105
  state.active = false;
2105
2106
  state.attachError = error instanceof Error ? error.message : String(error);
2106
- notify.warn(`Live collaboration is not available for "${path}" — ${state.attachError}`, {
2107
+ notify2.warn(`Live collaboration is not available for "${path}" — ${state.attachError}`, {
2107
2108
  key: `collab:${path}`,
2108
2109
  path,
2109
2110
  source: "Collaboration"
@@ -2420,6 +2421,13 @@ function numberArg(commandId, args, key) {
2420
2421
  }
2421
2422
  return value;
2422
2423
  }
2424
+ function integerArg(commandId, args, key) {
2425
+ const value = args[key];
2426
+ if (typeof value !== "number" || !Number.isInteger(value)) {
2427
+ throw refuse(commandId, key, `expected an integer, got ${describe(value)}`);
2428
+ }
2429
+ return value;
2430
+ }
2423
2431
  function boundedNumberArg(commandId, args, key, minimum, maximum) {
2424
2432
  const value = numberArg(commandId, args, key);
2425
2433
  if (value < minimum || value > maximum) {
@@ -2437,7 +2445,7 @@ function booleanArg(commandId, args, key) {
2437
2445
  function enumArg(commandId, args, key, declared) {
2438
2446
  const value = args[key];
2439
2447
  if (typeof value !== "string" || !declared.includes(value)) {
2440
- throw refuse(commandId, key, `${describe(value)} is not declared — declared: ${declared.join(", ")}`);
2448
+ throw refuse(commandId, key, `${describe(value)} is not declared — declared: ${declared.join(", ") || "none"}`);
2441
2449
  }
2442
2450
  return value;
2443
2451
  }
@@ -2509,14 +2517,234 @@ function pathListProperty(description) {
2509
2517
  function stringProperty(description) {
2510
2518
  return { description, type: "string" };
2511
2519
  }
2520
+ function isPathSegmentTypes(types) {
2521
+ return types.length === 2 && types.includes("string") && types.includes("number");
2522
+ }
2523
+ function typesOf(type) {
2524
+ return Array.isArray(type) ? type : [type];
2525
+ }
2526
+ function describeShape(property) {
2527
+ const p = property;
2528
+ if ("enum" in p) {
2529
+ return "enum";
2530
+ }
2531
+ if ("const" in p) {
2532
+ return "const";
2533
+ }
2534
+ if (Array.isArray(p.oneOf)) {
2535
+ return "one-of";
2536
+ }
2537
+ if (Array.isArray(p.type)) {
2538
+ return "typed";
2539
+ }
2540
+ switch (p.type) {
2541
+ case "boolean": {
2542
+ return "boolean";
2543
+ }
2544
+ case "number":
2545
+ case "integer": {
2546
+ if (p.minimum !== undefined && p.maximum !== undefined) {
2547
+ return "bounded-number";
2548
+ }
2549
+ return p.type === "integer" ? "integer" : "number";
2550
+ }
2551
+ case "string": {
2552
+ return "string";
2553
+ }
2554
+ case "array": {
2555
+ const items = p.items?.type;
2556
+ if (Array.isArray(items)) {
2557
+ return isPathSegmentTypes(items) ? "path" : "pass-through";
2558
+ }
2559
+ return items === "array" ? "path-list" : "pass-through";
2560
+ }
2561
+ case "null":
2562
+ case "object": {
2563
+ return "typed";
2564
+ }
2565
+ default: {
2566
+ break;
2567
+ }
2568
+ }
2569
+ return "pass-through";
2570
+ }
2571
+ function isJsonType(type, value) {
2572
+ switch (type) {
2573
+ case "null": {
2574
+ return value === null;
2575
+ }
2576
+ case "boolean": {
2577
+ return typeof value === "boolean";
2578
+ }
2579
+ case "string": {
2580
+ return typeof value === "string";
2581
+ }
2582
+ case "number": {
2583
+ return typeof value === "number" && Number.isFinite(value);
2584
+ }
2585
+ case "integer": {
2586
+ return typeof value === "number" && Number.isInteger(value);
2587
+ }
2588
+ case "array": {
2589
+ return Array.isArray(value);
2590
+ }
2591
+ case "object": {
2592
+ return typeof value === "object" && value !== null && !Array.isArray(value);
2593
+ }
2594
+ default: {
2595
+ break;
2596
+ }
2597
+ }
2598
+ return false;
2599
+ }
2600
+ function listTypes(types) {
2601
+ if (types.length <= 1) {
2602
+ return types.join("");
2603
+ }
2604
+ return `${types.slice(0, -1).join(", ")} or ${types.at(-1)}`;
2605
+ }
2606
+ function typedArg(commandId, args, key, types) {
2607
+ const value = args[key];
2608
+ if (!types.some((type) => isJsonType(type, value))) {
2609
+ throw refuse(commandId, key, `expected ${listTypes(types)}, got ${describe(value)}`);
2610
+ }
2611
+ return value;
2612
+ }
2613
+ function shapeOf(property) {
2614
+ switch (describeShape(property)) {
2615
+ case "enum": {
2616
+ return `one of ${(property.enum ?? []).map((v) => describe(v)).join(" | ")}`;
2617
+ }
2618
+ case "const": {
2619
+ return `the constant ${describe(property.const)}`;
2620
+ }
2621
+ case "one-of": {
2622
+ return (property.oneOf ?? []).map((branch) => shapeOf(branch)).join(" or ");
2623
+ }
2624
+ case "typed": {
2625
+ return listTypes(typesOf(property.type ?? []));
2626
+ }
2627
+ case "boolean": {
2628
+ return "a boolean";
2629
+ }
2630
+ case "bounded-number": {
2631
+ return `a number from ${property.minimum} to ${property.maximum}`;
2632
+ }
2633
+ case "number": {
2634
+ return "a finite number";
2635
+ }
2636
+ case "integer": {
2637
+ return "an integer";
2638
+ }
2639
+ case "string": {
2640
+ return "a non-empty string";
2641
+ }
2642
+ case "path": {
2643
+ return "a document path";
2644
+ }
2645
+ case "path-list": {
2646
+ return "a list of document paths";
2647
+ }
2648
+ default: {
2649
+ return "anything";
2650
+ }
2651
+ }
2652
+ }
2653
+ function oneOfArg(commandId, args, key, branches) {
2654
+ const value = args[key];
2655
+ const refusals = [];
2656
+ for (const branch of branches) {
2657
+ if (branch.type !== undefined && !typesOf(branch.type).some((type) => isJsonType(type, value))) {
2658
+ continue;
2659
+ }
2660
+ try {
2661
+ return coerceProperty(commandId, args, key, branch);
2662
+ } catch (error) {
2663
+ refusals.push(error);
2664
+ }
2665
+ }
2666
+ if (refusals.length === 1) {
2667
+ throw refusals[0];
2668
+ }
2669
+ throw refuse(commandId, key, `expected ${branches.map((branch) => shapeOf(branch)).join(" or ")}, got ${describe(value)}`);
2670
+ }
2671
+ function coerceProperty(commandId, args, key, property) {
2672
+ switch (describeShape(property)) {
2673
+ case "enum": {
2674
+ return enumArg(commandId, args, key, property.enum ?? []);
2675
+ }
2676
+ case "const": {
2677
+ const value = args[key];
2678
+ if (value !== property.const) {
2679
+ throw refuse(commandId, key, `expected the constant ${describe(property.const)}, got ${describe(value)}`);
2680
+ }
2681
+ return value;
2682
+ }
2683
+ case "one-of": {
2684
+ return oneOfArg(commandId, args, key, property.oneOf ?? []);
2685
+ }
2686
+ case "typed": {
2687
+ return typedArg(commandId, args, key, typesOf(property.type ?? []));
2688
+ }
2689
+ case "boolean": {
2690
+ return booleanArg(commandId, args, key);
2691
+ }
2692
+ case "bounded-number": {
2693
+ if (property.type === "integer") {
2694
+ integerArg(commandId, args, key);
2695
+ }
2696
+ return boundedNumberArg(commandId, args, key, property.minimum, property.maximum);
2697
+ }
2698
+ case "number": {
2699
+ return numberArg(commandId, args, key);
2700
+ }
2701
+ case "integer": {
2702
+ return integerArg(commandId, args, key);
2703
+ }
2704
+ case "string": {
2705
+ return stringArg(commandId, args, key);
2706
+ }
2707
+ case "path": {
2708
+ return pathArg(commandId, args, key);
2709
+ }
2710
+ case "path-list": {
2711
+ return pathListArg(commandId, args, key);
2712
+ }
2713
+ default: {
2714
+ return args[key];
2715
+ }
2716
+ }
2717
+ }
2718
+ function coerceArgs(commandId, schema, args) {
2719
+ const spec = schema;
2720
+ const properties = spec.properties ?? {};
2721
+ const declared = Object.keys(properties);
2722
+ const required = spec.required ?? [];
2723
+ const coerced = {};
2724
+ for (const [key, value] of Object.entries(args)) {
2725
+ if (value === undefined || Object.hasOwn(properties, key)) {
2726
+ continue;
2727
+ }
2728
+ if (spec.additionalProperties === false) {
2729
+ throw refuse(commandId, key, `not declared — declared: ${declared.join(", ") || "none"}`);
2730
+ }
2731
+ coerced[key] = value;
2732
+ }
2733
+ for (const key of declared) {
2734
+ if (args[key] === undefined && !required.includes(key)) {
2735
+ continue;
2736
+ }
2737
+ coerced[key] = coerceProperty(commandId, args, key, properties[key]);
2738
+ }
2739
+ return coerced;
2740
+ }
2512
2741
 
2513
2742
  // src/workspace/workspace.ts
2514
2743
  var CLOSED_TAB_LIMIT = 20;
2515
- var PRIMARY_PANE = "primary";
2516
- var SECONDARY_PANE = "secondary";
2517
- var MAX_PANES = 2;
2518
- var workspace = reactive({
2519
- activePaneId: PRIMARY_PANE,
2744
+ var PRIMARY_PANE2 = "primary";
2745
+ var SECONDARY_PANE2 = "secondary";
2746
+ var workspace2 = reactive({
2747
+ activePaneId: PRIMARY_PANE2,
2520
2748
  clipboard: null,
2521
2749
  closedTabs: [],
2522
2750
  componentRegistry: [],
@@ -2531,7 +2759,7 @@ var workspace = reactive({
2531
2759
  {
2532
2760
  activeTabId: null,
2533
2761
  derived: null,
2534
- id: PRIMARY_PANE,
2762
+ id: PRIMARY_PANE2,
2535
2763
  tabOrder: []
2536
2764
  }
2537
2765
  ],
@@ -2543,83 +2771,77 @@ var workspace = reactive({
2543
2771
  activityBar: "files"
2544
2772
  },
2545
2773
  get activeTabId() {
2546
- const pane = activePane();
2547
- return pane.derived?.kind === "lens" ? paneById(pane.derived.sourcePaneId)?.activeTabId ?? null : pane.activeTabId;
2774
+ const pane = activePane2();
2775
+ return pane.derived?.kind === "lens" ? paneById2(pane.derived.sourcePaneId)?.activeTabId ?? null : pane.activeTabId;
2548
2776
  },
2549
2777
  get tabOrder() {
2550
- return activePane().tabOrder;
2778
+ return activePane2().tabOrder;
2551
2779
  }
2552
2780
  });
2553
- var activeTab = computed(() => workspace.activeTabId ? workspace.tabs.get(workspace.activeTabId) ?? null : null);
2554
- function activePane() {
2555
- const { panes } = workspace;
2556
- return panes.find((pane) => pane.id === workspace.activePaneId) ?? panes[0];
2781
+ var activeTab2 = computed(() => workspace2.activeTabId ? workspace2.tabs.get(workspace2.activeTabId) ?? null : null);
2782
+ function activePane2() {
2783
+ const { panes } = workspace2;
2784
+ return panes.find((pane) => pane.id === workspace2.activePaneId) ?? panes[0];
2557
2785
  }
2558
- function paneById(paneId) {
2559
- return workspace.panes.find((pane) => pane.id === paneId);
2786
+ function paneById2(paneId) {
2787
+ return workspace2.panes.find((pane) => pane.id === paneId);
2560
2788
  }
2561
- function paneOfTab(tabId) {
2562
- return workspace.panes.find((pane) => pane.tabOrder.includes(tabId));
2789
+ function paneOfTab2(tabId) {
2790
+ return workspace2.panes.find((pane) => pane.tabOrder.includes(tabId));
2563
2791
  }
2564
- function focusPane(paneId) {
2565
- const pane = paneById(paneId);
2566
- if (!pane || pane.id === workspace.activePaneId) {
2792
+ function focusPane2(paneId) {
2793
+ const pane = paneById2(paneId);
2794
+ if (!pane || pane.id === workspace2.activePaneId) {
2567
2795
  return;
2568
2796
  }
2569
- workspace.activePaneId = pane.id;
2797
+ workspace2.activePaneId = pane.id;
2570
2798
  resetTabCycle();
2571
2799
  const { activeTabId } = pane;
2572
2800
  if (activeTabId) {
2573
2801
  promoteMru(activeTabId);
2574
- const tab = workspace.tabs.get(activeTabId);
2802
+ const tab = workspace2.tabs.get(activeTabId);
2575
2803
  if (tab) {
2576
2804
  syncTreeSelection(tab);
2577
2805
  }
2578
2806
  }
2579
2807
  }
2580
- function isPaneFocused(paneId) {
2581
- return workspace.activePaneId === paneId;
2582
- }
2583
- function focusOtherPane() {
2584
- const other = workspace.panes.find((pane) => pane.id !== workspace.activePaneId);
2585
- if (other) {
2586
- focusPane(other.id);
2587
- }
2808
+ function isPaneFocused2(paneId) {
2809
+ return workspace2.activePaneId === paneId;
2588
2810
  }
2589
2811
  function splitRight() {
2590
- const source = activePane();
2812
+ const source = activePane2();
2591
2813
  const tabId = source.activeTabId;
2592
- const tab = tabId ? workspace.tabs.get(tabId) : null;
2814
+ const tab = tabId ? workspace2.tabs.get(tabId) : null;
2593
2815
  if (!tabId || !tab) {
2594
2816
  return null;
2595
2817
  }
2596
- const target = receivingPane();
2597
- detachTab(tabId);
2598
- insertIntoPane(target, tabId);
2818
+ const target = receivingPane2();
2819
+ detachTab2(tabId);
2820
+ insertIntoPane2(target, tabId);
2599
2821
  target.activeTabId = tabId;
2600
- workspace.activePaneId = target.id;
2822
+ workspace2.activePaneId = target.id;
2601
2823
  resetTabCycle();
2602
2824
  promoteMru(tabId);
2603
2825
  return target;
2604
2826
  }
2605
- function sidePane() {
2606
- const source = activePane();
2607
- return workspace.panes.find((pane) => pane.id !== source.id) ?? addPane(SECONDARY_PANE);
2827
+ function sidePane2() {
2828
+ const source = activePane2();
2829
+ return workspace2.panes.find((pane) => pane.id !== source.id) ?? addPane(SECONDARY_PANE2);
2608
2830
  }
2609
- function receivingPane() {
2610
- const target = sidePane();
2831
+ function receivingPane2() {
2832
+ const target = sidePane2();
2611
2833
  if (target.derived) {
2612
2834
  target.derived = null;
2613
2835
  }
2614
2836
  return target;
2615
2837
  }
2616
2838
  function addPane(paneId) {
2617
- const existing = paneById(paneId);
2839
+ const existing = paneById2(paneId);
2618
2840
  if (existing) {
2619
2841
  return existing;
2620
2842
  }
2621
- workspace.panes = [
2622
- ...workspace.panes,
2843
+ workspace2.panes = [
2844
+ ...workspace2.panes,
2623
2845
  {
2624
2846
  activeTabId: null,
2625
2847
  derived: null,
@@ -2627,35 +2849,35 @@ function addPane(paneId) {
2627
2849
  tabOrder: []
2628
2850
  }
2629
2851
  ];
2630
- return paneById(paneId);
2852
+ return paneById2(paneId);
2631
2853
  }
2632
2854
  function closePane(paneId) {
2633
- if (workspace.panes.length < 2) {
2855
+ if (workspace2.panes.length < 2) {
2634
2856
  return;
2635
2857
  }
2636
- const closingId = paneId === PRIMARY_PANE ? workspace.panes.find((candidate) => candidate.id !== PRIMARY_PANE)?.id : paneId;
2637
- const pane = closingId === undefined ? undefined : paneById(closingId);
2638
- const survivor = workspace.panes.find((candidate) => candidate.id !== closingId);
2858
+ const closingId = paneId === PRIMARY_PANE2 ? workspace2.panes.find((candidate) => candidate.id !== PRIMARY_PANE2)?.id : paneId;
2859
+ const pane = closingId === undefined ? undefined : paneById2(closingId);
2860
+ const survivor = workspace2.panes.find((candidate) => candidate.id !== closingId);
2639
2861
  if (!pane || !survivor) {
2640
2862
  return;
2641
2863
  }
2642
2864
  for (const tabId of pane.tabOrder) {
2643
- insertIntoPane(survivor, tabId);
2865
+ insertIntoPane2(survivor, tabId);
2644
2866
  }
2645
- survivor.activeTabId = workspace.activePaneId === pane.id ? pane.activeTabId ?? survivor.activeTabId : survivor.activeTabId ?? pane.activeTabId;
2646
- workspace.activePaneId = survivor.id;
2867
+ survivor.activeTabId = workspace2.activePaneId === pane.id ? pane.activeTabId ?? survivor.activeTabId : survivor.activeTabId ?? pane.activeTabId;
2868
+ workspace2.activePaneId = survivor.id;
2647
2869
  if (survivor.derived?.sourcePaneId === pane.id) {
2648
2870
  survivor.derived = null;
2649
2871
  }
2650
- workspace.panes = workspace.panes.filter((candidate) => candidate.id !== pane.id);
2872
+ workspace2.panes = workspace2.panes.filter((candidate) => candidate.id !== pane.id);
2651
2873
  resetTabCycle();
2652
2874
  }
2653
2875
  function paneIsEmpty(pane) {
2654
2876
  return pane.tabOrder.length === 0 && pane.derived === null;
2655
2877
  }
2656
- function detachTab(tabId) {
2878
+ function detachTab2(tabId) {
2657
2879
  const emptied = [];
2658
- for (const pane of workspace.panes) {
2880
+ for (const pane of workspace2.panes) {
2659
2881
  if (!pane.tabOrder.includes(tabId)) {
2660
2882
  continue;
2661
2883
  }
@@ -2663,7 +2885,7 @@ function detachTab(tabId) {
2663
2885
  if (pane.activeTabId === tabId) {
2664
2886
  pane.activeTabId = pane.tabOrder.at(-1) ?? null;
2665
2887
  }
2666
- if (pane.id !== PRIMARY_PANE && paneIsEmpty(pane)) {
2888
+ if (pane.id !== PRIMARY_PANE2 && paneIsEmpty(pane)) {
2667
2889
  emptied.push(pane.id);
2668
2890
  }
2669
2891
  }
@@ -2671,7 +2893,7 @@ function detachTab(tabId) {
2671
2893
  closePane(paneId);
2672
2894
  }
2673
2895
  }
2674
- function insertIntoPane(pane, tabId, index) {
2896
+ function insertIntoPane2(pane, tabId, index) {
2675
2897
  if (pane.tabOrder.includes(tabId)) {
2676
2898
  return;
2677
2899
  }
@@ -2681,7 +2903,7 @@ function insertIntoPane(pane, tabId, index) {
2681
2903
  function pinnedCount(pane) {
2682
2904
  let count = 0;
2683
2905
  for (const id of pane.tabOrder) {
2684
- if (workspace.tabs.get(id)?.pinned !== true) {
2906
+ if (workspace2.tabs.get(id)?.pinned !== true) {
2685
2907
  break;
2686
2908
  }
2687
2909
  count += 1;
@@ -2689,25 +2911,25 @@ function pinnedCount(pane) {
2689
2911
  return count;
2690
2912
  }
2691
2913
  function defaultSlot(pane, tabId) {
2692
- return workspace.tabs.get(tabId)?.pinned === true ? pinnedCount(pane) : pane.tabOrder.length;
2914
+ return workspace2.tabs.get(tabId)?.pinned === true ? pinnedCount(pane) : pane.tabOrder.length;
2693
2915
  }
2694
- function setWorkspaceProject(root, config = null) {
2695
- workspace.projectRoot = root;
2696
- workspace.projectConfig = config;
2916
+ function setWorkspaceProject2(root, config = null) {
2917
+ workspace2.projectRoot = root;
2918
+ workspace2.projectConfig = config;
2697
2919
  }
2698
- function isTabActive(tab) {
2699
- const active = activeTab.value;
2920
+ function isTabActive2(tab) {
2921
+ const active = activeTab2.value;
2700
2922
  return tab !== null && active !== null && toRaw(active) === toRaw(tab);
2701
2923
  }
2702
- function tabIsLive(tab) {
2924
+ function tabIsLive2(tab) {
2703
2925
  if (!tab) {
2704
2926
  return false;
2705
2927
  }
2706
- const held = workspace.tabs.get(tab.id);
2928
+ const held = workspace2.tabs.get(tab.id);
2707
2929
  return held !== undefined && toRaw(held) === toRaw(tab);
2708
2930
  }
2709
2931
  function promoteMru(tabId) {
2710
- workspace.mruOrder = [tabId, ...workspace.mruOrder.filter((id) => id !== tabId)];
2932
+ workspace2.mruOrder = [tabId, ...workspace2.mruOrder.filter((id) => id !== tabId)];
2711
2933
  }
2712
2934
  var _cycleList = null;
2713
2935
  var _cycleIndex = 0;
@@ -2721,8 +2943,8 @@ function syncTreeSelection(tab) {
2721
2943
  }
2722
2944
  }
2723
2945
  function setActiveTab(tabId, opts = {}) {
2724
- const tab = workspace.tabs.get(tabId);
2725
- const pane = paneOfTab(tabId);
2946
+ const tab = workspace2.tabs.get(tabId);
2947
+ const pane = paneOfTab2(tabId);
2726
2948
  if (!tab || !pane) {
2727
2949
  return;
2728
2950
  }
@@ -2730,18 +2952,18 @@ function setActiveTab(tabId, opts = {}) {
2730
2952
  if (opts.focus === false) {
2731
2953
  return;
2732
2954
  }
2733
- workspace.activePaneId = pane.id;
2955
+ workspace2.activePaneId = pane.id;
2734
2956
  if (!opts.cycling) {
2735
2957
  resetTabCycle();
2736
2958
  promoteMru(tabId);
2737
2959
  }
2738
2960
  syncTreeSelection(tab);
2739
2961
  }
2740
- function openTab(opts) {
2741
- const previous = workspace.tabs.get(opts.id);
2962
+ function openTab2(opts) {
2963
+ const previous = workspace2.tabs.get(opts.id);
2742
2964
  const preview = opts.preview === true && previous?.pinned !== true;
2743
2965
  const tab = createTab({ ...opts, preview });
2744
- const pane = (opts.paneId === undefined ? undefined : paneById(opts.paneId)) ?? activePane();
2966
+ const pane = (opts.paneId === undefined ? undefined : paneById2(opts.paneId)) ?? activePane2();
2745
2967
  let slot;
2746
2968
  if (previous) {
2747
2969
  tab.pinned = previous.pinned;
@@ -2749,43 +2971,43 @@ function openTab(opts) {
2749
2971
  } else {
2750
2972
  if (preview) {
2751
2973
  const sitting = previewTabIn(pane);
2752
- const sittingTab = sitting ? workspace.tabs.get(sitting) : null;
2974
+ const sittingTab = sitting ? workspace2.tabs.get(sitting) : null;
2753
2975
  if (sittingTab) {
2754
- commitTabBuffers(sittingTab);
2976
+ commitTabBuffers2(sittingTab);
2755
2977
  }
2756
- promoteDirtyPreviewTabs();
2978
+ promoteDirtyPreviewTabs2();
2757
2979
  }
2758
2980
  const replaced = preview ? previewTabIn(pane) : null;
2759
2981
  if (replaced) {
2760
2982
  slot = pane.tabOrder.indexOf(replaced);
2761
- closeTab(replaced);
2983
+ closeTab2(replaced);
2762
2984
  }
2763
- insertIntoPane(pane, tab.id, slot);
2985
+ insertIntoPane2(pane, tab.id, slot);
2764
2986
  }
2765
- workspace.tabs.set(tab.id, tab);
2987
+ workspace2.tabs.set(tab.id, tab);
2766
2988
  setActiveTab(tab.id, { focus: opts.focus !== false });
2767
2989
  ensureCollab(tab);
2768
2990
  return tab;
2769
2991
  }
2770
2992
  function previewTabIn(pane) {
2771
- return pane.tabOrder.find((id) => workspace.tabs.get(id)?.preview === true) ?? null;
2993
+ return pane.tabOrder.find((id) => workspace2.tabs.get(id)?.preview === true) ?? null;
2772
2994
  }
2773
- function promoteTab(tabId) {
2774
- const tab = workspace.tabs.get(tabId);
2995
+ function promoteTab2(tabId) {
2996
+ const tab = workspace2.tabs.get(tabId);
2775
2997
  if (tab?.preview === true) {
2776
2998
  tab.preview = false;
2777
2999
  }
2778
3000
  }
2779
- function promoteDirtyPreviewTabs() {
2780
- for (const [id, tab] of workspace.tabs) {
3001
+ function promoteDirtyPreviewTabs2() {
3002
+ for (const [id, tab] of workspace2.tabs) {
2781
3003
  if (tab.preview && tab.doc.dirty) {
2782
- promoteTab(id);
3004
+ promoteTab2(id);
2783
3005
  }
2784
3006
  }
2785
3007
  }
2786
- function setTabPinned(tabId, pinned) {
2787
- const tab = workspace.tabs.get(tabId);
2788
- const pane = paneOfTab(tabId);
3008
+ function setTabPinned2(tabId, pinned) {
3009
+ const tab = workspace2.tabs.get(tabId);
3010
+ const pane = paneOfTab2(tabId);
2789
3011
  if (!tab || !pane) {
2790
3012
  return;
2791
3013
  }
@@ -2794,34 +3016,34 @@ function setTabPinned(tabId, pinned) {
2794
3016
  tab.preview = false;
2795
3017
  }
2796
3018
  const without = pane.tabOrder.filter((id) => id !== tabId);
2797
- const boundary = without.filter((id) => workspace.tabs.get(id)?.pinned === true).length;
3019
+ const boundary = without.filter((id) => workspace2.tabs.get(id)?.pinned === true).length;
2798
3020
  pane.tabOrder = [...without.slice(0, boundary), tabId, ...without.slice(boundary)];
2799
3021
  }
2800
- function moveTab(tabId, toIndex) {
2801
- const tab = workspace.tabs.get(tabId);
2802
- const pane = paneOfTab(tabId);
3022
+ function moveTab2(tabId, toIndex) {
3023
+ const tab = workspace2.tabs.get(tabId);
3024
+ const pane = paneOfTab2(tabId);
2803
3025
  if (!tab || !pane) {
2804
3026
  return;
2805
3027
  }
2806
3028
  const without = pane.tabOrder.filter((id) => id !== tabId);
2807
- const boundary = without.filter((id) => workspace.tabs.get(id)?.pinned === true).length;
3029
+ const boundary = without.filter((id) => workspace2.tabs.get(id)?.pinned === true).length;
2808
3030
  const lower = tab.pinned ? 0 : boundary;
2809
3031
  const upper = tab.pinned ? boundary : without.length;
2810
3032
  const at = Math.min(Math.max(toIndex, lower), upper);
2811
3033
  pane.tabOrder = [...without.slice(0, at), tabId, ...without.slice(at)];
2812
3034
  }
2813
- function closeTab(tabId) {
2814
- const tab = workspace.tabs.get(tabId);
3035
+ function closeTab2(tabId) {
3036
+ const tab = workspace2.tabs.get(tabId);
2815
3037
  if (!tab) {
2816
3038
  return;
2817
3039
  }
2818
- const pane = paneOfTab(tabId);
3040
+ const pane = paneOfTab2(tabId);
2819
3041
  const wasActive = pane?.activeTabId === tabId;
2820
3042
  rememberClosedTab(tab);
2821
3043
  disposeTab(tab);
2822
- workspace.tabs.delete(tabId);
2823
- detachTab(tabId);
2824
- workspace.mruOrder = workspace.mruOrder.filter((id) => id !== tabId);
3044
+ workspace2.tabs.delete(tabId);
3045
+ detachTab2(tabId);
3046
+ workspace2.mruOrder = workspace2.mruOrder.filter((id) => id !== tabId);
2825
3047
  resetTabCycle();
2826
3048
  if (pane && paneIsEmpty(pane)) {
2827
3049
  closePane(pane.id);
@@ -2829,47 +3051,47 @@ function closeTab(tabId) {
2829
3051
  if (!wasActive) {
2830
3052
  return;
2831
3053
  }
2832
- const survivor = activePane();
2833
- const next = workspace.mruOrder.find((id) => survivor.tabOrder.includes(id)) ?? survivor.tabOrder.at(-1) ?? null;
3054
+ const survivor = activePane2();
3055
+ const next = workspace2.mruOrder.find((id) => survivor.tabOrder.includes(id)) ?? survivor.tabOrder.at(-1) ?? null;
2834
3056
  if (next) {
2835
3057
  setActiveTab(next);
2836
3058
  }
2837
3059
  }
2838
- function closeAllTabs() {
2839
- const tabs = [...workspace.tabs.values()];
2840
- workspace.tabs.clear();
3060
+ function closeAllTabs2() {
3061
+ const tabs = [...workspace2.tabs.values()];
3062
+ workspace2.tabs.clear();
2841
3063
  resetPanes();
2842
- workspace.mruOrder = [];
3064
+ workspace2.mruOrder = [];
2843
3065
  resetTabCycle();
2844
3066
  for (const tab of tabs) {
2845
3067
  disposeTab(tab);
2846
3068
  }
2847
3069
  }
2848
3070
  function resetPanes() {
2849
- workspace.panes = [{ activeTabId: null, derived: null, id: PRIMARY_PANE, tabOrder: [] }];
2850
- workspace.activePaneId = PRIMARY_PANE;
3071
+ workspace2.panes = [{ activeTabId: null, derived: null, id: PRIMARY_PANE2, tabOrder: [] }];
3072
+ workspace2.activePaneId = PRIMARY_PANE2;
2851
3073
  }
2852
3074
  function rememberClosedTab(tab) {
2853
3075
  if (!tab.documentPath) {
2854
3076
  return;
2855
3077
  }
2856
3078
  const path = tab.documentPath;
2857
- workspace.closedTabs = [
3079
+ workspace2.closedTabs = [
2858
3080
  { documentPath: path },
2859
- ...workspace.closedTabs.filter((entry) => entry.documentPath !== path)
3081
+ ...workspace2.closedTabs.filter((entry) => entry.documentPath !== path)
2860
3082
  ].slice(0, CLOSED_TAB_LIMIT);
2861
3083
  }
2862
3084
  function takeClosedTabPath() {
2863
- const [entry] = workspace.closedTabs;
3085
+ const [entry] = workspace2.closedTabs;
2864
3086
  if (!entry) {
2865
3087
  return;
2866
3088
  }
2867
- workspace.closedTabs = workspace.closedTabs.slice(1);
3089
+ workspace2.closedTabs = workspace2.closedTabs.slice(1);
2868
3090
  return entry.documentPath;
2869
3091
  }
2870
3092
  function cycleTab(step) {
2871
3093
  if (!_cycleList) {
2872
- _cycleList = workspace.mruOrder.filter((id2) => workspace.tabs.has(id2));
3094
+ _cycleList = workspace2.mruOrder.filter((id) => workspace2.tabs.has(id));
2873
3095
  _cycleIndex = 0;
2874
3096
  }
2875
3097
  const list = _cycleList;
@@ -2881,21 +3103,14 @@ function cycleTab(step) {
2881
3103
  setActiveTab(id, { cycling: true });
2882
3104
  return id;
2883
3105
  }
2884
- function endTabCycle() {
2885
- const settled = workspace.activeTabId;
2886
- resetTabCycle();
2887
- if (settled) {
2888
- promoteMru(settled);
2889
- }
2890
- }
2891
- function replaceAllTabs(newTabOpts) {
2892
- const oldIds = [...workspace.tabs.keys()];
2893
- const oldTabs = [...workspace.tabs.values()];
3106
+ function replaceAllTabs2(newTabOpts) {
3107
+ const oldIds = [...workspace2.tabs.keys()];
3108
+ const oldTabs = [...workspace2.tabs.values()];
2894
3109
  const newTab = createTab(newTabOpts);
2895
- workspace.tabs.set(newTab.id, newTab);
3110
+ workspace2.tabs.set(newTab.id, newTab);
2896
3111
  resetPanes();
2897
- workspace.panes[0].tabOrder = [newTab.id];
2898
- workspace.mruOrder = [];
3112
+ workspace2.panes[0].tabOrder = [newTab.id];
3113
+ workspace2.mruOrder = [];
2899
3114
  resetTabCycle();
2900
3115
  setActiveTab(newTab.id);
2901
3116
  ensureCollab(newTab);
@@ -2903,52 +3118,52 @@ function replaceAllTabs(newTabOpts) {
2903
3118
  if (id === newTab.id) {
2904
3119
  continue;
2905
3120
  }
2906
- workspace.tabs.delete(id);
3121
+ workspace2.tabs.delete(id);
2907
3122
  }
2908
3123
  for (const tab of oldTabs) {
2909
3124
  disposeTab(tab);
2910
3125
  }
2911
3126
  return newTab;
2912
3127
  }
2913
- function activateTab(tabId, opts = {}) {
3128
+ function activateTab2(tabId, opts = {}) {
2914
3129
  setActiveTab(tabId, opts);
2915
3130
  }
2916
- function moveTabToPane(tabId, paneId) {
2917
- const pane = paneById(paneId);
2918
- if (!pane || !workspace.tabs.has(tabId)) {
3131
+ function moveTabToPane2(tabId, paneId) {
3132
+ const pane = paneById2(paneId);
3133
+ if (!pane || !workspace2.tabs.has(tabId)) {
2919
3134
  return null;
2920
3135
  }
2921
3136
  if (pane.tabOrder.includes(tabId)) {
2922
3137
  return pane;
2923
3138
  }
2924
- detachTab(tabId);
2925
- insertIntoPane(pane, tabId);
3139
+ detachTab2(tabId);
3140
+ insertIntoPane2(pane, tabId);
2926
3141
  return pane;
2927
3142
  }
2928
- function renameTab(oldId, newId, newDocumentPath) {
2929
- const tab = workspace.tabs.get(oldId);
3143
+ function renameTab2(oldId, newId, newDocumentPath) {
3144
+ const tab = workspace2.tabs.get(oldId);
2930
3145
  if (!tab) {
2931
3146
  return;
2932
3147
  }
2933
3148
  tab.id = newId;
2934
3149
  tab.documentPath = newDocumentPath;
2935
- workspace.tabs.delete(oldId);
2936
- workspace.tabs.set(newId, tab);
2937
- for (const pane of workspace.panes) {
3150
+ workspace2.tabs.delete(oldId);
3151
+ workspace2.tabs.set(newId, tab);
3152
+ for (const pane of workspace2.panes) {
2938
3153
  pane.tabOrder = pane.tabOrder.map((id) => id === oldId ? newId : id);
2939
3154
  if (pane.activeTabId === oldId) {
2940
3155
  pane.activeTabId = newId;
2941
3156
  }
2942
3157
  }
2943
- workspace.mruOrder = workspace.mruOrder.map((id) => id === oldId ? newId : id);
3158
+ workspace2.mruOrder = workspace2.mruOrder.map((id) => id === oldId ? newId : id);
2944
3159
  resetTabCycle();
2945
3160
  rekeyCollab(tab);
2946
3161
  }
2947
- function registerTabCommands(registry, deps) {
3162
+ function registerTabCommands2(registry, deps) {
2948
3163
  registry.registerAll([...tabCommands(deps), ...paneCommands(deps)]);
2949
3164
  }
2950
3165
  function tabCommands(deps) {
2951
- const twoOrMoreTabs = () => workspace.tabs.size > 1;
3166
+ const twoOrMoreTabs = () => workspace2.tabs.size > 1;
2952
3167
  return [
2953
3168
  {
2954
3169
  id: "document.nextTab",
@@ -2980,6 +3195,39 @@ function tabCommands(deps) {
2980
3195
  cycleTab(-1);
2981
3196
  }
2982
3197
  },
3198
+ {
3199
+ args: argsSchema({
3200
+ path: stringProperty('Project-relative path of the file to open, e.g. "pages/about.json" or ' + '"components/nav-bar.json". It must exist.')
3201
+ }),
3202
+ id: "document.open",
3203
+ title: "Open Document",
3204
+ category: "Document",
3205
+ level: "project",
3206
+ menus: ["palette"],
3207
+ group: "1_file",
3208
+ when: (ctx) => ctx.project.open,
3209
+ requires: "an open project",
3210
+ aiTool: {
3211
+ description: "Open a project file as the active document; the document tools then operate on it. " + "Use it when the user should SEE the page, or for iterative visual refinement after " + "creating a page or component.",
3212
+ name: "open_document",
3213
+ report: ({ after, args }) => {
3214
+ const path = stringArg("document.open", args, "path");
3215
+ const active = activeTab2.value?.documentPath ?? null;
3216
+ if (active !== path) {
3217
+ return `Opened "${path}", but the active document is ${active === null ? "none" : `"${active}"`}.`;
3218
+ }
3219
+ const where = after.editor.kind === "canvas" ? "on the canvas; the document tools now operate on it" : `in the ${EDITOR_KIND_LABELS[after.editor.kind]} editor, which is not an element tree the document tools can edit`;
3220
+ return `"${path}" is the active document, ${where}.`;
3221
+ }
3222
+ },
3223
+ run: async (_ctx, args) => {
3224
+ const path = stringArg("document.open", args, "path");
3225
+ await deps.openFile(path);
3226
+ if (![...workspace2.tabs.values()].some((tab) => tab.documentPath === path)) {
3227
+ throw new RangeError(`command "document.open" argument "path": "${path}" could not be opened — it does ` + `not exist, or no editor claims its format. Problems has the reason.`);
3228
+ }
3229
+ }
3230
+ },
2983
3231
  {
2984
3232
  id: "document.reopenClosed",
2985
3233
  title: "Reopen Closed Document",
@@ -2988,7 +3236,7 @@ function tabCommands(deps) {
2988
3236
  keybinding: "mod+shift+t",
2989
3237
  menus: ["context/tab", "palette"],
2990
3238
  group: "1_file",
2991
- enablement: () => workspace.closedTabs.length > 0,
3239
+ enablement: () => workspace2.closedTabs.length > 0,
2992
3240
  requires: "a document closed in this session",
2993
3241
  run: async () => {
2994
3242
  const path = takeClosedTabPath();
@@ -3007,10 +3255,10 @@ function tabCommands(deps) {
3007
3255
  when: (ctx) => ctx.document.open,
3008
3256
  requires: "an open document",
3009
3257
  run: () => {
3010
- const id = workspace.activeTabId;
3011
- const tab = id ? workspace.tabs.get(id) : null;
3258
+ const id = workspace2.activeTabId;
3259
+ const tab = id ? workspace2.tabs.get(id) : null;
3012
3260
  if (id && tab) {
3013
- setTabPinned(id, !tab.pinned);
3261
+ setTabPinned2(id, !tab.pinned);
3014
3262
  }
3015
3263
  }
3016
3264
  },
@@ -3027,9 +3275,9 @@ function tabCommands(deps) {
3027
3275
  when: (ctx) => ctx.document.open,
3028
3276
  requires: "an open document",
3029
3277
  run: (_ctx, args) => {
3030
- const id = workspace.activeTabId;
3031
- if (id && workspace.tabs.get(id)) {
3032
- setTabPinned(id, booleanArg("document.setPinned", args, "pinned"));
3278
+ const id = workspace2.activeTabId;
3279
+ if (id && workspace2.tabs.get(id)) {
3280
+ setTabPinned2(id, booleanArg("document.setPinned", args, "pinned"));
3033
3281
  }
3034
3282
  }
3035
3283
  },
@@ -3042,21 +3290,21 @@ function tabCommands(deps) {
3042
3290
  group: "1_file",
3043
3291
  when: (ctx) => ctx.document.open,
3044
3292
  enablement: () => {
3045
- const id = workspace.activeTabId;
3046
- return id !== null && workspace.tabs.get(id)?.preview === true;
3293
+ const id = workspace2.activeTabId;
3294
+ return id !== null && workspace2.tabs.get(id)?.preview === true;
3047
3295
  },
3048
3296
  requires: "a preview document — one opened by a single click",
3049
3297
  run: () => {
3050
- const id = workspace.activeTabId;
3298
+ const id = workspace2.activeTabId;
3051
3299
  if (id) {
3052
- promoteTab(id);
3300
+ promoteTab2(id);
3053
3301
  }
3054
3302
  }
3055
3303
  }
3056
3304
  ];
3057
3305
  }
3058
3306
  function paneCommands(deps) {
3059
- const twoPanes = () => workspace.panes.length > 1;
3307
+ const twoPanes = () => workspace2.panes.length > 1;
3060
3308
  return [
3061
3309
  {
3062
3310
  id: "pane.splitRight",
@@ -3067,7 +3315,7 @@ function paneCommands(deps) {
3067
3315
  menus: ["context/pane", "context/tab", "palette"],
3068
3316
  group: "5_pane",
3069
3317
  when: (ctx) => ctx.document.open,
3070
- enablement: () => workspace.activeTabId !== null,
3318
+ enablement: () => workspace2.activeTabId !== null,
3071
3319
  requires: "an open document",
3072
3320
  undo: "none",
3073
3321
  run: () => {
@@ -3085,21 +3333,17 @@ function paneCommands(deps) {
3085
3333
  menus: ["context/pane", "context/tab", "palette"],
3086
3334
  group: "5_pane",
3087
3335
  when: (ctx) => ctx.document.open,
3088
- enablement: () => workspace.activeTabId !== null,
3336
+ enablement: () => workspace2.activeTabId !== null,
3089
3337
  requires: "an open document",
3090
3338
  undo: "none",
3091
- aiTool: {
3092
- description: "Open a second document in the pane beside the current one, without moving the document " + "you are in.",
3093
- name: "compare_with"
3094
- },
3095
3339
  run: async (_ctx, args) => {
3096
3340
  const path = stringArg("pane.compareWith", args, "path");
3097
- const here = activePane();
3098
- const held = here.activeTabId ? workspace.tabs.get(here.activeTabId) : null;
3341
+ const here = activePane2();
3342
+ const held = here.activeTabId ? workspace2.tabs.get(here.activeTabId) : null;
3099
3343
  if (held?.documentPath === path) {
3100
3344
  throw new RangeError(`command "pane.compareWith" argument "path": "${path}" is the document this pane is ` + `already showing — name a different one`);
3101
3345
  }
3102
- await deps.openFileInPane(receivingPane().id, path);
3346
+ await deps.openFileInPane(receivingPane2().id, path);
3103
3347
  }
3104
3348
  },
3105
3349
  {
@@ -3114,7 +3358,7 @@ function paneCommands(deps) {
3114
3358
  requires: "a split pane grid",
3115
3359
  undo: "none",
3116
3360
  run: () => {
3117
- focusPane(PRIMARY_PANE);
3361
+ focusPane2(PRIMARY_PANE2);
3118
3362
  }
3119
3363
  },
3120
3364
  {
@@ -3129,7 +3373,7 @@ function paneCommands(deps) {
3129
3373
  requires: "a split pane grid",
3130
3374
  undo: "none",
3131
3375
  run: () => {
3132
- focusPane(SECONDARY_PANE);
3376
+ focusPane2(SECONDARY_PANE2);
3133
3377
  }
3134
3378
  },
3135
3379
  {
@@ -3147,17 +3391,17 @@ function paneCommands(deps) {
3147
3391
  ];
3148
3392
  }
3149
3393
  function runUnsplit() {
3150
- const derived = workspace.panes.find((pane) => pane.derived !== null);
3151
- if (derived?.id === PRIMARY_PANE) {
3394
+ const derived = workspace2.panes.find((pane) => pane.derived !== null);
3395
+ if (derived?.id === PRIMARY_PANE2) {
3152
3396
  derived.derived = null;
3153
3397
  if (!paneIsEmpty(derived)) {
3154
3398
  return;
3155
3399
  }
3156
3400
  }
3157
- closePane(derived?.id ?? SECONDARY_PANE);
3401
+ closePane(derived?.id ?? SECONDARY_PANE2);
3158
3402
  }
3159
3403
 
3160
- export { LANGUAGE_TAG_PATTERN, canonicalizeLocale, isWellFormedLocale, localeDirection, localeLabel, resolveI18n, localeOfPath, servedLocaleOfPath, translationKeyOfPath, translationPathFor, EDITOR_KIND_LABELS, editorKindForMode, canvasViewForMode, inCanvas, hasSelection, hasElementSelection, emptyContext, makeContext, keyScopeStack, PROJECT_CONFIG_PATH, createTab, editorKindOf, editorKindsOf, modeForEditorKind, disposeTab, primarySelection, selectionAnchor, isSelected, cloneSelection, toggleSelected, rangeSelection, isSpliceablePath, structuralBatch, uniquePaths, unifyValues, setPatchConsumer, recordDocOp, transactDoc, transact, beginBatch, endBatch, isBatching, batchTab, setHistoryDelegate, canUndo, canRedo, undo, redo, mutateInsertNode, mutateRemoveNode, mutateDuplicateNode, mutateRemoveNodes, mutateDuplicateNodes, mutateWrapNode, mutateMoveNode, mutateUpdateProperty, mutateUpdateStyle, mutateUpdateAttribute, mutateUpdateMediaStyle, mutateUpdateNestedStyle, mutateUpdateMediaNestedStyle, mutateUpdateNestedStylePath, mutateUpdateMediaNestedStylePath, mutateReplaceStyle, mutateAddDef, mutateRemoveDef, mutateUpdateDef, mutateRenameDef, mutateUpdateProp, mutateAddSwitchCase, mutateRemoveSwitchCase, mutateRenameSwitchCase, mutateUpdateFrontmatter, collabState, isCollabPath, stringArg, optionalStringArg, boundedNumberArg, booleanArg, enumArg, pathArg, nullablePathArg, pathListArg, argsSchema, enumProperty, derivedEnumProperty, numberProperty, booleanProperty, pathProperty, pathListProperty, stringProperty, LOCALE_PLACEHOLDER, collectionForDirectory, collectionForFile, camelToKebab, camelToLabel, toCamelCase, kebabToLabel, propLabel, attrLabel, abbreviateValue, isMediaFormat, inferInputType, findContentTypeSchema, friendlyNameToVar, varDisplayName, parseCemType, jsonClone, configureCollabSerializer, configureCollabParser, configureCollabNotifier, collabSourceContext, collabReadOnly, collabSave, flushAllCollab, setCollabEnabled, isCollabEnabled, PRIMARY_PANE, SECONDARY_PANE, MAX_PANES, workspace, activeTab, activePane, paneById, paneOfTab, focusPane, isPaneFocused, focusOtherPane, splitRight, sidePane, receivingPane, closePane, detachTab, insertIntoPane, setWorkspaceProject, isTabActive, tabIsLive, openTab, promoteTab, promoteDirtyPreviewTabs, setTabPinned, moveTab, closeTab, closeAllTabs, takeClosedTabPath, cycleTab, endTabCycle, replaceAllTabs, activateTab, moveTabToPane, renameTab, registerTabCommands, tabCommands, paneCommands };
3404
+ export { LANGUAGE_TAG_PATTERN, canonicalizeLocale, isWellFormedLocale, localeDirection, localeLabel, resolveI18n, localeOfPath, servedLocaleOfPath, translationKeyOfPath, translationPathFor, EDITOR_KIND_LABELS, editorKindForMode, canvasViewForMode, inCanvas, hasSelection, hasElementSelection, emptyContext, makeContext, keyScopeStack, PROJECT_CONFIG_PATH, createTab, editorKindOf, editorKindsOf, modeForEditorKind, disposeTab, primarySelection, selectionAnchor, isSelected, cloneSelection, toggleSelected, rangeSelection, isSpliceablePath, structuralBatch, uniquePaths, unifyValues, setPatchConsumer, recordDocOp, transactDoc, transact, beginBatch, endBatch, isBatching, batchTab, setHistoryDelegate, canUndo, canRedo, undo, redo, mutateInsertNode, mutateRemoveNode, mutateDuplicateNode, mutateRemoveNodes, mutateDuplicateNodes, mutateWrapNode, mutateMoveNode, mutateUpdateProperty, mutateUpdateStyle, mutateUpdateAttribute, mutateUpdateMediaStyle, mutateUpdateNestedStyle, mutateUpdateMediaNestedStyle, mutateUpdateNestedStylePath, mutateUpdateMediaNestedStylePath, mutateReplaceStyle, mutateAddDef, mutateRemoveDef, mutateUpdateDef, mutateRenameDef, mutateUpdateProp, mutateAddSwitchCase, mutateRemoveSwitchCase, mutateRenameSwitchCase, mutateUpdateFrontmatter, collabState, isCollabPath, stringArg, optionalStringArg, boundedNumberArg, booleanArg, enumArg, pathArg, nullablePathArg, pathListArg, argsSchema, enumProperty, derivedEnumProperty, numberProperty, booleanProperty, pathProperty, pathListProperty, stringProperty, coerceArgs, LOCALE_PLACEHOLDER, collectionForDirectory, collectionForFile, camelToLabel, toCamelCase, kebabToLabel, propLabel, attrLabel, abbreviateValue, isMediaFormat, inferInputType, findContentTypeSchema, friendlyNameToVar, varDisplayName, parseCemType, jsonClone, configureCollabSerializer, configureCollabParser, configureCollabNotifier, collabSourceContext, collabReadOnly, collabSave, flushAllCollab, setCollabEnabled, isCollabEnabled, PRIMARY_PANE2, SECONDARY_PANE2, workspace2, activeTab2, activePane2, paneById2, paneOfTab2, focusPane2, isPaneFocused2, sidePane2, receivingPane2, detachTab2, insertIntoPane2, setWorkspaceProject2, isTabActive2, tabIsLive2, openTab2, promoteTab2, promoteDirtyPreviewTabs2, setTabPinned2, moveTab2, closeTab2, closeAllTabs2, replaceAllTabs2, activateTab2, moveTabToPane2, renameTab2, registerTabCommands2 };
3161
3405
 
3162
- //# debugId=B99EA2BC350882E464756E2164756E21
3163
- //# sourceMappingURL=studio-trxrabqf.js.map
3406
+ //# debugId=835A5B58C44D6A6B64756E2164756E21
3407
+ //# sourceMappingURL=studio-k75n7vhp.js.map