@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
@@ -1,90 +1,235 @@
1
1
  /// <reference lib="dom" />
2
- /** General settings section — favicon, platform adapter, breakpoints, and other site-wide config. */
2
+ /**
3
+ * Overview — the project's identity: name, description, production URL, favicon, global styles.
4
+ *
5
+ * It has lost a field twice for the same reason. Breakpoints were one of **four** places `$media`
6
+ * could be defined (plan §4.2) and this was the only one that named them; they live in Contexts
7
+ * now, beside the colour schemes and feature queries they share a map with. The platform adapter
8
+ * has moved to Deploy in P6.2, because §2 principle 5 says a definition site is a LEVEL, not a
9
+ * field on some other level's form — and "what this site is" and "where it ships" are two levels.
10
+ */
3
11
 
4
12
  import { html, render as litRender, nothing } from "lit-html";
5
- import { projectState } from "../store";
13
+ import { live } from "lit-html/directives/live.js";
14
+ import { errorMessage } from "@jxsuite/schema/parse";
15
+ import { projectState, updateUi } from "../store";
6
16
  import { updateSiteConfig } from "../site-context";
17
+ import { tabOfContainer } from "../canvas/canvas-surface";
7
18
  import { getPlatform } from "../platform";
8
- import { openFileInTab } from "../files/files";
9
19
 
10
- import type { ProjectConfig } from "@jxsuite/schema/types";
20
+ import type { JxHeadEntry, ProjectConfig } from "@jxsuite/schema/types";
21
+
22
+ /** Which control an error belongs under. `"section"` puts it at the top of the section. */
23
+ type ErrorField = "name" | "description" | "url" | "favicon" | "section";
24
+
25
+ interface GeneralError {
26
+ field: ErrorField;
27
+ message: string;
28
+ }
29
+
30
+ /**
31
+ * The last failed write, per rendered section.
32
+ *
33
+ * A `project.json` write can fail — the disk is full, the file is read-only, the desktop RPC is
34
+ * gone — and every other settings editor in the tree drops that rejection on the floor with a bare
35
+ * `void updateSiteConfig(...)`, so the field silently snaps back to its old value. Every write in
36
+ * this section goes through {@link persist} instead, which parks the failure here and re-renders so
37
+ * the user sees it. Keyed by container so two mounted copies (and two tests) never share a
38
+ * message.
39
+ */
40
+ const errors = new WeakMap<HTMLElement, GeneralError>();
41
+
42
+ // ─── Site description ($head meta) ───────────────────────────────────────────
43
+
44
+ /** True for the `<meta name="description">` entry the site description lives in. */
45
+ function isDescriptionMeta(entry: JxHeadEntry): boolean {
46
+ return entry.tagName === "meta" && entry.attributes?.name === "description";
47
+ }
48
+
49
+ /**
50
+ * The site description. It is not a top-level `project.json` key — the composed project schema is
51
+ * closed (`unevaluatedProperties: false`) — so it lives where `@jxsuite/create` writes it and where
52
+ * the browser reads it: the `<meta name="description">` entry of `$head`.
53
+ */
54
+ function readDescription(config: ProjectConfig): string {
55
+ const entry = (config.$head ?? []).find((e) => isDescriptionMeta(e));
56
+ return typeof entry?.attributes?.content === "string" ? entry.attributes.content : "";
57
+ }
58
+
59
+ /** `$head` with the description meta upserted (or dropped, when cleared). */
60
+ function headWithDescription(head: JxHeadEntry[], text: string): JxHeadEntry[] {
61
+ const trimmed = text.trim();
62
+ if (!head.some((e) => isDescriptionMeta(e))) {
63
+ return trimmed
64
+ ? [...head, { attributes: { content: trimmed, name: "description" }, tagName: "meta" }]
65
+ : [...head];
66
+ }
67
+ if (!trimmed) {
68
+ return head.filter((entry) => !isDescriptionMeta(entry));
69
+ }
70
+ return head.map((entry) =>
71
+ isDescriptionMeta(entry)
72
+ ? { ...entry, attributes: { ...entry.attributes, content: trimmed } }
73
+ : entry,
74
+ );
75
+ }
76
+
77
+ /**
78
+ * The patch that _removes_ `url`. `undefined` survives the object spread inside `updateSiteConfig`
79
+ * and `JSON.stringify` then drops the key, so clearing the field clears the setting instead of
80
+ * persisting an empty string the build would have to special-case (`site-build.ts` gates the
81
+ * sitemap on `Boolean(url)` but still forwards `""` into the render context). The cast is the price
82
+ * of `exactOptionalPropertyTypes` — `ProjectConfig["url"]` is `string`, never `string |
83
+ * undefined`.
84
+ */
85
+ const CLEAR_URL = { url: undefined } as unknown as Partial<ProjectConfig>;
86
+
87
+ // ─── Render ──────────────────────────────────────────────────────────────────
11
88
 
12
89
  /** @param {HTMLElement} container */
13
90
  export function renderGeneralSettings(container: HTMLElement) {
14
91
  const config = (projectState?.projectConfig || {}) as ProjectConfig;
92
+ const shown = errors.get(container);
15
93
 
16
- const onFaviconUpload = async () => {
17
- const input = document.createElement("input");
18
- input.type = "file";
19
- input.accept = "image/*,.ico,.svg";
20
- input.addEventListener("change", async () => {
21
- const file = input.files?.[0];
22
- if (!file) {
23
- return;
24
- }
25
- const platform = getPlatform();
26
- await platform.uploadFile("public/favicon.ico", file);
27
- await updateSiteConfig({ favicon: "/favicon.ico" });
28
- renderGeneralSettings(container);
29
- });
30
- input.click();
94
+ /** Persist a patch, surfacing the rejection instead of swallowing it. */
95
+ const persist = async (patch: Partial<ProjectConfig>, field: ErrorField = "section") => {
96
+ try {
97
+ await updateSiteConfig(patch);
98
+ errors.delete(container);
99
+ } catch (error) {
100
+ errors.set(container, {
101
+ field,
102
+ message: `Could not save project.json — ${errorMessage(error)}`,
103
+ });
104
+ }
105
+ renderGeneralSettings(container);
31
106
  };
32
107
 
33
- const onAdapterChange = (e: Event) => {
34
- void updateSiteConfig({
35
- build: { ...config.build, adapter: (e.target as HTMLInputElement).value },
36
- });
108
+ /** Park a validation failure under `field` without writing anything. */
109
+ const reject = (field: ErrorField, message: string) => {
110
+ errors.set(container, { field, message });
111
+ renderGeneralSettings(container);
37
112
  };
38
113
 
39
- const onEditGlobalStyles = async () => {
40
- // Lazy import breaks the general-settings ↔ settings-modal module cycle
41
- const { closeSettingsModal } = await import("./settings-modal");
42
- closeSettingsModal();
43
- void openFileInTab("project.json");
44
- };
114
+ /** The error line for one control, if that is where the current failure belongs. */
115
+ const errorFor = (field: ErrorField) =>
116
+ shown?.field === field
117
+ ? html`<p class="settings-field-error" role="alert">${shown.message}</p>`
118
+ : nothing;
45
119
 
46
- // ─── Breakpoints ($media) ───────────────────────────────────────────────────
120
+ // ─── Site identity ─────────────────────────────────────────────────────────
47
121
 
48
- const media = (config.$media || {}) as Record<string, string>;
49
- const mediaEntries = Object.entries(media);
122
+ const onNameChange = (e: Event) => {
123
+ const name = (e.target as HTMLInputElement).value.trim();
124
+ if (!name) {
125
+ reject("name", "A project name is required.");
126
+ return;
127
+ }
128
+ void persist({ name }, "name");
129
+ };
50
130
 
51
- const onMediaValueChange = (key: string) => (e: Event) => {
52
- const updated = { ...media, [key]: (e.target as HTMLInputElement).value };
53
- void updateSiteConfig({ $media: updated });
131
+ const onDescriptionChange = (e: Event) => {
132
+ const text = (e.target as HTMLInputElement).value;
133
+ void persist({ $head: headWithDescription(config.$head ?? [], text) }, "description");
54
134
  };
55
135
 
56
- const onMediaNameChange = (oldKey: string) => (e: Event) => {
57
- const rawName = (e.target as HTMLInputElement).value.trim();
58
- const newKey = rawName.startsWith("--") ? rawName : `--${rawName}`;
59
- if (newKey === oldKey) {
136
+ const onUrlChange = (e: Event) => {
137
+ const url = (e.target as HTMLInputElement).value.trim();
138
+ if (url && !/^https?:\/\/\S+$/.test(url)) {
139
+ reject("url", "Enter a full address starting with http:// or https://");
60
140
  return;
61
141
  }
62
- const updated = {} as Record<string, string>;
63
- for (const [k, v] of Object.entries(media)) {
64
- updated[k === oldKey ? newKey : k] = v;
65
- }
66
- void updateSiteConfig({ $media: updated });
67
- renderGeneralSettings(container);
142
+ void persist(url ? { url } : CLEAR_URL, "url");
68
143
  };
69
144
 
70
- const onRemoveBreakpoint = (key: string) => () => {
71
- const updated = { ...media };
72
- delete updated[key];
73
- void updateSiteConfig({ $media: updated });
74
- renderGeneralSettings(container);
145
+ // ─── Favicon ───────────────────────────────────────────────────────────────
146
+
147
+ const onFaviconUpload = () => {
148
+ const input = document.createElement("input");
149
+ input.type = "file";
150
+ input.accept = "image/*,.ico,.svg";
151
+ input.addEventListener("change", async () => {
152
+ const file = input.files?.[0];
153
+ if (!file) {
154
+ return;
155
+ }
156
+ try {
157
+ await getPlatform().uploadFile("public/favicon.ico", file);
158
+ } catch (error) {
159
+ reject("favicon", `Could not upload the favicon — ${errorMessage(error)}`);
160
+ return;
161
+ }
162
+ await persist({ favicon: "/favicon.ico" }, "favicon");
163
+ });
164
+ input.click();
75
165
  };
76
166
 
77
- const onAddBreakpoint = () => {
78
- const updated = { ...media, "--new": "(max-width: 480px)" };
79
- void updateSiteConfig({ $media: updated });
80
- renderGeneralSettings(container);
167
+ /*
168
+ * Project Styles is the SAME document in a different editor, so this is a mode switch rather
169
+ * than a navigation. The predecessor closed the settings modal and opened `project.json` in a
170
+ * tab — the configuration IA jumping into the document IA, plan §9.3's own example of the split
171
+ * P6 removes. Nothing closes now, because nothing was covering anything.
172
+ */
173
+ const onEditGlobalStyles = () => {
174
+ // THIS pane's tab. The Project Settings editor is stage content, so a settings document
175
+ // Open in the side pane used to send the PRIMARY into the Stylebook.
176
+ updateUi(tabOfContainer(container), "canvasMode", "stylebook");
81
177
  };
82
178
 
83
179
  const currentFavicon = config.favicon;
84
180
 
85
181
  const tpl = html`
86
182
  <div class="settings-section">
87
- <h3 class="settings-section-title">General</h3>
183
+ <h3 class="settings-section-title">Overview</h3>
184
+ ${errorFor("section")}
185
+
186
+ <div class="settings-field">
187
+ <label class="settings-field-label">Site Name</label>
188
+ <p class="settings-field-desc">
189
+ What this site is called — used in page titles and the project list.
190
+ </p>
191
+ <sp-textfield
192
+ size="s"
193
+ class="settings-site-name"
194
+ placeholder="My Site"
195
+ .value=${live(config.name ?? "")}
196
+ ?invalid=${shown?.field === "name"}
197
+ @change=${onNameChange}
198
+ ></sp-textfield>
199
+ ${errorFor("name")}
200
+ </div>
201
+
202
+ <div class="settings-field">
203
+ <label class="settings-field-label">Description</label>
204
+ <p class="settings-field-desc">
205
+ One or two sentences about the site. Search engines and link previews show this.
206
+ </p>
207
+ <sp-textfield
208
+ multiline
209
+ size="s"
210
+ class="settings-site-description"
211
+ placeholder="A short description of the site"
212
+ .value=${live(readDescription(config))}
213
+ @change=${onDescriptionChange}
214
+ ></sp-textfield>
215
+ ${errorFor("description")}
216
+ </div>
217
+
218
+ <div class="settings-field">
219
+ <label class="settings-field-label">Production URL</label>
220
+ <p class="settings-field-desc">
221
+ Where the published site lives. Sitemaps and absolute links are built from it.
222
+ </p>
223
+ <sp-textfield
224
+ size="s"
225
+ class="settings-site-url"
226
+ placeholder="https://example.com"
227
+ .value=${live(config.url ?? "")}
228
+ ?invalid=${shown?.field === "url"}
229
+ @change=${onUrlChange}
230
+ ></sp-textfield>
231
+ ${errorFor("url")}
232
+ </div>
88
233
 
89
234
  <div class="settings-field">
90
235
  <label class="settings-field-label">Favicon</label>
@@ -112,77 +257,15 @@ export function renderGeneralSettings(container: HTMLElement) {
112
257
  : nothing
113
258
  }
114
259
  </div>
260
+ ${errorFor("favicon")}
115
261
  </div>
116
262
 
117
263
  <div class="settings-field">
118
- <label class="settings-field-label">Platform Adapter</label>
119
- <p class="settings-field-desc">Build adapter for deployment target.</p>
120
- <sp-picker
121
- size="s"
122
- label="Platform Adapter"
123
- .value=${config.build?.adapter || "static"}
124
- @change=${onAdapterChange}
125
- >
126
- <sp-menu-item value="static">Static</sp-menu-item>
127
- <sp-menu-item value="bun">Bun</sp-menu-item>
128
- <sp-menu-item value="node">Node</sp-menu-item>
129
- <sp-menu-item value="cloudflare-workers">Cloudflare Workers</sp-menu-item>
130
- <sp-menu-item value="cloudflare-pages">Cloudflare Pages</sp-menu-item>
131
- </sp-picker>
132
- </div>
133
-
134
- <div class="settings-field">
135
- <label class="settings-field-label">Breakpoints</label>
264
+ <label class="settings-field-label">Global Styles</label>
136
265
  <p class="settings-field-desc">
137
- Responsive breakpoints for canvas panels and media query styles.
266
+ Design tokens and the default element styles that apply across every page. Opens Project
267
+ Styles over this same document.
138
268
  </p>
139
- <div class="settings-media-list">
140
- ${mediaEntries.map(([key, value]) => {
141
- const isBase = key === "--";
142
- return html`
143
- <div class="settings-media-row">
144
- ${
145
- isBase
146
- ? html`<span class="settings-media-name-fixed">Base</span>`
147
- : html`<sp-textfield
148
- size="s"
149
- class="settings-media-name"
150
- .value=${key.replace(/^--/, "")}
151
- placeholder="name"
152
- @change=${onMediaNameChange(key)}
153
- ></sp-textfield>`
154
- }
155
- <sp-textfield
156
- size="s"
157
- class="settings-media-value"
158
- .value=${value}
159
- placeholder=${isBase ? "1280px" : "(max-width: 768px)"}
160
- @change=${onMediaValueChange(key)}
161
- ></sp-textfield>
162
- ${
163
- isBase
164
- ? nothing
165
- : html`<sp-action-button
166
- size="s"
167
- quiet
168
- title="Remove breakpoint"
169
- @click=${onRemoveBreakpoint(key)}
170
- >
171
- ×
172
- </sp-action-button>`
173
- }
174
- </div>
175
- `;
176
- })}
177
- </div>
178
- <sp-action-button size="s" style="margin-top:8px" @click=${onAddBreakpoint}>
179
- + Add Breakpoint
180
- </sp-action-button>
181
- </div>
182
-
183
- <div class="settings-field">
184
- <label class="settings-field-label">Global Styles</label>
185
- <p class="settings-field-desc">Edit default element styles that apply across all pages.</p>
186
269
  <sp-action-button size="s" @click=${onEditGlobalStyles}>
187
270
  Edit Global Styles
188
271
  </sp-action-button>