{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "discrete-tabs", "title": "Discrete Tabs", "description": "A tab component with discrete sliding animations.", "dependencies": [ "motion", "clsx", "tailwind-merge" ], "files": [ { "path": "registry/default/example/discrete-tabs.tsx", "content": "\"use client\";\r\n\r\nimport { SetStateAction, useState, useEffect } from \"react\";\r\nimport { motion, AnimatePresence } from \"motion/react\";\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst Calendar: React.FC & { size?: number }> = ({\r\n className,\r\n size = 20,\r\n ...props\r\n}) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst Alert: React.FC & { size?: number }> = ({\r\n className,\r\n size = 20,\r\n ...props\r\n}) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst Inbox: React.FC & { size?: number }> = ({\r\n className,\r\n size = 20,\r\n ...props\r\n}) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\n// Change Here\r\nconst TABS = [\r\n { id: \"Inbox\", title: \"Inbox\", icon: Inbox },\r\n { id: \"Planner\", title: \"Planner\", icon: Calendar },\r\n { id: \"Alerts\", title: \"Alerts\", icon: Alert },\r\n];\r\n\r\nexport default function DiscreteTabs() {\r\n const [activeButton, setActiveButton] = useState(TABS[0].id);\r\n return (\r\n
\r\n {TABS.map((tab) => (\r\n \r\n ))}\r\n
\r\n );\r\n}\r\n\r\nfunction Button({\r\n title,\r\n ButtonIcon,\r\n isActive,\r\n setActiveButton,\r\n}: {\r\n title: string;\r\n ButtonIcon: React.ComponentType<\r\n React.SVGProps & { size?: number }\r\n >;\r\n isActive: boolean;\r\n setActiveButton: React.Dispatch>;\r\n}) {\r\n const [showShine, setShowShine] = useState(false);\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n\r\n useEffect(() => {\r\n if (isActive && isLoaded) {\r\n setShowShine(true);\r\n const timer = setTimeout(() => setShowShine(false), 800);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [isActive, isLoaded]);\r\n\r\n const activeColor = \"text-primary\";\r\n\r\n return (\r\n {\r\n setActiveButton(title), setIsLoaded(true);\r\n }}\r\n className=\"w-fit h-fit flex\"\r\n style={{ willChange: \"transform\" }}\r\n >\r\n \r\n \r\n \r\n \r\n {isActive && (\r\n \r\n \r\n {title}\r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n}\r\n", "type": "registry:component" } ], "type": "registry:component" }