@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,369 @@
1
+ /// <reference lib="dom" />
2
+ /**
3
+ * The Library's five layouts.
4
+ *
5
+ * All five draw the SAME rows — one scan, one filter — so switching layout is a repaint, never a
6
+ * re-read. What differs is the geometry, and the geometry is data ({@link LAYOUT_METRICS}) rather
7
+ * than five hand-rolled scroll containers: the pane hands each layout a window computed from the
8
+ * metric, so virtualization is a property of the Library rather than of whichever layout someone
9
+ * remembered to virtualize.
10
+ *
11
+ * **Two of them are grouped, and grouped lists are bounded differently.** Table, Cards and Media
12
+ * are flat and uniform, so they window. Calendar and Board are grouped, and a window over a grouped
13
+ * list either breaks the groups or needs variable-height measurement; both draw text only (no live
14
+ * preview, so an item costs a `<div>`), and each caps what it draws and SAYS what it left out. A
15
+ * layout that silently truncated would be the same class of lie as "No files found".
16
+ */
17
+
18
+ import { html, nothing } from "lit-html";
19
+ import { repeat } from "lit-html/directives/repeat.js";
20
+ import { ref } from "lit-html/directives/ref.js";
21
+ import { isImage } from "../files/media-upload";
22
+ import { loopbackAssetSrc } from "../canvas/canvas-origin";
23
+ import { localeLabel } from "@jxsuite/schema/locale";
24
+ import { groupByCategory, groupByDate } from "./library-model";
25
+ import type { LibraryFile, LibraryLayout } from "./library-model";
26
+ import type { GridColumn, GridCellValue } from "../grid/grid-source";
27
+ import type { TemplateResult } from "lit-html";
28
+
29
+ /** The geometry a layout scrolls at. `itemWidth` of 0 means one item per row. */
30
+ export interface LayoutMetric {
31
+ /** Height of one row of items, in CSS pixels — the unit the window counts in. */
32
+ rowHeight: number;
33
+ /** Nominal item width; 0 for a full-width row. */
34
+ itemWidth: number;
35
+ /** Whether the layout windows at all. Grouped layouts cap instead. */
36
+ windowed: boolean;
37
+ }
38
+
39
+ /**
40
+ * Per-layout geometry.
41
+ *
42
+ * These are nominal sizes that must match `styles/`'s Library rules. They are approximate on
43
+ * purpose: the window's job is to keep the rendered count proportional to the viewport, and being
44
+ * one row out costs one row of overscan, not correctness.
45
+ */
46
+ export const LAYOUT_METRICS: Readonly<Record<LibraryLayout, LayoutMetric>> = {
47
+ board: { itemWidth: 0, rowHeight: 0, windowed: false },
48
+ calendar: { itemWidth: 0, rowHeight: 0, windowed: false },
49
+ cards: { itemWidth: 200, rowHeight: 194, windowed: true },
50
+ media: { itemWidth: 132, rowHeight: 132, windowed: true },
51
+ table: { itemWidth: 0, rowHeight: 32, windowed: true },
52
+ };
53
+
54
+ /** Days the Calendar draws before it stops and states the remainder. */
55
+ export const CALENDAR_DAY_LIMIT = 60;
56
+
57
+ /** Items a Board column draws before it stops and states the remainder. */
58
+ export const BOARD_COLUMN_LIMIT = 25;
59
+
60
+ /** Items per row at a given container width, for the layouts that flow. */
61
+ export function columnsAt(layout: LibraryLayout, width: number): number {
62
+ const metric = LAYOUT_METRICS[layout];
63
+ if (metric.itemWidth <= 0 || width <= 0) {
64
+ return 1;
65
+ }
66
+ return Math.max(1, Math.floor(width / metric.itemWidth));
67
+ }
68
+
69
+ // ─── What a layout is handed ─────────────────────────────────────────────────
70
+
71
+ export interface LayoutContext {
72
+ /** The source's columns — the Table layout's headers and cell order come from the GridSource. */
73
+ columns: readonly GridColumn[];
74
+ openFile: (path: string) => void;
75
+ contextMenu: (event: MouseEvent, file: LibraryFile) => void;
76
+ /**
77
+ * Register a card's preview slot for lazy mounting. Called from a lit `ref`, so it receives
78
+ * `undefined` on unmount and must tolerate it.
79
+ */
80
+ mountPreview: (element: Element | undefined, file: LibraryFile) => void;
81
+ }
82
+
83
+ // ─── Cell text ───────────────────────────────────────────────────────────────
84
+
85
+ /** Bytes as a short human string. `null` when the platform did not report a size. */
86
+ export function formatSize(size: number | undefined): string {
87
+ if (size === undefined || !Number.isFinite(size)) {
88
+ return "";
89
+ }
90
+ if (size < 1024) {
91
+ return `${size} B`;
92
+ }
93
+ const units = ["KB", "MB", "GB"];
94
+ let value = size / 1024;
95
+ let unit = 0;
96
+ while (value >= 1024 && unit < units.length - 1) {
97
+ value /= 1024;
98
+ unit += 1;
99
+ }
100
+ return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[unit]}`;
101
+ }
102
+
103
+ /** An ISO timestamp as `YYYY-MM-DD`, or "" when there is none. Never invents "just now". */
104
+ export function formatModified(modified: string | undefined): string {
105
+ if (!modified) {
106
+ return "";
107
+ }
108
+ const parsed = new Date(modified);
109
+ return Number.isNaN(parsed.getTime()) ? "" : parsed.toISOString().slice(0, 10);
110
+ }
111
+
112
+ /** The text one table cell shows for a file. */
113
+ export function cellText(file: LibraryFile, field: string): string {
114
+ switch (field) {
115
+ case "category": {
116
+ return file.category;
117
+ }
118
+ case "locale": {
119
+ // The autonym, not the tag: the column exists so a reader can find their own language in it,
120
+ // And `français` is what that reader scans for. The tag is still the filter's value.
121
+ return file.locale ? localeLabel(file.locale) : "";
122
+ }
123
+ case "modified": {
124
+ return formatModified(file.modified);
125
+ }
126
+ case "name": {
127
+ return file.name;
128
+ }
129
+ case "path": {
130
+ return file.path;
131
+ }
132
+ case "size": {
133
+ return formatSize(file.size);
134
+ }
135
+ case "type": {
136
+ return file.type;
137
+ }
138
+ default: {
139
+ return "";
140
+ }
141
+ }
142
+ }
143
+
144
+ /** Row-shaped access for a caller holding grid cells rather than the typed record. */
145
+ export function cellTextOf(value: GridCellValue): string {
146
+ return value === null || value === undefined ? "" : String(value);
147
+ }
148
+
149
+ // ─── Shared pieces ───────────────────────────────────────────────────────────
150
+
151
+ /** A file's thumbnail: the real image for media, a lazily-mounted live preview for a document. */
152
+ function previewTpl(file: LibraryFile, ctx: LayoutContext): TemplateResult {
153
+ if (isImage(file.ext)) {
154
+ return html`<img
155
+ class="library-thumb"
156
+ loading="lazy"
157
+ src=${loopbackAssetSrc(`/${file.path}`)}
158
+ alt=""
159
+ />`;
160
+ }
161
+ const previewable =
162
+ file.category === "Components" ||
163
+ file.category === "Pages" ||
164
+ file.category === "Layouts" ||
165
+ file.category === "Content";
166
+ if (!previewable) {
167
+ return html`<sp-icon-document size="xl"></sp-icon-document>`;
168
+ }
169
+ return html`<div
170
+ class="library-preview-slot"
171
+ ${ref((element) => ctx.mountPreview(element, file))}
172
+ ></div>`;
173
+ }
174
+
175
+ /** One clickable item, in whichever wrapper the layout wants. */
176
+ function itemAttrs(file: LibraryFile, ctx: LayoutContext) {
177
+ return {
178
+ contextmenu: (event: MouseEvent) => ctx.contextMenu(event, file),
179
+ open: () => ctx.openFile(file.path),
180
+ };
181
+ }
182
+
183
+ // ─── Table ───────────────────────────────────────────────────────────────────
184
+
185
+ /** The Table layout's header, from the source's own columns. */
186
+ export function tableHeadTpl(columns: readonly GridColumn[]): TemplateResult {
187
+ return html`<div class="library-table-head" role="row">
188
+ ${columns.map(
189
+ (column) =>
190
+ html`<div class="library-table-cell" role="columnheader" data-field=${column.field}>
191
+ ${column.title}
192
+ </div>`,
193
+ )}
194
+ </div>`;
195
+ }
196
+
197
+ /** The windowed slice of table rows. */
198
+ export function tableRowsTpl(
199
+ files: readonly LibraryFile[],
200
+ ctx: LayoutContext,
201
+ ): TemplateResult | typeof nothing {
202
+ if (files.length === 0) {
203
+ return nothing;
204
+ }
205
+ return html`${repeat(
206
+ files,
207
+ (file) => file.path,
208
+ (file) => {
209
+ const attrs = itemAttrs(file, ctx);
210
+ return html`<div
211
+ class="library-table-row"
212
+ role="row"
213
+ data-path=${file.path}
214
+ @click=${attrs.open}
215
+ @contextmenu=${attrs.contextmenu}
216
+ >
217
+ ${ctx.columns.map(
218
+ (column) =>
219
+ html`<div class="library-table-cell" role="cell" data-field=${column.field}>
220
+ ${cellText(file, column.field)}
221
+ </div>`,
222
+ )}
223
+ </div>`;
224
+ },
225
+ )}`;
226
+ }
227
+
228
+ // ─── Cards and Media ─────────────────────────────────────────────────────────
229
+
230
+ /** Cards: a preview, a name, and the category beneath it. */
231
+ export function cardsTpl(files: readonly LibraryFile[], ctx: LayoutContext): TemplateResult {
232
+ return html`${repeat(
233
+ files,
234
+ (file) => file.path,
235
+ (file) => {
236
+ const attrs = itemAttrs(file, ctx);
237
+ return html`<div
238
+ class="library-card"
239
+ data-path=${file.path}
240
+ @click=${attrs.open}
241
+ @contextmenu=${attrs.contextmenu}
242
+ >
243
+ <div class="library-card-preview">${previewTpl(file, ctx)}</div>
244
+ <div class="library-card-label" title=${file.path}>${file.name}</div>
245
+ <div class="library-card-meta">${file.type}</div>
246
+ </div>`;
247
+ },
248
+ )}`;
249
+ }
250
+
251
+ /** Media: tighter tiles, image-first, no live document renders at all. */
252
+ export function mediaTpl(files: readonly LibraryFile[], ctx: LayoutContext): TemplateResult {
253
+ return html`${repeat(
254
+ files,
255
+ (file) => file.path,
256
+ (file) => {
257
+ const attrs = itemAttrs(file, ctx);
258
+ return html`<div
259
+ class="library-tile"
260
+ data-path=${file.path}
261
+ title=${file.path}
262
+ @click=${attrs.open}
263
+ @contextmenu=${attrs.contextmenu}
264
+ >
265
+ <div class="library-tile-preview">
266
+ ${
267
+ isImage(file.ext)
268
+ ? html`<img
269
+ class="library-thumb"
270
+ loading="lazy"
271
+ src=${loopbackAssetSrc(`/${file.path}`)}
272
+ alt=""
273
+ />`
274
+ : html`<sp-icon-document size="l"></sp-icon-document>`
275
+ }
276
+ </div>
277
+ <div class="library-tile-label">${file.name}</div>
278
+ </div>`;
279
+ },
280
+ )}`;
281
+ }
282
+
283
+ // ─── Calendar ────────────────────────────────────────────────────────────────
284
+
285
+ /**
286
+ * Calendar: one section per day, newest first, plus an explicit account of what it did not place.
287
+ *
288
+ * A file's day comes from a `YYYY-MM-DD` filename prefix or the filesystem's mtime — never from
289
+ * "now". Files with neither are listed under "No date" rather than parked on today, because a
290
+ * calendar that invents dates is worse than one that admits it cannot place a file.
291
+ */
292
+ export function calendarTpl(files: readonly LibraryFile[], ctx: LayoutContext): TemplateResult {
293
+ const { days, undated } = groupByDate(files);
294
+ const shown = days.slice(0, CALENDAR_DAY_LIMIT);
295
+ const hiddenDays = days.length - shown.length;
296
+ return html`<div class="library-calendar">
297
+ ${shown.map(
298
+ (day) => html`<section class="library-day">
299
+ <h3 class="library-day-date">${day.date}</h3>
300
+ ${listTpl(day.files, ctx)}
301
+ </section>`,
302
+ )}
303
+ ${
304
+ hiddenDays > 0
305
+ ? html`<p class="library-truncated">
306
+ ${hiddenDays} older ${hiddenDays === 1 ? "day is" : "days are"} not shown — filter, or
307
+ switch to Table.
308
+ </p>`
309
+ : nothing
310
+ }
311
+ ${
312
+ undated.length > 0
313
+ ? html`<section class="library-day library-day-undated">
314
+ <h3 class="library-day-date">No date</h3>
315
+ <p class="library-day-note">
316
+ ${undated.length} file${undated.length === 1 ? "" : "s"} with no dated name and no
317
+ modification time.
318
+ </p>
319
+ ${listTpl(undated.slice(0, BOARD_COLUMN_LIMIT), ctx)}
320
+ </section>`
321
+ : nothing
322
+ }
323
+ </div>`;
324
+ }
325
+
326
+ // ─── Board ───────────────────────────────────────────────────────────────────
327
+
328
+ /** Board: one column per category present, each capped and each stating its own total. */
329
+ export function boardTpl(files: readonly LibraryFile[], ctx: LayoutContext): TemplateResult {
330
+ const groups = groupByCategory(files);
331
+ return html`<div class="library-board">
332
+ ${groups.map((group) => {
333
+ const hidden = group.files.length - BOARD_COLUMN_LIMIT;
334
+ return html`<section class="library-board-column">
335
+ <h3 class="library-board-title">
336
+ ${group.group} <span class="library-board-count">${group.files.length}</span>
337
+ </h3>
338
+ ${listTpl(group.files.slice(0, BOARD_COLUMN_LIMIT), ctx)}
339
+ ${
340
+ hidden > 0
341
+ ? html`<p class="library-truncated">${hidden} more — switch to Table to see them.</p>`
342
+ : nothing
343
+ }
344
+ </section>`;
345
+ })}
346
+ </div>`;
347
+ }
348
+
349
+ /** The plain name list both grouped layouts draw. Text only: a group must stay cheap. */
350
+ function listTpl(files: readonly LibraryFile[], ctx: LayoutContext): TemplateResult {
351
+ return html`<ul class="library-list">
352
+ ${repeat(
353
+ files,
354
+ (file) => file.path,
355
+ (file) => {
356
+ const attrs = itemAttrs(file, ctx);
357
+ return html`<li
358
+ class="library-list-item"
359
+ data-path=${file.path}
360
+ title=${file.path}
361
+ @click=${attrs.open}
362
+ @contextmenu=${attrs.contextmenu}
363
+ >
364
+ ${file.name}
365
+ </li>`;
366
+ },
367
+ )}
368
+ </ul>`;
369
+ }