@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
@@ -0,0 +1,396 @@
1
+ /**
2
+ * The Library's data model — what a project contains, and how a scan can fail.
3
+ *
4
+ * Two facts the Manage view it replaces could not state:
5
+ *
6
+ * 1. **A scan has failures.** `collectFiles` swallowed every `listDirectory` rejection in an empty
7
+ * catch block, so a project directory the platform could not read simply contributed nothing. A
8
+ * 500 from the dev server and an empty `content/` produced the identical file list and the
9
+ * identical sentence — "No files found" — which is the lie §16 exists to end.
10
+ * {@link scanLibrary} returns {@link LibraryScan.failures} beside the files; the pane raises
11
+ * them as Problems with a Retry and refuses to call an incomplete listing empty.
12
+ * 2. **A category has a directory.** The Manage view filtered by category and uploaded to whatever
13
+ * directory the active filter happened to name, which for "All" was nothing at all — the upload
14
+ * landed wherever `uploadAssets` defaulted. {@link uploadDirForCategory} still answers, but the
15
+ * pane never uploads to an unnamed destination: it asks.
16
+ *
17
+ * Everything here is pure over its inputs (the scan takes the platform as an argument) so the
18
+ * 300-page acceptance case can be measured without a DOM.
19
+ */
20
+
21
+ import { MEDIA_EXTENSIONS, extensionOf } from "../files/media-upload";
22
+ import { projectState } from "../store";
23
+ import { errorMessage } from "@jxsuite/schema/parse";
24
+ import { resolveI18n, servedLocaleOfPath } from "@jxsuite/schema/locale";
25
+ import type { ResolvedI18n } from "@jxsuite/schema/locale";
26
+ import type { ContentSectionEntry, DirEntry, StudioPlatform } from "../types";
27
+
28
+ // ─── Files ───────────────────────────────────────────────────────────────────
29
+
30
+ /** One row of the Library, whichever layout is drawing it. */
31
+ export interface LibraryFile {
32
+ name: string;
33
+ path: string;
34
+ /** The content type name for a content file; the extension otherwise. */
35
+ type: string;
36
+ category: string;
37
+ ext: string;
38
+ /** Bytes, when the platform reported them. */
39
+ size?: number | undefined;
40
+ /** ISO timestamp, when the platform reported one. Drives the Calendar layout. */
41
+ modified?: string | undefined;
42
+ /**
43
+ * The locale this file is **served as**, from `@jxsuite/schema/locale`'s `servedLocaleOfPath` —
44
+ * the canonical tag, never the spelling on disk.
45
+ *
46
+ * The path answers it wherever there is a locale directory. Where there is not, `routing` does:
47
+ * under `prefix-except-default` an unprefixed page IS the default locale's copy, and a facet that
48
+ * could filter to French and Arabic but never to English cannot answer the question it is most
49
+ * often asked. That reading stops at `pages/` — an unlocalized collection expands under every
50
+ * locale's route, so calling its entries the default language would be a claim about content that
51
+ * is in none.
52
+ */
53
+ locale?: string | undefined;
54
+ }
55
+
56
+ /** A directory the scan could not read. Its presence means the listing is INCOMPLETE, not empty. */
57
+ export interface ScanFailure {
58
+ dir: string;
59
+ error: string;
60
+ }
61
+
62
+ /** The result of one pass over the project's directories. */
63
+ export interface LibraryScan {
64
+ files: LibraryFile[];
65
+ failures: ScanFailure[];
66
+ }
67
+
68
+ // ─── Categories ──────────────────────────────────────────────────────────────
69
+
70
+ /** A Library category: what it is called, and the directory an upload into it lands in. */
71
+ export interface LibraryCategory {
72
+ key: string;
73
+ label: string;
74
+ /** Absent for "All" — which is why "All" has no upload destination and must ask for one. */
75
+ dir?: string;
76
+ }
77
+
78
+ export const LIBRARY_CATEGORIES: readonly LibraryCategory[] = [
79
+ { key: "all", label: "All" },
80
+ { dir: "pages", key: "pages", label: "Pages" },
81
+ { dir: "layouts", key: "layouts", label: "Layouts" },
82
+ { dir: "components", key: "components", label: "Components" },
83
+ { dir: "content", key: "content", label: "Content" },
84
+ { dir: "public", key: "media", label: "Media" },
85
+ ];
86
+
87
+ /** The category keys, for a command's `enum` — so `library.setCategory` refuses an unknown one. */
88
+ export const LIBRARY_CATEGORY_KEYS: readonly string[] = LIBRARY_CATEGORIES.map((c) => c.key);
89
+
90
+ /** The category with this key, or undefined. */
91
+ export function libraryCategory(key: string): LibraryCategory | undefined {
92
+ return LIBRARY_CATEGORIES.find((c) => c.key === key);
93
+ }
94
+
95
+ /**
96
+ * The directory a drop on the Library targets while `key` is the active category.
97
+ *
98
+ * `undefined` for "All" and for any category without one, and the caller MUST treat that as "ask",
99
+ * never as "use the default": an upload that lands somewhere the author did not choose is the same
100
+ * class of surprise as a rename that silently rewrites files.
101
+ */
102
+ export function uploadDirForCategory(key: string): string | undefined {
103
+ return libraryCategory(key)?.dir;
104
+ }
105
+
106
+ /** Map a file path to a display category. Media files override by extension. */
107
+ export function categoryFor(dir: string, ext: string): string {
108
+ if (ext && MEDIA_EXTENSIONS.has(ext)) {
109
+ return "Media";
110
+ }
111
+ if (dir.startsWith("pages")) {
112
+ return "Pages";
113
+ }
114
+ if (dir.startsWith("layouts")) {
115
+ return "Layouts";
116
+ }
117
+ if (dir.startsWith("components")) {
118
+ return "Components";
119
+ }
120
+ if (dir.startsWith("content")) {
121
+ return "Content";
122
+ }
123
+ if (dir.startsWith("public")) {
124
+ return "Media";
125
+ }
126
+ if (dir.startsWith("data")) {
127
+ return "Content";
128
+ }
129
+ if (dir.startsWith("styles")) {
130
+ return "Components";
131
+ }
132
+ return "Other";
133
+ }
134
+
135
+ /**
136
+ * The content type a path belongs to, from the project's `content` section — capitalized, or null.
137
+ *
138
+ * @param {string} filePath
139
+ * @returns {string | null}
140
+ */
141
+ export function contentTypeFor(filePath: string): string | null {
142
+ const content = (projectState?.projectConfig?.content ?? {}) as Record<
143
+ string,
144
+ ContentSectionEntry
145
+ >;
146
+ for (const [name, entry] of Object.entries(content)) {
147
+ if (!entry.source) {
148
+ continue;
149
+ }
150
+ const prefix = entry.source.replace(/^\.\//, "").replace(/\/$/, "");
151
+ if (filePath.startsWith(`${prefix}/`) || filePath === prefix) {
152
+ return name.charAt(0).toUpperCase() + name.slice(1);
153
+ }
154
+ }
155
+ return null;
156
+ }
157
+
158
+ // ─── The scan ────────────────────────────────────────────────────────────────
159
+
160
+ /** Directory names never worth walking — a `node_modules` scan is minutes, not milliseconds. */
161
+ const SKIP_DIRS = new Set(["node_modules", ".git", ".jx", "dist", "build", ".cache"]);
162
+
163
+ /**
164
+ * Walk one directory tree, collecting files and recording — never swallowing — what it could not
165
+ * read. A failure at depth is reported against the directory that failed, not the root, so the
166
+ * Problem names the path the author can act on.
167
+ */
168
+ async function walk(
169
+ dir: string,
170
+ platform: Pick<StudioPlatform, "listDirectory">,
171
+ out: LibraryFile[],
172
+ failures: ScanFailure[],
173
+ i18n: ResolvedI18n | null,
174
+ ): Promise<void> {
175
+ let entries: DirEntry[];
176
+ try {
177
+ entries = await platform.listDirectory(dir);
178
+ } catch (error) {
179
+ failures.push({ dir, error: errorMessage(error) });
180
+ return;
181
+ }
182
+ const subdirectories: string[] = [];
183
+ for (const entry of entries) {
184
+ if (entry.type === "directory") {
185
+ if (!SKIP_DIRS.has(entry.name)) {
186
+ subdirectories.push(entry.path);
187
+ }
188
+ continue;
189
+ }
190
+ const ext = extensionOf(entry.name);
191
+ const category = categoryFor(entry.path, ext);
192
+ out.push({
193
+ category,
194
+ ext,
195
+ locale: servedLocaleOfPath(entry.path, i18n) ?? undefined,
196
+ modified: entry.modified,
197
+ name: entry.name,
198
+ path: entry.path,
199
+ size: entry.size,
200
+ type: category === "Content" ? (contentTypeFor(entry.path) ?? ext ?? "file") : ext || "file",
201
+ });
202
+ }
203
+ // Siblings in parallel, depth serialized per branch: the platform counts every call as in-flight,
204
+ // So `probe.idle()` already knows the scan is running without the Library declaring a source.
205
+ await Promise.all(subdirectories.map((sub) => walk(sub, platform, out, failures, i18n)));
206
+ }
207
+
208
+ /**
209
+ * Scan the project's declared directories.
210
+ *
211
+ * Never rejects: a scan that half-worked is a real, useful answer that the caller must be able to
212
+ * render honestly, and an exception would throw the good half away with the bad.
213
+ */
214
+ export async function scanLibrary(
215
+ dirs: readonly string[],
216
+ platform: Pick<StudioPlatform, "listDirectory">,
217
+ ): Promise<LibraryScan> {
218
+ const files: LibraryFile[] = [];
219
+ const failures: ScanFailure[] = [];
220
+ // Resolved ONCE for the whole walk. `resolveI18n` canonicalizes every declared tag through
221
+ // `Intl.Locale`, and a project with 300 pages would otherwise pay for that per file.
222
+ const { i18n } = resolveI18n(projectState?.projectConfig ?? {});
223
+ await Promise.all(dirs.map((dir) => walk(dir, platform, files, failures, i18n)));
224
+ files.sort((a, b) => a.path.localeCompare(b.path));
225
+ return { failures, files };
226
+ }
227
+
228
+ // ─── Filtering ───────────────────────────────────────────────────────────────
229
+
230
+ export interface LibraryFilter {
231
+ category: string;
232
+ query: string;
233
+ /** A canonical tag, or "" for every language. Never a label — the labels are not unique. */
234
+ locale?: string;
235
+ }
236
+
237
+ /**
238
+ * Category, then text over name and path, then language. Returns the input array unchanged when
239
+ * nothing filters.
240
+ */
241
+ export function filterLibrary(
242
+ files: readonly LibraryFile[],
243
+ filter: LibraryFilter,
244
+ ): readonly LibraryFile[] {
245
+ let result = files;
246
+ const category = libraryCategory(filter.category);
247
+ if (category && category.key !== "all") {
248
+ result = result.filter((f) => f.category === category.label);
249
+ }
250
+ const query = filter.query.trim().toLowerCase();
251
+ if (query) {
252
+ result = result.filter(
253
+ (f) => f.name.toLowerCase().includes(query) || f.path.toLowerCase().includes(query),
254
+ );
255
+ }
256
+ const locale = filter.locale?.trim();
257
+ if (locale) {
258
+ result = result.filter((f) => f.locale === locale);
259
+ }
260
+ return result;
261
+ }
262
+
263
+ // ─── Layouts ─────────────────────────────────────────────────────────────────
264
+
265
+ export const LIBRARY_LAYOUTS = ["table", "cards", "media", "calendar", "board"] as const;
266
+
267
+ export type LibraryLayout = (typeof LIBRARY_LAYOUTS)[number];
268
+
269
+ export const LIBRARY_LAYOUT_LABELS: Readonly<Record<LibraryLayout, string>> = {
270
+ board: "Board",
271
+ calendar: "Calendar",
272
+ cards: "Cards",
273
+ media: "Media",
274
+ table: "Table",
275
+ };
276
+
277
+ /** Whether a string names a layout — the guard behind `library.setLayout`'s argument. */
278
+ export function isLibraryLayout(value: string): value is LibraryLayout {
279
+ return (LIBRARY_LAYOUTS as readonly string[]).includes(value);
280
+ }
281
+
282
+ /** Layouts that draw a live preview per item. Table and Board draw text, and stay cheap. */
283
+ export const PREVIEW_LAYOUTS: ReadonlySet<LibraryLayout> = new Set<LibraryLayout>([
284
+ "cards",
285
+ "media",
286
+ ]);
287
+
288
+ // ─── Derived axes (Calendar and Board) ───────────────────────────────────────
289
+
290
+ /** `YYYY-MM-DD` at the head of a filename — the dated-post convention, used when there is no mtime. */
291
+ const DATE_PREFIX = /^(\d{4}-\d{2}-\d{2})/;
292
+
293
+ /**
294
+ * The day a file belongs to, as `YYYY-MM-DD`, or null when nothing states one.
295
+ *
296
+ * The filename prefix wins over the filesystem's mtime: a dated post's date is authored content,
297
+ * and mtime is a fact about the last save. A file with neither is not placed on the calendar at all
298
+ * rather than being parked on today — the Calendar says how many it could not date.
299
+ */
300
+ export function libraryDate(file: LibraryFile): string | null {
301
+ const prefix = DATE_PREFIX.exec(file.name);
302
+ if (prefix) {
303
+ return prefix[1]!;
304
+ }
305
+ if (file.modified) {
306
+ const parsed = new Date(file.modified);
307
+ if (!Number.isNaN(parsed.getTime())) {
308
+ return parsed.toISOString().slice(0, 10);
309
+ }
310
+ }
311
+ return null;
312
+ }
313
+
314
+ /**
315
+ * The locales this project DECLARES, canonical and in declaration order — the value space of the
316
+ * Library's language facet and of `library.setLocale`'s `enum`.
317
+ *
318
+ * Read at call time rather than cached: `projectState` is a plain binding replaced wholesale on a
319
+ * project switch, so a cached list would describe the project before last.
320
+ */
321
+ export function projectLocales(): readonly string[] {
322
+ return resolveI18n(projectState?.projectConfig ?? {}).i18n?.locales ?? [];
323
+ }
324
+
325
+ /**
326
+ * The locales actually PRESENT among these files, in the project's declaration order.
327
+ *
328
+ * Ordered by the project and not by the scan for the reason {@link groupByCategory} orders its
329
+ * columns by {@link LIBRARY_CATEGORIES}: a facet whose options reshuffle when a file is added is a
330
+ * facet nobody can build muscle memory for. Declaration order also puts the default locale first,
331
+ * because {@link resolveI18n} guarantees it is `locales[0]`.
332
+ *
333
+ * Only declared tags can appear — `localeOfPath` matches nothing else — so filtering the
334
+ * declaration through the presence set loses no file.
335
+ */
336
+ export function libraryLocales(files: readonly LibraryFile[]): string[] {
337
+ const present = new Set<string>();
338
+ for (const file of files) {
339
+ if (file.locale) {
340
+ present.add(file.locale);
341
+ }
342
+ }
343
+ return projectLocales().filter((tag) => present.has(tag));
344
+ }
345
+
346
+ /** Calendar buckets, newest day first, plus the files no date could be derived for. */
347
+ export function groupByDate(files: readonly LibraryFile[]): {
348
+ days: { date: string; files: LibraryFile[] }[];
349
+ undated: LibraryFile[];
350
+ } {
351
+ const byDay = new Map<string, LibraryFile[]>();
352
+ const undated: LibraryFile[] = [];
353
+ for (const file of files) {
354
+ const date = libraryDate(file);
355
+ if (date === null) {
356
+ undated.push(file);
357
+ continue;
358
+ }
359
+ const bucket = byDay.get(date);
360
+ if (bucket) {
361
+ bucket.push(file);
362
+ } else {
363
+ byDay.set(date, [file]);
364
+ }
365
+ }
366
+ const days = [...byDay.entries()]
367
+ .map(([date, dayFiles]) => ({ date, files: dayFiles }))
368
+ .toSorted((a, b) => b.date.localeCompare(a.date));
369
+ return { days, undated };
370
+ }
371
+
372
+ /** Board columns — one per category present, in the Library's own category order, then the rest. */
373
+ export function groupByCategory(
374
+ files: readonly LibraryFile[],
375
+ ): { group: string; files: LibraryFile[] }[] {
376
+ const byGroup = new Map<string, LibraryFile[]>();
377
+ for (const file of files) {
378
+ const bucket = byGroup.get(file.category);
379
+ if (bucket) {
380
+ bucket.push(file);
381
+ } else {
382
+ byGroup.set(file.category, [file]);
383
+ }
384
+ }
385
+ const order = LIBRARY_CATEGORIES.map((c) => c.label);
386
+ return [...byGroup.entries()]
387
+ .map(([group, groupFiles]) => ({ files: groupFiles, group }))
388
+ .toSorted((a, b) => {
389
+ const ai = order.indexOf(a.group);
390
+ const bi = order.indexOf(b.group);
391
+ if (ai === bi) {
392
+ return a.group.localeCompare(b.group);
393
+ }
394
+ return (ai === -1 ? order.length : ai) - (bi === -1 ? order.length : bi);
395
+ });
396
+ }