45 lines
1009 B
TypeScript
45 lines
1009 B
TypeScript
import React from 'react';
|
|
|
|
// Utility function to combine classNames
|
|
function cn(...classes: (string | undefined | null | false)[]): string {
|
|
return classes.filter(Boolean).join(' ');
|
|
}
|
|
|
|
interface ProgressProps extends React.ComponentProps<'div'> {
|
|
value?: number;
|
|
max?: number;
|
|
}
|
|
|
|
function Progress({
|
|
className,
|
|
value = 0,
|
|
max = 100,
|
|
...props
|
|
}: ProgressProps) {
|
|
const percentage = Math.min(Math.max((value / max) * 100, 0), 100);
|
|
|
|
return (
|
|
<div
|
|
data-slot="progress"
|
|
className={cn(
|
|
'bg-primary/20 relative h-2 w-full overflow-hidden rounded-full',
|
|
className
|
|
)}
|
|
role="progressbar"
|
|
aria-valuemin={0}
|
|
aria-valuemax={max}
|
|
aria-valuenow={value}
|
|
{...props}
|
|
>
|
|
<div
|
|
data-slot="progress-indicator"
|
|
className="bg-primary h-full w-full flex-1 transition-all"
|
|
style={{ transform: `translateX(-${100 - percentage}%)` }}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export { Progress };
|
|
export type { ProgressProps };
|