@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
@@ -1,30 +1,65 @@
1
1
  /// <reference lib="dom" />
2
2
  /**
3
- * Right panel — orchestrates Properties / Events / Style tabs. The heavy sub-templates
4
- * (propertiesSidebarTemplate, renderStylePanelTemplate) remain in studio.js and are passed via ctx
5
- * to avoid moving ~2000 lines in one step.
3
+ * Right panel — the Inspector dock: four tabs, one dock, one column.
4
+ *
5
+ * **Content · Style · Logic · Assistant**, text-labelled. Three of those are renames of what was
6
+ * here (Properties→Content, Events→Logic) and the fourth is the assistant, folded in from the fifth
7
+ * grid column it used to own — which is the point of plan §3.2 ⑨: an inspector tab costs zero
8
+ * additional width, so the canvas gets the ~300px back and the assistant is still one key away.
9
+ *
10
+ * Two things changed shape to make that work:
11
+ *
12
+ * - **The tabs are words, not icons.** Three icon-only tabs with `title` attributes meant three hover
13
+ * probes to learn a dock you look at all day, and the icons were `sp-icon-properties` /
14
+ * `sp-icon-event` / `sp-icon-brush` — a form, a lightning bolt and a paintbrush, none of which
15
+ * says "this is where the link target lives".
16
+ * - **The containers are permanent.** The no-document state used to drop and rebuild them; it now
17
+ * renders INTO the three document tabs, because the Assistant's DOM (composer draft, scroll
18
+ * position, streaming part cache) must survive a document closing — the assistant works with no
19
+ * project at all, which is exactly the New Project hand-off's requirement.
20
+ *
21
+ * Every tab renders under a header naming its target (§3.2 ⑨), the same treatment wave A gave the
22
+ * Navigator panels. The Target Line proper — provenance-coded, cascade-aware — is §6 and P5; this
23
+ * is its honest predecessor: the tab's name, and what it is pointed at.
24
+ *
25
+ * The heavy sub-templates (properties, style) remain in their own modules and are passed the ctx
26
+ * they need.
6
27
  */
7
28
 
8
29
  import { html, render as litRender } from "lit-html";
9
- import { rightPanel, updateUi } from "../store";
10
- import { effect, effectScope } from "../reactivity";
30
+ import { getNodeAtPath, nodeLabel, rightPanel } from "../store";
31
+ import { effect, effectScope, reactive } from "../reactivity";
11
32
  import { createPanelScheduler } from "./panel-scheduler";
12
33
  import type { PanelScheduler } from "./panel-scheduler";
13
34
  import { activeTab } from "../workspace/workspace";
14
- import { tabIcon } from "./activity-bar";
15
- import { eventsSidebarTemplate } from "./events-panel";
35
+ import { primarySelection } from "../tabs/selection";
36
+ import { openPageAction, renderEmptyState } from "./empty-state";
37
+ import { renderLogicPanelTemplate } from "./events-panel";
16
38
  import { isCustomElementDoc } from "./signals-panel";
17
39
 
40
+ import { DEFAULT_INSPECTOR_TAB, isInspectorTabId, shell } from "../shell";
41
+ import { INSPECTOR_TABS } from "../commands/defaults";
42
+ import { inspectorTabRegion, REGION_ATTR } from "../ui/regions";
18
43
  import { isColorPopoverOpen } from "../ui/color-selector";
19
44
  import { renderStylePanelTemplate } from "./style-panel";
20
45
  import { renderPropertiesPanelTemplate } from "./properties-panel";
21
46
 
47
+ import type { InspectorTabId } from "../shell";
48
+ import type { TemplateResult } from "lit-html";
22
49
  import type { EffectScope } from "@vue/reactivity";
23
50
 
24
51
  interface RightPanelCtx {
25
52
  navigateToComponent: (path: string) => void;
26
53
  getCanvasMode: () => string;
27
54
  renderCanvas: () => void;
55
+ /**
56
+ * Hand the Assistant tab's body to whoever owns the assistant, once.
57
+ *
58
+ * Injected rather than imported so the dependency runs one way: `chat-panel.ts` reaches back into
59
+ * this module to SELECT its tab, and a matching import here would be a cycle between the host and
60
+ * its tenant. `studio.ts` already composes both, so it is the natural place to join them.
61
+ */
62
+ mountAssistant: (host: HTMLElement) => void;
28
63
  }
29
64
 
30
65
  let _ctx: RightPanelCtx | null = null;
@@ -33,6 +68,20 @@ let _scope: EffectScope | null = null;
33
68
 
34
69
  let _scheduler: PanelScheduler | null = null;
35
70
 
71
+ /**
72
+ * The selected tab while NO document is open.
73
+ *
74
+ * `session.ui.rightTab` is per-document — the tab you were on comes back with the file — and with
75
+ * no file there is nowhere per-document to put it. The Assistant is usable in exactly that state
76
+ * (the New Project flow hands it a brief before any document exists), so the selection falls back
77
+ * here rather than being refused.
78
+ *
79
+ * Reactive, because it is read by surfaces outside this module: the Command Bar's assistant toggle
80
+ * reports whether the assistant is showing, and a plain field would leave that button lying on the
81
+ * welcome screen — which is the whole class of bug `shell.ts` was split out to end.
82
+ */
83
+ const _detached = reactive({ tab: DEFAULT_INSPECTOR_TAB as InspectorTabId });
84
+
36
85
  /**
37
86
  * Mount the right panel.
38
87
  *
@@ -50,21 +99,26 @@ export function mount(ctx: RightPanelCtx) {
50
99
  _scope.run(() => {
51
100
  effect(() => {
52
101
  const tab = activeTab.value;
53
- if (!tab) {
54
- return;
102
+ // Layout chrome is not IN the document, so nothing per-tab changes when the canvas reports a
103
+ // `layoutHit` — and the panel that answers it (the Content tab's Layout Element card) spent a
104
+ // Release cycle repainting only because the canvas host happened to call `renderOnly` too.
105
+ // Reading it here makes the dock's dependency on it real.
106
+ void shell.layoutSelection;
107
+ // No tab is a state the inspector renders (its no-document empty state), not one it skips.
108
+ if (tab) {
109
+ // Track properties the right panel reads
110
+ void tab.doc.document;
111
+ // The whole SET, joined — a bare property read would not re-trigger when the selection
112
+ // Changes WITHIN the array, and §6.5's helpers always replace it but nothing enforces that.
113
+ void tab.session.selection.map((path) => path.join("/")).join("|");
114
+ void tab.session.ui.rightTab;
115
+ void tab.session.ui.activeMedia;
116
+ void tab.session.ui.activeSelector;
117
+ void tab.session.ui.styleSections;
118
+ void tab.session.ui.styleShorthands;
119
+ void tab.session.ui.styleFilter;
120
+ void tab.session.ui.inspectorSections;
55
121
  }
56
- // Track properties the right panel reads
57
- void tab.doc.document;
58
- void tab.session.selection;
59
- void tab.session.ui.rightTab;
60
- void tab.session.ui.activeMedia;
61
- void tab.session.ui.activeSelector;
62
- void tab.session.ui.styleSections;
63
- void tab.session.ui.styleShorthands;
64
- void tab.session.ui.styleFilter;
65
- void tab.session.ui.styleFilterActive;
66
- void tab.session.ui.inspectorSections;
67
-
68
122
  render();
69
123
  });
70
124
  });
@@ -76,9 +130,8 @@ export function unmount() {
76
130
  _ctx = null;
77
131
  _scheduler?.unbind();
78
132
  _scheduler = null;
79
- _propsContainer = null;
80
- _eventsContainer = null;
81
- _styleContainer = null;
133
+ _containers = null;
134
+ _detached.tab = DEFAULT_INSPECTOR_TAB;
82
135
  }
83
136
 
84
137
  /**
@@ -89,20 +142,128 @@ export function render() {
89
142
  _scheduler?.schedule();
90
143
  }
91
144
 
92
- let _propsContainer: HTMLElement | null = null;
93
- let _eventsContainer: HTMLElement | null = null;
94
- let _styleContainer: HTMLElement | null = null;
145
+ /**
146
+ * The tab showing right now — the stored value, coerced to a declared one.
147
+ *
148
+ * Coercion rather than trust because the value is persisted session state: a build that spelled a
149
+ * tab differently, or an automation step that guessed, must land on Content rather than on a blank
150
+ * dock with no tab selected.
151
+ */
152
+ export function inspectorTab(): InspectorTabId {
153
+ const tab = activeTab.value;
154
+ if (!tab) {
155
+ return _detached.tab;
156
+ }
157
+ const stored: unknown = tab.session.ui.rightTab;
158
+ return isInspectorTabId(stored) ? stored : DEFAULT_INSPECTOR_TAB;
159
+ }
160
+
161
+ /**
162
+ * Select a tab. The ONE writer — the strip, `view.setRightTab`, `view.setAssistant` and the
163
+ * assistant's own pending-prompt hand-off all come through here.
164
+ */
165
+ export function setInspectorTab(tab: InspectorTabId): void {
166
+ const aTab = activeTab.value;
167
+ if (aTab) {
168
+ aTab.session.ui.rightTab = tab;
169
+ } else {
170
+ _detached.tab = tab;
171
+ }
172
+ render();
173
+ }
174
+
175
+ /** Tab value → its body container, built once and reused across renders. */
176
+ let _containers: Map<InspectorTabId, HTMLElement> | null = null;
95
177
 
96
- function _ensureContainers() {
97
- if (_propsContainer) {
98
- return;
178
+ function _ensureContainers(ctx: RightPanelCtx): Map<InspectorTabId, HTMLElement> {
179
+ if (_containers) {
180
+ return _containers;
181
+ }
182
+ _containers = new Map(
183
+ INSPECTOR_TABS.map((t) => {
184
+ const el = document.createElement("div");
185
+ el.className = "panel-body";
186
+ el.setAttribute(REGION_ATTR, inspectorTabRegion(t.id));
187
+ return [t.id as InspectorTabId, el] as const;
188
+ }),
189
+ );
190
+ // The assistant owns its container for the life of the window: it is bound as lit's render host
191
+ // For a streaming rAF loop, and rebuilding it would drop the transcript and the composer draft.
192
+ ctx.mountAssistant(_containers.get("assistant")!);
193
+ return _containers;
194
+ }
195
+
196
+ /**
197
+ * What the selected tab is pointed AT, in the fewest words that are true.
198
+ *
199
+ * A tag name when a node is selected, the document's own name when nothing is, and "no document"
200
+ * when there is nothing open. The dock spent its whole life unable to answer this — three icon tabs
201
+ * and no statement of target anywhere — which is how "why is this field disabled" became a question
202
+ * with no on-screen answer.
203
+ */
204
+ function inspectorTarget(): string {
205
+ const tab = activeTab.value;
206
+ if (!tab) {
207
+ return "no document";
208
+ }
209
+ // Layout chrome first: it is mutually exclusive with a document selection, and it is the one
210
+ // Target whose name has to say where it came FROM — "<header> in layouts/base.json" is the whole
211
+ // Answer to "why can I not edit this".
212
+ const layout = shell.layoutSelection;
213
+ if (layout) {
214
+ return `<${layout.tagName || "element"}> in ${layout.layoutFile || "the layout"}`;
99
215
  }
100
- _propsContainer = document.createElement("div");
101
- _propsContainer.className = "panel-body";
102
- _eventsContainer = document.createElement("div");
103
- _eventsContainer.className = "panel-body";
104
- _styleContainer = document.createElement("div");
105
- _styleContainer.className = "panel-body";
216
+ const paths = tab.session.selection;
217
+ const selection = primarySelection(paths);
218
+ if (selection) {
219
+ // The inspector's title names the batch when there is one — it edits all of them, and titling
220
+ // It after the primary alone is how a Mixed field ends up looking like a plain value.
221
+ return paths.length > 1
222
+ ? `${paths.length} elements`
223
+ : nodeLabel(getNodeAtPath(tab.doc.document, selection));
224
+ }
225
+ const path = tab.documentPath;
226
+ return path ? (path.split("/").at(-1) ?? "document") : "document";
227
+ }
228
+
229
+ /** The dock's header: which tab you are in, and what it is pointed at. */
230
+ function headerTpl(tab: InspectorTabId): TemplateResult {
231
+ const title = INSPECTOR_TABS.find((t) => t.id === tab)?.title ?? tab;
232
+ return html`
233
+ <header class="panel-header">
234
+ <span class="panel-header-title">${title}</span>
235
+ <span class="panel-header-level">${inspectorTarget()}</span>
236
+ </header>
237
+ `;
238
+ }
239
+
240
+ /** The four-tab strip. Text labels: a dock you read all day should not need to be hovered. */
241
+ function tabsTpl(tab: InspectorTabId): TemplateResult {
242
+ return html`
243
+ <div class="panel-tabs inspector-tabs">
244
+ <sp-tabs
245
+ selected=${tab}
246
+ quiet
247
+ size="s"
248
+ @change=${(e: Event & { target: { selected: string } }) => {
249
+ const sel = e.target.selected;
250
+ if (sel && sel !== tab && isInspectorTabId(sel)) {
251
+ setInspectorTab(sel);
252
+ }
253
+ }}
254
+ >
255
+ ${INSPECTOR_TABS.map((t) => html`<sp-tab value=${t.id} label=${t.title}></sp-tab>`)}
256
+ </sp-tabs>
257
+ </div>
258
+ `;
259
+ }
260
+
261
+ /** The inspector's no-document state, rendered into a document tab's own body. */
262
+ function noDocumentTpl(): TemplateResult {
263
+ return renderEmptyState({
264
+ actions: [openPageAction()],
265
+ message: "Open a page to inspect and style what you click.",
266
+ });
106
267
  }
107
268
 
108
269
  function _doRender() {
@@ -112,87 +273,52 @@ function _doRender() {
112
273
  try {
113
274
  const ctx = _ctx as RightPanelCtx;
114
275
  const aTab = activeTab.value;
115
- if (!aTab) {
116
- rightPanel.textContent = "";
117
- return;
118
- }
119
- const S = {
120
- document: aTab.doc.document,
121
- mode: aTab.doc.mode,
122
- selection: aTab.session.selection,
123
- ui: aTab.session.ui,
124
- };
125
- // Coerce stale values ("assistant" moved to the persistent chat sidebar; automation or a
126
- // Restored session may still carry it).
127
- const tab = ["properties", "events", "style"].includes(S.ui.rightTab)
128
- ? S.ui.rightTab
129
- : "properties";
130
-
131
- // Render tabs header
132
- const panelTabs = [
133
- { icon: "sp-icon-properties", label: "Properties", value: "properties" },
134
- { icon: "sp-icon-event", label: "Events", value: "events" },
135
- { icon: "sp-icon-brush", label: "Style", value: "style" },
136
- ];
137
- const tabsT = html`
138
- <div class="panel-tabs">
139
- <sp-tabs
140
- selected=${tab}
141
- quiet
142
- @change=${(e: Event & { target: { selected: string } }) => {
143
- const sel = e.target.selected;
144
- if (sel && sel !== tab) {
145
- updateUi("rightTab", sel);
146
- render();
147
- }
148
- }}
149
- >
150
- ${panelTabs.map(
151
- (t) => html`
152
- <sp-tab value=${t.value} title=${t.label} aria-label=${t.label}>
153
- ${tabIcon(t.icon, "xs")}
154
- </sp-tab>
155
- `,
156
- )}
157
- </sp-tabs>
158
- </div>
159
- `;
160
-
161
- _ensureContainers();
162
- const containers = [_propsContainer, _eventsContainer, _styleContainer] as HTMLElement[];
163
- const tabKeys = ["properties", "events", "style"];
164
-
165
- // Show/hide containers
166
- for (let i = 0; i < containers.length; i++) {
167
- containers[i]!.style.display = tabKeys[i] === tab ? "" : "none";
168
- }
276
+ const tab = inspectorTab();
169
277
 
170
- // Render tabs into the right panel, append containers
171
- litRender(tabsT, rightPanel);
172
- for (const c of containers) {
173
- if (!c.parentNode) {
174
- rightPanel.append(c);
278
+ litRender(html`${headerTpl(tab)}${tabsTpl(tab)}`, rightPanel);
279
+
280
+ const containers = _ensureContainers(ctx);
281
+ // Show/hide containers, and attach any that a fresh build has not mounted yet.
282
+ for (const [key, el] of containers) {
283
+ el.style.display = key === tab ? "" : "none";
284
+ if (!el.parentNode) {
285
+ rightPanel.append(el);
175
286
  }
176
287
  }
177
288
 
178
- // Only render the active panel's content
289
+ const body = containers.get(tab)!;
290
+ // The assistant paints itself through its own rAF loop into this very container (streaming has
291
+ // To repaint while the composer is focused), so the host must not render over it.
292
+ if (tab === "assistant") {
293
+ return;
294
+ }
295
+ if (!aTab) {
296
+ litRender(noDocumentTpl(), body);
297
+ return;
298
+ }
179
299
  if (tab === "properties") {
180
300
  litRender(
181
301
  renderPropertiesPanelTemplate({
182
302
  navigateToComponent: ctx.navigateToComponent,
183
303
  }),
184
- _propsContainer!,
304
+ body,
185
305
  );
186
306
  } else if (tab === "events") {
187
307
  litRender(
188
- eventsSidebarTemplate({
189
- isCustomElementDoc: () => isCustomElementDoc(S),
308
+ renderLogicPanelTemplate({
309
+ isCustomElementDoc: () =>
310
+ isCustomElementDoc({
311
+ document: aTab.doc.document,
312
+ mode: aTab.doc.mode,
313
+ selection: aTab.session.selection,
314
+ ui: aTab.session.ui,
315
+ }),
190
316
  }),
191
- _eventsContainer!,
317
+ body,
192
318
  );
193
- } else if (tab === "style") {
319
+ } else {
194
320
  try {
195
- litRender(renderStylePanelTemplate({ getCanvasMode: ctx.getCanvasMode }), _styleContainer!);
321
+ litRender(renderStylePanelTemplate({ getCanvasMode: ctx.getCanvasMode }), body);
196
322
  } catch (error) {
197
323
  console.error("[renderStylePanelTemplate]", error);
198
324
  }