@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
@@ -2,59 +2,14 @@ import {
2
2
  Directive,
3
3
  PartType,
4
4
  directive
5
- } from "./studio-4k0m4fmp.js";
5
+ } from "./studio-p471gg5n.js";
6
6
  import {
7
7
  noChange,
8
8
  nothing
9
9
  } from "./studio-5x5774ak.js";
10
10
 
11
- // ../../node_modules/lit-html/development/directives/class-map.js
12
- class ClassMapDirective extends Directive {
13
- constructor(partInfo) {
14
- super(partInfo);
15
- if (partInfo.type !== PartType.ATTRIBUTE || partInfo.name !== "class" || partInfo.strings?.length > 2) {
16
- throw new Error("`classMap()` can only be used in the `class` attribute " + "and must be the only part in the attribute.");
17
- }
18
- }
19
- render(classInfo) {
20
- return " " + Object.keys(classInfo).filter((key) => classInfo[key]).join(" ") + " ";
21
- }
22
- update(part, [classInfo]) {
23
- if (this._previousClasses === undefined) {
24
- this._previousClasses = new Set;
25
- if (part.strings !== undefined) {
26
- this._staticClasses = new Set(part.strings.join(" ").split(/\s/).filter((s) => s !== ""));
27
- }
28
- for (const name in classInfo) {
29
- if (classInfo[name] && !this._staticClasses?.has(name)) {
30
- this._previousClasses.add(name);
31
- }
32
- }
33
- return this.render(classInfo);
34
- }
35
- const classList = part.element.classList;
36
- for (const name of this._previousClasses) {
37
- if (!(name in classInfo)) {
38
- classList.remove(name);
39
- this._previousClasses.delete(name);
40
- }
41
- }
42
- for (const name in classInfo) {
43
- const value = !!classInfo[name];
44
- if (value !== this._previousClasses.has(name) && !this._staticClasses?.has(name)) {
45
- if (value) {
46
- classList.add(name);
47
- this._previousClasses.add(name);
48
- } else {
49
- classList.remove(name);
50
- this._previousClasses.delete(name);
51
- }
52
- }
53
- }
54
- return noChange;
55
- }
56
- }
57
- var classMap = directive(ClassMapDirective);
11
+ // ../../node_modules/lit-html/development/directives/if-defined.js
12
+ var ifDefined = (value) => value ?? nothing;
58
13
 
59
14
  // ../../node_modules/lit-html/development/directives/style-map.js
60
15
  var important = "important";
@@ -111,10 +66,55 @@ class StyleMapDirective extends Directive {
111
66
  }
112
67
  var styleMap = directive(StyleMapDirective);
113
68
 
114
- // ../../node_modules/lit-html/development/directives/if-defined.js
115
- var ifDefined = (value) => value ?? nothing;
69
+ // ../../node_modules/lit-html/development/directives/class-map.js
70
+ class ClassMapDirective extends Directive {
71
+ constructor(partInfo) {
72
+ super(partInfo);
73
+ if (partInfo.type !== PartType.ATTRIBUTE || partInfo.name !== "class" || partInfo.strings?.length > 2) {
74
+ throw new Error("`classMap()` can only be used in the `class` attribute " + "and must be the only part in the attribute.");
75
+ }
76
+ }
77
+ render(classInfo) {
78
+ return " " + Object.keys(classInfo).filter((key) => classInfo[key]).join(" ") + " ";
79
+ }
80
+ update(part, [classInfo]) {
81
+ if (this._previousClasses === undefined) {
82
+ this._previousClasses = new Set;
83
+ if (part.strings !== undefined) {
84
+ this._staticClasses = new Set(part.strings.join(" ").split(/\s/).filter((s) => s !== ""));
85
+ }
86
+ for (const name in classInfo) {
87
+ if (classInfo[name] && !this._staticClasses?.has(name)) {
88
+ this._previousClasses.add(name);
89
+ }
90
+ }
91
+ return this.render(classInfo);
92
+ }
93
+ const classList = part.element.classList;
94
+ for (const name of this._previousClasses) {
95
+ if (!(name in classInfo)) {
96
+ classList.remove(name);
97
+ this._previousClasses.delete(name);
98
+ }
99
+ }
100
+ for (const name in classInfo) {
101
+ const value = !!classInfo[name];
102
+ if (value !== this._previousClasses.has(name) && !this._staticClasses?.has(name)) {
103
+ if (value) {
104
+ classList.add(name);
105
+ this._previousClasses.add(name);
106
+ } else {
107
+ classList.remove(name);
108
+ this._previousClasses.delete(name);
109
+ }
110
+ }
111
+ }
112
+ return noChange;
113
+ }
114
+ }
115
+ var classMap = directive(ClassMapDirective);
116
116
 
117
- export { classMap, styleMap, ifDefined };
117
+ export { ifDefined, styleMap, classMap };
118
118
 
119
- //# debugId=69E323004940924164756E2164756E21
120
- //# sourceMappingURL=studio-cx91mnh8.js.map
119
+ //# debugId=A0F1689B5230596A64756E2164756E21
120
+ //# sourceMappingURL=studio-ckwz4d3x.js.map
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../node_modules/lit-html/development/directives/class-map.js", "../../../node_modules/lit-html/development/directives/style-map.js", "../../../node_modules/lit-html/development/directives/if-defined.js"],
3
+ "sources": ["../../../node_modules/lit-html/development/directives/if-defined.js", "../../../node_modules/lit-html/development/directives/style-map.js", "../../../node_modules/lit-html/development/directives/class-map.js"],
4
4
  "sourcesContent": [
5
- "/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nimport { noChange } from '../lit-html.js';\nimport { directive, Directive, PartType, } from '../directive.js';\nclass ClassMapDirective extends Directive {\n constructor(partInfo) {\n super(partInfo);\n if (partInfo.type !== PartType.ATTRIBUTE ||\n partInfo.name !== 'class' ||\n partInfo.strings?.length > 2) {\n throw new Error('`classMap()` can only be used in the `class` attribute ' +\n 'and must be the only part in the attribute.');\n }\n }\n render(classInfo) {\n // Add spaces to ensure separation from static classes\n return (' ' +\n Object.keys(classInfo)\n .filter((key) => classInfo[key])\n .join(' ') +\n ' ');\n }\n update(part, [classInfo]) {\n // Remember dynamic classes on the first render\n if (this._previousClasses === undefined) {\n this._previousClasses = new Set();\n if (part.strings !== undefined) {\n this._staticClasses = new Set(part.strings\n .join(' ')\n .split(/\\s/)\n .filter((s) => s !== ''));\n }\n for (const name in classInfo) {\n if (classInfo[name] && !this._staticClasses?.has(name)) {\n this._previousClasses.add(name);\n }\n }\n return this.render(classInfo);\n }\n const classList = part.element.classList;\n // Remove old classes that no longer apply\n for (const name of this._previousClasses) {\n if (!(name in classInfo)) {\n classList.remove(name);\n this._previousClasses.delete(name);\n }\n }\n // Add or remove classes based on their classMap value\n for (const name in classInfo) {\n // We explicitly want a loose truthy check of `value` because it seems\n // more convenient that '' and 0 are skipped.\n const value = !!classInfo[name];\n if (value !== this._previousClasses.has(name) &&\n !this._staticClasses?.has(name)) {\n if (value) {\n classList.add(name);\n this._previousClasses.add(name);\n }\n else {\n classList.remove(name);\n this._previousClasses.delete(name);\n }\n }\n }\n return noChange;\n }\n}\n/**\n * A directive that applies dynamic CSS classes.\n *\n * This must be used in the `class` attribute and must be the only part used in\n * the attribute. It takes each property in the `classInfo` argument and adds\n * the property name to the element's `classList` if the property value is\n * truthy; if the property value is falsy, the property name is removed from\n * the element's `class`.\n *\n * For example `{foo: bar}` applies the class `foo` if the value of `bar` is\n * truthy.\n *\n * @param classInfo\n */\nexport const classMap = directive(ClassMapDirective);\n//# sourceMappingURL=class-map.js.map",
5
+ "/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nimport { nothing } from '../lit-html.js';\n/**\n * For AttributeParts, sets the attribute if the value is defined and removes\n * the attribute if the value is undefined.\n *\n * For other part types, this directive is a no-op.\n */\nexport const ifDefined = (value) => value ?? nothing;\n//# sourceMappingURL=if-defined.js.map",
6
6
  "/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nimport { noChange } from '../lit-html.js';\nimport { directive, Directive, PartType, } from '../directive.js';\nconst important = 'important';\n// The leading space is important\nconst importantFlag = ' !' + important;\n// How many characters to remove from a value, as a negative number\nconst flagTrim = 0 - importantFlag.length;\nclass StyleMapDirective extends Directive {\n constructor(partInfo) {\n super(partInfo);\n if (partInfo.type !== PartType.ATTRIBUTE ||\n partInfo.name !== 'style' ||\n partInfo.strings?.length > 2) {\n throw new Error('The `styleMap` directive must be used in the `style` attribute ' +\n 'and must be the only part in the attribute.');\n }\n }\n render(styleInfo) {\n return Object.keys(styleInfo).reduce((style, prop) => {\n const value = styleInfo[prop];\n if (value == null) {\n return style;\n }\n // Convert property names from camel-case to dash-case, i.e.:\n // `backgroundColor` -> `background-color`\n // Vendor-prefixed names need an extra `-` appended to front:\n // `webkitAppearance` -> `-webkit-appearance`\n // Exception is any property name containing a dash, including\n // custom properties; we assume these are already dash-cased i.e.:\n // `--my-button-color` --> `--my-button-color`\n prop = prop.includes('-')\n ? prop\n : prop\n .replace(/(?:^(webkit|moz|ms|o)|)(?=[A-Z])/g, '-$&')\n .toLowerCase();\n return style + `${prop}:${value};`;\n }, '');\n }\n update(part, [styleInfo]) {\n const { style } = part.element;\n if (this._previousStyleProperties === undefined) {\n this._previousStyleProperties = new Set(Object.keys(styleInfo));\n return this.render(styleInfo);\n }\n // Remove old properties that no longer exist in styleInfo\n for (const name of this._previousStyleProperties) {\n // If the name isn't in styleInfo or it's null/undefined\n if (styleInfo[name] == null) {\n this._previousStyleProperties.delete(name);\n if (name.includes('-')) {\n style.removeProperty(name);\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n style[name] = null;\n }\n }\n }\n // Add or update properties\n for (const name in styleInfo) {\n const value = styleInfo[name];\n if (value != null) {\n this._previousStyleProperties.add(name);\n const isImportant = typeof value === 'string' && value.endsWith(importantFlag);\n if (name.includes('-') || isImportant) {\n style.setProperty(name, isImportant\n ? value.slice(0, flagTrim)\n : value, isImportant ? important : '');\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n style[name] = value;\n }\n }\n }\n return noChange;\n }\n}\n/**\n * A directive that applies CSS properties to an element.\n *\n * `styleMap` can only be used in the `style` attribute and must be the only\n * expression in the attribute. It takes the property names in the\n * {@link StyleInfo styleInfo} object and adds the properties to the inline\n * style of the element.\n *\n * Property names with dashes (`-`) are assumed to be valid CSS\n * property names and set on the element's style object using `setProperty()`.\n * Names without dashes are assumed to be camelCased JavaScript property names\n * and set on the element's style object using property assignment, allowing the\n * style object to translate JavaScript-style names to CSS property names.\n *\n * For example `styleMap({backgroundColor: 'red', 'border-top': '5px', '--size':\n * '0'})` sets the `background-color`, `border-top` and `--size` properties.\n *\n * @param styleInfo\n * @see {@link https://lit.dev/docs/templates/directives/#stylemap styleMap code samples on Lit.dev}\n */\nexport const styleMap = directive(StyleMapDirective);\n//# sourceMappingURL=style-map.js.map",
7
- "/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nimport { nothing } from '../lit-html.js';\n/**\n * For AttributeParts, sets the attribute if the value is defined and removes\n * the attribute if the value is undefined.\n *\n * For other part types, this directive is a no-op.\n */\nexport const ifDefined = (value) => value ?? nothing;\n//# sourceMappingURL=if-defined.js.map"
7
+ "/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nimport { noChange } from '../lit-html.js';\nimport { directive, Directive, PartType, } from '../directive.js';\nclass ClassMapDirective extends Directive {\n constructor(partInfo) {\n super(partInfo);\n if (partInfo.type !== PartType.ATTRIBUTE ||\n partInfo.name !== 'class' ||\n partInfo.strings?.length > 2) {\n throw new Error('`classMap()` can only be used in the `class` attribute ' +\n 'and must be the only part in the attribute.');\n }\n }\n render(classInfo) {\n // Add spaces to ensure separation from static classes\n return (' ' +\n Object.keys(classInfo)\n .filter((key) => classInfo[key])\n .join(' ') +\n ' ');\n }\n update(part, [classInfo]) {\n // Remember dynamic classes on the first render\n if (this._previousClasses === undefined) {\n this._previousClasses = new Set();\n if (part.strings !== undefined) {\n this._staticClasses = new Set(part.strings\n .join(' ')\n .split(/\\s/)\n .filter((s) => s !== ''));\n }\n for (const name in classInfo) {\n if (classInfo[name] && !this._staticClasses?.has(name)) {\n this._previousClasses.add(name);\n }\n }\n return this.render(classInfo);\n }\n const classList = part.element.classList;\n // Remove old classes that no longer apply\n for (const name of this._previousClasses) {\n if (!(name in classInfo)) {\n classList.remove(name);\n this._previousClasses.delete(name);\n }\n }\n // Add or remove classes based on their classMap value\n for (const name in classInfo) {\n // We explicitly want a loose truthy check of `value` because it seems\n // more convenient that '' and 0 are skipped.\n const value = !!classInfo[name];\n if (value !== this._previousClasses.has(name) &&\n !this._staticClasses?.has(name)) {\n if (value) {\n classList.add(name);\n this._previousClasses.add(name);\n }\n else {\n classList.remove(name);\n this._previousClasses.delete(name);\n }\n }\n }\n return noChange;\n }\n}\n/**\n * A directive that applies dynamic CSS classes.\n *\n * This must be used in the `class` attribute and must be the only part used in\n * the attribute. It takes each property in the `classInfo` argument and adds\n * the property name to the element's `classList` if the property value is\n * truthy; if the property value is falsy, the property name is removed from\n * the element's `class`.\n *\n * For example `{foo: bar}` applies the class `foo` if the value of `bar` is\n * truthy.\n *\n * @param classInfo\n */\nexport const classMap = directive(ClassMapDirective);\n//# sourceMappingURL=class-map.js.map"
8
8
  ],
9
- "mappings": "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",
10
- "debugId": "69E323004940924164756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "A0F1689B5230596A64756E2164756E21",
11
11
  "names": []
12
12
  }
@@ -0,0 +1,28 @@
1
+ // ../collab/src/negotiate.ts
2
+ var COLLAB_SUBPROTOCOL = "jx.collab.v1";
3
+ function negotiateCollab(probe) {
4
+ if (probe === null || typeof probe !== "object") {
5
+ return { offer: [], refused: null };
6
+ }
7
+ const body = probe;
8
+ if (body.collab === false) {
9
+ return { offer: [], refused: "This server has collaboration disabled." };
10
+ }
11
+ const { protocols } = body;
12
+ if (!Array.isArray(protocols) || protocols.length === 0) {
13
+ return { offer: [], refused: null };
14
+ }
15
+ if (protocols.includes(COLLAB_SUBPROTOCOL)) {
16
+ return { offer: [COLLAB_SUBPROTOCOL], refused: null };
17
+ }
18
+ const theirs = protocols.filter((p) => typeof p === "string").join(", ") || "none";
19
+ return {
20
+ offer: [],
21
+ refused: `This server speaks collab envelope ${theirs}; this editor speaks ${COLLAB_SUBPROTOCOL}.`
22
+ };
23
+ }
24
+
25
+ export { negotiateCollab };
26
+
27
+ //# debugId=0E14F1DBFFC9648B64756E2164756E21
28
+ //# sourceMappingURL=studio-dg7zyt5x.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../collab/src/negotiate.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * WebSocket subprotocol negotiation for the collab socket (RFC 6455 §1.9, §4.2.2).\n *\n * **The token names the wire envelope, not the package.** `jx.collab.v1` means \"I speak the frame\n * layout `envelope.ts` documents\". There is one token per envelope **major**, and the rule for\n * bumping it is narrow on purpose: bump when {@link decodeFrame} would _mis-parse_ a peer's frame —\n * a field reordered, a type widened, a length prefix changed. **Do not bump for a new frame type.**\n * Both halves already skip a frame type they do not know, so a v1 peer and a v1-plus-one-frame peer\n * interoperate; bumping there would refuse a room that would have worked.\n *\n * **Why the capability probe does the negotiating.** RFC 6455 §4.1 requires a client that offered\n * subprotocols and received no echo to _fail the connection_, and browsers enforce it. So a new\n * Studio that unconditionally offered `jx.collab.v1` would lose collab entirely against an older\n * dev server — a regression caused by the fix. The probe already exists, already returns a version\n * the client discards, and runs before the socket: it is the one place the client can learn what\n * the server speaks without risking the handshake. Hence {@link negotiateCollab}, which turns a\n * probe body into the list to offer — empty against a server that advertises nothing.\n *\n * **Nothing here may go in the `hello` control message.** That arrives after the socket is up and\n * after frames may already have been exchanged, which is too late to prevent the divergent-history\n * merge `schema.ts` warns about. Negotiation has to conclude before a byte of document state\n * moves.\n *\n * This module imports nothing, deliberately: the Studio platform adapters read it eagerly, before\n * the dynamic import that pulls in Yjs, so it must not drag the CRDT into the initial bundle.\n */\n\n/** The subprotocol token for the envelope in `envelope.ts`. One token per envelope major. */\nexport const COLLAB_SUBPROTOCOL = \"jx.collab.v1\";\n\n/** What the client should do with the socket, given what the server advertised. */\nexport interface CollabNegotiation {\n /**\n * The subprotocols to offer as `Sec-WebSocket-Protocol`. **Empty means offer none**, which is the\n * correct answer against a server that advertises none: an offer it cannot echo would fail the\n * handshake outright, where offering nothing connects exactly as it does today.\n */\n offer: string[];\n /**\n * Non-null when the peers cannot interoperate: the server advertised subprotocols and none of\n * them is one we speak. The client must not connect — the string says which side speaks what, so\n * the degradation is legible rather than a silent solo session.\n */\n refused: string | null;\n}\n\n/**\n * Decide what to offer, from the body of a `GET /__studio/collab` capability probe.\n *\n * @param {unknown} probe The parsed probe body, or null if it did not parse as JSON.\n * @returns {CollabNegotiation}\n */\nexport function negotiateCollab(probe: unknown): CollabNegotiation {\n if (probe === null || typeof probe !== \"object\") {\n // A 200 that is not a JSON object: pre-negotiation server. Connect as before, offering nothing.\n return { offer: [], refused: null };\n }\n const body = probe as { collab?: unknown; protocols?: unknown };\n if (body.collab === false) {\n return { offer: [], refused: \"This server has collaboration disabled.\" };\n }\n const { protocols } = body;\n if (!Array.isArray(protocols) || protocols.length === 0) {\n // A server that predates negotiation. It would echo nothing, so we must offer nothing.\n return { offer: [], refused: null };\n }\n if (protocols.includes(COLLAB_SUBPROTOCOL)) {\n return { offer: [COLLAB_SUBPROTOCOL], refused: null };\n }\n const theirs = protocols.filter((p) => typeof p === \"string\").join(\", \") || \"none\";\n return {\n offer: [],\n refused: `This server speaks collab envelope ${theirs}; this editor speaks ${COLLAB_SUBPROTOCOL}.`,\n };\n}\n\n/**\n * The subprotocols a client offered, from its `Sec-WebSocket-Protocol` request header.\n *\n * RFC 6455 §4.1 allows the field to be split across several header lines and comma-separated within\n * one; `Headers.get` already joins repeats with `, `, so one split covers both spellings.\n *\n * @param {string | null} header\n * @returns {string[]}\n */\nexport function offeredSubprotocols(header: string | null): string[] {\n if (!header) {\n return [];\n }\n return header\n .split(\",\")\n .map((token) => token.trim())\n .filter((token) => token !== \"\");\n}\n\n/** What the server should do with an upgrade, given the client's offer. */\nexport interface SubprotocolAnswer {\n /** The token to echo in the 101 response, or null to echo nothing. */\n echo: string | null;\n /** Non-null when the handshake must be refused instead of upgraded. */\n reject: string | null;\n}\n\n/**\n * Choose the subprotocol to echo (RFC 6455 §4.2.2 step 4).\n *\n * Three cases, and the middle one is the one that is easy to get wrong:\n *\n * - **No offer** — an older client. Upgrade and echo nothing; it is not expecting an echo, and\n * refusing it would break every Studio built before this shipped.\n * - **An offer we speak** — echo exactly that token. Echoing a token the client did not offer is\n * itself a protocol violation, so the echo is always a member of the offer.\n * - **An offer we do not speak** — refuse. This is the whole point: two peers whose envelopes\n * disagree about merge granularity (see `collab.md` §3.1) must not end up in one room, and a\n * refused handshake is a far better outcome than a divergent-history merge.\n *\n * @param {string[]} offered\n * @returns {SubprotocolAnswer}\n */\nexport function selectSubprotocol(offered: string[]): SubprotocolAnswer {\n if (offered.length === 0) {\n return { echo: null, reject: null };\n }\n if (offered.includes(COLLAB_SUBPROTOCOL)) {\n return { echo: COLLAB_SUBPROTOCOL, reject: null };\n }\n return {\n echo: null,\n reject: `No supported collab subprotocol offered (this server speaks ${COLLAB_SUBPROTOCOL}).`,\n };\n}\n"
6
+ ],
7
+ "mappings": ";AA4BO,IAAM,qBAAqB;AAwB3B,SAAS,eAAe,CAAC,OAAmC;AAAA,EACjE,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAAA,IAE/C,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,KAAK;AAAA,EACpC;AAAA,EACA,MAAM,OAAO;AAAA,EACb,IAAI,KAAK,WAAW,OAAO;AAAA,IACzB,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,0CAA0C;AAAA,EACzE;AAAA,EACA,QAAQ,cAAc;AAAA,EACtB,IAAI,CAAC,MAAM,QAAQ,SAAS,KAAK,UAAU,WAAW,GAAG;AAAA,IAEvD,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,KAAK;AAAA,EACpC;AAAA,EACA,IAAI,UAAU,SAAS,kBAAkB,GAAG;AAAA,IAC1C,OAAO,EAAE,OAAO,CAAC,kBAAkB,GAAG,SAAS,KAAK;AAAA,EACtD;AAAA,EACA,MAAM,SAAS,UAAU,OAAO,CAAC,MAAM,OAAO,MAAM,QAAQ,EAAE,KAAK,IAAI,KAAK;AAAA,EAC5E,OAAO;AAAA,IACL,OAAO,CAAC;AAAA,IACR,SAAS,sCAAsC,8BAA8B;AAAA,EAC/E;AAAA;",
8
+ "debugId": "0E14F1DBFFC9648B64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,166 @@
1
+ import {
2
+ rectOf
3
+ } from "./studio-v96qfnww.js";
4
+
5
+ // src/ui/virtual-window.ts
6
+ var DEFAULT_OVERSCAN_ROWS = 3;
7
+ function clamp(value, low, high) {
8
+ return Math.min(high, Math.max(low, value));
9
+ }
10
+ function computeWindow(spec) {
11
+ const count = Math.max(0, Math.trunc(spec.count));
12
+ const columns = Math.max(1, Math.trunc(spec.columns ?? 1));
13
+ const totalRows = Math.ceil(count / columns);
14
+ if (!(spec.rowHeight > 0) || !(spec.viewportHeight > 0)) {
15
+ return { end: count, padBottom: 0, padTop: 0, start: 0, totalRows };
16
+ }
17
+ const overscan = Math.max(0, Math.trunc(spec.overscanRows ?? DEFAULT_OVERSCAN_ROWS));
18
+ const scrollTop = Math.max(0, spec.scrollTop);
19
+ const firstVisibleRow = Math.floor(scrollTop / spec.rowHeight);
20
+ const visibleRows = Math.ceil(spec.viewportHeight / spec.rowHeight) + 1;
21
+ const startRow = clamp(firstVisibleRow - overscan, 0, totalRows);
22
+ const endRow = clamp(firstVisibleRow + visibleRows + overscan, startRow, totalRows);
23
+ return {
24
+ end: Math.min(count, endRow * columns),
25
+ padBottom: (totalRows - endRow) * spec.rowHeight,
26
+ padTop: startRow * spec.rowHeight,
27
+ start: Math.min(count, startRow * columns),
28
+ totalRows
29
+ };
30
+ }
31
+ function sameWindow(a, b) {
32
+ return a.start === b.start && a.end === b.end && a.totalRows === b.totalRows;
33
+ }
34
+ function createVirtualWindow(options) {
35
+ const { scroller, list, count, rowHeight, columns, onChange, overscanRows } = options;
36
+ let current = { end: 0, padBottom: 0, padTop: 0, start: 0, totalRows: 0 };
37
+ let destroyed = false;
38
+ function measure() {
39
+ if (destroyed) {
40
+ return;
41
+ }
42
+ const next = computeWindow({
43
+ columns: columns?.() ?? 1,
44
+ count: count(),
45
+ overscanRows: overscanRows ?? DEFAULT_OVERSCAN_ROWS,
46
+ rowHeight: rowHeight(),
47
+ scrollTop: list ? listScrollTop(scroller, list) : scroller.scrollTop,
48
+ viewportHeight: scroller.clientHeight
49
+ });
50
+ const changed = !sameWindow(current, next);
51
+ current = next;
52
+ if (changed) {
53
+ onChange(next);
54
+ }
55
+ }
56
+ scroller.addEventListener("scroll", measure, { passive: true });
57
+ let resizeObserver = null;
58
+ if (typeof ResizeObserver === "function") {
59
+ resizeObserver = new ResizeObserver(() => measure());
60
+ resizeObserver.observe(scroller);
61
+ }
62
+ measure();
63
+ return {
64
+ destroy() {
65
+ destroyed = true;
66
+ scroller.removeEventListener("scroll", measure);
67
+ resizeObserver?.disconnect();
68
+ resizeObserver = null;
69
+ },
70
+ measure,
71
+ range: () => current
72
+ };
73
+ }
74
+ function nearestScroller(el) {
75
+ for (let node = el;node; node = node.parentElement) {
76
+ if (node.scrollHeight <= node.clientHeight) {
77
+ continue;
78
+ }
79
+ const overflow = getComputedStyle(node).overflowY;
80
+ if (overflow === "auto" || overflow === "scroll" || overflow === "overlay") {
81
+ return node;
82
+ }
83
+ }
84
+ return null;
85
+ }
86
+ function listScrollTop(scroller, list) {
87
+ if (scroller === list) {
88
+ return Math.max(0, scroller.scrollTop);
89
+ }
90
+ return Math.max(0, rectOf(scroller).top - rectOf(list).top);
91
+ }
92
+ function listWindow(list, spec) {
93
+ const scroller = list?.isConnected === true ? nearestScroller(list) : null;
94
+ if (!scroller || !list) {
95
+ const count = Math.max(0, Math.trunc(spec.count));
96
+ return { end: count, padBottom: 0, padTop: 0, start: 0, totalRows: count };
97
+ }
98
+ return computeWindow({
99
+ columns: spec.columns ?? 1,
100
+ count: spec.count,
101
+ ...spec.overscanRows === undefined ? {} : { overscanRows: spec.overscanRows },
102
+ rowHeight: spec.rowHeight,
103
+ scrollTop: listScrollTop(scroller, list),
104
+ viewportHeight: scroller.clientHeight
105
+ });
106
+ }
107
+ function scrollTopToReveal(spec) {
108
+ const top = spec.listOffset + spec.index * spec.rowHeight;
109
+ const bottom = top + spec.rowHeight;
110
+ if (top < spec.scrollTop) {
111
+ return Math.max(0, top);
112
+ }
113
+ if (bottom > spec.scrollTop + spec.viewportHeight) {
114
+ return Math.max(0, bottom - spec.viewportHeight);
115
+ }
116
+ return null;
117
+ }
118
+ function revealListRow(list, index, rowHeight) {
119
+ const scroller = list?.isConnected === true ? nearestScroller(list) : null;
120
+ if (!scroller || !list || index < 0 || !(rowHeight > 0)) {
121
+ return false;
122
+ }
123
+ const { scrollTop } = scroller;
124
+ const next = scrollTopToReveal({
125
+ index,
126
+ listOffset: scrollTop - listScrollTop(scroller, list),
127
+ rowHeight,
128
+ scrollTop,
129
+ viewportHeight: scroller.clientHeight
130
+ });
131
+ if (next === null) {
132
+ return false;
133
+ }
134
+ scroller.scrollTop = next;
135
+ return true;
136
+ }
137
+ function measuredRowHeight(list, selector, declared) {
138
+ const row = list?.querySelector(selector);
139
+ return row && row.offsetHeight > 0 ? row.offsetHeight : declared;
140
+ }
141
+ function watchListWindow(previous, list, spec) {
142
+ const scroller = nearestScroller(list);
143
+ if (previous && previous.list === list && previous.scroller === scroller) {
144
+ return previous;
145
+ }
146
+ previous?.window.destroy();
147
+ if (!scroller) {
148
+ return null;
149
+ }
150
+ return {
151
+ list,
152
+ scroller,
153
+ window: createVirtualWindow({
154
+ count: spec.count,
155
+ list,
156
+ onChange: () => spec.onChange(),
157
+ rowHeight: spec.rowHeight,
158
+ scroller
159
+ })
160
+ };
161
+ }
162
+
163
+ export { computeWindow, listWindow, revealListRow, measuredRowHeight, watchListWindow };
164
+
165
+ //# debugId=4C38350338F9781B64756E2164756E21
166
+ //# sourceMappingURL=studio-dzcyvvvz.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ui/virtual-window.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Virtual-window.ts — the windowing primitive behind every long list in Studio.\n *\n * **Why this is the acceptance criterion and not a nicety.** The Manage view the Library replaces\n * rendered one card per file with no cap, and each Pages/Layouts/Components/Content card mounted a\n * REAL `@jxsuite/runtime` render of that document. Opening \"All\" on a 300-page project therefore\n * built 300 live documents, in one synchronous lit pass, and kept every one of them alive in an\n * unbounded `Map`. The window is what makes the cost proportional to the VIEWPORT instead of to the\n * project. The two trees pay a smaller version of the same bill — a 5 000-node page drew 5 000\n * rows, each an `sp-icon` custom element — and they now pay it through this file.\n *\n * **It lives in `ui/`, not in `browse/`.** P3 workstream 11 promised \"one virtual-list primitive\n * behind the Files tree and the Outline tree, reused by the Library grid\", and what shipped sat\n * inside the Library and was imported by the Library alone. A primitive two surfaces share cannot\n * live inside one of them: the next surface that needs it either reaches across a feature boundary\n * or writes a second copy, and a second copy is how \"the tree renders every row\" survived a phase\n * that had already solved it.\n *\n * The maths is deliberately a pure function ({@link computeWindow}) rather than a class: it is the\n * part that has to be right, it is the part the perf test measures, and it needs no DOM to state.\n * {@link createVirtualWindow} is the thin observer that feeds it scroll positions, and the\n * {@link nearestScroller} half below is the small amount of DOM a list that does NOT own its own\n * scrollbar needs — both trees scroll inside `#left-panel`, which also holds their toolbars.\n *\n * One primitive, three surfaces: the Library (Table rows, Cards, Media), the Files tree and the\n * Outline. The geometry never mentions what an item IS.\n */\n\n/// <reference lib=\"dom\" />\n\nimport { rectOf } from \"../utils/geometry\";\n\n/** The measurement a window is computed from. Everything is in CSS pixels. */\nexport interface WindowSpec {\n /** How many items exist in total. */\n count: number;\n /** Height of one ROW. A grid row holds {@link WindowSpec.columns} items. */\n rowHeight: number;\n /** Items per row. 1 for a list. Clamped to at least 1. */\n columns?: number;\n /** The scroller's current `scrollTop`. */\n scrollTop: number;\n /** The scroller's visible height. */\n viewportHeight: number;\n /** Extra rows rendered above and below the viewport. Defaults to {@link DEFAULT_OVERSCAN_ROWS}. */\n overscanRows?: number;\n}\n\n/**\n * Which items to render, and how much empty space to reserve either side of them.\n *\n * `padTop`/`padBottom` are spacer heights rather than absolute positioning, so a windowed list is\n * still an ordinary flow container: it wraps, it prints, and a focused control inside it scrolls\n * into view without anything computing coordinates.\n */\nexport interface WindowRange {\n /** First item index, inclusive. */\n start: number;\n /** Last item index, EXCLUSIVE. */\n end: number;\n /** Pixels of spacer above the first rendered row. */\n padTop: number;\n /** Pixels of spacer below the last rendered row. */\n padBottom: number;\n /** Total rows the full list would occupy — what the scrollbar is sized from. */\n totalRows: number;\n}\n\n/**\n * Rows kept beyond each edge of the viewport.\n *\n * Three, not zero: a window with no overscan repaints on every scroll frame and shows a blank strip\n * for one frame at speed. Three is the smallest value at which neither is observable at a normal\n * wheel velocity, and it is small enough that the LRU preview cap still dominates.\n */\nexport const DEFAULT_OVERSCAN_ROWS = 3;\n\n/** Clamp `value` into `[low, high]`. */\nfunction clamp(value: number, low: number, high: number): number {\n return Math.min(high, Math.max(low, value));\n}\n\n/**\n * The visible window for a spec.\n *\n * Total-safe by construction: a zero or negative `rowHeight` (an unmeasured container, a display:\n * none pane) yields the whole list rather than an infinite loop or an empty render, because a\n * Library that renders nothing is indistinguishable from a Library that found nothing — the exact\n * confusion this phase exists to remove.\n */\nexport function computeWindow(spec: WindowSpec): WindowRange {\n const count = Math.max(0, Math.trunc(spec.count));\n const columns = Math.max(1, Math.trunc(spec.columns ?? 1));\n const totalRows = Math.ceil(count / columns);\n\n if (!(spec.rowHeight > 0) || !(spec.viewportHeight > 0)) {\n return { end: count, padBottom: 0, padTop: 0, start: 0, totalRows };\n }\n\n const overscan = Math.max(0, Math.trunc(spec.overscanRows ?? DEFAULT_OVERSCAN_ROWS));\n const scrollTop = Math.max(0, spec.scrollTop);\n const firstVisibleRow = Math.floor(scrollTop / spec.rowHeight);\n const visibleRows = Math.ceil(spec.viewportHeight / spec.rowHeight) + 1;\n\n const startRow = clamp(firstVisibleRow - overscan, 0, totalRows);\n const endRow = clamp(firstVisibleRow + visibleRows + overscan, startRow, totalRows);\n\n return {\n end: Math.min(count, endRow * columns),\n padBottom: (totalRows - endRow) * spec.rowHeight,\n padTop: startRow * spec.rowHeight,\n start: Math.min(count, startRow * columns),\n totalRows,\n };\n}\n\n/** Two ranges are the same window — the guard that keeps scrolling from repainting every frame. */\nexport function sameWindow(a: WindowRange, b: WindowRange): boolean {\n return a.start === b.start && a.end === b.end && a.totalRows === b.totalRows;\n}\n\n// ─── The observer ────────────────────────────────────────────────────────────\n\nexport interface VirtualWindow {\n /** The current range. Read during render; never stale by more than one frame. */\n range: () => WindowRange;\n /** Re-measure and recompute (count changed, layout changed, container resized). */\n measure: () => void;\n /** Stop listening. Idempotent. */\n destroy: () => void;\n}\n\nexport interface VirtualWindowOptions {\n /** The element that scrolls. */\n scroller: HTMLElement;\n /**\n * The list inside `scroller`, when the scroller carries more than the list.\n *\n * Both trees scroll inside `#left-panel`, which also holds a project header, a toolbar and — for\n * the Files tree — a search field. Their first row is therefore NOT at `scrollTop` 0, and a\n * window computed from the scroller's own `scrollTop` would be that header's height out from the\n * first scroll onwards. Omit it when the list IS the scroller (the Library's pane).\n */\n list?: HTMLElement;\n /** Item count right now — read on every measure, so it may change without re-creating. */\n count: () => number;\n /** Row height right now. */\n rowHeight: () => number;\n /** Items per row right now. */\n columns?: () => number;\n /** Called only when the window actually CHANGED. */\n onChange: (range: WindowRange) => void;\n overscanRows?: number;\n}\n\n/**\n * Watch a scroller and report window changes.\n *\n * Scroll is listened to passively and answered synchronously: the range is cheap to compute and a\n * rAF hop would paint the spacer before the content one frame in three. `ResizeObserver` covers the\n * pane being resized; where the environment has none (happy-dom), `measure()` is the whole contract\n * and the caller drives it — which is also how the perf test drives it.\n */\nexport function createVirtualWindow(options: VirtualWindowOptions): VirtualWindow {\n const { scroller, list, count, rowHeight, columns, onChange, overscanRows } = options;\n let current: WindowRange = { end: 0, padBottom: 0, padTop: 0, start: 0, totalRows: 0 };\n let destroyed = false;\n\n function measure() {\n if (destroyed) {\n return;\n }\n const next = computeWindow({\n columns: columns?.() ?? 1,\n count: count(),\n overscanRows: overscanRows ?? DEFAULT_OVERSCAN_ROWS,\n rowHeight: rowHeight(),\n scrollTop: list ? listScrollTop(scroller, list) : scroller.scrollTop,\n viewportHeight: scroller.clientHeight,\n });\n const changed = !sameWindow(current, next);\n current = next;\n if (changed) {\n onChange(next);\n }\n }\n\n scroller.addEventListener(\"scroll\", measure, { passive: true });\n\n let resizeObserver: ResizeObserver | null = null;\n if (typeof ResizeObserver === \"function\") {\n resizeObserver = new ResizeObserver(() => measure());\n resizeObserver.observe(scroller);\n }\n\n measure();\n\n return {\n destroy() {\n destroyed = true;\n scroller.removeEventListener(\"scroll\", measure);\n resizeObserver?.disconnect();\n resizeObserver = null;\n },\n measure,\n range: () => current,\n };\n}\n\n// ─── A list that does not own its scrollbar ──────────────────────────────────\n\n/**\n * The element that scrolls `el`, or null when nothing does.\n *\n * TWO conditions, and the second is the one that makes this honest. An element is the scroller only\n * if it both declares a scrolling overflow AND currently has something to scroll. `.file-tree`\n * declares `overflow-y: auto` (styles/panels.css) but is never given a height, so it grows with its\n * content and never scrolls — treating it as the scroller would read its full content height as the\n * VIEWPORT height and window nothing at all, silently. The `scrollHeight > clientHeight` test walks\n * past it to `#left-panel`, which is where both trees actually scroll.\n *\n * The same test is why a list whose content fits is never windowed: there is nothing to scroll, so\n * there is nothing to save, and the whole list renders exactly as it always did.\n */\nexport function nearestScroller(el: HTMLElement | null): HTMLElement | null {\n for (let node: HTMLElement | null = el; node; node = node.parentElement) {\n // Cheap test first: happy-dom performs no layout, so this is 0 > 0 for every element and no\n // Test ever pays for a `getComputedStyle` walk it cannot answer.\n if (node.scrollHeight <= node.clientHeight) {\n continue;\n }\n const overflow = getComputedStyle(node).overflowY;\n if (overflow === \"auto\" || overflow === \"scroll\" || overflow === \"overlay\") {\n return node;\n }\n }\n return null;\n}\n\n/**\n * How far `list`'s first row has scrolled above the top of `scroller`'s viewport.\n *\n * Measured from the two rects rather than from `offsetTop`, because the chrome between them is not\n * a fixed height: the Files tree's toolbar and the project header are both conditional. When the\n * list IS the scroller there is no chrome and its own `scrollTop` is the answer.\n */\nexport function listScrollTop(scroller: HTMLElement, list: HTMLElement): number {\n if (scroller === list) {\n return Math.max(0, scroller.scrollTop);\n }\n return Math.max(0, rectOf(scroller).top - rectOf(list).top);\n}\n\n/**\n * The window for a list rendered inside whatever scrolls it — the trees' entry point.\n *\n * Answers \"the whole list\" for a list that has not been rendered yet, has been detached, or is not\n * inside anything that scrolls. That is not a fallback bolted on for tests: it is the FIRST paint\n * of every session (nothing can be measured before the rows exist), and it is every list short\n * enough to fit. Both must render everything, and both are what the trees did before they\n * windowed.\n */\nexport function listWindow(\n list: HTMLElement | null,\n spec: { count: number; rowHeight: number; columns?: number; overscanRows?: number },\n): WindowRange {\n const scroller = list?.isConnected === true ? nearestScroller(list) : null;\n if (!scroller || !list) {\n const count = Math.max(0, Math.trunc(spec.count));\n return { end: count, padBottom: 0, padTop: 0, start: 0, totalRows: count };\n }\n return computeWindow({\n columns: spec.columns ?? 1,\n count: spec.count,\n ...(spec.overscanRows === undefined ? {} : { overscanRows: spec.overscanRows }),\n rowHeight: spec.rowHeight,\n scrollTop: listScrollTop(scroller, list),\n viewportHeight: scroller.clientHeight,\n });\n}\n\n/**\n * The `scrollTop` that brings row `index` into view, or null when it already is.\n *\n * `block: \"nearest\"` semantics, stated as arithmetic: a windowed list cannot delegate this to\n * `Element.scrollIntoView`, because the row it must reveal is precisely the one that has no\n * element. Pure, so the reveal rule is testable without a scroller.\n */\nexport function scrollTopToReveal(spec: {\n index: number;\n rowHeight: number;\n /** Where the list's first row sits in the scroller's CONTENT, not its viewport. */\n listOffset: number;\n scrollTop: number;\n viewportHeight: number;\n}): number | null {\n const top = spec.listOffset + spec.index * spec.rowHeight;\n const bottom = top + spec.rowHeight;\n if (top < spec.scrollTop) {\n return Math.max(0, top);\n }\n if (bottom > spec.scrollTop + spec.viewportHeight) {\n return Math.max(0, bottom - spec.viewportHeight);\n }\n return null;\n}\n\n/**\n * Scroll `list` so that its row at `index` is inside the window on the next render.\n *\n * Returns whether anything moved. The re-render is deliberately NOT triggered here: assigning\n * `scrollTop` fires a `scroll` event, and the watch installed by {@link watchListWindow} is already\n * the one thing that decides when a scroll is worth a repaint. A caller that repainted as well\n * would paint twice for one keystroke.\n */\nexport function revealListRow(list: HTMLElement | null, index: number, rowHeight: number): boolean {\n const scroller = list?.isConnected === true ? nearestScroller(list) : null;\n if (!scroller || !list || index < 0 || !(rowHeight > 0)) {\n return false;\n }\n const { scrollTop } = scroller;\n const next = scrollTopToReveal({\n index,\n listOffset: scrollTop - listScrollTop(scroller, list),\n rowHeight,\n scrollTop,\n viewportHeight: scroller.clientHeight,\n });\n if (next === null) {\n return false;\n }\n scroller.scrollTop = next;\n return true;\n}\n\n/**\n * The height one row actually has, measured, with the stylesheet's declared height as the answer\n * until a row exists to measure.\n *\n * Both are needed. The DECLARED height (`styles/panels.css` gives `.layer-row` and\n * `.file-tree-item` a `block-size`) is what lets the FIRST render window anything at all, before\n * any row has been laid out. The MEASUREMENT is what stops that constant becoming a lie the day\n * someone changes the row's padding, a user zooms, or a locale's font raises the line box: a window\n * computed from a stale height does not fail loudly, it drifts, and the list quietly ends a few\n * rows short of its own scrollbar.\n */\nexport function measuredRowHeight(\n list: HTMLElement | null,\n selector: string,\n declared: number,\n): number {\n const row = list?.querySelector<HTMLElement>(selector);\n return row && row.offsetHeight > 0 ? row.offsetHeight : declared;\n}\n\n/** A live scroll watch over one list element. Held at module scope by the surface that renders it. */\nexport interface ListWindowWatch {\n /** The list this watch is bound to. A different element means a different watch. */\n list: HTMLElement;\n /** The scroller it resolved to when it was bound. */\n scroller: HTMLElement;\n window: VirtualWindow;\n}\n\n/**\n * Bind — or keep — the scroll watch that repaints a windowed list.\n *\n * Called from the surface's `afterRender`, where the rows exist and the scroller can be resolved,\n * and handed back its own previous handle so re-binding is the exception rather than the rule: the\n * tree element survives every re-render (lit reuses it), so the steady state is \"same list, same\n * scroller, nothing to do\". A new element — the panel remounted, or moved dock — moves the\n * listener, and a list that no longer scrolls drops it.\n *\n * Returns the handle to keep, or null when nothing scrolls this list.\n */\nexport function watchListWindow(\n previous: ListWindowWatch | null,\n list: HTMLElement,\n spec: { count: () => number; rowHeight: () => number; onChange: () => void },\n): ListWindowWatch | null {\n const scroller = nearestScroller(list);\n if (previous && previous.list === list && previous.scroller === scroller) {\n return previous;\n }\n previous?.window.destroy();\n if (!scroller) {\n return null;\n }\n return {\n list,\n scroller,\n window: createVirtualWindow({\n count: spec.count,\n list,\n onChange: () => spec.onChange(),\n rowHeight: spec.rowHeight,\n scroller,\n }),\n };\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "4C38350338F9781B64756E2164756E21",
9
+ "names": []
10
+ }
@@ -1,15 +1,20 @@
1
1
  import {
2
2
  focusableSelector
3
3
  } from "./studio-8q517dfr.js";
4
+ import {
5
+ defineElement
6
+ } from "./studio-18j3bmcz.js";
4
7
  import {
5
8
  SpectrumElement,
6
- css,
7
9
  property,
8
10
  query
9
- } from "./studio-9qr6fq7p.js";
11
+ } from "./studio-xm3dbxvn.js";
12
+ import {
13
+ css
14
+ } from "./studio-0rqqhrdy.js";
10
15
  import {
11
16
  ifDefined
12
- } from "./studio-cx91mnh8.js";
17
+ } from "./studio-ckwz4d3x.js";
13
18
  import {
14
19
  html
15
20
  } from "./studio-5x5774ak.js";
@@ -235,7 +240,7 @@ class Tooltip extends SpectrumElement {
235
240
  `;
236
241
  if (this.selfManaged) {
237
242
  this.dependencyManager.add("sp-overlay");
238
- import("./sp-overlay.dev-earn5as8.js");
243
+ import("./sp-overlay.dev-9ran0sfq.js");
239
244
  return html`
240
245
  <sp-overlay
241
246
  ?open=${this.open && !this.disabled && this.dependencyManager.loaded}
@@ -304,7 +309,10 @@ __decorateClass([
304
309
  property({ type: String })
305
310
  ], Tooltip.prototype, "variant", 1);
306
311
 
307
- export { DependencyManagerController, Tooltip };
312
+ // ../../node_modules/@spectrum-web-components/tooltip/sp-tooltip.dev.js
313
+ defineElement("sp-tooltip", Tooltip);
314
+
315
+ export { DependencyManagerController };
308
316
 
309
- //# debugId=F962DCA5695ED76664756E2164756E21
310
- //# sourceMappingURL=studio-7kqe41sa.js.map
317
+ //# debugId=B26C538C82CA430D64756E2164756E21
318
+ //# sourceMappingURL=studio-evkr5d3b.js.map