@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
@@ -0,0 +1,116 @@
1
+ /**
2
+ * **Where a content entry's fields live**, and the one mutation that writes them.
3
+ *
4
+ * A collection has two storage shapes and exactly one editor, so the question "what record am I
5
+ * editing?" has to be answered once, here, rather than assumed at every read site.
6
+ *
7
+ * - A **markdown** entry (or any file a format class parsed) is a frontmatter block plus a body. Its
8
+ * fields are `tab.doc.content.frontmatter`; `tab.doc.document` is the prose.
9
+ * - A **JSON** entry (site-architecture.md §6.2's native collection shape) has no frontmatter block
10
+ * to split off. `files/files.ts` parses it straight into `tab.doc.document`, and
11
+ * `files/file-ops.ts` writes that object back as the whole file. Its fields ARE the document.
12
+ *
13
+ * The Entry editor read `content.frontmatter` unconditionally. For a JSON entry that record is `{}`
14
+ * — so the form drew blank rows for an entry full of data, `absentRequiredErrors` accused a valid
15
+ * entry of missing its required fields, and every keystroke was committed to a record that
16
+ * `serializeDocument` never writes: the edit marked the tab dirty, survived undo, and was discarded
17
+ * by ⌘S under a "Saved" toast. Three symptoms, one wrong assumption about storage.
18
+ *
19
+ * **The discriminator is the serializer's own ladder, not a guess about the extension.**
20
+ * `serializeDocument` writes `JSON.stringify(tab.doc.document)` for exactly one kind of tab: no
21
+ * format class claimed it (`sourceFormat === null`) and it is not a content-mode document. Those
22
+ * are the two reads {@link fieldsAreDocument} makes, so "which record does the form edit" and
23
+ * "which record does save write" cannot drift apart — and if a project ever registers a format
24
+ * class for `.json`, both answers move together to frontmatter.
25
+ *
26
+ * Both shapes mutate with the same semantics — `undefined`, `null` and `""` remove the key, every
27
+ * other value is written — so an author cannot tell from the form's behaviour which one they are
28
+ * editing. That is the point.
29
+ */
30
+
31
+ import { cloneValue } from "@jxsuite/collab/ops";
32
+ import { recordDocOp } from "../tabs/patch-ops";
33
+ import { mutateUpdateFrontmatter, transactDoc } from "../tabs/transact";
34
+ import type { Tab } from "../tabs/tab";
35
+ import type { JsonValue } from "../types";
36
+
37
+ /**
38
+ * Whether this tab's entry fields are the document itself rather than a frontmatter block.
39
+ *
40
+ * Mirrors `files/file-ops.ts`'s `serializeDocument` fall-through: a tab with no serializing format
41
+ * and no content mode round-trips as raw JSON, so anything not in `tab.doc.document` is not saved.
42
+ *
43
+ * Deliberately NOT exported. The answer is only ever useful as the record it selects, and a second
44
+ * caller branching on it would be the beginning of the fork this module exists to prevent —
45
+ * {@link entryFields} and {@link mutateEntryField} are the whole interface.
46
+ */
47
+ function fieldsAreDocument(tab: Tab): boolean {
48
+ return tab.doc.sourceFormat == null && tab.doc.mode !== "content";
49
+ }
50
+
51
+ /**
52
+ * The record this entry's fields live in — the one the form draws, validates and repaints from.
53
+ *
54
+ * Returned live, not copied: the caller reads it during a render that is already tracking the
55
+ * reactive tab, and a copy would break that. It is also the identity a caller can compare against
56
+ * `tab.doc.document` to see which store answered.
57
+ */
58
+ export function entryFields(tab: Tab): Record<string, unknown> {
59
+ return fieldsAreDocument(tab)
60
+ ? (tab.doc.document as unknown as Record<string, unknown>)
61
+ : (tab.doc.content?.frontmatter ?? {});
62
+ }
63
+
64
+ /**
65
+ * Set one document-root key, recording the forward/inverse pair history and the collab bridge
66
+ * replay from. The same shape `mutateUpdateFrontmatter` records for a frontmatter key, against the
67
+ * other store — a JSON entry's field change is a genuine document op, so unlike a frontmatter op it
68
+ * also reaches a co-editor.
69
+ *
70
+ * No canvas patch op: a JSON entry has no rendered node for the key, and an unrecorded patch batch
71
+ * is already the "not surgically patchable, fall back" signal `transactDoc` reads.
72
+ */
73
+ function mutateDocumentField(tab: Tab, field: string, value?: JsonValue): void {
74
+ const doc = tab.doc.document as unknown as Record<string, unknown>;
75
+ const before = Object.hasOwn(doc, field) ? cloneValue(doc[field]) : undefined;
76
+ const deletes = value === undefined || value === null || value === "";
77
+ if (deletes) {
78
+ delete doc[field];
79
+ } else {
80
+ doc[field] = value;
81
+ }
82
+ const after = deletes ? undefined : cloneValue(value);
83
+ recordDocOp({
84
+ forward: { key: field, op: "set-key", path: [], value: after },
85
+ inverse: { key: field, op: "set-key", path: [], value: before },
86
+ });
87
+ tab.doc.dirty = true;
88
+ }
89
+
90
+ /**
91
+ * Set one entry field, in whichever record this entry keeps its fields in.
92
+ *
93
+ * A mutation, not a transaction: callers wrap it in `transactDoc` so a multi-key change is one undo
94
+ * step.
95
+ */
96
+ export function mutateEntryField(tab: Tab, field: string, value?: JsonValue): void {
97
+ if (fieldsAreDocument(tab)) {
98
+ mutateDocumentField(tab, field, value);
99
+ } else {
100
+ mutateUpdateFrontmatter(tab, field, value);
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Commit a form patch onto this entry's fields, in ONE transaction.
106
+ *
107
+ * `renderForm` emits single-key patches today, but committing per key would put a multi-key patch
108
+ * on the undo stack as several steps — and an author who changed one thing expects one ⌘Z.
109
+ */
110
+ export function commitEntryFields(tab: Tab, patch: Record<string, unknown>): void {
111
+ transactDoc(tab, (t) => {
112
+ for (const [field, value] of Object.entries(patch)) {
113
+ mutateEntryField(t, field, value as JsonValue);
114
+ }
115
+ });
116
+ }
@@ -0,0 +1,175 @@
1
+ /**
2
+ * The content-entry model — which collection an entry belongs to, and what a NEW one contains. Pure
3
+ * over its inputs (the project config it reads, the schema it is handed), so the seeding rules can
4
+ * be asserted without a DOM, a platform or a tab.
5
+ *
6
+ * **Two facts this module exists to stop being restated.**
7
+ *
8
+ * 1. **A new entry is seeded, not blank.** `library-pane.ts`'s collection branch created the file
9
+ * through the shared creation flow with no extension and no body, so a new `blog` entry landed
10
+ * as `content/blog/untitled` — no `.md`, therefore matched by no format, therefore not an entry
11
+ * of the collection it was created in, and its required fields were absent rather than empty.
12
+ * {@link seedEntry} answers with the schema's own defaults, and every REQUIRED property that
13
+ * declares none gets a typed empty, because "present and blank" is a valid entry the author can
14
+ * fill in and "absent" is a validation failure they did not cause.
15
+ * 2. **Where the entry files are** is `collectionInfo`'s answer, imported rather than recomputed.
16
+ * Three copies of "which collection owns this path, and what extension do its entries carry"
17
+ * already exist (`utils/studio-utils.ts`'s `findContentTypeSchema`, `grid/sources/content-
18
+ * source.ts`'s `collectionInfo`, `browse/library-model.ts`'s `contentTypeFor`); this module adds
19
+ * no fourth and calls the two that are exported.
20
+ *
21
+ * **The draft axis is NOT here.** `content/draft-state.ts` owns what a draft is and whether drafts
22
+ * are listed, because this module imports `content-source.ts` and the grid source must be able to
23
+ * ask what a draft is — the reverse edge would be a cycle, and `import/no-cycle` is an error here.
24
+ */
25
+
26
+ import { collectionInfo } from "../grid/sources/content-source";
27
+ import { projectState } from "../store";
28
+ import { findContentTypeSchema } from "../utils/studio-utils";
29
+ import type { ContentSectionEntry } from "../types";
30
+ import type { ContentTypeSchema, ContentTypeSchemaField } from "@jxsuite/schema/types";
31
+
32
+ // ─── Collections ─────────────────────────────────────────────────────────────
33
+
34
+ /** One content collection, as the entry surfaces need it. */
35
+ export interface EntryCollection {
36
+ name: string;
37
+ /** Source directory, project-relative and without a trailing slash. */
38
+ dir: string;
39
+ /** The extension a new entry of this collection is written with (`.md`, `.json`, …). */
40
+ ext: string;
41
+ schema: ContentTypeSchema | null;
42
+ def: ContentSectionEntry;
43
+ }
44
+
45
+ /** Every content type the project declares, in declaration order. */
46
+ export function collectionNames(): string[] {
47
+ return Object.keys((projectState?.projectConfig?.content ?? {}) as Record<string, unknown>);
48
+ }
49
+
50
+ /**
51
+ * The collection named `name`, or null when the project declares no such directory-backed type.
52
+ *
53
+ * A collection whose `source` names a FILE (a CSV catalogue) has no per-entry files, so it has no
54
+ * entry editor and no New Entry — `collectionInfo` still answers for it, and this rejects it here
55
+ * rather than letting a caller compose `products/catalog.csv/untitled.csv`.
56
+ */
57
+ export function entryCollection(name: string): EntryCollection | null {
58
+ const info = collectionInfo(name);
59
+ if (!info) {
60
+ return null;
61
+ }
62
+ if (/\.[a-z\d]+$/i.test(info.dir)) {
63
+ return null;
64
+ }
65
+ return {
66
+ def: info.def,
67
+ dir: info.dir,
68
+ ext: info.ext,
69
+ name: info.name,
70
+ schema: info.def.schema ?? null,
71
+ };
72
+ }
73
+
74
+ /** The collections a New Entry can be created in — directory-backed types only. */
75
+ export function entryCollections(): EntryCollection[] {
76
+ return collectionNames()
77
+ .map((name) => entryCollection(name))
78
+ .filter((collection): collection is EntryCollection => collection !== null);
79
+ }
80
+
81
+ /**
82
+ * The collection a document path belongs to, or null.
83
+ *
84
+ * Delegates to `findContentTypeSchema`, which is the matcher the frontmatter surfaces already use —
85
+ * including its Windows backslash normalisation and its file-source (CSV) branch. A path that
86
+ * matches a type with no `schema` is NOT a match there, and that is the right answer here too: an
87
+ * entry editor over a collection that declares no shape has no form to draw.
88
+ */
89
+ export function collectionOfPath(path: string | null): EntryCollection | null {
90
+ const matched = findContentTypeSchema(path ?? null, projectState?.projectConfig);
91
+ return matched ? entryCollection(matched.name) : null;
92
+ }
93
+
94
+ // ─── Seeding a new entry ─────────────────────────────────────────────────────
95
+
96
+ /** Deep copy of a schema `default`, so two entries seeded from one schema never share an object. */
97
+ function cloneDefault(value: unknown): unknown {
98
+ if (value === null || typeof value !== "object") {
99
+ return value;
100
+ }
101
+ // oxlint-disable-next-line unicorn/prefer-structured-clone
102
+ return JSON.parse(JSON.stringify(value)) as unknown;
103
+ }
104
+
105
+ /**
106
+ * The empty value of a declared type — what a REQUIRED property with no `default` is seeded with.
107
+ *
108
+ * A reference (`$ref` to another collection) seeds as `""`: it is required, so the key must exist,
109
+ * and picking an arbitrary entry of the target collection on the author's behalf would be inventing
110
+ * a relationship they never stated.
111
+ */
112
+ function emptyForField(field: ContentTypeSchemaField): unknown {
113
+ if (typeof field.$ref === "string") {
114
+ return "";
115
+ }
116
+ switch (field.type) {
117
+ case "boolean": {
118
+ return false;
119
+ }
120
+ case "integer":
121
+ case "number": {
122
+ return 0;
123
+ }
124
+ case "array": {
125
+ return [];
126
+ }
127
+ case "object": {
128
+ return seedEntry(field as ContentTypeSchema);
129
+ }
130
+ default: {
131
+ return "";
132
+ }
133
+ }
134
+ }
135
+
136
+ /**
137
+ * The frontmatter a new entry of this schema starts life with.
138
+ *
139
+ * Two rules, and nothing else:
140
+ *
141
+ * - A property that declares a `default` gets it (cloned);
142
+ * - A property listed in `required` that declares no default gets its type's empty value.
143
+ *
144
+ * An optional property with no default is **omitted**. Seeding every declared field would write the
145
+ * author's file full of keys they never asked for, and "the schema mentions it" is not a reason for
146
+ * it to exist on disk — the form still draws a row for it, because the form draws the SCHEMA.
147
+ */
148
+ export function seedEntry(schema: ContentTypeSchema | null | undefined): Record<string, unknown> {
149
+ const properties = schema?.properties;
150
+ if (!properties) {
151
+ return {};
152
+ }
153
+ const required = new Set(Array.isArray(schema?.required) ? schema.required : []);
154
+ const seed: Record<string, unknown> = {};
155
+ for (const [name, field] of Object.entries(properties)) {
156
+ if (field.default !== undefined) {
157
+ seed[name] = cloneDefault(field.default);
158
+ } else if (required.has(name)) {
159
+ seed[name] = emptyForField(field);
160
+ }
161
+ }
162
+ return seed;
163
+ }
164
+
165
+ /**
166
+ * Required properties this record leaves absent — what a caller checks before claiming an entry is
167
+ * valid. `seedEntry`'s whole promise is that this is empty for a freshly seeded entry.
168
+ */
169
+ export function missingRequired(
170
+ schema: ContentTypeSchema | null | undefined,
171
+ value: Record<string, unknown>,
172
+ ): string[] {
173
+ const required = Array.isArray(schema?.required) ? schema.required : [];
174
+ return required.filter((name) => value[name] === undefined);
175
+ }
@@ -2,9 +2,13 @@
2
2
  /**
3
3
  * Parent-realm adapter for canvas right-clicks: the iframe suppresses the browser menu and posts
4
4
  * `contextMenu` with the nearest element path + iframe-viewport coords; the host converts to
5
- * parent-viewport coords and calls this handler, which shows the Jx element context menu (copy /
6
- * paste / insert before/after / convert / delete…). Replaces the legacy panel-events canvas
7
- * contextmenu handler that died with the in-parent <div> canvas.
5
+ * parent-viewport coords and calls this handler, which shows the Jx element context menu. Replaces
6
+ * the legacy panel-events canvas contextmenu handler that died with the in-parent <div> canvas.
7
+ *
8
+ * The canvas menu IS the `context/element` placement — this adapter contributes coordinates and the
9
+ * component-navigation hook, and never a list of verbs. Which rows appear, what they are called,
10
+ * whether they are enabled and what chord they teach all come from the registry
11
+ * (`context-menu.ts`).
8
12
  */
9
13
 
10
14
  import { dismissContextMenu, showContextMenu } from "./context-menu";
@@ -14,12 +18,14 @@ import type { CanvasContextMenuHandler } from "../canvas/iframe-host";
14
18
  import type { JxPath } from "../state";
15
19
 
16
20
  /**
17
- * Build the handler with its studio-owned dependency (component navigation), mirroring the other
18
- * host DI factories.
21
+ * Build the handler.
22
+ *
23
+ * It took a `navigateToComponent` dep, threaded into the menu as a per-target `onEditComponent`
24
+ * hook. "Edit Component" is `panels/block-action-bar.ts`'s record now and navigates through the
25
+ * same function this host was handing over, so the dep became a second way to say one thing — and a
26
+ * component right-clicked from a host that forgot to pass it showed neither Edit nor Convert.
19
27
  */
20
- export function makeCanvasContextMenuHandler(deps: {
21
- navigateToComponent: (path: string) => void | Promise<void>;
22
- }): CanvasContextMenuHandler {
28
+ export function makeCanvasContextMenuHandler(): CanvasContextMenuHandler {
23
29
  return {
24
30
  dismiss: () => dismissContextMenu(),
25
31
  show: ({ path, clientX, clientY }) => {
@@ -32,9 +38,9 @@ export function makeCanvasContextMenuHandler(deps: {
32
38
  // ShowContextMenu reads only preventDefault/clientX/clientY from the event, so a synthetic
33
39
  // MouseEvent carries the converted coords safely.
34
40
  const evt = new MouseEvent("contextmenu", { clientX, clientY });
35
- showContextMenu(evt, bubbled, {
36
- onEditComponent: (p) => void deps.navigateToComponent(p),
37
- });
41
+ // No `onEditComponent` hook: "Edit Component" is `block-action-bar.ts`'s record now, and it
42
+ // Navigates through the same `navigateToComponent` this host was handing over.
43
+ showContextMenu(evt, bubbled);
38
44
  },
39
45
  };
40
46
  }
@@ -14,8 +14,15 @@ import type { CanvasSlashHandler } from "../canvas/iframe-host";
14
14
  export const canvasSlashHandler: CanvasSlashHandler = {
15
15
  dismiss: () => dismissSlashMenu(),
16
16
  nav: (key) => handleSlashMenuKey(key),
17
- // No filter input: the author keeps typing in the iframe contenteditable and the engine re-posts
18
- // SlashShow with the updated filter.
19
- show: ({ rect, filter, onSelect, onDismiss }) =>
20
- showSlashMenuAtRect(rect, filter, { onDismiss, onSelect }),
17
+ /* The filter field appears only when the frame asks for it, and only the frame knows why the menu
18
+ opened. Typing "/" needs none — the author keeps typing into the iframe's contenteditable and
19
+ the engine re-posts `slashShow` with the updated filter. A menu opened BY NAME
20
+ (`insert.openSlashMenu`) has no "/…" run to type into, so without the field the only way past
21
+ fifteen blocks is scrolling. */
22
+ show: ({ rect, filter, showFilter, onSelect, onDismiss }) =>
23
+ showSlashMenuAtRect(rect, filter, {
24
+ onDismiss,
25
+ onSelect,
26
+ ...(showFilter === true ? { showFilter: true } : {}),
27
+ }),
21
28
  };