@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,322 @@
1
+ /**
2
+ * The `i18n:` family — the four verbs that are NOT a rendering context.
3
+ *
4
+ * Jx has no message catalogue. A translation is a different file in a different directory
5
+ * (`specs/site-architecture.md` §13.3), so "show this page in French" is two unrelated jobs, and
6
+ * conflating them is how a language control comes to change a chip and nothing else:
7
+ *
8
+ * | id | job |
9
+ * | ------------------------ | ----------------------------------------------------------- |
10
+ * | `i18n.openTranslation` | NAVIGATION — open the sibling file for a locale |
11
+ * | `i18n.createTranslation` | create that sibling, seeded from the document it translates |
12
+ * | `i18n.showParity` | reveal the Languages panel |
13
+ * | `i18n.addLocale` | declare a language in `project.json` |
14
+ *
15
+ * `i18n.switchLocale` is the fifth verb and lives in `canvas/canvas-utils.ts` with the per-tab UI
16
+ * state it writes: it changes how the artboard RENDERS — `lang`, `dir` and the injected `$locale` —
17
+ * while the text on screen stays whatever file is open. These four change which file that is, or
18
+ * which languages exist.
19
+ *
20
+ * **`i18n.addLocale` is the one that is not gated on `isMultilingual`.** Gating it would make the
21
+ * first language of a project unreachable by every door except a text editor, which is the state
22
+ * this family exists to end.
23
+ *
24
+ * The locale enums are GETTERS. A command record is built at module scope — `commands/
25
+ * app-commands.ts` builds the whole set before a project is open — so `enumProperty(locales(), …)`
26
+ * would freeze the list at `[]` for the lifetime of the window, a defect this repo has already
27
+ * shipped once (`content/entry-commands.ts` carries the post-mortem).
28
+ */
29
+
30
+ import { getPlatform } from "../platform";
31
+ import { getEffectiveLocales } from "../site-context";
32
+ import { localeLabel, translationPathFor } from "@jxsuite/schema/locale";
33
+ import { notify } from "../services/notify";
34
+ import { setActivityTab } from "../shell";
35
+ import { tabOfPane } from "../canvas/canvas-surface";
36
+ import { activeTab } from "../workspace/workspace";
37
+ import { addProjectLocale } from "../settings/locales-section";
38
+ import { argsSchema, optionalStringArg, stringArg, stringProperty } from "../commands/command-args";
39
+ import type { CommandArgValues } from "../commands/command-args";
40
+ import type { AnyCommand, CommandRegistry } from "../commands/registry";
41
+ import type { Tab } from "../tabs/tab";
42
+
43
+ /** The tags a translation verb may be asked for — the project's declared locales, read live. */
44
+ function declaredLocales(): string[] {
45
+ return getEffectiveLocales()?.locales ?? [];
46
+ }
47
+
48
+ /**
49
+ * An enum property whose values are derived WHEN THE SCHEMA IS READ, not when the record is built.
50
+ *
51
+ * The getter is the whole difference from `command-args.ts`'s `enumProperty`, and it is invisible
52
+ * in a unit test that builds the record with a project already open — see this module's header.
53
+ */
54
+ function derivedEnumProperty(declared: () => readonly string[], description: string): object {
55
+ return {
56
+ description,
57
+ get enum() {
58
+ return [...declared()];
59
+ },
60
+ type: "string",
61
+ };
62
+ }
63
+
64
+ /**
65
+ * The document a translation verb acts on: the named pane's, or the focused one's.
66
+ *
67
+ * `pane` is optional because the palette addresses the focus and the pane's own context bar
68
+ * addresses itself. Refusing by name rather than falling back to the active tab is deliberate: a
69
+ * caller that named a pane meant that pane, and quietly translating a different document is worse
70
+ * than doing nothing.
71
+ *
72
+ * A tab with no `documentPath` is refused here too. Every one of these verbs is a statement about
73
+ * where a file LIVES, and a document that has never been written has no locale directory to be
74
+ * beside.
75
+ */
76
+ function addressedTab(commandId: string, args: CommandArgValues): Tab & { documentPath: string } {
77
+ const paneId = optionalStringArg(commandId, args, "pane");
78
+ const tab = paneId === undefined ? (activeTab.value as Tab | null) : tabOfPane(paneId);
79
+ if (!tab) {
80
+ throw new RangeError(
81
+ paneId === undefined
82
+ ? `command "${commandId}" needs a document open`
83
+ : `command "${commandId}" argument "pane": no document is open in pane "${paneId}"`,
84
+ );
85
+ }
86
+ if (tab.documentPath === null) {
87
+ throw new RangeError(`command "${commandId}" needs a document that has been saved to a file`);
88
+ }
89
+ return tab as Tab & { documentPath: string };
90
+ }
91
+
92
+ /**
93
+ * Where this document's copy in `locale` belongs, or null with the reason already notified.
94
+ *
95
+ * `translationPathFor` answers null for three different situations and the author needs to know
96
+ * which: an undeclared tag, a project with no locales at all, and a path that cannot carry a locale
97
+ * segment (a component, a layout, a file at the project root).
98
+ */
99
+ function siblingPath(tab: Tab & { documentPath: string }, locale: string): string | null {
100
+ const i18n = getEffectiveLocales();
101
+ const path = translationPathFor(tab.documentPath, locale, i18n);
102
+ if (path !== null) {
103
+ return path;
104
+ }
105
+ if (i18n === null || !i18n.locales.includes(locale)) {
106
+ notify.error(`This project does not declare ${localeLabel(locale)}.`, {
107
+ action: "settings.open",
108
+ detail: "Add it in Settings › Locales, or with the Add Language command.",
109
+ source: "Languages",
110
+ });
111
+ return null;
112
+ }
113
+ notify.error(`${tab.documentPath} cannot have a translation.`, {
114
+ detail:
115
+ "A translation is the same file under a locale directory, so only files that live under a " +
116
+ "routed directory — pages and content entries — have one. A layout, a component or a file " +
117
+ "at the project root is shared by every language.",
118
+ path: tab.documentPath,
119
+ source: "Languages",
120
+ });
121
+ return null;
122
+ }
123
+
124
+ /** Whether a path is on disk. The platform has no `exists`, and a read is the honest probe. */
125
+ async function fileExists(path: string): Promise<boolean> {
126
+ try {
127
+ await getPlatform().readFile(path);
128
+ return true;
129
+ } catch {
130
+ // A read that fails is the answer, not an error to report: "no such file" is the whole question
131
+ // And an unreadable file is one the caller cannot open either.
132
+ return false;
133
+ }
134
+ }
135
+
136
+ /** The four records. */
137
+ export function i18nCommands(): AnyCommand[] {
138
+ return [
139
+ {
140
+ args: argsSchema(
141
+ {
142
+ locale: derivedEnumProperty(
143
+ declaredLocales,
144
+ "The language to open this document's translation in.",
145
+ ),
146
+ pane: stringProperty("Pane whose document to translate. Defaults to the focused one."),
147
+ },
148
+ ["locale"],
149
+ ),
150
+ category: "File",
151
+ id: "i18n.openTranslation",
152
+ level: "document",
153
+ /* `context/tab`, not `context/file`: the subject is the document a tab holds, and
154
+ `commands/levels.ts` admits only `project` verbs onto a file row — a `document`-level
155
+ record declared there is a level × placement violation `check-command-levels.ts` fails on.
156
+ The brief's `context/file` was written against the file row this verb does not act on. */
157
+ menus: ["context/tab", "palette"],
158
+ group: "2_navigate",
159
+ requires: "a document open in a project that declares more than one language",
160
+ when: (ctx) => ctx.project.isMultilingual && ctx.document.open,
161
+ aiTool: {
162
+ description:
163
+ "Open this document's translation in another language — the sibling file under that " +
164
+ "locale's directory. Does not create one; use create_translation for that.",
165
+ name: "open_translation",
166
+ },
167
+ run: async (_ctx, args) => {
168
+ const tab = addressedTab("i18n.openTranslation", args);
169
+ const locale = stringArg("i18n.openTranslation", args, "locale");
170
+ const path = siblingPath(tab, locale);
171
+ if (path === null) {
172
+ return;
173
+ }
174
+ if (path === tab.documentPath) {
175
+ notify.info(`${tab.documentPath} is already the ${localeLabel(locale)} copy.`, {
176
+ source: "Languages",
177
+ });
178
+ return;
179
+ }
180
+ if (!(await fileExists(path))) {
181
+ notify.warn(`There is no ${localeLabel(locale)} translation of this document yet.`, {
182
+ action: "i18n.createTranslation",
183
+ detail: `Create Translation writes ${path}, seeded from the document you are on.`,
184
+ path,
185
+ source: "Languages",
186
+ });
187
+ return;
188
+ }
189
+ const { openFileInTab } = await import("../files/files");
190
+ await openFileInTab(path);
191
+ },
192
+ title: "Open Translation",
193
+ },
194
+ {
195
+ args: argsSchema({
196
+ locale: derivedEnumProperty(
197
+ declaredLocales,
198
+ "The language to create this document's translation in.",
199
+ ),
200
+ }),
201
+ category: "File",
202
+ id: "i18n.createTranslation",
203
+ level: "document",
204
+ menus: ["palette"],
205
+ group: "2_navigate",
206
+ requires: "a document open in a project that declares more than one language",
207
+ when: (ctx) => ctx.project.isMultilingual && ctx.document.open,
208
+ /* The document history cannot hold this: the change is a file that did not exist, and
209
+ `undo: "project"` would claim `project.json` moved, which it did not. */
210
+ undo: "none",
211
+ aiTool: {
212
+ description:
213
+ "Create the missing translation of this document in another language, seeded with a " +
214
+ "copy of the document being translated, and open it.",
215
+ name: "create_translation",
216
+ },
217
+ run: async (_ctx, args) => {
218
+ const tab = addressedTab("i18n.createTranslation", args);
219
+ const locale = stringArg("i18n.createTranslation", args, "locale");
220
+ const path = siblingPath(tab, locale);
221
+ if (path === null) {
222
+ return;
223
+ }
224
+ if (await fileExists(path)) {
225
+ notify.info(`The ${localeLabel(locale)} translation already exists.`, {
226
+ action: "i18n.openTranslation",
227
+ path,
228
+ source: "Languages",
229
+ });
230
+ return;
231
+ }
232
+ /* SEEDED FROM DISK, not from the open document. What is on screen may hold unsaved edits
233
+ and an in-memory tree would have to be re-serialized by whichever format owns the file —
234
+ a second serializer for the same bytes. The file the author is translating is the file
235
+ they saved. */
236
+ let content: string;
237
+ try {
238
+ content = await getPlatform().readFile(tab.documentPath);
239
+ } catch {
240
+ // An unreadable source is not a translation that can be seeded, and the path says which.
241
+ notify.error(`Could not read ${tab.documentPath} to copy it.`, {
242
+ path: tab.documentPath,
243
+ source: "Languages",
244
+ });
245
+ return;
246
+ }
247
+ const cut = path.lastIndexOf("/");
248
+ const { createFileIn, openFileInTab } = await import("../files/files");
249
+ const created = await createFileIn({
250
+ content,
251
+ dir: cut === -1 ? "." : path.slice(0, cut),
252
+ source: "Languages",
253
+ suggestedName: path.slice(cut + 1),
254
+ title: `New ${localeLabel(locale)} translation`,
255
+ });
256
+ if (created !== null) {
257
+ await openFileInTab(created);
258
+ }
259
+ },
260
+ title: "Create Translation",
261
+ },
262
+ {
263
+ category: "View",
264
+ id: "i18n.showParity",
265
+ level: "project",
266
+ menus: ["commandbar/overflow", "palette"],
267
+ group: "2_view",
268
+ requires: "a project that declares more than one language",
269
+ when: (ctx) => ctx.project.isMultilingual,
270
+ aiTool: {
271
+ description:
272
+ "Show the Languages panel — every page in the project against every declared language, " +
273
+ "and which translations are missing or older than their source.",
274
+ name: "show_translation_parity",
275
+ },
276
+ /* The panel is off the rail — it spends no rail slot and shifts no ⌘1-8 chord — so this
277
+ command and the generated `panel.focus.i18n` are its only two doors, and both open the
278
+ same one. The TITLES must differ even though the behaviour does not: the palette is a flat
279
+ searchable list where "View: Show Languages" twice is two rows a reader cannot choose
280
+ between. This one is named for what the panel SAYS (which pages are translated and which
281
+ are stale); `panel.focus.i18n` is named for the panel. */
282
+ run: () => {
283
+ setActivityTab("i18n");
284
+ },
285
+ title: "Show Translation Parity",
286
+ },
287
+ {
288
+ args: argsSchema({
289
+ locale: stringProperty(
290
+ "A BCP 47 language tag to declare — `fr`, `pt-BR`, `zh-Hant`. Canonicalized on the way " +
291
+ "in; a malformed tag is refused rather than written.",
292
+ ),
293
+ }),
294
+ category: "Project",
295
+ id: "i18n.addLocale",
296
+ level: "project",
297
+ menus: ["palette"],
298
+ group: "7_settings",
299
+ /* THE ONE RECORD HERE THAT IS NOT GATED ON `isMultilingual`, and the reason the gate is
300
+ spelled out at each record rather than applied to the family: a project declaring zero or
301
+ one language is exactly the project that needs this verb. */
302
+ requires: "an open project",
303
+ when: (ctx) => ctx.project.open,
304
+ undo: "project",
305
+ aiTool: {
306
+ description:
307
+ "Declare a language for this project, adding it to project.json's i18n.locales. Every " +
308
+ "other language surface reads that list.",
309
+ name: "add_project_locale",
310
+ },
311
+ run: async (_ctx, args) => {
312
+ await addProjectLocale(stringArg("i18n.addLocale", args, "locale"));
313
+ },
314
+ title: "Add Language",
315
+ },
316
+ ];
317
+ }
318
+
319
+ /** Register the `i18n:` family. */
320
+ export function registerI18nCommands(registry: CommandRegistry): void {
321
+ registry.registerAll(i18nCommands());
322
+ }
@@ -177,7 +177,9 @@ function repoRowTpl(repo: RepoInfo) {
177
177
  class="add-repo-row"
178
178
  ?disabled=${Boolean(_importing)}
179
179
  title=${repo.fullName}
180
- @click=${() => void chooseRepo(repo)}
180
+ @click=${() => {
181
+ void chooseRepo(repo);
182
+ }}
181
183
  >
182
184
  <span class="add-repo-name">${repo.fullName}</span>
183
185
  <span class="add-repo-meta">
@@ -290,14 +292,7 @@ function accessTpl() {
290
292
  function renderModal() {
291
293
  const tpl = html`
292
294
  <sp-underlay open @close=${closeAddRepoModal}></sp-underlay>
293
- <div
294
- class="new-project-modal add-repo-modal"
295
- @keydown=${(e: KeyboardEvent) => {
296
- if (e.key === "Escape") {
297
- closeAddRepoModal();
298
- }
299
- }}
300
- >
295
+ <div class="new-project-modal add-repo-modal">
301
296
  <div class="new-project-modal-header">
302
297
  <h2 class="new-project-modal-title">
303
298
  ${_mode === "open" ? "Open Project" : "Add existing repository"}
@@ -324,6 +319,9 @@ function renderModal() {
324
319
  if (_handle) {
325
320
  _handle.update(tpl);
326
321
  } else {
327
- _handle = openModal(tpl);
322
+ _handle = openModal(tpl, {
323
+ label: _mode === "open" ? "Open Project" : "Add existing repository",
324
+ onDismiss: closeAddRepoModal,
325
+ });
328
326
  }
329
327
  }
@@ -9,6 +9,8 @@
9
9
  import { html } from "lit-html";
10
10
  import { getPlatform } from "../platform";
11
11
  import { getBaseUrl, getModel, getOpenAiKey } from "../services/ai-settings";
12
+ import { IMPORT_WARNING_PHASE } from "../services/import-client";
13
+ import { notify } from "../services/notify";
12
14
  import { errorMessage } from "@jxsuite/schema/parse";
13
15
  import { destinationPath } from "./location-fields";
14
16
  import type { TemplateResult } from "lit-html";
@@ -161,6 +163,11 @@ export async function startImport(ctx: ImportTabCtx) {
161
163
  },
162
164
  (evt) => {
163
165
  _log = [..._log, evt];
166
+ // The log is destroyed the moment a successful import hands off, so the one line the client
167
+ // Emits about lines it could not read is re-posted where it will outlive that.
168
+ if (evt.phase === IMPORT_WARNING_PHASE) {
169
+ notify.warn(evt.message);
170
+ }
164
171
  ctx.rerender();
165
172
  requestAnimationFrame(() => {
166
173
  const el = document.querySelector(".new-project-import-log");
@@ -229,7 +229,15 @@ function pathFieldsTpl(ctx: {
229
229
  ${
230
230
  platform.pickDirectory
231
231
  ? html`
232
- <sp-button variant="secondary" ?disabled=${_browsing} @click=${() => void browse()}>
232
+ <sp-button
233
+ variant="secondary"
234
+ ?disabled=${_browsing}
235
+ @click=${() => {
236
+ // `void`, as a STATEMENT: `browse()` is async and nothing here awaits it, so
237
+ // Dropping the marker turns a deliberate discard into a floating promise.
238
+ void browse();
239
+ }}
240
+ >
233
241
  ${_browsing ? "Choosing…" : "Browse…"}
234
242
  </sp-button>
235
243
  `