Docs
Progress
A sample progress graph for widgets/presentation. This is not a full-fledged chart library. Just use for presentation or as an interactive part of the app.
Installation
Run the following command
It will create a new file called progress.tsx
inside the components/animata/graphs
directory.
mkdir -p components/animata/graphs && touch components/animata/graphs/progress.tsx
Paste the code
Open the newly created file and paste the following code:
import { useEffect, useRef, useState } from "react";
import { cn } from "@/lib/utils";
export default function Progress({ progress }: { progress: number }) {
const [width, setWidth] = useState(0);
const barWidth = 2;
const gap = 2;
const bars = Math.floor(width / (barWidth + gap));
const containerRef = useRef<HTMLDivElement>(null);
useEffect(() => {
setWidth(containerRef.current?.offsetWidth ?? 0);
}, []);
const [shouldUseValue, setShouldUseValue] = useState(false);
useEffect(() => {
const timeout = setTimeout(() => {
// This is a hack to force the animation to run for the first time.
// We can use framer-motion to achieve this but just keeping it simple for now.
setShouldUseValue(true);
}, 250);
return () => clearTimeout(timeout);
}, []);
return (
<div
ref={containerRef}
className="relative flex h-[12px] w-full min-w-4 flex-wrap gap-[2px] overflow-hidden"
>
{Array.from(Array(bars)).map((_, index) => {
const highlight = shouldUseValue ? index / bars < progress / 100 : 0;
return (
<div
className={cn("h-full w-[2px] rounded-[1px] transition-all", {
"bg-blue-100 duration-75 group-hover:rounded group-hover:bg-zinc-50 group-active:rounded group-active:bg-zinc-50":
highlight,
"bg-zinc-900/30 duration-300 group-hover:scale-75 group-hover:bg-zinc-900/15 group-active:scale-75 group-active:bg-zinc-900/15":
!highlight,
})}
style={{
transitionDelay: highlight ? `${index * 24}ms` : "0ms",
}}
key={`bar_${index}`}
/>
);
})}
</div>
);
}
Credits
Built by hari