{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "devsloka",
  "homepage": "https://ui.devsloka.in/",
  "items": [
    {
      "name": "tour",
      "type": "registry:ui",
      "title": "Tour",
      "description": "A Tour component for displaying a tour section.",
      "files": [
        {
          "path": "src/registry/ui/tour.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "button"
      ]
    },
    {
      "name": "text-effect",
      "type": "registry:ui",
      "title": "Text Effect",
      "description": "A Text Effect component for displaying animated text.",
      "files": [
        {
          "path": "src/registry/ui/text-effect.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "name": "tabs-switcher",
      "type": "registry:ui",
      "title": "Tabs Switcher",
      "description": "A Tabs Switcher component for displaying a tabbed interface.",
      "files": [
        {
          "path": "src/registry/ui/tabs-switcher.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "@radix-ui/react-tabs",
        "motion"
      ]
    },
    {
      "name": "success-result",
      "type": "registry:ui",
      "title": "Success Result",
      "description": "A Success Result component for displaying a success message.",
      "files": [
        {
          "path": "src/registry/ui/success-result.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "name": "empty-result",
      "type": "registry:ui",
      "title": "Empty Result",
      "description": "An Empty Result component for displaying an empty state.",
      "files": [
        {
          "path": "src/registry/ui/empty-result.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ]
    },
    {
      "name": "error-result",
      "type": "registry:ui",
      "title": "Error Result",
      "description": "An Error Result component for displaying an error message.",
      "files": [
        {
          "path": "src/registry/ui/error-result.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ]
    },
    {
      "name": "range-slider-with-histogram",
      "type": "registry:ui",
      "title": "Range Slider with Histogram",
      "description": "A Range Slider with Histogram component for displaying a range slider with histogram.",
      "files": [
        {
          "path": "src/registry/ui/range-slider-with-histogram.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "slider"
      ]
    },
    {
      "name": "morphing-nav",
      "type": "registry:ui",
      "title": "Morphing Nav",
      "description": "A Morphing Nav component for displaying a morphing navigation menu.",
      "files": [
        {
          "path": "src/registry/ui/morphing-nav.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "name": "morphing-modal",
      "type": "registry:ui",
      "title": "Modal",
      "description": "A Modal component for displaying a modal dialog.",
      "files": [
        {
          "path": "src/registry/ui/morphing-modal.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "@radix-ui/react-dialog",
        "@radix-ui/react-tabs",
        "lucide-react",
        "motion"
      ]
    },
    {
      "name": "morphing-card",
      "type": "registry:ui",
      "title": "Card",
      "description": "A Card component for displaying content in a card format.",
      "files": [
        {
          "path": "src/registry/ui/morphing-card.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "@radix-ui/react-dialog",
        "lucide-react",
        "motion"
      ]
    },
    {
      "name": "expanding-cards",
      "type": "registry:ui",
      "title": "Expanding Cards",
      "description": "An Expanding Cards component for displaying a set of cards that expand on hover.",
      "files": [
        {
          "path": "src/registry/ui/expanding-cards.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "floating-dots",
      "type": "registry:ui",
      "title": "Floating Dots",
      "description": "A Floating Dots component for displaying a set of floating animated dots.",
      "files": [
        {
          "path": "src/registry/ui/floating-dots.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "gradient-text",
      "type": "registry:ui",
      "title": "Gradient Text",
      "description": "A Gradient Text component for displaying a gradient text.",
      "files": [
        {
          "path": "src/registry/ui/gradient-text.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "icon-radio",
      "type": "registry:ui",
      "title": "Icon Radio",
      "description": "An Icon Radio component for displaying a radio button with an icon.",
      "files": [
        {
          "path": "src/registry/ui/icon-radio.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "@radix-ui/react-radio-group"
      ]
    },
    {
      "name": "logo-cloud-carousel",
      "type": "registry:ui",
      "title": "Logo Cloud Carousel",
      "description": "A Logo Cloud Carousel component for displaying a carousel of logos.",
      "files": [
        {
          "path": "src/registry/ui/logo-cloud-carousel.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "laptop-closes-on-scroll",
      "type": "registry:ui",
      "title": "Laptop Closes on Scroll",
      "description": "A Laptop Closes on Scroll component for displaying a laptop that closes on scroll.",
      "files": [
        {
          "path": "src/registry/ui/laptop-closes-on-scroll.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "name": "content-carousel",
      "type": "registry:ui",
      "title": "Content Carousel",
      "description": "A Content Carousel component for displaying a carousel of content.",
      "files": [
        {
          "path": "src/registry/ui/content-carousel.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "button"
      ]
    },
    {
      "name": "card-radio",
      "type": "registry:ui",
      "title": "Card Radio",
      "description": "A Card Radio component for displaying a radio button with a card.",
      "files": [
        {
          "path": "src/registry/ui/card-radio.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "@radix-ui/react-radio-group",
        "lucide-react",
        "motion"
      ]
    },
    {
      "name": "card-decorator",
      "type": "registry:ui",
      "title": "Card Decorator",
      "description": "A Card Decorator component for displaying a card with a decorator.",
      "files": [
        {
          "path": "src/registry/ui/card-decorator.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "border-gradient-icon",
      "type": "registry:ui",
      "title": "Border Gradient Icon",
      "description": "A Border Gradient Icon component for displaying an icon with a border gradient.",
      "files": [
        {
          "path": "src/registry/ui/border-gradient-icon.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "@radix-ui/react-slot"
      ]
    },
    {
      "name": "animated-smartwatch",
      "type": "registry:ui",
      "title": "Animated Smartwatch",
      "description": "An Animated Smartwatch component for displaying a smartwatch animation.",
      "files": [
        {
          "path": "src/registry/ui/animated-smartwatch.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "name": "animated-multi-select",
      "type": "registry:ui",
      "title": "Animated Multi Select",
      "description": "An Animated Multi Select component for displaying a multi-select dropdown.",
      "files": [
        {
          "path": "src/registry/ui/animated-multi-select.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "cmdk",
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "command",
        "popover"
      ]
    },
    {
      "name": "animated-image-gallery",
      "type": "registry:ui",
      "title": "Animated Image Gallery",
      "description": "An Animated Image Gallery component for displaying a gallery of images.",
      "files": [
        {
          "path": "src/registry/ui/animated-image-gallery.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "name": "airbnb-card",
      "type": "registry:ui",
      "title": "Airbnb Card",
      "description": "An Airbnb Card component for displaying a card with an image and text.",
      "files": [
        {
          "path": "src/registry/ui/airbnb-card.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ]
    },
    {
      "name": "pricing-card",
      "type": "registry:ui",
      "title": "Pricing Card",
      "description": "A Pricing Card component for displaying pricing information.",
      "files": [
        {
          "path": "src/registry/ui/pricing-card.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button"
      ]
    },
    {
      "name": "product-card",
      "type": "registry:ui",
      "title": "Product Card",
      "description": "A Product Card component for displaying product information.",
      "files": [
        {
          "path": "src/registry/ui/product-card.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "@radix-ui/react-radio-group",
        "lucide-react"
      ],
      "registryDependencies": [
        "badge",
        "button"
      ]
    },
    {
      "name": "profile-card",
      "type": "registry:ui",
      "title": "Profile Card",
      "description": "A social profile card with accent-tinted cover art, verified badge, follow toggle, stats and link.",
      "files": [
        {
          "path": "src/registry/ui/profile-card.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ]
    },
    {
      "name": "availability-card",
      "type": "registry:ui",
      "title": "Availability Card",
      "description": "A hire-me card with availability status, live local time, tactile buttons and copy-email feedback.",
      "files": [
        {
          "path": "src/registry/ui/availability-card.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ]
    },
    {
      "name": "receipt-printer",
      "type": "registry:ui",
      "title": "Receipt Printer",
      "description": "An order card that prints a receipt line by line with totals, a QR payment slot and a tear-off reset.",
      "files": [
        {
          "path": "src/registry/ui/receipt-printer.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ]
    },
    {
      "name": "reminders-card",
      "type": "registry:ui",
      "title": "Reminders Card",
      "description": "A widget-style checklist with an accent header, live clock, animated checkboxes and inline add.",
      "files": [
        {
          "path": "src/registry/ui/reminders-card.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ]
    },
    {
      "name": "now-playing-card",
      "type": "registry:ui",
      "title": "Now Playing Card",
      "description": "A music widget with spinning vinyl album art that morphs into the full cover on hover.",
      "files": [
        {
          "path": "src/registry/ui/now-playing-card.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "name": "arc-scroll-steps",
      "type": "registry:ui",
      "title": "Arc Scroll Steps",
      "description": "A scroll-driven stepper whose numbered steps orbit an arc while the active title swaps in.",
      "files": [
        {
          "path": "src/registry/ui/arc-scroll-steps.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "name": "team-carousel",
      "type": "registry:ui",
      "title": "Team Carousel",
      "description": "An infinite Embla team carousel that pauses on hover and highlights the hovered member.",
      "files": [
        {
          "path": "src/registry/ui/team-carousel.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "embla-carousel-auto-scroll",
        "embla-carousel-react",
        "motion"
      ]
    },
    {
      "name": "dock-gallery",
      "type": "registry:ui",
      "title": "Dock Gallery",
      "description": "A dock-style magnifying gallery: the card nearest the pointer grows and neighbours step down.",
      "files": [
        {
          "path": "src/registry/ui/dock-gallery.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "name": "bento-grid",
      "type": "registry:ui",
      "title": "Bento Grid",
      "description": "An animated bento feature grid with flowing files, drifting categories, a playable install and a copyable command.",
      "files": [
        {
          "path": "src/registry/ui/bento-grid.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "https://ui.devsloka.in/r/profile-card.json"
      ]
    },
    {
      "name": "showcase-bento",
      "type": "registry:ui",
      "title": "Showcase Bento",
      "description": "An animated showcase bento with hopping team portraits, a count-up stat and rotating testimonials.",
      "files": [
        {
          "path": "src/registry/ui/showcase-bento.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ]
    },
    {
      "name": "mission-bento",
      "type": "registry:ui",
      "title": "Mission Bento",
      "description": "A stats bento with a masked heading reveal, staggered tiles, count-up numbers and a self-drawing trend arrow.",
      "files": [
        {
          "path": "src/registry/ui/mission-bento.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ]
    },
    {
      "name": "hover-expand-gallery",
      "type": "registry:ui",
      "title": "Hover Expand Gallery",
      "description": "A row of image panels where the hovered one expands and reveals its label.",
      "files": [
        {
          "path": "src/registry/ui/hover-expand-gallery.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "case-study-carousel",
      "type": "registry:ui",
      "title": "Case Study Carousel",
      "description": "A stacked case-study carousel with peeking neighbours, arrows, dots, swipe and keyboard support.",
      "files": [
        {
          "path": "src/registry/ui/case-study-carousel.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ]
    },
    {
      "name": "fuzzy-mascot",
      "type": "registry:ui",
      "title": "Fuzzy Mascot",
      "description": "Plush SVG mascots in 15 shapes with cursor-tracking eyes, three states, five shadings and accessories.",
      "files": [
        {
          "path": "src/registry/ui/fuzzy-mascot.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "name": "pricing-block",
      "type": "registry:block",
      "title": "Pricing Block",
      "description": "A Pricing Block component for displaying pricing plans.",
      "files": [
        {
          "path": "src/registry/blocks/pricing-block.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ]
    },
    {
      "name": "contact-block",
      "type": "registry:block",
      "title": "Contact Block",
      "description": "A Contact Block component for displaying contact information.",
      "files": [
        {
          "path": "src/registry/blocks/contact-block.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "input",
        "label",
        "radio-group",
        "textarea"
      ]
    },
    {
      "name": "faqs-block",
      "type": "registry:block",
      "title": "FAQs Block",
      "description": "A FAQs Block component for displaying frequently asked questions.",
      "files": [
        {
          "path": "src/registry/blocks/faqs-block.tsx",
          "type": "registry:block"
        }
      ],
      "registryDependencies": [
        "accordion"
      ]
    },
    {
      "name": "faqs-block-two",
      "type": "registry:block",
      "title": "FAQs Block Two",
      "description": "A FAQs Block component for displaying frequently asked questions.",
      "files": [
        {
          "path": "src/registry/blocks/faq-block-two.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "accordion",
        "input"
      ]
    },
    {
      "name": "hero-section",
      "type": "registry:block",
      "title": "Hero Section Block",
      "description": "A Hero Section Block component for displaying a hero section.",
      "files": [
        {
          "path": "src/registry/blocks/hero-section.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button"
      ]
    },
    {
      "name": "hero-section-four",
      "type": "registry:block",
      "title": "Hero Section Four Block",
      "description": "A Hero Section Four Block component for displaying a hero section.",
      "files": [
        {
          "path": "src/registry/blocks/hero-section/hero-section-four.tsx",
          "type": "registry:block"
        }
      ],
      "registryDependencies": [
        "button"
      ]
    },
    {
      "name": "hero-floating-elements",
      "type": "registry:block",
      "title": "Hero Floating Elements Block",
      "description": "A Hero Floating Elements Block component for displaying a hero section.",
      "files": [
        {
          "path": "src/registry/blocks/hero-floating-elements.tsx",
          "type": "registry:block"
        }
      ],
      "registryDependencies": [
        "button"
      ]
    },
    {
      "name": "hero-gradient-mesh",
      "type": "registry:block",
      "title": "Hero Gradient Mesh Block",
      "description": "A Hero Gradient Mesh Block component for displaying a hero section.",
      "files": [
        {
          "path": "src/registry/blocks/hero-gradient-mesh.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ]
    },
    {
      "name": "hero-split-reveal",
      "type": "registry:block",
      "title": "Hero Split Reveal Block",
      "description": "A Hero Split Reveal Block component for displaying a hero section.",
      "files": [
        {
          "path": "src/registry/blocks/hero-split-reveal.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "button"
      ]
    },
    {
      "name": "logo-cloud-1",
      "type": "registry:block",
      "title": "Logo Cloud Block",
      "description": "A Logo Cloud Block component for displaying a logo cloud section.",
      "files": [
        {
          "path": "src/registry/blocks/logo-cloud-1.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "footer-block",
      "type": "registry:block",
      "title": "Footer Block",
      "description": "A Footer Block component for displaying a footer section.",
      "files": [
        {
          "path": "src/registry/blocks/footer-block.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "floating-footer",
      "type": "registry:block",
      "title": "Floating Footer Block",
      "description": "A Floating Footer Block component for displaying a floating footer section.",
      "files": [
        {
          "path": "src/registry/blocks/floating-footer.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "grid-footer",
      "type": "registry:block",
      "title": "Grid Footer Block",
      "description": "A Grid Footer Block component for displaying a grid footer section.",
      "files": [
        {
          "path": "src/registry/blocks/grid-footer.tsx",
          "type": "registry:block"
        }
      ],
      "registryDependencies": [
        "button",
        "input",
        "label"
      ]
    },
    {
      "name": "wave-footer",
      "type": "registry:block",
      "title": "Wave Footer Block",
      "description": "A Wave Footer Block component for displaying a wave footer section.",
      "files": [
        {
          "path": "src/registry/blocks/wave-footer.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "features-block",
      "type": "registry:block",
      "title": "Features Block",
      "description": "A Features Block component for displaying features.",
      "files": [
        {
          "path": "src/registry/blocks/features-block.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "features-block-four",
      "type": "registry:block",
      "title": "Features Block Four",
      "description": "A Features Block Four component for displaying features.",
      "files": [
        {
          "path": "src/registry/blocks/features-block-four.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "feature-interactive-cards",
      "type": "registry:block",
      "title": "Feature Interactive Cards Block",
      "description": "A Feature Interactive Cards Block component for displaying features.",
      "files": [
        {
          "path": "src/registry/blocks/feature-interactive-cards.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "@radix-ui/react-tabs",
        "motion"
      ]
    },
    {
      "name": "feature-floating-showcase",
      "type": "registry:block",
      "title": "Feature Floating Showcase Block",
      "description": "A Feature Floating Showcase Block component for displaying features.",
      "files": [
        {
          "path": "src/registry/blocks/feature-floating-showcase.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "name": "newsletter-block",
      "type": "registry:block",
      "title": "Newsletter Block",
      "description": "A Newsletter Block component for displaying a newsletter section.",
      "files": [
        {
          "path": "src/registry/blocks/newsletter/newsletter-block.tsx",
          "type": "registry:block"
        }
      ],
      "registryDependencies": [
        "button",
        "input",
        "label"
      ]
    },
    {
      "name": "newsletter-block-two",
      "type": "registry:block",
      "title": "Newsletter Block Two",
      "description": "A Newsletter Block Two component for displaying a newsletter section.",
      "files": [
        {
          "path": "src/registry/blocks/newsletter/newsletter-block-two.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "input",
        "label"
      ]
    },
    {
      "name": "team-block",
      "type": "registry:block",
      "title": "Team Block",
      "description": "A Team Block component for displaying a team section.",
      "files": [
        {
          "path": "src/registry/blocks/teams/team-block.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ]
    },
    {
      "name": "testimonials-block",
      "type": "registry:block",
      "title": "Testimonials Block",
      "description": "A Testimonials Block component for displaying a testimonials section.",
      "files": [
        {
          "path": "src/registry/blocks/testimonials/testimonials-block.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ]
    },
    {
      "name": "testimonials-block-2",
      "type": "registry:block",
      "title": "Testimonials Block Two",
      "description": "A Testimonials Block Two component for displaying a testimonials section.",
      "files": [
        {
          "path": "src/registry/blocks/testimonials/testimonials-block-2.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "name": "loader",
      "type": "registry:ui",
      "title": "Loader",
      "description": "Loader component with animated dots for indicating loading state.",
      "files": [
        {
          "path": "src/registry/ui/loader.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "3d-background",
      "type": "registry:ui",
      "title": "3D Globe Background",
      "description": "An interactive WebGL globe with country borders, built with three.js.",
      "files": [
        {
          "path": "src/registry/backgrounds/3d-background.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "@react-three/drei",
        "@react-three/fiber",
        "three"
      ],
      "registryDependencies": [
        "https://ui.devsloka.in/r/floating-dots.json"
      ]
    },
    {
      "name": "particles-background",
      "type": "registry:ui",
      "title": "Sky Particles Background",
      "description": "A field of softly twinkling particles, rendered with CSS only.",
      "files": [
        {
          "path": "src/registry/backgrounds/particles-background.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "confetti-background",
      "type": "registry:ui",
      "title": "Confetti Background",
      "description": "Falling confetti in your theme colors.",
      "files": [
        {
          "path": "src/registry/backgrounds/confetti-background.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "blob-background",
      "type": "registry:ui",
      "title": "Blobs Background",
      "description": "Blurred organic shapes that drift and morph.",
      "files": [
        {
          "path": "src/registry/backgrounds/blob-background.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "use-animation",
      "type": "registry:hook",
      "title": "useAnimation",
      "description": "A boolean flag that switches on when triggered and turns itself off after a set duration, for one-shot CSS animations.",
      "files": [
        {
          "path": "src/registry/hooks/use-animation.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-clipboard",
      "type": "registry:hook",
      "title": "useClipboard",
      "description": "Copy text to the clipboard with a temporary copied state, error handling and a fallback for insecure contexts.",
      "files": [
        {
          "path": "src/registry/hooks/use-clipboard.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-dark-mode",
      "type": "registry:hook",
      "title": "useDarkMode",
      "description": "Toggle a persisted dark class on the document (or a scoped element) that follows the system color scheme until the user chooses.",
      "files": [
        {
          "path": "src/registry/hooks/use-dark-mode.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-date-formatter",
      "type": "registry:hook",
      "title": "useDateFormatter",
      "description": "Memoized, locale-aware absolute, relative and range date formatting built on the Intl API.",
      "files": [
        {
          "path": "src/registry/hooks/use-date-formatter.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-debounce",
      "type": "registry:hook",
      "title": "useDebounce",
      "description": "Debounce a changing value, or a callback with cancel and flush controls.",
      "files": [
        {
          "path": "src/registry/hooks/use-debounce.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-device-detection",
      "type": "registry:hook",
      "title": "useDeviceDetection",
      "description": "Classify the device as mobile, tablet or desktop from viewport media queries, with pointer and hover capabilities.",
      "files": [
        {
          "path": "src/registry/hooks/use-device-detection.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-fetch",
      "type": "registry:hook",
      "title": "useFetch",
      "description": "Fetch data with status, error and refetch, aborting stale requests when the URL changes or the component unmounts.",
      "files": [
        {
          "path": "src/registry/hooks/use-fetch.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-form",
      "type": "registry:hook",
      "title": "useForm",
      "description": "Manage typed form values, derived validation errors, touched fields and submission in one hook.",
      "files": [
        {
          "path": "src/registry/hooks/use-form.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-hover",
      "type": "registry:hook",
      "title": "useHover",
      "description": "Track whether the pointer is over an element through a callback ref.",
      "files": [
        {
          "path": "src/registry/hooks/use-hover.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-key-press",
      "type": "registry:hook",
      "title": "useKeyPress",
      "description": "Detect keys and shortcuts like mod+k, returning whether they are held and optionally calling a handler.",
      "files": [
        {
          "path": "src/registry/hooks/use-key-press.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-local-storage",
      "type": "registry:hook",
      "title": "useLocalStorage",
      "description": "useState that persists to localStorage as JSON and stays in sync across components and browser tabs.",
      "files": [
        {
          "path": "src/registry/hooks/use-local-storage.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-on-click-outside",
      "type": "registry:hook",
      "title": "useOnClickOutside",
      "description": "Run a handler when a pointer or touch starts outside one or more referenced elements.",
      "files": [
        {
          "path": "src/registry/hooks/use-on-click-outside.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-online-status",
      "type": "registry:hook",
      "title": "useOnlineStatus",
      "description": "Read the browser's live online or offline connection status.",
      "files": [
        {
          "path": "src/registry/hooks/use-online-status.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-previous",
      "type": "registry:hook",
      "title": "usePrevious",
      "description": "Return the previous distinct value of a prop or state.",
      "files": [
        {
          "path": "src/registry/hooks/use-previous.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-scroll-position",
      "type": "registry:hook",
      "title": "useScrollPosition",
      "description": "Track the scroll offset of the window or a scrollable element.",
      "files": [
        {
          "path": "src/registry/hooks/use-scroll-position.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-window-size",
      "type": "registry:hook",
      "title": "useWindowSize",
      "description": "Track the viewport's width and height as it resizes.",
      "files": [
        {
          "path": "src/registry/hooks/use-window-size.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "changelog-timeline",
      "type": "registry:block",
      "title": "Changelog Timeline",
      "description": "A dated release timeline with New/Improved/Fixed ink tags and optional visuals.",
      "files": [
        {
          "path": "src/registry/blocks/changelog/changelog-timeline.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "changelog-release",
      "type": "registry:block",
      "title": "Changelog Release Spread",
      "description": "A single release as a poster spread with an oversized version numeral.",
      "files": [
        {
          "path": "src/registry/blocks/changelog/changelog-release.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "changelog-compact",
      "type": "registry:block",
      "title": "Changelog Compact",
      "description": "A compact, filterable changelog with version links and an RSS link.",
      "files": [
        {
          "path": "src/registry/blocks/changelog/changelog-compact.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "blog-featured",
      "type": "registry:block",
      "title": "Blog Featured",
      "description": "A featured story with a large photo beside three recent posts.",
      "files": [
        {
          "path": "src/registry/blocks/blog/blog-featured.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ]
    },
    {
      "name": "blog-index",
      "type": "registry:block",
      "title": "Blog Index",
      "description": "A year-grouped archive with category filters and a cursor-following preview.",
      "files": [
        {
          "path": "src/registry/blocks/blog/blog-index.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "name": "blog-magazine",
      "type": "registry:block",
      "title": "Blog Magazine",
      "description": "A magazine-cover grid of photo tiles and solid ink covers.",
      "files": [
        {
          "path": "src/registry/blocks/blog/blog-magazine.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "cta-poster",
      "type": "registry:block",
      "title": "CTA Poster",
      "description": "A Swiss-poster call to action on a solid ink field.",
      "files": [
        {
          "path": "src/registry/blocks/cta/cta-poster.tsx",
          "type": "registry:block"
        }
      ],
      "registryDependencies": [
        "button"
      ]
    },
    {
      "name": "cta-split-photo",
      "type": "registry:block",
      "title": "CTA Split Photo",
      "description": "A photo split call to action with numbered reasons and bookable demo times.",
      "files": [
        {
          "path": "src/registry/blocks/cta/cta-split-photo.tsx",
          "type": "registry:block"
        }
      ],
      "registryDependencies": [
        "button"
      ]
    },
    {
      "name": "cta-ticket",
      "type": "registry:block",
      "title": "CTA Ticket",
      "description": "An event call to action styled as a printed ticket with a tear-off stub.",
      "files": [
        {
          "path": "src/registry/blocks/cta/cta-ticket.tsx",
          "type": "registry:block"
        }
      ],
      "registryDependencies": [
        "button"
      ]
    },
    {
      "name": "sign-in-split",
      "type": "registry:block",
      "title": "Sign In Split",
      "description": "Split sign-in with an ink panel, researcher quote and SSO options.",
      "files": [
        {
          "path": "src/registry/blocks/auth/sign-in-split.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "checkbox",
        "input",
        "label"
      ]
    },
    {
      "name": "sign-in-minimal",
      "type": "registry:block",
      "title": "Sign In Minimal",
      "description": "Editorial single-column sign-in with an optional magic-link mode.",
      "files": [
        {
          "path": "src/registry/blocks/auth/sign-in-minimal.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "input",
        "label"
      ]
    },
    {
      "name": "sign-up-split",
      "type": "registry:block",
      "title": "Sign Up Split",
      "description": "Split sign-up with live password requirements and a plan summary panel.",
      "files": [
        {
          "path": "src/registry/blocks/auth/sign-up-split.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "checkbox",
        "input",
        "label"
      ]
    },
    {
      "name": "sign-up-steps",
      "type": "registry:block",
      "title": "Sign Up Steps",
      "description": "Two-step sign-up: account, then workspace, with focus management.",
      "files": [
        {
          "path": "src/registry/blocks/auth/sign-up-steps.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "input",
        "label",
        "select"
      ]
    },
    {
      "name": "forgot-password-simple",
      "type": "registry:block",
      "title": "Forgot Password",
      "description": "Request a reset link, then a check-your-email screen with a resend cooldown.",
      "files": [
        {
          "path": "src/registry/blocks/auth/forgot-password-simple.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "input",
        "label"
      ]
    },
    {
      "name": "forgot-password-reset",
      "type": "registry:block",
      "title": "Reset Password",
      "description": "Choose a new password with live requirements and a security panel.",
      "files": [
        {
          "path": "src/registry/blocks/auth/forgot-password-reset.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "input",
        "label"
      ]
    },
    {
      "name": "otp-verify",
      "type": "registry:block",
      "title": "OTP Verify",
      "description": "Six-digit email code that submits itself, with a resend countdown.",
      "files": [
        {
          "path": "src/registry/blocks/auth/otp-verify.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "input-otp",
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "input-otp",
        "label"
      ]
    },
    {
      "name": "otp-two-factor",
      "type": "registry:block",
      "title": "OTP Two-Factor",
      "description": "Authenticator two-factor prompt with trust-this-device and a backup code.",
      "files": [
        {
          "path": "src/registry/blocks/auth/otp-two-factor.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "input-otp",
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "checkbox",
        "input",
        "input-otp",
        "label"
      ]
    },
    {
      "name": "not-found-poster",
      "type": "registry:block",
      "title": "404 Poster",
      "description": "A poster-style 404 on a solid ink field with quick routes home.",
      "files": [
        {
          "path": "src/registry/blocks/not-found/not-found-poster.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "not-found-index",
      "type": "registry:block",
      "title": "404 Lost and Found",
      "description": "An editorial 404 with a request log line, search and a destination index.",
      "files": [
        {
          "path": "src/registry/blocks/not-found/not-found-index.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "input",
        "label"
      ]
    }
  ]
}
