@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,853 +0,0 @@
1
- import {
2
- repeat
3
- } from "./studio-xq0t7n5t.js";
4
- import {
5
- live
6
- } from "./studio-nqw433kv.js";
7
- import {
8
- pullWithPackageSync
9
- } from "./studio-568nx4t5.js";
10
- import {
11
- errorMessage,
12
- showConfirmDialog,
13
- showDialog,
14
- showPromptDialog,
15
- statusMessage,
16
- view
17
- } from "./studio-asvf0j9e.js";
18
- import {
19
- activeTab,
20
- flushAllCollab,
21
- projectState,
22
- renderOnly,
23
- updateUi
24
- } from "./studio-rq0vxb19.js";
25
- import {
26
- ref
27
- } from "./studio-4k0m4fmp.js";
28
- import {
29
- html,
30
- nothing
31
- } from "./studio-5x5774ak.js";
32
- import {
33
- formatForPath
34
- } from "./studio-97qcgvdn.js";
35
- import {
36
- getPlatform
37
- } from "./studio-9smfzqhc.js";
38
- import {
39
- __require
40
- } from "./studio-md4gps17.js";
41
-
42
- // src/github/github-auth.ts
43
- var CLIENT_ID = "Ov23liYVlMFpgjOEPXJH";
44
- var STORAGE_KEY = "jx_github_token";
45
- function getGithubToken() {
46
- return localStorage.getItem(STORAGE_KEY);
47
- }
48
- async function authenticateGithub() {
49
- const existing = getGithubToken();
50
- if (existing) {
51
- return existing;
52
- }
53
- const codeRes = await fetch("https://github.com/login/device/code", {
54
- body: JSON.stringify({ client_id: CLIENT_ID, scope: "repo" }),
55
- headers: {
56
- Accept: "application/json",
57
- "Content-Type": "application/json"
58
- },
59
- method: "POST"
60
- });
61
- if (!codeRes.ok) {
62
- throw new Error("Failed to initiate GitHub device flow");
63
- }
64
- const codeData = await codeRes.json();
65
- const { device_code, user_code, verification_uri, interval = 5 } = codeData;
66
- return showDialog((done) => {
67
- let cancelled = false;
68
- let pollTimer = null;
69
- const poll = async () => {
70
- if (cancelled) {
71
- return;
72
- }
73
- try {
74
- const tokenRes = await fetch("https://github.com/login/oauth/access_token", {
75
- body: JSON.stringify({
76
- client_id: CLIENT_ID,
77
- device_code,
78
- grant_type: "urn:ietf:params:oauth:grant-type:device_code"
79
- }),
80
- headers: {
81
- Accept: "application/json",
82
- "Content-Type": "application/json"
83
- },
84
- method: "POST"
85
- });
86
- const tokenData = await tokenRes.json();
87
- if (tokenData.access_token) {
88
- localStorage.setItem(STORAGE_KEY, tokenData.access_token);
89
- done(tokenData.access_token);
90
- return;
91
- }
92
- if (tokenData.error === "authorization_pending") {
93
- pollTimer = setTimeout(poll, interval * 1000);
94
- return;
95
- }
96
- if (tokenData.error === "slow_down") {
97
- pollTimer = setTimeout(poll, (interval + 5) * 1000);
98
- return;
99
- }
100
- done(null);
101
- } catch {
102
- pollTimer = setTimeout(poll, interval * 1000);
103
- }
104
- };
105
- pollTimer = setTimeout(poll, interval * 1000);
106
- return html`
107
- <sp-dialog-wrapper
108
- open
109
- headline="Sign in to GitHub"
110
- cancel-label="Cancel"
111
- @cancel=${() => {
112
- cancelled = true;
113
- if (pollTimer) {
114
- clearTimeout(pollTimer);
115
- }
116
- done(null);
117
- }}
118
- @close=${() => {
119
- cancelled = true;
120
- if (pollTimer) {
121
- clearTimeout(pollTimer);
122
- }
123
- done(null);
124
- }}
125
- >
126
- <div class="github-auth-dialog">
127
- <p>Enter this code on GitHub to authorize Jx Studio:</p>
128
- <div class="github-auth-code">${user_code}</div>
129
- <p>
130
- <a href="${verification_uri}" target="_blank" rel="noopener"
131
- >Open ${verification_uri}</a
132
- >
133
- </p>
134
- <p class="github-auth-waiting">Waiting for authorization…</p>
135
- </div>
136
- </sp-dialog-wrapper>
137
- `;
138
- });
139
- }
140
-
141
- // src/github/github-publish.ts
142
- async function publishToGithub({ projectName }) {
143
- const token = await authenticateGithub();
144
- if (!token) {
145
- return false;
146
- }
147
- const repoOpts = await showDialog((done) => {
148
- let _nameInput = null;
149
- let _descInput = null;
150
- let _privateToggle = null;
151
- return html`
152
- <sp-dialog-wrapper
153
- open
154
- headline="Publish to GitHub"
155
- confirm-label="Create Repository"
156
- cancel-label="Cancel"
157
- @confirm=${() => {
158
- done({
159
- description: _descInput?.value || "",
160
- isPrivate: _privateToggle?.checked ?? true,
161
- name: _nameInput?.value || projectName
162
- });
163
- }}
164
- @cancel=${() => done(null)}
165
- @close=${() => done(null)}
166
- >
167
- <div class="github-publish-dialog">
168
- <sp-field-label for="repo-name">Repository name</sp-field-label>
169
- <sp-textfield
170
- id="repo-name"
171
- name="repo-name"
172
- value="${projectName}"
173
- placeholder="my-project"
174
- ${ref((el) => {
175
- _nameInput = el || null;
176
- })}
177
- ></sp-textfield>
178
-
179
- <sp-field-label for="repo-desc">Description (optional)</sp-field-label>
180
- <sp-textfield
181
- id="repo-desc"
182
- name="repo-desc"
183
- placeholder="A brief description"
184
- ${ref((el) => {
185
- _descInput = el || null;
186
- })}
187
- ></sp-textfield>
188
-
189
- <sp-field-label>Visibility</sp-field-label>
190
- <sp-switch
191
- name="repo-private"
192
- checked
193
- ${ref((el) => {
194
- _privateToggle = el || null;
195
- })}
196
- >Private repository</sp-switch
197
- >
198
- </div>
199
- </sp-dialog-wrapper>
200
- `;
201
- });
202
- if (!repoOpts) {
203
- return false;
204
- }
205
- statusMessage("Creating GitHub repository…");
206
- const createRes = await fetch("https://api.github.com/user/repos", {
207
- body: JSON.stringify({
208
- auto_init: false,
209
- description: repoOpts.description,
210
- name: repoOpts.name,
211
- private: repoOpts.isPrivate
212
- }),
213
- headers: {
214
- Accept: "application/vnd.github+json",
215
- Authorization: `Bearer ${token}`,
216
- "Content-Type": "application/json"
217
- },
218
- method: "POST"
219
- });
220
- if (!createRes.ok) {
221
- const err = await createRes.json();
222
- const msg = err.errors?.[0]?.message || err.message || "Failed to create repository";
223
- statusMessage(`Error: ${msg}`);
224
- return false;
225
- }
226
- const repo = await createRes.json();
227
- const platform = getPlatform();
228
- statusMessage("Setting remote and pushing…");
229
- await platform.gitAddRemote("origin", repo.clone_url);
230
- statusMessage("Pushing to GitHub…");
231
- try {
232
- await platform.gitPush({ setUpstream: true });
233
- } catch (error) {
234
- statusMessage(`Push failed: ${errorMessage(error)}`);
235
- return false;
236
- }
237
- const { refreshGitStatus } = await import("./git-panel-mbb0y0hz.js");
238
- await refreshGitStatus();
239
- statusMessage(`Published to GitHub: ${repo.html_url}`);
240
- return true;
241
- }
242
-
243
- // src/panels/git-panel.ts
244
- async function refreshGitStatus() {
245
- if (!projectState) {
246
- return;
247
- }
248
- const plat = getPlatform();
249
- updateUi("gitLoading", true);
250
- updateUi("gitError", null);
251
- try {
252
- const [status, branches] = await Promise.allSettled([plat.gitStatus(), plat.gitBranches()]);
253
- if (status.status === "fulfilled") {
254
- updateUi("gitStatus", status.value);
255
- }
256
- if (branches.status === "fulfilled") {
257
- updateUi("gitBranches", branches.value);
258
- }
259
- const failure = status.status === "rejected" ? status.reason : branches.status === "rejected" && status.value?.isRepo ? branches.reason : null;
260
- if (failure) {
261
- updateUi("gitError", errorMessage(failure));
262
- }
263
- _lastUpdated = new Date;
264
- } catch (error) {
265
- updateUi("gitError", errorMessage(error));
266
- } finally {
267
- updateUi("gitLoading", false);
268
- renderOnly("leftPanel");
269
- }
270
- }
271
- async function cloneRepository(ctx) {
272
- const platform = getPlatform();
273
- if (!platform.gitClone) {
274
- statusMessage("Clone not supported on this platform");
275
- return;
276
- }
277
- const url = await showPromptDialog("Clone Git Repository", {
278
- confirmLabel: "Clone",
279
- message: "Repository URL",
280
- placeholder: "https://github.com/user/repo.git",
281
- validate: (v) => v.trim() ? "" : "Enter a repository URL."
282
- });
283
- if (!url) {
284
- return;
285
- }
286
- try {
287
- statusMessage("Cloning repository...");
288
- const result = await platform.gitClone(url);
289
- if (result?.root) {
290
- statusMessage("Clone complete");
291
- await ctx.openRecentProject(result.root);
292
- }
293
- } catch (error) {
294
- statusMessage(`Clone failed: ${errorMessage(error)}`);
295
- }
296
- }
297
- function platformSupportsClone() {
298
- return Boolean(getPlatform().gitClone);
299
- }
300
- async function gitAction(action, body) {
301
- const plat = getPlatform();
302
- updateUi("gitLoading", true);
303
- updateUi("gitError", null);
304
- try {
305
- await plat[action](body);
306
- await refreshGitStatus();
307
- } catch (error) {
308
- updateUi("gitError", errorMessage(error));
309
- updateUi("gitLoading", false);
310
- renderOnly("leftPanel");
311
- }
312
- }
313
- async function doPull() {
314
- updateUi("gitLoading", true);
315
- updateUi("gitError", null);
316
- try {
317
- await pullWithPackageSync();
318
- await refreshGitStatus();
319
- } catch (error) {
320
- updateUi("gitError", errorMessage(error));
321
- updateUi("gitLoading", false);
322
- renderOnly("leftPanel");
323
- }
324
- }
325
- var _pollTimer = null;
326
- var _lastUpdated = null;
327
- var _gitSubTab = "changes";
328
- async function fetchGitLog() {
329
- const plat = getPlatform();
330
- try {
331
- const entries = await plat.gitLog(30);
332
- updateUi("gitLogEntries", entries);
333
- renderOnly("leftPanel");
334
- } catch (error) {
335
- updateUi("gitError", errorMessage(error));
336
- renderOnly("leftPanel");
337
- }
338
- }
339
- function renderGitPanel(S, ctx) {
340
- if (!projectState) {
341
- return html`<div class="git-panel git-panel-empty">
342
- <div class="git-empty-state">
343
- <p>Open a project to use source control.</p>
344
- ${platformSupportsClone() ? html`<sp-action-button size="m" @click=${() => ctx.cloneRepository?.()}>
345
- <sp-icon-download slot="icon"></sp-icon-download>
346
- Clone Git Repository
347
- </sp-action-button>` : nothing}
348
- </div>
349
- </div>`;
350
- }
351
- const status = S.ui.gitStatus;
352
- const branches = S.ui.gitBranches;
353
- const loading = S.ui.gitLoading;
354
- if (!status && !loading && !S.ui.gitError) {
355
- refreshGitStatus();
356
- return html`<div class="git-panel">
357
- <div class="git-loading">Loading...</div>
358
- </div>`;
359
- }
360
- if (status && !status.isRepo) {
361
- return html`<div class="git-panel git-panel-empty">
362
- <div class="git-empty-state">
363
- <p>This project is not yet a git repository.</p>
364
- <sp-action-button
365
- size="m"
366
- @click=${async () => {
367
- statusMessage("Initializing repository…");
368
- await getPlatform().gitInit();
369
- statusMessage("Repository initialized");
370
- await refreshGitStatus();
371
- }}
372
- ?disabled=${loading}
373
- >
374
- <sp-icon-add slot="icon"></sp-icon-add>
375
- Initialize Repository
376
- </sp-action-button>
377
- <sp-action-button
378
- size="m"
379
- @click=${() => publishToGithub({
380
- projectName: projectState?.name || "my-project"
381
- })}
382
- ?disabled=${loading}
383
- >
384
- <sp-icon-share slot="icon"></sp-icon-share>
385
- Publish to GitHub
386
- </sp-action-button>
387
- </div>
388
- </div>`;
389
- }
390
- if (!_pollTimer) {
391
- _pollTimer = setInterval(() => {
392
- if (view.leftTab === "git" && !S.ui.gitLoading) {
393
- refreshGitStatus();
394
- }
395
- }, 30000);
396
- }
397
- const stagedFiles = status?.files?.filter((f) => f.staged) || [];
398
- const unstagedFiles = status?.files?.filter((f) => !f.staged) || [];
399
- const totalChanges = status?.files?.length || 0;
400
- const doCommit = async () => {
401
- const tab = activeTab.value;
402
- const msg = tab?.session.ui.gitCommitMessage?.trim();
403
- if (!msg) {
404
- return;
405
- }
406
- updateUi("gitCommitMessage", "");
407
- await flushAllCollab();
408
- await gitAction("gitCommit", msg);
409
- };
410
- const doCommitAndSync = async () => {
411
- const tab = activeTab.value;
412
- const msg = tab?.session.ui.gitCommitMessage?.trim();
413
- if (!msg) {
414
- return;
415
- }
416
- updateUi("gitCommitMessage", "");
417
- updateUi("gitLoading", true);
418
- updateUi("gitError", null);
419
- await flushAllCollab();
420
- const plat = getPlatform();
421
- try {
422
- await plat.gitCommit(msg);
423
- await plat.gitPush();
424
- await refreshGitStatus();
425
- } catch (error) {
426
- updateUi("gitError", errorMessage(error));
427
- updateUi("gitLoading", false);
428
- renderOnly("leftPanel");
429
- }
430
- };
431
- const isUpToDate = !status?.ahead && !status?.behind;
432
- const syncLabel = isUpToDate ? "Up to date" : `${status?.ahead ? `${status.ahead} ahead` : ""}${status?.ahead && status?.behind ? ", " : ""}${status?.behind ? `${status.behind} behind` : ""}`;
433
- const lastUpdatedStr = _lastUpdated ? _lastUpdated.toLocaleTimeString([], {
434
- hour: "2-digit",
435
- minute: "2-digit"
436
- }) : "";
437
- const hasRemotes = (status?.remotes?.length ?? 0) > 0;
438
- const syncBarT = hasRemotes ? html`
439
- <div class="git-sync-bar">
440
- <sp-action-button
441
- size="s"
442
- quiet
443
- class="git-sync-icon"
444
- title="Refresh"
445
- @click=${() => refreshGitStatus()}
446
- ?disabled=${loading}
447
- >
448
- <sp-icon-refresh slot="icon"></sp-icon-refresh>
449
- </sp-action-button>
450
- <div class="git-sync-text">
451
- <span class="git-sync-label">${syncLabel}</span>
452
- ${lastUpdatedStr ? html`<span class="git-sync-time">Last updated ${lastUpdatedStr}</span>` : nothing}
453
- </div>
454
- <sp-action-group size="xs" quiet class="git-sync-actions">
455
- <sp-action-button
456
- title="Fetch"
457
- @click=${() => gitAction("gitFetch")}
458
- ?disabled=${loading}
459
- >
460
- <sp-icon-download slot="icon" size="xs"></sp-icon-download>
461
- </sp-action-button>
462
- <sp-action-button
463
- title="Pull${status?.behind ? ` (${status.behind} behind)` : ""}"
464
- @click=${() => void doPull()}
465
- ?disabled=${loading}
466
- >
467
- <sp-icon-arrow-down slot="icon" size="xs"></sp-icon-arrow-down>
468
- </sp-action-button>
469
- <sp-action-button
470
- title="Push${status?.ahead ? ` (${status.ahead} ahead)` : ""}"
471
- @click=${() => gitAction("gitPush")}
472
- ?disabled=${loading}
473
- >
474
- <sp-icon-arrow-up slot="icon" size="xs"></sp-icon-arrow-up>
475
- </sp-action-button>
476
- </sp-action-group>
477
- </div>
478
- ` : html`
479
- <div class="git-sync-bar git-sync-bar--no-remote">
480
- <sp-action-button
481
- size="s"
482
- quiet
483
- class="git-sync-icon"
484
- title="Refresh"
485
- @click=${() => refreshGitStatus()}
486
- ?disabled=${loading}
487
- >
488
- <sp-icon-refresh slot="icon"></sp-icon-refresh>
489
- </sp-action-button>
490
- <div class="git-sync-text">
491
- <span class="git-sync-label">Local only (no remote)</span>
492
- </div>
493
- <sp-action-button
494
- size="s"
495
- @click=${() => publishToGithub({
496
- projectName: projectState?.name || "my-project"
497
- })}
498
- ?disabled=${loading}
499
- >
500
- <sp-icon-share slot="icon"></sp-icon-share>
501
- Publish to GitHub
502
- </sp-action-button>
503
- </div>
504
- `;
505
- const branchSelectorT = html`
506
- <div class="git-branch-row">
507
- <svg
508
- class="git-branch-icon"
509
- xmlns="http://www.w3.org/2000/svg"
510
- width="18"
511
- height="18"
512
- viewBox="0 0 24 24"
513
- fill="none"
514
- stroke="currentColor"
515
- stroke-width="2"
516
- stroke-linecap="round"
517
- stroke-linejoin="round"
518
- >
519
- <line x1="6" y1="3" x2="6" y2="15"></line>
520
- <circle cx="18" cy="6" r="3"></circle>
521
- <circle cx="6" cy="18" r="3"></circle>
522
- <path d="M18 9a9 9 0 0 1-9 9"></path>
523
- </svg>
524
- <div class="git-branch-text">
525
- <span class="git-branch-label">Active branch</span>
526
- <span class="git-branch-name">${branches?.current || status?.branch || "—"}</span>
527
- </div>
528
- <sp-picker
529
- size="s"
530
- quiet
531
- class="git-branch-picker"
532
- .value=${live(branches?.current || "")}
533
- @change=${async (e) => {
534
- const val = e.target.value;
535
- if (val === "__new__") {
536
- e.target.value = branches?.current || "";
537
- const name = await showPromptDialog("New Branch", {
538
- confirmLabel: "Create",
539
- message: `Branching from ${branches?.current || status?.branch || "the current branch"}.`,
540
- placeholder: "feature/my-change",
541
- validate: (v) => v.trim() ? "" : "Enter a branch name."
542
- });
543
- if (name) {
544
- await gitAction("gitCreateBranch", name);
545
- }
546
- return;
547
- }
548
- if (val !== branches?.current) {
549
- await gitAction("gitCheckout", val);
550
- }
551
- }}
552
- >
553
- ${(branches?.branches || []).map((b) => html`<sp-menu-item value=${b}>${b}</sp-menu-item>`)}
554
- <sp-menu-divider></sp-menu-divider>
555
- <sp-menu-item value="__new__">+ New branch...</sp-menu-item>
556
- </sp-picker>
557
- </div>
558
- `;
559
- const switchTab = (tab) => {
560
- _gitSubTab = tab;
561
- if (tab === "history" && !S.ui.gitLogEntries) {
562
- fetchGitLog();
563
- }
564
- renderOnly("leftPanel");
565
- };
566
- const tabsT = html`
567
- <div class="git-tabs">
568
- <button
569
- class="git-tab ${_gitSubTab === "changes" ? "active" : ""}"
570
- @click=${() => switchTab("changes")}
571
- >
572
- Local Changes${totalChanges > 0 ? ` (${totalChanges})` : ""}
573
- </button>
574
- <button
575
- class="git-tab ${_gitSubTab === "history" ? "active" : ""}"
576
- @click=${() => switchTab("history")}
577
- >
578
- History
579
- </button>
580
- </div>
581
- `;
582
- const commitT = html`
583
- <div class="git-commit-area">
584
- <label class="git-commit-label">Please write a commit message</label>
585
- <sp-textfield
586
- size="s"
587
- multiline
588
- class="git-commit-input"
589
- placeholder="Describe your changes"
590
- .value=${live(S.ui.gitCommitMessage || "")}
591
- @input=${(e) => updateUi("gitCommitMessage", e.target.value)}
592
- @keydown=${(e) => {
593
- if ((e.ctrlKey || e.metaKey) && e.key === "Enter") {
594
- e.preventDefault();
595
- doCommit();
596
- }
597
- }}
598
- ></sp-textfield>
599
- <div class="git-commit-actions">
600
- <div class="git-split-btn">
601
- <sp-action-button
602
- class="git-commit-btn"
603
- size="s"
604
- @click=${doCommitAndSync}
605
- ?disabled=${loading}
606
- >
607
- Commit and sync
608
- </sp-action-button>
609
- <sp-action-button
610
- class="git-split-trigger"
611
- size="s"
612
- @click=${(e) => {
613
- const menu = e.currentTarget.parentElement.querySelector(".git-split-menu");
614
- if (menu) {
615
- menu.toggleAttribute("hidden");
616
- }
617
- }}
618
- >
619
- <sp-icon-chevron-down slot="icon" size="xs"></sp-icon-chevron-down>
620
- </sp-action-button>
621
- <div class="git-split-menu" hidden>
622
- <button
623
- class="git-split-menu-item"
624
- @click=${(e) => {
625
- e.currentTarget.parentElement.setAttribute("hidden", "");
626
- doCommit();
627
- }}
628
- >
629
- Commit (don't sync)
630
- </button>
631
- </div>
632
- </div>
633
- </div>
634
- </div>
635
- `;
636
- const fileRowT = (file) => {
637
- const parts = file.path.split("/");
638
- const name = parts.pop();
639
- const dir = parts.join("/");
640
- const onFileClick = async () => {
641
- if (file.status !== "M" && file.status !== "A") {
642
- return;
643
- }
644
- if (!file.path.endsWith(".json") && !formatForPath(file.path)) {
645
- return;
646
- }
647
- try {
648
- const plat = getPlatform();
649
- updateUi("gitLoading", true);
650
- const [originalContent, currentContent] = await Promise.all([
651
- file.status === "A" ? Promise.resolve("") : plat.gitShow({ path: file.path, ref: "HEAD" }),
652
- plat.readFile(file.path)
653
- ]);
654
- const diffState = {
655
- currentContent,
656
- filePath: file.path,
657
- fileStatus: file.status,
658
- originalContent
659
- };
660
- updateUi("gitDiffState", diffState);
661
- if (ctx?.setCanvasMode) {
662
- if (ctx.setGitDiffState) {
663
- ctx.setGitDiffState(diffState);
664
- }
665
- ctx.setCanvasMode("git-diff");
666
- }
667
- } catch (error) {
668
- updateUi("gitError", `Failed to load diff: ${errorMessage(error)}`);
669
- } finally {
670
- updateUi("gitLoading", false);
671
- }
672
- };
673
- return html`
674
- <div class="git-file-row">
675
- <span
676
- class="git-file-info"
677
- style="cursor: pointer; flex: 1;"
678
- title="Click to view diff"
679
- @click=${onFileClick}
680
- >
681
- <span class="git-file-name" title=${file.path}>${name}</span>
682
- ${dir ? html`<span class="git-file-dir">${dir}</span>` : nothing}
683
- </span>
684
- <span class="git-file-actions">
685
- ${file.staged ? html`
686
- <sp-action-button
687
- size="xs"
688
- quiet
689
- title="Unstage"
690
- @click=${() => gitAction("gitUnstage", [file.path])}
691
- >
692
- <sp-icon-remove slot="icon" size="xs"></sp-icon-remove>
693
- </sp-action-button>
694
- ` : html`
695
- <sp-action-button
696
- size="xs"
697
- quiet
698
- title="Discard changes"
699
- @click=${async () => {
700
- if (file.status === "U") {
701
- return;
702
- }
703
- const confirmed = await showConfirmDialog("Discard Changes", `Discard changes to ${file.path}?`, { confirmLabel: "Discard", destructive: true });
704
- if (!confirmed) {
705
- return;
706
- }
707
- await gitAction("gitDiscard", [file.path]);
708
- }}
709
- ?disabled=${file.status === "U"}
710
- >
711
- <sp-icon-undo slot="icon" size="xs"></sp-icon-undo>
712
- </sp-action-button>
713
- <sp-action-button
714
- size="xs"
715
- quiet
716
- title="Stage"
717
- @click=${() => gitAction("gitStage", [file.path])}
718
- >
719
- <sp-icon-add slot="icon" size="xs"></sp-icon-add>
720
- </sp-action-button>
721
- `}
722
- </span>
723
- <span class="git-file-badge git-status-${file.status}">${file.status}</span>
724
- </div>
725
- `;
726
- };
727
- const groupFilesByComponent = (files) => {
728
- const groups = new Map;
729
- for (const f of files) {
730
- const parts = f.path.split("/");
731
- let component;
732
- if (f.path.endsWith(".json") || f.path.endsWith(".class.json") || formatForPath(f.path)) {
733
- component = parts.length > 1 ? `/${parts.at(-2)}` : `/${parts[0]}`;
734
- } else {
735
- component = "Other";
736
- }
737
- if (!groups.has(component)) {
738
- groups.set(component, []);
739
- }
740
- groups.get(component).push(f);
741
- }
742
- return groups;
743
- };
744
- const allFiles = [...stagedFiles, ...unstagedFiles];
745
- const componentGroups = groupFilesByComponent(allFiles);
746
- const changesT = html`
747
- ${stagedFiles.length > 0 ? html`
748
- <div class="git-section">
749
- <div class="git-section-header">
750
- <span>Staged Changes</span>
751
- <span class="git-count">${stagedFiles.length}</span>
752
- <sp-action-button
753
- size="xs"
754
- quiet
755
- title="Unstage all"
756
- @click=${() => gitAction("gitUnstage", stagedFiles.map((f) => f.path))}
757
- >
758
- <sp-icon-remove slot="icon" size="xs"></sp-icon-remove>
759
- </sp-action-button>
760
- </div>
761
- ${repeat(stagedFiles, (f) => f.path, fileRowT)}
762
- </div>
763
- ` : nothing}
764
- <div class="git-section">
765
- <div class="git-section-header">
766
- <span>Changed Components</span>
767
- <span class="git-count">${allFiles.length}</span>
768
- ${unstagedFiles.length > 0 ? html`
769
- <sp-action-button
770
- size="xs"
771
- quiet
772
- title="Stage all"
773
- @click=${() => gitAction("gitStage", unstagedFiles.map((f) => f.path))}
774
- >
775
- <sp-icon-add slot="icon" size="xs"></sp-icon-add>
776
- </sp-action-button>
777
- ` : nothing}
778
- </div>
779
- ${allFiles.length > 0 ? html`
780
- ${[...componentGroups.entries()].map(([comp, files]) => html`
781
- <div class="git-component-group">
782
- <div class="git-component-header">
783
- <sp-action-button
784
- size="xs"
785
- quiet
786
- class="git-component-overflow"
787
- title="Actions"
788
- >
789
- <sp-icon-more slot="icon" size="xs"></sp-icon-more>
790
- </sp-action-button>
791
- <span class="git-component-name">${comp}</span>
792
- </div>
793
- ${repeat(files, (f) => f.path, fileRowT)}
794
- </div>
795
- `)}
796
- ` : html`<div class="git-empty">No changes</div>`}
797
- </div>
798
- `;
799
- const logEntries = S.ui.gitLogEntries || [];
800
- const historyT = html`
801
- <div class="git-history">
802
- ${logEntries.length === 0 ? html`<div class="git-empty">No history</div>` : repeat(logEntries, (e) => e.hash, (entry) => html`
803
- <div class="git-history-entry">
804
- <span class="git-history-hash">${entry.hash.slice(0, 7)}</span>
805
- <span class="git-history-message">${entry.message}</span>
806
- <span class="git-history-meta"
807
- >${entry.author} · ${_relativeDate(entry.date)}</span
808
- >
809
- </div>
810
- `)}
811
- </div>
812
- `;
813
- return html`
814
- <div class="git-panel">
815
- ${syncBarT} ${branchSelectorT} ${tabsT}
816
- ${_gitSubTab === "changes" ? html`${commitT}${changesT}` : historyT}
817
- ${loading ? html`<div class="git-loading">Loading...</div>` : nothing}
818
- ${S.ui.gitError ? html`<div class="git-error">${S.ui.gitError}</div>` : nothing}
819
- </div>
820
- `;
821
- }
822
- function _relativeDate(iso) {
823
- const d = new Date(iso);
824
- const now = Date.now();
825
- const diff = now - d.getTime();
826
- const mins = Math.floor(diff / 60000);
827
- if (mins < 1) {
828
- return "just now";
829
- }
830
- if (mins < 60) {
831
- return `${mins}m ago`;
832
- }
833
- const hours = Math.floor(mins / 60);
834
- if (hours < 24) {
835
- return `${hours}h ago`;
836
- }
837
- const days = Math.floor(hours / 24);
838
- if (days < 30) {
839
- return `${days}d ago`;
840
- }
841
- return d.toLocaleDateString();
842
- }
843
- function cleanupGitPanel() {
844
- if (_pollTimer) {
845
- clearInterval(_pollTimer);
846
- _pollTimer = null;
847
- }
848
- }
849
-
850
- export { refreshGitStatus, cloneRepository, platformSupportsClone, renderGitPanel, cleanupGitPanel };
851
-
852
- //# debugId=1EEF19D9DB2E4D1164756E2164756E21
853
- //# sourceMappingURL=studio-wd6ewdvd.js.map