{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "animated-collection", "title": "Animated Collection", "description": "A collection of items with smooth layout transitions and animations.", "dependencies": [ "motion", "@hugeicons/core-free-icons", "@hugeicons/react", "clsx", "tailwind-merge" ], "files": [ { "path": "registry/default/example/animated-collection.tsx", "content": "\"use client\";\r\n\r\nimport {\r\n motion,\r\n LayoutGroup,\r\n AnimatePresence,\r\n type Transition,\r\n} from \"motion/react\";\r\nimport {\r\n Playlist01Icon,\r\n GridViewIcon,\r\n Layers01Icon,\r\n StarIcon,\r\n Ticket01Icon,\r\n Camera01Icon,\r\n BrushIcon,\r\n} from \"@hugeicons/core-free-icons\";\r\nimport { HugeiconsIcon } from \"@hugeicons/react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport React, { useState } from \"react\";\r\n\r\ninterface CollectionItem {\r\n id: string;\r\n title: string;\r\n subtitle: string;\r\n idNumber: string;\r\n image: string;\r\n icon: any;\r\n}\r\n\r\n// Change Here\r\nconst ITEMS: CollectionItem[] = [\r\n {\r\n id: \"1\",\r\n title: \"Cinematic Horizons\",\r\n subtitle: \"Photography\",\r\n idNumber: \"209\",\r\n image:\r\n \"https://images.unsplash.com/photo-1506744038136-46273834b3fb?q=80&w=400&h=400&auto=format&fit=crop\",\r\n icon: Camera01Icon,\r\n },\r\n {\r\n id: \"2\",\r\n title: \"Abstract Dreams\",\r\n subtitle: \"Digital Art\",\r\n idNumber: \"808\",\r\n image:\r\n \"https://images.unsplash.com/photo-1541701494587-cb58502866ab?q=80&w=400&h=400&auto=format&fit=crop\",\r\n icon: BrushIcon,\r\n },\r\n];\r\ntype ViewMode = \"list\" | \"card\" | \"pack\";\r\n\r\nconst snappySpring: Transition = {\r\n type: \"spring\",\r\n stiffness: 350,\r\n damping: 30,\r\n mass: 1,\r\n};\r\n\r\nconst fastFade: Transition = {\r\n duration: 0.1,\r\n ease: \"linear\",\r\n};\r\n\r\nexport default function LayoutSwitcher() {\r\n const [view, setView] = useState(\"list\");\r\n return (\r\n
\r\n
\r\n
\r\n

\r\n My Collection\r\n

\r\n\r\n
\r\n setView(\"list\")}\r\n icon={Playlist01Icon}\r\n label=\"List view\"\r\n />\r\n setView(\"card\")}\r\n icon={GridViewIcon}\r\n label=\"Card view\"\r\n />\r\n setView(\"pack\")}\r\n icon={Layers01Icon}\r\n label=\"Pack view\"\r\n />\r\n
\r\n
\r\n
\r\n {/* Content Section */}\r\n
\r\n \r\n \r\n {ITEMS.map((item, index) => (\r\n \r\n \r\n \r\n \r\n\r\n \r\n {view !== \"pack\" && (\r\n \r\n
\r\n \r\n {item.title}\r\n \r\n \r\n \r\n {item.subtitle}\r\n \r\n
\r\n\r\n \r\n \r\n #{item.idNumber}\r\n \r\n \r\n )}\r\n
\r\n\r\n {view === \"list\" && (\r\n \r\n )}\r\n \r\n ))}\r\n \r\n\r\n \r\n {view === \"pack\" && (\r\n \r\n
\r\n \r\n Bundle unlocked\r\n
\r\n \r\n )}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Tab({\r\n active,\r\n onClick,\r\n icon,\r\n label,\r\n}: {\r\n active: boolean;\r\n onClick: () => void;\r\n icon: any;\r\n label: string;\r\n}) {\r\n return (\r\n \r\n {active && (\r\n \r\n )}\r\n \r\n \r\n {label}\r\n \r\n \r\n );\r\n}\r\n", "type": "registry:component" } ], "type": "registry:component" }