{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "pill-nav", "title": "Pill Nav", "description": "Horizontal navigation with animated pill indicator and badge support", "dependencies": [ "motion" ], "files": [ { "path": "registry/pioneerui/pill-nav.tsx", "content": "\"use client\"\n\nimport React, { useState } from \"react\"\nimport { motion } from \"motion/react\"\nimport { cn } from \"@/lib/utils\"\n\nexport interface PillNavItem {\n value: string\n label: string\n href?: string\n icon?: React.ReactNode\n badge?: string | number\n}\n\nexport interface PillNavProps {\n items: PillNavItem[]\n defaultValue?: string\n onChange?: (value: string) => void\n className?: string\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\nexport function PillNav({\n items,\n defaultValue,\n onChange,\n className,\n size = \"md\",\n}: PillNavProps) {\n const [active, setActive] = useState(defaultValue ?? items[0]?.value ?? \"\")\n\n const sizeClass = {\n sm: \"gap-0.5 p-0.5 text-xs\",\n md: \"gap-1 p-1 text-sm\",\n lg: \"gap-1.5 p-1.5 text-base\",\n }[size]\n\n const itemSizeClass = {\n sm: \"px-2.5 py-1\",\n md: \"px-3.5 py-1.5\",\n lg: \"px-5 py-2\",\n }[size]\n\n return (\n \n {items.map((item) => (\n {\n setActive(item.value)\n onChange?.(item.value)\n }}\n className={cn(\n \"relative flex items-center gap-1.5 rounded-full font-medium transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n itemSizeClass,\n active === item.value\n ? \"text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {active === item.value && (\n \n )}\n {item.icon && {item.icon}}\n {item.label}\n {item.badge !== undefined && (\n \n {item.badge}\n \n )}\n \n ))}\n \n )\n}\n", "type": "registry:ui", "target": "components/pioneerui/pill-nav.tsx" } ], "type": "registry:ui" }