@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
@@ -1,216 +0,0 @@
1
- /// <reference lib="dom" />
2
- /**
3
- * Canvas Diff — computes visual diff between original and current Jx documents.
4
- *
5
- * Compares two document trees recursively, marking nodes as added/removed/modified, and propagates
6
- * "modified" status up the tree for structural changes (children added/removed/reordered).
7
- */
8
-
9
- import type { JxMutableNode } from "@jxsuite/schema/types";
10
-
11
- type DiffStatus = "added" | "removed" | "modified";
12
-
13
- interface DiffResult {
14
- byPath: Map<string, DiffStatus>;
15
- allPaths: Set<string>;
16
- }
17
-
18
- /**
19
- * Deep equality check for two values. Ignores function and ref properties.
20
- *
21
- * @param {unknown} a
22
- * @param {unknown} b
23
- * @returns {boolean}
24
- */
25
- function valuesEqual(a: unknown, b: unknown): boolean {
26
- if (a === b) {
27
- return true;
28
- }
29
- if (typeof a !== "object" || typeof b !== "object" || !a || !b) {
30
- return false;
31
- }
32
- if (Array.isArray(a) !== Array.isArray(b)) {
33
- return false;
34
- }
35
-
36
- if (Array.isArray(a)) {
37
- const bArr = b as unknown[];
38
- if (a.length !== bArr.length) {
39
- return false;
40
- }
41
- return a.every((v: unknown, i: number) => valuesEqual(v, bArr[i]));
42
- }
43
-
44
- const aObj = a as Record<string, unknown>;
45
- const bObj = b as Record<string, unknown>;
46
-
47
- const keysA = Object.keys(aObj).filter((k: string) => !k.startsWith("on") && k !== "$ref");
48
- const keysB = Object.keys(bObj).filter((k: string) => !k.startsWith("on") && k !== "$ref");
49
-
50
- if (keysA.length !== keysB.length) {
51
- return false;
52
- }
53
- if (!keysA.every((k: string) => keysB.includes(k))) {
54
- return false;
55
- }
56
-
57
- return keysA.every((k: string) => valuesEqual(aObj[k], bObj[k]));
58
- }
59
-
60
- /**
61
- * Filter element children from a node's children array.
62
- *
63
- * @param {JxMutableNode | undefined} node
64
- * @returns {JxMutableNode[]}
65
- */
66
- function elementChildren(node: JxMutableNode | undefined) {
67
- if (!node?.children || !Array.isArray(node.children)) {
68
- return [];
69
- }
70
- return node.children.filter(
71
- (c: JxMutableNode | string) => c != null && typeof c === "object",
72
- ) as JxMutableNode[];
73
- }
74
-
75
- /**
76
- * Mark an entire subtree with a diff status.
77
- *
78
- * @param {JxMutableNode} node
79
- * @param {DiffStatus} status
80
- * @param {string} path
81
- * @param {Map<string, DiffStatus>} diffMap
82
- * @param {Set<string>} allPaths
83
- */
84
- function markRecursive(
85
- node: JxMutableNode,
86
- status: DiffStatus,
87
- path: string,
88
- diffMap: Map<string, DiffStatus>,
89
- allPaths: Set<string>,
90
- ) {
91
- allPaths.add(path);
92
- diffMap.set(path, status);
93
- const children = elementChildren(node);
94
- for (let i = 0; i < children.length; i++) {
95
- const childPath = `${path}/children/${i}`;
96
- markRecursive(children[i]!, status, childPath, diffMap, allPaths);
97
- }
98
- }
99
-
100
- /**
101
- * Compute structural diff between original and current documents.
102
- *
103
- * @param {JxMutableNode | undefined} originalDoc - Original document (from git)
104
- * @param {JxMutableNode | undefined} currentDoc - Current document (in memory/on disk)
105
- * @returns {DiffResult}
106
- */
107
- export function computeDocumentDiff(
108
- originalDoc: JxMutableNode | undefined,
109
- currentDoc: JxMutableNode | undefined,
110
- ): DiffResult {
111
- const diffMap = new Map<string, DiffStatus>();
112
- const allPaths = new Set<string>();
113
-
114
- /**
115
- * Walk both trees in parallel and mark differences.
116
- *
117
- * @param {JxMutableNode | undefined} origNode
118
- * @param {JxMutableNode | undefined} currNode
119
- * @param {string} path
120
- */
121
- const walk = (
122
- origNode: JxMutableNode | undefined,
123
- currNode: JxMutableNode | undefined,
124
- path = "",
125
- ) => {
126
- const pathKey = path || "/";
127
- allPaths.add(pathKey);
128
-
129
- // Both exist but differ
130
- if (origNode != null && currNode != null) {
131
- if (!valuesEqual(origNode, currNode)) {
132
- diffMap.set(pathKey, "modified");
133
- }
134
-
135
- // Walk children
136
- if (origNode.children && currNode.children) {
137
- const origChildren = elementChildren(origNode);
138
- const currChildren = elementChildren(currNode);
139
-
140
- for (let i = 0; i < Math.max(origChildren.length, currChildren.length); i++) {
141
- const childPath = pathKey === "/" ? `children/${i}` : `${pathKey}/children/${i}`;
142
- walk(origChildren[i], currChildren[i], childPath);
143
- }
144
- }
145
- return;
146
- }
147
-
148
- // In current only (added)
149
- if (currNode != null && origNode == null) {
150
- diffMap.set(pathKey, "added");
151
- const children = elementChildren(currNode);
152
- for (let i = 0; i < children.length; i++) {
153
- const childPath = pathKey === "/" ? `children/${i}` : `${pathKey}/children/${i}`;
154
- markRecursive(children[i]!, "added", childPath, diffMap, allPaths);
155
- }
156
- return;
157
- }
158
-
159
- // In original only (removed)
160
- if (origNode != null && currNode == null) {
161
- diffMap.set(pathKey, "removed");
162
- const children = elementChildren(origNode);
163
- for (let i = 0; i < children.length; i++) {
164
- const childPath = pathKey === "/" ? `children/${i}` : `${pathKey}/children/${i}`;
165
- markRecursive(children[i]!, "removed", childPath, diffMap, allPaths);
166
- }
167
- }
168
- };
169
-
170
- // Start comparison
171
- walk(originalDoc, currentDoc, "");
172
-
173
- // Propagate "modified" status to parents of added/removed children
174
- const propagateModified = () => {
175
- let changed = false;
176
- for (const [path, status] of diffMap.entries()) {
177
- if ((status === "added" || status === "removed") && path !== "/") {
178
- const parentPath = path.split("/").slice(0, -2).join("/") || "/";
179
- if (parentPath !== "/") {
180
- const parentStatus = diffMap.get(parentPath);
181
- if (
182
- parentStatus !== "modified" &&
183
- parentStatus !== "added" &&
184
- parentStatus !== "removed"
185
- ) {
186
- diffMap.set(parentPath, "modified");
187
- changed = true;
188
- }
189
- }
190
- }
191
- }
192
- return changed;
193
- };
194
-
195
- // Propagate upwards until no more changes
196
- let propagating = true;
197
- while (propagating) {
198
- propagating = propagateModified();
199
- }
200
-
201
- return { allPaths, byPath: diffMap };
202
- }
203
-
204
- /**
205
- * Clear diff highlighting from all elements in a canvas.
206
- *
207
- * @param {HTMLElement} canvas
208
- */
209
- export function clearDiffHighlight(canvas: HTMLElement) {
210
- const marked = canvas.querySelectorAll(
211
- ".element-diff-added, .element-diff-removed, .element-diff-modified",
212
- );
213
- for (const el of marked) {
214
- el.classList.remove("element-diff-added", "element-diff-removed", "element-diff-modified");
215
- }
216
- }
@@ -1,58 +0,0 @@
1
- /**
2
- * Generate scoped CSS from nested style objects (e.g. `table: { width: "100%", thead: { ... } }`).
3
- * Returns a CSS string with rules scoped under the given selector.
4
- *
5
- * @param {import("@jxsuite/schema/types").JxStyle} styleObj - The full style object (flat + nested)
6
- * @param {string} scope - The scoping selector (e.g. `[data-jx-site]`)
7
- * @returns {string} Generated CSS text
8
- */
9
- import type { JxStyle } from "@jxsuite/schema/types";
10
-
11
- export function buildNestedSiteCSS(styleObj: JxStyle, scope: string) {
12
- let css = "";
13
-
14
- function emit(parentSel: string, rules: JxStyle) {
15
- const props = Object.entries(rules)
16
- .filter(([, val]) => val === null || typeof val !== "object" || Array.isArray(val))
17
- .map(([p, val]) => `${camelToKebab(p)}: ${val}`)
18
- .join("; ");
19
- if (props) {
20
- css += `${parentSel} { ${props} }\n`;
21
- }
22
- for (const [sel, sub] of Object.entries(rules)) {
23
- if (sub === null || typeof sub !== "object" || Array.isArray(sub)) {
24
- continue;
25
- }
26
- const resolved = sel.startsWith("&")
27
- ? sel.replace("&", parentSel)
28
- : sel.startsWith("[") || sel.startsWith(":") || sel.startsWith(".")
29
- ? `${parentSel}${sel}`
30
- : `${parentSel} ${sel}`;
31
- emit(resolved, sub);
32
- }
33
- }
34
-
35
- for (const [k, v] of Object.entries(styleObj)) {
36
- if (v === null || typeof v !== "object" || Array.isArray(v)) {
37
- continue;
38
- }
39
- const resolved = k.startsWith("&")
40
- ? k.replace("&", scope)
41
- : k.startsWith("[") || k.startsWith(":") || k.startsWith(".")
42
- ? `${scope}${k}`
43
- : `${scope} ${k}`;
44
- emit(resolved, v);
45
- }
46
-
47
- return css;
48
- }
49
-
50
- /**
51
- * Convert camelCase to kebab-case.
52
- *
53
- * @param {string} s
54
- * @returns {string}
55
- */
56
- function camelToKebab(s: string) {
57
- return s.replaceAll(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);
58
- }
@@ -1,264 +0,0 @@
1
- /**
2
- * The design-quickstart section of the New Project Parameters step: colors, fonts, logo, and
3
- * breakpoints. A trimmed-down, creation-time version of the settings modal — every field is
4
- * optional, and empty fields leave the template/starter defaults untouched (the backend applies
5
- * overrides best-effort against the starters' shared token conventions).
6
- */
7
-
8
- import { html } from "lit-html";
9
- import type { TemplateResult } from "lit-html";
10
-
11
- /** Mirrors @jxsuite/create's DesignOptions (threaded through platform.createProject). */
12
- export interface DesignSelection {
13
- accent?: string;
14
- background?: string;
15
- text?: string;
16
- bodyFont?: string;
17
- headingFont?: string;
18
- media?: Record<string, string>;
19
- logo?: { name: string; base64: string };
20
- }
21
-
22
- interface MediaRow {
23
- name: string;
24
- value: string;
25
- }
26
-
27
- let _accent = "";
28
- let _background = "";
29
- let _text = "";
30
- let _bodyFont = "";
31
- let _headingFont = "";
32
- let _mediaRows: MediaRow[] = [];
33
- let _mediaNote = "";
34
- let _logo: { name: string; base64: string } | null = null;
35
- let _logoError = "";
36
-
37
- // Prefills are display defaults, not overrides: a value identical to its prefill is NOT sent, so
38
- // An untouched form leaves the template/starter exactly as authored (a starter's registry accent
39
- // Need not equal its --color-primary, and re-sending a template's own $media is just noise).
40
- let _prefillAccent = "";
41
- let _prefillMediaJson = "";
42
-
43
- function mediaRowsJson(rows: MediaRow[]): string {
44
- return JSON.stringify(rows.map((r) => [r.name.trim(), r.value.trim()]));
45
- }
46
-
47
- export interface DesignPrefill {
48
- /** Prefilled accent color (a starter's registry accent). */
49
- accent?: string;
50
- /** Prefilled breakpoint rows (a template's $media preset). */
51
- media?: Record<string, string>;
52
- /** Shown under the breakpoints editor when it starts empty (starter sites). */
53
- mediaNote?: string;
54
- }
55
-
56
- /** Reset the section for a fresh modal pass, seeding prefills from the chosen source. */
57
- export function resetDesignFields(prefill: DesignPrefill = {}) {
58
- _accent = prefill.accent ?? "";
59
- _background = "";
60
- _text = "";
61
- _bodyFont = "";
62
- _headingFont = "";
63
- _mediaRows = Object.entries(prefill.media ?? {}).map(([name, value]) => ({ name, value }));
64
- _mediaNote = prefill.mediaNote ?? "";
65
- _logo = null;
66
- _logoError = "";
67
- _prefillAccent = _accent;
68
- _prefillMediaJson = mediaRowsJson(_mediaRows);
69
- }
70
-
71
- /**
72
- * The design overrides to send with createProject, or undefined when everything was left at its
73
- * defaults (the payload then stays byte-identical to a plain create).
74
- */
75
- export function collectDesign(): DesignSelection | undefined {
76
- const media: Record<string, string> = {};
77
- for (const row of _mediaRows) {
78
- if (row.name.trim() && row.value.trim()) {
79
- media[row.name.trim()] = row.value.trim();
80
- }
81
- }
82
- const accentChanged = _accent.trim() && _accent.trim() !== _prefillAccent;
83
- const mediaChanged =
84
- Object.keys(media).length > 0 && mediaRowsJson(_mediaRows) !== _prefillMediaJson;
85
- const design: DesignSelection = {
86
- ...(accentChanged ? { accent: _accent.trim() } : {}),
87
- ...(_background.trim() ? { background: _background.trim() } : {}),
88
- ...(_text.trim() ? { text: _text.trim() } : {}),
89
- ...(_bodyFont.trim() ? { bodyFont: _bodyFont.trim() } : {}),
90
- ...(_headingFont.trim() ? { headingFont: _headingFont.trim() } : {}),
91
- ...(mediaChanged ? { media } : {}),
92
- ...(_logo ? { logo: _logo } : {}),
93
- };
94
- return Object.keys(design).length > 0 ? design : undefined;
95
- }
96
-
97
- /** Base64-encode a small file (logos) without blowing the call stack on spread. */
98
- async function fileToBase64(file: File): Promise<string> {
99
- const bytes = new Uint8Array(await file.arrayBuffer());
100
- let binary = "";
101
- const CHUNK = 32_768;
102
- for (let i = 0; i < bytes.length; i += CHUNK) {
103
- binary += String.fromCodePoint(...bytes.subarray(i, i + CHUNK));
104
- }
105
- return btoa(binary);
106
- }
107
-
108
- function colorRow(
109
- label: string,
110
- value: string,
111
- set: (v: string) => void,
112
- rerender: () => void,
113
- ): TemplateResult {
114
- const onText = (e: Event) => {
115
- set((e.target as HTMLInputElement).value);
116
- rerender();
117
- };
118
- return html`
119
- <div class="new-project-color-row">
120
- <span class="new-project-label">${label}</span>
121
- <div class="css-var-swatch" style="background:${value || "transparent"}">
122
- <input type="color" .value=${value || "#888888"} @input=${onText} />
123
- </div>
124
- <sp-textfield placeholder="Keep default" .value=${value} @input=${onText}></sp-textfield>
125
- </div>
126
- `;
127
- }
128
-
129
- export function renderDesignFields(ctx: { rerender: () => void }): TemplateResult {
130
- const { rerender } = ctx;
131
-
132
- const onLogoChange = async (e: Event) => {
133
- const input = e.target as HTMLInputElement;
134
- const file = input.files?.[0];
135
- if (!file) {
136
- return;
137
- }
138
- if (!/\.(svg|png|jpe?g|webp|gif|ico)$/i.test(file.name)) {
139
- _logoError = "Use an SVG, PNG, JPEG, WebP, GIF, or ICO image";
140
- _logo = null;
141
- rerender();
142
- return;
143
- }
144
- _logoError = "";
145
- _logo = { base64: await fileToBase64(file), name: file.name };
146
- rerender();
147
- };
148
-
149
- const setRow = (index: number, field: "name" | "value") => (e: Event) => {
150
- const row = _mediaRows[index];
151
- if (row) {
152
- row[field] = (e.target as HTMLInputElement).value;
153
- }
154
- };
155
-
156
- return html`
157
- <div class="new-project-design-section">
158
- <div class="new-project-design-heading">Colors</div>
159
- ${colorRow("Accent", _accent, (v) => (_accent = v), rerender)}
160
- ${colorRow("Background", _background, (v) => (_background = v), rerender)}
161
- ${colorRow("Text", _text, (v) => (_text = v), rerender)}
162
- </div>
163
-
164
- <div class="new-project-design-section">
165
- <div class="new-project-design-heading">Fonts</div>
166
- <label class="new-project-field">
167
- <span class="new-project-label">Body Font</span>
168
- <sp-textfield
169
- placeholder="Keep default (e.g. 'Inter', system-ui, sans-serif)"
170
- .value=${_bodyFont}
171
- @input=${(e: Event) => (_bodyFont = (e.target as HTMLInputElement).value)}
172
- style="width: 100%"
173
- ></sp-textfield>
174
- </label>
175
- <label class="new-project-field">
176
- <span class="new-project-label">Heading Font</span>
177
- <sp-textfield
178
- placeholder="Keep default"
179
- .value=${_headingFont}
180
- @input=${(e: Event) => (_headingFont = (e.target as HTMLInputElement).value)}
181
- style="width: 100%"
182
- ></sp-textfield>
183
- </label>
184
- </div>
185
-
186
- <div class="new-project-design-section">
187
- <div class="new-project-design-heading">Logo</div>
188
- <div class="new-project-logo-row">
189
- <input type="file" accept=".svg,.png,.jpg,.jpeg,.webp,.gif,.ico" @change=${onLogoChange} />
190
- ${
191
- _logo
192
- ? html`
193
- <span class="new-project-logo-name">
194
- ${_logo.name} → public/${_logo.name}
195
- <sp-action-button
196
- quiet
197
- size="s"
198
- title="Remove logo"
199
- @click=${() => {
200
- _logo = null;
201
- rerender();
202
- }}
203
- >
204
- ✕
205
- </sp-action-button>
206
- </span>
207
- `
208
- : html`<span class="new-project-tab-intro"
209
- >Copied into the project's public/ folder.</span
210
- >`
211
- }
212
- </div>
213
- ${_logoError ? html`<div class="new-project-error">${_logoError}</div>` : ""}
214
- </div>
215
-
216
- <div class="new-project-design-section">
217
- <div class="new-project-design-heading">Breakpoints</div>
218
- ${
219
- _mediaRows.length === 0 && _mediaNote
220
- ? html`<div class="new-project-tab-intro">${_mediaNote}</div>`
221
- : ""
222
- }
223
- ${_mediaRows.map(
224
- (row, index) => html`
225
- <div class="new-project-media-row">
226
- <sp-textfield
227
- class="new-project-media-name"
228
- placeholder="--md"
229
- .value=${row.name}
230
- @input=${setRow(index, "name")}
231
- ></sp-textfield>
232
- <sp-textfield
233
- class="new-project-media-value"
234
- placeholder="(max-width: 768px)"
235
- .value=${row.value}
236
- @input=${setRow(index, "value")}
237
- ></sp-textfield>
238
- <sp-action-button
239
- quiet
240
- size="s"
241
- title="Remove breakpoint"
242
- @click=${() => {
243
- _mediaRows.splice(index, 1);
244
- rerender();
245
- }}
246
- >
247
- ✕
248
- </sp-action-button>
249
- </div>
250
- `,
251
- )}
252
- <sp-button
253
- variant="secondary"
254
- size="s"
255
- @click=${() => {
256
- _mediaRows.push({ name: "", value: "" });
257
- rerender();
258
- }}
259
- >
260
- Add Breakpoint
261
- </sp-button>
262
- </div>
263
- `;
264
- }
@@ -1,61 +0,0 @@
1
- /**
2
- * The built-in project templates shown on the New Project modal's Template tab. The ids are the
3
- * contract with `@jxsuite/create/templates` (createProject validates them server-side); the copy
4
- * here is presentation only. Hardcoded rather than imported: `@jxsuite/create` is a Node CLI
5
- * package and Studio runs in the browser.
6
- */
7
-
8
- export interface TemplateInfo {
9
- id: string;
10
- name: string;
11
- tagline: string;
12
- /** Glyph shown in the card's preview area. */
13
- glyph: string;
14
- /** The template's default $media map (mirrors @jxsuite/create's mediaForTemplate). */
15
- media: Record<string, string>;
16
- }
17
-
18
- const DESKTOP_FIRST_MEDIA = {
19
- "--": "1280px",
20
- "--lg": "(max-width: 1024px)",
21
- "--md": "(max-width: 768px)",
22
- "--sm": "(max-width: 640px)",
23
- };
24
-
25
- const MOBILE_FIRST_MEDIA = {
26
- "--": "375px",
27
- "--sm": "(min-width: 640px)",
28
- "--md": "(min-width: 768px)",
29
- "--lg": "(min-width: 1024px)",
30
- };
31
-
32
- export const PROJECT_TEMPLATES: readonly TemplateInfo[] = [
33
- {
34
- glyph: "+",
35
- id: "blank",
36
- media: DESKTOP_FIRST_MEDIA,
37
- name: "Blank",
38
- tagline: "Start from scratch",
39
- },
40
- {
41
- glyph: "🖥",
42
- id: "desktop-first",
43
- media: DESKTOP_FIRST_MEDIA,
44
- name: "Desktop First",
45
- tagline: "Max-width breakpoints",
46
- },
47
- {
48
- glyph: "📱",
49
- id: "mobile-first",
50
- media: MOBILE_FIRST_MEDIA,
51
- name: "Mobile First",
52
- tagline: "Min-width breakpoints",
53
- },
54
- {
55
- glyph: "📲",
56
- id: "mobile-app",
57
- media: MOBILE_FIRST_MEDIA,
58
- name: "Mobile App",
59
- tagline: "App shell with bottom navigation",
60
- },
61
- ];