Docs
Storage Status
This widget shows storage occupied by different file.
Installation
Run the following command
It will create a new file called storage-status.tsx
inside the components/animata/widget
directory.
mkdir -p components/animata/widget && touch components/animata/widget/storage-status.tsx
Paste the code
Open the newly created file and paste the following code:
import { cn } from "@/lib/utils";
interface SectionItem {
label: string;
value: number;
color: string;
stretch?: boolean;
}
function Section({ label, value, color, total, stretch }: SectionItem & { total: number }) {
return (
<div
className={cn("relative w-full rounded-md transition-all", color, {
"flex-1 text-gray-500": stretch,
})}
style={{ height: `${(value / total) * 100}%` }}
>
<div
className={cn(
"absolute left-full top-1/2 size-4 -translate-y-1/2 translate-x-1 rotate-45",
color,
)}
></div>
<div
className={cn(
"absolute left-full top-1/2 flex w-20 -translate-y-1/2 translate-x-3 justify-center rounded-md",
color,
)}
>
<div className="relative px-3 py-2 font-bold">{value} GB</div>
</div>
<div className="flex h-full w-full items-center justify-center text-lg font-bold">
{label}
</div>
</div>
);
}
const total = 512;
const items = [
{
stretch: true,
label: "Free",
value: 0,
color: "bg-gray-300",
},
{
label: "System",
value: 50,
color: "bg-slate-500",
},
{
label: "Audio",
value: 80,
color: "bg-purple-500",
},
{
label: "Video",
value: 150,
color: "bg-orange-500",
},
];
// Calculate free space
items[0].value = Math.max(0, total - items.slice(1).reduce((acc, item) => acc + item.value, 0));
export default function StorageStatus() {
return (
<div className="group flex h-96 w-32 flex-col gap-1 rounded-md bg-black p-1 text-white">
{items.map((item, index) => (
<Section key={index} {...item} total={total} />
))}
</div>
);
}
Credits
Built by Sanjaya Acharya