Description
The ProgressBar
component is a customizable and animated React component that visually represents progress
as a horizontal bar. It allows you to display a percentage of completion ranging from 0% to 100%, making it
ideal for indicating loading states, upload progress, or any measurable task completion.
🏎️ Example
Default Progress Bar
With Border Style Square
Change the border style to square or rounded by passing either Square
or Rounded
to borderStyle
.
🦾 Usage
import { ProgressBar } from './ProgressBar';
function App() {
return (
<div>
<h1>File Upload Progress</h1>
<ProgressBar percent={75} color="#4caf50" borderStyle="Rounded" thickness="10" />
</div>
);
}
🍎 Code Byte
ProgressBar.tsx
import React from "react";
import clsx from "clsx";
import { motion } from "framer-motion";
import round from "lodash-es/round";
import styles from "./ProgressBar.module.css";
export const borderStyles = ["Square", "Rounded"] as const;
export type BorderStyle = (typeof borderStyles)[number];
const getBarValueStyles = (
backgroundColor: string,
value: number,
thickness: string,
) => {
return {
backgroundColor: backgroundColor,
width: `${value}%`,
height: `${thickness}px`,
};
};
export interface ProgressBarProps {
percent: number;
borderStyle?: BorderStyle;
color?: string;
thickness?: string;
className?: string;
ariaLabel?: string;
}
export const ProgressBar = ({
className = "",
color = "#16a34a",
borderStyle = "Rounded",
percent,
thickness = "7",
ariaLabel = "Progress Bar",
}: ProgressBarProps) => {
const value = percent > 100 ? 100 : percent;
const barValueStyles = {
...getBarValueStyles(color, value, thickness),
};
const borderRadius = clsx({
[styles.rounderBorderRadius as string]: borderStyle === "Rounded",
[styles.squareBorderRadius as string]: borderStyle === "Square",
});
return (
<div
aria-valuemax={100}
aria-valuemin={0}
aria-valuenow={round(value, 2)}
aria-valuetext={`${round(value, 2)}% complete`}
className={clsx(
styles.progressBar,
styles.progressGauge,
borderRadius,
className,
)}
role="progressbar"
aria-label={ariaLabel}
>
<motion.div
className={clsx(styles.progressBar, styles.barValue, borderRadius)}
initial={{ width: 0 }}
animate={{ width: barValueStyles.width }}
transition={{
type: "tween",
duration: 1,
ease: "easeInOut",
}}
style={barValueStyles}
/>
</div>
);
};
export default ProgressBar;
ProgressBar.module.css
.progressBar {
&.progressGauge {
background-color: #e0e0de;
display: inline-flex;
flex-direction: row;
justify-content: flex-start;
width: 100%;
}
.barValue {
display: inline-block;
}
.squareBorderRadius,
&.squareBorderRadius {
border-radius: 0;
}
.rounderBorderRadius,
&.rounderBorderRadius {
border-radius: 16px;
}
}
🪑 Props
Prop | Type | Description |
---|---|---|
percent | number | The percentage of completion of the progress bar, ranging from 0 - 100. |
borderStyle | string | Rounded or Square |
color | string | The color applied to the progress portion of the bar. |
thickness | string | The thickness of the progress bar. |
className | string | Apply your own styles with className. |