@jxsuite/studio 4.0.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (613) 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-xp8vnwma.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-fyf63pmy.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-2w1f35qs.js +18 -0
  15. package/dist/chunks/content-source-3wqeas45.js +46 -0
  16. package/dist/chunks/convert-to-repeater-d0cgnb6d.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-d6g50j7s.js +42 -0
  20. package/dist/chunks/extension-sections-fy7q4fe9.js +651 -0
  21. package/dist/chunks/file-ops-3btj6st0.js +47 -0
  22. package/dist/chunks/files-ef8fgs3w.js +72 -0
  23. package/dist/chunks/format-host-3c33nwr8.js +40 -0
  24. package/dist/chunks/fs-events-13tj6sex.js +18 -0
  25. package/dist/chunks/git-panel-4wp2rn9b.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-jgesd924.js +115 -0
  31. package/dist/chunks/{index-nj44jpzj.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-1nq5evsh.js +29 -0
  37. package/dist/chunks/layers-panel-ar2gh90g.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-2qbetq73.js +33 -0
  41. package/dist/chunks/menu-q99sy9rf.js +285 -0
  42. package/dist/chunks/menu-rf7n72mf.js +14 -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-rws7k4br.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-98f7sr3g.js +27 -0
  52. package/dist/chunks/quick-search-srzz83k2.js +45 -0
  53. package/dist/chunks/references-n553f0e1.js +26 -0
  54. package/dist/chunks/right-panel-rrgx2dn3.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-18avnhjp.js +2430 -0
  60. package/dist/chunks/{studio-kryvsw6j.js → studio-1k325pwf.js} +48 -48
  61. package/dist/chunks/{studio-hbtp0eh1.js → studio-25hkdrkw.js} +356 -85
  62. package/dist/chunks/studio-26d7myd1.js +258 -0
  63. package/dist/chunks/{studio-p8j86wag.js → studio-38emantv.js} +22 -5
  64. package/dist/chunks/studio-3gxv60tn.js +422 -0
  65. package/dist/chunks/{studio-8swrjbny.js → studio-3hxkd92t.js} +275 -163
  66. package/dist/chunks/studio-4m0haseg.js +185 -0
  67. package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
  68. package/dist/chunks/{studio-gv8vvshc.js → studio-5523bpzt.js} +11 -11
  69. package/dist/chunks/{studio-5q69gfag.js → studio-57mf66w2.js} +1753 -2484
  70. package/dist/chunks/studio-5jy81t3s.js +17463 -0
  71. package/dist/chunks/studio-5rt7sqa0.js +1168 -0
  72. package/dist/chunks/studio-5te5tqng.js +81 -0
  73. package/dist/chunks/{studio-p4ngc046.js → studio-6ewqv390.js} +9 -9
  74. package/dist/chunks/{studio-9ab8gqsm.js → studio-6nzaktvy.js} +7 -7
  75. package/dist/chunks/studio-6xa21ej9.js +28 -0
  76. package/dist/chunks/{studio-5ehhackm.js → studio-727xh0e3.js} +19 -19
  77. package/dist/chunks/{studio-eenfkt4e.js → studio-79y5sz51.js} +52 -38
  78. package/dist/chunks/{studio-4q0wznzf.js → studio-7e11jpa9.js} +461 -145
  79. package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
  80. package/dist/chunks/studio-7xptrg0j.js +954 -0
  81. package/dist/chunks/{studio-cft9r4r7.js → studio-81390n6f.js} +22 -22
  82. package/dist/chunks/{studio-q43a5y9h.js → studio-8jn5yhyn.js} +16 -16
  83. package/dist/chunks/studio-8qtrpzr3.js +839 -0
  84. package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
  85. package/dist/chunks/studio-9xxz1q69.js +1356 -0
  86. package/dist/chunks/studio-akbww0j5.js +13615 -0
  87. package/dist/chunks/studio-arfpe389.js +195 -0
  88. package/dist/chunks/{studio-2zkz8evn.js → studio-az3zd49t.js} +473 -281
  89. package/dist/chunks/studio-cpvb2ed1.js +1171 -0
  90. package/dist/chunks/{studio-9r6j5ev1.js → studio-d0300636.js} +5078 -19
  91. package/dist/chunks/{studio-bgxt93ga.js → studio-d055c37e.js} +13 -13
  92. package/dist/chunks/studio-d1ja2x9r.js +362 -0
  93. package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
  94. package/dist/chunks/{studio-4pqqxbrt.js → studio-em9nw8eh.js} +301 -112
  95. package/dist/chunks/studio-erdatzvp.js +1190 -0
  96. package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
  97. package/dist/chunks/studio-fabxk6r9.js +2811 -0
  98. package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
  99. package/dist/chunks/studio-hhvs4sdg.js +195 -0
  100. package/dist/chunks/{studio-68n67094.js → studio-kcgff4r0.js} +15 -18
  101. package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
  102. package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
  103. package/dist/chunks/studio-pm6hgy7r.js +4763 -0
  104. package/dist/chunks/studio-q0a3yk4n.js +33 -0
  105. package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
  106. package/dist/chunks/studio-qahxvnan.js +111 -0
  107. package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
  108. package/dist/chunks/{studio-kjjsjak4.js → studio-rkstz940.js} +3661 -6136
  109. package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
  110. package/dist/chunks/studio-rpyah2ew.js +2805 -0
  111. package/dist/chunks/studio-rs76k67r.js +12 -0
  112. package/dist/chunks/{studio-yxrkyv8a.js → studio-s6z853aq.js} +12108 -11766
  113. package/dist/chunks/{studio-sf7zjgv1.js → studio-sgdc5pfc.js} +8 -8
  114. package/dist/chunks/studio-tb3ev01j.js +763 -0
  115. package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
  116. package/dist/chunks/studio-vhv5tgxm.js +51 -0
  117. package/dist/chunks/{studio-htsf0w6m.js → studio-vz68yn9e.js} +31 -154
  118. package/dist/chunks/studio-wqpngpsk.js +174 -0
  119. package/dist/chunks/{studio-eesa1myv.js → studio-x3rty6tr.js} +58 -58
  120. package/dist/chunks/studio-xsykpvsh.js +8448 -0
  121. package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
  122. package/dist/chunks/studio-yxa81f45.js +12 -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-wrew8zk4.js +69 -0
  133. package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
  134. package/dist/iframe-entry.js +1812 -698
  135. package/dist/manifest.json +7 -0
  136. package/dist/studio.js +52900 -36573
  137. package/dist/workers/editor.worker.js +1040 -1085
  138. package/dist/workers/json.worker.js +1946 -1991
  139. package/dist/workers/ts.worker.js +4960 -5005
  140. package/favicon.ico +0 -0
  141. package/index.html +2 -0
  142. package/package.json +22 -55
  143. package/src/about/about-modal.ts +73 -123
  144. package/src/browse/library-commands.ts +20 -49
  145. package/src/browse/library-layouts.ts +87 -218
  146. package/src/browse/library-pane.ts +406 -438
  147. package/src/canvas/canvas-helpers.ts +0 -49
  148. package/src/canvas/canvas-live-render.ts +25 -2
  149. package/src/canvas/canvas-render.ts +666 -231
  150. package/src/canvas/canvas-surface.ts +0 -1
  151. package/src/canvas/canvas-utils.ts +310 -117
  152. package/src/canvas/dialog-path.ts +76 -0
  153. package/src/canvas/dialog-state.ts +67 -0
  154. package/src/canvas/diff-marks.ts +252 -0
  155. package/src/canvas/diff-toolbar.ts +349 -0
  156. package/src/canvas/diff-view.ts +123 -0
  157. package/src/canvas/edit-width-drag.ts +187 -0
  158. package/src/canvas/edit-width.ts +150 -0
  159. package/src/canvas/iframe-entry.ts +125 -8
  160. package/src/canvas/iframe-host.ts +271 -15
  161. package/src/canvas/iframe-interaction.ts +133 -13
  162. package/src/canvas/iframe-patch.ts +7 -1
  163. package/src/canvas/iframe-position.ts +5 -6
  164. package/src/canvas/iframe-protocol.ts +106 -5
  165. package/src/canvas/iframe-render.ts +373 -5
  166. package/src/canvas/iframe-slash.ts +2 -2
  167. package/src/canvas/iframe-subtree.ts +5 -8
  168. package/src/canvas/path-mapping.ts +25 -3
  169. package/src/canvas/popover-path.ts +106 -0
  170. package/src/canvas/popover-state.ts +155 -0
  171. package/src/canvas/surface-registry.ts +21 -10
  172. package/src/collab/presence-chips.ts +51 -73
  173. package/src/commands/app-commands.ts +10 -0
  174. package/src/commands/budget.ts +12 -0
  175. package/src/commands/command-args.ts +369 -6
  176. package/src/commands/defaults.ts +44 -14
  177. package/src/commands/live-context.ts +11 -5
  178. package/src/commands/reference.ts +12 -2
  179. package/src/commands/registry.ts +165 -8
  180. package/src/content/entry-commands.ts +16 -23
  181. package/src/content/entry-editor.ts +144 -101
  182. package/src/editor/canvas-slash-bridge.ts +2 -2
  183. package/src/editor/context-menu.ts +49 -200
  184. package/src/editor/convert-to-component.ts +42 -82
  185. package/src/editor/convert-to-repeater.ts +132 -173
  186. package/src/editor/inline-edit.ts +11 -0
  187. package/src/editor/shortcuts.ts +65 -26
  188. package/src/editor/slash-menu.ts +150 -157
  189. package/src/files/file-ops.ts +117 -11
  190. package/src/files/files.ts +949 -664
  191. package/src/files/json-layout.ts +474 -0
  192. package/src/files/media-paths.ts +13 -42
  193. package/src/files/media-usage.ts +41 -131
  194. package/src/files/serialize-document.ts +8 -1
  195. package/src/format/convert-file.ts +16 -10
  196. package/src/format/format-host.ts +50 -1
  197. package/src/github/github-auth.ts +71 -29
  198. package/src/github/github-publish.ts +57 -65
  199. package/src/grid/cell-editors.ts +46 -4
  200. package/src/grid/cell-popovers.ts +65 -62
  201. package/src/grid/grid-open.ts +86 -64
  202. package/src/grid/grid-panel.ts +390 -469
  203. package/src/grid/redirects-grid.ts +40 -44
  204. package/src/hosting/document.ts +2 -0
  205. package/src/hosting/layout.ts +10 -0
  206. package/src/i18n/i18n-commands.ts +127 -62
  207. package/src/media/media-pane.ts +83 -133
  208. package/src/new-project/add-repo-modal.ts +125 -176
  209. package/src/new-project/import-tab.ts +201 -250
  210. package/src/new-project/location-fields.ts +101 -165
  211. package/src/new-project/new-project-modal.ts +376 -367
  212. package/src/packages/jxsuite-update.ts +76 -18
  213. package/src/panels/activity-panel.ts +137 -104
  214. package/src/panels/ai-chat/chat-markdown.ts +15 -13
  215. package/src/panels/ai-chat/chat-view.ts +307 -472
  216. package/src/panels/ai-chat/composer.ts +175 -153
  217. package/src/panels/ai-chat/sessions-view.ts +31 -62
  218. package/src/panels/ai-panel.ts +210 -185
  219. package/src/panels/block-action-bar.ts +437 -643
  220. package/src/panels/bottom-dock.ts +112 -47
  221. package/src/panels/chat-panel.ts +19 -14
  222. package/src/panels/data-explorer.ts +141 -102
  223. package/src/panels/data-grid.ts +183 -150
  224. package/src/panels/dnd.ts +75 -20
  225. package/src/panels/editors.ts +26 -19
  226. package/src/panels/elements-panel.ts +243 -186
  227. package/src/panels/empty-state.ts +26 -42
  228. package/src/panels/events-panel.ts +950 -729
  229. package/src/panels/formula-workspace.ts +434 -207
  230. package/src/panels/frontmatter-fields.ts +185 -153
  231. package/src/panels/frontmatter-panel.ts +411 -187
  232. package/src/panels/git-diff-open.ts +148 -0
  233. package/src/panels/git-panel.ts +679 -605
  234. package/src/panels/head-panel.ts +617 -435
  235. package/src/panels/i18n-panel.ts +153 -133
  236. package/src/panels/imports-panel.ts +388 -414
  237. package/src/panels/jump-bar.ts +174 -147
  238. package/src/panels/layers-panel.ts +785 -671
  239. package/src/panels/left-panel.ts +166 -94
  240. package/src/panels/navigator-panels.ts +1 -1
  241. package/src/panels/pane-context.ts +529 -677
  242. package/src/panels/pane-grid.ts +265 -241
  243. package/src/panels/panel-registry.ts +15 -4
  244. package/src/panels/problems-panel.ts +177 -99
  245. package/src/panels/properties-panel.ts +1525 -966
  246. package/src/panels/provenance.ts +31 -113
  247. package/src/panels/quick-search.ts +217 -172
  248. package/src/panels/right-panel.ts +135 -169
  249. package/src/panels/seo-modal.ts +346 -167
  250. package/src/panels/settings-menu.ts +109 -646
  251. package/src/panels/settings-pane.ts +102 -86
  252. package/src/panels/signals-panel.ts +1318 -1172
  253. package/src/panels/statement-editor.ts +556 -428
  254. package/src/panels/style-panel.ts +1367 -630
  255. package/src/panels/style-utils.ts +36 -32
  256. package/src/panels/stylebook-doc.ts +30 -73
  257. package/src/panels/stylebook-layers-panel.ts +202 -109
  258. package/src/panels/stylebook-panel.ts +124 -88
  259. package/src/panels/tab-strip.ts +385 -287
  260. package/src/platforms/cloud.ts +347 -86
  261. package/src/platforms/devserver.ts +13 -0
  262. package/src/publish/deploy-checklist.ts +124 -78
  263. package/src/publish/publish-commands.ts +4 -12
  264. package/src/publish/publish-panel.ts +165 -299
  265. package/src/services/a11y-report.ts +100 -43
  266. package/src/services/ai-command-tools.ts +468 -0
  267. package/src/services/ai-import-tools.ts +50 -12
  268. package/src/services/ai-models.ts +108 -1
  269. package/src/services/ai-session-store.ts +6 -0
  270. package/src/services/ai-system-prompt.ts +110 -18
  271. package/src/services/ai-tools.ts +28 -143
  272. package/src/services/ai-write-report.ts +174 -0
  273. package/src/services/context-manager.ts +12 -1
  274. package/src/services/document-assistant.ts +50 -2
  275. package/src/services/idle.ts +16 -14
  276. package/src/services/live-surfaces.ts +237 -0
  277. package/src/services/model-uri.ts +75 -0
  278. package/src/services/notify.ts +63 -6
  279. package/src/services/popover-report.ts +325 -0
  280. package/src/services/surface-registry.ts +56 -0
  281. package/src/services/tool-executor.ts +17 -0
  282. package/src/settings/contexts-section.ts +301 -299
  283. package/src/settings/contributed-section.ts +361 -222
  284. package/src/settings/css-vars-editor.ts +320 -325
  285. package/src/settings/defs-editor.ts +572 -535
  286. package/src/settings/dependencies-editor.ts +79 -107
  287. package/src/settings/extension-commands.ts +379 -0
  288. package/src/settings/extension-rows.ts +113 -0
  289. package/src/settings/extensions-section.ts +287 -0
  290. package/src/settings/general-settings.ts +130 -181
  291. package/src/settings/head-editor.ts +10 -305
  292. package/src/settings/locales-section.ts +146 -196
  293. package/src/settings/preferences-accounts.ts +193 -12
  294. package/src/settings/preferences-dialog.ts +384 -307
  295. package/src/settings/project-sections.ts +108 -181
  296. package/src/settings/schema-field-ui.ts +11 -399
  297. package/src/settings/section-registry.ts +8 -1
  298. package/src/settings/settings-document.ts +31 -29
  299. package/src/shell/tree.ts +42 -87
  300. package/src/shell.ts +48 -36
  301. package/src/studio.ts +90 -67
  302. package/src/style/token-ref.ts +0 -39
  303. package/src/surfaces/about.json +263 -0
  304. package/src/surfaces/about.ts +163 -0
  305. package/src/surfaces/add-repo.json +486 -0
  306. package/src/surfaces/add-repo.ts +236 -0
  307. package/src/surfaces/ai-chat.json +2185 -0
  308. package/src/surfaces/ai-chat.ts +549 -0
  309. package/src/surfaces/ai-credentials-form.json +332 -0
  310. package/src/surfaces/ai-credentials-form.ts +151 -0
  311. package/src/surfaces/ai-managed-connect.json +108 -0
  312. package/src/surfaces/ai-managed-connect.ts +123 -0
  313. package/src/surfaces/ai-model-picker.json +114 -0
  314. package/src/surfaces/ai-model-picker.ts +139 -0
  315. package/src/surfaces/block-action-bar.json +640 -0
  316. package/src/surfaces/block-action-bar.ts +368 -0
  317. package/src/surfaces/bottom-dock.json +154 -0
  318. package/src/surfaces/bottom-dock.ts +125 -0
  319. package/src/surfaces/canvas-stage.json +444 -0
  320. package/src/surfaces/canvas-stage.ts +253 -0
  321. package/src/surfaces/cf-account-picker.json +300 -0
  322. package/src/surfaces/cf-account-picker.ts +214 -0
  323. package/src/surfaces/commandbar.json +984 -0
  324. package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +414 -389
  325. package/src/surfaces/convert-repeater.json +309 -0
  326. package/src/surfaces/convert-repeater.ts +276 -0
  327. package/src/surfaces/data-actions.json +157 -0
  328. package/src/surfaces/data-actions.ts +115 -0
  329. package/src/surfaces/dialog.json +289 -0
  330. package/src/surfaces/dialog.ts +343 -0
  331. package/src/surfaces/diff-toolbar.json +266 -0
  332. package/src/surfaces/diff-toolbar.ts +139 -0
  333. package/src/surfaces/doc-header.json +739 -0
  334. package/src/surfaces/doc-header.ts +223 -0
  335. package/src/surfaces/empty-state.json +152 -0
  336. package/src/surfaces/empty-state.ts +173 -0
  337. package/src/surfaces/entry-editor.json +281 -0
  338. package/src/surfaces/entry-editor.ts +191 -0
  339. package/src/surfaces/expression-editor.json +977 -0
  340. package/src/surfaces/expression-editor.ts +266 -0
  341. package/src/surfaces/files-panel.json +592 -0
  342. package/src/surfaces/files-panel.ts +301 -0
  343. package/src/surfaces/formula-palette.json +364 -0
  344. package/src/surfaces/formula-palette.ts +340 -0
  345. package/src/surfaces/git-panel.json +1822 -0
  346. package/src/surfaces/git-panel.ts +272 -0
  347. package/src/surfaces/github-auth.json +112 -0
  348. package/src/surfaces/github-auth.ts +139 -0
  349. package/src/surfaces/github-publish.json +206 -0
  350. package/src/surfaces/github-publish.ts +169 -0
  351. package/src/surfaces/grid-cell.json +218 -0
  352. package/src/surfaces/grid-cell.ts +120 -0
  353. package/src/surfaces/grid-open.json +147 -0
  354. package/src/surfaces/grid-open.ts +87 -0
  355. package/src/surfaces/grid-panel.json +706 -0
  356. package/src/surfaces/grid-panel.ts +206 -0
  357. package/src/surfaces/grid-replace.json +179 -0
  358. package/src/surfaces/grid-replace.ts +89 -0
  359. package/src/surfaces/grid-views.json +446 -0
  360. package/src/surfaces/grid-views.ts +172 -0
  361. package/src/surfaces/inspector-dock.json +187 -0
  362. package/src/surfaces/inspector-dock.ts +161 -0
  363. package/src/surfaces/jump-bar.json +243 -0
  364. package/src/surfaces/jump-bar.ts +129 -0
  365. package/src/surfaces/jxsuite-update.json +146 -0
  366. package/src/surfaces/jxsuite-update.ts +149 -0
  367. package/src/surfaces/library-pane.json +1509 -0
  368. package/src/surfaces/library-pane.ts +363 -0
  369. package/src/surfaces/logic-panel.json +1949 -0
  370. package/src/surfaces/logic-panel.ts +369 -0
  371. package/src/surfaces/logic-workspace.json +685 -0
  372. package/src/surfaces/logic-workspace.ts +238 -0
  373. package/src/surfaces/media-browser.json +303 -0
  374. package/src/surfaces/media-browser.ts +145 -0
  375. package/src/surfaces/media-field.json +163 -0
  376. package/src/surfaces/media-field.ts +116 -0
  377. package/src/surfaces/media-pane.json +513 -0
  378. package/src/surfaces/media-pane.ts +197 -0
  379. package/src/surfaces/menu.json +232 -0
  380. package/src/surfaces/menu.ts +375 -0
  381. package/src/surfaces/navigator-dock.json +113 -0
  382. package/src/surfaces/navigator-dock.ts +130 -0
  383. package/src/surfaces/new-project.json +1654 -0
  384. package/src/surfaces/new-project.ts +411 -0
  385. package/src/surfaces/palette.json +535 -0
  386. package/src/surfaces/pane-context.json +1497 -0
  387. package/src/surfaces/pane-context.ts +513 -0
  388. package/src/surfaces/pane-grid.json +188 -0
  389. package/src/surfaces/pane-grid.ts +250 -0
  390. package/src/surfaces/panel-activity.json +563 -0
  391. package/src/surfaces/panel-activity.ts +187 -0
  392. package/src/surfaces/panel-data.json +141 -0
  393. package/src/surfaces/panel-data.ts +156 -0
  394. package/src/surfaces/panel-deploy-checklist.json +283 -0
  395. package/src/surfaces/panel-deploy-checklist.ts +175 -0
  396. package/src/surfaces/panel-elements.json +367 -0
  397. package/src/surfaces/panel-elements.ts +175 -0
  398. package/src/surfaces/panel-i18n.json +569 -0
  399. package/src/surfaces/panel-i18n.ts +212 -0
  400. package/src/surfaces/panel-imports.json +780 -0
  401. package/src/surfaces/panel-imports.ts +209 -0
  402. package/src/surfaces/panel-outline.json +734 -0
  403. package/src/surfaces/panel-outline.ts +326 -0
  404. package/src/surfaces/panel-page.json +1017 -0
  405. package/src/surfaces/panel-page.ts +240 -0
  406. package/src/surfaces/panel-problems.json +497 -0
  407. package/src/surfaces/panel-problems.ts +157 -0
  408. package/src/surfaces/panel-signals.json +1973 -0
  409. package/src/surfaces/panel-signals.ts +436 -0
  410. package/src/surfaces/panel-stylebook-layers.json +317 -0
  411. package/src/surfaces/panel-stylebook-layers.ts +155 -0
  412. package/src/surfaces/preferences.json +850 -0
  413. package/src/surfaces/preferences.ts +332 -0
  414. package/src/surfaces/progress-modal.json +110 -0
  415. package/src/surfaces/progress-modal.ts +150 -0
  416. package/src/surfaces/properties-panel.json +1578 -0
  417. package/src/surfaces/properties-panel.ts +337 -0
  418. package/src/surfaces/publish.json +945 -0
  419. package/src/surfaces/publish.ts +392 -0
  420. package/src/surfaces/push-plan.json +110 -0
  421. package/src/surfaces/push-plan.ts +87 -0
  422. package/src/surfaces/rail.json +255 -0
  423. package/src/surfaces/rail.ts +206 -0
  424. package/src/surfaces/reference-field.json +191 -0
  425. package/src/surfaces/reference-field.ts +168 -0
  426. package/src/surfaces/schema-builder.json +1011 -0
  427. package/src/surfaces/schema-builder.ts +181 -0
  428. package/src/surfaces/schema-form.json +1013 -0
  429. package/src/surfaces/schema-form.ts +287 -0
  430. package/src/surfaces/secret-field.json +60 -0
  431. package/src/surfaces/secret-field.ts +146 -0
  432. package/src/surfaces/seo.json +932 -0
  433. package/src/surfaces/seo.ts +334 -0
  434. package/src/surfaces/settings-contexts.json +538 -0
  435. package/src/surfaces/settings-contexts.ts +196 -0
  436. package/src/surfaces/settings-contributed.json +489 -0
  437. package/src/surfaces/settings-contributed.ts +199 -0
  438. package/src/surfaces/settings-css-vars.json +820 -0
  439. package/src/surfaces/settings-css-vars.ts +199 -0
  440. package/src/surfaces/settings-defs.json +1363 -0
  441. package/src/surfaces/settings-defs.ts +232 -0
  442. package/src/surfaces/settings-deploy.json +108 -0
  443. package/src/surfaces/settings-deploy.ts +135 -0
  444. package/src/surfaces/settings-extensions.json +486 -0
  445. package/src/surfaces/settings-extensions.ts +201 -0
  446. package/src/surfaces/settings-head.json +779 -0
  447. package/src/surfaces/settings-head.ts +397 -0
  448. package/src/surfaces/settings-locales.json +420 -0
  449. package/src/surfaces/settings-locales.ts +137 -0
  450. package/src/surfaces/settings-overview.json +423 -0
  451. package/src/surfaces/settings-overview.ts +218 -0
  452. package/src/surfaces/settings-packages.json +549 -0
  453. package/src/surfaces/settings-packages.ts +158 -0
  454. package/src/surfaces/settings-pane.json +147 -0
  455. package/src/surfaces/settings-pane.ts +150 -0
  456. package/src/surfaces/settings-rawjson.json +104 -0
  457. package/src/surfaces/settings-rawjson.ts +107 -0
  458. package/src/surfaces/shell.json +99 -0
  459. package/src/surfaces/shell.ts +30 -0
  460. package/src/surfaces/slash-menu.json +180 -0
  461. package/src/surfaces/slash-menu.ts +272 -0
  462. package/src/surfaces/statements.json +607 -0
  463. package/src/surfaces/statements.ts +238 -0
  464. package/src/surfaces/statusbar.json +94 -0
  465. package/src/{panels → surfaces}/statusbar.ts +163 -90
  466. package/src/surfaces/style-panel.json +1643 -0
  467. package/src/surfaces/style-panel.ts +338 -0
  468. package/src/surfaces/stylebook-chrome.json +122 -0
  469. package/src/surfaces/stylebook-chrome.ts +122 -0
  470. package/src/surfaces/tab-strip.json +448 -0
  471. package/src/surfaces/tab-strip.ts +200 -0
  472. package/src/surfaces/target-line.json +419 -0
  473. package/src/surfaces/target-line.ts +349 -0
  474. package/src/surfaces/toasts.json +189 -0
  475. package/src/surfaces/welcome.json +571 -0
  476. package/src/surfaces/welcome.ts +338 -0
  477. package/src/tabs/project-config.ts +71 -15
  478. package/src/tabs/tab.ts +52 -1
  479. package/src/types.ts +49 -3
  480. package/src/ui/ai-credentials-form.ts +104 -100
  481. package/src/ui/ai-managed-connect.ts +116 -49
  482. package/src/ui/ai-model-picker.ts +102 -47
  483. package/src/ui/cf-account-picker.ts +135 -0
  484. package/src/ui/color-selector.ts +80 -301
  485. package/src/ui/dynamic-slot.ts +43 -283
  486. package/src/ui/expression-editor.ts +797 -576
  487. package/src/ui/field-input.ts +8 -181
  488. package/src/ui/form-controls.ts +838 -366
  489. package/src/ui/formula-chips.ts +80 -85
  490. package/src/ui/kit.ts +33 -0
  491. package/src/ui/layers.ts +293 -593
  492. package/src/ui/media-picker.ts +203 -284
  493. package/src/ui/panel-resize.ts +251 -64
  494. package/src/ui/popover-surface.ts +153 -0
  495. package/src/ui/progress-modal.ts +22 -60
  496. package/src/ui/regions.ts +13 -7
  497. package/src/ui/schema-form.ts +906 -440
  498. package/src/ui/surface.ts +122 -0
  499. package/src/ui/unit-selector.ts +15 -131
  500. package/src/ui/value-source.ts +14 -0
  501. package/src/ui/virtual-window.ts +88 -9
  502. package/src/utils/canvas-media.ts +72 -0
  503. package/src/utils/edit-display.ts +7 -2
  504. package/src/utils/element-selectors.ts +69 -0
  505. package/src/utils/link-target.ts +2 -2
  506. package/src/utils/studio-utils.ts +0 -10
  507. package/src/view.ts +15 -0
  508. package/src/workspace/pane-derive.ts +36 -14
  509. package/src/workspace/workspace.ts +15 -6
  510. package/styles/canvas.css +72 -467
  511. package/styles/forced-colors.css +48 -82
  512. package/styles/forced-colors.json +41 -0
  513. package/styles/inspector.css +2 -1301
  514. package/styles/overlays.css +96 -2823
  515. package/styles/panels.css +6 -1423
  516. package/styles/shell-frame.css +272 -0
  517. package/styles/shell-frame.json +227 -0
  518. package/styles/shell.css +0 -1532
  519. package/styles/tokens.css +65 -136
  520. package/styles/tokens.json +84 -0
  521. package/dist/chunks/Overlay.dev-723bv0df.js +0 -23
  522. package/dist/chunks/adapter-jkcyhgtr.js +0 -14
  523. package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
  524. package/dist/chunks/components-zmx10t62.js +0 -21
  525. package/dist/chunks/content-source-t88vb2dr.js +0 -49
  526. package/dist/chunks/convert-to-repeater-dhw1nrz9.js +0 -268
  527. package/dist/chunks/editor-cptq5jp1.js +0 -37
  528. package/dist/chunks/entry-commands-6z6bhxg0.js +0 -46
  529. package/dist/chunks/extension-sections-3ydgjbdy.js +0 -311
  530. package/dist/chunks/file-ops-rskmhxyq.js +0 -48
  531. package/dist/chunks/files-0cratsr0.js +0 -92
  532. package/dist/chunks/flow-qbfgrpeh.js +0 -634
  533. package/dist/chunks/focus-trap.esm-ggawf1hy.js +0 -1024
  534. package/dist/chunks/focus-visible-6eg70z18.js +0 -167
  535. package/dist/chunks/format-host-tgcmfs4p.js +0 -43
  536. package/dist/chunks/fs-events-hrrg328g.js +0 -21
  537. package/dist/chunks/git-panel-0yywyk76.js +0 -58
  538. package/dist/chunks/index-zqxmqxmh.js +0 -109
  539. package/dist/chunks/jx-validate-8q2g05x1.js +0 -19
  540. package/dist/chunks/layers-panel-z3tqe5cd.js +0 -67
  541. package/dist/chunks/layers-q75tj2mf.js +0 -45
  542. package/dist/chunks/lit-html-j055mkh8.js +0 -22
  543. package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
  544. package/dist/chunks/notify-yjm79n4s.js +0 -30
  545. package/dist/chunks/parse-24d0gay3.js +0 -19
  546. package/dist/chunks/platform-ba1j1gbh.js +0 -16
  547. package/dist/chunks/publish-panel-54jvhskq.js +0 -28
  548. package/dist/chunks/quick-search-cgfmjwq5.js +0 -65
  549. package/dist/chunks/references-3qx8fkyp.js +0 -29
  550. package/dist/chunks/right-panel-cqp8bc4v.js +0 -46
  551. package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
  552. package/dist/chunks/sp-overlay.dev-yztmtrs1.js +0 -18
  553. package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
  554. package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
  555. package/dist/chunks/sp-tooltip.dev-xcvpnqr0.js +0 -15
  556. package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
  557. package/dist/chunks/studio-0a5qrh01.js +0 -3
  558. package/dist/chunks/studio-18j3bmcz.js +0 -14
  559. package/dist/chunks/studio-1hbqnt19.js +0 -1823
  560. package/dist/chunks/studio-4rzyrtjz.js +0 -426
  561. package/dist/chunks/studio-5rywrkxz.js +0 -1903
  562. package/dist/chunks/studio-7afd21nw.js +0 -67
  563. package/dist/chunks/studio-7nte2hj4.js +0 -613
  564. package/dist/chunks/studio-8jpzqk5s.js +0 -128
  565. package/dist/chunks/studio-8q517dfr.js +0 -24
  566. package/dist/chunks/studio-9c4k4vhv.js +0 -357
  567. package/dist/chunks/studio-9n4mrmnb.js +0 -184
  568. package/dist/chunks/studio-a0tswy0w.js +0 -58
  569. package/dist/chunks/studio-ahjfdy6e.js +0 -387
  570. package/dist/chunks/studio-ahnzd9rg.js +0 -23
  571. package/dist/chunks/studio-bw5dz6km.js +0 -608
  572. package/dist/chunks/studio-cb12yz9w.js +0 -15055
  573. package/dist/chunks/studio-d1ks410h.js +0 -175
  574. package/dist/chunks/studio-eqq1w638.js +0 -113
  575. package/dist/chunks/studio-ex8zyp98.js +0 -1813
  576. package/dist/chunks/studio-h4rxscfc.js +0 -10
  577. package/dist/chunks/studio-kyh9avvv.js +0 -28
  578. package/dist/chunks/studio-kyk2v92a.js +0 -659
  579. package/dist/chunks/studio-m3hwn7y1.js +0 -120
  580. package/dist/chunks/studio-mmv72a27.js +0 -4344
  581. package/dist/chunks/studio-n8b9wqwy.js +0 -291
  582. package/dist/chunks/studio-pdfjntbk.js +0 -6939
  583. package/dist/chunks/studio-qq6jym04.js +0 -53
  584. package/dist/chunks/studio-r1r7afxx.js +0 -1066
  585. package/dist/chunks/studio-rdx8jcxy.js +0 -83
  586. package/dist/chunks/studio-rn9ta2mz.js +0 -111
  587. package/dist/chunks/studio-t7qb9db8.js +0 -665
  588. package/dist/chunks/studio-tmc5emrw.js +0 -8
  589. package/dist/chunks/studio-txwkm6p9.js +0 -12
  590. package/dist/chunks/studio-v38hmvx1.js +0 -390
  591. package/dist/chunks/studio-vadzgkrz.js +0 -318
  592. package/dist/chunks/studio-wx5609xd.js +0 -341
  593. package/dist/chunks/studio-z6nw2ek2.js +0 -18
  594. package/dist/chunks/studio-zczps70q.js +0 -378
  595. package/dist/chunks/workspace-xpres40v.js +0 -89
  596. package/src/panels/activity-bar.ts +0 -251
  597. package/src/panels/panel-scheduler.ts +0 -219
  598. package/src/panels/style-inputs.ts +0 -237
  599. package/src/panels/target-line.ts +0 -274
  600. package/src/panels/welcome-screen.ts +0 -346
  601. package/src/ui/button-group.ts +0 -102
  602. package/src/ui/choice-field.ts +0 -72
  603. package/src/ui/field-row.ts +0 -249
  604. package/src/ui/formula-palette.ts +0 -213
  605. package/src/ui/icons.ts +0 -52
  606. package/src/ui/jx-theme.ts +0 -130
  607. package/src/ui/spectrum.ts +0 -340
  608. package/src/ui/value-selector.ts +0 -174
  609. package/src/ui/widgets.ts +0 -172
  610. /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
  611. /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
  612. /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
  613. /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
- computed,
6
- effect,
7
2
  effectScope,
8
- notify,
9
3
  onScopeDispose,
4
+ effect,
10
5
  reactive,
11
- toRaw
12
- } from "./studio-xrapxwwc.js";
6
+ toRaw,
7
+ computed,
8
+ notify2
9
+ } from "./studio-p1dw8wfw.js";
13
10
  import {
14
- applyDocOpToDoc,
15
- childArray,
16
- cloneValue
17
- } from "./studio-5ehhackm.js";
11
+ commitTabBuffers2
12
+ } from "./studio-q3x06vmj.js";
18
13
  import {
19
- childIndex,
20
- getNodeAtPath,
21
- isAncestor,
22
- normalizeArrayChildren,
23
- parentElementPath,
24
- pathsEqual,
25
- projectState
26
- } from "./studio-p4ngc046.js";
14
+ getPlatform2
15
+ } from "./studio-6nzaktvy.js";
16
+ import {
17
+ formatByName2,
18
+ formatForPath2,
19
+ defaultContentFormat2
20
+ } from "./studio-79y5sz51.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-eenfkt4e.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"
@@ -2437,7 +2438,7 @@ function booleanArg(commandId, args, key) {
2437
2438
  function enumArg(commandId, args, key, declared) {
2438
2439
  const value = args[key];
2439
2440
  if (typeof value !== "string" || !declared.includes(value)) {
2440
- throw refuse(commandId, key, `${describe(value)} is not declared — declared: ${declared.join(", ")}`);
2441
+ throw refuse(commandId, key, `${describe(value)} is not declared — declared: ${declared.join(", ") || "none"}`);
2441
2442
  }
2442
2443
  return value;
2443
2444
  }
@@ -2509,14 +2510,222 @@ function pathListProperty(description) {
2509
2510
  function stringProperty(description) {
2510
2511
  return { description, type: "string" };
2511
2512
  }
2513
+ function isPathSegmentTypes(types) {
2514
+ return types.length === 2 && types.includes("string") && types.includes("number");
2515
+ }
2516
+ function typesOf(type) {
2517
+ return Array.isArray(type) ? type : [type];
2518
+ }
2519
+ function describeShape(property) {
2520
+ const p = property;
2521
+ if ("enum" in p) {
2522
+ return "enum";
2523
+ }
2524
+ if ("const" in p) {
2525
+ return "const";
2526
+ }
2527
+ if (Array.isArray(p.oneOf)) {
2528
+ return "one-of";
2529
+ }
2530
+ if (Array.isArray(p.type)) {
2531
+ return "typed";
2532
+ }
2533
+ switch (p.type) {
2534
+ case "boolean": {
2535
+ return "boolean";
2536
+ }
2537
+ case "number":
2538
+ case "integer": {
2539
+ return p.minimum !== undefined && p.maximum !== undefined ? "bounded-number" : "number";
2540
+ }
2541
+ case "string": {
2542
+ return "string";
2543
+ }
2544
+ case "array": {
2545
+ const items = p.items?.type;
2546
+ if (Array.isArray(items)) {
2547
+ return isPathSegmentTypes(items) ? "path" : "pass-through";
2548
+ }
2549
+ return items === "array" ? "path-list" : "pass-through";
2550
+ }
2551
+ case "null":
2552
+ case "object": {
2553
+ return "typed";
2554
+ }
2555
+ default: {
2556
+ break;
2557
+ }
2558
+ }
2559
+ return "pass-through";
2560
+ }
2561
+ function isJsonType(type, value) {
2562
+ switch (type) {
2563
+ case "null": {
2564
+ return value === null;
2565
+ }
2566
+ case "boolean": {
2567
+ return typeof value === "boolean";
2568
+ }
2569
+ case "string": {
2570
+ return typeof value === "string";
2571
+ }
2572
+ case "number": {
2573
+ return typeof value === "number" && Number.isFinite(value);
2574
+ }
2575
+ case "integer": {
2576
+ return typeof value === "number" && Number.isInteger(value);
2577
+ }
2578
+ case "array": {
2579
+ return Array.isArray(value);
2580
+ }
2581
+ case "object": {
2582
+ return typeof value === "object" && value !== null && !Array.isArray(value);
2583
+ }
2584
+ default: {
2585
+ break;
2586
+ }
2587
+ }
2588
+ return false;
2589
+ }
2590
+ function listTypes(types) {
2591
+ if (types.length <= 1) {
2592
+ return types.join("");
2593
+ }
2594
+ return `${types.slice(0, -1).join(", ")} or ${types.at(-1)}`;
2595
+ }
2596
+ function typedArg(commandId, args, key, types) {
2597
+ const value = args[key];
2598
+ if (!types.some((type) => isJsonType(type, value))) {
2599
+ throw refuse(commandId, key, `expected ${listTypes(types)}, got ${describe(value)}`);
2600
+ }
2601
+ return value;
2602
+ }
2603
+ function shapeOf(property) {
2604
+ switch (describeShape(property)) {
2605
+ case "enum": {
2606
+ return `one of ${(property.enum ?? []).map((v) => describe(v)).join(" | ")}`;
2607
+ }
2608
+ case "const": {
2609
+ return `the constant ${describe(property.const)}`;
2610
+ }
2611
+ case "one-of": {
2612
+ return (property.oneOf ?? []).map((branch) => shapeOf(branch)).join(" or ");
2613
+ }
2614
+ case "typed": {
2615
+ return listTypes(typesOf(property.type ?? []));
2616
+ }
2617
+ case "boolean": {
2618
+ return "a boolean";
2619
+ }
2620
+ case "bounded-number": {
2621
+ return `a number from ${property.minimum} to ${property.maximum}`;
2622
+ }
2623
+ case "number": {
2624
+ return "a finite number";
2625
+ }
2626
+ case "string": {
2627
+ return "a non-empty string";
2628
+ }
2629
+ case "path": {
2630
+ return "a document path";
2631
+ }
2632
+ case "path-list": {
2633
+ return "a list of document paths";
2634
+ }
2635
+ default: {
2636
+ return "anything";
2637
+ }
2638
+ }
2639
+ }
2640
+ function oneOfArg(commandId, args, key, branches) {
2641
+ const value = args[key];
2642
+ const refusals = [];
2643
+ for (const branch of branches) {
2644
+ if (branch.type !== undefined && !typesOf(branch.type).some((type) => isJsonType(type, value))) {
2645
+ continue;
2646
+ }
2647
+ try {
2648
+ return coerceProperty(commandId, args, key, branch);
2649
+ } catch (error) {
2650
+ refusals.push(error);
2651
+ }
2652
+ }
2653
+ if (refusals.length === 1) {
2654
+ throw refusals[0];
2655
+ }
2656
+ throw refuse(commandId, key, `expected ${branches.map((branch) => shapeOf(branch)).join(" or ")}, got ${describe(value)}`);
2657
+ }
2658
+ function coerceProperty(commandId, args, key, property) {
2659
+ switch (describeShape(property)) {
2660
+ case "enum": {
2661
+ return enumArg(commandId, args, key, property.enum ?? []);
2662
+ }
2663
+ case "const": {
2664
+ const value = args[key];
2665
+ if (value !== property.const) {
2666
+ throw refuse(commandId, key, `expected the constant ${describe(property.const)}, got ${describe(value)}`);
2667
+ }
2668
+ return value;
2669
+ }
2670
+ case "one-of": {
2671
+ return oneOfArg(commandId, args, key, property.oneOf ?? []);
2672
+ }
2673
+ case "typed": {
2674
+ return typedArg(commandId, args, key, typesOf(property.type ?? []));
2675
+ }
2676
+ case "boolean": {
2677
+ return booleanArg(commandId, args, key);
2678
+ }
2679
+ case "bounded-number": {
2680
+ return boundedNumberArg(commandId, args, key, property.minimum, property.maximum);
2681
+ }
2682
+ case "number": {
2683
+ return numberArg(commandId, args, key);
2684
+ }
2685
+ case "string": {
2686
+ return stringArg(commandId, args, key);
2687
+ }
2688
+ case "path": {
2689
+ return pathArg(commandId, args, key);
2690
+ }
2691
+ case "path-list": {
2692
+ return pathListArg(commandId, args, key);
2693
+ }
2694
+ default: {
2695
+ return args[key];
2696
+ }
2697
+ }
2698
+ }
2699
+ function coerceArgs(commandId, schema, args) {
2700
+ const spec = schema;
2701
+ const properties = spec.properties ?? {};
2702
+ const declared = Object.keys(properties);
2703
+ const required = spec.required ?? [];
2704
+ const coerced = {};
2705
+ for (const [key, value] of Object.entries(args)) {
2706
+ if (value === undefined || Object.hasOwn(properties, key)) {
2707
+ continue;
2708
+ }
2709
+ if (spec.additionalProperties === false) {
2710
+ throw refuse(commandId, key, `not declared — declared: ${declared.join(", ") || "none"}`);
2711
+ }
2712
+ coerced[key] = value;
2713
+ }
2714
+ for (const key of declared) {
2715
+ if (args[key] === undefined && !required.includes(key)) {
2716
+ continue;
2717
+ }
2718
+ coerced[key] = coerceProperty(commandId, args, key, properties[key]);
2719
+ }
2720
+ return coerced;
2721
+ }
2512
2722
 
2513
2723
  // src/workspace/workspace.ts
2514
2724
  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,
2725
+ var PRIMARY_PANE2 = "primary";
2726
+ var SECONDARY_PANE2 = "secondary";
2727
+ var workspace2 = reactive({
2728
+ activePaneId: PRIMARY_PANE2,
2520
2729
  clipboard: null,
2521
2730
  closedTabs: [],
2522
2731
  componentRegistry: [],
@@ -2531,7 +2740,7 @@ var workspace = reactive({
2531
2740
  {
2532
2741
  activeTabId: null,
2533
2742
  derived: null,
2534
- id: PRIMARY_PANE,
2743
+ id: PRIMARY_PANE2,
2535
2744
  tabOrder: []
2536
2745
  }
2537
2746
  ],
@@ -2543,83 +2752,77 @@ var workspace = reactive({
2543
2752
  activityBar: "files"
2544
2753
  },
2545
2754
  get activeTabId() {
2546
- const pane = activePane();
2547
- return pane.derived?.kind === "lens" ? paneById(pane.derived.sourcePaneId)?.activeTabId ?? null : pane.activeTabId;
2755
+ const pane = activePane2();
2756
+ return pane.derived?.kind === "lens" ? paneById2(pane.derived.sourcePaneId)?.activeTabId ?? null : pane.activeTabId;
2548
2757
  },
2549
2758
  get tabOrder() {
2550
- return activePane().tabOrder;
2759
+ return activePane2().tabOrder;
2551
2760
  }
2552
2761
  });
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];
2762
+ var activeTab2 = computed(() => workspace2.activeTabId ? workspace2.tabs.get(workspace2.activeTabId) ?? null : null);
2763
+ function activePane2() {
2764
+ const { panes } = workspace2;
2765
+ return panes.find((pane) => pane.id === workspace2.activePaneId) ?? panes[0];
2557
2766
  }
2558
- function paneById(paneId) {
2559
- return workspace.panes.find((pane) => pane.id === paneId);
2767
+ function paneById2(paneId) {
2768
+ return workspace2.panes.find((pane) => pane.id === paneId);
2560
2769
  }
2561
- function paneOfTab(tabId) {
2562
- return workspace.panes.find((pane) => pane.tabOrder.includes(tabId));
2770
+ function paneOfTab2(tabId) {
2771
+ return workspace2.panes.find((pane) => pane.tabOrder.includes(tabId));
2563
2772
  }
2564
- function focusPane(paneId) {
2565
- const pane = paneById(paneId);
2566
- if (!pane || pane.id === workspace.activePaneId) {
2773
+ function focusPane2(paneId) {
2774
+ const pane = paneById2(paneId);
2775
+ if (!pane || pane.id === workspace2.activePaneId) {
2567
2776
  return;
2568
2777
  }
2569
- workspace.activePaneId = pane.id;
2778
+ workspace2.activePaneId = pane.id;
2570
2779
  resetTabCycle();
2571
2780
  const { activeTabId } = pane;
2572
2781
  if (activeTabId) {
2573
2782
  promoteMru(activeTabId);
2574
- const tab = workspace.tabs.get(activeTabId);
2783
+ const tab = workspace2.tabs.get(activeTabId);
2575
2784
  if (tab) {
2576
2785
  syncTreeSelection(tab);
2577
2786
  }
2578
2787
  }
2579
2788
  }
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
- }
2789
+ function isPaneFocused2(paneId) {
2790
+ return workspace2.activePaneId === paneId;
2588
2791
  }
2589
2792
  function splitRight() {
2590
- const source = activePane();
2793
+ const source = activePane2();
2591
2794
  const tabId = source.activeTabId;
2592
- const tab = tabId ? workspace.tabs.get(tabId) : null;
2795
+ const tab = tabId ? workspace2.tabs.get(tabId) : null;
2593
2796
  if (!tabId || !tab) {
2594
2797
  return null;
2595
2798
  }
2596
- const target = receivingPane();
2597
- detachTab(tabId);
2598
- insertIntoPane(target, tabId);
2799
+ const target = receivingPane2();
2800
+ detachTab2(tabId);
2801
+ insertIntoPane2(target, tabId);
2599
2802
  target.activeTabId = tabId;
2600
- workspace.activePaneId = target.id;
2803
+ workspace2.activePaneId = target.id;
2601
2804
  resetTabCycle();
2602
2805
  promoteMru(tabId);
2603
2806
  return target;
2604
2807
  }
2605
- function sidePane() {
2606
- const source = activePane();
2607
- return workspace.panes.find((pane) => pane.id !== source.id) ?? addPane(SECONDARY_PANE);
2808
+ function sidePane2() {
2809
+ const source = activePane2();
2810
+ return workspace2.panes.find((pane) => pane.id !== source.id) ?? addPane(SECONDARY_PANE2);
2608
2811
  }
2609
- function receivingPane() {
2610
- const target = sidePane();
2812
+ function receivingPane2() {
2813
+ const target = sidePane2();
2611
2814
  if (target.derived) {
2612
2815
  target.derived = null;
2613
2816
  }
2614
2817
  return target;
2615
2818
  }
2616
2819
  function addPane(paneId) {
2617
- const existing = paneById(paneId);
2820
+ const existing = paneById2(paneId);
2618
2821
  if (existing) {
2619
2822
  return existing;
2620
2823
  }
2621
- workspace.panes = [
2622
- ...workspace.panes,
2824
+ workspace2.panes = [
2825
+ ...workspace2.panes,
2623
2826
  {
2624
2827
  activeTabId: null,
2625
2828
  derived: null,
@@ -2627,35 +2830,35 @@ function addPane(paneId) {
2627
2830
  tabOrder: []
2628
2831
  }
2629
2832
  ];
2630
- return paneById(paneId);
2833
+ return paneById2(paneId);
2631
2834
  }
2632
2835
  function closePane(paneId) {
2633
- if (workspace.panes.length < 2) {
2836
+ if (workspace2.panes.length < 2) {
2634
2837
  return;
2635
2838
  }
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);
2839
+ const closingId = paneId === PRIMARY_PANE2 ? workspace2.panes.find((candidate) => candidate.id !== PRIMARY_PANE2)?.id : paneId;
2840
+ const pane = closingId === undefined ? undefined : paneById2(closingId);
2841
+ const survivor = workspace2.panes.find((candidate) => candidate.id !== closingId);
2639
2842
  if (!pane || !survivor) {
2640
2843
  return;
2641
2844
  }
2642
2845
  for (const tabId of pane.tabOrder) {
2643
- insertIntoPane(survivor, tabId);
2846
+ insertIntoPane2(survivor, tabId);
2644
2847
  }
2645
- survivor.activeTabId = workspace.activePaneId === pane.id ? pane.activeTabId ?? survivor.activeTabId : survivor.activeTabId ?? pane.activeTabId;
2646
- workspace.activePaneId = survivor.id;
2848
+ survivor.activeTabId = workspace2.activePaneId === pane.id ? pane.activeTabId ?? survivor.activeTabId : survivor.activeTabId ?? pane.activeTabId;
2849
+ workspace2.activePaneId = survivor.id;
2647
2850
  if (survivor.derived?.sourcePaneId === pane.id) {
2648
2851
  survivor.derived = null;
2649
2852
  }
2650
- workspace.panes = workspace.panes.filter((candidate) => candidate.id !== pane.id);
2853
+ workspace2.panes = workspace2.panes.filter((candidate) => candidate.id !== pane.id);
2651
2854
  resetTabCycle();
2652
2855
  }
2653
2856
  function paneIsEmpty(pane) {
2654
2857
  return pane.tabOrder.length === 0 && pane.derived === null;
2655
2858
  }
2656
- function detachTab(tabId) {
2859
+ function detachTab2(tabId) {
2657
2860
  const emptied = [];
2658
- for (const pane of workspace.panes) {
2861
+ for (const pane of workspace2.panes) {
2659
2862
  if (!pane.tabOrder.includes(tabId)) {
2660
2863
  continue;
2661
2864
  }
@@ -2663,7 +2866,7 @@ function detachTab(tabId) {
2663
2866
  if (pane.activeTabId === tabId) {
2664
2867
  pane.activeTabId = pane.tabOrder.at(-1) ?? null;
2665
2868
  }
2666
- if (pane.id !== PRIMARY_PANE && paneIsEmpty(pane)) {
2869
+ if (pane.id !== PRIMARY_PANE2 && paneIsEmpty(pane)) {
2667
2870
  emptied.push(pane.id);
2668
2871
  }
2669
2872
  }
@@ -2671,7 +2874,7 @@ function detachTab(tabId) {
2671
2874
  closePane(paneId);
2672
2875
  }
2673
2876
  }
2674
- function insertIntoPane(pane, tabId, index) {
2877
+ function insertIntoPane2(pane, tabId, index) {
2675
2878
  if (pane.tabOrder.includes(tabId)) {
2676
2879
  return;
2677
2880
  }
@@ -2681,7 +2884,7 @@ function insertIntoPane(pane, tabId, index) {
2681
2884
  function pinnedCount(pane) {
2682
2885
  let count = 0;
2683
2886
  for (const id of pane.tabOrder) {
2684
- if (workspace.tabs.get(id)?.pinned !== true) {
2887
+ if (workspace2.tabs.get(id)?.pinned !== true) {
2685
2888
  break;
2686
2889
  }
2687
2890
  count += 1;
@@ -2689,25 +2892,25 @@ function pinnedCount(pane) {
2689
2892
  return count;
2690
2893
  }
2691
2894
  function defaultSlot(pane, tabId) {
2692
- return workspace.tabs.get(tabId)?.pinned === true ? pinnedCount(pane) : pane.tabOrder.length;
2895
+ return workspace2.tabs.get(tabId)?.pinned === true ? pinnedCount(pane) : pane.tabOrder.length;
2693
2896
  }
2694
- function setWorkspaceProject(root, config = null) {
2695
- workspace.projectRoot = root;
2696
- workspace.projectConfig = config;
2897
+ function setWorkspaceProject2(root, config = null) {
2898
+ workspace2.projectRoot = root;
2899
+ workspace2.projectConfig = config;
2697
2900
  }
2698
- function isTabActive(tab) {
2699
- const active = activeTab.value;
2901
+ function isTabActive2(tab) {
2902
+ const active = activeTab2.value;
2700
2903
  return tab !== null && active !== null && toRaw(active) === toRaw(tab);
2701
2904
  }
2702
- function tabIsLive(tab) {
2905
+ function tabIsLive2(tab) {
2703
2906
  if (!tab) {
2704
2907
  return false;
2705
2908
  }
2706
- const held = workspace.tabs.get(tab.id);
2909
+ const held = workspace2.tabs.get(tab.id);
2707
2910
  return held !== undefined && toRaw(held) === toRaw(tab);
2708
2911
  }
2709
2912
  function promoteMru(tabId) {
2710
- workspace.mruOrder = [tabId, ...workspace.mruOrder.filter((id) => id !== tabId)];
2913
+ workspace2.mruOrder = [tabId, ...workspace2.mruOrder.filter((id) => id !== tabId)];
2711
2914
  }
2712
2915
  var _cycleList = null;
2713
2916
  var _cycleIndex = 0;
@@ -2721,8 +2924,8 @@ function syncTreeSelection(tab) {
2721
2924
  }
2722
2925
  }
2723
2926
  function setActiveTab(tabId, opts = {}) {
2724
- const tab = workspace.tabs.get(tabId);
2725
- const pane = paneOfTab(tabId);
2927
+ const tab = workspace2.tabs.get(tabId);
2928
+ const pane = paneOfTab2(tabId);
2726
2929
  if (!tab || !pane) {
2727
2930
  return;
2728
2931
  }
@@ -2730,18 +2933,18 @@ function setActiveTab(tabId, opts = {}) {
2730
2933
  if (opts.focus === false) {
2731
2934
  return;
2732
2935
  }
2733
- workspace.activePaneId = pane.id;
2936
+ workspace2.activePaneId = pane.id;
2734
2937
  if (!opts.cycling) {
2735
2938
  resetTabCycle();
2736
2939
  promoteMru(tabId);
2737
2940
  }
2738
2941
  syncTreeSelection(tab);
2739
2942
  }
2740
- function openTab(opts) {
2741
- const previous = workspace.tabs.get(opts.id);
2943
+ function openTab2(opts) {
2944
+ const previous = workspace2.tabs.get(opts.id);
2742
2945
  const preview = opts.preview === true && previous?.pinned !== true;
2743
2946
  const tab = createTab({ ...opts, preview });
2744
- const pane = (opts.paneId === undefined ? undefined : paneById(opts.paneId)) ?? activePane();
2947
+ const pane = (opts.paneId === undefined ? undefined : paneById2(opts.paneId)) ?? activePane2();
2745
2948
  let slot;
2746
2949
  if (previous) {
2747
2950
  tab.pinned = previous.pinned;
@@ -2749,43 +2952,43 @@ function openTab(opts) {
2749
2952
  } else {
2750
2953
  if (preview) {
2751
2954
  const sitting = previewTabIn(pane);
2752
- const sittingTab = sitting ? workspace.tabs.get(sitting) : null;
2955
+ const sittingTab = sitting ? workspace2.tabs.get(sitting) : null;
2753
2956
  if (sittingTab) {
2754
- commitTabBuffers(sittingTab);
2957
+ commitTabBuffers2(sittingTab);
2755
2958
  }
2756
- promoteDirtyPreviewTabs();
2959
+ promoteDirtyPreviewTabs2();
2757
2960
  }
2758
2961
  const replaced = preview ? previewTabIn(pane) : null;
2759
2962
  if (replaced) {
2760
2963
  slot = pane.tabOrder.indexOf(replaced);
2761
- closeTab(replaced);
2964
+ closeTab2(replaced);
2762
2965
  }
2763
- insertIntoPane(pane, tab.id, slot);
2966
+ insertIntoPane2(pane, tab.id, slot);
2764
2967
  }
2765
- workspace.tabs.set(tab.id, tab);
2968
+ workspace2.tabs.set(tab.id, tab);
2766
2969
  setActiveTab(tab.id, { focus: opts.focus !== false });
2767
2970
  ensureCollab(tab);
2768
2971
  return tab;
2769
2972
  }
2770
2973
  function previewTabIn(pane) {
2771
- return pane.tabOrder.find((id) => workspace.tabs.get(id)?.preview === true) ?? null;
2974
+ return pane.tabOrder.find((id) => workspace2.tabs.get(id)?.preview === true) ?? null;
2772
2975
  }
2773
- function promoteTab(tabId) {
2774
- const tab = workspace.tabs.get(tabId);
2976
+ function promoteTab2(tabId) {
2977
+ const tab = workspace2.tabs.get(tabId);
2775
2978
  if (tab?.preview === true) {
2776
2979
  tab.preview = false;
2777
2980
  }
2778
2981
  }
2779
- function promoteDirtyPreviewTabs() {
2780
- for (const [id, tab] of workspace.tabs) {
2982
+ function promoteDirtyPreviewTabs2() {
2983
+ for (const [id, tab] of workspace2.tabs) {
2781
2984
  if (tab.preview && tab.doc.dirty) {
2782
- promoteTab(id);
2985
+ promoteTab2(id);
2783
2986
  }
2784
2987
  }
2785
2988
  }
2786
- function setTabPinned(tabId, pinned) {
2787
- const tab = workspace.tabs.get(tabId);
2788
- const pane = paneOfTab(tabId);
2989
+ function setTabPinned2(tabId, pinned) {
2990
+ const tab = workspace2.tabs.get(tabId);
2991
+ const pane = paneOfTab2(tabId);
2789
2992
  if (!tab || !pane) {
2790
2993
  return;
2791
2994
  }
@@ -2794,34 +2997,34 @@ function setTabPinned(tabId, pinned) {
2794
2997
  tab.preview = false;
2795
2998
  }
2796
2999
  const without = pane.tabOrder.filter((id) => id !== tabId);
2797
- const boundary = without.filter((id) => workspace.tabs.get(id)?.pinned === true).length;
3000
+ const boundary = without.filter((id) => workspace2.tabs.get(id)?.pinned === true).length;
2798
3001
  pane.tabOrder = [...without.slice(0, boundary), tabId, ...without.slice(boundary)];
2799
3002
  }
2800
- function moveTab(tabId, toIndex) {
2801
- const tab = workspace.tabs.get(tabId);
2802
- const pane = paneOfTab(tabId);
3003
+ function moveTab2(tabId, toIndex) {
3004
+ const tab = workspace2.tabs.get(tabId);
3005
+ const pane = paneOfTab2(tabId);
2803
3006
  if (!tab || !pane) {
2804
3007
  return;
2805
3008
  }
2806
3009
  const without = pane.tabOrder.filter((id) => id !== tabId);
2807
- const boundary = without.filter((id) => workspace.tabs.get(id)?.pinned === true).length;
3010
+ const boundary = without.filter((id) => workspace2.tabs.get(id)?.pinned === true).length;
2808
3011
  const lower = tab.pinned ? 0 : boundary;
2809
3012
  const upper = tab.pinned ? boundary : without.length;
2810
3013
  const at = Math.min(Math.max(toIndex, lower), upper);
2811
3014
  pane.tabOrder = [...without.slice(0, at), tabId, ...without.slice(at)];
2812
3015
  }
2813
- function closeTab(tabId) {
2814
- const tab = workspace.tabs.get(tabId);
3016
+ function closeTab2(tabId) {
3017
+ const tab = workspace2.tabs.get(tabId);
2815
3018
  if (!tab) {
2816
3019
  return;
2817
3020
  }
2818
- const pane = paneOfTab(tabId);
3021
+ const pane = paneOfTab2(tabId);
2819
3022
  const wasActive = pane?.activeTabId === tabId;
2820
3023
  rememberClosedTab(tab);
2821
3024
  disposeTab(tab);
2822
- workspace.tabs.delete(tabId);
2823
- detachTab(tabId);
2824
- workspace.mruOrder = workspace.mruOrder.filter((id) => id !== tabId);
3025
+ workspace2.tabs.delete(tabId);
3026
+ detachTab2(tabId);
3027
+ workspace2.mruOrder = workspace2.mruOrder.filter((id) => id !== tabId);
2825
3028
  resetTabCycle();
2826
3029
  if (pane && paneIsEmpty(pane)) {
2827
3030
  closePane(pane.id);
@@ -2829,47 +3032,47 @@ function closeTab(tabId) {
2829
3032
  if (!wasActive) {
2830
3033
  return;
2831
3034
  }
2832
- const survivor = activePane();
2833
- const next = workspace.mruOrder.find((id) => survivor.tabOrder.includes(id)) ?? survivor.tabOrder.at(-1) ?? null;
3035
+ const survivor = activePane2();
3036
+ const next = workspace2.mruOrder.find((id) => survivor.tabOrder.includes(id)) ?? survivor.tabOrder.at(-1) ?? null;
2834
3037
  if (next) {
2835
3038
  setActiveTab(next);
2836
3039
  }
2837
3040
  }
2838
- function closeAllTabs() {
2839
- const tabs = [...workspace.tabs.values()];
2840
- workspace.tabs.clear();
3041
+ function closeAllTabs2() {
3042
+ const tabs = [...workspace2.tabs.values()];
3043
+ workspace2.tabs.clear();
2841
3044
  resetPanes();
2842
- workspace.mruOrder = [];
3045
+ workspace2.mruOrder = [];
2843
3046
  resetTabCycle();
2844
3047
  for (const tab of tabs) {
2845
3048
  disposeTab(tab);
2846
3049
  }
2847
3050
  }
2848
3051
  function resetPanes() {
2849
- workspace.panes = [{ activeTabId: null, derived: null, id: PRIMARY_PANE, tabOrder: [] }];
2850
- workspace.activePaneId = PRIMARY_PANE;
3052
+ workspace2.panes = [{ activeTabId: null, derived: null, id: PRIMARY_PANE2, tabOrder: [] }];
3053
+ workspace2.activePaneId = PRIMARY_PANE2;
2851
3054
  }
2852
3055
  function rememberClosedTab(tab) {
2853
3056
  if (!tab.documentPath) {
2854
3057
  return;
2855
3058
  }
2856
3059
  const path = tab.documentPath;
2857
- workspace.closedTabs = [
3060
+ workspace2.closedTabs = [
2858
3061
  { documentPath: path },
2859
- ...workspace.closedTabs.filter((entry) => entry.documentPath !== path)
3062
+ ...workspace2.closedTabs.filter((entry) => entry.documentPath !== path)
2860
3063
  ].slice(0, CLOSED_TAB_LIMIT);
2861
3064
  }
2862
3065
  function takeClosedTabPath() {
2863
- const [entry] = workspace.closedTabs;
3066
+ const [entry] = workspace2.closedTabs;
2864
3067
  if (!entry) {
2865
3068
  return;
2866
3069
  }
2867
- workspace.closedTabs = workspace.closedTabs.slice(1);
3070
+ workspace2.closedTabs = workspace2.closedTabs.slice(1);
2868
3071
  return entry.documentPath;
2869
3072
  }
2870
3073
  function cycleTab(step) {
2871
3074
  if (!_cycleList) {
2872
- _cycleList = workspace.mruOrder.filter((id2) => workspace.tabs.has(id2));
3075
+ _cycleList = workspace2.mruOrder.filter((id) => workspace2.tabs.has(id));
2873
3076
  _cycleIndex = 0;
2874
3077
  }
2875
3078
  const list = _cycleList;
@@ -2881,21 +3084,14 @@ function cycleTab(step) {
2881
3084
  setActiveTab(id, { cycling: true });
2882
3085
  return id;
2883
3086
  }
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()];
3087
+ function replaceAllTabs2(newTabOpts) {
3088
+ const oldIds = [...workspace2.tabs.keys()];
3089
+ const oldTabs = [...workspace2.tabs.values()];
2894
3090
  const newTab = createTab(newTabOpts);
2895
- workspace.tabs.set(newTab.id, newTab);
3091
+ workspace2.tabs.set(newTab.id, newTab);
2896
3092
  resetPanes();
2897
- workspace.panes[0].tabOrder = [newTab.id];
2898
- workspace.mruOrder = [];
3093
+ workspace2.panes[0].tabOrder = [newTab.id];
3094
+ workspace2.mruOrder = [];
2899
3095
  resetTabCycle();
2900
3096
  setActiveTab(newTab.id);
2901
3097
  ensureCollab(newTab);
@@ -2903,52 +3099,52 @@ function replaceAllTabs(newTabOpts) {
2903
3099
  if (id === newTab.id) {
2904
3100
  continue;
2905
3101
  }
2906
- workspace.tabs.delete(id);
3102
+ workspace2.tabs.delete(id);
2907
3103
  }
2908
3104
  for (const tab of oldTabs) {
2909
3105
  disposeTab(tab);
2910
3106
  }
2911
3107
  return newTab;
2912
3108
  }
2913
- function activateTab(tabId, opts = {}) {
3109
+ function activateTab2(tabId, opts = {}) {
2914
3110
  setActiveTab(tabId, opts);
2915
3111
  }
2916
- function moveTabToPane(tabId, paneId) {
2917
- const pane = paneById(paneId);
2918
- if (!pane || !workspace.tabs.has(tabId)) {
3112
+ function moveTabToPane2(tabId, paneId) {
3113
+ const pane = paneById2(paneId);
3114
+ if (!pane || !workspace2.tabs.has(tabId)) {
2919
3115
  return null;
2920
3116
  }
2921
3117
  if (pane.tabOrder.includes(tabId)) {
2922
3118
  return pane;
2923
3119
  }
2924
- detachTab(tabId);
2925
- insertIntoPane(pane, tabId);
3120
+ detachTab2(tabId);
3121
+ insertIntoPane2(pane, tabId);
2926
3122
  return pane;
2927
3123
  }
2928
- function renameTab(oldId, newId, newDocumentPath) {
2929
- const tab = workspace.tabs.get(oldId);
3124
+ function renameTab2(oldId, newId, newDocumentPath) {
3125
+ const tab = workspace2.tabs.get(oldId);
2930
3126
  if (!tab) {
2931
3127
  return;
2932
3128
  }
2933
3129
  tab.id = newId;
2934
3130
  tab.documentPath = newDocumentPath;
2935
- workspace.tabs.delete(oldId);
2936
- workspace.tabs.set(newId, tab);
2937
- for (const pane of workspace.panes) {
3131
+ workspace2.tabs.delete(oldId);
3132
+ workspace2.tabs.set(newId, tab);
3133
+ for (const pane of workspace2.panes) {
2938
3134
  pane.tabOrder = pane.tabOrder.map((id) => id === oldId ? newId : id);
2939
3135
  if (pane.activeTabId === oldId) {
2940
3136
  pane.activeTabId = newId;
2941
3137
  }
2942
3138
  }
2943
- workspace.mruOrder = workspace.mruOrder.map((id) => id === oldId ? newId : id);
3139
+ workspace2.mruOrder = workspace2.mruOrder.map((id) => id === oldId ? newId : id);
2944
3140
  resetTabCycle();
2945
3141
  rekeyCollab(tab);
2946
3142
  }
2947
- function registerTabCommands(registry, deps) {
3143
+ function registerTabCommands2(registry, deps) {
2948
3144
  registry.registerAll([...tabCommands(deps), ...paneCommands(deps)]);
2949
3145
  }
2950
3146
  function tabCommands(deps) {
2951
- const twoOrMoreTabs = () => workspace.tabs.size > 1;
3147
+ const twoOrMoreTabs = () => workspace2.tabs.size > 1;
2952
3148
  return [
2953
3149
  {
2954
3150
  id: "document.nextTab",
@@ -2988,7 +3184,7 @@ function tabCommands(deps) {
2988
3184
  keybinding: "mod+shift+t",
2989
3185
  menus: ["context/tab", "palette"],
2990
3186
  group: "1_file",
2991
- enablement: () => workspace.closedTabs.length > 0,
3187
+ enablement: () => workspace2.closedTabs.length > 0,
2992
3188
  requires: "a document closed in this session",
2993
3189
  run: async () => {
2994
3190
  const path = takeClosedTabPath();
@@ -3007,10 +3203,10 @@ function tabCommands(deps) {
3007
3203
  when: (ctx) => ctx.document.open,
3008
3204
  requires: "an open document",
3009
3205
  run: () => {
3010
- const id = workspace.activeTabId;
3011
- const tab = id ? workspace.tabs.get(id) : null;
3206
+ const id = workspace2.activeTabId;
3207
+ const tab = id ? workspace2.tabs.get(id) : null;
3012
3208
  if (id && tab) {
3013
- setTabPinned(id, !tab.pinned);
3209
+ setTabPinned2(id, !tab.pinned);
3014
3210
  }
3015
3211
  }
3016
3212
  },
@@ -3027,9 +3223,9 @@ function tabCommands(deps) {
3027
3223
  when: (ctx) => ctx.document.open,
3028
3224
  requires: "an open document",
3029
3225
  run: (_ctx, args) => {
3030
- const id = workspace.activeTabId;
3031
- if (id && workspace.tabs.get(id)) {
3032
- setTabPinned(id, booleanArg("document.setPinned", args, "pinned"));
3226
+ const id = workspace2.activeTabId;
3227
+ if (id && workspace2.tabs.get(id)) {
3228
+ setTabPinned2(id, booleanArg("document.setPinned", args, "pinned"));
3033
3229
  }
3034
3230
  }
3035
3231
  },
@@ -3042,21 +3238,21 @@ function tabCommands(deps) {
3042
3238
  group: "1_file",
3043
3239
  when: (ctx) => ctx.document.open,
3044
3240
  enablement: () => {
3045
- const id = workspace.activeTabId;
3046
- return id !== null && workspace.tabs.get(id)?.preview === true;
3241
+ const id = workspace2.activeTabId;
3242
+ return id !== null && workspace2.tabs.get(id)?.preview === true;
3047
3243
  },
3048
3244
  requires: "a preview document — one opened by a single click",
3049
3245
  run: () => {
3050
- const id = workspace.activeTabId;
3246
+ const id = workspace2.activeTabId;
3051
3247
  if (id) {
3052
- promoteTab(id);
3248
+ promoteTab2(id);
3053
3249
  }
3054
3250
  }
3055
3251
  }
3056
3252
  ];
3057
3253
  }
3058
3254
  function paneCommands(deps) {
3059
- const twoPanes = () => workspace.panes.length > 1;
3255
+ const twoPanes = () => workspace2.panes.length > 1;
3060
3256
  return [
3061
3257
  {
3062
3258
  id: "pane.splitRight",
@@ -3067,7 +3263,7 @@ function paneCommands(deps) {
3067
3263
  menus: ["context/pane", "context/tab", "palette"],
3068
3264
  group: "5_pane",
3069
3265
  when: (ctx) => ctx.document.open,
3070
- enablement: () => workspace.activeTabId !== null,
3266
+ enablement: () => workspace2.activeTabId !== null,
3071
3267
  requires: "an open document",
3072
3268
  undo: "none",
3073
3269
  run: () => {
@@ -3085,21 +3281,17 @@ function paneCommands(deps) {
3085
3281
  menus: ["context/pane", "context/tab", "palette"],
3086
3282
  group: "5_pane",
3087
3283
  when: (ctx) => ctx.document.open,
3088
- enablement: () => workspace.activeTabId !== null,
3284
+ enablement: () => workspace2.activeTabId !== null,
3089
3285
  requires: "an open document",
3090
3286
  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
3287
  run: async (_ctx, args) => {
3096
3288
  const path = stringArg("pane.compareWith", args, "path");
3097
- const here = activePane();
3098
- const held = here.activeTabId ? workspace.tabs.get(here.activeTabId) : null;
3289
+ const here = activePane2();
3290
+ const held = here.activeTabId ? workspace2.tabs.get(here.activeTabId) : null;
3099
3291
  if (held?.documentPath === path) {
3100
3292
  throw new RangeError(`command "pane.compareWith" argument "path": "${path}" is the document this pane is ` + `already showing — name a different one`);
3101
3293
  }
3102
- await deps.openFileInPane(receivingPane().id, path);
3294
+ await deps.openFileInPane(receivingPane2().id, path);
3103
3295
  }
3104
3296
  },
3105
3297
  {
@@ -3114,7 +3306,7 @@ function paneCommands(deps) {
3114
3306
  requires: "a split pane grid",
3115
3307
  undo: "none",
3116
3308
  run: () => {
3117
- focusPane(PRIMARY_PANE);
3309
+ focusPane2(PRIMARY_PANE2);
3118
3310
  }
3119
3311
  },
3120
3312
  {
@@ -3129,7 +3321,7 @@ function paneCommands(deps) {
3129
3321
  requires: "a split pane grid",
3130
3322
  undo: "none",
3131
3323
  run: () => {
3132
- focusPane(SECONDARY_PANE);
3324
+ focusPane2(SECONDARY_PANE2);
3133
3325
  }
3134
3326
  },
3135
3327
  {
@@ -3147,17 +3339,17 @@ function paneCommands(deps) {
3147
3339
  ];
3148
3340
  }
3149
3341
  function runUnsplit() {
3150
- const derived = workspace.panes.find((pane) => pane.derived !== null);
3151
- if (derived?.id === PRIMARY_PANE) {
3342
+ const derived = workspace2.panes.find((pane) => pane.derived !== null);
3343
+ if (derived?.id === PRIMARY_PANE2) {
3152
3344
  derived.derived = null;
3153
3345
  if (!paneIsEmpty(derived)) {
3154
3346
  return;
3155
3347
  }
3156
3348
  }
3157
- closePane(derived?.id ?? SECONDARY_PANE);
3349
+ closePane(derived?.id ?? SECONDARY_PANE2);
3158
3350
  }
3159
3351
 
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 };
3352
+ 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
3353
 
3162
- //# debugId=FC372971F7D8792C64756E2164756E21
3163
- //# sourceMappingURL=studio-2zkz8evn.js.map
3354
+ //# debugId=AC037B153E4B837864756E2164756E21
3355
+ //# sourceMappingURL=studio-az3zd49t.js.map