@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,15 +1,17 @@
1
1
  /// <reference lib="dom" />
2
2
  // ─── Convert to Component ─────────────────────────────────────────────────────
3
3
  import { html, render as litRender } from "lit-html";
4
+ import { displayTagName } from "@jxsuite/schema/guards";
4
5
  import { errorMessage } from "@jxsuite/schema/parse";
5
6
  import { ref } from "lit-html/directives/ref.js";
6
7
  import { childIndex, getNodeAtPath, parentElementPath } from "../store";
8
+ import { primarySelection } from "../tabs/selection";
7
9
  import { activeTab } from "../workspace/workspace";
8
10
  import { transact } from "../tabs/transact";
9
11
  import { componentRegistry, computeRelativePath, loadComponentRegistry } from "../files/components";
10
12
  import { getPlatform } from "../platform";
11
13
  import { jsonClone } from "../utils/studio-utils";
12
- import { statusMessage } from "../panels/statusbar";
14
+ import { notify } from "../services/notify";
13
15
  import { showDialog } from "../ui/layers";
14
16
  import { validateComponentSlots } from "../services/cem-export";
15
17
 
@@ -20,11 +22,12 @@ const VALID_NAME = /^[a-z][a-z0-9]*(-[a-z0-9]+)+$/;
20
22
  /** Convert the currently selected element into a reusable component. */
21
23
  export async function convertToComponent() {
22
24
  const tab = activeTab.value;
23
- if (!tab?.session.selection || tab.session.selection.length < 2) {
25
+ const selected = primarySelection(tab?.session.selection);
26
+ if (!tab || !selected || selected.length < 2) {
24
27
  return;
25
28
  }
26
29
 
27
- const node = getNodeAtPath(tab.doc.document, tab.session.selection);
30
+ const node = getNodeAtPath(tab.doc.document, selected);
28
31
  if (!node || !node.tagName) {
29
32
  return;
30
33
  }
@@ -44,8 +47,8 @@ export async function convertToComponent() {
44
47
  const refPath = computeRelativePath(tab.documentPath, componentFile);
45
48
 
46
49
  // Single atomic mutation: replace node + add $elements ref
47
- const selectionPath = tab.session.selection;
48
- transact(tab, (doc) => {
50
+ const selectionPath = selected;
51
+ const converted = transact(tab, (doc) => {
49
52
  // Navigate to parent's children array and replace the node
50
53
  const pp = parentElementPath(selectionPath) ?? [];
51
54
  const idx = childIndex(selectionPath) as number;
@@ -71,6 +74,15 @@ export async function convertToComponent() {
71
74
  doc.$elements.push({ $ref: refPath });
72
75
  }
73
76
  });
77
+ /* THE FILE IS WRITTEN ONLY IF THE DOCUMENT TOOK THE REFERENCE.
78
+ `transact` consults the collab gate, which pauses structural editing while source is canonical.
79
+ A refusal used to be invisible here: the extraction still wrote `components/<name>.json` to
80
+ disk and still said "Converted to <name>" — leaving a component file nothing references, in a
81
+ document the author was told had been changed. The gate raises its own toast saying why the
82
+ edit is paused; the honest thing to add to it is nothing at all. */
83
+ if (!converted) {
84
+ return;
85
+ }
74
86
 
75
87
  // Write component file and refresh registry
76
88
  try {
@@ -78,13 +90,22 @@ export async function convertToComponent() {
78
90
  await platform.writeFile(componentFile, JSON.stringify(componentDef, null, 2));
79
91
  await loadComponentRegistry();
80
92
  const warning = validateComponentSlots(componentDef);
93
+ notify.success(`Converted to <${name}>`);
81
94
  if (warning) {
82
- statusMessage(`Converted to <${name}> — Warning: ${warning}`, 6000);
83
- } else {
84
- statusMessage(`Converted to <${name}>`);
95
+ // A slot warning is a thing to FIX, not a thing to read once: the component is written and
96
+ // Usable, and the defect stays listed until somebody edits it.
97
+ notify.warn(`<${name}> has a slot problem: ${warning}`, {
98
+ path: componentFile,
99
+ source: "Components",
100
+ tier: "problem",
101
+ });
85
102
  }
86
103
  } catch (error) {
87
- statusMessage(`Error saving component: ${errorMessage(error)}`);
104
+ notify.error(`Could not save the <${name}> component.`, {
105
+ detail: errorMessage(error),
106
+ path: componentFile,
107
+ source: "Components",
108
+ });
88
109
  }
89
110
  }
90
111
 
@@ -98,7 +119,7 @@ function deriveDefaultName(node: JxMutableNode) {
98
119
  if (node.$id && node.$id.includes("-")) {
99
120
  return node.$id.toLowerCase();
100
121
  }
101
- const tag = (node.tagName ?? "div").toLowerCase();
122
+ const tag = (displayTagName(node.tagName) || "div").toLowerCase();
102
123
  return tag.includes("-") ? tag : `jx-${tag}`;
103
124
  }
104
125
 
@@ -3,6 +3,7 @@
3
3
  import { html, render as litRender, nothing } from "lit-html";
4
4
  import { ref } from "lit-html/directives/ref.js";
5
5
  import { childIndex, childList, getNodeAtPath, parentElementPath } from "../store";
6
+ import { primarySelection } from "../tabs/selection";
6
7
  import { activeTab } from "../workspace/workspace";
7
8
  import { transactDoc } from "../tabs/transact";
8
9
  import { showDialog } from "../ui/layers";
@@ -21,11 +22,11 @@ interface RepeaterConfig {
21
22
  /** Convert the currently selected element into a repeater template. */
22
23
  export async function convertToRepeater() {
23
24
  const tab = activeTab.value;
24
- if (!tab?.session.selection || tab.session.selection.length < 2) {
25
+ const path = primarySelection(tab?.session.selection);
26
+ if (!tab || !path || path.length < 2) {
25
27
  return;
26
28
  }
27
29
 
28
- const path = tab.session.selection;
29
30
  const node = getNodeAtPath(tab.doc.document, path);
30
31
  if (!node) {
31
32
  return;
@@ -182,7 +182,7 @@ export function applyBlockMerge(
182
182
  // Linger as invisible structure that still occupies layout and shows up in the layers panel.
183
183
  pruneEmptyAncestors(t, parentElementPath(fromPath) as JxPath);
184
184
  if (isTabActive(tab)) {
185
- t.session.selection = intoPath;
185
+ t.session.selection = [intoPath];
186
186
  }
187
187
  });
188
188
 
@@ -248,7 +248,7 @@ export function applyInlineSplit(
248
248
  // A background tab's selection stays exactly as the user left it — only the visible tab's
249
249
  // Selection follows the split.
250
250
  if (isTabActive(tab)) {
251
- t.session.selection = newPath;
251
+ t.session.selection = [newPath];
252
252
  }
253
253
  });
254
254
  return newPath;
@@ -279,7 +279,7 @@ export function applyInlineInsert(
279
279
  mutateUpdateProperty(t, path, "textContent");
280
280
  }
281
281
  if (isTabActive(tab)) {
282
- t.session.selection = path;
282
+ t.session.selection = [path];
283
283
  }
284
284
  });
285
285
  return path;
@@ -303,7 +303,7 @@ export function applyInlineInsert(
303
303
  }
304
304
  mutateInsertNode(t, parentPath, idx + 1, structuredClone(elementDef));
305
305
  if (isTabActive(tab)) {
306
- t.session.selection = newPath;
306
+ t.session.selection = [newPath];
307
307
  }
308
308
  });
309
309
  return newPath;
@@ -364,7 +364,7 @@ export function applyRangeReplace(
364
364
  }
365
365
  }
366
366
  if (isTabActive(tab)) {
367
- t.session.selection = from.path;
367
+ t.session.selection = [from.path];
368
368
  }
369
369
  });
370
370
 
@@ -8,7 +8,8 @@
8
8
  */
9
9
 
10
10
  import elementsMeta from "../../data/elements-meta.json";
11
- import { normalizeInlineContent, toggleInlineFormat } from "./inline-format";
11
+ import { displayTagName } from "@jxsuite/schema/guards";
12
+ import { normalizeInlineContent } from "./inline-format";
12
13
  import { isEditableTag } from "./editable-tags";
13
14
  import type { EditableVerdicts } from "./editable-tags";
14
15
  import type { JxPath } from "../state";
@@ -51,6 +52,14 @@ export interface InlineAction {
51
52
  label: string;
52
53
  icon?: string;
53
54
  command?: string;
55
+ /**
56
+ * REMOVED from the data, and the field stays only so an older `elements-meta.json` still parses.
57
+ *
58
+ * It held `"Cmd+B"` — a mac spelling, printed verbatim into every tooltip on every platform,
59
+ * which is the hardcoded-chord defect plan §5.3 exists to kill. The chord now lives on the
60
+ * `format.*` record (`panels/block-action-bar.ts`) and is formatted by the keymap's one
61
+ * formatter. Nothing reads this.
62
+ */
54
63
  shortcut?: string;
55
64
  }
56
65
 
@@ -213,9 +222,9 @@ export function isInlineElement(node: JxMutableNode, parentNode?: JxMutableNode)
213
222
  if (!node || typeof node !== "object") {
214
223
  return false;
215
224
  }
216
- const childTag = (node.tagName ?? "div").toLowerCase();
225
+ const childTag = (displayTagName(node.tagName) || "div").toLowerCase();
217
226
  if (parentNode) {
218
- const parentTag = (parentNode.tagName ?? "div").toLowerCase();
227
+ const parentTag = (displayTagName(parentNode.tagName) || "div").toLowerCase();
219
228
  return isInlineInContext(childTag, parentTag);
220
229
  }
221
230
  return INLINE_TAGS.has(childTag);
@@ -423,57 +432,25 @@ function handleKeydown(e: KeyboardEvent) {
423
432
  if ((e.ctrlKey || e.metaKey) && ["b", "i", "u", "`"].includes(e.key)) {
424
433
  e.preventDefault();
425
434
  }
426
- return;
427
435
  }
428
436
 
429
437
  // Escape and Enter are NOT handled here. Enter arrives as a `beforeinput` (`insertParagraph`),
430
438
  // Which is the one place structural intent is classified; Escape belongs to the editing host,
431
439
  // Which owns dismissing the caret. See {@link file://../canvas/iframe-editable-root.ts}.
432
-
433
- // Slash command trigger
434
- if (e.key === "/" && !e.ctrlKey && !e.metaKey) {
435
- // Check if at start of empty block or after a space/newline
436
- const sel = window.getSelection();
437
- if (sel && sel.rangeCount > 0) {
438
- const range = sel.getRangeAt(0);
439
- const textBefore = getTextBeforeCursor(range);
440
- if (textBefore === "" || textBefore.endsWith(" ") || textBefore.endsWith("\n")) {
441
- // Let the / character be typed, then show menu on next input
442
- requestAnimationFrame(() => openSlashMenu());
443
- return;
444
- }
445
- }
446
- }
447
-
448
- // Rich text shortcuts
449
- if (e.ctrlKey || e.metaKey) {
450
- switch (e.key) {
451
- case "b": {
452
- e.preventDefault();
453
- toggleInlineFormat("strong", activeEl);
454
- break;
455
- }
456
- case "i": {
457
- e.preventDefault();
458
- toggleInlineFormat("em", activeEl);
459
- break;
460
- }
461
- case "`": {
462
- e.preventDefault();
463
- toggleInlineFormat("code", activeEl);
464
- break;
465
- }
466
- default: {
467
- break;
468
- }
469
- }
470
- }
440
+ //
441
+ // Neither is the "/" gesture, and neither are the format chords. Both used to be here, and
442
+ // Both were DEAD: this listener is attached to the BLOCK, and for an ordinary block the editing
443
+ // Host is the canvas container (see {@link startEditing}), so the focused element — and every
444
+ // Keydown's target — is the container, never a descendant of it. The "/" trigger is
445
+ // {@link handleSlashTrigger}, driven from the host; the format chords are `format.*` records
446
+ // Whose chords the frame forwards (`canvas/iframe-keys.ts`). A revived copy here would have
447
+ // Toggled bold twice per press.
471
448
  }
472
449
 
473
450
  function handleInput() {
474
451
  // Check if slash menu should update or dismiss
475
452
  if (slash.isOpen()) {
476
- updateSlashMenu();
453
+ refreshSlashMenu();
477
454
  }
478
455
  }
479
456
 
@@ -773,7 +750,28 @@ function getTextBeforeCursor(range: Range) {
773
750
  /** Track the character offset where "/" was typed so we can detect backspace-past-slash */
774
751
  let _slashFilterStart = 0;
775
752
 
776
- function openSlashMenu() {
753
+ /**
754
+ * Whether a literal "/" in the block anchors the open menu.
755
+ *
756
+ * False when the menu was opened BY NAME — `insert.openSlashMenu`, the palette, the automation
757
+ * runner — where there is no slash in the text at all. Two behaviours hang off it, and both are
758
+ * wrong without it: the filter would be re-derived from the text before the caret and dismiss the
759
+ * menu on the very next keystroke, and selecting a block would delete everything from the previous
760
+ * slash in the line ("and/or…") back to the caret. A command-opened menu filters in its own field
761
+ * and deletes nothing.
762
+ */
763
+ let _slashAnchored = true;
764
+
765
+ /**
766
+ * Open the slash menu at the caret.
767
+ *
768
+ * Exported because the block-level `keydown` listener that used to call it never fires: for an
769
+ * ordinary block the editing host is the canvas container, so the "/" gesture is recognised at the
770
+ * host ({@link handleSlashTrigger}) and a command opens it from the other realm entirely.
771
+ *
772
+ * @param opts.anchored Whether a literal "/" precedes the caret. See {@link _slashAnchored}.
773
+ */
774
+ export function openSlashMenu(opts?: { anchored?: boolean }): void {
777
775
  if (!activeEl || !insertFn || !activePath) {
778
776
  return;
779
777
  }
@@ -783,13 +781,48 @@ function openSlashMenu() {
783
781
  return;
784
782
  }
785
783
  const range = sel.getRangeAt(0);
784
+ _slashAnchored = opts?.anchored !== false;
786
785
  _slashFilterStart = getTextBeforeCursor(range).length;
787
786
 
788
- slash.show(activeEl, "", { onSelect: handleSlashSelect });
787
+ // An unanchored menu carries its own filter field: there is no "/…" run in the document for the
788
+ // Author to type into, so without one the list could only ever be filtered by scrolling it.
789
+ slash.show(activeEl, "", {
790
+ onSelect: handleSlashSelect,
791
+ ...(_slashAnchored ? {} : { showFilter: true }),
792
+ });
789
793
  }
790
794
 
791
- function updateSlashMenu() {
792
- if (!activeEl) {
795
+ /**
796
+ * The "/" gesture, driven from the EDITING HOST.
797
+ *
798
+ * A slash opens the menu at the start of a block or after a space — anywhere else it is punctuation
799
+ * ("and/or"), and a menu there would be an ambush. The character is allowed to land first, so the
800
+ * document holds what the author typed whether or not they pick anything from the list.
801
+ */
802
+ export function handleSlashTrigger(e: KeyboardEvent): void {
803
+ if (e.key !== "/" || e.ctrlKey || e.metaKey || !activeEl) {
804
+ return;
805
+ }
806
+ const sel = window.getSelection();
807
+ if (!sel || sel.rangeCount === 0) {
808
+ return;
809
+ }
810
+ const textBefore = getTextBeforeCursor(sel.getRangeAt(0));
811
+ if (textBefore === "" || textBefore.endsWith(" ") || textBefore.endsWith("\n")) {
812
+ requestAnimationFrame(() => openSlashMenu());
813
+ }
814
+ }
815
+
816
+ /**
817
+ * Re-filter an open menu from the text the author has typed after the "/".
818
+ *
819
+ * Exported for the same reason {@link openSlashMenu} is: the `input` listener that called it is on
820
+ * the block, and a contenteditable's `input` targets the editing HOST.
821
+ */
822
+ export function refreshSlashMenu(): void {
823
+ if (!activeEl || !_slashAnchored) {
824
+ // The menu owns its own filter field; the document has no "/…" run to derive one from, and
825
+ // Deriving one would dismiss the menu on the first character.
793
826
  return;
794
827
  }
795
828
 
@@ -818,8 +851,11 @@ function handleSlashSelect(cmd: SlashCommand) {
818
851
  return;
819
852
  }
820
853
 
821
- // Remove the /command text from the element
822
- const sel = window.getSelection();
854
+ /* Remove the "/command" run the author typed — but ONLY when a "/" is what opened the menu.
855
+ An unanchored menu (opened by name, from the palette or `insert.openSlashMenu`) has no such
856
+ run, and this walk would delete from the last slash ANYWHERE earlier in the block back to the
857
+ caret: type "and/or" and pick Heading, and "or" goes with it. */
858
+ const sel = _slashAnchored ? window.getSelection() : null;
823
859
  if (sel && sel.rangeCount) {
824
860
  const range = sel.getRangeAt(0);
825
861
  const fullText = getTextBeforeCursor(range);
@@ -27,7 +27,7 @@ export function runInsertZoneAction(btn: HTMLElement, zone: InsertZone): void {
27
27
  const newPath = [...insertPath, "children", idx];
28
28
  transactDoc(activeTab.value, (t) => {
29
29
  mutateInsertNode(t, insertPath, idx, def);
30
- t.session.selection = newPath;
30
+ t.session.selection = [newPath];
31
31
  });
32
32
  },
33
33
  showFilter: true,