{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "fluid-tabs", "title": "Fluid Tabs", "description": "Tabs with Framer Motion layout-animated underline or pill indicator", "dependencies": [ "motion" ], "files": [ { "path": "registry/pioneerui/fluid-tabs.tsx", "content": "\"use client\"\n\nimport React, { useState, useRef } from \"react\"\nimport { motion } from \"motion/react\"\nimport { cn } from \"@/lib/utils\"\n\nexport interface FluidTabItem {\n value: string\n label: string\n content?: React.ReactNode\n icon?: React.ReactNode\n}\n\nexport interface FluidTabsProps {\n tabs: FluidTabItem[]\n defaultValue?: string\n onChange?: (value: string) => void\n className?: string\n listClassName?: string\n contentClassName?: string\n variant?: \"underline\" | \"pill\"\n}\n\nexport function FluidTabs({\n tabs,\n defaultValue,\n onChange,\n className,\n listClassName,\n contentClassName,\n variant = \"underline\",\n}: FluidTabsProps) {\n const [active, setActive] = useState(defaultValue ?? tabs[0]?.value ?? \"\")\n\n const handleChange = (value: string) => {\n setActive(value)\n onChange?.(value)\n }\n\n const activeTab = tabs.find((t) => t.value === active)\n\n return (\n