{ "name": "carousel-cards", "type": "registry:component", "dependencies": [ "lucide-react" ], "registryDependencies": [ "card", "badge", "button" ], "files": [ { "type": "registry:component", "content": "\"use client\";\n\n/**\n * @author: @dorianbaffier\n * @description: Carousel Cards\n * @version: 1.0.0\n * @date: 2025-06-26\n * @license: MIT\n * @website: https://kokonutui.com\n * @github: https://github.com/kokonut-labs/kokonutui\n */\n\nimport { ChevronLeft, ChevronRight, Heart, Star } from \"lucide-react\";\nimport Image from \"next/image\";\nimport Link from \"next/link\";\nimport React from \"react\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent, CardFooter } from \"@/components/ui/card\";\n\ninterface ExperienceItem {\n id: string;\n title: string;\n image: string;\n location: string;\n price: number;\n currency?: string;\n rating?: number;\n reviewCount?: number;\n badge?: string;\n date?: string;\n}\n\ninterface ExperienceGridProps {\n title: string;\n items: ExperienceItem[];\n viewAllHref?: string;\n}\n\nconst sampleExperiences: ExperienceItem[] = [\n {\n id: \"1\",\n title: \"Become an Otaku Hottie with Megan Thee Stallion\",\n image: \"https://images.unsplash.com/photo-1615571022219-eb45cf7faa9d\",\n location: \"Los Angeles, United States\",\n price: 120,\n currency: \"€\",\n rating: 4.97,\n reviewCount: 128,\n badge: \"Original\",\n date: \"Closes May 21\",\n },\n {\n id: \"2\",\n title: \"Spend a Sunday Funday with Patrick Mahomes\",\n image: \"https://images.unsplash.com/photo-1622127922040-13cab637ee78\",\n location: \"Kansas City, United States\",\n price: 150,\n currency: \"€\",\n rating: 4.92,\n reviewCount: 86,\n badge: \"Original\",\n date: \"Closes Today\",\n },\n {\n id: \"3\",\n title: \"Celebrate with SEVENTEEN on their 10th anniversary\",\n image: \"https://images.unsplash.com/photo-1534430480872-3498386e7856\",\n location: \"Seoul, South Korea\",\n price: 200,\n currency: \"€\",\n rating: 4.98,\n reviewCount: 254,\n badge: \"Original\",\n date: \"Closed May 17\",\n },\n {\n id: \"4\",\n title: \"Learn the secrets of French pastry with nonnas\",\n image: \"https://images.unsplash.com/photo-1604999333679-b86d54738315\",\n location: \"Paris, France\",\n price: 70,\n currency: \"€\",\n rating: 4.97,\n reviewCount: 112,\n badge: \"Original\",\n },\n {\n id: \"5\",\n title: \"Uncover the world of cabaret with a burlesque show\",\n image: \"https://images.unsplash.com/photo-1552733407-5d5c46c3bb3b\",\n location: \"Paris, France\",\n price: 92,\n currency: \"€\",\n rating: 4.9,\n reviewCount: 78,\n badge: \"Original\",\n },\n {\n id: \"6\",\n title: \"The Super Powers of Art-family Game at the Louvre\",\n image: \"https://images.unsplash.com/photo-1530789253388-582c481c54b0\",\n location: \"Paris, France\",\n price: 90,\n currency: \"€\",\n rating: 4.98,\n reviewCount: 146,\n badge: \"Original\",\n },\n {\n id: \"7\",\n title: \"Savor tasty vegan pastries with a plant-based pro\",\n image: \"https://images.unsplash.com/photo-1608830597604-619220679440\",\n location: \"Paris, France\",\n price: 75,\n currency: \"€\",\n rating: 4.95,\n reviewCount: 92,\n badge: \"Original\",\n },\n];\n\nconst popularExperiences: ExperienceItem[] = [\n {\n id: \"p1\",\n title: \"Learn to bake the French Croissant\",\n image: \"https://images.unsplash.com/photo-1555507036-ab1f4038808a\",\n location: \"Paris, France\",\n price: 95,\n currency: \"€\",\n rating: 4.95,\n reviewCount: 218,\n badge: \"Popular\",\n },\n {\n id: \"p2\",\n title: \"Seek out hidden speakeasy bars in the city\",\n image: \"https://images.unsplash.com/photo-1470337458703-46ad1756a187\",\n location: \"Paris, France\",\n price: 74,\n currency: \"€\",\n rating: 4.9,\n reviewCount: 165,\n badge: \"Popular\",\n },\n {\n id: \"p3\",\n title: \"Versailles Food and Palace Bike Tour\",\n image: \"https://images.unsplash.com/photo-1555507036-ab1f4038808a\",\n location: \"Versailles, France\",\n price: 122,\n currency: \"€\",\n rating: 4.97,\n reviewCount: 89,\n badge: \"Popular\",\n },\n {\n id: \"p4\",\n title: \"Haunted Paris Tour - Ghosts, Legends, True Crime\",\n image: \"https://images.unsplash.com/photo-1549144511-f099e773c147\",\n location: \"Paris, France\",\n price: 25,\n currency: \"€\",\n rating: 4.98,\n reviewCount: 345,\n badge: \"Popular\",\n },\n {\n id: \"p5\",\n title: \"Learn to make the French macarons with a chef\",\n image: \"https://images.unsplash.com/photo-1558326567-98ae2405596b\",\n location: \"Paris, France\",\n price: 110,\n currency: \"€\",\n rating: 4.95,\n reviewCount: 203,\n badge: \"Popular\",\n },\n {\n id: \"p6\",\n title: \"No Diet Club - Best food tour in Le Marais\",\n image: \"https://images.unsplash.com/photo-1414235077428-338989a2e8c0\",\n location: \"Paris, France\",\n price: 65,\n currency: \"€\",\n rating: 4.92,\n reviewCount: 178,\n badge: \"5 spots left\",\n },\n {\n id: \"p7\",\n title: \"Soak up the nightlife of Paris\",\n image: \"https://images.unsplash.com/photo-1546636889-ba9fdd63583e\",\n location: \"Paris, France\",\n price: 20,\n currency: \"€\",\n rating: 4.94,\n reviewCount: 112,\n badge: \"Popular\",\n },\n];\n\nconst ExperienceCard = ({ experience }: { experience: ExperienceItem }) => (\n \n \n \n \n \n Add to favorites\n \n {experience.badge && (\n \n {experience.badge}\n \n )}\n \n\n \n \n \n {experience.title}\n \n \n {experience.location}\n \n {experience.date && (\n \n {experience.date}\n \n )}\n \n\n \n {experience.rating && (\n \n \n {experience.rating}\n \n )}\n {experience.reviewCount && (\n \n {experience.rating && \"·\"}\n {experience.reviewCount > 0 ? ` (${experience.reviewCount})` : \"\"}\n \n )}\n \n {experience.currency || \"€\"} {experience.price} / guest\n \n \n \n \n);\n\nconst ExperienceSection = ({\n title,\n items,\n viewAllHref = \"#\",\n}: ExperienceGridProps) => {\n const scrollContainer = React.useRef(null);\n\n const handleScrollLeft = () => {\n if (scrollContainer.current) {\n scrollContainer.current.scrollBy({\n left: -320,\n behavior: \"smooth\",\n });\n }\n };\n\n const handleScrollRight = () => {\n if (scrollContainer.current) {\n scrollContainer.current.scrollBy({ left: 320, behavior: \"smooth\" });\n }\n };\n\n return (\n \n \n \n \n {title}\n \n \n \n \n Scroll left\n \n \n \n Scroll right\n \n \n Show all\n \n \n \n\n \n {items.map((item) => (\n \n \n \n \n \n ))}\n \n \n \n );\n};\n\nexport default function CarouselCards() {\n return (\n \n \n \n \n );\n}\n", "path": "/components/kokonutui/carousel-cards.tsx", "target": "components/kokonutui/carousel-cards.tsx" } ] }
\n {experience.location}\n
\n {experience.date}\n