34 lines
945 B
TypeScript
34 lines
945 B
TypeScript
|
|
import * as React from 'react';
|
||
|
|
import { cn } from '@/lib/utils/cn';
|
||
|
|
|
||
|
|
export interface ProgressProps {
|
||
|
|
value: number;
|
||
|
|
max?: number;
|
||
|
|
className?: string;
|
||
|
|
showLabel?: boolean;
|
||
|
|
}
|
||
|
|
|
||
|
|
const Progress = React.forwardRef<HTMLDivElement, ProgressProps>(
|
||
|
|
({ value, max = 100, className, showLabel = false }, ref) => {
|
||
|
|
const percentage = Math.min(Math.max((value / max) * 100, 0), 100);
|
||
|
|
|
||
|
|
return (
|
||
|
|
<div ref={ref} className={cn('w-full', className)}>
|
||
|
|
<div className="relative h-4 w-full overflow-hidden rounded-full bg-secondary">
|
||
|
|
<div
|
||
|
|
className="h-full bg-primary transition-all duration-300 ease-in-out"
|
||
|
|
style={{ width: `${percentage}%` }}
|
||
|
|
/>
|
||
|
|
</div>
|
||
|
|
{showLabel && (
|
||
|
|
<div className="mt-1 text-xs text-muted-foreground text-right">{Math.round(percentage)}%</div>
|
||
|
|
)}
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
}
|
||
|
|
);
|
||
|
|
|
||
|
|
Progress.displayName = 'Progress';
|
||
|
|
|
||
|
|
export { Progress };
|