@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.
- package/LICENSE +201 -0
- package/dist/ai/AgentStatusPill.d.ts +13 -0
- package/dist/ai/AgentStatusPill.d.ts.map +1 -0
- package/dist/ai/AgentStatusPill.js +28 -0
- package/dist/ai/AgentStatusPill.js.map +1 -0
- package/dist/ai/AiToolApproval.d.ts +12 -0
- package/dist/ai/AiToolApproval.d.ts.map +1 -0
- package/dist/ai/AiToolApproval.js +63 -0
- package/dist/ai/AiToolApproval.js.map +1 -0
- package/dist/ai/Chip.d.ts +17 -0
- package/dist/ai/Chip.d.ts.map +1 -0
- package/dist/ai/Chip.js +39 -0
- package/dist/ai/Chip.js.map +1 -0
- package/dist/ai/ChipsRow.d.ts +35 -0
- package/dist/ai/ChipsRow.d.ts.map +1 -0
- package/dist/ai/ChipsRow.js +32 -0
- package/dist/ai/ChipsRow.js.map +1 -0
- package/dist/ai/TodoStrip.d.ts +11 -0
- package/dist/ai/TodoStrip.d.ts.map +1 -0
- package/dist/ai/TodoStrip.js +27 -0
- package/dist/ai/TodoStrip.js.map +1 -0
- package/dist/ai/index.d.ts +6 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +6 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/command-palette/CommandPaletteDialog.d.ts +19 -0
- package/dist/command-palette/CommandPaletteDialog.d.ts.map +1 -0
- package/dist/command-palette/CommandPaletteDialog.js +23 -0
- package/dist/command-palette/CommandPaletteDialog.js.map +1 -0
- package/dist/command-palette/index.d.ts +2 -0
- package/dist/command-palette/index.d.ts.map +1 -0
- package/dist/command-palette/index.js +2 -0
- package/dist/command-palette/index.js.map +1 -0
- package/dist/explorer/ExplorerSearch.d.ts +35 -0
- package/dist/explorer/ExplorerSearch.d.ts.map +1 -0
- package/dist/explorer/ExplorerSearch.js +153 -0
- package/dist/explorer/ExplorerSearch.js.map +1 -0
- package/dist/explorer/FileTree.d.ts +65 -0
- package/dist/explorer/FileTree.d.ts.map +1 -0
- package/dist/explorer/FileTree.js +205 -0
- package/dist/explorer/FileTree.js.map +1 -0
- package/dist/explorer/InlineInput.d.ts +14 -0
- package/dist/explorer/InlineInput.d.ts.map +1 -0
- package/dist/explorer/InlineInput.js +77 -0
- package/dist/explorer/InlineInput.js.map +1 -0
- package/dist/explorer/TreeRow.d.ts +64 -0
- package/dist/explorer/TreeRow.d.ts.map +1 -0
- package/dist/explorer/TreeRow.js +100 -0
- package/dist/explorer/TreeRow.js.map +1 -0
- package/dist/explorer/constants.d.ts +12 -0
- package/dist/explorer/constants.d.ts.map +1 -0
- package/dist/explorer/constants.js +72 -0
- package/dist/explorer/constants.js.map +1 -0
- package/dist/explorer/contextActions.d.ts +5 -0
- package/dist/explorer/contextActions.d.ts.map +1 -0
- package/dist/explorer/contextActions.js +38 -0
- package/dist/explorer/contextActions.js.map +1 -0
- package/dist/explorer/iconMap.json +1 -0
- package/dist/explorer/iconResolver.d.ts +3 -0
- package/dist/explorer/iconResolver.d.ts.map +1 -0
- package/dist/explorer/iconResolver.js +98 -0
- package/dist/explorer/iconResolver.js.map +1 -0
- package/dist/explorer/index.d.ts +8 -0
- package/dist/explorer/index.d.ts.map +1 -0
- package/dist/explorer/index.js +8 -0
- package/dist/explorer/index.js.map +1 -0
- package/dist/explorer/menuItemClass.d.ts +3 -0
- package/dist/explorer/menuItemClass.d.ts.map +1 -0
- package/dist/explorer/menuItemClass.js +6 -0
- package/dist/explorer/menuItemClass.js.map +1 -0
- package/dist/explorer/types.d.ts +2 -0
- package/dist/explorer/types.d.ts.map +1 -0
- package/dist/explorer/types.js +2 -0
- package/dist/explorer/types.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/PaneChip.d.ts +13 -0
- package/dist/layout/PaneChip.d.ts.map +1 -0
- package/dist/layout/PaneChip.js +19 -0
- package/dist/layout/PaneChip.js.map +1 -0
- package/dist/layout/TabBar.d.ts +36 -0
- package/dist/layout/TabBar.d.ts.map +1 -0
- package/dist/layout/TabBar.js +237 -0
- package/dist/layout/TabBar.js.map +1 -0
- package/dist/layout/TabItem.d.ts +19 -0
- package/dist/layout/TabItem.d.ts.map +1 -0
- package/dist/layout/TabItem.js +66 -0
- package/dist/layout/TabItem.js.map +1 -0
- package/dist/layout/index.d.ts +7 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +7 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/layout/leafState.d.ts +15 -0
- package/dist/layout/leafState.d.ts.map +1 -0
- package/dist/layout/leafState.js +70 -0
- package/dist/layout/leafState.js.map +1 -0
- package/dist/layout/resizable.d.ts +31 -0
- package/dist/layout/resizable.d.ts.map +1 -0
- package/dist/layout/resizable.js +16 -0
- package/dist/layout/resizable.js.map +1 -0
- package/dist/layout/tabLabel.d.ts +9 -0
- package/dist/layout/tabLabel.d.ts.map +1 -0
- package/dist/layout/tabLabel.js +31 -0
- package/dist/layout/tabLabel.js.map +1 -0
- package/dist/primitives/alert-dialog.d.ts +19 -0
- package/dist/primitives/alert-dialog.d.ts.map +1 -0
- package/dist/primitives/alert-dialog.js +42 -0
- package/dist/primitives/alert-dialog.js.map +1 -0
- package/dist/primitives/alert.d.ts +11 -0
- package/dist/primitives/alert.d.ts.map +1 -0
- package/dist/primitives/alert.js +28 -0
- package/dist/primitives/alert.js.map +1 -0
- package/dist/primitives/badge.d.ts +10 -0
- package/dist/primitives/badge.d.ts.map +1 -0
- package/dist/primitives/badge.js +25 -0
- package/dist/primitives/badge.js.map +1 -0
- package/dist/primitives/breadcrumb.d.ts +12 -0
- package/dist/primitives/breadcrumb.d.ts.map +1 -0
- package/dist/primitives/breadcrumb.js +29 -0
- package/dist/primitives/breadcrumb.js.map +1 -0
- package/dist/primitives/button-group.d.ts +12 -0
- package/dist/primitives/button-group.d.ts.map +1 -0
- package/dist/primitives/button-group.js +28 -0
- package/dist/primitives/button-group.js.map +1 -0
- package/dist/primitives/button.d.ts +11 -0
- package/dist/primitives/button.d.ts.map +1 -0
- package/dist/primitives/button.js +36 -0
- package/dist/primitives/button.js.map +1 -0
- package/dist/primitives/card.d.ts +12 -0
- package/dist/primitives/card.d.ts.map +1 -0
- package/dist/primitives/card.js +25 -0
- package/dist/primitives/card.js.map +1 -0
- package/dist/primitives/checkbox.d.ts +5 -0
- package/dist/primitives/checkbox.d.ts.map +1 -0
- package/dist/primitives/checkbox.js +10 -0
- package/dist/primitives/checkbox.js.map +1 -0
- package/dist/primitives/collapsible.d.ts +6 -0
- package/dist/primitives/collapsible.d.ts.map +1 -0
- package/dist/primitives/collapsible.js +13 -0
- package/dist/primitives/collapsible.js.map +1 -0
- package/dist/primitives/command.d.ts +36 -0
- package/dist/primitives/command.d.ts.map +1 -0
- package/dist/primitives/command.js +103 -0
- package/dist/primitives/command.js.map +1 -0
- package/dist/primitives/context-menu.d.ts +41 -0
- package/dist/primitives/context-menu.d.ts.map +1 -0
- package/dist/primitives/context-menu.js +83 -0
- package/dist/primitives/context-menu.js.map +1 -0
- package/dist/primitives/dialog.d.ts +18 -0
- package/dist/primitives/dialog.d.ts.map +1 -0
- package/dist/primitives/dialog.js +38 -0
- package/dist/primitives/dialog.js.map +1 -0
- package/dist/primitives/dropdown-menu.d.ts +30 -0
- package/dist/primitives/dropdown-menu.d.ts.map +1 -0
- package/dist/primitives/dropdown-menu.js +52 -0
- package/dist/primitives/dropdown-menu.js.map +1 -0
- package/dist/primitives/empty.d.ts +12 -0
- package/dist/primitives/empty.d.ts.map +1 -0
- package/dist/primitives/empty.js +34 -0
- package/dist/primitives/empty.js.map +1 -0
- package/dist/primitives/hover-card.d.ts +7 -0
- package/dist/primitives/hover-card.d.ts.map +1 -0
- package/dist/primitives/hover-card.js +14 -0
- package/dist/primitives/hover-card.js.map +1 -0
- package/dist/primitives/index.d.ts +40 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +40 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/input-group.d.ts +17 -0
- package/dist/primitives/input-group.d.ts.map +1 -0
- package/dist/primitives/input-group.js +59 -0
- package/dist/primitives/input-group.js.map +1 -0
- package/dist/primitives/input.d.ts +4 -0
- package/dist/primitives/input.d.ts.map +1 -0
- package/dist/primitives/input.js +7 -0
- package/dist/primitives/input.js.map +1 -0
- package/dist/primitives/item.d.ts +24 -0
- package/dist/primitives/item.d.ts.map +1 -0
- package/dist/primitives/item.js +68 -0
- package/dist/primitives/item.js.map +1 -0
- package/dist/primitives/kbd.d.ts +4 -0
- package/dist/primitives/kbd.d.ts.map +1 -0
- package/dist/primitives/kbd.js +10 -0
- package/dist/primitives/kbd.js.map +1 -0
- package/dist/primitives/label.d.ts +5 -0
- package/dist/primitives/label.d.ts.map +1 -0
- package/dist/primitives/label.js +8 -0
- package/dist/primitives/label.js.map +1 -0
- package/dist/primitives/menubar.d.ts +31 -0
- package/dist/primitives/menubar.d.ts.map +1 -0
- package/dist/primitives/menubar.js +55 -0
- package/dist/primitives/menubar.js.map +1 -0
- package/dist/primitives/popover.d.ts +11 -0
- package/dist/primitives/popover.d.ts.map +1 -0
- package/dist/primitives/popover.js +27 -0
- package/dist/primitives/popover.js.map +1 -0
- package/dist/primitives/progress.d.ts +5 -0
- package/dist/primitives/progress.d.ts.map +1 -0
- package/dist/primitives/progress.js +8 -0
- package/dist/primitives/progress.js.map +1 -0
- package/dist/primitives/radio-group.d.ts +6 -0
- package/dist/primitives/radio-group.d.ts.map +1 -0
- package/dist/primitives/radio-group.js +11 -0
- package/dist/primitives/radio-group.js.map +1 -0
- package/dist/primitives/resizable.d.ts +31 -0
- package/dist/primitives/resizable.d.ts.map +1 -0
- package/dist/primitives/resizable.js +16 -0
- package/dist/primitives/resizable.js.map +1 -0
- package/dist/primitives/scroll-area.d.ts +6 -0
- package/dist/primitives/scroll-area.d.ts.map +1 -0
- package/dist/primitives/scroll-area.js +11 -0
- package/dist/primitives/scroll-area.js.map +1 -0
- package/dist/primitives/select.d.ts +16 -0
- package/dist/primitives/select.d.ts.map +1 -0
- package/dist/primitives/select.js +37 -0
- package/dist/primitives/select.js.map +1 -0
- package/dist/primitives/separator.d.ts +5 -0
- package/dist/primitives/separator.d.ts.map +1 -0
- package/dist/primitives/separator.js +8 -0
- package/dist/primitives/separator.js.map +1 -0
- package/dist/primitives/sheet.d.ts +15 -0
- package/dist/primitives/sheet.d.ts.map +1 -0
- package/dist/primitives/sheet.js +38 -0
- package/dist/primitives/sheet.js.map +1 -0
- package/dist/primitives/skeleton.d.ts +3 -0
- package/dist/primitives/skeleton.d.ts.map +1 -0
- package/dist/primitives/skeleton.js +7 -0
- package/dist/primitives/skeleton.js.map +1 -0
- package/dist/primitives/slider.d.ts +5 -0
- package/dist/primitives/slider.d.ts.map +1 -0
- package/dist/primitives/slider.js +14 -0
- package/dist/primitives/slider.js.map +1 -0
- package/dist/primitives/sonner.d.ts +5 -0
- package/dist/primitives/sonner.d.ts.map +1 -0
- package/dist/primitives/sonner.js +12 -0
- package/dist/primitives/sonner.js.map +1 -0
- package/dist/primitives/spinner.d.ts +3 -0
- package/dist/primitives/spinner.d.ts.map +1 -0
- package/dist/primitives/spinner.js +11 -0
- package/dist/primitives/spinner.js.map +1 -0
- package/dist/primitives/switch.d.ts +7 -0
- package/dist/primitives/switch.d.ts.map +1 -0
- package/dist/primitives/switch.js +18 -0
- package/dist/primitives/switch.js.map +1 -0
- package/dist/primitives/tabs.d.ts +12 -0
- package/dist/primitives/tabs.d.ts.map +1 -0
- package/dist/primitives/tabs.js +29 -0
- package/dist/primitives/tabs.js.map +1 -0
- package/dist/primitives/textarea.d.ts +4 -0
- package/dist/primitives/textarea.d.ts.map +1 -0
- package/dist/primitives/textarea.js +7 -0
- package/dist/primitives/textarea.js.map +1 -0
- package/dist/primitives/toggle-group.d.ts +11 -0
- package/dist/primitives/toggle-group.d.ts.map +1 -0
- package/dist/primitives/toggle-group.js +24 -0
- package/dist/primitives/toggle-group.js.map +1 -0
- package/dist/primitives/toggle.d.ts +10 -0
- package/dist/primitives/toggle.d.ts.map +1 -0
- package/dist/primitives/toggle.js +26 -0
- package/dist/primitives/toggle.js.map +1 -0
- package/dist/primitives/tooltip.d.ts +8 -0
- package/dist/primitives/tooltip.d.ts.map +1 -0
- package/dist/primitives/tooltip.js +18 -0
- package/dist/primitives/tooltip.js.map +1 -0
- package/dist/settings/SettingGroup.d.ts +8 -0
- package/dist/settings/SettingGroup.d.ts.map +1 -0
- package/dist/settings/SettingGroup.js +7 -0
- package/dist/settings/SettingGroup.js.map +1 -0
- package/dist/settings/SettingRow.d.ts +58 -0
- package/dist/settings/SettingRow.d.ts.map +1 -0
- package/dist/settings/SettingRow.js +54 -0
- package/dist/settings/SettingRow.js.map +1 -0
- package/dist/settings/SettingsFormBuilder.d.ts +11 -0
- package/dist/settings/SettingsFormBuilder.d.ts.map +1 -0
- package/dist/settings/SettingsFormBuilder.js +43 -0
- package/dist/settings/SettingsFormBuilder.js.map +1 -0
- package/dist/settings/index.d.ts +4 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +4 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/shell/HeaderBar.d.ts +10 -0
- package/dist/shell/HeaderBar.d.ts.map +1 -0
- package/dist/shell/HeaderBar.js +6 -0
- package/dist/shell/HeaderBar.js.map +1 -0
- package/dist/shell/StatusBar.d.ts +9 -0
- package/dist/shell/StatusBar.d.ts.map +1 -0
- package/dist/shell/StatusBar.js +6 -0
- package/dist/shell/StatusBar.js.map +1 -0
- package/dist/shell/index.d.ts +3 -0
- package/dist/shell/index.d.ts.map +1 -0
- package/dist/shell/index.js +3 -0
- package/dist/shell/index.js.map +1 -0
- package/dist/source-control/BranchSwitcher.d.ts +14 -0
- package/dist/source-control/BranchSwitcher.d.ts.map +1 -0
- package/dist/source-control/BranchSwitcher.js +10 -0
- package/dist/source-control/BranchSwitcher.js.map +1 -0
- package/dist/source-control/CommitRow.d.ts +15 -0
- package/dist/source-control/CommitRow.d.ts.map +1 -0
- package/dist/source-control/CommitRow.js +20 -0
- package/dist/source-control/CommitRow.js.map +1 -0
- package/dist/source-control/EntryRow.d.ts +25 -0
- package/dist/source-control/EntryRow.d.ts.map +1 -0
- package/dist/source-control/EntryRow.js +67 -0
- package/dist/source-control/EntryRow.js.map +1 -0
- package/dist/source-control/GraphRail.d.ts +14 -0
- package/dist/source-control/GraphRail.d.ts.map +1 -0
- package/dist/source-control/GraphRail.js +49 -0
- package/dist/source-control/GraphRail.js.map +1 -0
- package/dist/source-control/InlineHunkView.d.ts +22 -0
- package/dist/source-control/InlineHunkView.d.ts.map +1 -0
- package/dist/source-control/InlineHunkView.js +95 -0
- package/dist/source-control/InlineHunkView.js.map +1 -0
- package/dist/source-control/SourceControlActions.d.ts +15 -0
- package/dist/source-control/SourceControlActions.d.ts.map +1 -0
- package/dist/source-control/SourceControlActions.js +38 -0
- package/dist/source-control/SourceControlActions.js.map +1 -0
- package/dist/source-control/SourceControlPanel.d.ts +21 -0
- package/dist/source-control/SourceControlPanel.d.ts.map +1 -0
- package/dist/source-control/SourceControlPanel.js +300 -0
- package/dist/source-control/SourceControlPanel.js.map +1 -0
- package/dist/source-control/SourceControlStatusViews.d.ts +20 -0
- package/dist/source-control/SourceControlStatusViews.d.ts.map +1 -0
- package/dist/source-control/SourceControlStatusViews.js +18 -0
- package/dist/source-control/SourceControlStatusViews.js.map +1 -0
- package/dist/source-control/StashSection.d.ts +13 -0
- package/dist/source-control/StashSection.d.ts.map +1 -0
- package/dist/source-control/StashSection.js +14 -0
- package/dist/source-control/StashSection.js.map +1 -0
- package/dist/source-control/highlight.d.ts +8 -0
- package/dist/source-control/highlight.d.ts.map +1 -0
- package/dist/source-control/highlight.js +15 -0
- package/dist/source-control/highlight.js.map +1 -0
- package/dist/source-control/index.d.ts +12 -0
- package/dist/source-control/index.d.ts.map +1 -0
- package/dist/source-control/index.js +12 -0
- package/dist/source-control/index.js.map +1 -0
- package/dist/source-control/sourceControlHelpers.d.ts +27 -0
- package/dist/source-control/sourceControlHelpers.d.ts.map +1 -0
- package/dist/source-control/sourceControlHelpers.js +51 -0
- package/dist/source-control/sourceControlHelpers.js.map +1 -0
- package/dist/utils/cn.d.ts +3 -0
- package/dist/utils/cn.d.ts.map +1 -0
- package/dist/utils/cn.js +6 -0
- package/dist/utils/cn.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/isTauri.d.ts +2 -0
- package/dist/utils/isTauri.d.ts.map +1 -0
- package/dist/utils/isTauri.js +2 -0
- package/dist/utils/isTauri.js.map +1 -0
- package/dist/utils/mockCore.d.ts +6 -0
- package/dist/utils/mockCore.d.ts.map +1 -0
- package/dist/utils/mockCore.js +3 -0
- package/dist/utils/mockCore.js.map +1 -0
- package/dist/utils/mockFs.d.ts +10 -0
- package/dist/utils/mockFs.d.ts.map +1 -0
- package/dist/utils/mockFs.js +10 -0
- package/dist/utils/mockFs.js.map +1 -0
- package/dist/utils/mockSettings.d.ts +3 -0
- package/dist/utils/mockSettings.d.ts.map +1 -0
- package/dist/utils/mockSettings.js +3 -0
- package/dist/utils/mockSettings.js.map +1 -0
- package/dist/utils/mockShortcuts.d.ts +2 -0
- package/dist/utils/mockShortcuts.d.ts.map +1 -0
- package/dist/utils/mockShortcuts.js +2 -0
- package/dist/utils/mockShortcuts.js.map +1 -0
- package/dist/utils/mockSpaces.d.ts +4 -0
- package/dist/utils/mockSpaces.d.ts.map +1 -0
- package/dist/utils/mockSpaces.js +2 -0
- package/dist/utils/mockSpaces.js.map +1 -0
- package/dist/utils/mockTauri.d.ts +5 -0
- package/dist/utils/mockTauri.d.ts.map +1 -0
- package/dist/utils/mockTauri.js +3 -0
- package/dist/utils/mockTauri.js.map +1 -0
- package/dist/utils/mockWorkspace.d.ts +2 -0
- package/dist/utils/mockWorkspace.d.ts.map +1 -0
- package/dist/utils/mockWorkspace.js +2 -0
- package/dist/utils/mockWorkspace.js.map +1 -0
- package/dist/utils/platform.d.ts +5 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +8 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/shellQuote.d.ts +2 -0
- package/dist/utils/shellQuote.d.ts.map +1 -0
- package/dist/utils/shellQuote.js +7 -0
- package/dist/utils/shellQuote.js.map +1 -0
- 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
|