@jxsuite/studio 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. package/canvas.html +21 -0
  2. package/dist/chunks/Overlay.dev-qfjzkms8.js +23 -0
  3. package/dist/chunks/{Overlay.dev-cszx7yn5.js.map → Overlay.dev-qfjzkms8.js.map} +1 -1
  4. package/dist/chunks/{adapter-z8fkmbmv.js → adapter-qfnesn5v.js} +2 -2
  5. package/dist/chunks/{cf-settings-mmyv436d.js → cf-settings-73sh5z4p.js} +3 -3
  6. package/dist/chunks/{components-799jpvhm.js → components-2bpqp4mq.js} +5 -7
  7. package/dist/chunks/{components-799jpvhm.js.map → components-2bpqp4mq.js.map} +1 -1
  8. package/dist/chunks/content-source-34gnkbnn.js +38 -0
  9. package/dist/chunks/content-source-34gnkbnn.js.map +9 -0
  10. package/dist/chunks/convert-to-repeater-t8kxre5s.js +258 -0
  11. package/dist/chunks/convert-to-repeater-t8kxre5s.js.map +10 -0
  12. package/dist/chunks/extension-sections-6mqydz35.js +301 -0
  13. package/dist/chunks/extension-sections-6mqydz35.js.map +11 -0
  14. package/dist/chunks/files-8kn321h1.js +70 -0
  15. package/dist/chunks/files-8kn321h1.js.map +9 -0
  16. package/dist/chunks/{format-host-8jxwts2p.js → format-host-mkwsmt8d.js} +3 -3
  17. package/dist/chunks/git-panel-tjbr191d.js +51 -0
  18. package/dist/chunks/git-panel-tjbr191d.js.map +9 -0
  19. package/dist/chunks/{index-baeg2x3y.js → index-7pxchcce.js} +4 -3
  20. package/dist/chunks/{index-baeg2x3y.js.map → index-7pxchcce.js.map} +3 -3
  21. package/dist/chunks/{jx-validate-qx8degj7.js → jx-validate-v6qgknrs.js} +3 -3
  22. package/dist/chunks/layers-panel-87pb25km.js +58 -0
  23. package/dist/chunks/layers-panel-87pb25km.js.map +9 -0
  24. package/dist/chunks/{monaco-setup-zjdp9zdw.js → monaco-setup-e0yh25j4.js} +4 -75
  25. package/dist/chunks/{monaco-setup-zjdp9zdw.js.map → monaco-setup-e0yh25j4.js.map} +3 -4
  26. package/dist/chunks/publish-panel-m0fcgdrt.js +21 -0
  27. package/dist/chunks/publish-panel-m0fcgdrt.js.map +9 -0
  28. package/dist/chunks/quick-search-rhs6cbsb.js +53 -0
  29. package/dist/chunks/quick-search-rhs6cbsb.js.map +9 -0
  30. package/dist/chunks/right-panel-zpdxd98t.js +37 -0
  31. package/dist/chunks/right-panel-zpdxd98t.js.map +9 -0
  32. package/dist/chunks/section-registry-zmckaxf4.js +30 -0
  33. package/dist/chunks/section-registry-zmckaxf4.js.map +9 -0
  34. package/dist/chunks/sp-overlay.dev-9ran0sfq.js +18 -0
  35. package/dist/chunks/sp-overlay.dev-9ran0sfq.js.map +9 -0
  36. package/dist/chunks/sp-popover.dev-rebmdncr.js +9 -0
  37. package/dist/chunks/sp-popover.dev-rebmdncr.js.map +9 -0
  38. package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js +15 -0
  39. package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js.map +9 -0
  40. package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js +15 -0
  41. package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js.map +9 -0
  42. package/dist/chunks/{sp-tray.dev-pb2fsd65.js → sp-tray.dev-ey59vfh7.js} +10 -8
  43. package/dist/chunks/{sp-tray.dev-pb2fsd65.js.map → sp-tray.dev-ey59vfh7.js.map} +2 -2
  44. package/dist/chunks/{studio-9qr6fq7p.js → studio-0rqqhrdy.js} +10 -378
  45. package/dist/chunks/{studio-9qr6fq7p.js.map → studio-0rqqhrdy.js.map} +4 -14
  46. package/dist/chunks/{studio-5x6tqqec.js → studio-2sj1jj3v.js} +10 -8
  47. package/dist/chunks/{studio-5x6tqqec.js.map → studio-2sj1jj3v.js.map} +2 -2
  48. package/dist/chunks/{studio-h3fw0wn8.js → studio-3fk1ac9z.js} +6 -4
  49. package/dist/chunks/{studio-h3fw0wn8.js.map → studio-3fk1ac9z.js.map} +2 -2
  50. package/dist/chunks/studio-41exgzhq.js +6690 -0
  51. package/dist/chunks/studio-41exgzhq.js.map +38 -0
  52. package/dist/chunks/{studio-7v2bpweq.js → studio-4mqb9a0j.js} +6 -4
  53. package/dist/chunks/{studio-7v2bpweq.js.map → studio-4mqb9a0j.js.map} +2 -2
  54. package/dist/chunks/studio-50k77cca.js +1787 -0
  55. package/dist/chunks/studio-50k77cca.js.map +18 -0
  56. package/dist/chunks/{studio-56v3zwk6.js → studio-6a0h7sne.js} +10 -8
  57. package/dist/chunks/{studio-56v3zwk6.js.map → studio-6a0h7sne.js.map} +2 -2
  58. package/dist/chunks/studio-6f0am8f2.js +53 -0
  59. package/dist/chunks/studio-6f0am8f2.js.map +10 -0
  60. package/dist/chunks/studio-6nmjc5qk.js +7002 -0
  61. package/dist/chunks/studio-6nmjc5qk.js.map +32 -0
  62. package/dist/chunks/studio-7afd21nw.js +67 -0
  63. package/dist/chunks/studio-7afd21nw.js.map +10 -0
  64. package/dist/chunks/{studio-xze4zrs1.js → studio-7bmdvzne.js} +2 -2
  65. package/dist/chunks/studio-7bmdvzne.js.map +10 -0
  66. package/dist/chunks/studio-8jpzqk5s.js +128 -0
  67. package/dist/chunks/studio-8jpzqk5s.js.map +10 -0
  68. package/dist/chunks/studio-94m77tgk.js +1482 -0
  69. package/dist/chunks/studio-94m77tgk.js.map +13 -0
  70. package/dist/chunks/studio-9je6w5sq.js +1000 -0
  71. package/dist/chunks/studio-9je6w5sq.js.map +16 -0
  72. package/dist/chunks/{studio-w7c6kvk7.js → studio-a7pzveq1.js} +2 -2
  73. package/dist/chunks/{studio-gs6kqdt1.js → studio-adn0z1k3.js} +14 -8
  74. package/dist/chunks/{studio-gs6kqdt1.js.map → studio-adn0z1k3.js.map} +3 -3
  75. package/dist/chunks/{studio-kr88ryr7.js → studio-bsxxx3x2.js} +17 -15
  76. package/dist/chunks/{studio-kr88ryr7.js.map → studio-bsxxx3x2.js.map} +7 -6
  77. package/dist/chunks/studio-bw5dz6km.js +608 -0
  78. package/dist/chunks/studio-bw5dz6km.js.map +21 -0
  79. package/dist/chunks/studio-c6s5getc.js +4232 -0
  80. package/dist/chunks/studio-c6s5getc.js.map +39 -0
  81. package/dist/chunks/studio-cjm7fdjf.js +451 -0
  82. package/dist/chunks/studio-cjm7fdjf.js.map +14 -0
  83. package/dist/chunks/{studio-cx91mnh8.js → studio-ckwz4d3x.js} +53 -53
  84. package/dist/chunks/{studio-cx91mnh8.js.map → studio-ckwz4d3x.js.map} +5 -5
  85. package/dist/chunks/studio-dg7zyt5x.js +28 -0
  86. package/dist/chunks/studio-dg7zyt5x.js.map +10 -0
  87. package/dist/chunks/studio-dzcyvvvz.js +166 -0
  88. package/dist/chunks/studio-dzcyvvvz.js.map +10 -0
  89. package/dist/chunks/{studio-7kqe41sa.js → studio-evkr5d3b.js} +15 -7
  90. package/dist/chunks/{studio-7kqe41sa.js.map → studio-evkr5d3b.js.map} +5 -4
  91. package/dist/chunks/studio-f12h6177.js +411 -0
  92. package/dist/chunks/studio-f12h6177.js.map +13 -0
  93. package/dist/chunks/studio-hbp1s8m9.js +1817 -0
  94. package/dist/chunks/studio-hbp1s8m9.js.map +14 -0
  95. package/dist/chunks/studio-k2sxjph5.js +15295 -0
  96. package/dist/chunks/studio-k2sxjph5.js.map +235 -0
  97. package/dist/chunks/studio-myje51t3.js +385 -0
  98. package/dist/chunks/studio-myje51t3.js.map +12 -0
  99. package/dist/chunks/studio-na6rwzhw.js +353 -0
  100. package/dist/chunks/studio-na6rwzhw.js.map +11 -0
  101. package/dist/chunks/{studio-4k0m4fmp.js → studio-p471gg5n.js} +126 -3
  102. package/dist/chunks/studio-p471gg5n.js.map +14 -0
  103. package/dist/chunks/{studio-9bjwf0d4.js → studio-rgwcpast.js} +5 -46
  104. package/dist/chunks/{studio-9bjwf0d4.js.map → studio-rgwcpast.js.map} +4 -5
  105. package/dist/chunks/{studio-esrewxap.js → studio-s519zc99.js} +3 -3
  106. package/dist/chunks/studio-sas7mt3k.js +75 -0
  107. package/dist/chunks/studio-sas7mt3k.js.map +10 -0
  108. package/dist/chunks/studio-t5wqwzdh.js +74 -0
  109. package/dist/chunks/studio-t5wqwzdh.js.map +10 -0
  110. package/dist/chunks/{studio-9qpspwfn.js → studio-temv5bw4.js} +5 -5
  111. package/dist/chunks/{studio-9qpspwfn.js.map → studio-temv5bw4.js.map} +1 -1
  112. package/dist/chunks/{studio-qkvt37c0.js → studio-tr20m8g8.js} +669 -18
  113. package/dist/chunks/studio-tr20m8g8.js.map +9 -0
  114. package/dist/chunks/{studio-v7jkjqng.js → studio-v96qfnww.js} +5514 -4291
  115. package/dist/chunks/studio-v96qfnww.js.map +54 -0
  116. package/dist/chunks/studio-vcetc91k.js +659 -0
  117. package/dist/chunks/studio-vcetc91k.js.map +10 -0
  118. package/dist/chunks/{studio-jm0z592w.js → studio-vmymjefp.js} +2972 -4937
  119. package/dist/chunks/studio-vmymjefp.js.map +98 -0
  120. package/dist/chunks/{studio-bghqfmea.js → studio-wwseqyw0.js} +2 -2
  121. package/dist/chunks/studio-x9hmy5kr.js +390 -0
  122. package/dist/chunks/studio-x9hmy5kr.js.map +10 -0
  123. package/dist/chunks/studio-xa0ce0n7.js +335 -0
  124. package/dist/chunks/studio-xa0ce0n7.js.map +10 -0
  125. package/dist/chunks/studio-xm3dbxvn.js +378 -0
  126. package/dist/chunks/studio-xm3dbxvn.js.map +19 -0
  127. package/dist/chunks/{studio-nqw433kv.js → studio-xmvbhg31.js} +2 -2
  128. package/dist/chunks/studio-zv37yrfa.js +1054 -0
  129. package/dist/chunks/studio-zv37yrfa.js.map +13 -0
  130. package/dist/chunks/{ws-client-q7hkz3j9.js → ws-client-654ts66j.js} +6 -4
  131. package/dist/chunks/ws-client-654ts66j.js.map +11 -0
  132. package/dist/iframe-entry.js +668 -230
  133. package/dist/studio.js +21080 -32585
  134. package/index.html +35 -4685
  135. package/package.json +17 -15
  136. package/src/about/about-modal.ts +42 -11
  137. package/src/browse/library-commands.ts +240 -0
  138. package/src/browse/library-layouts.ts +369 -0
  139. package/src/browse/library-model.ts +396 -0
  140. package/src/browse/library-pane.ts +1049 -0
  141. package/src/browse/library-preview.ts +252 -0
  142. package/src/browse/library-source.ts +150 -0
  143. package/src/canvas/canvas-helpers.ts +33 -9
  144. package/src/canvas/canvas-live-render.ts +45 -29
  145. package/src/canvas/canvas-patcher.ts +151 -31
  146. package/src/canvas/canvas-perf.ts +46 -7
  147. package/src/canvas/canvas-render.ts +1092 -220
  148. package/src/canvas/canvas-surface.ts +240 -0
  149. package/src/canvas/canvas-utils.ts +1166 -124
  150. package/src/canvas/iframe-drop.ts +2 -1
  151. package/src/canvas/iframe-entry.ts +241 -4
  152. package/src/canvas/iframe-host.ts +1226 -143
  153. package/src/canvas/iframe-inline-edit.ts +31 -0
  154. package/src/canvas/iframe-interaction.ts +76 -16
  155. package/src/canvas/iframe-keys.ts +107 -45
  156. package/src/canvas/iframe-overlay.ts +38 -1
  157. package/src/canvas/iframe-protocol.ts +137 -2
  158. package/src/canvas/iframe-render.ts +70 -2
  159. package/src/canvas/iframe-slash.ts +6 -0
  160. package/src/canvas/path-mapping.ts +56 -6
  161. package/src/canvas/surface-registry.ts +292 -0
  162. package/src/collab/collab-commands.ts +244 -0
  163. package/src/collab/collab-session.ts +198 -32
  164. package/src/collab/collab-state.ts +28 -2
  165. package/src/collab/presence-chips.ts +100 -9
  166. package/src/commands/active-registry.ts +42 -0
  167. package/src/commands/app-commands.ts +176 -0
  168. package/src/commands/budget.ts +158 -0
  169. package/src/commands/command-args.ts +253 -0
  170. package/src/commands/context.ts +387 -0
  171. package/src/commands/defaults.ts +580 -0
  172. package/src/commands/keymap.ts +571 -0
  173. package/src/commands/levels.ts +345 -0
  174. package/src/commands/live-context.ts +193 -0
  175. package/src/commands/reference.ts +227 -0
  176. package/src/commands/registry.ts +293 -0
  177. package/src/component-props.ts +3 -2
  178. package/src/content/draft-state.ts +106 -0
  179. package/src/content/entry-commands.ts +282 -0
  180. package/src/content/entry-editor.ts +327 -0
  181. package/src/content/entry-fields.ts +116 -0
  182. package/src/content/entry-model.ts +175 -0
  183. package/src/editor/canvas-context-menu.ts +17 -11
  184. package/src/editor/canvas-slash-bridge.ts +11 -4
  185. package/src/editor/context-menu.ts +804 -204
  186. package/src/editor/convert-to-component.ts +31 -10
  187. package/src/editor/convert-to-repeater.ts +3 -2
  188. package/src/editor/inline-edit-apply.ts +5 -5
  189. package/src/editor/inline-edit.ts +86 -50
  190. package/src/editor/insert-zone-action.ts +1 -1
  191. package/src/editor/shortcuts.ts +1043 -329
  192. package/src/editor/slash-menu.ts +1 -0
  193. package/src/files/elements.ts +166 -0
  194. package/src/files/file-ops.ts +178 -31
  195. package/src/files/files.ts +898 -268
  196. package/src/files/fs-events.ts +21 -0
  197. package/src/files/media-meta.ts +203 -0
  198. package/src/files/media-paths.ts +141 -0
  199. package/src/files/media-upload.ts +7 -3
  200. package/src/files/media-usage.ts +189 -0
  201. package/src/github/github-auth.ts +235 -33
  202. package/src/github/github-publish.ts +80 -21
  203. package/src/grid/grid-controller.ts +152 -12
  204. package/src/grid/grid-layout.ts +225 -20
  205. package/src/grid/grid-open.ts +120 -0
  206. package/src/grid/grid-panel.ts +554 -39
  207. package/src/grid/grid-source.ts +27 -1
  208. package/src/grid/redirects-grid.ts +599 -0
  209. package/src/grid/redirects.ts +398 -0
  210. package/src/grid/sources/content-source.ts +108 -2
  211. package/src/i18n/i18n-commands.ts +322 -0
  212. package/src/new-project/add-repo-modal.ts +8 -10
  213. package/src/new-project/import-tab.ts +7 -0
  214. package/src/new-project/location-fields.ts +9 -1
  215. package/src/new-project/new-project-modal.ts +221 -245
  216. package/src/packages/jxsuite-update.ts +97 -48
  217. package/src/packages/pull-package-sync.ts +18 -9
  218. package/src/page-params.ts +2 -1
  219. package/src/panels/activity-bar.ts +152 -91
  220. package/src/panels/activity-panel.ts +481 -0
  221. package/src/panels/ai-chat/chat-markdown.ts +8 -3
  222. package/src/panels/ai-chat/chat-view.ts +245 -18
  223. package/src/panels/ai-chat/composer.ts +31 -5
  224. package/src/panels/ai-chat/sessions-view.ts +17 -10
  225. package/src/panels/ai-panel.ts +279 -53
  226. package/src/panels/block-action-bar.ts +1115 -224
  227. package/src/panels/bottom-dock.ts +337 -0
  228. package/src/panels/canvas-dnd-bridge.ts +37 -8
  229. package/src/panels/chat-panel.ts +29 -12
  230. package/src/panels/data-explorer.ts +254 -112
  231. package/src/panels/data-grid.ts +10 -4
  232. package/src/panels/dnd.ts +28 -51
  233. package/src/panels/editors.ts +434 -107
  234. package/src/panels/elements-panel.ts +66 -2
  235. package/src/panels/empty-state.ts +112 -0
  236. package/src/panels/events-panel.ts +596 -82
  237. package/src/panels/formula-workspace.ts +408 -218
  238. package/src/panels/frontmatter-fields.ts +51 -10
  239. package/src/panels/frontmatter-panel.ts +357 -79
  240. package/src/panels/git-panel.ts +375 -164
  241. package/src/panels/head-panel.ts +791 -85
  242. package/src/panels/i18n-panel.ts +592 -0
  243. package/src/panels/imports-panel.ts +95 -85
  244. package/src/panels/jump-bar.ts +584 -0
  245. package/src/panels/layers-panel.ts +1106 -328
  246. package/src/panels/left-panel.ts +109 -204
  247. package/src/panels/navigator-panels.ts +131 -0
  248. package/src/panels/overlays.ts +7 -2
  249. package/src/panels/pane-context.ts +1477 -0
  250. package/src/panels/pane-grid.ts +406 -0
  251. package/src/panels/panel-registry.ts +340 -0
  252. package/src/panels/panel-scheduler.ts +75 -0
  253. package/src/panels/problems-panel.ts +234 -0
  254. package/src/panels/properties-panel.ts +946 -1139
  255. package/src/panels/provenance.ts +258 -0
  256. package/src/panels/quick-search.ts +791 -122
  257. package/src/panels/right-panel.ts +228 -102
  258. package/src/panels/seo-modal.ts +395 -0
  259. package/src/panels/settings-pane.ts +203 -0
  260. package/src/panels/signals-panel.ts +354 -137
  261. package/src/panels/statement-editor.ts +41 -25
  262. package/src/panels/statusbar.ts +342 -106
  263. package/src/panels/style-panel.ts +974 -463
  264. package/src/panels/style-utils.ts +3 -3
  265. package/src/panels/stylebook-doc.ts +4 -2
  266. package/src/panels/stylebook-layers-panel.ts +3 -2
  267. package/src/panels/stylebook-panel.ts +51 -26
  268. package/src/panels/tab-strip.ts +1058 -78
  269. package/src/panels/target-line.ts +274 -0
  270. package/src/panels/toolbar.ts +631 -484
  271. package/src/panels/welcome-screen.ts +301 -198
  272. package/src/platform-errors.ts +26 -3
  273. package/src/platform.ts +96 -2
  274. package/src/platforms/cloud.ts +71 -8
  275. package/src/platforms/devserver.ts +92 -29
  276. package/src/publish/deploy-checklist.ts +383 -0
  277. package/src/publish/pages-service.ts +10 -1
  278. package/src/publish/publish-commands.ts +218 -0
  279. package/src/publish/publish-panel.ts +110 -16
  280. package/src/recent-projects.ts +3 -2
  281. package/src/services/a11y-report.ts +505 -0
  282. package/src/services/ai-models.ts +30 -1
  283. package/src/services/ai-project-tools.ts +29 -10
  284. package/src/services/ai-system-prompt.ts +53 -14
  285. package/src/services/ai-tools.ts +39 -3
  286. package/src/services/ai-writes.ts +154 -0
  287. package/src/services/announce.ts +97 -0
  288. package/src/services/automation.ts +424 -175
  289. package/src/services/cem-export.ts +9 -4
  290. package/src/services/clock.ts +61 -0
  291. package/src/services/document-assistant.ts +36 -8
  292. package/src/services/idle.ts +179 -0
  293. package/src/services/import-client.ts +26 -0
  294. package/src/services/monaco-buffer.ts +627 -0
  295. package/src/services/monaco-lazy.ts +36 -0
  296. package/src/services/notify.ts +271 -0
  297. package/src/services/profile.ts +155 -0
  298. package/src/services/references.ts +0 -0
  299. package/src/services/token-lint.ts +3 -2
  300. package/src/services/tool-executor.ts +53 -7
  301. package/src/services/trusted-types.ts +123 -0
  302. package/src/settings/contexts-section.ts +427 -0
  303. package/src/settings/contributed-section.ts +149 -11
  304. package/src/settings/css-vars-editor.ts +306 -349
  305. package/src/settings/defs-editor.ts +93 -34
  306. package/src/settings/dependencies-editor.ts +7 -7
  307. package/src/settings/extension-sections.ts +37 -5
  308. package/src/settings/general-settings.ts +204 -121
  309. package/src/settings/locales-section.ts +347 -0
  310. package/src/settings/preferences-accounts.ts +140 -0
  311. package/src/settings/preferences-dialog.ts +620 -0
  312. package/src/settings/preferences-keymap.ts +270 -0
  313. package/src/settings/project-sections.ts +260 -0
  314. package/src/settings/section-registry.ts +169 -0
  315. package/src/settings/settings-document.ts +385 -0
  316. package/src/shell.ts +1549 -0
  317. package/src/site-context.ts +45 -20
  318. package/src/state.ts +14 -275
  319. package/src/store.ts +88 -43
  320. package/src/studio.ts +790 -346
  321. package/src/style/live-preview.ts +36 -0
  322. package/src/style/project-styles.ts +349 -0
  323. package/src/style/token-ref.ts +123 -0
  324. package/src/tabs/patch-ops.ts +16 -4
  325. package/src/tabs/project-config.ts +416 -0
  326. package/src/tabs/selection.ts +323 -0
  327. package/src/tabs/tab.ts +182 -47
  328. package/src/tabs/transact.ts +209 -28
  329. package/src/types.ts +68 -13
  330. package/src/ui/ai-credentials-form.ts +39 -35
  331. package/src/ui/ai-managed-connect.ts +7 -1
  332. package/src/ui/dynamic-slot.ts +224 -81
  333. package/src/ui/expression-editor.ts +71 -63
  334. package/src/ui/field-input.ts +4 -6
  335. package/src/ui/field-row.ts +215 -38
  336. package/src/ui/form-controls.ts +194 -7
  337. package/src/ui/layers.ts +492 -69
  338. package/src/ui/media-picker.ts +115 -25
  339. package/src/ui/panel-resize.ts +109 -91
  340. package/src/ui/progress-modal.ts +131 -50
  341. package/src/ui/regions.ts +462 -0
  342. package/src/ui/schema-form.ts +229 -45
  343. package/src/ui/spectrum.ts +24 -8
  344. package/src/ui/timing.ts +49 -0
  345. package/src/ui/value-selector.ts +20 -0
  346. package/src/ui/value-source.ts +348 -0
  347. package/src/ui/virtual-window.ts +400 -0
  348. package/src/utils/edit-display.ts +3 -2
  349. package/src/utils/inherited-style.ts +67 -37
  350. package/src/view.ts +64 -78
  351. package/src/workspace/pane-derive.ts +1258 -0
  352. package/src/workspace/session.ts +317 -0
  353. package/src/workspace/workspace.ts +1345 -23
  354. package/styles/canvas.css +653 -0
  355. package/styles/forced-colors.css +106 -0
  356. package/styles/inspector.css +1454 -0
  357. package/styles/overlays.css +2704 -0
  358. package/styles/panels.css +1701 -0
  359. package/styles/shell.css +1423 -0
  360. package/styles/tokens.css +151 -0
  361. package/dist/chunks/Overlay.dev-cszx7yn5.js +0 -22
  362. package/dist/chunks/extension-sections-qr3drkkw.js +0 -531
  363. package/dist/chunks/extension-sections-qr3drkkw.js.map +0 -12
  364. package/dist/chunks/files-j8a1t06k.js +0 -50
  365. package/dist/chunks/files-j8a1t06k.js.map +0 -9
  366. package/dist/chunks/git-panel-xtq5z81x.js +0 -28
  367. package/dist/chunks/git-panel-xtq5z81x.js.map +0 -9
  368. package/dist/chunks/layers-panel-ancn2wpq.js +0 -26
  369. package/dist/chunks/layers-panel-ancn2wpq.js.map +0 -9
  370. package/dist/chunks/settings-modal-17ttr96g.js +0 -29
  371. package/dist/chunks/settings-modal-17ttr96g.js.map +0 -9
  372. package/dist/chunks/sp-overlay.dev-earn5as8.js +0 -17
  373. package/dist/chunks/sp-overlay.dev-earn5as8.js.map +0 -9
  374. package/dist/chunks/sp-popover.dev-frxtfejn.js +0 -8
  375. package/dist/chunks/sp-popover.dev-frxtfejn.js.map +0 -9
  376. package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js +0 -14
  377. package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js.map +0 -9
  378. package/dist/chunks/sp-tooltip.dev-a9fywesm.js +0 -21
  379. package/dist/chunks/sp-tooltip.dev-a9fywesm.js.map +0 -10
  380. package/dist/chunks/studio-0xgs7xrs.js +0 -429
  381. package/dist/chunks/studio-0xgs7xrs.js.map +0 -13
  382. package/dist/chunks/studio-4d8hzcz5.js +0 -3427
  383. package/dist/chunks/studio-4d8hzcz5.js.map +0 -26
  384. package/dist/chunks/studio-4k0m4fmp.js.map +0 -13
  385. package/dist/chunks/studio-9smfzqhc.js +0 -19
  386. package/dist/chunks/studio-9smfzqhc.js.map +0 -10
  387. package/dist/chunks/studio-jm0z592w.js.map +0 -115
  388. package/dist/chunks/studio-m2t4mdg5.js +0 -1854
  389. package/dist/chunks/studio-m2t4mdg5.js.map +0 -18
  390. package/dist/chunks/studio-n4p11dfy.js +0 -853
  391. package/dist/chunks/studio-n4p11dfy.js.map +0 -12
  392. package/dist/chunks/studio-qkvt37c0.js.map +0 -9
  393. package/dist/chunks/studio-sjh1wt1a.js +0 -3744
  394. package/dist/chunks/studio-sjh1wt1a.js.map +0 -22
  395. package/dist/chunks/studio-v7jkjqng.js.map +0 -46
  396. package/dist/chunks/studio-xq0t7n5t.js +0 -140
  397. package/dist/chunks/studio-xq0t7n5t.js.map +0 -10
  398. package/dist/chunks/studio-xze4zrs1.js.map +0 -10
  399. package/dist/chunks/studio-yfcstdzy.js +0 -399
  400. package/dist/chunks/studio-yfcstdzy.js.map +0 -12
  401. package/dist/chunks/studio-zp7jncs8.js +0 -469
  402. package/dist/chunks/studio-zp7jncs8.js.map +0 -14
  403. package/dist/chunks/ws-client-q7hkz3j9.js.map +0 -11
  404. package/src/browse/browse-modal.ts +0 -69
  405. package/src/browse/browse.ts +0 -904
  406. package/src/canvas/canvas-diff.ts +0 -216
  407. package/src/canvas/nested-site-style.ts +0 -58
  408. package/src/new-project/design-fields.ts +0 -264
  409. package/src/new-project/templates.ts +0 -61
  410. package/src/panels/tab-bar.ts +0 -548
  411. package/src/settings/settings-modal.ts +0 -203
  412. /package/dist/chunks/{adapter-z8fkmbmv.js.map → adapter-qfnesn5v.js.map} +0 -0
  413. /package/dist/chunks/{cf-settings-mmyv436d.js.map → cf-settings-73sh5z4p.js.map} +0 -0
  414. /package/dist/chunks/{format-host-8jxwts2p.js.map → format-host-mkwsmt8d.js.map} +0 -0
  415. /package/dist/chunks/{jx-validate-qx8degj7.js.map → jx-validate-v6qgknrs.js.map} +0 -0
  416. /package/dist/chunks/{studio-w7c6kvk7.js.map → studio-a7pzveq1.js.map} +0 -0
  417. /package/dist/chunks/{studio-esrewxap.js.map → studio-s519zc99.js.map} +0 -0
  418. /package/dist/chunks/{studio-bghqfmea.js.map → studio-wwseqyw0.js.map} +0 -0
  419. /package/dist/chunks/{studio-nqw433kv.js.map → studio-xmvbhg31.js.map} +0 -0
@@ -11,31 +11,45 @@
11
11
  * Patching is only attempted in design/edit canvas modes, where the canvas renders through
12
12
  * prepareForEditMode: runtime reactive bindings are inert there, so the patcher is the only writer
13
13
  * to the patched DOM.
14
+ *
15
+ * Every question here is asked of ONE PANE — the one showing the edited tab (`canvas-surface.ts`).
16
+ * The mode, the panel list, the readiness test and the render an escalation schedules are all
17
+ * properties of a stage, and reading them globally is how a second pane mid-mount would refuse an
18
+ * edit typed into the first, and how one failed patch would rebuild both.
14
19
  */
15
20
 
16
- import { canvasPanels, getNodeAtPath, parentElementPath } from "../store";
17
- import { isTabActive } from "../workspace/workspace";
18
- import { view } from "../view";
21
+ import { getNodeAtPath, parentElementPath } from "../store";
22
+ import { canvasModeOfPane, surfacesShowingTab } from "./canvas-surface";
19
23
  import { toRaw } from "../reactivity";
20
24
  import { postPatchToHosts } from "./iframe-host";
21
25
  import { canvasPerf, recordEscalation, SPAN_PATCH_BATCH, timeSpan } from "./canvas-perf";
22
26
  import { setPatchConsumer } from "../tabs/patch-ops";
23
27
 
28
+ import type { CanvasSurface } from "./surface-registry";
24
29
  import type { JxPatchOp, TransactionRecord } from "../tabs/patch-ops";
25
30
  import type { Tab } from "../tabs/tab.js";
26
31
  import type { JxPath } from "../state";
27
32
 
28
33
  /** Render-side callbacks injected at init so this module stays free of heavy canvas imports. */
29
34
  interface CanvasPatcherCtx {
30
- getCanvasMode: () => string;
31
- scheduleCanvasRender: () => void;
35
+ /** Schedule ONE pane's full render — never "the canvas". See {@link escalateToFullRender}. */
36
+ scheduleCanvasRender: (paneId: string) => void;
32
37
  renderOverlays: () => void;
33
38
  }
34
39
 
35
40
  let _ctx: CanvasPatcherCtx | null = null;
36
41
 
37
- /** Document root references whose change was applied surgically (checked by the doc-effect). */
38
- const _consumed = new WeakSet<object>();
42
+ /**
43
+ * Document root references whose change was applied surgically, and the PANES it reached.
44
+ *
45
+ * A `WeakSet` of references, until one document could be displayed in two panes. Each pane runs its
46
+ * own doc-effect, both fire on the same root-reference swap, and the first to arrive consumed the
47
+ * one mark — so the second pane full-rendered every surgically patched edit while
48
+ * `skippedFullRenders` reported a single skip. That inverts workstream 1's whole result in exactly
49
+ * the configuration workstream 3 introduces, and reports it as a win. The mark is per pane now, and
50
+ * each pane deletes only its own.
51
+ */
52
+ const _consumed = new WeakMap<object, Set<string>>();
39
53
 
40
54
  /**
41
55
  * Initialize the canvas patcher and register it as the transactDoc patch consumer.
@@ -48,33 +62,101 @@ export function initCanvasPatcher(ctx: CanvasPatcherCtx) {
48
62
  apply: applyPatchBatch,
49
63
  classify: classifyOps,
50
64
  escalate: escalateToFullRender,
51
- markConsumed: (docRef: object) => {
52
- _consumed.add(toRaw(docRef) as object);
65
+ markConsumed: (docRef: object, tab: Tab) => {
66
+ markConsumed(
67
+ docRef,
68
+ patchableSurfaces(tab).map((surface) => surface.paneId),
69
+ );
53
70
  },
54
71
  });
55
72
  }
56
73
 
57
74
  /**
58
- * One-shot check used by the canvas doc-effect: returns true (and clears the mark) when the given
59
- * document reference was already applied to the canvas surgically, so the full render can be
60
- * skipped. One-shot so tab switches and repeat triggers still render fully.
75
+ * The stages that can actually TAKE a patch: showing the tab, and drawing an editable canvas.
76
+ *
77
+ * **One function, because two of them disagreed and the disagreement lost edits.**
78
+ * {@link classifyOps} SKIPS a showing stage that cannot patch — that is what lets a Code lens open
79
+ * beside a page without killing surgical patching for the page. `markConsumed` marked every stage
80
+ * DISPLAYING the tab. So opening Code beside a page and typing marked the lens as patched, its
81
+ * doc-effect returned before `scheduleCanvasRender`, and `canvas-render.ts`'s source fast path —
82
+ * the only thing that refreshes a source-mode Monaco — never ran. The Code view sat frozen while
83
+ * `skippedFullRenders` counted it as a win.
84
+ *
85
+ * The panel/readiness half of `classifyOps`' gate is deliberately NOT repeated here: a batch only
86
+ * reaches `markConsumed` after that gate passed, so every surface this returns had ready panels
87
+ * when the verdict was taken.
88
+ *
89
+ * @param {Tab | null} tab
90
+ * @returns {CanvasSurface[]}
91
+ */
92
+ function patchableSurfaces(tab: Tab | null): CanvasSurface[] {
93
+ return surfacesShowingTab(tab).filter((candidate) => {
94
+ const mode = canvasModeOfPane(candidate.paneId);
95
+ return mode === "design" || mode === "edit";
96
+ });
97
+ }
98
+
99
+ /**
100
+ * Record that `docRef`'s change has been applied surgically in each of `paneIds`.
101
+ *
102
+ * No empty-list guard, because the list cannot be empty here: `transactDoc` marks only a batch
103
+ * {@link classifyOps} called patchable, and that function rejects `patchableSurfaces(tab).length
104
+ * === 0` before it can say so. A guard on an unreachable value is a branch no test can enter — the
105
+ * gate's own rule — and `_consumed` is a `WeakMap` keyed on a reference `transactDoc` mints fresh
106
+ * per transaction, so there is nothing for one to protect either.
107
+ *
108
+ * @param {object} docRef
109
+ * @param {readonly string[]} paneIds
110
+ */
111
+ function markConsumed(docRef: object, paneIds: readonly string[]) {
112
+ _consumed.set(toRaw(docRef) as object, new Set(paneIds));
113
+ }
114
+
115
+ /**
116
+ * One-shot check used by ONE PANE's canvas doc-effect: returns true (and clears that pane's mark)
117
+ * when the given document reference was already applied to that pane's stage surgically, so its
118
+ * full render can be skipped. One-shot so tab switches and repeat triggers still render fully.
61
119
  *
62
120
  * @param {object} doc
121
+ * @param {string} paneId
63
122
  */
64
- export function consumePatchedDocument(doc: object): boolean {
123
+ export function consumePatchedDocument(doc: object, paneId: string): boolean {
65
124
  const raw = toRaw(doc) as object;
66
- if (_consumed.has(raw)) {
125
+ const panes = _consumed.get(raw);
126
+ if (!panes?.has(paneId)) {
127
+ return false;
128
+ }
129
+ panes.delete(paneId);
130
+ if (panes.size === 0) {
67
131
  _consumed.delete(raw);
68
- canvasPerf.skippedFullRenders += 1;
69
- return true;
70
132
  }
71
- return false;
133
+ canvasPerf.skippedFullRenders += 1;
134
+ return true;
72
135
  }
73
136
 
74
- /** Schedule the fallback full render and record why. */
75
- export function escalateToFullRender(reason: string) {
137
+ /**
138
+ * Schedule the fallback full render of every pane showing `tab`, and record why.
139
+ *
140
+ * An escalation is a statement about a stage whose DOM no longer matches its document, and only a
141
+ * stage that was handed the patch can be in that state — a global schedule would rebuild the other
142
+ * pane's iframes (reloading them, losing their scroll and any live edit) because a document it is
143
+ * not showing failed to patch. That is why this resolves stages from the tab rather than scheduling
144
+ * "the canvas"; it is now PLURAL for the other half of the same reason: a document displayed in two
145
+ * panes was handed the patch in both, so both are out of date when it fails.
146
+ *
147
+ * With no pane showing the tab (a `patchError` arriving after the pane's tab changed, or an apply
148
+ * failure on a tab no pane is showing) there is nothing to re-render, so nothing is scheduled — the
149
+ * reason is still recorded, because a swallowed escalation that no counter saw is exactly the class
150
+ * of bug `__jxCanvasPerf` exists to make visible.
151
+ *
152
+ * @param {string} reason
153
+ * @param {Tab | null} tab
154
+ */
155
+ export function escalateToFullRender(reason: string, tab: Tab | null = null) {
76
156
  recordEscalation(reason);
77
- _ctx?.scheduleCanvasRender();
157
+ for (const surface of surfacesShowingTab(tab)) {
158
+ _ctx?.scheduleCanvasRender(surface.paneId);
159
+ }
78
160
  }
79
161
 
80
162
  // ─── Classification ──────────────────────────────────────────────────────────
@@ -271,20 +353,42 @@ export function classifyOps(tab: Tab, ops: JxPatchOp[]): { patchable: boolean; r
271
353
  return { patchable: false, reason };
272
354
  };
273
355
 
274
- if (!isTabActive(tab)) {
356
+ /*
357
+ * Every gate below is asked of the PANES showing this tab — not of the app.
358
+ *
359
+ * A tab is OWNED by one pane and may be DISPLAYED by two (a derived pane projects the pane it
360
+ * derives from), so the stages that could apply the patch are exactly those, and their readiness,
361
+ * their modes and their panel lists are the only ones that can decide the question. Read
362
+ * globally, the readiness test made the other pane's mid-mount canvas refuse an edit typed into
363
+ * this one, and the mode test asked what the FOCUSED pane was doing about a document it may not
364
+ * even be showing.
365
+ */
366
+ const showing = surfacesShowingTab(tab);
367
+ if (showing.length === 0) {
275
368
  return reject("inactive-tab");
276
369
  }
277
- const canvasMode = _ctx ? _ctx.getCanvasMode() : "";
278
- if (canvasMode !== "design" && canvasMode !== "edit") {
370
+ /* A stage not drawing an editable canvas is SKIPPED, not counted as a rejection — and that is the
371
+ difference between opening a Code lens beside a page and killing surgical patching for the page
372
+ itself. A Code lens has no artboards and is in no patchable mode; folding it into `every` would
373
+ have rejected the batch as `mode-source`/`no-panels` and full-rendered both stages on every
374
+ keystroke. Only when NO showing stage can take the patch is the mode a rejection.
375
+ The SAME predicate decides what `markConsumed` marks — see {@link patchableSurfaces} for what
376
+ it cost when these were two filters that had drifted apart. */
377
+ const patchable = patchableSurfaces(tab);
378
+ if (patchable.length === 0) {
379
+ const canvasMode = canvasModeOfPane(showing[0]!.paneId);
279
380
  return reject(`mode-${canvasMode || "unknown"}`);
280
381
  }
281
- if (canvasPanels.length === 0) {
282
- return reject("no-panels");
283
- }
284
- // The iframe canvas keeps its render context inside the iframe, so a panel is patchable as soon as
285
- // It has rendered (`ready`) — there is no parent-side `liveCtx`.
286
- if (!canvasPanels.every((p) => p.ready)) {
287
- return reject("panels-not-ready");
382
+ for (const surface of patchable) {
383
+ const { panels } = surface;
384
+ if (panels.length === 0) {
385
+ return reject("no-panels");
386
+ }
387
+ // The iframe canvas keeps its render context inside the iframe, so a panel is patchable as soon
388
+ // As it has rendered (`ready`) — there is no parent-side `liveCtx`.
389
+ if (!panels.every((p) => p.ready)) {
390
+ return reject("panels-not-ready");
391
+ }
288
392
  }
289
393
  // A `set-text` on a node whose CHILDREN are replaced in the same batch is subsumed by that
290
394
  // Subtree re-render (the iframe folds every forward op into the shadow doc first, then the
@@ -335,8 +439,24 @@ export function applyPatchBatch(tab: Tab, _ops: JxPatchOp[], record?: Transactio
335
439
  // Render then runs), so an edit is never dropped.
336
440
  timeSpan(SPAN_PATCH_BATCH, () => {
337
441
  const forwardOps = (record?.docOps ?? []).map((pair) => pair.forward);
338
- if (postPatchToHosts(forwardOps, view.renderGeneration, tab.id) === 0) {
442
+ /* ONE call, and no generation. Each host checks the patch against the generation of the stage
443
+ it is mounted on, resolved inside `postPatchToHosts` — see the note there on why a single
444
+ number for a multi-pane fan-out is the bug rather than a parameter needing a better value.
445
+ Posting once per showing surface would post the same patch to the same host twice, because
446
+ that loop spans stages by design.
447
+ And no `surfacesShowingTab(tab).length > 0` guard in front of it. There was one, and it was
448
+ a condition with no false branch: `tabs/transact.ts` calls `apply` only when `classify`
449
+ returned patchable in the statement above it, and {@link classifyOps} rejects
450
+ `inactive-tab` for exactly the case the guard was checking. A tab no pane is showing posts
451
+ to no host anyway, `hosts` falls to 0, and the throw below escalates the batch. */
452
+ const hosts = postPatchToHosts(forwardOps, tab.id);
453
+ if (hosts === 0) {
339
454
  throw new Error("no-ready-iframe-host");
340
455
  }
456
+ // The counter the escalation count is read against: `patchedOps` versus `escalations` is how
457
+ // Much of an authoring session avoided a render at all. It is the OPS, not ops×hosts — one
458
+ // Mutation posted to six artboards is one mutation, and counting the fan-out here would make
459
+ // A wide canvas look like it was doing more work than a narrow one.
460
+ canvasPerf.patchedOps += forwardOps.length;
341
461
  });
342
462
  }
@@ -17,10 +17,13 @@ const SAMPLE_LIMIT = 128;
17
17
 
18
18
  /** Span names, so producers and the profiling gate agree on the keys. */
19
19
  export const SPAN_FULL_RENDER = "fullRender";
20
- export const SPAN_PANEL_RENDER = "panelRender";
21
20
  export const SPAN_MOUNT_CANVAS = "mountCanvas";
22
21
  export const SPAN_PATCH_BATCH = "patchBatch";
23
- export const SPAN_SUBTREE_RENDER = "subtreeRender";
22
+ /**
23
+ * The parent-side render payload — resolve the document, then serialize it for the wire. Built ONCE
24
+ * per render pass and shared by every host in it, so this span's `count` is passes, not panels.
25
+ */
26
+ export const SPAN_PREPARE_RENDER = "prepareRender";
24
27
 
25
28
  export interface SpanStats {
26
29
  /** Completed spans recorded under this name. */
@@ -40,14 +43,44 @@ export interface CanvasPerf {
40
43
  fullRenders: number;
41
44
  /** Individual panel renders (one per breakpoint panel per full render). */
42
45
  panelRenders: number;
46
+ /**
47
+ * Parent-side render payloads built — one document resolution plus one wire serialization.
48
+ *
49
+ * This is the fan-out denominator. Divide {@link CanvasPerf.hostRenderPosts} by it: the quotient
50
+ * is how many canvas iframes one render pass fed from a single resolution, and a quotient of 1
51
+ * when more than one host is live means the fan-out is not happening.
52
+ */
53
+ renderPreparations: number;
54
+ /** Render messages posted to canvas iframe hosts (the fan-out numerator). */
55
+ hostRenderPosts: number;
43
56
  /** Doc-effect triggers skipped because the change was consumed by the patcher. */
44
57
  skippedFullRenders: number;
45
- /** Patch ops applied surgically to the live canvas DOM. */
58
+ /** Patch ops posted to the live canvas hosts instead of escalating to a render. */
46
59
  patchedOps: number;
47
- /** Isolated subtree re-renders (structural patches). */
48
- subtreeRenders: number;
49
60
  /** Patch batches that escalated to a full render. */
50
61
  escalations: number;
62
+ /**
63
+ * Times a FOLLOWING pane re-resolved to a different document (§18.4's companion presets).
64
+ *
65
+ * The tripwire for the one way the follow ships slow. The `component` follow observes the
66
+ * selection, and the selection moves on every click — so it memoises on its ANSWER: twenty clicks
67
+ * inside one `<my-card>` resolve to the same definition and must cost nothing. A number that
68
+ * climbs with keystrokes or with clicks inside one component means the memo is being defeated,
69
+ * usually by traversing the reactive document instead of `toRaw`'s.
70
+ */
71
+ derivedRetargets: number;
72
+ /**
73
+ * Times a following pane RE-RESOLVED — ran `derivedTarget` and reconciled, whether or not the
74
+ * answer changed.
75
+ *
76
+ * The other half of the follow's cost, and the half {@link CanvasPerf.derivedRetargets} cannot
77
+ * see: the memo makes a repeated answer free to ACT on, and says nothing about how often the
78
+ * question is asked. It is asked once per effect run, and the effect's tracked inputs are meant
79
+ * to be the source tab's identity and its selection — nothing else. A number that climbs with
80
+ * keystrokes means the document was read through the reactive proxy instead of `toRaw`'s, which
81
+ * makes every character typed in the source pane re-walk the tree.
82
+ */
83
+ derivedResolves: number;
51
84
  lastEscalationReason: string;
52
85
  /** Duration of the most recent full canvas render, in ms (0 before the first render). */
53
86
  lastFullRenderMs: number;
@@ -58,15 +91,18 @@ export interface CanvasPerf {
58
91
  }
59
92
 
60
93
  export const canvasPerf: CanvasPerf = {
94
+ derivedResolves: 0,
95
+ derivedRetargets: 0,
61
96
  escalations: 0,
62
97
  fullRenders: 0,
98
+ hostRenderPosts: 0,
63
99
  lastEscalationReason: "",
64
100
  lastFullRenderMs: 0,
65
101
  p95FullRenderMs: 0,
66
102
  panelRenders: 0,
67
103
  patchedOps: 0,
104
+ renderPreparations: 0,
68
105
  skippedFullRenders: 0,
69
- subtreeRenders: 0,
70
106
  timings: {},
71
107
  };
72
108
 
@@ -206,10 +242,13 @@ export async function timeSpanAsync<T>(name: string, body: () => Promise<T>): Pr
206
242
  export function resetCanvasPerf() {
207
243
  canvasPerf.fullRenders = 0;
208
244
  canvasPerf.panelRenders = 0;
245
+ canvasPerf.renderPreparations = 0;
246
+ canvasPerf.hostRenderPosts = 0;
209
247
  canvasPerf.skippedFullRenders = 0;
210
248
  canvasPerf.patchedOps = 0;
211
- canvasPerf.subtreeRenders = 0;
212
249
  canvasPerf.escalations = 0;
250
+ canvasPerf.derivedRetargets = 0;
251
+ canvasPerf.derivedResolves = 0;
213
252
  canvasPerf.lastEscalationReason = "";
214
253
  canvasPerf.lastFullRenderMs = 0;
215
254
  canvasPerf.p95FullRenderMs = 0;