{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "usage-meter", "type": "registry:block", "title": "Usage meter", "description": "Track usage limits for checkout sessions, webhooks, payouts, or subscriptions.", "files": [ { "path": "components/lomi-ui/usage-meter.tsx", "target": "components/lomi-ui/usage-meter.tsx", "type": "registry:component", "content": "import * as React from 'react';\n\nexport interface UsageMeterItem {\n label: string;\n used: number;\n limit: number;\n unit?: string;\n}\n\nexport interface UsageMeterProps {\n items: UsageMeterItem[];\n title?: string;\n description?: string;\n className?: string;\n}\n\nfunction cn(...classes: Array) {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction usageTone(percent: number) {\n if (percent >= 90) return 'bg-destructive';\n if (percent >= 75) return 'bg-amber-500';\n return 'bg-primary';\n}\n\nexport function UsageMeter({\n items,\n title = 'Usage',\n description = 'Track payment and billing limits before customers hit them.',\n className,\n}: UsageMeterProps) {\n return (\n \n

{title}

\n

{description}

\n
\n {items.map((item) => {\n const percent = Math.min(\n Math.round((item.used / item.limit) * 100),\n 100,\n );\n return (\n
\n
\n {item.label}\n \n {item.used.toLocaleString()} / {item.limit.toLocaleString()}\n {item.unit ? ` ${item.unit}` : ''}\n \n
\n
\n \n
\n
\n );\n })}\n
\n \n );\n}\n" }, { "path": "components/lomi-ui/demo/usage-meter-demo.tsx", "target": "components/lomi-ui/demo/usage-meter-demo.tsx", "type": "registry:component", "content": "import { LomiUiPreview } from '@/components/preview/lomi-ui-preview';\nimport { UsageMeter } from '@/components/lomi-ui/usage-meter';\n\nexport function UsageMeterDemo() {\n return (\n \n \n \n );\n}\n" } ] }