{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "native-tabs-shadcnui", "type": "registry:component", "title": "Native Tabs", "description": "A sleek tabs component with a smooth sliding background indicator using Framer Motion layout animations.", "dependencies": [ "framer-motion", "react" ], "files": [ { "path": "@uitripled/react-shadcn/src/components/native/native-tabs-shadcnui.tsx", "content": "\"use client\";\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport { cn } from \"@/lib/utils\";\nimport { motion, MotionConfig } from \"framer-motion\";\nimport { useId, useState } from \"react\";\n\ninterface NativeTabsProps {\n items: {\n id: string;\n label: string;\n content: React.ReactNode;\n }[];\n defaultValue?: string;\n className?: string;\n}\n\nexport function NativeTabs({\n items,\n defaultValue,\n className,\n}: NativeTabsProps) {\n const pillLayoutId = useId();\n const [activeTab, setActiveTab] = useState(defaultValue || items[0].id);\n const [direction, setDirection] = useState(1);\n\n const handleValueChange = (value: string) => {\n const oldIndex = items.findIndex((item) => item.id === activeTab);\n const newIndex = items.findIndex((item) => item.id === value);\n setDirection(newIndex >= oldIndex ? 1 : -1);\n setActiveTab(value);\n };\n\n return (\n \n \n \n {items.map((tab) => {\n const isActive = activeTab === tab.id;\n return (\n \n {isActive && (\n \n )}\n {tab.label}\n \n );\n })}\n \n {items.map((item) => (\n \n \n {item.content}\n \n \n ))}\n \n \n );\n}\n", "type": "registry:component", "target": "components/uitripled/native-tabs-shadcnui.tsx" } ] }