Docs
Cycling
A widget that shows the distance covered and heart-rate of cyclist
Installation
Run the following command
It will create a new file called cycling.tsx
inside the components/animata/widget
directory.
mkdir -p components/animata/widget && touch components/animata/widget/cycling.tsx
Paste the code
Open the newly created file and paste the following code:
"use client";
import { BikeIcon } from "lucide-react";
import Progress from "@/animata/graphs/progress";
import SwapText from "@/animata/text/swap-text";
import { cn } from "@/lib/utils";
function CardStack() {
const backgroundCards = [
"bg-blue-500/20",
"bg-yellow-500/30 ",
"bg-green-500/40",
"bg-red-500/50",
];
const goal = 15;
const progress = 30;
return (
<div className="relative w-full flex-1 place-content-end self-center">
{backgroundCards.map((card, index) => (
<div
key={card}
className={cn("mx-auto mb-[1px] h-[6px] rounded", card)}
style={{
width: `calc(100% - ${(backgroundCards.length - index) * 16}px)`,
}}
/>
))}
<div className="rounded-md bg-pink-500 px-4 py-2">
<h3 className="text-md flex justify-between font-bold">
<span>Goal</span>
<SwapText
initialText={`${goal}km`}
finalText={`${(goal * progress) / 100}km`}
textClassName="text-md text-gray-300"
/>
</h3>
<Progress progress={progress} />
</div>
</div>
);
}
export default function Cycling({
className,
title = "Cycling",
}: {
className?: string;
title?: string;
}) {
return (
<div className={cn("group flex h-52 w-52 flex-col rounded-3xl bg-zinc-900 p-4", className)}>
<div className="flex justify-between gap-2">
<div>
<div className="rounded-full bg-yellow-400/10 p-2">
<BikeIcon size={24} className="text-yellow-400" />
</div>
</div>
<div className="flex-1 text-right">
<span className="block text-xl font-bold uppercase text-gray-400">{title}</span>
<span className="-mt-1 block text-sm text-gray-300">2h 30m</span>
</div>
</div>
<CardStack />
<div className="mt-1 flex items-center justify-center gap-2">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 47.5 47.5"
id="heart"
width={16}
height={16}
className="group-hover:animate-pulse group-active:animate-pulse"
>
<defs>
<clipPath id="a">
<path d="M0 38h38V0H0v38Z"></path>
</clipPath>
</defs>
<g clipPath="url(#a)" transform="matrix(1.25 0 0 -1.25 0 47.5)">
<path
fill="#be1931"
d="M36.885 25.166c0 5.45-4.418 9.868-9.867 9.868-3.308 0-6.227-1.633-8.018-4.129-1.79 2.496-4.71 4.129-8.017 4.129-5.45 0-9.868-4.418-9.868-9.868 0-.772.098-1.52.266-2.241C2.752 14.413 12.216 5.431 19 2.965c6.783 2.466 16.249 11.448 17.617 19.96.17.721.268 1.469.268 2.241"
/>
</g>
</svg>
<p className="mr-2 text-sm text-white">
<strong>188</strong> BPM
</p>
<p className="text-sm text-white">
<strong>130</strong> AVG
</p>
</div>
</div>
);
}