@akiojin/gwt 2.0.0 → 2.0.3
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/dist/claude-history.d.ts +60 -0
- package/dist/claude-history.d.ts.map +1 -0
- package/dist/claude-history.js +606 -0
- package/dist/claude-history.js.map +1 -0
- package/dist/claude.d.ts +12 -0
- package/dist/claude.d.ts.map +1 -0
- package/dist/claude.js +222 -0
- package/dist/claude.js.map +1 -0
- package/dist/cli/ui/components/App.d.ts +22 -0
- package/dist/cli/ui/components/App.d.ts.map +1 -0
- package/dist/cli/ui/components/App.js +557 -0
- package/dist/cli/ui/components/App.js.map +1 -0
- package/dist/cli/ui/components/common/Confirm.d.ts +13 -0
- package/dist/cli/ui/components/common/Confirm.d.ts.map +1 -0
- package/dist/cli/ui/components/common/Confirm.js +20 -0
- package/dist/cli/ui/components/common/Confirm.js.map +1 -0
- package/dist/cli/ui/components/common/ErrorBoundary.d.ts +23 -0
- package/dist/cli/ui/components/common/ErrorBoundary.d.ts.map +1 -0
- package/dist/cli/ui/components/common/ErrorBoundary.js +37 -0
- package/dist/cli/ui/components/common/ErrorBoundary.js.map +1 -0
- package/dist/cli/ui/components/common/Input.d.ts +14 -0
- package/dist/cli/ui/components/common/Input.d.ts.map +1 -0
- package/dist/cli/ui/components/common/Input.js +14 -0
- package/dist/cli/ui/components/common/Input.js.map +1 -0
- package/dist/cli/ui/components/common/LoadingIndicator.d.ts +19 -0
- package/dist/cli/ui/components/common/LoadingIndicator.d.ts.map +1 -0
- package/dist/cli/ui/components/common/LoadingIndicator.js +61 -0
- package/dist/cli/ui/components/common/LoadingIndicator.js.map +1 -0
- package/dist/cli/ui/components/common/Select.d.ts +30 -0
- package/dist/cli/ui/components/common/Select.d.ts.map +1 -0
- package/dist/cli/ui/components/common/Select.js +140 -0
- package/dist/cli/ui/components/common/Select.js.map +1 -0
- package/dist/cli/ui/components/parts/Footer.d.ts +15 -0
- package/dist/cli/ui/components/parts/Footer.d.ts.map +1 -0
- package/dist/cli/ui/components/parts/Footer.js +20 -0
- package/dist/cli/ui/components/parts/Footer.js.map +1 -0
- package/dist/cli/ui/components/parts/Header.d.ts +29 -0
- package/dist/cli/ui/components/parts/Header.d.ts.map +1 -0
- package/dist/cli/ui/components/parts/Header.js +19 -0
- package/dist/cli/ui/components/parts/Header.js.map +1 -0
- package/dist/cli/ui/components/parts/MergeStatusList.d.ts +13 -0
- package/dist/cli/ui/components/parts/MergeStatusList.d.ts.map +1 -0
- package/dist/cli/ui/components/parts/MergeStatusList.js +52 -0
- package/dist/cli/ui/components/parts/MergeStatusList.js.map +1 -0
- package/dist/cli/ui/components/parts/ProgressBar.d.ts +13 -0
- package/dist/cli/ui/components/parts/ProgressBar.d.ts.map +1 -0
- package/dist/cli/ui/components/parts/ProgressBar.js +53 -0
- package/dist/cli/ui/components/parts/ProgressBar.js.map +1 -0
- package/dist/cli/ui/components/parts/ScrollableList.d.ts +12 -0
- package/dist/cli/ui/components/parts/ScrollableList.d.ts.map +1 -0
- package/dist/cli/ui/components/parts/ScrollableList.js +11 -0
- package/dist/cli/ui/components/parts/ScrollableList.js.map +1 -0
- package/dist/cli/ui/components/parts/Stats.d.ts +13 -0
- package/dist/cli/ui/components/parts/Stats.d.ts.map +1 -0
- package/dist/cli/ui/components/parts/Stats.js +42 -0
- package/dist/cli/ui/components/parts/Stats.js.map +1 -0
- package/dist/cli/ui/components/screens/AIToolSelectorScreen.d.ts +20 -0
- package/dist/cli/ui/components/screens/AIToolSelectorScreen.d.ts.map +1 -0
- package/dist/cli/ui/components/screens/AIToolSelectorScreen.js +77 -0
- package/dist/cli/ui/components/screens/AIToolSelectorScreen.js.map +1 -0
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts +14 -0
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts.map +1 -0
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js +41 -0
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js.map +1 -0
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts +14 -0
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts.map +1 -0
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.js +71 -0
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.js.map +1 -0
- package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts +15 -0
- package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts.map +1 -0
- package/dist/cli/ui/components/screens/BranchCreatorScreen.js +142 -0
- package/dist/cli/ui/components/screens/BranchCreatorScreen.js.map +1 -0
- package/dist/cli/ui/components/screens/BranchListScreen.d.ts +39 -0
- package/dist/cli/ui/components/screens/BranchListScreen.d.ts.map +1 -0
- package/dist/cli/ui/components/screens/BranchListScreen.js +172 -0
- package/dist/cli/ui/components/screens/BranchListScreen.js.map +1 -0
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts +29 -0
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts.map +1 -0
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js +92 -0
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js.map +1 -0
- package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts +23 -0
- package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts.map +1 -0
- package/dist/cli/ui/components/screens/PRCleanupScreen.js +94 -0
- package/dist/cli/ui/components/screens/PRCleanupScreen.js.map +1 -0
- package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts +17 -0
- package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts.map +1 -0
- package/dist/cli/ui/components/screens/SessionSelectorScreen.js +55 -0
- package/dist/cli/ui/components/screens/SessionSelectorScreen.js.map +1 -0
- package/dist/cli/ui/components/screens/WorktreeManagerScreen.d.ts +20 -0
- package/dist/cli/ui/components/screens/WorktreeManagerScreen.d.ts.map +1 -0
- package/dist/cli/ui/components/screens/WorktreeManagerScreen.js +65 -0
- package/dist/cli/ui/components/screens/WorktreeManagerScreen.js.map +1 -0
- package/dist/cli/ui/hooks/useBatchMerge.d.ts +17 -0
- package/dist/cli/ui/hooks/useBatchMerge.d.ts.map +1 -0
- package/dist/cli/ui/hooks/useBatchMerge.js +77 -0
- package/dist/cli/ui/hooks/useBatchMerge.js.map +1 -0
- package/dist/cli/ui/hooks/useGitData.d.ts +20 -0
- package/dist/cli/ui/hooks/useGitData.d.ts.map +1 -0
- package/dist/cli/ui/hooks/useGitData.js +116 -0
- package/dist/cli/ui/hooks/useGitData.js.map +1 -0
- package/dist/cli/ui/hooks/useScreenState.d.ts +12 -0
- package/dist/cli/ui/hooks/useScreenState.d.ts.map +1 -0
- package/dist/cli/ui/hooks/useScreenState.js +30 -0
- package/dist/cli/ui/hooks/useScreenState.js.map +1 -0
- package/dist/cli/ui/hooks/useTerminalSize.d.ts +9 -0
- package/dist/cli/ui/hooks/useTerminalSize.d.ts.map +1 -0
- package/dist/cli/ui/hooks/useTerminalSize.js +24 -0
- package/dist/cli/ui/hooks/useTerminalSize.js.map +1 -0
- package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts +21 -0
- package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/BranchActionSelectorScreen.js +61 -0
- package/dist/cli/ui/screens/BranchActionSelectorScreen.js.map +1 -0
- package/dist/cli/ui/types.d.ts +245 -0
- package/dist/cli/ui/types.d.ts.map +1 -0
- package/dist/cli/ui/types.js +2 -0
- package/dist/cli/ui/types.js.map +1 -0
- package/dist/cli/ui/utils/baseBranch.d.ts +4 -0
- package/dist/cli/ui/utils/baseBranch.d.ts.map +1 -0
- package/dist/cli/ui/utils/baseBranch.js +17 -0
- package/dist/cli/ui/utils/baseBranch.js.map +1 -0
- package/dist/cli/ui/utils/branchFormatter.d.ts +13 -0
- package/dist/cli/ui/utils/branchFormatter.d.ts.map +1 -0
- package/dist/cli/ui/utils/branchFormatter.js +202 -0
- package/dist/cli/ui/utils/branchFormatter.js.map +1 -0
- package/dist/cli/ui/utils/statisticsCalculator.d.ts +9 -0
- package/dist/cli/ui/utils/statisticsCalculator.d.ts.map +1 -0
- package/dist/cli/ui/utils/statisticsCalculator.js +37 -0
- package/dist/cli/ui/utils/statisticsCalculator.js.map +1 -0
- package/dist/client/assets/index-CqaYsI0z.js +81 -0
- package/dist/client/assets/index-Dy3OxWpP.css +32 -0
- package/dist/client/index.html +13 -0
- package/dist/codex.d.ts +12 -0
- package/dist/codex.d.ts.map +1 -0
- package/dist/codex.js +106 -0
- package/dist/codex.js.map +1 -0
- package/dist/config/builtin-tools.d.ts +19 -0
- package/dist/config/builtin-tools.d.ts.map +1 -0
- package/dist/config/builtin-tools.js +40 -0
- package/dist/config/builtin-tools.js.map +1 -0
- package/dist/config/constants.d.ts +74 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +90 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/env-history.d.ts +4 -0
- package/dist/config/env-history.d.ts.map +1 -0
- package/dist/config/env-history.js +34 -0
- package/dist/config/env-history.js.map +1 -0
- package/dist/config/index.d.ts +24 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +144 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/tools.d.ts +40 -0
- package/dist/config/tools.d.ts.map +1 -0
- package/dist/config/tools.js +238 -0
- package/dist/config/tools.js.map +1 -0
- package/dist/git.d.ts +145 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +871 -0
- package/dist/git.js.map +1 -0
- package/dist/github.d.ts +14 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +123 -0
- package/dist/github.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +510 -0
- package/dist/index.js.map +1 -0
- package/dist/launcher.d.ts +30 -0
- package/dist/launcher.d.ts.map +1 -0
- package/dist/launcher.js +116 -0
- package/dist/launcher.js.map +1 -0
- package/dist/repositories/git.repository.d.ts +38 -0
- package/dist/repositories/git.repository.d.ts.map +1 -0
- package/dist/repositories/git.repository.js +117 -0
- package/dist/repositories/git.repository.js.map +1 -0
- package/dist/repositories/github.repository.d.ts +16 -0
- package/dist/repositories/github.repository.d.ts.map +1 -0
- package/dist/repositories/github.repository.js +61 -0
- package/dist/repositories/github.repository.js.map +1 -0
- package/dist/repositories/worktree.repository.d.ts +18 -0
- package/dist/repositories/worktree.repository.d.ts.map +1 -0
- package/dist/repositories/worktree.repository.js +57 -0
- package/dist/repositories/worktree.repository.js.map +1 -0
- package/dist/services/BatchMergeService.d.ts +45 -0
- package/dist/services/BatchMergeService.d.ts.map +1 -0
- package/dist/services/BatchMergeService.js +197 -0
- package/dist/services/BatchMergeService.js.map +1 -0
- package/dist/services/WorktreeOrchestrator.d.ts +37 -0
- package/dist/services/WorktreeOrchestrator.d.ts.map +1 -0
- package/dist/services/WorktreeOrchestrator.js +74 -0
- package/dist/services/WorktreeOrchestrator.js.map +1 -0
- package/dist/services/dependency-installer.d.ts +26 -0
- package/dist/services/dependency-installer.d.ts.map +1 -0
- package/dist/services/dependency-installer.js +139 -0
- package/dist/services/dependency-installer.js.map +1 -0
- package/dist/services/git.service.d.ts +27 -0
- package/dist/services/git.service.d.ts.map +1 -0
- package/dist/services/git.service.js +95 -0
- package/dist/services/git.service.js.map +1 -0
- package/dist/services/github.service.d.ts +14 -0
- package/dist/services/github.service.d.ts.map +1 -0
- package/dist/services/github.service.js +52 -0
- package/dist/services/github.service.js.map +1 -0
- package/dist/services/worktree.service.d.ts +20 -0
- package/dist/services/worktree.service.d.ts.map +1 -0
- package/dist/services/worktree.service.js +52 -0
- package/dist/services/worktree.service.js.map +1 -0
- package/dist/types/api.d.ts +211 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +8 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/tools.d.ts +201 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +8 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/spinner.d.ts +6 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +47 -0
- package/dist/utils/spinner.js.map +1 -0
- package/dist/utils/terminal.d.ts +20 -0
- package/dist/utils/terminal.d.ts.map +1 -0
- package/dist/utils/terminal.js +232 -0
- package/dist/utils/terminal.js.map +1 -0
- package/dist/utils.d.ts +9 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +48 -0
- package/dist/utils.js.map +1 -0
- package/dist/web/client/src/components/BranchGraph.d.ts +8 -0
- package/dist/web/client/src/components/BranchGraph.d.ts.map +1 -0
- package/dist/web/client/src/components/BranchGraph.js +125 -0
- package/dist/web/client/src/components/BranchGraph.js.map +1 -0
- package/dist/web/client/src/components/EnvEditor.d.ts +20 -0
- package/dist/web/client/src/components/EnvEditor.d.ts.map +1 -0
- package/dist/web/client/src/components/EnvEditor.js +65 -0
- package/dist/web/client/src/components/EnvEditor.js.map +1 -0
- package/dist/web/client/src/components/Terminal.d.ts +15 -0
- package/dist/web/client/src/components/Terminal.d.ts.map +1 -0
- package/dist/web/client/src/components/Terminal.js +112 -0
- package/dist/web/client/src/components/Terminal.js.map +1 -0
- package/dist/web/client/src/hooks/useBranches.d.ts +16 -0
- package/dist/web/client/src/hooks/useBranches.d.ts.map +1 -0
- package/dist/web/client/src/hooks/useBranches.js +35 -0
- package/dist/web/client/src/hooks/useBranches.js.map +1 -0
- package/dist/web/client/src/hooks/useConfig.d.ts +13 -0
- package/dist/web/client/src/hooks/useConfig.d.ts.map +1 -0
- package/dist/web/client/src/hooks/useConfig.js +27 -0
- package/dist/web/client/src/hooks/useConfig.js.map +1 -0
- package/dist/web/client/src/hooks/useSessions.d.ts +21 -0
- package/dist/web/client/src/hooks/useSessions.d.ts.map +1 -0
- package/dist/web/client/src/hooks/useSessions.js +49 -0
- package/dist/web/client/src/hooks/useSessions.js.map +1 -0
- package/dist/web/client/src/hooks/useWorktrees.d.ts +17 -0
- package/dist/web/client/src/hooks/useWorktrees.d.ts.map +1 -0
- package/dist/web/client/src/hooks/useWorktrees.js +41 -0
- package/dist/web/client/src/hooks/useWorktrees.js.map +1 -0
- package/dist/web/client/src/lib/api.d.ts +82 -0
- package/dist/web/client/src/lib/api.d.ts.map +1 -0
- package/dist/web/client/src/lib/api.js +147 -0
- package/dist/web/client/src/lib/api.js.map +1 -0
- package/dist/web/client/src/lib/websocket.d.ts +52 -0
- package/dist/web/client/src/lib/websocket.d.ts.map +1 -0
- package/dist/web/client/src/lib/websocket.js +137 -0
- package/dist/web/client/src/lib/websocket.js.map +1 -0
- package/dist/web/client/src/main.d.ts +2 -0
- package/dist/web/client/src/main.d.ts.map +1 -0
- package/dist/web/client/src/main.js +23 -0
- package/dist/web/client/src/main.js.map +1 -0
- package/dist/web/client/src/pages/BranchDetailPage.d.ts +3 -0
- package/dist/web/client/src/pages/BranchDetailPage.d.ts.map +1 -0
- package/dist/web/client/src/pages/BranchDetailPage.js +519 -0
- package/dist/web/client/src/pages/BranchDetailPage.js.map +1 -0
- package/dist/web/client/src/pages/BranchListPage.d.ts +3 -0
- package/dist/web/client/src/pages/BranchListPage.d.ts.map +1 -0
- package/dist/web/client/src/pages/BranchListPage.js +150 -0
- package/dist/web/client/src/pages/BranchListPage.js.map +1 -0
- package/dist/web/client/src/pages/ConfigManagementPage.d.ts +3 -0
- package/dist/web/client/src/pages/ConfigManagementPage.d.ts.map +1 -0
- package/dist/web/client/src/pages/ConfigManagementPage.js +125 -0
- package/dist/web/client/src/pages/ConfigManagementPage.js.map +1 -0
- package/dist/web/client/src/router.d.ts +9 -0
- package/dist/web/client/src/router.d.ts.map +1 -0
- package/dist/web/client/src/router.js +27 -0
- package/dist/web/client/src/router.js.map +1 -0
- package/dist/web/client/vite.config.d.ts +3 -0
- package/dist/web/client/vite.config.d.ts.map +1 -0
- package/dist/web/client/vite.config.js +21 -0
- package/dist/web/client/vite.config.js.map +1 -0
- package/dist/web/server/env/importer.d.ts +3 -0
- package/dist/web/server/env/importer.d.ts.map +1 -0
- package/dist/web/server/env/importer.js +47 -0
- package/dist/web/server/env/importer.js.map +1 -0
- package/dist/web/server/index.d.ts +11 -0
- package/dist/web/server/index.d.ts.map +1 -0
- package/dist/web/server/index.js +62 -0
- package/dist/web/server/index.js.map +1 -0
- package/dist/web/server/pty/manager.d.ts +50 -0
- package/dist/web/server/pty/manager.d.ts.map +1 -0
- package/dist/web/server/pty/manager.js +143 -0
- package/dist/web/server/pty/manager.js.map +1 -0
- package/dist/web/server/routes/branches.d.ts +11 -0
- package/dist/web/server/routes/branches.d.ts.map +1 -0
- package/dist/web/server/routes/branches.js +97 -0
- package/dist/web/server/routes/branches.js.map +1 -0
- package/dist/web/server/routes/config.d.ts +6 -0
- package/dist/web/server/routes/config.d.ts.map +1 -0
- package/dist/web/server/routes/config.js +162 -0
- package/dist/web/server/routes/config.js.map +1 -0
- package/dist/web/server/routes/index.d.ts +13 -0
- package/dist/web/server/routes/index.d.ts.map +1 -0
- package/dist/web/server/routes/index.js +29 -0
- package/dist/web/server/routes/index.js.map +1 -0
- package/dist/web/server/routes/sessions.d.ts +12 -0
- package/dist/web/server/routes/sessions.d.ts.map +1 -0
- package/dist/web/server/routes/sessions.js +95 -0
- package/dist/web/server/routes/sessions.js.map +1 -0
- package/dist/web/server/routes/worktrees.d.ts +11 -0
- package/dist/web/server/routes/worktrees.d.ts.map +1 -0
- package/dist/web/server/routes/worktrees.js +80 -0
- package/dist/web/server/routes/worktrees.js.map +1 -0
- package/dist/web/server/services/branches.d.ts +17 -0
- package/dist/web/server/services/branches.d.ts.map +1 -0
- package/dist/web/server/services/branches.js +262 -0
- package/dist/web/server/services/branches.js.map +1 -0
- package/dist/web/server/services/worktrees.d.ts +24 -0
- package/dist/web/server/services/worktrees.d.ts.map +1 -0
- package/dist/web/server/services/worktrees.js +60 -0
- package/dist/web/server/services/worktrees.js.map +1 -0
- package/dist/web/server/websocket/handler.d.ts +41 -0
- package/dist/web/server/websocket/handler.d.ts.map +1 -0
- package/dist/web/server/websocket/handler.js +143 -0
- package/dist/web/server/websocket/handler.js.map +1 -0
- package/dist/worktree.d.ts +53 -0
- package/dist/worktree.d.ts.map +1 -0
- package/dist/worktree.js +489 -0
- package/dist/worktree.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React, { Component, type ReactNode } from 'react';
|
|
2
|
+
interface ErrorBoundaryProps {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
fallback?: React.ComponentType<{
|
|
5
|
+
error: Error;
|
|
6
|
+
}>;
|
|
7
|
+
}
|
|
8
|
+
interface ErrorBoundaryState {
|
|
9
|
+
hasError: boolean;
|
|
10
|
+
error: Error | null;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Error Boundary component to catch and display errors
|
|
14
|
+
*/
|
|
15
|
+
export declare class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
|
|
16
|
+
constructor(props: ErrorBoundaryProps);
|
|
17
|
+
static getDerivedStateFromError(error: Error): ErrorBoundaryState;
|
|
18
|
+
componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void;
|
|
19
|
+
componentDidUpdate(prevProps: ErrorBoundaryProps): void;
|
|
20
|
+
render(): ReactNode;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=ErrorBoundary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ui/components/common/ErrorBoundary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGzD,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC,CAAC;CAClD;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,SAAS,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;gBACtE,KAAK,EAAE,kBAAkB;IAKrC,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,kBAAkB;IAIjE,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,GAAG,IAAI;IAIjE,kBAAkB,CAAC,SAAS,EAAE,kBAAkB,GAAG,IAAI;IAOvD,MAAM,IAAI,SAAS;CAmBpB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import React, { Component } from 'react';
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
/**
|
|
4
|
+
* Error Boundary component to catch and display errors
|
|
5
|
+
*/
|
|
6
|
+
export class ErrorBoundary extends Component {
|
|
7
|
+
constructor(props) {
|
|
8
|
+
super(props);
|
|
9
|
+
this.state = { hasError: false, error: null };
|
|
10
|
+
}
|
|
11
|
+
static getDerivedStateFromError(error) {
|
|
12
|
+
return { hasError: true, error };
|
|
13
|
+
}
|
|
14
|
+
componentDidCatch(error, errorInfo) {
|
|
15
|
+
console.error('ErrorBoundary caught an error:', error, errorInfo);
|
|
16
|
+
}
|
|
17
|
+
componentDidUpdate(prevProps) {
|
|
18
|
+
// Reset error state when children change
|
|
19
|
+
if (this.state.hasError && prevProps.children !== this.props.children) {
|
|
20
|
+
this.setState({ hasError: false, error: null });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
render() {
|
|
24
|
+
if (this.state.hasError && this.state.error) {
|
|
25
|
+
const { fallback: Fallback } = this.props;
|
|
26
|
+
if (Fallback) {
|
|
27
|
+
return React.createElement(Fallback, { error: this.state.error });
|
|
28
|
+
}
|
|
29
|
+
return (React.createElement(Box, { flexDirection: "column", padding: 1 },
|
|
30
|
+
React.createElement(Text, { color: "red", bold: true },
|
|
31
|
+
"Error: ",
|
|
32
|
+
this.state.error.message || 'Unknown error')));
|
|
33
|
+
}
|
|
34
|
+
return this.props.children;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=ErrorBoundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../../../../src/cli/ui/components/common/ErrorBoundary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAYhC;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,SAAiD;IAClF,YAAY,KAAyB;QACnC,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,wBAAwB,CAAC,KAAY;QAC1C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;IAED,iBAAiB,CAAC,KAAY,EAAE,SAA0B;QACxD,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACpE,CAAC;IAED,kBAAkB,CAAC,SAA6B;QAC9C,yCAAyC;QACzC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACtE,IAAI,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAC5C,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YAE1C,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,oBAAC,QAAQ,IAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAI,CAAC;YAC/C,CAAC;YAED,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC;gBACpC,oBAAC,IAAI,IAAC,KAAK,EAAC,KAAK,EAAC,IAAI;;oBACZ,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,eAAe,CAC9C,CACH,CACP,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface InputProps {
|
|
3
|
+
value: string;
|
|
4
|
+
onChange: (value: string) => void;
|
|
5
|
+
onSubmit: (value: string) => void;
|
|
6
|
+
placeholder?: string;
|
|
7
|
+
label?: string;
|
|
8
|
+
mask?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Input component - wrapper around ink-text-input with optional label
|
|
12
|
+
*/
|
|
13
|
+
export declare function Input({ value, onChange, onSubmit, placeholder, label, mask }: InputProps): React.JSX.Element;
|
|
14
|
+
//# sourceMappingURL=Input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ui/components/common/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,UAAU,qBAmBxF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import TextInput from 'ink-text-input';
|
|
4
|
+
/**
|
|
5
|
+
* Input component - wrapper around ink-text-input with optional label
|
|
6
|
+
*/
|
|
7
|
+
export function Input({ value, onChange, onSubmit, placeholder, label, mask }) {
|
|
8
|
+
return (React.createElement(Box, { flexDirection: "column" },
|
|
9
|
+
label && (React.createElement(Box, { marginBottom: 0 },
|
|
10
|
+
React.createElement(Text, null, label))),
|
|
11
|
+
React.createElement(Box, null,
|
|
12
|
+
React.createElement(TextInput, { value: value, onChange: onChange, onSubmit: onSubmit, ...(placeholder !== undefined && { placeholder }), ...(mask !== undefined && { mask }) }))));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=Input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Input.js","sourceRoot":"","sources":["../../../../../src/cli/ui/components/common/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAWvC;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAc;IACvF,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QACxB,KAAK,IAAI,CACR,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC;YAClB,oBAAC,IAAI,QAAE,KAAK,CAAQ,CAChB,CACP;QACD,oBAAC,GAAG;YACF,oBAAC,SAAS,IACR,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,KACd,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,CAAC,KAC9C,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC,GACpC,CACE,CACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface LoadingIndicatorProps {
|
|
3
|
+
/** true にするとローディング表示を開始する */
|
|
4
|
+
isLoading: boolean;
|
|
5
|
+
/** 表示までの遅延時間 (ms)。デフォルトは 300ms */
|
|
6
|
+
delay?: number;
|
|
7
|
+
/** 表示するメッセージ */
|
|
8
|
+
message?: string;
|
|
9
|
+
/** スピナーの更新間隔 (ms)。デフォルトは 80ms */
|
|
10
|
+
interval?: number;
|
|
11
|
+
/** 使用するスピナーフレーム。ASCII のみを想定 */
|
|
12
|
+
frames?: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* ローディング中に簡易スピナーとメッセージを表示するコンポーネント。
|
|
16
|
+
* delay で指定した時間を超えるまでスピナーを表示しないことで、短時間の処理ではちらつきを抑える。
|
|
17
|
+
*/
|
|
18
|
+
export declare function LoadingIndicator({ isLoading, delay, message, interval, frames, }: LoadingIndicatorProps): React.JSX.Element | null;
|
|
19
|
+
//# sourceMappingURL=LoadingIndicator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoadingIndicator.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ui/components/common/LoadingIndicator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAC;AAGpE,MAAM,WAAW,qBAAqB;IACpC,6BAA6B;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,KAAW,EACX,OAAkC,EAClC,QAAa,EACb,MAAuB,GACxB,EAAE,qBAAqB,4BAkEvB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import React, { useEffect, useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
const DEFAULT_FRAMES = ['|', '/', '-', '\\'];
|
|
4
|
+
/**
|
|
5
|
+
* ローディング中に簡易スピナーとメッセージを表示するコンポーネント。
|
|
6
|
+
* delay で指定した時間を超えるまでスピナーを表示しないことで、短時間の処理ではちらつきを抑える。
|
|
7
|
+
*/
|
|
8
|
+
export function LoadingIndicator({ isLoading, delay = 300, message = 'Loading... please wait', interval = 80, frames = DEFAULT_FRAMES, }) {
|
|
9
|
+
const [visible, setVisible] = useState(false);
|
|
10
|
+
const [frameIndex, setFrameIndex] = useState(0);
|
|
11
|
+
const delayTimerRef = useRef(null);
|
|
12
|
+
const intervalRef = useRef(null);
|
|
13
|
+
// スピナーに使用するフレームをキャッシュ
|
|
14
|
+
const safeFrames = useMemo(() => (frames.length > 0 ? frames : DEFAULT_FRAMES), [frames]);
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
// ローディングが開始したら、delay後に表示を有効化
|
|
17
|
+
if (isLoading) {
|
|
18
|
+
delayTimerRef.current = setTimeout(() => {
|
|
19
|
+
setVisible(true);
|
|
20
|
+
}, delay);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
setVisible(false);
|
|
24
|
+
setFrameIndex(0);
|
|
25
|
+
}
|
|
26
|
+
return () => {
|
|
27
|
+
if (delayTimerRef.current) {
|
|
28
|
+
clearTimeout(delayTimerRef.current);
|
|
29
|
+
delayTimerRef.current = null;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}, [isLoading, delay]);
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
// 表示中のみスピナーを回転
|
|
35
|
+
if (visible && isLoading) {
|
|
36
|
+
intervalRef.current = setInterval(() => {
|
|
37
|
+
setFrameIndex((current) => (current + 1) % safeFrames.length);
|
|
38
|
+
}, interval);
|
|
39
|
+
}
|
|
40
|
+
return () => {
|
|
41
|
+
if (intervalRef.current) {
|
|
42
|
+
clearInterval(intervalRef.current);
|
|
43
|
+
intervalRef.current = null;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}, [visible, isLoading, interval, safeFrames.length]);
|
|
47
|
+
// ローディングが解消されたらタイマーをクリア
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (!isLoading && delayTimerRef.current) {
|
|
50
|
+
clearTimeout(delayTimerRef.current);
|
|
51
|
+
delayTimerRef.current = null;
|
|
52
|
+
}
|
|
53
|
+
}, [isLoading]);
|
|
54
|
+
if (!isLoading || !visible) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return (React.createElement(Box, { gap: 1 },
|
|
58
|
+
React.createElement(Text, { color: "yellow", "data-testid": "loading-indicator-frame" }, safeFrames[frameIndex]),
|
|
59
|
+
React.createElement(Text, { color: "yellow", "data-testid": "loading-indicator-message" }, message)));
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=LoadingIndicator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoadingIndicator.js","sourceRoot":"","sources":["../../../../../src/cli/ui/components/common/LoadingIndicator.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface SelectItem {
|
|
3
|
+
label: string;
|
|
4
|
+
value: string;
|
|
5
|
+
}
|
|
6
|
+
export interface SelectProps<T extends SelectItem = SelectItem> {
|
|
7
|
+
items: T[];
|
|
8
|
+
onSelect: (item: T) => void;
|
|
9
|
+
limit?: number;
|
|
10
|
+
initialIndex?: number;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
renderIndicator?: (item: T, isSelected: boolean) => React.ReactNode;
|
|
13
|
+
renderItem?: (item: T, isSelected: boolean, context: {
|
|
14
|
+
columns: number;
|
|
15
|
+
}) => React.ReactNode;
|
|
16
|
+
selectedIndex?: number;
|
|
17
|
+
onSelectedIndexChange?: (index: number) => void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Select component - custom implementation with no looping
|
|
21
|
+
* Cursor stops at top and bottom instead of wrapping around
|
|
22
|
+
* Wrapped with React.memo for performance optimization
|
|
23
|
+
*/
|
|
24
|
+
declare const SelectComponent: <T extends SelectItem = SelectItem>({ items, onSelect, limit, initialIndex, disabled, renderIndicator, renderItem, selectedIndex: externalSelectedIndex, onSelectedIndexChange, }: SelectProps<T>) => React.JSX.Element;
|
|
25
|
+
/**
|
|
26
|
+
* Export memoized Select component
|
|
27
|
+
*/
|
|
28
|
+
export declare const Select: typeof SelectComponent;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=Select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ui/components/common/Select.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAGnD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,UAAU,GAAG,UAAU;IAC5D,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;IACpE,UAAU,CAAC,EAAE,CACX,IAAI,EAAE,CAAC,EACP,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KACzB,KAAK,CAAC,SAAS,CAAC;IAErB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AA+CD;;;;GAIG;AACH,QAAA,MAAM,eAAe,GAAI,CAAC,SAAS,UAAU,GAAG,UAAU,EAAG,+IAU1D,WAAW,CAAC,CAAC,CAAC,sBA6HhB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,MAAM,EAAiD,OAAO,eAAe,CAAC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
|
2
|
+
import { Box, Text, useInput, useStdout } from 'ink';
|
|
3
|
+
/**
|
|
4
|
+
* Custom comparison function for React.memo
|
|
5
|
+
* Compares items array by content (value and label) instead of reference
|
|
6
|
+
*/
|
|
7
|
+
function arePropsEqual(prevProps, nextProps) {
|
|
8
|
+
// Check if non-array props are the same
|
|
9
|
+
if (prevProps.limit !== nextProps.limit ||
|
|
10
|
+
prevProps.disabled !== nextProps.disabled ||
|
|
11
|
+
prevProps.initialIndex !== nextProps.initialIndex ||
|
|
12
|
+
prevProps.selectedIndex !== nextProps.selectedIndex ||
|
|
13
|
+
prevProps.onSelect !== nextProps.onSelect ||
|
|
14
|
+
prevProps.onSelectedIndexChange !== nextProps.onSelectedIndexChange ||
|
|
15
|
+
prevProps.renderIndicator !== nextProps.renderIndicator ||
|
|
16
|
+
prevProps.renderItem !== nextProps.renderItem) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
// Check if items arrays have the same length
|
|
20
|
+
if (prevProps.items.length !== nextProps.items.length) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
// Compare items by content (value and label)
|
|
24
|
+
for (let i = 0; i < prevProps.items.length; i++) {
|
|
25
|
+
const prevItem = prevProps.items[i];
|
|
26
|
+
const nextItem = nextProps.items[i];
|
|
27
|
+
if (!prevItem || !nextItem) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
if (prevItem.value !== nextItem.value || prevItem.label !== nextItem.label) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// All props are equal
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Select component - custom implementation with no looping
|
|
39
|
+
* Cursor stops at top and bottom instead of wrapping around
|
|
40
|
+
* Wrapped with React.memo for performance optimization
|
|
41
|
+
*/
|
|
42
|
+
const SelectComponent = ({ items, onSelect, limit, initialIndex = 0, disabled = false, renderIndicator, renderItem, selectedIndex: externalSelectedIndex, onSelectedIndexChange, }) => {
|
|
43
|
+
// Support both controlled and uncontrolled modes
|
|
44
|
+
const [internalSelectedIndex, setInternalSelectedIndex] = useState(initialIndex);
|
|
45
|
+
const [offset, setOffset] = useState(0);
|
|
46
|
+
// Use external selectedIndex if provided (controlled mode), otherwise use internal state
|
|
47
|
+
const isControlled = externalSelectedIndex !== undefined;
|
|
48
|
+
const selectedIndex = isControlled ? externalSelectedIndex : internalSelectedIndex;
|
|
49
|
+
const updateSelectedIndex = (value) => {
|
|
50
|
+
const newIndex = typeof value === 'function' ? value(selectedIndex) : value;
|
|
51
|
+
if (!isControlled) {
|
|
52
|
+
setInternalSelectedIndex(newIndex);
|
|
53
|
+
}
|
|
54
|
+
if (onSelectedIndexChange) {
|
|
55
|
+
onSelectedIndexChange(newIndex);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
if (items.length === 0) {
|
|
60
|
+
updateSelectedIndex(0);
|
|
61
|
+
setOffset(0);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
updateSelectedIndex((current) => {
|
|
65
|
+
const clamped = Math.min(current, items.length - 1);
|
|
66
|
+
return clamped < 0 ? 0 : clamped;
|
|
67
|
+
});
|
|
68
|
+
if (limit) {
|
|
69
|
+
setOffset((current) => {
|
|
70
|
+
if (current <= items.length - limit) {
|
|
71
|
+
return current < 0 ? 0 : current;
|
|
72
|
+
}
|
|
73
|
+
const newOffset = Math.max(0, items.length - limit);
|
|
74
|
+
return newOffset;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}, [items, limit]);
|
|
78
|
+
useInput((input, key) => {
|
|
79
|
+
if (disabled) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// Only handle navigation and selection keys
|
|
83
|
+
// Let other keys (q, m, n, c, etc.) propagate to parent components
|
|
84
|
+
if (key.upArrow || input === 'k') {
|
|
85
|
+
// Move up but don't loop - stop at 0
|
|
86
|
+
updateSelectedIndex((current) => {
|
|
87
|
+
const newIndex = Math.max(0, current - 1);
|
|
88
|
+
// Adjust offset if needed for scrolling
|
|
89
|
+
if (limit && newIndex < offset) {
|
|
90
|
+
setOffset(newIndex);
|
|
91
|
+
}
|
|
92
|
+
return newIndex;
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else if (key.downArrow || input === 'j') {
|
|
96
|
+
// Move down but don't loop - stop at last item
|
|
97
|
+
updateSelectedIndex((current) => {
|
|
98
|
+
const newIndex = Math.min(items.length - 1, current + 1);
|
|
99
|
+
// Adjust offset if needed for scrolling
|
|
100
|
+
if (limit && newIndex >= offset + limit) {
|
|
101
|
+
setOffset(newIndex - limit + 1);
|
|
102
|
+
}
|
|
103
|
+
return newIndex;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
else if (key.return) {
|
|
107
|
+
// Select current item
|
|
108
|
+
const selectedItem = items[selectedIndex];
|
|
109
|
+
if (selectedItem && !disabled) {
|
|
110
|
+
onSelect(selectedItem);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// All other keys are ignored and will propagate to parent components
|
|
114
|
+
});
|
|
115
|
+
// Determine visible items based on limit
|
|
116
|
+
const visibleItems = limit ? items.slice(offset, offset + limit) : items;
|
|
117
|
+
const visibleStartIndex = limit ? offset : 0;
|
|
118
|
+
const { stdout } = useStdout();
|
|
119
|
+
const columns = stdout?.columns ?? 80;
|
|
120
|
+
return (React.createElement(Box, { flexDirection: "column" }, visibleItems.map((item, index) => {
|
|
121
|
+
const actualIndex = visibleStartIndex + index;
|
|
122
|
+
const isSelected = actualIndex === selectedIndex;
|
|
123
|
+
if (renderItem) {
|
|
124
|
+
return (React.createElement(Box, { key: item.value, flexDirection: "row" }, renderItem(item, isSelected, { columns })));
|
|
125
|
+
}
|
|
126
|
+
const indicatorElement = renderIndicator
|
|
127
|
+
? renderIndicator(item, isSelected)
|
|
128
|
+
: isSelected
|
|
129
|
+
? React.createElement(Text, { color: "cyan" }, "\u203A")
|
|
130
|
+
: React.createElement(Text, null, " ");
|
|
131
|
+
return (React.createElement(Box, { key: item.value, flexDirection: "row" },
|
|
132
|
+
React.createElement(Box, { marginRight: 1 }, indicatorElement ?? React.createElement(Text, null, " ")),
|
|
133
|
+
isSelected ? (React.createElement(Text, { color: "cyan" }, item.label)) : (React.createElement(Text, null, item.label))));
|
|
134
|
+
})));
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Export memoized Select component
|
|
138
|
+
*/
|
|
139
|
+
export const Select = React.memo(SelectComponent, arePropsEqual);
|
|
140
|
+
//# sourceMappingURL=Select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select.js","sourceRoot":"","sources":["../../../../../src/cli/ui/components/common/Select.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface FooterAction {
|
|
3
|
+
key: string;
|
|
4
|
+
description: string;
|
|
5
|
+
}
|
|
6
|
+
export interface FooterProps {
|
|
7
|
+
actions: FooterAction[];
|
|
8
|
+
separator?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Footer component - displays keyboard actions
|
|
12
|
+
* Optimized with React.memo to prevent unnecessary re-renders
|
|
13
|
+
*/
|
|
14
|
+
export declare const Footer: React.NamedExoticComponent<FooterProps>;
|
|
15
|
+
//# sourceMappingURL=Footer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Footer.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ui/components/parts/Footer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,yCAuBjB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
/**
|
|
4
|
+
* Footer component - displays keyboard actions
|
|
5
|
+
* Optimized with React.memo to prevent unnecessary re-renders
|
|
6
|
+
*/
|
|
7
|
+
export const Footer = React.memo(function Footer({ actions, separator = " ", }) {
|
|
8
|
+
if (actions.length === 0) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
return (React.createElement(Box, null, actions.map((action, index) => (React.createElement(Box, { key: `${action.key}-${index}` },
|
|
12
|
+
React.createElement(Text, { dimColor: true }, "["),
|
|
13
|
+
React.createElement(Text, { bold: true, color: "cyan" }, action.key),
|
|
14
|
+
React.createElement(Text, { dimColor: true }, "]"),
|
|
15
|
+
React.createElement(Text, null,
|
|
16
|
+
" ",
|
|
17
|
+
action.description),
|
|
18
|
+
index < actions.length - 1 && React.createElement(Text, { dimColor: true }, separator))))));
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=Footer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Footer.js","sourceRoot":"","sources":["../../../../../src/cli/ui/components/parts/Footer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAYhC;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,EAC/C,OAAO,EACP,SAAS,GAAG,IAAI,GACJ;IACZ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,oBAAC,GAAG,QACD,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAC9B,oBAAC,GAAG,IAAC,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,IAAI,KAAK,EAAE;QAChC,oBAAC,IAAI,IAAC,QAAQ,cAAS;QACvB,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,IACpB,MAAM,CAAC,GAAG,CACN;QACP,oBAAC,IAAI,IAAC,QAAQ,cAAS;QACvB,oBAAC,IAAI;;YAAG,MAAM,CAAC,WAAW,CAAQ;QACjC,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,oBAAC,IAAI,IAAC,QAAQ,UAAE,SAAS,CAAQ,CAC5D,CACP,CAAC,CACE,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface HeaderProps {
|
|
3
|
+
title: string;
|
|
4
|
+
titleColor?: string;
|
|
5
|
+
dividerChar?: string;
|
|
6
|
+
showDivider?: boolean;
|
|
7
|
+
width?: number;
|
|
8
|
+
/**
|
|
9
|
+
* アプリケーションのバージョン文字列
|
|
10
|
+
* - string: バージョンが利用可能(例: "1.12.3")
|
|
11
|
+
* - null: バージョン取得失敗
|
|
12
|
+
* - undefined: バージョン未提供(後方互換性のため)
|
|
13
|
+
* @default undefined
|
|
14
|
+
*/
|
|
15
|
+
version?: string | null | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* 起動時の作業ディレクトリの絶対パス
|
|
18
|
+
* - string: ディレクトリパスが利用可能
|
|
19
|
+
* - undefined: ディレクトリ情報未提供
|
|
20
|
+
* @default undefined
|
|
21
|
+
*/
|
|
22
|
+
workingDirectory?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Header component - displays title and optional divider
|
|
26
|
+
* Optimized with React.memo to prevent unnecessary re-renders
|
|
27
|
+
*/
|
|
28
|
+
export declare const Header: React.NamedExoticComponent<HeaderProps>;
|
|
29
|
+
//# sourceMappingURL=Header.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ui/components/parts/Header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,yCAgCjB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
/**
|
|
4
|
+
* Header component - displays title and optional divider
|
|
5
|
+
* Optimized with React.memo to prevent unnecessary re-renders
|
|
6
|
+
*/
|
|
7
|
+
export const Header = React.memo(function Header({ title, titleColor = "cyan", dividerChar = "─", showDivider = true, width = 80, version, workingDirectory, }) {
|
|
8
|
+
const divider = dividerChar.repeat(width);
|
|
9
|
+
const displayTitle = version ? `${title} v${version}` : title;
|
|
10
|
+
return (React.createElement(Box, { flexDirection: "column" },
|
|
11
|
+
React.createElement(Box, null,
|
|
12
|
+
React.createElement(Text, { bold: true, color: titleColor }, displayTitle)),
|
|
13
|
+
showDivider && (React.createElement(Box, null,
|
|
14
|
+
React.createElement(Text, { dimColor: true }, divider))),
|
|
15
|
+
workingDirectory && (React.createElement(Box, null,
|
|
16
|
+
React.createElement(Text, { dimColor: true }, "Working Directory: "),
|
|
17
|
+
React.createElement(Text, null, workingDirectory)))));
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=Header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../../../src/cli/ui/components/parts/Header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAyBhC;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,EAC/C,KAAK,EACL,UAAU,GAAG,MAAM,EACnB,WAAW,GAAG,GAAG,EACjB,WAAW,GAAG,IAAI,EAClB,KAAK,GAAG,EAAE,EACV,OAAO,EACP,gBAAgB,GACJ;IACZ,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAE9D,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QACzB,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,UAAU,IACzB,YAAY,CACR,CACH;QACL,WAAW,IAAI,CACd,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,QAAQ,UAAE,OAAO,CAAQ,CAC3B,CACP;QACA,gBAAgB,IAAI,CACnB,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,QAAQ,gCAA2B;YACzC,oBAAC,IAAI,QAAE,gBAAgB,CAAQ,CAC3B,CACP,CACG,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { BranchMergeStatus } from "../../types.js";
|
|
3
|
+
export interface MergeStatusListProps {
|
|
4
|
+
statuses: BranchMergeStatus[];
|
|
5
|
+
maxVisible?: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* MergeStatusList component - displays list of merge statuses
|
|
9
|
+
* Optimized with React.memo to prevent unnecessary re-renders
|
|
10
|
+
* @see specs/SPEC-ee33ca26/spec.md - FR-015
|
|
11
|
+
*/
|
|
12
|
+
export declare const MergeStatusList: React.NamedExoticComponent<MergeStatusListProps>;
|
|
13
|
+
//# sourceMappingURL=MergeStatusList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MergeStatusList.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ui/components/parts/MergeStatusList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAmBD;;;;GAIG;AACH,eAAO,MAAM,eAAe,kDA2C1B,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
/**
|
|
4
|
+
* Get status icon and color based on merge status
|
|
5
|
+
*/
|
|
6
|
+
function getStatusDisplay(status) {
|
|
7
|
+
switch (status) {
|
|
8
|
+
case "success":
|
|
9
|
+
return { icon: "✓", color: "green" };
|
|
10
|
+
case "skipped":
|
|
11
|
+
return { icon: "⊘", color: "yellow" };
|
|
12
|
+
case "failed":
|
|
13
|
+
return { icon: "✗", color: "red" };
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* MergeStatusList component - displays list of merge statuses
|
|
18
|
+
* Optimized with React.memo to prevent unnecessary re-renders
|
|
19
|
+
* @see specs/SPEC-ee33ca26/spec.md - FR-015
|
|
20
|
+
*/
|
|
21
|
+
export const MergeStatusList = React.memo(function MergeStatusList({ statuses, maxVisible = 10, }) {
|
|
22
|
+
const visibleStatuses = statuses.slice(-maxVisible);
|
|
23
|
+
const hiddenCount = statuses.length - visibleStatuses.length;
|
|
24
|
+
return (React.createElement(Box, { flexDirection: "column" },
|
|
25
|
+
hiddenCount > 0 && (React.createElement(Box, { marginBottom: 1 },
|
|
26
|
+
React.createElement(Text, { dimColor: true },
|
|
27
|
+
"... ",
|
|
28
|
+
hiddenCount,
|
|
29
|
+
" more branches above"))),
|
|
30
|
+
visibleStatuses.map((status) => {
|
|
31
|
+
const { icon, color } = getStatusDisplay(status.status);
|
|
32
|
+
return (React.createElement(Box, { key: status.branchName },
|
|
33
|
+
React.createElement(Text, { color: color },
|
|
34
|
+
icon,
|
|
35
|
+
" "),
|
|
36
|
+
React.createElement(Text, null, status.branchName),
|
|
37
|
+
React.createElement(Text, { dimColor: true },
|
|
38
|
+
" (",
|
|
39
|
+
status.durationSeconds.toFixed(1),
|
|
40
|
+
"s)"),
|
|
41
|
+
status.status === "skipped" && status.conflictFiles && (React.createElement(Text, { color: "yellow" },
|
|
42
|
+
" ",
|
|
43
|
+
"- Conflicts: ",
|
|
44
|
+
status.conflictFiles.length,
|
|
45
|
+
" files")),
|
|
46
|
+
status.status === "failed" && status.error && (React.createElement(Text, { color: "red" },
|
|
47
|
+
" - ",
|
|
48
|
+
status.error)),
|
|
49
|
+
status.worktreeCreated && (React.createElement(Text, { dimColor: true }, " [worktree created]"))));
|
|
50
|
+
})));
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=MergeStatusList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MergeStatusList.js","sourceRoot":"","sources":["../../../../../src/cli/ui/components/parts/MergeStatusList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAQhC;;GAEG;AACH,SAAS,gBAAgB,CAAC,MAAmC;IAI3D,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACvC,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACxC,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACvC,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,eAAe,CAAC,EACjE,QAAQ,EACR,UAAU,GAAG,EAAE,GACM;IACrB,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;IAE7D,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QACxB,WAAW,GAAG,CAAC,IAAI,CAClB,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC;YAClB,oBAAC,IAAI,IAAC,QAAQ;;gBAAM,WAAW;uCAA4B,CACvD,CACP;QAEA,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAC9B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAExD,OAAO,CACL,oBAAC,GAAG,IAAC,GAAG,EAAE,MAAM,CAAC,UAAU;gBACzB,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK;oBAAG,IAAI;wBAAS;gBAClC,oBAAC,IAAI,QAAE,MAAM,CAAC,UAAU,CAAQ;gBAChC,oBAAC,IAAI,IAAC,QAAQ;;oBAAI,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;yBAAU;gBAE5D,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,aAAa,IAAI,CACtD,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ;oBACjB,GAAG;;oBACU,MAAM,CAAC,aAAa,CAAC,MAAM;6BACpC,CACR;gBAEA,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,IAAI,CAC7C,oBAAC,IAAI,IAAC,KAAK,EAAC,KAAK;;oBAAK,MAAM,CAAC,KAAK,CAAQ,CAC3C;gBAEA,MAAM,CAAC,eAAe,IAAI,CACzB,oBAAC,IAAI,IAAC,QAAQ,gCAA2B,CAC1C,CACG,CACP,CAAC;QACJ,CAAC,CAAC,CACE,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { BatchMergeProgress } from "../../types.js";
|
|
3
|
+
export interface ProgressBarProps {
|
|
4
|
+
progress: BatchMergeProgress;
|
|
5
|
+
width?: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* ProgressBar component - displays batch merge progress
|
|
9
|
+
* Optimized with React.memo to prevent unnecessary re-renders
|
|
10
|
+
* @see specs/SPEC-ee33ca26/spec.md - FR-009
|
|
11
|
+
*/
|
|
12
|
+
export declare const ProgressBar: React.NamedExoticComponent<ProgressBarProps>;
|
|
13
|
+
//# sourceMappingURL=ProgressBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressBar.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ui/components/parts/ProgressBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAeD;;;;GAIG;AACH,eAAO,MAAM,WAAW,8CA6CtB,CAAC"}
|