Usage Meter Linear
billingsdk/usage-meter-linearFreeBlock
A usage meter linear component
Install it
npx shadcn@latest add https://billingsdk.com/r/usage-meter-linear.jsonSource
1"use client";23import { cn } from "@/lib/utils";4import {5 Card,6 CardContent,7 CardDescription,8 CardHeader,9 CardTitle,10} from "@/components/ui/card";11import { Badge } from "@/components/ui/badge";12import { motion, useSpring, useMotionValue, useTransform } from "motion/react";13import { useEffect } from "react";14import type React from "react";1516export interface Usage {17 name: string;18 usage: number;19 limit: number;20}2122export interface UsageMeterProps {23 usage: Usage[];24 className?: string;25 variant?: "linear" | "circle";26 size?: "sm" | "md" | "lg";27 title?: string;28 description?: string;29 progressColor?: "default" | "usage";30}3132function CircleUsageItem({33 item,34 config,35 radius,36 circumference,37 progressColor,38 getUsageClasses,39 getStatus,40}: {41 item: Usage;42 config: { circle: number; stroke: number; text: string; label: string };43 radius: number;44 circumference: number;45 progressColor: "default" | "usage";46 getUsageClasses: (47 percentage: number,48 variant: "circle" | "linear",49 ) => string[];50 getStatus: (percentage: number) => React.ReactNode;51}) {52 const percentage = Math.min((item.usage / item.limit) * 100, 100);53 const remaining = Math.max(item.limit - item.usage, 0);5455 const motionValue = useMotionValue(0);56 const springValue = useSpring(motionValue, { stiffness: 100, damping: 20 });57 const display = useTransform(58 springValue,59 (latest) => `${Math.round(latest)}%`,60 );6162 useEffect(() => {63 motionValue.set(percentage);64 }, [percentage, motionValue]);6566 return (67 <div className="bg-muted/20 flex flex-col items-center space-y-3 rounded-xl p-4 text-center">68 <span className="w-full truncate text-sm font-medium">{item.name}</span>69 <div className="relative">70 <svg71 width={config.circle}72 height={config.circle}73 className="-rotate-90"74 >75 <circle76 cx={config.circle / 2}77 cy={config.circle / 2}78 r={radius}79 strokeWidth={config.stroke}80 className="text-muted stroke-current"81 fill="transparent"82 />83 <motion.circle84 cx={config.circle / 2}85 cy={config.circle / 2}86 r={radius}87 strokeWidth={config.stroke}88 fill="transparent"89 strokeDasharray={circumference}90 strokeLinecap="round"91 className={cn(92 "stroke-current",93 progressColor === "usage"94// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from billingsdk
All 35 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| All Componentsall | billingsdk | Blocks | Free | no deps | |
| Top Bannerbanner | billingsdk | Blocks | Free | 2 deps · 2 files | |
| Billing Screenbilling-screen | billingsdk | Blocks | Free | 2 deps · 2 files | |
| Billing Settingsbilling-settings | billingsdk | Blocks | Free | 2 deps · 2 files | |
| Billing Settings 2billing-settings-2 | billingsdk | Blocks | Free | 1 dep · 2 files | |
| Cancel Subscription Cardcancel-subscription-card | billingsdk | Blocks | Free | 1 dep · 3 files | |
| Cancel Subscription Dialogcancel-subscription-dialog | billingsdk | Blocks | Free | 1 dep · 3 files | |
| Detailed Usage Tabledetailed-usage-table | billingsdk | Blocks | Free | no deps · 2 files |
