@jxsuite/studio 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. package/canvas.html +21 -0
  2. package/dist/chunks/Overlay.dev-qfjzkms8.js +23 -0
  3. package/dist/chunks/{Overlay.dev-cszx7yn5.js.map → Overlay.dev-qfjzkms8.js.map} +1 -1
  4. package/dist/chunks/{adapter-z8fkmbmv.js → adapter-qfnesn5v.js} +2 -2
  5. package/dist/chunks/{cf-settings-mmyv436d.js → cf-settings-73sh5z4p.js} +3 -3
  6. package/dist/chunks/{components-799jpvhm.js → components-2bpqp4mq.js} +5 -7
  7. package/dist/chunks/{components-799jpvhm.js.map → components-2bpqp4mq.js.map} +1 -1
  8. package/dist/chunks/content-source-34gnkbnn.js +38 -0
  9. package/dist/chunks/content-source-34gnkbnn.js.map +9 -0
  10. package/dist/chunks/convert-to-repeater-t8kxre5s.js +258 -0
  11. package/dist/chunks/convert-to-repeater-t8kxre5s.js.map +10 -0
  12. package/dist/chunks/extension-sections-6mqydz35.js +301 -0
  13. package/dist/chunks/extension-sections-6mqydz35.js.map +11 -0
  14. package/dist/chunks/files-8kn321h1.js +70 -0
  15. package/dist/chunks/files-8kn321h1.js.map +9 -0
  16. package/dist/chunks/{format-host-8jxwts2p.js → format-host-mkwsmt8d.js} +3 -3
  17. package/dist/chunks/git-panel-tjbr191d.js +51 -0
  18. package/dist/chunks/git-panel-tjbr191d.js.map +9 -0
  19. package/dist/chunks/{index-baeg2x3y.js → index-7pxchcce.js} +4 -3
  20. package/dist/chunks/{index-baeg2x3y.js.map → index-7pxchcce.js.map} +3 -3
  21. package/dist/chunks/{jx-validate-qx8degj7.js → jx-validate-v6qgknrs.js} +3 -3
  22. package/dist/chunks/layers-panel-87pb25km.js +58 -0
  23. package/dist/chunks/layers-panel-87pb25km.js.map +9 -0
  24. package/dist/chunks/{monaco-setup-zjdp9zdw.js → monaco-setup-e0yh25j4.js} +4 -75
  25. package/dist/chunks/{monaco-setup-zjdp9zdw.js.map → monaco-setup-e0yh25j4.js.map} +3 -4
  26. package/dist/chunks/publish-panel-m0fcgdrt.js +21 -0
  27. package/dist/chunks/publish-panel-m0fcgdrt.js.map +9 -0
  28. package/dist/chunks/quick-search-rhs6cbsb.js +53 -0
  29. package/dist/chunks/quick-search-rhs6cbsb.js.map +9 -0
  30. package/dist/chunks/right-panel-zpdxd98t.js +37 -0
  31. package/dist/chunks/right-panel-zpdxd98t.js.map +9 -0
  32. package/dist/chunks/section-registry-zmckaxf4.js +30 -0
  33. package/dist/chunks/section-registry-zmckaxf4.js.map +9 -0
  34. package/dist/chunks/sp-overlay.dev-9ran0sfq.js +18 -0
  35. package/dist/chunks/sp-overlay.dev-9ran0sfq.js.map +9 -0
  36. package/dist/chunks/sp-popover.dev-rebmdncr.js +9 -0
  37. package/dist/chunks/sp-popover.dev-rebmdncr.js.map +9 -0
  38. package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js +15 -0
  39. package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js.map +9 -0
  40. package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js +15 -0
  41. package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js.map +9 -0
  42. package/dist/chunks/{sp-tray.dev-pb2fsd65.js → sp-tray.dev-ey59vfh7.js} +10 -8
  43. package/dist/chunks/{sp-tray.dev-pb2fsd65.js.map → sp-tray.dev-ey59vfh7.js.map} +2 -2
  44. package/dist/chunks/{studio-9qr6fq7p.js → studio-0rqqhrdy.js} +10 -378
  45. package/dist/chunks/{studio-9qr6fq7p.js.map → studio-0rqqhrdy.js.map} +4 -14
  46. package/dist/chunks/{studio-5x6tqqec.js → studio-2sj1jj3v.js} +10 -8
  47. package/dist/chunks/{studio-5x6tqqec.js.map → studio-2sj1jj3v.js.map} +2 -2
  48. package/dist/chunks/{studio-h3fw0wn8.js → studio-3fk1ac9z.js} +6 -4
  49. package/dist/chunks/{studio-h3fw0wn8.js.map → studio-3fk1ac9z.js.map} +2 -2
  50. package/dist/chunks/studio-41exgzhq.js +6690 -0
  51. package/dist/chunks/studio-41exgzhq.js.map +38 -0
  52. package/dist/chunks/{studio-7v2bpweq.js → studio-4mqb9a0j.js} +6 -4
  53. package/dist/chunks/{studio-7v2bpweq.js.map → studio-4mqb9a0j.js.map} +2 -2
  54. package/dist/chunks/studio-50k77cca.js +1787 -0
  55. package/dist/chunks/studio-50k77cca.js.map +18 -0
  56. package/dist/chunks/{studio-56v3zwk6.js → studio-6a0h7sne.js} +10 -8
  57. package/dist/chunks/{studio-56v3zwk6.js.map → studio-6a0h7sne.js.map} +2 -2
  58. package/dist/chunks/studio-6f0am8f2.js +53 -0
  59. package/dist/chunks/studio-6f0am8f2.js.map +10 -0
  60. package/dist/chunks/studio-6nmjc5qk.js +7002 -0
  61. package/dist/chunks/studio-6nmjc5qk.js.map +32 -0
  62. package/dist/chunks/studio-7afd21nw.js +67 -0
  63. package/dist/chunks/studio-7afd21nw.js.map +10 -0
  64. package/dist/chunks/{studio-xze4zrs1.js → studio-7bmdvzne.js} +2 -2
  65. package/dist/chunks/studio-7bmdvzne.js.map +10 -0
  66. package/dist/chunks/studio-8jpzqk5s.js +128 -0
  67. package/dist/chunks/studio-8jpzqk5s.js.map +10 -0
  68. package/dist/chunks/studio-94m77tgk.js +1482 -0
  69. package/dist/chunks/studio-94m77tgk.js.map +13 -0
  70. package/dist/chunks/studio-9je6w5sq.js +1000 -0
  71. package/dist/chunks/studio-9je6w5sq.js.map +16 -0
  72. package/dist/chunks/{studio-w7c6kvk7.js → studio-a7pzveq1.js} +2 -2
  73. package/dist/chunks/{studio-gs6kqdt1.js → studio-adn0z1k3.js} +14 -8
  74. package/dist/chunks/{studio-gs6kqdt1.js.map → studio-adn0z1k3.js.map} +3 -3
  75. package/dist/chunks/{studio-kr88ryr7.js → studio-bsxxx3x2.js} +17 -15
  76. package/dist/chunks/{studio-kr88ryr7.js.map → studio-bsxxx3x2.js.map} +7 -6
  77. package/dist/chunks/studio-bw5dz6km.js +608 -0
  78. package/dist/chunks/studio-bw5dz6km.js.map +21 -0
  79. package/dist/chunks/studio-c6s5getc.js +4232 -0
  80. package/dist/chunks/studio-c6s5getc.js.map +39 -0
  81. package/dist/chunks/studio-cjm7fdjf.js +451 -0
  82. package/dist/chunks/studio-cjm7fdjf.js.map +14 -0
  83. package/dist/chunks/{studio-cx91mnh8.js → studio-ckwz4d3x.js} +53 -53
  84. package/dist/chunks/{studio-cx91mnh8.js.map → studio-ckwz4d3x.js.map} +5 -5
  85. package/dist/chunks/studio-dg7zyt5x.js +28 -0
  86. package/dist/chunks/studio-dg7zyt5x.js.map +10 -0
  87. package/dist/chunks/studio-dzcyvvvz.js +166 -0
  88. package/dist/chunks/studio-dzcyvvvz.js.map +10 -0
  89. package/dist/chunks/{studio-7kqe41sa.js → studio-evkr5d3b.js} +15 -7
  90. package/dist/chunks/{studio-7kqe41sa.js.map → studio-evkr5d3b.js.map} +5 -4
  91. package/dist/chunks/studio-f12h6177.js +411 -0
  92. package/dist/chunks/studio-f12h6177.js.map +13 -0
  93. package/dist/chunks/studio-hbp1s8m9.js +1817 -0
  94. package/dist/chunks/studio-hbp1s8m9.js.map +14 -0
  95. package/dist/chunks/studio-k2sxjph5.js +15295 -0
  96. package/dist/chunks/studio-k2sxjph5.js.map +235 -0
  97. package/dist/chunks/studio-myje51t3.js +385 -0
  98. package/dist/chunks/studio-myje51t3.js.map +12 -0
  99. package/dist/chunks/studio-na6rwzhw.js +353 -0
  100. package/dist/chunks/studio-na6rwzhw.js.map +11 -0
  101. package/dist/chunks/{studio-4k0m4fmp.js → studio-p471gg5n.js} +126 -3
  102. package/dist/chunks/studio-p471gg5n.js.map +14 -0
  103. package/dist/chunks/{studio-9bjwf0d4.js → studio-rgwcpast.js} +5 -46
  104. package/dist/chunks/{studio-9bjwf0d4.js.map → studio-rgwcpast.js.map} +4 -5
  105. package/dist/chunks/{studio-esrewxap.js → studio-s519zc99.js} +3 -3
  106. package/dist/chunks/studio-sas7mt3k.js +75 -0
  107. package/dist/chunks/studio-sas7mt3k.js.map +10 -0
  108. package/dist/chunks/studio-t5wqwzdh.js +74 -0
  109. package/dist/chunks/studio-t5wqwzdh.js.map +10 -0
  110. package/dist/chunks/{studio-9qpspwfn.js → studio-temv5bw4.js} +5 -5
  111. package/dist/chunks/{studio-9qpspwfn.js.map → studio-temv5bw4.js.map} +1 -1
  112. package/dist/chunks/{studio-qkvt37c0.js → studio-tr20m8g8.js} +669 -18
  113. package/dist/chunks/studio-tr20m8g8.js.map +9 -0
  114. package/dist/chunks/{studio-v7jkjqng.js → studio-v96qfnww.js} +5514 -4291
  115. package/dist/chunks/studio-v96qfnww.js.map +54 -0
  116. package/dist/chunks/studio-vcetc91k.js +659 -0
  117. package/dist/chunks/studio-vcetc91k.js.map +10 -0
  118. package/dist/chunks/{studio-jm0z592w.js → studio-vmymjefp.js} +2972 -4937
  119. package/dist/chunks/studio-vmymjefp.js.map +98 -0
  120. package/dist/chunks/{studio-bghqfmea.js → studio-wwseqyw0.js} +2 -2
  121. package/dist/chunks/studio-x9hmy5kr.js +390 -0
  122. package/dist/chunks/studio-x9hmy5kr.js.map +10 -0
  123. package/dist/chunks/studio-xa0ce0n7.js +335 -0
  124. package/dist/chunks/studio-xa0ce0n7.js.map +10 -0
  125. package/dist/chunks/studio-xm3dbxvn.js +378 -0
  126. package/dist/chunks/studio-xm3dbxvn.js.map +19 -0
  127. package/dist/chunks/{studio-nqw433kv.js → studio-xmvbhg31.js} +2 -2
  128. package/dist/chunks/studio-zv37yrfa.js +1054 -0
  129. package/dist/chunks/studio-zv37yrfa.js.map +13 -0
  130. package/dist/chunks/{ws-client-q7hkz3j9.js → ws-client-654ts66j.js} +6 -4
  131. package/dist/chunks/ws-client-654ts66j.js.map +11 -0
  132. package/dist/iframe-entry.js +668 -230
  133. package/dist/studio.js +21080 -32585
  134. package/index.html +35 -4685
  135. package/package.json +17 -15
  136. package/src/about/about-modal.ts +42 -11
  137. package/src/browse/library-commands.ts +240 -0
  138. package/src/browse/library-layouts.ts +369 -0
  139. package/src/browse/library-model.ts +396 -0
  140. package/src/browse/library-pane.ts +1049 -0
  141. package/src/browse/library-preview.ts +252 -0
  142. package/src/browse/library-source.ts +150 -0
  143. package/src/canvas/canvas-helpers.ts +33 -9
  144. package/src/canvas/canvas-live-render.ts +45 -29
  145. package/src/canvas/canvas-patcher.ts +151 -31
  146. package/src/canvas/canvas-perf.ts +46 -7
  147. package/src/canvas/canvas-render.ts +1092 -220
  148. package/src/canvas/canvas-surface.ts +240 -0
  149. package/src/canvas/canvas-utils.ts +1166 -124
  150. package/src/canvas/iframe-drop.ts +2 -1
  151. package/src/canvas/iframe-entry.ts +241 -4
  152. package/src/canvas/iframe-host.ts +1226 -143
  153. package/src/canvas/iframe-inline-edit.ts +31 -0
  154. package/src/canvas/iframe-interaction.ts +76 -16
  155. package/src/canvas/iframe-keys.ts +107 -45
  156. package/src/canvas/iframe-overlay.ts +38 -1
  157. package/src/canvas/iframe-protocol.ts +137 -2
  158. package/src/canvas/iframe-render.ts +70 -2
  159. package/src/canvas/iframe-slash.ts +6 -0
  160. package/src/canvas/path-mapping.ts +56 -6
  161. package/src/canvas/surface-registry.ts +292 -0
  162. package/src/collab/collab-commands.ts +244 -0
  163. package/src/collab/collab-session.ts +198 -32
  164. package/src/collab/collab-state.ts +28 -2
  165. package/src/collab/presence-chips.ts +100 -9
  166. package/src/commands/active-registry.ts +42 -0
  167. package/src/commands/app-commands.ts +176 -0
  168. package/src/commands/budget.ts +158 -0
  169. package/src/commands/command-args.ts +253 -0
  170. package/src/commands/context.ts +387 -0
  171. package/src/commands/defaults.ts +580 -0
  172. package/src/commands/keymap.ts +571 -0
  173. package/src/commands/levels.ts +345 -0
  174. package/src/commands/live-context.ts +193 -0
  175. package/src/commands/reference.ts +227 -0
  176. package/src/commands/registry.ts +293 -0
  177. package/src/component-props.ts +3 -2
  178. package/src/content/draft-state.ts +106 -0
  179. package/src/content/entry-commands.ts +282 -0
  180. package/src/content/entry-editor.ts +327 -0
  181. package/src/content/entry-fields.ts +116 -0
  182. package/src/content/entry-model.ts +175 -0
  183. package/src/editor/canvas-context-menu.ts +17 -11
  184. package/src/editor/canvas-slash-bridge.ts +11 -4
  185. package/src/editor/context-menu.ts +804 -204
  186. package/src/editor/convert-to-component.ts +31 -10
  187. package/src/editor/convert-to-repeater.ts +3 -2
  188. package/src/editor/inline-edit-apply.ts +5 -5
  189. package/src/editor/inline-edit.ts +86 -50
  190. package/src/editor/insert-zone-action.ts +1 -1
  191. package/src/editor/shortcuts.ts +1043 -329
  192. package/src/editor/slash-menu.ts +1 -0
  193. package/src/files/elements.ts +166 -0
  194. package/src/files/file-ops.ts +178 -31
  195. package/src/files/files.ts +898 -268
  196. package/src/files/fs-events.ts +21 -0
  197. package/src/files/media-meta.ts +203 -0
  198. package/src/files/media-paths.ts +141 -0
  199. package/src/files/media-upload.ts +7 -3
  200. package/src/files/media-usage.ts +189 -0
  201. package/src/github/github-auth.ts +235 -33
  202. package/src/github/github-publish.ts +80 -21
  203. package/src/grid/grid-controller.ts +152 -12
  204. package/src/grid/grid-layout.ts +225 -20
  205. package/src/grid/grid-open.ts +120 -0
  206. package/src/grid/grid-panel.ts +554 -39
  207. package/src/grid/grid-source.ts +27 -1
  208. package/src/grid/redirects-grid.ts +599 -0
  209. package/src/grid/redirects.ts +398 -0
  210. package/src/grid/sources/content-source.ts +108 -2
  211. package/src/i18n/i18n-commands.ts +322 -0
  212. package/src/new-project/add-repo-modal.ts +8 -10
  213. package/src/new-project/import-tab.ts +7 -0
  214. package/src/new-project/location-fields.ts +9 -1
  215. package/src/new-project/new-project-modal.ts +221 -245
  216. package/src/packages/jxsuite-update.ts +97 -48
  217. package/src/packages/pull-package-sync.ts +18 -9
  218. package/src/page-params.ts +2 -1
  219. package/src/panels/activity-bar.ts +152 -91
  220. package/src/panels/activity-panel.ts +481 -0
  221. package/src/panels/ai-chat/chat-markdown.ts +8 -3
  222. package/src/panels/ai-chat/chat-view.ts +245 -18
  223. package/src/panels/ai-chat/composer.ts +31 -5
  224. package/src/panels/ai-chat/sessions-view.ts +17 -10
  225. package/src/panels/ai-panel.ts +279 -53
  226. package/src/panels/block-action-bar.ts +1115 -224
  227. package/src/panels/bottom-dock.ts +337 -0
  228. package/src/panels/canvas-dnd-bridge.ts +37 -8
  229. package/src/panels/chat-panel.ts +29 -12
  230. package/src/panels/data-explorer.ts +254 -112
  231. package/src/panels/data-grid.ts +10 -4
  232. package/src/panels/dnd.ts +28 -51
  233. package/src/panels/editors.ts +434 -107
  234. package/src/panels/elements-panel.ts +66 -2
  235. package/src/panels/empty-state.ts +112 -0
  236. package/src/panels/events-panel.ts +596 -82
  237. package/src/panels/formula-workspace.ts +408 -218
  238. package/src/panels/frontmatter-fields.ts +51 -10
  239. package/src/panels/frontmatter-panel.ts +357 -79
  240. package/src/panels/git-panel.ts +375 -164
  241. package/src/panels/head-panel.ts +791 -85
  242. package/src/panels/i18n-panel.ts +592 -0
  243. package/src/panels/imports-panel.ts +95 -85
  244. package/src/panels/jump-bar.ts +584 -0
  245. package/src/panels/layers-panel.ts +1106 -328
  246. package/src/panels/left-panel.ts +109 -204
  247. package/src/panels/navigator-panels.ts +131 -0
  248. package/src/panels/overlays.ts +7 -2
  249. package/src/panels/pane-context.ts +1477 -0
  250. package/src/panels/pane-grid.ts +406 -0
  251. package/src/panels/panel-registry.ts +340 -0
  252. package/src/panels/panel-scheduler.ts +75 -0
  253. package/src/panels/problems-panel.ts +234 -0
  254. package/src/panels/properties-panel.ts +946 -1139
  255. package/src/panels/provenance.ts +258 -0
  256. package/src/panels/quick-search.ts +791 -122
  257. package/src/panels/right-panel.ts +228 -102
  258. package/src/panels/seo-modal.ts +395 -0
  259. package/src/panels/settings-pane.ts +203 -0
  260. package/src/panels/signals-panel.ts +354 -137
  261. package/src/panels/statement-editor.ts +41 -25
  262. package/src/panels/statusbar.ts +342 -106
  263. package/src/panels/style-panel.ts +974 -463
  264. package/src/panels/style-utils.ts +3 -3
  265. package/src/panels/stylebook-doc.ts +4 -2
  266. package/src/panels/stylebook-layers-panel.ts +3 -2
  267. package/src/panels/stylebook-panel.ts +51 -26
  268. package/src/panels/tab-strip.ts +1058 -78
  269. package/src/panels/target-line.ts +274 -0
  270. package/src/panels/toolbar.ts +631 -484
  271. package/src/panels/welcome-screen.ts +301 -198
  272. package/src/platform-errors.ts +26 -3
  273. package/src/platform.ts +96 -2
  274. package/src/platforms/cloud.ts +71 -8
  275. package/src/platforms/devserver.ts +92 -29
  276. package/src/publish/deploy-checklist.ts +383 -0
  277. package/src/publish/pages-service.ts +10 -1
  278. package/src/publish/publish-commands.ts +218 -0
  279. package/src/publish/publish-panel.ts +110 -16
  280. package/src/recent-projects.ts +3 -2
  281. package/src/services/a11y-report.ts +505 -0
  282. package/src/services/ai-models.ts +30 -1
  283. package/src/services/ai-project-tools.ts +29 -10
  284. package/src/services/ai-system-prompt.ts +53 -14
  285. package/src/services/ai-tools.ts +39 -3
  286. package/src/services/ai-writes.ts +154 -0
  287. package/src/services/announce.ts +97 -0
  288. package/src/services/automation.ts +424 -175
  289. package/src/services/cem-export.ts +9 -4
  290. package/src/services/clock.ts +61 -0
  291. package/src/services/document-assistant.ts +36 -8
  292. package/src/services/idle.ts +179 -0
  293. package/src/services/import-client.ts +26 -0
  294. package/src/services/monaco-buffer.ts +627 -0
  295. package/src/services/monaco-lazy.ts +36 -0
  296. package/src/services/notify.ts +271 -0
  297. package/src/services/profile.ts +155 -0
  298. package/src/services/references.ts +0 -0
  299. package/src/services/token-lint.ts +3 -2
  300. package/src/services/tool-executor.ts +53 -7
  301. package/src/services/trusted-types.ts +123 -0
  302. package/src/settings/contexts-section.ts +427 -0
  303. package/src/settings/contributed-section.ts +149 -11
  304. package/src/settings/css-vars-editor.ts +306 -349
  305. package/src/settings/defs-editor.ts +93 -34
  306. package/src/settings/dependencies-editor.ts +7 -7
  307. package/src/settings/extension-sections.ts +37 -5
  308. package/src/settings/general-settings.ts +204 -121
  309. package/src/settings/locales-section.ts +347 -0
  310. package/src/settings/preferences-accounts.ts +140 -0
  311. package/src/settings/preferences-dialog.ts +620 -0
  312. package/src/settings/preferences-keymap.ts +270 -0
  313. package/src/settings/project-sections.ts +260 -0
  314. package/src/settings/section-registry.ts +169 -0
  315. package/src/settings/settings-document.ts +385 -0
  316. package/src/shell.ts +1549 -0
  317. package/src/site-context.ts +45 -20
  318. package/src/state.ts +14 -275
  319. package/src/store.ts +88 -43
  320. package/src/studio.ts +790 -346
  321. package/src/style/live-preview.ts +36 -0
  322. package/src/style/project-styles.ts +349 -0
  323. package/src/style/token-ref.ts +123 -0
  324. package/src/tabs/patch-ops.ts +16 -4
  325. package/src/tabs/project-config.ts +416 -0
  326. package/src/tabs/selection.ts +323 -0
  327. package/src/tabs/tab.ts +182 -47
  328. package/src/tabs/transact.ts +209 -28
  329. package/src/types.ts +68 -13
  330. package/src/ui/ai-credentials-form.ts +39 -35
  331. package/src/ui/ai-managed-connect.ts +7 -1
  332. package/src/ui/dynamic-slot.ts +224 -81
  333. package/src/ui/expression-editor.ts +71 -63
  334. package/src/ui/field-input.ts +4 -6
  335. package/src/ui/field-row.ts +215 -38
  336. package/src/ui/form-controls.ts +194 -7
  337. package/src/ui/layers.ts +492 -69
  338. package/src/ui/media-picker.ts +115 -25
  339. package/src/ui/panel-resize.ts +109 -91
  340. package/src/ui/progress-modal.ts +131 -50
  341. package/src/ui/regions.ts +462 -0
  342. package/src/ui/schema-form.ts +229 -45
  343. package/src/ui/spectrum.ts +24 -8
  344. package/src/ui/timing.ts +49 -0
  345. package/src/ui/value-selector.ts +20 -0
  346. package/src/ui/value-source.ts +348 -0
  347. package/src/ui/virtual-window.ts +400 -0
  348. package/src/utils/edit-display.ts +3 -2
  349. package/src/utils/inherited-style.ts +67 -37
  350. package/src/view.ts +64 -78
  351. package/src/workspace/pane-derive.ts +1258 -0
  352. package/src/workspace/session.ts +317 -0
  353. package/src/workspace/workspace.ts +1345 -23
  354. package/styles/canvas.css +653 -0
  355. package/styles/forced-colors.css +106 -0
  356. package/styles/inspector.css +1454 -0
  357. package/styles/overlays.css +2704 -0
  358. package/styles/panels.css +1701 -0
  359. package/styles/shell.css +1423 -0
  360. package/styles/tokens.css +151 -0
  361. package/dist/chunks/Overlay.dev-cszx7yn5.js +0 -22
  362. package/dist/chunks/extension-sections-qr3drkkw.js +0 -531
  363. package/dist/chunks/extension-sections-qr3drkkw.js.map +0 -12
  364. package/dist/chunks/files-j8a1t06k.js +0 -50
  365. package/dist/chunks/files-j8a1t06k.js.map +0 -9
  366. package/dist/chunks/git-panel-xtq5z81x.js +0 -28
  367. package/dist/chunks/git-panel-xtq5z81x.js.map +0 -9
  368. package/dist/chunks/layers-panel-ancn2wpq.js +0 -26
  369. package/dist/chunks/layers-panel-ancn2wpq.js.map +0 -9
  370. package/dist/chunks/settings-modal-17ttr96g.js +0 -29
  371. package/dist/chunks/settings-modal-17ttr96g.js.map +0 -9
  372. package/dist/chunks/sp-overlay.dev-earn5as8.js +0 -17
  373. package/dist/chunks/sp-overlay.dev-earn5as8.js.map +0 -9
  374. package/dist/chunks/sp-popover.dev-frxtfejn.js +0 -8
  375. package/dist/chunks/sp-popover.dev-frxtfejn.js.map +0 -9
  376. package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js +0 -14
  377. package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js.map +0 -9
  378. package/dist/chunks/sp-tooltip.dev-a9fywesm.js +0 -21
  379. package/dist/chunks/sp-tooltip.dev-a9fywesm.js.map +0 -10
  380. package/dist/chunks/studio-0xgs7xrs.js +0 -429
  381. package/dist/chunks/studio-0xgs7xrs.js.map +0 -13
  382. package/dist/chunks/studio-4d8hzcz5.js +0 -3427
  383. package/dist/chunks/studio-4d8hzcz5.js.map +0 -26
  384. package/dist/chunks/studio-4k0m4fmp.js.map +0 -13
  385. package/dist/chunks/studio-9smfzqhc.js +0 -19
  386. package/dist/chunks/studio-9smfzqhc.js.map +0 -10
  387. package/dist/chunks/studio-jm0z592w.js.map +0 -115
  388. package/dist/chunks/studio-m2t4mdg5.js +0 -1854
  389. package/dist/chunks/studio-m2t4mdg5.js.map +0 -18
  390. package/dist/chunks/studio-n4p11dfy.js +0 -853
  391. package/dist/chunks/studio-n4p11dfy.js.map +0 -12
  392. package/dist/chunks/studio-qkvt37c0.js.map +0 -9
  393. package/dist/chunks/studio-sjh1wt1a.js +0 -3744
  394. package/dist/chunks/studio-sjh1wt1a.js.map +0 -22
  395. package/dist/chunks/studio-v7jkjqng.js.map +0 -46
  396. package/dist/chunks/studio-xq0t7n5t.js +0 -140
  397. package/dist/chunks/studio-xq0t7n5t.js.map +0 -10
  398. package/dist/chunks/studio-xze4zrs1.js.map +0 -10
  399. package/dist/chunks/studio-yfcstdzy.js +0 -399
  400. package/dist/chunks/studio-yfcstdzy.js.map +0 -12
  401. package/dist/chunks/studio-zp7jncs8.js +0 -469
  402. package/dist/chunks/studio-zp7jncs8.js.map +0 -14
  403. package/dist/chunks/ws-client-q7hkz3j9.js.map +0 -11
  404. package/src/browse/browse-modal.ts +0 -69
  405. package/src/browse/browse.ts +0 -904
  406. package/src/canvas/canvas-diff.ts +0 -216
  407. package/src/canvas/nested-site-style.ts +0 -58
  408. package/src/new-project/design-fields.ts +0 -264
  409. package/src/new-project/templates.ts +0 -61
  410. package/src/panels/tab-bar.ts +0 -548
  411. package/src/settings/settings-modal.ts +0 -203
  412. /package/dist/chunks/{adapter-z8fkmbmv.js.map → adapter-qfnesn5v.js.map} +0 -0
  413. /package/dist/chunks/{cf-settings-mmyv436d.js.map → cf-settings-73sh5z4p.js.map} +0 -0
  414. /package/dist/chunks/{format-host-8jxwts2p.js.map → format-host-mkwsmt8d.js.map} +0 -0
  415. /package/dist/chunks/{jx-validate-qx8degj7.js.map → jx-validate-v6qgknrs.js.map} +0 -0
  416. /package/dist/chunks/{studio-w7c6kvk7.js.map → studio-a7pzveq1.js.map} +0 -0
  417. /package/dist/chunks/{studio-esrewxap.js.map → studio-s519zc99.js.map} +0 -0
  418. /package/dist/chunks/{studio-bghqfmea.js.map → studio-wwseqyw0.js.map} +0 -0
  419. /package/dist/chunks/{studio-nqw433kv.js.map → studio-xmvbhg31.js.map} +0 -0
@@ -1,22 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../node_modules/@vue/shared/dist/shared.esm-bundler.js", "../../../node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js", "../../schema/src/guards.ts", "../src/state.ts", "../src/utils/studio-utils.ts", "../src/tabs/patch-ops.ts", "../src/tabs/transact.ts", "../src/collab/collab-state.ts", "../src/collab/collab-session.ts", "../src/tabs/tab.ts", "../src/workspace/workspace.ts", "../src/utils/strip-events.ts", "../src/store.ts"],
4
- "sourcesContent": [
5
- "/**\n* @vue/shared v3.5.40\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\n// @__NO_SIDE_EFFECTS__\nfunction makeMap(str) {\n const map = /* @__PURE__ */ Object.create(null);\n for (const key of str.split(\",\")) map[key] = 1;\n return (val) => val in map;\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter\n(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n const i = arr.indexOf(el);\n if (i > -1) {\n arr.splice(i, 1);\n }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n // the leading comma is intentional so empty string \"\" is also included\n \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n const cache = /* @__PURE__ */ Object.create(null);\n return ((str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n });\n};\nconst camelizeRE = /-\\w/g;\nconst camelize = cacheStringFunction(\n (str) => {\n return str.replace(camelizeRE, (c) => c.slice(1).toUpperCase());\n }\n);\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction((str) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n});\nconst toHandlerKey = cacheStringFunction(\n (str) => {\n const s = str ? `on${capitalize(str)}` : ``;\n return s;\n }\n);\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, ...arg) => {\n for (let i = 0; i < fns.length; i++) {\n fns[i](...arg);\n }\n};\nconst def = (obj, key, value, writable = false) => {\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: false,\n writable,\n value\n });\n};\nconst looseToNumber = (val) => {\n const n = parseFloat(val);\n return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n const n = isString(val) ? Number(val) : NaN;\n return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\nfunction genCacheKey(source, options) {\n return source + JSON.stringify(\n options,\n (_, val) => typeof val === \"function\" ? val.toString() : val\n );\n}\n\nconst PatchFlags = {\n \"TEXT\": 1,\n \"1\": \"TEXT\",\n \"CLASS\": 2,\n \"2\": \"CLASS\",\n \"STYLE\": 4,\n \"4\": \"STYLE\",\n \"PROPS\": 8,\n \"8\": \"PROPS\",\n \"FULL_PROPS\": 16,\n \"16\": \"FULL_PROPS\",\n \"NEED_HYDRATION\": 32,\n \"32\": \"NEED_HYDRATION\",\n \"STABLE_FRAGMENT\": 64,\n \"64\": \"STABLE_FRAGMENT\",\n \"KEYED_FRAGMENT\": 128,\n \"128\": \"KEYED_FRAGMENT\",\n \"UNKEYED_FRAGMENT\": 256,\n \"256\": \"UNKEYED_FRAGMENT\",\n \"NEED_PATCH\": 512,\n \"512\": \"NEED_PATCH\",\n \"DYNAMIC_SLOTS\": 1024,\n \"1024\": \"DYNAMIC_SLOTS\",\n \"DEV_ROOT_FRAGMENT\": 2048,\n \"2048\": \"DEV_ROOT_FRAGMENT\",\n \"CACHED\": -1,\n \"-1\": \"CACHED\",\n \"BAIL\": -2,\n \"-2\": \"BAIL\"\n};\nconst PatchFlagNames = {\n [1]: `TEXT`,\n [2]: `CLASS`,\n [4]: `STYLE`,\n [8]: `PROPS`,\n [16]: `FULL_PROPS`,\n [32]: `NEED_HYDRATION`,\n [64]: `STABLE_FRAGMENT`,\n [128]: `KEYED_FRAGMENT`,\n [256]: `UNKEYED_FRAGMENT`,\n [512]: `NEED_PATCH`,\n [1024]: `DYNAMIC_SLOTS`,\n [2048]: `DEV_ROOT_FRAGMENT`,\n [-1]: `CACHED`,\n [-2]: `BAIL`\n};\n\nconst ShapeFlags = {\n \"ELEMENT\": 1,\n \"1\": \"ELEMENT\",\n \"FUNCTIONAL_COMPONENT\": 2,\n \"2\": \"FUNCTIONAL_COMPONENT\",\n \"STATEFUL_COMPONENT\": 4,\n \"4\": \"STATEFUL_COMPONENT\",\n \"TEXT_CHILDREN\": 8,\n \"8\": \"TEXT_CHILDREN\",\n \"ARRAY_CHILDREN\": 16,\n \"16\": \"ARRAY_CHILDREN\",\n \"SLOTS_CHILDREN\": 32,\n \"32\": \"SLOTS_CHILDREN\",\n \"TELEPORT\": 64,\n \"64\": \"TELEPORT\",\n \"SUSPENSE\": 128,\n \"128\": \"SUSPENSE\",\n \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n \"COMPONENT_KEPT_ALIVE\": 512,\n \"512\": \"COMPONENT_KEPT_ALIVE\",\n \"COMPONENT\": 6,\n \"6\": \"COMPONENT\"\n};\n\nconst SlotFlags = {\n \"STABLE\": 1,\n \"1\": \"STABLE\",\n \"DYNAMIC\": 2,\n \"2\": \"DYNAMIC\",\n \"FORWARDED\": 3,\n \"3\": \"FORWARDED\"\n};\nconst slotFlagsText = {\n [1]: \"STABLE\",\n [2]: \"DYNAMIC\",\n [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_ALLOWED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol\";\nconst isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);\nconst isGloballyWhitelisted = isGloballyAllowed;\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n start = Math.max(0, Math.min(start, source.length));\n end = Math.max(0, Math.min(end, source.length));\n if (start > end) return \"\";\n let lines = source.split(/(\\r?\\n)/);\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n lines = lines.filter((_, idx) => idx % 2 === 0);\n let count = 0;\n const res = [];\n for (let i = 0; i < lines.length; i++) {\n count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n if (count >= start) {\n for (let j = i - range; j <= i + range || end > count; j++) {\n if (j < 0 || j >= lines.length) continue;\n const line = j + 1;\n res.push(\n `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`\n );\n const lineLength = lines[j].length;\n const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n if (j === i) {\n const pad = start - (count - (lineLength + newLineSeqLength));\n const length = Math.max(\n 1,\n end > count ? lineLength - pad : end - start\n );\n res.push(` | ` + \" \".repeat(pad) + \"^\".repeat(length));\n } else if (j > i) {\n if (end > count) {\n const length = Math.max(Math.min(end - count, lineLength), 1);\n res.push(` | ` + \"^\".repeat(length));\n }\n count += lineLength + newLineSeqLength;\n }\n }\n break;\n }\n }\n return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n } else if (isString(value) || isObject(value)) {\n return value;\n }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n const ret = {};\n cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n if (item) {\n const tmp = item.split(propertyDelimiterRE);\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return ret;\n}\nfunction stringifyStyle(styles) {\n if (!styles) return \"\";\n if (isString(styles)) return styles;\n let ret = \"\";\n for (const key in styles) {\n const value = styles[key];\n if (isString(value) || typeof value === \"number\") {\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n ret += `${normalizedKey}:${value};`;\n }\n }\n return ret;\n}\nfunction normalizeClass(value) {\n let res = \"\";\n if (isString(value)) {\n res = value;\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + \" \";\n }\n }\n } else if (isObject(value)) {\n for (const name in value) {\n if (value[name]) {\n res += name + \" \";\n }\n }\n }\n return res.trim();\n}\nfunction normalizeProps(props) {\n if (!props) return null;\n let { class: klass, style } = props;\n if (klass && !isString(klass)) {\n props.class = normalizeClass(klass);\n }\n if (style) {\n props.style = normalizeStyle(style);\n }\n return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst MATH_TAGS = \"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n if (attrValidationCache.hasOwnProperty(name)) {\n return attrValidationCache[name];\n }\n const isUnsafe = unsafeAttrCharRE.test(name);\n if (isUnsafe) {\n console.error(`unsafe attribute name: ${name}`);\n }\n return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n acceptCharset: \"accept-charset\",\n className: \"class\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\nconst isKnownMathMLAttr = /* @__PURE__ */ makeMap(\n `accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,columnspan,denomalign,depth,dir,display,displaystyle,encoding,equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,indentshift,indentshiftfirst,indentshiftlast,indextype,justify,largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,scriptsizemultiplier,selection,separator,separators,shift,side,src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns`\n);\nfunction isRenderableAttrValue(value) {\n if (value == null) {\n return false;\n }\n const type = typeof value;\n return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n const str = \"\" + string;\n const match = escapeRE.exec(str);\n if (!match) {\n return str;\n }\n let html = \"\";\n let escaped;\n let index;\n let lastIndex = 0;\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escaped = \"&quot;\";\n break;\n case 38:\n escaped = \"&amp;\";\n break;\n case 39:\n escaped = \"&#39;\";\n break;\n case 60:\n escaped = \"&lt;\";\n break;\n case 62:\n escaped = \"&gt;\";\n break;\n default:\n continue;\n }\n if (lastIndex !== index) {\n html += str.slice(lastIndex, index);\n }\n lastIndex = index + 1;\n html += escaped;\n }\n return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^(?:-?>)+|<!--|-->|--!>|<!-$/g;\nfunction escapeHtmlComment(src) {\n let prev;\n do {\n prev = src;\n src = src.replace(commentStripRE, \"\");\n } while (src !== prev);\n return src;\n}\nconst cssVarNameEscapeSymbolsRE = /[ !\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~]/g;\nfunction getEscapedCssVarName(key, doubleEscape) {\n return key.replace(\n cssVarNameEscapeSymbolsRE,\n (s) => doubleEscape ? s === '\"' ? '\\\\\\\\\\\\\"' : `\\\\\\\\${s}` : `\\\\${s}`\n );\n}\n\nfunction looseCompareArrays(a, b) {\n if (a.length !== b.length) return false;\n let equal = true;\n for (let i = 0; equal && i < a.length; i++) {\n equal = looseEqual(a[i], b[i]);\n }\n return equal;\n}\nfunction looseEqual(a, b) {\n if (a === b) return true;\n let aValidType = isDate(a);\n let bValidType = isDate(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n }\n aValidType = isSymbol(a);\n bValidType = isSymbol(b);\n if (aValidType || bValidType) {\n return a === b;\n }\n aValidType = isArray(a);\n bValidType = isArray(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n }\n aValidType = isObject(a);\n bValidType = isObject(b);\n if (aValidType || bValidType) {\n if (!aValidType || !bValidType) {\n return false;\n }\n const aKeysCount = Object.keys(a).length;\n const bKeysCount = Object.keys(b).length;\n if (aKeysCount !== bKeysCount) {\n return false;\n }\n for (const key in a) {\n const aHasKey = a.hasOwnProperty(key);\n const bHasKey = b.hasOwnProperty(key);\n if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n return false;\n }\n }\n }\n return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n return arr.findIndex((item) => looseEqual(item, val));\n}\n\nconst isRef = (val) => {\n return !!(val && val[\"__v_isRef\"] === true);\n};\nconst toDisplayString = (val) => {\n return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n if (isRef(val)) {\n return replacer(_key, val.value);\n } else if (isMap(val)) {\n return {\n [`Map(${val.size})`]: [...val.entries()].reduce(\n (entries, [key, val2], i) => {\n entries[stringifySymbol(key, i) + \" =>\"] = val2;\n return entries;\n },\n {}\n )\n };\n } else if (isSet(val)) {\n return {\n [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))\n };\n } else if (isSymbol(val)) {\n return stringifySymbol(val);\n } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n return String(val);\n }\n return val;\n};\nconst stringifySymbol = (v, i = \"\") => {\n var _a;\n return (\n // Symbol.description in es2019+ so we need to cast here to pass\n // the lib: es2016 check\n isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v\n );\n};\n\nfunction normalizeCssVarValue(value) {\n if (value == null) {\n return \"initial\";\n }\n if (typeof value === \"string\") {\n return value === \"\" ? \" \" : value;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n console.warn(\n \"[Vue warn] Invalid value used for CSS binding. Expected a string or a finite number but received:\",\n value\n );\n }\n }\n return String(value);\n}\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, PatchFlags, ShapeFlags, SlotFlags, camelize, capitalize, cssVarNameEscapeSymbolsRE, def, escapeHtml, escapeHtmlComment, extend, genCacheKey, genPropsAccessExp, generateCodeFrame, getEscapedCssVarName, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyAllowed, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownMathMLAttr, isKnownSvgAttr, isMap, isMathMLTag, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isRenderableAttrValue, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeCssVarValue, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n",
6
- "/**\n* @vue/reactivity v3.5.40\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { extend, hasChanged, isArray, isIntegerKey, isSymbol, isMap, hasOwn, isObject, makeMap, capitalize, toRawType, def, isFunction, EMPTY_OBJ, isSet, isPlainObject, remove, NOOP } from '@vue/shared';\n\nfunction warn(msg, ...args) {\n console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n // TODO isolatedDeclarations \"__v_skip\"\n constructor(detached = false) {\n this.detached = detached;\n /**\n * @internal\n */\n this._active = true;\n /**\n * @internal track `on` calls, allow `on` call multiple times\n */\n this._on = 0;\n /**\n * @internal\n */\n this.effects = [];\n /**\n * @internal\n */\n this.cleanups = [];\n this._isPaused = false;\n this._warnOnRun = true;\n this.__v_skip = true;\n if (!detached && activeEffectScope) {\n if (activeEffectScope.active) {\n this.parent = activeEffectScope;\n this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n this\n ) - 1;\n } else {\n this._active = false;\n this._warnOnRun = false;\n }\n }\n }\n get active() {\n return this._active;\n }\n pause() {\n if (this._active) {\n this._isPaused = true;\n let i, l;\n if (this.scopes) {\n const scopes = this.scopes.slice();\n for (i = 0, l = scopes.length; i < l; i++) {\n scopes[i].pause();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].pause();\n }\n }\n }\n /**\n * Resumes the effect scope, including all child scopes and effects.\n */\n resume() {\n if (this._active) {\n if (this._isPaused) {\n this._isPaused = false;\n let i, l;\n if (this.scopes) {\n const scopes = this.scopes.slice();\n for (i = 0, l = scopes.length; i < l; i++) {\n scopes[i].resume();\n }\n }\n const effects = this.effects.slice();\n for (i = 0, l = effects.length; i < l; i++) {\n effects[i].resume();\n }\n }\n }\n }\n run(fn) {\n if (this._active) {\n const currentEffectScope = activeEffectScope;\n try {\n activeEffectScope = this;\n return fn();\n } finally {\n activeEffectScope = currentEffectScope;\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && this._warnOnRun) {\n warn(`cannot run an inactive effect scope.`);\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n on() {\n if (++this._on === 1) {\n this.prevScope = activeEffectScope;\n activeEffectScope = this;\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n off() {\n if (this._on > 0 && --this._on === 0) {\n if (activeEffectScope === this) {\n activeEffectScope = this.prevScope;\n } else {\n let current = activeEffectScope;\n while (current) {\n if (current.prevScope === this) {\n current.prevScope = this.prevScope;\n break;\n }\n current = current.prevScope;\n }\n }\n this.prevScope = void 0;\n }\n }\n stop(fromParent) {\n if (this._active) {\n this._active = false;\n let i, l;\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].stop();\n }\n this.effects.length = 0;\n for (i = 0, l = this.cleanups.length; i < l; i++) {\n this.cleanups[i]();\n }\n this.cleanups.length = 0;\n if (this.scopes) {\n const scopes = this.scopes.slice();\n for (i = 0, l = scopes.length; i < l; i++) {\n scopes[i].stop(true);\n }\n this.scopes.length = 0;\n }\n if (!this.detached && this.parent && !fromParent) {\n const last = this.parent.scopes.pop();\n if (last && last !== this) {\n this.parent.scopes[this.index] = last;\n last.index = this.index;\n }\n }\n this.parent = void 0;\n }\n }\n}\nfunction effectScope(detached) {\n return new EffectScope(detached);\n}\nfunction getCurrentScope() {\n return activeEffectScope;\n}\nfunction onScopeDispose(fn, failSilently = false) {\n if (activeEffectScope) {\n activeEffectScope.cleanups.push(fn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onScopeDispose() is called when there is no active effect scope to be associated with.`\n );\n }\n}\n\nlet activeSub;\nconst EffectFlags = {\n \"ACTIVE\": 1,\n \"1\": \"ACTIVE\",\n \"RUNNING\": 2,\n \"2\": \"RUNNING\",\n \"TRACKING\": 4,\n \"4\": \"TRACKING\",\n \"NOTIFIED\": 8,\n \"8\": \"NOTIFIED\",\n \"DIRTY\": 16,\n \"16\": \"DIRTY\",\n \"ALLOW_RECURSE\": 32,\n \"32\": \"ALLOW_RECURSE\",\n \"PAUSED\": 64,\n \"64\": \"PAUSED\",\n \"EVALUATED\": 128,\n \"128\": \"EVALUATED\"\n};\nconst pausedQueueEffects = /* @__PURE__ */ new WeakSet();\nclass ReactiveEffect {\n constructor(fn) {\n this.fn = fn;\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 1 | 4;\n /**\n * @internal\n */\n this.next = void 0;\n /**\n * @internal\n */\n this.cleanup = void 0;\n this.scheduler = void 0;\n if (activeEffectScope) {\n if (activeEffectScope.active) {\n activeEffectScope.effects.push(this);\n } else {\n this.flags &= -2;\n }\n }\n }\n pause() {\n this.flags |= 64;\n }\n resume() {\n if (this.flags & 64) {\n this.flags &= -65;\n if (pausedQueueEffects.has(this)) {\n pausedQueueEffects.delete(this);\n this.trigger();\n }\n }\n }\n /**\n * @internal\n */\n notify() {\n if (this.flags & 2 && !(this.flags & 32)) {\n return;\n }\n if (!(this.flags & 8)) {\n batch(this);\n }\n }\n run() {\n if (!(this.flags & 1)) {\n return this.fn();\n }\n this.flags |= 2;\n cleanupEffect(this);\n prepareDeps(this);\n const prevEffect = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = this;\n shouldTrack = true;\n try {\n return this.fn();\n } finally {\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub !== this) {\n warn(\n \"Active effect was not restored correctly - this is likely a Vue internal bug.\"\n );\n }\n cleanupDeps(this);\n activeSub = prevEffect;\n shouldTrack = prevShouldTrack;\n this.flags &= -3;\n }\n }\n stop() {\n if (this.flags & 1) {\n for (let link = this.deps; link; link = link.nextDep) {\n removeSub(link);\n }\n this.deps = this.depsTail = void 0;\n cleanupEffect(this);\n this.onStop && this.onStop();\n this.flags &= -2;\n }\n }\n trigger() {\n if (this.flags & 64) {\n pausedQueueEffects.add(this);\n } else if (this.scheduler) {\n this.scheduler();\n } else {\n this.runIfDirty();\n }\n }\n /**\n * @internal\n */\n runIfDirty() {\n if (isDirty(this)) {\n this.run();\n }\n }\n get dirty() {\n return isDirty(this);\n }\n}\nlet batchDepth = 0;\nlet batchedSub;\nlet batchedComputed;\nfunction batch(sub, isComputed = false) {\n sub.flags |= 8;\n if (isComputed) {\n sub.next = batchedComputed;\n batchedComputed = sub;\n return;\n }\n sub.next = batchedSub;\n batchedSub = sub;\n}\nfunction startBatch() {\n batchDepth++;\n}\nfunction endBatch() {\n if (--batchDepth > 0) {\n return;\n }\n if (batchedComputed) {\n let e = batchedComputed;\n batchedComputed = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= -9;\n e = next;\n }\n }\n let error;\n while (batchedSub) {\n let e = batchedSub;\n batchedSub = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= -9;\n if (e.flags & 1) {\n try {\n ;\n e.trigger();\n } catch (err) {\n if (!error) error = err;\n }\n }\n e = next;\n }\n }\n if (error) throw error;\n}\nfunction prepareDeps(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n link.version = -1;\n link.prevActiveLink = link.dep.activeLink;\n link.dep.activeLink = link;\n }\n}\nfunction cleanupDeps(sub) {\n let head;\n let tail = sub.depsTail;\n let link = tail;\n while (link) {\n const prev = link.prevDep;\n if (link.version === -1) {\n if (link === tail) tail = prev;\n removeSub(link);\n removeDep(link);\n } else {\n head = link;\n }\n link.dep.activeLink = link.prevActiveLink;\n link.prevActiveLink = void 0;\n link = prev;\n }\n sub.deps = head;\n sub.depsTail = tail;\n}\nfunction isDirty(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) {\n return true;\n }\n }\n if (sub._dirty) {\n return true;\n }\n return false;\n}\nfunction refreshComputed(computed) {\n if (computed.flags & 4 && !(computed.flags & 16)) {\n return;\n }\n computed.flags &= -17;\n if (computed.globalVersion === globalVersion) {\n return;\n }\n computed.globalVersion = globalVersion;\n if (!computed.isSSR && computed.flags & 128 && (!computed.deps && !computed._dirty || !isDirty(computed))) {\n return;\n }\n computed.flags |= 2;\n const dep = computed.dep;\n const prevSub = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = computed;\n shouldTrack = true;\n try {\n prepareDeps(computed);\n const value = computed.fn(computed._value);\n if (dep.version === 0 || hasChanged(value, computed._value)) {\n computed.flags |= 128;\n computed._value = value;\n dep.version++;\n }\n } catch (err) {\n dep.version++;\n throw err;\n } finally {\n activeSub = prevSub;\n shouldTrack = prevShouldTrack;\n cleanupDeps(computed);\n computed.flags &= -3;\n }\n}\nfunction removeSub(link, soft = false) {\n const { dep, prevSub, nextSub } = link;\n if (prevSub) {\n prevSub.nextSub = nextSub;\n link.prevSub = void 0;\n }\n if (nextSub) {\n nextSub.prevSub = prevSub;\n link.nextSub = void 0;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && dep.subsHead === link) {\n dep.subsHead = nextSub;\n }\n if (dep.subs === link) {\n dep.subs = prevSub;\n if (!prevSub && dep.computed) {\n dep.computed.flags &= -5;\n for (let l = dep.computed.deps; l; l = l.nextDep) {\n removeSub(l, true);\n }\n }\n }\n if (!soft && !--dep.sc && dep.map) {\n dep.map.delete(dep.key);\n }\n}\nfunction removeDep(link) {\n const { prevDep, nextDep } = link;\n if (prevDep) {\n prevDep.nextDep = nextDep;\n link.prevDep = void 0;\n }\n if (nextDep) {\n nextDep.prevDep = prevDep;\n link.nextDep = void 0;\n }\n}\nfunction effect(fn, options) {\n if (fn.effect instanceof ReactiveEffect) {\n fn = fn.effect.fn;\n }\n const e = new ReactiveEffect(fn);\n if (options) {\n extend(e, options);\n }\n try {\n e.run();\n } catch (err) {\n e.stop();\n throw err;\n }\n const runner = e.run.bind(e);\n runner.effect = e;\n return runner;\n}\nfunction stop(runner) {\n runner.effect.stop();\n}\nlet shouldTrack = true;\nconst trackStack = [];\nfunction pauseTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = false;\n}\nfunction enableTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = true;\n}\nfunction resetTracking() {\n const last = trackStack.pop();\n shouldTrack = last === void 0 ? true : last;\n}\nfunction onEffectCleanup(fn, failSilently = false) {\n if (activeSub instanceof ReactiveEffect) {\n activeSub.cleanup = fn;\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onEffectCleanup() was called when there was no active effect to associate with.`\n );\n }\n}\nfunction cleanupEffect(e) {\n const { cleanup } = e;\n e.cleanup = void 0;\n if (cleanup) {\n const prevSub = activeSub;\n activeSub = void 0;\n try {\n cleanup();\n } finally {\n activeSub = prevSub;\n }\n }\n}\n\nlet globalVersion = 0;\nclass Link {\n constructor(sub, dep) {\n this.sub = sub;\n this.dep = dep;\n this.version = dep.version;\n this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0;\n }\n}\nclass Dep {\n // TODO isolatedDeclarations \"__v_skip\"\n constructor(computed) {\n this.computed = computed;\n this.version = 0;\n /**\n * Link between this dep and the current active effect\n */\n this.activeLink = void 0;\n /**\n * Doubly linked list representing the subscribing effects (tail)\n */\n this.subs = void 0;\n /**\n * For object property deps cleanup\n */\n this.map = void 0;\n this.key = void 0;\n /**\n * Subscriber counter\n */\n this.sc = 0;\n /**\n * @internal\n */\n this.__v_skip = true;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.subsHead = void 0;\n }\n }\n track(debugInfo) {\n if (!activeSub || !shouldTrack || activeSub === this.computed) {\n return;\n }\n let link = this.activeLink;\n if (link === void 0 || link.sub !== activeSub) {\n link = this.activeLink = new Link(activeSub, this);\n if (!activeSub.deps) {\n activeSub.deps = activeSub.depsTail = link;\n } else {\n link.prevDep = activeSub.depsTail;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n }\n addSub(link);\n } else if (link.version === -1) {\n link.version = this.version;\n if (link.nextDep) {\n const next = link.nextDep;\n next.prevDep = link.prevDep;\n if (link.prevDep) {\n link.prevDep.nextDep = next;\n }\n link.prevDep = activeSub.depsTail;\n link.nextDep = void 0;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n if (activeSub.deps === link) {\n activeSub.deps = next;\n }\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub.onTrack) {\n activeSub.onTrack(\n extend(\n {\n effect: activeSub\n },\n debugInfo\n )\n );\n }\n return link;\n }\n trigger(debugInfo) {\n this.version++;\n globalVersion++;\n this.notify(debugInfo);\n }\n notify(debugInfo) {\n startBatch();\n try {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n for (let head = this.subsHead; head; head = head.nextSub) {\n if (head.sub.onTrigger && !(head.sub.flags & 8)) {\n head.sub.onTrigger(\n extend(\n {\n effect: head.sub\n },\n debugInfo\n )\n );\n }\n }\n }\n for (let link = this.subs; link; link = link.prevSub) {\n if (link.sub.notify()) {\n ;\n link.sub.dep.notify();\n }\n }\n } finally {\n endBatch();\n }\n }\n}\nfunction addSub(link) {\n link.dep.sc++;\n if (link.sub.flags & 4) {\n const computed = link.dep.computed;\n if (computed && !link.dep.subs) {\n computed.flags |= 4 | 16;\n for (let l = computed.deps; l; l = l.nextDep) {\n addSub(l);\n }\n }\n const currentTail = link.dep.subs;\n if (currentTail !== link) {\n link.prevSub = currentTail;\n if (currentTail) currentTail.nextSub = link;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && link.dep.subsHead === void 0) {\n link.dep.subsHead = link;\n }\n link.dep.subs = link;\n }\n}\nconst targetMap = /* @__PURE__ */ new WeakMap();\nconst ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Object iterate\" : \"\"\n);\nconst MAP_KEY_ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Map keys iterate\" : \"\"\n);\nconst ARRAY_ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Array iterate\" : \"\"\n);\nfunction track(target, type, key) {\n if (shouldTrack && activeSub) {\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n }\n let dep = depsMap.get(key);\n if (!dep) {\n depsMap.set(key, dep = new Dep());\n dep.map = depsMap;\n dep.key = key;\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.track({\n target,\n type,\n key\n });\n } else {\n dep.track();\n }\n }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n globalVersion++;\n return;\n }\n const run = (dep) => {\n if (dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.trigger({\n target,\n type,\n key,\n newValue,\n oldValue,\n oldTarget\n });\n } else {\n dep.trigger();\n }\n }\n };\n startBatch();\n if (type === \"clear\") {\n depsMap.forEach(run);\n } else {\n const targetIsArray = isArray(target);\n const isArrayIndex = targetIsArray && isIntegerKey(key);\n if (targetIsArray && key === \"length\") {\n const newLength = Number(newValue);\n depsMap.forEach((dep, key2) => {\n if (key2 === \"length\" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) {\n run(dep);\n }\n });\n } else {\n if (key !== void 0 || depsMap.has(void 0)) {\n run(depsMap.get(key));\n }\n if (isArrayIndex) {\n run(depsMap.get(ARRAY_ITERATE_KEY));\n }\n switch (type) {\n case \"add\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n } else if (isArrayIndex) {\n run(depsMap.get(\"length\"));\n }\n break;\n case \"delete\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n break;\n case \"set\":\n if (isMap(target)) {\n run(depsMap.get(ITERATE_KEY));\n }\n break;\n }\n }\n }\n endBatch();\n}\nfunction getDepFromReactive(object, key) {\n const depMap = targetMap.get(object);\n return depMap && depMap.get(key);\n}\n\nfunction reactiveReadArray(array) {\n const raw = toRaw(array);\n if (raw === array) return raw;\n track(raw, \"iterate\", ARRAY_ITERATE_KEY);\n return isShallow(array) ? raw : raw.map(toReactive);\n}\nfunction shallowReadArray(arr) {\n track(arr = toRaw(arr), \"iterate\", ARRAY_ITERATE_KEY);\n return arr;\n}\nfunction toWrapped(target, item) {\n if (isReadonly(target)) {\n return isReactive(target) ? toReadonly(toReactive(item)) : toReadonly(item);\n }\n return toReactive(item);\n}\nconst arrayInstrumentations = {\n __proto__: null,\n [Symbol.iterator]() {\n return iterator(this, Symbol.iterator, (item) => toWrapped(this, item));\n },\n concat(...args) {\n return reactiveReadArray(this).concat(\n ...args.map((x) => isArray(x) ? reactiveReadArray(x) : x)\n );\n },\n entries() {\n return iterator(this, \"entries\", (value) => {\n value[1] = toWrapped(this, value[1]);\n return value;\n });\n },\n every(fn, thisArg) {\n return apply(this, \"every\", fn, thisArg, void 0, arguments);\n },\n filter(fn, thisArg) {\n return apply(\n this,\n \"filter\",\n fn,\n thisArg,\n (v) => v.map((item) => toWrapped(this, item)),\n arguments\n );\n },\n find(fn, thisArg) {\n return apply(\n this,\n \"find\",\n fn,\n thisArg,\n (item) => toWrapped(this, item),\n arguments\n );\n },\n findIndex(fn, thisArg) {\n return apply(this, \"findIndex\", fn, thisArg, void 0, arguments);\n },\n findLast(fn, thisArg) {\n return apply(\n this,\n \"findLast\",\n fn,\n thisArg,\n (item) => toWrapped(this, item),\n arguments\n );\n },\n findLastIndex(fn, thisArg) {\n return apply(this, \"findLastIndex\", fn, thisArg, void 0, arguments);\n },\n // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement\n forEach(fn, thisArg) {\n return apply(this, \"forEach\", fn, thisArg, void 0, arguments);\n },\n includes(...args) {\n return searchProxy(this, \"includes\", args);\n },\n indexOf(...args) {\n return searchProxy(this, \"indexOf\", args);\n },\n join(separator) {\n return reactiveReadArray(this).join(separator);\n },\n // keys() iterator only reads `length`, no optimization required\n lastIndexOf(...args) {\n return searchProxy(this, \"lastIndexOf\", args);\n },\n map(fn, thisArg) {\n return apply(this, \"map\", fn, thisArg, void 0, arguments);\n },\n pop() {\n return noTracking(this, \"pop\");\n },\n push(...args) {\n return noTracking(this, \"push\", args);\n },\n reduce(fn, ...args) {\n return reduce(this, \"reduce\", fn, args);\n },\n reduceRight(fn, ...args) {\n return reduce(this, \"reduceRight\", fn, args);\n },\n shift() {\n return noTracking(this, \"shift\");\n },\n // slice could use ARRAY_ITERATE but also seems to beg for range tracking\n some(fn, thisArg) {\n return apply(this, \"some\", fn, thisArg, void 0, arguments);\n },\n splice(...args) {\n return noTracking(this, \"splice\", args);\n },\n toReversed() {\n return reactiveReadArray(this).toReversed();\n },\n toSorted(comparer) {\n return reactiveReadArray(this).toSorted(comparer);\n },\n toSpliced(...args) {\n return reactiveReadArray(this).toSpliced(...args);\n },\n unshift(...args) {\n return noTracking(this, \"unshift\", args);\n },\n values() {\n return iterator(this, \"values\", (item) => toWrapped(this, item));\n }\n};\nfunction iterator(self, method, wrapValue) {\n const arr = shallowReadArray(self);\n const iter = arr[method]();\n if (arr !== self && !isShallow(self)) {\n iter._next = iter.next;\n iter.next = () => {\n const result = iter._next();\n if (!result.done) {\n result.value = wrapValue(result.value);\n }\n return result;\n };\n }\n return iter;\n}\nconst arrayProto = Array.prototype;\nfunction apply(self, method, fn, thisArg, wrappedRetFn, args) {\n const arr = shallowReadArray(self);\n const needsWrap = arr !== self && !isShallow(self);\n const methodFn = arr[method];\n if (methodFn !== arrayProto[method]) {\n const result2 = methodFn.apply(self, args);\n return needsWrap ? toReactive(result2) : result2;\n }\n let wrappedFn = fn;\n if (arr !== self) {\n if (needsWrap) {\n wrappedFn = function(item, index) {\n return fn.call(this, toWrapped(self, item), index, self);\n };\n } else if (fn.length > 2) {\n wrappedFn = function(item, index) {\n return fn.call(this, item, index, self);\n };\n }\n }\n const result = methodFn.call(arr, wrappedFn, thisArg);\n return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;\n}\nfunction reduce(self, method, fn, args) {\n const arr = shallowReadArray(self);\n const needsWrap = arr !== self && !isShallow(self);\n let wrappedFn = fn;\n let wrapInitialAccumulator = false;\n if (arr !== self) {\n if (needsWrap) {\n wrapInitialAccumulator = args.length === 0;\n wrappedFn = function(acc, item, index) {\n if (wrapInitialAccumulator) {\n wrapInitialAccumulator = false;\n acc = toWrapped(self, acc);\n }\n return fn.call(this, acc, toWrapped(self, item), index, self);\n };\n } else if (fn.length > 3) {\n wrappedFn = function(acc, item, index) {\n return fn.call(this, acc, item, index, self);\n };\n }\n }\n const result = arr[method](wrappedFn, ...args);\n return wrapInitialAccumulator ? toWrapped(self, result) : result;\n}\nfunction searchProxy(self, method, args) {\n const arr = toRaw(self);\n track(arr, \"iterate\", ARRAY_ITERATE_KEY);\n const res = arr[method](...args);\n if ((res === -1 || res === false) && isProxy(args[0])) {\n args[0] = toRaw(args[0]);\n return arr[method](...args);\n }\n return res;\n}\nfunction noTracking(self, method, args = []) {\n pauseTracking();\n startBatch();\n const res = toRaw(self)[method].apply(self, args);\n endBatch();\n resetTracking();\n return res;\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nfunction hasOwnProperty(key) {\n if (!isSymbol(key)) key = String(key);\n const obj = toRaw(this);\n track(obj, \"has\", key);\n return obj.hasOwnProperty(key);\n}\nclass BaseReactiveHandler {\n constructor(_isReadonly = false, _isShallow = false) {\n this._isReadonly = _isReadonly;\n this._isShallow = _isShallow;\n }\n get(target, key, receiver) {\n if (key === \"__v_skip\") return target[\"__v_skip\"];\n const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_isShallow\") {\n return isShallow2;\n } else if (key === \"__v_raw\") {\n if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype\n // this means the receiver is a user proxy of the reactive proxy\n Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {\n return target;\n }\n return;\n }\n const targetIsArray = isArray(target);\n if (!isReadonly2) {\n let fn;\n if (targetIsArray && (fn = arrayInstrumentations[key])) {\n return fn;\n }\n if (key === \"hasOwnProperty\") {\n return hasOwnProperty;\n }\n }\n const res = Reflect.get(\n target,\n key,\n // if this is a proxy wrapping a ref, return methods using the raw ref\n // as receiver so that we don't have to call `toRaw` on the ref in all\n // its class methods\n isRef(target) ? target : receiver\n );\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n return res;\n }\n if (!isReadonly2) {\n track(target, \"get\", key);\n }\n if (isShallow2) {\n return res;\n }\n if (isRef(res)) {\n const value = targetIsArray && isIntegerKey(key) ? res : res.value;\n return isReadonly2 && isObject(value) ? readonly(value) : value;\n }\n if (isObject(res)) {\n return isReadonly2 ? readonly(res) : reactive(res);\n }\n return res;\n }\n}\nclass MutableReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(false, isShallow2);\n }\n set(target, key, value, receiver) {\n let oldValue = target[key];\n const isArrayWithIntegerKey = isArray(target) && isIntegerKey(key);\n if (!this._isShallow) {\n const isOldValueReadonly = isReadonly(oldValue);\n if (!isShallow(value) && !isReadonly(value)) {\n oldValue = toRaw(oldValue);\n value = toRaw(value);\n }\n if (!isArrayWithIntegerKey && isRef(oldValue) && !isRef(value)) {\n if (isOldValueReadonly) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target[key]\n );\n }\n return true;\n } else {\n oldValue.value = value;\n return true;\n }\n }\n }\n const hadKey = isArrayWithIntegerKey ? Number(key) < target.length : hasOwn(target, key);\n const result = Reflect.set(\n target,\n key,\n value,\n isRef(target) ? target : receiver\n );\n if (target === toRaw(receiver) && result) {\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n }\n return result;\n }\n deleteProperty(target, key) {\n const hadKey = hasOwn(target, key);\n const oldValue = target[key];\n const result = Reflect.deleteProperty(target, key);\n if (result && hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n }\n has(target, key) {\n const result = Reflect.has(target, key);\n if (!isSymbol(key) || !builtInSymbols.has(key)) {\n track(target, \"has\", key);\n }\n return result;\n }\n ownKeys(target) {\n track(\n target,\n \"iterate\",\n isArray(target) ? \"length\" : ITERATE_KEY\n );\n return Reflect.ownKeys(target);\n }\n}\nclass ReadonlyReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(true, isShallow2);\n }\n set(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n deleteProperty(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n}\nconst mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();\nconst readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();\nconst shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(true);\nconst shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction createIterableMethod(method, isReadonly2, isShallow2) {\n return function(...args) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const targetIsMap = isMap(rawTarget);\n const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n const isKeyOnly = method === \"keys\" && targetIsMap;\n const innerIterator = target[method](...args);\n const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;\n !isReadonly2 && track(\n rawTarget,\n \"iterate\",\n isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n );\n return extend(\n // inheriting all iterator properties\n Object.create(innerIterator),\n {\n // iterator protocol\n next() {\n const { value, done } = innerIterator.next();\n return done ? { value, done } : {\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n done\n };\n }\n }\n );\n };\n}\nfunction createReadonlyMethod(type) {\n return function(...args) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n warn(\n `${capitalize(type)} operation ${key}failed: target is readonly.`,\n toRaw(this)\n );\n }\n return type === \"delete\" ? false : type === \"clear\" ? void 0 : this;\n };\n}\nfunction createInstrumentations(readonly, shallow) {\n const instrumentations = {\n get(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"get\", key);\n }\n track(rawTarget, \"get\", rawKey);\n }\n const { has } = getProto(rawTarget);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n if (has.call(rawTarget, key)) {\n return wrap(target.get(key));\n } else if (has.call(rawTarget, rawKey)) {\n return wrap(target.get(rawKey));\n } else if (target !== rawTarget) {\n target.get(key);\n }\n },\n get size() {\n const target = this[\"__v_raw\"];\n !readonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n return target.size;\n },\n has(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"has\", key);\n }\n track(rawTarget, \"has\", rawKey);\n }\n return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n },\n forEach(callback, thisArg) {\n const observed = this;\n const target = observed[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n !readonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n return target.forEach((value, key) => {\n return callback.call(thisArg, wrap(value), wrap(key), observed);\n });\n }\n };\n extend(\n instrumentations,\n readonly ? {\n add: createReadonlyMethod(\"add\"),\n set: createReadonlyMethod(\"set\"),\n delete: createReadonlyMethod(\"delete\"),\n clear: createReadonlyMethod(\"clear\")\n } : {\n add(value) {\n const target = toRaw(this);\n const proto = getProto(target);\n const rawValue = toRaw(value);\n const valueToAdd = !shallow && !isShallow(value) && !isReadonly(value) ? rawValue : value;\n const hadKey = proto.has.call(target, valueToAdd) || hasChanged(value, valueToAdd) && proto.has.call(target, value) || hasChanged(rawValue, valueToAdd) && proto.has.call(target, rawValue);\n if (!hadKey) {\n target.add(valueToAdd);\n trigger(target, \"add\", valueToAdd, valueToAdd);\n }\n return this;\n },\n set(key, value) {\n if (!shallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get.call(target, key);\n target.set(key, value);\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n return this;\n },\n delete(key) {\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get ? get.call(target, key) : void 0;\n const result = target.delete(key);\n if (hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n },\n clear() {\n const target = toRaw(this);\n const hadItems = target.size !== 0;\n const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n const result = target.clear();\n if (hadItems) {\n trigger(\n target,\n \"clear\",\n void 0,\n void 0,\n oldTarget\n );\n }\n return result;\n }\n }\n );\n const iteratorMethods = [\n \"keys\",\n \"values\",\n \"entries\",\n Symbol.iterator\n ];\n iteratorMethods.forEach((method) => {\n instrumentations[method] = createIterableMethod(method, readonly, shallow);\n });\n return instrumentations;\n}\nfunction createInstrumentationGetter(isReadonly2, shallow) {\n const instrumentations = createInstrumentations(isReadonly2, shallow);\n return (target, key, receiver) => {\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_raw\") {\n return target;\n }\n return Reflect.get(\n hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n key,\n receiver\n );\n };\n}\nconst mutableCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has, key) {\n const rawKey = toRaw(key);\n if (rawKey !== key && has.call(target, rawKey)) {\n const type = toRawType(target);\n warn(\n `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n );\n }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n switch (rawType) {\n case \"Object\":\n case \"Array\":\n return 1 /* COMMON */;\n case \"Map\":\n case \"Set\":\n case \"WeakMap\":\n case \"WeakSet\":\n return 2 /* COLLECTION */;\n default:\n return 0 /* INVALID */;\n }\n}\n// @__NO_SIDE_EFFECTS__\nfunction reactive(target) {\n if (/* @__PURE__ */ isReadonly(target)) {\n return target;\n }\n return createReactiveObject(\n target,\n false,\n mutableHandlers,\n mutableCollectionHandlers,\n reactiveMap\n );\n}\n// @__NO_SIDE_EFFECTS__\nfunction shallowReactive(target) {\n return createReactiveObject(\n target,\n false,\n shallowReactiveHandlers,\n shallowCollectionHandlers,\n shallowReactiveMap\n );\n}\n// @__NO_SIDE_EFFECTS__\nfunction readonly(target) {\n return createReactiveObject(\n target,\n true,\n readonlyHandlers,\n readonlyCollectionHandlers,\n readonlyMap\n );\n}\n// @__NO_SIDE_EFFECTS__\nfunction shallowReadonly(target) {\n return createReactiveObject(\n target,\n true,\n shallowReadonlyHandlers,\n shallowReadonlyCollectionHandlers,\n shallowReadonlyMap\n );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n if (!isObject(target)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `value cannot be made ${isReadonly2 ? \"readonly\" : \"reactive\"}: ${String(\n target\n )}`\n );\n }\n return target;\n }\n if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n return target;\n }\n if (target[\"__v_skip\"] || !Object.isExtensible(target)) {\n return target;\n }\n const existingProxy = proxyMap.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n const targetType = targetTypeMap(toRawType(target));\n if (targetType === 0 /* INVALID */) {\n return target;\n }\n const proxy = new Proxy(\n target,\n targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n );\n proxyMap.set(target, proxy);\n return proxy;\n}\n// @__NO_SIDE_EFFECTS__\nfunction isReactive(value) {\n if (/* @__PURE__ */ isReadonly(value)) {\n return /* @__PURE__ */ isReactive(value[\"__v_raw\"]);\n }\n return !!(value && value[\"__v_isReactive\"]);\n}\n// @__NO_SIDE_EFFECTS__\nfunction isReadonly(value) {\n return !!(value && value[\"__v_isReadonly\"]);\n}\n// @__NO_SIDE_EFFECTS__\nfunction isShallow(value) {\n return !!(value && value[\"__v_isShallow\"]);\n}\n// @__NO_SIDE_EFFECTS__\nfunction isProxy(value) {\n return value ? !!value[\"__v_raw\"] : false;\n}\n// @__NO_SIDE_EFFECTS__\nfunction toRaw(observed) {\n const raw = observed && observed[\"__v_raw\"];\n return raw ? /* @__PURE__ */ toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n if (!hasOwn(value, \"__v_skip\") && Object.isExtensible(value)) {\n def(value, \"__v_skip\", true);\n }\n return value;\n}\nconst toReactive = (value) => isObject(value) ? /* @__PURE__ */ reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? /* @__PURE__ */ readonly(value) : value;\n\n// @__NO_SIDE_EFFECTS__\nfunction isRef(r) {\n return r ? r[\"__v_isRef\"] === true : false;\n}\n// @__NO_SIDE_EFFECTS__\nfunction ref(value) {\n return createRef(value, false);\n}\n// @__NO_SIDE_EFFECTS__\nfunction shallowRef(value) {\n return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n if (/* @__PURE__ */ isRef(rawValue)) {\n return rawValue;\n }\n return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n constructor(value, isShallow2) {\n this.dep = new Dep();\n this[\"__v_isRef\"] = true;\n this[\"__v_isShallow\"] = false;\n this._rawValue = isShallow2 ? value : toRaw(value);\n this._value = isShallow2 ? value : toReactive(value);\n this[\"__v_isShallow\"] = isShallow2;\n }\n get value() {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n });\n } else {\n this.dep.track();\n }\n return this._value;\n }\n set value(newValue) {\n const oldValue = this._rawValue;\n const useDirectValue = this[\"__v_isShallow\"] || isShallow(newValue) || isReadonly(newValue);\n newValue = useDirectValue ? newValue : toRaw(newValue);\n if (hasChanged(newValue, oldValue)) {\n this._rawValue = newValue;\n this._value = useDirectValue ? newValue : toReactive(newValue);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.trigger({\n target: this,\n type: \"set\",\n key: \"value\",\n newValue,\n oldValue\n });\n } else {\n this.dep.trigger();\n }\n }\n }\n}\nfunction triggerRef(ref2) {\n if (ref2.dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n ref2.dep.trigger({\n target: ref2,\n type: \"set\",\n key: \"value\",\n newValue: ref2._value\n });\n } else {\n ref2.dep.trigger();\n }\n }\n}\nfunction unref(ref2) {\n return /* @__PURE__ */ isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n get: (target, key, receiver) => key === \"__v_raw\" ? target : unref(Reflect.get(target, key, receiver)),\n set: (target, key, value, receiver) => {\n const oldValue = target[key];\n if (/* @__PURE__ */ isRef(oldValue) && !/* @__PURE__ */ isRef(value)) {\n oldValue.value = value;\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n }\n};\nfunction proxyRefs(objectWithRefs) {\n return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n constructor(factory) {\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n const dep = this.dep = new Dep();\n const { get, set } = factory(dep.track.bind(dep), dep.trigger.bind(dep));\n this._get = get;\n this._set = set;\n }\n get value() {\n return this._value = this._get();\n }\n set value(newVal) {\n this._set(newVal);\n }\n}\nfunction customRef(factory) {\n return new CustomRefImpl(factory);\n}\n// @__NO_SIDE_EFFECTS__\nfunction toRefs(object) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n warn(`toRefs() expects a reactive object but received a plain one.`);\n }\n const ret = isArray(object) ? new Array(object.length) : {};\n for (const key in object) {\n ret[key] = propertyToRef(object, key);\n }\n return ret;\n}\nclass ObjectRefImpl {\n constructor(_object, key, _defaultValue) {\n this._object = _object;\n this._defaultValue = _defaultValue;\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n this._key = isSymbol(key) ? key : String(key);\n this._raw = toRaw(_object);\n let shallow = true;\n let obj = _object;\n if (!isArray(_object) || isSymbol(this._key) || !isIntegerKey(this._key)) {\n do {\n shallow = !isProxy(obj) || isShallow(obj);\n } while (shallow && (obj = obj[\"__v_raw\"]));\n }\n this._shallow = shallow;\n }\n get value() {\n let val = this._object[this._key];\n if (this._shallow) {\n val = unref(val);\n }\n return this._value = val === void 0 ? this._defaultValue : val;\n }\n set value(newVal) {\n if (this._shallow && /* @__PURE__ */ isRef(this._raw[this._key])) {\n const nestedRef = this._object[this._key];\n if (/* @__PURE__ */ isRef(nestedRef)) {\n nestedRef.value = newVal;\n return;\n }\n }\n this._object[this._key] = newVal;\n }\n get dep() {\n return getDepFromReactive(this._raw, this._key);\n }\n}\nclass GetterRefImpl {\n constructor(_getter) {\n this._getter = _getter;\n this[\"__v_isRef\"] = true;\n this[\"__v_isReadonly\"] = true;\n this._value = void 0;\n }\n get value() {\n return this._value = this._getter();\n }\n}\n// @__NO_SIDE_EFFECTS__\nfunction toRef(source, key, defaultValue) {\n if (/* @__PURE__ */ isRef(source)) {\n return source;\n } else if (isFunction(source)) {\n return new GetterRefImpl(source);\n } else if (isObject(source) && arguments.length > 1) {\n return propertyToRef(source, key, defaultValue);\n } else {\n return /* @__PURE__ */ ref(source);\n }\n}\nfunction propertyToRef(source, key, defaultValue) {\n return new ObjectRefImpl(source, key, defaultValue);\n}\n\nclass ComputedRefImpl {\n constructor(fn, setter, isSSR) {\n this.fn = fn;\n this.setter = setter;\n /**\n * @internal\n */\n this._value = void 0;\n /**\n * @internal\n */\n this.dep = new Dep(this);\n /**\n * @internal\n */\n this.__v_isRef = true;\n // TODO isolatedDeclarations \"__v_isReadonly\"\n // A computed is also a subscriber that tracks other deps\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 16;\n /**\n * @internal\n */\n this.globalVersion = globalVersion - 1;\n /**\n * @internal\n */\n this.next = void 0;\n // for backwards compat\n this.effect = this;\n this[\"__v_isReadonly\"] = !setter;\n this.isSSR = isSSR;\n }\n /**\n * @internal\n */\n notify() {\n this.flags |= 16;\n if (!(this.flags & 8) && // avoid infinite self recursion\n activeSub !== this) {\n batch(this, true);\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\")) ;\n }\n get value() {\n const link = !!(process.env.NODE_ENV !== \"production\") ? this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n }) : this.dep.track();\n refreshComputed(this);\n if (link) {\n link.version = this.dep.version;\n }\n return this._value;\n }\n set value(newValue) {\n if (this.setter) {\n this.setter(newValue);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\"Write operation failed: computed value is readonly\");\n }\n }\n}\n// @__NO_SIDE_EFFECTS__\nfunction computed(getterOrOptions, debugOptions, isSSR = false) {\n let getter;\n let setter;\n if (isFunction(getterOrOptions)) {\n getter = getterOrOptions;\n } else {\n getter = getterOrOptions.get;\n setter = getterOrOptions.set;\n }\n const cRef = new ComputedRefImpl(getter, setter, isSSR);\n if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n cRef.onTrack = debugOptions.onTrack;\n cRef.onTrigger = debugOptions.onTrigger;\n }\n return cRef;\n}\n\nconst TrackOpTypes = {\n \"GET\": \"get\",\n \"HAS\": \"has\",\n \"ITERATE\": \"iterate\"\n};\nconst TriggerOpTypes = {\n \"SET\": \"set\",\n \"ADD\": \"add\",\n \"DELETE\": \"delete\",\n \"CLEAR\": \"clear\"\n};\nconst ReactiveFlags = {\n \"SKIP\": \"__v_skip\",\n \"IS_REACTIVE\": \"__v_isReactive\",\n \"IS_READONLY\": \"__v_isReadonly\",\n \"IS_SHALLOW\": \"__v_isShallow\",\n \"RAW\": \"__v_raw\",\n \"IS_REF\": \"__v_isRef\"\n};\n\nconst WatchErrorCodes = {\n \"WATCH_GETTER\": 2,\n \"2\": \"WATCH_GETTER\",\n \"WATCH_CALLBACK\": 3,\n \"3\": \"WATCH_CALLBACK\",\n \"WATCH_CLEANUP\": 4,\n \"4\": \"WATCH_CLEANUP\"\n};\nconst INITIAL_WATCHER_VALUE = {};\nconst cleanupMap = /* @__PURE__ */ new WeakMap();\nlet activeWatcher = void 0;\nfunction getCurrentWatcher() {\n return activeWatcher;\n}\nfunction onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) {\n if (owner) {\n let cleanups = cleanupMap.get(owner);\n if (!cleanups) cleanupMap.set(owner, cleanups = []);\n cleanups.push(cleanupFn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onWatcherCleanup() was called when there was no active watcher to associate with.`\n );\n }\n}\nfunction watch(source, cb, options = EMPTY_OBJ) {\n const { immediate, deep, once, scheduler, augmentJob, call } = options;\n const warnInvalidSource = (s) => {\n (options.onWarn || warn)(\n `Invalid watch source: `,\n s,\n `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`\n );\n };\n const reactiveGetter = (source2) => {\n if (deep) return source2;\n if (isShallow(source2) || deep === false || deep === 0)\n return traverse(source2, 1);\n return traverse(source2);\n };\n let effect;\n let getter;\n let cleanup;\n let boundCleanup;\n let forceTrigger = false;\n let isMultiSource = false;\n if (isRef(source)) {\n getter = () => source.value;\n forceTrigger = isShallow(source);\n } else if (isReactive(source)) {\n getter = () => reactiveGetter(source);\n forceTrigger = true;\n } else if (isArray(source)) {\n isMultiSource = true;\n forceTrigger = source.some((s) => isReactive(s) || isShallow(s));\n getter = () => source.map((s) => {\n if (isRef(s)) {\n return s.value;\n } else if (isReactive(s)) {\n return reactiveGetter(s);\n } else if (isFunction(s)) {\n return call ? call(s, 2) : s();\n } else {\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(s);\n }\n });\n } else if (isFunction(source)) {\n if (cb) {\n getter = call ? () => call(source, 2) : source;\n } else {\n getter = () => {\n if (cleanup) {\n pauseTracking();\n try {\n cleanup();\n } finally {\n resetTracking();\n }\n }\n const currentEffect = activeWatcher;\n activeWatcher = effect;\n try {\n return call ? call(source, 3, [boundCleanup]) : source(boundCleanup);\n } finally {\n activeWatcher = currentEffect;\n }\n };\n }\n } else {\n getter = NOOP;\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(source);\n }\n if (cb && deep) {\n const baseGetter = getter;\n const depth = deep === true ? Infinity : deep;\n getter = () => traverse(baseGetter(), depth);\n }\n const scope = getCurrentScope();\n const watchHandle = () => {\n effect.stop();\n if (scope && scope.active) {\n remove(scope.effects, effect);\n }\n };\n if (once && cb) {\n const _cb = cb;\n cb = (...args) => {\n const res = _cb(...args);\n watchHandle();\n return res;\n };\n }\n let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;\n const job = (immediateFirstRun) => {\n if (!(effect.flags & 1) || !effect.dirty && !immediateFirstRun) {\n return;\n }\n if (cb) {\n const newValue = effect.run();\n if (immediateFirstRun || deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) {\n if (cleanup) {\n cleanup();\n }\n const currentWatcher = activeWatcher;\n activeWatcher = effect;\n try {\n const args = [\n newValue,\n // pass undefined as the old value when it's changed for the first time\n oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,\n boundCleanup\n ];\n oldValue = newValue;\n call ? call(cb, 3, args) : (\n // @ts-expect-error\n cb(...args)\n );\n } finally {\n activeWatcher = currentWatcher;\n }\n }\n } else {\n effect.run();\n }\n };\n if (augmentJob) {\n augmentJob(job);\n }\n effect = new ReactiveEffect(getter);\n effect.scheduler = scheduler ? () => scheduler(job, false) : job;\n boundCleanup = (fn) => onWatcherCleanup(fn, false, effect);\n cleanup = effect.onStop = () => {\n const cleanups = cleanupMap.get(effect);\n if (cleanups) {\n if (call) {\n call(cleanups, 4);\n } else {\n for (const cleanup2 of cleanups) cleanup2();\n }\n cleanupMap.delete(effect);\n }\n };\n if (!!(process.env.NODE_ENV !== \"production\")) {\n effect.onTrack = options.onTrack;\n effect.onTrigger = options.onTrigger;\n }\n if (cb) {\n if (immediate) {\n job(true);\n } else {\n oldValue = effect.run();\n }\n } else if (scheduler) {\n scheduler(job.bind(null, true), true);\n } else {\n effect.run();\n }\n watchHandle.pause = effect.pause.bind(effect);\n watchHandle.resume = effect.resume.bind(effect);\n watchHandle.stop = watchHandle;\n return watchHandle;\n}\nfunction traverse(value, depth = Infinity, seen) {\n if (depth <= 0 || !isObject(value) || value[\"__v_skip\"]) {\n return value;\n }\n seen = seen || /* @__PURE__ */ new Map();\n if ((seen.get(value) || 0) >= depth) {\n return value;\n }\n seen.set(value, depth);\n depth--;\n if (isRef(value)) {\n traverse(value.value, depth, seen);\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n traverse(value[i], depth, seen);\n }\n } else if (isSet(value) || isMap(value)) {\n value.forEach((v) => {\n traverse(v, depth, seen);\n });\n } else if (isPlainObject(value)) {\n for (const key in value) {\n traverse(value[key], depth, seen);\n }\n for (const key of Object.getOwnPropertySymbols(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, key)) {\n traverse(value[key], depth, seen);\n }\n }\n }\n return value;\n}\n\nexport { ARRAY_ITERATE_KEY, EffectFlags, EffectScope, ITERATE_KEY, MAP_KEY_ITERATE_KEY, ReactiveEffect, ReactiveFlags, TrackOpTypes, TriggerOpTypes, WatchErrorCodes, computed, customRef, effect, effectScope, enableTracking, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onEffectCleanup, onScopeDispose, onWatcherCleanup, pauseTracking, proxyRefs, reactive, reactiveReadArray, readonly, ref, resetTracking, shallowReactive, shallowReadArray, shallowReadonly, shallowRef, stop, toRaw, toReactive, toReadonly, toRef, toRefs, toValue, track, traverse, trigger, triggerRef, unref, watch };\n",
7
- "/**\n * Type predicate guards for the Jx document model.\n *\n * These narrow `unknown`/union-typed values to precise domain types so call sites get real property\n * checking instead of casts. Every guard mirrors the runtime's actual detection logic (see\n * buildScope's five-shape algorithm in the runtime).\n */\n\nimport type {\n JsonObject,\n JsonValue,\n JxClassDef,\n JxElement,\n JxEventBinding,\n JxExpressionDef,\n JxFunctionDef,\n JxMappedArray,\n JxMutableNode,\n JxPrototypeDef,\n JxRef,\n JxServerFnDef,\n JxStatement,\n JxStateObject,\n JxStyle,\n} from \"../types\";\n\n// ─── JSON shape guards ──────────────────────────────────────────────────────────\n\n/** A plain object: not null, not an array. The base check for all object-shaped defs. */\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n// ─── Binding guards ─────────────────────────────────────────────────────────────\n\n/** A `{ $ref: \"#/...\" }` JSON Pointer reference. */\nexport function isRef(value: unknown): value is JxRef {\n return isJsonObject(value) && typeof value.$ref === \"string\";\n}\n\n// ─── State definition guards (the five-shape algorithm) ────────────────────────\n\n/** Shape 4: a function declaration — `{ $prototype: \"Function\", body | $src }`. */\nexport function isFunctionDef(value: unknown): value is JxFunctionDef {\n return isJsonObject(value) && value.$prototype === \"Function\";\n}\n\n/** Shape 5: a declarative expression entry — `{ $expression: { operator, target } }`. */\nexport function isExpressionDef(value: unknown): value is JxExpressionDef {\n return isJsonObject(value) && isJsonObject(value.$expression);\n}\n\n/**\n * Shape 5 with `parameters`: a named formula — a pure, reusable computation invoked via the `call`\n * operator rather than lowered to a computed value.\n */\nexport function isNamedFormulaDef(\n value: unknown,\n): value is JxExpressionDef & { parameters: unknown[] } {\n return isExpressionDef(value) && Array.isArray(value.parameters) && value.parameters.length > 0;\n}\n\n/**\n * Shape 4 with a structured body: a Function entry whose `body` is a statement array (spec §20)\n * rather than opaque JS source.\n */\nexport function hasStructuredBody(\n value: unknown,\n): value is JxFunctionDef & { body: JxStatement[] } {\n return isFunctionDef(value) && Array.isArray(value.body);\n}\n\n/** A non-Function `$prototype` instance (Request, Storage, ContentCollection, classes, …). */\nexport function isPrototypeDef(value: unknown): value is JxPrototypeDef {\n return (\n isJsonObject(value) && typeof value.$prototype === \"string\" && value.$prototype !== \"Function\"\n );\n}\n\n/** A `timing: \"server\"` function proxy (no `$prototype`, external `$src`/`$export`). */\nexport function isServerFnDef(value: unknown): value is JxServerFnDef {\n return (\n isJsonObject(value) &&\n value.timing === \"server\" &&\n typeof value.$src === \"string\" &&\n typeof value.$export === \"string\" &&\n !value.$prototype\n );\n}\n\n/** Shape 2: an expanded signal — an object carrying a `default` value. */\nexport function isExpandedSignal(value: unknown): value is JxStateObject & { default: JsonValue } {\n return isJsonObject(value) && !value.$prototype && !value.$expression && \"default\" in value;\n}\n\n/**\n * Schema-only keywords used to detect pure type definitions (Shape 2b). An object with ONLY these\n * keys and no `default` is a type def, not a signal.\n */\nexport const SCHEMA_KEYWORDS: ReadonlySet<string> = new Set([\n \"type\",\n \"enum\",\n \"minimum\",\n \"maximum\",\n \"minLength\",\n \"maxLength\",\n \"pattern\",\n \"format\",\n \"items\",\n \"properties\",\n \"required\",\n \"description\",\n \"title\",\n \"$comment\",\n]);\n\n/** Shape 2b: a pure type definition — every key is a JSON Schema keyword. */\nexport function isSchemaOnlyDef(value: unknown): value is JxStateObject {\n if (!isJsonObject(value)) {\n return false;\n }\n for (const k of Object.keys(value)) {\n if (!SCHEMA_KEYWORDS.has(k)) {\n return false;\n }\n }\n return true;\n}\n\n/** True when an object carries at least one JSON Schema keyword. */\nexport function hasSchemaKeywords(value: unknown): value is JxStateObject {\n if (!isJsonObject(value)) {\n return false;\n }\n for (const k of Object.keys(value)) {\n if (SCHEMA_KEYWORDS.has(k)) {\n return true;\n }\n }\n return false;\n}\n\n// ─── Document structure guards ──────────────────────────────────────────────────\n\n/** A mapped (repeater) children object — `{ $prototype: \"Array\", items, map }`. */\nexport function isMappedArray(value: unknown): value is JxMappedArray {\n return isJsonObject(value) && value.$prototype === \"Array\";\n}\n\n/**\n * Whether a node's `children` holds at least one mapped array — either as the bare whole-children\n * slot (legacy) or as a member of the children array. Used by renderers and the compiler to decide\n * if a children list needs inline repeater expansion.\n */\nexport function childrenContainArray(children?: unknown): boolean {\n if (isMappedArray(children)) {\n return true;\n }\n return Array.isArray(children) && children.some((c) => isMappedArray(c));\n}\n\n/** A .class.json schema-defined class document — `{ $prototype: \"Class\" }`. */\nexport function isClassDef(value: unknown): value is JxClassDef {\n return isJsonObject(value) && value.$prototype === \"Class\";\n}\n\n/** An element-shaped node object (vs. a bare string/number child). */\nexport function isNodeObject(value: unknown): value is JxMutableNode & JxElement {\n return isJsonObject(value);\n}\n\n/** A `${...}` template-expression string. */\nexport function isTemplateString(value?: unknown): value is string {\n return typeof value === \"string\" && value.includes(\"${\");\n}\n\n/**\n * Whether a function `body` returns a value — the heuristic that classifies a `$prototype:\n * \"Function\"` as a computed value vs an event handler. Uses a word boundary so identifiers like\n * `returned` do not match. Shared by the runtime interpreter and the compiler so both agree on the\n * classification.\n *\n * A bare `return;` does not count. It is an early-exit guard, which is handler code — reading it as\n * a value return turned any handler with a guard clause into a `computed()`, so the binding that\n * invoked it found a value where it expected a function. The value has to follow on the same line,\n * because a newline after `return` is an ASI bare return.\n */\nexport function bodyReturnsValue(body: string): boolean {\n return /\\breturn\\b[^\\S\\n]*(?![;}\\s]|$)/.test(body);\n}\n\n// ─── Style guards & accessors ───────────────────────────────────────────────────\n\n/** A nested style object (selector/media block), as opposed to a scalar CSS value. */\nexport function isNestedStyle(value: string | number | JxStyle | undefined): value is JxStyle {\n return typeof value === \"object\" && value !== null;\n}\n\n/** Read a nested style block (`:hover`, `@--md`, `& > li`, …), if present. */\nexport function getNestedStyle(style: JxStyle | undefined, key: string): JxStyle | undefined {\n const value = style?.[key];\n return isNestedStyle(value) ? value : undefined;\n}\n\n/** Read a nested style block, creating an empty one in place when absent or scalar. */\nexport function ensureNestedStyle(style: JxStyle, key: string): JxStyle {\n const existing = style[key];\n if (isNestedStyle(existing)) {\n return existing;\n }\n const created: JxStyle = {};\n style[key] = created;\n return created;\n}\n\n// ─── Event binding guards ───────────────────────────────────────────────────────\n\n/**\n * The value of an `on*` document key: a `$ref`, an inline function declaration, or a declarative\n * expression.\n */\nexport function isEventBinding(value: unknown): value is JxEventBinding {\n return isRef(value) || isFunctionDef(value) || isExpressionDef(value);\n}\n\n/** Read the event binding stored under an `on*` key of a node, if there is one. */\nexport function getEventBinding(\n node: JxMutableNode | JxElement,\n key: string,\n): JxEventBinding | undefined {\n const value = node[key];\n return isEventBinding(value) ? value : undefined;\n}\n\n// ─── Parameter helpers ──────────────────────────────────────────────────────────\n\n/** Resolve `parameters` entries (bare strings or CEM objects) to their names. */\nexport function paramNames(parameters: JxFunctionDef[\"parameters\"]): string[] {\n if (!parameters) {\n return [];\n }\n return parameters.map((p) => (typeof p === \"string\" ? p : p.name));\n}\n",
8
- "/// <reference lib=\"dom\" />\n/**\n * State.js — Builder state model and mutation API\n *\n * All state changes go through named mutation functions. State is immutable — every mutation\n * produces a new state object. History is a linear stack of { document, selection } snapshots.\n *\n * Path convention: [] = root document ['children', 0] = first child ['children', 0, 'children', 2]\n * = third child of first child\n */\n\nimport type { ProjectState } from \"./types\";\nimport { isRef } from \"@jxsuite/schema/guards\";\nimport type { JxMutableNode } from \"@jxsuite/schema/types\";\n\nexport type JxPath = (string | number)[];\n\ninterface HistorySnapshot {\n document: JxMutableNode;\n selection: JxPath | null;\n}\n\nexport interface StudioState {\n document: JxMutableNode;\n selection: JxPath | null;\n hover: JxPath | null;\n history: HistorySnapshot[];\n historyIndex: number;\n dirty: boolean;\n fileHandle: FileSystemFileHandle | null;\n documentPath: string | null;\n documentStack: StudioStackFrame[];\n handlersSource: string | null;\n mode: string;\n content: { frontmatter: Record<string, unknown> };\n ui: Record<string, unknown>;\n canvas: {\n status: string;\n scope: Record<string, unknown> | null;\n error: string | null;\n };\n}\n\ninterface StudioStackFrame {\n document: JxMutableNode;\n selection: JxPath | null;\n fileHandle: FileSystemFileHandle | null;\n documentPath: string | null;\n dirty: boolean;\n history: HistorySnapshot[];\n historyIndex: number;\n mode: string;\n}\n\n// ─── Path utilities ───────────────────────────────────────────────────────────\n\n/**\n * Walk the document tree and return the node at the given path.\n *\n * @param {JxMutableNode} doc\n * @param {JxPath} path\n * @returns {JxMutableNode}\n */\nexport function getNodeAtPath(doc: JxMutableNode, path: JxPath) {\n let node = doc;\n for (const key of path) {\n if (node == null) {\n return undefined as unknown as JxMutableNode;\n }\n // Paths address nodes by construction; non-node leaves surface as undefined above.\n node = node[key] as JxMutableNode;\n }\n return node;\n}\n\n/**\n * Shallow-clone every node along `path` from root to target, leaving non-path subtrees as shared\n * references. Returns the new root and the mutable target node at the end of the path.\n *\n * Used by mutation functions for structural-sharing history: the old root becomes an immutable\n * snapshot (shared subtrees are never mutated), and the new root is the live document.\n */\nexport function cloneAlongPath(\n doc: JxMutableNode,\n path: JxPath,\n): { root: JxMutableNode; target: JxMutableNode } {\n const root = Array.isArray(doc) ? [...doc] : { ...doc };\n let node: Record<string | number, unknown> = root as Record<string | number, unknown>;\n\n for (const key of path) {\n const child = node[key];\n if (child == null) {\n return { root: root as JxMutableNode, target: node as JxMutableNode };\n }\n const cloned = Array.isArray(child)\n ? [...(child as unknown[])]\n : { ...(child as Record<string, unknown>) };\n node[key] = cloned;\n node = cloned as Record<string | number, unknown>;\n }\n\n return { root: root as JxMutableNode, target: node as JxMutableNode };\n}\n\n/**\n * The node's children when they are a static array (the edit-mode invariant); an empty array for\n * mapped-array or absent children.\n *\n * @param {JxMutableNode | null | undefined} node\n * @returns {(JxMutableNode | string)[]}\n */\nexport function childList(node: JxMutableNode | null | undefined): (JxMutableNode | string)[] {\n return Array.isArray(node?.children) ? node.children : [];\n}\n\n/**\n * Normalize a document in place to the canonical array-member form: a legacy whole-children\n * repeater (`children: { $prototype: \"Array\", … }`) becomes a single member of a children array\n * (`children: [{ $prototype: \"Array\", … }]`). Recurses through children, repeater templates, and\n * `$switch` cases. Runs once when a document is loaded into a tab so every in-studio doc — and its\n * history checkpoints — uses the member form before any mutation.\n *\n * @param {unknown} node\n * @returns {unknown} The same node (mutated)\n */\nexport function normalizeArrayChildren(node: unknown): unknown {\n if (!node || typeof node !== \"object\") {\n return node;\n }\n if (Array.isArray(node)) {\n for (const child of node) {\n normalizeArrayChildren(child);\n }\n return node;\n }\n const n = node as JxMutableNode;\n const { children } = n;\n if (\n children &&\n typeof children === \"object\" &&\n !Array.isArray(children) &&\n (children as JxMutableNode).$prototype === \"Array\"\n ) {\n n.children = [children as JxMutableNode];\n }\n if (Array.isArray(n.children)) {\n for (const child of n.children) {\n normalizeArrayChildren(child);\n }\n }\n if (n.$prototype === \"Array\" && n.map && typeof n.map === \"object\") {\n normalizeArrayChildren(n.map);\n }\n if (n.cases && typeof n.cases === \"object\") {\n for (const caseDef of Object.values(n.cases)) {\n normalizeArrayChildren(caseDef);\n }\n }\n return node;\n}\n\n/**\n * Return the path to the parent element (strips trailing 'children' + index).\n *\n * @param {JxPath} path\n * @returns {JxPath | null}\n */\nexport function parentElementPath(path: JxPath) {\n return path.length >= 2 ? path.slice(0, -2) : null;\n}\n\n/**\n * Return the child index (last segment of the path).\n *\n * @param {JxPath} path\n * @returns {string | number}\n */\nexport function childIndex(path: JxPath) {\n return path.at(-1);\n}\n\n/**\n * Serialize a path to a string key for Map lookups.\n *\n * @param {JxPath} path\n * @returns {string}\n */\nexport function pathKey(path: JxPath) {\n return path.join(\"/\");\n}\n\n/**\n * Compare two paths for equality.\n *\n * @param {JxPath | null} a\n * @param {JxPath | null} b\n * @returns {boolean}\n */\nexport function pathsEqual(a: JxPath | null, b: JxPath | null) {\n if (a === b) {\n return true;\n }\n if (!a || !b || a.length !== b.length) {\n return false;\n }\n return a.every((v, i) => v === b[i]);\n}\n\n/**\n * Returns true if `path` is an ancestor of (or equal to) `descendant`.\n *\n * @param {JxPath} path\n * @param {JxPath} descendant\n * @returns {boolean}\n */\nexport function isAncestor(path: JxPath, descendant: JxPath) {\n if (path.length > descendant.length) {\n return false;\n }\n return path.every((v, i) => v === descendant[i]);\n}\n\n// ─── Tree flattening (for layer panel) ────────────────────────────────────────\n\n/**\n * Flatten a Jx document into an array of { node, path, depth, nodeType } rows. Walks static\n * children arrays, $map templates, and $switch cases.\n *\n * NodeType: 'element' (default) | 'map' | 'case' | 'case-ref'\n *\n * @param {JxMutableNode | string | number | boolean} doc\n * @param {JxPath} [path]\n * @param {number} [depth]\n * @returns {{\n * node: JxMutableNode | string | number | boolean;\n * path: JxPath;\n * depth: number;\n * nodeType: string;\n * }[]}\n */\nexport interface FlatRow {\n node: JxMutableNode | string | number | boolean;\n path: JxPath;\n depth: number;\n nodeType: string;\n}\n\nexport function flattenTree(\n doc: JxMutableNode | string | number | boolean,\n path: JxPath = [],\n depth = 0,\n): FlatRow[] {\n const rows: FlatRow[] = [];\n collectRows(doc, path, depth, rows, false);\n return rows;\n}\n\n/**\n * Pre-order walk that appends into `out`.\n *\n * Appending beats returning-and-spreading: `rows.push(...flattenTree(child))` copied every\n * descendant row once per ancestor level (O(n·depth) copies) and passed the whole subtree as\n * argument list, which throws `RangeError: too many arguments` on a large enough tree.\n *\n * `skipSelf` omits the node's own row and emits only its descendants — the `$switch` case branch\n * needs that, having already emitted a `case` row with its own nodeType.\n */\nfunction collectRows(\n doc: JxMutableNode | string | number | boolean,\n path: JxPath,\n depth: number,\n out: FlatRow[],\n skipSelf: boolean,\n): void {\n // Text node children: bare primitives get a \"text\" row\n if (typeof doc === \"string\" || typeof doc === \"number\" || typeof doc === \"boolean\") {\n if (!skipSelf) {\n out.push({ depth, node: doc, nodeType: \"text\", path });\n }\n return;\n }\n\n // Array pseudo-element (repeater): a first-class node at its own path. Emit the \"map\" row, then\n // Recurse into its single template at `[...path, \"map\"]`. This is reached both when the array is\n // A member of a children array (path `[…, \"children\", i]`) and the legacy whole-children form\n // (path `[…, \"children\"]`).\n if ((doc as JxMutableNode).$prototype === \"Array\") {\n if (!skipSelf) {\n out.push({ depth, node: doc, nodeType: \"map\", path });\n }\n const mapDef = (doc as JxMutableNode).map;\n if (mapDef && typeof mapDef === \"object\") {\n collectRows(mapDef as JxMutableNode, [...path, \"map\"], depth + 1, out, false);\n }\n return;\n }\n\n if (!skipSelf) {\n out.push({ depth, node: doc, nodeType: \"element\", path });\n }\n\n // Custom component instances without user-authored children are atomic in the layer tree\n if (doc.$props && (doc.tagName || \"\").includes(\"-\") && !Array.isArray(doc.children)) {\n return;\n }\n\n const { children } = doc;\n\n if (Array.isArray(children)) {\n for (let i = 0; i < children.length; i++) {\n const childPath = [...path, \"children\", i];\n collectRows(children[i]!, childPath, depth + 1, out, false);\n }\n } else if (\n children &&\n typeof children === \"object\" &&\n (children as JxMutableNode).$prototype === \"Array\"\n ) {\n // Legacy whole-children repeater: the array occupies the children slot itself.\n collectRows(children as JxMutableNode, [...path, \"children\"], depth + 1, out, false);\n }\n\n // $switch — emit each case as a virtual child\n if (doc.$switch && doc.cases && typeof doc.cases === \"object\") {\n for (const [caseName, caseDef] of Object.entries(doc.cases)) {\n const casePath = [...path, \"cases\", caseName];\n if (caseDef && typeof caseDef === \"object\" && (caseDef as JxMutableNode).$ref) {\n out.push({\n depth: depth + 1,\n node: caseDef as JxMutableNode,\n nodeType: \"case-ref\",\n path: casePath,\n });\n } else if (caseDef && typeof caseDef === \"object\") {\n out.push({\n depth: depth + 1,\n node: caseDef as JxMutableNode,\n nodeType: \"case\",\n path: casePath,\n });\n // Recurse into case children — skipSelf, because the \"case\" row above already stands in for\n // The case node itself (with its own nodeType).\n collectRows(caseDef as JxMutableNode, casePath, depth + 2, out, true);\n }\n }\n }\n}\n\n/**\n * Get a display label for a node (for layers + overlays).\n *\n * @param {JxMutableNode | null} node\n * @returns {string}\n */\nexport function nodeLabel(node: JxMutableNode | null) {\n if (!node) {\n return \"?\";\n }\n // $map container (Repeater)\n if (node.$prototype === \"Array\") {\n const { items } = node;\n const ref = (isRef(items) ? items.$ref : undefined) || \"items\";\n return `Repeater → ${ref}`;\n }\n if (node.$title) {\n return node.$title;\n }\n if (node.$id) {\n return node.$id;\n }\n if (node.tagName === \"slot\") {\n const name = node.attributes?.name;\n return typeof name === \"string\" && name.trim() ? `slot: ${name.trim()}` : \"slot\";\n }\n const tag = node.tagName ?? \"div\";\n const suffix = node.$switch ? \" ⇆\" : \"\";\n if (typeof node.textContent === \"string\" && node.textContent.length > 0) {\n return `${tag} — ${node.textContent.slice(0, 24)}${suffix}`;\n }\n return tag + suffix;\n}\n\n// ─── State factory ────────────────────────────────────────────────────────────\n\n/**\n * @param {JxMutableNode} doc\n * @returns {StudioState}\n */\nexport function createState(doc: JxMutableNode): StudioState {\n const initial = { document: doc, selection: null };\n return {\n canvas: {\n error: null, // Error message on failure\n scope: null, // $defs scope from runtime buildScope\n status: \"idle\", // \"idle\" | \"loading\" | \"ready\" | \"error\"\n },\n content: { frontmatter: {} }, // Frontmatter metadata for .md files\n dirty: false,\n document: doc,\n documentPath: null, // Root-relative path, e.g. \"examples/markdown/blog.json\"\n documentStack: [], // Frames for component navigation\n fileHandle: null,\n handlersSource: null,\n history: [initial],\n historyIndex: 0,\n hover: null,\n mode: \"component\", // 'component' | 'content'\n selection: null,\n ui: {\n activeMedia: null, // '--md' | null (base) — focused canvas/breakpoint\n activeSelector: null, // ':hover' | '.child' | null (base) — nested selector context\n editingFunction: null, // Null | { type: 'def', defName } | { type: 'event', path, eventKey }\n featureToggles: {}, // { '--dark': true } — non-size media toggles\n gitBranches: null, // { current, branches: [] }\n gitCommitMessage: \"\", // Commit message input\n gitDiffState: null,\n gitError: null, // Error message string\n gitLoading: false, // Loading indicator during async ops\n gitStatus: null, // { branch, ahead, behind, files: [] }\n inspectorSections: {}, // { identity: true, ... } — properties panel section open/closed state\n pendingInlineEdit: null, // Null | { path, mediaName } — deferred inline edit awaiting canvas readiness\n rightTab: \"properties\", // 'properties' | 'events' | 'style'\n settingsTab: \"stylebook\", // \"stylebook\" | \"definitions\" | \"contentTypes\"\n styleFilter: \"\", // Free-text filter for CSS property names\n styleFilterActive: false, // True = show only props with values set\n styleSections: {}, // { layout: true, ... } — section open/closed state\n styleShorthands: {}, // { padding: true, ... } — shorthand expand/collapse state\n stylebookCustomizedOnly: false, // Show only customized elements\n stylebookFilter: \"\", // Search filter text\n stylebookSelection: null, // Tag name string, e.g. \"h1\"\n stylebookTab: \"elements\", // \"elements\" | \"variables\"\n zoom: 1,\n },\n };\n}\n\n// ─── Doc/Session slice helpers ───────────────────────────────────────────────\n\n/**\n * Compose a flat StudioState from separate doc and session slices.\n *\n * @param {Partial<StudioState>} doc\n * @param {Partial<StudioState>} session\n * @returns {StudioState}\n */\nexport function toFlat(doc: Partial<StudioState>, session: Partial<StudioState>) {\n return { ...doc, ...session } as StudioState;\n}\n\n/**\n * Decompose a flat StudioState into doc and session slices.\n *\n * @param {StudioState} S\n * @returns {{ doc: Partial<StudioState>; session: Partial<StudioState> }}\n */\nexport function fromFlat(S: StudioState) {\n const {\n document,\n dirty,\n fileHandle,\n documentPath,\n documentStack,\n handlersSource,\n mode,\n content,\n history,\n historyIndex,\n selection,\n hover,\n ui,\n canvas,\n } = S;\n return {\n doc: {\n content,\n dirty,\n document,\n documentPath,\n documentStack,\n fileHandle,\n handlersSource,\n history,\n historyIndex,\n mode,\n },\n session: { canvas, hover, selection, ui },\n };\n}\n\n// ─── Project state (persists across document switches) ────────────────────────\n//\n// Shape: { root, name, projectRoot, isSiteProject, projectConfig,\n// Dirs: Map<string, DirEntry[]>, expanded: Set<string>,\n// SelectedPath: string|null, searchQuery: string }\n// DirEntry: { name, path, type: \"file\"|\"directory\", size, modified }\n\nexport let projectState: ProjectState | null = null;\n\n/** @param {ProjectState | null} ps */\nexport function setProjectState(ps: ProjectState | null) {\n projectState = ps;\n}\n\n/**\n * Return the current project state, asserting it is non-null. Only call when a project is known to\n * be loaded.\n *\n * @returns {ProjectState}\n */\nexport function requireProjectState() {\n return projectState as ProjectState;\n}\n\n// ─── Frontmatter mutation ───────────────────────────────────────────────────\n\n/**\n * Update a frontmatter field. Does not use applyMutation because frontmatter lives in S.content,\n * not S.document.\n *\n * @param {StudioState} state\n * @param {string} field\n * @param {unknown} value\n * @returns {StudioState}\n */\nexport function updateFrontmatter(state: StudioState, field: string, value: unknown) {\n const fm = { ...state.content?.frontmatter };\n if (value === undefined || value === null || value === \"\") {\n delete fm[field];\n } else {\n fm[field] = value;\n }\n return {\n ...state,\n content: { ...state.content, frontmatter: fm },\n dirty: true,\n };\n}\n\n// ─── Selection / hover ────────────────────────────────────────────────────────\n\n/**\n * @param {StudioState} state\n * @param {JxPath | null} path\n * @returns {StudioState}\n */\nexport function selectNode(state: StudioState, path: JxPath | null) {\n return { ...state, selection: path };\n}\n\n/**\n * @param {StudioState} state\n * @param {JxPath | null} path\n * @returns {StudioState}\n */\nexport function hoverNode(state: StudioState, path: JxPath | null) {\n return { ...state, hover: path };\n}\n\n// ─── Document stack (component navigation) ──────────────────────────────────\n\n/**\n * Push current document onto the stack and switch to editing a new document.\n *\n * @param {StudioState} state\n * @param {JxMutableNode} doc\n * @param {string | null} documentPath\n * @returns {StudioState}\n */\nexport function pushDocument(state: StudioState, doc: JxMutableNode, documentPath: string | null) {\n const frame = {\n dirty: state.dirty,\n document: state.document,\n documentPath: state.documentPath,\n fileHandle: state.fileHandle,\n history: state.history,\n historyIndex: state.historyIndex,\n mode: state.mode,\n selection: state.selection,\n };\n const newState = createState(doc);\n newState.documentStack = [...(state.documentStack || []), frame];\n newState.documentPath = documentPath;\n newState.ui = { ...state.ui, activeMedia: null, activeSelector: null };\n return newState;\n}\n\n/**\n * Pop the document stack and return to the previous document.\n *\n * @param {StudioState} state\n * @returns {StudioState}\n */\nexport function popDocument(state: StudioState) {\n if (!state.documentStack || state.documentStack.length === 0) {\n return state;\n }\n const stack = [...state.documentStack];\n const frame = stack.pop();\n return {\n ...state,\n ...frame,\n documentStack: stack,\n ui: { ...state.ui },\n };\n}\n",
9
- "/**\n * Studio-utils.js — Pure utility functions extracted from studio.js\n *\n * These are all side-effect-free functions used by style/properties/events panels.\n */\n\nimport { defaultContentFormat, formatByName } from \"../format/format-host\";\nimport type { ContentSectionEntry } from \"../types\";\nimport type { ProjectConfig } from \"@jxsuite/schema/types\";\n\n/**\n * CamelCase → kebab-case for inline style attributes\n *\n * @param {string} str\n * @returns {string}\n */\nexport function camelToKebab(str: string) {\n return str.replaceAll(/[A-Z]/g, (c: string) => `-${c.toLowerCase()}`);\n}\n\n/**\n * Convert camelCase property name to \"Title Case\" label (e.g. \"backgroundColor\" → \"Background\n * Color\")\n *\n * @param {string} prop\n * @returns {string}\n */\nexport function camelToLabel(prop: string) {\n return prop.replaceAll(/([A-Z])/g, \" $1\").replace(/^./, (c: string) => c.toUpperCase());\n}\n\nexport function toCamelCase(str: string): string {\n return str\n .replaceAll(/[^a-zA-Z0-9]+(.)?/g, (_, c: string | undefined) => (c ? c.toUpperCase() : \"\"))\n .replace(/^[A-Z]/, (c) => c.toLowerCase());\n}\n\n/**\n * Convert a kebab-case CSS value to Title Case for picker display (e.g. \"border-box\" → \"Border\n * Box\")\n *\n * @param {string} val\n * @returns {string}\n */\nexport function kebabToLabel(val: string) {\n return val.replaceAll(\n /(^|-)(\\w)/g,\n (_: string, sep: string, c: string) => (sep ? \" \" : \"\") + c.toUpperCase(),\n );\n}\n\n/**\n * Get display label from metadata entry or prop name\n *\n * @param {{ $label?: string; [key: string]: unknown } | null | undefined} entry\n * @param {string} prop\n * @returns {string}\n */\nexport function propLabel(\n entry: { $label?: string; [key: string]: unknown } | null | undefined,\n prop: string,\n) {\n return entry?.$label || camelToLabel(prop);\n}\n\n/**\n * Label for HTML attributes — handles kebab-case (aria-label → \"Aria Label\")\n *\n * @param {{ $label?: string; [key: string]: unknown } | null | undefined} entry\n * @param {string} attr\n * @returns {string}\n */\nexport function attrLabel(\n entry: { $label?: string; [key: string]: unknown } | null | undefined,\n attr: string,\n) {\n if (entry?.$label) {\n return entry.$label;\n }\n if (attr.includes(\"-\")) {\n return attr.replaceAll(\n /(^|-)(\\w)/g,\n (_: string, sep: string, c: string) => (sep ? \" \" : \"\") + c.toUpperCase(),\n );\n }\n return camelToLabel(attr);\n}\n\n/**\n * Abbreviate a CSS value for button-group display\n *\n * @param {string} val\n * @returns {string}\n */\nexport function abbreviateValue(val: string) {\n const map: Record<string, string> = {\n baseline: \"base\",\n column: \"col\",\n \"column-reverse\": \"col-r\",\n contents: \"cnt\",\n \"flex-end\": \"end\",\n \"flex-start\": \"start\",\n \"flow-root\": \"flow\",\n inline: \"inl\",\n \"inline-block\": \"i-blk\",\n \"inline-flex\": \"i-flx\",\n \"inline-grid\": \"i-grd\",\n normal: \"norm\",\n nowrap: \"no-wr\",\n \"row-reverse\": \"row-r\",\n \"space-around\": \"arnd\",\n \"space-between\": \"betw\",\n \"space-evenly\": \"even\",\n stretch: \"str\",\n \"wrap-reverse\": \"wr-rev\",\n };\n return map[val] || val;\n}\n\n/**\n * Determine input widget type from a css-meta entry\n *\n * @param {Record<string, unknown>} entry\n * @returns {string}\n */\nexport function inferInputType(entry: Record<string, unknown>) {\n if (entry.$shorthand === true) {\n return \"shorthand\";\n }\n if (entry.$input === \"button-group\") {\n return \"button-group\";\n }\n if (entry.$input === \"media\") {\n return \"media\";\n }\n if (entry.format === \"color\") {\n return \"color\";\n }\n if (entry.format === \"uri-reference\") {\n return \"media\";\n }\n if (entry.$units !== undefined) {\n return \"number-unit\";\n }\n if (entry.type === \"number\") {\n return \"number\";\n }\n if (Array.isArray(entry.enum)) {\n return \"select\";\n }\n if (Array.isArray(entry.examples) || Array.isArray(entry.presets)) {\n return \"combobox\";\n }\n return \"text\";\n}\n\n/**\n * Match a document path to a content type and return its schema. Compares the content type's\n * `source` directory against the document path prefix, using `format` for extension matching.\n *\n * @param {string | null} documentPath — project-relative path (e.g. \"content/products/widget.md\")\n * @param {ProjectConfig | null | undefined} projectConfig — parsed project.json\n * @returns {{ name: string; schema: ContentTypeSchema } | null}\n */\nexport function findContentTypeSchema(\n documentPath: string | null,\n projectConfig: ProjectConfig | null | undefined,\n) {\n if (!documentPath || !projectConfig?.content) {\n return null;\n }\n // Content-type `source` prefixes are always forward-slash. The desktop platform can hand us\n // OS-native backslash paths on Windows, so normalize before prefix matching.\n const docPath = documentPath.replaceAll(\"\\\\\", \"/\");\n for (const [name, def] of Object.entries(\n projectConfig.content as Record<string, ContentSectionEntry>,\n )) {\n if (!def.source || !def.schema) {\n continue;\n }\n const src = def.source.replace(/^\\.\\//, \"\").replace(/\\/$/, \"\");\n const hasExt = src.includes(\".\") && !src.endsWith(\"/\");\n if (hasExt) {\n if (docPath === src || docPath.endsWith(`/${src}`)) {\n return { name, schema: def.schema };\n }\n } else {\n const ext =\n def.format === \"json\"\n ? \".json\"\n : (formatByName(def.format)?.extensions[0] ??\n defaultContentFormat()?.extensions[0] ??\n \".json\");\n if (docPath.startsWith(`${src}/`) && docPath.endsWith(ext)) {\n return { name, schema: def.schema };\n }\n }\n }\n return null;\n}\n\n/**\n * Convert a human-readable name to a CSS variable name. E.g. \"Geometric Humanist\" →\n * \"--font-geometric-humanist\"\n *\n * @param {string} name\n * @param {string} prefix - E.g. \"--font-\"\n * @returns {string}\n */\nexport function friendlyNameToVar(name: string, prefix: string) {\n const slug = name\n .trim()\n .toLowerCase()\n .replaceAll(/[^a-z0-9\\s-]/g, \"\")\n .replaceAll(/\\s+/g, \"-\")\n .replaceAll(/-+/g, \"-\")\n .replaceAll(/^-|-$/g, \"\");\n if (!slug) {\n return \"\";\n }\n return `${prefix}${slug}`;\n}\n\n/**\n * Convert a CSS variable name back to a display name. E.g. \"--font-geometric-humanist\" with prefix\n * \"--font-\" → \"Geometric Humanist\"\n *\n * @param {string} varName\n * @param {string} prefix\n * @returns {string}\n */\nexport function varDisplayName(varName: string, prefix: string) {\n return (\n varName\n .replace(new RegExp(`^${prefix.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`)}`), \"\")\n .replace(/^--/, \"\")\n .replaceAll(\"-\", \" \")\n .replaceAll(/\\b\\w/g, (c: string) => c.toUpperCase()) || varName\n );\n}\n\n/**\n * Parse a CEM type.text string into a structured descriptor.\n *\n * @param {string | undefined | null} typeText\n * @returns {{ kind: \"combobox\"; options: string[] }\n * | { kind: \"boolean\" }\n * | { kind: \"number\" }\n * | { kind: \"text\" }}\n */\nexport function parseCemType(typeText: string | undefined | null) {\n if (!typeText) {\n return { kind: \"text\" };\n }\n const t = typeText\n .trim()\n .replaceAll(/\\s*\\|\\s*undefined\\b/g, \"\")\n .trim();\n if (t === \"boolean\") {\n return { kind: \"boolean\" };\n }\n if (t === \"number\") {\n return { kind: \"number\" };\n }\n // Detect enum: \"'a' | 'b' | 'c'\" — pipe-separated quoted literals\n const enumMatch = t.match(/^'[^']*'(\\s*\\|\\s*'[^']*')+$/);\n if (enumMatch) {\n const options = [...t.matchAll(/'([^']*)'/g)].map((m) => m[1]);\n return { kind: \"combobox\", options };\n }\n return { kind: \"text\" };\n}\n\n/**\n * Clone a (possibly reactive) document tree via JSON round-trip. Unlike structuredClone, this works\n * on Vue reactive proxies and JSON-normalizes the tree (drops undefined values and functions) —\n * both required for document snapshots and clipboard payloads.\n */\nexport function jsonClone<T>(value: T): T {\n // oxlint-disable-next-line unicorn/prefer-structured-clone -- structuredClone throws on reactive proxies; JSON normalization is the point\n return JSON.parse(JSON.stringify(value)) as T;\n}\n",
10
- "/**\n * Patch ops — typed descriptors of document mutations, recorded by the mutators in transact.ts\n * during a transaction. The canvas patcher consumes them to update the live canvas DOM surgically\n * instead of re-rendering everything. Ops carry paths, not values: consumers read the post-mutation\n * document as the single source of truth.\n */\n\n// oxlint-disable-next-line unicorn/prefer-export-from -- JxDocOpPair is also used locally (TransactionRecord)\nimport type { JxDocOpPair } from \"@jxsuite/collab/ops\";\nimport type { JxPath } from \"../state\";\nimport type { Tab } from \"./tab.js\";\n\nexport type JxPatchOp =\n /** The node's style changed (any depth: base prop, @media block, nested selector). */\n | { op: \"set-style\"; path: JxPath }\n /** The node's textContent changed. */\n | { op: \"set-text\"; path: JxPath }\n /** A non-style, non-text node property changed (key = property name). */\n | { op: \"set-prop\"; path: JxPath; key: string; isEvent?: boolean }\n /** The node's attributes[attr] changed. */\n | { op: \"set-attr\"; path: JxPath; attr: string }\n /** A node was inserted at parentPath.children[index]. */\n | { op: \"insert\"; parentPath: JxPath; index: number }\n /** The node at path was removed. */\n | { op: \"remove\"; path: JxPath }\n /** The node moved between/within children arrays (indices are post-mutation document truth). */\n | { op: \"move\"; fromPath: JxPath; toParentPath: JxPath; toIndex: number }\n /** The node at path was structurally replaced (wrap, tagName change, $props edit). */\n | { op: \"replace\"; path: JxPath }\n /** A document-level key changed (state/$media/$head/$elements/imports/$layout) — escalates. */\n | { op: \"doc-meta\"; key: string };\n\n/**\n * Value-carrying document mutation, replayable in either direction. Mutators record a\n * forward/inverse pair per change; history applies them for surgical undo/redo and for\n * materializing states from checkpoints — without whole-document snapshots per edit. The definition\n * is canonical in `@jxsuite/collab/ops` (the collab bridge mirrors the same ops into a shared\n * Y.Doc); re-exported here so studio call sites keep their import path.\n */\nexport type { JxDocOp } from \"@jxsuite/collab/ops\";\nexport type { JxDocOpPair };\n\n/**\n * A frontmatter key change, replayable in either direction. Frontmatter lives outside the document\n * tree (`tab.doc.content.frontmatter`, split off by the format host), so these are studio-local and\n * never enter the shared `JxDocOp` vocabulary the collab bridge and canvas iframe mirror.\n * `undefined` means the key was/becomes absent.\n */\nexport interface JxFmOp {\n field: string;\n before?: unknown;\n after?: unknown;\n}\n\n/** Everything recorded during one transaction. */\nexport interface TransactionRecord {\n /** Canvas patch ops (path-only) for surgical DOM updates. */\n ops: JxPatchOp[];\n /** Replayable forward/inverse document ops for patch-based history. */\n docOps: JxDocOpPair[];\n /** Replayable frontmatter key changes (content-mode docs) for history undo/redo. */\n fmOps: JxFmOp[];\n /**\n * False when some mutation in the transaction could not produce a guaranteed-correct inverse\n * (e.g. a move whose parents' paths interact) — history falls back to a checkpoint snapshot.\n */\n invertible: boolean;\n}\n\n/**\n * The canvas-side consumer of patch batches. Registered by the canvas patcher at studio init;\n * absent in headless tests, where every transaction falls back to the full-render path.\n */\nexport interface PatchConsumer {\n /** Decide whether this batch can be applied surgically in the current canvas state. */\n classify: (tab: Tab, ops: JxPatchOp[]) => { patchable: boolean; reason: string };\n /** Mark a document root reference as surgically consumed (checked by the canvas doc-effect). */\n markConsumed: (docRef: object) => void;\n /**\n * Apply the batch to all ready canvas panels. Throws on any failure (caller escalates). `record`\n * carries the value-carrying `docOps` the iframe consumer posts across the frame boundary; the\n * legacy (parent-DOM) consumer ignores it and reads the post-mutation reactive doc instead.\n */\n apply: (tab: Tab, ops: JxPatchOp[], record?: TransactionRecord) => void;\n /** Schedule a full canvas render as the fallback path, recording the reason. */\n escalate: (reason: string) => void;\n}\n\nlet _consumer: PatchConsumer | null = null;\n\nexport function setPatchConsumer(consumer: PatchConsumer | null) {\n _consumer = consumer;\n}\n\nexport function getPatchConsumer(): PatchConsumer | null {\n return _consumer;\n}\n\n// ─── Recording ───────────────────────────────────────────────────────────────\n\nlet _recording: JxPatchOp[] | null = null;\nlet _docOps: JxDocOpPair[] | null = null;\nlet _fmOps: JxFmOp[] | null = null;\nlet _invertible = true;\n\n/** Begin recording patch ops for a transaction. */\nexport function beginRecording() {\n _recording = [];\n _docOps = [];\n _fmOps = [];\n _invertible = true;\n}\n\n/** Record a patch op describing an in-place mutation. No-op outside a transaction. */\nexport function recordPatch(op: JxPatchOp) {\n if (_recording) {\n _recording.push(op);\n }\n}\n\n/** Record a replayable forward/inverse document-op pair. No-op outside a transaction. */\nexport function recordDocOp(pair: JxDocOpPair) {\n if (_docOps) {\n _docOps.push(pair);\n }\n}\n\n/** Record a replayable frontmatter key change. No-op outside a transaction. */\nexport function recordFmOp(op: JxFmOp) {\n if (_fmOps) {\n _fmOps.push(op);\n }\n}\n\n/** Mark the current transaction as non-invertible — history stores a checkpoint instead. */\nexport function markNonInvertible() {\n _invertible = false;\n}\n\n/**\n * End recording and return everything recorded. An empty ops array means the mutation ran without\n * instrumentation (unknown change shape) — callers must treat that as not patchable.\n */\nexport function endRecording(): TransactionRecord {\n const record: TransactionRecord = {\n docOps: _docOps ?? [],\n fmOps: _fmOps ?? [],\n invertible: _invertible,\n ops: _recording ?? [],\n };\n _recording = null;\n _docOps = null;\n _fmOps = null;\n _invertible = true;\n return record;\n}\n",
11
- "/// <reference lib=\"dom\" />\nimport { toRaw } from \"../reactivity\";\nimport { jsonClone } from \"../utils/studio-utils\";\nimport { childIndex, getNodeAtPath, isAncestor, parentElementPath, pathsEqual } from \"../state\";\nimport { applyDocOpToDoc, childArray, cloneValue } from \"./doc-op-apply\";\nimport {\n beginRecording,\n endRecording,\n getPatchConsumer,\n recordDocOp,\n recordFmOp,\n recordPatch,\n} from \"./patch-ops\";\n\nimport type { JxDocOp, JxDocOpPair, JxFmOp, TransactionRecord } from \"./patch-ops\";\n\nimport type { Tab } from \"../tabs/tab\";\nimport type { JxPath } from \"../state\";\n\nimport type { JsonValue } from \"../types\";\nimport type {\n JxAttributeValue,\n JxEventBinding,\n JxMutableNode,\n JxStateObject,\n JxStyle,\n} from \"@jxsuite/schema/types\";\nimport { ensureNestedStyle, getNestedStyle, isEventBinding } from \"@jxsuite/schema/guards\";\n\nconst HISTORY_LIMIT = 100;\n\n/** Every Nth history entry stores a full snapshot so states can be materialized by replay. */\nconst CHECKPOINT_INTERVAL = 20;\n\n/** Opt-out flag for patch-based history (forces full-snapshot-per-edit legacy behavior). */\nfunction patchHistoryEnabled() {\n try {\n return typeof localStorage === \"undefined\" || !localStorage.getItem(\"jx-legacy-history\");\n } catch {\n return true;\n }\n}\n\n/** Forward/inverse pair for a single-key change on the node at path. */\nfunction setKeyPair(path: JxPath, key: string, before: unknown, after: unknown): JxDocOpPair {\n return {\n forward: { key, op: \"set-key\", path, value: after },\n inverse: { key, op: \"set-key\", path, value: before },\n };\n}\n\n/**\n * Translate `path` into post-splice coordinates when it descends through `parentPath`'s children at\n * or beyond the spliced index: a removal (delta -1) at fromIndex shifts deeper paths down; an\n * insertion (delta +1, inclusive) shifts them up. Returns `path` unchanged when the splice doesn't\n * affect it. Used to express a move's inverse in post-mutation coordinates.\n */\nfunction shiftPrefixedIndex(\n parentPath: JxPath,\n path: JxPath,\n spliceIndex: number,\n delta: number,\n inclusive: boolean,\n): JxPath {\n const d = parentPath.length;\n const isProperPrefix = d < path.length && parentPath.every((seg, i) => seg === path[i]);\n if (!isProperPrefix || path[d] !== \"children\" || typeof path[d + 1] !== \"number\") {\n return path;\n }\n const idx = path[d + 1] as number;\n if (inclusive ? idx < spliceIndex : idx <= spliceIndex) {\n return path;\n }\n const shifted = [...path];\n shifted[d + 1] = idx + delta;\n return shifted;\n}\n\n/** Any value that can sit at a document node key (undefined/null/\"\" deletes it). */\nexport type JxNodeValue =\n | JsonValue\n | JxMutableNode\n | (JxMutableNode | string)[]\n | JxEventBinding\n | undefined;\n\n// ─── Transactional layer ─────────────────────────────────────────────────────\n\n/**\n * Where a transaction came from: a direct user/tool edit, the undo/redo machinery replaying\n * recorded ops, or a remote collaborator's ops applied locally. Observers use this to avoid\n * republishing what they themselves applied.\n */\nexport type TransactOrigin = \"user\" | \"history\" | \"remote\";\n\n/**\n * Module-level hook invoked at the end of every transactDoc (after the canvas patch apply and the\n * dirty mark). Registered by the collab layer to mirror local edits into a shared document; at most\n * one observer exists. `record.docOps` may be empty for un-instrumented mutations — observers must\n * handle that (e.g. by diffing).\n */\nexport type TransactObserver = (\n tab: Tab,\n record: TransactionRecord,\n origin: TransactOrigin,\n) => void;\n\nlet _transactObserver: TransactObserver | null = null;\n\nexport function setTransactObserver(fn: TransactObserver | null) {\n _transactObserver = fn;\n}\n\n/**\n * Module-level gate consulted at transactDoc entry: return a refusal reason to block the mutation\n * (the collab layer soft-freezes structural editing while a peer holds source-canonical), or null\n * to proceed. Remote-origin transactions always pass — they ARE the frozen representation's\n * mirror.\n */\nexport type TransactGate = (tab: Tab, origin: TransactOrigin) => string | null;\n\nlet _transactGate: TransactGate | null = null;\n\nexport function setTransactGate(fn: TransactGate | null) {\n _transactGate = fn;\n}\n\n/**\n * Apply a document mutation transactionally: push to history and mark dirty. The mutationFn\n * receives the tab and should mutate tab.doc.document in place.\n *\n * @param {Tab | null} tab\n * @param {(tab: Tab) => void} mutationFn\n * @param {{ skipHistory?: boolean; origin?: TransactOrigin }} [opts]\n */\nexport function transactDoc(\n tab: Tab | null,\n mutationFn: (tab: Tab) => void,\n {\n skipHistory = false,\n origin = \"user\",\n coalesceKey = null,\n }: { skipHistory?: boolean; origin?: TransactOrigin; coalesceKey?: string | null } = {},\n) {\n if (!tab) {\n return;\n }\n if (origin !== \"remote\" && _transactGate?.(tab, origin)) {\n return;\n }\n const selectionBefore = tab.session.selection ? [...tab.session.selection] : null;\n beginRecording();\n let record: TransactionRecord;\n try {\n mutationFn(tab);\n } finally {\n record = endRecording();\n }\n\n // Replace the document root reference so effects tracking tab.doc.document re-trigger.\n // Nested objects are shared — the mutation already modified them in place.\n const raw = toRaw(tab.doc.document);\n const newRef = { ...raw };\n\n // When the canvas patcher can apply this change surgically, mark the new root reference as\n // Consumed BEFORE assigning it — the canvas doc-effect runs synchronously on assignment and\n // Skips the full render for consumed references. Panels' own effects still fire as before.\n // Anything unrecorded or unclassifiable falls through to today's full-render path.\n const consumer = getPatchConsumer();\n const verdict =\n consumer === null\n ? { patchable: false, reason: \"no-patch-consumer\" }\n : record.ops.length === 0\n ? { patchable: false, reason: \"unrecorded-mutation\" }\n : consumer.classify(tab, record.ops);\n if (verdict.patchable) {\n consumer!.markConsumed(newRef);\n }\n\n tab.doc.document = newRef;\n\n if (verdict.patchable) {\n try {\n consumer!.apply(tab, record.ops, record);\n } catch (error) {\n consumer!.escalate(\n `patch-apply-failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n if (!skipHistory && !_batchTab) {\n pushHistoryEntry(tab, raw, record, selectionBefore, coalesceKey);\n }\n\n tab.doc.dirty = true;\n\n _transactObserver?.(tab, record, origin);\n}\n\n/**\n * Append a history entry for a completed transaction. With patch-based history, entries carry\n * replayable forward/inverse ops and only periodic checkpoints store full document snapshots —\n * eliminating the whole-document clone per edit. Non-invertible or un-instrumented transactions\n * store a snapshot, which always keeps every state recoverable.\n *\n * @param {Tab} tab\n * @param {JxMutableNode} raw Post-mutation raw document\n * @param {TransactionRecord} record\n * @param {JxPath | null} selectionBefore\n */\nfunction pushHistoryEntry(\n tab: Tab,\n raw: JxMutableNode,\n record: TransactionRecord,\n selectionBefore: JxPath | null,\n coalesceKey: string | null = null,\n) {\n const truncated = tab.history.snapshots.slice(0, tab.history.index + 1);\n const useOps =\n patchHistoryEnabled() &&\n record.invertible &&\n (record.docOps.length > 0 || record.fmOps.length > 0);\n\n // Successive commits to the same block are ONE undoable edit. Fold this transaction into the\n // Previous entry: its inverse already restores the state before the run began (undoing A→B then\n // B→C is C→A), so only the forward ops and the resulting document advance.\n const prev = truncated.at(-1);\n if (coalesceKey && useOps && prev && prev.coalesceKey === coalesceKey && prev.inverseOps) {\n prev.forwardOps = [...(prev.forwardOps ?? []), ...record.docOps.map((pair) => pair.forward)];\n // BOTH halves accumulate. Keeping only the run's first inverse would cover only the keys that\n // First commit happened to touch, so a later commit that changes the block's SHAPE — a plain\n // Block becoming rich, which clears `textContent` and writes `children` — would never be undone,\n // Leaving the node holding both keys at once. Undo replays inverses in reverse order, so\n // Appending yields \"undo the last commit, then the one before it, …\".\n prev.inverseOps = [...prev.inverseOps, ...record.docOps.map((pair) => pair.inverse)];\n prev.selection = tab.session.selection ? [...tab.session.selection] : null;\n if (prev.document) {\n prev.document = jsonClone(raw);\n }\n tab.history.snapshots = truncated;\n tab.history.index = truncated.length - 1;\n return;\n }\n\n const needCheckpoint = !useOps || truncated.length % CHECKPOINT_INTERVAL === 0;\n truncated.push({\n document: needCheckpoint ? jsonClone(raw) : null,\n fmOps: useOps && record.fmOps.length > 0 ? record.fmOps : null,\n forwardOps: useOps ? record.docOps.map((p) => p.forward) : null,\n inverseOps: useOps ? record.docOps.map((p) => p.inverse) : null,\n coalesceKey,\n selection: tab.session.selection ? [...tab.session.selection] : null,\n selectionBefore,\n });\n if (truncated.length > HISTORY_LIMIT) {\n // The new base entry must be a self-contained checkpoint before the old base is dropped.\n if (!truncated[1]!.document) {\n truncated[1]!.document = materializeState(truncated, 1);\n }\n truncated.shift();\n }\n tab.history.snapshots = truncated;\n tab.history.index = truncated.length - 1;\n}\n\n/**\n * Reconstruct the document at history state `target`: copy the nearest checkpoint at or before it,\n * then replay forward ops. Every entry holds either a snapshot or forward ops, so this always\n * succeeds.\n *\n * @param {HistorySnapshot[]} snapshots\n * @param {number} target\n * @returns {JxMutableNode}\n */\nfunction materializeState(\n snapshots: { document: JxMutableNode | null; forwardOps?: JxDocOp[] | null }[],\n target: number,\n): JxMutableNode {\n let base = target;\n while (base >= 0 && !snapshots[base]!.document) {\n base -= 1;\n }\n if (base < 0) {\n throw new Error(\"history-missing-checkpoint\");\n }\n const doc = jsonClone(snapshots[base]!.document) as JxMutableNode;\n for (let i = base + 1; i <= target; i++) {\n for (const op of snapshots[i]!.forwardOps ?? []) {\n applyDocOpToDoc(doc, op);\n }\n }\n return doc;\n}\n\n/**\n * Convenience: transact with a mutation fn that receives the document directly.\n *\n * @param {Tab | null} tab\n * @param {(doc: JxMutableNode) => void} fn\n * @param {{ skipHistory?: boolean; origin?: TransactOrigin }} [opts]\n */\nexport function transact(\n tab: Tab | null,\n fn: (doc: JxMutableNode) => void,\n opts?: { skipHistory?: boolean; origin?: TransactOrigin },\n) {\n transactDoc(tab, (t) => fn(t.doc.document), opts);\n}\n\n/**\n * Apply externally-produced doc ops (a remote collaborator's edits) through the normal transaction\n * pipeline: the canvas patches surgically exactly as it does for undo/redo replay, panels' effects\n * fire, and — because the origin is \"remote\" — the transact observer will not republish them.\n * History is skipped; while a collab session is attached, undo is delegated (see\n * setHistoryDelegate) and local-only.\n *\n * @param {Tab} tab\n * @param {JxDocOp[]} ops\n */\nexport function applyExternalDocOps(tab: Tab, ops: JxDocOp[]) {\n transactDoc(\n tab,\n (t) => {\n for (const op of ops) {\n applyDocOp(t, op);\n }\n },\n { origin: \"remote\", skipHistory: true },\n );\n}\n\n// ─── Document-op application ─────────────────────────────────────────────────\n\n/** Document-level keys whose changes require a full scope/panel rebuild on the canvas. */\nconst DOC_META_KEYS = new Set([\"state\", \"$media\", \"$head\", \"$elements\", \"imports\", \"$layout\"]);\n\n/**\n * Apply a doc op to the live document AND record the matching canvas patch op, so undo/redo\n * transactions patch the canvas surgically like any other edit.\n *\n * @param {Tab} tab\n * @param {JxDocOp} op\n */\nfunction applyDocOp(tab: Tab, op: JxDocOp) {\n const prev =\n op.op === \"set-key\" ? (getNodeAtPath(tab.doc.document, op.path)?.[op.key] as unknown) : null;\n applyDocOpToDoc(tab.doc.document, op);\n // The canvas lives in an iframe and can only be patched from VALUE-CARRYING ops (`record.docOps`),\n // Which is what crosses the bridge. Recording only the classification patch below left docOps\n // Empty on this path, so undo/redo posted an EMPTY patch: the document changed, the patch\n // Classified as applicable (suppressing the full render), and the canvas silently kept showing\n // The pre-undo content. Replaying an op IS a forward op — record it as one.\n //\n // History never reads the inverse here: undo/redo run with `skipHistory`, and the entry they\n // Replay already holds the pair. `markNonInvertible` would be wrong (it forces a whole-document\n // Checkpoint), so the op is paired with itself.\n recordDocOp({ forward: op, inverse: op });\n switch (op.op) {\n case \"set-key\": {\n if (DOC_META_KEYS.has(op.key)) {\n recordPatch({ key: op.key, op: \"doc-meta\" });\n } else if (op.key === \"style\") {\n recordPatch({ op: \"set-style\", path: op.path });\n } else if (op.key === \"textContent\") {\n recordPatch({ op: \"set-text\", path: op.path });\n } else if (op.key === \"attributes\" || op.key === \"cases\" || op.key === \"$props\") {\n recordPatch({ op: \"replace\", path: op.path });\n } else {\n const isEvent =\n op.key.startsWith(\"on\") && (isEventBinding(op.value) || isEventBinding(prev));\n recordPatch({ isEvent, key: op.key, op: \"set-prop\", path: op.path });\n }\n return;\n }\n case \"insert-child\": {\n recordPatch({ index: op.index, op: \"insert\", parentPath: op.parentPath });\n return;\n }\n case \"remove-child\": {\n recordPatch({ op: \"remove\", path: [...op.parentPath, \"children\", op.index] });\n return;\n }\n case \"set-child\": {\n recordPatch({ op: \"replace\", path: [...op.parentPath, \"children\", op.index] });\n return;\n }\n case \"move-child\": {\n recordPatch({\n fromPath: [...op.fromParentPath, \"children\", op.fromIndex],\n op: \"move\",\n toIndex: op.toIndex,\n toParentPath: op.toParentPath,\n });\n break;\n }\n default: {\n break;\n }\n }\n}\n\n// ─── Batch (group multiple mutations into one undo step) ────────────────────\n\nlet _batchTab: Tab | null = null;\n\n/** Module-level hook invoked when a batch closes (collab flushes its buffered ops as one step). */\nexport type BatchEndNotifier = (tab: Tab) => void;\n\nlet _batchEndNotifier: BatchEndNotifier | null = null;\n\nexport function setBatchEndNotifier(fn: BatchEndNotifier | null) {\n _batchEndNotifier = fn;\n}\n\nexport function beginBatch(tab: Tab | null) {\n _batchTab = tab;\n}\n\nexport function endBatch() {\n const tab = _batchTab;\n // A history delegate owns undo grouping while registered; the snapshot push would be dead weight.\n if (tab && !_historyDelegates.has(tab)) {\n const raw = toRaw(tab.doc.document);\n const snapshot = {\n document: jsonClone(raw),\n selection: tab.session.selection ? [...tab.session.selection] : null,\n };\n const truncated = tab.history.snapshots.slice(0, tab.history.index + 1);\n truncated.push(snapshot);\n if (truncated.length > HISTORY_LIMIT) {\n truncated.shift();\n }\n tab.history.snapshots = truncated;\n tab.history.index = truncated.length - 1;\n }\n _batchTab = null;\n if (tab) {\n _batchEndNotifier?.(tab);\n }\n}\n\nexport function isBatching(): boolean {\n return _batchTab !== null;\n}\n\n// ─── Undo / Redo ─────────────────────────────────────────────────────────────\n\n/**\n * Per-tab replacement for the built-in op-log history. While a delegate is registered (a collab\n * session's Y.UndoManager), undo/redo route to it and the snapshot history is bypassed — keeping\n * this module free of any yjs knowledge.\n */\nexport interface HistoryDelegate {\n undo: (tab: Tab) => void;\n redo: (tab: Tab) => void;\n canUndo: (tab: Tab) => boolean;\n canRedo: (tab: Tab) => boolean;\n}\n\nconst _historyDelegates = new WeakMap<Tab, HistoryDelegate>();\n\nexport function setHistoryDelegate(tab: Tab, delegate: HistoryDelegate | null) {\n if (delegate) {\n _historyDelegates.set(tab, delegate);\n } else {\n _historyDelegates.delete(tab);\n }\n}\n\nexport function getHistoryDelegate(tab: Tab): HistoryDelegate | null {\n return _historyDelegates.get(tab) ?? null;\n}\n\nexport function canUndo(tab: Tab): boolean {\n const delegate = _historyDelegates.get(tab);\n return delegate ? delegate.canUndo(tab) : tab.history.index > 0;\n}\n\nexport function canRedo(tab: Tab): boolean {\n const delegate = _historyDelegates.get(tab);\n return delegate ? delegate.canRedo(tab) : tab.history.index < tab.history.snapshots.length - 1;\n}\n\n/** Restore a materialized snapshot state (full-render path). */\nfunction restoreState(tab: Tab, index: number) {\n const { snapshots } = tab.history;\n tab.doc.document = materializeState(snapshots, index);\n const snap = snapshots[index]!;\n tab.session.selection = snap.selection ? [...toRaw(snap.selection)] : null;\n}\n\n/** Debug-flag assertion: ops-based undo/redo must land on the same state replay produces. */\nfunction assertHistoryConsistency(tab: Tab, index: number) {\n try {\n if (typeof localStorage === \"undefined\" || !localStorage.getItem(\"jx-canvas-debug\")) {\n return;\n }\n } catch {\n return;\n }\n const expected = JSON.stringify(materializeState(tab.history.snapshots, index));\n const actual = JSON.stringify(jsonClone(toRaw(tab.doc.document)));\n if (expected !== actual) {\n console.error(\"jx history: ops-based undo/redo diverged from checkpoint replay\", {\n index,\n });\n }\n}\n\n/** @param {Tab} tab */\nexport function undo(tab: Tab) {\n const delegate = _historyDelegates.get(tab);\n if (delegate) {\n delegate.undo(tab);\n return;\n }\n if (tab.history.index <= 0) {\n return;\n }\n const entry = tab.history.snapshots[tab.history.index]!;\n const inverseOps = patchHistoryEnabled() ? entry.inverseOps : null;\n const fmOps = patchHistoryEnabled() ? entry.fmOps : null;\n if ((inverseOps && inverseOps.length > 0) || (fmOps && fmOps.length > 0)) {\n // Surgical path: apply inverse ops through the normal transaction pipeline (the canvas\n // Patches in place when it can), in reverse recording order.\n transactDoc(\n tab,\n (t) => {\n if (inverseOps) {\n for (let i = inverseOps.length - 1; i >= 0; i--) {\n applyDocOp(t, toRaw(inverseOps[i]) as JxDocOp);\n }\n }\n if (fmOps) {\n for (let i = fmOps.length - 1; i >= 0; i--) {\n const op = toRaw(fmOps[i]) as JxFmOp;\n applyFmState(t, op.field, op.before);\n }\n }\n },\n { origin: \"history\", skipHistory: true },\n );\n tab.session.selection = entry.selectionBefore ? [...toRaw(entry.selectionBefore)] : null;\n tab.history.index -= 1;\n assertHistoryConsistency(tab, tab.history.index);\n } else {\n tab.history.index -= 1;\n restoreState(tab, tab.history.index);\n }\n tab.doc.dirty = true;\n}\n\n/** @param {Tab} tab */\nexport function redo(tab: Tab) {\n const delegate = _historyDelegates.get(tab);\n if (delegate) {\n delegate.redo(tab);\n return;\n }\n if (tab.history.index >= tab.history.snapshots.length - 1) {\n return;\n }\n const entry = tab.history.snapshots[tab.history.index + 1]!;\n const forwardOps = patchHistoryEnabled() ? entry.forwardOps : null;\n const fmOps = patchHistoryEnabled() ? entry.fmOps : null;\n if ((forwardOps && forwardOps.length > 0) || (fmOps && fmOps.length > 0)) {\n transactDoc(\n tab,\n (t) => {\n if (forwardOps) {\n for (const op of forwardOps) {\n applyDocOp(t, toRaw(op) as JxDocOp);\n }\n }\n if (fmOps) {\n for (const op of fmOps) {\n const raw = toRaw(op) as JxFmOp;\n applyFmState(t, raw.field, raw.after);\n }\n }\n },\n { origin: \"history\", skipHistory: true },\n );\n tab.session.selection = entry.selection ? [...toRaw(entry.selection)] : null;\n tab.history.index += 1;\n assertHistoryConsistency(tab, tab.history.index);\n } else {\n tab.history.index += 1;\n restoreState(tab, tab.history.index);\n }\n tab.doc.dirty = true;\n}\n\n// ─── In-place document mutators ──────────────────────────────────────────────\n\n/**\n * @param {Tab} tab\n * @param {JxPath} parentPath\n * @param {number} index\n * @param {JxMutableNode} nodeDef\n */\nexport function mutateInsertNode(\n tab: Tab,\n parentPath: JxPath,\n index: number,\n nodeDef: JxMutableNode,\n) {\n const parent = getNodeAtPath(tab.doc.document, parentPath);\n if (!parent) {\n return;\n }\n childArray(parent).splice(index, 0, structuredClone(nodeDef));\n recordPatch({ index, op: \"insert\", parentPath });\n recordDocOp({\n forward: { index, node: cloneValue(nodeDef), op: \"insert-child\", parentPath },\n inverse: { index, op: \"remove-child\", parentPath },\n });\n}\n\n/**\n * @param {Tab} tab\n * @param {JxPath} path\n */\nexport function mutateRemoveNode(tab: Tab, path: JxPath) {\n if (!path || path.length < 2) {\n return;\n }\n const elemPath = parentElementPath(path) as JxPath;\n const idx = childIndex(path) as number;\n const [removed] = (getNodeAtPath(tab.doc.document, elemPath).children as JxMutableNode[]).splice(\n idx,\n 1,\n );\n recordPatch({ op: \"remove\", path });\n recordDocOp({\n forward: { index: idx, op: \"remove-child\", parentPath: elemPath },\n inverse: { index: idx, node: cloneValue(removed), op: \"insert-child\", parentPath: elemPath },\n });\n if (tab.session.selection && isAncestor(path, tab.session.selection)) {\n tab.session.selection = null;\n }\n}\n\n/**\n * @param {Tab} tab\n * @param {JxPath} path\n */\nexport function mutateDuplicateNode(tab: Tab, path: JxPath) {\n if (!path || path.length < 2) {\n return;\n }\n const node = getNodeAtPath(tab.doc.document, path);\n if (!node) {\n return;\n }\n const elemPath = parentElementPath(path) as JxPath;\n const idx = childIndex(path) as number;\n const clone = structuredClone(toRaw(node));\n (getNodeAtPath(tab.doc.document, elemPath).children as JxMutableNode[]).splice(idx + 1, 0, clone);\n recordPatch({ index: idx + 1, op: \"insert\", parentPath: elemPath });\n recordDocOp({\n forward: { index: idx + 1, node: cloneValue(clone), op: \"insert-child\", parentPath: elemPath },\n inverse: { index: idx + 1, op: \"remove-child\", parentPath: elemPath },\n });\n tab.session.selection = [...elemPath, \"children\", idx + 1];\n}\n\n/**\n * @param {Tab} tab\n * @param {JxPath} path\n * @param {string} wrapperTag\n */\nexport function mutateWrapNode(tab: Tab, path: JxPath, wrapperTag = \"div\") {\n if (!path || path.length < 2) {\n return;\n }\n const node = getNodeAtPath(tab.doc.document, path);\n if (!node) {\n return;\n }\n const elemPath = parentElementPath(path) as JxPath;\n const idx = childIndex(path) as number;\n const wrapper = {\n children: [structuredClone(toRaw(node))],\n tagName: wrapperTag,\n };\n const original = cloneValue(node);\n (getNodeAtPath(tab.doc.document, elemPath).children as JxMutableNode[]).splice(idx, 1, wrapper);\n recordPatch({ op: \"replace\", path });\n recordDocOp({\n forward: { index: idx, node: cloneValue(wrapper), op: \"set-child\", parentPath: elemPath },\n inverse: { index: idx, node: original, op: \"set-child\", parentPath: elemPath },\n });\n tab.session.selection = [...elemPath, \"children\", idx];\n}\n\n/**\n * @param {Tab} tab\n * @param {JxPath} fromPath\n * @param {JxPath} toParentPath\n * @param {number} toIndex\n */\nexport function mutateMoveNode(tab: Tab, fromPath: JxPath, toParentPath: JxPath, toIndex: number) {\n const doc = tab.doc.document;\n const fromParentPath = parentElementPath(fromPath) as JxPath;\n const fromIdx = childIndex(fromPath) as number;\n if (!fromParentPath || typeof fromIdx !== \"number\") {\n return;\n }\n const fromParent = getNodeAtPath(doc, fromParentPath);\n const toParent = getNodeAtPath(doc, toParentPath);\n if (!fromParent || !Array.isArray(fromParent.children) || !toParent) {\n return;\n }\n const [node] = fromParent.children.splice(fromIdx, 1);\n if (node === undefined) {\n return;\n }\n let adjustedIndex = toIndex;\n if (fromParent === toParent && fromIdx < toIndex) {\n adjustedIndex -= 1;\n }\n childArray(toParent).splice(adjustedIndex, 0, node);\n recordPatch({ fromPath, op: \"move\", toIndex: adjustedIndex, toParentPath });\n recordDocOp({\n forward: {\n fromIndex: fromIdx,\n fromParentPath,\n op: \"move-child\",\n toIndex: adjustedIndex,\n toParentPath,\n },\n inverse: {\n fromIndex: adjustedIndex,\n // The inverse runs against the post-move document, so both parent paths are translated\n // Into post-move coordinates: the removal shifted paths under fromParent, the insertion\n // Shifted paths under toParent.\n fromParentPath: shiftPrefixedIndex(fromParentPath, toParentPath, fromIdx, -1, false),\n op: \"move-child\",\n toIndex: fromIdx,\n toParentPath: shiftPrefixedIndex(toParentPath, fromParentPath, adjustedIndex, 1, true),\n },\n });\n\n if (pathsEqual(tab.session.selection, fromPath)) {\n let idx = toIndex;\n if (\n fromParentPath.length === toParentPath.length &&\n fromParentPath.every((v, i) => v === toParentPath[i]) &&\n fromIdx < toIndex\n ) {\n idx = toIndex - 1;\n }\n tab.session.selection = [...toParentPath, \"children\", idx];\n }\n}\n\n/**\n * @param {Tab} tab\n * @param {JxPath} path\n * @param {string} key\n * @param {JxNodeValue} value\n */\nexport function mutateUpdateProperty(tab: Tab, path: JxPath, key: string, value?: JxNodeValue) {\n const node = getNodeAtPath(tab.doc.document, path);\n const prev = node[key];\n const before = cloneValue(prev);\n if (value === undefined || value === null || value === \"\") {\n delete node[key];\n } else {\n node[key] = value;\n }\n recordDocOp(setKeyPair(path, key, before, cloneValue(node[key])));\n if (key === \"textContent\") {\n recordPatch({ op: \"set-text\", path });\n } else if (key === \"style\") {\n recordPatch({ op: \"set-style\", path });\n } else {\n // Event-binding edits are invisible on the canvas (stripped in design/edit renders); the\n // Deleted-value case checks the previous value since the new one is gone.\n const bindingValue = value === undefined || value === null || value === \"\" ? prev : value;\n const isEvent = key.startsWith(\"on\") && isEventBinding(bindingValue);\n recordPatch({ isEvent, key, op: \"set-prop\", path });\n }\n}\n\n/**\n * @param {Tab} tab\n * @param {JxPath} path\n * @param {string} prop\n * @param {string | undefined} value\n */\nexport function mutateUpdateStyle(tab: Tab, path: JxPath, prop: string, value: string | undefined) {\n const node = getNodeAtPath(tab.doc.document, path);\n const styleBefore = cloneValue(node.style);\n if (!node.style) {\n node.style = {};\n }\n if (value === undefined || value === \"\") {\n delete node.style[prop];\n } else {\n node.style[prop] = value;\n }\n if (Object.keys(node.style).length === 0) {\n delete node.style;\n }\n recordDocOp(setKeyPair(path, \"style\", styleBefore, cloneValue(node.style)));\n recordPatch({ op: \"set-style\", path });\n}\n\n/**\n * @param {Tab} tab\n * @param {JxPath} path\n * @param {string} attr\n * @param {JxAttributeValue | undefined} value — a literal, `$ref` binding, or `${}` template.\n */\nexport function mutateUpdateAttribute(\n tab: Tab,\n path: JxPath,\n attr: string,\n value?: JxAttributeValue | undefined,\n) {\n const node = getNodeAtPath(tab.doc.document, path);\n const attrsBefore = cloneValue(node.attributes);\n if (!node.attributes) {\n node.attributes = {};\n }\n if (value === undefined || value === \"\") {\n delete node.attributes[attr];\n } else {\n node.attributes[attr] = value;\n }\n if (Object.keys(node.attributes).length === 0) {\n delete node.attributes;\n }\n recordDocOp(setKeyPair(path, \"attributes\", attrsBefore, cloneValue(node.attributes)));\n recordPatch({ attr, op: \"set-attr\", path });\n}\n\n/**\n * @param {Tab} tab\n * @param {JxPath} path\n * @param {string} mediaName\n * @param {string} prop\n * @param {string | undefined} value\n */\nexport function mutateUpdateMediaStyle(\n tab: Tab,\n path: JxPath,\n mediaName: string,\n prop: string,\n value: string | undefined,\n) {\n if (!mediaName) {\n return mutateUpdateStyle(tab, path, prop, value);\n }\n const node = getNodeAtPath(tab.doc.document, path);\n const styleBefore = cloneValue(node.style);\n if (!node.style) {\n node.style = {};\n }\n const key = `@${mediaName}`;\n const media = ensureNestedStyle(node.style, key);\n if (value === undefined || value === \"\") {\n delete media[prop];\n if (Object.keys(media).length === 0) {\n delete node.style[key];\n }\n } else {\n media[prop] = value;\n }\n if (Object.keys(node.style).length === 0) {\n delete node.style;\n }\n recordDocOp(setKeyPair(path, \"style\", styleBefore, cloneValue(node.style)));\n recordPatch({ op: \"set-style\", path });\n}\n\n/**\n * @param {Tab} tab\n * @param {JxPath} path\n * @param {string} selector\n * @param {string} prop\n * @param {string | undefined} value\n */\nexport function mutateUpdateNestedStyle(\n tab: Tab,\n path: JxPath,\n selector: string,\n prop: string,\n value: string | undefined,\n) {\n const node = getNodeAtPath(tab.doc.document, path);\n const styleBefore = cloneValue(node.style);\n if (!node.style) {\n node.style = {};\n }\n const block = ensureNestedStyle(node.style, selector);\n if (value === undefined || value === \"\") {\n delete block[prop];\n if (Object.keys(block).length === 0) {\n delete node.style[selector];\n }\n } else {\n block[prop] = value;\n }\n if (Object.keys(node.style).length === 0) {\n delete node.style;\n }\n recordDocOp(setKeyPair(path, \"style\", styleBefore, cloneValue(node.style)));\n recordPatch({ op: \"set-style\", path });\n}\n\n/**\n * @param {Tab} tab\n * @param {JxPath} path\n * @param {string} mediaName\n * @param {string} selector\n * @param {string} prop\n * @param {string | undefined} value\n */\nexport function mutateUpdateMediaNestedStyle(\n tab: Tab,\n path: JxPath,\n mediaName: string,\n selector: string,\n prop: string,\n value: string | undefined,\n) {\n const node = getNodeAtPath(tab.doc.document, path);\n const styleBefore = cloneValue(node.style);\n if (!node.style) {\n node.style = {};\n }\n const key = `@${mediaName}`;\n const media = ensureNestedStyle(node.style, key);\n const block = ensureNestedStyle(media, selector);\n if (value === undefined || value === \"\") {\n delete block[prop];\n if (Object.keys(block).length === 0) {\n delete media[selector];\n }\n if (Object.keys(media).length === 0) {\n delete node.style[key];\n }\n } else {\n block[prop] = value;\n }\n if (Object.keys(node.style).length === 0) {\n delete node.style;\n }\n recordDocOp(setKeyPair(path, \"style\", styleBefore, cloneValue(node.style)));\n recordPatch({ op: \"set-style\", path });\n}\n\n/**\n * Update a style property at a nested style path (e.g., [\"table\", \"th\"]). Creates intermediate\n * objects as needed.\n *\n * @param {Tab} tab\n * @param {JxPath} path\n * @param {string[]} stylePath\n * @param {string} prop\n * @param {string | undefined} value\n */\nexport function mutateUpdateNestedStylePath(\n tab: Tab,\n path: JxPath,\n stylePath: string[],\n prop: string,\n value: string | undefined,\n) {\n const node = getNodeAtPath(tab.doc.document, path);\n const styleBefore = cloneValue(node.style);\n if (!node.style) {\n node.style = {};\n }\n let obj = node.style;\n for (const seg of stylePath) {\n obj = ensureNestedStyle(obj, seg);\n }\n if (value === undefined || value === \"\") {\n delete obj[prop];\n // Clean up empty parent objects\n let cur: JxStyle | undefined = node.style;\n for (let i = 0; i < stylePath.length && cur; i++) {\n const child = getNestedStyle(cur, stylePath[i]!);\n if (child && Object.keys(child).length === 0) {\n delete cur[stylePath[i]!];\n break;\n }\n cur = child;\n }\n } else {\n obj[prop] = value;\n }\n if (Object.keys(node.style).length === 0) {\n delete node.style;\n }\n recordDocOp(setKeyPair(path, \"style\", styleBefore, cloneValue(node.style)));\n recordPatch({ op: \"set-style\", path });\n}\n\n/**\n * Update a style property at a nested style path within a media query.\n *\n * @param {Tab} tab\n * @param {JxPath} path\n * @param {string} mediaName\n * @param {string[]} stylePath\n * @param {string} prop\n * @param {string | undefined} value\n */\nexport function mutateUpdateMediaNestedStylePath(\n tab: Tab,\n path: JxPath,\n mediaName: string,\n stylePath: string[],\n prop: string,\n value: string | undefined,\n) {\n const node = getNodeAtPath(tab.doc.document, path);\n const styleBefore = cloneValue(node.style);\n if (!node.style) {\n node.style = {};\n }\n const key = `@${mediaName}`;\n const media = ensureNestedStyle(node.style, key);\n let obj = media;\n for (const seg of stylePath) {\n obj = ensureNestedStyle(obj, seg);\n }\n if (value === undefined || value === \"\") {\n delete obj[prop];\n let cur: JxStyle | undefined = media;\n for (let i = 0; i < stylePath.length && cur; i++) {\n const child = getNestedStyle(cur, stylePath[i]!);\n if (child && Object.keys(child).length === 0) {\n delete cur[stylePath[i]!];\n break;\n }\n cur = child;\n }\n if (Object.keys(media).length === 0) {\n delete node.style[key];\n }\n } else {\n obj[prop] = value;\n }\n if (Object.keys(node.style).length === 0) {\n delete node.style;\n }\n recordDocOp(setKeyPair(path, \"style\", styleBefore, cloneValue(node.style)));\n recordPatch({ op: \"set-style\", path });\n}\n\n/**\n * @param {Tab} tab\n * @param {JxPath} path\n * @param {Record<string, string | undefined> | undefined} style\n */\nexport function mutateReplaceStyle(tab: Tab, path: JxPath, style: JxStyle | undefined) {\n const node = getNodeAtPath(tab.doc.document, path);\n const styleBefore = cloneValue(node.style);\n if (style && Object.keys(style).length > 0) {\n node.style = style;\n } else {\n delete node.style;\n }\n recordDocOp(setKeyPair(path, \"style\", styleBefore, cloneValue(node.style)));\n recordPatch({ op: \"set-style\", path });\n}\n\n/**\n * @param {Tab} tab\n * @param {string} name\n * @param {Record<string, JsonValue>} def\n */\nexport function mutateAddDef(tab: Tab, name: string, def: Record<string, JsonValue>) {\n const doc = tab.doc.document;\n const before = cloneValue(doc.state);\n if (!doc.state) {\n doc.state = {};\n }\n doc.state[name] = def;\n recordDocOp(setKeyPair([], \"state\", before, cloneValue(doc.state)));\n recordPatch({ key: \"state\", op: \"doc-meta\" });\n}\n\n/**\n * @param {Tab} tab\n * @param {string} name\n */\nexport function mutateRemoveDef(tab: Tab, name: string) {\n const doc = tab.doc.document;\n if (doc.state) {\n const before = cloneValue(doc.state);\n delete doc.state[name];\n if (Object.keys(doc.state).length === 0) {\n delete doc.state;\n }\n recordDocOp(setKeyPair([], \"state\", before, cloneValue(doc.state)));\n recordPatch({ key: \"state\", op: \"doc-meta\" });\n }\n}\n\n/**\n * @param {Tab} tab\n * @param {string} name\n * @param {Record<string, JsonValue>} updates\n */\nexport function mutateUpdateDef(tab: Tab, name: string, updates: Record<string, unknown>) {\n const doc = tab.doc.document;\n const stateBefore = cloneValue(doc.state);\n if (!doc.state) {\n doc.state = {};\n }\n const existing = doc.state[name];\n const entry: JxStateObject =\n existing == null\n ? {}\n : typeof existing !== \"object\" || Array.isArray(existing)\n ? { default: existing }\n : (existing as JxStateObject);\n doc.state[name] = entry;\n Object.assign(entry, updates);\n for (const k of Object.keys(entry)) {\n if (entry[k] === undefined || entry[k] === null) {\n delete entry[k];\n }\n }\n recordDocOp(setKeyPair([], \"state\", stateBefore, cloneValue(doc.state)));\n recordPatch({ key: \"state\", op: \"doc-meta\" });\n}\n\n/**\n * @param {Tab} tab\n * @param {string} oldName\n * @param {string} newName\n */\nexport function mutateRenameDef(tab: Tab, oldName: string, newName: string) {\n const doc = tab.doc.document;\n if (!doc.state || !doc.state[oldName]) {\n return;\n }\n const before = cloneValue(doc.state);\n doc.state[newName] = doc.state[oldName];\n delete doc.state[oldName];\n recordDocOp(setKeyPair([], \"state\", before, cloneValue(doc.state)));\n recordPatch({ key: \"state\", op: \"doc-meta\" });\n}\n\n/**\n * @param {Tab} tab\n * @param {string} name\n * @param {string | undefined} query\n */\nexport function mutateUpdateMedia(tab: Tab, name: string, query?: string | undefined) {\n const doc = tab.doc.document;\n const mediaBefore = cloneValue(doc.$media);\n if (!doc.$media) {\n doc.$media = {};\n }\n if (query === undefined || query === \"\") {\n delete doc.$media[name];\n if (Object.keys(doc.$media).length === 0) {\n delete doc.$media;\n }\n } else {\n doc.$media[name] = query;\n }\n recordDocOp(setKeyPair([], \"$media\", mediaBefore, cloneValue(doc.$media)));\n recordPatch({ key: \"$media\", op: \"doc-meta\" });\n}\n\n/**\n * @param {Tab} tab\n * @param {JxPath} path\n * @param {string} propName\n * @param {JsonValue} value\n */\nexport function mutateUpdateProp(tab: Tab, path: JxPath, propName: string, value: JsonValue) {\n const node = getNodeAtPath(tab.doc.document, path);\n const propsBefore = cloneValue(node.$props);\n if (!node.$props) {\n node.$props = {};\n }\n if (value === undefined || value === null || value === \"\") {\n delete node.$props[propName];\n } else {\n node.$props[propName] = value;\n }\n if (Object.keys(node.$props).length === 0) {\n delete node.$props;\n }\n recordDocOp(setKeyPair(path, \"$props\", propsBefore, cloneValue(node.$props)));\n recordPatch({ op: \"replace\", path });\n}\n\n/**\n * @param {Tab} tab\n * @param {JxPath} path\n * @param {string} caseName\n * @param {JxMutableNode} [caseDef]\n */\nexport function mutateAddSwitchCase(\n tab: Tab,\n path: JxPath,\n caseName: string,\n caseDef?: JxMutableNode,\n) {\n const node = getNodeAtPath(tab.doc.document, path);\n const before = cloneValue(node.cases);\n if (!node.cases) {\n node.cases = {};\n }\n node.cases[caseName] = caseDef || { tagName: \"div\", textContent: caseName };\n recordDocOp(setKeyPair(path, \"cases\", before, cloneValue(node.cases)));\n recordPatch({ op: \"replace\", path });\n}\n\n/**\n * @param {Tab} tab\n * @param {JxPath} path\n * @param {string} caseName\n */\nexport function mutateRemoveSwitchCase(tab: Tab, path: JxPath, caseName: string) {\n const node = getNodeAtPath(tab.doc.document, path);\n if (node.cases) {\n const before = cloneValue(node.cases);\n delete node.cases[caseName];\n recordDocOp(setKeyPair(path, \"cases\", before, cloneValue(node.cases)));\n recordPatch({ op: \"replace\", path });\n }\n}\n\n/**\n * @param {Tab} tab\n * @param {JxPath} path\n * @param {string} oldName\n * @param {string} newName\n */\nexport function mutateRenameSwitchCase(tab: Tab, path: JxPath, oldName: string, newName: string) {\n const node = getNodeAtPath(tab.doc.document, path);\n if (!node.cases || !node.cases[oldName]) {\n return;\n }\n const before = cloneValue(node.cases);\n node.cases[newName] = node.cases[oldName];\n delete node.cases[oldName];\n recordDocOp(setKeyPair(path, \"cases\", before, cloneValue(node.cases)));\n recordPatch({ op: \"replace\", path });\n}\n\n// ─── Frontmatter ─────────────────────────────────────────────────────────────\n\n/**\n * Update a frontmatter field on a tab. Does not push document history.\n *\n * @param {Tab} tab\n * @param {string} field\n * @param {JsonValue} value\n */\nexport function mutateUpdateFrontmatter(tab: Tab, field: string, value?: JsonValue) {\n const fm = tab.doc.content.frontmatter;\n const before = Object.hasOwn(fm, field) ? cloneValue(fm[field]) : undefined;\n const deletes = value === undefined || value === null || value === \"\";\n if (deletes) {\n delete fm[field];\n } else {\n fm[field] = value;\n }\n const after = deletes ? undefined : cloneValue(value);\n recordFmOp({ after, before, field });\n tab.doc.dirty = true;\n}\n\n/**\n * Restore a frontmatter key to a recorded history state: `undefined` means the key was absent.\n * Unlike `mutateUpdateFrontmatter`, values like `\"\"`/`false`/`null` are written verbatim (source\n * round-trips can put them there) and no fm op is recorded — history replay must not re-record.\n */\nfunction applyFmState(tab: Tab, field: string, value: unknown) {\n if (value === undefined) {\n delete tab.doc.content.frontmatter[field];\n } else {\n tab.doc.content.frontmatter[field] = value;\n }\n}\n",
12
- "/**\n * Reactive per-tab collab state, kept OUTSIDE the Tab type: UI reads it through collabState(tab),\n * and non-collab builds never touch it. The path registry answers \"is this file co-edited?\" for the\n * fs-sync/reload guards without importing the session machinery.\n */\n\nimport { reactive, toRaw } from \"../reactivity\";\nimport type { Tab } from \"../tabs/tab\";\nimport type { CollabAwarenessState } from \"@jxsuite/collab/awareness-types\";\n\nexport type CollabTabStatus = \"detached\" | \"connecting\" | \"synced\" | \"offline\";\n\nexport interface PeerPresence {\n clientId: number;\n state: CollabAwarenessState;\n}\n\nexport interface TabCollabState {\n status: CollabTabStatus;\n /** True once a session is attached and past its initial sync. */\n active: boolean;\n readOnly: boolean;\n /** Other clients' awareness states (this project connection, all docs). */\n peers: PeerPresence[];\n /**\n * True while source holds the canonical lock (someone is co-editing the code view): structural\n * surfaces soft-freeze and the canvas previews the source reconciler's parses.\n */\n sourceCanonical: boolean;\n}\n\nconst states = new WeakMap<Tab, TabCollabState>();\nconst attachedPaths = new Map<string, number>();\n\nexport function collabState(tab: Tab): TabCollabState {\n // Key on the raw tab: writers (the collab session, via ensureCollab's raw tab) and readers\n // (toolbar/tab-strip, via reactive `workspace.tabs.get` proxies) must resolve the same entry.\n const key = toRaw(tab as unknown as object) as Tab;\n let state = states.get(key);\n if (!state) {\n state = reactive({\n active: false,\n peers: [],\n readOnly: false,\n sourceCanonical: false,\n status: \"detached\",\n }) as TabCollabState;\n states.set(key, state);\n }\n return state;\n}\n\nexport function isCollabActive(tab: Tab): boolean {\n return states.get(tab)?.active === true;\n}\n\n/** Track which project-relative paths have live sessions (fs-event/reload suppression). */\nexport function registerCollabPath(path: string): void {\n attachedPaths.set(path, (attachedPaths.get(path) ?? 0) + 1);\n}\n\nexport function unregisterCollabPath(path: string): void {\n const count = attachedPaths.get(path) ?? 0;\n if (count <= 1) {\n attachedPaths.delete(path);\n } else {\n attachedPaths.set(path, count - 1);\n }\n}\n\n/** True while some tab co-edits this path — its Y.Doc is ahead of any provider write-back. */\nexport function isCollabPath(path: string): boolean {\n return attachedPaths.has(path.replaceAll(\"\\\\\", \"/\"));\n}\n",
13
- "/**\n * CollabSession — the bridge between a tab's transactional document and a shared Y.Doc obtained\n * from `platform.collab(docPath)`.\n *\n * Outbound: the transact observer publishes every local transaction's forward JxDocOps into the Y\n * structure tree (un-instrumented and bypass writes reconcile by diff — the Y.Doc doubles as the\n * before-image). Inbound: remote Y transactions convert back into JxDocOps and replay through\n * `applyExternalDocOps`, riding the surgical canvas patcher; unconvertible shapes hard-reconcile\n * the tab from the Y tree. Undo becomes a local-origin-scoped Y.UndoManager registered as the tab's\n * history delegate.\n *\n * Saving is EXPLICIT even while attached: syncing edits to peers (the Y.Doc) is automatic, but\n * folding the shared source to disk is not. Local edits mark `tab.doc.dirty` immediately for\n * instant Save-button feedback; the room-level, server-authoritative unsaved state then arrives via\n * `handle.onDirty` (any peer's edit dirties the room for everyone; a save clears it for everyone).\n * Cmd+S / Save runs a serialize→mirror→flush, and the provider broadcasts the room clean once the\n * write lands.\n *\n * All yjs code sits behind a dynamic import: the unsplit bundle inlines the bytes, but module\n * evaluation defers until a collab session actually attaches.\n */\n\nimport { effect, onScopeDispose, toRaw } from \"../reactivity\";\nimport { getPlatform } from \"../platform\";\nimport { jsonClone } from \"../utils/studio-utils\";\nimport {\n applyExternalDocOps,\n isBatching,\n setBatchEndNotifier,\n setHistoryDelegate,\n setTransactGate,\n setTransactObserver,\n transactDoc,\n} from \"../tabs/transact\";\nimport type { TransactOrigin } from \"../tabs/transact\";\nimport type { TransactionRecord } from \"../tabs/patch-ops\";\nimport type { Tab } from \"../tabs/tab\";\nimport type { JxDocOp } from \"@jxsuite/collab/ops\";\nimport type { CollabHandle } from \"@jxsuite/collab/provider\";\nimport type { JxMutableNode } from \"@jxsuite/schema/types\";\nimport type * as CollabNS from \"@jxsuite/collab\";\nimport { collabState, registerCollabPath, unregisterCollabPath } from \"./collab-state\";\n\ntype CollabModule = typeof CollabNS;\n\n/** How long the initial sync may take before falling back to solo editing. */\nconst SYNC_TIMEOUT_MS = 8000;\n/** Debounce for the elected reconciler's structure→source mirror. */\nconst MIRROR_DEBOUNCE_MS = 800;\n\n/**\n * The longest the shared source text may lag behind local edits while typing continues.\n *\n * The debounce above is re-armed on EVERY transaction, so any commit cadence faster than it starves\n * the mirror completely — and the canvas now commits on a ~500ms typing pause. Without a ceiling,\n * sustained writing would leave the source Y.Text (what peers preview and what providers persist)\n * frozen for the whole session. This bounds the lag instead: the debounce still coalesces bursts,\n * but a mirror is forced once the text is this stale.\n */\nconst MIRROR_MAX_LAG_MS = 2500;\n\nlet collabModulePromise: Promise<CollabModule> | null = null;\n\nfunction loadCollab(): Promise<CollabModule> {\n collabModulePromise ??= import(\"@jxsuite/collab\");\n return collabModulePromise;\n}\n\n/** Tabs can open before any platform registers (headless tests); collab simply stays off. */\nfunction maybePlatform(): ReturnType<typeof getPlatform> | null {\n try {\n return getPlatform();\n } catch {\n return null;\n }\n}\n\n/** Serializer injected at studio init (file-ops' serializeDocument); avoids an import cycle. */\nlet _serialize: ((tab: Tab) => Promise<string>) | null = null;\n\nexport function configureCollabSerializer(fn: ((tab: Tab) => Promise<string>) | null): void {\n _serialize = fn;\n}\n\n/** Parser injected at studio init (file-ops' parseSourceForPath) for the source reconciler. */\nexport type CollabParser = (\n tab: Tab,\n text: string,\n) => Promise<{ document: JxMutableNode; frontmatter?: Record<string, unknown> }>;\n\nlet _parse: CollabParser | null = null;\n\nexport function configureCollabParser(fn: CollabParser | null): void {\n _parse = fn;\n}\n\n/** Status-message sink injected at studio init (a direct statusbar import would cycle). */\nlet _notify: (message: string) => void = () => {};\n\nexport function configureCollabNotifier(fn: ((message: string) => void) | null): void {\n _notify = fn ?? (() => {});\n}\n\ninterface ActiveSession {\n tab: Tab;\n path: string;\n handle: CollabHandle;\n collab: CollabModule;\n undoManager: InstanceType<CollabModule[\"UndoManager\"]> | null;\n /** The last document root reference produced through transactDoc (bypass-write detection). */\n lastSeenRef: object | null;\n /** Buffered forward ops while an AI batch runs; null outside batches. */\n batchOps: JxDocOp[] | null;\n batchNeedsDiff: boolean;\n /** Guards the frontmatter watcher against echoing remote-applied fields. */\n applyingRemoteFrontmatter: boolean;\n synced: boolean;\n canWrite: boolean;\n /** True while THIS client is in the code view (its structural freeze exempts itself). */\n inSourceMode: boolean;\n mirrorTimer: ReturnType<typeof setTimeout> | null;\n /** When the shared source text was last brought up to date; bounds the debounce's max lag. */\n lastMirrorAt?: number;\n /** Debounce for the source reconciler's Y.Text → structure parse mirror. */\n sourceParseTimer: ReturnType<typeof setTimeout> | null;\n disposers: (() => void)[];\n}\n\ninterface TabRuntime {\n watcherInstalled: boolean;\n /** Bumped on every detach; in-flight attaches abandon when it moves. */\n generation: number;\n session: ActiveSession | null;\n attaching: Promise<void> | null;\n}\n\nconst runtimes = new WeakMap<Tab, TabRuntime>();\n\n/** Callers hold either the raw tab or a reactive proxy of it; key runtimes by the raw object. */\nfunction rawTab(tab: Tab): Tab {\n return toRaw(tab as unknown as object) as Tab;\n}\n\nfunction runtimeOf(tab: Tab): TabRuntime | undefined {\n return runtimes.get(rawTab(tab));\n}\n\nfunction runtimeFor(tab: Tab): TabRuntime {\n const key = rawTab(tab);\n let runtime = runtimes.get(key);\n if (!runtime) {\n runtime = { attaching: null, generation: 0, session: null, watcherInstalled: false };\n runtimes.set(key, runtime);\n }\n return runtime;\n}\n\n// ─── Global transact hooks (installed once; no-ops for unattached tabs) ──────\n\nlet hooksInstalled = false;\n\nfunction installGlobalHooks(): void {\n if (hooksInstalled) {\n return;\n }\n hooksInstalled = true;\n setTransactObserver(onTransact);\n setBatchEndNotifier(onBatchEnd);\n // Soft-freeze structural editing while a peer holds source-canonical (remote origins pass —\n // They ARE the reconciler's mirror of the frozen representation).\n setTransactGate((tab) => {\n const session = runtimeOf(tab)?.session;\n if (session?.synced && collabState(tab).sourceCanonical && !session.inSourceMode) {\n _notify(\"Source editing in progress — structural edits are paused\");\n return \"source-canonical\";\n }\n return null;\n });\n}\n\n/** Test hook: uninstall global observers and forget module state. */\nexport function resetCollabForTests(): void {\n hooksInstalled = false;\n setTransactObserver(null);\n setBatchEndNotifier(null);\n setTransactGate(null);\n _serialize = null;\n _parse = null;\n _notify = () => {};\n}\n\nfunction onTransact(tab: Tab, record: TransactionRecord, origin: TransactOrigin): void {\n const session = runtimeOf(tab)?.session;\n if (!session || !session.synced) {\n return;\n }\n session.lastSeenRef = toRaw(tab.doc.document) as object;\n if (origin === \"remote\") {\n // The reconciler keeps source text fresh regardless of WHO edited the structure. The tab's\n // Dirty state is driven by the server's room-level `doc-dirty` broadcast (see onDirty in\n // CreateSession), not forced here.\n scheduleMirror(session);\n return;\n }\n if (session.canWrite) {\n publishRecord(session, record);\n scheduleMirror(session);\n }\n // Local edits leave the tab dirty (transactDoc already set it) until an explicit save flushes and\n // The provider broadcasts the room clean.\n}\n\nfunction onBatchEnd(tab: Tab): void {\n const session = runtimeOf(tab)?.session;\n if (!session?.synced || session.batchOps === null) {\n return;\n }\n const ops = session.batchOps;\n const needsDiff = session.batchNeedsDiff;\n session.batchOps = null;\n session.batchNeedsDiff = false;\n if (!session.canWrite) {\n return;\n }\n // One Y transaction — one wire message, one undo step for the whole AI run.\n session.undoManager?.stopCapturing();\n if (needsDiff) {\n publishDiff(session);\n } else if (ops.length > 0) {\n try {\n session.collab.applyDocOpsToY(session.handle.doc, ops, session.collab.LOCAL_ORIGIN);\n } catch {\n publishDiff(session);\n }\n }\n session.undoManager?.stopCapturing();\n}\n\nfunction publishRecord(session: ActiveSession, record: TransactionRecord): void {\n const forward = record.docOps.map((pair) => pair.forward);\n if (isBatching()) {\n session.batchOps ??= [];\n if (forward.length === 0) {\n session.batchNeedsDiff = true;\n } else {\n session.batchOps.push(...forward);\n }\n return;\n }\n if (forward.length === 0) {\n // Un-instrumented mutation: the Y tree is the last-synced before-image — diff against it.\n publishDiff(session);\n return;\n }\n try {\n session.collab.applyDocOpsToY(session.handle.doc, forward, session.collab.LOCAL_ORIGIN);\n } catch {\n publishDiff(session);\n }\n}\n\n/** Make the Y structure tree match the tab's document (diff when possible, hard replace beyond). */\nfunction publishDiff(session: ActiveSession): void {\n const { collab, handle, tab } = session;\n const before = collab.yDocToJson(handle.doc);\n const after = jsonClone(toRaw(tab.doc.document)) as JxMutableNode;\n const ops = collab.diffDocs(before, after);\n if (ops === null) {\n collab.replaceYStructure(handle.doc, after, collab.LOCAL_ORIGIN);\n } else if (ops.length > 0) {\n try {\n collab.applyDocOpsToY(handle.doc, ops, collab.LOCAL_ORIGIN);\n } catch {\n collab.replaceYStructure(handle.doc, after, collab.LOCAL_ORIGIN);\n }\n }\n}\n\n/** Replace the tab document in place from the Y tree (remote origin, full-render fallback). */\nfunction reconcileTabFromY(session: ActiveSession): void {\n const next = session.collab.yDocToJson(session.handle.doc);\n transactDoc(\n session.tab,\n (t) => {\n const target = t.doc.document as Record<string, unknown>;\n for (const key of Object.keys(target)) {\n if (!(key in next)) {\n delete target[key];\n }\n }\n Object.assign(target, next);\n },\n { origin: \"remote\", skipHistory: true },\n );\n}\n\n// ─── Source mirror (Phase A: canonical is always \"structure\") ────────────────\n\n/** The elected reconciler: lowest write-capable clientID keeps source Y.Text fresh. */\nfunction isReconciler(session: ActiveSession): boolean {\n if (!session.canWrite) {\n return false;\n }\n const { awareness } = session.handle;\n let lowest = awareness.clientID;\n for (const [clientId, state] of awareness.getStates()) {\n if ((state as { canWrite?: boolean }).canWrite !== false && clientId < lowest) {\n lowest = clientId;\n }\n }\n return lowest === session.handle.awareness.clientID;\n}\n\nfunction scheduleMirror(session: ActiveSession): void {\n if (!_serialize || !isReconciler(session)) {\n return;\n }\n // While source holds the canonical lock, mirroring runs the OTHER way (parse, not serialize).\n if (session.collab.canonicalOf(session.handle.doc) === \"source\") {\n return;\n }\n // Re-arming on every transaction means a faster commit cadence would push the mirror out\n // Forever. Once the shared text is MIRROR_MAX_LAG_MS stale, stop deferring and mirror now.\n const now = Date.now();\n session.lastMirrorAt ??= now;\n if (now - session.lastMirrorAt >= MIRROR_MAX_LAG_MS) {\n if (session.mirrorTimer) {\n clearTimeout(session.mirrorTimer);\n session.mirrorTimer = null;\n }\n session.lastMirrorAt = now;\n void mirrorNow(session);\n return;\n }\n if (session.mirrorTimer) {\n clearTimeout(session.mirrorTimer);\n }\n session.mirrorTimer = setTimeout(() => {\n session.mirrorTimer = null;\n session.lastMirrorAt = Date.now();\n void mirrorNow(session);\n }, MIRROR_DEBOUNCE_MS);\n}\n\n/** Serialize the tab and fold the text into source Y.Text (what providers persist and commit). */\nasync function mirrorNow(session: ActiveSession): Promise<void> {\n if (!_serialize || !session.synced) {\n return;\n }\n try {\n const text = await _serialize(session.tab);\n session.collab.updateSourceText(session.handle.doc, text, session.collab.MIRROR_ORIGIN);\n } catch {\n // Serialization failures leave the previous mirror in place; the next edit retries.\n }\n}\n\n// ─── Save ─────────────────────────────────────────────────────────────────────\n\n/** Parse the shared source text back into the structure tree (the source reconciler's duty). */\nasync function sourceParseNow(session: ActiveSession): Promise<void> {\n if (!_parse || !session.synced || !session.canWrite) {\n return;\n }\n const { collab, handle, tab } = session;\n const rev = collab.canonicalRevOf(handle.doc);\n const text = collab.sourceText(handle.doc).toString();\n let parsed: Awaited<ReturnType<CollabParser>>;\n try {\n parsed = await _parse(tab, text);\n } catch {\n // Unparseable source: keep the last good structure (the preview goes stale, not wrong).\n return;\n }\n if (!session.synced || collab.canonicalRevOf(handle.doc) !== rev) {\n // The lock flipped while parsing; this mirror was computed against a dead representation.\n return;\n }\n const ops = collab.diffDocs(collab.yDocToJson(handle.doc), parsed.document);\n if (ops === null) {\n collab.replaceYStructure(handle.doc, parsed.document, collab.MIRROR_ORIGIN);\n } else if (ops.length > 0) {\n try {\n collab.applyDocOpsToY(handle.doc, ops, collab.MIRROR_ORIGIN);\n } catch {\n collab.replaceYStructure(handle.doc, parsed.document, collab.MIRROR_ORIGIN);\n }\n }\n const frontmatter = collab.frontmatterMap(handle.doc);\n const next = parsed.frontmatter ?? {};\n handle.doc.transact(() => {\n // Detached copy: keys are deleted while iterating.\n const sharedKeys = [...frontmatter.keys()];\n for (const key of sharedKeys) {\n if (!(key in next)) {\n frontmatter.delete(key);\n }\n }\n for (const [key, value] of Object.entries(next)) {\n if (!collab.deepEqual(frontmatter.get(key), value)) {\n frontmatter.set(key, value);\n }\n }\n }, collab.MIRROR_ORIGIN);\n}\n\n/**\n * The code view's co-editing surface for a tab, or null when the tab isn't in a synced session.\n * `enter()` flips the canonical lock to source (seeding the text from the flipper's serialization);\n * `leave()` reverts to structure-canonical when the last source editor departs. `text` is the real\n * Y.Text and `awareness` the connection's Awareness — exactly what y-monaco's MonacoBinding\n * consumes (it owns the awareness `selection` field while bound).\n */\nexport function collabSourceContext(tab: Tab): {\n text: unknown;\n awareness: CollabHandle[\"awareness\"];\n localOrigin: unknown;\n readOnly: boolean;\n enter: () => Promise<void>;\n leave: () => void;\n} | null {\n const session = runtimeOf(tab)?.session;\n if (!session?.synced) {\n return null;\n }\n const { collab, handle } = session;\n return {\n awareness: handle.awareness,\n enter: async () => {\n session.inSourceMode = true;\n const local = handle.awareness.getLocalState();\n if (local) {\n handle.awareness.setLocalState({ ...local, mode: \"source\" });\n }\n if (!session.canWrite) {\n return;\n }\n let serialized: string | null = null;\n if (_serialize) {\n try {\n serialized = await _serialize(tab);\n } catch {\n serialized = null;\n }\n }\n collab.acquireSourceCanonical(\n handle.doc,\n serialized ?? collab.sourceText(handle.doc).toString(),\n collab.LOCAL_ORIGIN,\n );\n },\n leave: () => {\n session.inSourceMode = false;\n const local = handle.awareness.getLocalState();\n if (local) {\n handle.awareness.setLocalState({ ...local, mode: \"structure\" });\n }\n if (!session.canWrite) {\n return;\n }\n const others = collab.otherSourceEditors(\n handle.awareness,\n session.path,\n handle.awareness.clientID,\n );\n if (others.length === 0) {\n // Freshen the structure mirror once more, then hand the lock back.\n void sourceParseNow(session).then(() => {\n collab.releaseSourceCanonical(handle.doc, collab.LOCAL_ORIGIN);\n });\n }\n },\n localOrigin: collab.LOCAL_ORIGIN,\n readOnly: !session.canWrite,\n text: collab.sourceText(handle.doc),\n };\n}\n\n/**\n * Cmd+S for a collab tab: refresh the source mirror and ask the provider to persist now. Returns\n * false when the tab has no active session (caller saves through the file path as usual).\n */\nexport async function collabSave(tab: Tab): Promise<boolean> {\n const session = runtimeOf(tab)?.session;\n if (!session?.synced) {\n return false;\n }\n if (session.mirrorTimer) {\n clearTimeout(session.mirrorTimer);\n session.mirrorTimer = null;\n }\n if (session.canWrite) {\n await mirrorNow(session);\n }\n await session.handle.flush();\n return true;\n}\n\n/** Refresh mirrors and flush every active session (call before commits). */\nexport async function flushAllCollab(): Promise<void> {\n for (const tab of liveTabs) {\n const session = runtimeOf(tab)?.session;\n if (session?.synced) {\n await collabSave(tab);\n }\n }\n}\n\n// ─── Attach / detach ─────────────────────────────────────────────────────────\n\n/** Tabs with installed watchers (module-scoped so flushAllCollab can walk them). */\nconst liveTabs = new Set<Tab>();\n\n/**\n * Idempotently wire collaboration for a tab. Installs a per-tab watcher that attaches a session for\n * the tab's file while it is at the top of its document stack, detaches while drilled into a\n * component, and tears everything down when the tab's scope is disposed.\n */\nexport function ensureCollab(tab: Tab): void {\n const platform = maybePlatform();\n if (!platform?.collab || !tab.documentPath) {\n return;\n }\n const runtime = runtimeFor(tab);\n if (runtime.watcherInstalled) {\n return;\n }\n runtime.watcherInstalled = true;\n installGlobalHooks();\n liveTabs.add(tab);\n tab.scope.run(() => {\n effect(() => {\n const drilled = (tab.session.documentStack?.length ?? 0) > 0;\n if (drilled) {\n detachSession(tab);\n } else {\n void attachSession(tab);\n }\n });\n onScopeDispose(() => {\n liveTabs.delete(tab);\n detachSession(tab);\n });\n });\n}\n\n/** Re-key after a file rename: tear down and re-attach against the new path. */\nexport function rekeyCollab(tab: Tab): void {\n const runtime = runtimeOf(tab);\n if (!runtime?.watcherInstalled) {\n ensureCollab(tab);\n return;\n }\n detachSession(tab);\n void attachSession(tab);\n}\n\nasync function attachSession(tab: Tab): Promise<void> {\n const runtime = runtimeFor(tab);\n if (runtime.session || runtime.attaching) {\n return;\n }\n const { documentPath: path } = tab;\n const platform = maybePlatform();\n if (!path || !platform?.collab) {\n return;\n }\n const { generation } = runtime;\n const state = collabState(tab);\n state.status = \"connecting\";\n const attempt = (async () => {\n try {\n const [collab, handle] = await Promise.all([loadCollab(), platform.collab!(path)]);\n if (!handle) {\n state.status = \"detached\";\n return;\n }\n if (runtime.generation !== generation) {\n handle.destroy();\n return;\n }\n let timer: ReturnType<typeof setTimeout> | null = null;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(\"collab-sync-timeout\")), SYNC_TIMEOUT_MS);\n });\n try {\n await Promise.race([handle.whenSynced, timeout]);\n } finally {\n if (timer) {\n clearTimeout(timer);\n }\n }\n if (runtime.generation !== generation) {\n handle.destroy();\n return;\n }\n runtime.session = createSession(tab, path, collab, handle);\n state.active = true;\n state.status = \"synced\";\n state.readOnly = !runtime.session.canWrite;\n registerCollabPath(path);\n } catch {\n state.status = \"detached\";\n state.active = false;\n } finally {\n runtime.attaching = null;\n }\n })();\n runtime.attaching = attempt;\n await attempt;\n}\n\nfunction detachSession(tab: Tab): void {\n const runtime = runtimeOf(tab);\n if (!runtime) {\n return;\n }\n runtime.generation += 1;\n const { session } = runtime;\n runtime.session = null;\n const state = collabState(tab);\n state.active = false;\n state.status = \"detached\";\n state.peers = [];\n if (!session) {\n return;\n }\n unregisterCollabPath(session.path);\n if (session.mirrorTimer) {\n clearTimeout(session.mirrorTimer);\n }\n if (session.sourceParseTimer) {\n clearTimeout(session.sourceParseTimer);\n }\n for (const dispose of session.disposers) {\n try {\n dispose();\n } catch {\n // Disposal is best-effort; the handle teardown below is what matters.\n }\n }\n setHistoryDelegate(tab, null);\n // Re-base the op-log history on the current document for solo editing.\n tab.history.snapshots = [\n {\n document: jsonClone(toRaw(tab.doc.document)) as Record<string, unknown>,\n selection: tab.session.selection ? [...tab.session.selection] : null,\n },\n ];\n tab.history.index = 0;\n session.undoManager?.destroy();\n session.handle.destroy();\n}\n\nfunction createSession(\n tab: Tab,\n path: string,\n collab: CollabModule,\n handle: CollabHandle,\n): ActiveSession {\n const identity = handle.identity();\n const session: ActiveSession = {\n applyingRemoteFrontmatter: false,\n batchNeedsDiff: false,\n batchOps: null,\n canWrite: identity ? identity.permission !== \"read\" : true,\n collab,\n disposers: [],\n handle,\n inSourceMode: false,\n lastSeenRef: toRaw(tab.doc.document) as object,\n mirrorTimer: null,\n path,\n sourceParseTimer: null,\n synced: false,\n tab,\n undoManager: null,\n };\n\n // Initial reconcile: first client seeds structure from the parsed doc; later clients adopt the\n // Shared tree when it differs from their local parse.\n const meta = collab.metaMap(handle.doc);\n if (meta.get(\"structureSeeded\") === true) {\n const yJson = collab.yDocToJson(handle.doc);\n const tabJson = jsonClone(toRaw(tab.doc.document)) as JxMutableNode;\n if (!collab.deepEqual(yJson, tabJson)) {\n const ops = collab.diffDocs(tabJson, yJson);\n if (ops === null) {\n session.synced = true;\n reconcileTabFromY(session);\n session.synced = false;\n } else if (ops.length > 0) {\n applyExternalDocOps(tab, ops);\n }\n }\n session.applyingRemoteFrontmatter = true;\n const sharedFrontmatter = collab.frontmatterMap(handle.doc);\n for (const [key, value] of sharedFrontmatter.entries()) {\n tab.doc.content.frontmatter[key] = value as never;\n }\n session.applyingRemoteFrontmatter = false;\n } else if (session.canWrite) {\n collab.seedStructure(handle.doc, jsonClone(toRaw(tab.doc.document)) as JxMutableNode, {\n frontmatter: jsonClone(toRaw(tab.doc.content.frontmatter)),\n origin: collab.SEED_ORIGIN,\n sourceFormat: tab.doc.sourceFormat,\n });\n }\n session.lastSeenRef = toRaw(tab.doc.document) as object;\n\n // The server owns the room-level unsaved state: `onDirty` fires synchronously with the current\n // Value on subscribe (delivered during the open handshake), so attaching to a clean room clears\n // Any dirty the initial reconcile set, and attaching to an already-dirty room shows dirty.\n session.disposers.push(\n handle.onDirty((dirty) => {\n tab.doc.dirty = dirty;\n }),\n );\n\n // Presence identity + write capability (drives reconciler election).\n handle.awareness.setLocalState({\n canWrite: session.canWrite,\n focusedPath: path,\n structuralSelection: null,\n user: identity\n ? {\n avatarUrl: identity.avatarUrl,\n color: identity.color,\n login: identity.login,\n name: identity.name,\n }\n : {\n color: collab.colorForKey(String(handle.awareness.clientID)),\n login: `guest-${handle.awareness.clientID % 1000}`,\n },\n });\n\n // Undo: local-origin-scoped Y.UndoManager replaces the op-log while attached.\n const undoManager = new collab.UndoManager(\n [collab.structureMap(handle.doc), collab.frontmatterMap(handle.doc)],\n { trackedOrigins: new Set([collab.LOCAL_ORIGIN]) },\n );\n session.undoManager = undoManager;\n const onStackAdd = ({ stackItem }: { stackItem: { meta: Map<unknown, unknown> } }) => {\n stackItem.meta.set(\"selection\", tab.session.selection ? [...tab.session.selection] : null);\n };\n const onStackPop = ({ stackItem }: { stackItem: { meta: Map<unknown, unknown> } }) => {\n const selection = stackItem.meta.get(\"selection\") as (string | number)[] | null | undefined;\n tab.session.selection = selection ? [...selection] : null;\n };\n undoManager.on(\"stack-item-added\", onStackAdd);\n undoManager.on(\"stack-item-popped\", onStackPop);\n session.disposers.push(() => {\n undoManager.off(\"stack-item-added\", onStackAdd);\n undoManager.off(\"stack-item-popped\", onStackPop);\n });\n setHistoryDelegate(tab, {\n canRedo: () => undoManager.canRedo(),\n canUndo: () => undoManager.canUndo(),\n redo: () => {\n undoManager.redo();\n },\n undo: () => {\n undoManager.undo();\n },\n });\n\n // Inbound: remote structure transactions → JxDocOps → the surgical pipeline.\n const structure = collab.structureMap(handle.doc);\n const structureObserver = (events: unknown, transaction: { origin: unknown }) => {\n if (transaction.origin === collab.LOCAL_ORIGIN || !session.synced) {\n return;\n }\n const ops = collab.yEventsToDocOps(events as never);\n if (ops === null) {\n reconcileTabFromY(session);\n return;\n }\n if (ops.length === 0) {\n return;\n }\n try {\n applyExternalDocOps(tab, ops);\n } catch {\n reconcileTabFromY(session);\n }\n };\n structure.observeDeep(structureObserver);\n session.disposers.push(() => structure.unobserveDeep(structureObserver));\n\n // The canonical-representation lock: while source holds it, structural surfaces soft-freeze\n // (Transact gate) and the source reconciler's parses arrive as MIRROR-origin structure changes.\n const tabState = collabState(tab);\n tabState.sourceCanonical = collab.canonicalOf(handle.doc) === \"source\";\n const lockMeta = collab.metaMap(handle.doc);\n const lockObserver = () => {\n tabState.sourceCanonical = collab.canonicalOf(handle.doc) === \"source\";\n };\n lockMeta.observe(lockObserver);\n session.disposers.push(() => lockMeta.unobserve(lockObserver));\n\n // The source reconciler (lowest write clientID in source mode) parses Y.Text back into the\n // Structure tree on a debounce, so every client's canvas previews source edits live.\n const source = collab.sourceText(handle.doc);\n const sourceObserver = (_event: unknown, transaction: { origin: unknown }) => {\n if (transaction.origin === collab.MIRROR_ORIGIN || !session.synced) {\n return;\n }\n if (collab.canonicalOf(handle.doc) !== \"source\") {\n return;\n }\n if (!collab.isSourceReconciler(handle.awareness, session.path)) {\n return;\n }\n if (session.sourceParseTimer) {\n clearTimeout(session.sourceParseTimer);\n }\n session.sourceParseTimer = setTimeout(() => {\n session.sourceParseTimer = null;\n void sourceParseNow(session);\n }, 600);\n };\n source.observe(sourceObserver as never);\n session.disposers.push(() => source.unobserve(sourceObserver as never));\n\n // Inbound frontmatter (per-field).\n const frontmatter = collab.frontmatterMap(handle.doc);\n const frontmatterObserver = (\n event: { changes: { keys: Map<string, { action: string }> }; target: unknown },\n transaction: { origin: unknown },\n ) => {\n if (transaction.origin === collab.LOCAL_ORIGIN || !session.synced) {\n return;\n }\n session.applyingRemoteFrontmatter = true;\n try {\n for (const [key, change] of event.changes.keys) {\n if (change.action === \"delete\") {\n delete tab.doc.content.frontmatter[key];\n } else {\n tab.doc.content.frontmatter[key] = frontmatter.get(key) as never;\n }\n }\n } finally {\n session.applyingRemoteFrontmatter = false;\n }\n };\n frontmatter.observe(frontmatterObserver as never);\n session.disposers.push(() => frontmatter.unobserve(frontmatterObserver as never));\n\n // Outbound frontmatter: mutateUpdateFrontmatter bypasses transactDoc, so watch the map deeply.\n tab.scope.run(() => {\n let lastJson = JSON.stringify(tab.doc.content.frontmatter);\n effect(() => {\n const json = JSON.stringify(tab.doc.content.frontmatter);\n if (json === lastJson) {\n return;\n }\n lastJson = json;\n if (session.applyingRemoteFrontmatter || !session.synced || !session.canWrite) {\n return;\n }\n const local = JSON.parse(json) as Record<string, unknown>;\n handle.doc.transact(() => {\n // Detached copy: keys are deleted while iterating.\n const sharedKeys = [...frontmatter.keys()];\n for (const key of sharedKeys) {\n if (!(key in local)) {\n frontmatter.delete(key);\n }\n }\n for (const [key, value] of Object.entries(local)) {\n if (!collab.deepEqual(frontmatter.get(key), value)) {\n frontmatter.set(key, value);\n }\n }\n }, collab.LOCAL_ORIGIN);\n scheduleMirror(session);\n });\n\n // Publish the local structural selection for remote canvas overlays (peers filter by\n // FocusedPath, so per-doc boxes come free from the one project-level awareness state). The\n // Plain `selection` field is y-monaco's (in-buffer text cursors) — never write it here.\n effect(() => {\n const structuralSelection = tab.session.selection ? [...tab.session.selection] : null;\n const local = handle.awareness.getLocalState();\n if (local) {\n handle.awareness.setLocalState({ ...local, structuralSelection });\n }\n });\n\n // Bypass-write net: any doc root swap that did not come through transactDoc (Monaco parse\n // Flush) reconciles by diff. Deferred one microtask so the transact observer marks its own\n // Refs first (the assignment happens mid-transaction, before the observer runs).\n effect(() => {\n const ref = toRaw(tab.doc.document) as object;\n queueMicrotask(() => {\n const current = runtimeOf(tab)?.session;\n if (current !== session || !session.synced || !session.canWrite) {\n return;\n }\n const nowRef = toRaw(tab.doc.document) as object;\n if (nowRef !== ref || nowRef === session.lastSeenRef) {\n return;\n }\n session.lastSeenRef = nowRef;\n publishDiff(session);\n scheduleMirror(session);\n // Dirty stays as the edit left it; the server's doc-dirty broadcast is authoritative.\n });\n });\n });\n\n // Presence roster + status.\n const state = collabState(tab);\n const awarenessObserver = () => {\n const peers: { clientId: number; state: never }[] = [];\n for (const [clientId, peerState] of handle.awareness.getStates()) {\n if (clientId !== handle.awareness.clientID && peerState[\"user\"]) {\n peers.push({ clientId, state: peerState as never });\n }\n }\n state.peers = peers;\n };\n awarenessObserver();\n handle.awareness.on(\"change\", awarenessObserver);\n session.disposers.push(\n () => handle.awareness.off(\"change\", awarenessObserver),\n handle.onStatus((status) => {\n if (status === \"offline\" || status === \"connecting\") {\n state.status = \"offline\";\n } else if (session.synced) {\n state.status = \"synced\";\n }\n }),\n handle.onReset(() => {\n // The server replaced this doc's history: drop the session and re-attach fresh.\n detachSession(tab);\n void attachSession(tab);\n }),\n );\n\n session.synced = true;\n return session;\n}\n",
14
- "/// <reference lib=\"dom\" />\nimport { effectScope, reactive } from \"../reactivity\";\nimport { formatByName, formatForPath } from \"../format/format-host\";\nimport { normalizeArrayChildren } from \"../state\";\nimport type {\n DocumentStackEntry,\n FormulaEditDef,\n FunctionEditDef,\n GitBranchesResult,\n GitDiffState,\n GitStatusResult,\n InlineEditDef,\n JsonValue,\n} from \"../types\";\nimport type { JxMutableNode } from \"@jxsuite/schema/types\";\nimport type { JxDocOp, JxFmOp } from \"./patch-ops\";\n\nexport interface TabUi {\n rightTab: string;\n canvasMode: string;\n /** Preview toggle — composes with an edit/design canvasMode; the effective mode becomes \"preview\". */\n preview: boolean;\n /** Show elements inherited from the page's layout (pages with an effective layout only). */\n showLayout: boolean;\n /** Above-canvas frontmatter Properties accordion expanded (content-collection docs, edit mode). */\n frontmatterOpen: boolean;\n /** Chosen literal values for dynamic route params (e.g. { sku: \"mini-trencher\" }). */\n previewParams: Record<string, string>;\n /**\n * Chosen test values for a component doc's props (state entries), seeded into the canvas render\n * so a non-instantiated component previews with real data (M6) — the previewParams mirror.\n */\n previewProps: Record<string, JsonValue> | null;\n zoom: number;\n /**\n * Edit-mode content zoom — browser-page-zoom semantics (content reflows at the zoomed effective\n * width while the canvas footprint stays fixed), unlike `zoom` which pan/zooms the whole canvas.\n */\n editZoom: number;\n activeMedia: string | null;\n activeSelector: string | null;\n editingFunction: FunctionEditDef | null;\n /** Full-screen formula workspace target ($expression editing); editingFunction wins if both set. */\n editingFormula: FormulaEditDef | null;\n featureToggles: Record<string, boolean>;\n /**\n * Canvas color-scheme preview: follow the OS (\"auto\") or force a scheme. Drives the\n * data-color-scheme attribute on the canvas iframe root (spec §9.5) and, in the style sidebar,\n * which scheme layer edits target.\n */\n previewColorScheme: \"auto\" | \"light\" | \"dark\";\n styleSections: Record<string, boolean>;\n inspectorSections: Record<string, boolean>;\n styleShorthands: Record<string, boolean>;\n styleFilter: string;\n styleFilterActive: boolean;\n stylebookSelection: string | null;\n stylebookTab: string;\n stylebookFilter: string;\n stylebookCustomizedOnly: boolean;\n settingsTab: string;\n gitStatus: GitStatusResult | null;\n gitBranches: GitBranchesResult | null;\n gitCommitMessage: string;\n gitLoading: boolean;\n gitError: string | null;\n gitDiffState: GitDiffState | null;\n pendingInlineEdit: InlineEditDef | null;\n}\n\n/**\n * A live (iframe-evaluated) expression preview retained per editing target (M6). Stored on\n * `session.canvas` beside `scope` — plain wire data (path-key → display-string pairs), rebuilt into\n * an ExpressionPreview by services/live-preview.ts on read.\n */\nexport interface StoredLivePreview {\n /** Serialized expression + context the values were computed for (staleness check). */\n key: string;\n values: [string, string][];\n error: string | null;\n}\n\ninterface HistorySnapshot {\n /** Full document at this state (checkpoint), or null when the ops describe the transition. */\n document: Record<string, unknown> | null;\n /** Selection after this state's transaction. */\n selection: (string | number)[] | null;\n /** Selection before this state's transaction (restored on surgical undo). */\n selectionBefore?: (string | number)[] | null;\n /** Replayable ops transforming the previous state into this one. */\n forwardOps?: JxDocOp[] | null;\n /** Replayable ops transforming this state back into the previous one. */\n inverseOps?: JxDocOp[] | null;\n /** Frontmatter key changes in this transaction (before/after values, replayed both ways). */\n fmOps?: JxFmOp[] | null;\n /**\n * Identifies a run of edits that undo as ONE step (successive text commits to the same block).\n *\n * Typing commits on every pause, so without coalescing a minute of writing would push dozens of\n * entries and evict every structural edit before it from the 100-entry ring — and ⌘Z would walk\n * back through the prose one pause at a time instead of undoing the edit.\n */\n coalesceKey?: string | null;\n}\n\nexport interface Tab {\n id: string;\n documentPath: string | null;\n fileHandle: FileSystemFileHandle | null;\n capabilities: { modes: string[] };\n scope: {\n stop: () => void;\n run: <T>(fn: () => T) => T | undefined;\n [k: string]: unknown;\n };\n doc: {\n document: JxMutableNode;\n content: { frontmatter: Record<string, unknown> };\n mode: string;\n sourceFormat: string | null;\n handlersSource: string | null;\n dirty: boolean;\n };\n session: {\n selection: (string | number)[] | null;\n hover: (string | number)[] | null;\n clipboard: JxMutableNode | null;\n documentStack: DocumentStackEntry[];\n ui: TabUi;\n canvas: {\n status: string;\n // A serializable snapshot of the iframe's resolved `$defs` (data-source values), posted over\n // The bridge as a `dataScope` message and read by the data-explorer panel. Plain data now —\n // The old live `EffectScope` (with `.stop()`) moved into the iframe realm with buildScope.\n scope: Record<string, unknown> | null;\n // Latest live (iframe-evaluated) expression previews keyed by editing-target id, stored\n // Beside `scope` the same way (services/live-preview.ts owns reads/writes).\n livePreviews: Record<string, StoredLivePreview> | null;\n error: string | null;\n pendingInlineEdit: InlineEditDef | null;\n };\n };\n history: {\n snapshots: HistorySnapshot[];\n index: number;\n };\n}\n\n/**\n * @param {string} canvasMode — initial canvas mode (the tab's first allowed mode)\n * @param {boolean} preview — initial preview-toggle state\n * @returns {TabUi}\n */\nfunction createDefaultUi(canvasMode: string, preview = false) {\n return {\n activeMedia: null,\n activeSelector: null,\n canvasMode,\n editZoom: 1,\n editingFormula: null,\n editingFunction: null,\n featureToggles: {},\n frontmatterOpen: true,\n gitBranches: null,\n gitCommitMessage: \"\",\n gitDiffState: null,\n gitError: null,\n gitLoading: false,\n gitStatus: null,\n inspectorSections: {},\n pendingInlineEdit: null,\n preview,\n previewColorScheme: \"auto\" as const,\n previewParams: {},\n previewProps: null,\n rightTab: \"properties\",\n settingsTab: \"stylebook\",\n showLayout: true,\n styleFilter: \"\",\n styleFilterActive: false,\n styleSections: {},\n styleShorthands: {},\n stylebookCustomizedOnly: false,\n stylebookFilter: \"\",\n stylebookSelection: null,\n stylebookTab: \"elements\",\n zoom: 1,\n };\n}\n\nconst ALL_MODES = [\"edit\", \"design\", \"preview\", \"source\", \"stylebook\"];\n\n/**\n * Create a new tab with reactive doc/session/history trees, owned by an effectScope.\n *\n * @param {{\n * id: string;\n * documentPath?: string | null;\n * fileHandle?: FileSystemFileHandle | null;\n * document: Record<string, unknown>;\n * frontmatter?: Record<string, unknown>;\n * sourceFormat?: string | null;\n * capabilities?: { modes?: string[] };\n * }} opts\n * @returns {Tab}\n */\nexport function createTab({\n id,\n documentPath = null,\n fileHandle = null,\n document,\n frontmatter,\n sourceFormat = null,\n capabilities,\n}: {\n id: string;\n documentPath?: string | null;\n fileHandle?: FileSystemFileHandle | null;\n document: Record<string, unknown>;\n frontmatter?: Record<string, unknown>;\n sourceFormat?: string | null;\n capabilities?: { modes?: string[] };\n}) {\n const scope = effectScope();\n\n // Normalize legacy whole-children repeaters to the canonical array-member form before the doc\n // (and its first history checkpoint) are stored.\n normalizeArrayChildren(document);\n\n const resolvedModes = capabilities?.modes ?? inferModes(documentPath, sourceFormat);\n // A tab opens in its first allowed mode — never one the toolbar would disable.\n // Formats author mode order so the default comes first (edit, stylebook, etc.).\n // \"preview\" is a per-tab toggle rather than a base mode: a preview-first format opens\n // In its first non-preview mode with the toggle already on.\n const initialCanvasMode = resolvedModes.find((m) => m !== \"preview\") ?? \"edit\";\n const initialPreview = resolvedModes[0] === \"preview\";\n\n const tab = scope.run(() => ({\n capabilities: { modes: resolvedModes },\n doc: reactive({\n content: { frontmatter: frontmatter || {} },\n dirty: false,\n document,\n handlersSource: null,\n mode: inferDocumentMode(documentPath, sourceFormat),\n sourceFormat,\n }),\n documentPath,\n fileHandle,\n history: reactive({\n index: 0,\n snapshots: [{ document: structuredClone(document), selection: null }],\n }),\n id,\n scope,\n session: reactive({\n canvas: {\n error: null,\n livePreviews: null,\n pendingInlineEdit: null,\n scope: null,\n status: \"idle\",\n },\n clipboard: null,\n documentStack: [],\n hover: null,\n selection: null,\n ui: createDefaultUi(initialCanvasMode, initialPreview),\n }),\n })) as unknown as Tab;\n\n return tab;\n}\n\n/**\n * Allowed modes for a document. \"preview\" in a format's mode list means the preview toggle is\n * Available for the tab (it is not a base canvas mode the toolbar switches to).\n *\n * @param {string | null | undefined} documentPath\n * @param {string | null} sourceFormat\n * @returns {string[]}\n */\nfunction inferModes(documentPath: string | null | undefined, sourceFormat: string | null) {\n if (documentPath === \"project.json\") {\n return [\"stylebook\", \"source\"];\n }\n const format = formatByName(sourceFormat) ?? formatForPath(documentPath);\n if (format) {\n return format.studio?.modes ?? [\"edit\", \"design\", \"preview\", \"source\"];\n }\n return ALL_MODES;\n}\n\n/**\n * Document mode for a new tab: format-class documents default to their $studio.documentMode\n * (content unless promoted to component); JSON is component.\n *\n * @param {string | null | undefined} documentPath\n * @param {string | null} sourceFormat\n * @returns {string}\n */\nfunction inferDocumentMode(documentPath: string | null | undefined, sourceFormat: string | null) {\n const format = formatByName(sourceFormat) ?? formatForPath(documentPath);\n if (format) {\n return format.studio?.documentMode?.default ?? \"content\";\n }\n return \"component\";\n}\n\n/**\n * Dispose a tab — stops its effectScope, killing all effects created within it.\n *\n * @param {Tab} tab\n */\nexport function disposeTab(tab: Tab) {\n tab.scope.stop();\n}\n",
15
- "import { computed, reactive, toRaw } from \"../reactivity\";\nimport { ensureCollab, rekeyCollab } from \"../collab/collab-session\";\nimport { createTab, disposeTab } from \"../tabs/tab\";\nimport type { Tab } from \"../tabs/tab\";\n\nimport type { ComponentEntry } from \"../files/components\";\nimport type { JxMutableNode, JxStyle } from \"@jxsuite/schema/types\";\nimport type { ComputedRef } from \"@vue/reactivity\";\n\ninterface FileEntry {\n name: string;\n path: string;\n type: string;\n}\n\nexport interface Workspace {\n projectRoot: string | null;\n projectConfig: object | null;\n componentRegistry: ComponentEntry[];\n clipboard: JxMutableNode | null;\n styleClipboard: JxStyle | null;\n fileTree: {\n dirs: Map<string, FileEntry[]>;\n expanded: Set<string>;\n selectedPath: string | null;\n searchQuery: string;\n };\n tabs: Map<string, Tab>;\n tabOrder: string[];\n activeTabId: string | null;\n ui: { activityBar: string };\n}\n\n// Annotated as Workspace: Vue's UnwrapNestedRefs cannot terminate on the\n// Recursive document types, and reactive() does not unwrap refs we never use.\nexport const workspace: Workspace = reactive({\n activeTabId: null as string | null,\n clipboard: null as JxMutableNode | null,\n componentRegistry: [] as ComponentEntry[],\n fileTree: {\n dirs: new Map<string, FileEntry[]>(),\n expanded: new Set<string>(),\n searchQuery: \"\",\n selectedPath: null as string | null,\n },\n projectConfig: null as object | null,\n projectRoot: null as string | null,\n styleClipboard: null as JxStyle | null,\n tabOrder: [] as string[],\n tabs: new Map<string, Tab>(),\n ui: {\n activityBar: \"files\",\n },\n}) as unknown as Workspace;\n\nexport const activeTab = computed(() =>\n workspace.activeTabId ? (workspace.tabs.get(workspace.activeTabId) ?? null) : null,\n) as unknown as ComputedRef<Tab | null>;\n\n/**\n * Record the open project on the reactive workspace. `root` must be the absolute project root (the\n * same value `createProject` returns and the pending-agent-prompt handoff is keyed by) — not the\n * \".\"-relative root projectState sometimes holds. Consumers: AI session scoping, system-prompt\n * project context, and the chat panel's pending-prompt effect.\n *\n * @param {string | null} root\n * @param {object | null} [config]\n */\nexport function setWorkspaceProject(root: string | null, config: object | null = null) {\n workspace.projectRoot = root;\n workspace.projectConfig = config;\n}\n\n/**\n * Whether `tab` is the active tab. Identity check survives reactive-proxy wrapping (activeTab.value\n * is a proxy; callers may hold either the raw tab or a proxy of it).\n *\n * @param {Tab | null} tab\n */\nexport function isTabActive(tab: Tab | null): boolean {\n const active = activeTab.value;\n return (\n tab !== null && active !== null && toRaw(active as object) === toRaw(tab as unknown as object)\n );\n}\n\n/**\n * Open a new tab and make it active.\n *\n * @param {{\n * id: string;\n * documentPath?: string | null;\n * fileHandle?: FileSystemFileHandle | null;\n * document: Record<string, unknown>;\n * frontmatter?: Record<string, unknown>;\n * sourceFormat?: string | null;\n * capabilities?: { modes?: string[] };\n * }} opts\n * @returns {Tab}\n */\nexport function openTab(opts: {\n id: string;\n documentPath?: string | null;\n fileHandle?: FileSystemFileHandle | null;\n document: Record<string, unknown>;\n frontmatter?: Record<string, unknown>;\n sourceFormat?: string | null;\n capabilities?: { modes?: string[] };\n}) {\n const tab = createTab(opts);\n workspace.tabs.set(tab.id, tab);\n workspace.tabOrder.push(tab.id);\n workspace.activeTabId = tab.id;\n ensureCollab(tab);\n return tab;\n}\n\n/**\n * Close a tab and dispose its scope. Activates the last remaining tab if the closed tab was active.\n *\n * @param {string} tabId\n */\nexport function closeTab(tabId: string) {\n const tab = workspace.tabs.get(tabId);\n if (!tab) {\n return;\n }\n disposeTab(tab);\n workspace.tabs.delete(tabId);\n workspace.tabOrder = workspace.tabOrder.filter((id) => id !== tabId);\n if (workspace.activeTabId === tabId) {\n workspace.activeTabId = workspace.tabOrder.at(-1) || null;\n }\n}\n\n/** Close all open tabs, disposing each. Defers reactivity until fully cleared. */\nexport function closeAllTabs() {\n const tabs = [...workspace.tabs.values()];\n workspace.tabs.clear();\n workspace.tabOrder = [];\n workspace.activeTabId = null;\n for (const tab of tabs) {\n disposeTab(tab);\n }\n}\n\n/**\n * Replace all existing tabs with a new one atomically. Ensures activeTab is never null during the\n * transition.\n *\n * @param {{\n * id: string;\n * documentPath?: string | null;\n * document: Record<string, unknown>;\n * frontmatter?: Record<string, unknown>;\n * sourceFormat?: string | null;\n * }} newTabOpts\n * @returns {import(\"../tabs/tab.js\").Tab}\n */\nexport function replaceAllTabs(newTabOpts: {\n id: string;\n documentPath?: string | null;\n document: Record<string, unknown>;\n frontmatter?: Record<string, unknown>;\n sourceFormat?: string | null;\n}) {\n const oldIds = [...workspace.tabs.keys()];\n const oldTabs = [...workspace.tabs.values()];\n\n const newTab = createTab(newTabOpts);\n workspace.tabs.set(newTab.id, newTab);\n workspace.activeTabId = newTab.id;\n workspace.tabOrder = [newTab.id];\n ensureCollab(newTab);\n\n for (const id of oldIds) {\n if (id === newTab.id) {\n continue;\n }\n workspace.tabs.delete(id);\n }\n for (const tab of oldTabs) {\n disposeTab(tab);\n }\n\n return newTab;\n}\n\n/**\n * Switch to an existing tab.\n *\n * @param {string} tabId\n */\nexport function activateTab(tabId: string) {\n if (workspace.tabs.has(tabId)) {\n workspace.activeTabId = tabId;\n }\n}\n\n/**\n * Re-key a tab after its backing file has been renamed. Preserves all tab state including unsaved\n * changes.\n *\n * @param {string} oldId\n * @param {string} newId\n * @param {string} newDocumentPath\n */\nexport function renameTab(oldId: string, newId: string, newDocumentPath: string) {\n const tab = workspace.tabs.get(oldId);\n if (!tab) {\n return;\n }\n tab.id = newId;\n tab.documentPath = newDocumentPath;\n workspace.tabs.delete(oldId);\n workspace.tabs.set(newId, tab);\n workspace.tabOrder = workspace.tabOrder.map((id) => (id === oldId ? newId : id));\n if (workspace.activeTabId === oldId) {\n workspace.activeTabId = newId;\n }\n rekeyCollab(tab);\n}\n",
16
- "/**\n * Strip `on*` event-handler bindings from a Jx document tree (returns a shallow-rebuilt copy). Used\n * to neutralize handlers before edit/design rendering so the canvas never wires live behavior, and\n * to drop `timing: \"server\"` state entries the canvas can't run.\n *\n * Lives in its own dependency-light module (it pulls only the pure `@jxsuite/schema/guards`\n * predicate) so the slim canvas-iframe subtree renderer can import it without dragging in the\n * editor's reactive `store.ts`; `store.ts` re-exports it for the legacy in-realm patcher.\n */\n\nimport { isEventBinding } from \"@jxsuite/schema/guards\";\nimport type { JxMutableNode } from \"@jxsuite/schema/types\";\n\n/** Strip all `on*` event-handler properties (and server-timed state) from a document tree. */\nexport function stripEventHandlers(node: JxMutableNode): JxMutableNode {\n if (!node || typeof node !== \"object\") {\n return node;\n }\n if (Array.isArray(node)) {\n // Arrays of nodes round-trip element-wise; the array itself is not a node.\n return node.map((n: JxMutableNode) => stripEventHandlers(n)) as unknown as JxMutableNode;\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(node)) {\n if (k.startsWith(\"on\") && isEventBinding(v)) {\n continue;\n }\n if (k === \"children\") {\n out.children = Array.isArray(v)\n ? v.map((c: JxMutableNode) => stripEventHandlers(c))\n : stripEventHandlers(v as JxMutableNode);\n } else if (k === \"cases\" && typeof v === \"object\") {\n const cases: Record<string, unknown> = {};\n for (const [ck, cv] of Object.entries(v as Record<string, unknown>)) {\n cases[ck] = stripEventHandlers(cv as JxMutableNode);\n }\n out.cases = cases;\n } else if (k === \"state\" && typeof v === \"object\" && v !== null) {\n const state: Record<string, unknown> = {};\n for (const [sk, sv] of Object.entries(v as Record<string, unknown>)) {\n if (sv && typeof sv === \"object\" && (sv as Record<string, unknown>).timing === \"server\") {\n continue;\n }\n state[sk] = sv;\n }\n out.state = state;\n } else if (k === \"style\" || k === \"attributes\" || k === \"$media\") {\n out[k] = v;\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n",
17
- "/// <reference lib=\"dom\" />\n/**\n * Store.js — Shared state hub for Jx Studio\n *\n * Every other studio module imports from this file for shared state, DOM refs, render\n * orchestration, and state.js re-exports. This prevents circular dependencies by keeping store.js\n * free of domain-specific imports.\n */\n\n// ─── Re-exports from state.js ────────────────────────────────────────────────\n\nimport { activeTab } from \"./workspace/workspace\";\nimport type { JxPath } from \"./state\";\nimport type { JxMutableNode } from \"@jxsuite/schema/types\";\nimport type { CanvasPanel } from \"./types\";\n\nexport {\n createState,\n getNodeAtPath,\n childList,\n flattenTree,\n nodeLabel,\n pathKey,\n pathsEqual,\n parentElementPath,\n childIndex,\n isAncestor,\n projectState,\n setProjectState,\n requireProjectState,\n updateFrontmatter,\n} from \"./state\";\n\n// ─── Shell element refs (populated by initShellRefs) ─────────────────────────\n\nexport let canvasWrap = null as unknown as HTMLElement;\nexport let activityBar = null as unknown as HTMLElement;\nexport let leftPanel = null as unknown as HTMLElement;\nexport let rightPanel = null as unknown as HTMLElement;\nexport let chatPanelEl = null as unknown as HTMLElement;\nexport let toolbarEl = null as unknown as HTMLElement;\nexport let statusbarEl = null as unknown as HTMLElement;\nexport let frontmatterPanelEl = null as unknown as HTMLElement;\n\nexport function initShellRefs() {\n canvasWrap = document.querySelector(\"#canvas-wrap\") as HTMLElement;\n activityBar = document.querySelector(\"#activity-bar\") as HTMLElement;\n leftPanel = document.querySelector(\"#left-panel\") as HTMLElement;\n rightPanel = document.querySelector(\"#right-panel\") as HTMLElement;\n chatPanelEl = document.querySelector(\"#chat-panel\") as HTMLElement;\n toolbarEl = document.querySelector(\"#toolbar\") as HTMLElement;\n statusbarEl = document.querySelector(\"#statusbar\") as HTMLElement;\n frontmatterPanelEl = document.querySelector(\"#frontmatter-panel\") as HTMLElement;\n}\n\n// ─── Shared containers (mutated in place by owner modules) ───────────────────\n\nexport const canvasPanels: CanvasPanel[] = [];\n\n// ─── Shared constants ────────────────────────────────────────────────────────\n\n/** Void elements that cannot accept children */\nexport const VOID_ELEMENTS = new Set([\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n\nexport const COMMON_SELECTORS = [\n \":hover\",\n \":focus\",\n \":active\",\n \":focus-within\",\n \":focus-visible\",\n \":disabled\",\n \":first-child\",\n \":last-child\",\n \"::before\",\n \"::after\",\n \"::placeholder\",\n];\n\n/** @param {string} k */\nexport function isNestedSelector(k: string) {\n return k.startsWith(\":\") || k.startsWith(\".\") || k.startsWith(\"&\") || k.startsWith(\"[\");\n}\n\n// ─── Shared utilities ────────────────────────────────────────────────────────\n\nconst _styleDebounceTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\n/**\n * @param {string} prop\n * @param {number} ms\n * @param {(...args: unknown[]) => void} fn\n */\nexport function debouncedStyleCommit<A extends unknown[]>(\n prop: string,\n ms: number,\n fn: (...args: A) => void,\n) {\n return (...args: A) => {\n clearTimeout(_styleDebounceTimers.get(prop));\n _styleDebounceTimers.set(\n prop,\n setTimeout(() => {\n _styleDebounceTimers.delete(prop);\n fn(...args);\n }, ms),\n );\n };\n}\n\n/** Cancel a pending debounced commit for the given prop key. */\nexport function cancelStyleDebounce(prop: string) {\n clearTimeout(_styleDebounceTimers.get(prop));\n _styleDebounceTimers.delete(prop);\n}\n\n// `stripEventHandlers` moved to ./utils/strip-events (dependency-light, shared with the iframe\n// Subtree renderer); re-exported here so existing `from \"../store\"` imports keep working.\nexport { stripEventHandlers } from \"./utils/strip-events\";\n\n// ─── Render orchestration ────────────────────────────────────────────────────\n\nconst _renderers = new Map<string, () => void>();\n\n/**\n * Register a named renderer. Called at module import time by each module.\n *\n * @param {string} name\n * @param {() => void} fn\n */\nexport function registerRenderer(name: string, fn: () => void) {\n _renderers.set(name, fn);\n}\n\n/** Call all registered renderers (full repaint). */\nexport function render() {\n for (const [name, fn] of _renderers.entries()) {\n try {\n fn();\n } catch (error) {\n console.error(`Renderer \"${name}\" failed:`, error);\n }\n }\n}\n\n/**\n * Call specific renderers by name.\n *\n * @param {...string} names\n */\nexport function renderOnly(...names: string[]) {\n for (const name of names) {\n const fn = _renderers.get(name);\n if (!fn) {\n continue;\n }\n try {\n fn();\n } catch (error) {\n console.error(`Renderer \"${name}\" failed:`, error);\n }\n }\n}\n\n// ─── Session dispatch ──────────────────────────────────────────────────────\n\n/**\n * Dispatch a session-only state update (selection, hover, ui). Writes directly to reactive tab.\n *\n * @param {object} patch — partial session object, e.g. { ui: { zoom: 2 } }\n */\nexport function updateSession(patch: {\n selection?: JxPath | null;\n hover?: JxPath | null;\n clipboard?: JxMutableNode | null;\n ui?: Record<string, unknown>;\n canvas?: Record<string, unknown>;\n}) {\n const tab = activeTab.value;\n if (tab) {\n if (patch.selection !== undefined) {\n tab.session.selection = patch.selection as JxPath | null;\n }\n if (patch.hover !== undefined) {\n tab.session.hover = patch.hover as JxPath | null;\n }\n if (patch.clipboard !== undefined) {\n tab.session.clipboard = patch.clipboard!;\n }\n if (patch.ui) {\n for (const [k, v] of Object.entries(patch.ui)) {\n (tab.session.ui as unknown as Record<string, unknown>)[k] = v;\n }\n }\n if (patch.canvas) {\n for (const [k, v] of Object.entries(patch.canvas)) {\n (tab.session.canvas as unknown as Record<string, unknown>)[k] = v;\n }\n }\n }\n}\n\n/**\n * Update a single UI field.\n *\n * @param {string} field\n * @param {unknown} value\n */\nexport function updateUi(field: string, value: unknown) {\n const tab = activeTab.value;\n if (tab) {\n (tab.session.ui as unknown as Record<string, unknown>)[field] = value;\n }\n}\n\n/**\n * Update the canvas async state (status, scope, error).\n *\n * @param {object} patch\n */\nexport function updateCanvas(patch: Record<string, unknown>) {\n const tab = activeTab.value;\n if (tab) {\n for (const [k, v] of Object.entries(patch)) {\n (tab.session.canvas as Record<string, unknown>)[k] = v;\n }\n }\n}\n"
18
- ],
19
- "mappings": "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",
20
- "debugId": "46676D06D14A28A964756E2164756E21",
21
- "names": []
22
- }