@termaxjs/web-ui-components 0.1.1

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 (391) hide show
  1. package/LICENSE +201 -0
  2. package/dist/ai/AgentStatusPill.d.ts +13 -0
  3. package/dist/ai/AgentStatusPill.d.ts.map +1 -0
  4. package/dist/ai/AgentStatusPill.js +28 -0
  5. package/dist/ai/AgentStatusPill.js.map +1 -0
  6. package/dist/ai/AiToolApproval.d.ts +12 -0
  7. package/dist/ai/AiToolApproval.d.ts.map +1 -0
  8. package/dist/ai/AiToolApproval.js +63 -0
  9. package/dist/ai/AiToolApproval.js.map +1 -0
  10. package/dist/ai/Chip.d.ts +17 -0
  11. package/dist/ai/Chip.d.ts.map +1 -0
  12. package/dist/ai/Chip.js +39 -0
  13. package/dist/ai/Chip.js.map +1 -0
  14. package/dist/ai/ChipsRow.d.ts +35 -0
  15. package/dist/ai/ChipsRow.d.ts.map +1 -0
  16. package/dist/ai/ChipsRow.js +32 -0
  17. package/dist/ai/ChipsRow.js.map +1 -0
  18. package/dist/ai/TodoStrip.d.ts +11 -0
  19. package/dist/ai/TodoStrip.d.ts.map +1 -0
  20. package/dist/ai/TodoStrip.js +27 -0
  21. package/dist/ai/TodoStrip.js.map +1 -0
  22. package/dist/ai/index.d.ts +6 -0
  23. package/dist/ai/index.d.ts.map +1 -0
  24. package/dist/ai/index.js +6 -0
  25. package/dist/ai/index.js.map +1 -0
  26. package/dist/command-palette/CommandPaletteDialog.d.ts +19 -0
  27. package/dist/command-palette/CommandPaletteDialog.d.ts.map +1 -0
  28. package/dist/command-palette/CommandPaletteDialog.js +23 -0
  29. package/dist/command-palette/CommandPaletteDialog.js.map +1 -0
  30. package/dist/command-palette/index.d.ts +2 -0
  31. package/dist/command-palette/index.d.ts.map +1 -0
  32. package/dist/command-palette/index.js +2 -0
  33. package/dist/command-palette/index.js.map +1 -0
  34. package/dist/explorer/ExplorerSearch.d.ts +35 -0
  35. package/dist/explorer/ExplorerSearch.d.ts.map +1 -0
  36. package/dist/explorer/ExplorerSearch.js +153 -0
  37. package/dist/explorer/ExplorerSearch.js.map +1 -0
  38. package/dist/explorer/FileTree.d.ts +65 -0
  39. package/dist/explorer/FileTree.d.ts.map +1 -0
  40. package/dist/explorer/FileTree.js +205 -0
  41. package/dist/explorer/FileTree.js.map +1 -0
  42. package/dist/explorer/InlineInput.d.ts +14 -0
  43. package/dist/explorer/InlineInput.d.ts.map +1 -0
  44. package/dist/explorer/InlineInput.js +77 -0
  45. package/dist/explorer/InlineInput.js.map +1 -0
  46. package/dist/explorer/TreeRow.d.ts +64 -0
  47. package/dist/explorer/TreeRow.d.ts.map +1 -0
  48. package/dist/explorer/TreeRow.js +100 -0
  49. package/dist/explorer/TreeRow.js.map +1 -0
  50. package/dist/explorer/constants.d.ts +12 -0
  51. package/dist/explorer/constants.d.ts.map +1 -0
  52. package/dist/explorer/constants.js +72 -0
  53. package/dist/explorer/constants.js.map +1 -0
  54. package/dist/explorer/contextActions.d.ts +5 -0
  55. package/dist/explorer/contextActions.d.ts.map +1 -0
  56. package/dist/explorer/contextActions.js +38 -0
  57. package/dist/explorer/contextActions.js.map +1 -0
  58. package/dist/explorer/iconMap.json +1 -0
  59. package/dist/explorer/iconResolver.d.ts +3 -0
  60. package/dist/explorer/iconResolver.d.ts.map +1 -0
  61. package/dist/explorer/iconResolver.js +98 -0
  62. package/dist/explorer/iconResolver.js.map +1 -0
  63. package/dist/explorer/index.d.ts +8 -0
  64. package/dist/explorer/index.d.ts.map +1 -0
  65. package/dist/explorer/index.js +8 -0
  66. package/dist/explorer/index.js.map +1 -0
  67. package/dist/explorer/menuItemClass.d.ts +3 -0
  68. package/dist/explorer/menuItemClass.d.ts.map +1 -0
  69. package/dist/explorer/menuItemClass.js +6 -0
  70. package/dist/explorer/menuItemClass.js.map +1 -0
  71. package/dist/explorer/types.d.ts +2 -0
  72. package/dist/explorer/types.d.ts.map +1 -0
  73. package/dist/explorer/types.js +2 -0
  74. package/dist/explorer/types.js.map +1 -0
  75. package/dist/index.d.ts +11 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +11 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/layout/PaneChip.d.ts +13 -0
  80. package/dist/layout/PaneChip.d.ts.map +1 -0
  81. package/dist/layout/PaneChip.js +19 -0
  82. package/dist/layout/PaneChip.js.map +1 -0
  83. package/dist/layout/TabBar.d.ts +36 -0
  84. package/dist/layout/TabBar.d.ts.map +1 -0
  85. package/dist/layout/TabBar.js +237 -0
  86. package/dist/layout/TabBar.js.map +1 -0
  87. package/dist/layout/TabItem.d.ts +19 -0
  88. package/dist/layout/TabItem.d.ts.map +1 -0
  89. package/dist/layout/TabItem.js +66 -0
  90. package/dist/layout/TabItem.js.map +1 -0
  91. package/dist/layout/index.d.ts +7 -0
  92. package/dist/layout/index.d.ts.map +1 -0
  93. package/dist/layout/index.js +7 -0
  94. package/dist/layout/index.js.map +1 -0
  95. package/dist/layout/leafState.d.ts +15 -0
  96. package/dist/layout/leafState.d.ts.map +1 -0
  97. package/dist/layout/leafState.js +70 -0
  98. package/dist/layout/leafState.js.map +1 -0
  99. package/dist/layout/resizable.d.ts +31 -0
  100. package/dist/layout/resizable.d.ts.map +1 -0
  101. package/dist/layout/resizable.js +16 -0
  102. package/dist/layout/resizable.js.map +1 -0
  103. package/dist/layout/tabLabel.d.ts +9 -0
  104. package/dist/layout/tabLabel.d.ts.map +1 -0
  105. package/dist/layout/tabLabel.js +31 -0
  106. package/dist/layout/tabLabel.js.map +1 -0
  107. package/dist/primitives/alert-dialog.d.ts +19 -0
  108. package/dist/primitives/alert-dialog.d.ts.map +1 -0
  109. package/dist/primitives/alert-dialog.js +42 -0
  110. package/dist/primitives/alert-dialog.js.map +1 -0
  111. package/dist/primitives/alert.d.ts +11 -0
  112. package/dist/primitives/alert.d.ts.map +1 -0
  113. package/dist/primitives/alert.js +28 -0
  114. package/dist/primitives/alert.js.map +1 -0
  115. package/dist/primitives/badge.d.ts +10 -0
  116. package/dist/primitives/badge.d.ts.map +1 -0
  117. package/dist/primitives/badge.js +25 -0
  118. package/dist/primitives/badge.js.map +1 -0
  119. package/dist/primitives/breadcrumb.d.ts +12 -0
  120. package/dist/primitives/breadcrumb.d.ts.map +1 -0
  121. package/dist/primitives/breadcrumb.js +29 -0
  122. package/dist/primitives/breadcrumb.js.map +1 -0
  123. package/dist/primitives/button-group.d.ts +12 -0
  124. package/dist/primitives/button-group.d.ts.map +1 -0
  125. package/dist/primitives/button-group.js +28 -0
  126. package/dist/primitives/button-group.js.map +1 -0
  127. package/dist/primitives/button.d.ts +11 -0
  128. package/dist/primitives/button.d.ts.map +1 -0
  129. package/dist/primitives/button.js +36 -0
  130. package/dist/primitives/button.js.map +1 -0
  131. package/dist/primitives/card.d.ts +12 -0
  132. package/dist/primitives/card.d.ts.map +1 -0
  133. package/dist/primitives/card.js +25 -0
  134. package/dist/primitives/card.js.map +1 -0
  135. package/dist/primitives/checkbox.d.ts +5 -0
  136. package/dist/primitives/checkbox.d.ts.map +1 -0
  137. package/dist/primitives/checkbox.js +10 -0
  138. package/dist/primitives/checkbox.js.map +1 -0
  139. package/dist/primitives/collapsible.d.ts +6 -0
  140. package/dist/primitives/collapsible.d.ts.map +1 -0
  141. package/dist/primitives/collapsible.js +13 -0
  142. package/dist/primitives/collapsible.js.map +1 -0
  143. package/dist/primitives/command.d.ts +36 -0
  144. package/dist/primitives/command.d.ts.map +1 -0
  145. package/dist/primitives/command.js +103 -0
  146. package/dist/primitives/command.js.map +1 -0
  147. package/dist/primitives/context-menu.d.ts +41 -0
  148. package/dist/primitives/context-menu.d.ts.map +1 -0
  149. package/dist/primitives/context-menu.js +83 -0
  150. package/dist/primitives/context-menu.js.map +1 -0
  151. package/dist/primitives/dialog.d.ts +18 -0
  152. package/dist/primitives/dialog.d.ts.map +1 -0
  153. package/dist/primitives/dialog.js +38 -0
  154. package/dist/primitives/dialog.js.map +1 -0
  155. package/dist/primitives/dropdown-menu.d.ts +30 -0
  156. package/dist/primitives/dropdown-menu.d.ts.map +1 -0
  157. package/dist/primitives/dropdown-menu.js +52 -0
  158. package/dist/primitives/dropdown-menu.js.map +1 -0
  159. package/dist/primitives/empty.d.ts +12 -0
  160. package/dist/primitives/empty.d.ts.map +1 -0
  161. package/dist/primitives/empty.js +34 -0
  162. package/dist/primitives/empty.js.map +1 -0
  163. package/dist/primitives/hover-card.d.ts +7 -0
  164. package/dist/primitives/hover-card.d.ts.map +1 -0
  165. package/dist/primitives/hover-card.js +14 -0
  166. package/dist/primitives/hover-card.js.map +1 -0
  167. package/dist/primitives/index.d.ts +40 -0
  168. package/dist/primitives/index.d.ts.map +1 -0
  169. package/dist/primitives/index.js +40 -0
  170. package/dist/primitives/index.js.map +1 -0
  171. package/dist/primitives/input-group.d.ts +17 -0
  172. package/dist/primitives/input-group.d.ts.map +1 -0
  173. package/dist/primitives/input-group.js +59 -0
  174. package/dist/primitives/input-group.js.map +1 -0
  175. package/dist/primitives/input.d.ts +4 -0
  176. package/dist/primitives/input.d.ts.map +1 -0
  177. package/dist/primitives/input.js +7 -0
  178. package/dist/primitives/input.js.map +1 -0
  179. package/dist/primitives/item.d.ts +24 -0
  180. package/dist/primitives/item.d.ts.map +1 -0
  181. package/dist/primitives/item.js +68 -0
  182. package/dist/primitives/item.js.map +1 -0
  183. package/dist/primitives/kbd.d.ts +4 -0
  184. package/dist/primitives/kbd.d.ts.map +1 -0
  185. package/dist/primitives/kbd.js +10 -0
  186. package/dist/primitives/kbd.js.map +1 -0
  187. package/dist/primitives/label.d.ts +5 -0
  188. package/dist/primitives/label.d.ts.map +1 -0
  189. package/dist/primitives/label.js +8 -0
  190. package/dist/primitives/label.js.map +1 -0
  191. package/dist/primitives/menubar.d.ts +31 -0
  192. package/dist/primitives/menubar.d.ts.map +1 -0
  193. package/dist/primitives/menubar.js +55 -0
  194. package/dist/primitives/menubar.js.map +1 -0
  195. package/dist/primitives/popover.d.ts +11 -0
  196. package/dist/primitives/popover.d.ts.map +1 -0
  197. package/dist/primitives/popover.js +27 -0
  198. package/dist/primitives/popover.js.map +1 -0
  199. package/dist/primitives/progress.d.ts +5 -0
  200. package/dist/primitives/progress.d.ts.map +1 -0
  201. package/dist/primitives/progress.js +8 -0
  202. package/dist/primitives/progress.js.map +1 -0
  203. package/dist/primitives/radio-group.d.ts +6 -0
  204. package/dist/primitives/radio-group.d.ts.map +1 -0
  205. package/dist/primitives/radio-group.js +11 -0
  206. package/dist/primitives/radio-group.js.map +1 -0
  207. package/dist/primitives/resizable.d.ts +31 -0
  208. package/dist/primitives/resizable.d.ts.map +1 -0
  209. package/dist/primitives/resizable.js +16 -0
  210. package/dist/primitives/resizable.js.map +1 -0
  211. package/dist/primitives/scroll-area.d.ts +6 -0
  212. package/dist/primitives/scroll-area.d.ts.map +1 -0
  213. package/dist/primitives/scroll-area.js +11 -0
  214. package/dist/primitives/scroll-area.js.map +1 -0
  215. package/dist/primitives/select.d.ts +16 -0
  216. package/dist/primitives/select.d.ts.map +1 -0
  217. package/dist/primitives/select.js +37 -0
  218. package/dist/primitives/select.js.map +1 -0
  219. package/dist/primitives/separator.d.ts +5 -0
  220. package/dist/primitives/separator.d.ts.map +1 -0
  221. package/dist/primitives/separator.js +8 -0
  222. package/dist/primitives/separator.js.map +1 -0
  223. package/dist/primitives/sheet.d.ts +15 -0
  224. package/dist/primitives/sheet.d.ts.map +1 -0
  225. package/dist/primitives/sheet.js +38 -0
  226. package/dist/primitives/sheet.js.map +1 -0
  227. package/dist/primitives/skeleton.d.ts +3 -0
  228. package/dist/primitives/skeleton.d.ts.map +1 -0
  229. package/dist/primitives/skeleton.js +7 -0
  230. package/dist/primitives/skeleton.js.map +1 -0
  231. package/dist/primitives/slider.d.ts +5 -0
  232. package/dist/primitives/slider.d.ts.map +1 -0
  233. package/dist/primitives/slider.js +14 -0
  234. package/dist/primitives/slider.js.map +1 -0
  235. package/dist/primitives/sonner.d.ts +5 -0
  236. package/dist/primitives/sonner.d.ts.map +1 -0
  237. package/dist/primitives/sonner.js +12 -0
  238. package/dist/primitives/sonner.js.map +1 -0
  239. package/dist/primitives/spinner.d.ts +3 -0
  240. package/dist/primitives/spinner.d.ts.map +1 -0
  241. package/dist/primitives/spinner.js +11 -0
  242. package/dist/primitives/spinner.js.map +1 -0
  243. package/dist/primitives/switch.d.ts +7 -0
  244. package/dist/primitives/switch.d.ts.map +1 -0
  245. package/dist/primitives/switch.js +18 -0
  246. package/dist/primitives/switch.js.map +1 -0
  247. package/dist/primitives/tabs.d.ts +12 -0
  248. package/dist/primitives/tabs.d.ts.map +1 -0
  249. package/dist/primitives/tabs.js +29 -0
  250. package/dist/primitives/tabs.js.map +1 -0
  251. package/dist/primitives/textarea.d.ts +4 -0
  252. package/dist/primitives/textarea.d.ts.map +1 -0
  253. package/dist/primitives/textarea.js +7 -0
  254. package/dist/primitives/textarea.js.map +1 -0
  255. package/dist/primitives/toggle-group.d.ts +11 -0
  256. package/dist/primitives/toggle-group.d.ts.map +1 -0
  257. package/dist/primitives/toggle-group.js +24 -0
  258. package/dist/primitives/toggle-group.js.map +1 -0
  259. package/dist/primitives/toggle.d.ts +10 -0
  260. package/dist/primitives/toggle.d.ts.map +1 -0
  261. package/dist/primitives/toggle.js +26 -0
  262. package/dist/primitives/toggle.js.map +1 -0
  263. package/dist/primitives/tooltip.d.ts +8 -0
  264. package/dist/primitives/tooltip.d.ts.map +1 -0
  265. package/dist/primitives/tooltip.js +18 -0
  266. package/dist/primitives/tooltip.js.map +1 -0
  267. package/dist/settings/SettingGroup.d.ts +8 -0
  268. package/dist/settings/SettingGroup.d.ts.map +1 -0
  269. package/dist/settings/SettingGroup.js +7 -0
  270. package/dist/settings/SettingGroup.js.map +1 -0
  271. package/dist/settings/SettingRow.d.ts +58 -0
  272. package/dist/settings/SettingRow.d.ts.map +1 -0
  273. package/dist/settings/SettingRow.js +54 -0
  274. package/dist/settings/SettingRow.js.map +1 -0
  275. package/dist/settings/SettingsFormBuilder.d.ts +11 -0
  276. package/dist/settings/SettingsFormBuilder.d.ts.map +1 -0
  277. package/dist/settings/SettingsFormBuilder.js +43 -0
  278. package/dist/settings/SettingsFormBuilder.js.map +1 -0
  279. package/dist/settings/index.d.ts +4 -0
  280. package/dist/settings/index.d.ts.map +1 -0
  281. package/dist/settings/index.js +4 -0
  282. package/dist/settings/index.js.map +1 -0
  283. package/dist/shell/HeaderBar.d.ts +10 -0
  284. package/dist/shell/HeaderBar.d.ts.map +1 -0
  285. package/dist/shell/HeaderBar.js +6 -0
  286. package/dist/shell/HeaderBar.js.map +1 -0
  287. package/dist/shell/StatusBar.d.ts +9 -0
  288. package/dist/shell/StatusBar.d.ts.map +1 -0
  289. package/dist/shell/StatusBar.js +6 -0
  290. package/dist/shell/StatusBar.js.map +1 -0
  291. package/dist/shell/index.d.ts +3 -0
  292. package/dist/shell/index.d.ts.map +1 -0
  293. package/dist/shell/index.js +3 -0
  294. package/dist/shell/index.js.map +1 -0
  295. package/dist/source-control/BranchSwitcher.d.ts +14 -0
  296. package/dist/source-control/BranchSwitcher.d.ts.map +1 -0
  297. package/dist/source-control/BranchSwitcher.js +10 -0
  298. package/dist/source-control/BranchSwitcher.js.map +1 -0
  299. package/dist/source-control/CommitRow.d.ts +15 -0
  300. package/dist/source-control/CommitRow.d.ts.map +1 -0
  301. package/dist/source-control/CommitRow.js +20 -0
  302. package/dist/source-control/CommitRow.js.map +1 -0
  303. package/dist/source-control/EntryRow.d.ts +25 -0
  304. package/dist/source-control/EntryRow.d.ts.map +1 -0
  305. package/dist/source-control/EntryRow.js +67 -0
  306. package/dist/source-control/EntryRow.js.map +1 -0
  307. package/dist/source-control/GraphRail.d.ts +14 -0
  308. package/dist/source-control/GraphRail.d.ts.map +1 -0
  309. package/dist/source-control/GraphRail.js +49 -0
  310. package/dist/source-control/GraphRail.js.map +1 -0
  311. package/dist/source-control/InlineHunkView.d.ts +22 -0
  312. package/dist/source-control/InlineHunkView.d.ts.map +1 -0
  313. package/dist/source-control/InlineHunkView.js +95 -0
  314. package/dist/source-control/InlineHunkView.js.map +1 -0
  315. package/dist/source-control/SourceControlActions.d.ts +15 -0
  316. package/dist/source-control/SourceControlActions.d.ts.map +1 -0
  317. package/dist/source-control/SourceControlActions.js +38 -0
  318. package/dist/source-control/SourceControlActions.js.map +1 -0
  319. package/dist/source-control/SourceControlPanel.d.ts +21 -0
  320. package/dist/source-control/SourceControlPanel.d.ts.map +1 -0
  321. package/dist/source-control/SourceControlPanel.js +300 -0
  322. package/dist/source-control/SourceControlPanel.js.map +1 -0
  323. package/dist/source-control/SourceControlStatusViews.d.ts +20 -0
  324. package/dist/source-control/SourceControlStatusViews.d.ts.map +1 -0
  325. package/dist/source-control/SourceControlStatusViews.js +18 -0
  326. package/dist/source-control/SourceControlStatusViews.js.map +1 -0
  327. package/dist/source-control/StashSection.d.ts +13 -0
  328. package/dist/source-control/StashSection.d.ts.map +1 -0
  329. package/dist/source-control/StashSection.js +14 -0
  330. package/dist/source-control/StashSection.js.map +1 -0
  331. package/dist/source-control/highlight.d.ts +8 -0
  332. package/dist/source-control/highlight.d.ts.map +1 -0
  333. package/dist/source-control/highlight.js +15 -0
  334. package/dist/source-control/highlight.js.map +1 -0
  335. package/dist/source-control/index.d.ts +12 -0
  336. package/dist/source-control/index.d.ts.map +1 -0
  337. package/dist/source-control/index.js +12 -0
  338. package/dist/source-control/index.js.map +1 -0
  339. package/dist/source-control/sourceControlHelpers.d.ts +27 -0
  340. package/dist/source-control/sourceControlHelpers.d.ts.map +1 -0
  341. package/dist/source-control/sourceControlHelpers.js +51 -0
  342. package/dist/source-control/sourceControlHelpers.js.map +1 -0
  343. package/dist/utils/cn.d.ts +3 -0
  344. package/dist/utils/cn.d.ts.map +1 -0
  345. package/dist/utils/cn.js +6 -0
  346. package/dist/utils/cn.js.map +1 -0
  347. package/dist/utils/index.d.ts +2 -0
  348. package/dist/utils/index.d.ts.map +1 -0
  349. package/dist/utils/index.js +2 -0
  350. package/dist/utils/index.js.map +1 -0
  351. package/dist/utils/isTauri.d.ts +2 -0
  352. package/dist/utils/isTauri.d.ts.map +1 -0
  353. package/dist/utils/isTauri.js +2 -0
  354. package/dist/utils/isTauri.js.map +1 -0
  355. package/dist/utils/mockCore.d.ts +6 -0
  356. package/dist/utils/mockCore.d.ts.map +1 -0
  357. package/dist/utils/mockCore.js +3 -0
  358. package/dist/utils/mockCore.js.map +1 -0
  359. package/dist/utils/mockFs.d.ts +10 -0
  360. package/dist/utils/mockFs.d.ts.map +1 -0
  361. package/dist/utils/mockFs.js +10 -0
  362. package/dist/utils/mockFs.js.map +1 -0
  363. package/dist/utils/mockSettings.d.ts +3 -0
  364. package/dist/utils/mockSettings.d.ts.map +1 -0
  365. package/dist/utils/mockSettings.js +3 -0
  366. package/dist/utils/mockSettings.js.map +1 -0
  367. package/dist/utils/mockShortcuts.d.ts +2 -0
  368. package/dist/utils/mockShortcuts.d.ts.map +1 -0
  369. package/dist/utils/mockShortcuts.js +2 -0
  370. package/dist/utils/mockShortcuts.js.map +1 -0
  371. package/dist/utils/mockSpaces.d.ts +4 -0
  372. package/dist/utils/mockSpaces.d.ts.map +1 -0
  373. package/dist/utils/mockSpaces.js +2 -0
  374. package/dist/utils/mockSpaces.js.map +1 -0
  375. package/dist/utils/mockTauri.d.ts +5 -0
  376. package/dist/utils/mockTauri.d.ts.map +1 -0
  377. package/dist/utils/mockTauri.js +3 -0
  378. package/dist/utils/mockTauri.js.map +1 -0
  379. package/dist/utils/mockWorkspace.d.ts +2 -0
  380. package/dist/utils/mockWorkspace.d.ts.map +1 -0
  381. package/dist/utils/mockWorkspace.js +2 -0
  382. package/dist/utils/mockWorkspace.js.map +1 -0
  383. package/dist/utils/platform.d.ts +5 -0
  384. package/dist/utils/platform.d.ts.map +1 -0
  385. package/dist/utils/platform.js +8 -0
  386. package/dist/utils/platform.js.map +1 -0
  387. package/dist/utils/shellQuote.d.ts +2 -0
  388. package/dist/utils/shellQuote.d.ts.map +1 -0
  389. package/dist/utils/shellQuote.js +7 -0
  390. package/dist/utils/shellQuote.js.map +1 -0
  391. package/package.json +118 -0
@@ -0,0 +1,49 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo } from "react";
3
+ export const LANE_WIDTH = 14;
4
+ export const RAIL_PADDING_X = 8;
5
+ export const MAX_VISIBLE_LANES = 6;
6
+ const STRAIGHT_WIDTH = 1.5;
7
+ const CURVE_WIDTH = 1.5;
8
+ function laneX(lane) {
9
+ return RAIL_PADDING_X + lane * LANE_WIDTH;
10
+ }
11
+ export function railWidth(maxLane) {
12
+ const visible = Math.min(maxLane, MAX_VISIBLE_LANES);
13
+ return RAIL_PADDING_X * 2 + Math.max(0, visible - 1) * LANE_WIDTH + 6;
14
+ }
15
+ function renderTopEdge(edge, midY) {
16
+ if (edge.kind === "straight") {
17
+ const x = laneX(edge.lane);
18
+ return (_jsx("line", { x1: x, y1: 0, x2: x, y2: midY, stroke: edge.color, strokeWidth: STRAIGHT_WIDTH, strokeLinecap: "round" }, `t-s-${edge.lane}`));
19
+ }
20
+ if (edge.kind === "merge") {
21
+ const xFrom = laneX(edge.fromLane);
22
+ const xTo = laneX(edge.toLane);
23
+ const c1y = midY * 0.55;
24
+ return (_jsx("path", { d: `M ${xFrom} 0 C ${xFrom} ${c1y}, ${xTo} ${c1y}, ${xTo} ${midY}`, fill: "none", stroke: edge.color, strokeWidth: CURVE_WIDTH, strokeLinecap: "round" }, `t-m-${edge.fromLane}-${edge.toLane}`));
25
+ }
26
+ return null;
27
+ }
28
+ function renderBottomEdge(edge, midY, bottomY) {
29
+ if (edge.kind === "straight") {
30
+ const x = laneX(edge.lane);
31
+ return (_jsx("line", { x1: x, y1: midY, x2: x, y2: bottomY, stroke: edge.color, strokeWidth: STRAIGHT_WIDTH, strokeLinecap: "round" }, `b-s-${edge.lane}`));
32
+ }
33
+ if (edge.kind === "branch") {
34
+ const xFrom = laneX(edge.fromLane);
35
+ const xTo = laneX(edge.toLane);
36
+ const c1y = midY + (bottomY - midY) * 0.45;
37
+ return (_jsx("path", { d: `M ${xFrom} ${midY} C ${xFrom} ${c1y}, ${xTo} ${c1y}, ${xTo} ${bottomY}`, fill: "none", stroke: edge.color, strokeWidth: CURVE_WIDTH, strokeLinecap: "round" }, `b-b-${edge.fromLane}-${edge.toLane}`));
38
+ }
39
+ return null;
40
+ }
41
+ export const GraphRail = memo(function GraphRail({ row, rowHeight, maxLaneCount, active, }) {
42
+ const width = railWidth(maxLaneCount);
43
+ const midY = Math.round(rowHeight / 2);
44
+ const nodeX = laneX(row.lane);
45
+ const visible = Math.min(maxLaneCount, MAX_VISIBLE_LANES);
46
+ const overflow = row.laneCount > visible;
47
+ return (_jsxs("svg", { width: width, height: rowHeight, viewBox: `0 0 ${width} ${rowHeight}`, "aria-hidden": true, className: "shrink-0 overflow-visible", children: [row.topEdges.map((e) => renderTopEdge(e, midY)), row.bottomEdges.map((e) => renderBottomEdge(e, midY, rowHeight)), _jsx("circle", { cx: nodeX, cy: midY, r: active ? 4.6 : 3.6, fill: row.nodeColor, stroke: "var(--background)", strokeWidth: 1.5 }), active ? (_jsx("circle", { cx: nodeX, cy: midY, r: 6.5, fill: "none", stroke: row.nodeColor, strokeOpacity: 0.35, strokeWidth: 1.4 })) : null, overflow ? (_jsxs("text", { x: width - 4, y: midY + 3, textAnchor: "end", className: "fill-muted-foreground", style: { fontSize: 8 }, children: ["+", row.laneCount - visible] })) : null] }));
48
+ });
49
+ //# sourceMappingURL=GraphRail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphRail.js","sourceRoot":"","sources":["../../src/source-control/GraphRail.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { SourceControlFileEntry } from "@termaxjs/web-source-control";
2
+ export type DiffHunk = {
3
+ header: string;
4
+ lines: string[];
5
+ rawText: string;
6
+ };
7
+ export type ParsedDiff = {
8
+ fileHeader: string;
9
+ hunks: DiffHunk[];
10
+ };
11
+ export interface GitDiffContentResult {
12
+ fallbackPatch?: string | null;
13
+ }
14
+ export type InlineHunkViewProps = {
15
+ entry: SourceControlFileEntry;
16
+ repoRoot: string | null;
17
+ loadDiffContent?: (repoRoot: string, path: string, staged: boolean, originalPath?: string) => Promise<GitDiffContentResult>;
18
+ onStageHunk: (entry: SourceControlFileEntry, patch: string, reverse: boolean) => Promise<void>;
19
+ onDiscardHunk: (entry: SourceControlFileEntry, patch: string) => Promise<void>;
20
+ };
21
+ export declare function InlineHunkView({ entry, repoRoot, loadDiffContent, onStageHunk, onDiscardHunk, }: InlineHunkViewProps): import("react").JSX.Element | null;
22
+ //# sourceMappingURL=InlineHunkView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InlineHunkView.d.ts","sourceRoot":"","sources":["../../src/source-control/InlineHunkView.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAE3E,MAAM,MAAM,QAAQ,GAAG;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAmBD,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,sBAAsB,CAAC;IAC9B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,eAAe,CAAC,EAAE,CAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,YAAY,CAAC,EAAE,MAAM,KAClB,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACnC,WAAW,EAAE,CACX,KAAK,EAAE,sBAAsB,EAC7B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,KACb,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,aAAa,EAAE,CACb,KAAK,EAAE,sBAAsB,EAC7B,KAAK,EAAE,MAAM,KACV,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,eAAe,EACf,WAAW,EACX,aAAa,GACd,EAAE,mBAAmB,sCA6IrB"}
@@ -0,0 +1,95 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Spinner } from "../primitives/spinner.js";
3
+ import { cn } from "../utils/cn.js";
4
+ import { useEffect, useMemo, useState } from "react";
5
+ import { HeadlessSourceControl } from "@termaxjs/web-core";
6
+ function parseUnifiedDiff(diffText) {
7
+ const coreHunks = HeadlessSourceControl.parseUnifiedDiff(diffText);
8
+ const fileHeaderLines = [];
9
+ for (const line of diffText.split("\n")) {
10
+ if (line.startsWith("@@ "))
11
+ break;
12
+ fileHeaderLines.push(line);
13
+ }
14
+ return {
15
+ fileHeader: fileHeaderLines.join("\n"),
16
+ hunks: coreHunks.map((h) => ({
17
+ header: h.header,
18
+ lines: h.lines,
19
+ rawText: `${h.header}\n${h.lines.join("\n")}`,
20
+ })),
21
+ };
22
+ }
23
+ export function InlineHunkView({ entry, repoRoot, loadDiffContent, onStageHunk, onDiscardHunk, }) {
24
+ const [loading, setLoading] = useState(false);
25
+ const [error, setError] = useState(null);
26
+ const [diffText, setDiffText] = useState(null);
27
+ const [actionBusyHunk, setActionBusyHunk] = useState(null);
28
+ useEffect(() => {
29
+ let canceled = false;
30
+ if (!repoRoot) {
31
+ setDiffText(null);
32
+ return;
33
+ }
34
+ setLoading(true);
35
+ const fetcher = loadDiffContent
36
+ ? loadDiffContent(repoRoot, entry.path, entry.staged && !entry.unstaged, entry.originalPath)
37
+ : Promise.resolve({ fallbackPatch: null });
38
+ fetcher
39
+ .then((res) => {
40
+ if (canceled)
41
+ return;
42
+ setDiffText(res.fallbackPatch || null);
43
+ setLoading(false);
44
+ })
45
+ .catch((err) => {
46
+ if (canceled)
47
+ return;
48
+ setError(String(err));
49
+ setLoading(false);
50
+ });
51
+ return () => {
52
+ canceled = true;
53
+ };
54
+ }, [entry.path, entry.staged, entry.unstaged, entry.originalPath, repoRoot, loadDiffContent]);
55
+ const parsed = useMemo(() => {
56
+ if (!diffText)
57
+ return null;
58
+ return parseUnifiedDiff(diffText);
59
+ }, [diffText]);
60
+ if (loading) {
61
+ return (_jsx("div", { className: "flex items-center justify-center p-4 bg-zinc-950/40", children: _jsx(Spinner, { className: "size-4" }) }));
62
+ }
63
+ if (error) {
64
+ return _jsx("div", { className: "p-3 text-destructive text-[11px] bg-zinc-950/40", children: error });
65
+ }
66
+ if (!parsed || parsed.hunks.length === 0) {
67
+ return null;
68
+ }
69
+ return (_jsx("div", { className: "flex flex-col border-y border-border/40 bg-zinc-950/40 text-xs", children: _jsx("div", { className: "divide-y divide-border/20 font-mono text-[11px]", children: parsed.hunks.map((hunk) => {
70
+ const patch = `${parsed.fileHeader}\n${hunk.rawText}\n`;
71
+ return (_jsxs("div", { className: "p-2", children: [_jsxs("div", { className: "flex items-center justify-between text-muted-foreground pb-1", children: [_jsx("span", { children: hunk.header }), _jsxs("div", { className: "flex gap-1", children: [entry.staged ? (_jsx("button", { type: "button", disabled: actionBusyHunk === hunk.header, onClick: async () => {
72
+ setActionBusyHunk(hunk.header);
73
+ await onStageHunk(entry, patch, true);
74
+ setActionBusyHunk(null);
75
+ }, className: "px-1.5 py-0.5 rounded bg-muted/40 hover:bg-muted text-[10px]", children: "Unstage Hunk" })) : (_jsx("button", { type: "button", disabled: actionBusyHunk === hunk.header, onClick: async () => {
76
+ setActionBusyHunk(hunk.header);
77
+ await onStageHunk(entry, patch, false);
78
+ setActionBusyHunk(null);
79
+ }, className: "px-1.5 py-0.5 rounded bg-muted/40 hover:bg-muted text-[10px]", children: "Stage Hunk" })), _jsx("button", { type: "button", disabled: actionBusyHunk === hunk.header, onClick: async () => {
80
+ setActionBusyHunk(hunk.header);
81
+ await onDiscardHunk(entry, patch);
82
+ setActionBusyHunk(null);
83
+ }, className: "px-1.5 py-0.5 rounded hover:bg-rose-500/20 text-rose-400 text-[10px]", children: "Discard" })] })] }), _jsx("div", { className: "overflow-x-auto", children: (() => {
84
+ // Occurrence-counted keys: stable across renders, unique
85
+ // even for repeated blank context lines.
86
+ const seen = new Map();
87
+ return hunk.lines.map((l) => {
88
+ const n = (seen.get(l) ?? 0) + 1;
89
+ seen.set(l, n);
90
+ return (_jsx("div", { className: cn("whitespace-pre leading-relaxed px-1", l.startsWith("+") && "bg-emerald-500/10 text-emerald-400", l.startsWith("-") && "bg-rose-500/10 text-rose-400"), children: l }, `${n}:${l}`));
91
+ });
92
+ })() })] }, hunk.header));
93
+ }) }) }));
94
+ }
95
+ //# sourceMappingURL=InlineHunkView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InlineHunkView.js","sourceRoot":"","sources":["../../src/source-control/InlineHunkView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type ReactNode } from "react";
2
+ export declare function IconActionButton({ label, disabled, onClick, children, }: {
3
+ label: string;
4
+ disabled?: boolean;
5
+ side?: "left" | "top" | "right" | "bottom";
6
+ onClick: () => void;
7
+ children: ReactNode;
8
+ }): import("react").JSX.Element;
9
+ export declare function CommitFeedback({ feedback, }: {
10
+ feedback: {
11
+ tone: "error" | "success";
12
+ message: string;
13
+ } | null;
14
+ }): import("react").JSX.Element | null;
15
+ //# sourceMappingURL=SourceControlActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SourceControlActions.d.ts","sourceRoot":"","sources":["../../src/source-control/SourceControlActions.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,OAAO,CAAC;AAE5D,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC3C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB,+BAcA;AAED,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE;QAAE,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACjE,sCAyDA"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button } from "../primitives/button.js";
3
+ import { cn } from "../utils/cn.js";
4
+ import { useEffect, useState } from "react";
5
+ export function IconActionButton({ label, disabled, onClick, children, }) {
6
+ return (_jsx(Button, { size: "icon-sm", variant: "ghost", className: "size-6 p-3 cursor-pointer rounded-md text-muted-foreground hover:text-foreground disabled:cursor-not-allowed", "aria-label": label, title: label, disabled: disabled, onClick: onClick, children: children }));
7
+ }
8
+ export function CommitFeedback({ feedback, }) {
9
+ const [visibleFeedback, setVisibleFeedback] = useState(feedback);
10
+ const [isVisible, setIsVisible] = useState(false);
11
+ const feedbackMessage = feedback?.message;
12
+ const feedbackTone = feedback?.tone;
13
+ useEffect(() => {
14
+ if (!feedbackMessage || !feedbackTone) {
15
+ setIsVisible(false);
16
+ return;
17
+ }
18
+ setVisibleFeedback({ message: feedbackMessage, tone: feedbackTone });
19
+ setIsVisible(true);
20
+ const hideTimer = window.setTimeout(() => setIsVisible(false), 3600);
21
+ const clearTimer = window.setTimeout(() => {
22
+ setVisibleFeedback((current) => current?.message === feedbackMessage && current.tone === feedbackTone
23
+ ? null
24
+ : current);
25
+ }, 3900);
26
+ return () => {
27
+ window.clearTimeout(hideTimer);
28
+ window.clearTimeout(clearTimer);
29
+ };
30
+ }, [feedbackMessage, feedbackTone]);
31
+ if (!visibleFeedback)
32
+ return null;
33
+ const isError = visibleFeedback.tone === "error";
34
+ return (_jsxs("div", { className: cn("pointer-events-none absolute inset-x-3 top-[calc(100%-0.25rem)] z-20 flex min-w-0 items-center gap-1.5 rounded-lg border px-2.5 py-1.5 text-[var(--text-xs,11px)] leading-snug shadow-lg shadow-black/15 backdrop-blur transition-all duration-200", isVisible ? "translate-y-0 opacity-100" : "-translate-y-1 opacity-0", isError
35
+ ? "border-destructive/30 bg-card/95 text-destructive"
36
+ : "border-border/70 bg-card/95 text-muted-foreground"), children: [_jsx("span", { className: cn("size-1.5 shrink-0 rounded-full", isError ? "bg-destructive" : "bg-foreground/70") }), _jsx("span", { className: cn("min-w-0 flex-1 truncate", isError ? "text-destructive" : "text-muted-foreground"), children: visibleFeedback.message })] }));
37
+ }
38
+ //# sourceMappingURL=SourceControlActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SourceControlActions.js","sourceRoot":"","sources":["../../src/source-control/SourceControlActions.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAkB,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5D,MAAM,UAAU,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,QAAQ,GAOT;IACC,OAAO,CACL,KAAC,MAAM,IACL,IAAI,EAAC,SAAS,EACd,OAAO,EAAC,OAAO,EACf,SAAS,EAAC,8GAA8G,gBAC5G,KAAK,EACjB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,YAEf,QAAQ,GACF,CACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAC7B,QAAQ,GAGT;IACC,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElD,MAAM,eAAe,GAAG,QAAQ,EAAE,OAAO,CAAC;IAC1C,MAAM,YAAY,GAAG,QAAQ,EAAE,IAAI,CAAC;IAEpC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,IAAI,CAAC,YAAY,EAAE,CAAC;YACtC,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QACD,kBAAkB,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QACrE,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QACrE,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACxC,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE,CAC7B,OAAO,EAAE,OAAO,KAAK,eAAe,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY;gBACnE,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,OAAO,CACZ,CAAC;QACJ,CAAC,EAAE,IAAI,CAAC,CAAC;QACT,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/B,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC,CAAC;IAEpC,IAAI,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IAElC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,KAAK,OAAO,CAAC;IACjD,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,oPAAoP,EACpP,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,0BAA0B,EACpE,OAAO;YACL,CAAC,CAAC,mDAAmD;YACrD,CAAC,CAAC,mDAAmD,CACxD,aAED,eACE,SAAS,EAAE,EAAE,CACX,gCAAgC,EAChC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,kBAAkB,CAChD,GACD,EACF,eACE,SAAS,EAAE,EAAE,CACX,yBAAyB,EACzB,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,uBAAuB,CACvD,YAEA,eAAe,CAAC,OAAO,GACnB,IACH,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ export type SourceControlSummary = any;
2
+ export type SourceControlPanelProps = {
3
+ scm?: any;
4
+ open: boolean;
5
+ sourceControl: SourceControlSummary;
6
+ onOpenGitGraph?: () => void;
7
+ onOpenDiff: (input: {
8
+ path: string;
9
+ repoRoot: string;
10
+ mode: "+" | "-";
11
+ originalPath: string | null;
12
+ title?: string;
13
+ }) => void;
14
+ onOpenFile?: (absolutePath: string) => void;
15
+ onOpenBranchSwitcher?: () => void;
16
+ onPreviewLocalVsRemote?: () => void;
17
+ onPreviewCommit?: () => void;
18
+ onToggleSidebar?: () => void;
19
+ };
20
+ export declare const SourceControlPanel: import("react").NamedExoticComponent<SourceControlPanelProps>;
21
+ //# sourceMappingURL=SourceControlPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SourceControlPanel.d.ts","sourceRoot":"","sources":["../../src/source-control/SourceControlPanel.tsx"],"names":[],"mappings":"AAuDA,MAAM,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAMvC,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,EAAE,oBAAoB,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,UAAU,EAAE,CAAC,KAAK,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,GAAG,GAAG,GAAG,CAAC;QAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,KAAK,IAAI,CAAC;IACX,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,sBAAsB,CAAC,EAAE,MAAM,IAAI,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,kBAAkB,+DAyqB7B,CAAC"}
@@ -0,0 +1,300 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "../primitives/alert-dialog.js";
3
+ import { Button } from "../primitives/button.js";
4
+ import { Spinner } from "../primitives/spinner.js";
5
+ import { Textarea } from "../primitives/textarea.js";
6
+ import { IS_MAC } from "../utils/platform.js";
7
+ import { cn } from "../utils/cn.js";
8
+ import { AiContentGenerator02Icon, ArrowDown01Icon, ArrowRight01Icon, ArrowUp01Icon, Cancel01Icon, Download01Icon, FolderCloudIcon, FolderGitTwoIcon, GitBranchIcon, Refresh01Icon, Upload01Icon, ViewIcon, } from "@hugeicons/core-free-icons";
9
+ import { HugeiconsIcon } from "@hugeicons/react";
10
+ import { useVirtualizer } from "@tanstack/react-virtual";
11
+ import { memo, useCallback, useEffect, useMemo, useRef, useState, } from "react";
12
+ import { RowRenderer } from "./EntryRow.js";
13
+ import { CommitFeedback, IconActionButton, } from "./SourceControlActions.js";
14
+ import { CleanTreeHint, PanelCenter, } from "./SourceControlStatusViews.js";
15
+ import { StashSection } from "./StashSection.js";
16
+ import { ROW_HEIGHTS, upstreamBadgeLabel, } from "./sourceControlHelpers.js";
17
+ import { useSourceControlPanel, } from "@termaxjs/web-source-control";
18
+ export const SourceControlPanel = memo(function SourceControlPanel({ scm: scmProp, open, sourceControl, onOpenGitGraph, onOpenDiff, onOpenFile, onOpenBranchSwitcher, onPreviewLocalVsRemote, onPreviewCommit, onToggleSidebar, }) {
19
+ const fallbackScm = useSourceControlPanel({}, open, sourceControl, onOpenDiff);
20
+ const scm = scmProp || fallbackScm;
21
+ const refreshAnimationRef = useRef(null);
22
+ const [refreshAnimating, setRefreshAnimating] = useState(false);
23
+ const scrollRef = useRef(null);
24
+ const containerRef = useRef(null);
25
+ const [focusedRowKey, setFocusedRowKey] = useState(null);
26
+ useEffect(() => {
27
+ return () => {
28
+ if (refreshAnimationRef.current) {
29
+ window.clearTimeout(refreshAnimationRef.current);
30
+ }
31
+ };
32
+ }, []);
33
+ const isRefreshing = scm.panelState === "loading";
34
+ const repoLabel = useMemo(() => {
35
+ if (!scm.status)
36
+ return "Source Control";
37
+ return scm.status.isDetached ? "detached" : scm.status.branch;
38
+ }, [scm.status]);
39
+ const commitShortcut = IS_MAC ? "⌘↩" : "Ctrl+Enter";
40
+ const generateShortcut = IS_MAC ? "⌘G" : "Ctrl+G";
41
+ const canCommit = scm.stagedEntries.length > 0 &&
42
+ scm.commitMessage.trim().length > 0 &&
43
+ !scm.actionBusy;
44
+ const commitDisabledReason = scm.actionBusy
45
+ ? "Wait for the current Git action to finish."
46
+ : scm.stagedEntries.length === 0
47
+ ? "Stage changes to enable commit."
48
+ : scm.commitMessage.trim().length === 0
49
+ ? "Enter a commit message to enable commit."
50
+ : null;
51
+ const commitHint = canCommit
52
+ ? `Commit with ${commitShortcut}.`
53
+ : (commitDisabledReason ?? `Commit with ${commitShortcut}.`);
54
+ const pushHint = scm.pushHint ?? "Push is unavailable right now.";
55
+ const pushDisabledReason = scm.actionBusy
56
+ ? "Wait for the current Git action to finish."
57
+ : pushHint;
58
+ const stagedCount = scm.stagedEntries.length;
59
+ const changedCount = scm.fileEntries.length;
60
+ const pushStatusLabel = upstreamBadgeLabel(scm.status?.upstream);
61
+ const hasUpstream = !!scm.status?.upstream;
62
+ const isDiverged = !!scm.status && scm.status.ahead > 0 && scm.status.behind > 0;
63
+ const canPull = hasUpstream &&
64
+ !!scm.status &&
65
+ scm.status.behind > 0 &&
66
+ !isDiverged &&
67
+ !scm.actionBusy &&
68
+ !sourceControl.busyAction;
69
+ const canFetch = hasUpstream && !scm.actionBusy && !sourceControl.busyAction;
70
+ const footerFeedback = useMemo(() => {
71
+ if (scm.actionError)
72
+ return { tone: "error", message: scm.actionError };
73
+ if (scm.remoteError)
74
+ return { tone: "error", message: scm.remoteError };
75
+ if (scm.actionMessage)
76
+ return { tone: "success", message: scm.actionMessage };
77
+ return null;
78
+ }, [scm.actionError, scm.actionMessage, scm.remoteError]);
79
+ const handleCommitShortcut = (event) => {
80
+ if (event.key === "Enter" &&
81
+ (event.metaKey || event.ctrlKey) &&
82
+ canCommit) {
83
+ event.preventDefault();
84
+ void scm.commit();
85
+ return;
86
+ }
87
+ if (event.key.toLowerCase() === "g" &&
88
+ (event.metaKey || event.ctrlKey) &&
89
+ scm.canGenerateCommitMessage) {
90
+ event.preventDefault();
91
+ void scm.generateCommitMessage();
92
+ }
93
+ };
94
+ const handleRefresh = useCallback(() => {
95
+ setRefreshAnimating(true);
96
+ if (refreshAnimationRef.current) {
97
+ window.clearTimeout(refreshAnimationRef.current);
98
+ }
99
+ void scm.refresh().finally(() => {
100
+ refreshAnimationRef.current = window.setTimeout(() => {
101
+ setRefreshAnimating(false);
102
+ refreshAnimationRef.current = null;
103
+ }, 450);
104
+ });
105
+ }, [scm]);
106
+ const handleFetch = useCallback(() => {
107
+ void sourceControl.runRemoteAction("fetch");
108
+ }, [sourceControl]);
109
+ const handlePull = useCallback(() => {
110
+ void sourceControl.runRemoteAction("pull");
111
+ }, [sourceControl]);
112
+ const rows = useMemo(() => {
113
+ const result = [];
114
+ if (isDiverged) {
115
+ result.push({ kind: "banner-diverged", key: "banner-diverged" });
116
+ }
117
+ if (changedCount > 0) {
118
+ result.push({
119
+ kind: "list-header",
120
+ key: "list-header",
121
+ count: changedCount,
122
+ });
123
+ for (const entry of scm.fileEntries) {
124
+ result.push({ kind: "entry", key: entry.key, entry });
125
+ }
126
+ }
127
+ return result;
128
+ }, [changedCount, isDiverged, scm.fileEntries]);
129
+ const rowKeyToIndex = useMemo(() => {
130
+ const map = new Map();
131
+ rows.forEach((row, index) => {
132
+ map.set(row.key, index);
133
+ });
134
+ return map;
135
+ }, [rows]);
136
+ useEffect(() => {
137
+ if (!focusedRowKey)
138
+ return;
139
+ if (!rowKeyToIndex.has(focusedRowKey)) {
140
+ setFocusedRowKey(null);
141
+ }
142
+ }, [focusedRowKey, rowKeyToIndex]);
143
+ const focusableIndices = useMemo(() => {
144
+ const out = [];
145
+ rows.forEach((row, index) => {
146
+ if (row.kind === "entry")
147
+ out.push(index);
148
+ });
149
+ return out;
150
+ }, [rows]);
151
+ const estimateSize = useCallback((index) => {
152
+ const row = rows[index];
153
+ if (!row)
154
+ return ROW_HEIGHTS.entry;
155
+ switch (row.kind) {
156
+ case "banner-diverged":
157
+ return ROW_HEIGHTS.banner;
158
+ case "list-header":
159
+ return ROW_HEIGHTS.header;
160
+ case "entry":
161
+ return ROW_HEIGHTS.entry;
162
+ }
163
+ }, [rows]);
164
+ const virtualizer = useVirtualizer({
165
+ count: rows.length,
166
+ getScrollElement: () => scrollRef.current,
167
+ estimateSize,
168
+ overscan: 12,
169
+ getItemKey: (index) => rows[index]?.key ?? index,
170
+ });
171
+ const moveFocus = useCallback((direction) => {
172
+ if (focusableIndices.length === 0)
173
+ return;
174
+ const currentIndex = focusedRowKey === null ? -1 : (rowKeyToIndex.get(focusedRowKey) ?? -1);
175
+ let pos = focusableIndices.indexOf(currentIndex);
176
+ if (pos === -1)
177
+ pos = direction > 0 ? -1 : focusableIndices.length;
178
+ let nextPos = pos + direction;
179
+ if (nextPos < 0)
180
+ nextPos = 0;
181
+ if (nextPos > focusableIndices.length - 1)
182
+ nextPos = focusableIndices.length - 1;
183
+ const targetRowIndex = focusableIndices[nextPos];
184
+ const target = rows[targetRowIndex];
185
+ if (!target)
186
+ return;
187
+ setFocusedRowKey(target.key);
188
+ virtualizer.scrollToIndex(targetRowIndex, { align: "auto" });
189
+ }, [focusableIndices, focusedRowKey, rowKeyToIndex, rows, virtualizer]);
190
+ const focusedEntry = useCallback(() => {
191
+ if (!focusedRowKey)
192
+ return null;
193
+ const index = rowKeyToIndex.get(focusedRowKey);
194
+ if (index === undefined)
195
+ return null;
196
+ const row = rows[index];
197
+ return row && row.kind === "entry" ? row.entry : null;
198
+ }, [focusedRowKey, rowKeyToIndex, rows]);
199
+ const handlePanelKeyDown = useCallback((event) => {
200
+ const target = event.target;
201
+ if (target &&
202
+ (target.tagName === "TEXTAREA" ||
203
+ target.tagName === "INPUT" ||
204
+ target.closest("button"))) {
205
+ return;
206
+ }
207
+ const meta = event.metaKey || event.ctrlKey;
208
+ if (meta && (event.key === "r" || event.key === "R")) {
209
+ event.preventDefault();
210
+ handleRefresh();
211
+ return;
212
+ }
213
+ switch (event.key) {
214
+ case "ArrowDown":
215
+ event.preventDefault();
216
+ moveFocus(1);
217
+ break;
218
+ case "ArrowUp":
219
+ event.preventDefault();
220
+ moveFocus(-1);
221
+ break;
222
+ case "Enter": {
223
+ const entry = focusedEntry();
224
+ if (entry) {
225
+ event.preventDefault();
226
+ void scm.selectFile(entry);
227
+ }
228
+ break;
229
+ }
230
+ case " ":
231
+ case "s":
232
+ case "S": {
233
+ if (meta)
234
+ break;
235
+ const entry = focusedEntry();
236
+ if (entry) {
237
+ event.preventDefault();
238
+ void scm.toggleStageFile(entry);
239
+ }
240
+ break;
241
+ }
242
+ case "d":
243
+ case "D": {
244
+ if (meta)
245
+ break;
246
+ const entry = focusedEntry();
247
+ if (entry?.unstaged) {
248
+ event.preventDefault();
249
+ scm.requestDiscardFile(entry);
250
+ }
251
+ break;
252
+ }
253
+ }
254
+ }, [focusedEntry, handleRefresh, moveFocus, scm]);
255
+ if (!open)
256
+ return null;
257
+ const fetchBusy = sourceControl.busyAction === "fetch";
258
+ const pullBusy = sourceControl.busyAction === "pull";
259
+ return (_jsxs(_Fragment, { children: [_jsxs("aside", { className: "flex h-full min-w-0 flex-col bg-card/80 backdrop-blur [contain:layout_style]", children: [_jsxs("header", { className: "flex shrink-0 items-center justify-between gap-2 border-b border-border/50 px-3 pb-2.5 pt-3", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-1.5", children: [_jsxs("button", { type: "button", onClick: () => onOpenBranchSwitcher?.(), className: "inline-flex min-w-0 cursor-pointer items-center gap-1.5 rounded-md bg-foreground/5 px-2 py-1 text-[11.5px] font-medium leading-none text-foreground transition-colors hover:bg-foreground/10", children: [_jsx(HugeiconsIcon, { icon: FolderGitTwoIcon, size: 12, strokeWidth: 1.9, className: "shrink-0 text-muted-foreground" }), _jsx("span", { className: "max-w-[140px] truncate", children: repoLabel })] }), scm.status && (scm.status.ahead > 0 || scm.status.behind > 0) ? (_jsxs("button", { type: "button", onClick: () => onPreviewLocalVsRemote?.(), className: "flex shrink-0 cursor-pointer items-center gap-0.5 text-[10px] font-semibold tabular-nums leading-none text-muted-foreground hover:text-foreground transition-colors", children: [scm.status.ahead > 0 ? (_jsxs("span", { className: "inline-flex items-center gap-0.5 rounded-md border border-border/60 px-1 py-0.5 bg-background", children: [_jsx(HugeiconsIcon, { icon: ArrowUp01Icon, size: 9, strokeWidth: 2.2 }), scm.status.ahead] })) : null, scm.status.behind > 0 ? (_jsxs("span", { className: "inline-flex items-center gap-0.5 rounded-md border border-border/60 px-1 py-0.5 bg-background", children: [_jsx(HugeiconsIcon, { icon: ArrowDown01Icon, size: 9, strokeWidth: 2.2 }), scm.status.behind] })) : null] })) : null, scm.status?.isDetached ? (_jsx("span", { className: "rounded bg-muted/55 px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wider text-muted-foreground", children: "detached" })) : null] }), _jsxs("div", { className: "flex shrink-0 items-center gap-0.5", children: [_jsx(IconActionButton, { label: fetchBusy ? "Fetching…" : "Fetch from remote", disabled: !canFetch, onClick: handleFetch, side: "bottom", children: fetchBusy ? (_jsx(Spinner, { className: "size-3" })) : (_jsx(HugeiconsIcon, { icon: FolderCloudIcon, size: 14, strokeWidth: 1.85 })) }), _jsx(IconActionButton, { label: pullBusy
260
+ ? "Pulling…"
261
+ : isDiverged
262
+ ? "Branch diverged — resolve in terminal"
263
+ : !hasUpstream
264
+ ? "No upstream configured"
265
+ : (scm.status?.behind ?? 0) === 0
266
+ ? "Already up to date"
267
+ : `Pull ${scm.status?.behind ?? 0} commits (fast-forward)`, disabled: !canPull, onClick: handlePull, side: "bottom", children: pullBusy ? (_jsx(Spinner, { className: "size-3" })) : (_jsx(HugeiconsIcon, { icon: Download01Icon, size: 14, strokeWidth: 1.9 })) }), _jsx(IconActionButton, { label: pushDisabledReason, disabled: !scm.canPush || !!scm.actionBusy, onClick: () => void scm.push(), side: "bottom", children: scm.actionBusy === "push" ? (_jsx(Spinner, { className: "size-3" })) : (_jsx(HugeiconsIcon, { icon: Upload01Icon, size: 14, strokeWidth: 1.9 })) }), _jsx(IconActionButton, { label: "Refresh source control", disabled: isRefreshing || !!scm.actionBusy, onClick: handleRefresh, side: "bottom", children: isRefreshing ? (_jsx(Spinner, { className: "size-3.5" })) : (_jsx(HugeiconsIcon, { icon: Refresh01Icon, size: 14, strokeWidth: 1.9, className: cn(refreshAnimating && "animate-spin") })) }), onToggleSidebar && (_jsx(IconActionButton, { label: "Collapse sidebar (\u2318B)", onClick: onToggleSidebar, side: "bottom", children: _jsx(HugeiconsIcon, { icon: Cancel01Icon, size: 14, strokeWidth: 1.9 }) }))] })] }), onOpenGitGraph ? (_jsxs("button", { type: "button", onClick: () => onOpenGitGraph(), className: "group flex shrink-0 cursor-pointer items-center gap-2 border-b border-border/40 px-3 py-2 text-left text-muted-foreground transition-colors hover:bg-foreground/[0.04] hover:text-foreground", children: [_jsx(HugeiconsIcon, { icon: GitBranchIcon, size: 13, strokeWidth: 1.85, className: "shrink-0" }), _jsx("span", { className: "flex-1 text-[var(--text-sm,12px)] font-medium", children: "Commit Graph" }), _jsx(HugeiconsIcon, { icon: ArrowRight01Icon, size: 12, strokeWidth: 2, className: "shrink-0 opacity-50 transition-transform group-hover:translate-x-0.5" })] })) : null, scm.panelState === "loading" ? (_jsx(PanelCenter, { title: "Loading repository" })) : null, scm.panelState === "no-repo" ? (_jsx(PanelCenter, { title: "No repository", body: "The active workspace is not inside a Git repository." })) : null, scm.panelState === "error" ? (_jsx(PanelCenter, { title: "Source control error", body: scm.statusError ?? "Unknown source control error", action: _jsx(Button, { size: "sm", onClick: () => void scm.refresh(), children: "Retry" }) })) : null, scm.panelState === "ready" && scm.status ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "relative shrink-0 space-y-2 border-b border-border/40 bg-gradient-to-b from-card/65 to-card/30 px-2.5 pb-2.5 pt-2.5", children: [_jsx("div", { className: cn("relative rounded-lg border bg-background/95 shadow-sm transition-colors", scm.commitMessage.length > 0
268
+ ? "border-border/70"
269
+ : "border-border/45", "focus-within:border-primary/45 focus-within:shadow-md focus-within:shadow-primary/5"), children: _jsx(Textarea, { value: scm.commitMessage, onChange: (event) => scm.setCommitMessage(event.target.value), onKeyDown: handleCommitShortcut, placeholder: "Commit message", rows: 3, className: cn("min-h-[72px] border-border resize-none rounded-lg bg-transparent px-3 py-2.5 text-[12.5px] leading-snug shadow-none placeholder:text-muted-foreground/65 focus-visible:ring-0 focus:border-0") }) }), _jsxs("div", { className: "flex items-center justify-between px-1", children: [_jsx("div", { className: "flex items-center gap-1 text-[10px] tabular-nums text-muted-foreground/55", children: scm.commitMessage.length > 0 ? (_jsxs("span", { children: [scm.commitMessage.length, " chars"] })) : (_jsxs("span", { className: "flex items-center gap-1", children: [commitShortcut, " to commit"] })) }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsxs(Button, { size: "xs", variant: "ghost", className: "h-6 gap-1 px-2 text-[10.5px] text-muted-foreground hover:text-foreground", onClick: () => onPreviewCommit?.(), disabled: stagedCount === 0, children: [_jsx(HugeiconsIcon, { icon: ViewIcon, size: 12, strokeWidth: 2 }), "Preview"] }), _jsxs(Button, { size: "xs", variant: "ghost", className: "h-6 gap-1 px-2 text-[10.5px] text-muted-foreground hover:text-foreground disabled:opacity-50", disabled: !scm.canGenerateCommitMessage, title: `${scm.generateCommitMessageHint} (${generateShortcut})`, onClick: () => void scm.generateCommitMessage(), children: [scm.actionBusy === "generate-message" ? (_jsx(Spinner, { className: "size-3" })) : (_jsx(HugeiconsIcon, { icon: AiContentGenerator02Icon, size: 12, strokeWidth: 2 })), "AI Message"] })] })] }), _jsxs("div", { className: "flex min-w-0 items-center gap-1.5 text-[10.5px] text-muted-foreground", children: [_jsx("span", { className: cn("size-1.5 shrink-0 rounded-full transition-colors", canCommit
270
+ ? "bg-foreground/80"
271
+ : stagedCount > 0
272
+ ? "bg-muted-foreground/60"
273
+ : "bg-muted-foreground/30") }), _jsx("span", { className: "truncate font-medium text-foreground/85", children: stagedCount === 0
274
+ ? "Nothing staged"
275
+ : `${stagedCount} ${stagedCount === 1 ? "file" : "files"} staged` }), _jsx("span", { className: "ml-auto shrink-0 truncate text-muted-foreground/65", children: pushStatusLabel })] }), _jsx("div", { className: "flex w-full", children: _jsx(Button, { size: "xs", className: "h-7 w-full cursor-pointer text-[11.5px] font-semibold tracking-tight shadow-sm disabled:cursor-not-allowed disabled:shadow-none", disabled: !canCommit, title: commitHint, onClick: () => void scm.commit(), children: scm.actionBusy === "commit" ? "Committing…" : "Commit" }) }), _jsx(CommitFeedback, { feedback: footerFeedback })] }), scm.allClean ? (_jsx(CleanTreeHint, { repoLabel: repoLabel })) : (_jsx("div", { ref: containerRef, tabIndex: 0, role: "listbox", "aria-label": "Changed files", "aria-activedescendant": focusedRowKey ? `scm-row-${focusedRowKey}` : undefined, onKeyDown: handlePanelKeyDown, className: "relative min-h-0 flex-1 outline-none focus-visible:ring-1 focus-visible:ring-primary/30", children: _jsx("div", { ref: scrollRef, className: "h-full overflow-y-auto overflow-x-hidden [scrollbar-gutter:stable]", children: _jsx("div", { style: {
276
+ height: virtualizer.getTotalSize(),
277
+ position: "relative",
278
+ width: "100%",
279
+ }, children: virtualizer.getVirtualItems().map((virtualRow) => {
280
+ const row = rows[virtualRow.index];
281
+ if (!row)
282
+ return null;
283
+ return (_jsx("div", { "data-index": virtualRow.index, ref: virtualizer.measureElement, style: {
284
+ position: "absolute",
285
+ top: 0,
286
+ left: 0,
287
+ width: "100%",
288
+ height: virtualRow.size,
289
+ transform: `translateY(${virtualRow.start}px)`,
290
+ }, children: _jsx(RowRenderer, { row: row, focused: focusedRowKey === row.key, selectedPath: scm.selected?.path ?? null, actionBusy: scm.actionBusy, headerCheckState: scm.headerCheckState, repoRoot: scm.repo?.repoRoot ?? null, onFocusRow: setFocusedRowKey, onToggleAll: scm.toggleAll, onSelectFile: scm.selectFile, onToggleStageFile: scm.toggleStageFile, onDiscardFile: scm.requestDiscardFile, onStageHunk: scm.stageHunk, onDiscardHunk: scm.discardHunk, onOpenFile: onOpenFile }) }, virtualRow.key));
291
+ }) }) }) })), scm.stashes && scm.stashes.length > 0 ? (_jsx(StashSection, { stashes: scm.stashes, busy: scm.actionBusy === "stash", onPop: scm.stashPop, onApply: scm.stashApply, onDrop: scm.stashDrop })) : null] })) : null] }), _jsx(AlertDialog, { open: scm.pendingDiscard !== null, onOpenChange: (o) => {
292
+ if (!o)
293
+ scm.cancelPendingDiscard();
294
+ }, children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Discard changes?" }), _jsx(AlertDialogDescription, { children: scm.pendingDiscard?.scope === "all"
295
+ ? `This will discard ${scm.pendingDiscard.label} and cannot be undone.`
296
+ : scm.pendingDiscard
297
+ ? `Discard changes in "${scm.pendingDiscard.label}"? This cannot be undone.`
298
+ : null })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { onClick: () => scm.cancelPendingDiscard(), children: "Cancel" }), _jsx(AlertDialogAction, { onClick: () => void scm.confirmPendingDiscard(), children: "Discard" })] })] }) })] }));
299
+ });
300
+ //# sourceMappingURL=SourceControlPanel.js.map