@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,7 +1,7 @@
1
1
  import {
2
2
  project_schema_default,
3
3
  schema_default
4
- } from "./studio-qkvt37c0.js";
4
+ } from "./studio-tr20m8g8.js";
5
5
  import {
6
6
  __require,
7
7
  __toESM
@@ -72,4 +72,4 @@ async function validateProjectConfig(config) {
72
72
  export { applyProjectSchemas, resetProjectSchemas, validateDoc, validateProjectConfig };
73
73
 
74
74
  //# debugId=65EFF2410CACDD1964756E2164756E21
75
- //# sourceMappingURL=studio-bghqfmea.js.map
75
+ //# sourceMappingURL=studio-wwseqyw0.js.map
@@ -0,0 +1,390 @@
1
+ import {
2
+ getCfToken,
3
+ setCfToken
4
+ } from "./studio-a7pzveq1.js";
5
+ import {
6
+ connectDeploy,
7
+ currentDeploy,
8
+ latestDeployment,
9
+ listAccounts,
10
+ noteDeployment,
11
+ platformSupportsPublish,
12
+ writeDeployConfig
13
+ } from "./studio-myje51t3.js";
14
+ import {
15
+ activeRegistry,
16
+ openModal
17
+ } from "./studio-41exgzhq.js";
18
+ import {
19
+ html
20
+ } from "./studio-5x5774ak.js";
21
+ import {
22
+ projectState
23
+ } from "./studio-cjm7fdjf.js";
24
+ import {
25
+ getPlatform
26
+ } from "./studio-sas7mt3k.js";
27
+
28
+ // src/publish/publish-panel.ts
29
+ var PAGES_APP_INSTALL_URL = "https://github.com/apps/cloudflare-pages/installations/new";
30
+ var _handle = null;
31
+ var _connection = "loading";
32
+ var _accounts = [];
33
+ var _deployment = null;
34
+ var _error = "";
35
+ var _busy = false;
36
+ var _replacing = false;
37
+ var _form = { accountId: "", branch: "main", owner: "", projectName: "", repo: "" };
38
+ function currentConfig() {
39
+ return projectState?.projectConfig ?? null;
40
+ }
41
+ function deriveSlug(name) {
42
+ return name.toLowerCase().replaceAll(/[^a-z0-9]+/g, "-").replaceAll(/^-+|-+$/g, "").slice(0, 58) || "site";
43
+ }
44
+ function prefillRepo() {
45
+ const root = getPlatform().projectRoot;
46
+ const match = /^([\w.-]+)\/([\w.-]+)$/.exec(root);
47
+ return match ? { owner: match[1], repo: match[2] } : { owner: "", repo: "" };
48
+ }
49
+ async function loadConnection() {
50
+ _connection = "loading";
51
+ render();
52
+ try {
53
+ _connection = await getPlatform().cfConnection?.() ?? null;
54
+ if (_connection?.connected) {
55
+ _accounts = await listAccounts();
56
+ _form.accountId = _connection.accountId ?? _accounts[0]?.id ?? "";
57
+ const deploy = currentDeploy();
58
+ if (deploy) {
59
+ _deployment = await latestDeployment(deploy);
60
+ noteDeployment(_deployment);
61
+ }
62
+ }
63
+ } catch (error) {
64
+ _connection = null;
65
+ _error = error instanceof Error ? error.message : String(error);
66
+ }
67
+ render();
68
+ }
69
+ async function saveToken(host) {
70
+ const input = host.querySelector("#cf-token-input");
71
+ const value = (input?.value ?? "").trim();
72
+ if (!value) {
73
+ _error = "Paste a token, or use Preferences › Accounts to forget the stored one.";
74
+ render();
75
+ return;
76
+ }
77
+ setCfToken(value);
78
+ if (input) {
79
+ input.value = "";
80
+ }
81
+ _replacing = false;
82
+ _error = "";
83
+ await loadConnection();
84
+ }
85
+ function openAccounts() {
86
+ activeRegistry()?.run("app.preferences", { section: "accounts" });
87
+ }
88
+ async function hostedConnect() {
89
+ _busy = true;
90
+ render();
91
+ try {
92
+ await getPlatform().cfConnect?.();
93
+ } catch (error) {
94
+ _error = error instanceof Error ? error.message : String(error);
95
+ }
96
+ _busy = false;
97
+ await loadConnection();
98
+ }
99
+ async function submitConnect() {
100
+ const config = currentConfig();
101
+ if (!config) {
102
+ return;
103
+ }
104
+ if (!_form.projectName || !_form.owner || !_form.repo || !_form.accountId) {
105
+ _error = "Account, project name, and the GitHub owner/repo are all required.";
106
+ render();
107
+ return;
108
+ }
109
+ _busy = true;
110
+ _error = "";
111
+ render();
112
+ try {
113
+ const deploy = await connectDeploy(config, {
114
+ accountId: _form.accountId,
115
+ owner: _form.owner,
116
+ productionBranch: _form.branch || "main",
117
+ projectName: _form.projectName,
118
+ repo: _form.repo
119
+ });
120
+ _deployment = await latestDeployment(deploy).catch(() => null);
121
+ } catch (error) {
122
+ _error = error instanceof Error ? error.message : String(error);
123
+ }
124
+ _busy = false;
125
+ render();
126
+ }
127
+ async function disconnect() {
128
+ const config = currentConfig();
129
+ if (!config) {
130
+ return;
131
+ }
132
+ _busy = true;
133
+ render();
134
+ try {
135
+ await writeDeployConfig(config, null);
136
+ _deployment = null;
137
+ } catch (error) {
138
+ _error = error instanceof Error ? error.message : String(error);
139
+ }
140
+ _busy = false;
141
+ render();
142
+ }
143
+ function close() {
144
+ _handle?.close();
145
+ _handle = null;
146
+ }
147
+ function fieldRow(label, input) {
148
+ return html`
149
+ <label class="publish-field">
150
+ <span>${label}</span>
151
+ ${input}
152
+ </label>
153
+ `;
154
+ }
155
+ function credentialTpl() {
156
+ const platform = getPlatform();
157
+ if (platform.cfConnect) {
158
+ return html`
159
+ <p>Connect your Cloudflare account to publish this site.</p>
160
+ <sp-button
161
+ ?disabled=${_busy}
162
+ @click=${() => {
163
+ hostedConnect();
164
+ }}
165
+ >
166
+ Connect Cloudflare
167
+ </sp-button>
168
+ `;
169
+ }
170
+ const stored = getCfToken() !== "";
171
+ if (stored && !_replacing) {
172
+ return html`
173
+ <p>
174
+ A Cloudflare API token is stored on this machine, and Cloudflare did not accept it. It may
175
+ have been revoked, or it may be missing the Account Settings Read and Pages Read/Write
176
+ permissions.
177
+ </p>
178
+ <div class="publish-actions">
179
+ <sp-button
180
+ ?disabled=${_busy}
181
+ @click=${() => {
182
+ _replacing = true;
183
+ _error = "";
184
+ render();
185
+ }}
186
+ >
187
+ Replace token
188
+ </sp-button>
189
+ <sp-button variant="secondary" @click=${openAccounts}>Preferences › Accounts</sp-button>
190
+ </div>
191
+ `;
192
+ }
193
+ return html`
194
+ <p>
195
+ Paste a Cloudflare API token (permissions: Account Settings Read, Pages Read/Write). It is
196
+ stored on this machine and only sent to the same-origin proxy — Studio never renders it back.
197
+ </p>
198
+ ${fieldRow("API token", html`<sp-textfield
199
+ id="cf-token-input"
200
+ type="password"
201
+ value=""
202
+ placeholder="cf_..."
203
+ ></sp-textfield>`)}
204
+ <div class="publish-actions">
205
+ <sp-button
206
+ ?disabled=${_busy}
207
+ @click=${(e) => {
208
+ saveToken(hostOf(e));
209
+ }}
210
+ >
211
+ Verify &amp; Connect
212
+ </sp-button>
213
+ <sp-button variant="secondary" @click=${openAccounts}>Preferences › Accounts</sp-button>
214
+ </div>
215
+ `;
216
+ }
217
+ function hostOf(e) {
218
+ return e.target.closest(".publish-modal") ?? document.body;
219
+ }
220
+ function connectFormTpl() {
221
+ return html`
222
+ <p>
223
+ Create a Cloudflare Pages project connected to this repository. Every commit then builds and
224
+ publishes automatically (<code>bunx jx build</code>).
225
+ </p>
226
+ ${fieldRow("Account", html`
227
+ <sp-picker
228
+ value=${_form.accountId}
229
+ @change=${(e) => {
230
+ _form.accountId = e.target.value;
231
+ }}
232
+ >
233
+ ${_accounts.map((a) => html`<sp-menu-item value=${a.id}>${a.name}</sp-menu-item>`)}
234
+ </sp-picker>
235
+ `)}
236
+ ${fieldRow("Pages project name", html`<sp-textfield
237
+ value=${_form.projectName}
238
+ @input=${(e) => {
239
+ _form.projectName = e.target.value;
240
+ }}
241
+ ></sp-textfield>`)}
242
+ ${fieldRow("GitHub owner", html`<sp-textfield
243
+ value=${_form.owner}
244
+ @input=${(e) => {
245
+ _form.owner = e.target.value;
246
+ }}
247
+ ></sp-textfield>`)}
248
+ ${fieldRow("GitHub repository", html`<sp-textfield
249
+ value=${_form.repo}
250
+ @input=${(e) => {
251
+ _form.repo = e.target.value;
252
+ }}
253
+ ></sp-textfield>`)}
254
+ ${fieldRow("Production branch", html`<sp-textfield
255
+ value=${_form.branch}
256
+ @input=${(e) => {
257
+ _form.branch = e.target.value;
258
+ }}
259
+ ></sp-textfield>`)}
260
+ <sp-button
261
+ ?disabled=${_busy}
262
+ @click=${() => {
263
+ submitConnect();
264
+ }}
265
+ >
266
+ ${_busy ? "Connecting…" : "Create & Connect"}
267
+ </sp-button>
268
+ `;
269
+ }
270
+ function statusTpl(deploy) {
271
+ return html`
272
+ <p>
273
+ Connected to Pages project <strong>${deploy.projectName}</strong>
274
+ ${deploy.productionUrl ? html` —
275
+ <a href=${deploy.productionUrl} target="_blank" rel="noreferrer">
276
+ ${deploy.productionUrl}
277
+ </a>` : ""}
278
+ </p>
279
+ ${_deployment ? html`
280
+ <p>
281
+ Latest deployment: <strong>${_deployment.stage}: ${_deployment.status}</strong>
282
+ (${_deployment.environment}) —
283
+ <a href=${_deployment.url} target="_blank" rel="noreferrer">preview</a>
284
+ </p>
285
+ ` : html`<p>No deployments yet — the first commit after connecting triggers one.</p>`}
286
+ <p class="publish-hint">Publishing happens automatically on every commit.</p>
287
+ <div class="publish-actions">
288
+ <sp-button
289
+ variant="secondary"
290
+ ?disabled=${_busy}
291
+ @click=${() => {
292
+ loadConnection();
293
+ }}
294
+ >
295
+ Refresh
296
+ </sp-button>
297
+ <sp-button
298
+ variant="negative"
299
+ ?disabled=${_busy}
300
+ @click=${() => {
301
+ disconnect();
302
+ }}
303
+ >
304
+ Disconnect
305
+ </sp-button>
306
+ </div>
307
+ `;
308
+ }
309
+ function bodyTpl() {
310
+ if (!platformSupportsPublish()) {
311
+ return html`
312
+ <p>
313
+ This platform cannot reach the Cloudflare API. Publish by committing and pushing — your host
314
+ builds <code>bunx jx build</code> and serves <code>dist/</code>.
315
+ </p>
316
+ `;
317
+ }
318
+ if (_connection === "loading") {
319
+ return html`<p>Checking Cloudflare connection…</p>`;
320
+ }
321
+ if (!_connection?.connected) {
322
+ return credentialTpl();
323
+ }
324
+ const deploy = currentDeploy();
325
+ return deploy ? statusTpl(deploy) : connectFormTpl();
326
+ }
327
+ function errorTpl() {
328
+ if (!_error) {
329
+ return "";
330
+ }
331
+ const needsPagesApp = /github/i.test(_error) && /app|install|source|repo/i.test(_error);
332
+ return html`
333
+ <p class="publish-error">
334
+ ${_error}
335
+ ${needsPagesApp ? html` — if the Cloudflare Pages GitHub App is not installed on the repository,
336
+ <a href=${PAGES_APP_INSTALL_URL} target="_blank" rel="noreferrer">install it</a> and
337
+ retry.` : ""}
338
+ </p>
339
+ `;
340
+ }
341
+ function render() {
342
+ const tpl = html`
343
+ <div class="new-project-modal publish-modal" data-jx-region="overlay.dialog:publish">
344
+ <div class="new-project-modal-header">
345
+ <h2 class="new-project-modal-title">Publish</h2>
346
+ <sp-action-button size="s" quiet @click=${close}>✕</sp-action-button>
347
+ </div>
348
+ <div class="new-project-modal-body">${bodyTpl()} ${errorTpl()}</div>
349
+ </div>
350
+ `;
351
+ if (_handle) {
352
+ _handle.update(tpl);
353
+ } else {
354
+ _handle = openModal(tpl, { label: "Publish", onDismiss: close });
355
+ }
356
+ }
357
+ function seedPublishConnected(options) {
358
+ _connection = { accountId: options.accountId ?? "demo-account", connected: true };
359
+ _accounts = [];
360
+ _deployment = options.deployment;
361
+ noteDeployment(options.deployment);
362
+ _error = "";
363
+ _busy = false;
364
+ _replacing = false;
365
+ render();
366
+ }
367
+ function openPublishPanel() {
368
+ const config = currentConfig();
369
+ const { owner, repo } = prefillRepo();
370
+ _connection = "loading";
371
+ _accounts = [];
372
+ _deployment = null;
373
+ _error = "";
374
+ _busy = false;
375
+ _replacing = false;
376
+ _form = {
377
+ accountId: "",
378
+ branch: "main",
379
+ owner,
380
+ projectName: currentDeploy()?.projectName ?? deriveSlug(config?.name ?? ""),
381
+ repo
382
+ };
383
+ render();
384
+ loadConnection();
385
+ }
386
+
387
+ export { seedPublishConnected, openPublishPanel };
388
+
389
+ //# debugId=32DE20DAF46B08AA64756E2164756E21
390
+ //# sourceMappingURL=studio-x9hmy5kr.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/publish/publish-panel.ts"],
4
+ "sourcesContent": [
5
+ "/// <reference lib=\"dom\" />\n/**\n * Publish panel — the one-click Cloudflare Pages publish flow, driven by the\n * PAL's cf* members. States: unsupported platform → info; no credential →\n * connect (hosted OAuth via cfConnect, or an API-token form backed by\n * cf-settings); connected without `build.deploy` → create-and-connect form;\n * connected → deployment status (publishing rides every commit).\n *\n * **The token was in the DOM, on every open.** `credentialTpl` rendered\n * `value=${getCfToken()}` into an `sp-textfield` whenever a token was stored and\n * the platform had no hosted broker — a control the reader had not asked to\n * edit, on a surface `scripts/screenshots` photographs. `type=\"password\"` masks\n * pixels and nothing else: the value is in the attribute, in the serialized\n * HTML, in the accessibility tree and in every DOM dump. It is gone. A stored\n * token is now reported as *stored*, the field is only ever drawn empty for a\n * REPLACEMENT the reader asked for, and revoking lives where every other\n * credential's does — Preferences › Accounts (`studio.md` §15 rule 1: a surface\n * never prints the secret it describes).\n *\n * @license MIT\n */\n\nimport { html } from \"lit-html\";\nimport type { DeployConfig, ProjectConfig } from \"@jxsuite/schema/types\";\nimport { activeRegistry } from \"../commands/active-registry\";\nimport { currentDeploy, noteDeployment } from \"./deploy-checklist\";\nimport { getPlatform } from \"../platform\";\nimport { getCfToken, setCfToken } from \"../services/cf-settings\";\nimport { projectState } from \"../store\";\nimport type { CfConnection } from \"../types\";\nimport { openModal } from \"../ui/layers\";\nimport type { CfAccount, PagesDeploymentInfo } from \"./pages-service\";\nimport {\n connectDeploy,\n latestDeployment,\n listAccounts,\n platformSupportsPublish,\n writeDeployConfig,\n} from \"./pages-service\";\n\nconst PAGES_APP_INSTALL_URL = \"https://github.com/apps/cloudflare-pages/installations/new\";\n\nlet _handle: ReturnType<typeof openModal> | null = null;\nlet _connection: CfConnection | null | \"loading\" = \"loading\";\nlet _accounts: CfAccount[] = [];\nlet _deployment: PagesDeploymentInfo | null = null;\nlet _error = \"\";\nlet _busy = false;\n/** Whether the reader has asked to replace a token that is already stored. */\nlet _replacing = false;\nlet _form = { accountId: \"\", branch: \"main\", owner: \"\", projectName: \"\", repo: \"\" };\n\nfunction currentConfig(): ProjectConfig | null {\n return (projectState?.projectConfig as ProjectConfig | undefined) ?? null;\n}\n\nfunction deriveSlug(name: string): string {\n return (\n name\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/g, \"-\")\n .replaceAll(/^-+|-+$/g, \"\")\n .slice(0, 58) || \"site\"\n );\n}\n\n/** Prefill owner/repo from cloud roots (\"owner/repo\"); blank elsewhere. */\nfunction prefillRepo(): { owner: string; repo: string } {\n const root = getPlatform().projectRoot;\n const match = /^([\\w.-]+)\\/([\\w.-]+)$/.exec(root);\n return match ? { owner: match[1]!, repo: match[2]! } : { owner: \"\", repo: \"\" };\n}\n\nasync function loadConnection(): Promise<void> {\n _connection = \"loading\";\n render();\n try {\n _connection = (await getPlatform().cfConnection?.()) ?? null;\n if (_connection?.connected) {\n _accounts = await listAccounts();\n _form.accountId = _connection.accountId ?? _accounts[0]?.id ?? \"\";\n const deploy = currentDeploy();\n if (deploy) {\n _deployment = await latestDeployment(deploy);\n // We ASKED, so the deploy checklist may stop saying \"unknown\" — including when the answer\n // Was \"none\", which is a fact and not an absence of one.\n noteDeployment(_deployment);\n }\n }\n } catch (error) {\n _connection = null;\n _error = error instanceof Error ? error.message : String(error);\n }\n render();\n}\n\n/**\n * Take the token straight from the live control to storage.\n *\n * It is read from the DOM and never written back to it, which is the whole asymmetry: a secret may\n * pass through a field the user typed it into, and may not be painted into one they did not.\n */\nasync function saveToken(host: HTMLElement): Promise<void> {\n const input = host.querySelector<HTMLInputElement>(\"#cf-token-input\");\n const value = (input?.value ?? \"\").trim();\n if (!value) {\n _error = \"Paste a token, or use Preferences › Accounts to forget the stored one.\";\n render();\n return;\n }\n setCfToken(value);\n if (input) {\n input.value = \"\";\n }\n _replacing = false;\n _error = \"\";\n await loadConnection();\n}\n\n/** Open Preferences on Accounts — the one place a credential is listed and forgotten. */\nfunction openAccounts(): void {\n void activeRegistry()?.run(\"app.preferences\", { section: \"accounts\" });\n}\n\nasync function hostedConnect(): Promise<void> {\n _busy = true;\n render();\n try {\n await getPlatform().cfConnect?.();\n } catch (error) {\n _error = error instanceof Error ? error.message : String(error);\n }\n _busy = false;\n await loadConnection();\n}\n\nasync function submitConnect(): Promise<void> {\n const config = currentConfig();\n if (!config) {\n return;\n }\n if (!_form.projectName || !_form.owner || !_form.repo || !_form.accountId) {\n _error = \"Account, project name, and the GitHub owner/repo are all required.\";\n render();\n return;\n }\n _busy = true;\n _error = \"\";\n render();\n try {\n const deploy = await connectDeploy(config, {\n accountId: _form.accountId,\n owner: _form.owner,\n productionBranch: _form.branch || \"main\",\n projectName: _form.projectName,\n repo: _form.repo,\n });\n _deployment = await latestDeployment(deploy).catch(() => null);\n } catch (error) {\n _error = error instanceof Error ? error.message : String(error);\n }\n _busy = false;\n render();\n}\n\nasync function disconnect(): Promise<void> {\n const config = currentConfig();\n if (!config) {\n return;\n }\n _busy = true;\n render();\n try {\n await writeDeployConfig(config, null);\n _deployment = null;\n } catch (error) {\n _error = error instanceof Error ? error.message : String(error);\n }\n _busy = false;\n render();\n}\n\nfunction close(): void {\n _handle?.close();\n _handle = null;\n}\n\nfunction fieldRow(label: string, input: unknown) {\n return html`\n <label class=\"publish-field\">\n <span>${label}</span>\n ${input}\n </label>\n `;\n}\n\nfunction credentialTpl() {\n const platform = getPlatform();\n if (platform.cfConnect) {\n return html`\n <p>Connect your Cloudflare account to publish this site.</p>\n <sp-button\n ?disabled=${_busy}\n @click=${() => {\n void hostedConnect();\n }}\n >\n Connect Cloudflare\n </sp-button>\n `;\n }\n const stored = getCfToken() !== \"\";\n if (stored && !_replacing) {\n // The token is STORED, and that is the whole of what this says. It was rejected or has expired\n // — otherwise `_connection.connected` would be true and this branch unreachable — so the two\n // Honest moves are to replace it or to forget it, and neither needs to see it.\n return html`\n <p>\n A Cloudflare API token is stored on this machine, and Cloudflare did not accept it. It may\n have been revoked, or it may be missing the Account Settings Read and Pages Read/Write\n permissions.\n </p>\n <div class=\"publish-actions\">\n <sp-button\n ?disabled=${_busy}\n @click=${() => {\n _replacing = true;\n _error = \"\";\n render();\n }}\n >\n Replace token\n </sp-button>\n <sp-button variant=\"secondary\" @click=${openAccounts}>Preferences › Accounts</sp-button>\n </div>\n `;\n }\n return html`\n <p>\n Paste a Cloudflare API token (permissions: Account Settings Read, Pages Read/Write). It is\n stored on this machine and only sent to the same-origin proxy — Studio never renders it back.\n </p>\n ${fieldRow(\n \"API token\",\n html`<sp-textfield\n id=\"cf-token-input\"\n type=\"password\"\n value=\"\"\n placeholder=\"cf_...\"\n ></sp-textfield>`,\n )}\n <div class=\"publish-actions\">\n <sp-button\n ?disabled=${_busy}\n @click=${(e: Event) => {\n void saveToken(hostOf(e));\n }}\n >\n Verify &amp; Connect\n </sp-button>\n <sp-button variant=\"secondary\" @click=${openAccounts}>Preferences › Accounts</sp-button>\n </div>\n `;\n}\n\nfunction hostOf(e: Event): HTMLElement {\n return (e.target as HTMLElement).closest(\".publish-modal\") ?? document.body;\n}\n\nfunction connectFormTpl() {\n return html`\n <p>\n Create a Cloudflare Pages project connected to this repository. Every commit then builds and\n publishes automatically (<code>bunx jx build</code>).\n </p>\n ${fieldRow(\n \"Account\",\n html`\n <sp-picker\n value=${_form.accountId}\n @change=${(e: Event) => {\n _form.accountId = (e.target as HTMLInputElement).value;\n }}\n >\n ${_accounts.map((a) => html`<sp-menu-item value=${a.id}>${a.name}</sp-menu-item>`)}\n </sp-picker>\n `,\n )}\n ${fieldRow(\n \"Pages project name\",\n html`<sp-textfield\n value=${_form.projectName}\n @input=${(e: Event) => {\n _form.projectName = (e.target as HTMLInputElement).value;\n }}\n ></sp-textfield>`,\n )}\n ${fieldRow(\n \"GitHub owner\",\n html`<sp-textfield\n value=${_form.owner}\n @input=${(e: Event) => {\n _form.owner = (e.target as HTMLInputElement).value;\n }}\n ></sp-textfield>`,\n )}\n ${fieldRow(\n \"GitHub repository\",\n html`<sp-textfield\n value=${_form.repo}\n @input=${(e: Event) => {\n _form.repo = (e.target as HTMLInputElement).value;\n }}\n ></sp-textfield>`,\n )}\n ${fieldRow(\n \"Production branch\",\n html`<sp-textfield\n value=${_form.branch}\n @input=${(e: Event) => {\n _form.branch = (e.target as HTMLInputElement).value;\n }}\n ></sp-textfield>`,\n )}\n <sp-button\n ?disabled=${_busy}\n @click=${() => {\n void submitConnect();\n }}\n >\n ${_busy ? \"Connecting…\" : \"Create & Connect\"}\n </sp-button>\n `;\n}\n\nfunction statusTpl(deploy: DeployConfig) {\n return html`\n <p>\n Connected to Pages project <strong>${deploy.projectName}</strong>\n ${\n deploy.productionUrl\n ? html` —\n <a href=${deploy.productionUrl} target=\"_blank\" rel=\"noreferrer\">\n ${deploy.productionUrl}\n </a>`\n : \"\"\n }\n </p>\n ${\n _deployment\n ? html`\n <p>\n Latest deployment: <strong>${_deployment.stage}: ${_deployment.status}</strong>\n (${_deployment.environment}) —\n <a href=${_deployment.url} target=\"_blank\" rel=\"noreferrer\">preview</a>\n </p>\n `\n : html`<p>No deployments yet — the first commit after connecting triggers one.</p>`\n }\n <p class=\"publish-hint\">Publishing happens automatically on every commit.</p>\n <div class=\"publish-actions\">\n <sp-button\n variant=\"secondary\"\n ?disabled=${_busy}\n @click=${() => {\n void loadConnection();\n }}\n >\n Refresh\n </sp-button>\n <sp-button\n variant=\"negative\"\n ?disabled=${_busy}\n @click=${() => {\n void disconnect();\n }}\n >\n Disconnect\n </sp-button>\n </div>\n `;\n}\n\nfunction bodyTpl() {\n if (!platformSupportsPublish()) {\n return html`\n <p>\n This platform cannot reach the Cloudflare API. Publish by committing and pushing — your host\n builds <code>bunx jx build</code> and serves <code>dist/</code>.\n </p>\n `;\n }\n if (_connection === \"loading\") {\n return html`<p>Checking Cloudflare connection…</p>`;\n }\n if (!_connection?.connected) {\n return credentialTpl();\n }\n const deploy = currentDeploy();\n return deploy ? statusTpl(deploy) : connectFormTpl();\n}\n\nfunction errorTpl() {\n if (!_error) {\n return \"\";\n }\n const needsPagesApp = /github/i.test(_error) && /app|install|source|repo/i.test(_error);\n return html`\n <p class=\"publish-error\">\n ${_error}\n ${\n needsPagesApp\n ? html` — if the Cloudflare Pages GitHub App is not installed on the repository,\n <a href=${PAGES_APP_INSTALL_URL} target=\"_blank\" rel=\"noreferrer\">install it</a> and\n retry.`\n : \"\"\n }\n </p>\n `;\n}\n\nfunction render(): void {\n const tpl = html`\n <div class=\"new-project-modal publish-modal\" data-jx-region=\"overlay.dialog:publish\">\n <div class=\"new-project-modal-header\">\n <h2 class=\"new-project-modal-title\">Publish</h2>\n <sp-action-button size=\"s\" quiet @click=${close}>✕</sp-action-button>\n </div>\n <div class=\"new-project-modal-body\">${bodyTpl()} ${errorTpl()}</div>\n </div>\n `;\n if (_handle) {\n _handle.update(tpl);\n } else {\n _handle = openModal(tpl, { label: \"Publish\", onDismiss: close });\n }\n}\n\n/**\n * Automation-only seam (scripts/screenshots): open the modal directly in its connected state with a\n * canned deployment, bypassing {@link loadConnection} so no Cloudflare request ever fires. The\n * active project's `build.deploy` block still supplies the connected project/URL line.\n */\nexport function seedPublishConnected(options: {\n accountId?: string;\n deployment: PagesDeploymentInfo;\n}): void {\n _connection = { accountId: options.accountId ?? \"demo-account\", connected: true };\n _accounts = [];\n _deployment = options.deployment;\n noteDeployment(options.deployment);\n _error = \"\";\n _busy = false;\n _replacing = false;\n render();\n}\n\n/** Open the publish modal for the active project. */\nexport function openPublishPanel(): void {\n const config = currentConfig();\n const { owner, repo } = prefillRepo();\n _connection = \"loading\";\n _accounts = [];\n _deployment = null;\n _error = \"\";\n _busy = false;\n _replacing = false;\n _form = {\n accountId: \"\",\n branch: \"main\",\n owner,\n projectName: currentDeploy()?.projectName ?? deriveSlug(config?.name ?? \"\"),\n repo,\n };\n render();\n void loadConnection();\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "32DE20DAF46B08AA64756E2164756E21",
9
+ "names": []
10
+ }