@jxsuite/studio 2.0.0 → 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-0hzentwq.js → components-2bpqp4mq.js} +5 -7
  7. package/dist/chunks/{components-0hzentwq.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-2c188n41.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-97qcgvdn.js → studio-adn0z1k3.js} +14 -8
  74. package/dist/chunks/{studio-97qcgvdn.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-hhj92gcr.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-ygzav7z5.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-n9zmpxjg.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 +23711 -35185
  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 +34 -9
  214. package/src/new-project/location-fields.ts +9 -1
  215. package/src/new-project/new-project-modal.ts +270 -262
  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 -120
  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 +75 -2
  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 +113 -0
  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-qct0gt8f.js +0 -531
  363. package/dist/chunks/extension-sections-qct0gt8f.js.map +0 -12
  364. package/dist/chunks/files-02zn5y24.js +0 -50
  365. package/dist/chunks/files-02zn5y24.js.map +0 -9
  366. package/dist/chunks/git-panel-mbb0y0hz.js +0 -28
  367. package/dist/chunks/git-panel-mbb0y0hz.js.map +0 -9
  368. package/dist/chunks/layers-panel-9qekmqk1.js +0 -26
  369. package/dist/chunks/layers-panel-9qekmqk1.js.map +0 -9
  370. package/dist/chunks/settings-modal-gj0hrah4.js +0 -29
  371. package/dist/chunks/settings-modal-gj0hrah4.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-4k0m4fmp.js.map +0 -13
  381. package/dist/chunks/studio-568nx4t5.js +0 -469
  382. package/dist/chunks/studio-568nx4t5.js.map +0 -14
  383. package/dist/chunks/studio-9smfzqhc.js +0 -19
  384. package/dist/chunks/studio-9smfzqhc.js.map +0 -10
  385. package/dist/chunks/studio-asvf0j9e.js +0 -429
  386. package/dist/chunks/studio-asvf0j9e.js.map +0 -13
  387. package/dist/chunks/studio-d77qm3pk.js +0 -3427
  388. package/dist/chunks/studio-d77qm3pk.js.map +0 -26
  389. package/dist/chunks/studio-j6gqyjf4.js +0 -1854
  390. package/dist/chunks/studio-j6gqyjf4.js.map +0 -18
  391. package/dist/chunks/studio-n9zmpxjg.js.map +0 -115
  392. package/dist/chunks/studio-qkvt37c0.js.map +0 -9
  393. package/dist/chunks/studio-rq0vxb19.js +0 -3744
  394. package/dist/chunks/studio-rq0vxb19.js.map +0 -22
  395. package/dist/chunks/studio-wd6ewdvd.js +0 -853
  396. package/dist/chunks/studio-wd6ewdvd.js.map +0 -12
  397. package/dist/chunks/studio-xq0t7n5t.js +0 -140
  398. package/dist/chunks/studio-xq0t7n5t.js.map +0 -10
  399. package/dist/chunks/studio-xze4zrs1.js.map +0 -10
  400. package/dist/chunks/studio-ygzav7z5.js.map +0 -46
  401. package/dist/chunks/studio-zmy7241e.js +0 -399
  402. package/dist/chunks/studio-zmy7241e.js.map +0 -12
  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-2c188n41.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-hhj92gcr.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
@@ -0,0 +1,406 @@
1
+ /// <reference lib="dom" />
2
+ /**
3
+ * The pane grid — `workspace.panes`, given a visual counterpart.
4
+ *
5
+ * `workspace.panes` has been a real data model since P3: an ordered list, a focused id, a split, an
6
+ * unsplit. Nothing drew it. `index.html` declared ONE each of `#tab-strip`, `#jump-bar`,
7
+ * `#pane-chrome` and `#canvas-wrap` as flat siblings in `#app`'s grid — four surfaces that belong
8
+ * to a PANE, laid out as rows and columns of the APPLICATION — so the shell could model two panes
9
+ * and had somewhere to put exactly one. §18.3's stage handover was the workaround: one stage, taken
10
+ * by whichever pane had focus, releasing the loser's artboards on the way past. This module is what
11
+ * that scaffolding was standing in for, and the handover is deleted with it.
12
+ *
13
+ * **Lit owns the frame; imperative code owns the leaves.** `panels/bottom-dock.ts` is the
14
+ * precedent. The cells, their four boxes and the splitter between them are a keyed `repeat` over
15
+ * `workspace.panes`; everything a cell CONTAINS arrives through a `ref()` and is built by the
16
+ * module that owns it — `canvas/canvas-render.ts` is the manual lit render root of `.pane-stage`
17
+ * and this template puts nothing inside it, `panels/jump-bar.ts` and `panels/pane-context.ts` are
18
+ * handed `.pane-jump` and `.pane-chrome`, and `panels/tab-strip.ts` is handed `.pane-strip`.
19
+ *
20
+ * This was an imperative reconciler until the splitter proved why it could not be. `layout()` runs
21
+ * on every `shell.paneSplit` write — every `pointermove` of a drag — and it re-ran
22
+ * `cells[1].root.before(splitter)`, which on an already-positioned node is a REMOVE plus an insert:
23
+ * Chrome fires `lostpointercapture` on move #1, the rest of the gesture goes to whatever is under
24
+ * the cursor, and a drag asking for +0.20 lands +0.03. The old file carried "never touches an
25
+ * existing cell's children" as a comment; a **keyed** `repeat` makes it structural — lit MOVES an
26
+ * existing cell rather than recreating it, and re-parenting is not a move for the things inside a
27
+ * stage: an `<iframe>` that changes parent reloads, dropping its `iframe-channel` connection, its
28
+ * shadow document and every `ready` panel with it.
29
+ *
30
+ * **§18.1's three rules, structurally:**
31
+ *
32
+ * 1. _A pane is complete before it is published._ lit clones a template into a `DocumentFragment`,
33
+ * commits every part into it — which is where the `ref()` callbacks below run — and only then
34
+ * inserts the fragment. So the stamping, the surface record and the gestures all happen while
35
+ * the cell is still detached, exactly as the hand-built fragment used to. There is no frame in
36
+ * which a `.pane` exists with no stage inside it.
37
+ * 2. _A pane is never observable without existing._ One effect over `workspace.panes` is the only
38
+ * writer of pane DOM. Vue batches, so no intermediate state is samplable.
39
+ * 3. _A pane with nothing in it is a hole in the grid._ Enforced in `workspace/workspace.ts`, where
40
+ * the tabs are. This module ASSERTS rather than repairs: repairing inside a reactive effect that
41
+ * writes `workspace.panes` is an effect that triggers itself.
42
+ */
43
+
44
+ import { html, render as litRender, nothing } from "lit-html";
45
+ import { repeat } from "lit-html/directives/repeat.js";
46
+ import { ref } from "lit-html/directives/ref.js";
47
+ import { effect, effectScope } from "../reactivity";
48
+ import { persistDocks, registerShellSurface, setPaneSplit, shell } from "../shell";
49
+ import {
50
+ STAGE_CLASS,
51
+ createPaneSurface,
52
+ disposePaneSurface,
53
+ registerCanvasSurface,
54
+ } from "../canvas/canvas-surface";
55
+ import { releaseCanvasHosts } from "../canvas/iframe-host";
56
+ import { installStageGestures } from "../editor/shortcuts";
57
+ import { scheduleCanvasRender } from "../canvas/canvas-render";
58
+ import { paneRegion, paneStripRegion } from "../ui/regions";
59
+ import { attachJumpBarHost } from "./jump-bar";
60
+ import { attachPaneChromeHost } from "./pane-context";
61
+ import { focusPane, workspace } from "../workspace/workspace";
62
+ import { setupHandle } from "../ui/panel-resize";
63
+ import type { EffectScope } from "@vue/reactivity";
64
+ import type { CanvasSurface } from "../canvas/canvas-surface";
65
+ import type { TemplateResult } from "lit-html";
66
+
67
+ /** One drawn pane: its root and the four surfaces inside it. */
68
+ export interface PaneCell {
69
+ paneId: string;
70
+ root: HTMLElement;
71
+ strip: HTMLElement;
72
+ jump: HTMLElement;
73
+ chrome: HTMLElement;
74
+ stage: HTMLElement;
75
+ surface: CanvasSurface;
76
+ }
77
+
78
+ /**
79
+ * A cell's record and the five `ref` callbacks that fill it in.
80
+ *
81
+ * The callbacks are MEMOISED per pane id, and that is not an optimisation. lit's `ref` directive
82
+ * compares the callback by identity: hand it a fresh closure on a re-render and it calls the old
83
+ * one with `undefined` and the new one with the element — a detach and a re-attach of a live host,
84
+ * on every pass. Stable callbacks mean an unchanged cell's refs are never called again at all.
85
+ */
86
+ interface CellRefs extends PaneCell {
87
+ onRoot: (el?: Element) => void;
88
+ onStrip: (el?: Element) => void;
89
+ onJump: (el?: Element) => void;
90
+ onChrome: (el?: Element) => void;
91
+ onStage: (el?: Element) => void;
92
+ /** Capture-phase `pointerdown` on the cell root — see {@link cellRefs}. */
93
+ onPointerDown: { handleEvent: () => void; capture: true };
94
+ /** Stage-gesture disposer, live between the stage's attach and its detach. */
95
+ releaseGestures: (() => void) | null;
96
+ }
97
+
98
+ const _cells = new Map<string, CellRefs>();
99
+
100
+ let _grid: HTMLElement | null = null;
101
+
102
+ let _scope: EffectScope | null = null;
103
+
104
+ /** The cell a pane is drawn in, or null. Test-visible, and the bootstrap's handle on the primary. */
105
+ export function cellForPane(paneId: string): PaneCell | null {
106
+ return _cells.get(paneId) ?? null;
107
+ }
108
+
109
+ /** Every drawn cell, in grid order. */
110
+ export function paneCells(): PaneCell[] {
111
+ return workspace.panes
112
+ .map((pane) => _cells.get(pane.id))
113
+ .filter((cell): cell is CellRefs => cell !== undefined);
114
+ }
115
+
116
+ /**
117
+ * The record for a pane, created on first render and reused for the life of the cell.
118
+ *
119
+ * Every element field is typed non-null and starts null, the same bargain `CanvasSurface` makes:
120
+ * lit commits the refs inside `litRender`, synchronously, before any caller can hold the record.
121
+ */
122
+ function cellRefs(paneId: string): CellRefs {
123
+ const existing = _cells.get(paneId);
124
+ if (existing) {
125
+ return existing;
126
+ }
127
+ /* Declared in ONE literal, callbacks and all, closing over the very binding being declared. The
128
+ bodies only run when lit commits a part, so there is no temporal-dead-zone read — and a record
129
+ that is complete on the line it is created cannot be half-wired by an early return later. */
130
+ const cell: CellRefs = {
131
+ chrome: null as unknown as HTMLElement,
132
+ jump: null as unknown as HTMLElement,
133
+ /* The two bars are HANDED their host rather than resolving a region, the same way
134
+ `panels/frontmatter-panel.ts` is handed the stage. They cannot resolve one the way the tab
135
+ strip does: the strip's host carries `pane.<id>/tabs` and nothing inside it re-stamps that
136
+ id, while the jump bar and the context bar both stamp `pane.<id>/jump` and
137
+ `pane.<id>/context` on markup they render INSIDE these two divs — so a region on the wrapper
138
+ as well would put the same id on two nested elements, and `resolveRegion` takes the LAST
139
+ match. Sixty shots crop `pane.primary/context`; a second, larger element carrying it is a
140
+ silently widened crop. */
141
+ onChrome: (el?: Element) => {
142
+ if (el) {
143
+ cell.chrome = el as HTMLElement;
144
+ }
145
+ attachPaneChromeHost(paneId, (el as HTMLElement | undefined) ?? null);
146
+ },
147
+ onJump: (el?: Element) => {
148
+ if (el) {
149
+ cell.jump = el as HTMLElement;
150
+ }
151
+ attachJumpBarHost(paneId, (el as HTMLElement | undefined) ?? null);
152
+ },
153
+ /**
154
+ * **A pointer landing anywhere in this cell puts the keyboard in this pane.**
155
+ *
156
+ * Before this, `panels/tab-strip.ts`'s strip row was the ONLY thing in the app that moved
157
+ * `workspace.activePaneId` by pointer, so a click on the side pane's canvas, its context bar,
158
+ * its Library, its Code editor or its entry form selected and edited that pane's document while
159
+ * every keyboard command, the Inspector, the block action bar and the overlay effect went on
160
+ * answering for the other one.
161
+ *
162
+ * ONE listener, on the cell, because the cell is the only thing that knows which pane a click
163
+ * is IN. The alternative — a `focusPane` call in each of the seven surfaces a pane can contain
164
+ * — is a list that a new surface joins by being remembered.
165
+ *
166
+ * Three properties it needs, and where each comes from:
167
+ *
168
+ * 1. _It must not disturb a control mid-interaction._ It moves the pane focus, never the DOM
169
+ * focus, so a text field in the context bar keeps its caret and its selection; and it fires
170
+ * on `pointerdown`, before any gesture has begun. The pane SPLITTER is a sibling of the
171
+ * cells rather than a child of one, so a splitter drag never reaches this at all.
172
+ * 2. _It must reach clicks inside the canvas._ It cannot: those land in a cross-origin iframe and
173
+ * never surface as a parent-realm pointer event. `canvas/iframe-host.ts`'s `hit` /
174
+ * `layoutHit` handlers are that seam and call {@link focusPane} themselves, from the pane
175
+ * that mounted the artboard.
176
+ * 3. _It must cost nothing when the pane is already focused._ {@link focusPane} returns early in
177
+ * that case — the guard is in the module that owns focus, because a function handed a
178
+ * `paneId` may not read the focus (`scripts/check-pane-singletons.ts` rule 4).
179
+ *
180
+ * CAPTURE phase, so a surface inside the cell that stops propagation cannot silently take the
181
+ * pane's focus with it. `studio.ts`'s commit-on-parent-click listener is on `document`, so it
182
+ * still runs first and the outgoing inline-edit session is committed before focus moves.
183
+ */
184
+ onPointerDown: {
185
+ capture: true,
186
+ handleEvent: () => {
187
+ focusPane(paneId);
188
+ },
189
+ },
190
+ /* Every element field is written on ATTACH and left alone on detach. A caller holding the
191
+ record when its pane goes away — `studio.ts`'s primary cell, three tests — asks it what the
192
+ cell WAS, and `root.isConnected === false` is the honest answer to that where `root === null`
193
+ is a `TypeError`. `_cells` forgetting the pane is what makes the cell gone. */
194
+ onRoot: (el?: Element) => {
195
+ if (el) {
196
+ cell.root = el as HTMLElement;
197
+ }
198
+ },
199
+ onStage: (el?: Element) => {
200
+ if (el) {
201
+ attachStage(cell, el as HTMLElement);
202
+ return;
203
+ }
204
+ detachStage(cell);
205
+ },
206
+ onStrip: (el?: Element) => {
207
+ if (el) {
208
+ cell.strip = el as HTMLElement;
209
+ }
210
+ },
211
+ paneId,
212
+ releaseGestures: null,
213
+ root: null as unknown as HTMLElement,
214
+ stage: null as unknown as HTMLElement,
215
+ strip: null as unknown as HTMLElement,
216
+ surface: null as unknown as CanvasSurface,
217
+ };
218
+ _cells.set(paneId, cell);
219
+ return cell;
220
+ }
221
+
222
+ /**
223
+ * Furnish a pane's stage: its surface record, its host registration and its gestures.
224
+ *
225
+ * Runs while the cell is still inside lit's fragment (§18.1 rule 1). The render is SCHEDULED here
226
+ * rather than by the caller because nothing else is keyed on a pane appearing — both canvas effects
227
+ * key on the active TAB, which a split does not change — and by the time the frame runs, the cell
228
+ * is in the document.
229
+ */
230
+ function attachStage(cell: CellRefs, stage: HTMLElement): void {
231
+ cell.stage = stage;
232
+ cell.surface = createPaneSurface(cell.paneId);
233
+ registerCanvasSurface(cell.paneId, stage);
234
+ cell.releaseGestures = installStageGestures(cell.surface);
235
+ scheduleCanvasRender(cell.paneId);
236
+ }
237
+
238
+ /**
239
+ * Take a pane's stage apart, in the one order that works.
240
+ *
241
+ * The frames go BEFORE the DOM does. lit notifies a part of its disconnection through
242
+ * `_$notifyConnectionChanged` and only then removes the nodes, so `stage` still has its children
243
+ * here — which is the whole reason `releaseCanvasHosts` can find them. A frame detached first is
244
+ * otherwise noticed only by whichever lazy `liveHosts` walk runs next, so its channel's `window`
245
+ * "message" listener and its overlay would outlive the pane. `disposePaneSurface` comes after,
246
+ * because it is what stops the artboards' render scopes and clears the record the hosts resolve
247
+ * through.
248
+ */
249
+ function detachStage(cell: CellRefs): void {
250
+ cell.releaseGestures?.();
251
+ cell.releaseGestures = null;
252
+ if (cell.stage) {
253
+ releaseCanvasHosts(cell.stage);
254
+ }
255
+ disposePaneSurface(cell.paneId);
256
+ _cells.delete(cell.paneId);
257
+ }
258
+
259
+ /**
260
+ * One pane's cell.
261
+ *
262
+ * `pane.<id>` goes on the STAGE, not on the cell root. Nine shots crop `pane.primary` meaning "the
263
+ * canvas"; moving the id up one level would silently widen all nine to include the strip and the
264
+ * two bars, and no gate can tell a wider crop from an intended one.
265
+ *
266
+ * Nothing lit renders may go INSIDE `.pane-stage`: the canvas host mounts iframes there and
267
+ * `canvas/canvas-render.ts` is that element's lit render root — a node cannot have two owners of
268
+ * its child list.
269
+ */
270
+ function cellTpl(paneId: string): TemplateResult {
271
+ const cell = cellRefs(paneId);
272
+ return html`
273
+ <div class="pane" data-pane-id=${paneId} @pointerdown=${cell.onPointerDown} ${ref(cell.onRoot)}>
274
+ <div class="pane-strip" data-jx-region=${paneStripRegion(paneId)} ${ref(cell.onStrip)}></div>
275
+ <div class="pane-jump" ${ref(cell.onJump)}></div>
276
+ <div class="pane-chrome" ${ref(cell.onChrome)}></div>
277
+ <div class=${STAGE_CLASS} data-jx-region=${paneRegion(paneId)} ${ref(cell.onStage)}></div>
278
+ </div>
279
+ `;
280
+ }
281
+
282
+ /**
283
+ * Remember the splitter and wire it, once.
284
+ *
285
+ * A module-level function, so lit's `ref` sees the same callback on every pass and never re-runs
286
+ * it. That is the whole of defect S2's fix: a node the template owns is created when the second
287
+ * cell appears and removed when it goes, and NOTHING in between re-inserts it — so a pointer
288
+ * capture taken on `pointerdown` survives the drag that writes `shell.paneSplit` five times.
289
+ */
290
+ const onSplitter = (el?: Element): void => {
291
+ if (!el) {
292
+ return;
293
+ }
294
+ setupHandle(el as HTMLElement, {
295
+ axis: "x",
296
+ // The floor is a pane, not a sliver: 320px is the narrowest an Inspector-less editor is
297
+ // Usable at, and the same number on both sides is what makes a drag symmetrical.
298
+ max: () => Math.max(0.2, 1 - 320 / Math.max(1, gridWidth())),
299
+ min: () => Math.min(0.8, 320 / Math.max(1, gridWidth())),
300
+ read: () => shell.paneSplit,
301
+ reset: () => 0.5,
302
+ // A drag is px against the measured grid; the stored value is a RATIO, so the same layout
303
+ // Survives a window resize.
304
+ scale: () => 1 / Math.max(1, gridWidth()),
305
+ settle: () => persistDocks(),
306
+ write: (value) => setPaneSplit(value),
307
+ });
308
+ };
309
+
310
+ /** The splitter, as a template. */
311
+ function splitterTpl(): TemplateResult {
312
+ return html`<div class="resize-handle pane-splitter" ${ref(onSplitter)}></div>`;
313
+ }
314
+
315
+ /**
316
+ * The grid: every pane's cell, keyed by pane id, with a splitter before every cell but the first.
317
+ *
318
+ * Keyed on `pane.id` because the key is what makes lit MOVE a cell instead of rebuilding it. Every
319
+ * item renders the SAME template — the splitter slot is a child value that is `nothing` at index 0
320
+ * — so a reordering could only ever swap two values, never re-commit a different template over a
321
+ * live cell. `workspace.panes[0]` is always the primary and `MAX_PANES` is 2, so in practice no
322
+ * item ever moves.
323
+ */
324
+ function gridTemplate(): TemplateResult {
325
+ return html`${repeat(
326
+ workspace.panes,
327
+ (pane) => pane.id,
328
+ (pane, index) => html`${index > 0 ? splitterTpl() : nothing}${cellTpl(pane.id)}`,
329
+ )}`;
330
+ }
331
+
332
+ /**
333
+ * Bring the drawn cells into line with `workspace.panes`. Idempotent by construction.
334
+ *
335
+ * Exported for the tests, which need to drive it without a reactive tick.
336
+ */
337
+ export function reconcile(): void {
338
+ if (!_grid) {
339
+ return;
340
+ }
341
+ litRender(gridTemplate(), _grid);
342
+ layout();
343
+ }
344
+
345
+ /**
346
+ * Write the grid's own tracks.
347
+ *
348
+ * The TRACK COUNT lives here rather than in `shell.ts`'s layout effect because it depends on
349
+ * `workspace.panes.length`, and the shell effect must not read the workspace — a dock resize would
350
+ * then re-run on every tab change. The shell owns `--pane-split`; the grid owns what it means.
351
+ *
352
+ * It writes ONE style property and touches no child, which is the other half of S2: a `pointermove`
353
+ * that lands here can move a track edge but can never move a node.
354
+ */
355
+ function layout(): void {
356
+ if (!_grid) {
357
+ return;
358
+ }
359
+ if (paneCells().length < 2) {
360
+ _grid.style.gridTemplateColumns = "minmax(0, 1fr)";
361
+ return;
362
+ }
363
+ const split = shell.paneSplit;
364
+ _grid.style.gridTemplateColumns = `minmax(0, ${split}fr) 5px minmax(0, ${1 - split}fr)`;
365
+ }
366
+
367
+ function gridWidth(): number {
368
+ return _grid?.clientWidth ?? 0;
369
+ }
370
+
371
+ /** Mount the grid. Called by `shell.ts`'s `mountShell()`, like every other shell surface. */
372
+ export function mount(): void {
373
+ if (_scope) {
374
+ return;
375
+ }
376
+ _grid = document.querySelector<HTMLElement>("#pane-grid");
377
+ if (!_grid) {
378
+ return;
379
+ }
380
+ _scope = effectScope();
381
+ _scope.run(() => {
382
+ effect(() => {
383
+ // The one dependency: the pane list itself, by identity and by member id.
384
+ for (const pane of workspace.panes) {
385
+ void pane.id;
386
+ }
387
+ void shell.paneSplit;
388
+ reconcile();
389
+ });
390
+ });
391
+ }
392
+
393
+ export function unmount(): void {
394
+ _scope?.stop();
395
+ _scope = null;
396
+ if (_grid) {
397
+ /* One statement takes every cell apart. Rendering `nothing` disconnects the template's parts —
398
+ which runs every `ref` detach above, in document order, while the nodes are still in place —
399
+ and then removes them. Doing it by hand would be a second teardown path to keep in step. */
400
+ litRender(nothing, _grid);
401
+ }
402
+ _cells.clear();
403
+ _grid = null;
404
+ }
405
+
406
+ registerShellSurface({ mount, unmount });