{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "tweenly",
  "homepage": "https://trytweenly.vercel.app",
  "items": [
    {
      "name": "use-reduced-motion",
      "type": "registry:hook",
      "title": "useReducedMotion",
      "description": "Returns true when the user prefers reduced motion.",
      "files": [
        {
          "path": "registry/new-york/hooks/use-reduced-motion.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "fade-in",
      "type": "registry:component",
      "title": "Fade In",
      "description": "Scroll-triggered fade with direction, distance, easing, scale and blur options.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/use-reduced-motion.json"
      ],
      "files": [
        {
          "path": "registry/new-york/fade-in/fade-in.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/fade-in"
    },
    {
      "name": "text-reveal",
      "type": "registry:component",
      "title": "Text Reveal",
      "description": "Word-by-word or character-by-character reveal with blur and stagger.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/new-york/text-reveal/text-reveal.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/text-reveal"
    },
    {
      "name": "typewriter",
      "type": "registry:component",
      "title": "Typewriter",
      "description": "Types and deletes a list of phrases with a blinking cursor.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/typewriter/typewriter.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/typewriter"
    },
    {
      "name": "word-rotate",
      "type": "registry:component",
      "title": "Word Rotate",
      "description": "Cycles through words with slide, fade, blur or flip transitions.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/word-rotate/word-rotate.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/word-rotate"
    },
    {
      "name": "shimmer-text",
      "type": "registry:component",
      "title": "Shimmer Text",
      "description": "A light band that sweeps across text on a loop.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/shimmer-text/shimmer-text.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/shimmer-text"
    },
    {
      "name": "number-ticker",
      "type": "registry:component",
      "title": "Number Ticker",
      "description": "Counts up to a value when scrolled into view, with formatting options.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/number-ticker/number-ticker.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/number-ticker"
    },
    {
      "name": "fill-button",
      "type": "registry:component",
      "title": "Fill Button",
      "description": "Hover/focus button with a GSAP clip-path fill sweep. Configurable direction, duration and ease.",
      "dependencies": [
        "gsap"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/use-reduced-motion.json"
      ],
      "files": [
        {
          "path": "registry/new-york/fill-button/fill-button.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/fill-button"
    },
    {
      "name": "magnetic",
      "type": "registry:component",
      "title": "Magnetic",
      "description": "Wrap anything to make it drift toward the cursor on a spring.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/magnetic/magnetic.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/magnetic"
    },
    {
      "name": "tilt-card",
      "type": "registry:component",
      "title": "Tilt Card",
      "description": "3D perspective tilt that follows the pointer, with optional glare.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/tilt-card/tilt-card.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/tilt-card"
    },
    {
      "name": "spotlight-card",
      "type": "registry:component",
      "title": "Spotlight Card",
      "description": "Card with a radial spotlight and glowing border that track the cursor.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/spotlight-card/spotlight-card.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/spotlight-card"
    },
    {
      "name": "stagger",
      "type": "registry:component",
      "title": "Stagger",
      "description": "Reveals its children one after another as they enter the viewport.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/stagger/stagger.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/stagger"
    },
    {
      "name": "marquee",
      "type": "registry:component",
      "title": "Marquee",
      "description": "Infinite, seamless scrolling row or column of content.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/marquee/marquee.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/marquee"
    },
    {
      "name": "sticky-cards",
      "type": "registry:component",
      "title": "Sticky Cards",
      "description": "A stack of same-size cards pinned on scroll. The front card lifts away, then the next, one by one.",
      "dependencies": [
        "gsap",
        "@gsap/react"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "utils",
        "https://trytweenly.vercel.app/r/tweenly-theme.json"
      ],
      "files": [
        {
          "path": "registry/new-york/cards/sticky-cards.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/sticky-cards"
    },
    {
      "name": "scroll-text-reveal",
      "type": "registry:component",
      "title": "Scroll Text Reveal",
      "description": "Pins the section and reveals text word by word as you scroll; the page resumes once the reveal completes.",
      "dependencies": [
        "gsap",
        "@gsap/react"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/scroll-text-reveal/scroll-text-reveal.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/scroll-text-reveal"
    },
    {
      "name": "horizontal-scroll",
      "type": "registry:component",
      "title": "Horizontal Scroll",
      "description": "Pins a row of images and scrolls it sideways with the page, then releases to normal scroll.",
      "dependencies": [
        "gsap",
        "@gsap/react"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/horizontal-scroll/horizontal-scroll.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/horizontal-scroll"
    },
    {
      "name": "image-reveal",
      "type": "registry:component",
      "title": "Image Reveal",
      "description": "Images fly in from their own direction as they scroll into view.",
      "dependencies": [
        "gsap",
        "@gsap/react"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/image-reveal/image-reveal.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/image-reveal"
    },
    {
      "name": "ascii-image",
      "type": "registry:component",
      "title": "ASCII Image",
      "description": "Renders any image as ASCII art on a canvas, with a glittering pixel trail under the cursor.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/ascii-image/ascii-image.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/ascii-image"
    },
    {
      "name": "hover-media",
      "type": "registry:component",
      "title": "Hover Media",
      "description": "Inline keyword that reveals a floating image or video that follows the cursor.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/hover-media/hover-media.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/hover-media"
    },
    {
      "name": "cursor",
      "type": "registry:component",
      "title": "Cursor",
      "description": "Custom cursors: ring, dot, blend, crosshair, sparkle trail, sunflower and rose.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/new-york/cursor/cursor.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/cursor"
    },
    {
      "name": "loader",
      "type": "registry:component",
      "title": "Loader",
      "description": "Three loading animations: bouncing dots, equalizer bars and an orbit spinner.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/loader/loader.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/loader"
    },
    {
      "name": "download-button",
      "type": "registry:component",
      "title": "Download Button",
      "description": "Button that morphs from Download to a live progress fill and a drawn check mark.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/download-button/download-button.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/download-button"
    },
    {
      "name": "image-fan",
      "type": "registry:component",
      "title": "Image Fan",
      "description": "One image rises from below, then the rest slide out from under it into an overlapping fan.",
      "dependencies": [
        "gsap",
        "@gsap/react"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/image-fan/image-fan.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/image-fan"
    },
    {
      "name": "image-arc",
      "type": "registry:component",
      "title": "Image Arc",
      "description": "Images on a half-circle wheel that turns on its own or with the scroll.",
      "dependencies": [
        "gsap",
        "@gsap/react"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/image-arc/image-arc.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/image-arc"
    },
    {
      "name": "expand-gallery",
      "type": "registry:component",
      "title": "Expand Gallery",
      "description": "A row of small thumbnails where each one grows large in turn as you scroll.",
      "dependencies": [
        "gsap",
        "@gsap/react"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/expand-gallery/expand-gallery.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/expand-gallery"
    },
    {
      "name": "scroll-focus",
      "type": "registry:component",
      "title": "Scroll Focus",
      "description": "A column of images where the one in the center grows, with a title list that stays in sync.",
      "dependencies": [
        "gsap",
        "@gsap/react"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/scroll-focus/scroll-focus.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/scroll-focus"
    },
    {
      "name": "shine-button",
      "type": "registry:component",
      "title": "Shine Button",
      "description": "Pill button with a light beam circling its edge and a soft sheen on hover.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/shine-button/shine-button.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/shine-button"
    },
    {
      "name": "ripple-button",
      "type": "registry:component",
      "title": "Ripple Button",
      "description": "Material-style ripples that expand from the exact point you press.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/ripple-button/ripple-button.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/ripple-button"
    },
    {
      "name": "hold-button",
      "type": "registry:component",
      "title": "Hold Button",
      "description": "Press and hold to confirm destructive actions. A fill sweeps across while held.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/hold-button/hold-button.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/hold-button"
    },
    {
      "name": "slide-button",
      "type": "registry:component",
      "title": "Slide Button",
      "description": "Slide-to-confirm track with a draggable knob, shimmering label and keyboard support.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/slide-button/slide-button.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/slide-button"
    },
    {
      "name": "like-button",
      "type": "registry:component",
      "title": "Like Button",
      "description": "Heart toggle with a spring pop, ring burst, particles and a rolling counter.",
      "dependencies": [
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/like-button/like-button.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/like-button"
    },
    {
      "name": "segmented-control",
      "type": "registry:component",
      "title": "Segmented Control",
      "description": "Tabs with a springy pill that slides behind the active option, with arrow-key navigation.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/segmented-control/segmented-control.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/segmented-control"
    },
    {
      "name": "number-stepper",
      "type": "registry:component",
      "title": "Number Stepper",
      "description": "Minus / plus stepper whose digits roll individually, with hold-to-repeat and a shake at the limits.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/number-stepper/number-stepper.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/number-stepper"
    },
    {
      "name": "elastic-switch",
      "type": "registry:component",
      "title": "Elastic Switch",
      "description": "Toggle whose knob stretches while pressed and springs across with overshoot, with optional sun / moon icons.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/elastic-switch/elastic-switch.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/elastic-switch"
    },
    {
      "name": "expand-input",
      "type": "registry:component",
      "title": "Expand Input",
      "description": "A pill button that morphs into an email field, then a spinner and a drawn check on submit.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/expand-input/expand-input.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/expand-input"
    },
    {
      "name": "rating",
      "type": "registry:component",
      "title": "Rating",
      "description": "Star rating with a sweeping hover fill, half stars, and a springy pop with sparkles on select.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/rating/rating.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/rating"
    },
    {
      "name": "navbar",
      "type": "registry:component",
      "title": "Navbar",
      "description": "Five minimal, animated navigation bars: glass pill, scroll morph, sliding underline, dynamic island mega-menu and full-screen overlay.",
      "dependencies": [
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/navbar/navbar.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/navbar"
    },
    {
      "name": "table-of-contents",
      "type": "registry:component",
      "title": "Table of Contents",
      "description": "Scroll-synced \"On This Page\" sidebar with a plane that flies along the heading trail, a sliding rail, or a spotlight list.",
      "dependencies": [
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/table-of-contents/table-of-contents.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/table-of-contents"
    },
    {
      "name": "otp-input",
      "type": "registry:component",
      "title": "OTP Input",
      "description": "Verification code input with springy digits, a gliding focus ring and animated success and error states.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/otp-input/otp-input.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/otp-input"
    },
    {
      "name": "chart-line",
      "type": "registry:component",
      "title": "Chart Line",
      "description": "Multi-series line and area chart from plain row data, with draw-in lines, halftone fills, a snapping crosshair tooltip and a toggleable legend.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/chart-kit.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/chart-line/chart-line.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/chart-line"
    },
    {
      "name": "chart-progress",
      "type": "registry:component",
      "title": "Chart Progress",
      "description": "Progress toward a real target: a wavy, grainy fill over a hatched remainder, with a thermometer marker, quota line and stacked segments.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/chart-kit.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/chart-progress/chart-progress.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/chart-progress"
    },
    {
      "name": "chart-radial",
      "type": "registry:component",
      "title": "Chart Radial",
      "description": "Donut, pie or gauge from your rows with sweep-in slices, legend toggling with re-flow, hover explode and a live center total.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/chart-kit.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/chart-radial/chart-radial.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/chart-radial"
    },
    {
      "name": "chart-dots",
      "type": "registry:component",
      "title": "Chart Dots",
      "description": "Dot matrix of filled versus hatched units with a partial last dot, spring wave in fill order, and a huge count-up figure.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/chart-kit.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/chart-dots/chart-dots.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/chart-dots"
    },
    {
      "name": "preloader",
      "type": "registry:component",
      "title": "Preloader",
      "description": "Full-screen loader with a counting percentage and rotating quotes that reveals the page at 100%.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/preloader/preloader.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/preloader"
    },
    {
      "name": "chart-kit",
      "type": "registry:lib",
      "title": "Chart Kit",
      "description": "Shared theme, scales, formatters, textures, card, legend and tooltip used by tweenly charts.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/lib/chart-kit.tsx",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "chart-bar",
      "type": "registry:component",
      "title": "Chart Bar",
      "description": "Grouped or stacked bar chart, vertical or horizontal, with springy staggered growth, textured series, hover highlight and a toggleable legend.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/chart-kit.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/chart-bar/chart-bar.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/chart-bar"
    },
    {
      "name": "chart-rings",
      "type": "registry:component",
      "title": "Chart Rings",
      "description": "Concentric activity-style progress rings with per-row goals, springy staggered fills, counting values and second-lap overshoot.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/chart-kit.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/chart-rings/chart-rings.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/chart-rings"
    },
    {
      "name": "chart-radar",
      "type": "registry:component",
      "title": "Chart Radar",
      "description": "Spider chart comparing textured series across axes, with a drawn-in grid, polygons springing from the center and axis tooltips.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/chart-kit.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/chart-radar/chart-radar.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/chart-radar"
    },
    {
      "name": "chart-kpi",
      "type": "registry:component",
      "title": "Chart KPI",
      "description": "Stat card with a count-up headline, delta pill, halftone sparkline with scrubbing, and an optional goal bar.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/chart-kit.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/chart-kpi/chart-kpi.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/chart-kpi"
    },
    {
      "name": "chart-heatmap",
      "type": "registry:component",
      "title": "Chart Heatmap",
      "description": "GitHub-style contribution calendar with hatched empty days, a diagonal reveal wave, and hover tooltips.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/chart-kit.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/chart-heatmap/chart-heatmap.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/chart-heatmap"
    },
    {
      "name": "confetti",
      "type": "registry:component",
      "title": "Confetti",
      "description": "High-performance canvas confetti with burst, cannons, fireworks, rain and stream presets. Includes confetti(), useConfetti, ConfettiButton and Confetti.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/new-york/confetti/confetti.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/confetti"
    },
    {
      "name": "faq",
      "type": "registry:component",
      "title": "FAQ",
      "description": "Animated FAQ accordion in four styles (minimal, cards, numbered, split) with height-auto reveals, a live filter and keyboard navigation.",
      "dependencies": [
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "https://trytweenly.vercel.app/r/tweenly-theme.json"
      ],
      "files": [
        {
          "path": "registry/new-york/faq/faq.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/faq"
    },
    {
      "name": "footer",
      "type": "registry:component",
      "title": "Footer",
      "description": "Four premium, minimal animated footers: sticky reveal, giant kinetic wordmark, classic columns with newsletter, and an expanding curtain panel with a magnetic CTA.",
      "dependencies": [
        "gsap",
        "@gsap/react",
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "https://trytweenly.vercel.app/r/tweenly-theme.json"
      ],
      "files": [
        {
          "path": "registry/new-york/footer/footer.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/footer"
    },
    {
      "name": "notification-feed",
      "type": "registry:component",
      "title": "Notification Feed",
      "description": "Layout-animated notifications as a stack, inbox list, dynamic island or timeline cards, with swipe to dismiss, pausable timers and a useNotifications hook.",
      "dependencies": [
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json"
      ],
      "files": [
        {
          "path": "registry/new-york/notification-feed/notification-feed.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/notification-feed"
    },
    {
      "name": "page-loader",
      "type": "registry:component",
      "title": "Page Loader",
      "description": "Website intro loader orchestrated with GSAP timelines, with stairs, odometer counter, greeting words, iris and blinds exits.",
      "dependencies": [
        "gsap",
        "@gsap/react"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "https://trytweenly.vercel.app/r/tweenly-theme.json"
      ],
      "files": [
        {
          "path": "registry/new-york/page-loader/page-loader.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/page-loader"
    },
    {
      "name": "page-transition",
      "type": "registry:component",
      "title": "Page Transition",
      "description": "App Router page transitions: a provider, TransitionLink and usePageTransition hook with curtain, stairs, iris, slide and blinds variants.",
      "dependencies": [
        "gsap",
        "@gsap/react"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json"
      ],
      "files": [
        {
          "path": "registry/new-york/page-transition/page-transition.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/page-transition"
    },
    {
      "name": "swipe-row",
      "type": "registry:component",
      "title": "Swipe Row",
      "description": "Swipeable list rows with iOS-style reveal actions, full-swipe commits and floating cards, with layout-animated removal.",
      "dependencies": [
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "https://trytweenly.vercel.app/r/tweenly-theme.json"
      ],
      "files": [
        {
          "path": "registry/new-york/swipe-row/swipe-row.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/swipe-row"
    },
    {
      "name": "envelope",
      "type": "registry:component",
      "title": "Envelope",
      "description": "Animated envelope UI: a composer where the letter folds into the envelope, gets sealed and flies off, plus a presentational envelope that opens to reveal any content.",
      "dependencies": [
        "gsap",
        "@gsap/react",
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "https://trytweenly.vercel.app/r/tweenly-theme.json"
      ],
      "files": [
        {
          "path": "registry/new-york/envelope/envelope.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/envelope-reveal"
    },
    {
      "name": "not-found",
      "type": "registry:component",
      "title": "404",
      "description": "Five playful 404 sections with a giant status code hero: cursor-following eyeball, flashlight reveal, throwable tiles, orbiting moon and a decoding error log.",
      "dependencies": [
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "https://trytweenly.vercel.app/r/tweenly-theme.json"
      ],
      "files": [
        {
          "path": "registry/new-york/not-found/not-found.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/not-found"
    },
    {
      "name": "product-card",
      "type": "registry:component",
      "title": "Product Card",
      "description": "Full-bleed product card with a swipeable image carousel, glass pills, rolling price and an add-to-cart button that morphs into a quantity stepper.",
      "dependencies": [
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json"
      ],
      "files": [
        {
          "path": "registry/new-york/product-card/product-card.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/product-card"
    },
    {
      "name": "stamp-card",
      "type": "registry:component",
      "title": "Stamp Card",
      "description": "Collectible postage stamp with perforated edges, 3D tilt and glare, an inked postmark animation and a fanned StampSheet.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json"
      ],
      "files": [
        {
          "path": "registry/new-york/stamp-card/stamp-card.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/stamp-card"
    },
    {
      "name": "arc-steps",
      "type": "registry:component",
      "title": "Arc Steps",
      "description": "Pinned \"How it works\" section: a marker travels along a half circle from step to step on scroll, the arc draws in and the section flips to each step's solid color.",
      "dependencies": [
        "gsap",
        "@gsap/react"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "https://trytweenly.vercel.app/r/tweenly-theme.json"
      ],
      "files": [
        {
          "path": "registry/new-york/arc-steps/arc-steps.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/arc-steps"
    },
    {
      "name": "auth",
      "type": "registry:component",
      "title": "Sign In / Sign Up",
      "description": "Sign in and sign up sections built on shadcn inputs: a split onboarding panel, a spotlight card and a multi-step flow with code verification, with an animated mode switch, inline validation, loading, success and error states.",
      "dependencies": [
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "input",
        "label",
        "checkbox",
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "https://trytweenly.vercel.app/r/otp-input.json"
      ],
      "files": [
        {
          "path": "registry/new-york/auth/auth.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/auth"
    },
    {
      "name": "curved-carousel",
      "type": "registry:component",
      "title": "Curved Carousel",
      "description": "Posters on a 3D cylinder. The first image starts full-bleed and shrinks into the ring, then scrolling (or drag, or auto rotation) turns the cylinder card by card, with color poster fallbacks for missing images.",
      "dependencies": [
        "gsap",
        "@gsap/react"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "https://trytweenly.vercel.app/r/tweenly-theme.json"
      ],
      "files": [
        {
          "path": "registry/new-york/curved-carousel/curved-carousel.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/curved-carousel"
    },
    {
      "name": "hero-background",
      "type": "registry:component",
      "title": "Hero Background",
      "description": "Interactive canvas backgrounds for hero sections: dots, warping grid, constellation particles, waves, flow field and pixel mosaic, all reacting to the cursor.",
      "dependencies": [],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json"
      ],
      "files": [
        {
          "path": "registry/new-york/hero-background/hero-background.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/hero-background"
    },
    {
      "name": "smooth-scroll",
      "type": "registry:component",
      "title": "Smooth Scroll",
      "description": "Lenis smooth scrolling synced with GSAP ScrollTrigger, on the window or inside any scroll container, with a useLenis() hook.",
      "dependencies": [
        "lenis",
        "gsap"
      ],
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/use-reduced-motion.json"
      ],
      "files": [
        {
          "path": "registry/new-york/smooth-scroll/smooth-scroll.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/smooth-scroll"
    },
    {
      "name": "timeline-scroll",
      "type": "registry:component",
      "title": "Timeline Scroll",
      "description": "Minimal horizontal timeline of years and milestones that pins and scrolls sideways with the page, or drags with inertia. The centered year lights up.",
      "dependencies": [
        "gsap",
        "@gsap/react",
        "motion"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "https://trytweenly.vercel.app/r/tweenly-theme.json"
      ],
      "files": [
        {
          "path": "registry/new-york/timeline-scroll/timeline-scroll.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/timeline-scroll"
    },
    {
      "name": "ai-input",
      "type": "registry:component",
      "title": "AI Input",
      "description": "AI prompt box with auto-growing textarea, cycling placeholders, file chips, model picker, toggle chips and a send button that morphs into stop.",
      "dependencies": [
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "https://trytweenly.vercel.app/r/tweenly-theme.json"
      ],
      "files": [
        {
          "path": "registry/new-york/ai-input/ai-input.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/ai-input"
    },
    {
      "name": "ai-recorder",
      "type": "registry:component",
      "title": "AI Recorder",
      "description": "Voice recorder pill that morphs into a live waveform with timer, pause, cancel and stop, then a scrubbable playback row.",
      "dependencies": [
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json"
      ],
      "files": [
        {
          "path": "registry/new-york/ai-recorder/ai-recorder.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/ai-recorder"
    },
    {
      "name": "ai-thinking",
      "type": "registry:component",
      "title": "AI Thinking",
      "description": "AI loading states: shimmer text, bouncing dots, glowing orb, collapsible reasoning steps and simulated token streaming.",
      "dependencies": [
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json"
      ],
      "files": [
        {
          "path": "registry/new-york/ai-thinking/ai-thinking.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/ai-thinking"
    },
    {
      "name": "ai-voice",
      "type": "registry:component",
      "title": "AI Voice",
      "description": "Voice activity visualizer with orb, bars, wave and dots variants, driven by the microphone, simulated speech or a controlled level.",
      "dependencies": [
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json"
      ],
      "files": [
        {
          "path": "registry/new-york/ai-voice/ai-voice.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/ai-voice"
    },
    {
      "name": "banner",
      "type": "registry:component",
      "title": "Banner",
      "description": "Announcement banner: dismissible sliding bar, hero pill, scrolling ticker or shimmer bar, with remembered dismissal.",
      "dependencies": [
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json",
        "https://trytweenly.vercel.app/r/tweenly-theme.json"
      ],
      "files": [
        {
          "path": "registry/new-york/banner/banner.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/banner"
    },
    {
      "name": "dock",
      "type": "registry:component",
      "title": "Dock",
      "description": "macOS-style dock with pointer-distance magnification, spring tooltips, active dots, badges and click bounce.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json"
      ],
      "files": [
        {
          "path": "registry/new-york/dock/dock.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/dock"
    },
    {
      "name": "orbiting-circles",
      "type": "registry:component",
      "title": "Orbiting Circles",
      "description": "Icons orbiting a center on circular paths with CSS transforms; layer rings for integration graphics.",
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json"
      ],
      "files": [
        {
          "path": "registry/new-york/orbiting-circles/orbiting-circles.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/orbiting-circles"
    },
    {
      "name": "tweet-card",
      "type": "registry:component",
      "title": "Tweet Card",
      "description": "X-style post cards from data with highlighted mentions, media grid, compact stats, a like pop and a scrolling testimonial wall.",
      "dependencies": [
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://trytweenly.vercel.app/r/use-reduced-motion.json"
      ],
      "files": [
        {
          "path": "registry/new-york/tweet-card/tweet-card.tsx",
          "type": "registry:component"
        }
      ],
      "docs": "Docs, live playground and every prop: https://trytweenly.vercel.app/docs/components/tweet-card"
    },
    {
      "name": "tweenly-font",
      "type": "registry:font",
      "title": "tweenly display font",
      "description": "Barlow Condensed, the display face tweenly uses for big numerals and wordmarks.",
      "font": {
        "family": "Barlow Condensed",
        "provider": "google",
        "import": "Barlow_Condensed",
        "variable": "--font-display",
        "weight": [
          "700"
        ],
        "subsets": [
          "latin"
        ]
      }
    },
    {
      "name": "tweenly-theme",
      "type": "registry:theme",
      "title": "tweenly theme tokens",
      "description": "The brand and panel color tokens (light and dark) plus the display font, so components look the same in your app as in the docs.",
      "registryDependencies": [
        "https://trytweenly.vercel.app/r/tweenly-font.json"
      ],
      "cssVars": {
        "theme": {
          "color-brand": "var(--brand)",
          "color-panel": "var(--panel)"
        },
        "light": {
          "brand": "#f0591f",
          "panel": "#ffffff"
        },
        "dark": {
          "brand": "#ff6a2b",
          "panel": "#141414"
        }
      }
    }
  ]
}
