import React from 'react';
import { Box, Text } from 'ink';
import { colors, progressChars } from '../theme/index.js';
export interface ProgressBarProps {
/** Progress value between 0 and 1 */
progress: number;
/** Width of the bar in characters (default: 10) */
width?: number;
/** Whether to show percentage text after the bar (default: true) */
showPercentage?: boolean;
}
/**
* Visual progress indicator component
*
* Displays a progress bar using filled (█) and empty (░) blocks,
* with an optional percentage text.
*
* @example
*
* // Output: "████░░░░░░ 40%"
*/
export const ProgressBar: React.FC = ({
progress,
width = 10,
showPercentage = true,
}) => {
// Clamp progress between 0 and 1
const clampedProgress = Math.max(0, Math.min(1, progress));
// Calculate filled and empty character counts
const filledCount = Math.round(clampedProgress * width);
const emptyCount = width - filledCount;
// Build the bar strings
const filledBar = progressChars.filled.repeat(filledCount);
const emptyBar = progressChars.empty.repeat(emptyCount);
// Calculate percentage for display (only show 100% when truly complete)
const percentage =
clampedProgress >= 1 ? 100 : Math.floor(clampedProgress * 100);
return (
{filledBar}
{emptyBar}
{showPercentage && (
{percentage.toString().padStart(3)}%
)}
);
};
export default ProgressBar;